1{"version":3,"sources":["webpack://@mattermost/webapp/./actions/admin_actions.jsx","webpack://@mattermost/webapp/./components/apps_form/apps_form_field/apps_form_select_field.tsx","webpack://@mattermost/webapp/./components/apps_form/apps_form_field/apps_form_field.tsx","webpack://@mattermost/webapp/./components/apps_form/apps_form_field/index.ts","webpack://@mattermost/webapp/./components/apps_form/apps_form_header.tsx","webpack://@mattermost/webapp/./components/apps_form/apps_form_component.tsx","webpack://@mattermost/webapp/./components/apps_form/apps_form_container.tsx","webpack://@mattermost/webapp/./components/apps_form/index.ts","webpack://@mattermost/webapp/./actions/apps.ts","webpack://@mattermost/webapp/./actions/channel_actions.jsx","webpack://@mattermost/webapp/./actions/cloud.tsx","webpack://@mattermost/webapp/./actions/command.ts","webpack://@mattermost/webapp/./components/widgets/menu/menu_modals/submenu_modal/submenu_modal.tsx","webpack://@mattermost/webapp/./actions/global_actions.tsx","webpack://@mattermost/webapp/./actions/hooks.js","webpack://@mattermost/webapp/./actions/views/channel.js","webpack://@mattermost/webapp/./actions/views/lhs.js","webpack://@mattermost/webapp/./actions/views/next_steps.ts","webpack://@mattermost/webapp/./actions/views/notice.js","webpack://@mattermost/webapp/./actions/views/posts.js","webpack://@mattermost/webapp/./actions/views/root.js","webpack://@mattermost/webapp/./actions/views/search.js","webpack://@mattermost/webapp/./actions/views/textbox.js","webpack://@mattermost/webapp/./packages/mattermost-redux/src/actions/websocket.ts","webpack://@mattermost/webapp/./components/removed_from_channel_modal/removed_from_channel_modal.tsx","webpack://@mattermost/webapp/./components/removed_from_channel_modal/index.ts","webpack://@mattermost/webapp/./actions/websocket_actions.jsx","webpack://@mattermost/webapp/./actions/views/system.js","webpack://@mattermost/webapp/./client/websocket_client.tsx","webpack://@mattermost/webapp/./client/web_websocket_client.jsx","webpack://@mattermost/webapp/./components/about_build_modal/about_build_modal_cloud/about_build_modal_cloud.tsx","webpack://@mattermost/webapp/./components/about_build_modal/about_build_modal.tsx","webpack://@mattermost/webapp/./components/about_build_modal/index.ts","webpack://@mattermost/webapp/./components/add_groups_to_channel_modal/add_groups_to_channel_modal.tsx","webpack://@mattermost/webapp/./components/add_groups_to_channel_modal/index.ts","webpack://@mattermost/webapp/./components/add_groups_to_team_modal/add_groups_to_team_modal.tsx","webpack://@mattermost/webapp/./components/add_groups_to_team_modal/index.ts","webpack://@mattermost/webapp/./components/admin_console/billing/payment_details.tsx","webpack://@mattermost/webapp/./components/alert_banner.tsx","webpack://@mattermost/webapp/./actions/views/announcement_bar.js","webpack://@mattermost/webapp/./components/warn_metric_ack_modal/warn_metric_ack_modal.tsx","webpack://@mattermost/webapp/./components/warn_metric_ack_modal/index.ts","webpack://@mattermost/webapp/./components/announcement_bar/default_announcement_bar/announcement_bar.tsx","webpack://@mattermost/webapp/./components/announcement_bar/default_announcement_bar/index.ts","webpack://@mattermost/webapp/./images/icons/round-white-info-icon.svg","webpack://@mattermost/webapp/./components/announcement_bar/text_dismissable_bar.tsx","webpack://@mattermost/webapp/./images/icons/check-circle-outline.svg","webpack://@mattermost/webapp/./images/icons/warning-icon.svg","webpack://@mattermost/webapp/./components/announcement_bar/configuration_bar/configuration_bar.tsx","webpack://@mattermost/webapp/./components/announcement_bar/configuration_bar/index.ts","webpack://@mattermost/webapp/./components/announcement_bar/version_bar/version_bar.tsx","webpack://@mattermost/webapp/./components/announcement_bar/version_bar/index.ts","webpack://@mattermost/webapp/./components/announcement_bar/cloud_announcement_bar/user_limit_announcement_bar.tsx","webpack://@mattermost/webapp/./components/announcement_bar/cloud_announcement_bar/index.ts","webpack://@mattermost/webapp/./components/announcement_bar/payment_announcement_bar/payment_announcement_bar.tsx","webpack://@mattermost/webapp/./components/announcement_bar/payment_announcement_bar/index.ts","webpack://@mattermost/webapp/./components/announcement_bar/cloud_trial_announcement_bar/cloud_trial_announcement_bar.tsx","webpack://@mattermost/webapp/./components/announcement_bar/cloud_trial_announcement_bar/index.ts","webpack://@mattermost/webapp/./components/announcement_bar/announcement_bar_controller.tsx","webpack://@mattermost/webapp/./components/announcement_bar/index.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/selectors/errors.ts","webpack://@mattermost/webapp/./components/announcement_bar/no_internet_connection/no-internet-connection-svg.tsx","webpack://@mattermost/webapp/./components/announcement_bar/no_internet_connection/no_internet_connection.tsx","webpack://@mattermost/webapp/./components/announcement_bar/renewal_link/renewal_link.tsx","webpack://@mattermost/webapp/./components/announcement_bar/renewal_link/index.ts","webpack://@mattermost/webapp/./components/at_mention/at_mention.tsx","webpack://@mattermost/webapp/./components/at_mention/index.tsx","webpack://@mattermost/webapp/./components/autocomplete_selector.jsx","webpack://@mattermost/webapp/./components/autosize_textarea.tsx","webpack://@mattermost/webapp/./components/card/card_header.tsx","webpack://@mattermost/webapp/./components/card/card.tsx","webpack://@mattermost/webapp/./components/card/card_body.tsx","webpack://@mattermost/webapp/./components/channel_header/components/header_icon_wrapper.tsx","webpack://@mattermost/webapp/./components/channel_invite_modal/channel_invite_modal.tsx","webpack://@mattermost/webapp/./components/channel_invite_modal/index.ts","webpack://@mattermost/webapp/./components/widgets/icons/reply_icon.tsx","webpack://@mattermost/webapp/./components/common/comment_icon.tsx","webpack://@mattermost/webapp/./components/common/hocs/cloud/with_get_cloud_subscription.tsx","webpack://@mattermost/webapp/./components/custom_status/custom_status_emoji.tsx","webpack://@mattermost/webapp/./components/custom_status/custom_status_suggestion.tsx","webpack://@mattermost/webapp/./components/custom_status/expiry_menu.tsx","webpack://@mattermost/webapp/./components/custom_status/date_time_input.tsx","webpack://@mattermost/webapp/./components/custom_status/custom_status_modal.tsx","webpack://@mattermost/webapp/./components/custom_status/custom_status_text.tsx","webpack://@mattermost/webapp/./components/custom_status/expiry_time.tsx","webpack://@mattermost/webapp/./components/deferComponentRender.jsx","webpack://@mattermost/webapp/./components/delete_post_modal/delete_post_modal.tsx","webpack://@mattermost/webapp/./components/delete_post_modal/index.ts","webpack://@mattermost/webapp/./components/widgets/icons/dots_horizontal.tsx","webpack://@mattermost/webapp/./components/dot_menu/dot_menu.tsx","webpack://@mattermost/webapp/./components/dot_menu/index.ts","webpack://@mattermost/webapp/./components/dropdown_input.tsx","webpack://@mattermost/webapp/./components/emoji/render_emoji.tsx","webpack://@mattermost/webapp/./packages/mattermost-redux/src/utils/gfycat_sdk.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/actions/gifs.ts","webpack://@mattermost/webapp/./components/gif_picker/utils/constants.js","webpack://@mattermost/webapp/./components/widgets/icons/gif_search_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/gif_search_clear_icon.tsx","webpack://@mattermost/webapp/./components/gif_picker/components/SearchBar/index.jsx","webpack://@mattermost/webapp/./components/widgets/icons/gif_trending_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/gif_reactions_icon.tsx","webpack://@mattermost/webapp/./components/gif_picker/components/Header/index.jsx","webpack://@mattermost/webapp/./components/gif_picker/components/App/index.jsx","webpack://@mattermost/webapp/./components/gif_picker/components/Categories/index.jsx","webpack://@mattermost/webapp/./components/gif_picker/components/SearchItem/index.jsx","webpack://@mattermost/webapp/./components/gif_picker/components/SearchGrid/SearchGrid.jsx","webpack://@mattermost/webapp/./components/gif_picker/components/SearchGrid/index.js","webpack://@mattermost/webapp/./components/gif_picker/components/Search/index.jsx","webpack://@mattermost/webapp/./components/gif_picker/components/Trending/index.jsx","webpack://@mattermost/webapp/./components/gif_picker/gif_picker.jsx","webpack://@mattermost/webapp/./components/widgets/icons/gfycat_icon.tsx","webpack://@mattermost/webapp/./components/emoji_picker/components/emoji_picker_header.jsx","webpack://@mattermost/webapp/./images/img_trans.gif","webpack://@mattermost/webapp/./components/emoji_picker/components/emoji_picker_category.jsx","webpack://@mattermost/webapp/./components/emoji_picker/components/emoji_picker_item.jsx","webpack://@mattermost/webapp/./components/emoji_picker/emoji_picker_category_section.jsx","webpack://@mattermost/webapp/./components/emoji_picker/components/emoji_picker_preview.jsx","webpack://@mattermost/webapp/./components/emoji_picker/components/emoji_picker_skin.jsx","webpack://@mattermost/webapp/./components/emoji_picker/emoji_picker.jsx","webpack://@mattermost/webapp/./components/emoji_picker/index.js","webpack://@mattermost/webapp/./components/emoji_picker/emoji_picker_tabs.jsx","webpack://@mattermost/webapp/./components/emoji_picker/emoji_picker_overlay.jsx","webpack://@mattermost/webapp/./components/error_page/error_link.tsx","webpack://@mattermost/webapp/./components/external_image/external_image.tsx","webpack://@mattermost/webapp/./components/external_image/index.ts","webpack://@mattermost/webapp/./components/file_attachment/file_thumbnail/file_thumbnail.tsx","webpack://@mattermost/webapp/./components/file_attachment/file_thumbnail/index.ts","webpack://@mattermost/webapp/./components/file_attachment/filename_overlay.tsx","webpack://@mattermost/webapp/./components/file_attachment/file_attachment.tsx","webpack://@mattermost/webapp/./components/file_attachment/index.ts","webpack://@mattermost/webapp/./components/single_image_view/single_image_view.tsx","webpack://@mattermost/webapp/./components/single_image_view/index.ts","webpack://@mattermost/webapp/./components/file_attachment_list/file_attachment_list.tsx","webpack://@mattermost/webapp/./components/file_attachment_list/index.ts","webpack://@mattermost/webapp/./components/file_info_preview/file_info_preview.tsx","webpack://@mattermost/webapp/./components/file_info_preview/index.ts","webpack://@mattermost/webapp/./components/file_preview/file_progress_preview.tsx","webpack://@mattermost/webapp/./components/file_preview/file_preview.tsx","webpack://@mattermost/webapp/./components/file_preview/index.ts","webpack://@mattermost/webapp/./components/audio_video_preview.jsx","webpack://@mattermost/webapp/./components/code_preview.jsx","webpack://@mattermost/webapp/./components/file_preview_modal/image_preview.jsx","webpack://@mattermost/webapp/./components/file_preview_modal/file_preview_modal_info/file_preview_modal_info.tsx","webpack://@mattermost/webapp/./components/file_preview_modal/file_preview_modal_main_actions/file_preview_modal_main_actions.tsx","webpack://@mattermost/webapp/./components/file_preview_modal/file_preview_modal_footer/file_preview_modal_footer.tsx","webpack://@mattermost/webapp/./components/file_preview_modal/file_preview_modal_main_nav/file_preview_modal_main_nav.tsx","webpack://@mattermost/webapp/./components/file_preview_modal/file_preview_modal_header/file_preview_modal_header.tsx","webpack://@mattermost/webapp/./components/file_preview_modal/popover_bar/popover_bar.tsx","webpack://@mattermost/webapp/./components/file_preview_modal/popover_bar/index.ts","webpack://@mattermost/webapp/./components/file_preview_modal/file_preview_modal.jsx","webpack://@mattermost/webapp/./components/file_preview_modal/index.js","webpack://@mattermost/webapp/./actions/file_actions.jsx","webpack://@mattermost/webapp/./components/file_upload/file_upload.jsx","webpack://@mattermost/webapp/./utils/dragster.ts","webpack://@mattermost/webapp/./components/file_upload/index.js","webpack://@mattermost/webapp/./components/form_error.tsx","webpack://@mattermost/webapp/./components/formatted_markdown_message.jsx","webpack://@mattermost/webapp/./components/generic_modal.tsx","webpack://@mattermost/webapp/./components/gif_picker/components/InfiniteScroll/index.js","webpack://@mattermost/webapp/./components/html_entities/nbsp.tsx","webpack://@mattermost/webapp/./components/input.tsx","webpack://@mattermost/webapp/./components/widgets/settings/radio_setting.tsx","webpack://@mattermost/webapp/./components/interactive_dialog/dialog_element/dialog_element.jsx","webpack://@mattermost/webapp/./components/interactive_dialog/dialog_element/index.js","webpack://@mattermost/webapp/./components/interactive_dialog/dialog_introduction_text.jsx","webpack://@mattermost/webapp/./components/interactive_dialog/interactive_dialog.jsx","webpack://@mattermost/webapp/./components/interactive_dialog/index.js","webpack://@mattermost/webapp/./actions/invite_actions.jsx","webpack://@mattermost/webapp/./components/confirm_notify_admin_modal/confirm_notify_admin.svg.tsx","webpack://@mattermost/webapp/./components/confirm_notify_admin_modal/confirm_notify_admin_modal.tsx","webpack://@mattermost/webapp/./components/confirm_notify_admin_modal/index.tsx","webpack://@mattermost/webapp/./components/user_limit_modal/user_limit_upgrade_svg.tsx","webpack://@mattermost/webapp/./components/user_limit_modal/user_limit_modal.tsx","webpack://@mattermost/webapp/./components/widgets/icons/invite_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/arrow_right_icon.tsx","webpack://@mattermost/webapp/./components/invitation_modal/invitation_modal_initial_step.jsx","webpack://@mattermost/webapp/./components/widgets/icons/invite_members_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/mail_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/mail_plus_icon.tsx","webpack://@mattermost/webapp/./components/widgets/inputs/users_emails_input.jsx","webpack://@mattermost/webapp/./components/widgets/icons/link_icon.tsx","webpack://@mattermost/webapp/./components/invitation_modal/invitation_modal_members_step/invitation_modal_members_step.jsx","webpack://@mattermost/webapp/./components/invitation_modal/invitation_modal_members_step/index.ts","webpack://@mattermost/webapp/./components/widgets/icons/close_circle_icon.tsx","webpack://@mattermost/webapp/./components/widgets/inputs/channels_input.jsx","webpack://@mattermost/webapp/./components/invitation_modal/invitation_modal_guest_step/invitation_modal_guests_step.jsx","webpack://@mattermost/webapp/./components/invitation_modal/invitation_modal_guest_step/index.ts","webpack://@mattermost/webapp/./components/widgets/icons/alert_icon.tsx","webpack://@mattermost/webapp/./components/invitation_modal/invitation_modal_confirm_step_row.jsx","webpack://@mattermost/webapp/./components/invitation_modal/invitation_modal_confirm_step_table.jsx","webpack://@mattermost/webapp/./components/invitation_modal/invitation_modal_confirm_step.jsx","webpack://@mattermost/webapp/./components/invitation_modal/invitation_modal.jsx","webpack://@mattermost/webapp/./components/invitation_modal/index.js","webpack://@mattermost/webapp/./components/loading_image_preview.tsx","webpack://@mattermost/webapp/./components/loading_screen.tsx","webpack://@mattermost/webapp/./components/localized_icon.tsx","webpack://@mattermost/webapp/./components/localized_input/localized_input.tsx","webpack://@mattermost/webapp/./components/markdown/index.ts","webpack://@mattermost/webapp/./components/markdown/markdown.tsx","webpack://@mattermost/webapp/./components/message_submit_error.tsx","webpack://@mattermost/webapp/./components/modal_controller/modal_controller.jsx","webpack://@mattermost/webapp/./components/modal_controller/index.js","webpack://@mattermost/webapp/./components/searchable_channel_list.jsx","webpack://@mattermost/webapp/./components/more_channels/more_channels.tsx","webpack://@mattermost/webapp/./components/more_channels/index.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/selectors/entities/typing.ts","webpack://@mattermost/webapp/./components/msg_typing/msg_typing.tsx","webpack://@mattermost/webapp/./components/msg_typing/index.ts","webpack://@mattermost/webapp/./components/multiselect/multiselect_list.tsx","webpack://@mattermost/webapp/./components/multiselect/multiselect.tsx","webpack://@mattermost/webapp/./components/new_channel_modal/new_channel_modal.jsx","webpack://@mattermost/webapp/./components/new_channel_modal/index.js","webpack://@mattermost/webapp/./components/change_url_modal/change_url_modal.tsx","webpack://@mattermost/webapp/./components/change_url_modal/index.ts","webpack://@mattermost/webapp/./components/new_channel_flow/new_channel_flow.tsx","webpack://@mattermost/webapp/./components/new_channel_flow/index.ts","webpack://@mattermost/webapp/./components/accordion.tsx","webpack://@mattermost/webapp/./images/spinner-48x48-blue.apng","webpack://@mattermost/webapp/./components/next_steps_view/images/download-apps.svg.tsx","webpack://@mattermost/webapp/./components/next_steps_view/download_section.tsx","webpack://@mattermost/webapp/./components/next_steps_view/images/incidents.svg.tsx","webpack://@mattermost/webapp/./components/next_steps_view/images/documents.svg.tsx","webpack://@mattermost/webapp/./components/next_steps_view/images/plugins.svg.tsx","webpack://@mattermost/webapp/./components/next_steps_view/next_steps_tips.tsx","webpack://@mattermost/webapp/./components/widgets/background_pill_symbol/background_pill_symbol.tsx","webpack://@mattermost/webapp/./components/next_steps_view/images/onboarding-bg-svg.tsx","webpack://@mattermost/webapp/./components/next_steps_view/images/getting-started-svg.tsx","webpack://@mattermost/webapp/./components/next_steps_view/images/cloud-logo-svg.tsx","webpack://@mattermost/webapp/./components/next_steps_view/images/logo-svg.tsx","webpack://@mattermost/webapp/./components/next_steps_view/images/onboarding-success-svg.tsx","webpack://@mattermost/webapp/./components/next_steps_view/next_steps_view.tsx","webpack://@mattermost/webapp/./components/next_steps_view/index.ts","webpack://@mattermost/webapp/./components/next_steps_view/step_helpers.ts","webpack://@mattermost/webapp/./components/picture_selector.tsx","webpack://@mattermost/webapp/./components/next_steps_view/steps/complete_profile_step/complete_profile_step.tsx","webpack://@mattermost/webapp/./components/next_steps_view/steps/complete_profile_step/index.ts","webpack://@mattermost/webapp/./components/next_steps_view/steps/text_card_with_action/text_card_with_action.tsx","webpack://@mattermost/webapp/./components/multi_input.tsx","webpack://@mattermost/webapp/./components/next_steps_view/steps/invite_members_step/invite_members_step.tsx","webpack://@mattermost/webapp/./components/next_steps_view/steps/invite_members_step/index.ts","webpack://@mattermost/webapp/./components/next_steps_view/steps/team_profile_step/team_profile_step.tsx","webpack://@mattermost/webapp/./components/next_steps_view/steps/team_profile_step/index.ts","webpack://@mattermost/webapp/./components/next_steps_view/steps.ts","webpack://@mattermost/webapp/./components/next_steps_view/steps/enable_notifications_step/enable_notifications_step.tsx","webpack://@mattermost/webapp/./components/next_steps_view/steps/setup_preferences_step/setup_preferences_step.tsx","webpack://@mattermost/webapp/./components/widgets/icons/pin_icon.tsx","webpack://@mattermost/webapp/./components/no_results_indicator/no_results_indicator.tsx","webpack://@mattermost/webapp/./components/no_results_indicator/types.ts","webpack://@mattermost/webapp/./components/overlay_trigger.tsx","webpack://@mattermost/webapp/./images/cloud/cards/amex.png","webpack://@mattermost/webapp/./images/cloud/cards/dinersclub.png","webpack://@mattermost/webapp/./images/cloud/cards/discover.jpg","webpack://@mattermost/webapp/./images/cloud/cards/jcb.png","webpack://@mattermost/webapp/./images/cloud/cards/mastercard.png","webpack://@mattermost/webapp/./images/cloud/cards/visa.jpg","webpack://@mattermost/webapp/./components/payment_form/card_image.tsx","webpack://@mattermost/webapp/./components/payment_form/card_input.tsx","webpack://@mattermost/webapp/./components/payment_form/payment_form.tsx","webpack://@mattermost/webapp/./utils/states.ts","webpack://@mattermost/webapp/./components/payment_form/state_selector.tsx","webpack://@mattermost/webapp/./components/payment_form/stripe.ts","webpack://@mattermost/webapp/./components/permissions_gates/any_team_permission_gate/any_team_permission_gate.tsx","webpack://@mattermost/webapp/./components/permissions_gates/any_team_permission_gate/index.ts","webpack://@mattermost/webapp/./components/permissions_gates/channel_permission_gate/channel_permission_gate.tsx","webpack://@mattermost/webapp/./components/permissions_gates/channel_permission_gate/index.ts","webpack://@mattermost/webapp/./components/permissions_gates/system_permission_gate/system_permission_gate.tsx","webpack://@mattermost/webapp/./components/permissions_gates/system_permission_gate/index.ts","webpack://@mattermost/webapp/./components/permissions_gates/team_permission_gate/team_permission_gate.tsx","webpack://@mattermost/webapp/./components/permissions_gates/team_permission_gate/index.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/utils/marketplace.ts","webpack://@mattermost/webapp/./selectors/views/marketplace.ts","webpack://@mattermost/webapp/./actions/marketplace.ts","webpack://@mattermost/webapp/./components/widgets/icons/plugin_icon.tsx","webpack://@mattermost/webapp/./components/plugin_marketplace/marketplace_item/marketplace_item.tsx","webpack://@mattermost/webapp/./components/plugin_marketplace/marketplace_item/marketplace_item_plugin/marketplace_item_plugin.tsx","webpack://@mattermost/webapp/./components/plugin_marketplace/marketplace_item/marketplace_item_plugin/index.ts","webpack://@mattermost/webapp/./components/plugin_marketplace/marketplace_item/marketplace_item_app/marketplace_item_app.tsx","webpack://@mattermost/webapp/./components/plugin_marketplace/marketplace_item/marketplace_item_app/index.ts","webpack://@mattermost/webapp/./components/plugin_marketplace/marketplace_list/navigation_row/navigation_button.tsx","webpack://@mattermost/webapp/./components/plugin_marketplace/marketplace_list/navigation_row/navigation_row.tsx","webpack://@mattermost/webapp/./components/plugin_marketplace/marketplace_list/navigation_row/index.ts","webpack://@mattermost/webapp/./components/plugin_marketplace/marketplace_list/marketplace_list.tsx","webpack://@mattermost/webapp/./components/plugin_marketplace/marketplace_modal.tsx","webpack://@mattermost/webapp/./components/plugin_marketplace/index.ts","webpack://@mattermost/webapp/./components/post_deleted_modal.tsx","webpack://@mattermost/webapp/./components/post_view/combined_system_message/last_users.tsx","webpack://@mattermost/webapp/./components/post_view/combined_system_message/combined_system_message.tsx","webpack://@mattermost/webapp/./components/post_view/combined_system_message/index.ts","webpack://@mattermost/webapp/./components/post_view/post_add_channel_member/post_add_channel_member.tsx","webpack://@mattermost/webapp/./components/post_view/post_add_channel_member/index.ts","webpack://@mattermost/webapp/./components/post_markdown/system_message_helpers.tsx","webpack://@mattermost/webapp/./components/post_markdown/post_markdown.tsx","webpack://@mattermost/webapp/./components/post_markdown/index.ts","webpack://@mattermost/webapp/./components/post_profile_picture/post_profile_picture.tsx","webpack://@mattermost/webapp/./components/post_profile_picture/index.ts","webpack://@mattermost/webapp/./components/widgets/separator/basic-separator.tsx","webpack://@mattermost/webapp/./components/post_view/date_separator/date_separator.tsx","webpack://@mattermost/webapp/./components/post_view/failed_post_options/failed_post_options.tsx","webpack://@mattermost/webapp/./components/post_view/failed_post_options/index.ts","webpack://@mattermost/webapp/./components/post_view/floating_timestamp/floating_timestamp.tsx","webpack://@mattermost/webapp/./components/post_view/floating_timestamp/index.ts","webpack://@mattermost/webapp/./components/widgets/separator/notification-separator.tsx","webpack://@mattermost/webapp/./components/post_view/new_message_separator/new_message_separator.tsx","webpack://@mattermost/webapp/./components/post_view/post_aria_label_div.tsx","webpack://@mattermost/webapp/./utils/markdown/link_only_renderer.tsx","webpack://@mattermost/webapp/./components/post_view/message_attachments/action_button/action_button.tsx","webpack://@mattermost/webapp/./components/post_view/message_attachments/action_button/index.ts","webpack://@mattermost/webapp/./components/post_view/message_attachments/action_menu/action_menu.tsx","webpack://@mattermost/webapp/./components/post_view/message_attachments/action_menu/index.ts","webpack://@mattermost/webapp/./components/post_view/message_attachments/message_attachment/message_attachment.tsx","webpack://@mattermost/webapp/./components/post_view/message_attachments/message_attachment/index.ts","webpack://@mattermost/webapp/./components/post_view/message_attachments/message_attachment_list.tsx","webpack://@mattermost/webapp/./components/post_view/post_attachment_opengraph/get_nearest_point.ts","webpack://@mattermost/webapp/./components/post_view/post_attachment_opengraph/post_attachment_opengraph.tsx","webpack://@mattermost/webapp/./components/post_view/post_attachment_opengraph/index.ts","webpack://@mattermost/webapp/./components/post_view/post_image/post_image.jsx","webpack://@mattermost/webapp/./components/post_view/post_image/index.js","webpack://@mattermost/webapp/./utils/youtube.js","webpack://@mattermost/webapp/./components/youtube_video/youtube_video.tsx","webpack://@mattermost/webapp/./components/youtube_video/index.ts","webpack://@mattermost/webapp/./components/post_view/embedded_bindings/button_binding/button_binding.tsx","webpack://@mattermost/webapp/./components/post_view/embedded_bindings/button_binding/index.ts","webpack://@mattermost/webapp/./components/post_view/embedded_bindings/select_binding/select_binding.tsx","webpack://@mattermost/webapp/./components/post_view/embedded_bindings/select_binding/index.ts","webpack://@mattermost/webapp/./components/post_view/embedded_bindings/embedded_binding/embedded_binding.tsx","webpack://@mattermost/webapp/./components/post_view/embedded_bindings/embedded_binding/index.ts","webpack://@mattermost/webapp/./components/post_view/embedded_bindings/embedded_bindings.tsx","webpack://@mattermost/webapp/./components/post_view/post_attachment_container/post_attachment_container.tsx","webpack://@mattermost/webapp/./components/post_view/post_message_preview/post_message_preview.tsx","webpack://@mattermost/webapp/./components/post_view/post_message_preview/index.ts","webpack://@mattermost/webapp/./components/post_view/post_body_additional_content/post_body_additional_content.tsx","webpack://@mattermost/webapp/./components/post_view/post_body_additional_content/index.ts","webpack://@mattermost/webapp/./components/post_view/post_context.js","webpack://@mattermost/webapp/./components/post_view/post_flag_icon/post_flag_icon.js","webpack://@mattermost/webapp/./components/post_view/post_flag_icon/index.js","webpack://@mattermost/webapp/./components/post_view/post_message_view/post_message_view.tsx","webpack://@mattermost/webapp/./components/post_view/post_message_view/index.ts","webpack://@mattermost/webapp/./components/post_view/post_pre_header/post_pre_header.tsx","webpack://@mattermost/webapp/./components/post_view/post_pre_header/index.js","webpack://@mattermost/webapp/./components/post_view/post_reaction/post_reaction.tsx","webpack://@mattermost/webapp/./components/post_view/post_reaction/index.ts","webpack://@mattermost/webapp/./components/post_view/post_time/post_time.tsx","webpack://@mattermost/webapp/./components/post_view/post_time/index.ts","webpack://@mattermost/webapp/./components/post_view/reaction/reaction_tooltip/reaction_tooltip.tsx","webpack://@mattermost/webapp/./components/post_view/reaction/reaction_tooltip/index.ts","webpack://@mattermost/webapp/./components/post_view/reaction/reaction.tsx","webpack://@mattermost/webapp/./components/post_view/reaction/index.ts","webpack://@mattermost/webapp/./components/widgets/icons/add_reaction_icon.tsx","webpack://@mattermost/webapp/./components/post_view/reaction_list/reaction_list.tsx","webpack://@mattermost/webapp/./components/post_view/reaction_list/index.ts","webpack://@mattermost/webapp/./components/post_view/show_more/show_more.tsx","webpack://@mattermost/webapp/./components/post_view/show_more/index.ts","webpack://@mattermost/webapp/./components/status_icon_new.tsx","webpack://@mattermost/webapp/./components/profile_picture/profile_picture.tsx","webpack://@mattermost/webapp/./actions/views/profile_popover.js","webpack://@mattermost/webapp/./components/suggestion/search_channel_with_permissions_provider.jsx","webpack://@mattermost/webapp/./components/add_user_to_channel_modal/add_user_to_channel_modal.jsx","webpack://@mattermost/webapp/./components/add_user_to_channel_modal/index.js","webpack://@mattermost/webapp/./components/profile_popover/profile_popover.tsx","webpack://@mattermost/webapp/./components/profile_popover/index.ts","webpack://@mattermost/webapp/./images/cloud/upgrade.svg","webpack://@mattermost/webapp/./images/cloud/blue-lower.svg","webpack://@mattermost/webapp/./components/common/radio_group.tsx","webpack://@mattermost/webapp/./images/cloud/payment_success.svg","webpack://@mattermost/webapp/./images/cloud/payment_fail.svg","webpack://@mattermost/webapp/./images/cloud/processing_payment.svg","webpack://@mattermost/webapp/./components/purchase_modal/process_payment_setup.tsx","webpack://@mattermost/webapp/./components/purchase_modal/icon_message.tsx","webpack://@mattermost/webapp/./components/purchase_modal/purchase_modal.tsx","webpack://@mattermost/webapp/./components/purchase_modal/index.ts","webpack://@mattermost/webapp/./components/quick_input/quick_input.jsx","webpack://@mattermost/webapp/./components/quick_input/max_length_input.tsx","webpack://@mattermost/webapp/./components/widgets/icons/user_guide_icon.tsx","webpack://@mattermost/webapp/./components/rhs_search_nav/components/user_guide_dropdown/user_guide_dropdown.tsx","webpack://@mattermost/webapp/./components/rhs_search_nav/components/user_guide_dropdown/index.ts","webpack://@mattermost/webapp/./components/rhs_search_nav/rhs_search_nav.tsx","webpack://@mattermost/webapp/./components/rhs_search_nav/index.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/client/rudder.ts","webpack://@mattermost/webapp/./components/compass_theme_provider/compass_theme_provider.tsx","webpack://@mattermost/webapp/./actions/views/status_dropdown.ts","webpack://@mattermost/webapp/./selectors/views/status_dropdown.ts","webpack://@mattermost/webapp/./components/reset_status_modal/reset_status_modal.jsx","webpack://@mattermost/webapp/./components/reset_status_modal/index.js","webpack://@mattermost/webapp/./components/widgets/pulsating_dot/index.tsx","webpack://@mattermost/webapp/./components/dnd_custom_time_picker_modal/dnd_custom_time_picker_modal.tsx","webpack://@mattermost/webapp/./components/dnd_custom_time_picker_modal/index.ts","webpack://@mattermost/webapp/./components/status_dropdown/status_dropdown.tsx","webpack://@mattermost/webapp/./components/status_dropdown/index.ts","webpack://@mattermost/webapp/./components/global/global_search_nav/global_search_nav.tsx","webpack://@mattermost/webapp/./components/global/hooks.tsx","webpack://@mattermost/webapp/./components/global/product_branding/product_branding.tsx","webpack://@mattermost/webapp/./components/global/product_branding/index.ts","webpack://@mattermost/webapp/./components/global/product_switcher_menu/product_switcher_menu.tsx","webpack://@mattermost/webapp/./components/global/product_switcher_menu/index.ts","webpack://@mattermost/webapp/./components/tutorial/tutorial_tip/tutorial_tip.tsx","webpack://@mattermost/webapp/./components/tutorial/tutorial_tip/index.ts","webpack://@mattermost/webapp/./components/global/product_switcher_tip/product_switcher_tip.tsx","webpack://@mattermost/webapp/./components/global/product_switcher_tip/index.tsx","webpack://@mattermost/webapp/./components/global/product_switcher.tsx","webpack://@mattermost/webapp/./components/global/history_buttons/history_buttons.tsx","webpack://@mattermost/webapp/./components/global/history_buttons/index.ts","webpack://@mattermost/webapp/./components/global/user_guide_dropdown/user_guide_dropdown.tsx","webpack://@mattermost/webapp/./components/global/user_guide_dropdown/index.ts","webpack://@mattermost/webapp/./components/global/at_mentions_button/at_mentions_button.tsx","webpack://@mattermost/webapp/./components/global/saved_posts_button/saved_posts_button.tsx","webpack://@mattermost/webapp/./components/global/settings_button/settings_button.tsx","webpack://@mattermost/webapp/./components/global/settings_button/index.ts","webpack://@mattermost/webapp/./components/global/settings_tip.tsx","webpack://@mattermost/webapp/./components/global/global_header.tsx","webpack://@mattermost/webapp/./components/header_footer_template_route.jsx","webpack://@mattermost/webapp/./components/intl_provider/intl_provider.jsx","webpack://@mattermost/webapp/./components/intl_provider/index.jsx","webpack://@mattermost/webapp/./components/edit_post_modal/edit_post_modal.tsx","webpack://@mattermost/webapp/./components/edit_post_modal/index.js","webpack://@mattermost/webapp/./stores/modal_store.jsx","webpack://@mattermost/webapp/./components/get_link_modal.tsx","webpack://@mattermost/webapp/./components/get_public_link_modal/get_public_link_modal.tsx","webpack://@mattermost/webapp/./components/get_public_link_modal/index.ts","webpack://@mattermost/webapp/./components/leave_private_channel_modal/leave_private_channel_modal.tsx","webpack://@mattermost/webapp/./components/leave_private_channel_modal/index.ts","webpack://@mattermost/webapp/./components/shortcuts_modal.jsx","webpack://@mattermost/webapp/./images/filesOverlay.png","webpack://@mattermost/webapp/./images/logoWhite.png","webpack://@mattermost/webapp/./components/file_upload_overlay.tsx","webpack://@mattermost/webapp/./components/rhs_header_post/rhs_header_post.tsx","webpack://@mattermost/webapp/./components/rhs_header_post/index.ts","webpack://@mattermost/webapp/./components/rhs_thread/rhs_thread.tsx","webpack://@mattermost/webapp/./components/rhs_thread/index.ts","webpack://@mattermost/webapp/./components/rhs_card_header/rhs_card_header.tsx","webpack://@mattermost/webapp/./components/rhs_card_header/index.tsx","webpack://@mattermost/webapp/./components/rhs_card/rhs_card.jsx","webpack://@mattermost/webapp/./components/rhs_card/index.js","webpack://@mattermost/webapp/./plugins/rhs_plugin/rhs_plugin.jsx","webpack://@mattermost/webapp/./plugins/rhs_plugin/index.js","webpack://@mattermost/webapp/./components/sidebar_right/sidebar_right.jsx","webpack://@mattermost/webapp/./components/sidebar_right/index.js","webpack://@mattermost/webapp/./components/tutorial/menu_tutorial_tip.tsx","webpack://@mattermost/webapp/./components/widgets/icons/leave_team_icon.tsx","webpack://@mattermost/webapp/./components/leave_team_modal/leave_team_modal.tsx","webpack://@mattermost/webapp/./components/leave_team_modal/index.ts","webpack://@mattermost/webapp/./components/team_general_tab/team_general_tab.jsx","webpack://@mattermost/webapp/./components/team_general_tab/index.js","webpack://@mattermost/webapp/./components/team_settings/team_settings.tsx","webpack://@mattermost/webapp/./components/team_settings/index.ts","webpack://@mattermost/webapp/./components/team_settings_modal/team_settings_modal.tsx","webpack://@mattermost/webapp/./components/team_settings_modal/index.ts","webpack://@mattermost/webapp/./components/list_modal.jsx","webpack://@mattermost/webapp/./components/team_groups_manage_modal/team_groups_manage_modal.jsx","webpack://@mattermost/webapp/./components/team_groups_manage_modal/index.js","webpack://@mattermost/webapp/./components/main_menu/main_menu.jsx","webpack://@mattermost/webapp/./components/main_menu/index.jsx","webpack://@mattermost/webapp/./components/sidebar_right_menu/sidebar_right_menu.tsx","webpack://@mattermost/webapp/./components/sidebar_right_menu/index.js","webpack://@mattermost/webapp/./components/user_settings/import_theme_modal.tsx","webpack://@mattermost/webapp/./selectors/lhs.ts","webpack://@mattermost/webapp/./components/copy_url_context_menu/copy_url_context_menu.tsx","webpack://@mattermost/webapp/./components/copy_url_context_menu/index.ts","webpack://@mattermost/webapp/./components/team_sidebar/components/team_button.tsx","webpack://@mattermost/webapp/./components/team_sidebar/team_sidebar.tsx","webpack://@mattermost/webapp/./components/team_sidebar/index.ts","webpack://@mattermost/webapp/./actions/views/channel_sidebar.ts","webpack://@mattermost/webapp/./components/edit_category_modal/edit_category_modal.tsx","webpack://@mattermost/webapp/./components/edit_category_modal/index.ts","webpack://@mattermost/webapp/./components/more_direct_channels/more_direct_channels.tsx","webpack://@mattermost/webapp/./components/more_direct_channels/index.ts","webpack://@mattermost/webapp/./components/data_prefetch/data_prefetch.tsx","webpack://@mattermost/webapp/./components/data_prefetch/index.ts","webpack://@mattermost/webapp/./components/suggestion/switch_channel_provider.jsx","webpack://@mattermost/webapp/./components/quick_switch_modal/quick_switch_modal.tsx","webpack://@mattermost/webapp/./components/quick_switch_modal/index.tsx","webpack://@mattermost/webapp/./packages/mattermost-redux/src/constants/config.ts","webpack://@mattermost/webapp/./components/sidebar/add_channel_tutorial_tip.tsx","webpack://@mattermost/webapp/./components/sidebar/add_channel_dropdown.tsx","webpack://@mattermost/webapp/./components/sidebar/channel_filter/channel_filter.tsx","webpack://@mattermost/webapp/./components/sidebar/channel_filter/index.ts","webpack://@mattermost/webapp/./components/sidebar/channel_navigator/channel_navigator.tsx","webpack://@mattermost/webapp/./components/sidebar/channel_navigator/index.ts","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel/channel_mention_badge.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel/sidebar_channel_icon/sidebar_channel_icon.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel/sidebar_channel_icon/index.ts","webpack://@mattermost/webapp/./components/sidebar/sidebar_menu/sidebar_menu.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_menu/index.ts","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel/sidebar_channel_menu/sidebar_channel_menu.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel/sidebar_channel_menu/index.ts","webpack://@mattermost/webapp/./components/sidebar/channel_tutorial_tip.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel/sidebar_channel_link/sidebar_channel_link.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel/sidebar_channel_link/index.ts","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel/sidebar_base_channel/sidebar_base_channel.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel/sidebar_base_channel/index.ts","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel/sidebar_direct_channel/sidebar_direct_channel.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel/sidebar_direct_channel/index.ts","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel/sidebar_group_channel/sidebar_group_channel.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel/sidebar_group_channel/index.ts","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel/sidebar_channel.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel/index.ts","webpack://@mattermost/webapp/./components/sidebar/sidebar_category_header.tsx","webpack://@mattermost/webapp/./components/sidebar/invite_members_button.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_category/sidebar_category_sorting_menu/sidebar_category_sorting_menu.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_category/sidebar_category_sorting_menu/index.ts","webpack://@mattermost/webapp/./components/delete_category_modal/delete_category_modal.tsx","webpack://@mattermost/webapp/./components/delete_category_modal/index.ts","webpack://@mattermost/webapp/./components/sidebar/sidebar_category/sidebar_category_menu/sidebar_category_menu.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_category/sidebar_category_menu/index.ts","webpack://@mattermost/webapp/./components/sidebar/sidebar_category/sidebar_category.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_category/index.ts","webpack://@mattermost/webapp/./components/widgets/icons/unread_below_icon.tsx","webpack://@mattermost/webapp/./components/sidebar/unread_channel_indicator/unread_channel_indicator.tsx","webpack://@mattermost/webapp/./components/sidebar/unread_channel_indicator/index.ts","webpack://@mattermost/webapp/./components/sidebar/unread_channels/unread_channels.tsx","webpack://@mattermost/webapp/./components/sidebar/unread_channels/index.ts","webpack://@mattermost/webapp/./components/threading/global_threads_link/threads_icon.tsx","webpack://@mattermost/webapp/./components/threading/global_threads_link/global_threads_link.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel_list/sidebar_channel_list.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_channel_list/index.ts","webpack://@mattermost/webapp/./components/sidebar/sidebar_header/sidebar_header.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_header/index.ts","webpack://@mattermost/webapp/./components/sidebar/legacy_sidebar_header/dropdown/sidebar_header_dropdown_button.tsx","webpack://@mattermost/webapp/./components/sidebar/legacy_sidebar_header/dropdown/sidebar_header_dropdown.tsx","webpack://@mattermost/webapp/./components/sidebar/legacy_sidebar_header/dropdown/index.ts","webpack://@mattermost/webapp/./components/sidebar/legacy_sidebar_header/legacy_sidebar_header.tsx","webpack://@mattermost/webapp/./components/sidebar/legacy_sidebar_header/index.ts","webpack://@mattermost/webapp/./components/progress_bar.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_next_steps/sidebar_next_steps.tsx","webpack://@mattermost/webapp/./components/sidebar/sidebar_next_steps/index.ts","webpack://@mattermost/webapp/./components/sidebar/sidebar.tsx","webpack://@mattermost/webapp/./components/sidebar/index.ts","webpack://@mattermost/webapp/./components/permalink_view/actions.js","webpack://@mattermost/webapp/./components/permalink_view/permalink_view.jsx","webpack://@mattermost/webapp/./components/permalink_view/index.js","webpack://@mattermost/webapp/./components/channel_header_dropdown/channel_header_dropdown.js","webpack://@mattermost/webapp/./plugins/mobile_channel_header_plug/mobile_channel_header_plug.tsx","webpack://@mattermost/webapp/./plugins/mobile_channel_header_plug/index.ts","webpack://@mattermost/webapp/./components/channel_notifications_modal/components/describe.jsx","webpack://@mattermost/webapp/./components/channel_notifications_modal/components/section_title.jsx","webpack://@mattermost/webapp/./components/channel_notifications_modal/components/collapse_view.jsx","webpack://@mattermost/webapp/./components/channel_notifications_modal/components/extra_info.jsx","webpack://@mattermost/webapp/./components/channel_notifications_modal/components/expand_view.jsx","webpack://@mattermost/webapp/./components/channel_notifications_modal/components/notification_section.jsx","webpack://@mattermost/webapp/./components/channel_notifications_modal/channel_notifications_modal.jsx","webpack://@mattermost/webapp/./components/channel_notifications_modal/index.js","webpack://@mattermost/webapp/./components/channel_members_dropdown/channel_members_dropdown.jsx","webpack://@mattermost/webapp/./components/channel_members_dropdown/index.js","webpack://@mattermost/webapp/./components/member_list_channel/member_list_channel.tsx","webpack://@mattermost/webapp/./components/member_list_channel/index.ts","webpack://@mattermost/webapp/./components/channel_members_modal/channel_members_modal.tsx","webpack://@mattermost/webapp/./components/channel_members_modal/index.ts","webpack://@mattermost/webapp/./components/channel_info_modal/channel_info_modal.tsx","webpack://@mattermost/webapp/./components/channel_info_modal/index.js","webpack://@mattermost/webapp/./components/edit_channel_header_modal/edit_channel_header_modal.jsx","webpack://@mattermost/webapp/./components/edit_channel_header_modal/index.js","webpack://@mattermost/webapp/./components/edit_channel_purpose_modal/edit_channel_purpose_modal.tsx","webpack://@mattermost/webapp/./components/edit_channel_purpose_modal/index.tsx","webpack://@mattermost/webapp/./components/rename_channel_modal/rename_channel_modal.tsx","webpack://@mattermost/webapp/./components/rename_channel_modal/index.ts","webpack://@mattermost/webapp/./components/convert_channel_modal/convert_channel_modal.jsx","webpack://@mattermost/webapp/./components/convert_channel_modal/index.js","webpack://@mattermost/webapp/./components/delete_channel_modal/delete_channel_modal.tsx","webpack://@mattermost/webapp/./components/delete_channel_modal/index.ts","webpack://@mattermost/webapp/./components/unarchive_channel_modal/unarchive_channel_modal.tsx","webpack://@mattermost/webapp/./components/unarchive_channel_modal/index.ts","webpack://@mattermost/webapp/./components/channel_groups_manage_modal/channel_groups_manage_modal.tsx","webpack://@mattermost/webapp/./components/channel_groups_manage_modal/index.ts","webpack://@mattermost/webapp/./components/channel_header_dropdown/menu_items/leave_channel/leave_channel.tsx","webpack://@mattermost/webapp/./components/channel_header_dropdown/menu_items/leave_channel/index.ts","webpack://@mattermost/webapp/./components/channel_header_dropdown/menu_items/close_channel/close_channel.tsx","webpack://@mattermost/webapp/./components/channel_header_dropdown/menu_items/close_channel/index.ts","webpack://@mattermost/webapp/./components/channel_header_dropdown/menu_items/close_message/close_message.tsx","webpack://@mattermost/webapp/./components/channel_header_dropdown/menu_items/close_message/index.ts","webpack://@mattermost/webapp/./components/channel_header_dropdown/menu_items/toggle_mute_channel/toggle_mute_channel.tsx","webpack://@mattermost/webapp/./components/channel_header_dropdown/menu_items/toggle_mute_channel/index.ts","webpack://@mattermost/webapp/./components/channel_header_dropdown/menu_items/toggle_favorite_channel/toggle_favorite_channel.tsx","webpack://@mattermost/webapp/./components/channel_header_dropdown/menu_items/toggle_favorite_channel/index.ts","webpack://@mattermost/webapp/./components/channel_header_dropdown/menu_items/view_pinned_posts/view_pinned_posts.tsx","webpack://@mattermost/webapp/./components/channel_header_dropdown/menu_items/view_pinned_posts/index.ts","webpack://@mattermost/webapp/./components/channel_header_dropdown/channel_header_dropdown_items.js","webpack://@mattermost/webapp/./components/channel_header_dropdown/mobile_channel_header_dropdown_animation.jsx","webpack://@mattermost/webapp/./components/channel_header_dropdown/mobile_channel_header_dropdown.js","webpack://@mattermost/webapp/./components/channel_header_dropdown/index.js","webpack://@mattermost/webapp/./components/notify_counts/notify_counts.tsx","webpack://@mattermost/webapp/./components/notify_counts/index.ts","webpack://@mattermost/webapp/./components/channel_header_mobile/collapse_lhs_button/collapse_lhs_button.tsx","webpack://@mattermost/webapp/./components/channel_header_mobile/collapse_lhs_button/index.ts","webpack://@mattermost/webapp/./components/channel_header_mobile/collapse_rhs_button/collapse_rhs_button.tsx","webpack://@mattermost/webapp/./components/channel_header_mobile/collapse_rhs_button/index.ts","webpack://@mattermost/webapp/./components/widgets/icons/info_icon.tsx","webpack://@mattermost/webapp/./components/channel_header_mobile/channel_info_button/channel_info_button.js","webpack://@mattermost/webapp/./components/channel_header_mobile/channel_info_button/index.js","webpack://@mattermost/webapp/./components/channel_header_mobile/show_search_button/show_search_button.tsx","webpack://@mattermost/webapp/./components/channel_header_mobile/show_search_button/index.ts","webpack://@mattermost/webapp/./components/channel_header_mobile/unmute_channel_button/unmute_channel_button.tsx","webpack://@mattermost/webapp/./components/channel_header_mobile/unmute_channel_button/index.ts","webpack://@mattermost/webapp/./components/channel_header_mobile/channel_header_mobile.js","webpack://@mattermost/webapp/./components/channel_header_mobile/index.js","webpack://@mattermost/webapp/./components/channel_layout/channel_identifier_router/actions.ts","webpack://@mattermost/webapp/./components/widgets/icons/message_icon.tsx","webpack://@mattermost/webapp/./components/popover_list_members/popover_list_members_item/popover_list_members_item.jsx","webpack://@mattermost/webapp/./components/popover_list_members/popover_list_members_item/index.js","webpack://@mattermost/webapp/./components/popover_list_members/popover_list_members.jsx","webpack://@mattermost/webapp/./components/popover_list_members/index.js","webpack://@mattermost/webapp/./components/widgets/icons/plugin_channel_header_icon.tsx","webpack://@mattermost/webapp/./plugins/channel_header_plug/channel_header_plug.tsx","webpack://@mattermost/webapp/./plugins/channel_header_plug/index.ts","webpack://@mattermost/webapp/./components/channel_header/channel_header.js","webpack://@mattermost/webapp/./components/channel_header/index.js","webpack://@mattermost/webapp/./components/widgets/icons/camera_icon.tsx","webpack://@mattermost/webapp/./components/call_button/call_button.tsx","webpack://@mattermost/webapp/./components/call_button/index.ts","webpack://@mattermost/webapp/./components/create_post/create_post.tsx","webpack://@mattermost/webapp/./components/create_post/index.ts","webpack://@mattermost/webapp/./components/post_view/commented_on_files_message/commented_on_files_message.jsx","webpack://@mattermost/webapp/./components/post_view/commented_on_files_message/index.js","webpack://@mattermost/webapp/./components/post_view/commented_on/commented_on.tsx","webpack://@mattermost/webapp/./components/post_view/commented_on/index.ts","webpack://@mattermost/webapp/./components/post_view/post_body/post_body.jsx","webpack://@mattermost/webapp/./components/post_view/post_body/index.js","webpack://@mattermost/webapp/./components/post_view/comment_icon/index.ts","webpack://@mattermost/webapp/./components/post_view/post_info/post_info.tsx","webpack://@mattermost/webapp/./components/post_view/post_info/index.ts","webpack://@mattermost/webapp/./components/post_view/post_header/post_header_custom_status.tsx","webpack://@mattermost/webapp/./components/post_view/post_header/post_header.tsx","webpack://@mattermost/webapp/./components/post_view/post_header/index.ts","webpack://@mattermost/webapp/./components/threading/channel_threads/thread_footer/thread_footer.tsx","webpack://@mattermost/webapp/./components/post_view/post/post.jsx","webpack://@mattermost/webapp/./components/post_view/post/index.ts","webpack://@mattermost/webapp/./components/post_view/combined_user_activity_post/index.ts","webpack://@mattermost/webapp/./components/common/svg_images_components/empty_state_themeable.svg.tsx","webpack://@mattermost/webapp/./components/post_view/channel_intro_message/add_members_button.tsx","webpack://@mattermost/webapp/./components/post_view/channel_intro_message/channel_intro_message.tsx","webpack://@mattermost/webapp/./components/post_view/channel_intro_message/index.ts","webpack://@mattermost/webapp/./components/post_view/post_list_row/post_list_row.tsx","webpack://@mattermost/webapp/./components/post_view/post_list_row/index.ts","webpack://@mattermost/webapp/./components/widgets/icons/scroll_to_bottom_icon.tsx","webpack://@mattermost/webapp/./components/post_view/scroll_to_bottom_arrows.jsx","webpack://@mattermost/webapp/./components/toast/toast.tsx","webpack://@mattermost/webapp/./components/shortcut_key/shortcut_key.tsx","webpack://@mattermost/webapp/./components/search_shortcut/search_shortcut.tsx","webpack://@mattermost/webapp/./components/hint-toast/hint_toast.tsx","webpack://@mattermost/webapp/./components/toast_wrapper/toast_wrapper.jsx","webpack://@mattermost/webapp/./components/toast_wrapper/index.jsx","webpack://@mattermost/webapp/./components/post_view/post_list_virtualized/latest_post_reader.tsx","webpack://@mattermost/webapp/./components/post_view/post_list_virtualized/post_list_virtualized.jsx","webpack://@mattermost/webapp/./components/post_view/post_list/post_list.jsx","webpack://@mattermost/webapp/./components/post_view/post_list/index.js","webpack://@mattermost/webapp/./components/post_view/post_view.jsx","webpack://@mattermost/webapp/./components/post_view/index.js","webpack://@mattermost/webapp/./components/channel_view/channel_view.tsx","webpack://@mattermost/webapp/./components/channel_view/index.ts","webpack://@mattermost/webapp/./components/channel_layout/channel_identifier_router/channel_identifier_router.tsx","webpack://@mattermost/webapp/./components/channel_layout/channel_identifier_router/index.ts","webpack://@mattermost/webapp/./components/channel_layout/playbook_runner.tsx","webpack://@mattermost/webapp/./components/channel_layout/center_channel/center_channel.tsx","webpack://@mattermost/webapp/./components/channel_layout/center_channel/index.ts","webpack://@mattermost/webapp/./images/favicon/favicon-default-16x16.png","webpack://@mattermost/webapp/./images/favicon/favicon-default-24x24.png","webpack://@mattermost/webapp/./images/favicon/favicon-default-32x32.png","webpack://@mattermost/webapp/./images/favicon/favicon-default-64x64.png","webpack://@mattermost/webapp/./images/favicon/favicon-default-96x96.png","webpack://@mattermost/webapp/./images/favicon/favicon-mentions-16x16.png","webpack://@mattermost/webapp/./images/favicon/favicon-mentions-24x24.png","webpack://@mattermost/webapp/./images/favicon/favicon-mentions-32x32.png","webpack://@mattermost/webapp/./images/favicon/favicon-mentions-64x64.png","webpack://@mattermost/webapp/./images/favicon/favicon-mentions-96x96.png","webpack://@mattermost/webapp/./images/favicon/favicon-unread-16x16.png","webpack://@mattermost/webapp/./images/favicon/favicon-unread-24x24.png","webpack://@mattermost/webapp/./images/favicon/favicon-unread-32x32.png","webpack://@mattermost/webapp/./images/favicon/favicon-unread-64x64.png","webpack://@mattermost/webapp/./images/favicon/favicon-unread-96x96.png","webpack://@mattermost/webapp/./components/favicon_title_handler/favicon_title_handler.tsx","webpack://@mattermost/webapp/./components/favicon_title_handler/index.ts","webpack://@mattermost/webapp/./components/widgets/icons/admin_eye_icon.tsx","webpack://@mattermost/webapp/./components/product_notices_modal/product_notices_modal.tsx","webpack://@mattermost/webapp/./components/product_notices_modal/index.tsx","webpack://@mattermost/webapp/./components/channel_layout/channel_controller.jsx","webpack://@mattermost/webapp/./components/needs_team/needs_team.tsx","webpack://@mattermost/webapp/./components/needs_team/index.ts","webpack://@mattermost/webapp/./plugins/textbox/index.tsx","webpack://@mattermost/webapp/./plugins/interactive_dialog.js","webpack://@mattermost/webapp/./plugins/export.js","webpack://@mattermost/webapp/./utils/a11y_controller.js","webpack://@mattermost/webapp/./components/root/root_redirect/root_redirect.tsx","webpack://@mattermost/webapp/./components/root/root_redirect/index.ts","webpack://@mattermost/webapp/./components/root/root.jsx","webpack://@mattermost/webapp/./components/root/index.js","webpack://@mattermost/webapp/./components/root_portal.jsx","webpack://@mattermost/webapp/./components/save_button.tsx","webpack://@mattermost/webapp/./components/search_hint/search_hint.tsx","webpack://@mattermost/webapp/./components/suggestion/search_suggestion_list.jsx","webpack://@mattermost/webapp/./components/suggestion/suggestion_date.jsx","webpack://@mattermost/webapp/./components/search_bar/search_bar.tsx","webpack://@mattermost/webapp/./components/search_results_item/search_results_item.jsx","webpack://@mattermost/webapp/./components/search_results_item/index.ts","webpack://@mattermost/webapp/./components/file_search_results/file_search_result_item.tsx","webpack://@mattermost/webapp/./components/file_search_results/index.tsx","webpack://@mattermost/webapp/./components/search_results/files_filter_menu.tsx","webpack://@mattermost/webapp/./components/search_results/messages_or_files_selector.tsx","webpack://@mattermost/webapp/./components/search_results/search_results.tsx","webpack://@mattermost/webapp/./components/search_results/index.tsx","webpack://@mattermost/webapp/./components/suggestion/search_date_suggestion/search_date_suggestion.tsx","webpack://@mattermost/webapp/./components/suggestion/search_date_suggestion/index.ts","webpack://@mattermost/webapp/./components/suggestion/search_date_provider.jsx","webpack://@mattermost/webapp/./components/suggestion/search_channel_suggestion/search_channel_suggestion.tsx","webpack://@mattermost/webapp/./components/suggestion/search_channel_suggestion/index.ts","webpack://@mattermost/webapp/./components/suggestion/search_channel_provider.jsx","webpack://@mattermost/webapp/./components/suggestion/search_user_provider.jsx","webpack://@mattermost/webapp/./components/search/search.tsx","webpack://@mattermost/webapp/./components/search/index.tsx","webpack://@mattermost/webapp/./components/search_results_header/search_results_header.tsx","webpack://@mattermost/webapp/./components/search_results_header/index.tsx","webpack://@mattermost/webapp/./components/user_list_row/user_list_row.jsx","webpack://@mattermost/webapp/./components/user_list_row/index.js","webpack://@mattermost/webapp/./components/user_list.jsx","webpack://@mattermost/webapp/./components/searchable_user_list/searchable_user_list.jsx","webpack://@mattermost/webapp/./components/searchable_user_list/searchable_user_list_container.jsx","webpack://@mattermost/webapp/./components/setting_item_max.jsx","webpack://@mattermost/webapp/./components/setting_item_min/setting_item_min.tsx","webpack://@mattermost/webapp/./components/setting_item_min/index.ts","webpack://@mattermost/webapp/./components/setting_picture.jsx","webpack://@mattermost/webapp/./components/shared_channel_indicator.tsx","webpack://@mattermost/webapp/./components/shared_user_indicator.tsx","webpack://@mattermost/webapp/./images/close_next_steps_arrow.svg","webpack://@mattermost/webapp/./components/sidebar/sidebar_next_steps/remove_next_steps_modal.tsx","webpack://@mattermost/webapp/./components/size_aware_image.jsx","webpack://@mattermost/webapp/./components/spinner_button.tsx","webpack://@mattermost/webapp/./components/widgets/icons/status_away_avatar_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/status_away_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/status_dnd_avatar_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/status_dnd_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/status_offline_avatar_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/status_offline_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/status_online_avatar_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/status_online_icon.tsx","webpack://@mattermost/webapp/./components/status_icon.tsx","webpack://@mattermost/webapp/./components/suggestion/command_provider/mentions/index.ts","webpack://@mattermost/webapp/./components/suggestion/command_provider/app_command_parser/app_command_parser.ts","webpack://@mattermost/webapp/./components/suggestion/command_provider/app_command_parser/app_command_parser_dependencies.ts","webpack://@mattermost/webapp/./components/suggestion/generic_channel_provider.jsx","webpack://@mattermost/webapp/./components/suggestion/generic_user_provider.jsx","webpack://@mattermost/webapp/./components/suggestion/menu_action_provider.jsx","webpack://@mattermost/webapp/./components/suggestion/modal_suggestion_list.jsx","webpack://@mattermost/webapp/./components/suggestion/provider.jsx","webpack://@mattermost/webapp/./components/suggestion/suggestion.jsx","webpack://@mattermost/webapp/./components/suggestion/suggestion_box.jsx","webpack://@mattermost/webapp/./components/suggestion/suggestion_list.jsx","webpack://@mattermost/webapp/./components/system_notice/notices.tsx","webpack://@mattermost/webapp/./components/system_notice/system_notice.tsx","webpack://@mattermost/webapp/./components/system_notice/index.ts","webpack://@mattermost/webapp/./components/team_members_dropdown/team_members_dropdown.tsx","webpack://@mattermost/webapp/./components/team_members_dropdown/index.ts","webpack://@mattermost/webapp/./components/member_list_team/member_list_team.tsx","webpack://@mattermost/webapp/./components/member_list_team/index.ts","webpack://@mattermost/webapp/./components/team_members_modal/team_members_modal.tsx","webpack://@mattermost/webapp/./components/team_members_modal/index.ts","webpack://@mattermost/webapp/./actions/views/group.js","webpack://@mattermost/webapp/./components/suggestion/at_mention_provider/at_mention_suggestion.jsx","webpack://@mattermost/webapp/./components/suggestion/at_mention_provider/at_mention_provider.jsx","webpack://@mattermost/webapp/./components/suggestion/at_mention_provider/index.js","webpack://@mattermost/webapp/./components/suggestion/channel_mention_provider.jsx","webpack://@mattermost/webapp/./components/suggestion/command_provider/command_provider.tsx","webpack://@mattermost/webapp/./components/suggestion/command_provider/app_provider.tsx","webpack://@mattermost/webapp/./components/suggestion/emoticon_provider.jsx","webpack://@mattermost/webapp/./components/textbox/textbox.tsx","webpack://@mattermost/webapp/./components/textbox/index.ts","webpack://@mattermost/webapp/./components/textbox/textbox_links/textbox_links.tsx","webpack://@mattermost/webapp/./components/textbox/textbox_links/index.ts","webpack://@mattermost/webapp/./components/threading/common/button/button.tsx","webpack://@mattermost/webapp/./components/threading/common/follow_button/follow_button.tsx","webpack://@mattermost/webapp/./components/threading/common/options.ts","webpack://@mattermost/webapp/./components/threading/hooks.ts","webpack://@mattermost/webapp/./actions/views/create_comment.tsx","webpack://@mattermost/webapp/./components/suggestion/rhs_suggestion_list.tsx","webpack://@mattermost/webapp/./components/create_comment/create_comment.tsx","webpack://@mattermost/webapp/./components/create_comment/index.ts","webpack://@mattermost/webapp/./components/threading/virtualized_thread_viewer/create_comment.tsx","webpack://@mattermost/webapp/./components/message_with_additional_content.jsx","webpack://@mattermost/webapp/./components/rhs_root_post/rhs_root_post.jsx","webpack://@mattermost/webapp/./components/rhs_root_post/index.ts","webpack://@mattermost/webapp/./components/threading/virtualized_thread_viewer/root_post/root_post.tsx","webpack://@mattermost/webapp/./components/threading/virtualized_thread_viewer/root_post/index.ts","webpack://@mattermost/webapp/./components/rhs_comment/rhs_comment.jsx","webpack://@mattermost/webapp/./components/rhs_comment/index.ts","webpack://@mattermost/webapp/./components/threading/virtualized_thread_viewer/reply/reply.tsx","webpack://@mattermost/webapp/./components/threading/virtualized_thread_viewer/reply/index.ts","webpack://@mattermost/webapp/./components/threading/virtualized_thread_viewer/thread_viewer_row.tsx","webpack://@mattermost/webapp/./components/threading/virtualized_thread_viewer/virtualized_thread_viewer.tsx","webpack://@mattermost/webapp/./components/threading/virtualized_thread_viewer/index.ts","webpack://@mattermost/webapp/./components/threading/thread_viewer/thread_viewer.tsx","webpack://@mattermost/webapp/./components/threading/thread_viewer/index.ts","webpack://@mattermost/webapp/./utils/resolvable.ts","webpack://@mattermost/webapp/./components/timestamp/semantic_time.tsx","webpack://@mattermost/webapp/./components/timestamp/relative_ranges.tsx","webpack://@mattermost/webapp/./components/timestamp/timestamp.tsx","webpack://@mattermost/webapp/./components/timestamp/index.ts","webpack://@mattermost/webapp/./components/toggle_modal_button.jsx","webpack://@mattermost/webapp/./components/toggle_modal_button_redux/toggle_modal_button_redux.jsx","webpack://@mattermost/webapp/./components/toggle_modal_button_redux/index.js","webpack://@mattermost/webapp/./components/user_profile/index.ts","webpack://@mattermost/webapp/./components/user_profile/user_profile.tsx","webpack://@mattermost/webapp/./images/crt-beta.gif","webpack://@mattermost/webapp/./components/collapsed_reply_threads_modal/collapsed_reply_threads_modal.tsx","webpack://@mattermost/webapp/./components/user_settings/modal/user_settings_modal.tsx","webpack://@mattermost/webapp/./components/user_settings/modal/index.ts","webpack://@mattermost/webapp/./components/widgets/badges/badge.tsx","webpack://@mattermost/webapp/./components/widgets/badges/bot_badge.tsx","webpack://@mattermost/webapp/./components/widgets/badges/guest_badge.tsx","webpack://@mattermost/webapp/./components/widgets/icons/archive_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/attachment_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/close_circle_solid_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/close_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/emoji_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/fa_add_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/fa_back_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/fa_dropdown_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/fa_edit_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/fa_next_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/fa_previous_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/fa_success_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/flag_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/flag_icon_filled.tsx","webpack://@mattermost/webapp/./components/widgets/icons/globe_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/info_small_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/lock_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/mattermost_logo.tsx","webpack://@mattermost/webapp/./components/widgets/icons/mentions_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/menu_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/search_icon.tsx","webpack://@mattermost/webapp/./components/widgets/links/notify_link.tsx","webpack://@mattermost/webapp/./components/widgets/links/upgrade_link.tsx","webpack://@mattermost/webapp/./components/widgets/loading/loading_spinner.tsx","webpack://@mattermost/webapp/./components/widgets/loading/loading_wrapper.tsx","webpack://@mattermost/webapp/./components/widgets/menu/menu_items/submenu_item.tsx","webpack://@mattermost/webapp/./components/widgets/menu/menu_header.tsx","webpack://@mattermost/webapp/./components/widgets/menu/menu_group.tsx","webpack://@mattermost/webapp/./components/widgets/menu/menu_items/menu_item_action.tsx","webpack://@mattermost/webapp/./components/widgets/menu/menu_items/menu_item_external_link.tsx","webpack://@mattermost/webapp/./components/widgets/menu/menu_items/menu_item_link.tsx","webpack://@mattermost/webapp/./components/widgets/menu/menu_items/menu_top_notification.tsx","webpack://@mattermost/webapp/./components/start_trial_modal/start_trial_modal_svg.tsx","webpack://@mattermost/webapp/./components/start_trial_modal/index.tsx","webpack://@mattermost/webapp/./components/widgets/menu/menu_items/menu_start_trial.tsx","webpack://@mattermost/webapp/./components/widgets/menu/menu_items/menu_item_toggle_modal_redux.tsx","webpack://@mattermost/webapp/./components/widgets/menu/menu.tsx","webpack://@mattermost/webapp/./components/widgets/menu/menu_items/menu_item.tsx","webpack://@mattermost/webapp/./components/widgets/menu/menu_wrapper_animation.tsx","webpack://@mattermost/webapp/./components/widgets/menu/menu_wrapper.tsx","webpack://@mattermost/webapp/./components/widgets/icons/back_icon.tsx","webpack://@mattermost/webapp/./components/widgets/modals/full_screen_modal.tsx","webpack://@mattermost/webapp/./components/widgets/popover/index.tsx","webpack://@mattermost/webapp/./components/widgets/settings/bool_setting.tsx","webpack://@mattermost/webapp/./components/widgets/settings/setting.tsx","webpack://@mattermost/webapp/./components/widgets/settings/text_setting.tsx","webpack://@mattermost/webapp/./components/widgets/simple_tooltip/simple_tooltip.tsx","webpack://@mattermost/webapp/./components/widgets/team_icon/team_icon.tsx","webpack://@mattermost/webapp/./components/widgets/users/avatar/avatar.tsx","webpack://@mattermost/webapp/./components/widgets/users/avatars/avatars.tsx","webpack://@mattermost/webapp/./dispatcher/app_dispatcher.jsx","webpack://@mattermost/webapp/./packages/mattermost-redux/src/actions/admin.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/actions/apps.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/actions/cloud.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/actions/groups.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/actions/integrations.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/selectors/entities/apps.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/selectors/entities/files.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/selectors/entities/groups.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/utils/group_utils.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/selectors/entities/search.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/selectors/entities/utils.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/utils/file_utils.ts","webpack://@mattermost/webapp/./packages/mattermost-redux/src/utils/integration_utils.ts","webpack://@mattermost/webapp/./plugins/registry.js","webpack://@mattermost/webapp/./plugins/actions.js","webpack://@mattermost/webapp/./plugins/index.js","webpack://@mattermost/webapp/./plugins/pluggable/pluggable.jsx","webpack://@mattermost/webapp/./plugins/pluggable/index.js","webpack://@mattermost/webapp/./selectors/cloud.ts","webpack://@mattermost/webapp/./selectors/global_header.ts","webpack://@mattermost/webapp/./selectors/local_storage.js","webpack://@mattermost/webapp/./selectors/plugins.ts","webpack://@mattermost/webapp/./selectors/views/admin.js","webpack://@mattermost/webapp/./selectors/views/announcement_bar.js","webpack://@mattermost/webapp/./selectors/views/channel.js","webpack://@mattermost/webapp/./selectors/views/modals.js","webpack://@mattermost/webapp/./selectors/views/system.js","webpack://@mattermost/webapp/./selectors/views/textbox.js","webpack://@mattermost/webapp/./selectors/views/websocket.js","webpack://@mattermost/webapp/./stores/browser_store.tsx","webpack://@mattermost/webapp/./types/actions.ts","webpack://@mattermost/webapp/./types/cloud/sku.ts","webpack://@mattermost/webapp/./utils/apps.ts","webpack://@mattermost/webapp/./utils/cloud_utils.ts","webpack://@mattermost/webapp/./utils/countries.ts","webpack://@mattermost/webapp/./utils/datetime.ts","webpack://@mattermost/webapp/./utils/delayed_action.tsx","webpack://@mattermost/webapp/./utils/emoji_utils.tsx","webpack://@mattermost/webapp/./utils/file_utils.jsx","webpack://@mattermost/webapp/./utils/license_utils.jsx","webpack://@mattermost/webapp/./components/latex_block/latex_block.tsx","webpack://@mattermost/webapp/./components/latex_block/index.ts","webpack://@mattermost/webapp/./components/link_tooltip/link_tooltip.tsx","webpack://@mattermost/webapp/./components/markdown_image_expand/markdown_image_expand.tsx","webpack://@mattermost/webapp/./components/markdown_image_expand/index.ts","webpack://@mattermost/webapp/./images/icons/brokenimage.png","webpack://@mattermost/webapp/./components/markdown_image.jsx","webpack://@mattermost/webapp/./components/post_emoji/post_emoji.tsx","webpack://@mattermost/webapp/./components/post_emoji/index.tsx","webpack://@mattermost/webapp/./utils/message_html_to_component.jsx","webpack://@mattermost/webapp/./utils/paste.tsx","webpack://@mattermost/webapp/./utils/position_utils.tsx","webpack://@mattermost/webapp/./utils/react_intl.ts","webpack://@mattermost/webapp/./utils/route.jsx","webpack://@mattermost/webapp/./utils/team_utils.jsx","webpack://@mattermost/webapp/./images/cloud/blue.svg","webpack://@mattermost/webapp/./images/cloud/mattermost-cloud.svg","webpack://@mattermost/webapp/./images/cloud/waves.svg","webpack://@mattermost/webapp/./images/groups-avatar.png"],"names":["dispatch","store","getState","async","reloadConfig","success","error","data","err","AdminActions","id","server_error_id","adminResetMfa","userId","UserActions","getClusterStatus","ldapTest","invalidateAllCaches","recycleDatabaseConnection","adminResetEmail","user","getOAuthAppInfo","clientId","bindClientFunc","clientFunc","Client4","params","allowOAuth2","responseType","redirectUri","state","scope","emailToLdap","loginId","password","token","ldapId","ldapPassword","emailToOAuth","newType","oauthToEmail","currentService","email","follow_link","emitUserLoggedOutEvent","uploadBrandImage","brandImage","deleteBrandImage","uploadPublicSamlCertificate","file","uploadPrivateSamlCertificate","uploadPublicLdapCertificate","uploadPrivateLdapCertificate","uploadIdpSamlCertificate","removePublicSamlCertificate","removePrivateSamlCertificate","removePublicLdapCertificate","removePrivateLdapCertificate","removeIdpSamlCertificate","getStandardAnalytics","teamId","getAdvancedAnalytics","getBotPostsPerDayAnalytics","getPostsPerDayAnalytics","getUsersPerDayAnalytics","elasticsearchTest","config","testS3Connection","elasticsearchPurgeIndexes","blevePurgeIndexes","purgeBleveIndexes","setNavigationBlocked","blocked","type","ActionTypes","deferNavigation","onNavigationConfirmed","cancelNavigation","confirmNavigation","thunkDispatch","thunkGetState","callback","getOnNavigationConfirmed","invalidateAllEmailInvites","TeamActions","testSmtp","registerAdminConsolePlugin","pluginId","reducer","storeDispatch","unregisterAdminConsolePlugin","testSiteURL","siteURL","registerAdminConsoleCustomSetting","key","component","showTitle","options","getSamlMetadataFromIdp","samlMetadataURL","setSamlIdpCertificateFromMetadata","certData","upgradeToE0","trackEvent","upgradeToE0Status","restartServer","ping","requestTrialLicense","users","termsAccepted","receiveEmailsAccepted","page","from_page","method","body","JSON","stringify","terms_accepted","receive_emails_accepted","e","message","AsyncSelect","require","reactStyles","menuPortal","provided","zIndex","commonProps","isClearable","openMenuOnFocus","classNamePrefix","menuPortalTarget","document","styles","AppsFormSelectField","React","constructor","props","super","selectedOption","this","onChange","performLookup","field","name","userInput","refreshNonce","Math","random","toString","nextProps","prevState","renderDynamicSelect","placeholder","hint","value","className","loadOptions","loadDynamicOptions","defaultOptions","isMulti","multiselect","isDisabled","readonly","renderStaticSelect","render","label","helpText","selectComponent","AppsFormField","selected","AppFieldTypes","selectedLabel","username","teammateNameDisplay","displayUsername","channel","display_name","actions","providers","GenericUserProvider","autocompleteUsers","GenericChannelProvider","autocompleteChannels","setProviders","errorText","listComponent","displayName","modal_label","displayNameContent","is_required","description","helpTextContent","subtype","maxLength","max_length","textType","TextSetting","textValue","autoFocus","disabled","resizable","selectedValue","onSelected","handleSelected","boolValue","ModalSuggestionList","connect","getTeammateNameDisplaySetting","bindActionCreators","markdownOptions","singleline","mentionHighlight","AppsFormHeader","initFormValues","form","values","fields","forEach","f","defaultValue","AppsForm","elements","fieldErrors","formError","hasErrors","Object","keys","length","checkIfErrorsMatchElements","entries","intl","formatMessage","defaultMessage","setState","submitName","preventDefault","fieldsAsElements","element","checkDialogElementForError","submission","submitting","res","submit","errorResponse","errorMessage","updateErrors","errors","handleHide","callResponse","updatedForm","AppCallResponseTypes","undefined","find","performLookupCall","errMsg","callResp","items","filter","filterEmptyOptions","submitted","submit_on_cancel","show","refresh","refreshOnSelect","then","errorMsg","renderModal","header","Modal","dialogClassName","onHide","onExited","backdrop","role","aria-labelledby","onSubmit","handleSubmit","autoComplete","closeButton","style","borderBottom","componentClass","renderHeader","renderBody","renderFooter","renderEmbedded","title","icon","iconComponent","alt","width","height","src","renderElements","isEmbedded","submit_buttons","map","index","SuggestionList","submitText","submitButtons","spinning","spinningText","localizeMessage","buttons","o","onClick","optional","injectIntl","AppsFormContainer","makeErrorMsg","msg","details","makeCallErrorResponse","call","getCall","doAppCall","AppCallTypes","markdown","postEphemeralCallResponseForContext","context","makeErrMsg","selected_field","query","expand","submitForm","cleanForm","openModal","modalId","ModalIdentifiers","dialogType","dialogProps","openAppsModal","navigate_to_url","shouldOpenInNewTab","getSiteURL","window","open","browserHistory","slice","postEphemeralCallResponseForPost","response","post","sendEphemeralPost","channel_id","root_id","app_metadata","bot_user_id","postEphemeralCallResponseForChannel","channelID","post_id","postEphemeralCallResponseForCommandArgs","args","openDirectChannelToUserId","currentUserId","getCurrentUserId","channelName","getDirectChannelName","getChannelByName","ChannelActions","now","Date","prefDirect","category","Preferences","prefOpenTime","PreferenceTypes","batchActions","savePreferences","user_id","openGroupChannelToUserIds","userIds","result","getCurrentTeamUrl","loadChannelsForCurrentUser","unreads","getUnreadChannelIds","getCurrentTeamId","getChannel","Constants","loadNewDMIfNeeded","loadNewGMIfNeeded","loadProfilesForSidebar","searchMoreChannels","term","showArchivedChannels","Error","myMembers","getMyChannelMemberships","c","autocompleteChannelsForSearch","addUsersToChannel","channelId","requests","uId","Promise","all","unmuteChannel","mark_unread","NotificationLevels","muteChannel","completeStripeAddPaymentMethod","stripe","billingDetails","isDevMode","paymentSetupIntent","confirmCardSetup","getConfirmCardSetup","cardSetupFunction","client_secret","payment_method","card","billing_details","address","line1","line2","address2","city","country","getCode","postal_code","postalCode","setupIntent","stripeError","status","subscribeCloudSubscription","productId","executeCommand","cmdLength","indexOf","cmd","substring","toLowerCase","trim","PostActions","UserAgent","GlobalActions","getCurrentChannel","getUserIdFromChannelName","currentTeamId","redirectChannel","getRedirectChannelNameForTeam","teamUrl","getCurrentRelativeTeamUrl","isFavoriteChannel","unfavoriteChannel","UserSettingsModal","isContentProductSettings","appsEnabled","getGlobalState","createErrorMessage","errMessage","parser","AppCommandParser","intlShim","team_id","isAppCommand","composeCallFromCommand","localizeAndFormatMessage","t","hasGotoLocation","goto_location","isUrlSafe","trigger_id","IntegrationTypes","startsWith","substr","SubMenuModal","SubMenuItems","text","subMenu","action","root","enforceFocus","openLeft","ariaLabel","Utils","emitChannelClickEvent","switchToChannel","chan","isRHSOpened","getIsRhsOpen","isPinnedPostsShowing","getRhsState","RHSStates","isChannelFilesShowing","member","getMyChannelMember","currentChannelId","getCurrentChannelId","getChannelStats","penultimate","LocalStorageStore","updateRhsState","ChannelTypes","fetchAppBindings","fake","fail","otherUserId","createDirectChannel","userVisitedFakeChannel","updateNewMessagesAtInChannel","lastViewedAt","last_viewed_at","emitCloseRightHandSide","closeRightHandSide","toggleShortcutsModal","AppDispatcher","showChannelNameUpdateModal","showGetPublicLinkModal","fileId","showLeavePrivateChannelModal","showMobileSubMenuModal","submenuModalData","ModalId","parentId","doDispatch","doGetState","timestamp","PostTypes","create_at","update_at","handleNewPost","sendAddToChannelEphemeralPost","addedUsername","addedUserId","postRootId","lastTimeTypingSent","emitLocalUserTypingEvent","parentPostId","actionDispatch","actionGetState","getConfig","stats","getCurrentChannelStats","membersInChannel","member_count","timeBetweenUserTypingUpdatesMilliseconds","TimeBetweenUserTypingUpdatesMilliseconds","maxNotificationsPerChannel","MaxNotificationsPerChannel","EnableUserTypingMessages","WebSocketClient","redirectTo","shouldSignalLogout","userAction","logout","BrowserStore","stopPeriodicStatusUpdates","WebsocketActions","clearUserCookie","catch","toggleSideBarRightMenuAction","closeLhs","closeRhsMenu","emitBrowserFocus","focus","getTeamRedirectChannelIfIsAccesible","team","myMember","getMyTeamMember","teamChannels","getChannelsNameMapInTeam","fetchMyChannelsAndMembers","channelMember","getAllDirectChannels","directChannel","getChannelByNameAndTeamName","redirectUserToDefaultTeam","getCurrentUser","getTeamMemberships","loadMe","locale","getCurrentLocale","myTeams","getMyTeams","getTeam","delete_at","selectChannel","filterAndSortTeamsByDisplayName","myTeam","runMessageWillBePostedHooks","originalPost","hooks","plugins","components","MessageWillBePosted","hook","runSlashCommandWillBePostedHooks","originalMessage","originalArgs","SlashCommandWillBePosted","checkAndSetMobileView","isMobile","goToLastViewedChannel","currentChannel","channelsInTeam","getChannelsNameMapInCurrentTeam","getAllDirectChannelsNameMapInCurrentTeam","channels","assign","channelToSwitchTo","getLastViewedChannelName","switchToChannelById","getUserByUsername","gmChannel","joinChannelById","joinChannel","leaveChannel","currentTeam","getCurrentTeam","isArchivedChannel","leaveChannelRedux","prevChannelName","prevChannel","getMyChannels","selectTeam","TeamTypes","leaveDirectChannel","getTeamsList","previousChannel","penultimateChannel","autocompleteUsersInChannel","prefix","addLastViewAtToProfiles","makeAddLastViewAtToProfiles","respose","out_of_channel","loadUnreads","prefetch","time","RequestStatus","atLatestMessage","atOldestmessage","loadCustomStatusEmojisForPostList","posts","push","amount","order","next_post_id","prev_post_id","loadPostsAround","focusedPostId","Posts","loadLatestPosts","loadPosts","postId","POST_INCREASE_AMOUNT","PostRequestTypes","moreToLoad","syncPostsInChannel","since","socketStatus","getSocketStatus","sinceTimeToGetPosts","lastPostsApiCallForChannel","getLastPostsApiTimeForChannel","lastDisconnectAt","prefetchChannelPosts","jitter","recentPostIdInChannel","getMostRecentPostIdInChannel","entities","postsInChannel","resolve","setTimeout","recentPost","getPost","scrollPostListToBottom","EventEmitter","EventTypes","markChannelAsReadOnFocus","isManuallyUnread","markChannelAsRead","updateToastStatus","toggle","close","setShowNextStepsView","unhideNextSteps","RecommendedNextSteps","dismissNotice","editPost","logError","AnnouncementBarTypes","selectAttachmentMenuAction","actionId","cookie","dataSource","loadMeAndConfig","promises","getClientConfig","getLicenseConfig","resolvedPromises","Cloud","getSubscriptionStats","pluginTranslationSources","registerPluginTranslationsSource","sourceFunction","immutableTranslations","getTranslations","translations","unregisterPluginTranslationsSource","Reflect","deleteProperty","loadTranslations","url","en","pluginFunc","serverTranslations","console","setModalSearchTerm","SearchTypes","setModalFilters","filters","setUserGridSearch","setUserGridFilters","setSystemUsersSearch","setTeamListSearch","setChannelListSearch","setChannelListFilters","setShowPreviewOnCreateComment","showPreview","setShowPreviewOnCreatePost","setShowPreviewOnEditChannelHeaderModal","setShowPreviewOnEditPostModal","removeNotVisibleUsers","knownUsers","fetchResult","getKnownUsers","Set","add","allUsers","getUsers","usersToRemove","x","has","userToRemove","UserTypes","RemovedFromChannelModal","remover","ownProps","getUser","removerId","pluginEventHandlers","initialize","WebSocket","log","connUrl","WebsocketURL","URL","protocol","test","host","WebsocketSecurePort","WebsocketPort","handleEvent","handleFirstConnect","reconnect","handleClose","pluginReconnectHandlers","registerPluginReconnectHandler","handler","unregisterPluginReconnectHandler","includeWebSocket","GeneralTypes","loadPluginsIfNecessary","teams","mostRecentId","mostRecentPost","handleRefreshAppsBindings","getPosts","StatusActions","crtEnabled","isCollapsedThreadsEnabled","fetchThreads","unread","perPage","websocket","checkForModifiedUsers","clearErrors","intervalId","startPeriodicSync","clearInterval","setInterval","stopPeriodicSync","registerPluginWebSocketEvent","event","unregisterPluginWebSocketEvent","events","unregisterAllPluginWebSocketEvents","failCount","AnnouncementBarMessages","SocketEvents","handleNewPostEventDebounced","parse","receivedPost","getProfilesAndStatusesForPosts","broadcast","isActive","viewChannel","handlePostEditEvent","postDeleted","is_pinned","handlePostDeleteEvent","msgCount","msg_count","msgCountRoot","msg_count_root","mentionCount","mention_count","mentionCountRoot","mention_count_root","handlePostUnreadEvent","channelsPerTeam","getChannelsInTeam","currentUser","global","location","pathname","isGuest","members","getChannelMembersInChannels","isMember","some","handleLeaveTeamEvent","handleUpdateTeamEvent","deletedTeam","teamMembers","teamMember","m","newTeamId","i","memberTeamId","globalState","handleDeleteTeamEvent","handleTeamAddedEvent","license","getLicense","isTimezoneEnabled","ExperimentalTimezone","IsLicensed","LDAPGroups","getChannelMemberCountsByGroup","fetchChannelAndAddToSidebar","isCurrentUserSystemAdmin","handleUserAddedEvent","rhsChannelId","getSelectedChannelId","remover_id","loadUser","haveISystemPermission","permission","Permissions","haveITeamPermission","handleUserRemovedEvent","customStatus","loadCustomEmojisIfNeeded","emoji","userIsGuest","isLDAPEnabled","getMembersInCurrentChannel","memberExists","getChannelMember","getMe","handleUserUpdatedEvent","RoleTypes","handleRoleAddedEvent","handleRoleRemovedEvent","handleChannelSchemeUpdatedEvent","memberData","newRoles","roles","split","loadRolesIfNeeded","handleUpdateMemberRoleEvent","handleRoleUpdatedEvent","myDispatch","myGetState","getChannelAndMyMember","addChannelToInitialCategory","handleChannelCreatedEvent","viewArchivedChannels","ExperimentalViewArchivedChannels","deleteAt","handleChannelDeletedEvent","handleChannelUnarchivedEvent","General","handleChannelConvertedEvent","handleChannelUpdatedEvent","handleChannelMemberUpdatedEvent","handleGroupAddedEvent","preference","addedNewDmUser","handlePreferenceChangedEvent","preferences","findIndex","handlePreferencesChangedEvent","handlePreferencesDeletedEvent","parent_id","WebsocketEvents","parseInt","getMissingProfilesByIds","getStatusForUserId","getStatusesByIds","handleUserTypingEvent","handleStatusChangedEvent","setServerVersion","server_version","handleHelloEvent","reaction","getCustomEmojiForReaction","emoji_name","handleReactionAddedEvent","handleReactionRemovedEvent","EmojiTypes","handleAddEmoji","handleChannelViewedEvent","manifest","loadPlugin","handlePluginEnabled","removePlugin","handlePluginDisabled","profiles","demoted","includes","handleUserRoleUpdated","handleConfigChanged","handleLicenseChanged","AdminTypes","plugin_statuses","handlePluginStatusesChangedEvent","dialog","currentTriggerId","integrations","dialogTriggerId","InteractiveDialog","handleOpenDialogEvent","group","GroupTypes","handleGroupUpdatedEvent","teamID","groups","group_id","handleGroupAssociatedToTeamEvent","handleGroupNotAssociatedToTeamEvent","handleGroupAssociatedToChannelEvent","handleGroupNotAssociatedToChannelEvent","receivedData","warnMetricStatus","bannerData","WarnMetricTypes","handleWarnMetricStatusReceivedEvent","warnMetricId","handleWarnMetricStatusRemovedEvent","fetchMyCategories","handleSidebarCategoryCreated","handleSidebarCategoryUpdated","handleSidebarCategoryDeleted","receivedCategoryOrder","handleSidebarCategoryOrderUpdated","getCloudSubscription","firstAdminVisitMarketplaceStatus","handleFirstAdminVisitMarketplaceStatusReceivedEvent","getThread","thread_id","reply_count","fetchThread","handleFollowChanged","handleThreadFollowChanged","thread","getThreads","isThreadOpen","updateThreadLastOpened","handleReadChanged","prevUnreadMentions","unread_mentions","newUnreadMentions","prevUnreadReplies","unread_replies","newUnreadReplies","handleAllThreadsInChannelMarkedRead","handleAllMarkedRead","handleThreadReadChanged","threadData","is_following","isThreadManuallyUnread","last_reply_at","updateThreadRead","handleThreadArrived","handleThreadUpdated","pluginEvents","hasOwnProperty","wait","timeout","queue","count","triggered","receivedNewPost","getThreadsForPosts","handleNewPostEvents","clearTimeout","getIsManualStatusForUserId","set_online","UserStatuses","handleNewPostEvent","debouncePostEvent","MAX_WEBSOCKET_RETRY_TIME","conn","connectionUrl","responseSequence","serverSequence","connectFailCount","eventCallback","responseCallbacks","firstConnectCallback","reconnectCallback","missedEventCallback","errorCallback","closeCallback","connectionId","reliableWebSockets","EnableReliableWebSockets","onopen","sendMessage","onclose","retryTime","onerror","evt","onmessage","seq_reply","connection_id","seq","setEventCallback","setFirstConnectCallback","setReconnectCallback","setMissedEventCallback","setErrorCallback","setCloseCallback","readyState","OPEN","responseCallback","send","CLOSED","userTyping","userUpdateActiveStatus","userIsActive","manual","user_is_active","getStatuses","user_ids","AboutBuildModalCloud","subTitle","licensee","Company","mmversion","BuildNumber","isNaN","classNames","doHide","appTitle","SiteName","currentYear","getFullYear","BuildHash","BuildHashEnterprise","COMMIT_HASH","BuildDate","AboutBuildModal","learnMore","target","rel","href","BuildEnterpriseReady","termsOfService","AboutLinks","privacyPolicy","buildnumber","Number","handleExit","Version","SQLDriverName","webappBuildHash","isModalOpen","AddGroupsToChannelModal","addError","saving","groupIDs","v","skipCommit","onAddCallback","linkGroupSyncable","groupID","Groups","auto_add","handleResponse","loadingState","loadingGroups","prevPage","setGroupsLoadingState","getGroupsNotAssociatedToChannel","searchTerm","GROUPS_PER_PAGE","option","isSelected","onAdd","onMouseMove","rowSelected","ref","selectedItemRef","groupsAvatar","num","searchTimeoutId","search","componentDidMount","getAllGroupsAssociatedToTeam","getAllGroupsAssociatedToChannel","componentDidUpdate","prevProps","renderValue","numRemainingText","buttonSubmitText","buttonSubmitLoadingText","groupsToShow","excludeGroups","hasGroup","og","g","includeGroups","groupsToShowValues","currentChannelName","optionRenderer","renderOption","valueRenderer","handlePageChange","handleInput","handleDelete","handleAdd","addValue","maxValues","loading","placeholderText","views","modalSearch","selectGroupsNotAssociatedToChannel","regex","RegExp","AddGroupsToTeamModal","scheme_admin","getGroupsNotAssociatedToTeam","groupsOptionsToShow","teamName","currentTeamName","selectGroupsNotAssociatedToTeam","PaymentDetails","children","customerPaymentInfo","useSelector","cloud","customer","billing_address","brand","card_brand","digits","last_four","month","String","exp_month","padStart","year","exp_year","AlertBanner","mode","onDismiss","variant","AlertBanner__message","Boolean","incrementAnnouncementBarCount","decrementAnnouncementBarCount","StatTypes","containerStyles","display","opacity","flexWrap","WarnMetricAckModal","serverError","forceAck","dataset","forceack","metric","sendWarnMetricAck","gettingTrialError","gettingTrial","closeModal","closeParentComponent","mailBody","first_name","last_name","TOTAL_USERS","telemetryId","mailToLinkText","encodeURIComponent","link","WarnMetricAckErrorLink","messageId","onClickHandler","onContactUsClick","headerTitle","descriptionText","limit","subText","renderContactUsError","footer","data-dismiss","keyboard","data-forceAck","admin","analytics","DiagnosticId","AnnouncementBar","classList","componentWillUnmount","announcementBarCount","remove","barClass","barStyle","backgroundColor","color","linkStyle","textColor","showCloseButton","announcementTooltip","Tooltip","tooltipMsg","delayShow","placement","overlay","showLinkAsButton","announcementIcon","showModal","modalButtonText","modalButtonDefaultText","linkmessage","onButtonClick","isTallBanner","getAnnouncementBarCount","localStoragePrefix","TextDismissableBar","allowDismissal","localStorage","setItem","dismissed","onDismissal","getItem","extraProps","handleDismiss","alertIcon","ConfigurationAnnouncementBar","dismissExpiringLicense","dismissExpiringTrialLicense","dismissNumberOfActiveUsersWarnMetric","dismissNumberOfPostsWarnMetric","dismissNumberOfActiveUsersWarnMetricAck","dismissNumberOfPostsWarnMetricAck","renewLinkTelemetry","getNoticeForWarnMetric","dismissFunc","isDismissed","canCloseBar","acked","ackIcon","dismissedNumberOfActiveUsersWarnMetricStatusAck","dismissedNumberOfPostsWarnMetricStatusAck","dismissedNumberOfActiveUsersWarnMetricStatus","dismissedNumberOfPostsWarnMetricStatus","Message","DismissFunc","IsDismissed","Type","ShowModal","CanCloseBar","canViewSystemErrors","isLicensePastGracePeriod","warningIcon","telemetryInfo","isLicenseExpired","daysUntilLicenseExpires","daysToLicenseExpire","isTrialLicense","dismissedExpiringTrialLicense","purchaseLicense","buttonTextElement","days","announcementBarType","isLicenseExpiring","dismissedExpiringLicense","date","ExpiresAt","warnMetricsStatus","notice","SendEmailNotifications","EnablePreviewModeBanner","emailMessage","SiteURL","EnableSignUpWithGitLab","siteURLMessage","hasBeenDismissed","ConfigurationBar","VersionBar","reload","serverVersionOnAppLoad","serverVersion","equalServerVersions","reloadPage","marginLeft","general","UserLimitAnnouncementBar","TELEMETRY_CATEGORIES","CloudBanners","userLimit","userIsAdmin","isCloud","subscription","is_paid_tier","dismissable","isDismissable","PurchaseModal","shouldShowBanner","pref","withGetCloudSubscription","getCategory","makeGetCategory","ExperimentalCloudUserLimit","PaymentAnnouncementBar","last_invoice","isCustomerCardExpired","isMostRecentPaymentFailed","getCloudCustomer","updatePaymentInfo","CloudTrialAnnouncementBar","daysLeftOnTrial","dismissValue","TrialPeriodDays","isFreeTrial","trialMoreThan3DaysMsg","trialLessThan3DaysMsg","userEndTrialDate","getLocaleDateFromUTC","trial_end_at","userEndTrialHour","timezone","automaticTimezone","trialLastDaysMsg","bannerMessage","is_free_trial","getRemainingDaysFromFutureTimestamp","AnnouncementBarController","adminConfiguredAnnouncementBar","EnableBanner","BannerText","BannerColor","BannerTextColor","AllowBannerDismissal","errorBar","latestError","dismissError","cloudAnnouncementBar","paymentAnnouncementBar","cloudTrialAnnouncementBar","displayable","getDisplayableErrors","getWarnMetricsStatus","dismissFirstError","viewBox","fill","xmlns","clipPath","d","fillOpacity","NoInternetConnection","modalHeaderText","RenewalLink","renewalLink","setRenewalLink","useState","useEffect","renewal_link","renewalLinkParam","showConnectionErrorModal","handleLinkClick","AtMention","targetBounds","overlayRef","current","getBoundingClientRect","popOverOverlayPosition","innerHeight","getUserFromMentionName","usersByUsername","mentionName","mentionNameToLowerCase","getGroupFromMentionName","groupsByName","mentionNameTrimmed","replace","disableGroupHighlight","allow_reference","suffix","disableHighlight","Overlay","rootClose","hideOverlay","last_picture_update","isRHS","hasMention","hide","handleClick","getUsersByUsername","getAllGroupsForReferenceByName","AutocompleteSelector","input","requestAnimationFrame","suggestionRef","blur","focused","toggleFocus","labelClassName","inputClassName","listPosition","labelContent","data-testid","setSuggestionRef","containerClass","onItemSelected","onFocus","onBlur","completeOnTab","renderDividers","renderNoResults","openOnFocus","openWhenEmpty","replaceAllInputOnSelect","PropTypes","AutosizeTextarea","referenceRef","textAreaRef","scrollHeight","textarea","getComputedStyle","borderWidth","borderTopWidth","borderBottomWidth","onHeightChange","maxHeight","selectionStart","selectionEnd","recalculateSize","onInput","otherProps","heightProps","rows","textareaPlaceholder","placeholderAriaLabel","aria-label","dir","handleChange","container","reference","aria-hidden","overflow","textOverflow","pointerEvents","position","whiteSpace","background","borderColor","CardHeader","expanded","Card","childrenWithProps","Children","child","isValidElement","cloneElement","setHeight","expanding","setExpanding","setExpanded","node","Array","from","reduce","a","b","onTransitionEnd","HeaderIconWrapper","buttonClass","buttonId","tooltipKey","tooltipText","isRhsOpen","toolTips","flaggedPosts","class","messageID","pinnedPosts","recentMentions","channelFiles","tooltip","ariaLabelText","trigger","ChannelInviteModal","loadStatusesForProfilesList","profilesNotInCurrentChannel","inviteError","loadingUsers","setUsersLoadingState","getProfilesNotInChannel","group_constrained","handleInviteError","not_in_channel_id","searchProfiles","userStatuses","size","displayEntireNameForUser","is_bot","filterProfilesStartingWithTerm","profilesNotInCurrentTeam","excludeUsers","includeUsers","content","ariaLabelRenderer","renderAriaLabel","saveButtonPosition","valueWithImage","getTeamStats","initialState","initialProps","doGetProfilesNotInChannel","makeGetProfilesNotInChannel","getProfilesNotInTeam","getProfilesNotInCurrentChannel","getProfilesNotInCurrentTeam","getUserStatuses","ReplyIcon","useIntl","enableBackground","CommentIcon","commentCountSpan","iconStyle","commentCount","searchStyle","extraClass","handleCommentClick","WrappedComponent","subscriptionStats","CustomStatusEmoji","getCustomStatus","useMemo","makeGetCustomStatus","emojiSize","emojiStyle","spanStyle","showTooltip","tooltipDirection","userID","customStatusEnabled","isCustomStatusEnabled","customStatusExpired","isCustomStatusExpired","getCurrentUserTimezone","statusEmoji","emojiName","marginTop","expires_at","duration","CustomStatusDuration","defaultProps","CustomStatusSuggestion","handleSuggestionClick","handleClear","setShow","clearButton","stopPropagation","onMouseEnter","onMouseLeave","with_duration","durationValues","DONT_CLEAR","THIRTY_MINUTES","ONE_HOUR","FOUR_HOURS","TODAY","THIS_WEEK","DATE_AND_TIME","CUSTOM_DATE_TIME","ExpiryMenu","handleDurationChange","expiryTime","menuItems","setMenuItems","expiryMenuItems","menuItemArray","item","showPrefix","Navbar","navbarProps","onPreviousClick","onNextClick","float","fontSize","getRoundedTime","start","moment","diff","minute","remainder","seconds","milliseconds","DateTimeInputContainer","timeOptions","setTimeOptions","currentTime","getCurrentMomentForTimezone","startTime","startOf","nextDay","intervals","isBefore","toDate","getTimeInIntervals","handleTimeChange","useCallback","modifiers","today","DayPickerInput","onDayChange","day","roundedTime","dayWithTimezone","inputProps","readOnly","dayPickerProps","navbarElement","fromMonth","disabledDays","before","useRelative","useDate","isArray","bind","defaultCustomStatusSuggestions","messageDefault","defaultDuration","CustomStatusModal","useDispatch","currentCustomStatus","recentCustomStatuses","getRecentCustomStatuses","customStatusControlRef","useRef","isCurrentCustomStatusSet","showEmojiPicker","setShowEmojiPicker","setText","setEmoji","initialDuration","setDuration","isStatusSet","firstTimeModalOpened","showStatusDropdownPulsatingDot","initialCustomExpiryTime","customExpiryTime","setCustomExpiryTime","setCustomStatusInitialisationState","emojisToLoad","loadCustomEmojisForRecentStatuses","handleClearStatus","unsetCustomStatus","getCustomStatusControlRef","handleEmojiClose","handleRecentCustomStatusClear","removeRecentCustomStatus","customStatusEmoji","recentStatuses","areSelectedAndSetStatusSame","showSuggestions","disableSetStatus","showDateAndTimeField","suggestion","recentCustomStatusTexts","customStatusSuggestions","renderCustomStatusSuggestions","confirmButtonText","cancelButtonText","isConfirmDisabled","handleConfirm","expiresAt","toISOString","endOf","calculateExpiryTime","setCustomStatus","handleCancel","confirmButtonClassName","onEmojiClose","onEmojiClick","selectedEmoji","short_name","rightOffset","innerWidth","left","calculateRightOffSet","leftOffset","topOffset","defaultHorizontalPosition","prevShow","inputComponent","MaxLengthInput","clearableWithoutValue","onClear","clearClassName","tooltipPosition","CustomStatusText","spanElement","customStatusTextComponent","offsetWidth","scrollWidth","CUSTOM_STATUS_EXPIRY_RANGES","RelativeRanges","ExpiryTime","withinBrackets","currentMomentTime","timestampProps","ranges","isSame","clone","isAfter","useTime","weekday","deferComponentRender","PreRenderComponent","DeferredRenderWrapper","shouldRender","hoistStatics","DeletePostModal","permalinkPostId","deleteAndRemovePost","matchUrlForDMGM","matchPath","path","matchUrlForChannel","postid","channelUrl","join","deletePostBtn","getElementById","commentWarning","postTerm","onEntered","handleEntered","withRouter","getReplyCount","makeGetCommentCountForPost","DotsHorizontalIcon","DotMenuClass","canEdit","isFlagged","unflagPost","flagPost","handleAddReactionClick","currentTeamUrl","unpinPost","pinPost","markPostAsUnread","deletePostModalData","Locations","setEditingPost","threadId","isFollowingThread","setThreadFollow","menuRef","buttonRect","buttonRef","y","top","totalSpace","spaceOnTop","spaceOnBottom","openUp","binding","createCallContext","app_id","createCallRequest","AppExpandLevels","editDisableAction","DelayedAction","handleEditDisable","isReadOnly","canDelete","disableCanEditPostByTime","isLicensed","postEditTimeLimit","timeLeft","fireAfter","cancel","isSystemMessage","PostUtils","pluginItems","pluginMenuItems","appBindings","onClickAppBinding","onToggle","handleDropdownOpened","isMenuOpen","aria-expanded","refCallback","permissions","enableEmojiPicker","handleAddReactionMenuItemActivated","handleSetThreadFollow","threadReplyCount","extraText","channelIsArchived","handleUnreadMenuItemActivated","copyLink","handleFlagMenuItemActivated","handlePinMenuItemActivated","renderDivider","handleEditMenuItemActivated","handleDeleteMenuItemActivated","isDangerous","pluggableName","getPostMenuBindings","makeAppBindingsSelector","AppBindingLocations","systemMessage","collapsedThreads","rootId","getThreadOrSynthetic","apps","isCombinedUserActivityPost","PostEditTimeLimit","PostDropdownMenu","DotMenu","baseStyles","control","border","boxShadow","padding","cursor","indicatorSeparator","IndicatorsContainer","Control","Option","isFocused","DropdownInput","addon","textPrefix","legend","setFocused","showLegend","Input_fieldset___error","Input_fieldset___legend","Input_legend___focus","Input__focus","renderError","RenderEmoji","emojiFromMap","getEmojiMap","get","emojiImageUrl","getEmojiImageUrl","data-emoticon","backgroundImage","backgroundSize","maxWidth","minHeight","minWidth","activeKey","activeSecret","instance","gfycatSdk","secret","Gfycat","client_id","updateSearchText","searchText","GifTypes","requestSearch","receiveSearchEnd","errorSearching","searchGfycat","startIndex","GfycatAPIKey","GfycatAPISecret","resultsByTerm","gifs","sdk","authenticate","search_text","json","cacheGifsRequest","gfycats","currentPage","receivedAt","receiveSearch","categories","tagsDict","keyword","searchCategory","tagName","gfyCount","cursorPos","getTrendingCategories","receiveAt","receiveCategorySearch","requestCategoriesListIfNeeded","searchIfNeededInitial","isFetching","shouldSearchInitial","saveSearchScrollPosition","scrollPosition","searchScrollPosition","searchTextUpdate","saveSearchBarText","searchBarText","searchBarTextSave","requestCategoriesList","hasMore","tagsList","shouldRequestCategoriesList","getCategories","newGfycats","tags","tag","categoriesListReceived","categoriesListFailure","payload","updating","cacheGifs","GifSearchIcon","version","transform","GifSearchClearIcon","mapDispatchToProps","getStyle","makeStyleFromTheme","theme","centerChannelBg","changeOpacity","centerChannelColor","inputBackground","SearchBar","Component","searchInput","handleSearchTextChange","triggerSearch","onSearch","parseSearchText","searchTimeout","onCategories","isFilteredTags","inputFocused","removeExtraSpaces","filteredTags","onTrending","updateSearchInputValue","defaultSearchText","shouldComponentUpdate","nextState","clearSearchButton","clearSearchHandle","noValidate","autoCapitalize","focusInput","blurInput","getTheme","appProps","app","GifTrendingIcon","stroke","GifReactionsIcon","borderBottomColor","iconActive","iconHover","Header","PureComponent","hovering","renderTabs","tabs","tab","constants","renderTab","Icon","onMouseOver","onMouseOut","paddingTop","saveAppProps","App","appClassName","authenticateSdk","Categories","gfyId","scrollTo","sendImpressions","hasImageProxy","filterTagsList","gfyItem","max1mbGif","avgColor","InfiniteScroll","loadMore","threshold","cache","HasImageProxy","SearchItem","itemWidth","itemClickHandler","paddingBottom","SearchGrid","matchMedia","matches","numberOfColumns","handleItemClick","gfyid","columnsHeights","min","max","containerWidth","setNumberOfColumns","scrollY","addEventListener","resizeHandler","scrollHandler","removeEventListener","containerClassName","moreRemaining","isEmpty","columnWidth","leftPosition","searchItems","colIndex","minHeightColumnIndex","itemHeight","containerHeight","maxColumnHeight","pageStart","initialLoad","useWindow","emptySearch","NoResultsVariant","titleValues","Search","Trending","appName","basePath","itemTapType","shareEvent","appId","enableHistory","displayText","GifPicker","gif","onGifClick","max5mbGif","handleTrending","handleSearch","handleCategories","GfycatIcon","strokeWidth","fillRule","EmojiPickerHeader","handleEmojiPickerClose","EmojiPickerCategory","onCategoryClick","enable","EmojiPickerItem","emojiItem","onItemOver","categoryIndex","emojiIndex","debounce","handleMouseOver","leading","trailing","onItemClick","topOfTheEmojiItem","offsetTop","bottomOfTheEmojiItem","offsetHeight","containerRef","containerTop","containerBottom","scrollTop","itemClassName","image","spriteClassName","short_names","handleMouseOverThrottle","imgTrans","emojiItemRef","intlShape","EmojiPickerCategorySection","div","updateOffsetFrame","updateCategoryOffset","categoryName","cancelAnimationFrame","divRef","EmojiPickerPreview","customEmojisEnabled","aliases","previewImage","customEmojis","skinsList","skinToneEmojis","Map","pair","Emoji","EmojiPickerSkin","skin","skinName","pickerExtended","userSkinTone","onSkinSelected","extended","choices","skinPair","hideSkinTonePicker","collapsed","showSkinTonePicker","CATEGORY_SEARCH_RESULTS","categoryClass","DEFAULT_CLASS","createCategory","offset","CATEGORIES","cat","smileysCategory","recentEmojiCategory","recent","searchResultsCategory","getEmojiFilename","filename","EmojiPicker","allEmojis","emojiMap","customEmojiMap","categoryEmojis","recentEmojis","reverse","concat","emojiIds","currentEmoji","fileName","visible","updatedState","categoryKeys","getEmojis","renderAllCategories","loadingMoreEmojis","getCustomEmojis","customEmojiPage","missingPages","incrementEmojiPickerPage","lastVisibleEmoji","emojiPickerContainer","updateEmojisToShow","searchCustomEmojis","handleFilterChange","selectNextEmoji","selectPrevEmoji","shiftKey","getCurrentEmojiByCursor","setUserSkinTone","getCategoriesByKey","emojis","currentEmojiLoadedCount","emojisToShow","numEmojisLoaded","lastVisibleEmojiRef","handleItemOver","onItemUnmount","divTopOffset","divHeight","handleScrollThrottle","throttle","handleScroll","loadMoreCustomEmojis","renderAllCategoriesFrame","rootComponent","difference","numToLoad","ceil","clientHeight","newCursor","newCategory","getCategoryByIndex","lastVisibleEmojiInNewCategory","getEmojisByCategory","sortEmojis","recentEmojisProps","emojisMinusRecent","emojiArray","alias","sortEmojisHelper","compareEmojis","sort","emojiId","getCurrentEmojiName","getCurrentEmojiCategoryName","currentCategoryName","emojiCategories","emojiPickerCategories","handleCategoryClick","onKeyDown","handleCategoryKeyDown","emojiSearch","emojiSearchInput","handleKeyDown","emojiCurrentResults","categoryComponents","emojiCurrentResultsItems","emojiPickerContainerRef","onScroll","overflowY","aria-live","isRequired","listHeight","EnableCustomEmoji","emojiPickerCustomPage","getRecentEmojis","getUserSkinTone","EmojiPickerTabs","emojiTabVisible","pickerStyle","bottom","right","pickerClass","enableGifPicker","Tabs","defaultActiveKey","justified","Tab","eventKey","onEnter","handleEnterEmojiTab","onExit","handleExitEmojiTab","tabClassName","mountOnEnter","unmountOnExit","EmojiPickerOverlay","memoize","emojiTrigger","calculatedRightOffset","spaceRequiredAbove","spaceRequiredBelow","emojiPickerPosition","getPlacement","animation","CENTER_SPACE_REQUIRED_ABOVE","CENTER_SPACE_REQUIRED_BELOW","ErrorLink","ExternalImage","imageMetadata","format","enableSVGs","isSVGImage","getImageSrc","shouldRenderImage","EnableSVGs","FileThumbnail","fileInfo","getFileType","extension","thumbnail","FileTypes","thumbnailUrl","getFileThumbnailUrl","isGIFImage","has_preview_image","getFileUrl","getIconClassName","FilenameOverlay","canDownload","compactDisplay","handleImageClick","iconClass","trimmedFilename","trimFilename","filenameOverlay","getFileDownloadUrl","download","FileAttachment","loadImage","handleImageLoaded","mounted","loaded","anchorRect","handleFileDropdownOpened","keepOpen","enablePublicLink","divider","defaultItems","data-title","handleGetPublicLink","match","stopPropagationOnToggle","loadFiles","fileThumbnail","fileDetail","fileActions","ariaLabelImage","onAttachmentClick","toUpperCase","fileSizeToString","renderFileMenuItems","canDownloadFiles","EnablePublicLink","getFilesDropdownPluginMenuItems","SingleImageView","showPreviewModal","toggleEmbedVisibility","dimensions","hasPreviewImage","fileURL","previewURL","getFilePreviewUrl","previewHeight","previewWidth","minPreviewClass","data-expanded","isEmbedVisible","imageNameClass","fileHeader","viewImageModal","fadeInClass","styleIfSvgWithDimensions","imageContainerStyle","svgClass","onModalDismissed","fileInfos","onImageLoaded","imageLoaded","showLoader","handleSmallImageContainer","FileAttachmentList","indexClicked","startImgIndex","fileCount","fileType","minHeightPlaceholder","sortedFileInfos","sortFileInfos","postFiles","hidePreviewModal","selectFilesForPost","makeGetFilesForPost","metadata","files","file_ids","filenames","FileInfoPreview","fileUrl","infoParts","infoString","preview","FileProgressPreview","handleRemove","fileNameComponent","progressBar","percent","percentTxt","toFixed","getFileTypeFromMime","ProgressBar","active","data-client-id","FilePreview","onRemove","previews","info","imageClassName","uploadsInProgress","uploadsProgressPercent","AudioVideoPreview","video","ReactDOM","videoRef","createElement","canPlayType","mime_type","canPlay","pause","sourceRef","handleFileInfoChanged","$","one","handleLoadError","data-setup","controls","CodePreview","lang","dataType","handleReceivedError","handleReceivedCode","code","nodeName","XMLSerializer","serializeToString","prevFileUrl","usedLanguage","SyntaxHighlighting","language","highlighted","dangerouslySetInnerHTML","__html","ImagePreview","previewUrl","propTypes","displayNameGetter","makeGetDisplayName","FilePreviewModalInfo","selectUser","showFileName","imageURLForUser","memo","FilePreviewModalMainActions","tooltipPlacement","usedInside","selectedFilePublicLink","selectFilePublicLink","publicLinkCopied","setPublicLinkCopied","getFilePublicLink","handleModalClose","publicTooltipMessage","publicLink","shouldUpdatePosition","copyToClipboard","showOnlyClose","showClose","FilePreviewModalFooter","actionProps","showPublicLink","isExternalFile","handlePrev","handleNext","FilePreviewModalMainNav","leftArrow","rightArrow","fileIndex","total","totalFiles","FilePreviewModalHeader","mainActions","PopoverBar","zoomControls","wrappedZoomControls","showZoomControls","zoomResetButton","zoomOutButton","zoomInButton","scale","ZoomSettings","handleZoomOut","maxWait","handleZoomReset","handleZoomIn","PDFPreview","KeyCodes","FilePreviewModal","imageIndex","showImage","RIGHT","LEFT","handleKeyPress","stop","imageHeight","has_image_preview","completedPercentage","handleImageProgress","progress","showCloseBtn","newScale","setScale","currentTarget","handleWindowResize","onModalShown","onModalHidden","updatedProps","prevFileInfosCount","fileDownloadUrl","zoomBar","modalImageClass","handleBgClose","fallback","supports","floor","pluginFilePreviewComponents","override","onMouseEnterImage","onMouseLeaveImage","uploadFile","request","set","headers","attach","accept","handleFileUploadEnd","forceLogoutIfNecessary","failure","clientIds","getLogErrorAction","file_infos","client_ids","holders","defineMessages","limited","filesAbove","fileAbove","zeroBytesFiles","zeroBytesFile","pasted","customStyles","FileUpload","currentRootId","onFileUpload","j","onUploadError","uploadFiles","sortedFiles","localeCompare","numeric","willUploadHooks","pluginFilesWillUploadHooks","h","pluginUploadFiles","uploadsRemaining","numUploads","tooLargeFiles","zeroFiles","maxFileSize","generateId","on","progressEvent","onUploadProgress","end","fileUploadFail","fileUploadSuccess","onUploadStart","tooLargeFilenames","zeroFilenames","checkPluginHooksAndUploadFiles","clearFileInput","onFileUploadChange","canUploadFiles","dataTransfer","droppedFiles","webkitGetAsEntry","isDirectory","types","isUriDrop","contains","containerSelector","overlaySelector","self","querySelector","dragTimeout","dragsterActions","enter","detail","isFileTransfer","leave","over","drop","handleDrop","unbindDragsterEvents","noop","defaults","settings","first","second","dragenter","enterEvent","CustomEvent","dispatchEvent","dragleave","leaveEvent","dragover","overEvent","dropEvent","dragster","targetElement","eventTarget","clipboardData","getTable","getTarget","containsEventTarget","kind","getAsFile","hour","getHours","getMinutes","ext","lastIndexOf","getMonth","getDate","newFile","Blob","cmdOrCtrlPressed","isKeyPressed","postTextbox","postType","activeElement","commentTextbox","fileInput","click","abort","menuOpen","handleMaxUploadReached","registerDragEvents","pasteUpload","keyUpload","multiple","isMobileApp","isIosChrome","bodyAction","pluginFileUploadMethods","simulateInputClick","onTouchEnd","tabIndex","handleLocalFileUploaded","wrappedComponent","forwardRef","MaxFileSize","FileUploadMethod","FilesWillUploadHook","FormError","iconClassName","margin","textClassName","CustomRenderer","marked","disableLinks","paragraph","FormattedMarkdownMessage","origMsg","markedUpMessage","breaks","sanitize","renderer","GenericModal","autoCloseOnCancelButton","autoCloseOnConfirmButton","confirmButton","cancelButton","restoreFocus","el","scrollComponent","scrollEl","pageYOffset","documentElement","parentNode","isReverse","calculateTopPosition","detachScrollListener","pageLoaded","attachScrollListener","setScrollPosition","loader","elementProps","defaultLoader","offsetParent","scrollListener","setDefaultLoader","Input","validateInput","required","renderInfo","propError","hasError","stateError","RadioSetting","inputId","checked","DialogElement","defaultText","MenuActionProvider","defaultOption","DialogIntroductionText","formattedMessage","Markdown","gfm","elem","callbackId","callback_id","submitInteractiveDialog","notifyOnCancel","cancelled","default","introductionText","iconUrl","submitLabel","help_text","minLength","min_length","data_source","introduction_text","icon_url","submit_label","notify_on_cancel","sendMembersInvites","emails","u","sent","notSent","usersToAdd","getTeamMember","reason","addUsersToTeam","userToAdd","memberWithError","invitesWithErrors","inviteWithError","sendGuestsInvites","results","memberOfAll","memberOfAny","sendGuestInviteForUser","cx","cy","rx","ry","ConfirmNotifyAdminModal","Button","UserLimitModal","notificationProcessDone","setNotificationProcessDoneStatus","pageVisited","confirmBtn","extraFunc","cloudUserLimit","InviteIcon","ArrowRightIcon","InvitationModalInitialStep","which","goToMembers","goToGuests","onMembersKeyDown","aria-describedby","emailInvitationsEnabled","onGuestsKeyDown","InviteMembersIcon","MailIcon","MailPlusIcon","UsersEmailsInput","parts","getLongDisplayNameParts","fullName","nickname","loadingMessageId","loadingMessageDefault","profileImg","guestBadge","botBadge","isEmail","getCreateLabel","renderUserName","getDisplayName","validAddressMessageId","validAddressMessageDefault","inputValue","selectProps","noMatchMessageId","noMatchMessageDefault","innerProps","NoOptionsMessage","MultiValueRemove","onInputChange","customCallback","usersLoader","selectRef","handleInputChange","optionsLoader","isValidNewOption","showAddEmail","showError","empty","getOptionValue","formatOptionLabel","defaultMenuIsOpen","openMenuOnClick","loadingMessage","tabSelectsValue","errorMessageId","errorMessageDefault","errorMessageValues","extraErrorText","LinkIcon","InvitationModalMembersStep","inviteLinkRef","textField","innerText","appendChild","select","copiedLink","execCommand","termWithoutResults","debouncedSearchProfiles","usersAndEmails","shouldShowPickerError","remaining","getRemainingUsers","onEdit","usersInputValue","num_invitations","userOrEmail","remaining_seats","usersRemaining","inviteUrl","inviteId","remainingUsers","inviteMembersButtonDisabled","errorProperties","onUsersInputChange","currentUsers","isAdmin","selectSubscriptionStats","CloseCircleIcon","ChannelsInput","channelsLoader","noOptionsMessageId","noOptionsMessageDefault","Async","noOptionsMessage","InvitationModalGuestsStep","customMessage","channelsInputValue","searchChannels","debouncedSearchChannels","myInvitableChannels","customMessageOpen","textareaRef","defaultChannels","inputPlaceholder","onUsersEmailsChange","onChannelsChange","onChannelsInputChange","openCustomMessage","closeCustomMessage","onMessageChange","sendInvites","AlertIcon","InvitationModalConfirmStepRow","invitation","getLongDisplayName","InvitationModalConfirmStepTable","invites","InvitationModalConfirmStep","invitesSentCount","invitesNotSentCount","sentCount","notSentCount","invitesType","invitesSent","invitesNotSent","onDone","onInviteMore","InviteTypes","getInvitesCountsMessage","STEPS_INITIAL","STEPS_INVITE_MEMBERS","STEPS_INVITE_GUESTS","STEPS_INVITE_CONFIRM","InvitationModal","canAddUsers","canInviteGuests","goToInitialStep","hasChanges","confirmBack","step","lastInviteChannels","lastInviteMesssage","prevStep","modal","goToPrevStep","confirmModal","num_invitations_sent","extraUserText","extraChannelText","lastInviteMessage","invite_id","invitationModal","onClose","onGoBack","getBackFunction","ariaLabelledBy","modalClass","onConfirm","confirmClose","onCancel","cancelClose","cancelBack","onMembersSubmit","invitableChannels","onGuestsSubmit","goToFirstStep","actionsUserLimitModal","userLimitModal","isFreeTierWithNoFreeSeats","reduxSearchProfiles","getProfiles","reduxSearchChannels","getChannelsInCurrentTeam","haveIChannelPermission","guestAccountsEnabled","EnableGuestAccounts","EnableEmailInvitations","haveICurrentTeamPermission","modalData","LoadingImagePreview","progressView","LoadingScreen","LocalizedIcon","LocalizedInput","getChannelNamesMap","createSelector","getChannelNameToDisplayNameMap","channelNamesMap","channelMentions","autolinkedUrlSchemes","getAutolinkedUrlSchemes","enableFormatting","getBool","managedResourcePaths","getManagedResourcePaths","mentionKeys","getAllUserMentionKeys","minimumHashtagLength","MinimumHashtagLength","atMentions","proxyImages","htmlFormattedText","formatText","messageHtmlToComponent","imageProps","imagesMetadata","hasPluginTooltips","MessageSubmitError","submittedMessage","command","errorContent","isErrorInvalidSlashCommand","renderSlashCommandError","ModalController","modals","modalState","modalOutput","modalComponent","SearchableChannelList","isSearch","purpose","archiveIcon","sharedIcon","shouldShowArchivedChannels","shared","channelType","withTooltip","handleJoin","joiningChannel","nextDisabled","nextTimeoutId","nextPage","channelListScroll","toggleArchivedChannels","listContent","nextButton","previousButton","noResultsText","channelsPerPage","pageEnd","channelsToDisplay","createChannelRow","previousPage","channelDropdown","doSearch","createChannelButton","canShowArchivedChannels","toggleArchivedChannelsOff","toggleArchivedChannelsOn","MoreChannels","bodyOnly","NewChannelFlow","force","searchedChannels","getChannels","done","getRelativeChannelURL","searching","setSearchResults","ignoredErr","morePublicChannelsModalType","CHANNELS_CHUNK_SIZE","getArchivedChannels","archivedChannels","channelsRequestStarted","serverErrorState","activeChannels","createNewChannelButton","handleNewChannel","createChannelHelpText","getNotArchivedOtherChannels","getOtherChannels","getArchivedOtherChannels","getUsersTypingImpl","typing","selectedPostId","MsgTyping","numUsers","typingUsers","last","pop","getTypingText","getUsersTypingByChannelAndPost","MultiSelectList","DOWN","UP","onSelect","setSelected","handleArrowPress","_","listRef","elemTop","elemBottom","listTop","scrollIntoView","renderOutput","searchQuery","defaultOptionRenderer","optionControls","aria-atomic","onPageChange","onAction","MultiSelect","a11yActive","reactSelectRef","submitImmediatelyOn","change","ENTER","removedValue","splice","inputRef","handleEnterPress","A11yCustomEventTypes","handleA11yActivateEvent","handleA11yDeactivateEvent","totalCount","noteTextContainer","optionsToDisplay","noteText","valueMap","multiSelectList","memberCount","memberOptions","Menu","nullComponent","MultiValueLabel","paddedComponent","menuIsOpen","onInputKeyDown","getOptionLabel","handleOnClick","savingMessage","verticalAlign","NewChannelModal","displayNameError","enterPressed","ctrlSend","ctrlKey","altKey","displayNameInput","onSubmitChannel","newData","channelHeaderInput","channelPurposeInput","onDataChanged","onChangeURLPressed","onTypeSwitched","canCreatePublicChannel","canCreatePrivateChannel","enableTypeSelection","displayNameClass","publicChannelDesc","privateChannelDesc","typeOptions","handlePublicTypeSelect","handlePrivateTypeSelect","prettyTeamURL","getShortenedURL","bsSize","onModalExited","htmlFor","channelData","onEnterKeyDown","handleOnURLChange","ChangeURLModal","currentURL","userEdit","urlInput","urlErrors","validateChannelUrl","onModalSubmit","urlClass","fullURL","currentTeamURL","shortURL","urlTooltip","onURLChanged","submitButtonText","getChannelTypeFromProps","channelDisplayName","flowState","channelPurpose","channelHeader","creator_id","extra_update_at","last_post_at","scheme_id","total_msg_count","total_msg_count_root","createChannel","onCreateChannelError","newURL","nameModified","cleanUpUrlable","showChannelModal","showChangeURLModal","changeURLTitle","changeURLSubmitButtonText","typeSwitched","urlChangeRequested","channelDataChanged","urlChangeSubmitted","urlChangeDismissed","haveICurrentChannelPermission","Accordion","expandedKey","defaultExpandedKey","r","DownloadSection","isDesktopApp","downloadLatest","isFirstAdmin","getDownloadButtonString","seeAllApps","isWindows","isMac","getAnalyticsCategory","baseLatestURL","xmlnsXlink","strokeOpacity","filterUnits","colorInterpolationFilters","floodOpacity","in","dy","stdDeviation","in2","patternContentUnits","xlinkHref","NextStepsTips","openMoreChannels","openViewMembersModal","TeamMembersModal","closeCloseNextStepsModal","onCloseModal","closeNextSteps","RemoveNextStepsModal","screenTitle","globalHeaderEnabled","nonMobileTips","channelsSection","MarketplaceModal","openIncidentsPlugin","openAdminConsole","completed","showFinalScreen","animating","stopAnimating","BackgroundPillSymbol","mask","stopColor","stopOpacity","OnboardingBgSvgContainer","styled","pillID","preserveAspectRatio","mask-type","maskUnits","clipRule","x1","y1","x2","y2","NextStepsView","steps","isStepComplete","stepIndex","getStepNumberFromId","nextStep","channel_sidebar","showTransitionScreen","currentIndex","incompleteStep","getIncompleteStep","transitionToFinalScreen","complete","onClickHeader","titleId","titleMessage","onFinish","onSkip","transitioning","setTimerToFinalScreen","loadingIcon","renderedSteps","renderStep","logo","getStartingStep","onSkipAll","checkStepsSkipped","showFinalScreenNoAnimation","renderMainBody","renderTransitionScreen","getSteps","getGlobalHeaderEnabled","isStepForUser","PictureSelector","defaultSrc","loadingPicture","setImage","orientationStyles","setOrientationStyles","selectButton","removeButton","reader","FileReader","onload","ev","createObjectURL","orientation","FileUtils","readAsArrayBuffer","onOpenDialog","CompleteProfileStep","fullNameError","profilePictureError","splitName","firstName","lastName","updateMe","profilePicture","uploadProfileImage","removeProfilePicture","setDefaultProfileImage","AcceptedProfileImageTypes","pictureSrc","onOpenPictureDialog","onSelectPicture","onRemovePicture","isFinishDisabled","TextCardWithAction","cardBodyMessageId","cardBodyDefaultMessage","buttonMessageId","buttonDefaultMessage","MultiValueContainer","Placeholder","MultiInput","alignItems","valueContainer","InviteMembersStep","emailLength","emailInput","newEmails","showLimitError","shouldShowLimitError","emailError","emailsSent","sendEmailInvitesToTeamGracefully","sendEmailInvites","clipboard","navigator","writeText","getInviteURL","regenerateTeamInviteId","linkBtn","subtitle","isEmailInvitesEnabled","copied","TeamProfileStep","teamNameError","patchTeam","setTeamIcon","removeTeamIcon","last_team_icon_update","handleNameInputChange","Steps","showNotification","requireInteraction","silent","Notification","firstAdmin","showOnboarding","showNextSteps","showNextStepsTips","nextSteps","showNextStepsEphemeral","isOnboardingHidden","stepPreferences","nextStepsNotFinished","mySteps","every","PinIcon","iconMap","titleMap","subtitleMap","NoResultsIndicator","iconGraphic","subtitleValues","OverlayTrigger","OverlayWrapper","overlayProps","Provider","visibility","defaultOverlayShown","CardImage","cardImageSrc","amex","dinersclub","discover","jcb","mastercard","visa","getCardImage","CARD_ELEMENT_OPTIONS","hidePostalCode","base","fontFamily","fontSmoothing","REQUIRED_FIELD_TEXT","VALID_CARD_TEXT","CardInput","onCardInputChange","getCard","getElement","CardElement","fieldsetClass","fieldsetErrorClass","forwardedRef","InjectedCardInput","ElementsConsumer","PaymentForm","getResetState","initialBillingDetails","paymentMethod","getName","changePaymentMethod","newStateValue","cardRef","stateValue","onInputBlur","resetState","buttonFooter","paymentDetails","handleCardInputChange","handleCountryChange","COUNTRIES","handleStateChange","cardContent","cardDetails","addressDetails","showSaveCard","US_STATES","CA_PROVINCES","StateSelector","stateList","stateCode","prodConfirmCardSetup","devConfirmCardSetup","clientSecret","STRIPE_CSS_SRC","STRIPE_PUBLIC_KEY","AnyTeamPermissionGate","hasPermission","invert","ChannelPermissionGate","SystemPermissionGate","TeamPermissionGate","isPlugin","getPlugins","marketplace","getApps","getListing","getInstalledListing","listing","installed_version","installed","getInstalling","installing","getError","fetchListing","localOnly","getFilter","filterListing","installPlugin","p","getPlugin","installApp","getApp","isError","PluginIcon","Label","MarketplaceItem","labels","iconSource","pluginDetailsInner","versionLabel","error_text","pluginDetails","homepageUrl","item_error","updateDetails","button","UpdateVersion","releaseNotesUrl","UpdateDetails","installedVersion","isInstalling","onUpdate","isUpdate","semver","UpdateConfirmationModal","messages","sameMajorVersion","MarketplaceItemPlugin","eventName","allowDetail","isDefaultMarketplace","plugin_id","showUpdateConfirmationModal","closeMarketplaceModal","hideUpdateConfirmationModal","getItemButton","Link","to","onConfigure","actionButton","onInstall","iconData","IsDefaultMarketplace","MarketplaceItemApp","iconURL","NavigationButton","NavigationRow","maximumPerPage","trunc","startCount","endCount","onPreviousPageButtonClick","renderCount","canShowNextButton","onNextPageButtonClick","MarketplaceList","itemsToDisplay","homepage_url","release_notes_url","icon_data","MarketplaceTabs","AllListing","InstalledListing","installedItems","changeTab","tabKey","filterRef","debouncedSearch","setFirstAdminVisitMarketplaceStatus","pluginStatuses","clearable","handleClearSearch","errorBanner","installedListing","getFirstAdminVisitMarketplaceStatus","PostDeletedModal","typeMessage","LastUsers","formatOptions","actor","expandedLocale","usernames","firstUser","lastIndex","lastUser","renderMessage","firstUserMessage","otherUsersMessage","numOthers","actorMessage","JOIN_CHANNEL","ADD_TO_CHANNEL","REMOVE_FROM_CHANNEL","LEAVE_CHANNEL","JOIN_TEAM","ADD_TO_TEAM","REMOVE_FROM_TEAM","LEAVE_TEAM","postTypeMessage","one_you","two","many_expanded","CombinedSystemMessage","allUserIds","allUsernames","getMissingProfilesByUsernames","currentUsername","userProfiles","acc","currentUserDisplayName","getAllUsernames","someone","unshift","loadUserProfiles","renderFormattedMessage","actorId","getUsernamesByIds","secondUser","localeHolder","messageData","removedUserIds","showJoinLeave","uniqueRemovedUserIds","arr","getProfilesByIdsAndUsernames","makeGetProfilesByIdsAndUsernames","PostAddChannelMember","createAt","addChannelMember","removePost","generateAtMentions","andSeparator","commaSeparator","idx","otherUsers","firstUserName","shift","lastUserName","noGroupsUsernames","linkId","linkText","outOfChannelMessageID","outOfChannelMessageText","outOfChannelAtMentions","outOfGroupsMessageID","outOfGroupsMessageText","outOfGroupsAtMentions","outOfChannelMessage","outOfGroupsMessage","handleAddChannelMember","renderUsername","renderFormattedText","renderAddToChannelMessage","systemMessageRenderers","removedUsername","headerOptions","channel_mentions","oldHeader","old_header","newHeader","new_header","old","new","strong","chunks","br","old_displayname","new_displayname","oldDisplayName","newDisplayName","oldPurpose","old_purpose","newPurpose","new_purpose","PostMarkdown","renderedSystemMessage","isUserCanManageMembers","add_channel_member","isEphemeral","addMemberProps","not_in_channel_user_ids","not_in_groups_usernames","not_in_channel_usernames","user_activity","renderSystemMessage","message_source","pluginHooks","mentionHighlightDisabled","getOptions","disable_group_highlight","images","getMentionKeysForPost","getCurrentUserMentionKeys","getMyGroupMentionKeysForChannel","getMyGroupMentionKeys","mentionKeysWithoutGroups","groupMentionKeys","MessageWillFormat","LinkTooltip","canManageMembers","PostProfilePicture","fromAutoResponder","fromWebhook","defaultURL","enablePostIconOverride","postProps","postIconOverrideURL","useUserIcon","override_icon_url","use_user_icon","availabilityStatusOnPosts","isBusy","isBot","profileSrc","getProfilePictureURL","getPostIconURL","overrideIconEmoji","override_icon_emoji","overwriteName","override_username","isEmoji","getStatus","overwriteIcon","EnablePostIconOverride","overrideIconUrl","BasicSeparator","DATE_RANGES","DateSeparator","useSemanticOutput","FailedPostOptions","createPost","retryPost","cancelPost","FloatingTimestamp","isScrolling","isRhsPost","toastPresent","classes","scrolling","rhs","toastAdjustment","PostListUtils","combinedIds","getToastStatus","NotificationSeparator","NewMessageSeparator","wrapperRef","separatorId","PostAriaLabelDiv","labelPrefix","createAriaLabelForPost","makeCreateAriaLabelForPost","LinkOnlyRenderer","RemoveMarkdown","outHref","getScheme","output","ActionButton","getStatusColors","good","warning","danger","errorTextColor","primary","buttonBg","onlineIndicator","handleAction","customButtonStyle","hexColor","data-action-id","data-action-cookie","actionExecuting","actionExecutingMessage","ActionMenu","default_option","handlePopupOpened","menuActions","MessageAttachment","attachment","thumb_url","handleHeightReceived","image_url","checkPostOverflow","checkOverflow","actionOptions","getActionOption","trackOption","getAttribute","actionCookie","doPostActionWithCookie","handleCustomActions","extUrlOption","mailtoPayload","mail_recipient","mail_cc","mail_subject","mail_body","optionName","opt","fieldTables","headerCols","bodyCols","rowPos","lastWasLong","nrTables","short","currentRelativeTeamUrl","onImageHeightChanged","preText","preTextClass","pretext","attachmentText","thumb","author","author_name","author_icon","author_link","title_link","isAttachmentText","imageUrl","handleHeightReceivedForImageUrl","footerIcon","footer_icon","footerIconMetadata","footerIconUrl","truncate","omission","thumbMetadata","thumbUrl","handleHeightReceivedForThumbUrl","getFieldsTable","renderPostActions","useBorderStyle","borderLeftColor","handleFormattedTextClick","clear","MessageAttachmentList","attachments","isPointDefined","point","getDistanceBW2Points","point1","point2","sqrt","pow","DIMENSIONS_NEAREST_POINT_IMAGE","PostAttachmentOpenGraph","patchedPost","renderImageToggle","renderLargeImage","safeImageUrl","renderSmallImage","truncateText","hasPreviewBeenRemoved","previewEnabled","enableLinkPreviews","openGraphData","secure_url","bestImage","pivot","nearest","getBestImageUrl","getImageMetadata","hasLargeImage","isLargeImage","removePreviewButton","handleRemovePreview","site_name","useSafeUrl","EnableLinkPreviews","getOpenGraphMetadataForUrl","PostImage","safeLink","hideModal","ytRegex","YoutubeVideo","playing","videoId","getVideoId","hours","minutes","startSeconds","handleYoutubeTime","frameBorder","allowFullScreen","safeUrl","play","googleDeveloperKey","GoogleDeveloperKey","ButtonBinding","executing","SelectBinding","bindings","debug","usedLabels","usedValues","nOptions","EmbeddedBinding","copiedBindings","cleanBinding","embed","fillBindings","renderBindings","EmbeddedBindings","embeds","PostAttachmentContainer","history","useHistory","PostMessagePreview","previewPost","avatar","team_name","disablePopover","units","overflowType","channel_display_name","PostBodyAdditionalContent","getEmbedFromMetadata","postWillRenderEmbedComponents","pluginPostWillRenderEmbedComponents","toggleable","prependToggle","getEmbed","app_bindings","isEmbedToggleable","renderToggle","renderEmbed","PostWillRenderEmbedComponent","PostFlagIcon","Event","flagIcon","handlePress","PostMessageView","collapse","hasOverflow","renderDeletedPost","renderEditedIndicator","pluginPostTypes","PluginComponent","visibleMessage","aria-readonly","isRHSOpen","isRHSExpanded","getIsRhsExpanded","postTypes","PostPinnedOrFlagged","MessageInfoKey","PostPreHeader","flagged","pinned","messageKey","Pinned","showPinnedPosts","showFlaggedPosts","getPostStatus","isPinned","PinnedAndFlagged","Flagged","Neither","getMessageInfo","postStatus","skipFlagged","skipPinned","messageInfos","PostReaction","addReaction","toggleEmojiPicker","getDotMenuRef","n","POST_TOOLTIP_RANGES","PostTime","isMobileView","eventTime","isPermalink","postTime","ReactionTooltip","canAddReaction","canRemoveReaction","currentUserReacted","reactions","otherUsersCount","names","reactionVerb","clickTooltip","getNamesOfUsers","makeGetProfilesForReactions","accumulator","Reaction","displayNumber","reactedClass","removeReaction","ids","reactionCount","reactedNumber","unreactedNumber","unreacted","reacted","readOnlyClass","emojiNameWithSpaces","ariaLabelEmoji","loadMissingProfiles","reactionButtonRef","reactionCountRef","onAnimationEnd","handleAnimationEnded","checkReactionAction","didCurrentUserReact","getCustomEmojisByName","AddReactionIcon","ReactionList","addReactionButtonRef","isCustomEmoji","reactionsByName","emojiNames","addReactionButton","emojiPicker","addReactionTooltip","hideEmojiPicker","handleEmojiClick","addReactionClassName","getReactionsForPost","makeGetReactionsForPost","EnableEmojiPicker","ShowMore","isCollapsed","overflowRef","isOverflow","textContainer","checkTextOverflow","handleResize","collapsedMaxHeightStyle","collapseGradientClass","collapseShowMoreClass","attachmentTextOverflow","showIcon","showText","toggleCollapse","StatusIconNew","iconName","ProfilePicture","profileIconClass","hideStatus","hideProfilePopover","wrapperClass","newStatusIcon","statusClass","getMembershipForEntities","SearchChannelWithPermissionsSuggestion","Suggestion","isSelection","handleMouseMove","channelSearchSorter","wrappedA","wrappedB","aIsArchived","bIsArchived","getCurrentUserLocale","aDisplayName","bDisplayName","aStartsWith","bStartsWith","sortChannelsByTypeAndDisplayName","SearchChannelWithPermissionsProvider","channelSearchFunc","makeChannelSearchFilter","channelPrefix","channelPrefixLower","searchString","handlePretextChanged","resultsCallback","startNewRequest","formatChannelsAndDispatch","fetchChannels","channelsAsync","channelsFromServer","shouldCancelDispatch","allChannels","completedChannels","channelFilter","newChannel","wrappedChannel","deactivated","matchedPretext","terms","AddUserToChannelModal","suggestionProviders","disableDispatches","channelSearchBox","textbox","getTextbox","placeCaretAtEnd","selectedChannelId","focusTextbox","submitError","selection","checkingForMembership","isUserMemberOfChannel","handleSubmitError","memberships","channelMembers","enableChannelProvider","targetUserIsMemberOfSelectedChannel","getFullName","help","setSearchBoxRef","didSelectChannel","delayInputUpdate","shouldDisableAddButton","ProfilePopover","loadingDMChannel","handleCloseModals","customStatusInputModalData","prototype","renderCustomStatus","customStatusSet","canSetCustomStatus","customStatusContent","expiryContent","marginRight","currentUserTimezone","showCustomStatusModal","popoverProps","dataContent","urlSrc","fullname","haveOverrideProp","remote_id","data-testId","bot_description","data-toggle","enableTimezone","userTimezone","timeZoneName","customStatusAndExpiryContent","handleEditAccountSettings","handleMentionKeyClick","handleShowDirectChannel","canManageAnyChannelMembersInCurrentTeam","isInCurrentTeam","addToChannelMessage","handleAddToChannel","roleTitle","isTeamAdmin","isChannelAdmin","getDefaultChannelId","selectedPost","getSelectedPost","exists","areTimezonesEnabledAndSupported","RadioButtonGroup","badge","sideLegend","val","matchVal","ProcessState","IconMessage","buttonText","formattedButonText","formattedTitle","formattedSubtitle","buttonHandler","linkURL","ProcessPaymentSetup","addPaymentMethod","FAILED","selectedProduct","millisecondsElapsed","valueOf","completePayment","SUCCESS","PROCESSING","onBack","isProratedPayment","selectedProductName","currentProductName","currentProduct","getNextBillingDate","successSvg","savePaymentMethod","updateProgress","MIN_PROCESSING_MILLISECONDS","processSvg","sucessPage","failedSvg","handleGoBack","contactSupportLink","stripePromise","findProductInDictionary","products","productSku","sku","getSelectedProduct","nextSku","CloudProducts","billing","paymentInfoIsValid","areBillingDetailsValid","cardInputComplete","processing","CloudLinks","onMouseDown","selectedPlan","flatFeeProducts","userBasedProducts","tempEl","price","price_per_seat","billing_scheme","BillingSchemes","sideLegendTitle","onPlanSelected","decimals","decimalPart","contactSalesLink","editPaymentInfo","payment","beginDate","learnMoreLink","buttonTitle","bottomInformationMsg","validBillingDetails","upgradeImage","onPaymentInput","editPaymentInfoHandler","comparePlan","listPlans","displayDecimals","paymentFooterText","handleSubmitClick","cloudLogo","getCloudProducts","loadStripe","Elements","fonts","cssSrc","purchaseScreen","wavesBackground","blueDots","LowerBlueDots","EnableDeveloper","getCloudContactUsLink","InquiryType","product_id","QuickInput","updateInputFromProps","clearableTooltipText","clearableTooltip","inputElement","setInput","showClearButton","excess","Fragment","UserGuideIcon","UserGuideDropdown","menuActive","buttonActive","enableAskCommunityLink","askTheCommunityClick","helpLink","reportAProblemLink","buttonToggleState","renderDropdownItems","HelpLink","ReportAProblemLink","EnableAskCommunityLink","HEADER_ICON","HEADER_ICON_ACTIVE","RHSSearchNav","showSearchBar","getShowSearchBar","searchMentions","rhsState","showMentions","openRHSSearch","handleShortcut","rhsOpen","isFocus","hideSearchBar","enableFindShortcut","mentionButtonClick","getFlagged","RudderTelemetryHandler","userRoles","properties","user_actual_role","user_actual_id","rudderAnalytics","ip","referrer","anonymousId","CompassThemeProvider","compassTheme","setCompassTheme","lightTheme","noStyleReset","noDefaultStyle","palette","main","sidebarHeaderBg","contrast","sidebarHeaderTextColor","alert","dndIndicator","hover","badges","online","away","awayIndicator","dnd","setStatusDropdown","isStatusDropdownOpen","statusDropdown","isOpen","ResetStatusModal","newStatus","currentUserStatus","setStatus","toTitleCase","autoResetStatus","statusIsManual","autoResetPrefNotSet","autoResetPref","userStatus","userStatusId","manualStatusTitle","manualStatusMessage","renderModalMessage","manualStatusButton","manualStatusId","manualStatusCancel","manualStatusCheckbox","showCheckbox","checkboxText","PulsatingDot","effectiveClassName","targetRef","DndCustomTimePicker","selectedTime","endTime","selectedDate","setHours","dnd_end_time","toUTCUnix","last_activity_at","currentDate","makeTimeMenuList","timeMenuItems","curr","formatDate","timeMenuList","setDate","dayPickerStartDate","getText","handleDaySelection","selectedDays","StatusDropdown","dndEndTime","getCurrentDateTimeForTimezone","getTime","dndCustomTimePicker","resetStatusModalData","customStatusText","pulsatingDot","showCustomStatusPulsatingDot","needsConfirm","isUserOutOfOffice","dropdownIcon","renderDropdownIcon","isTimedDNDEnabled","globalHeader","setOnline","showStatusChangeConfirmation","setDnd","setDndUntimed","setAway","setOffline","setCustomTimedDnd","selectedIndicator","glyph","dndSubMenuItems","direction","dndTimes","customStatusComponent","timedDND","rightDecorator","selectedValueText","handleCustomStatusEmojiClick","renderProfilePicture","handleEmitUserLoggedOutEvent","Flex","row","flex","alignment","selectProducts","Product","useProducts","useCurrentProductId","useLocation","product","getBasePath","baseURL","ProductBrandingContainer","currentProductID","switcherIcon","switcherText","ProductSwitcherMenu","isMessaging","someIntegrationEnabled","enableIncomingWebhooks","enableOutgoingWebhooks","enableCommands","enableOAuthServiceProvider","canManageSystemBots","showIntegrations","canManageIntegrations","enablePluginMarketplace","appDownloadLink","siteName","teamType","AppDownloadLink","EnableCommands","EnableIncomingWebhooks","EnableOAuthServiceProvider","EnableOutgoingWebhooks","PluginsEnabled","EnableMarketplace","canManageTeamIntegrations","mobileView","MainMenu","TutorialSteps","TutorialTip","currentScreen","screens","telemetryTag","TUTORIAL_STEP","FINISHED","screen","dots","data-screen","handleCircleClick","overlayClass","skipTutorial","getInt","checkHasPlaybooks","TopLevelProducts","checkHasBoards","ProductSwitcherTip","skippedBecauseIrrelevant","skipIfIrrelevant","checkRelevance","ProductSwitcherContainer","ProductSwitcherButton","IconButton","attrs","inverted","compact","MenuItem","StyledIcon","MenuItemTextContainer","SwitcherNavEntry","destination","switcherOpen","setSwitcherOpen","Node","productItems","switcherLinkURL","HistoryButtonsContainer","showGettingStarted","toggled","SettingsButton","SettingsTip","GlobalHeaderContainer","LeftControls","CenterControls","RightControls","enabled","isLoggedIn","showSettingsTip","stepToShow","useShowTutorialStep","subComponentName","pluggableId","HeaderFooterTemplate","LoggedIn","HFTRoute","rest","LoggedInHFTRoute","IntlProvider","loadTranslationsIfNecessary","localeInfo","I18n","setLocalizeFunction","handleLocaleChange","textComponent","wrapRichTextChunksInFragment","EditPostModal","newPreviewValue","setShowPreview","editModalBody","editbox","emojiAlias","editText","firstPiece","lastPiece","splitMessageBasedOnCaretPosition","caretPosition","newMessage","newCaretPosition","getInputBox","refs","editPostEmoji","postError","editingPost","isSaveDisabled","updatedPost","errorClass","hasAttachment","addMessageIntoHistory","canEditPost","table","isGitHubCodeBlock","formattedCodeBlock","formatGithubCodePaste","formatMarkdownTableMessage","codeBlockOnCtrlEnter","allowSending","ignoreKeyPress","postMessageOnKeyPress","lastChannelSwitchAt","handleEdit","ctrlOrMetaKeyPressed","metaKey","ctrlKeyCombo","ctrlAltCombo","ctrlEnterKeyCombo","markdownHotkey","B","I","markdownLinkKey","K","ESCAPE","applyHotkeyMarkdown","doRefocus","refocusId","hideEditPostModal","renderScrollbar","scrollbarWidth","prevShowState","canDeletePost","handlePaste","errorBoxClass","postErrorClass","emojiButtonAriaLabel","shouldShowPreview","getContainer","handleGifClick","EnableGifPicker","handleSelect","handleCheckForChangesHide","handleExited","bsClass","scroll","onKeyPress","handleEditKeyPress","onMouseUp","handleMouseUpKeyUp","onKeyUp","handleHeightChange","handlePostError","emojiEnabled","createMessage","supportsCommands","suggestionListPosition","setEditboxRef","characterLimit","maxPostSize","useChannelMentions","updatePreview","getEditingPost","showPreviewOnEditPostModal","MaxPostSize","ModalStoreClass","removeListener","TOGGLE_SHORTCUTS_MODAL","TOGGLE_IMPORT_THEME_MODAL","TOGGLE_DELETE_POST_MODAL","TOGGLE_GET_TEAM_INVITE_LINK_MODAL","TOGGLE_GET_PUBLIC_LINK_MODAL","TOGGLE_QUICK_SWITCH_MODAL","TOGGLE_CHANNEL_PURPOSE_UPDATE_MODAL","TOGGLE_CHANNEL_NAME_UPDATE_MODAL","TOGGLE_LEAVE_PRIVATE_CHANNEL_MODAL","emit","dispatchToken","handleEventPayload","GetLinkModal","setSelectionRange","queryCommandSupported","data-copy-btn","copyLinkConfirm","GetPublicLinkModal","ModalStore","handleToggle","Selectors","LeavePrivateChannelModal","confirmButtonClass","allShortcuts","mainHeader","mac","navHeader","navPrev","navNext","navUnreadPrev","navUnreadNext","teamNavPrev","teamNavNext","teamNavSwitcher","navSwitcher","navDMMenu","navSettings","navMentions","navFocusCenter","navOpenCloseSidebar","msgHeader","msgInputHeader","msgEdit","msgReply","msgReprintPrev","msgReprintNext","msgCompHeader","msgCompUsername","msgCompChannel","msgCompEmoji","msgLastReaction","msgMarkdownHeader","msgMarkdownBold","msgMarkdownItalic","msgMarkdownLink","filesHeader","filesUpload","browserHeader","browserChannelPrev","browserChannelNext","browserFontIncrease","browserFontDecrease","browserInputHeader","browserHighlightPrev","browserHighlightNext","browserNewline","ShortcutsModal","getShortcuts","shortcuts","s","isLinux","renderShortcut","shortcut","FileUploadOverlay","overlayType","fileOverlayImage","overlayLogoImage","RhsHeaderPost","previousRhsState","showSearchResults","setRhsExpanded","relativeTeamUrl","rootPostId","back","closeSidebarTooltip","backToResultsTooltip","expandSidebarTooltip","shrinkSidebarTooltip","handleBack","handleJumpClick","isFollowing","handleFollowChange","isExpanded","toggleRhsExpanded","showChannelFiles","RhsThread","useRelativeTimestamp","getPostsForThread","makeGetPostsForThread","getSelectedChannel","selectPostCard","getPostThread","RhsCardHeader","renderView","renderThumbHorizontal","renderThumbVertical","RhsCard","scrollStopAction","handleScrollStop","topRhsPostCreateAt","pluginPostCardTypes","enablePostUsernameOverride","autoHide","autoHideTimeout","autoHideDuration","getSelectedPostCard","EnablePostUsernameOverride","postCardTypes","RhsPlugin","showPluggable","rhsPlugins","RightHandSidebarComponent","getPluggableId","pluginComponent","pluginTitle","RHSPlugin","SidebarRight","previous","searchVisible","isMentionSearch","isPinnedPosts","isChannelFiles","isFlaggedPosts","selectedPostCardId","openAtPrevious","transitionInfo","sidebarRight","getPropertyValue","hasTransition","isOpened","onFinishTransition","propertyName","updateSearchTerms","focusSearchBar","determineTransition","wasOpen","postRightVisible","rhsChannel","setPrevious","postCardVisible","isPluginView","isSuppressed","isSidebarRightExpanded","toggleSize","shrink","onShrink","hidden","isSideBarRight","isSideBarRightOpen","getFocus","getSearchBarFocus","postRightSameAsSelectedThread","getSelectedPostId","getSelectedPostCardId","getIsRhsSuppressed","getPreviousRhsState","MenuTutorialTip","inHeading","toggleFunc","onBottom","arrow","headerClass","LeaveTeamIcon","strokeLinejoin","strokeMiterlimit","LeaveTeamModal","leaveTeam","toggleSideBarRightMenu","numOfPrivateChannels","numOfPublicChannels","modalMessage","num_of_public_channels","num_of_private_channels","getNumOfPrivateChannels","getNumOfPublicChannels","ACCEPTED_TEAM_IMAGE_TYPES","GeneralTab","section","setupInitialState","updateSection","openInvite","allow_open_invite","clientError","allowed_domains","valid","teamIconFile","submitActive","activeSection","shouldFetchTeam","isInitialState","fetchTeam","off","openInviteSection","inviteSection","nameSection","descriptionSection","teamIconSection","allowedDomainsSection","inputs","defaultChecked","handleOpenInviteRadio","handleOpenInviteSubmit","handleUpdateSection","describe","canInviteTeamMembers","getTeamInviteLink","handleInviteIdSubmit","saveButtonText","teamNameLabel","updateName","nameExtraInfo","handleNameSubmit","extraInfo","teamDescriptionLabel","updateDescription","descriptionExtraInfo","handleDescriptionSubmit","describemsg","imageContext","onFileChange","updateTeamIcon","handleTeamIconSubmit","handleTeamIconRemove","minMessage","FormattedDate","updateAllowedDomains","allowedDomainsInfo","handleAllowedDomainsSubmit","collapseModal","TeamGeneralTab","TeamSettings","activeTab","SettingsSidebar","TeamSettingsModal","modalBodyRef","closest","removeClass","uiName","iconTitle","handleHidden","updateTab","ListModal","loadItems","numPerPage","renderRows","renderRow","paginationRange","titleText","titleBarButtonText","titleBarButtonOnClick","searchPlaceholderText","onSearchInput","onPrev","onNext","TeamGroupsManageModal","showConfirmModal","listModal","pageNumber","getGroupsAssociatedToTeam","totalGroupCount","unlinkGroupSyncable","patchGroupSyncable","getMyTeamMembers","setTeamMemberStatus","onClickRemoveGroup","titleButtonOnClick","handleDeleteConfirmed","handleDeleteCanceled","teamIsGroupConstrained","isLicensedForLDAPGroups","mobile","mobileIcon","invitePeopleModal","experimentalPrimaryTeam","moreTeamsToJoin","styleLink","enableCustomEmoji","canCreateOrDeleteCustomEmoji","ExperimentalPrimaryTeam","joinableTeams","getJoinableTeamIds","SidebarRightMenu","teamDisplayName","tutorialTip","showTutorialTip","openRhsMenu","CSSTransition","exit","enableTutorial","EnableTutorial","tutorialStep","getIsRhsMenuOpen","ImportThemeModal","isInputValid","inputError","sidebarBg","sidebarTextActiveBorder","sidebarTextActiveColor","sidebarTextHoverBg","sidebarText","mentionBg","setThemeDefaults","sidebarUnreadText","updateShow","colors","charAt","handleOnHide","getIsLhsOpen","lhs","CopyUrlContextMenu","contextMenu","menuId","copy","contextMenuTrigger","holdToDisplay","TeamButton","mark","switchTeam","teamIconUrl","btnClass","mentions","isDraggable","teamIndex","teamClass","isNotCreateTeamButton","endsWith","handleDisabled","handleSwitch","withHover","orderIndicator","toolTip","tip","toolTipHelp","showOrder","btn","teamButton","draggableId","snapshot","innerRef","draggableProps","dragHandleProps","isDragging","TeamSidebar","delta","newPos","userTeamsOrderPreference","switchToPrevOrNextTeam","switchToTeamByNumber","updateTeamsOrderForUser","sourceIndex","source","destinationIndex","newTeamsOrder","list","itemId","pushElement","teamsOrder","getTeams","handleKeyUp","myTeamMembers","threadCounts","total_unread_threads","total_unread_mentions","onDragEnd","droppableId","droppableProps","getThreadCounts","setUnreadFilterEnabled","setDraggingState","stopDragging","channelIds","multiSelectedChannelIds","channelSidebar","multiSelectChannelAdd","createCategoryRedux","addChannelsInSidebar","categoryId","moveChannelsInSidebar","targetIndex","draggableChannelId","setManualSorting","getCategoriesForCurrentTeam","displayedChannels","getDisplayedChannels","channelsToMove","targetCategory","selectedChannel","isDMGM","CategoryTypes","displayedChannelIds","newIndex","filteredChannelIds","makeGetChannelIdsForCategory","removedChannelsAboveInsert","shiftedIndex","channel_ids","updatedChannelIds","insertMultipleWithoutDuplicates","previousChannelId","adjustTargetIndexForMove","moveChannelsToCategory","clearChannelSelection","multiSelectChannelTo","lastSelected","lastSelectedChannel","allChannelsIdsInOrder","getChannelsInCategoryOrder","indexOfNew","indexOfLast","inBetween","EditCategoryModal","renameCategory","channelIdsToAdd","initialCategoryName","editButtonText","MAX_SELECTABLE_VALUES","TIME_SPEC","within","isGroupChannel","optionValue","MoreDirectChannels","getUserProfiles","getTotalUsersStats","loadProfilesMissingStatus","statuses","missingStatusByIds","loadStatusesByIds","exitToChannel","addUsers","existingUserIds","pageNum","restrictDirectMessage","USERS_PER_PAGE","getProfilesInTeam","resetPaging","profile","lastPictureUpdate","modalName","displayname","note","currentChannelMembers","isExistingChannel","lastPostAt","optionDisplayParts","myDirectChannels","recentDMUsers","activeUsers","inactiveUsers","groupChannelsWithAvailableProfiles","groupChannels","recentGroupChannels","updateFromProps","profilesData","groupChannelsData","searchGroupChannels","loadProfilesForGroupChannels","computeOptions","renderOptionValue","handleSubmitImmediatelyOn","loadModalData","filterGroupChannels","memoizeResult","filterDirectChannels","searchProfilesStartingWithTerm","makeSearchProfilesStartingWithTerm","getProfilesInCurrentChannel","RestrictDirectMessage","searchProfilesInCurrentTeam","selectProfiles","getProfilesInCurrentTeam","filteredGroupChannels","getChannelsWithUserProfiles","getAllChannels","getTotalUsersStatsSelector","total_users_count","sortByUsername","PQueue","concurrency","DataPrefetch","delay","unreadChannels","unreadChannel","prefetchRequestStatus","prefetchQueueObj","priority","priorityQueue","prefetchPosts","sidebarLoaded","prefetchTimeout","prefetchData","Priority","prefetchQueue","membership","isChannelMuted","high","notify_props","getMsgCountInChannel","medium","low","isSidebarLoaded","lastUnreadChannel","getUnreadChannels","channelPrefetchStatus","searchProfilesMatchingWithTerm","makeSearchProfilesMatchingWithTerm","SwitchChannelSuggestion","hasDraft","userImageUrl","dmChannelTeammate","userItem","teammate","unreadMentions","marginBottom","ConnectedSwitchChannelSuggestion","draft","getPostDraft","StoragePrefixes","getDirectTeammate","sortChannelsByRecencyAndTypeAndDisplayName","quickSwitchSorter","SwitchChannelProvider","getDirectAndGroupChannels","formattedData","formatList","fetchUsersAndChannels","fetchAndFormatRecentlyViewedChannels","usersAsync","usersFromServer","localChannelData","localUserData","localFormattedData","remoteChannelData","getGroupChannels","remoteUserData","remoteFormattedData","combinedTerms","combinedItems","userWrappedChannel","skipNotMember","splitPrefixBySpace","curState","usersInChannels","getUserIdsInChannels","userSearchStrings","usersInChannel","userString","lowerCaseSearch","searchPrefix","isGroupChannelManuallyVisible","recentChannels","wrapChannels","sortedChannels","getTimestampFromPrefs","myPreferences","getPreferenceKey","prefValue","getLastViewedAt","getMyPreferences","channelList","latestPrefix","CHANNEL_MODE","QuickSwitchModal","switchBox","focusPostTextbox","shouldShowLoadingSpinner","suggestions","loadingPropPresent","hasSuggestions","channelProviders","setSwitchBoxRef","spellCheck","onSuggestionsReceived","handleSuggestionsReceived","forceSuggestionsWhenBlur","CollapsedThreads","AddChannelButtonTreatments","ChannelTutorialTip","townSquareDisplayName","offTopicDisplayName","townsquare","offtopic","AddChannelDropdown","canCreateChannel","canJoinPublicChannel","invitePeople","joinPublicChannel","showMoreChannelsModal","showNewChannelModal","unreadFilterEnabled","showCreateCategoryModal","createDirectMessage","handleOpenDirectMessagesModal","getClassModifierForAbTest","modifier","addChannelButton","NONE","BY_TEAM_NAME","INVERTED_SIDEBAR_BG_COLOR","trackOpen","opened","ChannelFilter","hasMultipleTeams","tooltipMessage","toggleUnreadFilter","isUnreadFilterEnabled","ChannelNavigator","toggleQuickSwitchModal","isQuickSwitcherOpen","goBack","goForward","handleQuickSwitchKeyPress","jumpToButton","openQuickSwitcher","layout","addChannelDropdown","historyArrows","canGoBack","canGoForward","showUnreadsCategory","channelsByName","shouldShowUnreadsCategory","getAddChannelButtonTreatment","ChannelMentionBadge","SidebarChannelIcon","SidebarMenu","menuWrapperRef","onToggleMenu","scrollbars","querySelectorAll","rect","menuButtonRef","parentElement","openUpOffset","draggingState","DraggingStates","closeMenu","setMenuPosition","disableScrollbar","buttonAriaLabel","additionalClass","getDraggingState","SidebarChannelMenu","favoriteChannel","channelLink","isLeaving","closeHandler","isUnread","isFavorite","isMuted","markAsRead","favorite","muteChannelText","selectedChannels","allChannelsAreDMs","allChannelsAreNotDMs","categoryMenuItems","currentCategory","moveToCategory","addMembers","moveToNewCategory","managePrivateChannelMembers","managePublicChannelMembers","leaveChannelText","handleLeaveChannel","getCategoryInTeamWithChannel","openLhs","SidebarChannelLink","gmItemRef","labelRef","ariaLabelPrefix","showChannelAsUnread","removeAttribute","handleSelectChannel","defaultPrevented","unreadMsgs","showUnreadForMsgs","enableToolTipIfNeeded","isChannelSelected","labelElement","truncated","wrapEmojis","displayNameToolTip","onEntering","removeTooltipLink","teammateId","handleMenuToggle","muted","getAriaLabel","handleChannelClick","SidebarBaseChannel","handleLeavePublicChannel","handleLeavePrivateChannel","getCloseHandler","getIcon","SidebarDirectChannel","teammate_id","SidebarGroupChannel","membersCount","memberIds","groupMemberIds","SidebarChannel","isCategoryDragged","isCategoryCollapsed","isCurrentChannel","channelElement","getRef","getChannelRef","refMethod","setChannelRef","channelIndex","isAutoSortedCategory","autoSortedCategoryIds","ChannelComponent","selectedCount","draggable","setRef","dragging","selectedDragging","fadeOnDrop","isDropAnimating","draggingOver","noFloat","removeAnimation","teammateUsername","isDropDisabled","makeGetChannel","getAutoSortedCategoryIds","SidebarCategoryHeaderStatic","SidebarCategoryHeader","isCollapsible","isDraggingOver","InviteMembersButton","touchedInviteMembersButton","SidebarCategorySortingMenu","sorting","setCategorySorting","number","sortMenuItems","handleSortDirectMessages","CategorySorting","selectedDmCount","handlelimitVisibleDMsGMs","browseDirectMessages","styleSelectableItem","selectedDmNumber","DeleteCategoryModal","deleteCategory","category_name","SidebarCategoryMenu","setCategoryMuted","muteUnmuteCategory","toggleCategoryMute","handleSortChannels","showDeleteCategoryModal","SidebarCategory","categoryTitleRef","handleA11yKeyDown","handleCollapse","DraggingStateTypes","setCategoryCollapsed","newSorting","newDropBoxRef","handleOpenMoreDirectChannelsModal","nativeEvent","isNewCategory","isDragDisabled","renderedChannels","renderChannel","categoryMenu","newLabel","addHelpLabel","addTooltip","disableInteractiveElementBlocking","inviteMembersButton","Touched","dropDisabled","capture","droppableProvided","droppableSnapshot","directMessagesModalButton","hasFollowingSibling","renderNewDropBox","showPlaceholder","getChannelIdsForCategory","makeGetFilteredChannelIdsForCategory","UnreadBelowIcon","UnreadChannelIndicator","UnreadChannels","isFeatureEnabled","useRouteMatch","inGlobalThreads","useThreadRouting","counts","getThreadCountsInCurrentTeam","unreadsOnly","someUnreadThreads","renderTrackVertical","SidebarChannelList","channelRefs","delete","unreadChannelIds","spring","getCurrentValue","scrollbar","scrollToChannel","getFirstUnreadChannel","getLastUnreadChannel","scrollingToUnread","getScrollTop","getClientHeight","showTopUnread","scrollEnd","getDisplayedChannelIds","scrollToPosition","showBottomUnread","scrollAnimation","setCurrentValue","setAtRest","setEndValue","firstUnreadChannel","firstUnreadElement","lastUnreadElement","getFirstUnreadChannelFromChannelIdArray","switchToGlobalThreads","allChannelIds","curChannelId","curIndex","nextIndex","nextChannelId","navigateByChannelId","hasUnreadThreads","ChannelUtils","newCategoryIds","updateUnreadIndicators","droppable","draggingChannels","initial","onDragStart","moveCategory","animate","SpringSystem","createSpring","setOvershootClampingEnabled","addListener","onSpringUpdate","handleScrollAnimationUpdate","navigateChannelShortcut","navigateUnreadChannelShortcut","scrollToTop","unreadsCategory","renderedCategories","renderCategory","onBeforeDragStart","onBeforeCapture","above","below","data-a11y-disable-nav","data-a11y-sort-order","scrollToFirstUnreadChannel","scrollToLastUnreadChannel","SidebarHeaderContainer","justify","menuInHeading","TREATMENT_WIDTH","SidebarHeading","Heading","SidebarHeader","tipStep","showMenuTip","showAddChannelTip","hasAddChannelTreatment","menuToggled","setMenuToggled","menu","sidebarHeadingContent","HeaderLine","VerticalStack","SidebarHeaderDropdownButton","teamNameWithToolTip","data-teamid","teamDescription","SidebarHeaderDropdown","LegacySidebarHeader","flexBasis","basePercentage","flexGrow","SidebarNextSteps","onConfirmModal","enableOnboardingFlow","middleSection","tips","EnableOnboardingFlow","Sidebar","showDirectChannelsModal","hideMoreDirectChannelsModal","showMoreDirectChannelsModal","moreDirectChannelsModal","handleClickClearChannelSelection","handleKeyDownClearChannelSelection","renderModals","hasSeenModal","privateChannelJoinPromptVisible","focusPost","returnTo","ErrorPageTypes","isSystemAdmin","joinPromptResult","joinPrivateChannelPrompt","isComment","sameTeam","postURL","getPostURL","selectPostAndHighlight","focusReplyPost","focusRootPost","PermalinkView","permalink","doPermalinkEvent","isStateValid","ChannelHeaderDropdown","ChannelHeaderDropdownItems","MobileChannelHeaderPlug","fireAppAction","isDropdown","plug","fireAction","dropdownText","ephemeral","createList","plugs","createButton","createAppList","createAppButton","plugItems","appItems","getChannelHeaderBindings","getMyCurrentChannelMembership","MobileChannelHeaderButton","Describe","memberNotifyLevel","globalNotifyLevel","ignoreChannelMentions","levelsFormattedMessageId","notifyLevel","NotificationSections","IgnoreChannelMentions","SectionTitle","CollapseView","onExpandSection","ExtraInfo","ExpandView","onCollapseSection","server_error","NotificationSection","onUpdateSection","globalNotificationLevel","memberNotificationLevel","handleOnChange","handleCollapseSection","handleExpandSection","ChannelNotificationsModal","channelNotifyProps","resetStateFromNotifyProps","updateChannelNotifyProps","desktopNotifyLevel","desktop","handleUpdateChannelNotifyProps","markUnreadNotifyLevel","pushNotifyLevel","ignore_channel_mentions","getStateFromNotifyProps","prevChannelNotifyProps","channelMemberNotifyProps","currentUserNotifyProps","ignoreChannelMentionsDefault","sendPushNotifications","serverErrorTag","handleUpdateMarkUnreadLevel","handleSubmitMarkUnreadLevel","handleUpdateIgnoreChannelMentions","handleSubmitIgnoreChannelMentions","handleUpdateDesktopNotifyLevel","handleSubmitDesktopNotifyLevel","handleUpdatePushNotificationLevel","handleSubmitPushNotificationLevel","SendPushNotifications","ChannelMembersDropdown","removing","removeChannelMember","updateChannelMemberSchemeRoles","renderRole","totalUsers","canChangeMemberRoles","canRemoveMember","isDefaultChannel","currentRole","sharedTooltip","canMakeUserChannelMember","canMakeUserChannelAdmin","canRemoveUserFromChannel","removeMenu","handleRemoveFromChannel","makeAdminMenu","handleMakeChannelAdmin","makeMemberMenu","handleMakeChannelMember","MemberListChannel","loadProfilesAndTeamMembersAndChannelMembers","getChannelMembers","loadComplete","in_channel_id","loadTeamMembersAndChannelMembersForProfilesList","membersLoaded","usersToDisplay","usersPerPage","totalChannelMembers","actionUserProps","focusOnMount","getUsersAndActionsToDisplay","getMembersInCurrentTeam","searchProfilesInCurrentChannel","ChannelMembersModal","canManageChannelMembers","onAddNewMembersButton","headerMarkdownOptions","ChannelInfoModal","RHSChanged","channelChanged","channelIcon","notFound","channelURL","channelPurposeElement","getHeaderMarkdownOptions","EditChannelHeaderModal","newState","patchChannel","editChannelHeaderTextboxRef","isUnhandledLineBreakKeyCombo","insertLineBreakFromKeyEvent","blurTextbox","handleSave","handleModalKeyDown","handleEntering","previewMessageLink","setTextboxLinksRef","showPreviewOnEditChannelHeaderModal","EditChannelPurposeModal","requestStarted","channelPurposeModal","ariaLabelForTitle","defaultError","displayNameHolder","RenameChannelModal","invalid","oldName","onSaveSuccess","setError","unsetError","urlHelpText","urlInputClass","urlInputLabel","readOnlyHandleInput","fullUrl","shortUrl","onDisplayNameChange","onNameChange","mapStateToPropsRenameChannel","teamInfo","ConvertChannelModal","updateChannelPrivacy","handleConvert","currentTeamDetails","DeleteChannelModal","canViewArchivedChannels","penultimateViewedChannelName","deleteChannel","UnarchiveChannelModal","unarchiveChannel","handleUnarchive","ChannelGroupsManageModal","getGroupsAssociatedToChannel","setChannelMemberStatus","LeaveChannel","isDefault","isGuestUser","handleLeave","CloseChannel","isArchived","CloseMessage","MenuItemToggleMuteChannel","ToggleFavoriteChannel","toggleFavoriteChannel","ViewPinnedPosts","hasPinnedPosts","isReadonly","isPrivate","isGroupConstrained","channelMembersPermission","channelPropertiesPermission","channelDeletePermission","channelUnarchivePermission","MobileChannelHeaderDropdownAnimation","MobileChannelHeaderDropdown","teammateIsBot","teammateStatus","dmHeaderIconStatus","animationComponent","getChannelTitle","getTeammateId","getTeammateStatus","Desktop","isCurrentChannelDefault","isCurrentChannelFavorite","isCurrentChannelMuted","isCurrentChannelArchived","getPenultimateViewedChannelName","ChannelHeader","Items","Mobile","NotifyCounts","unreadMentionCount","basicUnreadMeta","getUnreadStatusInCurrentTeam","CollapseLhsButton","data-target","toggleLhs","CollapseRhsButton","toggleRhsMenu","InfoIcon","NavbarInfoButton","headerOverlayRef","popoverContent","addOne","showEditChannelHeaderModal","clickHere","popover","popoverStyle","ChannelInfoButton","ShowSearchButton","UnmuteChannelButton","ChannelHeaderMobile","closeRhs","hideSidebars","heading","GlobalThreads___title","USER_ID_PAIR_REGEXP","onChannelByIdentifierEnter","identifier","teamObj","getTeamByName","moreChannelsByName","isDirectChannelIdentifier","getPathFromIdentifier","getChannelDispatchResult","joinChannelDispatchResult","handleChannelJoinError","goToDirectChannelByUserIds","doChannelChange","goToChannelByChannelName","dispatchResult","goToDirectChannelByUserId","goToChannelByChannelId","groupId","handleError","markGroupChannelOpen","goToGroupChannelByGroupId","selectUserByUsername","directChannelDispatchRes","goToDirectChannelByUsername","selectUserByEmail","getUserByEmail","goToDirectChannelByEmail","defaultChannel","MessageIcon","PopoverListMembersItem","messageIcon","showMessageIcon","botClass","getDisplayNameByUser","PopoverListMembers","closePopover","showPopover","loadProfilesAndStatusesInChannel","membersList","member_popover_target","isDirectChannel","sortedUsers","popoverButton","membersName","manageMembers","showMembersModal","countText","channelMembersTooltip","handleGetProfilesInChannel","getTargetPopover","doGetProfilesInChannel","makeGetProfilesInChannel","doSortUsersByStatusAndDisplayName","sortUsersByStatusAndDisplayName","makeSortUsersByStatusAndDisplayName","getAllChannelStats","PluginChannelHeaderIcon","CustomMenu","rootCloseEvent","onRootClose","handleRootClose","bsRole","CustomToggle","activeClass","dropdownOpen","ChannelHeaderPlug","toggleDropdown","onBindingClick","componentItems","fireActionAndClose","Dropdown","componentButtons","createComponentButton","createAppBindingButton","createDropdown","ChannelHeaderButton","popoverMarkdownOptions","toggleFavoriteRef","titleMenuOpen","headerText","headerDescriptionRect","headerDescriptionRef","headerPopoverTextMeasurerRef","showChannelHeaderPopover","offsetLeft","globalHeaderOffset","popoverOverlayWidth","dmUser","getPopoverMarkdownOptions","getCustomEmojisInText","gmMembers","channelMuted","hasGuests","teammateNameDisplaySetting","ariaLabelChannelHeader","hasGuestsText","channelTitle","archivedIcon","isDirect","isGroup","membersMap","userDisplayName","popoverListMembers","dmHeaderTextStatus","channelFilesIconClass","channelFilesIcon","pinnedIconClass","pinnedIcon","pinnedPostsCount","headerTextContainer","popoverSize","hasMoreThanOneTeam","setPopoverOverlayWidth","editMessage","toggleFavoriteTooltip","toggleFavorite","channelMutedTooltip","muteTrigger","unmute","setTitleMenuOpen","aria-level","data-channelid","dmUserId","guest_count","pinnedpost_count","CameraIcon","CallButton","pluginCallMethods","trimRight","str","CreatePost","saveDraft","saveDraftFrame","setDraft","draftsForChannel","onOrientationChange","abs","lastOrientation","textboxRef","ignoreSlash","forceFocus","lastBlurAt","isReaction","sendReaction","hookResult","hideNotifyAllModal","doSubmit","tokens","updateChannel","userIsOutOfOffice","groupsWithAllowReference","channelMemberCountsByGroup","currentChannelMembersCount","useGroupMentions","notificationsToChannel","enableConfirmNotificationsToChannel","memberNotifyCount","channelTimezoneCount","notContainsAtChannel","containsAtChannel","mentionGroups","groupsMentionedInText","mappedValue","channel_member_count","channel_member_timezones_count","getChannelTimezones","showNotifyAllModal","getStatusFromSlashCommand","isStatusSlashCommand","editChannelHeaderModalData","isDirectOrGroup","editChannelPurposeModalData","pending_post_id","checkAllMentions","onSubmitPost","keepFocus","postTextboxDisabled","canPost","withClosedCodeBlock","persist","emitTypingEvent","setMessageAndCaretPostion","originalSize","filePreviewInfo","itemIndex","modifiedDraft","fileUploadRef","cancelUpload","handleFileUploadChange","rhsExpanded","getElementsByClassName","shouldFocusMainTextbox","shortcutModalKeyCombo","FORWARD_SLASH","lastMessageReactionKeyCombo","BACK_SLASH","reactToLastMessage","focusTextboxIfNecessary","createPostControlsRef","messageIsEmpty","draftMessageIsEmpty","upKeyOnly","shiftUpKeyCombo","postMsgKeyPress","editLastPost","replyToLastPost","loadPrevMessage","loadNextMessage","lastPost","currentUsersLatestPost","latestReplyablePostId","replyBox","selectPostFromRightHandSideSearchByPostId","moveHistoryIndexBack","fillMessageFromHistory","moveHistoryIndexForward","emitShortcutReactToLastPostFrom","noModalsAreOpen","A11yClassNames","noPopupsDropdownsAreOpen","showPostDeletedModal","topDiv","clearDraftUploads","pasteHandler","documentKeyHandler","unloadHandler","setOrientationListeners","removeOrientationListeners","lastMessage","messageInHistoryItem","createTutorialTip","shouldEnableSendButton","fullWidthTextBox","readOnlyChannel","ariaLabelMessageInput","notifyAllMessage","notifyAllTitle","totalMembers","timezones","mention","finalMention","notifyAllConfirm","removePreview","postFooterClassName","centerClass","sendButtonClass","callButton","fileUpload","attachmentsDisabled","getFileCount","getFileUploadTarget","handleUploadStart","handleFileUploadComplete","handleUploadError","handleUploadProgress","getCreatePostControls","scrollbarClass","onComposition","handleBlur","badConnection","listenForMentionKeyClick","hidePostDeletedModal","handleNotifyAllConfirmation","getChannelView","removeItem","setGlobalItem","getMessageInHistoryItem","makeGetMessageInHistoryItem","getLatestReplyablePostId","EnableConfirmNotificationsToChannel","connectionErrorCount","shortcutReactToLastPostEmittedFrom","getShortcutReactToLastPostEmittedFrom","selectChannelMemberCountsByGroup","getAssociatedGroupsForReferenceByMention","PreferencesRedux","getCurrentUsersLatestPost","showPreviewOnCreatePost","actionOnGlobalItemsWithPrefix","CommentedOnFilesMessage","plusMore","selectFileInfosForPost","CommentedOn","from_webhook","webhookMessage","makeUsername","makeCommentedOnMessage","parentPostUser","parentPostUserId","parentUserProfile","onCommentClick","stripMarkdown","PostBody","sendingAction","sending","parentPost","comment","postClass","failedOptions","isFirstReply","failed","fileAttachmentHolder","messageWrapper","hasPlugin","messageWithAdditionalContent","mentionHighlightClass","isCommentMention","ephemeralPostClass","PostInfo","showOptionsMenuWithoutHover","showDotMenu","dotMenuRef","shouldShowDotMenu","collapsedThreadsEnabled","commentIconExtraClass","commentIcon","postReaction","dotMenu","postFlagIcon","hasReplies","getDotMenu","handleDotMenuOpened","isLastPost","isDeletedPost","isEphemeralPost","isAutoRespondersPost","isFailedPost","boundingRectOfPostInfo","postHeaderRef","handleShortcutReactToLastPost","postInfoIcon","isCardOpen","handleCardClick","createRemovePostButton","buildOptions","showTimeWithoutHover","ReduxPostUtils","selectedCard","PostHeaderCustomStatus","userCustomStatus","showUpdateStatusButton","showPostHeaderUpdateStatusButton","isCustomStatusSet","PostHeader","indicator","colon","userProfile","overwriteImage","ThreadFooter","threadIsSynthetic","participants","totalReplies","lastReplyAt","participantIds","handleReply","selectPost","handleFollowing","newReplies","prepend","THREADING_TIME","formatted","isEligibleForClick","makeIsEligibleForClick","Post","system_post_ids","togglePostMenu","dropdownOpened","fileDropdownOpened","previousPostIsComment","consecutivePostByUser","isMeMessage","fromBot","fadeOutHighlight","shouldHighlight","rootUser","hasSameRoot","currentUserCss","sameUserClass","ariaHidden","postRef","handleAlt","highlightTimeout","checkIsMeMessage","from_bot","profilePic","hideProfilePicture","center","getClassName","setHover","unsetHover","onTouchStart","handlePostClick","previousPost","isPostCommentMention","makeIsPostCommentMention","previousPostId","areConsecutivePostsBySameUser","PostComponent","generateCombinedPost","makeGenerateCombinedPost","combinedId","EmptyStateThemeableSvg","strokeLinecap","AddMembersButton","usersLimit","setHeader","inviteUsers","lessThanMaxFreeUsers","moreThanMaxFreeUsers","ChannelIntroMessage","creatorName","fullWidth","enableUserCreation","channelProfiles","teammateName","centeredIntro","channelIntroId","createSetHeaderButton","createDMIntroMessage","pictures","createGMIntroMessage","teamInviteLink","setHeaderButton","createDefaultIntroMessage","channelInviteButton","createOffTopicIntroMessage","memberMessage","getMonthLong","purposeMessage","creator","createStandardIntroMessage","EnableUserCreation","PostListRow","blockShortcutReactToLastPostForNonMessages","listId","isIdNotPost","shortcutReactToLastPostEmittedFromCenter","previousListId","loadingOlderPosts","loadingNewerPosts","OLDER_MESSAGES_LOADER","NEWER_MESSAGES_LOADER","CHANNEL_INTRO_MESSAGE","LOAD_OLDER_MESSAGES_TRIGGER","LOAD_NEWER_MESSAGES_TRIGGER","PostListRowListIds","loadOlderPosts","loadNewerPosts","shouldHideAnimation","hideAnimation","ScrollToBottomIcon","ScrollToBottomArrows","atBottom","Toast","toastClass","extraClasses","showActions","toastActionClass","closeTooltip","onClickMessage","jumpSection","ShortcutKetVariant","ShortcutKey","Contrast","SearchShortcut","controlKey","HintToast","TOAST_REL_RANGES","ToastWrapper","showUnreadToast","hideUnreadToast","showNewMessagesToast","hideNewMessagesToast","hideArchiveToast","showMessageHistoryToast","updateLastViewedBottomAt","onSearchHintDismiss","isToday","searchShortcut","atLatestPost","scrollToNewMessage","changeUrlToRemountChannelView","scrollToLatestMessages","unreadCountInChannel","unreadCount","countNewMessages","postListIds","rootPosts","channelMarkedAsUnread","newRecentMessagesCount","initScrollOffsetFromBottom","lastViewedBottom","latestPostTimeStamp","prevPostsCount","presentPostsCount","getToastToRender","showSearchHintToast","unreadToastProps","newMessagesToastText","showNewMessagesToastOverrides","archiveToastProps","archiveToastText","hideSearchHintToast","getSearchHintToastText","toastToRender","getNewMessageIndex","newMessages","countUnreadsBelow","getAllPosts","postIds","allPosts","getRootPosts","obj","preparePostIdsForPostList","makePreparePostIdsForPostList","lastChannelViewTime","getPostIdsInChannel","countCurrentChannelUnreadMessages","LatestPostReader","latestPostId","getLatestPostId","latestPost","postListStyle","virtListStyles","PostList","dynamicListStyle","postMenuOpened","willChange","showSearchHintThreshold","getShowSearchHintThreshold","previousItemId","nextItemId","isDateLine","isStartOfNewMessages","basePaddingClass","getPreviousPostId","changeUnreadChunkTimeStamp","scrollDirection","scrollOffset","scrollUpdateWasRequested","didUserScrollForwards","offsetFromBottom","shouldLoadNewPosts","atOldestPost","checkBottom","_getRangeToRender","canLoadMorePosts","showSearchHint","isSearchHintDismissed","updateAtBottom","isAtBottom","visibleTopItem","topPostId","visibleStartIndex","updateFloatingTimestamp","newMessagesSeparatorIndex","scrollToBottom","scrollToItem","handleSearchHintDismiss","channelIntroMessage","initScrollCompleted","postListRef","initRangeToRender","postIndex","getNewMessagesSeparatorIndex","maxPostsForSlicing","getSnapshotBeforeUpdate","postsAddedAtTop","channelHeaderAdded","postListNode","previousScrollTop","previousScrollHeight","postlistScrollHeight","scrollValue","newPostListIds","autoRetryEnable","data-a11y-focus-child","data-a11y-order-reversed","data-a11y-loop-navigation","renderToasts","itemData","overscanCountForward","overscanCountBackward","initScrollToIndex","innerListStyle","loaderId","correctScrollToBottom","onItemsRendered","scrollToFailed","isFirstLoad","isPrefetchingInProcess","markChannelAsReadAndViewed","autoRetriesCount","callLoadPosts","markChannelAsViewed","getOldestPostId","extraPagesLoaded","getLatestVisiblePostId","getPostsAfter","oldestPostId","getOldestVisiblePostId","getPostsBefore","loadingMorePosts","actionsForPostList","postsOnLoad","channelManuallyUnread","formattedPostIds","memoizedGetLatestPostId","getPostsChunkAroundPost","makeGetPostsChunkAroundPost","chunk","unreadChunkTimeStamp","channelViewState","getUnreadPostsChunk","getRecentPostsChunkInChannel","oldest","indicateNewMessages","PostView","loaderForChangeOfPostsChunk","channelLoading","teamMemberships","isChannelLoading","ChannelView","deferredPostView","createDeferredPostView","channelViewRef","dur1","measure","dur2","clearMarks","round","deactivatedChannel","onClickCloseChannel","channelRolesLoading","DeferredPostView","isDeactivatedChannel","getRoles","myChannelRoles","getMyChannelRoles","channelRoles","roleName","ChannelIdentifierRouter","replaceUrlTimeout","replaceUrlIfPermalink","playbookId","lastViewedChannelName","getLastViewedChannelNameByTeamName","lastViewedChannel","startPlaybookRunById","switchToChannelAndStartRun","LazyGlobalThreads","makeAsyncComponent","CenterChannel","lastReturnTo","lastChannelPath","lhsOpen","rhsMenuOpen","BadgeStatus","FaviconTitleHandlerClass","currentTeammate","unreadStatus","currentSiteName","mentionTitle","unreadTitle","isDynamicFaviconSupported","badgeStatus","link16x16","link24x24","link32x32","link64x64","link96x96","getFavicon","Mention","faviconMention16x16","faviconMention24x24","faviconMention32x32","faviconMention64x64","faviconMention96x96","Unread","faviconUnread16x16","faviconUnread24x24","faviconUnread32x32","faviconUnread64x64","faviconUnread96x96","faviconDefault16x16","faviconDefault24x24","faviconDefault32x32","faviconDefault64x64","faviconDefault96x96","updateTitle","oldBadgeStatus","getBadgeStatus","newBadgeStatus","updateFavicon","None","getUnreadStatus","FaviconTitleHandler","AdminEyeIcon","ProductNoticesModal","presentNoticeInfo","noticesData","presentNoticeIndex","noOfNotices","actionText","trackClickEvent","actionParam","nextNoticeInfo","updateNoticesAsViewed","clearDataTimer","fetchNoticesData","presentSocketState","prevSocketState","connected","lastConnectAt","presentTime","previousSocketConnectDate","client","clientVersion","getDesktopVersion","getInProductNotices","renderCicrleIndicators","indicators","renderAdminOnlyText","sysAdminOnly","renderImage","renderActionButton","handlePreviousButton","onModalDismiss","handleNextButton","ChannelController","platform","fetchingChannels","LazyBackstageController","BackstageController","wakeUpInterval","lastTime","NeedsTeam","blurTime","selectedThreadId","firstLoad","addUserToTeam","initTeam","previousTeamId","getMyTeamUnreads","setPreviousTeamId","finishedFetchingChannels","loadStatusesForChannelAndSidebar","getGroupsByUserId","getAllGroupsAssociatedToChannelsInTeam","getGroups","teamsList","sidebar","replyTextbox","mfaRequired","updateCurrentTeam","prevTeam","joinTeam","startPeriodicStatusUpdates","iNoBounce","handleFocus","onShortcutKeyDown","plugin","route","NeedsTeamComponent","checkIfMFARequired","getPreviousTeamId","getSelectedThreadIdInCurrentTeam","suggestionListStyle","previousTriggerId","ReactIntl","Redux","ReactRedux","ReactBootstrap","ReactRouterDom","PDFJS","openInteractiveDialog","WebappUtils","Components","Textbox","Timestamp","listenerOptions","A11yController","modifierKeys","lastInputEventIsKeyboard","tabKeyIsPressed","regions","tildeKeyIsPressed","previousRegion","nextRegion","f6KeyIsPressed","navigationInProgress","sections","upArrowKeyIsPressed","shouldReverseSections","nextSection","previousSection","downArrowKeyIsPressed","enterKeyIsPressed","lKeyIsPressed","resetInterractionStates","mouseIsPressed","windowIsFocused","nextElement","updateActiveRegion","focusedElement","activeRegion","udpateCurrentFocus","updateActiveSection","updateActiveElement","regionHTMLCollection","getAllRegions","sectionHTMLCollection","modalHTMLCollection","getAllModals","popupHTMLCollection","getAllPopups","resetNavigation","handleMouseClick","handleMouseDown","handleMouseUp","handleWindowBlur","destroy","clearActiveRegion","clearCurrentFocus","isElementValid","modalIsOpen","popupIsOpen","domElements","sortElementsByAttributeOrder","elementIsVisible","getOrderReverseAttribute","A11yAttributeNames","disableNavigation","newRegion","activeRegionIndex","setActiveRegion","setCurrentFocus","shouldLoopNavigation","getLoopNavigationAttribute","activeSectionIndex","newSection","setActiveSection","elementPath","region","pathElement","setActiveElement","canFocusChild","handleActiveRegionUpdate","getAllSectionsForRegion","getFocusChildAttribute","clearActiveSection","handleActiveSectionUpdate","clearActiveElement","handleActiveElementUpdate","setAttribute","forceUpdate","a11yKeyIsPressed","blurActiveElement","elementA","elementB","elementAOrder","elementBOrder","attributeValue","invalidElements","RootRedirect","LazyErrorPage","LazyLoginController","LazyAdminConsole","LazyLoggedIn","LazyPasswordResetSendLink","LazyPasswordResetForm","LazySignupController","LazySignupEmail","LazyTermsOfService","LazyShouldVerifyEmail","LazyDoVerifyEmail","LazyClaimController","LazyHelpController","LazyLinkingLandingPage","LazySelectTeam","LazyAuthorize","LazyCreateTeam","LazyMfa","CreateTeam","ErrorPage","TermsOfService","LoginController","AdminConsole","PasswordResetSendLink","PasswordResetForm","SignupController","SignupEmail","ShouldVerifyEmail","DoVerifyEmail","ClaimController","HelpController","LinkingLandingPage","SelectTeam","Authorize","Mfa","LoggedInRoute","Root","enableDevModeFeatures","rudderKey","rudderUrl","process","telemetryEnabled","noAccounts","initializePlugins","configLoaded","loadRecentlyUsedCustomEmojis","iosDownloadLink","IosAppDownloadLink","androidDownloadLink","AndroidAppDownloadLink","toResetPasswordScreen","mobileLanding","isNewLocalStorageEvent","storageArea","newValue","currentCategoryFocus","currentSidebarFocus","setUrl","setSystemEmojis","EmojiIndicesByAlias","handleLogoutLoginSignal","FastClick","a11yController","showTermsOfService","onConfigLoaded","trackLoadTime","permalinkRedirectTeamName","webSocketClient","shouldShowTermsOfService","CustomRouteComponent","permalinkRedirectTeam","DiagnosticsEnabled","NoAccounts","RootPortal","rootPortal","removeChild","SaveButton","SearchHint","onSearchTypeSelected","searchType","highlightedIndex","withTitle","optionIndex","onOptionSelected","onOptionHover","handleOnOptionHover","additionalDisplay","SearchSuggestionList","itemsContainerRef","itemRefs","popoverRef","suggestionReadOut","generateLabel","currentLabel","announceLabel","renderChannelDivider","haveDMDivider","currentItem","onCompleteWord","onItemHover","SuggestionDate","itemComponent","searchForm","keepFocused","searchTerms","searchRef","setKeepFocused","clearSearchType","updateHighlightedSearchHint","handleEnterKey","BACKSPACE","dateComponent","isSearchingTerm","SearchResultsItem","getChannelName","overrideUsername","disableProfilePopover","profilePicContainer","flagContent","rhsControls","fileAttachment","handleFocusRHSClick","replyCount","searchMatches","currentPostDay","a11yIndex","renderPostTime","directTeammate","isPostFlagged","selectPostFromRightHandSideSearch","selectPostCardFromRightHandSideSearch","FILE_TOOLTIP_RANGES","FileSearchResultItem","jumpToConv","renderPluginItems","FilesFilterMenu","selectedFilter","onFilter","MessagesOrFilesSelector","messagesCounter","filesCounter","FILES_SEARCH_TYPE","MESSAGES_SEARCH_TYPE","SearchResults","setSearchType","filesDropdownPluginMenuItems","searchFilterType","setSearchFilterType","searchPage","getMorePostsForSearch","getMoreFilesForSearch","loadMorePosts","loadMoreFiles","fileResults","isCard","isSearchAtEnd","isSearchFilesAtEnd","isSearchingFlaggedPost","isSearchingPinnedPost","isSideBarExpanded","handleSearchHintSelection","noResults","noFileResults","isLoading","showLoadMore","isMessagesSearch","contentItems","loadingMorePostsComponent","sortedResults","titleDescriptor","noResultsProps","postA","postB","handleOptionSelection","searchHintOptions","isSearchGettingMore","getScrollHeight","regionTitle","arePropsEqual","nextResults","nextFileResults","newResults","getSearchResults","newFilesResults","getSearchFilesResults","currentSearch","getCurrentSearchForCurrentTeam","getSearchMatches","getSearchResultsTerms","getIsSearchingTerm","getIsSearchingFlaggedPost","getIsSearchingPinnedPost","getIsSearchGettingMore","isEnd","isFilesEnd","PreferenceSelectors","loadedLocales","SearchDateSuggestion","dayString","onDayClick","handleDayClick","showOutsideDays","localeUtils","MomentLocaleUtils","getUserTimezone","useAutomaticTimezone","getCurrentDateForTimezone","manualTimezone","SearchDateProvider","captured","exec","datePrefix","dates","allowDividers","presentationType","SearchChannelSuggestion","nameObject","itemToName","itemToTerm","isAtSearch","SearchChannelProvider","ch","sortChannelsByTypeListAndDisplayName","channelNames","SearchUserSuggestion","SearchUserProvider","userSearchFunc","autocompleteUsersInTeam","doAutocomplete","usernamePrefix","determineVisibleSearchHintOptions","newVisibleSearchHintOptions","searchFilesHintOptions","pretextArray","penultimatePretext","keepInputFocused","setKeepInputFocused","indexChangedViaKeyPress","setIndexChangedViaKeyPress","highlightedSearchHintIndex","setHighlightedSearchHintIndex","visibleSearchHintOptions","setVisibleSearchHintOptions","isDesktop","isServerVersionGreaterThanOrEqualTo","isMacApp","updateSearchTermsForShortcut","handleAddSearchTerm","handleUpdateSearchTerms","indexDelta","changedViaKeyPress","updateSearchType","handleSearchOnSuccess","setHoverHintIndex","_highlightedSearchHintIndex","renderSearchBar","termsUsed","word","helpClass","renderHintPopover","isRhsExpanded","filterType","filterFilesSearchByExt","getSearchTerms","getSearchType","SearchResultsHeader","UserListRow","Action","emailStyle","userCountID","userCountEmail","userCount","UserList","RowComponentType","rowComponentType","SearchableUserList","onTermChange","userList","filterRow","renderFilterRow","searchUsersPlaceholder","showTeamToggle","SearchableUserListContainer","handleTermChange","SettingItemMax","shiftEnter","keyCode","disableEnterSubmit","settingList","setting","focusableElements","hintClass","infoPosition","widthClass","containerStyle","submitExtra","SettingItemMin","edit","editButton","describeSection","disableOpen","getEdit","SettingPicture","removeSrc","setDefaultSrc","onSetDefault","focusFirstElement","selectInput","previewBlob","imageStyles","defaultImageSrc","imageElement","handleRemoveSrc","handleSetDefaultSrc","handleFileSelected","setPicture","revokeObjectURL","img","renderImg","imgRender","buttonRender","disableSaveButtonFocus","handleFileChange","handleInputFile","SharedChannelIndicator","SharedUserIndicator","renderGlobalHeaderChanges","portalRoot","modalRoot","closeNextStepsArrow","SizeAwareImage","isSmallImage","naturalWidth","naturalHeight","imageWidth","onImageLoadFail","onError","onLoad","handleLoad","placeHolder","dimensionsAvailable","renderImageLoaderIfNeeded","shouldShowImg","renderImageWithContainerIfNeeded","heightTimeout","renderImageOrPlaceholder","SpinnerButton","StatusAwayAvatarIcon","StatusAwayIcon","StatusDndAvatarIcon","StatusDndIcon","StatusOfflineIcon","StatusOnlineAvatarIcon","StatusOnlineIcon","StatusIcon","IconComponent","iconComponentProps","StatusOfflineAvatarIcon","getUserSuggestions","usersAutocomplete","notFoundSuggestions","Complete","Description","Hint","IconData","getUserSuggestion","getChannelSuggestions","notFoundSuggestion","COMMAND_SUGGESTION_CHANNEL","COMMAND_SUGGESTION_USER","ParseState","getCommandBindings","ParsedCommand","formsCache","Start","commandBindings","autocompleteMode","asError","incomplete","incompleteStart","Command","EndCommand","CommandSeparator","fetched","getForm","StartParameter","flagEqualsUsed","escaped","Flag1","Rest","StartValue","ParameterSeparator","Flag","flagName","FlagValueSeparator","QuotedValue","TickValue","NonspaceValue","EndValue","EndQuotedValue","EndTickedValue","rootPostID","parsed","matchBinding","parseForm","parserErrorMessage","addDefaultAndReadOnlyValues","missing","getMissingFields","missingStr","fieldName","composeCallFromParsed","getErrorSuggestion","getCommandSuggestions","argSuggestions","getParameterSuggestions","executableStates","hasRequired","hasValue","execute","getExecuteSuggestion","getNoMatchingSuggestion","decorateSuggestionComplete","COMMAND_SUGGESTION_ERROR","expandOptions","getAppContext","userName","selectChannelByName","choice","EXECUTE_CURRENT_COMMAND_ITEM_ID","goBackSpace","forms","rootID","fetchForm","errStr","displayError","positional","getValueSuggestions","getFlagNameSuggestions","applicable","delimiter","getUserFieldSuggestions","getChannelFieldSuggestions","getBooleanSuggestions","getDynamicSelectSuggestions","getStaticSelectSuggestions","mentionSuggestions","separatedWords","incompleteLessLastWord","lastWord","inTextMentionSuggestions","opts","isMultiword","makeDynamicSelectSuggestionError","getStore","Store","_command","_position","ChannelSuggestion","ChannelProvider","normalizedPretext","UserSuggestion","UserProvider","searchUsersFunc","MenuActionSuggestion","displayAllOptions","filterOptions","filteredOptions","getInput","latestHeight","listElement","suggestionList","getContent","inputBounds","calculateInputRect","newInputBounds","getChildHeight","newPosition","modalBounds","getClosestParent","onModalScroll","updateModalBounds","cleared","updateInputBounds","updatePosition","modalBodyRect","onLoseVisibility","latestComplete","resetRequest","SuggestionBox","mentionKey","insertText","addTextAtCaret","getDOMNode","preventSuggestionListCloseFlag","relatedTarget","handleEmitClearSuggestions","requiredCharacters","composing","caret","keepPretext","termWithoutMatched","overlap","findOverlap","fixedTerm","finish","replaceText","ke","KeyboardEvent","bubbles","cancelable","provider","handleCompleteWord","setSelectionByDelta","selectionIndex","suggestionBoxAlgn","selectPrevious","selectNext","TAB","timeoutId","nonDebouncedPretextChanged","newComponents","newPretext","handleReceivedSuggestions","handled","handleReceivedSuggestionsAndComplete","triggerCharacter","char","pxToSubstract","debouncedPretextChanged","handleFocusIn","handleFocusOut","contextId","SuggestionListComponent","SuggestionDateComponent","setContainerRef","onCompositionStart","handleCompositionStart","onCompositionUpdate","handleCompositionUpdate","onCompositionEnd","handleCompositionEnd","ariaLiveRef","preventClose","preventSuggestionListClose","setSelection","wrapperHeight","aLower","bLower","contentRef","visibleContentHeight","contentTop","contentTopPadding","getComputedCssProperty","contentBottomPadding","itemTop","itemBottomMargin","itemBottom","isEmptyObject","removeLabel","innerHTML","property","getTransform","lineHeight","pixelsToMoveX","pixelsToMoveY","dividerRendered","mainClass","contentClass","windowHeight","adminOnly","mattermostIcon","allowForget","InstallationDate","IssuedAt","Cluster","ServerVersion","SystemNotice","notices","dismissedNotices","remind","getCurrentNotice","hideAndRemind","hideAndForget","getPreferenceNameMap","nameMap","Notices","TeamMembersDropdown","me","handleDemote","updateTeamMemberSchemeRoles","removeUserFromTeamAndGetStats","showDemoteModal","currentRoles","showMakeMember","showMakeAdmin","canRemoveFromTeam","makeDemoteModal","handleDemoteSubmit","handleDemoteCancel","menuRemove","handleRemoveFromTeam","menuMakeAdmin","handleMakeAdmin","menuMakeMember","handleMakeMember","updateUserActive","MemberListTeam","loadProfilesAndTeamMembers","getTeamMembers","Teams","exclude_deleted_users","loadTeamMembersForProfilesList","teamMembersDropdown","canManageTeamMembers","totalTeamMembers","getCurrentTeamStats","active_member_count","handleInvitePeople","searchAssociatedGroupsForReference","searchAssociatedGroupsForReferenceLocal","AtMentionSuggestion","itemname","isCurrentUser","youElement","AtMentionProvider","setProps","lastCompletedWord","lastPrefixWithNoResults","profilesInChannel","autocompleteGroups","priorityProfiles","specialMentions","getProfileSuggestions","profileSuggestions","usernameSuggestions","getSuggestionsSplitByMultiple","getSuggestionsSplitBy","getGroupSuggestions","groupSuggestions","groupnameSuggestions","filterProfile","prefixLower","filterGroup","localMembers","createFromProfile","filterPriorityProfiles","localGroups","createFromGroup","remoteMembers","remoteGroups","remoteNonMembers","priorityProfilesIds","localUserIds","orderUsers","localAndRemoteMembers","localGroupIds","localAndRemoteGroups","updateMatches","resultCallback","XRegExp","showLoadingIndicator","groupsData","ChannelMentionSuggestion","ChannelMentionProvider","lastPrefixTrimmed","words","wrappedChannelIds","wrappedChannels","nameWords","matched","wordMatched","handleChannels","withError","wrappedMoreChannels","wrapped","CommandSuggestion","symbolSpan","CommandProvider","globalStore","appCommandParser","setChannelContext","getSuggestions","handleMobile","handleWebapp","appCommandSuggestions","getSuggestionsBase","auto_complete","auto_complete_hint","auto_complete_desc","shouldAddExecuteItem","AppCommandProvider","EMOJI_CATEGORY_SUGGESTION_BLOCKLIST","EmoticonSuggestion","EmoticonProvider","partialName","emoticon","Emoticons","autocompleteCustomEmojis","findAndSuggestEmojis","formatEmojis","recentMatched","skintone","matchedArray","hasSystemEmoji","checkMessageLength","wrapper","updateSuggestions","textboxClassName","textWrapperClass","getProfilesInChannelOptions","getProfilesInChannel","getProfilesForThread","makeGetProfilesForThread","getAssociatedGroupsForReference","profilesWithLastViewAtInChannel","TextboxLinks","isMarkdownPreviewEnabled","hasText","editHeader","helpTextClass","previewLink","togglePreview","PreReleaseFeatures","MARKDOWN_PREVIEW","append","hasDot","allowTextOverflow","FollowButton","matchParams","useParams","threadIdentifier","shallowEqual","goToInChannel","clearCommentDraftUploads","_key","updateCommentDraft","makeOnMoveHistoryIndex","getMessageInHistory","nextMessageInHistory","submitPost","RhsSuggestionList","setPosition","CreateComment","createPostErrorId","messageInHistory","rootChanged","messageInHistoryChanged","onUpdateCommentDraft","setCaretPosition","updatedDraft","draftsForPost","channelMembersCount","shouldEnableAddButton","rootDeleted","commentMsgKeyPress","canEditNow","onEditLatestPost","onMoveHistoryIndexBack","onMoveHistoryIndexForward","newFileInfos","updateCommentDraftWithRootId","createCommentControlsRef","resetCreatePostRequest","onResetHistoryIndex","doInitialScrollToBottom","selectedPostFocussedAt","enableAddButton","ariaLabelReplyInput","uploadsInProgressText","addButtonClass","getCreateCommentControls","getSelectedPostFocussedAt","showPreviewOnCreateComment","resetHistoryIndex","makeOnUpdateCommentDraft","getPostIdsInThread","makeGetPostIdsForThread","_state","getPostById","isPostPendingOrFailed","makeGetCurrentUsersLatestReply","makeOnEditLatestPost","EmojiMap","submitCommand","makeOnSubmit","isDeleted","isFakeDeletedPost","MessageWithAdditionalContent","previewCollapsed","RhsRootPost","isPostsFakeParentDeleted","testStateObj","isPostDeleted","botIndicator","dotMenuContainer","RootPost","onCardClick","RhsComment","isPostEphemeral","isConsecutivePost","currentAriaLabel","failedPostOptions","handlePostFocus","consecutivePost","isInViewport","highlightedPostId","getHighlightedPostId","Reply","handleRemovePost","ThreadViewerRow","isRootPost","onCardClickPost","BASE_THREADING_TIME","ThreadViewerVirtualized","replyListIds","createCommentHeight","userScrolledToBottom","userScrolled","topRhsPostId","isCreateComment","getInitialPostIndex","handleCreateCommentHeightChange","postCreateContainerRef","scrollToHighlightedPost","getInnerStyles","getRepliesListWithSeparators","makePrepareReplyIdsForThreadViewer","getThreadLastViewedAt","makeGetThreadLastViewedAt","showDate","DeferredThreadViewerVirt","ThreadViewer","reconnected","morePostsToFetch","userThread","markThreadRead","onInit","socketConnectionStatus","selectedChanged","placeContent","handleCardClickPost","getPostIdsForThread","prop","arg","arg2","SemanticTime","toLocaleString","dateTime","TODAY_YESTERDAY","TODAY_TITLE_CASE","equals","YESTERDAY_TITLE_CASE","TOMORROW_TITLE_CASE","STANDARD_UNITS","Today","Yesterday","week","quarter","supportsHourCycle","Intl","DateTimeFormat","resolvedOptions","hourCycle","is12HourTime","hour12","defaultRefreshIntervals","normalizeRangeDescriptor","unit","isUnitDescriptor","prevValue","formatParts","relative","relFormat","dateFormat","timeFormat","isRelative","formatRelative","formatDateTime","timeZone","momentValue","tz","momentDate","momentTime","relNearest","truncateEndpoints","getDiff","formatRelativeTime","capitalize","autoRange","isEqual","isWithin","updateIntervalInSeconds","getFormats","isValidElementType","isSameYear","nextUpdate","maybeUpdate","relativeOrDate","unparsed","formats","formatLabel","getUserCurrentTimezone","useMilitaryTime","ModalToggleButton","clickHandler","ModalToggleButtonRedux","dialogName","showUnread","isShared","UserProfile","ariaName","setOverlaynRef","CollapsedReplyThreadsModal","crtBetaImg","UserSettings","security","notifications","advanced","checkEmail","confirmTitle","confirmMsg","confirmBtns","resendStatus","sendVerificationEmail","requireConfirm","active_tab","active_section","showCRTBetaModal","customConfirmAction","afterConfirm","skipConfirm","setEnforceFocus","setRequireConfirm","handleCancelConfirmation","sendEmailNotifications","requireEmailVerification","RequireEmailVerification","Badge","ButtonOrDiv","BotBadge","GuestBadge","ArchiveIcon","AttachmentIcon","CloseCircleSolidIcon","CloseIcon","EmojiIcon","AddIcon","BackIcon","DropdownIcon","EditIcon","NextIcon","additionalClassName","PreviousIcon","SuccessIcon","FlagIcon","FlagIconFilled","GlobeIcon","InfoSmallIcon","LockIcon","MattermostLogo","MentionsIcon","MenuIcon","SearchIcon","NotifyStatus","DafaultBtnText","NotifyLink","notifyStatus","NotStarted","Success","Failed","Started","notifyFunc","Sending","Sent","NotifyAdmin","btnText","UpgradeLink","styleButton","LoadingSpinner","LoadingWrapper","SubMenuItem","pathPair","composedPath","selectedValueElement","textProp","hasSubmenu","subMenuStyle","menuOffset","subMenuContent","hasDivider","styleSelectableItemDiv","subMenuClass","MenuHeader","MenuGroup","handleDividerClick","MenuItemActionImpl","MenuItem__dangerous","MenuItemAction","menuItem","MenuItemExternalLinkImpl","MenuItemExternalLink","MenuItemLinkImpl","MenuItemLink","MenuTopNotification","TrialLoadStatus","setLoadStatus","requestedUsers","MenuStartTrial","getPrevTrialLicense","prevTrialLicense","currentLicense","isPrevLicensed","StartTrialModal","MenuItemToggleModalReduxImpl","sibling","MenuItemToggleModalRedux","observer","disconnect","prevWasDivider","isAtBeginning","observe","attributes","childList","subtree","MutationObserver","hideUnneededDividers","handleMenuClick","MenuWrapperAnimation","MenuWrapper","closeOnBlur","keyboardClose","Animation","FullScreenModal","currentActiveElement","handleKeypress","appear","aria-modal","SizeMap","xs","sm","md","lg","Popover","bsStyle","BoolSetting","Setting","resize","SimpleTooltip","arrowOffsetTop","useSynchronizedImmediate","isImmediate","setImmediate","TeamIcon","hoverCss","imageURLForTeam","withImage","Avatar","data-content","makeDisplayNameGetter","UserAvatar","Avatars","fetchMissingUsers","displayUserIds","overflowUserIds","overflowUnnamedCount","nonDisplayCount","breakAt","displayItems","overflowItems","countMeta","overflowNames","avatarStyle","tinycolor","toRgbString","PayloadSources","Flux","handleServerAction","warn","SERVER_ACTION","handleViewAction","VIEW_ACTION","getLogs","onRequest","onSuccess","onFailure","getAudits","updateConfig","getEnvironmentConfig","testEmail","invalidateCaches","recycleDatabase","createComplianceReport","job","getComplianceReports","imageData","testLdap","getLdapGroups","q","linkLdapGroup","primary_key","mattermost_group_id","has_syncables","unlinkLdapGroup","fileData","testElasticsearch","purgeElasticsearchIndexes","uploadLicense","removeLicense","getAnalytics","uploadPlugin","installPluginFromUrl","getPluginStatuses","enablePlugin","disablePlugin","getDataRetentionCustomPolicies","getDataRetentionCustomPolicy","deleteDataRetentionCustomPolicy","getDataRetentionCustomPolicyTeams","getDataRetentionCustomPolicyChannels","searchDataRetentionCustomPolicyTeams","searchDataRetentionCustomPolicyChannels","createDataRetentionCustomPolicy","policy","updateDataRetentionCustomPolicy","addDataRetentionCustomPolicyTeams","removeDataRetentionCustomPolicyTeams","addDataRetentionCustomPolicyChannels","removeDataRetentionCustomPolicyChannels","AppsTypes","CloudTypes","getInvoices","updateCloudCustomer","customerPatch","updateCloudCustomerAddress","syncableID","syncableType","patch","dispatches","syncable_id","getGroupSyncables","getGroup","filterAllowReference","param1","param2","param3","filterParentTeamPermitted","includeMemberCount","groupsByChannelId","param4","param5","total_group_count","patchGroup","getGroupStats","createIncomingHook","getIncomingHook","hookId","getIncomingHooks","removeIncomingHook","updateIncomingHook","createOutgoingHook","getOutgoingHook","getOutgoingHooks","removeOutgoingHook","updateOutgoingHook","regenOutgoingHookToken","getCustomTeamCommands","addCommand","editCommand","regenCommandToken","deleteCommand","addOAuthApp","editOAuthApp","getOAuthApps","getAppsOAuthAppIDs","getAppsBotIDs","getOAuthApp","getAuthorizedOAuthApps","deauthorizeOAuthApp","deleteOAuthApp","regenOAuthAppSecret","areAppsEnabled","accum","getAllFiles","getFilesIdsForPost","fileIdsByPostId","filePublicLink","allFiles","fileIdsForPost","filesFromSearch","fileIds","emptyList","emptySyncables","getAllGroups","getMyGroups","myGroups","getGroupMemberCount","getAllGroupStats","total_member_count","syncables","getGroupTeams","getAssociatedGroupsByName","trimmedTerm","filterGroupsMatchingTerm","groupsForReference","groupsFromChannel","getGroupsAssociatedToChannelForReference","groupsFromTeam","getGroupsAssociatedToTeamForReference","getAllAssociatedGroupsForReference","getTeamGroupIDSet","groupsAssociatedToTeam","teamIDs","getChannelGroupIDSet","groupsAssociatedToChannel","channelIDs","allGroups","teamGroupIDSet","entry","channelGroupIDSet","teamGroups","gids","getMyAllowReferencedGroups","getMyGroupsAssociatedToChannelForReference","userMentionKeys","DMchannels","dispatchPluginComponentAction","resolveReactElement","standardizeRoute","fixedRoute","PluginRegistry","registerRootComponent","registerPopoverUserAttributesComponent","registerPopoverUserActionsComponent","registerLeftSidebarHeaderComponent","registerBottomTeamSidebarComponent","registerPostMessageAttachmentComponent","registerLinkTooltipComponent","registerChannelHeaderButtonAction","registerCallButtonAction","registerPostTypeComponent","registerPostCardTypeComponent","registerPostWillRenderEmbedComponent","registerMainMenuAction","registerChannelHeaderMenuAction","registerFileDropdownMenuAction","registerPostDropdownMenuAction","registerPostDropdownSubMenuAction","rootRegisterMenuItem","registerMenuItem","parentMenuId","innerAction","innerFilter","registerPostDropdownMenuComponent","registerFileUploadMethod","registerFilesWillUploadHook","unregisterComponent","componentId","unregisterPostTypeComponent","registerReducer","reducerRegistry","registerWebSocketEventHandler","unregisterWebSocketEventHandler","registerReconnectHandler","unregisterReconnectHandler","registerMessageWillBePostedHook","registerSlashCommandWillBePostedHook","registerMessageWillFormatHook","registerFilePreviewComponent","registerTranslations","getTranslationsForLocale","func","registerRightHandSidebarComponent","showRHSPlugin","hideRHSPlugin","toggleRHSPlugin","registerNeedsTeamRoute","registerCustomRoute","registerProduct","mainComponent","headerCentreComponent","headerRightComponent","removeWebappPlugin","manifestId","hideRHSPluginAction","loadErr","regeneratorRuntime","registerPlugin","loadedPlugins","describePlugin","reject","oldManifest","webapp","bundle_path","bundlePath","script","registry","initializePlugin","getElementsByTagName","uninitialize","deinitialize","oldManifests","newManifests","newManifest","Pluggable","childrenProps","componentName","getComponentName","pluginComponents","InquiryIssue","inquiry","inquiryIssue","cwsUrl","CWSURL","inquiryIssueQuery","getFeatureFlagValue","localStorageStore","FilesDropdown","getNavigationBlocked","navigationBlock","showNavigationPrompt","announcementBar","announcementBarState","lastGetPosts","toastStatus","system","websocketConnectionErrorCount","shouldShowPreviewOnCreateComment","shouldShowPreviewOnCreatePost","shouldShowPreviewOnEditChannelHeaderModal","shouldShowPreviewOnEditPostModal","Actions","getGlobalItem","removeGlobalItem","signalLogout","isLocalStorageSupported","logoutId","sessionStorage","isSignallingLogout","signalLogin","isSignallingLogin","hasCheckedLocalStorage","localStorageSupported","hasSeenLandingPage","setLandingPageSeen","landingPageSeen","getLandingPreference","siteUrl","setLandingPreferenceToMattermostApp","LandingPreferenceTypes","setLandingPreferenceToBrowser","clearLandingPreference","isSuccess","appsPluginID","appID","postID","defaultExpand","rawCommand","selectedField","raw_command","expiryYear","getData","shouldTruncate","momentA","momentB","isSameMonth","isSameDay","timer","fire","thumbsDownRule","otherName","thumbsUpRule","customRules","thumbsdown","thumbsup","getEmojiName","searchedName","emojiA","emojiB","aName","bName","aPrefix","defaultRule","nodes","matchAll","emojiRegex","enableFileAttachments","EnableFileAttachments","enableMobileFileUpload","EnableMobileFileUpload","EnableMobileFileDownload","mimetype","mimeTypeSplitBySlash","mimeTypePrefix","mimeTypeSuffix","getExifOrientation","view","DataView","getUint16","byteLength","marker","getUint32","little","getOrientationStyles","transformOrigin","exif2css","IsTrial","endDate","StartsAt","isCloudLicense","LatexBlock","enableLatex","katexOptions","throwOnError","displayMode","maxSize","maxExpand","fleqn","html","renderToString","EnableLatex","tooltipContainerStyles","flexDirection","hideTimeout","tooltipContainer","tooltipContainerRef","showTimeout","childNodes","hideTooltip","popper","Popper","preventOverflow","dataAttributes","MarkdownImageExpand","imageKey","toggleInlineImageVisibility","handleToggleButtonClick","wrapperClassName","isInlineImageVisible","MarkdownImage","widthNumber","imageIsLink","loadFailed","prevSrc","onUpdated","isHeaderChangeMessage","brokenImageIcon","safeSrc","getFileExtensionFromUrl","loadingClass","handleLoadFail","getHeight","PostEmoji","emojiText","Parser","processNodeDefinitions","ProcessNodeDefinitions","processingInstructions","replaceChildren","shouldProcessNode","attribs","processNode","hrefAttrib","mentionAttrib","emojiAttrib","latex","processDefaultNode","parseWithInstructions","DOMParser","parseFromString","parseTable","tableClassName","columnText","column","textContent","headerRow","spacers","formattedTable","requireEndLF","getPlainText","horizontalPosition","intlConfigPropTypes","defaultLocale","defaultFormats","intlFormatPropTypes","formatTime","formatNumber","formatPlural","formatters","mfaPaths","mfaAuthServices","MFA","EnableMultifactorAuthentication","EnforceMultifactorAuthentication","GuestAccountsEnforceMultifactorAuthentication","mfa_active","auth_service","teamsOrderList","compareTeamsByDisplayName"],"mappings":"m4CAgBA,MAAMA,EAAWC,aACXC,EAAWD,aAEVE,eAAeC,EAAaC,EAASC,GACxC,MAAM,KAACC,EAAMD,MAAOE,SAAaR,EAASS,QACtCF,GAAQF,GACRL,EAASS,QACTT,EAASS,QACTJ,EAAQE,IACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAeS,EAAcC,EAAQR,EAASC,GACjD,MAAM,KAACC,EAAMD,MAAOE,SAAaM,KAA0BD,GAAQ,EAAlCC,CAAyCd,EAAUE,GAChFK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAeY,EAAiBV,EAASC,GAC5C,MAAM,KAACC,EAAMD,MAAOE,SAAaC,OAAgCT,EAAUE,GACvEK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAea,EAASX,EAASC,GACpC,MAAM,KAACC,EAAMD,MAAOE,SAAaC,OAAwBT,EAAUE,GAC/DK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAec,EAAoBZ,EAASC,GAC/C,MAAM,KAACC,EAAMD,MAAOE,SAAaC,OAAgCT,EAAUE,GACvEK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAee,EAA0Bb,EAASC,GACrD,MAAM,KAACC,EAAMD,MAAOE,SAAaC,OAA+BT,EAAUE,GACtEK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAegB,EAAgBC,EAAMf,EAASC,GACjD,MAAM,KAACC,EAAMD,MAAOE,SAAaM,KAAsBM,EAAtBN,CAA4Bd,EAAUE,GACnEK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAapC,SAASa,EAAgBC,GAC5B,OAAOC,QAAe,CAClBC,WAAYC,qBACZC,OAAQ,CAACJ,KAIV,SAASK,GAAY,aAACC,EAAD,SAAeN,EAAf,YAAyBO,EAAzB,MAAsCC,EAAtC,MAA6CC,IACrE,OAAOR,QAAe,CAClBC,WAAYC,uBACZC,OAAQ,CAACE,EAAcN,EAAUO,EAAaC,EAAOC,KAItD5B,eAAe6B,EAAYC,EAASC,EAAUC,EAAOC,EAAQC,EAAchC,EAASC,GACvF,MAAM,KAACC,EAAMD,MAAOE,SAAaM,KAA8BmB,EAASC,EAAUE,EAAQC,EAAcF,EAAvErB,CAA8Ed,EAAUE,GACrHK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAemC,EAAaL,EAASC,EAAUC,EAAOI,EAASlC,EAASC,GAC3E,MAAM,KAACC,EAAMD,MAAOE,SAAaM,KAA+ByB,EAASN,EAASC,EAAUC,EAA3DrB,CAAkEd,EAAUE,GACzGK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAeqC,EAAaC,EAAgBC,EAAOR,EAAU7B,EAASC,GACzE,MAAM,KAACC,EAAMD,MAAOE,SAAaM,KAA+B2B,EAAgBC,EAAOR,EAAtDpB,CAAgEd,EAAUE,GACvGK,GACIA,EAAKoC,cACLC,QAAuBrC,EAAKoC,aAE5BtC,GACAA,EAAQE,IAELC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAe0C,EAAiBC,EAAYzC,EAASC,GACxD,MAAM,KAACC,EAAMD,MAAOE,SAAaC,KAA8BqC,EAA9BrC,CAA0CT,EAAUE,GACjFK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAe4C,EAAiB1C,EAASC,GAC5C,MAAM,KAACC,EAAMD,MAAOE,SAAaC,OAAgCT,EAAUE,GACvEK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAe6C,EAA4BC,EAAM5C,EAASC,GAC7D,MAAM,KAACC,EAAMD,MAAOE,SAAaC,KAAyCwC,EAAzCxC,CAA+CT,EAAUE,GACtFK,GAAQF,EACRA,EAAQ,mBACDG,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAe+C,EAA6BD,EAAM5C,EAASC,GAC9D,MAAM,KAACC,EAAMD,MAAOE,SAAaC,KAA0CwC,EAA1CxC,CAAgDT,EAAUE,GACvFK,GAAQF,EACRA,EAAQ,oBACDG,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAegD,EAA4BF,EAAM5C,EAASC,GAC7D,MAAM,KAACC,EAAMD,MAAOE,SAAaC,KAAyCwC,EAAzCxC,CAA+CT,EAAUE,GACtFK,GAAQF,EACRA,EAAQ,mBACDG,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAGpCL,eAAeiD,EAA6BH,EAAM5C,EAASC,GAC9D,MAAM,KAACC,EAAMD,MAAOE,SAAaC,KAA0CwC,EAA1CxC,CAAgDT,EAAUE,GACvFK,GAAQF,EACRA,EAAQ,oBACDG,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAekD,EAAyBJ,EAAM5C,EAASC,GAC1D,MAAM,KAACC,EAAMD,MAAOE,SAAaC,KAAsCwC,EAAtCxC,CAA4CT,EAAUE,GACnFK,GAAQF,EACRA,EAAQ,gBACDG,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAemD,EAA4BjD,EAASC,GACvD,MAAM,KAACC,EAAMD,MAAOE,SAAaC,OAA2CT,EAAUE,GAClFK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAeoD,EAA6BlD,EAASC,GACxD,MAAM,KAACC,EAAMD,MAAOE,SAAaC,OAA4CT,EAAUE,GACnFK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAeqD,EAA4BnD,EAASC,GACvD,MAAM,KAACC,EAAMD,MAAOE,SAAaC,OAA2CT,EAAUE,GAClFK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAesD,EAA6BpD,EAASC,GACxD,MAAM,KAACC,EAAMD,MAAOE,SAAaC,OAA4CT,EAAUE,GACnFK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAeuD,EAAyBrD,EAASC,GACpD,MAAM,KAACC,EAAMD,MAAOE,SAAaC,OAAwCT,EAAUE,GAC/EK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAewD,EAAqBC,SACjCnD,KAAkCmD,EAAlCnD,CAA0CT,EAAUE,GAGvDC,eAAe0D,EAAqBD,SACjCnD,KAAkCmD,EAAlCnD,CAA0CT,EAAUE,GAGvDC,eAAe2D,EAA2BF,SACvCnD,KAAwCmD,EAAxCnD,CAAgDT,EAAUE,GAG7DC,eAAe4D,EAAwBH,SACpCnD,KAAqCmD,EAArCnD,CAA6CT,EAAUE,GAG1DC,eAAe6D,EAAwBJ,SACpCnD,KAAqCmD,EAArCnD,CAA6CT,EAAUE,GAG1DC,eAAe8D,EAAkBC,EAAQ7D,EAASC,GACrD,MAAM,KAACC,EAAMD,MAAOE,SAAaC,KAA+ByD,EAA/BzD,CAAuCT,EAAUE,GAC9EK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAegE,EAAiB9D,EAASC,GAC5C,MAAM,KAACC,EAAMD,MAAOE,SAAaC,OAAgCT,EAAUE,GACvEK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAeiE,EAA0B/D,EAASC,GACrD,MAAM,KAACC,EAAMD,MAAOE,SAAaC,OAAyCT,EAAUE,GAChFK,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAekE,EAAkBhE,EAASC,GAC7C,MAAMgE,GAAoB/C,QAAe,CACrCC,WAAYC,uBACZC,OAAQ,MAGN,KAACnB,EAAMD,MAAOE,SAAaR,EAASsE,GACtC/D,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpC,SAAS+D,EAAqBC,GACjC,MAAO,CACHC,KAAMC,4BACNF,WAID,SAASG,EAAgBC,GAC5B,MAAO,CACHH,KAAMC,sBACNE,yBAID,SAASC,IACZ,MAAO,CACHJ,KAAMC,wBAIP,SAASI,KAEZ,MAAO,CAACC,EAAeC,KACnB,MAAMC,GAAWC,QAAyBF,KAEtCC,GACAA,IAGJF,EAAc,CACVN,KAAMC,2BAKXvE,eAAegF,GAA0B9E,EAASC,GACrD,MAAM,KAACC,EAAMD,MAAOE,SAAaR,EAASoF,QACtC7E,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAekF,GAAShF,EAASC,GACpC,MAAM,KAACC,EAAMD,MAAOE,SAAaR,EAASS,QACtCF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpC,SAAS8E,GAA2BC,EAAUC,GACjD,OAAQC,IACJA,EAAc,CACVhB,KAAMC,oCACNnE,KAAM,CACFgF,WACAC,cAMT,SAASE,GAA6BH,GACzC,OAAQE,IACJA,EAAc,CACVhB,KAAMC,mCACNnE,KAAM,CACFgF,eAMTpF,eAAewF,GAAYtF,EAASC,EAAOsF,GAC9C,MAAM,KAACrF,EAAMD,MAAOE,SAAaR,EAASS,KAAyBmF,IAC/DrF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpC,SAASqF,GAAkCN,EAAUO,EAAKC,GAAW,UAACC,IACzE,OAAQP,IACJA,EAAc,CACVhB,KAAMC,6CACNnE,KAAM,CACFgF,WACAO,MACAC,YACAE,QAAS,CAACD,iBAMnB7F,eAAe+F,GAAuB7F,EAASC,EAAO6F,GACzD,MAAM,KAAC5F,EAAMD,MAAOE,SAAaR,EAASS,KAAoC0F,IAC1E5F,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpCL,eAAeiG,GAAkC/F,EAASC,EAAO+F,GACpE,MAAM,KAAC9F,EAAMD,MAAOE,SAAaC,KAA+C4F,EAA/C5F,CAAyDT,EAAUE,GAChGK,GAAQF,EACRA,EAAQ,gBACDG,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAIpC,SAAS8F,KACZ,OAAOnG,WACHoG,QAAW,MAAO,iCACC9E,4BAKpB,SAAS+E,KACZ,OAAOrG,eACgBsB,iCAKpB,SAASgF,KACZ,OAAOtG,eACgBsB,qBAKpB,SAASiF,KACZ,OAAOvG,eACgBsB,YAKpB,SAASkF,GAAoBC,EAAOC,EAAeC,EAAuBC,GAC7E,OAAO5G,UACH,IAKI,OAJAoG,QAAW,MAAO,4BAA6B,CAACS,UAAWD,IAIpD,CAACxG,WAHekB,aAAA,UAAmBA,oBAAnB,kBAA2D,CAC9EwF,OAAQ,OAAQC,KAAMC,KAAKC,UAAU,CAACR,QAAOS,eAAgBR,EAAeS,wBAAyBR,OAG3G,MAAOS,GACL,MAAO,CAACjH,MAAOiH,EAAEC,a,+nCCrc7B,MAAMC,EAAcC,iBAgBdC,EAAc,CAChBC,WAAaC,GAAD,OACLA,GADK,IAERC,OAAQ,QAIVC,EAAc,CAChBC,aAAa,EACbC,iBAAiB,EACjBC,gBAAiB,iCACjBC,iBAAkBC,SAASlB,KAC3BmB,OAAQV,GAGG,MAAMW,UAA4BC,gBAC7CC,YAAYC,GACRC,MAAMD,GADgB,mBAmBdE,IACRC,KAAKH,MAAMI,SAASF,MApBE,6BAuBLxI,SACVyI,KAAKH,MAAMK,cAAcF,KAAKH,MAAMM,MAAMC,KAAMC,KArBvDL,KAAK9G,MAAQ,CACTiH,MAAON,EAAMM,MACbG,aAAcC,KAAKC,SAASC,YAGL,gCAACC,EAAkBC,GAC9C,OAAID,EAAUP,QAAUQ,EAAUR,MACvB,CACHA,MAAOO,EAAUP,MACjBG,aAAcC,KAAKC,SAASC,YAI7B,KAWXG,sBACI,MAAM,MAACT,GAASH,KAAKH,MACfgB,EAAcV,EAAMW,MAAQ,GAC5BC,EAAQf,KAAKH,MAAMkB,MAEzB,OACI,uBAAKC,UAAW,gBACZ,gBAACnC,EAAD,eACI/G,GAAE,qBAAgBqI,EAAMC,MACxBa,YAAajB,KAAKkB,mBAClBC,gBAAgB,EAChBC,QAASjB,EAAMkB,cAAe,EAC9BR,YAAaA,EACbE,MAAOA,EACPd,SAAUD,KAAKC,SACfqB,WAAYnB,EAAMoB,UACdpC,KAMpBqC,qBACI,MAAM,MAACrB,GAASH,KAAKH,MAEfgB,EAAcV,EAAMW,MAAQ,GAE5BzD,EAAU8C,EAAM9C,QAChB0D,EAAQf,KAAKH,MAAMkB,MAEzB,OACI,uBAAKC,UAAW,gBACZ,gBAAC,KAAD,eACIlJ,GAAE,qBAAgBqI,EAAMC,MACxB/C,QAASA,EACT+D,QAASjB,EAAMkB,cAAe,EAC9BR,YAAaA,EACbE,MAAOA,EACPd,SAAUD,KAAKC,SACfqB,WAAYnB,EAAMoB,UACdpC,KAMpBsC,SACI,MAAM,MAACtB,EAAD,MAAQuB,EAAR,SAAeC,GAAY3B,KAAKH,MAEtC,IAAI+B,EACJ,GAAmB,mBAAfzB,EAAMtE,KACN+F,EAAkB5B,KAAKY,0BACpB,IAAmB,kBAAfT,EAAMtE,KAGb,OAAO,KAFP+F,EAAkB5B,KAAKwB,qBAK3B,OACI,uBAAKR,UAAU,cACX,6BACKU,GAEL,gBAAC,WAAD,CAAgBxE,IAAK8C,KAAK9G,MAAMoH,cAC3BsB,EACD,uBAAKZ,UAAU,aACVW,M,0HA9FJjC,E,aA3BjBgC,M,oBACAC,S,oBAEA1B,S,oBACAC,c,sBC4BW,MAAM2B,UAAsBlC,gBAOvCC,YAAYC,GACRC,MAAMD,GADgB,mBANM,IAMN,yBAKRiC,IACd,MAAM,KAAC1B,EAAD,MAAOD,EAAP,SAAcF,GAAYD,KAAKH,MAErC,GAAIM,EAAMtE,OAASkG,UAAoB,CACnC,MAAMvJ,EAAOsJ,EACb,IAAIE,EAAgBxJ,EAAKyJ,SACrBjC,KAAKH,MAAMqC,sBACXF,GAAgBG,QAAgB3J,EAAMwH,KAAKH,MAAMqC,sBAGrDjC,EAASG,EADM,CAACsB,MAAOM,EAAejB,MAAOvI,EAAKV,UAE/C,GAAIqI,EAAMtE,OAASkG,aAAuB,CAC7C,MAAMK,EAAUN,EAEhB7B,EAASG,EADM,CAACsB,MAAOU,EAAQC,aAActB,MAAOqB,EAAQtK,UAI5DmI,EAASG,EADM0B,MArBG,uBA0BX,KACX,MAAM,QAACQ,EAAD,MAAUnC,GAASH,KAAKH,MAE9B,IAAI0C,EAAwB,GACxBpC,EAAMtE,OAASkG,UACfQ,EAAY,CAAC,IAAIC,IAAoBF,EAAQG,oBACtCtC,EAAMtE,OAASkG,eACtBQ,EAAY,CAAC,IAAIG,IAAuBJ,EAAQK,wBAGpD3C,KAAKuC,UAAYA,KAlCjBvC,KAAK4C,eAqCTnB,SACI,MAAM,MACFtB,EADE,KAEFC,EAFE,MAGFW,EAHE,SAIFd,EAJE,UAKF4C,EALE,cAMFC,GACA9C,KAAKH,MAEHgB,EAAcV,EAAMW,MAAQ,GAE5BiC,EAAe5C,EAAM6C,aAAe7C,EAAMuB,MAChD,IAAIuB,EAAuC9C,EAAM6C,aAAe7C,EAAMuB,MAClEvB,EAAM+C,cACND,EACI,gBAAC,WAAD,KACKF,EACD,wBAAM/B,UAAU,cAAc,QAK1C,MAAMW,EAAWxB,EAAMgD,YACvB,IAAIC,EAAmC,gBAAC,IAAD,CAAUxE,QAAS+C,IAY1D,OAXIkB,IACAO,EACI,gBAAC,WAAD,KACI,gBAAC,IAAD,CAAUxE,QAAS+C,IACnB,uBAAKX,UAAU,mBACV6B,KAMT1C,EAAMtE,MACd,KAAKkG,UAAoB,CACrB,MAAMsB,EAAUlD,EAAMkD,SAAW,OAEjC,IAAIC,EAAYnD,EAAMoD,WACjBD,IAEGA,EADY,aAAZD,EA3GgB,IADJ,KAmHpB,IAAIG,EAAuB,QACvBH,GAAWI,wBAAgCJ,KAC3CG,EAAWH,GAGf,MAAMK,EAAY3C,EAClB,OACI,gBAAC,IAAD,CACI4C,UAAW3D,KAAKH,MAAM8D,UACtB7L,GAAIsI,EACJwD,SAAUzD,EAAMoB,SAChB1F,KAAM2H,EACN9B,MAAOuB,EACPK,UAAWA,EACXvC,MAAO2C,GAAa,GACpB7C,YAAaA,EACbc,SAAUyB,EACVnD,SAAUA,EACV4D,WAAW,IAIvB,KAAK9B,aACL,KAAKA,UAAoB,CACrB,IAAI+B,EAIJ,OAHI9D,KAAKH,MAAMkB,QACX+C,EAAiB9D,KAAKH,MAAMkB,MAA0BW,OAGtD,gBAAC,IAAD,CACI5J,GAAIsI,EACJwD,SAAUzD,EAAMoB,SAChBgB,UAAWvC,KAAKuC,UAChBwB,WAAY/D,KAAKgE,eACjBtC,MAAOuB,EACPtB,SAAUyB,EACVvC,YAAaA,EACbE,MAAO+C,EACPhB,cAAeA,IAI3B,KAAKf,mBACL,KAAKA,oBACD,OACI,gBAACrC,EAAD,iBACQM,KAAKH,MADb,CAEIM,MAAOA,EACPuB,MAAOuB,EACPtB,SAAUyB,EACVnD,SAAUD,KAAKgE,eACfjD,MAAOf,KAAKH,MAAMkB,SAI9B,KAAKgB,UAAoB,CACrB,MAAMkC,EAAYlD,EAClB,OACI,gBAAC,IAAD,CACI4C,UAAW3D,KAAKH,MAAM8D,UACtB7L,GAAIsI,EACJwD,SAAUzD,EAAMoB,SAChBG,MAAOuB,EACPlC,MAAOkD,IAAa,EACpBtC,SAAUyB,EACVvC,YAAaA,EACbZ,SAAUA,IAItB,KAAK8B,cACD,OACI,gBAAC,IAAD,CACInD,QAASuB,EAAMgD,cAM3B,OAAO,M,EA9KMtB,E,aAfjBzB,K,sBACAyC,U,SACAX,oB,WAGAjC,S,oBACA0D,U,SAEAzD,c,oBACAoC,Q,WACIK,qB,oBACAF,kB,qCAIaZ,E,eAGK,CAClBiB,cAAeoB,MCXvB,SAAeC,cAnBf,SAAyBjL,GACrB,MAAO,CACHgJ,qBAAqBkC,QAA8BlL,OAQ3D,SAA4B9B,GACxB,MAAO,CACHkL,SAAS+B,wBAAiE,CACtE1B,qBADsE,KAEtEF,kBAAiBA,MAClBrL,MAIX,CAA4DyK,GC1BtDyC,EAAkB,CAACC,YAAY,EAAOC,kBAAkB,GAExDC,EAAmC5E,GAEjC,gBAAC,IAAD,CACIjB,QAASiB,EAAMkB,MACf1D,QAASiH,I,aAVjBxM,G,WACAiJ,M,uBAcJ,U,urBC6BA,MAAM2D,EAAkBC,IACpB,MAAMC,EAAwB,GAY9B,OAXID,GAAQA,EAAKE,QACbF,EAAKE,OAAOC,SAASC,IACjB,IAAIC,EAA6B,KAC7BD,EAAElJ,OAASkG,YACXiD,GAAe,GAGnBJ,EAAOG,EAAE3E,MAAQ2E,EAAEhE,OAASiE,KAI7BJ,GAGJ,MAAMK,UAAiBtF,gBAC1BC,YAAYC,GACRC,MAAMD,GADgB,uBA2BX,CAACqF,EAA2BC,EAAqCC,KAC5E,IAAIC,GAAY,EAChB,MAAMnM,EAAQ,GAOd,GALIkM,IACAC,GAAY,EACZnM,EAAMkM,UAAYA,GAGlBD,GAAeG,OAAOC,KAAKJ,GAAaK,QAAU,EAElD,GADAH,GAAY,GACRI,OAA2BN,EAAoBD,GAAW,CAC1DhM,EAAMiM,YAAc,GACpB,IAAK,MAAOjI,EAAK6D,KAAUuE,OAAOI,QAAQP,GACtCjM,EAAMiM,YAAYjI,GAAQ,gBAAC,IAAD,CAAU0B,QAASmC,SAE9C,IAAK7H,EAAMkM,UAAW,CACzB,MAAMjF,EAAQmF,OAAOC,KAAKJ,GAAa,GACvCjM,EAAMkM,UAAYpF,KAAKH,MAAM8F,KAAKC,cAAc,CAC5C9N,GAAI,2CACJ+N,eAAgB,kFACjB,CACC1F,QACAzI,MAAOyN,EAAYhF,KAS/B,OAJIkF,GACArF,KAAK8F,SAAS5M,GAGXmM,KA3De,uBA8DX9N,MAAOoH,EAAoBoH,EAAqBhF,KAC3DpC,EAAEqH,iBAEF,MAAM,OAACnB,GAAU7E,KAAKH,MAAM8E,KACtBC,EAAS5E,KAAK9G,MAAM0L,OACtBmB,GAAchF,IACd6D,EAAOmB,GAAchF,GAGzB,MAAMoE,EAAiD,GAEjDD,EAAWe,EAAiBpB,GAkBlC,GAjBAK,WAAUJ,SAASoB,IACf,MAAMxO,GAAQyO,OACVD,EACAtB,EAAOsB,EAAQ9F,OAEf1I,IACAyN,EAAYe,EAAQ9F,MAChB,gBAAC,IAAD,CACItI,GAAIJ,EAAMI,GACV+N,eAAgBnO,EAAMmO,eACtBjB,OAAQlN,EAAMkN,aAM9B5E,KAAK8F,SAAS,CAACX,gBACyB,IAApCG,OAAOC,KAAKJ,GAAaK,OACzB,OAGJ,MAAMY,EAAa,CACfxB,UAGJ5E,KAAK8F,SAAS,CAACO,YAAY,IAE3B,MAAMC,QAAYtG,KAAKH,MAAMyC,QAAQiE,OAAOH,GAI5C,GAFApG,KAAK8F,SAAS,CAACO,YAAY,IAEvBC,EAAI5O,MAAO,OACX,MAAM8O,EAAgBF,EAAI5O,MACpB+O,EAAeD,EAAc9O,MAKnC,YAJkBsI,KAAK0G,aAAaxB,EAAlB,UAA4BsB,EAAc7O,YAA1C,aAA4B,EAAoBgP,OAAQF,IAEtEzG,KAAK4G,YAAW,IAKxB,MAAMC,EAAeP,EAAI3O,KAEzB,IAAI0N,GAAY,EACZyB,GAAc,EAClB,OAAQD,EAAahL,MACrB,KAAKkL,UACDD,GAAc,EACd,MACJ,KAAKC,QACL,KAAKA,cACD,MACJ,QACI1B,GAAY,EACZrF,KAAK0G,aAAa,QAAIM,EAAWhH,KAAKH,MAAM8F,KAAKC,cAAc,CAC3D9N,GAAI,oCACJ+N,eAAgB,2DACjB,CACChK,KAAMgL,EAAahL,QAItBwJ,GAAcyB,EAKnB9G,KAAK8F,SAAS,CAACO,YAAY,IAJvBrG,KAAK4G,YAAW,MAzIE,wBAgJVrP,MAAO6I,EAAcC,KACjC,MAAMsF,EAAO3F,KAAKH,MAAM8F,KAClBxF,EAAQH,KAAKH,MAAM8E,KAAKE,OAAOoC,MAAMlC,GAAMA,EAAE3E,OAASA,IAC5D,IAAKD,EACD,MAAO,GAGX,MAAMmG,QAAYtG,KAAKH,MAAMyC,QAAQ4E,kBAAkB/G,EAAOH,KAAK9G,MAAM0L,OAAQvE,GACjF,GAAIiG,EAAI5O,MAAO,CACX,MACMyP,EADgBb,EAAI5O,MACGA,OAASiO,EAAKC,cAAc,CACrD9N,GAAI,qBACJ+N,eAAgB,mBAQpB,OANA7F,KAAK8F,SAAS,CACVX,YAAa,OACNnF,KAAK9G,MAAMiM,aADP,IAEP,CAAChF,EAAMC,MAAO+G,MAGf,GAGX,MAAMC,EAAWd,EAAI3O,KACrB,OAAQyP,EAASvL,MACjB,KAAKkL,QAAyB,SAC1B,IAAIM,GAAQ,UAAAD,EAASzP,YAAT,eAAe0P,QAAS,GAEpC,OADAA,EAAK,UAAGA,SAAH,aAAG,EAAOC,OAAOC,MACfF,EAEX,KAAKN,UACL,KAAKA,cAA+B,CAChC,MAAMI,EAASxB,EAAKC,cAAc,CAC9B9N,GAAI,uCACJ+N,eAAgB,8DACjB,CACChK,KAAMuL,EAASvL,OASnB,OANAmE,KAAK8F,SAAS,CACVX,YAAa,OACNnF,KAAK9G,MAAMiM,aADP,IAEP,CAAChF,EAAMC,MAAO+G,MAGf,GAEX,QAAS,CACL,MAAMA,EAASxB,EAAKC,cAAc,CAC9B9N,GAAI,oCACJ+N,eAAgB,2DACjB,CACChK,KAAMuL,EAASvL,OASnB,OANAmE,KAAK8F,SAAS,CACVX,YAAa,OACNnF,KAAK9G,MAAMiM,aADP,IAEP,CAAChF,EAAMC,MAAO+G,MAGf,QA7MW,iBAkNjB,KACLnH,KAAK4G,YAAW,MAnNM,qBAsNb,CAACY,GAAY,KACtB,MAAM,KAAC7C,GAAQ3E,KAAKH,OAEf2H,GAAa7C,EAAK8C,iBAWvBzH,KAAK8F,SAAS,CAAC4B,MAAM,OApOC,mBAuOf,CAACtH,EAAcW,KACtB,MAAMZ,EAAQH,KAAKH,MAAM8E,KAAKE,OAAOoC,MAAMlC,GAAMA,EAAE3E,OAASA,IAC5D,IAAKD,EACD,OAGJ,MAAMyE,EAAS,OAAI5E,KAAK9G,MAAM0L,QAAlB,IAA0B,CAACxE,GAAOW,IAE1CZ,EAAMwH,SACN3H,KAAKH,MAAMyC,QAAQsF,gBAAgBzH,EAAOyE,GAAQiD,MAAMvB,IACpD,GAAIA,EAAI5O,MAAO,OACX,MAAM8O,EAAgBF,EAAI5O,MACpBoQ,EAAWtB,EAAc9O,MACzBiP,EAAM,UAAGH,EAAc7O,YAAjB,aAAG,EAAoBgP,OAC7BzB,EAAWe,EAAiBjG,KAAKH,MAAM8E,KAAKE,QAElD,YADA7E,KAAK0G,aAAaxB,EAAUyB,EAAQmB,GAIxC,MAAMjB,EAAeP,EAAI3O,KACzB,OAAQkP,EAAahL,MACrB,KAAKkL,UACD,OACJ,KAAKA,QACL,KAAKA,cAOD,YANA/G,KAAK0G,aAAa,QAAIM,EAAWhH,KAAKH,MAAM8F,KAAKC,cAAc,CAC3D9N,GAAI,uCACJ+N,eAAgB,8DACjB,CACChK,KAAMgL,EAAahL,QAG3B,QACImE,KAAK0G,aAAa,QAAIM,EAAWhH,KAAKH,MAAM8F,KAAKC,cAAc,CAC3D9N,GAAI,oCACJ+N,eAAgB,2DACjB,CACChK,KAAMgL,EAAahL,YAMnCmE,KAAK8F,SAAS,CAAClB,cA/Qf,MAAOD,QAAQ9E,EACT+E,EAASF,EAAeC,GAE9B3E,KAAK9G,MAAQ,CACTwO,MAAM,EACN9C,SACAQ,UAAW,KACXD,YAAa,GACbkB,YAAY,EACZ1B,QAIuB,gCAACjE,EAAkBC,GAC9C,OAAID,EAAUiE,OAAShE,EAAUgE,KACtB,CACHC,OAAQF,EAAehE,EAAUiE,MACjCA,KAAMjE,EAAUiE,MAIjB,KA6PXoD,cACI,MAAM,OAAClD,EAAD,OAASmD,GAAUhI,KAAKH,MAAM8E,KAEpC,OACI,gBAACsD,EAAA,EAAD,CACInQ,GAAG,YACHoQ,gBAAgB,0BAChBR,KAAM1H,KAAK9G,MAAMwO,KACjBS,OAAQnI,KAAKmI,OACbC,SAAUpI,KAAKH,MAAMsI,OACrBE,SAAS,SACTC,KAAK,SACLC,kBAAgB,kBAEhB,wBACIC,SAAUxI,KAAKyI,aACfC,aAAc,OAEd,gBAACT,EAAA,SAAD,CACIU,aAAa,EACbC,MAAO,CAACC,aAAchE,GAAUA,EAAOW,OAAS,GAAK,QAErD,gBAACyC,EAAA,QAAD,CACIa,eAAe,KACfhR,GAAG,kBAEFkI,KAAK+I,kBAGZlE,GAAUmD,IACR,gBAACC,EAAA,OAAD,KACKjI,KAAKgJ,cAGd,gBAACf,EAAA,SAAD,KACKjI,KAAKiJ,kBAO1BC,iBACI,MAAM,OAACrE,EAAD,OAASmD,GAAUhI,KAAKH,MAAM8E,KAEpC,OACI,wBAAM6D,SAAUxI,KAAKyI,cACjB,2BACKzI,KAAK+I,iBAERlE,GAAUmD,IACR,2BACKhI,KAAKgJ,cAGd,2BACKhJ,KAAKiJ,iBAMtBF,eACI,MAAM,MACFI,EADE,KAEFC,GACApJ,KAAKH,MAAM8E,KAEf,IAAI0E,EAcJ,OAbID,IACAC,EACI,uBACIvR,GAAG,mBACHwR,IAAK,mBACLtI,UAAU,oBACVuI,MAAM,KACNC,OAAO,KACPC,IAAKL,KAMb,gBAAC,WAAD,KACKC,EACAF,GAKbO,iBACI,MAAM,WAACC,EAAD,KAAahF,GAAQ3E,KAAKH,OAE1B,OAACgF,GAAUF,EACjB,OAAKE,EAIEA,EAAOyC,QAAQvC,GAAMA,EAAE3E,OAASuE,EAAKiF,iBAAgBC,KAAI,CAAC1J,EAAO2J,IAEhE,gBAAC,EAAD,CACI3J,MAAOA,EACPjD,IAAKiD,EAAMC,KACXuD,UAAqB,IAAVmG,EACX1J,KAAMD,EAAMC,KACZyC,UAAW7C,KAAK9G,MAAMiM,YAAYhF,EAAMC,MACxCW,MAAOf,KAAK9G,MAAM0L,OAAOzE,EAAMC,MAC/BF,cAAeF,KAAKE,cACpBD,SAAUD,KAAKC,SACf6C,cAAe6G,EAAaI,IAAiB7F,QAd9C,KAoBf8E,aACI,MAAM,OAACnE,EAAD,OAASmD,GAAUhI,KAAKH,MAAM8E,KAEpC,OAAQE,GAAUmD,IACd,gBAAC,WAAD,KACKA,GACG,gBAAC,EAAD,CACIlQ,GAAG,kBACHiJ,MAAOiH,IAGdhI,KAAK0J,kBAKlBT,eACI,MAAM,OAACpE,GAAU7E,KAAKH,MAAM8E,KAEtBqF,EACF,gBAAC,IAAD,CACIlS,GAAG,4BACH+N,eAAe,WAIvB,IAAIoE,EAAgB,CAChB,gBAAC,IAAD,CACInS,GAAG,kBACHoF,IAAI,SACJrB,KAAK,SACL8H,WAAYkB,GAA4B,IAAlBA,EAAOW,OAC7BxE,UAAU,8BACVkJ,SAAUlK,KAAK9G,MAAMmN,WACrB8D,cAAcC,QACV,gCACA,kBAGHJ,IAIT,GAAIhK,KAAKH,MAAM8E,KAAKiF,eAAgB,CAChC,MAAMzJ,EAAQ0E,aAAH,EAAGA,EAAQoC,MAAMlC,GAAMA,EAAE3E,OAASJ,KAAKH,MAAM8E,KAAKiF,iBAC7D,GAAIzJ,EAAO,OACP,MAAMkK,EAAO,UAAGlK,EAAM9C,eAAT,aAAG,EAAewM,KAAKS,GAChC,gBAAC,IAAD,CACIxS,GAAI,kBAAoBwS,EAAEvJ,MAC1B7D,IAAKoN,EAAEvJ,MACPlF,KAAK,SACLmF,UAAU,8BACVmJ,cAAcC,QACV,gCACA,iBAEJG,QAAU5L,GAAwBqB,KAAKyI,aAAa9J,EAAGwB,EAAMC,KAAMkK,EAAEvJ,QAEpEuJ,EAAE5I,SAGP2I,IACAJ,EAAgBI,IAK5B,OACI,gBAAC,WAAD,KACKrK,KAAK9G,MAAMkM,WACR,uBAAKpE,UAAU,cACX,gBAAC,IAAD,CAAUpC,QAASoB,KAAK9G,MAAMkM,aAGtC,0BACItN,GAAG,kBACH+D,KAAK,SACLmF,UAAU,6BACVuJ,QAASvK,KAAKmI,QAEd,gBAAC,IAAD,CACIrQ,GAAG,4BACH+N,eAAe,YAGtBoE,GAKbxI,SACI,OAAOzB,KAAKH,MAAM8J,WAAa3J,KAAKkJ,iBAAmBlJ,KAAK+H,eAIpE,SAAS9B,EAAiBpB,GACtB,OAAOA,aAAP,EAAOA,EAAQgF,KAAK9E,IAAD,CACf3E,KAAM2E,EAAE3E,KACRvE,KAAMkJ,EAAElJ,KACRwH,QAAS0B,EAAE1B,QACXmH,UAAWzF,EAAE7B,gB,EA7eR+B,E,aAtCT0E,W,SACAxB,O,oBACA7F,Q,WACIiE,O,oBAGAW,kB,oBACAU,gB,mCAghBR,SAAe6C,QAAWxF,G,urBCvhB1B,MAAMyF,WAA0B/K,gBAC5BC,YAAYC,GACRC,MAAMD,GADgB,qBAKbtI,UAET,MAAMoT,EAAgBC,GACX5K,KAAKH,MAAM8F,KAAKC,cACnB,CACI9N,GAAI,iCACJ+N,eAAgB,+FAEpB,CAACgF,QAASD,KAGZ,KAACjG,GAAQ3E,KAAK9G,MACpB,IAAKyL,EAAM,CACP,MAAMwC,EAASnH,KAAKH,MAAM8F,KAAKC,cAAc,CAAC9N,GAAI,0BAA2B+N,eAAgB,0BAC7F,MAAO,CAACnO,OAAOoT,QAAsBH,EAAaxD,KAGtD,MAAM4D,EAAO/K,KAAKgL,UAClB,IAAKD,EAAM,CACP,MAAM5D,EAASnH,KAAKH,MAAM8F,KAAKC,cAAc,CAAC9N,GAAI,0BAA2B+N,eAAgB,0BAC7F,MAAO,CAACnO,OAAOoT,QAAsBH,EAAaxD,KAGtD,MAAMb,QAAYtG,KAAKH,MAAMyC,QAAQ2I,UAAnB,OACXF,GADW,IAEdnG,OAAQwB,EAAWxB,SACpBsG,YAAqBlL,KAAKH,MAAM8F,MAEnC,GAAIW,EAAI5O,MACJ,OAAO4O,EAGX,MAAMc,EAAWd,EAAI3O,KACrB,OAAQyP,EAASvL,MACjB,KAAKkL,QACGK,EAAS+D,UACTnL,KAAKH,MAAMyC,QAAQ8I,oCACfhE,EACAA,EAAS+D,SACTJ,EAAKM,SAGb,MACJ,KAAKtE,UACD/G,KAAK8F,SAAS,CAACnB,KAAMyC,EAASzC,OAC9B,MACJ,KAAKoC,cACL,QACI,MAAO,CAACrP,OAAOoT,QAAsBH,EAAa3K,KAAKH,MAAM8F,KAAKC,cAC9D,CACI9N,GAAI,oCACJ+N,eAAgB,2DACjB,CACChK,KAAMuL,EAASvL,UAI3B,OAAOyK,KA9De,0BAiER/O,MAAO4I,EAAiByE,KACtC,MAAM0G,EAAc1M,GAAoBoB,KAAKH,MAAM8F,KAAKC,cACpD,CACI9N,GAAI,0BACJ+N,eAAgB,6FAEpB,CAACgF,QAASjM,KAER,KAAC+F,GAAQ3E,KAAK9G,MACpB,IAAKyL,EACD,MAAO,CAACjN,OAAOoT,QAAsBQ,EAAWtL,KAAKH,MAAM8F,KAAKC,cAAc,CAC1E9N,GAAI,0BACJ+N,eAAgB,8BAIxB,MAAMkF,EAAO/K,KAAKgL,UAClB,IAAKD,EACD,MAAO,CAACrT,OAAOoT,QAAsBQ,EAAWtL,KAAKH,MAAM8F,KAAKC,cAAc,CAC1E9N,GAAI,0BACJ+N,eAAgB,8BAIxB,IAAK1F,EAAMwH,QAEP,MAAO,CAACjQ,OAAOoT,QAAsBQ,EAAWtL,KAAKH,MAAM8F,KAAKC,cAAc,CAC1E9N,GAAI,qCACJ+N,eAAgB,2CAIxB,MAAMS,QAAYtG,KAAKH,MAAMyC,QAAQ2I,UAAnB,OACXF,GADW,IAEdQ,eAAgBpL,EAAMC,KACtBwE,WACDsG,UAAmBlL,KAAKH,MAAM8F,MAEjC,GAAIW,EAAI5O,MACJ,OAAO4O,EAGX,MAAMc,EAAWd,EAAI3O,KACrB,OAAQyP,EAASvL,MACjB,KAAKkL,UACD/G,KAAK8F,SAAS,CAACnB,KAAMyC,EAASzC,OAC9B,MACJ,KAAKoC,QACL,KAAKA,cACD,MAAO,CAACrP,OAAOoT,QAAsBQ,EAAWtL,KAAKH,MAAM8F,KAAKC,cAAc,CAC1E9N,GAAI,uCACJ+N,eAAgB,8DACjB,CACChK,KAAMuL,EAASvL,UAGvB,QACI,MAAO,CAACnE,OAAOoT,QAAsBQ,EAAWtL,KAAKH,MAAM8F,KAAKC,cAAc,CAC1E9N,GAAI,oCACJ+N,eAAgB,2DACjB,CACChK,KAAMuL,EAASvL,UAIvB,OAAOyK,KAlIe,4BAqIN/O,MAAO4I,EAAiByE,EAAuBvE,KAC/D,MAAMsF,EAAO3F,KAAKH,MAAM8F,KAQlBoF,EAAO/K,KAAKgL,UAClB,OAAKD,EAOE/K,KAAKH,MAAMyC,QAAQ2I,UAAnB,OACAF,GADA,IAEHnG,SACA2G,eAAgBpL,EAAMC,KACtBoL,MAAOnL,IACR6K,YAAqBvF,GAXb,CAACjO,OAAOoT,QATGlM,IAAoB+G,EAAKC,cAC3C,CACI9N,GAAI,0BACJ+N,eAAgB,qGAEpB,CAACgF,QAASjM,IAI2B+L,CAAahF,EAAKC,cAAc,CACjE9N,GAAI,0BACJ+N,eAAgB,iCAlJF,kBA8JhB,KAA6B,MACnC,MAAM,KAAClB,GAAQ3E,KAAK9G,OAEd,KAAC6R,GAAQ/K,KAAKH,MACpB,OAAKkL,EAIL,SACOA,GACApG,aAFP,EAEOA,EAAMoG,MAFb,IAGIU,OAAQ,OACD9G,SADD,UACCA,EAAMoG,YADP,aACC,EAAYU,QACZV,EAAKU,UARL,QAnKW,iBAgLjB,KACLzL,KAAKH,MAAMsI,YA/KXnI,KAAK9G,MAAQ,CAACyL,KAAM9E,EAAM8E,MAkL9BlD,SAEI,IADazB,KAAKgL,UAEd,OAAO,KAGX,MAAM,KAACrG,GAAQ3E,KAAK9G,MACpB,OAAKyL,EAKD,gBAAC,EAAD,CACIA,KAAMA,EACNwD,OAAQnI,KAAKmI,OACb7F,QAAS,CACLiE,OAAQvG,KAAK0L,WACbxE,kBAAmBlH,KAAKkH,kBACxBU,gBAAiB5H,KAAK4H,mBAVvB,M,EA7Lb8C,G,aAXFvC,O,oBACA7F,Q,2BAwNJ,UAAemI,QAAWC,ICjN1B,IAAevG,aAAQ,MATvB,SAA4B/M,GACxB,MAAO,CACHkL,SAAS+B,wBAAiE,CACtE4G,UADsE,GAEtEG,oCAAmCA,IACpChU,MAIX,CAAiDsT,I,gECJ1C,SAASO,GAAuBF,EAAsBlP,EAAmB8J,GAC5E,OAAOpO,UACH,IACI,MAAM+O,QAAYzN,oBAAuBkS,EAAMlP,GACzC7C,EAAesN,EAAIzK,MAAQkL,QAEjC,OAAQ/N,GACR,KAAK+N,QACD,MAAO,CAACpP,KAAM2O,GAClB,KAAKS,WACD,MAAO,CAACrP,MAAO4O,GACnB,KAAKS,UACD,IAAKT,EAAI3B,KAAM,CACX,MAAMwC,EAASxB,EAAKC,cAAc,CAC9B9N,GAAI,oCACJ+N,eAAgB,mEAEpB,MAAO,CAACnO,OAAOoT,QAAsB3D,IASzC,OANAwE,SAAUrF,EAAI3B,MAEV9I,IAASqP,aACT9T,EA8Cb,SAAuBuN,EAAeoG,GACzC,OAAOa,OAAU,CACbC,QAASC,iBACTC,WAAY9G,GACZ+G,YAAa,CACTrH,OACAoG,UApDiBkB,CAAc3F,EAAI3B,KAAMoG,IAG9B,CAACpT,KAAM2O,GAClB,KAAKS,cACD,IAAKT,EAAI4F,gBAAiB,CACtB,MAAM/E,EAASxB,EAAKC,cAAc,CAC9B9N,GAAI,uCACJ+N,eAAgB,sEAEpB,MAAO,CAACnO,OAAOoT,QAAsB3D,IAGzC,GAAItL,IAASqP,YAAqB,CAC9B,MAAM/D,EAASxB,EAAKC,cAAc,CAC9B9N,GAAI,0CACJ+N,eAAgB,oEAEpB,MAAO,CAACnO,OAAOoT,QAAsB3D,IAGzC,OAAIgF,SAAmB7F,EAAI4F,iBAAiBE,aACxCC,OAAOC,KAAKhG,EAAI4F,iBACT,CAACvU,KAAM2O,KAGlBiG,UAAoBjG,EAAI4F,gBAAgBM,OAAMJ,WAAa5G,SACpD,CAAC7N,KAAM2O,IAClB,QAAS,CACL,MAAMa,EAASxB,EAAKC,cAAc,CAC9B9N,GAAI,oCACJ+N,eAAgB,2DACjB,CAAChK,KAAM7C,IACV,MAAO,CAACtB,OAAOoT,QAAsB3D,MAG3C,MAAOzP,GACL,MAAMyP,EAASzP,EAAMkH,SAAW+G,EAAKC,cAAc,CAC/C9N,GAAI,wCACJ+N,eAAgB,kCAEpB,MAAO,CAACnO,OAAOoT,QAAsB3D,MAgB1C,SAASsF,GAAiCC,EAA2B9N,EAAiB+N,GAAwB,MACjH,OAAOC,SACHhO,EACA+N,EAAKE,WACLF,EAAKG,SAAWH,EAAK7U,GAHD,UAIpB4U,EAASK,oBAJW,aAIpB,EAAuBC,aAIxB,SAASC,GAAoCP,EAA2B9N,EAAiBsO,GAA+B,MAC3H,OAAON,SACHhO,EACAsO,EACA,GAHoB,UAIpBR,EAASK,oBAJW,aAIpB,EAAuBC,aAIxB,SAAS5B,GAAoCsB,EAA2B9N,EAAiByM,GAAiC,MAC7H,OAAOuB,SACHhO,EACAyM,EAAQwB,WACRxB,EAAQyB,SAAWzB,EAAQ8B,QAHP,UAIpBT,EAASK,oBAJW,aAIpB,EAAuBC,aAIxB,SAASI,GAAwCV,EAA2B9N,EAAiByO,GAA+B,MAC/H,OAAOT,SACHhO,EACAyO,EAAKR,WACLQ,EAAKP,QAHe,UAIpBJ,EAASK,oBAJW,aAIpB,EAAuBC,e,09BCpHxB,SAASM,EAA0BrV,GACtC,OAAOV,MAAOH,EAAUE,KACpB,MAAM4B,EAAQ5B,IACRiW,GAAgBC,QAAiBtU,GACjCuU,GAAcC,QAAqBH,EAAetV,GAClDmK,GAAUuL,QAAiBzU,EAAOuU,GAExC,IAAKrL,EACD,OAAOhL,EAASwW,KAAmCL,EAAetV,KAGtE0F,QAAW,MAAO,4BAClB,MAAMkQ,EAAMC,KAAKD,MACXE,EAAa,CACfC,SAAUC,kCACV7N,KAAMnI,EACN8I,MAAO,QAELmN,EAAe,CACjBF,SAAUC,gCACV7N,KAAMgC,EAAQtK,GACdiJ,MAAO8M,EAAIpN,YAET6B,EAAU,CAAC,CACbzG,KAAMsS,0BACNxW,KAAM,CAACoW,IACR,CACClS,KAAMsS,0BACNxW,KAAM,CAACuW,KASX,OAPA9W,GAASgX,QAAa9L,IAEtBlL,GAASiX,QAAgBd,EAAe,CAAC,EAAD,CACnCe,QAASf,GAAkBQ,GADQ,GAEnCO,QAASf,GAAkBW,MAGzB,CAACvW,KAAMyK,IAIf,SAASmM,EAA0BC,GACtC,OAAOjX,MAAOH,EAAUE,KACpB,MAAMmX,QAAerX,EAASwW,KAAkCY,IAMhE,OAJIC,EAAO/W,OACP6U,UAAoBmC,QAAkBpX,MAGnCmX,GAIR,SAASE,IACZ,OAAOpX,MAAOH,EAAUE,KACpB,MAAM4B,EAAQ5B,IACRsX,GAAUC,QAAoB3V,SAE9B9B,EAASwW,MAAyCkB,QAAiB5V,KACzE,IAAK,MAAMpB,KAAM8W,EAAS,CACtB,MAAMxM,GAAU2M,QAAW7V,EAAOpB,GAC9BsK,GAAWA,EAAQvG,OAASmT,gBAC5B5X,GAAS6X,QAAkB7M,EAAQtK,KAC5BsK,GAAWA,EAAQvG,OAASmT,iBACnC5X,GAAS8X,QAAkB9M,EAAQtK,MAI3CqX,WAID,SAASC,EAAmBC,EAAMC,GACrC,OAAO/X,MAAOH,EAAUE,KACpB,MAAM4B,EAAQ5B,IACR0D,GAAS8T,QAAiB5V,GAEhC,IAAK8B,EACD,MAAM,IAAIuU,MAAM,cAGpB,MAAM,KAAC5X,EAAD,MAAOD,SAAeN,EAASwW,KAA8B5S,EAAQqU,EAAMC,IACjF,GAAI3X,EAAM,CACN,MAAM6X,GAAYC,QAAwBvW,GAI1C,MAAO,CAACvB,KADS2X,EAAuB3X,EAAOA,EAAK2P,QAAQoI,IAAOF,EAAUE,EAAE5X,OAInF,MAAO,CAACJ,UAIT,SAASiL,EAAqB0M,EAAM5X,EAASC,GAChD,OAAOH,MAAOH,EAAUE,KACpB,MAAM4B,EAAQ5B,IACR0D,GAAS8T,QAAiB5V,GAChC,IAAK8B,EACD,MAAO,CAACrD,MAAM,GAGlB,MAAM,KAACA,EAAMD,MAAOE,SAAaR,EAASwW,KAAoC5S,EAAQqU,IAOtF,OANI1X,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,IAGhC,CAACD,MAAM,IAIf,SAASgY,EAA8BN,EAAM5X,EAASC,GACzD,OAAOH,MAAOH,EAAUE,KACpB,MAAM4B,EAAQ5B,IACR0D,GAAS8T,QAAiB5V,GAEhC,IAAK8B,EACD,OAGJ,MAAM,KAACrD,EAAMD,MAAOE,SAAaR,EAASwW,KAA6C5S,EAAQqU,IAC3F1X,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAM,EAAD,CAAEI,GAAIF,EAAIG,iBAAoBH,KAKxC,SAASgY,EAAkBC,EAAWrB,GACzC,OAAOjX,UACH,IACI,MAAMuY,EAAWtB,EAAQ3E,KAAKkG,GAAQ3Y,EAASwW,KAAgCiC,EAAWE,MAE1F,aAAaC,QAAQC,IAAIH,GAC3B,MAAOpY,GACL,MAAO,CAACA,WAKb,SAASwY,EAAcjY,EAAQ4X,GAClC,OAAOjC,KAAwC3V,EAAQ4X,EAAW,CAC9DM,YAAaC,WAId,SAASC,EAAYpY,EAAQ4X,GAChC,OAAOjC,KAAwC3V,EAAQ4X,EAAW,CAC9DM,YAAaC,iB,oGC7Jd,SAASE,EACZC,EACAC,EACAC,GAEA,OAAOlZ,UACH,IAAImZ,EACJ,IACIA,QAA2B7X,2BAC7B,MAAOnB,GACL,OAAOA,EAEX,MACMiZ,GADoBC,QAAoBH,EACrBI,CAAkBN,EAAOI,kBAE5ClC,QAAekC,EACjBD,EAAmBI,cACnB,CACIC,eAAgB,CACZC,KAAMR,EAAeQ,KACrBC,gBAAiB,CACb7Q,KAAMoQ,EAAepQ,KACrB8Q,QAAS,CACLC,MAAOX,EAAeU,QACtBE,MAAOZ,EAAea,SACtBC,KAAMd,EAAec,KACrBpY,MAAOsX,EAAetX,MACtBqY,SAASC,QAAQhB,EAAee,SAChCE,YAAajB,EAAekB,gBAOhD,IAAKjD,EACD,OAAO,EAGX,MAAM,YAACkD,EAAaja,MAAOka,GAAenD,EAE1C,GAAImD,EACA,OAAO,EAGX,GAAmB,MAAfD,EACA,OAAO,EAGX,GAA2B,cAAvBA,EAAYE,OACZ,OAAO,EAGX,UACUhZ,0BAA6B8Y,EAAY7Z,IACjD,MAAOJ,GACL,OAAO,EAGX,OAAO,GAIR,SAASoa,EAA2BC,GACvC,OAAOxa,UACH,UACUsB,2BAA8BkZ,GACtC,MAAOra,GACL,OAAOA,EAEX,OAAO,K,2TC7CR,SAASsa,EAAepT,EAAiByO,GAC5C,OAAO9V,MAAOH,EAAwBE,KAClC,MAAM4B,EAAQ5B,IAEd,IAAIsT,EAAMhM,EAENqT,EAAYrH,EAAIsH,QAAQ,KACxBD,EAAY,IACZA,EAAYrH,EAAIpF,QAEpB,MAAM2M,EAAMvH,EAAIwH,UAAU,EAAGH,GAAWI,cAGxC,OAFAzH,EAAMuH,EAAM,IAAMvH,EAAIwH,UAAUH,EAAWrH,EAAIpF,QAAQ8M,OAE/CH,GACR,IAAK,UAED,OADA/a,EAASmb,KAA0B3H,EAAIwH,UAAUH,EAAY,EAAGrH,EAAIpF,UAC7D,CAAC7N,MAAM,GAClB,IAAK,aACD,OAAI6a,OAEO,CAAC9a,MADM,CAACkH,SAASwL,QAAgB,oCAAqC,0DAIjFqI,OACO,CAAC9a,MAAM,IAClB,IAAK,SAAU,CAEX,GAAI0V,EAAKR,YAAcQ,EAAKP,QAExB,OADA1V,EAASqb,KAAgC,kFAAmFpF,EAAKR,WAAYQ,EAAKP,UAC3I,CAACnV,MAAM,GAElB,MAAMyK,GAAUsQ,QAAkBxZ,IAAU,GAC5C,GAAIkJ,EAAQvG,OAASmT,qBAEjB,OADAyD,KAA2CrQ,GACpC,CAACzK,MAAM,GAElB,GACIyK,EAAQvG,OAASmT,iBACjB5M,EAAQvG,OAASmT,gBACnB,CACE,MAAMzB,GAAgBC,QAAiBtU,GACvC,IAAIkH,EACA4N,EACA5L,EAAQvG,OAASmT,iBACjB5O,GAAOuS,QAAyBvQ,GAChC4L,EAAWgB,gDAEX5O,EAAOgC,EAAQtK,GACfkW,EAAWgB,8CAEf,MAAM4D,GAAgB9D,QAAiB5V,GACjC2Z,GAAkBC,QAA8B5Z,EAAO0Z,GACvDG,GAAUC,QAA0B9Z,GAQ1C,OAPAqT,SAAA,UAAuBwG,EAAvB,qBAA2CF,IAE3Czb,GAASiX,QAAgBd,EAAe,CAAC,CAACS,WAAU5N,OAAMkO,QAASf,EAAexM,MAAO,aACrFkS,QAAkB/Z,EAAOkJ,EAAQtK,KACjCV,GAAS8b,QAAkB9Q,EAAQtK,KAGhC,CAACH,MAAM,GAElB,MAEJ,IAAK,YAED,OADAP,GAASwU,OAAU,CAACC,QAASC,mBAAgCC,WAAYoH,IAAmBnH,YAAa,CAACoH,0BAA0B,MAC7H,CAACzb,MAAM,GAClB,IAAK,YACL,IAAK,UACDP,EAASmb,QACTnb,EAASmb,QAGb,IAAIc,OAAYna,GAAQ,CACpB,MAAMoa,EAAiB,IAAMhc,IACvBic,EAAsBC,IACjB,CAAC9b,MAAO,CAACkH,QAAS4U,KAEvBC,EAAS,IAAIC,KAAiB,CAACtc,WAAUE,SAAUgc,GAAwBK,KAAUtG,EAAKR,WAAYQ,EAAKuG,QAASvG,EAAKP,SAC/H,GAAI2G,EAAOI,aAAajJ,GACpB,IACI,MAAM,KAACG,EAAD,aAAOtE,SAAsBgN,EAAOK,uBAAuBlJ,GACjE,IAAKG,EACD,OAAOwI,EAAmB9M,GAG9B,MAAMH,QAAYlP,GAAS6T,QAAUF,EAAMG,YAAqByI,OAEhE,GAAIrN,EAAI5O,MAEJ,OAAO6b,EADejN,EAAI5O,MACcA,OAASic,mBAAuB,CACpE7b,GAAI,qBACJ+N,eAAgB,oBAIxB,MAAMuB,EAAWd,EAAI3O,KACrB,OAAQyP,EAASvL,MACjB,KAAKkL,QAID,OAHIK,EAAS+D,UACT/T,GAASgW,QAAwChG,EAAUA,EAAS+D,SAAUkC,IAE3E,CAAC1V,MAAM,GAClB,KAAKoP,UACL,KAAKA,cACD,MAAO,CAACpP,MAAM,GAClB,QACI,OAAO4b,GAAmBQ,SACtBC,OAAE,qCACF,0DACA,CAACnY,KAAMuL,EAASvL,SAG1B,MAAOjE,GACL,OAAO2b,EAAmB3b,EAAIgH,UAAWwL,QAAgB,qBAAsB,oBAK3F,IAAIzS,EACJ,IACIA,QAAakB,oBAAuB+R,EAAKyC,GAC3C,MAAOzV,GACL,MAAO,CAACF,MAAOE,GAGnB,MAAMqc,EAAkBtc,EAAKuc,gBAAiBC,QAAUxc,EAAKuc,eAE7D,MAAmB,YAAftJ,EAAI0H,QACJG,KAAqCwB,EAAkBtc,EAAKuc,cAAgB,KACrE,CAACvc,MAAM,KAGdA,EAAKyc,YACLhd,EAAS,CAACyE,KAAMwY,gCAA6C1c,KAAMA,EAAKyc,aAGxEH,IACItc,EAAKuc,cAAcI,WAAW,KAC9B/H,SAAoB5U,EAAKuc,eAClBvc,EAAKuc,cAAcI,YAAWlI,WACrCG,SAAoB5U,EAAKuc,cAAcK,QAAOnI,UAAa5G,SAE3D6G,OAAOC,KAAK3U,EAAKuc,gBAIlB,CAACvc,MAAM,O,+qBClKP,MAAM6c,UAAqB7U,gBAC/BC,YAAYC,GACfC,MAAMD,GADuB,iBAOjB,KACZG,KAAK8F,SAAS,CAAC4B,MAAM,OANrB1H,KAAK9G,MAAQ,CACTwO,MAAM,GAQPjG,SACH,IAAIgT,EAgBJ,OAfIzU,KAAKH,MAAMqF,WACXuP,EAAezU,KAAKH,MAAMqF,SAAS2E,KAAK3D,GAEhC,gBAAC,gBAAD,CACIhJ,IAAKgJ,EAAQpO,GACbA,GAAIoO,EAAQpO,GACZ4c,KAAMxO,EAAQwO,KACdC,QAASzO,EAAQyO,QACjBC,OAAQ1O,EAAQ0O,OAChBtN,OAAQpB,EAAQoB,OAChBuN,MAAM,OAMlB,gBAAC5M,EAAA,EAAD,CACIC,gBAAiB,2CACjBR,KAAM1H,KAAK9G,MAAMwO,KACjBS,OAAQnI,KAAKmI,OACbC,SAAUpI,KAAKH,MAAMsI,OACrB2M,cAAc,EACdhd,GAAG,eACHwQ,KAAK,UAEL,gBAACL,EAAA,OAAD,CACIsC,QAASvK,KAAKmI,QAEd,gBAAC,IAAD,KACI,gBAAC,IAAD,CACI4M,UAAU,EACVC,UAAWC,KAAsB,2BAA4B,kBAAkB5C,eAE9EoC,GAEL,gC,EAjDHD,E,aAPjBrM,O,qCCgCJ,MAAM/Q,EAAWC,aACXC,EAAWD,aAEV,SAAS6d,EAAsB9S,GAYlC,SAAS+S,EAAgBC,GACrB,MAAMlc,EAAQ5B,IACRW,GAASuV,QAAiBtU,GAC1B8B,EAASoa,EAAKxB,UAAW9E,QAAiB5V,GAC1Cmc,GAAcC,QAAapc,GAC3Bqc,GAAuBC,QAAYtc,KAAWuc,SAC9CC,GAAwBF,QAAYtc,KAAWuc,mBAC/CE,GAASC,QAAmB1c,EAAOkc,EAAKtd,IACxC+d,GAAmBC,QAAoB5c,GAC7C9B,GAAS2e,QAAgBX,EAAKtd,KAE9B,MAAMke,EAAcC,2BAAyChe,EAAQ+C,GACjEgb,IAAgBZ,EAAKhV,OACrB6V,8BAA4Che,EAAQ+C,EAAQgb,GAC5DC,2BAAyChe,EAAQ+C,EAAQoa,EAAKhV,OAK9DiV,GAAeE,GACfne,GAAS8e,QAAeT,SAAeL,EAAKtd,KAG5Cud,GAAeK,GACfte,GAAS8e,QAAeT,mBAAyBL,EAAKtd,KAGtD+d,IACA1G,UAGJ/X,GAASgX,QAAa,CAAC,CACnBvS,KAAMsa,oBACNxe,KAAMyd,EAAKtd,IACZ,CACC+D,KAAMC,gCACNnE,KAAMyd,EAAKtd,GACXsK,QAASgT,EACTO,OAAQA,GAAU,QAGlBtC,OAAYna,IACZ9B,GAASgf,OAAiBne,EAAQmd,EAAKtd,KAI3CsK,EAAQiU,KAzDZ9e,eAAsC6d,EAAe3d,EAAsC6e,GACvF,MAAMpd,EAAQ5B,IACRiW,GAAgBC,QAAiBtU,GACjCqd,EAActB,KAA+BG,GAC7C9O,QAAYkQ,QAAoBjJ,EAAegJ,EAAnCC,CAAgDpf,EAAUE,GACxE,SAAUgP,EAwDN6O,EAvDI7O,EAAI3O,MA0DR4U,SAAoB,KAN5BkK,CACIrU,GASJ+S,EAAgB/S,GAIjB,SAASsU,EAA6B7G,EAAmB8G,EAAe7I,KAAKD,OAChF,MAAO,CACHhS,KAAMC,mCACN+Q,WAAYgD,EACZ+G,eAAgBD,GAIjB,SAASE,IACZzf,GAAS0f,WAGN,SAASC,IACZC,qBAA+B,CAC3Bnb,KAAMC,4BACNiF,OAAO,IAYR,SAASkW,EAA2B7U,GACvC4U,qBAA+B,CAC3Bnb,KAAMC,sCACNiF,OAAO,EACPqB,YAID,SAAS8U,EAAuBC,GACnCH,qBAA+B,CAC3Bnb,KAAMC,kCACNiF,OAAO,EACPoW,WAWD,SAASC,EAA6BhV,GACzC4U,qBAA+B,CAC3Bnb,KAAMC,wCACNiF,MAAOqB,IAIR,SAASiV,EAAuBnS,GACnC,MAAMoS,EAAmB,CACrBC,QAASzL,oBACTC,WAAYyI,EACZxI,YAAa,CACT9G,aAIR9N,GAASwU,OAAU0L,IAGhB,SAAS1K,EAAkBhO,EAAiBiR,EAAoB2H,EAAmBvf,GACtF,MAAO,CAACwf,EAA0BC,KAC9B,MAAMC,EAAY1C,OACZtI,EAAO,CACT7U,GAAImd,OACJ3G,QAASrW,GAAU,IACnB4U,WAAYgD,IAAaiG,QAAoB4B,KAC7C9Y,UACA/C,KAAM+b,eACNC,UAAWF,EACXG,UAAWH,EACX7K,QAAS0K,EACT3X,MAAO,IAGX,OAAO4X,GAAWM,QAAcpL,KAIjC,SAASqL,EAA8Bxf,EAAmByf,EAAuBC,EAAqBrI,EAAmBsI,EAAa,GAAIR,GAC7I,MAAMhL,EAAO,CACT7U,GAAImd,OACJ3G,QAAS9V,EAAKV,GACd+U,WAAYgD,IAAaiG,QAAoBxe,KAC7CsH,QAAS,GACT/C,KAAM+b,8BACNC,UAAWF,EACXG,UAAWH,EACX7K,QAASqL,EACTtY,MAAO,CACHoC,SAAUzJ,EAAKyJ,SACfgW,gBACAC,gBAIR9gB,GAAS2gB,QAAcpL,IAG3B,IAAIyL,EAAqB,EAClB,SAASC,EAAyBxI,EAAmByI,GAoBxD,OAAOlhB,GAnBYG,MAAOghB,EAA8BC,KACpD,MAAMtf,EAAQsf,IACRld,GAASmd,QAAUvf,GACnB8a,EAAIlG,KAAKD,MACT6K,GAAQC,QAAuBzf,GAC/B0f,EAAmBF,EAAQA,EAAMG,aAAe,EAEhDC,EAA2C7D,KAAqB3Z,EAAOyd,0CACvEC,EAA6B/D,KAAqB3Z,EAAO2d,4BAQ/D,OANMjF,EAAIoE,EAAsBU,GAC3BF,EAAmBI,GAAoE,SAApC1d,EAAO4d,2BAC3DC,eAA2BtJ,EAAWyI,GACtCF,EAAqBpE,GAGlB,CAACrc,MAAM,MAMf,SAASqC,GAAuBof,EAAa,IAAKC,GAAqB,EAAMC,GAAa,GAGzFA,GACArD,oBAAiC,GAGrC7e,GAASmiB,WAAU1R,MAAK,KAChBwR,GACAG,mBAGJA,aACAC,UACAC,QAEAC,SAEApN,SAAoB6M,MACrBQ,OAAM,KACLrN,SAAoB6M,MAIrB,SAASS,KACZ,OAAQpC,IACJA,GAAWX,WACXW,GAAWqC,WACXrC,GAAWsC,YAIZ,SAASC,GAAiBC,GAC7B7iB,EAAS,CACLyE,KAAMC,0BACNme,UAID1iB,eAAe2iB,GAAoC1hB,EAAmB2hB,GACzE,IAAIjhB,EAAQ5B,IACR8K,EAAU,KAEd,MAAMgY,GAAWC,QAAgBnhB,EAAOihB,EAAKriB,IAC7C,IAAKsiB,GAA6C,IAAjC9U,OAAOC,KAAK6U,GAAU5U,OACnC,OAAO,KAGX,IAAI8U,GAAeC,QAAyBrhB,EAAOihB,EAAKriB,IACnDwiB,GAAqD,IAArChV,OAAOC,KAAK+U,GAAc9U,eAErCpO,GAASojB,QAA0BL,EAAKriB,KAC9CoB,EAAQ5B,IACRgjB,GAAeC,QAAyBrhB,EAAOihB,EAAKriB,KAGxD,MAAM2V,EAAcwI,2BAAyCzd,EAAKV,GAAIqiB,EAAKriB,IAQ3E,IAAI2iB,EAoBJ,OA3BArY,EAAUkY,EAAa7M,QAEA,IAAZrL,IAEPA,GADesY,QAAqBxhB,GACnB+N,MAAM0T,GAAkBA,EAAcva,OAASqN,KAIhErL,IACAqY,GAAgB7E,QAAmB1c,EAAOkJ,EAAQtK,KAGjDsK,GAAYqY,UAEPrjB,GAASwjB,QAA4BT,EAAK/Z,KAAMqN,IACtDvU,EAAQ5B,IACRgjB,GAAeC,QAAyBrhB,EAAOihB,EAAKriB,IACpDsK,EAAUkY,EAAa7M,GACvBgN,GAAgB7E,QAAmB1c,EAAOkJ,GAAWA,EAAQtK,KAG5DsK,GAAYqY,IAEbrY,EAAUkY,GADoBxH,QAA8B5Z,EAAOihB,EAAKriB,KAExE2iB,GAAgB7E,QAAmB1c,EAAOkJ,GAAWA,EAAQtK,KAG7DsK,GAAWqY,EACJrY,EAEJ,KAGJ7K,eAAesjB,KAClB,IAAI3hB,EAAQ5B,IAGRkB,GAAOsiB,QAAe5hB,GAS1B,IARuB+b,MAAoB8F,QAAmB7hB,MAAYV,WAGhEpB,GAAS4jB,WACf9hB,EAAQ5B,IACRkB,GAAOsiB,QAAe5hB,KAGrBV,EACD,OAGJ,MAAMyiB,GAASC,OAAiBhiB,GAC1B8B,EAASib,sBAAoCzd,EAAKV,IAExD,IAMIqiB,EANAgB,GAAUC,QAAWliB,GACzB,GAAuB,IAAnBiiB,EAAQ3V,OAAZ,CAUA,GAJIxK,IACAmf,GAAOkB,QAAQniB,EAAO8B,IAGtBmf,GAA2B,IAAnBA,EAAKmB,UAAiB,CAC9B,MAAMlZ,QAAgB8X,GAAoC1hB,EAAM2hB,GAChE,GAAI/X,EAGA,OAFAhL,GAASmkB,QAAcnZ,EAAQtK,UAC/ByU,SAAA,WAAwB4N,EAAK/Z,KAA7B,qBAA8CgC,EAAQhC,OAK9D+a,GAAUK,OAAgCL,EAASF,GAEnD,IAAK,MAAMQ,KAAUN,EAAS,CAE1B,MAAM/Y,QAAgB8X,GAAoC1hB,EAAMijB,GAChE,GAAIrZ,EAGA,OAFAhL,GAASmkB,QAAcnZ,EAAQtK,UAC/ByU,SAAA,WAAwBkP,EAAOrb,KAA/B,qBAAgDgC,EAAQhC,OAKhEmM,SAAoB,qBA9BhBA,SAAoB,kB,6BC7WrB,SAASmP,EAA4BC,GACxC,OAAOpkB,MAAOH,EAAUE,KACpB,MAAMskB,EAAQtkB,IAAWukB,QAAQC,WAAWC,oBAC5C,IAAKH,GAA0B,IAAjBA,EAAMpW,OAChB,MAAO,CAAC7N,KAAMgkB,GAGlB,IAAIhP,EAAOgP,EAEX,IAAK,MAAMK,KAAQJ,EAAO,CACtB,MAAMnN,QAAeuN,EAAKA,KAAKrP,GAE/B,GAAI8B,EAAQ,CACR,GAAIA,EAAO/W,MACP,MAAO,CACHA,MAAO+W,EAAO/W,OAItBiV,EAAO8B,EAAO9B,MAItB,MAAO,CAAChV,KAAMgV,IAIf,SAASsP,EAAiCC,EAAiBC,GAC9D,OAAO5kB,MAAOH,EAAUE,KACpB,MAAMskB,EAAQtkB,IAAWukB,QAAQC,WAAWM,yBAC5C,IAAKR,GAA0B,IAAjBA,EAAMpW,OAChB,MAAO,CAAC7N,KAAM,CAACiH,QAASsd,EAAiB7O,KAAM8O,IAGnD,IAAIvd,EAAUsd,EACV7O,EAAO8O,EAEX,IAAK,MAAMH,KAAQJ,EAAO,CACtB,MAAMnN,QAAeuN,EAAKA,KAAKpd,EAASyO,GAExC,GAAIoB,EAAQ,CACR,GAAIA,EAAO/W,MACP,MAAO,CACHA,MAAO+W,EAAO/W,OAStB,GALAkH,EAAU6P,EAAO7P,QACjByO,EAAOoB,EAAOpB,KAIqB,IAA/B/H,OAAOC,KAAKkJ,GAAQjJ,OACpB,OAKZ,MAAO,CAAC7N,KAAM,CAACiH,UAASyO,U,4rCCbzB,SAASgP,IACZ,OAAQjlB,IACJA,EAAS,CACLyE,KAAMC,wBACNnE,MAAM2kB,aAKX,SAASC,IACZ,OAAOhlB,MAAOH,EAAUE,KACpB,MAAM4B,EAAQ5B,IACRklB,GAAiB9J,QAAkBxZ,IAAU,GAC7CujB,GAAiBC,QAAgCxjB,GACjDyhB,GAAgBgC,QAAyCzjB,GACzD0jB,EAAWtX,OAAOuX,OAAO,GAAIJ,EAAgB9B,GAEnD,IAAImC,GAAoBnP,QAAiBiP,GAAUG,QAAyB7jB,IAM5E,OAJIsjB,EAAe1kB,KAAOglB,EAAkBhlB,KACxCglB,GAAoBnP,QAAiBiP,GAAU9J,QAA8B5Z,GAAO4V,QAAiB5V,MAGlG9B,EAAS+d,EAAgB2H,KAIjC,SAASE,EAAoBnN,GAChC,OAAOtY,MAAOH,EAAUE,KACpB,MAAM4B,EAAQ5B,IAEd,OAAOF,EAAS+d,GADApG,QAAW7V,EAAO2W,MAKnC,SAASsF,EAAgB/S,GAC5B,OAAO7K,MAAOH,EAAUE,KACpB,MAAM4B,EAAQ5B,IACRyb,GAAUC,QAA0B9Z,GAE1C,GAAIkJ,EAAQiU,MAAQjU,EAAQnK,OAAQ,CAChC,MAAMgK,EAAWG,EAAQnK,OAASmK,EAAQhC,KAAOgC,EAAQC,aACnD7J,GAAOykB,QAAkB/jB,EAAO+I,GACtC,IAAKzJ,EACD,MAAO,CAACd,OAAO,GAInB,UADqBN,GAASkW,QAA0B9U,EAAKV,MAClDJ,MACP,MAAO,CAACA,OAAO,GAEnB6U,SAAA,UAAuBwG,EAAvB,sBAA4C3Q,EAAQhC,YACjD,GAAIgC,EAAQvG,OAASmT,gBAAsB,CAC9C,MAAMkO,GAAYnO,QAAW7V,EAAOkJ,EAAQtK,IAC5CyU,SAAA,UAAuBwG,EAAvB,qBAA2CmK,EAAU9c,YAErDmM,SAAA,UAAuBwG,EAAvB,qBAA2C3Q,EAAQhC,OAGvD,MAAO,CAACzI,MAAM,IAIf,SAASwlB,EAAgBtN,GAC5B,OAAOtY,MAAOH,EAAUE,KACpB,MAAM4B,EAAQ5B,IACRiW,GAAgBC,QAAiBtU,GACjC0Z,GAAgB9D,QAAiB5V,GAEvC,OAAO9B,GAASgmB,QAAY7P,EAAeqF,EAAe/C,KAI3D,SAASwN,EAAaxN,GACzB,OAAOtY,MAAOH,EAAUE,KACpB,IAAI4B,EAAQ5B,IACZ,MAAMiW,GAAgBC,QAAiBtU,GACjCokB,GAAcC,QAAerkB,GAC7BkJ,GAAU2M,QAAW7V,EAAO2W,IAE9BoD,QAAkB/Z,EAAO2W,IACzBzY,GAAS8b,QAAkBrD,IAG/B,MAAMkD,GAAUC,QAA0B9Z,IAErCskB,QAAkBpb,IACnB6T,8BAA4C1I,EAAe+P,EAAYxlB,GAAIoB,GAE/E,MAAM,MAACxB,SAAeN,GAASqmB,QAAkB5N,IACjD,GAAInY,EACA,MAAO,CAACA,SAEZwB,EAAQ5B,IAER,MAAMomB,EAAkBzH,2BAAyC1I,EAAe+P,EAAYxlB,GAAIoB,GAC1FujB,GAAiBC,QAAgCxjB,GACjDykB,GAAchQ,QAAiB8O,EAAgBiB,GAcrD,OAbKC,IAAgBlO,QAAwBvW,GAAOykB,EAAY7lB,KAC5Dme,8BAA4C1I,EAAe+P,EAAYxlB,GAAIoB,GAGmD,KAA9H0kB,QAActmB,KAAYgQ,QAAQoI,GAAMA,EAAE7T,OAASmT,mBAA0BU,EAAE7T,OAASmT,uBAA2BxJ,QACnHyQ,8BAA4C1I,EAAe+P,EAAYxlB,GAAIoB,GAC3E9B,GAASymB,QAAW,KACpBzmB,EAAS,CAACyE,KAAMiiB,gBAAsBnmB,KAAM2lB,IAC5C/Q,SAAoB,MAEpBA,SAAoBwG,GAGjB,CACHpb,MAAM,IAKX,SAASomB,EAAmBtQ,GAC/B,OAAOlW,MAAOH,EAAUE,KACpB,MAAM4B,EAAQ5B,IACRiW,GAAgBC,QAAiBtU,GAWvC,OAVc8kB,QAAa9kB,GACrB4L,SAASwY,IACX,MAAMW,EAAkBhI,2BAAyC1I,EAAe+P,EAAYxlB,GAAIoB,GAC1FglB,EAAqBjI,8BAA4C1I,EAAe+P,EAAYxlB,GAAIoB,GAClGuU,IAAgBwQ,EAChBhI,8BAA4C1I,EAAe+P,EAAYxlB,GAAIoB,GACpEuU,IAAgByQ,GACvBjI,iCAA+C1I,EAAe+P,EAAYxlB,GAAIoB,MAG/E,CACHvB,MAAM,IAKX,SAASwmB,EAA2BC,EAAQvO,GAC/C,MAAMwO,GAA0BC,SAChC,OAAO/mB,MAAOH,EAAUE,KACpB,MAAM4B,EAAQ5B,IACRsb,GAAgB9D,QAAiB5V,GAEjCqlB,QAAgBnnB,GAASqL,QAAkB2b,EAAQxL,EAAe/C,IAClElY,EAAO4mB,EAAQ5mB,KACrB,OAAIA,EACA,OACO4mB,GADP,IAEI5mB,KAAM,EAAF,KACGA,GADH,IAEAqG,MAAOqgB,EAAwBnlB,EAAOvB,EAAKqG,OAAS,IACpDwgB,eAAgBH,EAAwBnlB,EAAOvB,EAAK6mB,gBAAkB,QAK3ED,GAIR,SAASE,EAAY5O,EAAW6O,GAAW,GAC9C,OAAOnnB,UACH,MAAMonB,EAAO7Q,KAAKD,MACd6Q,GACAtnB,EAAS,CACLyE,KAAMC,gCACN+T,YACAgC,OAAQ+M,eAGhB,MAAM,KAACjnB,EAAD,MAAOD,SAAeN,EAASmb,KAA2B1C,IAChE,GAAInY,EAQA,OAPIgnB,GACAtnB,EAAS,CACLyE,KAAMC,gCACN+T,YACAgC,OAAQ+M,eAGT,CACHlnB,QACAmnB,iBAAiB,EACjBC,iBAAiB,GAGzB1nB,GAAS2nB,QAAkCpnB,EAAKqnB,QAEhD,MAAM1c,EAAU,GAwBhB,OAvBAA,EAAQ2c,KAAK,CACTpjB,KAAMC,8BACNnE,KAAMkY,EACNqP,OAAQvnB,EAAKwnB,MAAM3Z,SAGnBkZ,GACApc,EAAQ2c,KAAK,CACTpjB,KAAMC,gCACN+T,YACAgC,OAAQ+M,eAIU,KAAtBjnB,EAAKynB,cACL9c,EAAQ2c,KAAK,CACTpjB,KAAMC,wCACN+T,YACA8O,SAIRvnB,GAASgX,QAAa9L,IACf,CACHuc,gBAAuC,KAAtBlnB,EAAKynB,aACtBN,gBAAuC,KAAtBnnB,EAAK0nB,eAK3B,SAASC,EAAgBzP,EAAW0P,GACvC,OAAOhoB,UACH,MAAM,KAACI,EAAD,MAAOD,SAAeN,EAASmb,KAA2B1C,EAAW0P,EAAeC,qBAAwB,IAClH,OAAI9nB,EACO,CACHA,QACAmnB,iBAAiB,EACjBC,iBAAiB,IAIzB1nB,EAAS,CACLyE,KAAMC,8BACNnE,KAAMkY,EACNqP,OAAQvnB,EAAKwnB,MAAM3Z,SAEhB,CACHqZ,gBAAuC,KAAtBlnB,EAAKynB,aACtBN,gBAAuC,KAAtBnnB,EAAK0nB,gBAK3B,SAASI,EAAgB5P,GAC5B,OAAOtY,UACH,MAAMonB,EAAO7Q,KAAKD,OACZ,KAAClW,EAAD,MAAOD,SAAeN,EAASmb,KAAqB1C,EAAW,EAAG2P,qBAAwB,IAEhG,OAAI9nB,EACO,CACHA,QACAmnB,iBAAiB,EACjBC,iBAAiB,IAIzB1nB,EAAS,CACLyE,KAAMC,wCACN+T,YACA8O,SAGG,CACHhnB,OACAknB,gBAAuC,KAAtBlnB,EAAKynB,aACtBN,gBAAuC,KAAtBnnB,EAAK0nB,gBAK3B,SAASK,GAAU,UAAC7P,EAAD,OAAY8P,EAAZ,KAAoB9jB,IAE1C,OAAOtE,UACH,MAAMqoB,EAAuB5Q,qBAA4B,EASzD,IAAIP,EAPJrX,EAAS,CACLyE,KAAMC,mBACNnE,MAAM,EACNkY,cAMApB,EADA5S,IAASgkB,qBACMzoB,EAASmb,KAA2B1C,EAAW8P,EAHrD,EAGmEC,UAE7DxoB,EAASmb,KAA0B1C,EAAW8P,EALpD,EAKkEC,IAG/E,MAAM,KAACjoB,GAAQ8W,EAETnM,EAAU,CAAC,CACbzG,KAAMC,mBACNnE,MAAM,EACNkY,cAGJ,OAAIpB,EAAO/W,MACA,CACHA,MAAO+W,EAAO/W,MACdooB,YAAY,IAIpB1oB,GAAS2nB,QAAkCpnB,EAAKqnB,QAChD1c,EAAQ2c,KAAK,CACTpjB,KAAMC,8BACNnE,KAAMkY,EACNqP,OAAQvnB,EAAKwnB,MAAM3Z,SAGvBpO,GAASgX,QAAa9L,IAEf,CACHwd,WAAYjkB,IAASgkB,eAAmD,KAAtBloB,EAAK0nB,aAA4C,KAAtB1nB,EAAKynB,gBAKvF,SAASW,EAAmBlQ,EAAWmQ,EAAOtB,GAAW,GAC5D,OAAOnnB,MAAOH,EAAUE,KACpB,MAAMqnB,EAAO7Q,KAAKD,MACZ3U,EAAQ5B,IACR2oB,GAAeC,OAAgBhnB,GACrC,IAAIinB,EAAsBH,EAC1B,MAAMI,GAA6BC,OAA8BnnB,EAAO2W,GAClEvN,EAAU,GAEZ8d,GAA8BA,EAA6BH,EAAaK,mBACxEH,EAAsBC,GAGtB1B,GACAtnB,EAAS,CACLyE,KAAMC,gCACN+T,YACAgC,OAAQ+M,eAIhB,MAAM,KAACjnB,EAAD,MAAOD,SAAeN,EAASmb,KAA0B1C,EAAWsQ,IA2B1E,OA1BIxoB,GACA2K,EAAQ2c,KAAK,CACTpjB,KAAMC,wCACN+T,YACA8O,SAIJD,IACIhnB,EACA4K,EAAQ2c,KAAK,CACTpjB,KAAMC,gCACN+T,YACAgC,OAAQ+M,eAGZtc,EAAQ2c,KAAK,CACTpjB,KAAMC,gCACN+T,YACAgC,OAAQ+M,gBAKpBxnB,GAASgX,QAAa9L,IAEf,CAAC3K,OAAMD,UAIf,SAAS6oB,EAAqB1Q,EAAW2Q,GAC5C,OAAOjpB,MAAOH,EAAUE,KACpB,MAAM4B,EAAQ5B,IACRmpB,GAAwBC,QAA6BxnB,EAAO2W,GAElE,IAAK3W,EAAMynB,SAAS3B,MAAM4B,eAAe/Q,KAAe4Q,EAIpD,OAHID,SACM,IAAIxQ,SAAS6Q,GAAYC,WAAWD,EAASL,KAEhDppB,EAASqnB,EAAY5O,GAAW,IAG3C,MAAMkR,GAAaC,QAAQ9nB,EAAOunB,GAClC,OAAOrpB,EAAS2oB,EAAmBlQ,EAAWkR,EAAWlJ,WAAW,KAIrE,SAASoJ,IACZ,MAAO,KACHC,SAAkBC,kCAInB,SAASC,EAAyBvR,GACrC,MAAO,CAACzY,EAAUE,MACV+pB,QAAiB/pB,IAAYuY,IAIjCzY,GAASkqB,QAAkBzR,KAI5B,SAAS0R,EAAkB1P,GAC9B,OAAQza,IACJA,EAAS,CACLyE,KAAMC,yBACNnE,KAAMka,O,+ECjcX,MAAM2P,EAAS,IAAOpqB,GAAaA,EAAS,CAC/CyE,KAAMC,kBAGGwQ,EAAO,IAAOlV,GAAaA,EAAS,CAC7CyE,KAAMC,gBAGG2lB,EAAQ,IAAOrqB,GAAaA,EAAS,CAC9CyE,KAAMC,kB,oGCLH,SAAS4lB,EAAqBha,GACjC,MAAO,CACH7L,KAAMC,8BACN4L,QAID,MAAMia,EAAkB,IACpBpqB,MAAOH,EAAwBE,KAClC,MAAMW,GAASuV,QAAiBlW,KAEhCF,EAASsqB,GAAqB,IAE9BtqB,GAASiX,QAAgBpW,EAAQ,CAAC,CAC9BqW,QAASrW,EACT+V,SAAUC,4BACV7N,KAAMwhB,UACN7gB,MAAO,c,6DCrBZ,SAAS8gB,EAAchmB,GAC1B,OAAQzE,IACJA,EAAS,CACLyE,KAAMC,oBACNnE,KAAMkE,IAGH,CAAClE,MAAM,M,oGCHf,SAASmqB,EAASnV,GACrB,OAAOpV,MAAOH,EAAUE,KACpB,MAAMmX,QAAe8D,KAAqB5F,EAArB4F,CAA2Bnb,EAAUE,GAO1D,OAJImX,EAAO/W,OAA0C,0DAAjC+W,EAAO/W,MAAMK,iBAC7BX,GAAS2qB,OAAS,CAAClmB,KAAMmmB,kBAAmCpjB,QAAS6P,EAAO/W,MAAMkH,UAAU,IAGzF6P,GAIR,SAASwT,EAA2BtC,EAAQuC,EAAUC,EAAQC,EAAY1N,EAAM3T,GACnF,OAAOxJ,UACHH,EAAS,CACLyE,KAAMC,mCACN6jB,SACAhoB,KAAM,CACF,CAACuqB,GAAW,CACRxN,OACA3T,YAKZ3J,EAASmb,IAAmCoN,EAAQuC,EAAUC,EAAQphB,IAE/D,CAACpJ,MAAM,M,y35ZCzBf,SAAS0qB,IACZ,OAAO9qB,UAAoB,QAEvB,MAAM+qB,EAAW,CACblrB,GAASmrB,WACTnrB,GAASorB,YAIPC,QAAyBzS,QAAQC,IAAIqS,GAW3C,OAVI9iB,SAAS2iB,OAAOjQ,QAAQ,cAAgB,GACxCuQ,EAAiBxD,WAAW7nB,EAASc,SAIY,UAArC,UAAAuqB,EAAiB,UAAjB,mBAAqB9qB,YAArB,eAA2B+qB,QAEvCD,EAAiBxD,WAAW7nB,GAASurB,YAGlCF,GAIf,MAAMG,EAA2B,GAE1B,SAASC,EAAiClmB,EAAUmmB,GAEvD,OADAF,EAAyBjmB,GAAYmmB,EAC9B,CAAC1rB,EAAUE,KACd,MAAM4B,EAAQ5B,IACR2jB,GAASC,OAAiBhiB,GAC1B6pB,GAAwBC,OAAgB9pB,EAAO+hB,GAC/CgI,EAAe,GACrB3d,OAAOuX,OAAOoG,EAAcF,GACxBA,IACAzd,OAAOuX,OAAOoG,EAAcH,EAAe7H,IAC3C7jB,EAAS,CACLyE,KAAMC,2BACNnE,KAAM,CACFsjB,SACAgI,oBAOb,SAASC,EAAmCvmB,GAC/CwmB,QAAQC,eAAeR,EAA0BjmB,GAG9C,SAAS0mB,EAAiBpI,EAAQqI,GACrC,OAAO/rB,UACH,MAAM0rB,E,+VAAe,CAAH,GAAOM,GAMzB,GALAje,OAAOV,OAAOge,GAA0B9d,SAAS0e,IAC7Cle,OAAOuX,OAAOoG,EAAcO,EAAWvI,OAI5B,OAAXA,EACA,IACI,MAAMwI,QAA2B5qB,qBAAwByqB,GACzDhe,OAAOuX,OAAOoG,EAAcQ,GAC9B,MAAO/rB,GACLgsB,QAAQhsB,MAAMA,GAGtBN,EAAS,CACLyE,KAAMC,2BACNnE,KAAM,CACFsjB,SACAgI,qB,6HC9ET,SAASU,EAAmBtU,GAC/B,MAAO,CACHxT,KAAM+nB,sBACNjsB,KAAM0X,GAIP,SAASwU,EAAgBC,EAAU,IACtC,MAAO,CACHjoB,KAAM+nB,uBACNjsB,KAAMmsB,GAIP,SAASC,EAAkB1U,GAC9B,MAAO,CACHxT,KAAM+nB,0BACNjsB,KAAM0X,GAIP,SAAS2U,EAAmBF,EAAU,IACzC,MAAO,CACHjoB,KAAM+nB,2BACNjsB,KAAMmsB,GAIP,SAASG,EAAqB5U,EAAM8K,EAAO,GAAI7S,EAAS,IAC3D,MAAO,CACHzL,KAAM+nB,6BACNjsB,KAAM,CAAC0X,OAAM8K,OAAM7S,WAIpB,SAAS4c,EAAkB7U,GAC9B,MAAO,CACHxT,KAAM+nB,0BACNjsB,KAAM0X,GAIP,SAAS8U,EAAqB9U,GACjC,MAAO,CACHxT,KAAM+nB,6BACNjsB,KAAM0X,GAIP,SAAS+U,EAAsBN,EAAU,IAC5C,MAAO,CACHjoB,KAAM+nB,8BACNjsB,KAAMmsB,K,yFCrDP,SAASO,EAA8BC,GAC1C,MAAO,CACHzoB,KAAMC,wCACNwoB,eAID,SAASC,EAA2BD,GACvC,MAAO,CACHzoB,KAAMC,qCACNwoB,eAID,SAASE,EAAuCF,GACnD,MAAO,CACHzoB,KAAMC,mDACNwoB,eAID,SAASG,EAA8BH,GAC1C,MAAO,CACHzoB,KAAMC,yCACNwoB,iB,0ZCjBD,SAASI,IACZ,OAAOntB,MAAOH,EAAwBE,KAClC,MAAM4B,EAAQ5B,IACd,IAAIqtB,EACJ,IACI,MAAMC,QAAoBxtB,GAASytB,WACnCF,EAAa,IAAIG,IAAKF,EAAoBjtB,MAC5C,MAAOC,GACL,MAAO,CAACF,MAAOE,GAEnB+sB,EAAWI,KAAIvX,QAAiBtU,IAEhC,MAAM8rB,EAAW1f,OAAOC,MAAK0f,QAAS/rB,IAChCgsB,EAAgB,IAAIJ,IAAIE,EAAS1d,QAAQ6d,IAAOR,EAAWS,IAAID,MAE/D7iB,EAAU,GAChB,IAAK,MAAM+iB,KAAgBH,EAActgB,SACrCtC,EAAQ2c,KAAK,CAACpjB,KAAMypB,+BAAqC3tB,KAAM,CAAC2W,QAAS+W,KAM7E,OAJI/iB,EAAQkD,OAAS,GACjBpO,GAASgX,QAAa9L,IAGnB,CAAC3K,MAAM,I,+eChBP,MAAM4tB,WAAgC5lB,gBACjDC,YAAYC,GACRC,MAAMD,GADgB,kBAMjB,KACLG,KAAK8F,SAAS,CAAC4B,MAAM,OAJrB1H,KAAK9G,MAAQ,CAACwO,MAAM,GAOxBjG,SACI,IAAIgM,EACA+X,EAsBJ,OApBA/X,EACI,gBAAC,KAAD,CACI3V,GAAG,8BACH+N,eAAe,gBAGnB7F,KAAKH,MAAM4N,cACXA,EAAczN,KAAKH,MAAM4N,aAG7B+X,EACI,gBAAC,KAAD,CACI1tB,GAAG,0BACH+N,eAAe,YAGnB7F,KAAKH,MAAM2lB,UACXA,EAAUxlB,KAAKH,MAAM2lB,SAGQ,KAA7BxlB,KAAKH,MAAM0N,cACJ,KAIP,gBAACtF,EAAA,EAAD,CACIC,gBAAgB,cAChBR,KAAM1H,KAAK9G,MAAMwO,KACjBS,OAAQnI,KAAKmI,OACbC,SAAUpI,KAAKH,MAAMsI,OACrBG,KAAK,SACLC,kBAAgB,+BAEhB,gBAACN,EAAA,SAAD,CAAcU,aAAa,GACvB,gBAACV,EAAA,QAAD,CACIa,eAAe,KACfhR,GAAG,+BAEH,gBAAC,KAAD,CACIA,GAAG,uBACH+N,eAAe,kBAEnB,wBAAM7E,UAAU,QACXyM,KAIb,gBAACxF,EAAA,OAAD,KACI,yBACI,gBAAC,KAAD,CACInQ,GAAG,0BACH+N,eAAe,uCACfjB,OAAQ,CACJ4gB,UACApjB,QAAUqL,OAK1B,gBAACxF,EAAA,SAAD,KACI,0BACIpM,KAAK,SACLmF,UAAU,kBACVuJ,QAASvK,KAAKmI,OACdrQ,GAAG,qBAEH,gBAAC,KAAD,CACIA,GAAG,uBACH+N,eAAe,a,GAnFtB0f,G,aAVjBhY,c,sBACApF,O,oBACAsF,Y,WACA+X,Q,aCYJ,UAAerhB,cARf,SAAyBjL,EAAoBusB,GACzC,MAAMD,GAAUE,QAAQxsB,EAAOusB,EAASE,WACxC,MAAO,CACHpY,eAAeC,QAAiBtU,GAChCssB,QAASA,GAAWA,EAAQvjB,YAIpC,CAAwCsjB,I,6sBCiFxC,MAAMnuB,GAAWC,aACXC,GAAWD,aAIXuuB,GAAsB,GAErB,SAASC,KACZ,IAAKxZ,OAAOyZ,UAER,YADApC,QAAQqC,IAAI,sCAIhB,MAAMzqB,GAASmd,QAAUnhB,MACzB,IAAI0uB,EAAU,GACV1qB,EAAO2qB,aACPD,EAAU1qB,EAAO2qB,cAEjBD,EAAU,IAAIE,KAAI9Z,WAGO,WAArB4Z,EAAQG,SACRH,EAAQG,SAAW,OAEnBH,EAAQG,SAAW,MAIjB,QAASC,KAAKJ,EAAQK,QACC,SAArBL,EAAQG,SACRH,EAAQK,MAAQ,IAAM/qB,EAAOgrB,oBAE7BN,EAAQK,MAAQ,IAAM/qB,EAAOirB,eAIrCP,EAAUA,EAAQvlB,YAIlBulB,EAAQxgB,OAAS,GAAqC,MAAhCwgB,EAAQA,EAAQxgB,OAAS,KAC/CwgB,EAAUA,EAAQ5T,UAAU,EAAG4T,EAAQxgB,OAAS,IAGpDwgB,GAAWntB,qBAA0B,aAErCsgB,qBAAiCqN,IACjCrN,4BAAwCsN,IACxCtN,0BAAqC,IAAMuN,IAAU,KACrDvN,4BAAuC,IAAMuN,IAAU,KACvDvN,qBAAiCwN,IACjCxN,eAA2B6M,GAGxB,SAASvE,KACZtI,YAQJ,MAAMyN,GAA0B,GAEzB,SAASC,GAA+BlqB,EAAUmqB,GACrDF,GAAwBjqB,GAAYmqB,EAGjC,SAASC,GAAiCpqB,GAC7CwmB,QAAQC,eAAewD,GAAyBjqB,GAG7C,SAAS+pB,GAAUM,GAAmB,GACrCA,IAfJvF,KACAoE,MAkBAzuB,GAAS,CACLyE,KAAMorB,sBACNtP,UAAW7J,KAAKD,SAGpBqZ,UAEA5hB,OAAOV,OAAOgiB,IAAyB9hB,SAASgiB,IACxCA,GAA8B,mBAAZA,GAClBA,OAIR,MAAM5tB,EAAQ5B,KACRsb,EAAgB1Z,EAAMynB,SAASwG,MAAMvU,cAC3C,GAAIA,EAAe,CACf,MAAMrF,GAAgBC,QAAiBtU,GACjC2c,GAAmBC,QAAoB5c,GACvCkuB,GAAe1G,QAA6BxnB,EAAO2c,GACnDwR,GAAiBrG,QAAQ9nB,EAAOkuB,GAEtChwB,IAASuX,WACTvX,GAASkwB,MAGLlwB,GADAiwB,GACStH,QAAmBlK,EAAkBwR,EAAexP,YAIpD0P,QAAS1R,IAEtB2R,OAEA,MAAMC,GAAaC,QAA0BxuB,GAC7C9B,GAASoF,KAA6BirB,GAAY,IAC9CA,GACArwB,IAASuwB,QAAapa,EAAeqF,EAAe,CAACgV,QAAQ,EAAMC,QAAS,OAIhF3uB,EAAM4uB,UAAUxH,kBAChBlpB,IAAS2wB,WAGb3wB,ICpNOG,UACHH,EAAS,CACLyE,KAAMC,+BDmNd1E,IAAS4wB,WAGb,IAAIC,GAAa,GAGV,SAASC,KACZC,cAAcF,IAEdA,GAAaG,aACT,KACsC,OAA9BtN,QAAexjB,OACfovB,IAAU,KARS,KAe5B,SAAS2B,KACZF,cAAcF,IAGX,SAASK,GAA6B3rB,EAAU4rB,EAAO3T,GACrDgR,GAAoBjpB,KACrBipB,GAAoBjpB,GAAY,IAEpCipB,GAAoBjpB,GAAU4rB,GAAS3T,EAGpC,SAAS4T,GAA+B7rB,EAAU4rB,GACrD,MAAME,EAAS7C,GAAoBjpB,GAC9B8rB,GAILtF,QAAQC,eAAeqF,EAAQF,GAG5B,SAASG,GAAmC/rB,GAC/CwmB,QAAQC,eAAewC,GAAqBjpB,GAGhD,SAAS8pB,KACLrvB,IAASgX,QAAa,CAClB,CACIvS,KAAMorB,sBACNtP,UAAW7J,KAAKD,QAEpBma,aAIR,SAASrB,GAAYgC,GACbA,EA9KoB,GA+KpBvxB,IAAS2qB,OAAS,CAAClmB,KAAM,WAAY+C,QAASgqB,4BAA+C,IAEjGxxB,IAASgX,QAAa,CAClB,CACIvS,KAAMorB,sBACNtP,UAAW7J,KAAKD,OCzRjBtW,UACHH,EAAS,CACLyE,KAAMC,oCD6RX,SAAS0qB,GAAY5b,GACxB,OAAQA,EAAI2d,OACZ,KAAKM,YACL,KAAKA,uBACDC,GAA4Ble,GAC5B,MAEJ,KAAKie,kBAuWF,SAA6Bje,GAEhC,MAAM+B,EAAOpO,KAAKwqB,MAAMne,EAAIjT,KAAKgV,MACjCvV,IAAS4xB,QAAarc,KAEtBsc,QAA+B,CAACtc,GAAOvV,GAAUE,IACjD,MAAMue,GAAmBC,QAAoBxe,MAGzCue,IAAqBjL,EAAIse,UAAUrc,aACnCzV,IAAS2e,QAAgBF,IACrBxJ,OAAO8c,UACP/xB,IAASgyB,QAAYvT,KAlXzBwT,CAAoBze,GACpB,MAEJ,KAAKie,mBAoXT,SAA+Bje,GAC3B,MAAM+B,EAAOpO,KAAKwqB,MAAMne,EAAIjT,KAAKgV,MACjCvV,IAASkyB,QAAY3c,IACjBA,EAAK4c,WACLnyB,IAAS2e,QAAgBpJ,EAAKE,aAvX9B2c,CAAsB5e,GACtB,MAEJ,KAAKie,kBAwXF,SAA+Bje,GAClCxT,GACI,CACIyE,KAAMC,yBACNnE,KAAM,CACFgf,aAAc/L,EAAIjT,KAAKif,eACvB/G,UAAWjF,EAAIse,UAAUrc,WACzB4c,SAAU7e,EAAIjT,KAAK+xB,UACnBC,aAAc/e,EAAIjT,KAAKiyB,eACvBC,aAAcjf,EAAIjT,KAAKmyB,cACvBC,iBAAkBnf,EAAIjT,KAAKqyB,sBAjYnCC,CAAsBrf,GACtB,MAEJ,KAAKie,iBA2YF,SAA8Bje,GACjC,MAAM1R,EAAQ5B,KAERgL,EAAU,CACZ,CACIzG,KAAMypB,kCACN3tB,KAAM,CAACG,GAAI8S,EAAIjT,KAAKic,QAAStF,QAAS1D,EAAIjT,KAAK2W,UAEnD,CACIzS,KAAMiiB,6BACNnmB,KAAM,CAACic,QAAShJ,EAAIjT,KAAKic,QAAStF,QAAS1D,EAAIjT,KAAK2W,WAItD4b,GAAkBC,QAAkBjxB,GACpC0jB,EAAYsN,GAAmBA,EAAgBtf,EAAIjT,KAAKic,UAAa,GAE3E,IAAK,MAAMxR,KAAWwa,EAClBta,EAAQ2c,KAAK,CACTpjB,KAAMsa,gCACNxe,KAAM,CAACG,GAAIsK,EAASkM,QAAS1D,EAAIjT,KAAK2W,WAI9ClX,IAASgX,QAAa9L,IACtB,MAAM8nB,GAActP,QAAe5hB,GAEnC,GAAIkxB,EAAYtyB,KAAO8S,EAAIjT,KAAK2W,QAC5BlX,GAAS,CAACyE,KAAMiiB,gBAAsBnmB,KAAM,CAACG,GAAI8S,EAAIjT,KAAKic,YAGtD9E,QAAiB5V,KAAW0R,EAAIjT,KAAKic,UAChCyW,IAAOC,SAASC,SAASjW,WAAW,oBACrCuG,YAGJ2P,QAAQJ,IACRhzB,GAASstB,SAEV,CACH,MAAMvK,GAAOkB,QAAQniB,EAAO0R,EAAIjT,KAAKic,SAC/B6W,GAAUC,QAA4BxxB,GACtCyxB,EAAWrlB,OAAOV,OAAO6lB,GAASG,MAAMjV,GAAWA,EAAO/K,EAAIjT,KAAK2W,WACrE6L,IAAQqQ,QAAQJ,KAAiBO,GACjCvzB,IAASgX,QAAa,CAClB,CACIvS,KAAMypB,+BACN3tB,KAAM,CAAC2W,QAAS1D,EAAIjT,KAAK2W,UAE7B,CACIzS,KAAMiiB,6BACNnmB,KAAM,CAACic,QAASuG,EAAKriB,GAAIwW,QAAS1D,EAAIjT,KAAK2W,cA7bvDuc,CAAqBjgB,GACrB,MAEJ,KAAKie,kBAicT,SAA+Bje,GAC3BxT,GAAS,CAACyE,KAAMiiB,kBAAwBnmB,KAAM4G,KAAKwqB,MAAMne,EAAIjT,KAAKwiB,QAjc9D2Q,CAAsBlgB,GACtB,MAEJ,KAAKie,wBAkcLzxB,GAASoF,QAhcL,MAEJ,KAAKqsB,kBAicT,SAA+Bje,GAC3B,MAAMmgB,EAAcxsB,KAAKwqB,MAAMne,EAAIjT,KAAKwiB,MAClCjhB,EAAQ7B,gBACR,MAAC8vB,GAASjuB,EAAMynB,SAASwG,MAC/B,GACI4D,GACA5D,GACAA,EAAM4D,EAAYjzB,KACkB,IAApCqvB,EAAM4D,EAAYjzB,IAAIwjB,UACxB,OACE,MAAM,cAAC/N,GAAiBrU,EAAMynB,SAAS3iB,OACjC,cAAC4U,EAAD,UAAgBpD,GAAatW,EAAMynB,SAASwG,MAC5C6D,EAAc1lB,OAAOV,OAAO4K,GAC5Byb,EAAaD,EAAY/jB,MAAMikB,GAAMA,EAAE5c,UAAYf,GAAiB2d,EAAEtX,UAAYhB,IAExF,IAAIuY,EAAY,GAChB,GACIJ,GACAE,GACAF,EAAYjzB,KAAOmzB,EAAWrX,QAChC,CACE,MAAMuH,EAAU,IAChBC,QAAWliB,GAAO4L,SAASkP,IACvBmH,EAAQnH,EAAElc,IAAMkc,KAGpB,IAAK,IAAIoX,EAAI,EAAGA,EAAIJ,EAAYxlB,OAAQ4lB,IAAK,CACzC,MAAMC,EAAeL,EAAYI,GAAGxX,QACpC,GACIuH,GACAA,EAAQkQ,IAC4B,IAApClQ,EAAQkQ,GAAc/P,WACtByP,EAAYjzB,KAAOuzB,EACrB,CACEF,EAAYE,EACZ,QAUZ,GALAj0B,IAASgX,QAAa,CAClB,CAACvS,KAAMiiB,2BAAiCnmB,KAAM,CAACG,GAAIizB,EAAYjzB,KAC/D,CAAC+D,KAAMiiB,kBAAwBnmB,KAAMozB,OAGrC,UAAAxe,oBAAA,eAAyBge,YAAzB,+CAA8EQ,EAAYjzB,IAC1F,OAGJ,GAAIqzB,EAAW,CACX/zB,GAAS,CAACyE,KAAMiiB,iBAAuBnmB,KAAMwzB,IAC7C,MAAMG,EAAch0B,KACdub,GAAkBC,QAA8BwY,EAAaH,GACnE5e,SAAA,WAAuBmC,QAAkB4c,GAAzC,qBAAkEzY,SAElEtG,SAAoB,MAvfxBgf,CAAsB3gB,GACtB,MAEJ,KAAKie,oBAoXTtxB,eAAoCqT,SAC1BxT,GAASoF,KAAoBoO,EAAIjT,KAAKic,gBACtCxc,GAASoF,QACf,MAAMtD,EAAQ5B,WACRF,GAASoF,MAA6BkrB,QAA0BxuB,KAvXlEsyB,CAAqB5gB,GACrB,MAEJ,KAAKie,gBACDzxB,GAwgBR,SAA8BwT,GAC1B,OAAOrT,MAAOkgB,EAAYC,KACtB,MAAMxe,EAAQwe,IACRpc,GAASmd,QAAUvf,GACnBuyB,GAAUC,QAAWxyB,GACrByyB,EAAoD,SAAhCrwB,EAAOswB,qBAC3B/V,GAAmBC,QAAoB5c,GACzC2c,IAAqBjL,EAAIse,UAAUrc,aACnC4K,GAAW1B,QAAgBF,IAC3B4B,EAAW,CACP5b,KAAMypB,iCACN3tB,KAAM,CAACG,GAAI8S,EAAIse,UAAUrc,WAAYyB,QAAS1D,EAAIjT,KAAK2W,WAE/B,UAAxBmd,aAAA,EAAAA,EAASI,aAAiD,UAAxBJ,aAAA,EAAAA,EAASK,aAC3CrU,GAAWsU,QAA8BlW,EAAkB8V,KAKnE,MAAM/Y,GAAgB9D,QAAiB4I,KACjCnK,GAAgBC,QAAiBkK,KACnC9E,IAAkBhI,EAAIjT,KAAKic,SAAWrG,IAAkB3C,EAAIjT,KAAK2W,SACjEmJ,EAAWuU,GAA4BphB,EAAIse,UAAUrc,aAInC,SAAlB4e,EAAQ/I,QAAoBuJ,QAAyBvU,MACrDD,GAAW1c,YAniBNmxB,CAAqBthB,IAC9B,MAEJ,KAAKie,mBA+iBFtxB,eAAsCqT,GACzC,MAAM1R,EAAQ5B,KACRklB,GAAiB9J,QAAkBxZ,IAAU,GAC7CkxB,GAActP,QAAe5hB,GAC7BoC,GAASmd,QAAUvf,GACnBuyB,GAAUC,QAAWxyB,GACrByyB,EAAoD,SAAhCrwB,EAAOswB,qBAEjC,GAAIhhB,EAAIse,UAAU5a,UAAY8b,EAAYtyB,GAAI,CAC1CV,IAASuX,WAET,MAAMwd,GAAeC,QAAqBlzB,GACtC0R,EAAIjT,KAAKkV,aAAesf,GACxB/0B,IAAS0f,WAGTlM,EAAIjT,KAAKkV,aAAe2P,EAAe1kB,KACnC8S,EAAIjT,KAAK00B,aAAezhB,EAAIse,UAAU5a,SACtC/B,UAAoByG,QAA0B9Z,UAExC9B,GAAS,CACXyE,KAAMsa,mBACNxe,KAAM,CAACG,GAAI8S,EAAIjT,KAAKkV,WAAYyB,QAAS1D,EAAIse,UAAU5a,cAG9CoX,QAAQxsB,EAAO0R,EAAIjT,KAAK00B,aAEjCj1B,IAASk1B,QAAS1hB,EAAIjT,KAAK00B,aAG/Bj1B,IAASwU,OAAU,CACfC,QAASC,0BACTC,WAAYwZ,GACZvZ,YAAa,CACTyB,YAAa+O,EAAena,aAC5BsjB,UAAW/a,EAAIjT,KAAK00B,qBAItBj1B,GAAS,CACXyE,KAAMsa,mBACNxe,KAAM,CAACG,GAAI8S,EAAIjT,KAAKkV,WAAYyB,QAAS1D,EAAIse,UAAU5a,YAG3DuM,aAIJ2P,QAAQJ,IACRhzB,GAASstB,UAEN9Z,EAAIse,UAAUrc,aAAe2P,EAAe1kB,KACnDV,IAAS2e,QAAgByG,EAAe1kB,KACxCV,GAAS,CACLyE,KAAMypB,qCACN3tB,KAAM,CAACG,GAAI8S,EAAIse,UAAUrc,WAAYyB,QAAS1D,EAAIjT,KAAK2W,WAE/B,UAAxBmd,aAAA,EAAAA,EAASI,aAAiD,UAAxBJ,aAAA,EAAAA,EAASK,aAC3C10B,IAAS20B,QAA8BvP,EAAe1kB,GAAI6zB,KAIlE,GAAI/gB,EAAIse,UAAU5a,UAAY8b,EAAYtyB,GAAI,CAC1C,MAAMsK,GAAU2M,QAAW7V,EAAO0R,EAAIse,UAAUrc,YAC1C4d,GAAUC,QAA4BxxB,GACtCyxB,EAAWrlB,OAAOV,OAAO6lB,GAASG,MAAMjV,GAAWA,EAAO/K,EAAIjT,KAAK2W,WACzE,GAAIlM,IAAWooB,QAAQJ,KAAiBO,EAAU,CAC9C,MAAMroB,EAAU,CACZ,CACIzG,KAAMypB,+BACN3tB,KAAM,CAAC2W,QAAS1D,EAAIjT,KAAK2W,UAE7B,CACIzS,KAAMiiB,6BACNnmB,KAAM,CAACic,QAASxR,EAAQwR,QAAStF,QAAS1D,EAAIjT,KAAK2W,WAG3DlX,IAASgX,QAAa9L,KAI9B,MAAMuN,EAAYjF,EAAIse,UAAUrc,YAAcjC,EAAIjT,KAAKkV,WACjD5U,EAAS2S,EAAIse,UAAU5a,SAAW1D,EAAIjT,KAAK2W,QAC3ClM,GAAU2M,QAAW7V,EAAO2W,IAC9BzN,IAAYmqB,QAAsBrzB,EAAO,CAACszB,WAAYC,sBAA+BC,QAAoBxzB,EAAOkJ,EAAQwR,QAAS6Y,oBACjIr1B,IAASgX,QAAa,CAClB,CACIvS,KAAMypB,kCACN3tB,KAAM,CAACG,GAAIsK,EAAQwR,QAAStF,QAASrW,IAEzC,CACI4D,KAAMiiB,6BACNnmB,KAAM,CAACic,QAASxR,EAAQwR,QAAStF,QAASrW,OA1oBlD00B,CAAuB/hB,GACvB,MAEJ,KAAKie,mBA6oBFtxB,eAAsCqT,GACzC,MAAM1R,EAAQ5B,KACR8yB,GAActP,QAAe5hB,GAC7BV,EAAOoS,EAAIjT,KAAKa,KACtB,GAAIA,GAAQA,EAAKqH,MAAO,CACpB,MAAM+sB,EAAep0B,EAAKqH,MAAM+sB,aAAeruB,KAAKwqB,MAAMvwB,EAAKqH,MAAM+sB,mBAAgB5lB,EACrF5P,IAASy1B,QAAyB,CAACD,aAAD,EAACA,EAAcE,SAGrD,MAAMxxB,GAASmd,QAAUvf,GACnBuyB,GAAUC,QAAWxyB,GAErB6zB,GAAcvC,QAAQhyB,GACtBmzB,EAAoD,SAAhCrwB,EAAOswB,qBAC3BoB,EAAwC,UAAxBvB,aAAA,EAAAA,EAASI,aAAiD,UAAxBJ,aAAA,EAAAA,EAASK,YAEjE,GAAIiB,GAAgBpB,GAAqBqB,EAAgB,CACrD,IAAIvC,GAAUwC,QAA2B/zB,GACzC,MAAM2c,GAAmBC,QAAoB5c,GAC7C,IAAIg0B,EAAezC,GAAWA,EAAQjyB,EAAKV,IACtCo1B,UACK91B,IAAS+1B,QAAiBtX,EAAkBrd,EAAKV,KACvD2yB,GAAUwC,QAA2B31B,MACrC41B,EAAezC,GAAWA,EAAQjyB,EAAKV,KAGvCo1B,IACIF,GAAiBrB,GACjBv0B,IAAS20B,QAA8BlW,GAAkB,KAEzD2U,QAAQhyB,IACRpB,IAAS2e,QAAgBF,KAKjCuU,EAAYtyB,KAAOU,EAAKV,GACpBU,EAAKsf,UAAYsS,EAAYtS,YAG7BsV,UAAQh2B,GAAUE,IAGtBF,GAAS,CACLyE,KAAMypB,sBACN3tB,KAAMa,IAzrBV60B,CAAuBziB,GACvB,MAEJ,KAAKie,iBA2rBT,SAA8Bje,GAC1B,MAAMtC,EAAO/J,KAAKwqB,MAAMne,EAAIjT,KAAK2Q,MAEjClR,GAAS,CACLyE,KAAMyxB,mBACN31B,KAAM2Q,IA/rBNilB,CAAqB3iB,GACrB,MAEJ,KAAKie,mBAgsBT,SAAgCje,GAC5B,MAAMtC,EAAO/J,KAAKwqB,MAAMne,EAAIjT,KAAK2Q,MAEjClR,GAAS,CACLyE,KAAMyxB,kBACN31B,KAAM2Q,IApsBNklB,CAAuB5iB,GACvB,MAEJ,KAAKie,6BAqsBT,SAAyCje,GACrCxT,IAASwe,QAAmBhL,EAAIse,UAAUrc,aArsBtC4gB,CAAgC7iB,GAChC,MAEJ,KAAKie,yBA6dT,SAAqCje,GACjC,MAAM8iB,EAAanvB,KAAKwqB,MAAMne,EAAIjT,KAAKge,QACjCgY,EAAWD,EAAWE,MAAMC,MAAM,KAExCz2B,IAAS02B,QAAkBH,IAE3Bv2B,GAAS,CACLyE,KAAMiiB,6BACNnmB,KAAM+1B,IApeNK,CAA4BnjB,GAC5B,MAEJ,KAAKie,mBAisBT,SAAgCje,GAC5B,MAAMtC,EAAO/J,KAAKwqB,MAAMne,EAAIjT,KAAK2Q,MAEjClR,GAAS,CACLyE,KAAMyxB,mBACN31B,KAAM2Q,IArsBN0lB,CAAuBpjB,GACvB,MAEJ,KAAKie,qBACDzxB,GAqsBR,SAAmCwT,GAC/B,OAAOrT,MAAO02B,EAAYC,KACtB,MAAMre,EAAYjF,EAAIjT,KAAKkV,WACrB7R,EAAS4P,EAAIjT,KAAKic,QAClB1a,EAAQg1B,IAEd,IAAIpf,QAAiB5V,KAAW8B,EAAQ,CACpC,IAAIoH,GAAU2M,QAAW7V,EAAO2W,GAE3BzN,UACK6rB,GAAWE,QAAsBte,IAEvCzN,GAAU2M,QAAWmf,IAAcre,IAGvCoe,GAAWG,QAA4BhsB,GAAS,MAptB3CisB,CAA0BzjB,IACnC,MAEJ,KAAKie,sBAstBT,SAAmCje,GAC/B,MAAM1R,EAAQ5B,KAERg3B,EAAmE,UAD1D7V,QAAUvf,GACWq1B,iCACpC,IAAIzY,QAAoB5c,KAAW0R,EAAIjT,KAAKkV,aAAeyhB,EAAsB,CAC7E,MAAMvb,GAAUC,QAA0B9Z,GACpC0Z,GAAgB9D,QAAiB5V,GACjC2Z,GAAkBC,QAA8B5Z,EAAO0Z,GAC7DrG,SAAoBwG,EAAU,aAAeF,GAGjDzb,GAAS,CAACyE,KAAMsa,8BAAuCxe,KAAM,CAACG,GAAI8S,EAAIjT,KAAKkV,WAAY+G,QAAShJ,EAAIse,UAAUtV,QAAS4a,SAAU5jB,EAAIjT,KAAK2jB,UAAWgT,0BAhuBjJG,CAA0B7jB,GAC1B,MAEJ,KAAKie,yBAguBT,SAAsCje,GAClC,MAAM1R,EAAQ5B,KAERg3B,EAAmE,UAD1D7V,QAAUvf,GACWq1B,iCAEpCn3B,GAAS,CAACyE,KAAMsa,iCAA0Cxe,KAAM,CAACG,GAAI8S,EAAIjT,KAAKkV,WAAY+G,QAAShJ,EAAIse,UAAUtV,QAAS0a,0BApuBtHI,CAA6B9jB,GAC7B,MAEJ,KAAKie,wBAwKT,SAAqCje,GACjC,MAAMiF,EAAYjF,EAAIjT,KAAKkV,WAC3B,GAAIgD,EAAW,CACX,MAAMzN,GAAU2M,QAAWzX,KAAYuY,GACnCzN,GACAhL,GAAS,CACLyE,KAAMsa,sBACNxe,KAAM,GAAF,MAAMyK,GAAN,IAAevG,KAAM8yB,0BA9KjCC,CAA4BhkB,GAC5B,MAEJ,KAAKie,qBACDzxB,GAgLD,SAAmCwT,GACtC,MAAO,CAAC6M,EAAYC,KAChB,MAAMtV,EAAU7D,KAAKwqB,MAAMne,EAAIjT,KAAKyK,SAEpCqV,EAAW,CAAC5b,KAAMsa,sBAA+Bxe,KAAMyK,IAEvD,MAAMlJ,EAAQwe,IACVtV,EAAQtK,MAAOge,QAAoB5c,IACnCqT,YAAA,WAA0ByG,QAA0B9Z,GAApD,qBAAuEkJ,EAAQhC,QAxL1EyuB,CAA0BjkB,IACnC,MAEJ,KAAKie,6BA0LT,SAAyCje,GACrC,MAAM6P,EAAgBlc,KAAKwqB,MAAMne,EAAIjT,KAAK8iB,eACpCmT,EAAQnT,EAAcmT,MAAMC,MAAM,KACxCz2B,IAAS02B,QAAkBF,IAC3Bx2B,GAAS,CAACyE,KAAMsa,gCAAyCxe,KAAM8iB,IA7L3DqU,CAAgClkB,GAChC,MAEJ,KAAKie,kBAIL,KAAKA,iBACDzxB,GAwcR,SAA+BwT,GAC3B,OAAOohB,GAA4BphB,EAAIse,UAAUrc,YAzcpCkiB,CAAsBnkB,IAC/B,MAEJ,KAAKie,yBAgtBT,SAAsCje,GAClC,MAAMokB,EAAazwB,KAAKwqB,MAAMne,EAAIjT,KAAKq3B,YACvC53B,GAAS,CAACyE,KAAMsS,0BAAsCxW,KAAM,CAACq3B,KAEzDC,GAAeD,KACf7f,UAptBA+f,CAA6BtkB,GAC7B,MAEJ,KAAKie,0BAqtBT,SAAuCje,GACnC,MAAMukB,EAAc5wB,KAAKwqB,MAAMne,EAAIjT,KAAKw3B,aACxC/3B,GAAS,CAACyE,KAAMsS,0BAAsCxW,KAAMw3B,KAEb,IAA3CA,EAAYC,UAAUH,MACtB9f,UAztBAkgB,CAA8BzkB,GAC9B,MAEJ,KAAKie,0BA0tBT,SAAuCje,GACnC,MAAMukB,EAAc5wB,KAAKwqB,MAAMne,EAAIjT,KAAKw3B,aACxC/3B,GAAS,CAACyE,KAAMsS,yBAAqCxW,KAAMw3B,IA3tBvDG,CAA8B1kB,GAC9B,MAEJ,KAAKie,YACDzxB,GA8tBD,SAA+BwT,GAClC,OAAOrT,MAAOkgB,EAAYC,KACtB,MAAMxe,EAAQwe,IACRpc,GAASmd,QAAUvf,GACnBqU,GAAgBC,QAAiBtU,GACjCjB,EAAS2S,EAAIjT,KAAK2W,QAElB3W,EAAO,CACTG,GAAI8S,EAAIse,UAAUrc,WAAajC,EAAIjT,KAAK43B,UACxCt3B,SACA4V,IAAKC,KAAKD,OAed,GAZA4J,EAAW,CACP5b,KAAM2zB,YACN73B,SAGJmpB,YAAW,KACPrJ,EAAW,CACP5b,KAAM2zB,iBACN73B,WAEL83B,SAASn0B,EAAOyd,yCAA0C,KAEzD9gB,IAAWsV,EAAe,CAC1B,MAAMkB,QAAegJ,GAAWiY,QAAwB,CAACz3B,KACzD,GAAIwW,EAAO9W,MAAQ8W,EAAO9W,KAAK6N,OAAS,EAEpC,QAIOmqB,QAAmBz2B,EAAOjB,KAC1B02B,aACXlX,GAAWmY,QAAiB,CAAC33B,MAjwBxB43B,CAAsBjlB,IAC/B,MAEJ,KAAKie,qBAmwBT,SAAkCje,GAC9BxT,GAAS,CACLyE,KAAMypB,uBACN3tB,KAAM,CAAC,CAAC2W,QAAS1D,EAAIjT,KAAK2W,QAASuD,OAAQjH,EAAIjT,KAAKka,WArwBpDie,CAAyBllB,GACzB,MAEJ,KAAKie,YAswBT,SAA0Bje,IACtBmlB,QAAiBnlB,EAAIjT,KAAKq4B,eAA1BD,CAA0C34B,GAAUE,IAtwBhD24B,CAAiBrlB,GACjB,MAEJ,KAAKie,qBAswBT,SAAkCje,GAC9B,MAAMslB,EAAW3xB,KAAKwqB,MAAMne,EAAIjT,KAAKu4B,UAErC94B,IAAS+4B,QAA0BD,EAASE,aAE5Ch5B,GAAS,CACLyE,KAAM+b,uBACNjgB,KAAMu4B,IA5wBNG,CAAyBzlB,GACzB,MAEJ,KAAKie,uBAsxBT,SAAoCje,GAChC,MAAMslB,EAAW3xB,KAAKwqB,MAAMne,EAAIjT,KAAKu4B,UAErC94B,GAAS,CACLyE,KAAM+b,sBACNjgB,KAAMu4B,IA1xBNI,CAA2B1lB,GAC3B,MAEJ,KAAKie,kBAywBT,SAAwBje,GACpB,MAAMjT,EAAO4G,KAAKwqB,MAAMne,EAAIjT,KAAKm1B,OAEjC11B,GAAS,CACLyE,KAAM00B,2BACN54B,SA7wBA64B,CAAe5lB,GACf,MAEJ,KAAKie,qBAuxBT,SAAkCje,GAExByB,OAAO8c,WAAYrT,QAAoBxe,QAAgBsT,EAAIjT,KAAKkV,aAClEW,QAAiBlW,QAAgBsT,EAAIse,UAAU5a,SAC/ClX,IAASkqB,QAAkB1W,EAAIjT,KAAKkV,WAAY,IAAI,IA1xBpD4jB,CAAyB7lB,GACzB,MAEJ,KAAKie,qBA2xBF,SAA6Bje,GAChC,MAAM8lB,EAAW9lB,EAAIjT,KAAK+4B,UAC1BC,QAAWD,GAAU9W,OAAOliB,IACxBgsB,QAAQhsB,MAAMA,EAAMkH,YA7xBpBgyB,CAAoBhmB,GACpB,MAEJ,KAAKie,sBA8xBF,SAA8Bje,GACjC,MAAM8lB,EAAW9lB,EAAIjT,KAAK+4B,UAC1BG,QAAaH,GA/xBTI,CAAqBlmB,GACrB,MAEJ,KAAKie,wBA+xBT,SAA+Bje,GAC3B,MAAMpS,EAAOnB,eAAiBspB,SAAS3iB,MAAM+yB,SAASnmB,EAAIjT,KAAK2W,SAE/D,GAAI9V,EAAM,CACN,MAAMo1B,EAAQhjB,EAAIjT,KAAKi2B,MACjBD,EAAWC,EAAMC,MAAM,KACvBmD,EAAUx4B,EAAKo1B,MAAMqD,SAASjiB,iCAAwC4e,EAAMqD,SAASjiB,+BAE3F3X,aAAe,CAACwE,KAAMypB,sBAA4B3tB,KAAM,GAAF,MAAMa,GAAN,IAAYo1B,YAClEx2B,IAAS02B,QAAkBH,IAEvBqD,GAAW3G,IAAOC,SAASC,SAASjW,WAAW,oBAC/CuG,WA1yBJqW,CAAsBtmB,GACtB,MAEJ,KAAKie,qBA4yBT,SAA6Bje,GACzBvT,aAAe,CAACwE,KAAMorB,2BAAqCtvB,KAAMiT,EAAIjT,KAAK2D,SA5yBtE61B,CAAoBvmB,GACpB,MAEJ,KAAKie,sBA4yBT,SAA8Bje,GAC1BvT,aAAe,CAACwE,KAAMorB,4BAAsCtvB,KAAMiT,EAAIjT,KAAK8zB,UA5yBvE2F,CAAqBxmB,GACrB,MAEJ,KAAKie,8BA4yBT,SAA0Cje,GACtCvT,aAAe,CAACwE,KAAMw1B,8BAAqC15B,KAAMiT,EAAIjT,KAAK25B,kBA5yBtEC,CAAiC3mB,GACjC,MAEJ,KAAKie,kBA4yBT,SAA+Bje,GAC3B,MAAMjT,EAAQiT,EAAIjT,MAAQiT,EAAIjT,KAAK65B,QAAW,GACxCA,EAASjzB,KAAKwqB,MAAMpxB,GAE1BN,aAAe,CAACwE,KAAMwY,qBAAkC1c,KAAM65B,IAE9D,MAAMC,EAAmBn6B,KAAWqpB,SAAS+Q,aAAaC,gBAEtDH,EAAOpd,aAAeqd,GAI1Bp6B,cAAeuU,OAAU,CAACC,QAASC,wBAAqCC,WAAY6lB,QAvzBhFC,CAAsBjnB,GACtB,MAEJ,KAAKie,qBAuzBT,SAAiCje,GAC7B,MAAMjT,EAAO4G,KAAKwqB,MAAMne,EAAIjT,KAAKm6B,OACjC16B,IAASgX,QAAa,CAClB,CACIvS,KAAMk2B,oBACNp6B,QAEJ,CACIkE,KAAMk2B,wBACNp6B,KAAM,CAACA,OA/zBXq6B,CAAwBpnB,GACxB,MAEJ,KAAKie,wCAi0BT,SAA0Cje,GACtCvT,aAAe,CACXwE,KAAMk2B,uCACNp6B,KAAM,CAACs6B,OAAQrnB,EAAIse,UAAUtV,QAASse,OAAQ,CAAC,CAACp6B,GAAI8S,EAAIjT,KAAKw6B,cAn0B7DC,CAAiCxnB,GACjC,MAEJ,KAAKie,4CAo0BT,SAA6Cje,GACzCvT,aAAe,CACXwE,KAAMk2B,2CACNp6B,KAAM,CAACs6B,OAAQrnB,EAAIse,UAAUtV,QAASse,OAAQ,CAAC,CAACp6B,GAAI8S,EAAIjT,KAAKw6B,cAt0B7DE,CAAoCznB,GACpC,MAEJ,KAAKie,2CAu0BT,SAA6Cje,GACzCvT,aAAe,CACXwE,KAAMk2B,0CACNp6B,KAAM,CAACuV,UAAWtC,EAAIse,UAAUrc,WAAYqlB,OAAQ,CAAC,CAACp6B,GAAI8S,EAAIjT,KAAKw6B,cAz0BnEG,CAAoC1nB,GACpC,MAEJ,KAAKie,+CA00BT,SAAgDje,GAC5CvT,aAAe,CACXwE,KAAMk2B,8CACNp6B,KAAM,CAACuV,UAAWtC,EAAIse,UAAUrc,WAAYqlB,OAAQ,CAAC,CAACp6B,GAAI8S,EAAIjT,KAAKw6B,cA50BnEI,CAAuC3nB,GACvC,MAEJ,KAAKie,kCA60BT,SAA6Cje,GACzC,IAAI4nB,EAAej0B,KAAKwqB,MAAMne,EAAIjT,KAAK86B,kBACvC,IAAIC,EACAF,EAAa16B,KAAO66B,mDACpBD,EAAa9J,wCACN4J,EAAa16B,KAAO66B,6CAC3BD,EAAa9J,yCAEjBvxB,cAAe+W,QAAa,CACxB,CACIvS,KAAMorB,gCACNtvB,KAAM66B,GAEV,CACI32B,KAAMC,iBACNnE,KAAM,CAAC+6B,OA31BXE,CAAoChoB,GACpC,MAEJ,KAAKie,iCA61BT,SAA4Cje,GACxCvT,aAAe,CAACwE,KAAMorB,+BAAyCtvB,KAAM,CAACG,GAAI8S,EAAIjT,KAAKk7B,gBA71B/EC,CAAmCloB,GACnC,MAEJ,KAAKie,8BACDzxB,GA41BR,SAAsCwT,GAClC,MAAO,CAAC6M,EAAYC,KAChB,MAAMxe,EAAQwe,IAEV9M,EAAIse,UAAUtV,WAAY9E,QAAiB5V,IAO/Cue,GAAWsb,QAAkBnoB,EAAIse,UAAUtV,WAv2BlCof,CAA6BpoB,IACtC,MAEJ,KAAKie,8BACDzxB,GAu2BR,SAAsCwT,GAClC,MAAO,CAAC6M,EAAYC,KAChB,MAAMxe,EAAQwe,IAEV9M,EAAIse,UAAUtV,WAAY9E,QAAiB5V,IAM/Cue,GAAWsb,QAAkBnoB,EAAIse,UAAUtV,WAj3BlCqf,CAA6BroB,IACtC,MAEJ,KAAKie,8BACDzxB,GAi3BR,SAAsCwT,GAClC,MAAO,CAAC6M,EAAYC,KAChB,MAAMxe,EAAQwe,IAEV9M,EAAIse,UAAUtV,WAAY9E,QAAiB5V,IAM/Cue,GAAWsb,QAAkBnoB,EAAIse,UAAUtV,WA33BlCsf,CAA6BtoB,IACtC,MACJ,KAAKie,oCACDzxB,GA43BR,SAA2CwT,GACvC,OAAOuoB,QAAsBvoB,EAAIse,UAAUtV,QAAShJ,EAAIjT,KAAKwnB,OA73BhDiU,CAAkCxoB,IAC3C,MACJ,KAAKie,oCACDzxB,IA83BG,CAACqgB,EAAYC,KAChB,MAAMxe,EAAQwe,IAIQ,UAHNgU,QAAWxyB,GAGfwpB,SACJuJ,QAAyB/yB,IACzBue,GAAW1c,WAEf0c,GAAWkL,eAt4Bf,MACJ,KAAKkG,kCACDzxB,IA04BIqgB,GAAeA,GAAW4b,aAz4B9B,MACJ,KAAKxK,oDAq5BT,SAA6Dje,GACzD,MAAM4nB,EAAej0B,KAAKwqB,MAAMne,EAAIjT,KAAK27B,kCACzCj8B,aAAe,CAACwE,KAAMorB,kDAA4DtvB,KAAM66B,IAt5BpFe,CAAoD3oB,GACpD,MACJ,KAAKie,2BACDzxB,GAu+BR,SAAmCwT,GAC/B,OAAOrT,MAAOkgB,EAAYC,KACtB,MAAMxe,EAAQwe,MACC8b,QAAUt6B,EAAO0R,EAAIjT,KAAK87B,YAC1B7oB,EAAIjT,KAAKuB,OAAS0R,EAAIjT,KAAK+7B,mBAChCjc,GAAWkc,SAAYnmB,QAAiBtU,IAAQ4V,QAAiB5V,GAAQ0R,EAAIjT,KAAK87B,WAAW,KAEvGG,QAAoBnc,EAAY7M,EAAIjT,KAAK87B,UAAW7oB,EAAIse,UAAUtV,QAAShJ,EAAIjT,KAAKuB,QA9+B3E26B,CAA0BjpB,IACnC,MACJ,KAAKie,yBACDzxB,GAm5BR,SAAiCwT,GAC7B,MAAO,CAAC6M,EAAYC,KAChB,GAAI9M,EAAIjT,KAAK87B,UAAW,OACpB,MAAMv6B,EAAQwe,IACRoc,EAAM,WAAGC,QAAW76B,UAAd,aAAG,EAAoB0R,EAAIjT,KAAK87B,WACxCK,KAEKE,QAAa96B,EAAO46B,EAAOh8B,KAC5B2f,GAAWwc,QAAuBH,EAAOh8B,GAAI8S,EAAIjT,KAAKggB,aAG1Duc,QACIzc,EACA7M,EAAIjT,KAAK87B,UACT7oB,EAAIse,UAAUtV,QACdhJ,EAAIjT,KAAKkV,WACT,CACI8J,aAAc/L,EAAIjT,KAAKggB,UACvBwc,mBAAoBL,EAAOM,gBAC3BC,kBAAmBzpB,EAAIjT,KAAKy8B,gBAC5BE,kBAAmBR,EAAOS,eAC1BC,iBAAkB5pB,EAAIjT,KAAK48B,uBAIhC3pB,EAAIse,UAAUrc,YACrB4nB,QAAoChd,EAAYC,EAAY9M,EAAIse,UAAUrc,WAAYjC,EAAIjT,KAAKggB,YAE/F+c,QAAoBjd,EAAY7M,EAAIse,UAAUtV,UA/6BzC+gB,CAAwB/pB,IACjC,MACJ,KAAKie,oBACDzxB,GAi7BR,SAA6BwT,GACzB,MAAO,CAAC6M,EAAYC,KAChB,IAAIkd,EACJ,IACIA,EAAar2B,KAAKwqB,MAAMne,EAAIjT,KAAKm8B,QACnC,SAEE,OAGJ,MAAM56B,EAAQwe,IACRnK,GAAgBC,QAAiBtU,GACjC0Z,GAAgB9D,QAAiB5V,GAEvC,IAAIyd,EAIApJ,IAAkBqnB,EAAWjoB,KAAK2B,UAClCsmB,EAAWC,cAAe,IAG1Bb,QAAa96B,EAAO07B,EAAW98B,OAAQg9B,QAAuB57B,EAAO07B,EAAW98B,MAChF6e,EAAe7I,KAAKD,MAMhB8I,EAAeie,EAAWG,gBAC1Bpe,EAAeie,EAAWG,cAAgB,GAM9CH,EAAWhe,eAAiBD,EAC5Bie,EAAWR,gBAAkB,EAC7BQ,EAAWL,eAAiB,EAG5Bn9B,IAAS49B,QAAiBznB,EAAeqF,EAAegiB,EAAW98B,GAAI6e,MAG3Ese,QAAoBxd,EAAYC,EAAYkd,EAAYhqB,EAAIse,UAAUtV,UA79B7DshB,CAAoBtqB,IAC7B,MAEJ,KAAKie,qCACDzxB,GAASkwB,MAMbhiB,OAAOV,OAAOghB,IAAqB9gB,SAASqwB,IACnCA,GAIDA,EAAaC,eAAexqB,EAAI2d,QAA6C,mBAA5B4M,EAAavqB,EAAI2d,QAClE4M,EAAavqB,EAAI2d,OAAO3d,MA4EpC,MAAMke,GArCN,SAA2BuM,GACvB,IAAIC,EACAC,EAAQ,GACRC,EAAQ,EAGZ,MAAMC,EAAY,KACdH,EAAU,KAENC,EAAM/vB,OAAS,GACfpO,GAsDL,SAA6Bm+B,GAChC,MAAO,CAACtH,EAAYC,KAEhB,MAAMlP,EAAQuW,EAAM1rB,KAAKe,GAAQrM,KAAKwqB,MAAMne,EAAIjT,KAAKgV,QAG/C8a,GAAaC,QAA0BwG,KACvC5rB,EAAU0c,EAAMnV,KAAK8C,IAAS+oB,QAAgB/oB,EAAM8a,KAC1DwG,GAAW7f,QAAa9L,IAGxB2rB,GAAW0H,QAAmB3W,KAG9BiK,QAA+BjK,EAAOiP,EAAYC,IApErC0H,CAAoBL,IAGjCA,EAAQ,GACRC,EAAQ,GAGZ,OAAO,SAAY5qB,GACX0qB,GAAWE,EAAQ,GAEfD,EAAMtW,KAAKrU,GAAO,MAElB2qB,EAAQ,GACR7R,QAAQqC,IAAI,yDAEhB8P,aAAaP,GACbA,EAAUxU,WAAW2U,EAWqB,OAR1CD,GAAS,EACTp+B,GASL,SAA4BwT,GAC/B,MAAO,CAACqjB,EAAYC,KAChB,MAAMvhB,EAAOpO,KAAKwqB,MAAMne,EAAIjT,KAAKgV,MACjCshB,GAAWlW,QAAcpL,EAAM/B,KAE/Bqe,QAA+B,CAACtc,GAAOshB,EAAYC,GAQ/CvhB,EAAK2B,WAAYd,QAAiB0gB,QACjC4H,QAA2B5H,IAAcvhB,EAAK2B,UAC/C1D,EAAIjT,KAAKo+B,YAET9H,EAAW,CACPpyB,KAAMypB,uBACN3tB,KAAM,CAAC,CAAC2W,QAAS3B,EAAK2B,QAASuD,OAAQmkB,iBA5BlCC,CAAmBrrB,IAC5BirB,aAAaP,GACbA,EAAUxU,WAAW2U,EAKqB,OAAlBS,GA+QpC,SAASlK,GAA4Bnc,GACjC,OAAOtY,UACH,MAAM,KAACI,EAAD,MAAOD,SAAe+f,GAAW0W,QAAsBte,IAExDnY,GACD+f,GAAW2W,QAA4Bz2B,EAAKyK,WAyPxD,SAAS6sB,GAAeD,GACpB,OAAOA,EAAWhhB,WAAagB,+CAA2E,SAArBggB,EAAWjuB,MAuRpG,SAASumB,KACL,MAAO,CAAC7P,EAAYC,KAChB,MAAMxe,EAAQwe,IAId,OAHIrE,OAAYna,IACZue,GAAWrB,QAAiB5I,QAAiBtU,IAAQ4c,QAAoB5c,KAEtE,CAACvB,MAAM,M,2MEz4CtB,MAEMw+B,EAA2B,ICJjC,EADgB,IDOD,MAsBXv2B,cAAc,qaACVI,KAAKo2B,KAAO,KACZp2B,KAAKq2B,cAAgB,KACrBr2B,KAAKs2B,iBAAmB,EACxBt2B,KAAKu2B,eAAiB,EACtBv2B,KAAKw2B,iBAAmB,EACxBx2B,KAAKy2B,cAAgB,KACrBz2B,KAAK02B,kBAAoB,GACzB12B,KAAK22B,qBAAuB,KAC5B32B,KAAK42B,kBAAoB,KACzB52B,KAAK62B,oBAAsB,KAC3B72B,KAAK82B,cAAgB,KACrB92B,KAAK+2B,cAAgB,KACrB/2B,KAAKg3B,aAAe,GAMxBnR,WAAWwQ,EAAgBr2B,KAAKq2B,cAAe98B,GAC3C,GAAIyG,KAAKo2B,KACL,OAGJ,GAAqB,MAAjBC,EAEA,YADA3S,QAAQqC,IAAI,sCAIc,IAA1B/lB,KAAKw2B,kBACL9S,QAAQqC,IAAI,2BAA6BsQ,GAM7Cr2B,KAAKo2B,KAAO,IAAItQ,UAAJ,UAAiBuQ,EAAjB,0BAAgDr2B,KAAKg3B,aAArD,4BAAqFh3B,KAAKu2B,iBACtGv2B,KAAKq2B,cAAgBA,EAErB,MACMY,EAAyD,UADhDxe,QAAUphB,gBACS6/B,yBAElCl3B,KAAKo2B,KAAKe,OAAS,KAEVF,IACDj3B,KAAKu2B,eAAiB,GAGtBh9B,GACAyG,KAAKo3B,YAAY,2BAA4B,CAAC79B,UAG9CyG,KAAKw2B,iBAAmB,GACxB9S,QAAQqC,IAAI,uCACR/lB,KAAK42B,mBACL52B,KAAK42B,qBAEF52B,KAAK22B,sBACZ32B,KAAK22B,uBAGT32B,KAAKw2B,iBAAmB,GAG5Bx2B,KAAKo2B,KAAKiB,QAAU,KAChBr3B,KAAKo2B,KAAO,KACZp2B,KAAKs2B,iBAAmB,EAEM,IAA1Bt2B,KAAKw2B,kBACL9S,QAAQqC,IAAI,oBAGhB/lB,KAAKw2B,mBAEDx2B,KAAK+2B,eACL/2B,KAAK+2B,cAAc/2B,KAAKw2B,kBAG5B,IAAIc,EAvGiB,IA0GjBt3B,KAAKw2B,iBA3GO,IA4GZc,EA3GiB,IA2GsBt3B,KAAKw2B,iBAAmBx2B,KAAKw2B,iBAChEc,EAAYnB,IACZmB,EAAYnB,IAIpBrV,YACI,KACI9gB,KAAK6lB,WAAWwQ,EAAe98B,KAEnC+9B,IAIRt3B,KAAKo2B,KAAKmB,QAAWC,IACbx3B,KAAKw2B,kBAAoB,IACzB9S,QAAQqC,IAAI,mBACZrC,QAAQqC,IAAIyR,IAGZx3B,KAAK82B,eACL92B,KAAK82B,cAAcU,IAI3Bx3B,KAAKo2B,KAAKqB,UAAaD,IACnB,MAAM5sB,EAAMrM,KAAKwqB,MAAMyO,EAAI7/B,MAC3B,GAAIiT,EAAI8sB,UAIA9sB,EAAIlT,OACJgsB,QAAQqC,IAAInb,GAGZ5K,KAAK02B,kBAAkB9rB,EAAI8sB,aAC3B13B,KAAK02B,kBAAkB9rB,EAAI8sB,WAAW9sB,GACtCuY,QAAQC,eAAepjB,KAAK02B,kBAAmB9rB,EAAI8sB,iBAEpD,GAAI13B,KAAKy2B,cAAe,CAqBc,MApBzC,GAAIQ,GAoBA,GAlBIrsB,EAAI2d,QAAUM,YAAsB7oB,KAAK62B,sBACzCnT,QAAQqC,IAAI,qBAAsBnb,EAAIjT,KAAKggC,eAIjB,KAAtB33B,KAAKg3B,cAAuBh3B,KAAKg3B,eAAiBpsB,EAAIjT,KAAKggC,gBAC3DjU,QAAQqC,IAAI,qEACZ/lB,KAAK62B,sBACL72B,KAAKu2B,eAAiB,GAK1Bv2B,KAAKg3B,aAAepsB,EAAIjT,KAAKggC,eAK7B/sB,EAAIgtB,MAAQ53B,KAAKu2B,eAMjB,OALA7S,QAAQqC,IAAI,mCAAqCnb,EAAIgtB,IAAM,YAAc53B,KAAKu2B,gBAE9Ev2B,KAAKw2B,iBAAmB,EACxBx2B,KAAKs2B,iBAAmB,OACxB,UAAAt2B,KAAKo2B,YAAL,SAAW3U,cAGR7W,EAAIgtB,MAAQ53B,KAAKu2B,gBAAkBv2B,KAAK62B,sBAC/CnT,QAAQqC,IAAI,mCAAqCnb,EAAIgtB,IAAM,YAAc53B,KAAKu2B,gBAC9Ev2B,KAAK62B,uBAET72B,KAAKu2B,eAAiB3rB,EAAIgtB,IAAM,EAChC53B,KAAKy2B,cAAc7rB,KAK/BitB,iBAAiBx7B,GACb2D,KAAKy2B,cAAgBp6B,EAGzBy7B,wBAAwBz7B,GACpB2D,KAAK22B,qBAAuBt6B,EAGhC07B,qBAAqB17B,GACjB2D,KAAK42B,kBAAoBv6B,EAG7B27B,uBAAuB37B,GACnB2D,KAAK62B,oBAAsBx6B,EAG/B47B,iBAAiB57B,GACb2D,KAAK82B,cAAgBz6B,EAGzB67B,iBAAiB77B,GACb2D,KAAK+2B,cAAgB16B,EAGzBolB,QACIzhB,KAAKw2B,iBAAmB,EACxBx2B,KAAKs2B,iBAAmB,EACpBt2B,KAAKo2B,MAAQp2B,KAAKo2B,KAAK+B,aAAerS,UAAUsS,OAChDp4B,KAAKo2B,KAAKiB,QAAU,OACpBr3B,KAAKo2B,KAAK3U,QACVzhB,KAAKo2B,KAAO,KACZ1S,QAAQqC,IAAI,qBAIpBqR,YAAYxiB,EAAgBjd,EAAW0gC,GACnC,MAAMztB,EAAM,CACRgK,SACAgjB,IAAK53B,KAAKs2B,mBACV3+B,QAGA0gC,IACAr4B,KAAK02B,kBAAkB9rB,EAAIgtB,KAAOS,GAGlCr4B,KAAKo2B,MAAQp2B,KAAKo2B,KAAK+B,aAAerS,UAAUsS,KAChDp4B,KAAKo2B,KAAKkC,KAAK/5B,KAAKC,UAAUoM,IACtB5K,KAAKo2B,MAAQp2B,KAAKo2B,KAAK+B,aAAerS,UAAUyS,SACxDv4B,KAAKo2B,KAAO,KACZp2B,KAAK6lB,cAIb2S,WAAW3oB,EAAmB2H,EAAkBnb,GAC5C,MAAM1E,EAAO,CACTkV,WAAYgD,EACZ0f,UAAW/X,GAEfxX,KAAKo3B,YAAY,cAAez/B,EAAM0E,GAG1Co8B,uBAAuBC,EAAuBC,EAAiBt8B,GAC3D,MAAM1E,EAAO,CACTihC,eAAgBF,EAChBC,UAEJ34B,KAAKo3B,YAAY,4BAA6Bz/B,EAAM0E,GAGxDw8B,YAAYx8B,GACR2D,KAAKo3B,YAAY,eAAgB,KAAM/6B,GAG3CuzB,iBAAiBphB,EAAmBnS,GAChC,MAAM1E,EAAO,CACTmhC,SAAUtqB,GAEdxO,KAAKo3B,YAAY,sBAAuBz/B,EAAM0E,M,kNExPvC,SAAS08B,EAAqBl5B,GACzC,MAIMvE,EAASuE,EAAMvE,OACfmwB,EAAU5rB,EAAM4rB,QAEhBtiB,EACF,gBAAC,IAAD,CACIrR,GAAG,qBACH+N,eAAe,UAIjBmzB,EACF,gBAAC,IAAD,CACIlhC,GAAG,6BACH+N,eAAe,4CAIjBozB,EACF,uBAAKj4B,UAAU,cACX,gBAAC,IAAD,CACIlJ,GAAG,iBACH+N,eAAe,iBAElB,IAAW4lB,EAAQyN,SAI5B,IAAIC,EAAY79B,EAAO89B,YAKvB,OAJKC,MAAM/9B,EAAO89B,eACdD,EAAY,MAIZ,gBAAClxB,EAAA,EAAD,CACIC,gBAAiBoxB,IAAW,cAAe,cAAe,SAC1D5xB,KAAM7H,EAAM6H,KACZS,OAAQtI,EAAM05B,OACdnxB,SAzCW,KACfvI,EAAMsI,UAyCFG,KAAK,SACLC,kBAAgB,mBAEhB,gBAACN,EAAA,SAAD,CAAcU,aAAa,GACvB,gBAACV,EAAA,QAAD,CACIa,eAAe,KACfhR,GAAG,mBAEH,gBAAC,IAAD,CACIA,GAAG,cACH8M,OAAQ,CAAC40B,SAAUl+B,EAAOm+B,UAAY,cACtC5zB,eAAe,uBAI3B,gBAACoC,EAAA,OAAD,KACI,uBAAKjH,UAAU,wBACX,uBAAKA,UAAU,qBACX,gBAAC,IAAD,OAEJ,2BACI,sBAAIA,UAAU,sBACV,8BAAS,aAAT,IAAwBmI,IAE5B,qBAAGnI,UAAU,YAAYg4B,GACzB,uBAAKh4B,UAAU,eACX,2BACI,gBAAC,IAAD,CACIlJ,GAAG,gBACH+N,eAAe,wBAEnB,wBAAM/N,GAAG,iBAAiB,IAAWqhC,KAG5CF,EACD,uBAAKj4B,UAAU,gBACX,gBAAC,IAAD,CACIlJ,GAAG,eACH+N,eAAe,wQAEnB,uBAAK7E,UAAU,cACX,gBAAC,IAAD,CACIlJ,GAAG,kBACH+N,eAAe,sEACfjB,OAAQ,CACJ80B,aAAa,IAAI5rB,MAAO6rB,oBAM5C,6BAEJ,uBAAK34B,UAAU,qBACX,yBACI,gBAAC,IAAD,CACIlJ,GAAG,aACH+N,eAAe,gBAElBvK,EAAOs+B,UACR,2BACA,gBAAC,IAAD,CACI9hC,GAAG,eACH+N,eAAe,mBAElBvK,EAAOu+B,oBACR,2BACA,gBAAC,IAAD,CACI/hC,GAAG,mBACH+N,eAAe,uBAEwBi0B,8CAE/C,yBACI,gBAAC,IAAD,CACIhiC,GAAG,aACH+N,eAAe,gBAElBvK,EAAOy+B,c,qIAnI5B5xB,O,oBACA7M,O,mBACAmwB,Q,mBACA/jB,K,oBACA6xB,O,qBC4BW,MAAMS,UAAwBr6B,gBAKzCC,YAAYC,GACRC,MAAMD,GADgB,iBAQjB,KACLG,KAAK8F,SAAS,CAAC4B,MAAM,OATC,qBAYb,KACT1H,KAAKH,MAAMsI,YAVXnI,KAAK9G,MAAQ,CACTwO,MAAM,GAYdjG,SACI,MAAMnG,EAAS0E,KAAKH,MAAMvE,OACpBmwB,EAAUzrB,KAAKH,MAAM4rB,QAE3B,GAAsB,SAAlBA,EAAQ/I,MACR,OACI,gBAACqW,EAAD,iBACQ/4B,KAAKH,MACLG,KAAK9G,MAFb,CAGIqgC,OAAQv5B,KAAKu5B,UAKzB,IA8BIN,EA9BA9vB,EACA,gBAAC,IAAD,CACIrR,GAAG,sBACH+N,eAAe,iBAInBmzB,EACA,gBAAC,IAAD,CACIlhC,GAAG,sBACH+N,eAAe,4FAInBo0B,EACA,2BACI,gBAAC,IAAD,CACIniC,GAAG,yBACH+N,eAAe,sCAEnB,qBACIq0B,OAAO,SACPC,IAAI,sBACJC,KAAK,8BAEJ,mBAMuB,SAAhC9+B,EAAO++B,uBACPlxB,EACI,gBAAC,IAAD,CACIrR,GAAG,sBACH+N,eAAe,uBAIvBmzB,EACI,gBAAC,IAAD,CACIlhC,GAAG,4BACH+N,eAAe,oDAIvBo0B,EACI,2BACI,gBAAC,IAAD,CACIniC,GAAG,+BACH+N,eAAe,4CAEnB,qBACIq0B,OAAO,SACPC,IAAI,sBACJC,KAAK,gCAEJ,yBAKc,SAAvB3O,EAAQI,aACR1iB,EACI,gBAAC,IAAD,CACIrR,GAAG,4BACH+N,eAAe,uBAGvBozB,EACI,uBAAKj4B,UAAU,cACX,gBAAC,IAAD,CACIlJ,GAAG,iBACH+N,eAAe,iBAEnB,gBAAC,IAAD,MAAQ4lB,EAAQyN,WAMhC,MAAMoB,EACF,qBACIJ,OAAO,SACPpiC,GAAG,UACHqiC,IAAI,sBACJC,KAAMG,uBAEN,gBAAC,IAAD,CACIziC,GAAG,YACH+N,eAAe,sBAKrB20B,EACF,qBACIN,OAAO,SACPpiC,GAAG,cACHqiC,IAAI,sBACJC,KAAMG,qBAEN,gBAAC,IAAD,CACIziC,GAAG,gBACH+N,eAAe,oBAM3B,IAAI40B,EACA,2BACI,gBAAC,IAAD,CACI3iC,GAAG,oBACH+N,eAAe,kBAEnB,wBAAM/N,GAAG,qBAAqB,IAAWwD,EAAO89B,cAGpDC,MAAMqB,OAAOp/B,EAAO89B,gBACpBqB,EAAc,MAGlB,IAAItB,EAAgC79B,EAAO89B,YAK3C,OAJKC,MAAMqB,OAAOp/B,EAAO89B,gBACrBD,EAAY,MAIZ,gBAAClxB,EAAA,EAAD,CACIC,gBAAgB,0BAChBR,KAAM1H,KAAK9G,MAAMwO,KACjBS,OAAQnI,KAAKu5B,OACbnxB,SAAUpI,KAAK26B,WACfryB,KAAK,SACLC,kBAAgB,mBAEhB,gBAACN,EAAA,SAAD,CAAcU,aAAa,GACvB,gBAACV,EAAA,QAAD,CACIa,eAAe,KACfhR,GAAG,mBAEH,gBAAC,IAAD,CACIA,GAAG,cACH8M,OAAQ,CAAC40B,SAAUl+B,EAAOm+B,UAAY,cACtC5zB,eAAe,uBAI3B,gBAACoC,EAAA,OAAD,KACI,uBAAKjH,UAAU,wBACX,uBAAKA,UAAU,qBACX,gBAAC,IAAD,OAEJ,2BACI,sBAAIA,UAAU,sBACV,8BAAS,aAAT,IAAwBmI,IAE5B,qBAAGnI,UAAU,8BAA8Bg4B,GAC3C,uBAAKh4B,UAAU,mBACX,2BACI,gBAAC,IAAD,CACIlJ,GAAG,gBACH+N,eAAe,wBAEnB,wBAAM/N,GAAG,iBAAiB,IAAWqhC,IAEzC,2BACI,gBAAC,IAAD,CACIrhC,GAAG,kBACH+N,eAAe,6BAEnB,wBAAM/N,GAAG,mBAAmB,IAAWwD,EAAOs/B,UAEjDH,EACD,2BACI,gBAAC,IAAD,CACI3iC,GAAG,iBACH+N,eAAe,cAElB,IAAWvK,EAAOu/B,gBAG1B5B,IAGT,uBAAKj4B,UAAU,uBACVi5B,EACD,uBAAKj5B,UAAU,cACX,uBAAKA,UAAU,0BACX,gBAAC,IAAD,CACIlJ,GAAG,kBACH+N,eAAe,sEACfjB,OAAQ,CACJ80B,aAAa,IAAI5rB,MAAO6rB,kBAIpC,uBAAK34B,UAAU,sBACVs5B,EACA,MACAE,KAIb,uBAAKx5B,UAAU,uCACX,yBACI,gBAAC,IAAD,CACIlJ,GAAG,eACH+N,eAAe,0QAI3B,uBAAK7E,UAAU,qBACX,yBACI,gBAAC,IAAD,CACIlJ,GAAG,aACH+N,eAAe,gBAEnB,gBAAC,IAAD,MAAQvK,EAAOs+B,UACf,2BACA,gBAAC,IAAD,CACI9hC,GAAG,eACH+N,eAAe,mBAEnB,gBAAC,IAAD,MAAQvK,EAAOu+B,oBACf,2BACA,gBAAC,IAAD,CACI/hC,GAAG,mBACH+N,eAAe,uBAEnB,gBAAC,IAAD,MAAiC7F,KAAKH,MAAMi7B,iBAA8DhB,8CAE9G,yBACI,gBAAC,IAAD,CACIhiC,GAAG,aACH+N,eAAe,gBAEnB,gBAAC,IAAD,MAAQvK,EAAOy+B,e,EAjRtBC,E,aAxBjB7xB,O,oBAeA2yB,gB,WAEApzB,K,WChBJ,SAAevD,cATf,SAAyBjL,GACrB,MAAM2S,EAAUC,WAChB,MAAO,CACHxQ,QAAQmd,QAAUvf,GAClBuyB,SAASC,QAAWxyB,GACpBwO,MAAMqzB,OAAY7hC,EAAO2S,MAIjC,CAAwCmuB,I,2oBCoCzB,MAAMgB,UAAgCr7B,gBAIjDC,YAAYC,GACRC,MAAMD,GADgB,uFAgDb,KACTG,KAAKH,MAAMyC,QAAQqhB,mBAAmB,IACtC3jB,KAAK8F,SAAS,CAAC4B,MAAM,OAlDC,qBAqDb,KACL1H,KAAKH,MAAMsI,QACXnI,KAAKH,MAAMsI,YAvDO,yBA2DRvQ,IACd,IAAIqjC,EAAW,KACXrjC,GAAOA,EAAIgH,UACXq8B,EAAWrjC,EAAIgH,SAGnBoB,KAAK8F,SAAS,CACVo1B,QAAQ,EACRD,gBAnEkB,uBAuEX1jC,UACX,MAAM4jC,EAAWn7B,KAAK9G,MAAM0L,OAAOiF,KAAKuxB,GAAMA,EAAEtjC,KAChD,GAAwB,IAApBqjC,EAAS31B,OAAb,CAIA,GAAIxF,KAAKH,MAAMw7B,WAKX,OAJIr7B,KAAKH,MAAMy7B,eACXt7B,KAAKH,MAAMy7B,cAAcH,QAE7Bn7B,KAAK4G,aAIT5G,KAAK8F,SAAS,CAACo1B,QAAQ,UAEjBlrB,QAAQC,IAAIkrB,EAAStxB,KAAItS,UAC3B,MAAM,MAACG,SAAesI,KAAKH,MAAMyC,QAAQi5B,kBAAkBC,EAASx7B,KAAKH,MAAMgW,iBAAkB4lB,2BAA8B,CAACC,UAAU,IAC1I17B,KAAK27B,eAAejkC,GACfA,GACDsI,KAAK4G,qBA3FS,mBAgGd7F,IACR,MAAM6D,EAASU,OAAOuX,OAAO,GAAI7c,KAAK9G,MAAM0L,QACtC4J,EAAU5J,EAAOiF,KAAKuxB,GAAaA,EAAEtjC,KACvCiJ,GAASA,EAAMjJ,KAAqC,IAA/B0W,EAAQ0D,QAAQnR,EAAMjJ,KAC3C8M,EAAOqa,KAAKle,GAGhBf,KAAK8F,SAAS,CAAClB,cAvGO,gCA0GDg3B,IACrB57B,KAAK8F,SAAS,CACV+1B,cAAeD,OA5GG,2BAgHP,CAACz9B,EAAc29B,KAC1B39B,EAAO29B,IACP97B,KAAK+7B,uBAAsB,GAC3B/7B,KAAKH,MAAMyC,QAAQ05B,gCAAgCh8B,KAAKH,MAAMgW,iBAAkB7V,KAAKH,MAAMo8B,WAAY99B,EAAM+9B,IAAqB,GAAMr0B,MAAK,KACzI7H,KAAK+7B,uBAAsB,UApHb,uBAyHVn3B,IACZ5E,KAAK8F,SAAS,CAAClB,cA1HO,iBA6HhByK,IACNrP,KAAKH,MAAMyC,QAAQqhB,mBAAmBtU,MA9HhB,uBAiIX,CAAC8sB,EAAoBC,EAAqBC,EAAoCC,KACzF,MAAMC,EAAcH,EAAa,4BAA8B,GAE/D,OACI,uBACIl/B,IAAKi/B,EAAOrkC,GACZ0kC,IAAKJ,EAAap8B,KAAKy8B,gBAAkBN,EAAOrkC,GAChDkJ,UAAW,6BAA+Bu7B,EAC1ChyB,QAAS,IAAM8xB,EAAMF,GACrBG,YAAa,IAAOA,EAAcA,EAAYH,QAAUn1B,GAExD,uBACIhG,UAAU,oBACVyI,IAAKizB,IACLpzB,IAAI,gBACJC,MAAM,KACNC,OAAO,OAEX,uBACIxI,UAAU,uBAEV,uBAAKA,UAAU,oBACVm7B,EAAO95B,aAAc,MAAgB,wBAAMrB,UAAU,wBAClD,gBAAC,IAAD,CACIlJ,GAAG,aACH+N,eAAe,4DACfjB,OAAQ,CACJ+3B,IAAKR,EAAOtjB,mBAMhC,uBAAK7X,UAAU,uBACX,uBAAKA,UAAU,8BACX,gBAAC,IAAD,YAjKhBhB,KAAK48B,gBAAkB,EAEvB58B,KAAK9G,MAAQ,CACT0L,OAAQ,GACR8C,MAAM,EACNm1B,QAAQ,EACR3B,QAAQ,EACRD,SAAU,KACVY,eAAe,GAGnB77B,KAAKy8B,gBAAkB98B,cAG3Bm9B,oBACI9sB,QAAQC,IAAI,CACRjQ,KAAKH,MAAMyC,QAAQ+Y,QAAQrb,KAAKH,MAAMoyB,QACtCjyB,KAAKH,MAAMyC,QAAQy6B,6BAA6B/8B,KAAKH,MAAMoyB,QAAQ,GAAO,GAC1EjyB,KAAKH,MAAMyC,QAAQ05B,gCAAgCh8B,KAAKH,MAAMgW,iBAAkB,GAAI,EAAGqmB,IAAqB,GAC5Gl8B,KAAKH,MAAMyC,QAAQ06B,gCAAgCh9B,KAAKH,MAAMgW,kBAAkB,GAAO,KACxFhO,MAAK,KACJ7H,KAAK+7B,uBAAsB,MAInCkB,mBAAmBC,GACf,GAAIl9B,KAAKH,MAAMo8B,aAAeiB,EAAUjB,WAAY,CAChDpG,aAAa71B,KAAK48B,iBAElB,MAAMX,EAAaj8B,KAAKH,MAAMo8B,WAC9B,GAAmB,KAAfA,EACA,OAGJj8B,KAAK48B,gBAAkBvwB,OAAOyU,YAC1BvpB,UACIyI,KAAK+7B,uBAAsB,SACrB/7B,KAAKH,MAAMyC,QAAQ05B,gCAAgCh8B,KAAKH,MAAMgW,iBAAkBomB,EAAY,KAAM,MAAM,GAC9Gj8B,KAAK+7B,uBAAsB,KAE/B/sB,mCAgIZmuB,YAAYt9B,GACR,OAAOA,EAAMlI,KAAK0K,aAGtBZ,SACI,MAAM27B,EACF,uBAAKtlC,GAAG,sBACJ,gBAAC,IAAD,CACIA,GAAG,iCACH+N,eAAe,4GACfjB,OAAQ,CACJ+3B,IA9NM,GA8NuB38B,KAAK9G,MAAM0L,OAAOY,WAMzD63B,GAAmBjzB,QAAgB,kBAAmB,OACtDkzB,GAA0BlzB,QAAgB,qBAAsB,aAEtE,IAAI6wB,EAAW,KACXj7B,KAAK9G,MAAM+hC,WACXA,EAAY,uBAAKj6B,UAAU,uBAAsB,yBAAOA,UAAU,qCAAqChB,KAAK9G,MAAM+hC,YAEtH,IAAIsC,EAAev9B,KAAKH,MAAMqyB,OAC9B,GAAIlyB,KAAKH,MAAM29B,cAAe,CAC1B,MAAMC,EAAYC,IAAe19B,KAAKH,MAAM29B,cAAev2B,MAAM02B,GAAMA,EAAE7lC,KAAO4lC,EAAG5lC,KACnFylC,EAAeA,EAAaj2B,OAAOm2B,GAEvC,GAAIz9B,KAAKH,MAAM+9B,cAAe,CAC1B,MAAMH,EAAYC,GAAc19B,KAAKH,MAAM+9B,cAAe32B,MAAM02B,GAAMA,EAAE7lC,KAAO4lC,EAAG5lC,KAClFylC,EAAe,IAAIA,KAAiBv9B,KAAKH,MAAM+9B,cAAct2B,OAAOm2B,IAExE,MAAMI,EAAqBN,EAAa1zB,KAAKioB,G,+VACzC,EAAQpwB,MAAOowB,EAAMzvB,aAActB,MAAO+wB,EAAMh6B,IAAOg6B,KAG3D,OACI,gBAAC7pB,EAAA,EAAD,CACInQ,GAAG,0BACHoQ,gBAAiB,8CACjBR,KAAM1H,KAAK9G,MAAMwO,KACjBS,OAAQnI,KAAK4G,WACbwB,SAAUpI,KAAK26B,YAEf,gBAAC1yB,EAAA,SAAD,CAAcU,aAAa,GACvB,gBAACV,EAAA,QAAD,KACI,gBAAC,IAAD,CACInQ,GAAG,8BACH+N,eAAe,0CACfjB,OAAQ,CACJ6I,YACI,8BAASzN,KAAKH,MAAMi+B,yBAMxC,gBAAC71B,EAAA,OAAD,KACKgzB,EACD,gBAAC,IAAD,CACI/9B,IAAI,wBACJG,QAASwgC,EACTE,eAAgB/9B,KAAKg+B,aACrBvB,gBAAiBz8B,KAAKy8B,gBACtB73B,OAAQ5E,KAAK9G,MAAM0L,OACnBq5B,cAAej+B,KAAKm9B,YACpBtV,QAvRA,GAwRAqW,iBAAkBl+B,KAAKk+B,iBACvBC,YAAan+B,KAAK68B,OAClBuB,aAAcp+B,KAAKo+B,aACnBC,UAAWr+B,KAAKs+B,SAChB71B,aAAczI,KAAKyI,aACnB81B,UA5RM,GA6RNnB,iBAAkBA,EAClBC,iBAAkBA,EAClBC,wBAAyBA,EACzBpC,OAAQl7B,KAAK9G,MAAMgiC,OACnBsD,QAASx+B,KAAK9G,MAAM2iC,cACpB4C,iBAAiBr0B,QAAgB,mCAAoC,8B,EA9PxE4wB,E,aA/BjB8C,mB,sBACAjoB,iB,sBACAoc,O,sBACAgK,W,sBACA/J,O,qBAEAsL,c,UACAI,c,UACAz1B,O,SACAkzB,W,SACAC,c,SAEAh5B,Q,WACI05B,gC,oBACArY,mB,oBACA4X,kB,oBACAyB,gC,oBACA3hB,Q,oBACA0hB,6B,mCCiBR,SAAe54B,cApCf,SAAyBjL,EAAoBusB,GACzC,MAAMwW,EAAa/iC,EAAMwlC,MAAM7B,OAAO8B,YAEhCv8B,EAAUqjB,EAASrjB,UAAWsQ,QAAkBxZ,IAAU,GAEhE,IAAIg5B,GAAS0M,QAAmC1lC,EAAOkJ,EAAQtK,GAAIsK,EAAQwR,SAC3E,GAAIqoB,EAAY,CACZ,MAAM4C,EAAQC,OAAO7C,EAAY,KACjC/J,EAASA,EAAO5qB,QAAQwqB,GAAU+M,EAAMzY,KAAK0L,EAAMzvB,eAAiBw8B,EAAMzY,KAAK0L,EAAM1xB,QAGzF,MAAO,CACH09B,mBAAoB17B,EAAQC,aAC5BwT,iBAAkBzT,EAAQtK,GAC1BujC,WAAY5V,EAAS4V,WACrBC,cAAe7V,EAAS6V,cACxBkC,cAAe/X,EAAS+X,cACxBvB,aACA/J,SACAD,OAAQ7vB,EAAQwR,YAIxB,SAA4Bxc,GACxB,MAAO,CACHkL,SAAS+B,wBAAyF,CAC9F23B,gCAD8F,KAE9FrY,mBAF8F,KAG9F4X,kBAH8F,KAI9FyB,gCAJ8F,KAK9F3hB,QAL8F,KAM9F0hB,6BAA4BA,MAC7B3lC,MAIX,CAA4D4jC,I,2+BCR7C,MAAM+D,UAA6Bp/B,gBAI9CC,YAAYC,GACRC,MAAMD,GADgB,uFA+CN,KAChBG,KAAKH,MAAMyC,QAAQqhB,mBAAmB,IACtC3jB,KAAK8F,SAAS,CAAC4B,MAAM,OAjDC,qBAqDN,KACZ1H,KAAKH,MAAMsI,QACXnI,KAAKH,MAAMsI,YAvDO,yBA4DDvQ,IACrB,IAAIqjC,EAAW,KACXrjC,GAAOA,EAAIgH,UACXq8B,EAAWrjC,EAAIgH,SAGnBoB,KAAK8F,SAAS,CACVo1B,QAAQ,EACRD,gBApEkB,uBAyEJ1jC,UAClB,MAAM4jC,EAAWn7B,KAAK9G,MAAM0L,OAAOiF,KAAKuxB,GAAMA,EAAEtjC,KAChD,GAAwB,IAApBqjC,EAAS31B,OAAb,CAGA,GAAIxF,KAAKH,MAAMw7B,WAKX,OAJIr7B,KAAKH,MAAMy7B,eACXt7B,KAAKH,MAAMy7B,cAAcH,QAE7Bn7B,KAAK4G,aAIT5G,KAAK8F,SAAS,CAACo1B,QAAQ,UAEjBlrB,QAAQC,IAAIkrB,EAAStxB,KAAItS,UAC3B,MAAM,MAACG,SAAesI,KAAKH,MAAMyC,QAAQi5B,kBAAkBC,EAASx7B,KAAKH,MAAM+S,cAAe6oB,wBAA2B,CAACC,UAAU,EAAMsD,cAAc,IACxJh/B,KAAK27B,eAAejkC,GACfA,GACDsI,KAAK4G,qBA5FS,mBAkGP7F,IACf,MAAM6D,EAASU,OAAOuX,OAAmC,GAAI7c,KAAK9G,MAAM0L,QAClE4J,EAAU5J,EAAOiF,KAAKuxB,GAAMA,EAAEtjC,KAChCiJ,GAASA,EAAMjJ,KAAqC,IAA/B0W,EAAQ0D,QAAQnR,EAAMjJ,KAC3C8M,EAAOqa,KAAKle,GAGhBf,KAAK8F,SAAS,CAAClB,cAzGO,gCA4GOg3B,IAC7B57B,KAAK8F,SAAS,CACV+1B,cAAeD,OA9GG,2BAmHA,CAACz9B,EAAc29B,KACjC39B,EAAO29B,IACP97B,KAAK+7B,uBAAsB,GAC3B/7B,KAAKH,MAAMyC,QAAQ28B,6BAA6Bj/B,KAAKH,MAAM+S,cAAe5S,KAAKH,MAAMo8B,WAAY99B,EAAM+9B,IAAqBr0B,MAAK,KAC7H7H,KAAK+7B,uBAAsB,UAvHb,uBA6HHn3B,GAA+B5E,KAAK8F,SAAS,CAAClB,aA7H3C,iBAgITyK,GAAuBrP,KAAKH,MAAMyC,QAAQqhB,mBAAmBtU,KAhIpD,uBAmIJ,CAAC8sB,EAAoBC,EAAqBC,EAAoCC,KAChG,MAAMC,EAAcH,EAAa,4BAA8B,GAE/D,OACI,uBACIl/B,IAAKi/B,EAAOrkC,GACZ0kC,IAAKJ,EAAap8B,KAAKy8B,gBAAkBN,EAAOrkC,GAChDkJ,UAAW,6BAA+Bu7B,EAC1ChyB,QAAS,IAAM8xB,EAAMF,GACrBG,YAAa,IAAMA,EAAYH,IAE/B,uBACIn7B,UAAU,oBACVyI,IAAKizB,IACLpzB,IAAI,gBACJC,MAAM,KACNC,OAAO,OAEX,uBACIxI,UAAU,uBAEV,uBAAKA,UAAU,oBACVm7B,EAAO95B,aAAa,gBAAC,IAAD,MAAQ,IAAI,gBAAC,IAAD,MAAO,wBAAMrB,UAAU,wBACpD,gBAAC,IAAD,CACIlJ,GAAG,aACH+N,eAAe,4DACfjB,OAAQ,CACJ+3B,IAAKR,EAAOtjB,mBAMhC,uBAAK7X,UAAU,uBACX,uBAAKA,UAAU,8BACX,gBAAC,IAAD,YAtKM,sBA8KJnB,GAA+CA,EAAMlI,KAAK0K,eA3K5ErC,KAAK48B,gBAAkB,EAEvB58B,KAAK9G,MAAQ,CACT0L,OAAQ,GACR8C,MAAM,EACNm1B,QAAQ,EACR3B,QAAQ,EACRD,SAAU,KACVY,eAAe,GAGnB77B,KAAKy8B,gBAAkB98B,cAGpBm9B,oBACH9sB,QAAQC,IAAI,CACRjQ,KAAKH,MAAMyC,QAAQ28B,6BAA6Bj/B,KAAKH,MAAM+S,cAAe,GAAI,EAAGspB,IACjFl8B,KAAKH,MAAMyC,QAAQy6B,6BAA6B/8B,KAAKH,MAAM+S,eAAe,GAAO,KAClF/K,MAAK,KACJ7H,KAAK+7B,uBAAsB,MAI5BkB,mBAAmBC,GACtB,GAAIl9B,KAAKH,MAAMo8B,aAAeiB,EAAUjB,WAAY,CAChDpG,aAAa71B,KAAK48B,iBAElB,MAAMX,EAAaj8B,KAAKH,MAAMo8B,WAC9B,GAAmB,KAAfA,EACA,OAGJj8B,KAAK48B,gBAAkBvwB,OAAOyU,YAC1BvpB,UACIyI,KAAK+7B,uBAAsB,SACrB/7B,KAAKH,MAAMyC,QAAQ28B,6BAA6Bj/B,KAAKH,MAAM+S,cAAeqpB,GAChFj8B,KAAK+7B,uBAAsB,KAE/B/sB,mCAuILvN,SACH,MAAM27B,EACF,uBAAKtlC,GAAG,sBACJ,gBAAC,IAAD,CACIA,GAAG,iCACH+N,eAAe,4GACfjB,OAAQ,CACJ+3B,IA9NM,GA8NuB38B,KAAK9G,MAAM0L,OAAOY,WAMzD63B,GAAmBjzB,QAAgB,kBAAmB,OACtDkzB,GAA0BlzB,QAAgB,qBAAsB,aAEtE,IAAI6wB,EAAW,KACXj7B,KAAK9G,MAAM+hC,WACXA,EACI,uBAAKj6B,UAAU,uBACX,yBAAOA,UAAU,qCACZhB,KAAK9G,MAAM+hC,YAM5B,IAAIsC,EAAev9B,KAAKH,MAAMqyB,OAC9B,GAAIlyB,KAAKH,MAAM29B,cAAe,CAC1B,MAAMC,EAAYC,IAAD,cAAe,UAAC19B,KAAKH,MAAM29B,qBAAZ,OAAC,EAA0Bv2B,MAAM02B,GAAMA,EAAE7lC,KAAO4lC,EAAG5lC,OACnFylC,EAAeA,EAAaj2B,OAAOm2B,GAEvC,GAAIz9B,KAAKH,MAAM+9B,cAAe,CAC1B,MAAMH,EAAYC,IAAD,uBAAe19B,KAAKH,MAAM+9B,qBAA1B,aAAe,EAA0B32B,MAAM02B,GAAMA,EAAE7lC,KAAO4lC,EAAG5lC,MAClFylC,EAAe,IAAIA,KAAiBv9B,KAAKH,MAAM+9B,cAAct2B,OAAOm2B,IAGxE,MAAMyB,EAAsB3B,EAAa1zB,KAAKioB,GAC1C,OAAWA,GAAX,IAAkBpwB,MAAOowB,EAAMzvB,aAActB,MAAO+wB,EAAMh6B,OAG9D,OACI,gBAACmQ,EAAA,EAAD,CACInQ,GAAG,uBACHoQ,gBAAiB,8CACjBR,KAAM1H,KAAK9G,MAAMwO,KACjBS,OAAQnI,KAAK4G,WACbwB,SAAUpI,KAAK26B,YAEf,gBAAC1yB,EAAA,SAAD,CAAcU,aAAa,GACvB,gBAACV,EAAA,QAAD,CAAaa,eAAe,MACxB,gBAAC,IAAD,CACIhR,GAAG,2BACH+N,eAAe,oCACfjB,OAAQ,CACJu6B,SACI,8BAASn/B,KAAKH,MAAMu/B,sBAMxC,gBAACn3B,EAAA,OAAD,KACKgzB,EACD,gBAAC,IAAD,CACI/9B,IAAI,qBACJG,QAAS6hC,EACTnB,eAAgB/9B,KAAKg+B,aACrBvB,gBAAiBz8B,KAAKy8B,gBACtB73B,OAAQ5E,KAAK9G,MAAM0L,OACnBq5B,cAAej+B,KAAKm9B,YACpBtV,QA/RA,GAgSAqW,iBAAkBl+B,KAAKk+B,iBACvBC,YAAan+B,KAAK68B,OAClBuB,aAAcp+B,KAAKo+B,aACnBC,UAAWr+B,KAAKs+B,SAChB71B,aAAczI,KAAKyI,aACnB81B,UApSM,GAqSNnB,iBAAkBA,EAClBC,iBAAkBA,EAClBC,wBAAyBA,EACzBpC,OAAQl7B,KAAK9G,MAAMgiC,OACnBsD,QAASx+B,KAAK9G,MAAM2iC,cACpB4C,iBAAiBr0B,QAAgB,mCAAoC,8B,EAvQxE20B,E,aA9BjBK,gB,sBACAxsB,c,sBACAqpB,W,sBACA/J,O,qBAGAsL,c,UACAI,c,UACAz1B,O,SACAkzB,W,SACAC,c,SACAh5B,Q,WAIA28B,6B,oBACAtb,mB,oBACA4X,kB,oBACAwB,6B,mCCeJ,SAAe54B,cAjCf,SAAyBjL,EAAoBusB,GACzC,MAAMwW,EAAa/iC,EAAMwlC,MAAM7B,OAAO8B,YAEhCxkB,EAAOsL,EAAStL,OAAQoD,QAAerkB,IAAU,GAEvD,IAAIg5B,GAASmN,QAAgCnmC,EAAOihB,EAAKriB,IACzD,GAAImkC,EAAY,CACZ,MAAM4C,EAAQC,OAAO7C,EAAY,KACjC/J,EAASA,EAAO5qB,QAAQwqB,GAAU+M,EAAMzY,KAAK0L,EAAMzvB,eAAiBw8B,EAAMzY,KAAK0L,EAAM1xB,QAGzF,MAAO,CACHg/B,gBAAiBjlB,EAAK9X,aACtBuQ,cAAeuH,EAAKriB,GACpBujC,WAAY5V,EAAS4V,WACrBC,cAAe7V,EAAS6V,cACxBkC,cAAe/X,EAAS+X,cACxBvB,aACA/J,aAIR,SAA4B96B,GACxB,MAAO,CACHkL,SAAS+B,wBAA+E,CACpF46B,6BADoF,KAEpFtb,mBAFoF,KAGpF4X,kBAHoF,KAIpFwB,6BAA4BA,MAC7B3lC,MAIX,CAA4D2nC,I,6HC3C5D,MAAMO,EAAgD,EAAEC,eACpD,MAAMC,GAAsBC,kBAAavmC,GAAuBA,EAAMynB,SAAS+e,MAAMC,WAErF,KAAKH,WAAqBzuB,gBAAmByuB,WAAqBI,iBAC9D,OAAO,KAEX,MAAM1uB,EAAUsuB,EAAoBI,gBAEpC,OACI,uBAAK5+B,UAAU,wCACX,gBAAC,IAAD,CAAW6+B,MAAOL,EAAoBzuB,eAAe+uB,aACrD,uBAAK9+B,UAAU,4CACX,gBAAC,IAAD,CACIlJ,GAAG,gDACH+N,eAAe,6BACfjB,OAAQ,CACJi7B,MAAOL,EAAoBzuB,eAAe+uB,WAC1CC,OAAQP,EAAoBzuB,eAAeivB,aAGnD,2BACA,gBAAC,IAAD,CACIloC,GAAG,wCACH+N,eAAe,yBACfjB,OAAQ,CACJq7B,MAAOC,OAAOV,EAAoBzuB,eAAeovB,WAAWC,SAAS,EAAG,KACxEC,KAAMH,OAAOV,EAAoBzuB,eAAeuvB,UAAUF,SAAS,EAAG,SAIlF,uBAAKp/B,UAAU,gDACX,gBAAC,IAAD,CACIlJ,GAAG,4CACH+N,eAAe,qBAGvB,uBAAK7E,UAAU,2CACX,2BAAMkQ,EAAQC,OACbD,EAAQE,OAAS,2BAAMF,EAAQE,OAChC,qCAASF,EAAQI,KAAjB,aAA0BJ,EAAQhY,MAAlC,aAA4CgY,EAAQO,cACpD,2BAAMP,EAAQK,UAEjBguB,I,aA7CTA,S,UAkDJ,W,qGC7CA,MAAMgB,EAAgC1gC,IAClC,MAAM,KAAC2gC,EAAD,MAAOr3B,EAAP,QAAcvK,EAAd,UAAuBoC,EAAvB,UAAkCy/B,GAAa5gC,EAE/C6gC,EAAU7gC,EAAM6gC,SAAW,MAEjC,OACI,uBAAK1/B,UAAWs4B,IAAW,cAAekH,EAAMx/B,EAAtB,uBAAiD0/B,KACvE,uBAAK1/B,UAAU,qBACD,SAATw/B,GACG,qBAAGx/B,UAAU,8BAEP,SAATw/B,GACG,qBAAGx/B,UAAU,wBAGrB,uBAAKA,UAAU,qBACVmI,GACG,uBAAKnI,UAAU,sBACVmI,GAGT,uBACInI,UAAWs4B,IAAW,CAClBqH,qBAAsBC,QAAQz3B,MAGjCvK,IAGR6hC,GACG,0BACIz/B,UAAU,2BACVuJ,QAASk2B,GAET,qBAAGz/B,UAAU,kB,aA1C7Bw/B,K,WAAM,SAAW,UAAY,S,WAC7Br3B,M,SACAvK,Q,oBACAoC,U,WACAy/B,U,SACAC,Q,WAAU,MAAQ,SA4CtB,W,6QCrDO,SAASG,IACZ,MAAO,CACHhlC,KAAMC,6BAIP,SAASglC,IACZ,MAAO,CACHjlC,KAAMC,+B,0QCOd,MAAMilC,EAAY/xB,eA4BZgyB,EAAiC,CACnCC,QAAS,OACTC,QAAS,OACTC,SAAU,QAGC,MAAMC,UAA2BzhC,gBACrCC,YAAYC,GACfC,MAAMD,GADuB,2BAcdtI,UACf,GAAIyI,KAAK9G,MAAMgiC,OACX,OAGJl7B,KAAK8F,SAAS,CAACo1B,QAAQ,EAAMmG,YAAa,OAE1C,IAAIC,GAAW,EACX3iC,GAAKA,EAAEu7B,QAAUv7B,EAAEu7B,OAAOqH,SAAW5iC,EAAEu7B,OAAOqH,QAAQC,UACtDF,GAAW,GACX3jC,QAAW,QAAS,2BAA4B,CAAC8jC,OAAQzhC,KAAKH,MAAM4yB,iBAAiB36B,OAErF6F,QAAW,QAAS,+BAAgC,CAAC8jC,OAAQzhC,KAAKH,MAAM4yB,iBAAiB36B,KAG7F,MAAM,MAACJ,SAAesI,KAAKH,MAAMyC,QAAQo/B,kBAAkB1hC,KAAKH,MAAM4yB,iBAAiB36B,GAAIwpC,GACvF5pC,EACAsI,KAAK8F,SAAS,CAACu7B,YAAa3pC,EAAOwjC,QAAQ,IAE3Cl7B,KAAKmI,YAjCoB,iBAqCxB,KACLnI,KAAK8F,SAAS,CAACu7B,YAAa,KAAMnG,QAAQ,IAE1Cl7B,KAAK8F,SAAS,CAAC67B,kBAAmB,KAAMC,cAAc,IACtD5hC,KAAKH,MAAMyC,QAAQu/B,WAAW/1B,sBAC1B9L,KAAKH,MAAMiiC,sBACX9hC,KAAKH,MAAMiiC,0BA3Cc,+BA+CV,KACnB,MAAM,YAACT,GAAerhC,KAAK9G,MAC3B,IAAKmoC,EACD,MAAO,GAKX,IAAIU,EAAW,iCACX/hC,KAAKH,MAAM4yB,iBAAiB36B,KAAO66B,mDACnCoP,EAAW,mHACJ/hC,KAAKH,MAAM4yB,iBAAiB36B,KAAO66B,6CAC1CoP,EAAW,sHAGfA,GAAY,OACZA,GAAY,WAAa/hC,KAAKH,MAAMrH,KAAKwpC,WAAa,IAAMhiC,KAAKH,MAAMrH,KAAKypC,UAC5EF,GAAY,OACZA,GAAY,SAAW/hC,KAAKH,MAAMrH,KAAKsB,MACvCioC,GAAY,OAER/hC,KAAKH,MAAM6Y,OAAS1Y,KAAKH,MAAM6Y,MAAMqoB,EAAUmB,eAC/CH,GAAY,oBAAsB/hC,KAAKH,MAAM6Y,MAAMqoB,EAAUmB,aAC7DH,GAAY,QAEhBA,GAAY,aAAc31B,UAC1B21B,GAAY,OAEZA,GAAY,gBAAkB/hC,KAAKH,MAAMsiC,YACzCJ,GAAY,OAEZA,GAAY,8EAEZ,MAAMK,EAAiB,4CAAqCpiC,KAAKH,MAAMrH,KAAKsB,MAAQ,YAAcuoC,mBA1B9E,iCA0BgH,SAAWA,mBAAmBN,GAElK,OACI,uBAAK/gC,UAAU,wBACX,2BACA,yBAAOA,UAAU,iBACb,gBAAC,IAAD,CACIlJ,GAAG,uCACH+N,eAAe,+CACfjB,OAAQ,CACJ09B,KACI,gBAACC,EAAD,CACIjf,IAAK8e,EACLI,WAAWxuB,OAAE,qCACbstB,UAAU,EACVz7B,eAAe,WACf48B,eAAgBziC,KAAK0iC,2BA9FjD1iC,KAAK9G,MAAQ,CACTgiC,QAAQ,EACRmG,YAAa,KACbO,cAAc,EACdD,kBAAmB,MAI3B7E,oBACIjlC,OA+FJ4J,SACI,IAAIkhC,EAiBAC,EAhBA5iC,KAAKH,MAAM4yB,iBAAiB36B,KAAO66B,mDACnCgQ,EACI,gBAAC,IAAD,CACI7qC,GAAG,qDACH+N,eAAe,4BAGhB7F,KAAKH,MAAM4yB,iBAAiB36B,KAAO66B,6CAC1CgQ,EACI,gBAAC,IAAD,CACI7qC,GAAG,qDACH+N,eAAe,yBAQvB7F,KAAKH,MAAM4yB,iBAAiB36B,KAAO66B,mDACnCiQ,EACI,gBAAC,IAAD,CACI9qC,GAAG,2DACH+N,eAAe,sOACfjB,OAAQ,CACJi+B,MAAO7iC,KAAKH,MAAM4yB,iBAAiBoQ,SAIxC7iC,KAAKH,MAAM4yB,iBAAiB36B,KAAO66B,6CAC1CiQ,EACI,gBAAC,IAAD,CACI9qC,GAAG,oDACH+N,eAAe,qWACfjB,OAAQ,CACJi+B,MAAO7iC,KAAKH,MAAM4yB,iBAAiBoQ,UAMnD,MAAMC,EACF,uBACIl6B,MAAOo4B,EACPhgC,UAAU,qBAEV,gBAAC,IAAD,CACIlJ,GAAG,gCACH+N,eAAe,4FACfjB,OAAQ,CACJ09B,KACI,gBAAC,IAAD,CACIhf,IAnCF,mDAoCEkf,WAAWxuB,OAAE,yCACbnO,eAAe,mBAQjCnO,EAAQsI,KAAK+iC,uBACbC,EACF,gBAAC/6B,EAAA,SAAD,KACI,0BACIjH,UAAU,8BACViiC,eAAa,QACbr/B,SAAU5D,KAAK9G,MAAMgiC,OACrBv3B,WAAW,EACX4G,QAASvK,KAAK0iC,kBAEd,gBAAC,IAAD,CACIlE,QAASx+B,KAAK9G,MAAMgiC,OACpBxmB,KAAMO,KAAsB,kCAAmC,kBAE/D,gBAAC,IAAD,CACInd,GAAG,wCACH+N,eAAe,mBAOnC,OACI,gBAACoC,EAAA,EAAD,CACIC,gBAAgB,cAChBR,KAAM1H,KAAKH,MAAM6H,KACjBw7B,UAAU,EACV/6B,OAAQnI,KAAKmI,OACbC,SAAUpI,KAAKmI,OACfG,KAAK,SACLC,kBAAgB,iCAEhB,gBAACN,EAAA,SAAD,CAAcU,aAAa,GACvB,gBAACV,EAAA,QAAD,CACIa,eAAe,KACfhR,GAAG,iCAEF6qC,IAGT,gBAAC16B,EAAA,OAAD,KACI,2BACK26B,EACD,2BACClrC,EACD,2BACCorC,IAGRE,I,EA7NI5B,E,aAzBjBe,Y,WACAz6B,K,oBACAo6B,qB,SAGAx/B,Q,WACIu/B,W,oBACA9mC,qB,oBACA2mC,kB,mCA4PR,MAAMa,EAAmD,EAAE18B,iBAAgB28B,YAAWC,iBAAgBnf,MAAKge,cAEnG,qBACIlH,KAAM9W,EACN6W,IAAI,sBACJD,OAAO,SACPiJ,gBAAe7B,EACf/2B,QACK5L,IACG8jC,EAAe9jC,KAIvB,gBAAC,IAAD,CACI7G,GAAI0qC,EACJ38B,eAAgBA,K,aAtB5BA,e,sBACA28B,U,sBACAC,e,oBACAnf,I,sBACAge,S,qBCvOJ,SAAen9B,cA/Bf,SAAyBjL,EAAoBusB,GACzC,MAAMnqB,GAASmd,QAAUvf,GAEzB,MAAO,CACHwf,MAAOxf,EAAMynB,SAASyiB,MAAMC,UAC5B7qC,MAAMsiB,QAAe5hB,GACrBipC,YAAa7mC,EAAOgoC,aACpB57B,MAAMqzB,OAAY7hC,EAAO4S,sBACzBg2B,qBAAsBrc,EAASqc,yBAUvC,SAA4B1qC,GACxB,MAAO,CACHkL,SAAS+B,wBACL,CACIw9B,WADJ,IAEI9mC,qBAFJ,KAGI2mC,kBAAiBA,MAErBtqC,MAKZ,CAA4DgqC,G,uICb7C,MAAMmC,UAAwB5jC,gBAA2B,oDAsBrDhB,IACXA,EAAEqH,iBACEhG,KAAKH,MAAM8mB,aACX3mB,KAAKH,MAAM8mB,iBAfnBmW,oBACI98B,KAAKH,MAAMyC,QAAQu+B,gCACnBrhC,SAASlB,KAAKklC,UAAUze,IAAI,2BAGhC0e,uBAC4C,IAApCzjC,KAAKH,MAAM6jC,sBACXlkC,SAASlB,KAAKklC,UAAUG,OAAO,2BAEnC3jC,KAAKH,MAAMyC,QAAQw+B,gCAUvBr/B,SACI,IAAKzB,KAAKH,MAAMjB,QACZ,OAAO,KAGX,IAAIglC,EAAW,mBACf,MAAMC,EAAW,CAACC,gBAAiB,GAAIC,MAAO,IACxCC,EAAY,CAACD,MAAO,IAiB1B,IAAIp7B,EAhBA3I,KAAKH,MAAMkkC,OAAS/jC,KAAKH,MAAMokC,WAC/BJ,EAASC,gBAAkB9jC,KAAKH,MAAMkkC,MACtCF,EAASE,MAAQ/jC,KAAKH,MAAMokC,UAC5BD,EAAUD,MAAQ/jC,KAAKH,MAAMokC,WACtBjkC,KAAKH,MAAMhE,OAASmmB,cAC3B4hB,EAAW,6CACJ5jC,KAAKH,MAAMhE,OAASmmB,aAC3B4hB,EAAW,4CACJ5jC,KAAKH,MAAMhE,OAASmmB,aAC3B4hB,EAAW,4CACJ5jC,KAAKH,MAAMhE,OAASmmB,iBAC3B4hB,EAAW,gDACJ5jC,KAAKH,MAAMhE,OAASmmB,eAC3B4hB,EAAW,6CAIX5jC,KAAKH,MAAMqkC,kBACXv7B,EACI,qBACIyxB,KAAK,IACLp5B,UAAU,0BACV4H,MAAOo7B,EACPz5B,QAASvK,KAAK2mB,aAEb,MAKb,IAAI/nB,EAAUoB,KAAKH,MAAMjB,QACH,iBAAXA,IACPA,EACI,gBAAC,IAAD,CAA0B9G,GAAIkI,KAAKH,MAAMjB,WAGjD,MAAMulC,EACF,gBAACC,EAAA,EAAD,CAAStsC,GAAG,6BACPkI,KAAKH,MAAMwkC,WAAarkC,KAAKH,MAAMwkC,WAAazlC,GASzD,OACI,uBACIoC,UAAW4iC,EACXh7B,MAAOi7B,GAEP,gBAAC,IAAD,CACIS,UAAWt1B,wBACXu1B,UAAU,SACVC,QAASL,GAET,uBAAKnjC,UAAU,0BACVhB,KAAKH,MAAMuJ,KAAOpJ,KAAKH,MAAMuJ,KAhBrB,KACdpJ,KAAKH,MAAM4kC,mBACjBzkC,KAAKH,MAAMqkC,gBAAkB,uBAAKljC,UAAU,iBAAiB,KAAkB,uBAAKA,UAAU,iBAAiB,MAc/D0jC,GACpC9lC,GAEIoB,KAAKH,MAAM4kC,kBACZ,wBAAMzjC,UAAU,0BACXhB,KAAKH,MAAM8kC,WACZ,gBAAC,IAAD,CACI7sC,GAAIkI,KAAKH,MAAM+kC,gBACf/+B,eAAgB7F,KAAKH,MAAMglC,yBAEzBC,GACE,gBAAC,IAAD,CACI9vB,UAAW8vB,EACX9jC,UAAW,wBACX+K,WAAYq1B,EACZ72B,QAAS,KAAM5M,QAAW,QAAS,gCACnCkO,QAASC,qBACTE,YAAa,CACTymB,iBAAkBzyB,KAAKH,MAAM4yB,iBAC7BqP,qBAAsB9hC,KAAKH,MAAM8mB,cAGpCme,MAQjB9kC,KAAKH,MAAM4kC,kBACX,0BACIzjC,UAAU,iBACVuJ,QAASvK,KAAKH,MAAMklC,eAEpB,gBAAC,IAAD,CACIjtC,GAAIkI,KAAKH,MAAM+kC,gBACf/+B,eAAgB7F,KAAKH,MAAMglC,4BAM9Cl8B,I,EA1II46B,E,aArBjBW,gB,SACAH,M,WACAE,U,WACApoC,K,WACA+C,Q,oBACAylC,W,SACA1d,Y,SACAge,U,SACAjB,qB,WACAqB,c,SACAH,gB,WACAC,uB,WACAJ,iB,SACAr7B,K,SAEA9G,Q,WACIu+B,8B,oBACAC,8B,qCAIayC,E,eACK,CAClBW,iBAAiB,EACjBH,MAAO,GACPE,UAAW,GACXpoC,KAAMmmB,cACNyiB,kBAAkB,EAClBO,cAAc,ICpBtB,SAAe7gC,cAff,SAAyBjL,GACrB,MAAO,CACHwqC,sBAAsBuB,OAAwB/rC,OAItD,SAA4B9B,GACxB,MAAO,CACHkL,SAAS+B,wBAAmB,CACxBw8B,8BADwB,EAExBC,8BAA6BA,GAC9B1pC,MAIX,CAA4DmsC,G,wBC7B5D,QAAe,IAA0B,6C,oJCYzC,MAAM2B,EAAqB,mBAcZ,MAAMC,UAA2BxlC,gBAC5CC,YAAYC,GACRC,MAAMD,GADgB,wBAeV,KACPG,KAAKH,MAAMulC,kBAGhBznC,QAAW,SAAU,qBAErB0nC,aAAaC,QAAQJ,EAAqBllC,KAAKH,MAAM6U,KAAM,QAC3D1U,KAAK8F,SAAS,CACVy/B,WAAW,IAEXvlC,KAAKH,MAAM2lC,aACXxlC,KAAKH,MAAM2lC,kBAvBfxlC,KAAK9G,MAAQ,CACTqsC,WAAW,GAIY,gCAAC1lC,GAE5B,MAAO,CACH0lC,UAA0B,SAFZF,aAAaI,QAAQP,EAAqBrlC,EAAM6U,OAqBtEjT,SACI,GAAIzB,KAAK9G,MAAMqsC,UACX,OAAO,KAEX,QAA8CvlC,KAAKH,OAA7C,eAACulC,EAAD,KAAiB1wB,GAAvB,EAAgCgxB,E,kXAAhC,MACA,OACI,gBAAC,EAAD,iBACQA,EADR,CAEIxB,gBAAiBkB,EACjBze,YAAa3mB,KAAK2lC,cAClB/mC,QACI,gCACI,uBACIoC,UAAU,eACVyI,IAAKm8B,IAET,gBAAC,IAAD,CACIhnC,QAAS8V,EACTrX,QAAS,CACLkH,YAAY,EACZC,kBAAkB,U,EAnD7B2gC,E,aATjBC,e,oBACA1wB,K,sBACA8wB,Y,WCnBJ,QAAe,IAA0B,6CCAzC,EAAe,IAA0B,6C,2BC8CzC,MAAMK,GAAiDhmC,IAAiB,UACpE,MAAMimC,EAAyB,KAC3BjmC,EAAMyC,QAAQuf,cAAc+G,wBAG1Bmd,EAA8B,KAChClmC,EAAMyC,QAAQuf,cAAc+G,8BAG1Bod,EAAuC,KACzCnmC,EAAMyC,QAAQuf,cAAc+G,0CAG1Bqd,EAAiC,KACnCpmC,EAAMyC,QAAQuf,cAAc+G,0CAG1Bsd,EAA0C,KAC5CrmC,EAAMyC,QAAQuf,cAAc+G,8CAG1Bud,EAAoC,KACtCtmC,EAAMyC,QAAQuf,cAAc+G,8CAG1Bwd,EAAqB,CAAC3uC,QAAS,+BAAgCC,MAAO,6BAEtE2uC,EAA0B5T,IAC5B,IAAKA,GACAA,EAAiB36B,KAAO66B,oDACzBF,EAAiB36B,KAAO66B,2CACxB,OAAO,KAGX,IAGI2T,EAHA1nC,EAAgC,GAChC/C,EAAO,GACP8oC,GAAY,EAEZ4B,EAAc,KACdC,GAAc,EAqElB,OAnEI/T,EAAiBgU,OACjB7nC,EACI,gCACI,uBACIoC,UAAU,eACVyI,IAAKi9B,IAET,gBAAC,IAAD,CACI5uC,GAAG,+CACH+N,eAAe,2EAKvB4sB,EAAiB36B,KAAO66B,oDACxB2T,EAAcJ,EACdK,EAAc1mC,EAAM8mC,iDACblU,EAAiB36B,KAAO66B,6CAC/B2T,EAAcH,EACdI,EAAc1mC,EAAM+mC,2CAGxB/qC,EAAOmmB,iBACP2iB,GAAY,EACZ6B,GAAc,IAEV/T,EAAiB36B,KAAO66B,oDACxB/zB,EACI,gCACI,uBACIoC,UAAU,eACVyI,IAAKm8B,IAET,gBAAC,IAAD,CACI9tC,GAAG,+DACH+N,eAAe,0GACfjB,OAAQ,CACJi+B,MAAOpQ,EAAiBoQ,UAKxCyD,EAAcN,EACdO,EAAc1mC,EAAMgnC,8CACbpU,EAAiB36B,KAAO66B,6CAC/B/zB,EACI,gCACI,uBACIoC,UAAU,eACVyI,IAAKm8B,IAET,gBAAC,IAAD,CACI9tC,GAAG,2DACH+N,eAAe,0GACfjB,OAAQ,CACJi+B,MAAOpQ,EAAiBoQ,UAKxCyD,EAAcL,EACdM,EAAc1mC,EAAMinC,wCAExBjrC,EAAOmmB,aACP2iB,GAAY,EACZ6B,GAAc,GAEX,CACHO,QAASnoC,EACTooC,YAAaV,EACbW,YAAaV,EACbW,KAAMrrC,EACNsrC,UAAWxC,EACXyC,YAAaZ,IAKrB,GAAI3mC,EAAMwnC,oBAAqB,OAC3B,IAAIC,QAAyBznC,EAAM4rB,SAAU,CACzC,MAAM7sB,EAAW,gCACb,uBACIoC,UAAU,eACVyI,IAAK89B,IAET,gBAAC,IAAD,CACIzvC,GAAG,yCACH+N,eAAe,sEAGvB,OACI,gBAAC,EAAD,CACIhK,KAAMmmB,cACNpjB,QACI,gCACKA,EACD,gBAAC,IAAD,CAAa4oC,cAAepB,KAGpC/B,WAAYzlC,IAKxB,IAAI6oC,QAAiB5nC,EAAM4rB,SAAU,CACjC,MAAM7sB,EAAW,gCACb,uBACIoC,UAAU,eACVyI,IAAK89B,IAET,gBAAC,IAAD,CACIzvC,GAAG,yCACH+N,eAAe,sEAGvB,OACI,gBAAC,EAAD,CACIhK,KAAMmmB,cACNpjB,QACI,gCACKA,EACD,gBAAC,IAAD,CAAa4oC,cAAepB,KAGpC/B,WAAYzlC,IAKxB,MAAM8oC,GAA0BC,QAAoB9nC,EAAM4rB,SAC1D,IAAImc,QAAe/nC,EAAM4rB,eAA+C,IAA5Bic,GAA2CA,GAA2B,KAAO7nC,EAAMgoC,8BAA+B,CAC1J,MAAMC,EACF,gBAAC,KAAD,CACIC,kBACI,gBAAC,IAAD,CACIjwC,GAAG,gDACH+N,eAAe,6BAM/B,IAAIjH,EACA,gCACI,uBACIoC,UAAU,eACVyI,IAAKm8B,IAET,gBAAC,IAAD,CACI9tC,GAAG,gDACH+N,eAAe,qDACfjB,OAAQ,CACJojC,KAAMN,MAMlBO,EAAsBjmB,kBAkB1B,OAhBI0lB,EAA0B,IAC1B9oC,EACI,gCACI,uBACIoC,UAAU,eACVyI,IAAK89B,IAET,gBAAC,IAAD,CACIzvC,GAAG,yDACH+N,eAAgB,4IAI5BoiC,EAAsBjmB,eAItB,gBAAC,EAAD,CACIkiB,iBAAiB,EACjBvd,YAAaof,EACblqC,KAAMosC,EACNrpC,QACI,gCACKA,EACAkpC,GAGTzD,WAAYzlC,IAKxB,KAAKgpC,QAAe/nC,EAAM4rB,WAAYyc,QAAkBroC,EAAM4rB,WAAa5rB,EAAMsoC,yBAA0B,OACvG,MAAMvpC,EAAW,gCACb,uBACIoC,UAAU,eACVyI,IAAKm8B,IAET,gBAAC,IAAD,CACI9tC,GAAG,0CACH+N,eAAe,oDACfjB,OAAQ,CACJwjC,KAAM,IAAIt6B,KAAK2hB,SAAQ,UAAC5vB,EAAM4rB,eAAP,aAAC,EAAe4c,UAAW,SAI9D,OACI,gBAAC,EAAD,CACInE,iBAAiB,EACjBvd,YAAamf,EACbjqC,KAAMmmB,kBACNpjB,QACI,gCACKA,EACD,gBAAC,IAAD,CAAa4oC,cAAepB,KAGpC/B,WAAYzlC,IAKxB,GAAkC,WAA9B,UAAAiB,EAAM4rB,eAAN,eAAeI,aACXhsB,EAAMyoC,kBACV,IAAK,MAAMz2B,KAAUvM,OAAOV,OAAO/E,EAAMyoC,mBAAoB,CACzD,MAAMC,EAASlC,EAAuBx0B,GACtC,GAAK02B,IAAUA,EAAOtB,YAItB,OACI,gBAAC,EAAD,CACI/C,gBAAiBqE,EAAOnB,YACxBzgB,YAAa4hB,EAAOvB,YACpBnrC,KAAM0sC,EAAOrB,KACbvC,UAAW4D,EAAOpB,UAClBvC,iBAAiB5wB,OAAE,kDACnB6wB,uBAAuB,aACvBpS,iBAAkB5gB,EAClBjT,QAAS2pC,EAAOxB,gBAOhC,IAAIO,QAAyBznC,EAAM4rB,SAC/B,OACI,gBAAC,EAAD,CACI5vB,KAAMmmB,cACNpjB,QACI,gCACI,uBACIoC,UAAU,eACVyI,IAAK89B,IAET,gBAAC,IAAD,CACIzvC,GAAI8wB,wBACJ/iB,eAAe,8HAS3C,MAAM,cAACD,GAAiB/F,EAAM8F,KAE9B,GAA6C,UAAzC,UAAA9F,EAAMvE,cAAN,eAAcktC,yBACgC,UAA1C,UAAA3oC,EAAMvE,cAAN,eAAcmtC,yBACpB,CACE,MAAMC,EAAe9iC,EAAc,CAC/B9N,GAAI8wB,kBACJ/iB,eAAgB,+DAGpB,OACI,gBAACs/B,EAAD,CACIC,gBAAgB,EAChB1wB,KAAMg0B,EACN7sC,KAAMmmB,eAKlB,GAAIniB,EAAMwnC,qBAAiD,MAA1B,UAAAxnC,EAAMvE,cAAN,eAAcqtC,SAAgB,OAC3D,IAAI7wC,EACA+N,EACyC,UAAzC,UAAAhG,EAAMvE,cAAN,eAAcstC,yBACd9wC,GAAKkc,OAAE,+CACPnO,EAAiB,0OAEjB/N,GAAKkc,OAAE,wCACPnO,EAAiB,8KAGrB,MACMgjC,EAAiBjjC,EAAc,CAAC9N,KAAI+N,kBAD3B,CAAC7I,QAAS6C,EAAM7C,UAG/B,OACI,gBAACmoC,EAAD,CACIC,gBAAgB,EAChB1wB,KAAMm0B,EACNhtC,KAAMmmB,oBAKlB,OAAO,M,cA7WPyJ,Q,QACA4b,oB,oBACAQ,8B,SACAM,yB,SACAtB,6C,SACAF,gD,SACAG,uC,SACAF,0C,SACA5pC,Q,sBAEAsF,Q,WACIuf,c,kCAqWR,UAAepX,QAAWo7B,IC3W1B,IAAe1hC,cApBf,SAAyBjL,GACrB,MAAO,CACH8D,SAASoP,UACTy7B,8BAA+BjH,QAAQ1nC,EAAMwlC,MAAM6J,OAAOO,iBAAiBlgB,8BAC3Euf,yBAA0BvH,QAAQ1nC,EAAMwlC,MAAM6J,OAAOO,iBAAiBlgB,wBACtEie,6CAA8CjG,QAAQ1nC,EAAMwlC,MAAM6J,OAAOO,iBAAiBlgB,0CAC1F+d,gDAAiD/F,QAAQ1nC,EAAMwlC,MAAM6J,OAAOO,iBAAiBlgB,8CAC7Fke,uCAAwClG,QAAQ1nC,EAAMwlC,MAAM6J,OAAOO,iBAAiBlgB,0CACpFge,0CAA2ChG,QAAQ1nC,EAAMwlC,MAAM6J,OAAOO,iBAAiBlgB,kDAI/F,SAA4BxxB,GACxB,MAAO,CACHkL,SAAS+B,wBAAmB,CACxBwd,cAAaA,KACdzqB,MAIX,CAA4D2xC,I,yIChB7C,MAAMC,WAAmBrpC,gBACpCC,YAAYC,GACRC,MAAMD,GADgB,sBAkBb,KACTwM,OAAOie,SAAS2e,YAhBhBjpC,KAAK9G,MAAQ,CACTgwC,uBAAwBrpC,EAAMspC,eAIP,gCAACtpC,EAAc3G,GAC1C,OAAKA,EAAMgwC,wBAA0BrpC,EAAMspC,cAChC,CACHD,uBAAwBrpC,EAAMspC,eAI/B,KAOX1nC,SACI,MAAM,uBAACynC,GAA0BlpC,KAAK9G,OAChC,cAACiwC,GAAiBnpC,KAAKH,MAE7B,OAAKqpC,GAIAE,QAAoBF,EAAwBC,GA0B1C,KAxBC,gBAAC,EAAD,CACIttC,KAAMmmB,kBACNpjB,QACI,gBAAC,WAAD,KACI,gBAAC,IAAD,CACI9G,GAAG,kBACH+N,eAAe,8CAEnB,qBACI0E,QAASvK,KAAKqpC,WACdzgC,MAAO,CAAC0gC,WAAY,UAEpB,gBAAC,IAAD,CACIxxC,GAAG,sBACH+N,eAAe,yBAGtB,OAtBV,M,GA5BEmjC,G,aAPjBG,c,wBCEJ,UAAehlC,cANf,SAAyBjL,GACrB,MAAO,CACHiwC,cAAejwC,EAAMynB,SAAS4oB,QAAQJ,iBAI9C,CAAwCH,I,4NC8BxC,MAAMQ,WAAiC7pC,gBAA2B,2DAqB1C,SArB0C,uBAyBhDpI,WACVoG,QACI8rC,iBACA,+CAEEzpC,KAAKH,MAAMyC,QAAQ+L,gBAAgBrO,KAAKH,MAAMuqB,YAAYtyB,GAAI,CAAC,CACjEkW,SAAUC,0BACVK,QAAStO,KAAKH,MAAMuqB,YAAYtyB,GAChCsI,KAAMspC,UACN3oC,MAAO,aAlC+C,4BAsC3C,KACf,MAAM,UAAC4oC,EAAD,UAAYtG,EAAZ,YAAuBuG,EAAvB,QAAoCC,EAApC,aAA6CC,GAAgB9pC,KAAKH,MAGxE,OAAqB,OAAjBiqC,GAI+B,UAA/BA,aAAA,EAAAA,EAAcC,iBAIbF,KAIAD,MAIAD,GAAaA,EAAYtG,EAAWnB,cAAgByH,MA1DC,yBAiE9C,KACZ,MAAM,UAACA,EAAD,UAAYtG,GAAarjC,KAAKH,MACpC,IAAImqC,GAAc,EAMlB,OAHIL,EAAYtG,EAAWnB,cACvB8H,GAAc,GAEXA,KAzEmD,qBA4ElD,KACJhqC,KAAKiqC,iBACLtsC,QACI8rC,iBACA,4CAGJ9rC,QACI8rC,iBACA,4CAGRzpC,KAAKH,MAAMyC,QAAQsJ,UAAU,CACzBC,QAASC,oBACTC,WAAYm+B,UAzFG,0BACf,KAAQlqC,KAAKH,MAAMwjC,kBACbrjC,KAAKH,MAAMyC,QAAQvH,uBAGxB,KAAQiF,KAAKH,MAAMiqC,eAAkB,KAAQ9pC,KAAKH,MAAMwjC,aAAcrjC,KAAKmqC,qBACxEnqC,KAAKiqC,iBACLtsC,QACI8rC,iBACA,kCAGJ9rC,QACI8rC,iBACA,mCA+EhBhoC,SACI,MAAM,UAACkoC,EAAD,UAAYtG,EAAZ,YAAuBlU,GAAenvB,KAAKH,MAEjD,GAAI,KAAQG,KAAKH,MAAMwjC,WAEnB,OAAO,KAGX,IAAKrjC,KAAKmqC,mBACN,OAAO,KAIX,GAAIR,IAActG,EAAWnB,aACzB/S,EAAYvE,MAAMwf,GAASA,EAAKhqC,OAASspC,WAAoC,SAAfU,EAAKrpC,QACnE,OAAO,KAGX,MAAMipC,EAAchqC,KAAKiqC,gBAEzB,OACI,gBAAC,EAAD,CACIpuC,KAAMmuC,EAAchoB,aAA+BA,cACnDkiB,gBAAiB8F,EACjBrjB,YAAa3mB,KAAK2mB,YAClBoe,cAAe/kC,KAAK2kC,UACpBC,iBAAiB5wB,OAAE,mEACnB6wB,uBAAwB,2BACxBjmC,QAASorC,GAAch2B,OAAE,iCAAkCA,OAAE,6BAC7DywB,kBAAkB,K,GA3H5B+E,G,aAfFG,U,sBACAC,Y,oBAEAza,Y,qBACA0a,Q,oBAGAvnC,Q,WACI+L,gB,oBACAtT,qB,oBACAs4B,qB,oBACAznB,U,mCAsIR,UAAey+B,QAAyBb,IC7HxC,IAAerlC,cA3Bf,SAAyBjL,GACrB,MAAMoxC,GAAcC,WACpB,MAAO,CACHZ,UAAWla,UAAShX,QAAUvf,GAAOsxC,2BAA6B,IAClEnH,UAAWnqC,EAAMynB,SAASyiB,MAAMC,UAChCuG,aAAa3d,SAAyB/yB,GACtCkxB,aAAatP,SAAe5hB,GAC5B2wC,QAAqC,UAA5Bne,QAAWxyB,GAAOwpB,MAC3BonB,aAAc5wC,EAAMynB,SAAS+e,MAAMoK,aACnC3a,YAAamb,EAAYpxC,EAAO+U,+BAIxC,SAA4B7W,GACxB,MAAO,CACHkL,SAAS+B,wBACL,CACIgK,gBADJ,MAEItT,qBAFJ,KAGI6Q,UAHJ,IAIIynB,qBAAoBA,OAExBj8B,MAKZ,CAA4DoyC,I,qJCtB5D,MAAMiB,WAA+B9qC,gBAA2B,mEAOhC,KAAM,QAC9B,MAAyD,YAAlD,UAAAK,KAAKH,MAAMiqC,oBAAX,mBAAyBY,oBAAzB,eAAuC74B,WARU,4BAWzC,KACf,MAAM,YAAC+3B,EAAD,QAAcC,EAAd,aAAuBC,GAAgB9pC,KAAKH,MAGlD,QAAqB,OAAjBiqC,GAI+B,UAA/BA,aAAA,EAAAA,EAAcC,gBAIbF,IAIAD,KAIAe,QAAsB3qC,KAAKH,MAAM8/B,YAAc3/B,KAAK4qC,gCA/BD,6BAsCxC,KAChBr+B,UAAoB,0CAtCD,0BACf,KAAQvM,KAAKH,MAAM8/B,iBACb3/B,KAAKH,MAAMyC,QAAQuoC,mBAuCjCppC,SACI,OAAI,KAAQzB,KAAKH,MAAM8/B,WAAa,KAAQ3/B,KAAKH,MAAMiqC,cAC5C,KAGN9pC,KAAKmqC,mBAKN,gBAAC,EAAD,CACItuC,KAAMmmB,cACNkiB,iBAAiB,EACjBa,cAAe/kC,KAAK8qC,kBACpBlG,iBAAiB5wB,OAAE,gDACnB6wB,uBAAwB,sBACxBjmC,QAASoB,KAAK4qC,6BAA8B52B,OAAE,uDAAwDA,OAAE,gDACxGywB,kBAAkB,EAClBO,cAAc,IAZX,M,GAhDbyF,G,aAVFb,Y,oBACAC,Q,oBAGAvnC,Q,WACI+wB,qB,oBACAwX,iB,mCAuER,UAAeR,QAAyBI,ICnDxC,IAAetmC,cAxBf,SAAyBjL,GACrB,MAAO,CACH0wC,aAAa3d,SAAyB/yB,GACtC2wC,QAAqC,UAA5Bne,QAAWxyB,GAAOwpB,MAC3BonB,aAAc5wC,EAAMynB,SAAS+e,MAAMoK,aACnCnK,SAAUzmC,EAAMynB,SAAS+e,MAAMC,aAIvC,SAA4BvoC,GACxB,MAAO,CACHkL,SAAS+B,wBACL,CACIgK,gBADJ,MAEItT,qBAFJ,KAGI6Q,UAHJ,IAIIynB,qBAJJ,MAKIwX,iBAAgBA,OAEpBzzC,MAKZ,CAA4DqzC,I,yHCM5D,MAAMM,WAAkCprC,gBAA2B,qDAsBjDpI,UACV,MAAM,gBAACyzC,GAAmBhrC,KAAKH,MAC/B,IAAIorC,EAAe,GACfD,EAAkBE,6BAClBD,EAAe,iBACRD,GAAmBE,8BAA2CF,GAAmBE,mBACxFD,EAAe,kBAEnBttC,QACI8rC,iBADM,iCAEoBuB,EAFpB,gBAIJhrC,KAAKH,MAAMyC,QAAQ+L,gBAAgBrO,KAAKH,MAAMuqB,YAAYtyB,GAAI,CAAC,CACjEkW,SAAUC,wBACVK,QAAStO,KAAKH,MAAMuqB,YAAYtyB,GAChCsI,KAAMspC,WACN3oC,MAAO,GAAF,OAAKkqC,SAtC6C,4BA0C5C,KACf,MAAM,YAACE,EAAD,YAAcvB,EAAd,QAA2BC,GAAW7pC,KAAKH,MACjD,OAAOsrC,GAAevB,GAAeC,KA5CsB,yBA+C/C,KACZ,MAAM,gBAACmB,GAAmBhrC,KAAKH,MAC/B,IAAImqC,GAAc,EAKlB,OAHIgB,GAAmBE,mBACnBlB,GAAc,GAEXA,KAtDoD,qBAyDnD,KACR,MAAM,gBAACgB,GAAmBhrC,KAAKH,MAC3BG,KAAKiqC,iBACLtsC,QACI8rC,iBADM,4CAE+BuB,EAF/B,WAKVrtC,QACI8rC,iBACA,2CAGRzpC,KAAKH,MAAMyC,QAAQsJ,UAAU,CACzBC,QAASC,oBACTC,WAAYm+B,UAvEG,0BAKnB,GAJI,KAAQlqC,KAAKH,MAAMwjC,kBACbrjC,KAAKH,MAAMyC,QAAQvH,wBAGxB,KAAQiF,KAAKH,MAAMiqC,gBAAkB,KAAQ9pC,KAAKH,MAAMwjC,YAAcrjC,KAAKmqC,mBAAoB,CAChG,MAAM,gBAACa,GAAmBhrC,KAAKH,MAC3BG,KAAKiqC,iBACLtsC,QACI8rC,iBADM,2BAEcuB,EAFd,WAKVrtC,QACI8rC,iBACA,iCA4DhBhoC,SAAS,UACL,MAAM,gBAACupC,EAAD,YAAkB7b,GAAenvB,KAAKH,MAE5C,GAAI,KAAQG,KAAKH,MAAMwjC,WAEnB,OAAO,KAGX,IAAKrjC,KAAKmqC,mBACN,OAAO,KAGX,GAAKhb,EAAYvE,MAAMwf,GAASA,EAAKhqC,OAASspC,YAAqC,mBAAfU,EAAKrpC,SAA+BiqC,EAAkBE,8BACpHF,GAAmBE,8BAA2CF,GAAmBE,kBACnF/b,EAAYvE,MAAMwf,GAASA,EAAKhqC,OAASspC,YAAqC,kBAAfU,EAAKrpC,QACpE,OAAO,KAGX,MAAMqqC,EACF,gBAAC,IAAD,CACItzC,GAAG,sDACH+N,eAAe,gEACfjB,OAAQ,CAAComC,qBAIXK,EACF,gBAAC,IAAD,CACIvzC,GAAG,wDACH+N,eAAe,2DACfjB,OAAQ,CAAComC,qBAIXM,GAAmBC,SAAsB,UAAAvrC,KAAKH,MAAMiqC,oBAAX,eAAyB0B,cAAyB,IAAO,gBAClGC,GAAmBF,SAAsB,UAAAvrC,KAAKH,MAAMiqC,oBAAX,eAAyB0B,cAAyB,IAAO,WAA3D,UAAuExrC,KAAKH,MAAMuqB,YAAYshB,gBAA9F,aAAuE,EAAiCC,mBAE/IC,EACF,gBAAC,IAAD,CACI9zC,GAAG,gDACH+N,eAAe,gHACfjB,OAAQ,CAAC6mC,mBAAkBH,sBAInC,IAAIO,EACAziC,EACJ,OAAQ4hC,GACR,KAAKE,6BACL,KAAKA,kBACDW,EAAgBR,EAChB,MACJ,KAAKH,iBACL,KAAKA,kBACDW,EAAgBD,EAChB,MACJ,QACIC,EAAgBT,EAChBhiC,EAAO,qBAAGpI,UAAU,8BAIxB,MAAMgpC,EAAchqC,KAAKiqC,gBAEzB,OACI,gBAAC,EAAD,CACIpuC,KAAMmuC,EAAchoB,aAA+BA,cACnDkiB,gBAAiB8F,EACjBrjB,YAAa3mB,KAAK2mB,YAClBoe,cAAe/kC,KAAK2kC,UACpBC,iBAAiB5wB,OAAE,yDACnB6wB,uBAAwB,gBACxBjmC,QAASitC,EACTpH,kBAAkB,EAClBr7B,KAAMA,K,GAtJhB2hC,G,aAhBFnB,Y,oBACAuB,Y,oBAEAhc,Y,qBACA6b,gB,sBACAnB,Q,oBAGAvnC,Q,WACI+L,gB,oBACAtT,qB,oBACAs4B,qB,oBACAznB,U,mCAgKR,UAAey+B,QAAyBU,IC3IxC,IAAe5mC,cA1Cf,SAAyBjL,GACrB,MAAMoxC,GAAcC,WAEdT,EAAe5wC,EAAMynB,SAAS+e,MAAMoK,aACpCD,EAAsC,UAA5Bne,QAAWxyB,GAAOwpB,MAClC,IAAIyoB,GAAc,EACdH,EAAkB,EAUtB,OARInB,GAA2C,UAAhCC,aAAA,EAAAA,EAAcgC,iBACzBX,GAAc,EACdH,GAAkBe,QAAoCjC,EAAa0B,cAC/DR,EAAkBE,sBAClBF,EAAkBE,sBAInB,CACHC,cACAH,kBACA3H,UAAWnqC,EAAMynB,SAASyiB,MAAMC,UAChCuG,aAAa3d,SAAyB/yB,GACtCkxB,aAAatP,SAAe5hB,GAC5B2wC,UACAC,eACA3a,YAAamb,EAAYpxC,EAAO+U,6BAIxC,SAA4B7W,GACxB,MAAO,CACHkL,SAAS+B,wBACL,CACIgK,gBADJ,MAEItT,qBAFJ,KAGI6Q,UAHJ,IAIIynB,qBAAoBA,OAExBj8B,MAKZ,CAA4D2zC,ICrC7C,MAAMiB,WAAkCrsC,gBACnD8B,SAAS,UACL,IAAIwqC,EAAiC,KACG,UAApC,UAAAjsC,KAAKH,MAAMvE,cAAX,eAAmB4wC,eAAnB,UAA8ClsC,KAAKH,MAAMvE,OAAO6wC,kBAAhE,OAA8C,EAA8B75B,SAC5E25B,EACI,gBAAC9G,EAAD,CACIpB,MAAO/jC,KAAKH,MAAMvE,OAAO8wC,YACzBnI,UAAWjkC,KAAKH,MAAMvE,OAAO+wC,gBAC7BjH,eAA2D,SAA3CplC,KAAKH,MAAMvE,OAAOgxC,qBAClC53B,KAAM1U,KAAKH,MAAMvE,OAAO6wC,cAKpC,IAAII,EAAW,KACXvsC,KAAKH,MAAM2sC,cACXD,EACI,gBAAC,EAAD,CACI1wC,KAAMmE,KAAKH,MAAM2sC,YAAY90C,MAAMmE,KACnC+C,QAASoB,KAAKH,MAAM2sC,YAAY90C,MAAMkH,QACtCslC,iBAAiB,EACjBvd,YAAa3mB,KAAKH,MAAMyC,QAAQmqC,gBAI5C,IAAIC,EAAuB,KACvBC,EAAyB,KACzBC,EAA4B,KAahC,MAZkC,UAA9B,UAAA5sC,KAAKH,MAAM4rB,eAAX,eAAoB/I,SACpBgqB,EACI,gBAAC,GAAD,MAEJC,EACI,gBAAC,GAAD,MAEJC,EACI,gBAAC,GAAD,OAKJ,gCACKX,EACAM,EACAG,EACAC,EACAC,EACD,gBAAC,GAAD,MACA,gBAAC,GAAD,CACItxC,OAAQ0E,KAAKH,MAAMvE,OACnBmwB,QAASzrB,KAAKH,MAAM4rB,QACpB4b,oBAAqBrnC,KAAKH,MAAMwnC,oBAChCiB,kBAAmBtoC,KAAKH,MAAMyoC,sB,gBApD7B0D,G,mBAVjB3E,oB,oBACAmF,Y,WACI90C,M,qBAGJ4K,Q,WACImqC,a,uICyBR,UAAetoC,cAhCf,SAAyBjL,GACrB,MAAMmuC,GAAsB9a,QAAsBrzB,EAAO,CAACszB,WAAYC,qBAChEhB,GAAUC,QAAWxyB,GACrBoC,GAASmd,QAAUvf,GACnByN,EClBH,SAA8BzN,GACjC,OAAOA,EAAMyN,OAAOW,QAAQ5P,GAAUA,EAAMm1C,cDiB7BC,CAAqB5zC,GAC9BovC,GAAoByE,QAAqB7zC,GAE/C,IAAIszC,EAAc,KAKlB,OAJI7lC,GAAUA,EAAOnB,QAAU,IAC3BgnC,EAAc7lC,EAAO,IAGlB,CACH8kB,UACAnwB,SACA+rC,sBACAmF,cACAlE,wBAIR,SAA4BlxC,GACxB,MAAM41C,EAAoBP,UAAkB,KAAM,GAClD,MAAO,CACHnqC,SAAS+B,wBAAmB,CACxBtJ,qBADwB,KAExB0xC,aAAcO,EACdnrB,cAAaA,KACdzqB,MAIX,CAA4D40C,K,wME/C5D,MA6IA,EA7I0C,IAElC,uBACIziC,MAAM,MACNC,OAAO,MACPyjC,QAAQ,cACRC,KAAK,OACLC,MAAM,8BAEN,qBAAGC,SAAS,eACR,wBACIC,EAAE,kLACFH,KAAK,UACLI,YAAY,SAEhB,wBACID,EAAE,2mBACFH,KAAK,YAET,wBACIG,EAAE,kQACFH,KAAK,YAET,wBACIG,EAAE,geACFH,KAAK,YAET,wBACIG,EAAE,2aACFH,KAAK,UAET,wBACIG,EAAE,ynBACFH,KAAK,YAET,wBACIG,EAAE,kNACFH,KAAK,UAET,wBACIG,EAAE,0nBACFH,KAAK,YAET,wBACIG,EAAE,mEACFH,KAAK,YAET,wBACIG,EAAE,4LACFH,KAAK,YAET,wBACIG,EAAE,qfACFH,KAAK,UAET,wBACIG,EAAE,oSACFH,KAAK,UAET,wBACIG,EAAE,iNACFH,KAAK,UAET,wBACIG,EAAE,01BACFH,KAAK,UACLI,YAAY,SAEhB,wBACID,EAAE,kNACFH,KAAK,UACLI,YAAY,SAEhB,wBACID,EAAE,ilBACFH,KAAK,UACLI,YAAY,SAEhB,wBACID,EAAE,4ZACFH,KAAK,UACLI,YAAY,SAEhB,wBACID,EAAE,2ZACFH,KAAK,YAET,wBACIG,EAAE,+fACFH,KAAK,YAET,wBACIG,EAAE,kTACFH,KAAK,YAET,wBACIG,EAAE,4IACFH,KAAK,YAET,wBACIG,EAAE,0fACFH,KAAK,YAET,wBACIG,EAAE,mJACFH,KAAK,YAET,wBACIG,EAAE,6RACFH,KAAK,YAET,wBACIG,EAAE,gsBACFH,KAAK,YAET,wBACIG,EAAE,iJACFH,KAAK,YAET,wBACIG,EAAE,oNACFH,KAAK,YAET,wBACIG,EAAE,oGACFH,KAAK,aAGb,4BACI,4BAAUp1C,GAAG,SACT,wBACIyR,MAAM,MACNC,OAAO,MACP0jC,KAAK,aC1HvBK,EAA6D1tC,GAE3D,gBAAC,IAAD,CACIsI,OAAQtI,EAAMsI,OACdqlC,gBAAgB,IAEhB,uBAAKxsC,UAAU,mCACX,uBAAKA,UAAU,+BACX,gBAAC,EAAD,OAEJ,wBAAMA,UAAU,4CACZ,gBAAC,IAAD,CACIlJ,GAAG,+CACH+N,eAAe,wDAGvB,wBAAM7E,UAAU,wCACZ,gBAAC,IAAD,CACIlJ,GAAG,6CACH+N,eAAe,uEAGvB,wBAAM7E,UAAU,iCACZ,gBAAC,IAAD,CACIlJ,GAAG,sCACH+N,eAAe,+BACfjB,OAAQ,CAAC9K,MAAO,sC,aA5BpCqO,O,qBAoCJ,UCxBMslC,EAA2C5tC,IAC7C,MAAO6tC,EAAaC,IAAkBC,cAAS,KAC/CC,gBAAU,KACNh1C,sBAAyBgP,MAAK,EAAEimC,aAAcC,MAC1C,IACQA,GAAqB,iBAAkB3nB,KAAK2nB,IAC5CJ,EAAeI,GAErB,MAAOr2C,GACLgsB,QAAQhsB,MAAM,mBAAoBA,SAG3C,IAEH,MAiBMs2C,EAA2B,KAAM,MACnC,UAAInuC,EAAM2nC,qBAAV,OAAI,EAAqB9vC,QACrBiG,QAAW,gBAAiBkC,EAAM2nC,cAAc9vC,OAEpDmI,EAAMyC,QAAQsJ,UAAU,CACpBC,QAASC,4BACTC,WAAYwhC,KAIpB,OACI,gCACI,0BACIvsC,UAAU,iDACV4C,SAAU/D,EAAMyB,WAChBiJ,QAAU5L,GAhCEpH,WACpBoH,EAAEqH,iBACF,IACI,MAAM,OAAC6L,SAAgBhZ,YACoB,MAA5B,OAAXgZ,GAAmC,KAAhB67B,GACnB,UAAI7tC,EAAM2nC,qBAAV,OAAI,EAAqB/vC,UACrBkG,QAAW,gBAAiBkC,EAAM2nC,cAAc/vC,SAEpD4U,OAAOC,KAAKohC,EAAa,WAEzBM,IAEN,MAAOt2C,GACLs2C,MAmBoBC,CAAgBtvC,IAEhC,gBAAC,IAAD,CACI7G,GAAG,0CACH+N,eAAe,yB,aAzD/B2hC,c,WAAiB/vC,Q,sBAAiBC,M,wBAClC4K,Q,WACIsJ,U,iCAEJtK,W,UA4DJ,UC3DA,GAAe6C,aAAQ,MAXvB,SAA4B/M,GACxB,MAAO,CACHkL,SAAS+B,wBACL,CACIuH,UAASA,KAEbxU,MAKZ,CAAiDq2C,I,+TCelC,MAAMS,UAAkBvuC,gBAUnCC,YAAYC,GACRC,MAAMD,GADgB,kDAUXlB,IAA2C,MACtD,MAAMwvC,EAAY,UAAGnuC,KAAKouC,WAAWC,eAAnB,aAAG,EAAyBC,wBAE9C,GAAIH,EAAc,CACd,MAAM5J,GAAYgK,OAAuBJ,EAAc9hC,OAAOmiC,YA9C1C,KA+CpBxuC,KAAK8F,SAAS,CAACo0B,OAAQv7B,EAAEu7B,OAA6BxyB,MAAO1H,KAAK9G,MAAMwO,KAAM68B,kBAf5D,sBAmBZ,KACVvkC,KAAK8F,SAAS,CAAC4B,MAAM,OAjBrB1H,KAAK9G,MAAQ,CACTwO,MAAM,GAGV1H,KAAKouC,WAAazuC,cAgBtB8uC,yBACI,MAAM,gBAACC,EAAD,YAAkBC,GAAe3uC,KAAKH,MAC5C,IAAI+uC,EAAyBD,EAAYt8B,cAEzC,KAAOu8B,EAAuBppC,OAAS,GAAG,CACtC,GAAIkpC,EAAgBtZ,eAAewZ,GAC/B,OAAOF,EAAgBE,GAI3B,IAAK,SAAUxoB,KAAKwoB,GAGhB,MAFAA,EAAyBA,EAAuBx8B,UAAU,EAAGw8B,EAAuBppC,OAAS,GAMrG,MAAO,GAGXqpC,0BACI,MAAM,aAACC,EAAD,YAAeH,GAAe3uC,KAAKH,MACnCkvC,EAAqBJ,EAAYt8B,cAAc28B,QAAQ,UAAW,IACxE,OAAOF,aAAA,EAAAA,EAAeC,KAAuB,GAGjDttC,SACI,MAAMjJ,EAAOwH,KAAKyuC,yBAElB,IAAKzuC,KAAKH,MAAMovC,wBAA0Bz2C,EAAM,CAC5C,MAAMs5B,EAAQ9xB,KAAK6uC,0BACnB,GAAI/c,EAAMod,gBACN,OAAO,wBAAMluC,UAAU,sBAAsB,IAAM8wB,EAAM1xB,MAIjE,IAAK5H,EACD,OAAO,gBAAC,WAAD,KAAiBwH,KAAKH,MAAM0/B,UAGvC,MAAM4P,EAASnvC,KAAKH,MAAM8uC,YAAYv8B,UAAU5Z,EAAKyJ,SAASuD,QAE9D,IAAIxE,EAAY,eAKhB,OAJKhB,KAAKH,MAAMuvC,kBAAoB52C,EAAKV,KAAOkI,KAAKH,MAAM0N,gBACvDvM,GAAa,uBAIb,4BACI,gBAACquC,EAAA,EAAD,CACI9K,UAAWvkC,KAAK9G,MAAMqrC,UACtB78B,KAAM1H,KAAK9G,MAAMwO,KACjBwyB,OAAQl6B,KAAK9G,MAAMghC,OACnBoV,WAAW,EACXnnC,OAAQnI,KAAKuvC,aAEb,gBAAC,IAAD,CACIvuC,UAAU,uBACV/I,OAAQO,EAAKV,GACb2R,IAAK5Q,0BAA6BL,EAAKV,GAAIU,EAAKg3C,qBAChDC,MAAOzvC,KAAKH,MAAM4vC,MAClBC,WAAY1vC,KAAKH,MAAM6vC,WACvBC,KAAM3vC,KAAKuvC,YACX1/B,UAAW7P,KAAKH,MAAMgQ,aAG9B,qBACI7O,UAAWA,EACXuJ,QAASvK,KAAK4vC,YACdpT,IAAKx8B,KAAKouC,YAET,KAAMjsC,QAAgB3J,EAAMwH,KAAKH,MAAMqC,sBAE3CitC,I,EA1GIjB,E,aAnBjB3gC,c,sBACAohC,Y,sBACAzsC,oB,sBAGAq9B,S,SACA1vB,U,WACA6/B,W,SACAN,iB,SACAH,sB,SACAQ,M,aASiBvB,E,eAGqB,CAClCuB,OAAO,EACPC,YAAY,EACZN,kBAAkB,EAClBH,uBAAuB,ICvB/B,SAAe9qC,cATf,SAAyBjL,GACrB,MAAO,CACHqU,eAAeC,QAAiBtU,GAChCgJ,qBAAqBkC,QAA8BlL,GACnDw1C,iBAAiBmB,QAAmB32C,GACpC41C,cAAcgB,QAA+B52C,MAIrD,CAAwCg1C,I,+NCbzB,MAAM6B,UAA6BpwC,gBA0B9CC,YAAYC,GACRC,MAAMD,GADS,mBAQPlB,IACHA,GAAMA,EAAEu7B,QAIbl6B,KAAK8F,SAAS,CAACkqC,MAAOrxC,EAAEu7B,OAAOn5B,WAbhB,yBAgBDe,IACd9B,KAAK8F,SAAS,CAACkqC,MAAO,KAElBhwC,KAAKH,MAAMkE,YACX/D,KAAKH,MAAMkE,WAAWjC,GAG1BmuC,uBAAsB,KACdjwC,KAAKkwC,eACLlwC,KAAKkwC,cAAcC,aAzBZ,2BA8BC3T,IAChBx8B,KAAKkwC,cAAgB1T,KA/BN,kBAkCT,KACNx8B,KAAK8F,SAAS,CAACsqC,SAAS,IAEpBpwC,KAAKH,MAAMwwC,aACXrwC,KAAKH,MAAMwwC,aAAY,MAtCZ,iBA0CV,KACLrwC,KAAK8F,SAAS,CAACsqC,SAAS,IAEpBpwC,KAAKH,MAAMwwC,aACXrwC,KAAKH,MAAMwwC,aAAY,MA3C3BrwC,KAAK9G,MAAQ,CACT82C,MAAO,IA8CfvuC,SACI,MAAM,UACFc,EADE,YAEF1B,EAFE,OAGFmiC,EAHE,MAIFthC,EAJE,eAKF4uC,EALE,SAMF3uC,EANE,eAOF4uC,EAPE,MAQFxvC,EARE,SASF6C,EATE,cAUFd,EAVE,aAWF0tC,GACAxwC,KAAKH,OAEH,QAACuwC,GAAWpwC,KAAK9G,MACvB,IAMIu3C,EAWArtC,GAjBA,MAAC4sC,GAAShwC,KAAK9G,MA0BnB,OAxBKk3C,IACDJ,EAAQjvC,GAIRW,IACA+uC,EACI,yBACIzvC,UAAW,iBAAmBsvC,GAE7B5uC,IAMTC,IACAyB,EACI,uBAAKpC,UAAU,aACVW,IAMT,uBACI+uC,cAAY,uBACZ1vC,UAAU,cAETyvC,EACD,uBAAKzvC,UAAWuvC,GACZ,gBAAC,IAAD,CACI1vC,YAAaA,EACb27B,IAAKx8B,KAAK2wC,iBACV7tC,cAAeA,EACf9B,UAAU,eACV4vC,eAAe,8BACf7vC,MAAOivC,EACP/vC,SAAUD,KAAKC,SACf4wC,eAAgB7wC,KAAKgE,eACrB8sC,QAAS9wC,KAAK8wC,QACdC,OAAQ/wC,KAAK+wC,OACbxuC,UAAWA,EACXyuC,eAAe,EACfC,gBAAgB,EAChBC,iBAAiB,EACjBC,aAAa,EACbC,eAAe,EACfC,yBAAyB,EACzBztC,SAAUA,EACV4sC,aAAcA,IAEjBptC,EACA4/B,K,EAnJA+M,E,YACE,CACfxtC,UAAW+uC,qBACXvwC,MAAOuwC,sBACPvtC,WAAYutC,SACZ5vC,MAAO4vC,SACPhB,eAAgBgB,WAChBf,eAAgBe,WAChB3vC,SAAU2vC,SACVzwC,YAAaywC,WACbtO,OAAQsO,SACR1tC,SAAU0tC,SACVjB,YAAaiB,SACbxuC,cAAewuC,gBACfd,aAAcc,a,EAdDvB,E,eAiBK,CAClBhvC,MAAO,GACPjJ,GAAI,GACJw4C,eAAgB,GAChBC,eAAgB,GAChBztC,cAAeiH,IACfymC,aAAc,S,2fChBP,MAAMe,UAAyB5xC,gBAI1CC,YAAYC,GACRC,MAAMD,GADgB,6GAiDR,KACd,IAAKG,KAAKwxC,aAAanD,UAAaruC,KAAKyxC,YAAYpD,QACjD,OAGJ,MAAM7kC,EAAUxJ,KAAKwxC,aAAanD,QAASqD,aACrCC,EAAY3xC,KAAKyxC,YAAYpD,QAEnC,GAAI7kC,EAAS,GAAKA,IAAWxJ,KAAKwJ,OAAQ,CACtC,MAAMZ,EAAQgpC,iBAAiBD,GACzBE,EAAcpiB,SAAS7mB,EAAMkpC,gBAAkB,IAAK,IAAMriB,SAAS7mB,EAAMmpC,mBAAqB,IAAK,IAGzGJ,EAAS/oC,MAAMY,OAAS02B,OAAO12B,EAASqoC,GAAe,KAEvD7xC,KAAKwJ,OAASA,EAEd6C,OAAO4jC,uBAAsB,KAAM,QAC/B,aAAAjwC,KAAKH,OAAMmyC,sBAAX,gBAA4BxoC,EAAQimB,SAAS7mB,EAAMqpC,WAAa,IAAK,YAnEvD,qBAwEb,IACDjyC,KAAKyxC,YAAYpD,UAzEH,uBA4EV1vC,IACRqB,KAAKH,MAAMI,UACXD,KAAKH,MAAMI,SAAStB,MA3ExBqB,KAAKwJ,OAAS,EAEdxJ,KAAKyxC,YAAc9xC,cACnBK,KAAKwxC,aAAe7xC,cAGf,YACL,OAAQK,KAAKyxC,YAAYpD,QAAgCttC,MAGpD,UAACA,GACLf,KAAKyxC,YAAYpD,QAAgCttC,MAAQA,EAG5C,qBACd,OAAQf,KAAKyxC,YAAYpD,QAAgC6D,eAG3C,mBAACA,GACdlyC,KAAKyxC,YAAYpD,QAAgC6D,eAAiBA,EAGvD,mBACZ,OAAQlyC,KAAKyxC,YAAYpD,QAAgC8D,aAG7C,iBAACA,GACZnyC,KAAKyxC,YAAYpD,QAAgC8D,aAAeA,EAGrEl4B,QAAQ,MACJ,UAAAja,KAAKyxC,YAAYpD,eAAjB,SAA0Bp0B,QAG9Bk2B,OAAO,MACH,UAAAnwC,KAAKyxC,YAAYpD,eAAjB,SAA0B8B,OAG9BrT,oBACI98B,KAAKoyC,kBAGTnV,qBACIj9B,KAAKoyC,kBAoCT3wC,SACI,MAAM5B,E,+VAAQ,CAAH,GAAOG,KAAKH,OAEvBsjB,QAAQC,eAAevjB,EAAO,kBAC9BsjB,QAAQC,eAAevjB,EAAO,aAC9BsjB,QAAQC,eAAevjB,EAAO,aAE9B,MAAM,MACFkB,EADE,aAEFiE,EAFE,YAGFnE,EAHE,SAIF+C,EAJE,QAKFyuC,EALE,GAWFv6C,GAEA+H,EADGyyC,E,kXAZP,CAaIzyC,EAbJ,GAeM0yC,EAAc,CAChBC,KAAM,EACNhpC,OAAQ,GAGRxJ,KAAKwJ,QAAU,EAEf+oC,EAAYC,KAAO,EAEnBD,EAAY/oC,OAASxJ,KAAKwJ,OAG9B,IAAIipC,EAAsB,KAC1B,MAAMC,EAAuB7xC,EAAcA,EAAYwR,cAAgB,GAavE,OAZKrS,KAAKH,MAAMkB,OAAUf,KAAKH,MAAMmF,eACjCytC,EACI,uCACQH,EADR,CAEI5B,cAAA,UAAgB54C,EAAhB,gBACA8Q,MAAOA,EAAM/H,cAEZA,IAMT,2BACK4xC,EACD,0CACIjW,IAAKx8B,KAAKyxC,YACVf,cAAa54C,EACbA,GAAIA,GACAy6C,EACAD,EALR,CAMIhqC,KAAK,UACLqqC,aAAYD,EACZE,IAAI,OACJhvC,SAAUA,EACV3D,SAAUD,KAAK6yC,aACfR,QAASA,EACTtxC,MAAOA,EACPiE,aAAcA,KAElB,uBAAK4D,MAAOA,EAAMkqC,WACd,0CACItW,IAAKx8B,KAAKwxC,aACV15C,GAAIA,EAAK,aACT8Q,MAAOA,EAAMmqC,UACbH,IAAI,OACJhvC,UAAU,EACV4uC,KAAM,GACFF,EAPR,CAQIvxC,MAAOA,GAASiE,EAChBguC,eAAa,Q,EAlKhBzB,E,aAVjBz5C,G,WACA8L,S,SACA7C,M,WACAiE,a,WACA/E,S,SACA+xC,e,SACAK,Q,SACAxxC,Y,aA6KJ,MAAM+H,EAAyC,CAC3CkqC,UAAW,CAACtpC,OAAQ,EAAGypC,SAAU,UACjCF,UAAW,CAACvpC,OAAQ,OAAQD,MAAO,QACnC1I,YAAa,CAACoyC,SAAU,SAAUC,aAAc,WAAYhS,QAAS,GAAKiS,cAAe,OAAQC,SAAU,WAAYC,WAAY,SAAUC,WAAY,OAAQC,YAAa,iB,qGClLlL,MAAMC,EAA+B3zC,GAE7B,uBAAKmB,UAAWs4B,IAAW,eAAgB,CAACma,SAAU5zC,EAAM4zC,YACvD5zC,EAAM0/B,SACN1/B,EAAM4zC,UAAY,sBAAIzyC,UAAU,c,aARzCu+B,S,oBACAkU,S,UAYJ,U,0ICJe,MAAMC,UAAa/zC,gBAI9B8B,SACI,MAAM,SAACgyC,EAAD,SAAWlU,GAAYv/B,KAAKH,MAE5B8zC,EAAoBC,eAAarU,GAAWsU,IAE1CC,oBAAeD,IACRE,kBAAaF,EAAO,CAACJ,aAEzBI,IAGX,OACI,uBACI7yC,UAAWs4B,IAAW,OAAQt5B,KAAKH,MAAMmB,UAAW,CAChDyyC,cAGHE,I,EArBID,E,aAJjBD,S,SACAzyC,U,eAGiB0yC,E,SACMF,G,EADNE,E,QCRN,SAAkB7zC,GAC7B,MAAO2J,EAAQwqC,IAAapG,cAAS,IAC9BqG,EAAWC,IAAgBtG,eAAS,IACpC6F,EAAUU,IAAevG,eAAS,GAuBzC,OAbAC,gBAAU,KACNqG,GAAa,GACTr0C,EAAM4zC,UACNU,GAAY,KAEjB,CAACt0C,EAAM4zC,YAEV5F,gBAAU,KACDhuC,EAAM4zC,UACPU,GAAY,KAEjB,CAACF,IAGA,uBACIzX,IArBM4X,IACNA,GAAQA,EAAK7U,UACbyU,EAAUK,MAAMC,KAAKF,EAAK7U,UAAU11B,KAAKgqC,GAAUA,EAAMnC,eAAc6C,QAAO,CAACC,EAAGC,IAAMD,EAAIC,GAAG,KAoB/F7rC,MAAO,CACHY,OAASyqC,GAAaR,EAAYjqC,EAAS,IAE/CxI,UAAWs4B,IAAW,aAAc,CAACma,WAAUQ,cAC/CS,gBA5Bc,IAAMR,GAAa,IA8BhCr0C,EAAM0/B,c,mJCZnB,MAAMoV,EAAsC90C,IACxC,MAAM,UACFmV,EADE,YAEF4/B,EAFE,SAGFC,EAHE,cAIFxrC,EAJE,QAKFkB,EALE,WAMFuqC,EANE,YAOFC,EAPE,UAQFC,GACAn1C,EAEEo1C,EAAwC,CAC1CC,aAAc,CACVC,MAAO,cACPr9C,GAAI,iBACJs9C,WAAWphC,OAAE,0BACbpV,QAAS,eAEby2C,YAAa,CACTF,MAAO,eACPr9C,GAAI,oBACJs9C,WAAWphC,OAAE,8BACbpV,QAAS,gBAEb02C,eAAgB,CACZH,MAAO,GACPr9C,GAAI,wBACJs9C,WAAWphC,OAAE,iCACbpV,QAAS,mBAEbi+B,OAAQ,CACJsY,MAAO,GACPr9C,GAAI,gBACJs9C,WAAWphC,OAAE,yBACbpV,QAAS,UAEb22C,aAAc,CACVJ,MAAO,gBACPr9C,GAAI,sBACJs9C,WAAWphC,OAAE,+BACbpV,QAAS,kBAsBjB,IAAI42C,EAlBJ,IAAoBt4C,EAgCpB,IAAIu4C,EAKJ,OAjBID,EADe,WAAfV,GAA2BC,EAEvB,gBAAC,IAAD,CACIj9C,GAAG,gBACHkJ,UAAU,IAEV,4BAAO+zC,IAxBM,MAAjBE,EADY/3C,EA6BK43C,GA3BV,KAIP,gBAAC,IAAD,CACIh9C,GAAIm9C,EAAS/3C,GAAKpF,GAClBkJ,UAAWi0C,EAAS/3C,GAAKi4C,OAEzB,gBAAC,IAAD,CACIr9C,GAAIm9C,EAAS/3C,GAAKk4C,UAClBvvC,eAAgBovC,EAAS/3C,GAAK0B,WAqB1CoW,IACAygC,EAAgB,GAAH,QAAMrrC,QAAgB6qC,EAASH,GAAYM,UAAWH,EAASH,GAAYl2C,WAGxF42C,EAEI,2BACI,gBAAC,IAAD,CACIE,QAAS,CAAC,SACVpR,UAAWt1B,wBACXu1B,UAAU,SACVC,QAASwQ,EAAY,iCAAQQ,GAE7B,0BACI19C,GAAI+8C,EACJlC,aAAY8C,EACZz0C,UAAW4zC,GAAe,uBAC1BrqC,QAASA,GAERlB,KAQjB,uBAAKrI,UAAU,cACX,0BACIlJ,GAAI+8C,EACJ7zC,UAAW4zC,GAAe,uBAC1BrqC,QAASA,GAERlB,K,aAhIb2L,U,SACA4/B,Y,WACAC,S,sBACAxrC,c,oBACAkB,Q,oBACAuqC,W,sBACAC,Y,SACAC,U,UA+HJ,W,gdCpFe,MAAMW,UAA2Bh2C,gBAU5CC,YAAYC,GACRC,MAAMD,GADgB,yBATA,GASA,yBARAF,eAQA,mBAYNoB,IAChB,MAAM6D,EAA6BU,OAAOuX,OAAO,GAAI7c,KAAK9G,MAAM0L,SACjC,IAA3BA,EAAOsN,QAAQnR,IACf6D,EAAOqa,KAAKle,GAGhBf,KAAK8F,SAAS,CAAClB,cAlBO,iBA6BV,KACZ5E,KAAK8F,SAAS,CAAC4B,MAAM,IACrB1H,KAAKH,MAAMyC,QAAQszC,4BAA4B51C,KAAKH,MAAMg2C,gCA/BpC,4BAkCEj+C,IACpBA,GACAoI,KAAK8F,SAAS,CACVo1B,QAAQ,EACR4a,YAAal+C,EAAIgH,aAtCH,uBA2CFgG,IACpB5E,KAAK8F,SAAS,CAAClB,cA5CO,+BA+CMg3B,IAC5B57B,KAAK8F,SAAS,CACViwC,aAAcna,OAjDI,2BAqDC,CAACz9B,EAAc29B,KAClC39B,EAAO29B,IACP97B,KAAKg2C,sBAAqB,GAC1Bh2C,KAAKH,MAAMyC,QAAQ2zC,wBACfj2C,KAAKH,MAAMuC,QAAQwR,QACnB5T,KAAKH,MAAMuC,QAAQtK,GACnBkI,KAAKH,MAAMuC,QAAQ8zC,kBACnB/3C,EAAO,EA9GA,IA8GmB0J,MAAK,IAAM7H,KAAKg2C,sBAAqB,SA5DjD,uBAgEJ,KAClB,MAAM,QAAC1zC,EAAD,QAAUF,GAAWpC,KAAKH,MAE1B2O,EAAUxO,KAAK9G,MAAM0L,OAAOiF,KAAKuxB,GAAMA,EAAEtjC,KAC/C,GAAuB,IAAnB0W,EAAQhJ,OAAZ,CAIA,GAAIxF,KAAKH,MAAMw7B,YAAcr7B,KAAKH,MAAMy7B,cAOpC,OANAt7B,KAAKH,MAAMy7B,cAAct7B,KAAK9G,MAAM0L,QACpC5E,KAAK8F,SAAS,CACVo1B,QAAQ,EACR4a,iBAAa9uC,SAEjBhH,KAAKmI,SAITnI,KAAK8F,SAAS,CAACo1B,QAAQ,IAEvB54B,EAAQsN,kBAAkBxN,EAAQtK,GAAI0W,GAAS3G,MAAM4G,IAC7CA,EAAO/W,MACPsI,KAAKm2C,kBAAkB1nC,EAAO/W,QAE9BsI,KAAK8F,SAAS,CACVo1B,QAAQ,EACR4a,iBAAa9uC,IAEjBhH,KAAKmI,iBA5FS,iBAiGT8zB,IACb,MAAM5sB,EAAO4sB,EAAW3pB,OACxBujB,aAAa71B,KAAK48B,iBAClB58B,KAAK8F,SAAS,CACVuJ,SAGAA,IACArP,KAAKg2C,sBAAqB,GAC1Bh2C,KAAK48B,gBAAkBvwB,OAAOyU,YAC1BvpB,UACI,MAAM8F,EAAU,CACZuW,QAAS5T,KAAKH,MAAMuC,QAAQwR,QAC5BwiC,kBAAmBp2C,KAAKH,MAAMuC,QAAQtK,GACtCo+C,kBAAmBl2C,KAAKH,MAAMuC,QAAQ8zC,yBAEpCl2C,KAAKH,MAAMyC,QAAQ+zC,eAAehnC,EAAMhS,GAC9C2C,KAAKg2C,sBAAqB,KAE9BhnC,kCAMRhP,KAAK48B,gBAAkBvwB,OAAOyU,YAC1BvpB,UACI,IAAK8X,EACD,OAGJ,MAAMhS,EAAU,CACZuW,QAAS5T,KAAKH,MAAMuC,QAAQwR,QAC5BwiC,kBAAmBp2C,KAAKH,MAAMuC,QAAQtK,GACtCo+C,kBAAmBl2C,KAAKH,MAAMuC,QAAQ8zC,yBAEpCl2C,KAAKH,MAAMyC,QAAQ+zC,eAAehnC,EAAMhS,GAC9C2C,KAAKg2C,sBAAqB,KAE9BhnC,sCAxIkB,0BA4ICmtB,GAClBA,EAGEA,EAAOl6B,SAFH,KA9IW,uBAmJX,CAACk6B,EAA0BC,EAAqBC,EAAyCC,KACpG,IAAIC,EAAc,GAKlB,OAJIH,IACAG,EAAc,6BAId,uBACIr/B,IAAKi/B,EAAOrkC,GACZ0kC,IAAKJ,EAAap8B,KAAKy8B,gBAAkBN,EAAOrkC,GAChDkJ,UAAW,6BAA+Bu7B,EAC1ChyB,QAAS,IAAM8xB,EAAMF,GACrBG,YAAa,IAAMA,EAAYH,IAE/B,gBAAC,IAAD,CACI1yB,IAAK5Q,0BAA6BsjC,EAAOrkC,GAAIqkC,EAAOqT,qBACpD39B,OAAQ7R,KAAKH,MAAMy2C,aAAana,EAAOrkC,IACvCy+C,KAAK,KACLt0C,SAAUk6B,EAAOl6B,WAErB,uBAAKjB,UAAU,uBACX,uBAAKA,UAAU,qBACVw1C,QAAyBra,GAC1B,gBAAC,IAAD,CACIz0B,KAAMk5B,QAAQzE,EAAOsa,QACrBz1C,UAAU,sBAEd,gBAAC,IAAD,CACI0G,MAAM8iB,QAAQ2R,GACdn7B,UAAU,kBAItB,uBAAKA,UAAU,uBACX,uBAAKA,UAAU,8BACX,gBAAC,IAAD,YAtLM,iBA6LV,KACZ,IAAI80C,EAAc,KACd91C,KAAK9G,MAAM48C,cACXA,EAAe,yBAAO90C,UAAU,2BAA2BhB,KAAK9G,MAAM48C,cAG1E,MAAM9tC,EACF,0BACI,gBAAC,IAAD,CACIlQ,GAAG,+BACH+N,eAAe,0BACfjB,OAAQ,CACJxC,QAASpC,KAAKH,MAAMuC,QAAQC,iBAMtCg7B,GAAmBjzB,QAAgB,kBAAmB,OACtDkzB,GAA0BlzB,QAAgB,qBAAsB,aAEtE,IAAIpM,GAAQ04C,QAA+B12C,KAAKH,MAAMg2C,4BAA6B71C,KAAK9G,MAAMmW,MAAM/H,QAAQ9O,GAC9E,IAAnBA,EAAK8iB,YACPtb,KAAKH,MAAM82C,yBAAyB1lB,SAASz4B,SACjBwO,IAA5BhH,KAAKH,MAAM+2C,eAA+B52C,KAAKH,MAAM+2C,aAAap+C,EAAKV,MAC7E+R,KAAKrR,GAASA,IAEjB,GAAIwH,KAAKH,MAAMg3C,aAAc,CACzB,MAAMA,EAAevxC,OAAOV,OAAO5E,KAAKH,MAAMg3C,cAC9C74C,EAAQ,IAAIA,KAAU64C,GAG1B,MAAMC,EACF,gBAAC,IAAD,CACI55C,IAAI,uBACJG,QAASW,EACT+/B,eAAgB/9B,KAAKg+B,aACrBvB,gBAAiBz8B,KAAKy8B,gBACtB73B,OAAQ5E,KAAK9G,MAAM0L,OACnBmyC,kBAAmB/2C,KAAKg3C,gBACxBC,mBAAoB,SACpBpvB,QAxRO,GAyRPqW,iBAAkBl+B,KAAKk+B,iBACvBC,YAAan+B,KAAK68B,OAClBuB,aAAcp+B,KAAKo+B,aACnBC,UAAWr+B,KAAKs+B,SAChB71B,aAAczI,KAAKyI,aACnB81B,UA7Rc,GA8RdlB,iBAAkBA,EAClBC,wBAAyBA,EACzBpC,OAAQl7B,KAAK9G,MAAMgiC,OACnBsD,QAASx+B,KAAK9G,MAAM68C,aACpBtX,iBAAiBr0B,QAAgB,0BAA2B,qBAC5D8sC,gBAAgB,IAIxB,OACI,gBAACjvC,EAAA,EAAD,CACInQ,GAAG,yBACHoQ,gBAAgB,6BAChBR,KAAM1H,KAAK9G,MAAMwO,KACjBS,OAAQnI,KAAKmI,OACbC,SAAUpI,KAAKH,MAAMsI,OACrBG,KAAK,SACLC,kBAAgB,2BAEhB,gBAACN,EAAA,SAAD,CACInQ,GAAG,0BACH6Q,aAAa,IAEjB,gBAACV,EAAA,OAAD,CACIK,KAAK,cACLtH,UAAU,qBAEV,uBAAKA,UAAU,0BACVgH,GAEJ8tC,EACD,uBAAK90C,UAAU,2BACV81C,QA1QjB92C,KAAK9G,MAAQ,CACT0L,OAAQ,GACRyK,KAAM,GACN3H,MAAM,EACNwzB,QAAQ,EACR6a,cAAc,GAafjZ,oBACH98B,KAAKH,MAAMyC,QAAQ2zC,wBAAwBj2C,KAAKH,MAAMuC,QAAQwR,QAAS5T,KAAKH,MAAMuC,QAAQtK,GAAIkI,KAAKH,MAAMuC,QAAQ8zC,kBAAmB,GAAGruC,MAAK,KACxI7H,KAAKg2C,sBAAqB,MAE9Bh2C,KAAKH,MAAMyC,QAAQ60C,aAAan3C,KAAKH,MAAMuC,QAAQwR,SACnD5T,KAAKH,MAAMyC,QAAQszC,4BAA4B51C,KAAKH,MAAMg2C,8B,EApC7CF,E,aAlCjBE,4B,qBACAc,yB,qBAEAxuC,O,oBAIAkzB,W,SAGAC,c,SAMAh5B,Q,WACIsN,kB,mBACAqmC,wB,mBACAkB,a,oBACAvB,4B,oBACAS,e,qCAaaV,E,eAIY,CACzBkB,aAAc,GACdD,aAAc,GACdvb,YAAY,ICJpB,SAAel3B,cAxCf,SAA6BizC,EAA2BC,GACpD,IAAIC,EAKJ,OAJID,EAAaxnC,WAAawnC,EAAar8C,SACvCs8C,GAA4BC,WAGzB,CAACr+C,EAAoB2G,KACxB,IAAIg2C,EACAc,EAYJ,OAVIW,GACAzB,EAA8ByB,EAA0Bp+C,EAAO2G,EAAMgQ,WACrE8mC,GAA2Ba,QAAqBt+C,EAAO2G,EAAM7E,UAE7D66C,GAA8B4B,QAA+Bv+C,GAC7Dy9C,GAA2Be,QAA4Bx+C,IAKpD,CACH28C,8BACAc,2BACAL,cALiBqB,QAAgBz+C,QAU7C,SAA4B9B,GACxB,MAAO,CACHkL,SAAS+B,wBAA0F,CAC/FuL,kBAD+F,KAE/FqmC,wBAF+F,KAG/FkB,aAH+F,KAI/FvB,4BAJ+F,KAK/FS,eAAcA,MACfj/C,MAIX,CAAgEu+C,I,wIC7DjD,SAASiC,EAAU/3C,GAC9B,MAAM,cAAC+F,IAAiBiyC,SACxB,OACI,uBAAUh4C,EACN,uBACI0J,MAAM,OACNC,OAAO,OACPyjC,QAAQ,YACR6K,iBAAiB,qBACjBxvC,KAAK,MACLqqC,aAAY/sC,EAAc,CAAC9N,GAAI,sBAAuB+N,eAAgB,gBAEtE,wBAAMwnC,EAAE,4mC,wHCGT,MAAM0K,UAAoBp4C,gBAQ9B8B,SACH,IAAIu2C,EAAuC,KACvCC,EAAY,wCACZj4C,KAAKH,MAAMq4C,aAAe,GAC1BD,GAAa,yBACbD,EACI,wBAAMh3C,UAAU,4BACXhB,KAAKH,MAAMq4C,eAGc,KAA3Bl4C,KAAKH,MAAMs4C,cAClBF,EAAYA,EAAY,IAAMj4C,KAAKH,MAAMs4C,aAG7C,MAAM3C,EACF,gBAACpR,EAAA,EAAD,CACItsC,GAAG,uBACHkJ,UAAU,aAEV,gBAAC,IAAD,CACIlJ,GAAG,uCACH+N,eAAe,WAK3B,OACI,gBAAC,IAAD,CACIy+B,UAAW,IACXC,UAAU,MACVC,QAASgR,GAET,0BACI19C,GAAE,UAAKkI,KAAKH,MAAMyqB,SAAhB,wBAAwCtqB,KAAKH,MAAM8f,QACrDgzB,cAAYvoC,QAAgB,uCAAwC,SAASiI,cAC7ErR,UAAWi3C,EAAY,IAAMj4C,KAAKH,MAAMu4C,WACxC7tC,QAASvK,KAAKH,MAAMw4C,oBAEpB,wBAAMr3C,UAAU,6BACZ,gBAAC42C,EAAD,CAAW52C,UAAU,qBACpBg3C,M,EAhDJD,E,aARjBztB,S,WAAU,SAAW,WACrB+tB,mB,oBACAF,Y,WACAD,a,WACAv4B,O,WACAy4B,W,eAGiBL,E,eAC4B,CACzCztB,SAAU,SACV6tB,YAAa,GACbD,aAAc,EACdE,WAAY,M,gHCqBpB,QAxBA,SAAqCE,GAAwD,Q,MACzF,WAAO,cAAc34C,YACM,0BACnB,MAAM,aAACmqC,EAAcxnC,SAAS,qBAACqgB,EAAD,qBAAuB0Q,GAA/C,QAAsEwW,EAAtE,YAA+ED,EAA/E,kBAA4F2O,GAAqBv4C,KAAKH,MAExH,IAAQ04C,IAAsB1O,GAC1BlnB,SACMA,IAIV,IAAQmnB,IAAiBD,GAAWD,GAChCvW,SACMA,IAKlB5xB,SACI,OAAO,gBAAC62C,EAAqBt4C,KAAKH,S,EAlB1C,E,EAAA,Y,EAAA,CAPAgqC,QAOA,oBANAvnC,QAMA,WAdA+wB,qBAcA,SAbA1Q,qBAaA,sBALAinB,YAKA,U,6FAAA,I,mLCEJ,MAAM4O,EAAqB34C,IACvB,MAAM44C,GAAkBC,aAAQC,KAAqB,KAC/C,UAACC,EAAD,WAAYC,EAAZ,UAAwBC,EAAxB,YAAmCC,EAAnC,iBAAgDC,EAAhD,OAAkEC,EAAlE,QAA0E1uC,GAAW1K,EAErFq5C,GAAsBzZ,iBAAY0Z,MAClCvsB,GAAe6S,kBAAavmC,GAAuBu/C,EAAgBv/C,EAAO+/C,KAC1EG,GAAsB3Z,kBAAavmC,IAAuBmgD,QAAsBngD,EAAO0zB,KACvF8e,GAAWjM,iBAAY6Z,MAG7B,IAD0B1Y,QAAQsY,IAAuBtsB,aAAJ,EAAIA,EAAcE,SAAUssB,GAE7E,OAAO,KAGX,MAAMG,EACF,gBAAC,IAAD,CACIC,UAAW5sB,EAAaE,MACxBypB,KAAMqC,EACNC,WAAYA,EACZtuC,QAASA,IAIjB,OAAKwuC,EAKD,gBAAC,IAAD,CACIzU,UAAWt1B,wBACXu1B,UAAWyU,EACXxU,QACI,gBAAC,IAAD,CAAS1sC,GAAG,yBACR,uBAAKkJ,UAAU,iBACX,gBAAC,IAAD,CACIw4C,UAAW5sB,EAAaE,MACxBypB,KAAM,GACNsC,WAAY,CACRY,UAAW,KAGlB7sB,EAAalY,MACV,wBACI1T,UAAU,qBACV4H,MAAO,CAAC0gC,WAAY,IAEnB1c,EAAalY,OAIzBkY,EAAa8sB,YAAc9sB,EAAa+sB,WAAaC,gBAClD,2BACI,gBAAC,IAAD,CACIj7B,KAAMiO,EAAa8sB,WACnBhO,SAAUA,EACV1qC,UAAU,4BAO9B,wBAAM4H,MAAOkwC,GACRS,IAvCFA,G,aAjCXX,U,WACAG,Y,SACAC,iB,WAAmB,MAAQ,QAAU,SAAW,SAGhDC,O,WACA1uC,Q,UAwEJiuC,EAAkBqB,aAAe,CAC7BZ,OAAQ,GACRL,UAAW,GACXI,iBAAkB,MAClBD,aAAa,EACbD,UAAW,GACXD,WAAY,CACRvP,WAAY,IAIpB,W,2XCnFA,MAAMwQ,EAA2Cj6C,IAC7C,MAAM,sBAACk6C,EAAD,YAAwBC,EAAxB,OAAqCnoC,GAAUhS,GAC/C,MAACitB,EAAD,KAAQpY,EAAR,SAAcilC,GAAY9nC,GACzBnK,EAAMuyC,IAAWrM,eAAS,GAc3BsM,EAAcF,EAEZ,uBACIh5C,UAAU,oBAEV,gBAAC,IAAD,CACIsjC,UAAWt1B,wBACXu1B,UAAU,MACVC,QACI,gBAACJ,EAAA,EAAD,CAAStsC,GAAG,8BACP,UAIT,0BACIkJ,UAAU,4BACVuJ,QAxBmBge,IACnCA,EAAM4xB,kBACN5xB,EAAMviB,iBACFg0C,GACAA,EAAYnoC,KAsBA,qBAAG7Q,UAAU,8BAIzB,KAER,OACI,uBACIA,UAAU,wCACVo5C,aAvCgB,IAAMH,GAAQ,GAwC9BI,aAtCgB,IAAMJ,GAAQ,GAuC9B1vC,QAAS,IAAMwvC,EAAsBloC,IAErC,uBAAK7Q,UAAU,0BACX,gBAAC,IAAD,CACIw4C,UAAW1sB,EACXypB,KAAM,MAGd,gBAAC,IAAD,CACI7hC,KAAMA,EACNskC,iBAAiB,MACjBh4C,UAAWs4B,IAAW,yBAA0B,CAC5CghB,cAAeX,MAGtBA,GACDA,IAAaC,sBACbD,IAAaC,mBACT,wBAAM54C,UAAU,8BACZ,gBAAC,IAAD,CACIlJ,GAAIyiD,KAAeZ,GAAU7hD,GAC7B+N,eAAgB00C,KAAeZ,GAAU9zC,kBAIpD6B,GAAQwyC,I,aA5EjBH,sB,oBACAC,Y,UAgFJ,U,8CC5EA,MAAM,WACFQ,EADE,eAEFC,EAFE,SAGFC,EAHE,WAIFC,EAJE,MAKFC,EALE,UAMFC,EANE,cAOFC,EAPE,iBAQFC,GACAnB,IAEEoB,EAA+Bn7C,IAAiB,MAClD,MAAM,SAAC85C,EAAD,qBAAWsB,EAAX,WAAiCC,GAAcr7C,GAC/C,cAAC+F,IAAiBiyC,UACjBsD,EAAWC,IAAgBxN,cAAwB,IAEpDyN,EAAsE,CACxE,CAACb,GAAa,CACV9lC,KAAM9O,EAAc20C,KAAeC,IACnCz5C,MAAO6E,EAAc20C,KAAeC,KAExC,CAACC,GAAiB,CACd/lC,KAAM9O,EAAc20C,KAAeE,IACnC15C,MAAO6E,EAAc20C,KAAeE,KAExC,CAACC,GAAW,CACRhmC,KAAM9O,EAAc20C,KAAeG,IACnC35C,MAAO6E,EAAc20C,KAAeG,KAExC,CAACC,GAAa,CACVjmC,KAAM9O,EAAc20C,KAAeI,IACnC55C,MAAO6E,EAAc20C,KAAeI,KAExC,CAACC,GAAQ,CACLlmC,KAAM9O,EAAc20C,KAAeK,IACnC75C,MAAO6E,EAAc20C,KAAeK,KAExC,CAACC,GAAY,CACTnmC,KAAM9O,EAAc20C,KAAeM,IACnC95C,MAAO6E,EAAc20C,KAAeM,KAExC,CAACE,GAAmB,CAChBrmC,KAAM9O,EAAc,CAAC9N,GAAI,qDAAsD+N,eAAgB,yBAC/F9E,MAAO6E,EAAc20C,KAAeQ,MAqB5C,OAjBAlN,gBAAU,KACN,MAAMyN,EAAgBh2C,OAAOC,KAAK81C,GAAiBxxC,KAAI,CAAC0xC,EAAMzxC,KAAP,eACnD,gBAAC,eAAD,CACI5M,IAAKq+C,EAAK96C,WACV8J,QAAUge,IACNA,EAAMviB,iBACNi1C,EAAqBM,IAEzBvmC,UAAS,UAAEqmC,EAAgBE,UAAlB,aAAE,EAA+C7mC,KAAKrC,cAC/DqC,KAAI,UAAE2mC,EAAgBE,UAAlB,aAAE,EAA+C7mC,KACrD5c,GAAE,2BAAsBgS,QAIhCsxC,EAAaE,KACd,IAGC,uBAAKt6C,UAAU,gBACX,uBAAKA,UAAU,yBACX,gBAAC,IAAD,CACIA,UAAW,sBAEX,wBAAMA,UAAU,kCACZ,gBAAC,IAAD,CACIlJ,GAAG,4CACH+N,eAAe,gBAChB,KACFq1C,GAAcvB,IAAaa,EACxB,gBAAC,IAAD,CACI77B,KAAMu8B,EACNl6C,UAAU,eACVw6C,YAAY,IAGhB,wBAAMx6C,UAAU,gBAAhB,UACKq6C,EAAgB1B,IAAamB,EAAgBC,EAAmBpB,UADrE,aACK,EAA2E54C,OAGpF,4BACI,qBACIC,UAAU,mBACVgyC,cAAY,WAIxB,gBAAC,IAAD,CACIh+B,UAAWpP,EAAc,CAAC9N,GAAI,4CAA6C+N,eAAgB,gBAC3F/N,GAAG,oBAEH,gBAAC,UAAD,KACKqjD,Q,aAtGzBD,W,WACAD,qB,qBA8GJ,U,oCClHA,MAEMQ,EAAiDC,IACnD,MAAM,gBACFC,EADE,YAEFC,EAFE,UAGF56C,GACA06C,EAUJ,OACI,uBAAK16C,UAAWA,GACZ,0BACIA,UAAU,cACV4H,MAb2B,CACnCizC,MAAO,OACPC,SAAU,IAYFvxC,QAAU5L,IACNA,EAAEqH,iBACE21C,GACAA,MAIR,qBACI36C,UAAU,mBACVgyC,cAAY,UAGpB,0BACIhyC,UAAU,cACV4H,MAxB4B,CACpCizC,MAAO,QACPC,SAAU,IAuBFvxC,QAAU5L,IACNA,EAAEqH,iBACE41C,GACAA,MAIR,qBACI56C,UAAU,oBACVgyC,cAAY,YAOzB,SAAS+I,EAAeh7C,GAC3B,MACMi7C,EAAQC,IAAOl7C,GACfm7C,EAAOF,EAAMG,SAxDgC,GAyDnD,GAAa,IAATD,EACA,OAAOn7C,EAEX,MAAMq7C,EA5D6C,GA4DrBF,EAC9B,OAAOF,EAAMj3B,IAAIq3B,EAAW,KAAKC,QAAQ,GAAGC,aAAa,GAG7D,MAmBMC,EAA2C18C,IAC7C,MAAMob,GAASwkB,iBAAYvkB,MACrB,KAACyD,EAAD,aAAOk0B,EAAP,SAAqBnH,GAAY7rC,GAChC28C,EAAaC,IAAkB7O,cAAiB,KACjD,cAAChoC,IAAiBiyC,UAWxBhK,gBAT0B,KACtB,MAAM6O,GAAcC,QAA4BjR,GAChD,IAAIkR,EAAYX,IAAOt9B,GAAMk+B,QAAQ,OACjCl+B,EAAKypB,SAAWsU,EAAYtU,SAC5BwU,EAAYb,EAAeW,IAE/BD,EA/BoBG,KAExB,IAAIj+B,EAAOs9B,IAAOW,GAClB,MAAME,EAAUb,IAAOW,GAAW73B,IAAI,EAAG,QAAQ83B,QAAQ,OACnDE,EAAoB,GAC1B,KAAOp+B,EAAKq+B,SAASF,IACjBC,EAAU99B,KAAKN,EAAKs+B,UACpBt+B,EAAOA,EAAKoG,IAvEmC,GAuErB,WAAWs3B,QAAQ,GAAGC,aAAa,GAGjE,OAAOS,GAqBYG,CAAmBN,MAGT,CAACj+B,IAE9B,MAWMw+B,GAAmBC,kBAAY,CAACz+B,EAAYhgB,KAC9CA,EAAEqH,iBACF6sC,EAAaoJ,IAAOt9B,MACrB,CAACk0B,IAEE6J,GAAcC,QAA4BjR,GAAUuR,SACpDI,EAAY,CACdC,MAAOZ,GAGX,OACI,uBAAK17C,UAAU,YACX,uBAAKA,UAAU,kBACX,wBAAMA,UAAU,yBAAyB4E,EAAc,CAAC9N,GAAI,yCAA0C+N,eAAgB,UACtH,wBAAM7E,UAAU,uBACZ,qBAAGA,UAAU,2BAEjB,gBAACu8C,EAAA,QAAD,CACIx8C,MAAO4d,EAAKs+B,SACZO,YA9BQ,CAACC,EAAWJ,KAChC,GAAIA,EAAUC,MAAO,CACjB,MACMI,EAAc3B,GADAY,QAA4BjR,IAEhDmH,EAAa6K,OACV,CACH,MAAMC,EAAkBjS,EAAWuQ,OAAUwB,EAAK/R,GAAYuQ,IAAOwB,GACrE5K,EAAa8K,EAAgBd,QAAQ,UAwB7Be,WAAY,CACRC,UAAU,EACV78C,UAAW,mBAEf88C,eAAgB,CACZC,cAAe,gBAACtC,EAAD,MACfuC,UAAWtB,EACXW,YACApiC,OAAQA,EAAO5I,cACf4rC,aAAc,CACVC,OAAQxB,OAKxB,uBAAK17C,UAAU,kBACX,gBAAC,IAAD,CACIA,UAAU,uBAEV,2BACI,wBAAMA,UAAU,yBAAyB4E,EAAc,CAAC9N,GAAI,yCAA0C+N,eAAgB,UACtH,wBAAM7E,UAAU,uBACZ,qBAAGA,UAAU,wBAEjB,uBACIA,UAAU,mBAEV,gBAAC,KAAD,CACIm9C,aAAa,EACbC,SAAS,EACTr9C,MAAO4d,EAAKle,eAIxB,gBAAC,IAAD,CACIuU,UAAWpP,EAAc,CAAC9N,GAAI,4BAA6B+N,eAAgB,kBAC3E/N,GAAG,kBAEH,gBAAC,UAAD,KACKu8C,MAAMgK,QAAQ7B,IAAgBA,EAAY3yC,KAAI,CAACsyB,EAAQryB,IACpD,gBAAC,eAAD,CACIS,QAAS4yC,EAAiBmB,UAAK,EAAMniB,GACrCj/B,IAAK4M,EACL4K,KACI,gBAAC,KAAD,CACIypC,aAAa,EACbC,SAAS,EACTr9C,MAAOo7B,c,aAnG/C0W,a,oBACAnH,S,YA+GJ,WC5JI8O,WADE,EAEFC,eAFE,GAGFC,SAHE,GAIFC,WAJE,GAKFC,MALE,GAMFC,UANE,GAOFC,cAPE,GAQFC,iBAAgBA,IAChBnB,IAEE2E,GAA4D,CAC9D,CACIzxB,MAAO,WACPluB,SAASoV,OAAE,0CACXwqC,eAAgB,eAChB7E,SAAUe,IAEd,CACI5tB,MAAO,YACPluB,SAASoV,OAAE,2CACXwqC,eAAgB,gBAChB7E,SAAUc,IAEd,CACI3tB,MAAO,gBACPluB,SAASoV,OAAE,sCACXwqC,eAAgB,WAChB7E,SAAUiB,IAEd,CACI9tB,MAAO,QACPluB,SAASoV,OAAE,+CACXwqC,eAAgB,oBAChB7E,SAAUiB,IAEd,CACI9tB,MAAO,YACPluB,SAASoV,OAAE,2CACXwqC,eAAgB,gBAChB7E,SAAUkB,KAIZ4D,GAAkB7D,GAClB8D,GAAsC7+C,IACxC,MAAM44C,GAAkBC,aAAQC,KAAqB,IAC/CvhD,GAAWunD,mBACXC,GAAsBnf,iBAAYgZ,GAClCW,GAAsB3Z,kBAAavmC,IAAuBmgD,QAAsBngD,EAAO0lD,KACvFC,GAAuBpf,iBAAYqf,MACnCC,GAAyBC,YAAuB,OAChD,cAACp5C,IAAiBiyC,SAClBoH,GAA4B7F,KAAwBwF,aAAA,EAAAA,EAAqBlqC,QAAQkqC,aAA7B,EAA6BA,EAAqB9xB,SACrGoyB,EAAiBC,IAAsBvR,eAAkB,IACzDl5B,EAAM0qC,IAAWxR,cAAiBqR,EAA2BL,aAAH,EAAGA,EAAqBlqC,KAAO,KACzFoY,EAAOuyB,IAAYzR,cAAiBqR,EAA2BL,aAAH,EAAGA,EAAqB9xB,MAAQ,IAC7FwyB,EAAkBL,EAA2BL,aAAH,EAAGA,EAAqBjF,SAAW8E,IAC5E9E,EAAU4F,IAAe3R,mBAAmD5mC,IAApBs4C,EAAgCb,GAAkBa,GAC3GE,EAAc5e,QAAQ9T,GAASpY,GAC/B+qC,GAAuBhgB,iBAAYigB,MACnChU,GAAWjM,iBAAY6Z,MAG7B,IAAIqG,EAAkC5D,GADlBY,QAA4BjR,IAE5CuT,IAA4BL,aAAA,EAAAA,EAAqBjF,YAAamB,IAA9DmE,MAA+EL,KAAqBlF,aACpGiG,EAA0B1D,IAAO2C,EAAoBlF,aAEzD,MAAOkG,EAAkBC,IAAuBjS,cAAiB+R,IAcjE9R,gBAAU,KAXF4R,GACAroD,GAAS0oD,QAAmC,CAAC,CAAC7xC,kCAAyC,KAIrD,MACtC,MAAM8xC,EAAe,IAAIj7B,IACzB+5B,EAAqB/5C,SAAS8nB,GAAmCmzB,EAAah7B,IAAI6H,EAAaE,SAC/F11B,GAASy1B,QAAyBwnB,MAAMC,KAAKyL,MAK7CC,KACD,IAEH,MAmCMC,EAAoBhB,EAA2B,IAAM7nD,GAAS8oD,gBAAuBl5C,EAErFm5C,EAA4B,IAAMpB,EAAuB1Q,QAEzD+R,EAAmB,IAAMjB,GAAmB,GAY5CkB,EAAiCxuC,GAA6Bza,GAASkpD,QAAyBzuC,IAEhG0uC,EAAoBzzB,GAASpY,EAC/B,gBAAC,IAAD,CACI8kC,UAAW1sB,GAAS,iBACpBypB,KAAM,KAEV,gBAAC,IAAD,CAAWv1C,UAAW,qBAQpB+4C,EAAyBloC,IAC3BwtC,EAASxtC,EAAOib,OAChBsyB,EAAQvtC,EAAO6C,MACf6qC,EAAY1tC,EAAO8nC,UAAYa,IAgB7BgG,GACF,uBAAK1oD,GAAG,6BACJ,uBAAKkJ,UAAU,2BACV4E,EAAc,CAAC9N,GAAI,yCAA0C+N,eAAgB,YAG9Eg5C,EAAqBh1C,KAAKgI,GACtB,gBAAC,EAAD,CACI3U,IAAK2U,EAAO6C,KACZqlC,sBAAuBA,EACvBC,YAAaqG,EACbxuC,OAAQA,OAuCtB4uC,IADsB7B,aAAA,EAAAA,EAAqB9xB,SAAUA,IAAS8xB,aAAA,EAAAA,EAAqBlqC,QAASA,GACvCilC,KAAaiF,aAAL,EAAKA,EAAqBjF,UAEvF+G,IAAmBlB,GAAeiB,GAElCE,IAAoBnB,GAAe9qC,EAAKlP,OA5OP,IA8OjCo7C,IAAwBF,KAAoB/G,IAAaoB,IAAoBpB,IAAamB,IAE1F+F,GACF,uBACI7/C,UAAU,mBACV4H,MAAO,CAAC6wC,UAAW+F,EAAc,GAAK,IAEtC,uBAAKx+C,UAAU,6BACV69C,EAAqBr5C,OAAS,GAAKg7C,GACpC,uBAAK1oD,GAAG,iCA/CkB,MAClC,MAAMgpD,EAA0BjC,EAAqBh1C,KAAKgI,GAA6BA,EAAO6C,OACxFqsC,EAA0BxC,GAC5B10C,KAAKgI,IAAD,CACAib,MAAOjb,EAAOib,MACdpY,KAAM9O,EAAc,CAAC9N,GAAI+Z,EAAOjT,QAASiH,eAAgBgM,EAAO2sC,iBAChE7E,SAAU9nC,EAAO8nC,aAErBryC,QAAQuK,IAA8BivC,EAAwB7vB,SAASpf,EAAO6C,QAC9E7K,KAAI,CAACgI,EAA0B/H,IAC3B,gBAAC,EAAD,CACI5M,IAAK4M,EACLiwC,sBAAuBA,EACvBloC,OAAQA,MAIpB,OAAIkvC,EAAwBv7C,QAAU,EAC3B,KAIP,gCACI,uBAAKxE,UAAU,2BACV4E,EAAc,CAAC9N,GAAI,kCAAmC+N,eAAgB,iBAE1Ek7C,IAsBIC,MAMjB,OACI,gBAAC,IAAD,CACIlsC,cAAc,EACd3M,OAAQtI,EAAMsI,OACdqlC,gBACI,gBAAC,IAAD,CACI11C,GAAG,2BACH+N,eAAe,iBAGvBo7C,kBACI,gBAAC,IAAD,CACInpD,GAAG,8BACH+N,eAAe,eAGvBq7C,iBACI,gBAAC,IAAD,CACIppD,GAAG,6BACH+N,eAAe,iBAGvBs7C,kBAAmBR,GACnB7oD,GAAG,sBACHkJ,UAAW,cACXogD,cAtLgB,KACpB,MAAMC,EAYkB,MACxB,OAAQ1H,GACR,KAAKa,EACD,MAAO,GACX,KAAKC,GACD,OAAOwB,MAASl3B,IAAI,GAAI,WAAWs3B,QAAQ,GAAGC,aAAa,GAAGgF,cAClE,KAAK5G,GACD,OAAOuB,MAASl3B,IAAI,EAAG,QAAQs3B,QAAQ,GAAGC,aAAa,GAAGgF,cAC9D,KAAK3G,GACD,OAAOsB,MAASl3B,IAAI,EAAG,SAASs3B,QAAQ,GAAGC,aAAa,GAAGgF,cAC/D,KAAK1G,GACD,OAAOqB,MAASsF,MAAM,OAAOD,cACjC,KAAKzG,GACD,OAAOoB,MAASsF,MAAM,QAAQD,cAClC,KAAKxG,GACL,KAAKC,GACD,OAAO6E,EAAiB0B,cAC5B,QACI,MAAO,KA9BOE,GACZ50B,EAAiC,CACnCE,MAAOA,GAAS,iBAChBpY,KAAMA,EAAKpC,OACXqnC,SAAUA,IAAaoB,GAAmBD,GAAgBnB,GAE1D0H,IACAz0B,EAAa8sB,WAAa2H,GAE9BjqD,GAASqqD,QAAgB70B,KA6KrB80B,aAAczB,EACd0B,uBAAuB,mBAEvB,uBAAK3gD,UAAU,qBACX,uBAAKA,UAAU,sBACX,uBACIw7B,IAAKuiB,EACL/9C,UAAU,gCAETk+C,GACG,gBAAC,IAAD,CACIhlB,OAAQimB,EACRz4C,KAAMw3C,EACN/2C,OAAQi4C,EACRwB,aAAcxB,EACdyB,aA7JFC,IACtB3C,GAAmB,GACnB,MAAM3F,EAAa,eAAgBsI,EAAiBA,EAAcC,WAAaD,EAAc1hD,KAC7Fi/C,EAAS7F,IA2JewI,YA/HC,MACzB,IAAIA,EAAchzC,uCAClB,MAAMkrB,EAASimB,IAQf,OAPIjmB,IACA8nB,EAAc31C,OAAO41C,WAAa/nB,EAAOoU,wBAAwB4T,KA5K3C,IA6KlBF,EAAc,IACdA,EAAchzC,yCAIfgzC,GAqH8BG,GACbC,WAAY,EACZC,UAAW,EACXC,0BAA0B,UAGlC,0BACIzmD,KAAK,SACL0O,QAhKE,IAAM40C,GAAoBoD,IAAcA,IAiK1CvhD,UAAWs4B,IAAW,0BAA2B,4BAA6B,CAC1E,oCAAqC4lB,KAGxCqB,IAGT,gBAAC,IAAD,CACIiC,eAAgBC,IAChB1hD,MAAO2T,EACPpR,UA3TmB,IA4TnBo/C,sBAAuB9hB,QAAQ4e,GAC/BmD,QAhKA,KAChBtD,EAAS,IACTD,EAAQ,IACRG,EAAYd,KA8JIz9C,UAAU,eACV4hD,eAAe,+BACfC,gBAAgB,MAChB5iD,SA/KMsoB,GAA+C62B,EAAQ72B,EAAM2R,OAAOn5B,OAgL1EF,YAAa+E,EAAc,CAAC9N,GAAI,2BAA4B+N,eAAgB,oBAGnF66C,IAAmBG,GACnBD,IACG,gBAAC,EAAD,CACIjiC,KAAMihC,EACN/M,aAAcgN,EACdnU,SAAUA,IAGjB8T,GACG,gBAAC,EAAD,CACI7F,SAAUA,EACVuB,WAAYwF,GAAkB9B,aAAH,EAAGA,EAAqBlF,gBAAa1yC,EAChEi0C,qBAAsBsE,O,cAtV1Cp3C,O,qBA8VJ,a,kJChXA,MAAM26C,EAAoBjjD,IACtB,MAAM,iBAACm5C,EAAD,KAAmBtkC,EAAnB,UAAyB1T,GAAanB,EACtCq5C,GAAsBzZ,kBAAavmC,IAC9BigD,QAAsBjgD,MAE1BwO,EAAMuyC,IAAWrM,eAAkB,GAC1C,IAAImV,EAAsC,KAC1C,IAAK7J,EACD,OAAO,KAGX,MAIM8J,EACF,wBACIhiD,UAAS,yCAAoCA,GAC7Cw7B,IAAMt2B,IACF68C,EAAc78C,EAPtB+zC,EAAQrZ,QAAQmiB,GAAeA,EAAYE,YAAcF,EAAYG,gBAWhExuC,GAIT,OAAKhN,EAKD,gBAAC,IAAD,CACI48B,UAAWt1B,wBACXu1B,UAAWyU,EACXxU,QACI,gBAAC,IAAD,CAAS1sC,GAAG,yBACP4c,IAIRsuC,GAbEA,G,aAjCXhK,iB,WAAmB,MAAQ,QAAU,SAAW,SAChDtkC,K,WACA1T,U,YAiDJ8hD,EAAiBjJ,aAAe,CAC5Bb,iBAAkB,SAClBtkC,KAAM,GACN1T,UAAW,IAGf,W,sICxDA,MAAMmiD,EAA8B,CAChCC,QACAA,SAWEC,EAAa,EAAE1kC,OAAM+sB,WAAU1qC,YAAWw6C,aAAY8H,qBACxD,MAAMC,GAAoB5G,QAA4BjR,GAChD8X,EAA0C,CAC5CziD,MAAO4d,EACP8kC,OAAQN,IAGRlH,IAAOt9B,GAAM+kC,OAAOH,EAAkBI,QAAQpC,MAAM,SAAWtF,IAAOt9B,GAAMilC,QAAQL,EAAkBI,QAAQ5+B,IAAI,EAAG,OAAOw8B,MAAM,WAClIiC,EAAeK,SAAU,GAGzB5H,IAAOt9B,GAAMq+B,SAASuG,EAAkBI,QAAQpC,MAAM,UACtDiC,EAAepF,SAAU,SAClBoF,EAAeC,QAGtBxH,IAAOt9B,GAAMilC,QAAQL,EAAkBI,QAAQ5+B,IAAI,EAAG,OAAOw8B,MAAM,SAAWtF,IAAOt9B,GAAMq+B,SAASuG,EAAkBI,QAAQ5+B,IAAI,EAAG,WACrIy+B,EAAepF,QAAU,CAAC0F,QAAS,SAGnC7H,IAAOt9B,GAAMilC,QAAQL,EAAkBI,QAAQ5+B,IAAI,EAAG,WACtDy+B,EAAevjB,MAAQ,SAGvBgc,IAAOt9B,GAAMilC,QAAQL,EAAkBI,QAAQpC,MAAM,WACrDiC,EAAenjB,KAAO,WAG1B,MAAMjiB,EAASo9B,GACX,gCACI,gBAAC,IAAD,CACI1jD,GAAG,6BACH+N,eAAe,UAChB,KAIX,OACI,wBAAM7E,UAAWA,GACZsiD,GAAkB,IAClBllC,EACD,gBAAC,KACOolC,GAEPF,GAAkB,M,aAnD3B3kC,K,sBACA+sB,S,WACA1qC,U,WACAw6C,W,SACA8H,e,UAoDJD,EAAWxJ,aAAe,CACtB2B,YAAY,EACZ8H,gBAAgB,GAGpB,QAAe3jD,OAAW0jD,I,gFCjEX,SAASU,EAAqBzL,EAAkB0L,EAAqB,MAChF,MAAMC,UAA8BtkD,gBAChCC,YAAYC,EAAOwL,GACfvL,MAAMD,EAAOwL,GAEbrL,KAAK9G,MAAQ,CACTgrD,cAAc,GAItBpnB,oBACIzwB,OAAO4jC,uBAAsB,KACzB5jC,OAAO4jC,uBAAsB,IAAMjwC,KAAK8F,SAAS,CAACo+C,cAAc,SAIxEziD,SACI,OAAOzB,KAAK9G,MAAMgrD,aAAe,gBAAC5L,EAAqBt4C,KAAKH,OAAWmkD,GAI/E,OAAOG,IAAaF,EAAuB3L,K,iVCDhC,MAAM8L,UAAwBzkD,gBAGzCC,YAAYC,GACRC,MAAMD,GADgB,sDASXtI,UACX,MAAM,QACF+K,EADE,KAEFqK,GACA3M,KAAKH,MAET,IAAIwkD,EAAkB,GAEtB,MAAM51C,QAAenM,EAAQgiD,oBAAoB33C,GAE3C43C,GAAkBC,QAA4BxkD,KAAKH,MAAMyqB,SAASC,SAAU,CAC9Ek6B,KA7CsB,0CAgDpBC,GAAqBF,QAA4BxkD,KAAKH,MAAMyqB,SAASC,SAAU,CACjFk6B,KAhDyB,6CAyD7B,GANIF,EACAF,EAAkBE,EAAgBzrD,OAAO6rD,OAClCD,IACPL,EAAkBK,EAAmB5rD,OAAO6rD,QAG5CN,IAAoB13C,EAAK7U,GAAI,CAC7B,MAAM8sD,EAAa5kD,KAAKH,MAAMyqB,SAASC,SAASsD,MAAM,KAAKrhB,MAAM,GAAI,GAAGq4C,KAAK,KAC7Et4C,YAAuBq4C,GAGvBn2C,EAAO9W,MACPqI,KAAKmI,YAvCa,wBA2CV,KAAM,QAClB,UAAAnI,KAAK8kD,qBAAL,mBAAoBzW,eAApB,SAA6Bp0B,WA5CP,iBA+CjB,KAGL,GAFAja,KAAK8F,SAAS,CAAC4B,MAAM,KAEhB8K,OAAsB,CACvB,IAAItM,EAEAA,EADAlG,KAAKH,MAAM4vC,MACDjwC,SAASulD,eAAe,iBAExBvlD,SAASulD,eAAe,gBAElC7+C,GACAA,EAAQ+T,YAxDhBja,KAAK8kD,cAAgBnlD,cAErBK,KAAK9G,MAAQ,CACTwO,MAAM,GA0DdjG,SACI,IAAIujD,EAAkC,GAElChlD,KAAKH,MAAMq4C,aAAe,GAAiC,KAA5Bl4C,KAAKH,MAAM8M,KAAKG,UAC/Ck4C,EACI,gBAAC,IAAD,CACIltD,GAAG,sBACH+N,eAAe,uFACfjB,OAAQ,CACJ4wB,MAAOx1B,KAAKH,MAAMq4C,iBAMlC,MAAM+M,EAAWjlD,KAAKH,MAAM8M,KAAKG,QAC7B,gBAAC,IAAD,CACIhV,GAAG,sBACH+N,eAAe,YAGnB,gBAAC,IAAD,CACI/N,GAAG,mBACH+N,eAAe,SAIvB,OACI,gBAACoC,EAAA,EAAD,CACIC,gBAAgB,cAChBR,KAAM1H,KAAK9G,MAAMwO,KACjBw9C,UAAWllD,KAAKmlD,cAChBh9C,OAAQnI,KAAKmI,OACbC,SAAUpI,KAAKH,MAAMsI,OACrB2M,cAAc,EACdhd,GAAG,kBACHwQ,KAAK,SACLC,kBAAgB,wBAEhB,gBAACN,EAAA,SAAD,CAAcU,aAAa,GACvB,gBAACV,EAAA,QAAD,CACIa,eAAe,KACfhR,GAAG,wBAEH,gBAAC,IAAD,CACIA,GAAG,sBACH+N,eAAe,wBACfjB,OAAQ,CACJyK,KAAO41C,OAKvB,gBAACh9C,EAAA,OAAD,KACI,gBAAC,IAAD,CACInQ,GAAG,uBACH+N,eAAe,+CACfjB,OAAQ,CACJyK,KAAO41C,KAGf,2BACA,2BACCD,GAEL,gBAAC/8C,EAAA,SAAD,KACI,0BACIpM,KAAK,SACLmF,UAAU,eACVuJ,QAASvK,KAAKmI,QAEd,gBAAC,IAAD,CACIrQ,GAAG,qBACH+N,eAAe,YAGvB,0BACI22B,IAAKx8B,KAAK8kD,cACVjpD,KAAK,SACL8H,WAAW,EACX3C,UAAU,iBACVuJ,QAASvK,KAAKo+B,aACdtmC,GAAG,yBAEH,gBAAC,IAAD,CACIA,GAAG,kBACH+N,eAAe,e,EAxJtBu+C,E,aAlBjB32C,Y,sBACA0xB,S,sBAEA+Y,a,sBACAzI,M,oBACAtnC,O,oBACA7F,Q,WACIgiD,oB,iCAEJh6B,S,WACIC,S,qCC4BR,SAAe66B,SAAWjhD,cApB1B,WACI,MAAMkhD,GAAgBC,UAEtB,MAAO,CAACpsD,EAAoBusB,KACxB,MAAM9Y,EAAO8Y,EAAS9Y,KAEtB,MAAO,CACHurC,aAAcmN,EAAcnsD,EAAOyT,QAK/C,SAA4BvV,GACxB,MAAO,CACHkL,SAAS+B,wBAAiE,CACtEigD,oBAAmBA,MACpBltD,MAIe+M,CAAgEigD,K,+dClD3E,MAAMmB,UAA2B5lD,gBAC5C8B,SACI,OACI,uBAAUzB,KAAKH,MACX,uBACI0J,MAAM,OACNC,OAAO,MACPyjC,QAAQ,WACR3kC,KAAK,MACLqqC,aAAW,wBAEX,wBAAMtF,EAAE,ujC,uICmHrB,MAAMmY,UAAqB7lD,gBAW9BC,YAAYC,GACRC,MAAMD,GADgB,0FA8CN,KAChBG,KAAK8F,SAAS,CAAC2/C,SAAS,OA/CF,sCAkDI,KACtBzlD,KAAKH,MAAM6lD,UACX1lD,KAAKH,MAAMyC,QAAQqjD,WAAW3lD,KAAKH,MAAM8M,KAAK7U,IAE9CkI,KAAKH,MAAMyC,QAAQsjD,SAAS5lD,KAAKH,MAAM8M,KAAK7U,OAtD1B,6CA2DY6G,IAClCA,EAAEqH,iBAGEhG,KAAKH,MAAMgmD,wBACX7lD,KAAKH,MAAMgmD,4BAhEO,mBAoEf,KACP5wC,KAAA,UAAyBjV,KAAKH,MAAMimD,eAApC,eAAyD9lD,KAAKH,MAAM8M,KAAK7U,QArEnD,qCAwEG,KACrBkI,KAAKH,MAAM8M,KAAK4c,UAChBvpB,KAAKH,MAAMyC,QAAQyjD,UAAU/lD,KAAKH,MAAM8M,KAAK7U,IAE7CkI,KAAKH,MAAMyC,QAAQ0jD,QAAQhmD,KAAKH,MAAM8M,KAAK7U,OA5EzB,wCAgFO6G,IAC7BA,EAAEqH,iBACFhG,KAAKH,MAAMyC,QAAQ2jD,iBAAiBjmD,KAAKH,MAAM8M,KAAM3M,KAAKH,MAAMyqB,aAlF1C,wCAqFO3rB,IAC7BA,EAAEqH,iBAEF,MAAMkgD,EAAsB,CACxB3uC,QAASzL,iBACTC,WAAYq4C,IACZp4C,YAAa,CACTW,KAAM3M,KAAKH,MAAM8M,KACjB8iC,MAAOzvC,KAAKH,MAAMyqB,WAAa67B,eAAsBnmD,KAAKH,MAAMyqB,WAAa67B,mBAIrFnmD,KAAKH,MAAMyC,QAAQsJ,UAAUs6C,MAjGP,sCAoGI,KAC1BlmD,KAAKH,MAAMyC,QAAQ8jD,eACfpmD,KAAKH,MAAM8M,KAAK7U,GAChBkI,KAAKH,MAAMyqB,WAAa67B,YAAmB,eAAiB,gBAC5DnmD,KAAKH,MAAM8M,KAAKG,QAAUmI,KAAsB,sBAAuB,WAAaA,KAAsB,mBAAoB,QAC9HjV,KAAKH,MAAMyqB,WAAa67B,eAAsBnmD,KAAKH,MAAMyqB,WAAa67B,qBAzGpD,gCA6GF,KACpB,MAAM,QAAC7jD,EAAD,cAAUsQ,EAAV,SAAyByzC,EAAzB,OAAmCpuD,EAAnC,kBAA2CquD,GAAqBtmD,KAAKH,MAC3EyC,EAAQikD,gBACJtuD,EACA2a,EACAyzC,GACCC,MAnHiB,iBAwHtB,gBAACliB,EAAA,EAAD,CACItsC,GAAG,uBACHkJ,UAAU,aAEV,gBAAC,IAAD,CACIlJ,GAAG,0CACH+N,eAAe,mBA9HD,sBAmIX2gD,IACX,GAAIA,EAAS,OACT,MAAMC,EAAU,UAAGzmD,KAAK0mD,UAAUrY,eAAlB,aAAG,EAAwBC,wBAC3C,IAAIqY,EAEAA,OADyB,KAAlBF,aAAP,EAAOA,EAAYE,QACW,KAAnBF,aAAP,EAAOA,EAAYG,KAAqB,EAAIH,aAA5C,EAA4CA,EAAYG,IAExDH,aAAH,EAAGA,EAAYE,EAEpB,MAEME,EAFex6C,OAAOmiC,YA3Pb,GA8PTsY,EAAaH,EAAI33C,2BACjB+3C,EAAiBF,GAAcC,EAAa93C,uBAElDhP,KAAK8F,SAAS,CACVkhD,OAASF,EAAaC,QAnJR,wBAwJT5X,GAET,sBACIr3C,GAAE,uBAAkBkI,KAAKH,MAAM8M,KAAK7U,GAAlC,YAAwCq3C,GAC1CnuC,UAAU,oBACVsH,KAAK,eA7JS,4BAkKN/Q,UAChB,MAAM,KAACoV,EAAD,KAAOhH,GAAQ3F,KAAKH,MAE1B,IAAKonD,EAAQl8C,KACT,OAEJ,MAAMM,GAAU67C,QACZD,EAAQE,OACRF,EAAQ38B,SACRtqB,KAAKH,MAAM8M,KAAKE,WAChB7M,KAAKH,MAAM7E,OACXgF,KAAKH,MAAM8M,KAAK7U,GAChBkI,KAAKH,MAAM8M,KAAKG,SAEd/B,GAAOq8C,QACTH,EAAQl8C,KACRM,EACA,CACIsB,KAAM06C,WAIR/gD,QAAYtG,KAAKH,MAAMyC,QAAQ2I,UAAUF,EAAMG,YAAqBvF,GAE1E,GAAIW,EAAI5O,MAAO,CACX,MAAM8O,EAAgBF,EAAI5O,MACpB+O,EAAeD,EAAc9O,OAASiO,EAAKC,cAAc,CAC3D9N,GAAI,qBACJ+N,eAAgB,4BAGpB,YADA7F,KAAKH,MAAMyC,QAAQmK,iCAAiCjG,EAAeC,EAAckG,GAIrF,MAAMvF,EAAWd,EAAI3O,KACrB,OAAQyP,EAASvL,MACjB,KAAKkL,QACGK,EAAS+D,UACTnL,KAAKH,MAAMyC,QAAQmK,iCAAiCrF,EAAUA,EAAS+D,SAAUwB,GAErF,MACJ,KAAK5F,cACL,KAAKA,UACD,MACJ,QAAS,CACL,MAAMN,EAAed,EAAKC,cAAc,CACpC9N,GAAI,oCACJ+N,eAAgB,2DACjB,CACChK,KAAMuL,EAASvL,OAEnBmE,KAAKH,MAAMyC,QAAQmK,iCAAiCrF,EAAUX,EAAckG,QAlNhF3M,KAAKsnD,kBAAoB,IAAIC,IAAcvnD,KAAKwnD,mBAEhDxnD,KAAK9G,MAAQ,CACT8tD,QAAQ,EACRvB,QAAS5lD,EAAM4lD,UAAY5lD,EAAM4nD,WACjCC,UAAW7nD,EAAM6nD,YAAc7nD,EAAM4nD,YAGzCznD,KAAK0mD,UAAY/mD,cAGrBgoD,2BACI,MAAM,KAACh7C,EAAD,WAAOi7C,GAAc5nD,KAAKH,OAC1B,QAAC4lD,GAAWzlD,KAAK9G,MAEjB2uD,EAAoB7nD,KAAKH,MAAMgoD,mBAAqB74C,gCAE1D,GAAIy2C,GAAWmC,GACPC,IAAsB3nB,OAAOlxB,iCAAuC,CACpE,MAAMstC,EAAe,IACfwL,EAAYn7C,EAAKkL,UAAa6iB,OAAOmtB,GAAqBvL,EAAiBrnC,OAC7E6yC,EAAW,GACX9nD,KAAKsnD,kBAAkBS,UAAUD,EAAWxL,IAM5Dxf,oBACI98B,KAAK2nD,2BAGsB,gCAAC9nD,GAC5B,MAAO,CACH4lD,QAAS5lD,EAAM4lD,UAAY5lD,EAAM4nD,WACjCC,UAAW7nD,EAAM6nD,YAAc7nD,EAAM4nD,YAI7ChkB,uBACIzjC,KAAKsnD,kBAAkBU,SA+K3BvmD,SAAS,MACL,MAAMwmD,EAAkBC,KAA0BloD,KAAKH,MAAM8M,MACvD2P,EAAWrH,OAEXkzC,GAAc,UAAAnoD,KAAKH,MAAMuoD,uBAAX,eAChB9gD,QAAQi0C,GACGA,EAAKj0C,OAASi0C,EAAKj0C,OAAOtH,KAAKH,MAAM8M,KAAK7U,IAAMyjD,IAE3D1xC,KAAK0xC,GACGA,EAAK5mC,QAED,gBAAC,gBAAD,CACIzX,IAAKq+C,EAAKzjD,GAAK,kBACfA,GAAIyjD,EAAKzjD,GACT6nB,OAAQ3f,KAAKH,MAAM8M,KAAK7U,GACxB4c,KAAM6mC,EAAK7mC,KACXC,QAAS4mC,EAAK5mC,QACdC,OAAQ2mC,EAAK3mC,OACbC,MAAM,IAKd,gBAAC,eAAD,CACI3X,IAAKq+C,EAAKzjD,GAAK,kBACf4c,KAAM6mC,EAAK7mC,KACXnK,QAAS,KACDgxC,EAAK3mC,QACL2mC,EAAK3mC,OAAO5U,KAAKH,MAAM8M,KAAK7U,WAK1C,GAEV,IAAIuwD,EAAc,GAmBlB,OAlBIroD,KAAKH,MAAMwT,aAAerT,KAAKH,MAAMwoD,cACrCA,EAAcroD,KAAKH,MAAMwoD,YAAYx+C,KAAK0xC,IACtC,IAAInyC,EAKJ,OAJImyC,EAAKnyC,OACLA,EAAQ,uBAAKK,IAAK8xC,EAAKnyC,QAIvB,gBAAC,eAAD,CACIsL,KAAM6mC,EAAK75C,MACXxE,IAAKq+C,EAAK4L,OAAS5L,EAAKjxB,SACxB/f,QAAS,IAAMvK,KAAKsoD,kBAAkB/M,GACtCnyC,KAAMA,QAMjBpJ,KAAK9G,MAAMwuD,WAAc1nD,KAAK9G,MAAMusD,cAAkC,IAAhB0C,GAAsD,IAAvBA,EAAY3iD,SAAgByiD,EAKlH,gBAAC,IAAD,CAAaM,SAAUvoD,KAAKH,MAAM2oD,sBAC9B,gBAAC,IAAD,CACIxnD,UAAU,YACVsjC,UAAW,IACXC,UAAU,MACVC,QAASxkC,KAAKw1C,QACdlG,WAAW,GAEX,0BACI9S,IAAKx8B,KAAK0mD,UACV5uD,GAAE,UAAKkI,KAAKH,MAAMyqB,SAAhB,mBAAmCtqB,KAAKH,MAAM8M,KAAK7U,IACrD66C,aAAY19B,KAAsB,0CAA2C,gBAAgB5C,cAC7FrR,UAAWs4B,IAAW,kBAAmB,CACrC,0BAA2Bt5B,KAAKH,MAAM4oD,aAE1C5sD,KAAK,SACL6sD,gBAAc,SAEd,gBAACnD,EAAD,CAAoBvkD,UAAW,uBAGvC,gBAAC,IAAD,CACIlJ,GAAE,UAAKkI,KAAKH,MAAMyqB,SAAhB,qBAAqCtqB,KAAKH,MAAM8M,KAAK7U,IACvDid,UAAU,EACViyC,OAAQhnD,KAAK9G,MAAM8tD,OACnBxqB,IAAKx8B,KAAK2oD,YACV3zC,UAAWC,KAAsB,0BAA2B,uBAE5D,gBAAC,eAAD,CACIvN,MAAOugD,GAAmBjoD,KAAKH,MAAMyqB,WAAa67B,YAClDzxC,KAAMO,KAAsB,kBAAmB,SAC/C1K,QAASvK,KAAKH,MAAMw4C,qBAExB,gBAAC,IAAD,CACIxoC,UAAW7P,KAAKH,MAAM8M,KAAKE,WAC3B7R,OAAQgF,KAAKH,MAAM7E,OACnB4tD,YAAa,CAACn8B,mBAEd,gBAAC,eAAD,CACI/kB,KAAM4U,IAAa2rC,IAAoBjoD,KAAKH,MAAM4nD,YAAcznD,KAAKH,MAAMgpD,kBAC3En0C,KAAMO,KAAsB,+BAAgC,gBAC5D1K,QAASvK,KAAK8oD,sCAGtB,gBAAC,eAAD,eACIhxD,GAAE,6BAAwBkI,KAAKH,MAAM8M,KAAK7U,IAC1CyS,QAASvK,KAAK+oD,sBACdrhD,MACKugD,GACDjoD,KAAKH,MAAM6nB,4BAEH1nB,KAAKH,MAAMyqB,WAAa67B,aACxBnmD,KAAKH,MAAMyqB,WAAa67B,eACxBnmD,KAAKH,MAAMyqB,WAAa67B,mBAGhCnmD,KAAKH,MAAMymD,kBAAoB,CAC/B5xC,KAAM1U,KAAKH,MAAMmpD,iBAAmB/zC,KAAsB,gCAAiC,mBAAqBA,KAAsB,uCAAwC,oBAC9Kg0C,UAAWh0C,KAAsB,qCAAsC,wCACvE,CACAP,KAAM1U,KAAKH,MAAMmpD,iBAAmB/zC,KAAsB,8BAA+B,iBAAmBA,KAAsB,qCAAsC,kBACxKg0C,UAAWh0C,KAAsB,mCAAoC,yCAG7E,gBAAC,eAAD,CACInd,GAAE,sBAAiBkI,KAAKH,MAAM8M,KAAK7U,IACnC4P,MAAOugD,IAAoBjoD,KAAKH,MAAMqpD,mBAAqBlpD,KAAKH,MAAMyqB,WAAa67B,YACnFzxC,KAAMO,KAAsB,mBAAoB,kBAChD1K,QAASvK,KAAKmpD,gCAElB,gBAAC,eAAD,CACIrxD,GAAE,oBAAekI,KAAKH,MAAM8M,KAAK7U,IACjC4P,MAAOugD,EACPvzC,KAAMO,KAAsB,sBAAuB,aACnD1K,QAASvK,KAAKopD,WAElB,gBAAC,eAAD,CACI1hD,KAAM4U,IAAa2rC,GAAmBjoD,KAAKH,MAAM6lD,UACjDhxC,KAAMO,KAAsB,yBAA0B,qBACtD1K,QAASvK,KAAKqpD,8BAElB,gBAAC,eAAD,CACI3hD,KAAM4U,IAAa2rC,IAAoBjoD,KAAKH,MAAM6lD,UAClDhxC,KAAMO,KAAsB,uBAAwB,QACpD1K,QAASvK,KAAKqpD,8BAElB,gBAAC,eAAD,CACIvxD,GAAE,qBAAgBkI,KAAKH,MAAM8M,KAAK7U,IAClC4P,MAAOugD,IAAoBjoD,KAAKH,MAAM4nD,YAAcznD,KAAKH,MAAM8M,KAAK4c,UACpE7U,KAAMO,KAAsB,kBAAmB,SAC/C1K,QAASvK,KAAKspD,6BAElB,gBAAC,eAAD,CACIxxD,GAAE,mBAAckI,KAAKH,MAAM8M,KAAK7U,IAChC4P,MAAOugD,IAAoBjoD,KAAKH,MAAM4nD,aAAeznD,KAAKH,MAAM8M,KAAK4c,UACrE7U,KAAMO,KAAsB,gBAAiB,OAC7C1K,QAASvK,KAAKspD,8BAEhBrB,IAAoBjoD,KAAK9G,MAAMusD,SAAWzlD,KAAK9G,MAAMwuD,YAAc1nD,KAAKupD,cAAc,QACxF,gBAAC,eAAD,CACIzxD,GAAE,oBAAekI,KAAKH,MAAM8M,KAAK7U,IACjC4P,KAAM1H,KAAK9G,MAAMusD,QACjB/wC,KAAMO,KAAsB,iBAAkB,QAC9C1K,QAASvK,KAAKwpD,8BAElB,gBAAC,eAAD,CACI1xD,GAAE,sBAAiBkI,KAAKH,MAAM8M,KAAK7U,IACnC4P,KAAM1H,KAAK9G,MAAMwuD,UACjBhzC,KAAMO,KAAsB,gBAAiB,UAC7C1K,QAASvK,KAAKypD,8BACdC,aAAa,UAES,IAAhBvB,GAA+BA,EAAY3iD,OAAS,GAAM6iD,EAAY7iD,OAAS,GAAMxF,KAAKH,MAAMic,WAAX,sBAA8C9b,KAAKH,MAAMic,WAAX,qBAA2CtW,OAAS,IAAOxF,KAAKupD,cAAc,WAC1NpB,EACAE,EACD,gBAAC,IAAD,CACI1oC,OAAQ3f,KAAKH,MAAM8M,KAAK7U,GACxB6xD,cAvfW,2BA8XhB,M,EA5RNnE,E,aA9FTxqD,O,WACAsvB,S,0BAAW,W,WAAW,a,WAAa,gB,WAAgB,W,aACnDo7B,U,SACArN,mB,SACAmQ,qB,SACA3C,uB,SACA4C,W,SACAhB,W,4CACAW,gB,UACAR,W,SACAC,kB,WACAgB,kB,SACAK,kB,SACApD,e,WACAuC,Y,UACAh1C,Y,oBAKAyI,W,mCAIAxZ,Q,WAKIsjD,S,oBAKAD,W,oBAKAS,e,oBAKAJ,Q,oBAKAD,U,oBAKAn6C,U,oBAKAq6C,iB,oBAeAM,gB,iCAIJd,Q,oBACAiC,U,oBACAzvD,O,sBAGAyvB,0B,oBACA4+B,kB,SACA0C,iB,eASSxD,E,eACoC,CACzCE,WAAW,EACX+B,YAAY,EACZn9B,SAAU67B,YACViC,gBAAiB,GACjBC,YAAa,KAuZrB,SAAe59C,QAAW+6C,G,sVCle1B,MAAMoE,GAAsBC,OAAwBC,qBAiGpD,GAAe3lD,cA/Ff,SAAyBjL,EAAoBusB,GACzC,MAAM,KAAC9Y,GAAQ8Y,EAETgG,GAAUC,QAAWxyB,GACrBoC,GAASmd,QAAUvf,GACnBjB,GAASuV,QAAiBtU,GAC1BkJ,GAAU2M,QAAW7V,EAAOyT,EAAKE,YACjCyQ,GAAcC,QAAerkB,IAAU,GACvC4sD,EAAiB,GAAH,QAAM15C,UAAN,YAAsBkR,EAAYld,MAEhD2pD,GAAgB9B,QAAgBt7C,GAChCq9C,GAAmBtiC,QAA0BxuB,GAE7C+wD,EAASt9C,EAAKG,SAAWH,EAAK7U,GACpC,IAAIuuD,EAAW4D,EACX3D,GAAoB,EACpB0C,EAAmB,EAEvB,GACIgB,GACAC,IAAWF,KAINtkC,EAAS6E,UACV7E,EAAS6E,WAAa67B,eACtB1gC,EAAS6E,WAAa67B,kBACtB1gC,EAAS6E,WAAa67B,aAE5B,CACE,MAAMtxC,GAAOmM,QAAQ9nB,EAAO+wD,GAC5B,GAAIp1C,EAAM,CACN,MAAMif,GAASo2B,QAAqBhxD,EAAO2b,GAC3Cm0C,EAAmBl1B,EAAOJ,YAC1B4yB,EAAoBxyB,EAAOe,aAC3BwxB,EAAWvyB,EAAOh8B,IAI1B,MAAMqyD,GAAO92C,OAAYna,GAEnBmvD,GADe8B,GAASJ,IAAkBK,QAA2Bz9C,EAAK7U,SAChBkP,EAA7B4iD,EAAoB1wD,GAEvD,O,+VAAA,EACIgwD,mBAAmB1rC,QAAkBpb,GACrC0Z,WAAY5iB,EAAM2iB,QAAQC,WAC1B+rC,kBAAmBvsD,EAAO+uD,kBAC1BzC,WAAmC,SAAvBn8B,EAAQI,WACpB7wB,QAAQ8T,QAAiB5V,GACzBkvD,gBAAiBlvD,EAAM2iB,QAAQC,WAAWwuC,iBAC1C7E,QAASyC,KAAsBhvD,EAAOyT,EAAM8e,EAASnwB,EAAQ8G,EAASnK,GACtEyvD,UAAWQ,KAAwBhvD,EAAOyT,EAAMvK,GAChD0jD,iBACAlzC,cAAe0K,EAAYxlB,GAC3BG,SACAouD,WACAC,oBACA5+B,0BAA2BsiC,EAC3BhB,mBACAX,cACAh1C,YAAa82C,GACV1kC,MAiBX,SAA4BruB,GACxB,MAAO,CACHkL,SAAS+B,wBAAiE,CACtEuhD,SADsE,KAEtED,WAFsE,KAGtES,eAHsE,KAItEJ,QAJsE,KAKtED,UALsE,KAMtEn6C,UANsE,IAOtEq6C,iBAPsE,KAQtEh7C,UARsE,KAStEwB,iCATsE,KAUtE85C,gBAAeA,MAChBnvD,MAIX,CAA4DmzD,I,k7BCxI5D,MAAMC,EAAa,CACfxa,MAAQ/wC,GAAD,OACAA,GADA,IAEH8kC,MAAO,gCAEX0mB,QAAUxrD,GAAD,OACFA,GADE,IAELyrD,OAAQ,OACRC,UAAW,OACXC,QAAS,QACTC,OAAQ,YAEZC,mBAAqB7rD,GAAD,OACbA,GADa,IAEhBgiC,QAAS,UAIX8pB,EAAuBlrD,GAErB,uBAAKmB,UAAU,sCACX,gBAAC,yBAAmCnB,EAChC,qBAAGmB,UAAU,6BAMvBgqD,EAAWnrD,GAET,uBAAKmB,UAAU,mCACX,gBAAC,aAAuBnB,IAK9BorD,EAAUprD,GAER,uBACImB,UAAWs4B,IAAW,wBAAyB,CAC3Cx3B,SAAUjC,EAAMu8B,WAChBgU,QAASvwC,EAAMqrD,aAGnB,gBAAC,YAAsBrrD,IAkB7BsrD,EAAsCtrD,IACxC,MAAM,MAACkB,EAAD,YAAQF,EAAR,UAAqBG,EAArB,MAAgCoqD,EAAhC,KAAuChrD,EAAvC,WAA6CirD,EAA7C,OAAyDC,EAAzD,SAAiErrD,EAAjE,OAA2ER,EAA3E,QAAmFpC,EAAnF,MAA4F3F,GAAwBmI,EAAdyyC,E,kXAA5G,CAA0HzyC,EAA1H,IAEOuwC,EAASmb,IAAc3d,eAAS,GAsBjC4d,EAAa5qB,QAAQwP,GAAWrvC,GAEtC,OACI,uBAAKC,UAAU,iCACX,4BACIA,UAAWs4B,IAAW,iBAAkBt4B,EAAW,CAC/CyqD,uBAAwB/zD,EACxBg0D,wBAAyBF,KAG7B,0BAAQxqD,UAAWs4B,IAAW,eAAgB,CAACqyB,qBAAsBH,KAChEA,EAAcF,GAAUzqD,EAAe,MAE5C,uBACIG,UAAU,gBACV8vC,QAnCMvoB,IAClB,MAAM,QAACuoB,GAAWjxC,EAElB0rD,GAAW,GAEPza,GACAA,EAAQvoB,IA8BAwoB,OA1BKxoB,IACjB,MAAM,OAACwoB,GAAUlxC,EAEjB0rD,GAAW,GAEPxa,GACAA,EAAOxoB,KAsBE8iC,GAAc,4BAAOA,GACtB,gBAAC,KAAD,eACIvzD,GAAE,wBAAmBsI,GACrB/C,QAASA,EACTwD,YAAauvC,EAAU,GAAKvvC,EAC5Bib,WAAY,CACRivC,sBACAE,SACAD,WAEJhqD,UAAWs4B,IAAW,QAASt4B,EAAW,CAAC4qD,aAAcJ,IACzDlsD,gBAAiB,WACjByB,MAAOA,EACPd,SAAUA,EACVR,OAAM,OAAM+qD,GAAe/qD,IACvB6yC,KAGX8Y,GA1EI1zD,IACZA,EAKD,uBAAKsJ,UAAU,iBACX,qBAAGA,UAAU,4BACb,4BAAOtJ,IANJ,KA0EFm0D,CAAYn0D,K,aAlIrB4zD,O,WACA5zD,M,WACAuI,S,qBAqIJ,W,yyBCxIA,MAAM6rD,EAAc,EAAEtS,YAAWX,aAAYtC,OAAMhsC,cAC/C,IAAKivC,EACD,OAAO,KAGX,MACMuS,GADWtsB,kBAAavmC,IAAuB8yD,QAAY9yD,KACnC+yD,IAAIzS,GAClC,IAAKuS,EACD,OAAO,KAEX,MAAMG,GAAgBC,QAAiBJ,GAEvC,OACI,wBACIxhD,QAASA,EACTvJ,UAAU,WACVsI,IAAG,WAAMkwC,EAAN,KACH4S,gBAAe5S,EACf5wC,MAAK,GACDyjD,gBAAiB,OAAF,OAASH,EAAT,KACfI,eAAgB/V,EAChB/sC,OAAQ+sC,EACRhtC,MAAOgtC,EACPtE,UAAWsE,EACXgW,SAAUhW,EACViW,UAAWjW,EACXkW,SAAUlW,EACVtD,SAAU,UACP4F,M,aAlCfW,U,sBACAjD,K,WAEAhsC,Q,UAqCJuhD,EAAYjS,aAAe,CACvB/sB,MAAO,GACP+rB,WAAY,GACZtC,KAAM,IAGV,QAAe52C,OAAWmsD,I,kQCpD1B,IAAIY,EAAyB,KACzBC,EAA8B,KAE9BC,EAAgB,KACL,SAASC,EAAU3vD,EAAa4vD,GAC3C,OAAIF,GAAYF,IAAcxvD,GAAOyvD,IAAiBG,EAC3CF,EAGN1vD,GAAQ4vD,GAKbJ,EAAYxvD,EACZyvD,EAAeG,EACfF,EAAW,IAAIG,IAAJ,CAAW,CAACC,UAAW9vD,EAAK4T,cAAeg8C,IAC/CF,IAPHA,EAAW,IAAIG,IAAJ,CAAW,CAACC,UAZZ,WAYmCl8C,cAXhC,qEAYP87C,G,urBCkBR,SAASK,EAAiBC,GAC7B,MAAO,CACHrxD,KAAMsxD,wBACND,cAkBD,SAASE,EAAcF,GAC1B,MAAO,CACHrxD,KAAMsxD,oBACND,cAgBD,SAASG,EAAiBH,GAC7B,MAAO,CACHrxD,KAAMsxD,wBACND,cAID,SAASI,EAAe11D,EAAUs1D,GACrC,MAAO,CACHrxD,KAAMsxD,oBACND,aACAt1D,OA4DD,SAAS21D,GAAa,WAACL,EAAD,MAAa13B,EAAQ,GAArB,WAAyBg4B,EAAa,IAC/D,IAAIxR,EAAQwR,EACZ,MAAO,CAACp2D,EAAwBE,KAC5B,MAAM,aAACm2D,EAAD,gBAAeC,GAAmBp2D,IAAWqpB,SAAS4oB,QAAQjuC,QAC9D,cAACqyD,GAAiBr2D,IAAWqpB,SAASitC,KAAK/wB,OAC7C8wB,EAAcT,KACdlR,EAAQ2R,EAAcT,GAAYlR,MAAQxmB,GAE9Cp+B,EAASg2D,EAAcF,IACvB,MAAMW,EAAMhB,EAAUY,EAAeC,GAErC,OADAG,EAAIC,eACGD,EAAIhxB,OAAO,CAACkxB,YAAab,EAAY13B,QAAOwmB,UAAQn0C,MAAMmmD,IAC7D,GAAIA,EAAKvnD,aAEDknD,EAAcT,GAAY7lD,MAC1BjQ,EAASi2D,EAAiBH,IAE1B91D,EAASk2D,EAAeU,EAAMd,QAE/B,CACH91D,EAAS61D,EAAiBC,IAC1B91D,EAAS62D,EAAiBD,EAAKE,UAC/B92D,EAzGT,UAAuB,WAAC81D,EAAD,MAAa13B,EAAb,MAAoBwmB,EAApB,KAA2BgS,IACrD,YACInyD,KAAMsxD,oBACND,cACGc,GAHP,IAIIx4B,QACAwmB,QACAmS,YAAanS,EAAQxmB,EACrB44B,WAAYtgD,KAAKD,QAiGAwgD,CAAc,CAACnB,aAAY13B,QAAOwmB,QAAOgS,UAElD,MAAM3iD,EAAU/T,IAAWqpB,SAASitC,KAAKU,WAAWC,SAASrB,GACzD,WACA,SACJr0D,gBACI,SACA,QACA,CAACwS,UAASmqB,MAAOw4B,EAAKE,QAAQ1oD,OAAQgpD,QAAStB,QAGxDtzC,OACEhiB,GAAaR,EAASk2D,EAAe11D,EAAKs1D,OAKhD,SAASuB,GAAe,QAACC,EAAU,GAAX,SAAeC,EAAW,GAA1B,UAA8BC,IACzD,IAAI/D,EAAS+D,EACb,OAAOr3D,MAAOH,EAAwBE,KAClC,MAAM,aAACm2D,EAAD,gBAAeC,GAAmBp2D,IAAWqpB,SAAS4oB,QAAQjuC,QAC9D,cAACqyD,GAAiBr2D,IAAWqpB,SAASitC,KAAK/wB,OAKjD,OAJI8wB,EAAce,KACd7D,EAAS8C,EAAce,GAAS7D,QAEpCzzD,EAASg2D,EAAcsB,IAChB7B,EAAUY,EAAeC,GAAkBmB,sBAAsB,CAACH,UAASC,WAAU9D,WAAShjD,MAChGmmD,IACOA,EAAKvnD,aACDknD,EAAce,GAASR,QACvB92D,EAASi2D,EAAiBqB,IAE1Bt3D,EAASk2D,EAAeU,EAAMU,KAGlCt3D,EAAS61D,EAAiByB,IAC1Bt3D,EAAS62D,EAAiBD,EAAKE,UAC/B92D,EAnHb,UAA+B,QAACs3D,EAAD,KAAUV,IAC5C,YACInyD,KAAMsxD,6BACND,WAAYwB,GACTV,GAHP,IAIIc,UAAWhhD,KAAKD,QA8GKkhD,CAAsB,CAACL,UAASV,UAEzCn1D,gBACI,SACA,QACA,CAACwS,QAAS,WAAYmqB,MAAOw4B,EAAKE,QAAQ1oD,OAAQgpD,QAASE,IAI/C,aAAZA,GACAt3D,EAAS43D,SAIvBp1C,OAAOhiB,GAAaR,EAASk2D,EAAe11D,EAAK82D,OA4BpD,SAASO,EAAsB/B,GAClC,MAAO,CAAC91D,EAAwBE,KAC5BF,EAAS61D,EAAiBC,IAW3B,SAA6Bh0D,EAAoBg0D,GACpD,MAAMS,EAAgBz0D,EAAMynB,SAASitC,KAAK/wB,OAAO8wB,cAAcT,GAC/D,OAAKS,IAEMA,EAAcuB,YACd,GAfHC,CAAoB73D,IAAY41D,GACC,aAA7BA,EAAW76C,cACJjb,EAASq3D,EAAe,CAACC,QAASxB,KAEtC91D,EAASm2D,EAAa,CAACL,gBAE3Bl9C,QAAQ6Q,WA0ChB,SAASuuC,EAAyBC,GACrC,OAAQj4D,IACJA,EAxKD,SAA8Bi4D,GACjC,MAAO,CACHxzD,KAAMsxD,iCACNkC,kBAqKSC,CAAqBD,KAU/B,SAASE,EAAiBrC,GAC7B,OAAQ91D,IACJA,EAAS61D,EAAiBC,KAI3B,SAASsC,EAAkBC,GAC9B,OAAQr4D,IACJA,EApRD,SAA2Bq4D,GAC9B,MAAO,CACH5zD,KAAMsxD,0BACNsC,iBAiRSC,CAAkBD,KA0B5B,SAASE,GAAsB,MAACn6B,EAAQ,IAAM,IACjD,MAAO,CAACp+B,EAAwBE,KAC5B,MAAM,aAACm2D,EAAD,gBAAeC,GAAmBp2D,IAAWqpB,SAAS4oB,QAAQjuC,OAC9DpC,EAAQ5B,IAAWqpB,SAASitC,KAAKU,WACvC,IAsCD,SAAqCp1D,GACxC,MAAM,QAAC02D,EAAD,WAAUV,EAAV,SAAsBW,GAAY32D,EACxC,OAAK22D,IAAaA,EAASrqD,SAEhB0pD,KAEAU,EA5CFE,CAA4B52D,GAC7B,OAAO8W,QAAQ6Q,UAEnBzpB,EA1BG,CACHyE,KAAMsxD,+BA0BN,MAAM,OAACtC,GAAU3xD,EACXmE,EAAU,EAAH,KACLm4B,GAAS,CAACA,UACVq1B,GAAU,CAACA,WAEnB,OAAOgC,EAAUY,EAAeC,GAAkBqC,cAAc1yD,GAASwK,MAAMmmD,IAC3E,MAAMgC,EAAahC,EAAKiC,KAAK1b,QAAO,CAAC2Z,EAAgBgC,IAC7CA,EAAIhC,QAAQ,IAAMgC,EAAIhC,QAAQ,GAAG3kD,MAC1B,IAAI2kD,KAAYgC,EAAIhC,SAExBA,GACR,IACH92D,EAAS62D,EAAiB+B,IAC1B54D,EAnCL,SAAgC42D,GACnC,UACInyD,KAAMsxD,+BACHa,GAgCUmC,CAAuBnC,OACjCp0C,OACEhiB,IACGR,EA/BT,SAA+BQ,GAClC,MAAO,CACHiE,KAAMsxD,6BACNv1D,OA4BiBw4D,CAAsBx4D,QAMxC,SAASo3D,GAA8B,MAC1Cx5B,GACA,CAACA,WAAOxuB,IACR,MAAO,CAAC5P,EAAwBE,KAC5B,MAAM4B,EAAQ5B,IAAWqpB,SAASitC,KAAKU,WACvC,OAAIp1D,EAAM22D,UAAY32D,EAAM22D,SAASrqD,OAC1BwK,QAAQ6Q,UAEZzpB,EAASu4D,EAAsB,CAACn6B,YAkCxC,SAASy4B,EAAiBL,GAC7B,OAAOr2D,UACHH,EAjBG,CACHyE,KAAMsxD,mBACNkD,QAAS,CACLC,UAAU,KAedl5D,EAVD,SAAmBw2D,GACtB,MAAO,CACH/xD,KAAMsxD,gBACNS,QAOS2C,CAAU3C,IACZ,CAACj2D,MAAM,I,0BChatB,QAOkB,EAPlB,EAQmB,E,kBCNJ,MAAM64D,UAAsB7wD,gBACvC8B,SACI,OACI,uBAAUzB,KAAKH,MACX,uBACI0J,MAAM,OACNC,OAAO,OACPyjC,QAAQ,gBACRwjB,QAAQ,OAER,qBACI34D,GAAG,YACH44D,UAAU,2EAEV,wBACIrjB,EAAE,wiCACFzkC,MAAO,CAACskC,KAAM,iBChB3B,MAAMyjB,UAA2BhxD,gBAC5C8B,SACI,OACI,uBAAUzB,KAAKH,MACX,uBACI0J,MAAM,OACNC,OAAO,OACPyjC,QAAQ,gBACR6K,iBAAiB,gBACjB2Y,QAAQ,OAER,qBAAGC,UAAU,8BACT,wBACIxjB,KAAK,UACLG,EAAE,8e,+sBCQ9B,MAAMujB,EAAsB,CACxBpB,kBADwB,EAExBJ,yBAFwB,EAGxBG,iBAAgBA,GAGdsB,GAAWC,SAAoBC,IAC1B,CACHzd,WAAY,CACRxP,gBAAiBitB,EAAMC,iBAE3B5nD,KAAM,CACF8jC,MAAM+jB,QAAcF,EAAMG,mBAAoB,KAElDC,gBAAiB,CACbrtB,gBAAiBitB,EAAMC,iBAE3BhhB,MAAO,CACHuD,aAAa0d,QAAcF,EAAMG,mBAAoB,UAK1D,MAAME,UAAkBC,YAgB3BzxD,YAAYC,GACRC,MAAMD,GADS,0BA8BAqtD,GACRA,EAAW56C,OAAOub,MAAM,MAAMg3B,KAAK,OA/B3B,4BAkCEqI,GACVA,EAAW56C,OAAOub,MAAM,MAAMg3B,KAAK,OAnC3B,iCAsCOqI,IACtBltD,KAAKsxD,YAAYvwD,MAAQmsD,EACzBltD,KAAKH,MAAM2vD,kBAAkBtC,GAC7BltD,KAAKH,MAAM0xD,uBAAuBrE,MAzCnB,uBA4CH3kC,IACZA,EAAMviB,iBACNhG,KAAKwxD,cAAcxxD,KAAKsxD,YAAYvwD,OACpCf,KAAKsxD,YAAYnhB,UA/CF,wBAkDF+c,IACb,MAAM,SAACuE,GAAYzxD,KAAKH,MACxBG,KAAKH,MAAM0vD,iBAAiBvvD,KAAK0xD,gBAAgBxE,IACjDuE,IACAzxD,KAAKH,MAAMuvD,yBAAyB,MAtDrB,uBAyDH7mC,IACZsN,aAAa71B,KAAK2xD,eAElB,MAAMzE,EAAa3kC,EAAM2R,OAAOn5B,OAE1B,aAAC6wD,EAAD,OAAeh9C,GAAU5U,KAAKH,MACpCG,KAAKH,MAAM2vD,kBAAkBtC,GAC7BltD,KAAKH,MAAM0xD,uBAAuBrE,GAEf,KAAfA,EACA0E,IACkB,cAAXh9C,GAA2B5U,KAAK6xD,eAAe3E,KAEtDltD,KAAK2xD,cAAgB7wC,YAAW,KAC5B9gB,KAAKwxD,cAActE,KACpB,SAxEQ,qBA4EN,KACTltD,KAAK8F,SAAS,CAACgsD,cAAc,OA7Ed,oBAgFP,KACR9xD,KAAK8F,SAAS,CAACgsD,cAAc,OAjFd,yBAuFD5E,IACd,IAAIx4C,EAAO1U,KAAK+xD,kBAAkB7E,GAElC,MAAM,SAAC2C,GAAY7vD,KAAKH,MAClB0U,EAASG,EAAKrC,cACd2/C,EAAenC,GAAYA,EAASrqD,OAASqqD,EAASvoD,QAAQ4oD,GAC3Dx7C,IAAyC,IAAjCw7C,EAAIxB,QAAQx8C,QAAQqC,GAG1B,GAFI27C,IAGV,GAEL,OAAOtvB,QAAQoxB,EAAaxsD,WAnGb,4BAsGC,KAChB,MAAM,OAACoP,EAAD,WAASq9C,EAAT,aAAqBL,GAAgB5xD,KAAKH,MAChDG,KAAKkyD,uBAAuB,IACb,cAAXt9C,EACAg9C,IAEAK,OAzGJjyD,KAAK9G,MAAQ,CACT44D,cAAc,GAGlB9xD,KAAK2xD,cAAgB,KAErB,MAAMQ,EAAoBnyD,KAAKH,MAAMsyD,mBAAqB,GAE1DnyD,KAAKH,MAAM2vD,kBAAkB2C,GAC7BnyD,KAAKH,MAAM0vD,iBAAiB4C,GAGhCl1B,mBAAmBC,GACf,MAAM,cAACuyB,GAAiBzvD,KAAKH,MAEzB4vD,IAAkBvyB,EAAUuyB,gBACN,aAAlBA,EACAzvD,KAAKkyD,uBAAuB,IAE5BlyD,KAAKkyD,uBAAuBzC,IA0FxC2C,sBAAsB1xD,EAAW2xD,GAC7B,OAAU3xD,EAAU+uD,eAAiBzvD,KAAKH,MAAM4vD,eAC3C/uD,EAAU+uD,gBAAkBzvD,KAAKH,MAAM4vD,eACvC4C,EAAUP,eAAiB9xD,KAAK9G,MAAM44D,cACtCpxD,EAAU+uD,gBAAkBzvD,KAAKH,MAAM4vD,cAGhDhuD,SACI,MAAMmH,EAAQioD,EAAS7wD,KAAKH,MAAMkxD,QAC5B,cAACtB,GAAiBzvD,KAAKH,MACvByyD,EAAoB7C,EAElB,gBAACkB,EAAD,CACI3vD,UAAU,kBACV4H,MAAOA,EAAMQ,KACbmB,QAASvK,KAAKuyD,oBAElB,KAER,OACI,wBACIvxD,UAAU,gBACV3C,OAAO,MACP67B,OAAO,OACPs4B,WAAW,GACXhqD,SAAUxI,KAAKyI,cAEf,uBACIzH,UAAU,aACV4H,MAAOA,EAAM0qC,YAEb,uBACItyC,UAAU,kBACV4H,MAAOA,EAAMuoD,kBAEjB,gBAAC,IAAD,CACInwD,UAAU,eACVZ,KAAK,aACLuD,WAAW,EACX9C,YAAa,CAAC/I,IAAIkc,OAAE,qBAAsBnO,eAAgB,iBAC1D5F,SAAUD,KAAK6yC,aACfnqC,aAAa,MACb+pD,eAAe,MACf3hB,QAAS9wC,KAAK0yD,WACd3hB,OAAQ/wC,KAAK2yD,UACbn2B,IAAMwT,IACFhwC,KAAKsxD,YAActhB,EACZA,GAEXpnC,MAAOA,EAAMonC,MACbjvC,MAAO0uD,IAEX,gBAACe,EAAD,CACIxvD,UAAU,eACV4H,MAAOA,EAAMQ,OAEhBkpD,GAEL,0BACIz2D,KAAK,SACLmF,UAAU,oB,EA5LjBowD,E,YACU,CACf3B,cAAene,WACfue,SAAUve,UACVyf,MAAOzf,sBACP2gB,WAAY3gB,SACZmgB,SAAUngB,SACVsgB,aAActgB,SACd18B,OAAQ08B,WACR8d,yBAA0B9d,SAC1Bke,kBAAmBle,SACnBie,iBAAkBje,SAClB6gB,kBAAmB7gB,WACnBigB,uBAAwBjgB,sBAsLhC,SAAentC,cAnOf,SAAyBjL,GACrB,gBACOA,EAAMynB,SAASitC,KAAKU,YACpBp1D,EAAMynB,SAASitC,KAAK/wB,QAF3B,IAGIk0B,OAAO6B,QAAS15D,GAChB25D,SAAU35D,EAAMynB,SAASitC,KAAKkF,QA8NElC,EAAxC,CAA4DQ,GChP7C,MAAM2B,UAAwBpzD,gBACzC8B,SACI,OACI,uBAAUzB,KAAKH,MACX,uBACImB,UAAU,yBACVuI,MAAM,OACNC,OAAO,OACPyjC,QAAQ,YACRwjB,QAAQ,OAER,qBACI34D,GAAG,mBACHk7D,OAAO,OACP9lB,KAAK,WAEL,qBACIp1C,GAAG,qBACH44D,UAAU,uCACVxjB,KAAK,WAEL,qBACIp1C,GAAG,iBACH44D,UAAU,sCAEV,qBACI54D,GAAG,gBACH44D,UAAU,kCAEV,qBAAG54D,GAAG,6BACF,wBACIu1C,EAAE,wnGACFv1C,GAAG,4BChChC,MAAMm7D,UAAyBtzD,gBAC1C8B,SACI,OACI,uBAAUzB,KAAKH,MACX,uBACImB,UAAU,0BACVuI,MAAM,OACNC,OAAO,OACPyjC,QAAQ,YACRwjB,QAAQ,OAER,qBACI34D,GAAG,mBACHk7D,OAAO,OACP9lB,KAAK,WAEL,qBACIp1C,GAAG,qBACH44D,UAAU,uCACVxjB,KAAK,WAEL,qBACIp1C,GAAG,iBACH44D,UAAU,sCAEV,qBACI54D,GAAG,gBACH44D,UAAU,kCAEV,qBACI54D,GAAG,8BACH44D,UAAU,mCAEV,wBACIrjB,EAAE,0SACFv1C,GAAG,8BCjB/C,MAAM84D,GAAsB,CACxBpB,kBADwB,EAExBD,iBAAgBA,GAGdsB,IAAWC,SAAoBC,IAC1B,CACHzd,WAAY,CACRxP,gBAAiBitB,EAAMC,iBAE3BhpD,OAAQ,CACJkrD,mBAAmBjC,QAAcF,EAAMG,mBAAoB,KAE/D9nD,KAAM,CACF8jC,MAAM+jB,QAAcF,EAAMG,mBAAoB,KAElDiC,WAAY,CACRjmB,KAAM6jB,EAAMG,oBAEhBkC,UAAW,CACPlmB,MAAM+jB,QAAcF,EAAMG,mBAAoB,SAKnD,MAAMmC,WAAeC,gBAWxB1zD,YAAYC,GACRC,MAAMD,GACNG,KAAK9G,MAAQ,CACTq6D,SAAU,IAIlB9xD,SACI,MAAMmH,EAAQioD,GAAS7wD,KAAKH,MAAMkxD,OAElC,OACI,0BACI/vD,UAAU,mBACV4H,MAAOA,EAAM0qC,YAEb,gBAAC,EAActzC,KAAKH,OACpB,uBACImB,UAAU,UACV4H,MAAOA,EAAMZ,QAEZhI,KAAKwzD,WAAWxzD,KAAKH,MAAO+I,KAM7C4qD,WAAW3zD,EAAO+I,GACd,MAAM,SAACiqD,EAAD,WAAWZ,EAAX,aAAuBL,GAAgB/xD,GACvC,OAACmI,GAAU6qD,EACjB,OAAO7qD,EAAOyrD,KAAK5pD,KAAI,CAAC6pD,EAAK5pD,KACzB,IAAIw4B,EAMJ,OALIoxB,IAAQC,EACRrxB,EAAOtiC,KAAK4zD,UAAU,WAAY3B,EAAYc,EAAiBjpD,EAAOlB,GAC/D8qD,IAAQC,IACfrxB,EAAOtiC,KAAK4zD,UAAU,YAAahC,EAAcqB,EAAkBnpD,EAAOlB,IAEvE05B,KAIfsxB,UAAUxzD,EAAM/D,EAAUw3D,EAAM/pD,EAAOlB,GACnC,IAAI/I,EAAQG,KAAKH,MACjB,MAAM,OAAC+U,GAAU/U,EAMjB,OACI,qBACI0K,QAPR,WACI1K,EAAM0vD,iBAAiB,IACvB1vD,EAAM2vD,kBAAkB,IACxBnzD,KAKIy3D,YAAa,KACT9zD,KAAK8F,SAAS,CAACytD,SAAUnzD,KAE7B2zD,WAAY,KACR/zD,KAAK8F,SAAS,CAACytD,SAAU,MAE7B3qD,MAAO,CAACiiD,OAAQ,WAChB3tD,IAAK4M,GAEL,uBAAKlB,MAAO,CAACorD,WAAY,QACrB,gBAACH,EAAD,CACIjrD,MAAO,KACC5I,KAAK9G,MAAMq6D,WAAanzD,EACjBwI,EAAMwqD,UAEVx+C,IAAWxU,EAAOwI,EAAMuqD,WAAavqD,EAAMQ,KAJ/C,Q,gBAzElBiqD,G,kBACU,CACfz+C,OAAQ08B,WACRuhB,SAAUvhB,WACVke,kBAAmBle,SACnBie,iBAAkBje,SAClByf,MAAOzf,sBACP6gB,kBAAmB7gB,WACnBigB,uBAAwBjgB,qB,qGA8EhC,UAAentC,cArHf,SAAyBjL,GACrB,MAAO,CACH63D,OAAO6B,QAAS15D,MAmHgB03D,GAAxC,CAA4DyC,IC3HtDzC,GAAsB,CACxBqD,aRKG,SAAsBpB,GACzB,MAAO,CAACz7D,EAAwBE,KAC5B,MAAM,aAACm2D,EAAD,gBAAeC,GAAmBp2D,IAAWqpB,SAAS4oB,QAAQjuC,OATrE,IAA6BuE,EAU5BgtD,EAAUY,EAAeC,GAAkBI,eAC3C12D,GAX4ByI,EAWCgzD,EAV1B,CACHh3D,KAAMsxD,oBACNttD,cQED,MAAMq0D,WAAYZ,gBAcrB1zD,YAAYC,GACRC,MAAMD,GACN,MAAM,SAACgzD,GAAY7yD,KAAKH,MACxBG,KAAKH,MAAMo0D,aAAapB,GAG5BpxD,SACI,MAAM,SACFoxD,EADE,OAEFj+C,EAFE,aAGFg9C,EAHE,SAIFH,EAJE,WAKFQ,EALE,SAMF1yB,EANE,kBAOF4yB,EAPE,uBAQFZ,GACAvxD,KAAKH,MACHs0D,EAAe,mBAAqBtB,EAASsB,cAAgB,IACnE,OACI,uBAAKnzD,UAAWmzD,GACZ,gBAAC,GAAD,CACItB,SAAUA,EACVj+C,OAAQA,EACRg9C,aAAcA,EACdH,SAAUA,EACVQ,WAAYA,EACZE,kBAAmBA,EACnBZ,uBAAwBA,IAE5B,uBAAKvwD,UAAU,uBACVu+B,M,8GA5CR20B,G,YACU,CACfrB,SAAUvhB,WACV18B,OAAQ08B,WACRsgB,aAActgB,SACdmgB,SAAUngB,SACV2gB,WAAY3gB,SACZ/R,SAAU+R,WACV2iB,aAAc3iB,SACd8iB,gBAAiB9iB,SACjB6gB,kBAAmB7gB,WACnBigB,uBAAwBjgB,sBAwChC,UAAentC,aAAQ,KAAMysD,GAA7B,CAAiDsD,I,quBCvCjD,MAAMtD,GAAsB,CACxBpB,kBADwB,EAExBJ,yBAFwB,EAGxBG,iBAHwB,EAIxBI,sBAJwB,EAKxBX,8BAA6BA,GAG1B,MAAMqF,WAAmBf,gBAAc,yDAuBxB,KACd,MAAM,SAACzD,GAAY7vD,KAAKH,MAClBquD,EAAU2B,EAAShmD,KAAKqmD,IACnB,CAACoE,MAAOpE,EAAIoE,UAGnBpG,EAAQ1oD,SACR7H,SAAW,SAAU,QAAS,CAAC0N,QAAS,gBAAiBmqB,MAAO04B,EAAQ1oD,YA9BtC,0BAsCzB,KACb,MAAM,cAACiqD,EAAD,SAAgBI,GAAY7vD,KAAKH,MAEjC0U,EAASk7C,EAAcp9C,cAAcC,OAAOub,MAAM,MAAMg3B,KAAK,KACnE,OAAOgL,GAAYA,EAASrqD,OAASqqD,EAASvoD,QAAQ4oD,GAC7CT,IAAkD,IAAjCS,EAAIxB,QAAQx8C,QAAQqC,GAGnC,GAFI27C,IAGV,MA/CiC,oBAkD/B,KACPlwD,KAAKH,MAAM8vD,2BAlCf7yB,oBACIzwB,OAAOkoD,SAAS,EAAG,GACnBv0D,KAAKH,MAAMmvD,gCACXhvD,KAAKw0D,kBAcT/wB,uBACIzjC,KAAKH,MAAMuvD,yBAAyB,GAmBxC3tD,SACI,MAAM,QAACmuD,EAAD,SAAUC,EAAV,KAAoBjC,EAApB,SAA0B6D,EAA1B,WAAoCQ,EAApC,cAAgDwC,GAAiBz0D,KAAKH,MAEtEi3C,EAAU+Y,GAAYA,EAASrqD,OAASxF,KAAK00D,eAAe7E,GAAUhmD,KAAI,CAAC0xC,EAAMzxC,KACnF,MAAM,QAAC4kD,EAAD,MAAU4F,GAAS/Y,EAEzB,IAAKqS,EAAK0G,GACN,OAAO,KAGX,MAAMK,EAAU/G,EAAK0G,IACf,UAACM,EAAD,SAAYC,GAAYF,EACxBrxC,EAAM4kC,MAAsB0M,EAA6B,SAAlBH,GACvCvH,EAAawB,EAAQ1f,QAAQ,MAAO,KACpCqd,EAAkB,CAACA,gBAAiB,OAAF,OAAS/oC,IAC3CwgB,EAAkB,CAACA,gBAAiB+wB,GACpCh1D,EAAQG,KAAKH,MAUnB,OACI,qBACI0K,QAXR,WACI1K,EAAM0vD,iBAAiBb,GACvB7uD,EAAM2vD,kBAAkBd,GACL,aAAfxB,EACA+E,IAEAR,KAMAv0D,IAAK4M,GAEL,uBAAK9I,UAAU,sBACX,uBACIA,UAAU,WACV4H,MAAK,SAAMyjD,GAAoBvoB,IAE/B,uBAAK9iC,UAAU,iBAAiB0tD,SAK/C,GAEL,OAAO5X,GAAWA,EAAQtxC,OACtB,uBACIxE,UAAU,wBAEV,gBAAC8zD,GAAA,EAAD,CACIlF,QAASA,EACTmF,SAAU/0D,KAAK+0D,SACfC,UAAW,GAEVle,IAIT,uBACI91C,UAAU,0B,GA/GbqzD,G,YACU,CACfxB,SAAUvhB,WACVsc,KAAMtc,WACNse,QAASte,SACTmgB,SAAUngB,SACV2gB,WAAY3gB,SACZqe,sBAAuBre,SACvB0d,8BAA+B1d,SAC/Bke,kBAAmBle,SACnB8d,yBAA0B9d,SAC1Bie,iBAAkBje,SAClBme,cAAene,WACfue,SAAUve,UACVmjB,cAAenjB,aAuGvB,UAAentC,cAxIf,SAAyBjL,GACrB,mBACOA,EAAMynB,SAASitC,KAAKU,YACpBp1D,EAAMynB,SAASitC,KAAKqH,OAF3B,IAGIpC,SAAU35D,EAAMynB,SAASitC,KAAKkF,IAC9B5F,WAAYh0D,EAAMynB,SAASitC,KAAK/wB,OAAOqwB,WACvCuC,cAAev2D,EAAMynB,SAASitC,KAAK/wB,OAAO4yB,cAC1CgF,cAAev7D,EAAMynB,SAAS4oB,QAAQjuC,OAAO45D,kBAiIbtE,GAAxC,CAA4DyD,I,ytBCvIrD,MAAMc,WAAmB7B,gBAU5B7xD,SACI,MAAM,QACFkzD,EADE,IAEF/N,EAFE,KAGF1E,EAHE,UAIFkT,EAJE,iBAKFC,GACAr1D,KAAKH,OAEH,MAAC0J,EAAD,OAAQC,EAAR,UAAgBorD,EAAhB,SAA2BC,GAAYF,GACvC,cAACF,GAAiBz0D,KAAKH,MACvByjB,EAAM4kC,MAAsB0M,EAA6B,SAAlBH,GAEvCpI,EAAkB,CAACA,gBAAiB,OAAF,OAAS/oC,EAAT,MAClCwgB,EAAkB,CAACA,gBAAiB+wB,GACpCS,EAAgB,CAACA,cAAiBF,EAAY7rD,EAASC,EAAU,MAEvE,OACI,uBACIxI,UAAU,sBACV4H,MAAO,CAACg+C,MAAK1E,OAAM34C,MAAO6rD,EAAY,GAAH,OAAMA,EAAN,MAAsB,KAEzD,uBACIp0D,UAAU,cACV4H,MAAK,YAAMyjD,GAAoBvoB,GAAoBwxB,GACnD/qD,QAAS,IAAM8qD,EAAiBV,O,GAnCvCQ,G,YACU,CACfR,QAASrjB,WACTsV,IAAKtV,WACL4Q,KAAM5Q,WACN8jB,UAAW9jB,WACX+jB,iBAAkB/jB,SAClBmjB,cAAenjB,aAmCvB,UAAentC,cAhDf,SAAyBjL,GACrB,MAAO,CACHu7D,cAAev7D,EAAMynB,SAAS4oB,QAAQjuC,OAAO45D,iBA8CrD,CAAwCC,I,6rBC3BxC,MAAMvE,GAAsB,CACxBxB,yBAAwBA,GAGrB,MAAMmG,WAAmBjC,gBAc5B1zD,YAAYC,GACRC,MAAMD,GADS,8BA8CE,KACbwM,OAAOmpD,WAAW,2BAA2BC,QAC7Cz1D,KAAK01D,gBA9EkB,KA8BZ,4BAsDCf,IAChB,MAAM,QAACnG,EAAD,gBAAUmH,GAAmB31D,KAAKH,MACxCG,KAAKH,MAAMuvD,yBAAyBpvD,KAAKqvD,iBAEzC1xD,SAAW,SAAU,SAAU,CAACi4D,MAAOjB,EAAQL,MAAO9F,YACtDmH,EAAgBhB,MA3DD,gCA8DI,IACZ30D,KAAK61D,eAAe3jD,QAAQ3R,KAAKu1D,OAAO91D,KAAK61D,mBA/DrC,gCAkEI,IACZ71D,KAAK61D,eAAe3jD,QAAQ3R,KAAKw1D,OAAO/1D,KAAK61D,mBAnErC,2BAsED,IACPt1D,KAAKw1D,OAAO/1D,KAAK61D,kBAvET,yBA0EH,KACR71D,KAAK9G,MAAM88D,iBAAmBh2D,KAAK8yC,UAAUmQ,YAvG1B,IAwGnBjjD,KAAKi2D,qBACLj2D,KAAK8F,SAAL,SACO9F,KAAK9G,OADZ,IAEI88D,eAAgBh2D,KAAK8yC,UAAUmQ,YA3GhB,KA6GnBjjD,KAAK61D,eAAiBxhB,MAAMr0C,KAAK01D,iBAAiBxoB,KAAK,OAjF5C,yBAqFH,KACZltC,KAAKqvD,eAAiBhjD,OAAO6pD,WApF7Bl2D,KAAK9G,MAAQ,CACT88D,eAAgB,MAEpBh2D,KAAKqvD,eAAiBrvD,KAAKH,MAAMwvD,eACjCrvD,KAAKi2D,qBAKLj2D,KAAK61D,eAAiBxhB,MAAMr0C,KAAK01D,iBAAiBxoB,KAAK,GAKvDltC,KAAK4qD,QA/CS,EAkDlB9tB,oBACI98B,KAAK8yC,UAAYtzC,SAASulD,eAAe,yBAEzC/kD,KAAK8F,SAAL,SACO9F,KAAK9G,OADZ,IAEI88D,eAAgBh2D,KAAK8yC,UAAUmQ,YApDZ,KAsDvB52C,OAAO8pD,iBAAiB,SAAUn2D,KAAKo2D,eACvC/pD,OAAO8pD,iBAAiB,SAAUn2D,KAAKq2D,eAG3Cp5B,mBAAmBC,GACXA,EAAUsxB,UAAYxuD,KAAKH,MAAM2uD,SACjCniD,OAAOkoD,SAAS,EAAG,GAI3B9wB,uBACI,MAAM,QAAC+qB,GAAWxuD,KAAKH,MACP,aAAZ2uD,GACAxuD,KAAKH,MAAMuvD,yBAAyBpvD,KAAKqvD,gBAG7ChjD,OAAOiqD,oBAAoB,SAAUt2D,KAAKo2D,eAC1C/pD,OAAOiqD,oBAAoB,SAAUt2D,KAAKq2D,eA8C9C50D,SACI,MAAM,mBACF80D,EADE,KAEF3I,EAFE,QAGFY,EAHE,cAIFb,EAJE,eAKF0B,EALE,SAMF0F,GACA/0D,KAAKH,OAEH,eAACm2D,GAAkBh2D,KAAK9G,OACxB,cAACs9D,EAAD,MAAgBnvD,EAAQ,GAAxB,QAA4BovD,EAA2B,IAAjBpvD,EAAM7B,OAA5C,WAA0D0pD,GAAcvB,EAAca,GAAWb,EAAca,GAAW,GAK1HkI,EAAcjnC,SAASumC,EAAiBh2D,KAAK01D,gBAAiB,IAC9DiB,EAAetiB,MAAMr0C,KAAK01D,iBAAiBxoB,KAAK,GAAGrjC,KAAI,CAAC0xC,EAAMzxC,IAAU9J,KAAK4qD,SAAY9gD,EAAQ4sD,EAAgB5sD,GAAS9J,KAAK4qD,QAAU,MAE/I5qD,KAAK61D,eAAiBxhB,MAAMr0C,KAAK01D,iBAAiBxoB,KAAKltC,KAAK4qD,SAI5D,MAEMgM,EAAcZ,GAAkB3uD,EAAM7B,OACxC6B,EAAMwC,KAAI,CAAC0xC,EAAMzxC,KACb,MAAM6qD,EAAU/G,EAAKrS,IACf,MAAC+Y,GAASK,EAGVkC,EAAW72D,KAAK82D,uBAChBlQ,EAAM5mD,KAAK61D,eAAegB,GAAY,KACtC3U,EAAOyU,EAAaE,GAAY,KAChCE,EAXI,IAWuBpC,EAAQprD,MAASorD,EAAQnrD,OAAUxJ,KAAK4qD,QAGzE,OAFA5qD,KAAK61D,eAAegB,IAAaE,EAG7B,gBAAC,GAAD,CACIpC,QAASA,EACT/N,IAAKA,EACL1E,KAAMA,EACNkT,UAnBE,IAoBFC,iBAAkBr1D,KAAKq1D,iBACvBn4D,IAAG,UAAK4M,EAAL,YAAcwqD,QAGxB,KAETt0D,KAAKg3D,gBAAkBh3D,KAAKi3D,kBAE5B,MAAMngB,EAAU8f,EACZ,gBAAC9B,GAAA,EAAD,CACI9zD,UAAU,8BACVk2D,UAAW,EACXnC,SAAUA,EACVoC,aAAa,EACbvH,QAAS4G,EACTxB,UAAW,EACXgC,gBAAiBh3D,KAAKg3D,gBACtB3H,eAAgBA,EAChB+H,WAAW,GAEVR,GAEL,KAEES,GAAenI,GAAcuH,EAC/B,gBAAC,KAAD,CACI/1B,QAAS42B,mBACTC,YAAa,CAAC9pD,YAAa,IAAF,OAAM+gD,EAAN,QAE7B,KAEJ,OACI,uBACI12D,GAAG,wBACHkJ,UAAS,gCAA2Bu1D,IAEnCzf,EACAugB,I,GAvLJ9B,G,YACU,CACf1C,SAAUvhB,WACVsc,KAAMtc,WACNqc,cAAerc,WACfilB,mBAAoBjlB,WACpBkd,QAASld,WACTqkB,gBAAiBrkB,SACjByjB,SAAUzjB,SACVokB,gBAAiBpkB,WACjB+d,eAAgB/d,WAChB8d,yBAA0B9d,WAkLlC,UAAentC,cAzMf,SAAyBjL,GACrB,mBACOA,EAAMynB,SAASitC,KAAKqH,OACpB/7D,EAAMynB,SAASitC,KAAK/wB,QAF3B,IAGIg2B,SAAU35D,EAAMynB,SAASitC,KAAKkF,QAqMElC,GAAxC,CAA4D2E,I,6rBC1M5D,UAAepxD,cAdf,SAAyBjL,GACrB,mBACOA,EAAMynB,SAASitC,KAAKqH,OACpB/7D,EAAMynB,SAASitC,KAAK/wB,QAF3B,IAGIg2B,SAAU35D,EAAMynB,SAASitC,KAAKkF,SAItC,WACI,MAAO,CACH1D,yBAAwBA,KAIhC,CAA4DmG,I,wVCN5D,MAAM3E,GAAsB,CACxBrD,aADwB,EAExB0B,sBAAqBA,GAGlB,MAAMuI,WAAelE,gBAAc,kDAqB3B,KACP,MAAM,WAACpG,GAAcltD,KAAKH,MAC1BG,KAAKH,MAAM0tD,aAAa,CAACL,kBAd7BpwB,oBACI,MAAM,WAACowB,GAAcltD,KAAKH,MAC1BG,KAAKH,MAAMovD,sBAAsB/B,EAAWr/B,MAAM,KAAKg3B,KAAK,MAGhE5nB,mBAAmBC,GACf,MAAM,WAACgwB,GAAcltD,KAAKH,MACtBq9B,EAAUgwB,aAAeA,GACzBltD,KAAKH,MAAMovD,sBAAsB/B,EAAWr/B,MAAM,KAAKg3B,KAAK,MASpEpjD,SACI,MAAM,gBAACk0D,EAAD,WAAkBzI,EAAlB,aAA8B0E,GAAgB5xD,KAAKH,MAEzD,OACI,gBAAC,GAAD,CACI2uD,QAAStB,EACTyI,gBAAiBA,EACjB/D,aAAcA,EACdmD,SAAU/0D,KAAK+0D,Y,GAlClByC,G,YACU,CACf7B,gBAAiBrkB,SACjBsgB,aAActgB,SACd4b,WAAY5b,WACZ2d,sBAAuB3d,SACvBic,aAAcjc,WAkCtB,UAAentC,cAnDf,SAAyBjL,GACrB,O,kWAAA,IACOA,EAAMynB,SAASitC,KAAK/wB,UAiDS+zB,GAAxC,CAA4D4G,I,yHC/C5D,MAAM5G,GAAsB,CACxBnC,eADwB,EAExBQ,sBAFwB,EAGxBG,yBAAwBA,GAGrB,MAAMqI,WAAiBnE,gBAAc,kDAiB7B,KACPtzD,KAAKH,MAAM4uD,eAAe,CAACC,QAAS,gBATxC5xB,oBACI98B,KAAKH,MAAMovD,sBAAsB,YAGrCxrB,uBACIzjC,KAAKH,MAAMuvD,yBAAyB,GAOxC3tD,SACI,MAAM,gBAACk0D,EAAD,aAAkB/D,GAAgB5xD,KAAKH,MAC7C,OACI,gBAAC,GAAD,CACI2uD,QAAQ,WACRmH,gBAAiBA,EACjB/D,aAAcA,EACdmD,SAAU/0D,KAAK+0D,Y,GA5BlB0C,G,YACU,CACf9B,gBAAiBrkB,SACjBsgB,aAActgB,SACdmd,eAAgBnd,SAChB2d,sBAAuB3d,SACvB8d,yBAA0B9d,WA4BlC,UAAentC,aAAQ,KAAMysD,GAA7B,CAAiD6G,I,yHC3C1C,MAAM5E,GAAW,CACpB6E,QdEgB,acDhBC,SAAU,cACVC,YdTW,EcUXzD,aAAc,SACd0D,WAAY,kBACZC,MAAO,qBACPC,eAAe,EACf/vD,OAAQ,CACJyrD,KAAM,CAACE,EAAwBA,GAC/BqE,aAAa,IAIN,MAAMC,WAAkBt4D,gBAOnCC,YAAYC,GACRC,MAAMD,GADS,0BASF,KACbG,KAAK8F,SAAS,CACV8O,OAAQ,gBAXG,4BAeA,KACf5U,KAAK8F,SAAS,CACV8O,OAAQ,iBAjBG,wBAqBJ,KACX5U,KAAK8F,SAAS,CACV8O,OAAQ,cAvBG,2BA2BAsjD,IACfl4D,KAAKH,MAAMs4D,WAAW,KAAOD,EAAI/uD,MAAM6lC,QAAQ,QAAS,QAAU,KAAOkpB,EAAIE,UAAY,QAzBzF,MAAMxjD,EAAS/U,EAAMsyD,kBAAoB,SAAW,WACpDnyD,KAAK9G,MAAQ,CACT0b,UA0BRnT,SACI,MAAM,OAACmT,GAAU5U,KAAK9G,MACtB,IAAIiE,EACJ,OAAQyX,GACR,IAAK,YACDzX,EACI,gBAAC,GAAD,CACI01D,SAAUA,GACVZ,WAAYjyD,KAAKq4D,eACjB5G,SAAUzxD,KAAKs4D,eAGvB,MACJ,IAAK,SACDn7D,EACI,gBAAC,GAAD,CACI01D,SAAUA,GACVjB,aAAc5xD,KAAKu4D,iBACnB5C,gBAAiB31D,KAAK21D,kBAG9B,MACJ,IAAK,WACDx4D,EACI,gBAAC,GAAD,CACI01D,SAAUA,GACVjB,aAAc5xD,KAAKu4D,iBACnB5C,gBAAiB31D,KAAK21D,kBAKlC,OACI,2BACI,gBAAC,GAAD,CACI9C,SAAUA,GACVj+C,OAAQA,EACRq9C,WAAYjyD,KAAKq4D,eACjBzG,aAAc5xD,KAAKu4D,iBACnB9G,SAAUzxD,KAAKs4D,aACfnG,kBAAmBnyD,KAAKH,MAAMsyD,kBAC9BZ,uBAAwBvxD,KAAKH,MAAM0xD,wBAElCp0D,K,GAjFA86D,G,YACE,CACfE,WAAY7mB,oBACZ6gB,kBAAmB7gB,WACnBigB,uBAAwBjgB,sB,gBCzBjB,MAAMknB,WAAmB74D,gBACpC8B,SACI,OACI,uBAAUzB,KAAKH,MACX,uBACI0J,MAAM,OACNC,OAAO,OACPyjC,QAAQ,aAER,qBACI+lB,OAAO,OACPyF,YAAY,IACZvrB,KAAK,UACLwrB,SAAS,WAET,qBACIhI,UAAU,uCACVxjB,KAAK,WAEL,qBAAGwjB,UAAU,sCACT,qBAAGA,UAAU,iCACT,qBAAGA,UAAU,mCACT,wBAAMrjB,EAAE,i0J,gBCpBjC,MAAMsrB,WAA0Bh5D,gBAK3C8B,SACI,OACI,uBAAKT,UAAU,qCACX,0BACInF,KAAK,SACLmF,UAAU,0CACVuJ,QAASvK,KAAKH,MAAM+4D,wBAEpB,wBAAM5lB,cAAY,QAAQ,KAC1B,wBAAMhyC,UAAU,WACZ,gBAAC,KAAD,CACIlJ,GAAI,qBACJ+N,eAAgB,YAI5B,sBAAI7E,UAAU,0CACV,gBAAC,KAAD,CACIlJ,GAAI,sBACJ+N,eAAgB,qB,8GAxBnB8yD,G,YACE,CACfC,uBAAwBtnB,sB,yICThC,SAAe,IAA0B,6C,iKCWzC,MAAMunB,WAA4Bl5D,YAAgB,qDAc/BhB,IACXA,EAAEqH,iBACFhG,KAAKH,MAAMi5D,gBAAgB94D,KAAKH,MAAMmO,SAAS5N,SAPnDgyD,sBAAsB1xD,GAClB,OAAOA,EAAUoB,WAAa9B,KAAKH,MAAMiC,UACrCpB,EAAUq4D,SAAW/4D,KAAKH,MAAMk5D,OAQxCt3D,SACI,IAAIT,EAAY,yBACZhB,KAAKH,MAAMiC,WACXd,GAAa,qCAGZhB,KAAKH,MAAMk5D,SACZ/3D,GAAa,YAGjB,MAAMw0C,EACF,gBAACpR,GAAA,EAAD,CACItsC,GAAG,cACHkJ,UAAU,iBAEV,4BACI,gBAAC,KAAD,CACIlJ,GAAE,uBAAkBkI,KAAKH,MAAMmO,SAAS5N,MACxCyF,eAAgB7F,KAAKH,MAAMmO,SAASpP,YAKpD,OACI,gBAAC,KAAD,CACI82C,QAAS,CAAC,SACVpR,UAAWt1B,wBACXu1B,UAAU,SACVC,QAASgR,GAET,qBACIx0C,UAAWA,EACXo5B,KAAK,IACL7vB,QAASvK,KAAK4vC,YACd+C,aAAY3yC,KAAKH,MAAMmO,SAASlW,IAE/BkI,KAAKH,MAAMuJ,Q,GAvD1ByvD,G,YACiB,CACf7qD,SAAUsjC,sBACVloC,KAAMkoC,oBACNwnB,gBAAiBxnB,oBACjBxvC,SAAUwvC,oBACVynB,OAAQznB,sBAwDhB,UAAe7mC,SAAWouD,I,4KCzD1B,MAAMG,WAAwBr5D,YAAgB,sDAmB1Bs5D,IACZj5D,KAAKi5D,UAAYA,KApBqB,qBAuB9B,KACR,MAAM74D,EAAO,eAAgBJ,KAAKH,MAAMitB,MAAQ9sB,KAAKH,MAAMitB,MAAMi1B,WAAa/hD,KAAKH,MAAMitB,MAAM1sB,MACzF,cAACwF,GAAiB5F,KAAKH,MAAM8F,KACnC,OAAOC,EAAc,CACjB9N,GAAI,qCACJ+N,eAAgB,qBAEpB,CACI2zC,UAAWp5C,EAAK4uC,QAAQ,KAAM,UA/BI,2BAgDxB,KACThvC,KAAKH,MAAMu8B,YACZp8B,KAAKH,MAAMq5D,WAAWl5D,KAAKH,MAAMs5D,cAAen5D,KAAKH,MAAMu5D,eAlDzB,kCAsDhBC,KAASr5D,KAAKs5D,gBAxDJ,IAwDsD,CAACC,SAAS,EAAMC,UAAU,KAtD1E,uBAwD5B,KACVx5D,KAAKH,MAAM45D,YAAYz5D,KAAKH,MAAMitB,UA1CtCslC,sBAAsB1xD,GAClB,OAAOA,EAAU07B,aAAep8B,KAAKH,MAAMu8B,WAmB/Ca,mBAAmBC,GACf,IAAKA,EAAUd,YAAcp8B,KAAKH,MAAMu8B,WAAY,CAChD,MAAMs9B,EAAoB15D,KAAKi5D,UAAUU,UACnCC,EAAuBF,EAAoB15D,KAAKi5D,UAAUY,cAC1D,aAACC,EAAD,aAAeC,EAAf,gBAA6BC,GAAmBh6D,KAAKH,MACvD65D,EAAoBK,EACpBD,EAAaG,UAAYP,EA5CG,GA6CrBE,EAAuBI,IAC9BF,EAAaG,UAAaL,EAAuBE,EAAaD,aA9ClC,KA+DxCp4D,SACI,MAAM,MAACqrB,GAAS9sB,KAAKH,MAErB,IAAIq6D,EAAgB,qBAChBl6D,KAAKH,MAAMu8B,aACX89B,GAAiB,aAGrB,IAIIC,EAJAC,EAAkB,cA+BtB,OA9BAA,GAAmB,mBAAqBttC,EAAM9e,SAC9CosD,GAAmB,UAAYttC,EAAMqtC,MAIjCA,EADArtC,EAAM9e,UAA+B,WAAnB8e,EAAM9e,SAEpB,uBACI1E,IAAK,cACLonC,cAAa5jB,EAAMutC,YACnBvG,YAAa9zD,KAAKs6D,wBAClB7wD,IAAK8wD,GACLv5D,UAAWo5D,EACX7vD,QAASvK,KAAK4vC,YACd93C,GAAI,SAAWg1B,EAAMqtC,MACrBxnB,aAAY3yC,KAAKw5C,YACjBlxC,KAAK,WAKT,uBACIgB,IAAK,qBACLwqD,YAAa9zD,KAAKs5D,gBAClB7vD,KAAK0iD,SAAiBr/B,GACtB9rB,UAAW,yBACXuJ,QAASvK,KAAK4vC,cAMtB,uBACI5uC,UAAWk5D,EACX19B,IAAKx8B,KAAKw6D,cAEV,uBAAK9pB,cAAY,aACZypB,K,GAzGfnB,G,YACiB,CACflsC,MAAOwkB,sBACP4nB,WAAY5nB,oBACZmoB,YAAanoB,oBACbtjC,SAAUsjC,sBACVlV,WAAYkV,SACZ6nB,cAAe7nB,sBACf8nB,WAAY9nB,sBACZwoB,aAAcxoB,QACdyoB,aAAczoB,sBACd0oB,gBAAiB1oB,sBACjB3rC,KAAM80D,mBAoGd,UAAehwD,SAAWuuD,I,yHCzHX,MAAM0B,WAAmC/6D,gBAAoB,gDAmB9Dg7D,IACN36D,KAAK26D,IAAMA,KAbf79B,oBACI98B,KAAK46D,kBAAoBvuD,OAAO4jC,uBAAsB,KAClDjwC,KAAKH,MAAMg7D,qBAAqB76D,KAAKH,MAAMi7D,aAAc96D,KAAK26D,IAAIhB,cAI1El2B,uBACQzjC,KAAK46D,mBACLvuD,OAAO0uD,qBAAqB/6D,KAAK46D,mBAQzCn5D,SACI,OACI,uBACI+6B,IAAKx8B,KAAKg7D,QAEV,uBAAKh6D,UAAU,iCACX,uBACIA,UAAU,gCACVlJ,GAAE,yBAAoBkI,KAAKH,MAAMi7D,eAEjC,gBAAC,KAAD,CAAkBhjE,GAAI,gBAAkBkI,KAAKH,MAAMi7D,iBAG3D,uBAAK95D,UAAU,iCACVhB,KAAKH,MAAM0/B,Y,GArCXm7B,G,YACE,CACfI,aAAcxpB,sBACd/R,SAAU+R,QACVupB,qBAAsBvpB,sB,qJCEf,MAAM2pB,WAA2Bt7D,gBAAoB,sDAOjD,IACNK,KAAKH,MAAMq7D,qBAGXl7D,KAAKH,MAAMu/B,gBAIZ,gBAAC,KAAD,CAAuBwpB,YAAa,CAACn8B,qBACjC,uBAAKzrB,UAAU,wBACX,qBACIA,UAAU,eACVo5B,KAAI,WAAMp6B,KAAKH,MAAMu/B,gBAAjB,WAEJ,gBAAC,KAAD,CACItnC,GAAG,4BACH+N,eAAe,oBAdxB,OAsBfpE,SACI,MAAMqrB,EAAQ9sB,KAAKH,MAAMitB,MAEzB,GAAIA,EAAO,CACP,IAAI1sB,EACA+6D,EACAC,EA+BJ,OA7BItuC,EAAMutC,aAA+B,eAAhBvtC,EAAMqtC,OAE3B/5D,EAAO0sB,EAAMutC,YAAY,GACzBc,EAAUruC,EAAMutC,YAEhBe,EACI,wBAAMp6D,UAAU,kBACZ,uBACIlJ,GAAG,2BACHwR,IAAK,uBACLG,IAAK8wD,GACLv5D,UAAW,sCAAwC8rB,EAAM9e,SAAW,UAAY8e,EAAMqtC,WAMlG/5D,EAAO0sB,EAAM1sB,KACb+6D,EAAU,CAAC/6D,GACXg7D,EACI,uBACItjE,GAAG,2BACHwR,IAAK,sBACLtI,UAAU,8BACVyI,KAAK0iD,SAAiBr/B,MAM9B,uBAAK9rB,UAAU,wBACX,uBAAKA,UAAU,yBACX,uBAAKA,UAAU,mCACVo6D,GAEL,uBAAKp6D,UAAU,yCACX,wBAAMA,UAAU,8BAA8B,IAAMm6D,EAAQtW,KAAK,OAAS,OAGjF7kD,KAAKq7D,gBAKlB,OACI,uBAAKr6D,UAAU,wBACX,uBAAKA,UAAU,2DACX,gBAAC,KAAD,CACIlJ,GAAG,2BACH+N,eAAe,qBAGtB7F,KAAKq7D,iB,GA3FDJ,G,YACE,CACfnuC,MAAOwkB,WACP4pB,oBAAqB5pB,SACrBlS,gBAAiBkS,wB,oJCCzB,MAAMgqB,GAAY,CAAC,CAAC,mCAAoC,WACpD,CAAC,mDAAoD,SACrD,CAAC,0DAA2D,SAC5D,CAAC,oDAAqD,SACtD,CAAC,yDAA0D,SAC3D,CAAC,kDAAmD,UAElDC,GAAiB,IAAIC,IAAIF,GAAUzxD,KAAK4xD,GAAS,CAACA,EAAK,GAAIC,MAAaA,UAA8BD,EAAK,SAE1G,MAAME,WAAwBh8D,gBAOjCC,cACIE,QADU,qBAQD87D,GACF57D,KAAKH,MAAM8F,KAAKC,cAAc,CACjC9N,GAAI,mCACJ+N,eAAgB,oBAEpB,CACIg2D,SAAUH,UAA2BE,OAd/B,8BAkBQA,IAClB57D,KAAK8F,SAAS,CAACg2D,gBAAgB,IAC3BF,IAAS57D,KAAKH,MAAMk8D,cACpB/7D,KAAKH,MAAMm8D,eAAeJ,MArBpB,8BAyBO,KACjB57D,KAAK8F,SAAS,CAACg2D,gBAAgB,OAvB/B97D,KAAK9G,MAAQ,CACT4iE,gBAAgB,GAyBxBG,WACI,MAAMC,EAAUZ,GAAUzxD,KAAKsyD,IAC3B,MAAMP,EAAOO,EAAS,GAChBrvC,EAAQyuC,GAAetP,IAAI2P,GAC3BxB,EAAkB9gC,KAAW,cAAD,yBAAkCxM,EAAM9e,UAAxC,gBAA6D8e,EAAMqtC,QAErG,OACI,uBACIn5D,UAAU,mBACV9D,IAAK0+D,EACLrxD,QAAS,IAAMvK,KAAKo8D,mBAAmBR,IAEvC,uBACIlrB,cAAA,oBAA0BkrB,GAC1BnyD,IAAK8wD,GACLv5D,UAAWo5D,EACXznB,aAAY3yC,KAAKgV,UAAU4mD,GAC3BtzD,KAAK,eAKrB,OACI,gCACI,uBAAKtH,UAAU,qBACX,0BACIA,UAAU,yBACVuJ,QAAS,IAAMvK,KAAKo8D,mBAAmBp8D,KAAKH,MAAMk8D,eAElD,qBAAG/6D,UAAU,yCAEjB,uBAAKA,UAAU,0BACX,gBAAC,KAAD,CACIlJ,GAAI4jE,UAA2B,eAI3C,uBAAK16D,UAAU,qBACVk7D,IAKjBG,YACI,MAAMvvC,EAAQyuC,GAAetP,IAAIjsD,KAAKH,MAAMk8D,cACtC3B,EAAkB9gC,KAAW,cAAD,yBAAkCxM,EAAM9e,UAAxC,gBAA6D8e,EAAMqtC,QAC/F3kB,EACF,gBAACpR,GAAA,EAAD,CACItsC,GAAG,cACHkJ,UAAU,iBAEV,4BACI,gBAAC,KAAD,CACIlJ,GAAI,yBACJ+N,eAAgB,gBAIhC,OACI,gBAAC,KAAD,CACI6vC,QAAS,CAAC,SACVpR,UAAWt1B,wBACXu1B,UAAU,MACVC,QAASgR,GAET,uBAAKx0C,UAAU,oBACX,uBACIsI,IAAK,yBACLonC,cAAA,sBAA4B1wC,KAAKH,MAAMk8D,cACvCtyD,IAAK8wD,GACLv5D,UAAWo5D,EACX7vD,QAASvK,KAAKs8D,mBACd3pB,aAAY3yC,KAAKgV,UAAUhV,KAAKH,MAAMk8D,cACtCzzD,KAAK,aAMzB7G,SACI,OACI,uBAAKT,UAAWs4B,KAAW,aAAc,CAAC,qBAAsBt5B,KAAK9G,MAAM4iE,kBACvE,uBAAK96D,UAAWs4B,KAAW,sBAAuB,CAAC,+BAAgCt5B,KAAK9G,MAAM4iE,kBACzF97D,KAAK9G,MAAM4iE,eAAiB97D,KAAKi8D,WAAaj8D,KAAKq8D,e,GAvH3DV,G,YACU,CACfI,aAAczqB,sBACd0qB,eAAgB1qB,oBAChB3rC,KAAM80D,mBA0Hd,UAAehwD,SAAWkxD,I,6rBC/H1B,MAAMY,GAA0B,gBAiB1BC,GAAgB,IAAIhB,IAAI,CAC1B,CAAC,SAAU,sBACX,CAAC,gBAAiB,IAClB,CAAC,kBAAmB,+BACpB,CAAC,cAAe,wBAChB,CAAC,iBAAkB,qBACnB,CAAC,aAAc,mBACf,CAAC,aAAc,mBACf,CAAC,gBAAiB,yBAClB,CAAC,UAAW,0BACZ,CAAC,UAAW,sBACZ,CAAC,QAAS,qBACV,CAAC,SAAU,kCAGTiB,GAAgBD,GAAcvQ,IAAI,mBAExC,SAASyQ,GAAet8D,GACpB,MAAO,CACHA,OACAtI,GAAI4jE,UAA+Bt7D,EAA/B,uBAAqDA,IACzDY,UAAWw7D,GAAcvQ,IAAI7rD,EAAMq8D,IACnC79D,QAAS88D,UAA0Bt7D,EAAMA,GACzCu8D,OAAQ,GAIhB,MAAMC,GAAa,GAEnB,IAAK,MAAMC,KAAOnB,MACF,WAARmB,GAA4B,kBAARA,IAGxBD,GAAWC,GAAOH,GAAeG,IAGrC,MAAMC,GAAkB,CAAC,kBAAmBF,GAAW,oBACjDG,GAAsB,CAACC,OAAQN,GAAe,WAE9CO,GAAwBP,GAAeH,IAE7C,SAASW,GAAiBpwC,GACtB,OAAOA,EAAMqtC,OAASrtC,EAAMqwC,UAAYrwC,EAAMh1B,GAUnC,MAAMslE,WAAoBz9D,gBA0BrB,iBAACE,EAAO3G,GACpB,MAAM,WAACo1D,EAAD,UAAa+O,GAAankE,EAC1BokE,EAAWz9D,EAAMy9D,SACjBC,EAAiBD,EAASjC,aAEhC,IAAK,MAAMrtD,KAAY1I,OAAOC,KAAK+oD,GAAa,CAC5C,IAAIkP,EAAiB,GACJ,WAAbxvD,GAAyBnO,EAAM49D,aAAaj4D,OAE5Cg4D,EADqB,IAAI39D,EAAM49D,cAAcC,UACfp2D,QAAQlH,GAC3Bk9D,EAASl4C,IAAIhlB,KACrByJ,KAAKzJ,GACGk9D,EAASrR,IAAI7rD,MAIxBo9D,GADgB9B,UAAiC77D,EAAMk8D,cAAc9P,IAAIj+C,IAAa,IAC7DnE,KAAKC,GAAU4xD,MAAa5xD,KACpC,WAAbkE,IACAwvD,EAAiBA,EAAeG,OAAO,IAAIJ,EAAe34D,aAGlE0pD,EAAWtgD,GAAU4vD,SAAWJ,EAAe3zD,KAAKijB,GAAUowC,GAAiBpwC,KAC/E,IAAK,IAAI1B,EAAI,EAAGA,EAAIoyC,EAAeh4D,OAAQ4lB,IAAK,CAC5C,MAAMyyC,EAAeL,EAAepyC,GAC9B0yC,EAAWZ,GAAiBW,GAClCR,EAAUS,GAAV,SACOD,GADP,IAEIE,SAAS,EACTpB,OAAQ,OAEPkB,EAAa1D,QAEdkD,EAAUS,GAAV,SACOT,EAAUS,IADjB,IAEI3C,QAAS0C,EAAaxD,YAAcwD,EAAaxD,YAAc,CAACwD,EAAaz9D,MAC7E4N,SAAU,SACVmsD,MAAO2D,MAMvB,MAAO,CAACxP,aAAY+O,aAGO,gCAACx9D,EAAO3G,GACnC,IAAI8kE,EAAe,CAACV,SAAUz9D,EAAMy9D,SAAUvB,aAAcl8D,EAAMk8D,cAClE,GAAIx9D,KAAKC,UAAU8G,OAAOC,KAAKrM,EAAMo1D,eAAiBp1D,EAAM+kE,cAAgBp+D,EAAMy9D,WAAapkE,EAAMokE,UAAYz9D,EAAMk8D,eAAiB7iE,EAAM6iE,aAAc,CACxJ,MAAM,WAACzN,EAAD,UAAa+O,GAAaD,GAAYc,UAAUr+D,EAAO3G,GAC7D8kE,EAAe,SAAIA,GAAP,IAAqB1P,aAAY+O,YAAWY,aAAc1/D,KAAKC,UAAU8G,OAAOC,KAAK+oD,MAGrG,OAAO0P,EAGXp+D,YAAYC,GACRC,MAAMD,GADS,+BA0EG,KAClB,MAAMyuD,EAAatuD,KAAKH,MAAM49D,aAAaj4D,OAAxB,SAAqCu3D,IAAwBH,IAAcA,GAC9F58D,KAAK8F,UAAU5M,IAAD,CACVo1D,WAAY,SACLA,GACAp1D,EAAMo1D,YAEb6P,qBAAqB,SAjFV,gCAqFI5mE,UACnB,IAAKyI,KAAKH,MAAMq7D,qBAAuBl7D,KAAKo+D,kBACxC,OAGJp+D,KAAKo+D,mBAAoB,EAEzB,MAAM,KAACzmE,SAAcqI,KAAKH,MAAMyC,QAAQ+7D,gBAAgBr+D,KAAKH,MAAMy+D,gBAhLnD,KAiLhB,GAAK3mE,EAAL,CAKA,GAAIA,EAAK6N,OAtLO,IAyLZ,OAFAxF,KAAKu+D,cAAe,OACpBv+D,KAAKo+D,mBAAoB,SAIvBp+D,KAAKH,MAAMyC,QAAQk8D,2BAEzBx+D,KAAKo+D,mBAAoB,OAZrBp+D,KAAKo+D,mBAAoB,KA9Fd,+BA4HIK,IACnBz+D,KAAKy+D,iBAAmBA,KA7HT,mCA+HQC,IACvB1+D,KAAK0+D,qBAAuBA,KAhIb,4BAkIC1uB,IAChBhwC,KAAKsxD,YAActhB,KAnIJ,+BAsII8qB,IACnB96D,KAAK8F,SAAS,CACV+kD,OAAQ,CAACvlD,OAAOC,KAAKvF,KAAK9G,MAAMo1D,YAAYp8C,QAAQ4oD,GAAe,KAEnE96D,KAAK9G,MAAMo1D,WAAWwM,KACtB96D,KAAK2+D,mBAAmB3+D,KAAK9G,MAAMo1D,WAAWwM,GAAc6B,QAC5D38D,KAAK0+D,qBAAqBzE,UAAYj6D,KAAK9G,MAAMo1D,WAAWwM,GAAc6B,WA5I/D,8BAgJGh+D,IAClBA,EAAEqH,iBACF,MAAMsB,EAAgC3I,EAAEu7B,OAAOn5B,MAzOtCsR,cAAc28B,QAAQ,SAAU,IA2OrChvC,KAAKH,MAAMq7D,qBAAuB5zD,GAA4B,KAAlBA,EAAOgL,QACnDtS,KAAKH,MAAMyC,QAAQs8D,mBAAmBt3D,GAG1CtH,KAAKH,MAAMg/D,mBAAmBv3D,GAE9BtH,KAAK8F,UAAS,KAAM,CAChB+kD,OAAQ,EAAE,GAAI,UA3JH,0BA+JF,CAACsO,EAAeC,KAC7Bp5D,KAAK8F,SAAS,CACV+kD,OAAQ,CAACsO,EAAeC,QAjKb,2BAqKAtsC,IACf9sB,KAAKH,MAAMgiD,aAAa/0B,MAtKT,iCAyKMnuB,IACrB,OAAQA,EAAEzB,KACV,IAAK,aACDyB,EAAEqH,iBACFhG,KAAK8+D,kBACL9+D,KAAKsxD,YAAYr3C,QACjB,MACJ,IAAK,YACDtb,EAAEqH,iBACFhG,KAAK++D,kBACL/+D,KAAKsxD,YAAYr3C,QACjB,MACJ,IAAK,UACDtb,EAAEqH,iBACFhG,KAAK++D,gBAlUK,GAmUV/+D,KAAKsxD,YAAYr3C,QACjB,MACJ,IAAK,YACDtb,EAAEqH,iBACFhG,KAAK8+D,gBAvUK,GAwUV9+D,KAAKsxD,YAAYr3C,YA7LN,yBAkMFtb,IACb,OAAQA,EAAEzB,KACV,IAAK,eAC8B,IAA1B8C,KAAK9G,MAAM2xD,OAAO,KAAuC,IAA1B7qD,KAAK9G,MAAM2xD,OAAO,IAAclsD,EAAEu7B,OAAOgY,eAAiB,EAAIlyC,KAAKH,MAAMyH,OAAO9B,UAChH7G,EAAEqH,iBACFhG,KAAK8+D,mBAET,MACJ,IAAK,YACG9+D,KAAK9G,MAAM2xD,OAAO,GAAK,GAAK7qD,KAAK9G,MAAM2xD,OAAO,GAAK,GACnDlsD,EAAEqH,iBACFhG,KAAK++D,mBAC2B,IAAzB/+D,KAAK9G,MAAM2xD,OAAO,IAAqC,IAAzB7qD,KAAK9G,MAAM2xD,OAAO,KACvD7qD,KAAK8F,SAAS,CACV+kD,OAAQ,EAAE,GAAI,KAElBlsD,EAAEu7B,OAAOgY,eAAiBlyC,KAAKH,MAAMyH,OAAO9B,OAC5C7G,EAAEu7B,OAAOiY,aAAenyC,KAAKH,MAAMyH,OAAO9B,OAC1C7G,EAAEqH,iBACFhG,KAAKsxD,YAAYr3C,SAErB,MACJ,IAAK,UACDtb,EAAEqH,iBACErH,EAAEqgE,SAGFrgE,EAAEu7B,OAAOgY,eAAiB,GACO,IAA1BlyC,KAAK9G,MAAM2xD,OAAO,IAGzBlsD,EAAEu7B,OAAOgY,eAAiB,EAC1BvzC,EAAEu7B,OAAOiY,aAAe,GACQ,IAAzBnyC,KAAK9G,MAAM2xD,OAAO,IAAY7qD,KAAK9G,MAAM2xD,OAAO,GA9WjD,GAiXN7qD,KAAK8F,SAAS,CACV+kD,OAAQ,EAAE,GAAI,KAElBlsD,EAAEu7B,OAAOgY,eAAiBlyC,KAAKH,MAAMyH,OAAO9B,OAC5C7G,EAAEu7B,OAAOiY,aAAenyC,KAAKH,MAAMyH,OAAO9B,OAC1CxF,KAAKsxD,YAAYr3C,SAGjBja,KAAK++D,gBAzXC,GA2XV,MACJ,IAAK,YACDpgE,EAAEqH,iBACErH,EAAEqgE,SAGFrgE,EAAEu7B,OAAOiY,aAAenyC,KAAKH,MAAMyH,OAAO9B,OACnCxF,KAAKH,MAAMyH,QAAsC,IAA5B3I,EAAEu7B,OAAOgY,gBAGrCvzC,EAAEu7B,OAAOgY,eAAiBlyC,KAAKH,MAAMyH,OAAO9B,OAC5C7G,EAAEu7B,OAAOiY,aAAenyC,KAAKH,MAAMyH,OAAO9B,QAG1CxF,KAAK8+D,gBAzYC,GA2YV,MACJ,IAAK,QACDngE,EAAEqH,iBACEhG,KAAKi/D,wBAAwBj/D,KAAK9G,MAAM2xD,SACxC7qD,KAAKH,MAAMgiD,aAAa7hD,KAAKi/D,wBAAwBj/D,KAAK9G,MAAM2xD,aApQzD,wBA0QJ,KACP7qD,KAAK0+D,sBACL1+D,KAAK2+D,mBAAmB3+D,KAAK0+D,qBAAqBzE,cA5QvC,0BAsTD2B,IACd57D,KAAKH,MAAMyC,QAAQ48D,gBAAgBtD,MAvTpB,8BA0TG9xD,GACd9J,KAAKH,MAAMyH,QAAoB,IAAVwC,EACd,KAEJ9J,KAAKm/D,mBAAmB75D,OAAOC,KAAKvF,KAAK9G,MAAMo1D,YAAYxkD,MA9TnD,oCAsgBQ,CAACqvD,EAAeiG,EAAQC,KAC/C,MAAM,OAACxU,EAAD,aAASyU,GAAgBt/D,KAAK9G,MACpC,IAAIqmE,EAAkBF,EAEtB,OAAOD,EAAOv1D,KAAI,CAACijB,EAAOssC,KAItB,IAAI58B,EAIJ,OAPA+iC,IAIIA,IAAoBD,IACpB9iC,EAAMx8B,KAAKw/D,qBAEXD,GAAmBD,EAEf,uBACIpiE,IAAKqiE,EACLv+D,UAAU,qBACVw7B,IAAKA,GAEL,uBACIlzB,IAAK,cACLG,IAAK8wD,GACLv5D,UAAU,iBAMtB,gBAAC,GAAD,CAEI9D,IAAK4vB,EAAMqtC,MAAQ,IAAMf,EACzBtsC,MAAOA,EACPosC,WAAYl5D,KAAKy/D,eACjBhG,YAAaz5D,KAAK21D,gBAClB+J,cAAe5yC,EACf9e,SAAU8e,EAAM9e,SAChBouB,WAAYyuB,EAAO,KAAQsO,GAAkBtO,EAAO,KAAOuO,EAC3DD,cAAeA,EACfC,WAAYA,EACZU,aAAc95D,KAAK0+D,qBACnB3E,aAAc/5D,KAAK9G,MAAMymE,aACzB3F,gBAAiBh6D,KAAK9G,MAAMymE,aAAe3/D,KAAK4/D,kBA/iB7C,gCAqjBI,CAAC9E,EAAc6B,KAC9B7B,IAAiByB,IACjBv8D,KAAK8F,UAAU5M,IAAD,CACVo1D,WAAY,SACLp1D,EAAMo1D,YADH,IAEN,CAACwM,GAAD,SACO5hE,EAAMo1D,WAAWwM,IADxB,IAEI6B,oBAzjBhB38D,KAAK6/D,qBAAuBC,KAAS9/D,KAAK+/D,aA3IV,IA2IyD,CAACxG,SAAS,EAAOC,UAAU,IAEpHx5D,KAAK4/D,UAAY,EACjB5/D,KAAKu+D,cAAe,EACpBv+D,KAAKo+D,mBAAoB,EAEzB,MAAM9P,EAAazuD,EAAM49D,aAAaj4D,OAAnB,SAAgCu3D,IAAwBD,IAAmBA,GAC9F98D,KAAK9G,MAAQ,CACTmkE,UAAW,GACX/O,aACAzD,OAAQ,EAAE,GAAI,GACd8U,aAAc,EACdL,aAxJgB,KAyJhBnB,qBAAqB,GAI7BrhC,oBACuC,IAA/B98B,KAAKH,MAAMy+D,iBACXt+D,KAAKggE,uBAKT3zD,OAAO4jC,uBAAsB,KACrBjwC,KAAKsxD,aACLtxD,KAAKsxD,YAAYr3C,QAErBja,KAAKigE,yBAA2B5zD,OAAO4jC,uBAAsB,KACzDjwC,KAAKm+D,4BAITn+D,KAAK0+D,uBACL1+D,KAAK4/D,UAAY5/D,KAAK0+D,qBAAqB7E,cAG/C,MAAMqG,EAAgB1gE,SAASulD,eAAe,QAC1Cmb,GACAA,EAAc18B,UAAUze,IAAI,wBAIpC45C,mBAAmBgB,GACf,GAAIA,IAAiB3/D,KAAK9G,MAAMymE,eAIhC3/D,KAAK8F,SAAS,CAAC65D,iBACX3/D,KAAKy+D,kBAAkB,CACvB,MAAM0B,EAAangE,KAAKy+D,iBAAiB9E,WAAagG,EAtMnC,IAKA,IAkMnB,GAAIQ,GAAc,EAAG,CACjB,MAAMC,EAjMW,IAiM4B7/D,KAAK8/D,KAAMF,EA3MnD,GASC,GAkMgG,GACtGngE,KAAK8F,UAAU5M,IAAD,CACVomE,aAAcpmE,EAAMomE,aAAec,QAMnD38B,uBACQzjC,KAAKigE,0BACL5zD,OAAO0uD,qBAAqB/6D,KAAKigE,0BAGrC,MAAMC,EAAgB1gE,SAASulD,eAAe,QAC1Cmb,GACAA,EAAc18B,UAAUG,OAAO,wBAuCvC1G,mBAAmBC,GACXl9B,KAAKH,MAAMk+D,UAAY7gC,EAAU6gC,SACjC/9D,KAAKsxD,YAAYr3C,QAGhBja,KAAKu+D,cAAiBv+D,KAAK0+D,sBAIP1+D,KAAK0+D,qBAAqBhtB,aAAe1xC,KAAK9G,MAAMymE,aAAe3/D,KAAK0+D,qBAAqB4B,cAzMtF,KA2M5BtgE,KAAKggE,uBAwJblB,gBAAgBnC,EAAS,GACrB,MAAM,OAAC9R,GAAU7qD,KAAK9G,MAGtB,IAAIqnE,EAAY,CAAC1V,EAAO,GAAIA,EAAO,GAAK8R,GACpC38D,KAAKi/D,wBAAwBsB,GAC7BvgE,KAAK8F,SAAS,CAAC+kD,OAAQ0V,KAK3BA,EAAY,CAAC1V,EAAO,GAAK,EAAG,GACxB7qD,KAAKi/D,wBAAwBsB,IAC7BvgE,KAAK8F,SAAS,CAAC+kD,OAAQ0V,KAI/BxB,gBAAgBpC,EAAS,GACrB,MAAM,OAAC9R,GAAU7qD,KAAK9G,MAGtB,IAAIqnE,EAAY,CAAC1V,EAAO,GAAIA,EAAO,GAAK8R,GACxC,GAAI38D,KAAKi/D,wBAAwBsB,GAC7BvgE,KAAK8F,SAAS,CAAC+kD,OAAQ0V,SAK3B,GAAkB,IAAd1V,EAAO,GAAU,CACjB,MAAM2V,EAAcxgE,KAAKygE,mBAAmB5V,EAAO,GAAK,GAClD6V,EAAgC1gE,KAAK9G,MAAMo1D,WAAWkS,EAAYpgE,MAAMw9D,SAASp4D,OAAS,EAChG+6D,EAAY,CAAC1V,EAAO,GAAK,EAAG6V,GACxB1gE,KAAKi/D,wBAAwBsB,IAC7BvgE,KAAK8F,SAAS,CAAC+kD,OAAQ0V,KAgBnCtB,wBAAwBpU,GACpB,MAAM78C,EAAWhO,KAAKygE,mBAAmB5V,EAAO,IAChD,OAAK78C,EAGEhO,KAAK2gE,oBAAoB3yD,GAAU68C,EAAO,IAFtC,KAKfsU,mBAAmBjiE,GACf,OAAO8C,KAAKH,MAAMyH,OAAS21D,GAAwBj9D,KAAK9G,MAAMo1D,WAAWpxD,GAG7E0jE,WAAWxB,GACP,MAAO3B,aAAcoD,GAAqB7gE,KAAKH,MACzC49D,EAAe,GACfqD,EAAoB,GAE1Bx7D,OAAOV,OAAOw6D,GAAQt6D,SAASgoB,IAC3B,IAAIi0C,EAAaD,EACjB,MAAME,EAAQ,gBAAiBl0C,EAAQA,EAAMutC,YAAc,CAACvtC,EAAM1sB,MAClE,IAAK,IAAIgrB,EAAI,EAAGA,EAAI41C,EAAMx7D,OAAQ4lB,IAC1By1C,EAAkB5vC,SAAS+vC,EAAM51C,GAAG/Y,iBACpC0uD,EAAatD,GAIrBsD,EAAW9hD,KAAK6N,MAGpB,MAAMm0C,EAAmB,CAACzsB,EAAGC,KAClBysB,QAAc1sB,EAAGC,EAAGz0C,KAAKH,MAAMyH,QAO1C,OAJAm2D,EAAa0D,KAAKF,GAElBH,EAAkBK,KAAKF,GAEhB,IACAxD,KACAqD,GAIXH,oBAAoB3yD,GAChB,GAAIhO,KAAKH,MAAMyH,OAAQ,CACnB,MAAM83D,EAAS95D,OAAOV,OAAO5E,KAAK9G,MAAMmkE,WAAW/1D,QAAQwlB,IACvD,MAAMk0C,EAAQ,gBAAiBl0C,EAAQA,EAAMutC,YAAc,CAACvtC,EAAM1sB,MAClE,IAAK,IAAIgrB,EAAI,EAAGA,EAAI41C,EAAMx7D,OAAQ4lB,IAC9B,GAAI41C,EAAM51C,GAAG/Y,cAAc4e,SAASjxB,KAAKH,MAAMyH,QAC3C,OAAO,EAIf,OAAO,KAGX,OAAOtH,KAAK4gE,WAAWxB,GAE3B,OAAOp/D,KAAK9G,MAAMo1D,WAAWtgD,EAAS5N,MAAMw9D,SAAS/zD,KAAKu3D,GACtDphE,KAAK9G,MAAMmkE,UAAU+D,KAG7BC,sBACI,MAAMv0C,EAAQ9sB,KAAKi/D,wBAAwBj/D,KAAK9G,MAAM2xD,QACtD,OAAK/9B,GAGQ,eAAgBA,EAAQA,EAAMi1B,WAAaj1B,EAAM1sB,MAClD4uC,QAAQ,KAAM,KAHf,GAMfsyB,8BACI,MAAMhT,EAAahpD,OAAOC,KAAKvF,KAAK9G,MAAMo1D,YAC1C,IAAIiT,EAAsBjT,EAAW,GAErC,IAAK,IAAIljC,EAAIkjC,EAAW9oD,OAAS,EAAG4lB,GAAK,EAAGA,IAAK,CAE7C,MAAMpd,EAAWhO,KAAK9G,MAAMo1D,WAAWA,EAAWljC,IAClD,GAAIpd,EAAS2uD,QAAU38D,KAAK9G,MAAMymE,aAAe3xD,EAAS2uD,OAAS,GAAI,CACnE4E,EAAsBjT,EAAWljC,GACjC,OAGR,OAAOm2C,EAGXC,kBACI,MAAMlT,EAAatuD,KAAKH,MAAM49D,aAAaj4D,OAAxB,SAAqCu3D,IAAwBH,IAAcA,GACxFqB,EAAe34D,OAAOC,KAAK+oD,GAC3BiT,EAAsBvhE,KAAKH,MAAMyH,OAAS22D,EAAa,GAAKj+D,KAAKshE,8BACjEG,EAAwBxD,EAAap0D,KAAKixD,IAC5C,MAAM9sD,EAAWsgD,EAAWwM,GAE5B,OACI,gBAAC,GAAD,CACI59D,IAAK,UAAY8Q,EAAS5N,KAC1B4N,SAAUA,EACV5E,KACI,qBACIpI,UAAWgN,EAAShN,YAG5B83D,gBAAiB94D,KAAK0hE,oBACtB5/D,SAAUy/D,IAAwBvzD,EAAS5N,KAC3C24D,QAAS/4D,KAAKH,MAAMyH,YAIhC,OACI,uBACIxP,GAAG,wBACHkJ,UAAU,2BACV2gE,UAAW3hE,KAAK4hE,uBAEfH,GAKbI,cACI,OACI,uBAAK7gE,UAAU,kCACX,uBAAKA,UAAU,gCACX,wBAAMA,UAAU,gDAChB,gBAAC,KAAD,CACIlJ,GAAG,4BACH+N,eAAe,wBAEbmP,GACE,gBAAC,IAAD,CACIld,GAAG,oBACH66C,aAAY39B,EACZwnB,IAAKx8B,KAAK8hE,iBACV9gE,UAAU,uBACV0vC,cAAY,mBACZ70C,KAAK,OACLoE,SAAUD,KAAK6+D,mBACf8C,UAAW3hE,KAAK+hE,cAChBr5D,aAAa,MACb7H,YAAa,CAAC/I,IAAIkc,OAAE,uBAAwBnO,eAAgB,gBAC5D9E,MAAOf,KAAKH,MAAMyH,YAKlC,gBAAC,GAAD,CACIy0D,aAAc/7D,KAAKH,MAAMk8D,aACzBC,eAAgBh8D,KAAKg8D,kBAMrCgG,sBACI,MAAM,OAAC16D,GAAUtH,KAAKH,MAChByuD,EAAahnD,EAAS,CAACi1D,IAA2Bj3D,OAAOC,KAAKvF,KAAK9G,MAAMo1D,YAC/E,IAAIiR,EAAkB,EAElB0C,EAAqB,GACzB,IAAK,IAAI72C,EAAI,EAAGA,EAAIkjC,EAAW9oD,OAAQ4lB,IAAK,CACxC,MAAMpd,EAAWhO,KAAKm/D,mBAAmB7Q,EAAWljC,IAC9Cg0C,EAASp/D,KAAK2gE,oBAAoB3yD,GAClC3G,EAAQrH,KAAKkiE,yBAAyB92C,EAAGg0C,EAAQG,GAavD,GAZAA,GAAmBl4D,EAAM7B,OACzBy8D,EAAqB,IAAIA,EACrB,gBAACvH,GAAD,CACIx9D,IAAK8Q,EAASlW,GACdgjE,aAAc9sD,EAAS5N,KACvBy6D,qBAAsB76D,KAAK66D,qBAC3BvyD,KAAK,eAEJjB,IAIY,IAAjBA,EAAM7B,OACN,OACI,gBAAC,KAAD,CACIk7B,QAAS42B,mBACTC,YAAa,CAAC9pD,YAAa,IAAF,OAAMzN,KAAKH,MAAMyH,OAAjB,QAKzC,OACI,uBACIk1B,IAAKx8B,KAAKmiE,wBACVC,SAAUpiE,KAAK6/D,qBACf7+D,UAAU,sBACV4H,MAA+B,CAACy5D,UAAWriE,KAAK9G,MAAMilE,oBAAsB,OAAS,WAErF,uBAAKn9D,UAAU,2BACVihE,IAkEjBxgE,SACI,OACI,uBACIT,UAAU,sBACVsH,KAAK,eAEL,uBACIg6D,YAAU,YACVthE,UAAU,WAEV,gBAAC,KAAD,CACIlJ,GAAG,qCACH+N,eAAe,oBACfjB,OAAQ,CACJ40C,UAAWx5C,KAAKqhE,0BAI3BrhE,KAAK6hE,cACL7hE,KAAKwhE,kBACLxhE,KAAKgiE,sBACN,gBAAC/G,GAAD,CACInuC,MAAO9sB,KAAKi/D,wBAAwBj/D,KAAK9G,MAAM2xD,QAC/CqQ,oBAAqBl7D,KAAKH,MAAMq7D,oBAChC97B,gBAAiBp/B,KAAKH,MAAMu/B,oB,GA5qB3Bg+B,G,YACE,CACfvb,aAAcvQ,oBACd4pB,oBAAqB5pB,SACrBgsB,SAAUhsB,sBACVmsB,aAAcnsB,qBACdyqB,aAAczqB,sBACdgtB,gBAAiBhtB,sBACjBysB,QAASzsB,SACTlS,gBAAiBkS,sBACjBhvC,QAASgvC,UAAgB,CACrB+sB,gBAAiB/sB,oBACjBstB,mBAAoBttB,oBACpBktB,yBAA0BltB,oBAC1B4tB,gBAAiB5tB,sBAClBixB,WACHj7D,OAAQgqC,sBACRutB,mBAAoBvtB,sB,GAjBP8rB,G,eAoBK,CAClBoF,WAAY,IACZlE,gBAAiB,EACjBpD,qBAAqB,ICjF7B,UAAe/2D,cAvBf,SAAyBjL,GACrB,MAAMokB,GAAcC,SAAerkB,GACnC,MAAO,CACHgiE,oBAAyE,SAApDhiE,EAAMynB,SAAS4oB,QAAQjuC,OAAOmnE,kBACnDnE,gBAAiBplE,EAAMwlC,MAAM5R,MAAM41C,sBACnCpF,UAAUtR,SAAY9yD,GACtBukE,cAAckF,SAAgBzpE,GAC9B6iE,cAAc6G,SAAgB1pE,GAC9BkmC,gBAAiB9hB,EAAcA,EAAYld,KAAO,OAI1D,SAA4BhJ,GACxB,MAAO,CACHkL,SAAS+B,yBAAmB,CACxBg6D,gBADwB,MAExBO,mBAFwB,MAGxBJ,yBAHwB,MAIxBU,gBAAeA,OAChB9nE,MAIX,CAA4DgmE,I,wVCtB7C,MAAMyF,WAAwBvP,gBAoBzC1zD,YAAYC,GACRC,MAAMD,GADS,+BASG,KAClBG,KAAK8F,SAAS,CACVg9D,iBAAiB,OAXN,8BAeE,KACjB9iE,KAAK8F,SAAS,CACVg9D,iBAAiB,OAjBN,kCAqBM,KACrB9iE,KAAKH,MAAM+hD,kBAtBI,8BAyBGt6C,IAClBtH,KAAK8F,SAAS,CAACwB,cAvBftH,KAAK9G,MAAQ,CACT4pE,iBAAiB,EACjBx7D,OAAQ,IAwBhB7F,SACI,IAAIshE,GACA/iE,KAAKH,MAAM+I,OAAqC,IAA1B5I,KAAKH,MAAM+I,MAAMs5C,MAAuC,IAAzBliD,KAAKH,MAAM+I,MAAMg+C,MAGlEmc,EAFyB,QAAzB/iE,KAAKH,MAAM0kC,WAAgD,WAAzBvkC,KAAKH,MAAM0kC,UAE/B,CACVqiB,IAAK5mD,KAAKH,MAAM+I,MAAMg+C,IACtBoc,OAAQhjE,KAAKH,MAAM+I,MAAMo6D,OACzBC,MAAOjjE,KAAKH,MAAMmiD,a,kWAGR,IAAIhiD,KAAKH,MAAM+I,OAGjCm6D,EAAYnc,IAAMmc,EAAYnc,IAAMmc,EAAYnc,IAAM5mD,KAAKH,MAAMwiD,UAAYriD,KAAKH,MAAMwiD,UAEpF0gB,EAAY7gB,OACZ6gB,EAAY7gB,MAAQliD,KAAKH,MAAMuiD,aAIvC,IAAI8gB,EAAc,eAKlB,MAJ6B,WAAzBljE,KAAKH,MAAM0kC,YACX2+B,GAAe,WAGfljE,KAAKH,MAAMsjE,sBAAmD,IAAzBnjE,KAAKH,MAAMs4D,WAE5C,gBAACiL,EAAA,EAAD,CACIC,iBAAkB,EAClBvrE,GAAG,oBACH8Q,MAAOm6D,EACP/hE,UAAWkiE,EACXI,WAAW,GAEX,gBAAC3K,GAAD,CAAmBC,uBAAwB54D,KAAK44D,yBAChD,gBAAC2K,EAAA,EAAD,CACIC,SAAU,EACVC,QAASzjE,KAAK0jE,oBACdC,OAAQ3jE,KAAK4jE,mBACbz6D,MACI,uBAAKnI,UAAW,gCACZ,gBAAC,KAAD,CACIA,UAAU,2BAEd,2BACK,WAIb6iE,aAAc,oBAEd,gBAAC,GAAD,CACIj7D,MAAO5I,KAAKH,MAAM+I,MAClBg5C,aAAc5hD,KAAKH,MAAM+hD,aACzBC,aAAc7hD,KAAKH,MAAMgiD,aACzBwZ,aAAcr7D,KAAKH,MAAMw7D,aACzB0C,QAAS/9D,KAAK9G,MAAM4pE,gBACpBx7D,OAAQtH,KAAK9G,MAAMoO,OACnBu3D,mBAAoB7+D,KAAK6+D,sBAGjC,gBAAC0E,EAAA,EAAD,CACIC,SAAU,EACVr6D,MAAO,gBAACqvD,GAAD,MACPsL,cAAc,EACdC,eAAe,EACfF,aAAc,oBAEd,gBAAC5L,GAAD,CACIE,WAAYn4D,KAAKH,MAAMs4D,WACvBhG,kBAAmBnyD,KAAK9G,MAAMoO,OAC9BiqD,uBAAwBvxD,KAAK6+D,uBAQ7C,uBACI/mE,GAAG,cACH8Q,MAAOm6D,EACP/hE,UAAS,sBAAiBkiE,EAAjB,0BAET,gBAACvK,GAAD,CAAmBC,uBAAwB54D,KAAK44D,yBAChD,gBAAC,GAAD,CACIhwD,MAAO5I,KAAKH,MAAM+I,MAClBg5C,aAAc5hD,KAAKH,MAAM+hD,aACzBC,aAAc7hD,KAAKH,MAAMgiD,aACzBwZ,aAAcr7D,KAAKH,MAAMw7D,aACzB/zD,OAAQtH,KAAK9G,MAAMoO,OACnBu3D,mBAAoB7+D,KAAK6+D,uB,4HA7IxBgE,G,YACE,CACfj6D,MAAO0oC,WACP0Q,YAAa1Q,WACb+Q,UAAW/Q,WACX8Q,WAAY9Q,WACZ/M,UAAW+M,UAAgB,CAAC,MAAO,SAAU,OAAQ,UACrD+pB,aAAc/pB,WACdsQ,aAActQ,oBACduQ,aAAcvQ,oBACd6mB,WAAY7mB,SACZ6xB,gBAAiB7xB,W,GAXJuxB,G,eAcK,CAClB7gB,YAAa,EACbK,UAAW,EACXD,WAAY,ICnBL,MAAM4hB,WAA2BrkE,gBAAoB,6DAkC1CskE,cAAQ,CAACC,EAAcx8D,KACzC,IAAIy8D,EAAwBn1D,uCAE5B,OAAKtH,GAIDw8D,IACAC,EAAwB93D,OAAO41C,WAAaiiB,EAAa51B,wBAAwB4T,KAAOlzC,sCAEpFm1D,EAAwBn1D,yCACxBm1D,EAAwBn1D,yCAIzBm1D,GAXIA,MAtCiD,wBAoDjDF,cAAQ,CAAC/pC,EAAQkqC,EAAoBC,EAAoB/hB,EAA2B56C,KAC/F,IAAKA,EACD,MAAO,MAGX,GAAIwyB,EAAQ,CACR,MAAMiU,EAAejU,EAAOoU,wBAC5B,OAAOC,OAAuBJ,EAAc9hC,OAAOmiC,YAAa41B,EAAoBC,EAAoB/hB,GAG5G,MAAO,UAGX7gD,SACI,MAAM,OAACy4B,EAAD,YAAS8nB,EAAT,mBAAsBoiB,EAAtB,mBAA0CC,EAA1C,0BAA8D/hB,EAA9D,KAAyF56C,GAAQ1H,KAAKH,MAEtGskE,OAA+C,IAAhBniB,EAA8BhiD,KAAKskE,oBAAoBpqC,IAAUxyB,GAAQs6C,EACxGzd,EAAYvkC,KAAKukE,aAAarqC,IAAUkqC,EAAoBC,EAAoB/hB,EAA2B56C,GAEjH,OACI,gBAAC2nC,EAAA,EAAD,CACI3nC,KAAMA,EACN68B,UAAWA,EACX+K,WAAW,EACXwD,UAAW9yC,KAAKH,MAAMizC,UACtB3qC,OAAQnI,KAAKH,MAAMsI,OACnB+xB,OAAQA,EACRsqC,WAAW,GAEX,gBAAC3B,GAAD,CACIM,gBAAiBnjE,KAAKH,MAAMsjE,gBAC5BvhB,aAAc5hD,KAAKH,MAAMsI,OACzB05C,aAAc7hD,KAAKH,MAAMgiD,aACzBsW,WAAYn4D,KAAKH,MAAMs4D,WACvBnW,YAAamiB,EACb9hB,UAAWriD,KAAKH,MAAMwiD,UACtBD,WAAYpiD,KAAKH,MAAMuiD,e,GAxFtB4hB,G,8BAGoB,K,GAHpBA,G,8BAIoB,K,GAJpBA,G,2BAQiB,K,GARjBA,G,2BASiB,K,GATjBA,G,YAWE,CACft8D,KAAM4pC,oBACNwB,UAAWxB,SACXpX,OAAQoX,oBACRuQ,aAAcvQ,oBACd6mB,WAAY7mB,SACZnpC,OAAQmpC,oBACR+Q,UAAW/Q,WACX0Q,YAAa1Q,WACb8Q,WAAY9Q,WACZ8yB,mBAAoB9yB,WACpB+yB,mBAAoB/yB,WACpB6xB,gBAAiB7xB,SACjBgR,0BAA2BhR,UAAgB,CAAC,OAAQ,Y,GAxBvC0yB,G,eA4BK,CAClBI,mBAAoBJ,GAAmBS,4BACvCJ,mBAAoBL,GAAmBU,4BACvCvB,iBAAiB,K,4FChCzB,MAAMwB,EAA6B,EAAErhD,MAAKkf,YAAW38B,oBAE7C,qBACIu0B,KAAM9W,EACN6W,IAAI,sBACJD,OAAO,UAEP,gBAAC,IAAD,CACIpiC,GAAI0qC,EACJ38B,eAAgBA,K,aAd5Byd,I,WACAkf,U,WACA38B,e,YAkBJ8+D,EAAU9qB,aAAe,CACrBv2B,IAAK,GACLkf,UAAW,GACX38B,eAAgB,IAGpB,W,qPChBe,MAAM++D,UAAsBjlE,gBAA2B,mDACrD,IACJK,KAAKH,MAAMglE,cAM2B,QAApC7kE,KAAKH,MAAMglE,cAAcC,QAHe,IAApC9kE,KAAKH,MAAM4J,IAAIyI,QAAQ,UAL4B,4BAW9C,IAETlS,KAAKH,MAAMklE,aAAe/kE,KAAKglE,eAG1CvjE,SACI,IAAIgI,GAAMw7D,QAAYjlE,KAAKH,MAAM4J,IAAKzJ,KAAKH,MAAM40D,eAMjD,OAJKz0D,KAAKklE,sBACNz7D,EAAM,IAGHzJ,KAAKH,MAAM0/B,SAAS91B,I,EAvBdm7D,E,aAPjBrlC,S,oBACAwlC,W,oBACAtQ,c,oBAEAhrD,I,wBCMJ,SAAetF,cATf,SAAyBjL,GACrB,MAAMoC,GAASmd,QAAUvf,GAEzB,MAAO,CACH6rE,WAAkC,SAAtBzpE,EAAO6pE,WACnB1Q,cAAwC,SAAzBn5D,EAAO45D,iBAI9B,CAAwC0P,I,8ICAzB,MAAMQ,UAAsBzlE,gBACvC8B,SACI,MAAM,SAAC4jE,GAAYrlE,KAAKH,MAClBhE,GAAOypE,QAAYD,EAASE,WAElC,IAAIC,EACJ,GAAI3pE,IAAS4pE,WAAiB,CAC1B,IAAIzkE,EAAY,aAEZqkE,EAAS97D,MAAQyF,sBAA6Bq2D,EAAS77D,OAASwF,sBAChEhO,GAAa,SAEbA,GAAa,UAGjB,IAAI0kE,GAAeC,QAAoBN,EAASvtE,IAKhD,OAJI8tE,QAAWP,EAASE,aAAeF,EAASQ,oBAC5CH,GAAeI,QAAWT,EAASvtE,KAInC,uBACIkJ,UAAWA,EACX4H,MAAO,CACHyjD,gBAAiB,OAAF,OAASqZ,EAAT,KACfpZ,eAAgB,WAgBhC,OAXIkZ,EADOH,EAASE,YAAcE,UAAiBzlE,KAAKH,MAAMklE,WAEtD,uBACIz7D,IAAK,uBACLtI,UAAU,oBACVyI,KAAKq8D,QAAWT,EAASvtE,MAIrB,uBAAKkJ,UAAW,cAAe+kE,QAAiBlqE,KAGzD2pE,G,EAzCMJ,E,iBAJjBL,W,kHCCJ,SAAe5gE,cANf,SAAyBjL,GACrB,MAAO,CACH6rE,WAA4C,UAAhCtsD,QAAUvf,GAAOisE,cAIrC,CAAwCC,I,wJC8BzB,MAAMY,UAAwBrmE,gBACzC8B,SACI,MAAM,YACFwkE,EADE,SAEF1mC,EAFE,eAGF2mC,EAHE,SAIFb,EAJE,iBAKFc,EALE,UAMFC,GACApmE,KAAKH,MAEHi+D,EAAWuH,EAASjlE,KACpBimE,GAAkBC,QAAaxI,GAErC,IAAIyI,EAoDJ,OAlDIA,EADAL,EAEI,gBAAC,IAAD,CACI5hC,UAAW,IACXC,UAAU,MACVC,QAAS,gBAAC,IAAD,CAAS1sC,GAAG,sBAAsBgmE,IAE3C,qBACIhmE,GAAG,uBACHsiC,KAAK,IACL7vB,QAAS47D,EACTnlE,UAAU,mBACVm5B,IAAI,uBAEJ,gBAAC,IAAD,CAAgBn5B,UAAU,SACzBqlE,IAINJ,EAEH,uBAAKjlE,UAAWolE,GAAa,oBACzB,gBAAC,IAAD,CACI9hC,UAAW,IACXC,UAAU,MACVC,QACI,gBAAC,IAAD,CAAS1sC,GAAG,uBACPsS,QAAgB,8BAA+B,cAIxD,qBACIgwB,MAAMosC,QAAmBnB,EAASvtE,IAClC66C,cAAYvoC,QAAgB,8BAA+B,YAAYiI,cACvEo0D,SAAU3I,EACV5jC,OAAO,SACPC,IAAI,uBAEHoF,GAAY8mC,KAOzB,wBAAMrlE,UAAU,oBACXqlE,GAKLE,G,EAlEKP,E,iBAvBjBG,iB,SAKAD,e,SAKAD,Y,SAKA1mC,S,SAKA6mC,U,ihBCoBW,MAAMM,UAAuB/mE,gBAIxCC,YAAYC,GACRC,MAAMD,GADgB,kBAHhB,GAGgB,+CAwCd,KACR,MAAMwlE,EAAWrlE,KAAKH,MAAMwlE,SAG5B,IAFiBC,QAAYD,EAASE,aAErBE,WAAiB,CAC9B,MAAMC,GAAeC,QAAoBN,EAASvtE,KAElD6uE,QAAUjB,EAAc1lE,KAAK4mE,wBACtBvB,EAASE,YAAcE,UAAiBzlE,KAAKH,MAAMklE,aAC1D4B,SAAUb,QAAWT,EAASvtE,IAAKkI,KAAK4mE,sBAjDtB,4BAqDN,KACZ5mE,KAAK6mE,SACL7mE,KAAK8F,SAAS,CACVghE,QAAQ,OAxDM,4BA6DLnoE,IACjBA,EAAEqH,iBAEE,SAAUrH,EAAEu7B,QACXv7B,EAAEu7B,OAAuBiW,OAG1BnwC,KAAKH,MAAMsmE,kBACXnmE,KAAKH,MAAMsmE,iBAAiBnmE,KAAKH,MAAMiK,UArErB,sBAyEX08C,IACX,GAAIA,EAAS,OACT,MAAMugB,EAAU,UAAG/mE,KAAK0mD,UAAUrY,eAAlB,aAAG,EAAwBC,wBAC3C,IAAIqY,EAEAA,OADyB,KAAlBogB,aAAP,EAAOA,EAAYpgB,QACY,KAApBogB,aAAP,EAAOA,EAAYngB,KAAsB,EAAImgB,aAA7C,EAA6CA,EAAYngB,IAEzDmgB,aAAH,EAAGA,EAAYpgB,EAEpB,MAEME,EAFex6C,OAAOmiC,YAEM,GAC5BsY,EAAaH,EAAI33C,2BACjB+3C,EAAiBF,GAAcC,EAAa93C,uBAElDhP,KAAK8F,SAAS,CACVkhD,OAASF,EAAaC,QAzFR,+BA8FMz6C,IAAkB,QAC9C,aAAAtM,KAAKH,OAAMmnE,gCAAX,gBAAsC16D,GACtCtM,KAAK8F,SAAS,CAACmhE,SAAU36D,OAhGH,8BAmGJ,KAClBmG,KAAqCzS,KAAKH,MAAMwlE,SAASvtE,OApGnC,8BAuGI,KAC1B,MAAM,iBAACovE,EAAD,SAAmB7B,EAAnB,gBAA6Bjd,GAAmBpoD,KAAKH,MAE3D,IAAIsnE,EACJ,MAAMC,EAAe,GACjBF,GACAE,EAAanoD,KACT,gBAAC,eAAD,CACIooD,aAAW,eACX98D,QAASvK,KAAKsnE,oBACdtyD,WAAW5K,QAAgB,gCAAiC,qBAC5DsK,MAAMtK,QAAgB,gCAAiC,wBAKnE,MAAM+9C,EAAcC,aAAH,EAAGA,EAAiB9gD,QAAQi0C,GAASA,aAAV,EAAUA,EAAMgsB,MAAMlC,KAAWx7D,KAAK0xC,GAE1E,gBAAC,eAAD,CACIzjD,GAAIyjD,EAAKzjD,GAAK,kBACdoF,IAAKq+C,EAAKzjD,GAAK,kBACfyS,QAAS,IAAMgxC,aAAN,EAAMA,EAAM3mC,OAAOywD,GAC5B3wD,KAAM6mC,EAAK7mC,SAMvB,KADsB0yD,aAAA,EAAAA,EAAc5hE,WAAU2iD,aAAxB,EAAwBA,EAAa3iD,QAEvD,OAAO,MAGc4hE,aAAA,EAAAA,EAAc5hE,UAAU2iD,aAAxB,EAAwBA,EAAa3iD,UAE1D2hE,EACI,sBACIrvE,GAAE,uBAAkButE,EAASvtE,GAA3B,YACFkJ,UAAU,oBACVsH,KAAK,cAKjB,MAAMktC,EACF,gBAACpR,EAAA,EAAD,CAAStsC,GAAG,uBACPsS,QAAgB,uCAAwC,iBAIjE,OACI,gBAAC,IAAD,CACIm+C,SAAUvoD,KAAKwoD,qBACfgf,yBAAyB,GAEzB,gBAAC,IAAD,CACIxmE,UAAU,YACVsjC,UAAW,IACXC,UAAU,MACVC,QAASgR,GAET,0BACIhZ,IAAKx8B,KAAK0mD,UACV5uD,GAAE,6BAAwBkI,KAAKH,MAAMwlE,SAASvtE,IAC9C66C,cAAYvoC,QAAgB,uCAAwC,gBAAgBiI,cACpFrR,UAAWs4B,IACP,qBAAsB,YACtB,CAAC,eAAgBt5B,KAAK9G,MAAM+tE,WAEhCve,gBAAe1oD,KAAK9G,MAAM+tE,UAE1B,qBAAGjmE,UAAU,8BAGrB,gBAAC,IAAD,CACIlJ,GAAE,wBAAmBkI,KAAKH,MAAMwlE,SAASvtE,IACzCkd,UAAW,YACXD,UAAU,EACViyC,OAAQhnD,KAAK9G,MAAM8tD,OACnBxqB,IAAKx8B,KAAK2oD,aAETye,EACAD,EACAhf,OAtLbnoD,KAAK9G,MAAQ,CACT4tE,QAAQxB,QAAYzlE,EAAMwlE,SAASE,aAAeE,WAClDJ,SAAUxlE,EAAMwlE,SAChB4B,UAAU,EACVjgB,QAAQ,GAEZhnD,KAAK0mD,UAAY/mD,cAGrBm9B,oBACI98B,KAAK6mE,SAAU,EACf7mE,KAAKynE,YAGsB,gCAAC/mE,EAAkBC,GAC9C,GAAID,EAAU2kE,SAASvtE,KAAO6I,EAAU0kE,SAASvtE,GAAI,CACjD,MAAMytE,EAAY7kE,EAAU2kE,SAASE,UAErC,MAAO,CACHuB,QAAQxB,QAAYC,KAAeE,cAAqB/kE,EAAUqkE,YAAcQ,IAAcE,UAC9FJ,SAAU3kE,EAAU2kE,UAI5B,OAAO,KAGXpoC,mBAAmBC,GACVl9B,KAAK9G,MAAM4tE,QAAU9mE,KAAKH,MAAMwlE,SAASvtE,KAAOolC,EAAUmoC,SAASvtE,IACpEkI,KAAKynE,YAIbhkC,uBACIzjC,KAAK6mE,SAAU,EA0JnBplE,SACI,MAAM,eACFykE,EADE,SAEFb,GACArlE,KAAKH,MAEHwmE,GAAkBC,QAAajB,EAASjlE,MAC9C,IAAIsnE,EACAC,EACAC,EACJ,MAAMC,EAAiB,WAAGz9D,QAAgB,4BAA6B,kBAAhD,YAAqEi7D,EAASjlE,MAAOiS,cAoC5G,IAAIk0D,EAeJ,OAjDKL,IACDwB,EACI,qBACI/0B,aAAYk1B,EACZ7mE,UAAU,wBACVo5B,KAAK,IACL7vB,QAASvK,KAAK8nE,mBAEb9nE,KAAK9G,MAAM4tE,OACR,gBAAC,IAAD,CAAezB,SAAUA,IAEzB,uBAAKrkE,UAAU,sBAK3B2mE,EACI,uBACI3mE,UAAU,6BACVuJ,QAASvK,KAAK8nE,mBAEd,uBAAK9mE,UAAU,sBACX,wBAAMA,UAAW,oBACZqlE,GAEL,wBAAMrlE,UAAU,oBAAoBqkE,EAASE,UAAUwC,eACvD,wBAAM/mE,UAAU,qBAAoBgnE,QAAiB3C,EAAS9uB,SAK1EqxB,EAAc5nE,KAAKioE,uBAInBjoE,KAAKH,MAAMqoE,mBACX3B,EACI,gBAAC,IAAD,CACIlB,SAAUA,EACVa,eAAgBA,EAChBD,YAAajmE,KAAKH,MAAMqoE,iBACxB/B,iBAAkBnmE,KAAK8nE,kBACvB1B,UAAW,wBAEX,qBAAGplE,UAAU,iCAMrB,uBACIA,UACIs4B,IAAW,CACP,qBACA,CAAC,YAAat5B,KAAK9G,MAAM+tE,aAIhCS,EACD,uBAAK1mE,UAAU,uBACV2mE,EACAC,EACArB,K,EA7QAG,E,aAzBjB58D,M,sBAKAq8D,iB,SAKAD,e,SACAgC,iB,SACAnD,W,oBACAmC,iB,oBACA9e,gB,qBACA4e,yB,WC9BJ,SAAe7iE,cAXf,SAAyBjL,GACrB,MAAMoC,GAASmd,QAAUvf,GAEzB,MAAO,CACHgvE,kBAAkBA,QAAiB5sE,GACnCypE,WAAkC,SAAtBzpE,EAAO6pE,WACnB+B,iBAA8C,SAA5B5rE,EAAO6sE,iBACzB/f,iBAAiBggB,OAAgClvE,MAIzD,CAAwCwtE,G,mLCczB,MAAM2B,UAAwB1oE,gBAMzCC,YAAYC,GAAc,QACtBC,MAAMD,GADgB,+CAiCZ,KACNG,KAAK6mE,SACL7mE,KAAK8F,SAAS,CAACghE,QAAQ,OAnCL,2BAuCNnoE,IAChBA,EAAEqH,iBACFhG,KAAK8F,SAAS,CAACwiE,kBAAkB,OAzCX,2BA4CP,KACftoE,KAAK8F,SAAS,CAACwiE,kBAAkB,OA7CX,gCAgDF,KACpBtoE,KAAKH,MAAMyC,QAAQimE,sBAAsBvoE,KAAKH,MAAM8f,WA/CpD3f,KAAK6mE,SAAU,EACf7mE,KAAK9G,MAAQ,CACT4tE,QAAQ,EACRwB,kBAAkB,EAClBE,WAAY,CACRj/D,OAAO,UAAA1J,EAAMwlE,gBAAN,eAAgB97D,QAAS,EAChCC,QAAQ,UAAA3J,EAAMwlE,gBAAN,eAAgB77D,SAAU,IAK9CszB,oBACI98B,KAAK6mE,SAAU,EAGY,gCAAChnE,EAAc3G,GAAc,MACqD,IAA7G,OAAK,UAAA2G,EAAMwlE,gBAAN,eAAgB97D,SAAUrQ,EAAMsvE,WAAWj/D,OAAU1J,EAAMwlE,SAAS77D,SAAWtQ,EAAMsvE,WAAWh/D,OAC1F,CACHg/D,WAAY,CACRj/D,MAAK,UAAE1J,EAAMwlE,gBAAR,aAAE,EAAgB97D,MACvBC,OAAM,UAAE3J,EAAMwlE,gBAAR,aAAE,EAAgB77D,SAI7B,KAGXi6B,uBACIzjC,KAAK6mE,SAAU,EAsBnBplE,SACI,MAAM,SAAC4jE,EAAD,eAAWa,GAAkBlmE,KAAKH,OAClC,OACFinE,GACA9mE,KAAK9G,MAET,QAAiB8N,IAAbq+D,EACA,OAAO,iCAGX,MAAOQ,kBAAmB4C,EAApB,GAAqC3wE,GAAMutE,EAC3CqD,GAAU5C,QAAWhuE,GACrB6wE,EAAaF,GAAkBG,QAAkB9wE,GAAM4wE,EAEvDG,EAAgBxD,EAAS77D,OACzBs/D,EAAezD,EAAS97D,MAE9B,IAAIw/D,EAAkB,IAElBD,EAnGwB,IAoGxBD,EApGwB,MAsGxBE,EAAkB,eAEdF,EAAgBC,IAChBC,GAAmB,2BAKvB7C,IACA6C,GAAmB,oBAGvB,MAAMvnD,EACF,0BACItkB,IAAI,SACJ8D,UAAU,qCACVgoE,gBAAehpE,KAAKH,MAAMopE,eAC1Bt2B,aAAW,0BACXpoC,QAASvK,KAAKuoE,wBAItB,IAAIW,EAAiB,aACjBhD,IACAgD,GAAkB,oBAGtB,MAAMC,EACF,uBAAKnoE,UAAU,gBACX,uBACI0vC,cAAY,aACZ1vC,UAAWkoE,GAEX,uBACI3+D,QAASvK,KAAKmmE,kBAEbd,EAASjlE,OAGjBohB,GAIT,IAAI4nD,EACAC,EAAc,GAGdC,EAA2B,GAC3BC,EAAsB,GACtBC,EAAW,GA4Bf,OA/BiBlE,QAAYD,EAASE,aAIrBE,WACb+D,EAAW,MACPxpE,KAAK9G,MAAMsvE,WAAWh/D,OACtB8/D,EAA2B,CACvB//D,MAAO,QAGXggE,EAAsB,CAClB//D,OAAQ,IACR+iD,SAAU,SAKlBua,IACAsC,EACI,gBAAC,IAAD,CACI1hE,KAAM1H,KAAK9G,MAAMovE,iBACjBmB,iBAAkBzpE,KAAKsoE,iBACvBoB,UAAW,CAACrE,GACZ1lD,OAAQ3f,KAAKH,MAAM8f,SAI3B0pD,EAAc,iBAId,uBACIroE,UAAc,qBAEd,uBACIA,UAAU,eAETmoE,EACAnpE,KAAKH,MAAMopE,gBACZ,uBACIjoE,UAAU,kBACV4H,MAAO2gE,GAEP,uBACIvoE,UAAS,uBAAkBqoE,EAAlB,YAAiCG,GAC1C5gE,MAAO0gE,GAEP,gBAAC,IAAD,CACI/+D,QAASvK,KAAKmmE,iBACdnlE,UAAW+nE,EACXt/D,IAAKk/D,EACLH,WAAYxoE,KAAK9G,MAAMsvE,WACvBnD,SAAUrlE,KAAKH,MAAMwlE,SACrBsE,cAAe3pE,KAAK4pE,YACpBC,WAAY7pE,KAAKH,MAAMopE,eACvBa,2BAA2B,MAKtCV,K,EA3LAf,E,aAnBjB1oD,O,sBAEAq1B,U,oBACAkxB,e,SACA+C,e,SACA3mE,Q,WACIimE,sB,qCAaaF,E,eAEK,CAClBnC,gBAAgB,ICTxB,SAAe/hE,cAhBf,SAAyBjL,GAGrB,MAAO,CACH87C,WAHc1/B,QAAapc,OAOnC,SAA4B9B,GACxB,MAAO,CACHkL,SAAS+B,wBAAmB,CACxBkkE,sBAAqBA,MACtBnxE,MAIX,CAA4DixE,G,wHCW7C,MAAM0B,UAA2BpqE,gBAC5CC,YAAYC,GACRC,MAAMD,GADgB,2BAMNmqE,IAChBhqE,KAAK8F,SAAS,CAACwiE,kBAAkB,EAAM2B,cAAeD,OAPhC,2BAUP,KACfhqE,KAAK8F,SAAS,CAACwiE,kBAAkB,OARjCtoE,KAAK9G,MAAQ,CAACovE,kBAAkB,EAAO2B,cAAe,GAW1DxoE,SACI,MAAM,eACFykE,EADE,WAEFnB,EAFE,UAGF2E,EAHE,UAIFQ,EAJE,OAKFjvD,GACAjb,KAAKH,MAET,GAAI6pE,GAAkC,IAArBA,EAAUlkE,OAAc,CACrC,MAAM2kE,GAAW7E,QAAYoE,EAAU,GAAGnE,WAE1C,GAAI4E,IAAa1E,YAAoB0E,IAAa1E,UAAiBV,EAC/D,OACI,gBAAC,EAAD,CACIM,SAAUqE,EAAU,GACpBT,eAAgBjpE,KAAKH,MAAMopE,eAC3BtpD,OAAQ3f,KAAKH,MAAM8M,KAAK7U,GACxBouE,eAAgBA,SAIzB,GAAkB,IAAdgE,GAAmBlqE,KAAKH,MAAMopE,eACrC,OACI,uBAAKrgE,MAAOA,EAAMwhE,uBAI1B,MAAMC,GAAkBC,QAAcZ,EAAWzuD,GAC3CsvD,EAAY,GAClB,GAAIF,GAAmBA,EAAgB7kE,OAAS,EAC5C,IAAK,IAAI4lB,EAAI,EAAGA,EAAIi/C,EAAgB7kE,OAAQ4lB,IAAK,CAC7C,MAAMi6C,EAAWgF,EAAgBj/C,GACjCm/C,EAAUtrD,KACN,gBAAC,EAAD,CACI/hB,IAAKmoE,EAASvtE,GACdutE,SAAUgF,EAAgBj/C,GAC1BthB,MAAOshB,EACP+6C,iBAAkBnmE,KAAKmmE,iBACvBD,eAAgBA,EAChBc,yBAA0BhnE,KAAKH,MAAMmnE,iCAI9C,GAAIkD,EAAY,EACnB,IAAK,IAAI9+C,EAAI,EAAGA,EAAI8+C,EAAW9+C,IAE3Bm/C,EAAUtrD,KACN,uBACI/hB,IAAG,oBAAekuB,GAClBpqB,UAAU,wDAM1B,OACI,gCACI,uBACI0vC,cAAY,qBACZ1vC,UAAU,gCAETupE,GAEL,gBAAC,IAAD,CACI7iE,KAAM1H,KAAK9G,MAAMovE,iBACjBmB,iBAAkBzpE,KAAKwqE,iBACvBhd,WAAYxtD,KAAK9G,MAAM+wE,cACvBP,UAAWW,EACX1qD,OAAQ3f,KAAKH,MAAM8M,KAAK7U,O,EApFvBiyE,E,aApBjBG,U,sBAKAR,U,qBAEAxD,e,SACAnB,W,SACAkE,e,SACAhuD,O,sBAEA+rD,yB,sBAmGJ,MAAMp+D,EAAQ,CACVwhE,qBAAsB,CAAC5d,UAAW,UC1FtC,GAAeroD,cA1Bf,WACI,MAAMsmE,GAAqBC,UAE3B,OAAO,SAAyBxxE,EAAoBusB,GAChD,MAAM9F,EAAS8F,EAAS9Y,KAAO8Y,EAAS9Y,KAAK7U,GAAK,GAC5C4xE,EAAYe,EAAmBvxE,EAAOymB,GAE5C,IAAIuqD,EAAY,EAShB,OARIzkD,EAAS9Y,KAAKg+D,UAAYllD,EAAS9Y,KAAKg+D,SAASC,MACjDV,GAAazkD,EAAS9Y,KAAKg+D,SAASC,OAAS,IAAIplE,OAC1CigB,EAAS9Y,KAAKk+D,SACrBX,EAAYzkD,EAAS9Y,KAAKk+D,SAASrlE,OAC5BigB,EAAS9Y,KAAKm+D,YACrBZ,EAAYzkD,EAAS9Y,KAAKm+D,UAAUtlE,QAGjC,CACHu/D,WAA4C,UAAhCtsD,QAAUvf,GAAOisE,WAC7BuE,YACAQ,YACAjB,gBAAgBA,QAAe/vE,EAAOusB,EAAS9Y,KAAK7U,IACpDmjB,QAAQC,OAAiBhiB,OAKrC,CAA4C6wE,I,mIC5B7B,MAAMgB,UAAwBprE,gBACzC8B,SACI,MAAM4jE,EAAWrlE,KAAKH,MAAMwlE,SACtB2F,EAAUhrE,KAAKH,MAAMmrE,QAGrBC,EAAY,GAES,KAAvB5F,EAASE,WACT0F,EAAUhsD,KAAKhK,KAAsB,yBAA0B,cAAgBowD,EAASE,UAAUwC,eAGlG1C,EAAS9uB,MACT00B,EAAUhsD,KAAKhK,KAAsB,yBAA0B,SAAWA,KAAuBowD,EAAS9uB,OAG9G,MAAM20B,EAAaD,EAAUpmB,KAAK,MAElC,IAAIsmB,EAAU,KA4Bd,OA1BIA,EADAnrE,KAAKH,MAAMqoE,iBAEP,qBACIlnE,UAAU,wBACVo5B,KAAM4wC,EACN9wC,OAAO,SACPC,IAAI,uBAEJ,wBAAMn5B,UAAU,iCAChB,uBACIsI,IAAK,eACLG,IAAKwL,KAAsBowD,MAMnC,wBAAMrkE,UAAU,yBACZ,wBAAMA,UAAU,iCAChB,uBACIsI,IAAK,eACLG,IAAKwL,KAAsBowD,MAOvC,uBAAKrkE,UAAU,2BACVmqE,EACD,uBAAKnqE,UAAU,gBACX,uBAAKA,UAAU,sBAAsBqkE,EAASjlE,MAC9C,uBAAKY,UAAU,sBAAsBkqE,M,EAnDpCH,E,iBATjB1F,S,WACIjlE,K,sBACAmlE,U,sBACAhvB,K,mCAEJy0B,Q,sBACA9C,iB,kHCOJ,SAAe/jE,cARf,SAAyBjL,GACrB,MAAMoC,GAASmd,QAAUvf,GAEzB,MAAO,CACHgvE,kBAAkBA,QAAiB5sE,MAI3C,CAAwCyvE,I,kUCHzB,MAAMK,UAA4BzrE,gBAA2B,qDACzD,KACXK,KAAKH,MAAMwrE,aAAarrE,KAAKH,MAAMnH,aAGvC+I,SACI,IACI6pE,EACAlQ,EACAmQ,EAHAC,EAAU,EAId,MAAM,SAACnG,EAAD,SAAW3sE,GAAYsH,KAAKH,MAElC,GAAIwlE,EAAU,CACVmG,EAAUnG,EAASmG,QAAUnG,EAASmG,QAAU,EAChD,MAAMC,EAAa,KAAH,OAAQD,EAAQE,QAAQ,GAAxB,MACVvB,GAAWwB,QAAoBtG,EAASxpE,MAC9Cu/D,EAAe,uBAAKp6D,UAAW,aAAeiU,KAAuBk1D,KAErEmB,EACI,gBAAC,WAAD,KACI,gBAAC,IAAD,CACIjG,SAAUA,EACVa,gBAAgB,EAChBD,aAAa,IAEjB,wBAAMjlE,UAAU,4BACC,MAAZwqE,EACG,gBAAC,IAAD,CACI1zE,GAAG,6BACH+N,eAAe,kBAGnB,gBAAC,WAAD,KACI,gBAAC,IAAD,CACI/N,GAAG,yBACH+N,eAAe,iBAEnB,4BAAO4lE,MAOvBD,IACAD,EACI,gBAACK,EAAA,EAAD,CACI5qE,UAAU,0BACV6M,IAAK29D,EACLK,OAAoB,MAAZL,KAMxB,OACI,uBACIhvC,IAAK9jC,EACLwE,IAAKxE,EACLsI,UAAU,kCACV8qE,iBAAgBpzE,GAEhB,uBAAKsI,UAAU,yBACVo6D,GAEL,uBAAKp6D,UAAU,uBACX,uBAAKA,UAAU,8BACX,uBAAKA,UAAU,sBACVsqE,IAGT,2BACI,qBACItqE,UAAU,uBACVuJ,QAASvK,KAAKqrE,cAEd,qBAAGrqE,UAAU,sBAGpBuqE,K,0HA/EAH,E,aALjBC,a,oBACA3yE,S,wBCgBW,MAAMqzE,UAAoBpsE,gBAA2B,qDAOhD7H,IACZkI,KAAKH,MAAMmsE,SAASl0E,MAGxB2J,SACI,MAAMwqE,EAAwB,GA4E9B,GA1EAjsE,KAAKH,MAAM6pE,UAAU5kE,SAASonE,IAC1B,MAAMrwE,EAAOoZ,KAAkBi3D,EAAK3G,WAEpC,IACInK,EADAp6D,EAAY,kCAEhB,GAAInF,IAAS4pE,UAAiBzlE,KAAKH,MAAMklE,WACrC3J,EACI,uBACI9xD,IAAK,eACLtI,UAAU,oBACVyI,KAAKq8D,QAAWoG,EAAKp0E,WAG1B,GAAI+D,IAAS4pE,WAAiB,CACjC,IAAI0G,EAAiB,aAEhBD,EAAK3iE,OAAS2iE,EAAK3iE,MAAQyF,sBAA+Bk9D,EAAK1iE,QAAU0iE,EAAK1iE,OAASwF,sBACxFm9D,GAAkB,SAElBA,GAAkB,UAGtB,IAAIzG,GAAeC,QAAoBuG,EAAKp0E,IACxCmd,KAAiBi3D,EAAK3G,aAAe2G,EAAKrG,oBAC1CH,GAAeI,QAAWoG,EAAKp0E,KAGnCsjE,EACI,uBACIp6D,UAAWmrE,EACXvjE,MAAO,CACHyjD,gBAAiB,OAAF,OAASqZ,EAAT,KACfpZ,eAAgB,gBAK5BtrD,GAAa,eACbo6D,EAAe,uBAAKp6D,UAAW,aAAeiU,KAAuBpZ,KAGzEowE,EAAShtD,KACL,uBACI/hB,IAAKgvE,EAAKp0E,GACVkJ,UAAWA,GAEX,uBAAKA,UAAU,yBACVo6D,GAEL,uBAAKp6D,UAAU,uBACX,uBAAKA,UAAU,8BACX,uBAAKA,UAAU,sBACX,gBAAC,IAAD,CACIqkE,SAAU6G,EACVhG,gBAAgB,EAChBD,aAAa,IAEhBiG,EAAK3G,WAAa,wBAAMvkE,UAAU,oBAAoBkrE,EAAK3G,UAAUwC,eACtE,wBAAM/mE,UAAU,oBAAoBiU,KAAuBi3D,EAAK31B,SAGxE,2BACI,qBACIv1C,UAAU,uBACVuJ,QAASvK,KAAKqrE,aAAa/sB,KAAKt+C,KAAMksE,EAAKp0E,KAE3C,qBAAGkJ,UAAU,4BAQjChB,KAAKH,MAAMusE,mBAAqBpsE,KAAKH,MAAMwsE,uBAAwB,CACnE,MAAMA,EAAyBrsE,KAAKH,MAAMwsE,uBAC1CrsE,KAAKH,MAAMusE,kBAAkBtnE,SAASpM,IAClC,MAAM2sE,EAAWgH,EAAuB3zE,GACpC2sE,GACA4G,EAAShtD,KACL,gBAACmsD,EAAD,CACIluE,IAAKxE,EACLA,SAAUA,EACV2sE,SAAUA,EACVgG,aAAcrrE,KAAKqrE,mBAOvC,OACI,uBACIrqE,UAAU,0BACVw7B,IAAI,aAEHyvC,I,EA9GIF,E,aAPjBhH,W,oBACAiH,S,oBACAtC,U,UACA0C,kB,4BAIiBL,E,eACK,CAClBrC,UAAW,GACX0C,kBAAmB,GACnBC,uBAAwB,KCfhC,SAAeloE,cARf,SAAyBjL,GAGrB,MAAO,CACH6rE,WAAkC,UAHvBtsD,QAAUvf,GAGFisE,cAI3B,CAAwC4G,I,0WCNzB,MAAMO,UAA0B3sE,gBAc3CC,YAAYC,GACRC,MAAMD,GADS,gCA4BMwlE,IACrB,IAAIkH,EAAQC,cAAqBxsE,KAAKysE,SAASp+B,SAC1Ck+B,IACDA,EAAQ/sE,SAASktE,cAAc,UAGnC,MAAMC,EAAcJ,EAAMI,YAAYtH,EAASuH,WAE/C5sE,KAAK8F,SAAS,CACV+mE,QAAyB,aAAhBF,GAA8C,UAAhBA,OArC5B,0BAyCD,KACd3sE,KAAK8F,SAAS,CACV+mE,SAAS,OA3CE,eA+CZ,KACH,GAAI7sE,KAAKysE,SAASp+B,QAAS,CACvB,MAAMk+B,EAAQC,cAAqBxsE,KAAKysE,SAASp+B,SACjDk+B,EAAMO,QACNP,EAAM7vB,YAAc,MAhDxB18C,KAAK9G,MAAQ,CACT2zE,SAAS,GAEb7sE,KAAKysE,SAAW9sE,cAChBK,KAAK+sE,UAAYptE,cAGrBm9B,oBACI98B,KAAKgtE,sBAAsBhtE,KAAKH,MAAMwlE,UAElCrlE,KAAK+sE,UAAU1+B,SACf4+B,IAAET,cAAqBxsE,KAAK+sE,UAAU1+B,UAAU6+B,IAAI,QAASltE,KAAKmtE,iBAI1ElwC,mBAAmBC,GACXl9B,KAAKH,MAAMmrE,UAAY9tC,EAAU8tC,SACjChrE,KAAKgtE,sBAAsBhtE,KAAKH,MAAMwlE,UAGtCrlE,KAAK+sE,UAAU1+B,SACf4+B,IAAET,cAAqBxsE,KAAK+sE,UAAU1+B,UAAU6+B,IAAI,QAASltE,KAAKmtE,iBA+B1E1rE,SACI,IAAKzB,KAAK9G,MAAM2zE,QACZ,OACI,gBAAC,IAAD,CACIxH,SAAUrlE,KAAKH,MAAMwlE,SACrB2F,QAAShrE,KAAKH,MAAMmrE,UAKhC,IAAIzhE,EAAQyF,qBACRxF,EAASwF,sBAOb,OANIiG,SACA1L,EAAQyF,wBACRxF,EAASwF,0BAKT,yBACI9R,IAAK8C,KAAKH,MAAMwlE,SAASvtE,GACzB0kC,IAAKx8B,KAAKysE,SACVW,aAAW,KACXC,SAAS,WACT9jE,MAAOA,EACPC,OAAQA,GAER,0BACIgzB,IAAKx8B,KAAK+sE,UACVtjE,IAAKzJ,KAAKH,MAAMmrE,Y,EAlGfsB,E,YACE,CAKfjH,SAAU/zB,sBAKV05B,QAAS15B,wB,kJCXF,MAAMg8B,UAAoB3tE,gBACrCC,YAAYC,GACRC,MAAMD,GADS,kBA6CT,MACDG,KAAK9G,MAAMq0E,MAAQvtE,KAAKH,MAAMwlE,SAAS9uB,KAAOvnC,iCAGnDi+D,SAAO,CACH11E,OAAO,EACP+rB,IAAKtjB,KAAKH,MAAMmrE,QAChBnvE,KAAM,MACN2xE,SAAU,OACV91E,MAAOsI,KAAKytE,oBACZh2E,QAASuI,KAAK0tE,wBAvDH,6BA2DG/1E,IAClB,IAAIg2E,EAAOh2E,EACW,cAAlBA,EAAKi2E,WACLD,GAAO,IAAIE,eAAgBC,kBAAkBn2E,IAEjDqI,KAAK8F,SAAS,CACV6nE,OACAnvC,SAAS,EACT/mC,SAAS,OAnEE,8BAuEG,KAClBuI,KAAK8F,SAAS,CAAC04B,SAAS,EAAO/mC,SAAS,OArExCuI,KAAK9G,MAAQ,CACTy0E,KAAM,GACNJ,KAAM,GACN/uC,SAAS,EACT/mC,SAAS,GAIjBqlC,oBACI98B,KAAKwR,UAGsB,gCAAC3R,EAAO3G,GACnC,GAAI2G,EAAMmrE,UAAY9xE,EAAM60E,YAAa,CACrC,MAAMC,EAAeC,KAAgDpuE,EAAMwlE,SAASE,WAEpF,OAAKyI,GAAgBnuE,EAAMwlE,SAAS9uB,KAAOvnC,gCAChC,CACH2+D,KAAM,GACNJ,KAAM,GACN/uC,SAAS,EACT/mC,SAAS,EACTs2E,YAAaluE,EAAMmrE,SAIpB,CACH2C,KAAM,GACNJ,KAAMS,EACNxvC,SAAS,EACTuvC,YAAaluE,EAAMmrE,SAG3B,OAAO,KAGX/tC,mBAAmBC,GACXl9B,KAAKH,MAAMmrE,UAAY9tC,EAAU8tC,SACjChrE,KAAKwR,UAkCE,gBAAC6zD,GACZ,OAAOzkC,QAAQqtC,KAAgD5I,EAASE,YAG5E9jE,SACI,GAAIzB,KAAK9G,MAAMslC,QACX,OACI,uBAAKx9B,UAAU,uBACX,gBAAC,IAAD,OAKZ,IAAKhB,KAAK9G,MAAMzB,QACZ,OACI,gBAAC,IAAD,CACI4tE,SAAUrlE,KAAKH,MAAMwlE,SACrB2F,QAAShrE,KAAKH,MAAMmrE,UAKhC,MAAMkD,EAAWD,KAAmCjuE,KAAK9G,MAAMq0E,MAEzDY,EAAcF,KAA6BjuE,KAAK9G,MAAMq0E,KAAMvtE,KAAK9G,MAAMy0E,MAE7E,OACI,uBAAK3sE,UAAU,0BACX,wBAAMA,UAAU,uBAAhB,UACQhB,KAAKH,MAAMwlE,SAASjlE,KAD5B,cACsC8tE,IAEtC,uBAAKltE,UAAU,QACX,uBAAKA,UAAU,2BACVitE,KAAqCjuE,KAAK9G,MAAMy0E,OAErD,wBAAMS,wBAAyB,CAACC,OAAQF,QClH7C,SAASG,GAAa,SAACjJ,EAAD,iBAAW6C,IAG5C,IAAI8C,EACAuD,EASJ,OAZwBlJ,EAASvtE,IAQ7BkzE,GAAUxE,QAAmBnB,EAASvtE,IACtCy2E,EAAalJ,EAASQ,mBAAoB+C,QAAkBvD,EAASvtE,IAAMkzE,IAJ3EA,EAAU3F,EAAS/iC,KACnBisC,EAAalJ,EAAS/iC,MAMrB4lC,EAKD,qBACIlnE,UAAU,gBACVo5B,KAAK,KAEL,uBACIp5B,UAAU,uBACV0vC,cAAY,eACZpnC,IAAK,oBACLG,IAAK8kE,KAZN,uBAAK9kE,IAAK8kE,ID2GzBjB,EAAYkB,UAAY,CACpBnJ,SAAU/zB,sBACV05B,QAAS15B,uBC3Fbg9B,EAAaE,UAAY,CACrBnJ,SAAU/zB,sBACV42B,iBAAkB52B,qB,wDClBtB,MAAMm9B,GAAoBC,UAEpBC,EAAyC9uE,IAC3C,MAAMrH,GAAOinC,kBAAavmC,IAAuB01E,QAAW11E,EAAO2G,EAAM8M,KAAK2B,WACxElM,GAAUq9B,kBAAavmC,IAAuBqiB,QAAcriB,EAAO2G,EAAM8M,KAAKE,cAC9EzM,GAAOq/B,kBAAavmC,GAAuBu1E,EAAkBv1E,EAAO2G,EAAM8M,KAAK2B,SAAS,KAE9F,IAAI49D,EACJ,MAAMz+D,EACF,gBAAC,IAAD,CACI3V,GAAG,oCACH+N,eAAe,oBACfjB,OAAQ,CACJxE,KAAMgC,EAAQhC,QA0B1B,OArBI8rE,EADArsE,EAAMgvE,aAEF,gCACI,sBAAI7tE,UAAU,iCAAiCnB,EAAMs9D,UAErD,wBAAMn8D,UAAU,oCACZ,wBAAMA,UAAU,8CAA8CZ,GAC9D,wBAAMY,UAAU,+BAA+ByM,KAMvD,gCACI,sBAAIzM,UAAU,iCAAiCZ,GAE/C,wBAAMY,UAAU,+BAA+ByM,IAOvD,uBAAKzM,UAAU,4BACX,gBAAC,IAAD,CACIu1C,KAAK,KACLjzB,KAAKwrD,QAAgBjvE,EAAM8M,KAAK2B,QAAS9V,aAArB,EAAqBA,EAAMg3C,qBAC/CxuC,UAAU,+BAEd,uBAAKA,UAAU,oCACVkrE,K,aApDb2C,a,oBACA1R,S,uBAyDJ,SAAe4R,UAAKJ,G,+CC3CpB,MAAMK,EAAgDnvE,IAClD,MAAMovE,EAAwC,WAArBpvE,EAAMqvE,WAA0B,SAAW,MAC9DC,GAAyB1vC,kBAAavmC,IAAD,wBAAwBk2E,QAAqBl2E,UAA7C,aAAwB,EAA6BopC,QAC1FlrC,GAAWunD,oBACV0wB,EAAkBC,IAAuB1hC,eAAS,IAEzDC,gBAAU,KACNz2C,GAASm4E,QAAkB1vE,EAAMwlE,SAASvtE,OAC3C,CAAC+H,EAAMwlE,WACV,MAKM18D,EACF,gBAAC,IAAD,CACI27B,UAAWt1B,wBACX9R,IAAI,aACJqnC,UAAW0qC,EACXzqC,QACI,gBAACJ,EAAA,EAAD,CAAStsC,GAAG,sBACR,gBAAC,IAAD,CACIA,GAAG,0BACH+N,eAAe,YAK3B,0BACI7E,UAAU,+CACVuJ,QAAS1K,EAAM2vE,kBAEf,qBAAGxuE,UAAU,sBAIzB,IAAIyuE,EACA,gBAAC,IAAD,CACI33E,GAAG,gCACH+N,eAAe,sBAGnBwpE,IACAI,EACI,gBAAC,IAAD,CACI33E,GAAG,qDACH+N,eAAe,wBAI3B,MAAM6pE,EACF,gBAAC,IAAD,CACIprC,UAAWt1B,wBACX9R,IAAI,wBACJqnC,UAAW0qC,EACXU,sBAAsB,EACtBhM,OAAQ,IAAM2L,GAAoB,GAClC9qC,QACI,gBAACJ,EAAA,EAAD,CAAStsC,GAAG,6BACP23E,IAIT,qBACIr1C,KAAK,IACLp5B,UAAU,+CACVuJ,QAzDW,MACnBqlE,QAAgBT,GAChBG,GAAoB,KAyDZ,qBAAGtuE,UAAU,6BAKInB,EAAMs9D,SACnC,MAAMsJ,EACF,gBAAC,IAAD,CACIniC,UAAWt1B,wBACX9R,IAAI,WACJqnC,UAAW0qC,EACXzqC,QACI,gBAACJ,EAAA,EAAD,CAAStsC,GAAG,yBACR,gBAAC,IAAD,CACIA,GAAG,8BACH+N,eAAe,eAK3B,qBACIu0B,KAAMv6B,EAAM6oE,QACZ1nE,UAAU,+CACVk5B,OAAO,SACPC,IAAI,sBACJssC,SAAU5mE,EAAMs9D,UAEhB,qBAAGn8D,UAAU,iCAIzB,OACI,uBAAKA,UAAU,6CACTnB,EAAMgwE,eAAiBhwE,EAAMqnE,kBAAoBwI,GACjD7vE,EAAMgwE,eAAiBhwE,EAAMqoE,kBAAoBzB,EAClD5mE,EAAMiwE,WAAannE,I,aAlH5BumE,W,WAAa,SAAW,WACxBW,c,SACAC,U,SACA3S,S,sBACAuL,Q,sBAEAxB,iB,oBACAgB,iB,oBACAsH,iB,qBA+GJR,EAA4Bn1B,aAAe,CACvCg2B,eAAe,EACfX,WAAY,SACZY,WAAW,GAGf,SAAef,UAAKC,G,WC7HpB,MAAMe,EAA0C,IAAmC,IAAlC,KAACpjE,GAAiC,EAAxBqjE,E,kXAAwB,MAC/E,OACI,uBAAKhvE,UAAU,6BACX,gBAAC,EAAD,CACI6tE,cAAc,EACdliE,KAAMA,EACNwwD,SAAU6S,EAAY7S,WAE1B,gBAAC,EAAD,iBACQ6S,EADR,CAEIF,WAAW,EACXZ,WAAW,SACXW,eAAe,O,aAxB3B1S,S,sBAEAuL,Q,sBACAuH,e,SACA/I,iB,oBACAgB,iB,oBACAgI,e,oBACAC,W,oBACAC,W,oBACAZ,iB,qBAoBJ,SAAeT,UAAKgB,GCvBdM,EAA4CxwE,IAC9C,MAAMywE,EACF,gBAAC,IAAD,CACIhsC,UAAWt1B,wBACX9R,IAAI,mBACJqnC,UAAU,SACVC,QACI,gBAACJ,EAAA,EAAD,CAAStsC,GAAG,sBACR,gBAAC,IAAD,CACIA,GAAG,mBACH+N,eAAe,YAK3B,0BACI/N,GAAG,mBACHkJ,UAAU,oCACVuJ,QAAS1K,EAAMswE,YAEf,qBAAGnvE,UAAU,6BAKnBuvE,EACF,gBAAC,IAAD,CACIjsC,UAAWt1B,wBACX9R,IAAI,aACJqnC,UAAU,SACVC,QACI,gBAACJ,EAAA,EAAD,CAAStsC,GAAG,sBACR,gBAAC,IAAD,CACIA,GAAG,eACH+N,eAAe,WAK3B,0BACI/N,GAAG,oBACHkJ,UAAU,oCACVuJ,QAAS1K,EAAMuwE,YAEf,qBAAGpvE,UAAU,8BAIzB,OACI,uBAAKA,UAAU,+BACVsvE,EACD,wBAAMtvE,UAAU,wBACZ,gBAAC,IAAD,CACIlJ,GAAG,mCACH+N,eAAe,qCACfjB,OAAQ,CACJ4wB,MAAQ31B,EAAM2wE,UAAY,EAC1BC,MAAO5wE,EAAM6wE,eAIxBH,I,aAnETC,U,sBACAE,W,sBACAP,W,oBACAC,W,qBAqEJ,SAAerB,UAAKsB,G,oCCxDpB,MAAMM,EAA0C,IAA0D,IAAzD,KAAChkE,EAAD,WAAO+jE,EAAP,UAAmBF,GAAsC,EAAxBR,E,kXAAwB,MAClGY,EAAe,4BACfF,EAAa,IACbE,EACI,gBAAC,EAAD,CACIF,WAAYA,EACZF,UAAWA,EACXL,WAAYH,EAAYG,WACxBC,WAAYJ,EAAYI,cAIpC,MAAM9tE,EACF,gBAAC,EAAD,iBACQ0tE,EADR,CAEIH,cAAeG,EAAY1zD,SAC3B4yD,WAAW,YAEnB,OACI,uBAAKluE,UAAU,6BACVgvE,EAAY1zD,UAAYha,GACvB0tE,EAAY1zD,UACd,gBAAC,EAAD,CACIuyD,cAAc,EACdliE,KAAMA,EACNwwD,SAAU6S,EAAY7S,WAGzByT,GACCZ,EAAY1zD,UAAYha,I,aA7ClCga,S,oBACAk0D,U,sBAEAE,W,sBACAvT,S,sBAEAuL,Q,sBACAuH,e,SACA/I,iB,oBACAgB,iB,oBACAgI,e,oBACAC,W,oBACAC,W,oBACAZ,iB,qBAqCJ,SAAeT,UAAK4B,G,8BC3CL,MAAME,UAAmBlxE,gBACpC8B,SACI,MAAMqvE,EAAkC,GACxC,IAAIC,EAAuC,KAC3C,GAAI/wE,KAAKH,MAAMmxE,iBAAkB,CAC7B,IAAIC,EACAC,EACAC,EAGAD,EADAlxE,KAAKH,MAAMuxE,OAASpxE,KAAKH,MAAMuxE,MAAQC,eAEnC,wBAAMrwE,UAAU,kBACZ,qBAAGuJ,QAASvK,KAAKH,MAAMyxE,eAAiBjY,IAASr5D,KAAKH,MAAMyxE,cAAe,IAAK,CAACC,QAAS,OACtF,qBAAGvwE,UAAU,sBAMrB,wBAAMA,UAAU,gBACZ,qBAAGA,UAAU,qBAIzB8vE,EAAa7xD,KACT,gBAAC,IAAD,CACIqlB,UAAWt1B,wBACX9R,IAAI,UACJqnC,UAAU,MACVC,QACI,gBAACJ,EAAA,EAAD,CAAStsC,GAAG,yBACR,gBAAC,IAAD,CACIA,GAAG,sBACH+N,eAAe,eAK1BqrE,IAKLD,EADAjxE,KAAKH,MAAMuxE,OAASpxE,KAAKH,MAAMuxE,MAAQC,mBAEnC,wBAAMrwE,UAAU,kBACZ,qBAAGuJ,QAASvK,KAAKH,MAAM2xE,iBACnB,qBAAGxwE,UAAU,8BAIlBhB,KAAKH,MAAMuxE,OAASpxE,KAAKH,MAAMuxE,MAAQC,mBAE1C,wBAAMrwE,UAAU,kBACZ,qBAAGuJ,QAASvK,KAAKH,MAAM2xE,iBACnB,qBAAGxwE,UAAU,6BAMrB,wBAAMA,UAAU,gBACZ,qBAAGA,UAAU,6BAIzB8vE,EAAa7xD,KACT,gBAAC,IAAD,CACIqlB,UAAWt1B,wBACX9R,IAAI,YACJqnC,UAAU,MACVC,QACI,gBAACJ,EAAA,EAAD,CAAStsC,GAAG,2BACR,gBAAC,IAAD,CACIA,GAAG,wBACH+N,eAAe,iBAK1BorE,IAKLE,EADAnxE,KAAKH,MAAMuxE,OAASpxE,KAAKH,MAAMuxE,MAAQC,eAEnC,wBAAMrwE,UAAU,kBACZ,qBAAGuJ,QAASvK,KAAKH,MAAM4xE,cAAgBpY,IAASr5D,KAAKH,MAAM4xE,aAAc,IAAK,CAACF,QAAS,OACpF,qBAAGvwE,UAAU,qBAOrB,wBAAMA,UAAU,gBACZ,qBAAGA,UAAU,oBAIzB8vE,EAAa7xD,KACT,gBAAC,IAAD,CACIqlB,UAAWt1B,wBACX9R,IAAI,SACJqnC,UAAU,MACVC,QACI,gBAACJ,EAAA,EAAD,CAAStsC,GAAG,wBACR,gBAAC,IAAD,CACIA,GAAG,qBACH+N,eAAe,cAK1BsrE,IAITJ,EACI,uBAAK/vE,UAAU,gBACV8vE,GAKb,OACI,uBACIpgC,cAAY,kBACZlU,IAAI,cACJx7B,UAAU,iDAET+vE,I,EAlIIF,E,iBAPjBO,M,WACAJ,iB,SACAS,a,SACAH,c,SACAE,gB,uGCZJ,U,6rBCgBA,MAAME,GAAa/xE,QAAW,IAAM,iCAE9BgyE,GAAW3iE,cAEF,MAAM4iE,WAAyBjyE,gBA8C1CC,YAAYC,GACRC,MAAMD,GADS,sBAiBLlB,IACNA,GACAA,EAAEw7C,kBAEN,IAAIriD,EAAKkI,KAAK9G,MAAM24E,WAAa,EAC7B/5E,EAAKkI,KAAKH,MAAM6pE,UAAUlkE,OAAS,IACnC1N,EAAK,GAETkI,KAAK8xE,UAAUh6E,MAzBA,sBA4BL6G,IACNA,GACAA,EAAEw7C,kBAEN,IAAIriD,EAAKkI,KAAK9G,MAAM24E,WAAa,EAC7B/5E,EAAK,IACLA,EAAKkI,KAAKH,MAAM6pE,UAAUlkE,OAAS,GAEvCxF,KAAK8xE,UAAUh6E,MApCA,0BAuCD6G,IACVsW,KAAmBtW,EAAGgzE,GAASI,OAC/B/xE,KAAKowE,aACEn7D,KAAmBtW,EAAGgzE,GAASK,OACtChyE,KAAKmwE,gBA3CM,wBA+CHzvE,IACZlB,SAAS22D,iBAAiB,QAASn2D,KAAKiyE,gBAExCjyE,KAAK8xE,UAAUpxE,EAAU8sD,eAlDV,yBAqDH,KACZhuD,SAAS82D,oBAAoB,QAASt2D,KAAKiyE,gBAEvCjyE,KAAKysE,SAASp+B,SACdruC,KAAKysE,SAASp+B,QAAQ6jC,UAzDX,8BA4DE,KACjB,MAAM51D,EAAWrH,OACbqH,IAAatc,KAAK9G,MAAMojB,UACxBtc,KAAK8F,SAAS,CACVwW,gBAhEO,qBAmGNxkB,IACTkI,KAAK8F,SAAS,CAAC+rE,WAAY/5E,IAE3B,MAAMq6E,EAAc9lE,OAAOmiC,YAAc,IACzCxuC,KAAK8F,SAAS,CAACqsE,gBAEVnyE,KAAK9G,MAAM4tE,OAAOhvE,IACnBkI,KAAK2mE,UAAU7uE,MA1GJ,qBA8GNgS,IACT,MAAMu7D,EAAWrlE,KAAKH,MAAM6pE,UAAU5/D,GAGtC,GAFiBmL,KAAkBowD,EAASE,aAE3BE,YAAmB7kC,QAAQykC,EAASvtE,IAAK,CACtD,IAAIy2E,EAEAA,EADAlJ,EAAS+M,mBACIxJ,QAAkBvD,EAASvtE,KAG3BguE,QAAWT,EAASvtE,IAGrCmd,KACIs5D,GACA,IAAMvuE,KAAK4mE,kBAAkB98D,KAC5BuoE,GAAwBryE,KAAKsyE,oBAAoBxoE,EAAOuoE,UAI7DryE,KAAK4mE,kBAAkB98D,MAlIZ,6BAsIEA,IACjB9J,KAAK8F,UAAUnF,IACJ,CACHmmE,OAAQ,GAAF,MACCnmE,EAAUmmE,QADX,IAEF,CAACh9D,IAAQ,WA3IN,+BAiJG,CAACA,EAAOuoE,KAC1BryE,KAAK8F,UAAUnF,IACJ,CACH4xE,SAAU,GAAF,MACD5xE,EAAU4xE,UADT,IAEJ,CAACzoE,GAAQuoE,WAtJN,6BA4JC,KAChBryE,KAAK8F,SAAS,CAAC0sE,cAAc,OA7Jd,6BAgKC,KAChBxyE,KAAK8F,SAAS,CAAC0sE,cAAc,OAjKd,oBAoKR,CAAC1oE,EAAOsnE,KACfpxE,KAAK8F,UAAUnF,IACJ,CACHywE,MAAO,GAAF,MACEzwE,EAAUywE,OADZ,IAED,CAACtnE,GAAQsnE,WAzKN,wBA+KJ,KACX,IAAIqB,EAAWzyE,KAAK9G,MAAMk4E,MAAMpxE,KAAK9G,MAAM24E,YAC3CY,EAAWlyE,KAAKu1D,IAAI2c,EAAWpB,iBAA0BA,gBACzDrxE,KAAK0yE,SAAS1yE,KAAK9G,MAAM24E,WAAYY,MAlLtB,yBAqLH,KACZ,IAAIA,EAAWzyE,KAAK9G,MAAMk4E,MAAMpxE,KAAK9G,MAAM24E,YAC3CY,EAAWlyE,KAAKw1D,IAAI0c,EAAWpB,iBAA0BA,gBACzDrxE,KAAK0yE,SAAS1yE,KAAK9G,MAAM24E,WAAYY,MAxLtB,2BA2LD,KACdzyE,KAAK0yE,SAAS1yE,KAAK9G,MAAM24E,WAAYR,uBA5LtB,4BA+LA,KACfrxE,KAAKH,MAAM4pE,mBACXzpE,KAAK8F,SAAS,CAACsrE,MAAOn8D,KAAgBo8D,mBAA4BrxE,KAAKH,MAAM6pE,UAAUlkE,aAjMxE,yBAmMF7G,IACTA,EAAEg0E,gBAAkBh0E,EAAEu7B,QACtBl6B,KAAKwvE,sBAnMT,MAAMlzD,EAAWrH,OAEjBjV,KAAK9G,MAAQ,CACTojB,WACAu1D,WAAY7xE,KAAKH,MAAM2tD,WACvB2kB,YAAa,OACbrL,OAAQ7xD,MAAgB,EAAOjV,KAAKH,MAAM6pE,UAAUlkE,QACpD+sE,SAAUt9D,KAAgB,EAAGjV,KAAKH,MAAM6pE,UAAUlkE,QAClDgtE,cAAc,EACdxB,kBAAkB,EAClBI,MAAOn8D,KAAgBo8D,mBAA4BrxE,KAAKH,MAAM6pE,UAAUlkE,SAE5ExF,KAAKysE,SAAW9sE,cAsDpBm9B,oBACIzwB,OAAO8pD,iBAAiB,SAAUn2D,KAAK4yE,oBAG3CnvC,uBACIp3B,OAAOiqD,oBAAoB,SAAUt2D,KAAK4yE,oBAG9C31C,mBAAmBC,IACS,IAApBl9B,KAAKH,MAAM6H,OAAoC,IAAnBw1B,EAAUx1B,KACtC1H,KAAK6yE,aAAa7yE,KAAKH,QACI,IAApBG,KAAKH,MAAM6H,OAAqC,IAAnBw1B,EAAUx1B,MAC9C1H,KAAK8yE,gBAIkB,gCAACjzE,EAAO3G,GACnC,MAAM65E,EAAe,GAWrB,OAVIlzE,EAAM6pE,UAAUxwE,EAAM24E,aAAehyE,EAAM6pE,UAAUxwE,EAAM24E,YAAYtM,YAAcE,SACrFsN,EAAa/B,kBAAmB,EAEhC+B,EAAa/B,kBAAmB,EAEhCnxE,EAAM6pE,UAAUlkE,SAAWtM,EAAM85E,qBACjCD,EAAajM,OAAS7xD,MAAgB,EAAOpV,EAAM6pE,UAAUlkE,QAC7DutE,EAAaR,SAAWt9D,KAAgB,EAAGpV,EAAM6pE,UAAUlkE,QAC3DutE,EAAaC,mBAAqBnzE,EAAM6pE,UAAUlkE,QAE/CF,OAAOC,KAAKwtE,GAAcvtE,OAASutE,EAAe,KAyG7DtxE,SAAS,MACL,GAAIzB,KAAKH,MAAM6pE,UAAUlkE,OAAS,GAAKxF,KAAKH,MAAM6pE,UAAUlkE,OAAS,EAAIxF,KAAK9G,MAAM24E,WAChF,OAAO,KAGX,MAAMxM,EAAWrlE,KAAKH,MAAM6pE,UAAU1pE,KAAK9G,MAAM24E,YAC3C5B,GAAkB5K,EAAS/iC,KAC3Bw7B,EAAWuH,EAASjlE,MAAQilE,EAAS/iC,KACrC6nC,EAAWl1D,KAAkBowD,EAASE,WACtCyF,EAAU3F,EAAS/iC,OAAQwjC,QAAWT,EAASvtE,IAC/Cm7E,EAAkB5N,EAAS/iC,OAAQkkC,QAAmBnB,EAASvtE,IAC/Do4E,GAAkB7K,EAASvtE,GACjC,IAEIg/C,EAEAo8B,EAJAhrE,EAAkB,6CAGlBirE,EAAkB,GAGtB,GAAInzE,KAAK9G,MAAM4tE,OAAO9mE,KAAK9G,MAAM24E,YACzB1H,IAAa1E,YAAmB0E,IAAa1E,SAC7C3uB,EACI,gBAACw3B,EAAD,CACIjJ,SAAUA,EACV6C,iBAAkBloE,KAAKH,MAAMqoE,mBAG9BiC,IAAa1E,YAAmB0E,IAAa1E,WACpD3uB,EACI,gBAACw1B,EAAD,CACIjH,SAAUA,EACV2F,QAASA,IAGVb,IAAa1E,UACpB0N,EAAkB,0CAClBr8B,EACI,uBACI91C,UAAU,iCACVuJ,QAASvK,KAAKozE,eAEd,gBAAC,WAAD,CAAgBC,SAAU,MACtB,gBAAC3B,GAAD,CACIrM,SAAUA,EACV2F,QAASA,EACToG,MAAOpxE,KAAK9G,MAAMk4E,MAAMpxE,KAAK9G,MAAM24E,YACnCuB,cAAepzE,KAAKozE,kBAKpCF,EACI,gBAAC,EAAD,CACI9B,MAAOpxE,KAAK9G,MAAMk4E,MAAMpxE,KAAK9G,MAAM24E,YACnCb,iBAAkBhxE,KAAK9G,MAAM83E,iBAC7BS,aAAczxE,KAAKyxE,aACnBH,cAAetxE,KAAKsxE,cACpBE,gBAAiBxxE,KAAKwxE,mBAGvBlE,EAAYgG,SAASjO,IAC5Bn9D,GAAmB,cACnB4uC,EACI,gBAACw2B,EAAD,CACIjI,SAAUA,EACV2F,QAASA,EACThqE,UAAU,sCAIlB81C,EACI,gBAAC,IAAD,CACIuuB,SAAUA,EACV2F,QAASA,QAIlB,CAEH,MAAMxsC,EAAUvpB,KAAsB,qBAAsB,WACtDs9D,EAAWhyE,KAAKgzE,MAAMvzE,KAAK9G,MAAMq5E,SAASvyE,KAAK9G,MAAM24E,aAE3D/6B,EACI,gBAAC,IAAD,CACItY,QAASA,EACT+zC,SAAUA,IAKtB,IAAK,MAAMpH,KAAWnrE,KAAKH,MAAM2zE,4BAC7B,GAAIrI,EAAQsI,SAASpO,EAAUrlE,KAAKH,MAAM8M,MAAO,CAC7CmqC,EACI,gBAACq0B,EAAQhuE,UAAT,CACIkoE,SAAUA,EACV14D,KAAM3M,KAAKH,MAAM8M,KACjB88D,iBAAkBzpE,KAAKH,MAAM4pE,mBAGrC,MAIR,OACI,gBAACxhE,EAAA,EAAD,CACIP,KAAM1H,KAAKH,MAAM6H,KACjBS,OAAQnI,KAAKwvE,iBACbxuE,UAAU,iCACVkH,gBAAiBA,EACjBs8D,WAAW,EACXn8D,UAAU,EACVC,KAAK,SACLM,MAAO,CAAC,eAAgB,GACxBL,kBAAgB,uBAEhB,gBAACN,EAAA,OAAD,CAAYjH,UAAU,4BAClB,uBACIA,UAAW,uBACXuJ,QAASvK,KAAKwvE,kBAEd,uBACIxuE,UAAU,+BACVo5C,aAAcp6C,KAAK0zE,kBACnBr5B,aAAcr6C,KAAK2zE,kBACnBppE,QAAU5L,GAAMA,EAAEw7C,mBAElB,gBAAClyC,EAAA,QAAD,CACIa,eAAe,MACfhR,GAAG,sBACHkJ,UAAU,6BAEV,gBAAC,EAAD,CACIsb,SAAUtc,KAAK9G,MAAMojB,SACrB3P,KAAM3M,KAAKH,MAAM8M,KACjBsjE,eAAgBA,EAChBO,UAAWxwE,KAAK9G,MAAM24E,WACtBnB,WAAU,UAAE1wE,KAAKH,MAAM6pE,iBAAb,aAAE,EAAsBlkE,OAClC23D,SAAUW,EACV4K,QAASuK,EACT5N,SAAUA,EACV6B,iBAAkBlnE,KAAKH,MAAMqnE,mBAAoB,EACjDgB,iBAAkBloE,KAAKH,MAAMqoE,mBAAoB,EACjDgI,eAAgBA,EAChBC,WAAYnwE,KAAKmwE,WACjBC,WAAYpwE,KAAKowE,WACjBZ,iBAAkBxvE,KAAKwvE,mBAE1B0D,GAEL,uBACIlyE,UAAW,8BAAgCmyE,EAC3C5oE,QAASvK,KAAKozE,eAEbt8B,GAEH92C,KAAK9G,MAAMojB,UACT,gBAAC,EAAD,CACI3P,KAAM3M,KAAKH,MAAM8M,KACjBsjE,eAAgBA,EAChB9S,SAAUW,EACV4K,QAASuK,EACT5N,SAAUA,EACV6B,iBAAkBlnE,KAAKH,MAAMqnE,mBAAoB,EACjDgB,iBAAkBloE,KAAKH,MAAMqoE,mBAAoB,EACjDgI,eAAgBA,EAChBC,WAAYnwE,KAAKmwE,WACjBC,WAAYpwE,KAAKowE,WACjBZ,iBAAkBxvE,KAAKwvE,wB,GA7ZtCoC,G,YACE,CAKfjyD,OAAQ2xB,WAKR3kC,KAAM2kC,WAKN5pC,KAAM4pC,oBAKNm4B,iBAAkBn4B,oBAKlBo4B,UAAWp4B,YAAkBA,YAAkBixB,WAK/C/U,WAAYlc,WAEZ42B,iBAAkB52B,SAClB41B,iBAAkB51B,SAClBkiC,4BAA6BliC,YAAkBA,c,GAnClCsgC,G,eAsCK,CAClBlqE,MAAM,EACNgiE,UAAW,GACXlc,WAAY,EACZgmB,4BAA6B,GAC7B7mE,KAAM,KC7Cd,UAAexI,cAXf,SAAyBjL,EAAOusB,GAC5B,MAAMnqB,GAASmd,QAAUvf,GAEzB,MAAO,CACHgvE,kBAAkBA,QAAiB5sE,GACnC4rE,iBAA8C,SAA5B5rE,EAAO6sE,iBACzBqL,4BAA6Bt6E,EAAM2iB,QAAQC,WAAWiwD,YACtDp/D,KAAM8Y,EAAS9Y,OAAQqU,QAAQ9nB,EAAOusB,EAAS9F,WAIvD,CAAwCiyD,K,g2BCVjC,SAASgC,EAAWv5E,EAAM+F,EAAMyP,EAAWo6C,EAAQvxD,GACtD,OAAQtB,IACJA,EAAS,CAACyE,KAAM4pE,4BAEToO,SACEh7E,sBACLi7E,IAAIj7E,gBAAmB,CAACwF,OAAQ,SAAS01E,SAKzC5zE,MAAM,aAAc0P,GACpB1P,MAAM,aAAczH,GACpBs7E,OAAO,QAAS35E,EAAM+F,GACtB6zE,OAAO,qBAIZ,SAASC,EAAoB75E,EAAM+F,EAAMyP,EAAWo6C,EAAQvxD,GAAU,IAACd,EAAD,IAAM0O,IAC/E,MAAO,CAAClP,EAAUE,KACd,GAAIM,EAAK,CACL,IAAI+G,EAEAA,EADA2H,GAAOA,EAAIhI,MAAQgI,EAAIhI,KAAKxG,GACxBwO,EAAIhI,KACc,IAAf1G,EAAIia,QAAiBja,EAAIia,OAG5B,CAACjT,QAASqW,KAAsB,+BAAgC,0DAA4D,KAAOrd,EAAIia,OAAS,KAFhJ,CAACjT,QAASqW,KAAsB,4BAA6B,+CAKrEk/D,QAAuBv8E,EAAKR,EAAUE,GAEtC,MAAM88E,EAAU,CACZv4E,KAAM4pE,0BACN4O,UAAW,CAAC37E,GACZmX,YACAo6C,SACAvyD,MAAOE,GAIX,OADAR,GAASgX,QAAa,CAACgmE,GAASE,QAAkB18E,MAC3C,CAACF,MAAOiH,GAEnB,MAAMhH,EAAO2O,EAAIhI,KAAKi2E,WAAW1qE,KAAI,CAACw7D,EAAUv7D,IAC5C,OACOu7D,GADP,IAEI3sE,SAAU4N,EAAIhI,KAAKk2E,WAAW1qE,OAgBtC,OAZA1S,GAASgX,QAAa,CAClB,CACIvS,KAAM4pE,2BACN9tE,OACAkY,YACAo6C,UAEJ,CACIpuD,KAAM4pE,8BAIP,CAAC9tE,KAAM2O,EAAIhI,O,m7BC1C1B,MAAMm2E,GAAUC,oBAAe,CAC3BC,QAAS,CACL78E,IAAIkc,OAAE,uBACNnO,eAAgB,iGAEpB+uE,WAAY,CACR98E,IAAIkc,OAAE,0BACNnO,eAAgB,0DAEpBgvE,UAAW,CACP/8E,IAAIkc,OAAE,yBACNnO,eAAgB,wDAEpBivE,eAAgB,CACZh9E,IAAIkc,OAAE,8BACNnO,eAAgB,8CAEpBkvE,cAAe,CACXj9E,IAAIkc,OAAE,6BACNnO,eAAgB,+CAEpBmvE,OAAQ,CACJl9E,IAAIkc,OAAE,sBACNnO,eAAgB,oBAEpB+tE,WAAY,CACR97E,IAAIkc,OAAE,4BACNnO,eAAgB,kBAMlBovE,EAAe,CACjB/yB,KAAM,UACN+gB,MAAO,EACPD,OAAQ,OACRpc,IAAK,QAGF,MAAMsuB,UAAmB5hB,gBA4F5B1zD,YAAYC,GACRC,MAAMD,GADS,4BA2BC,CAAClI,EAAMkY,EAAWslE,KAClC,GAAIx9E,EAAM,CACNqI,KAAKH,MAAMu1E,aAAaz9E,EAAK48E,WAAY58E,EAAK68E,WAAY3kE,EAAWslE,GAErE,MAAMrlE,EAAWxK,OAAOuX,OAAO,GAAI7c,KAAK9G,MAAM4W,UAC9C,IAAK,IAAIulE,EAAI,EAAGA,EAAI19E,EAAK68E,WAAWhvE,OAAQ6vE,IACxClyD,QAAQC,eAAetT,EAAUnY,EAAK68E,WAAWa,IAErDr1E,KAAK8F,SAAS,CAACgK,iBAnCJ,yBAuCF,CAAClY,EAAKc,EAAUmX,EAAWslE,KACxCn1E,KAAKH,MAAMy1E,cAAc19E,EAAKc,EAAUmX,EAAWslE,MAxCpC,4BA2CEvK,IAEjB5qE,KAAKH,MAAMy1E,cAAc,MACzBt1E,KAAKu1E,YAAY3K,MA9CF,yCAiDeA,IAE9B5qE,KAAKH,MAAMy1E,cAAc,MAEzB,IAAIE,EAAcnhC,MAAMC,KAAKs2B,GAAOzJ,MAAK,CAAC3sB,EAAGC,IAAMD,EAAEp0C,KAAKq1E,cAAchhC,EAAEr0C,KAAMJ,KAAKH,MAAMob,OAAQ,CAACy6D,SAAS,MAE7G,MAAMC,EAAkB31E,KAAKH,MAAM+1E,2BACnC,IAAK,MAAMC,KAAKF,EAAiB,CAC7B,MAAMlnE,EAASonE,EAAE75D,KAAKw5D,EAAax1E,KAAK81E,mBAGpCrnE,EAAO7P,SACPoB,KAAKH,MAAMy1E,cAAc7mE,EAAO7P,SAGpC42E,EAAc/mE,EAAOm8D,MAGrB4K,GACAx1E,KAAKu1E,YAAYC,MApEN,sBAwEJA,IACX,MAAM,UAAC3lE,EAAD,OAAYo6C,GAAUjqD,KAAKH,MAE3Bk2E,EAAmB/mE,sBAA6BhP,KAAKH,MAAMqqE,UACjE,IAAI8L,EAAa,EAGjB,MAAMC,EAAgB,GAChBC,EAAY,GACZ7B,EAAY,GAElB,IAAK,IAAIjpD,EAAI,EAAGA,EAAIoqD,EAAYhwE,QAAUwwE,EAAaD,EAAkB3qD,IAAK,CAC1E,GAAIoqD,EAAYpqD,GAAGmrB,KAAOv2C,KAAKH,MAAMs2E,YAAa,CAC9CF,EAAch3D,KAAKu2D,EAAYpqD,IAC/B,SAEwB,IAAxBoqD,EAAYpqD,GAAGmrB,MACf2/B,EAAUj3D,KAAKu2D,EAAYpqD,IAI/B,MAAM1yB,GAAW09E,UAEXvC,EAAU7zE,KAAKH,MAAMyC,QAAQsxE,WAC/B4B,EAAYpqD,GACZoqD,EAAYpqD,GAAGhrB,KACfyP,EACAo6C,EACAvxD,GAGJm7E,EAAQwC,GAAG,YAAaC,IACpBt2E,KAAKH,MAAM02E,iBAAiB,CACxB79E,WACA0H,KAAMo1E,EAAYpqD,GAAGhrB,KACrBorE,QAAS8K,EAAc9K,QACvB3vE,KAAM25E,EAAYpqD,GAAGvvB,UAI7Bg4E,EAAQ2C,KAAI,CAAC5+E,EAAK0O,KACd,MAAM,MAAC5O,EAAD,KAAQC,GAAQqI,KAAKH,MAAMyC,QAAQ4xE,oBACrCsB,EAAYpqD,GACZoqD,EAAYpqD,GAAGhrB,KACfyP,EACAo6C,EACAvxD,EACA,CAACd,MAAK0O,QAGN5O,EACAsI,KAAKy2E,eAAe/+E,EAAOgB,EAAUmX,EAAWo6C,GACzCtyD,GACPqI,KAAK02E,kBAAkB/+E,EAAMkY,EAAWo6C,MAIhDjqD,KAAK8F,SAAS,CAACgK,SAAU,OAAI9P,KAAK9G,MAAM4W,UAAjB,IAA2B,CAACpX,GAAWm7E,MAC9DQ,EAAUp1D,KAAKvmB,GAEfs9E,GAAc,EAGlBh2E,KAAKH,MAAM82E,cAActC,EAAWxkE,GAEpC,MAAM,cAACjK,GAAiB5F,KAAKH,MAAM8F,KAC7BgB,EAAS,GAKf,GAJI6uE,EAAYhwE,OAASuwE,GACrBpvE,EAAOsY,KAAKrZ,EAAc6uE,EAAQE,QAAS,CAACn/C,MAAOxmB,yBAGnDinE,EAAczwE,OAAS,EAAG,CAC1B,IAAIoxE,EAAoBX,EAAcpsE,KAAKxP,GAASA,EAAK+F,OAAMykD,KAAK,MAEpEl+C,EAAOsY,KAAKrZ,EAAc6uE,EAAQG,WAAY,CAAC7e,IAAM/1D,KAAKH,MAAMs2E,YAAc,QAAUrL,UAAW8L,UAC5FX,EAAczwE,OAAS,GAC9BmB,EAAOsY,KAAKrZ,EAAc6uE,EAAQI,UAAW,CAAC9e,IAAM/1D,KAAKH,MAAMs2E,YAAc,QAAUhZ,SAAU8Y,EAAc,GAAG71E,QAGtH,GAAI81E,EAAU1wE,OAAS,EAAG,CACtB,IAAIqxE,EAAgBX,EAAUrsE,KAAKxP,GAASA,EAAK+F,OAAMykD,KAAK,MAE5Dl+C,EAAOsY,KAAKrZ,EAAc6uE,EAAQK,eAAgB,CAAChK,UAAW+L,UACvDX,EAAU1wE,OAAS,GAC1BmB,EAAOsY,KAAKrZ,EAAc6uE,EAAQM,cAAe,CAAC5X,SAAU+Y,EAAU,GAAG91E,QAGzEuG,EAAOnB,OAAS,GAChBxF,KAAKH,MAAMy1E,cAAc3uE,EAAOk+C,KAAK,UAhK1B,uBAoKHlmD,IACRA,EAAEu7B,OAAO0wC,MAAMplE,OAAS,IACxBxF,KAAK82E,+BAA+Bn4E,EAAEu7B,OAAO0wC,QAE7CmM,QAAep4E,EAAEu7B,SAGrBl6B,KAAKH,MAAMm3E,wBA3KI,qBA8KLr4E,IACV,IAAKqB,KAAKH,MAAMo3E,eAEZ,YADAj3E,KAAKH,MAAMy1E,eAAclrE,QAAgB,uBAAwB,mCAIrEpK,KAAKH,MAAMy1E,cAAc,MAEzB,MAAMjuE,EAAQ1I,EAAEu4E,aAAa7vE,OAAS,GAChC8vE,EAAex4E,EAAEu4E,aAAatM,MAC9BA,EAAQ,GACdv2B,MAAMC,KAAK6iC,GAAcryE,SAAQ,CAACzK,EAAMyP,KACpC,MAAMyxC,EAAOl0C,EAAMyC,GACfyxC,GAAQA,EAAK67B,mBAAiD,OAA5B77B,EAAK67B,oBAA+B77B,EAAK67B,mBAAmBC,cAGlGzM,EAAM3rD,KAAK5kB,MAGf,MAAMi9E,EAAQ34E,EAAEu4E,aAAaI,MAC7B,GAAIA,EAAO,CACP,IAAIC,QAAU54E,EAAEu4E,cACZ,OAIJ,GAAII,EAAMrmD,WAAaqmD,EAAMrmD,SAAS,SAClC,OAIJ,GAAIqmD,EAAME,WAAaF,EAAME,SAAS,SAClC,OAIa,IAAjB5M,EAAMplE,QAKNolE,EAAMplE,QACNxF,KAAK82E,+BAA+BlM,GAGxC5qE,KAAKH,MAAMm3E,sBARPh3E,KAAKH,MAAMy1E,eAAclrE,QAAgB,0BAA2B,qEAnNzD,6BA8NE,CAACqtE,EAAmBC,KACrC,MAAMC,EAAO33E,KAEPwkC,EAAUhlC,SAASo4E,cAAcF,GAEjCG,EAAc,IAAItwB,KAAc,KAClC/iB,EAAQhB,UAAUze,IAAI,aAG1B,IAAI+yD,EAAkB,GAElBA,EADA93E,KAAKH,MAAMo3E,eACO,CACdc,MAAMp5E,GACF,IAAIisE,EAAQjsE,EAAEq5E,OAAOd,eAChBK,QAAU3M,KAAUqN,QAAerN,IACpCpmC,EAAQhB,UAAUG,OAAO,WAGjCu0C,MAAMv5E,GACF,IAAIisE,EAAQjsE,EAAEq5E,OAAOd,eAEhBK,QAAU3M,KAAUqN,QAAerN,IACpCpmC,EAAQhB,UAAUze,IAAI,UAG1B8yD,EAAY7vB,UAEhBmwB,OACIN,EAAY9vB,UA/VR,MAiWRqwB,KAAKz5E,GACD6lC,EAAQhB,UAAUze,IAAI,UACtB8yD,EAAY7vB,SAEZ2vB,EAAKU,WAAW15E,EAAEq5E,UAIR,CACdI,KAAKz5E,GACDg5E,EAAKU,WAAW15E,EAAEq5E,UAK9Bh4E,KAAKs4E,qBCtaE,SAAkB9sE,EAAenO,GAC5C,MAAMk7E,EAAO,OAEPC,EAAW,CACbT,MAAOQ,EACPL,MAAOK,EACPJ,KAAMI,EACNH,KAAMG,GAGJE,EAAWnzE,OAAOuX,OAAO27D,EAAUn7E,GACnC+2C,EAAO50C,SAASo4E,cAAcpsE,GAEpC,IAAK4oC,EACD,OAAOmkC,EAGX,IAAIG,GAAQ,EACRC,GAAS,EAEb,MAAMC,EAAarwD,IACf,GAAImwD,EAEA,YADAC,GAAS,GAIbD,GAAQ,EACR,MAAMG,EAAa,IAAIC,YAAY,iBAAkB,CAACd,OAAQzvD,IAC9D6rB,EAAK2kC,cAAcF,GAEnBtwD,EAAMviB,kBAGJgzE,EAAazwD,IAMf,GALIowD,EACAA,GAAS,EACFD,IACPA,GAAQ,IAEPA,IAAUC,EAAQ,CACnB,MAAMM,EAAa,IAAIH,YAAY,iBAAkB,CAACd,OAAQzvD,IAC9D6rB,EAAK2kC,cAAcE,GAEvB1wD,EAAMviB,kBAGJkzE,EAAY3wD,IACd,MAAM4wD,EAAY,IAAIL,YAAY,gBAAiB,CAACd,OAAQzvD,IAC5D6rB,EAAK2kC,cAAcI,GACnB5wD,EAAMviB,kBAGJoyE,EAAQ7vD,IAMV,GALIowD,EACAA,GAAS,EACFD,IACPA,GAAQ,IAEPA,IAAUC,EAAQ,CACnB,MAAMS,EAAY,IAAIN,YAAY,gBAAiB,CAACd,OAAQzvD,IAC5D6rB,EAAK2kC,cAAcK,GAEvB7wD,EAAMviB,kBAyBV,OAtBAouC,EAAK+hB,iBAAiB,YAAayiB,GACnCxkC,EAAK+hB,iBAAiB,YAAa6iB,GACnC5kC,EAAK+hB,iBAAiB,WAAY+iB,GAClC9kC,EAAK+hB,iBAAiB,OAAQiiB,GAE9BhkC,EAAK+hB,iBAAiB,iBAAkBsiB,EAASV,OACjD3jC,EAAK+hB,iBAAiB,iBAAkBsiB,EAASP,OACjD9jC,EAAK+hB,iBAAiB,gBAAiBsiB,EAASN,MAChD/jC,EAAK+hB,iBAAiB,gBAAiBsiB,EAASL,MAE3B,KACjBhkC,EAAKkiB,oBAAoB,YAAasiB,GACtCxkC,EAAKkiB,oBAAoB,YAAa0iB,GACtC5kC,EAAKkiB,oBAAoB,WAAY4iB,GACrC9kC,EAAKkiB,oBAAoB,OAAQ8hB,GAEjChkC,EAAKkiB,oBAAoB,iBAAkBmiB,EAASV,OACpD3jC,EAAKkiB,oBAAoB,iBAAkBmiB,EAASP,OACpD9jC,EAAKkiB,oBAAoB,gBAAiBmiB,EAASN,MACnD/jC,EAAKkiB,oBAAoB,gBAAiBmiB,EAASL,ODkVvBiB,CAAS5B,EAAmBK,MA3QzC,8BA8QG,CAACwB,EAAeC,IAAgBD,GAAiBA,EAAc9B,SAAS+B,KA9Q3E,sBAgRJ56E,IACX,MAAM,cAACiH,GAAiB5F,KAAKH,MAAM8F,KAEnC,IAAKhH,EAAE66E,gBAAkB76E,EAAE66E,cAAcnyE,QAASoyE,QAAS96E,EAAE66E,eACzD,OAGJ,MAAMt/C,EAASl6B,KAAKH,MAAM65E,YACpB/nC,EAAW66B,cAAqBtyC,GACtC,IAAKl6B,KAAK25E,oBAAoBhoC,EAAUhzC,EAAEu7B,QACtC,OAGJl6B,KAAKH,MAAMy1E,cAAc,MAEzB,MAAMjuE,EAAQ,GACd,IAAK,IAAI+jB,EAAI,EAAGA,EAAIzsB,EAAE66E,cAAcnyE,MAAM7B,OAAQ4lB,IAAK,CACnD,MAAMmwB,EAAO58C,EAAE66E,cAAcnyE,MAAM+jB,GAEjB,SAAdmwB,EAAKq+B,MAITvyE,EAAM4X,KAAKs8B,GAGf,GAAIl0C,GAASA,EAAM7B,OAAS,EAAG,CAC3B,IAAKxF,KAAKH,MAAMo3E,eAEZ,YADAj3E,KAAKH,MAAMy1E,eAAclrE,QAAgB,uBAAwB,mCAIrEzL,EAAEqH,iBAEF,MAAM4kE,EAAQ,GAEd,IAAK,IAAIx/C,EAAI,EAAGA,EAAI/jB,EAAM7B,OAAQ4lB,IAAK,CACnC,MAAM/wB,EAAOgN,EAAM+jB,GAAGyuD,YACtB,IAAKx/E,EACD,SAGJ,IAAIgzC,EAAI,IAAIv/B,KACZ,IAAIgsE,EAAOzsC,EAAE0sC,WACbD,EAAOA,EAAO,GAAP,WAAgBA,GAAhB,UAA4BA,GAEnC,IAAI39B,EAAS9O,EAAE2sC,aACf79B,EAASA,EAAS,GAAT,WAAkBA,GAAlB,UAAgCA,GAEzC,IAAI89B,EAAM,GACN5/E,EAAK+F,KACD/F,EAAK+F,KAAK6wB,SAAS,OACnBgpD,EAAM5/E,EAAK+F,KAAKmU,OAAOla,EAAK+F,KAAK85E,YAAY,OAE1C7yE,EAAM+jB,GAAGvvB,KAAKo1B,SAAS,OAC9BgpD,EAAM,IAAM5yE,EAAM+jB,GAAGvvB,KAAKgyB,MAAM,KAAK,GAAGxb,eAG5C,MAAMjS,EAAOwF,EAAc6uE,EAAQO,QAAU3nC,EAAE1T,cAAgB,KAAO0T,EAAE8sC,WAAa,GAAK,IAAM9sC,EAAE+sC,UAAY,IAAMN,EAAO,IAAM39B,EAAS89B,EAEpII,EAAU,IAAIC,KAAK,CAACjgF,GAAO,CAACwB,KAAMxB,EAAKwB,OAC7Cw+E,EAAQj6E,KAAOA,EACfwqE,EAAM3rD,KAAKo7D,GAGXzP,EAAMplE,OAAS,IACfxF,KAAK82E,+BAA+BlM,GACpC5qE,KAAKH,MAAMm3E,0BAnVJ,oBAwVNr4E,IACT,IAAI47E,QAAiB57E,KAAM67E,QAAa77E,EAAGqQ,iBAAuB,CAG9D,GAFArQ,EAAEqH,kBAEGhG,KAAKH,MAAMo3E,eAEZ,YADAj3E,KAAKH,MAAMy1E,eAAclrE,QAAgB,uBAAwB,mCAGrE,MAAMqwE,EAAsC,SAAxBz6E,KAAKH,MAAM66E,UAAqD,iBAA9Bl7E,SAASm7E,cAAc7iF,GACvE8iF,EAAyC,YAAxB56E,KAAKH,MAAM66E,UAAwD,kBAA9Bl7E,SAASm7E,cAAc7iF,IAC/E2iF,GAAeG,KACf56E,KAAK66E,UAAUxsC,QAAQp0B,QACvBja,KAAK66E,UAAUxsC,QAAQysC,aApWhB,uBAyWHpiF,IACZ,MAAMoX,EAAWxK,OAAOuX,OAAO,GAAI7c,KAAK9G,MAAM4W,UACxC+jE,EAAU/jE,EAASpX,GAErBm7E,IACAA,EAAQkH,QAER53D,QAAQC,eAAetT,EAAUpX,GACjCsH,KAAK8F,SAAS,CAACgK,iBAjXJ,iCAqXOnR,IAClBA,GACAA,EAAEqH,iBAGN,MAAM,cAACsvE,GAAiBt1E,KAAKH,OACvB,cAAC+F,GAAiB5F,KAAKH,MAAM8F,KAEnC2vE,EAAc1vE,EAAc6uE,EAAQE,QAAS,CAACn/C,MAAOxmB,4BA7XtC,qBAgYL1C,IACVtM,KAAK8F,SAAS,CAACk1E,SAAU1uE,OAjYV,kCAoYQ3N,IACEqQ,sBAA6BhP,KAAKH,MAAMqqE,UAC1C,EACflqE,KAAKH,MAAM0K,SACXvK,KAAKH,MAAM0K,UAGfvK,KAAKi7E,uBAAuBt8E,GAEhCqB,KAAK8F,SAAS,CAACk1E,UAAU,OA7YV,6BAgZGr8E,IAClBA,EAAEqH,iBACFrH,EAAEw7C,kBACFn6C,KAAK66E,UAAUxsC,QAAQysC,WAjZvB96E,KAAK9G,MAAQ,CACT4W,SAAU,GACVkrE,UAAU,GAEdh7E,KAAK66E,UAAYl7E,cAGrBm9B,oBACgC,SAAxB98B,KAAKH,MAAM66E,SACX16E,KAAKk7E,mBAAmB,YAAa,wBACN,YAAxBl7E,KAAKH,MAAM66E,UAClB16E,KAAKk7E,mBAAmB,yBAA0B,uBAGtD17E,SAAS22D,iBAAiB,QAASn2D,KAAKm7E,aACxC37E,SAAS22D,iBAAiB,UAAWn2D,KAAKo7E,WAG9C33C,uBACIjkC,SAAS82D,oBAAoB,QAASt2D,KAAKm7E,aAC3C37E,SAAS82D,oBAAoB,UAAWt2D,KAAKo7E,WAE7Cp7E,KAAKs4E,uBA8XT72E,SACI,MAAM,cAACmE,GAAiB5F,KAAKH,MAAM8F,KACnC,IAAI01E,GAAW,GACXC,WAEAD,GAAW,GAGf,IAAIpH,EAAS,IACTsH,YAEAtH,EAAS,WAGb,MAAM8B,EAAmB/mE,sBAA6BhP,KAAKH,MAAMqqE,UAEjE,IAAIsR,EACJ,MAAMxmE,EAAYpP,EAAc,CAAC9N,GAAI,kCAAmC+N,eAAgB,eAExF,GAAkD,IAA9C7F,KAAKH,MAAM47E,wBAAwBj2E,OACnCg2E,EACI,2BACI,0BACI3/E,KAAK,SACL/D,GAAG,mBACH66C,aAAY39B,EACZhU,UAAU,gDACVuJ,QAASvK,KAAK07E,mBACdC,WAAY37E,KAAK07E,oBAEjB,gBAAC,IAAD,CAAgB16E,UAAU,YAE9B,yBACIlJ,GAAG,kBACH8jF,SAAS,KACTjpC,aAAY/sC,EAAc6uE,EAAQb,YAClCp3C,IAAKx8B,KAAK66E,UACVh/E,KAAK,OACLoE,SAAUD,KAAK6yC,aACftoC,QAASvK,KAAK67E,wBACdR,SAAUA,EACVpH,OAAQA,SAIjB,CACH,MAAMwH,EAA0Bz7E,KAAKH,MAAM47E,wBAAwB5xE,KAAK0xC,GAEhE,sBACIr+C,IAAKq+C,EAAK5+C,SAAW,4BACrB4N,QAAS,KACDgxC,EAAK3mC,QACL2mC,EAAK3mC,OAAO5U,KAAK82E,gCAErB92E,KAAK8F,SAAS,CAACk1E,UAAU,MAG7B,qBAAG5gD,KAAK,KACJ,wBAAMp5B,UAAU,QACXu6C,EAAKnyC,MAETmyC,EAAK7mC,SAKtB8mE,EACI,2BACI,yBACII,SAAS,KACTjpC,aAAY/sC,EAAc6uE,EAAQb,YAClCp3C,IAAKx8B,KAAK66E,UACVh/E,KAAK,OACLmF,UAAU,kCACVf,SAAUD,KAAK6yC,aACftoC,QAASvK,KAAK67E,wBACdR,SAAUA,EACVpH,OAAQA,IAEZ,gBAAC,IAAD,KACI,0BACIp4E,KAAK,SACL82C,aAAY39B,EACZhU,UAAU,2BAEV,uBACIlJ,GAAG,mBACHkJ,UAAU,yBAEV,gBAAC,IAAD,CAAgBA,UAAU,aAGlC,gBAAC,IAAD,CACIlJ,GAAG,oBACHid,UAAU,EACViyC,QAAQ,EACRhyC,UAAWpP,EAAc,CAAC9N,GAAI,4BAA6B+N,eAAgB,yBAC3EovE,aAAcA,GAEd,0BACI,qBACI76C,KAAK,IACL7vB,QAASvK,KAAK07E,mBACdC,WAAY37E,KAAK07E,oBAEjB,wBAAM16E,UAAU,QACZ,qBAAGA,UAAU,kBAEjB,gBAAC,IAAD,CACIlJ,GAAG,eACH+N,eAAe,oBAI1B41E,KAWrB,OAJKz7E,KAAKH,MAAMo3E,iBACZuE,EAAa,MAIb,uBAAKx6E,UAAW+0E,GAAoB,EAAI,kCAAoC,eACvEyF,I,EAjnBJtG,E,YACU,CACfrlE,UAAWyhC,sBAKX2Y,OAAQ3Y,WAKR44B,UAAW54B,sBAKXooC,UAAWpoC,oBAEX3rC,KAAM80D,gBAENx/C,OAAQq2B,sBAKR/mC,QAAS+mC,SAKT8jC,aAAc9jC,SAKd0lC,mBAAoB1lC,SAKpBgkC,cAAehkC,SAKfqlC,cAAerlC,SAKfopC,SAAUppC,WAKV6kC,YAAa7kC,WAKb2lC,eAAgB3lC,oBAKhBmqC,wBAAyBnqC,YAAkBA,YAC3CskC,2BAA4BtkC,YAAkBA,YAK9CilC,iBAAkBjlC,oBAClBhvC,QAASgvC,UAAgB,CAKrBsiC,WAAYtiC,oBAKZ4iC,oBAAqB5iC,sBACtBixB,a,EApFE2S,E,eAuFa,CAClBuG,wBAAyB,GACzB7F,2BAA4B,KA8hBpC,MAAMkG,GAAmBrxE,QAAWyqE,EAAY,CAAC6G,YAAY,IAC7DD,EAAiB/4E,YAAc,yBAC/B,UE9pBA,GAAeoB,cAtBf,SAAyBjL,GACrB,MAAMoC,GAASmd,QAAUvf,GAGzB,MAAO,CACHi9E,YAHgB1mD,SAASn0B,EAAO0gF,YAAa,IAI7C/E,gBAAgBA,QAAe37E,GAC/B2f,QAAQC,OAAiBhiB,GACzBuiF,wBAAyBviF,EAAM2iB,QAAQC,WAAWmgE,iBAClDrG,2BAA4B18E,EAAM2iB,QAAQC,WAAWogE,wBAI7D,SAA4B9kF,GACxB,MAAO,CACHkL,SAAS+B,wBAAmB,CACxBuvE,WADwB,EAExBM,oBAAmBA,GACpB98E,MAIiD,KAAM,CAAC2kF,YAAY,GAA/E,CAAsF7G,I,oNCrBvE,MAAMiH,UAAkBx8E,gBAK5B8B,SACH,MAAM,MAAC/J,EAAQ,KAAT,OAAeiP,EAAS,GAAxB,cAA4By1E,EAA5B,OAA2CC,EAA3C,cAAmDC,EAAnD,KAAkEzgF,GAAQmE,KAAKH,MAErF,IAAKnI,GAA2B,IAAlBiP,EAAOnB,OACjB,OAAO,KAIX,IAAI5G,EAAUlH,EAEd,IAAKkH,EACD,IAAK,MAAMhH,KAAO+O,EACV/O,IACAgH,EAAUhH,GAKtB,OAAKgH,EAIQ,UAAT/C,EAEI,uBAAKmF,UAAU,cACX,yBAAOA,UAAU,uBACZpC,IAMJ,cAAT/C,EAEI,uBAAKmF,UAAU,uBACX,yBAAOA,UAAU,iBACZpC,IAMby9E,EAEI,uBAAKr7E,UAAU,wBACX,yBAAOA,UAAU,iBACZpC,IAOb,uBAAKoC,UAAS,oBAAes7E,GAAiB,cAC1C,yBAAOt7E,UAAU,iBACb,qBAAGA,UAAS,aAAQo7E,GAAiB,2BADzC,IACuEx9E,IApCpE,M,EAxBEu9E,E,aARjBtgF,K,SACAnE,M,SACA4kF,c,WACAF,c,WACAC,O,SACA11E,O,0BAGiBw1E,E,eACY,CACzBzkF,MAAO,KACPiP,OAAQ,M,kJCNT,MAAM41E,UAAuBC,aAChC58E,YAAY68E,GAAe,GACvB38E,QACAE,KAAKy8E,aAAeA,EAGxBn6C,KAAKlI,EAAMjxB,EAAOuL,GACd,OAAI1U,KAAKy8E,aACE/nE,EAVa,MAYpB0lB,EAAK,GACL,mBAAmBA,EAAKhoB,UAAU,EAAGgoB,EAAK50B,QAA1C,uDAAgGkP,EAAhG,QAEJ,mBAAmB0lB,EAAnB,aAA4B1lB,EAA5B,QAGJgoE,UAAUhoE,GACN,OAAOA,GAkBf,MAAMioE,UAAiCh9E,gBAKf,uBAChB,MAAO,CACHgG,KAAM80D,gBACN3iE,GAAIw5C,sBACJzrC,eAAgByrC,sBAChB1sC,OAAQ0sC,WACRmrC,aAAcnrC,UAItB7vC,SACI,MAAM,KACFkE,EADE,GAEF7N,EAFE,eAGF+N,EAHE,OAIFjB,EAJE,aAKF63E,GACAz8E,KAAKH,MAEH+8E,EAAUj3E,EAAKC,cAAc,CAAC9N,KAAI+N,kBAAiBjB,GAEnDi4E,EAAkBL,IAAOI,EAAS,CACpCE,QAAQ,EACRC,UAAU,EACVC,SAAU,IAAIT,EAAeE,KAGjC,OAAQ,wBAAMrO,wBAAyB,CAACC,OAAQwO,M,EA/B9B,CAClBJ,cAAc,I,sBAFhBE,G,sFAoCN,SAAelyE,QAAWkyE,I,mPCnDX,MAAMM,UAAqBt9E,gBAStCC,YAAYC,GACRC,MAAMD,GADgB,iBAQjB,KACLG,KAAK8F,SAAS,CAAC4B,MAAM,GAAQ1H,KAAKH,MAAMsI,WATlB,uBAYVogB,IACZA,EAAMviB,iBACFhG,KAAKH,MAAMq9E,yBACXl9E,KAAKmI,SAELnI,KAAKH,MAAM6hD,cACX1hD,KAAKH,MAAM6hD,kBAlBO,wBAsBTn5B,IACbA,EAAMviB,iBACFhG,KAAKH,MAAMs9E,0BACXn9E,KAAKmI,SAELnI,KAAKH,MAAMuhD,eACXphD,KAAKH,MAAMuhD,mBAzBfphD,KAAK9G,MAAQ,CACTwO,KAAM7H,EAAM6H,MA4BpBjG,SACI,IAAI27E,EA0BAC,EAzBJ,GAAIr9E,KAAKH,MAAMuhD,cAAe,CAC1B,IAAIH,EACA,gBAAC,IAAD,CACInpD,GAAG,wBACH+N,eAAe,YAGnB7F,KAAKH,MAAMohD,oBACXA,EAAoBjhD,KAAKH,MAAMohD,mBAGnCm8B,EACI,0BACIvhF,KAAK,SACLmF,UAAWs4B,IAAW,gCAAD,OAAiCt5B,KAAKH,MAAM8hD,wBAA0B,CACvF/9C,SAAU5D,KAAKH,MAAMshD,oBAEzB52C,QAASvK,KAAKohD,cACdx9C,SAAU5D,KAAKH,MAAMshD,mBAEpBF,GAMb,GAAIjhD,KAAKH,MAAM6hD,aAAc,CACzB,IAAIR,EACA,gBAAC,IAAD,CACIppD,GAAG,uBACH+N,eAAe,WAGnB7F,KAAKH,MAAMqhD,mBACXA,EAAmBlhD,KAAKH,MAAMqhD,kBAGlCm8B,EACI,0BACIxhF,KAAK,SACLmF,UAAU,8BACVuJ,QAASvK,KAAK0hD,cAEbR,GAKb,OACI,gBAAC,IAAD,CACIh5C,gBAAiBoxB,IAAW,2BAA4Bt5B,KAAKH,MAAMmB,WACnE0G,KAAM1H,KAAK9G,MAAMwO,KACjBS,OAAQnI,KAAKmI,OACbC,SAAUpI,KAAKmI,OACf2M,aAAc9U,KAAKH,MAAMiV,aACzBwoE,cAAc,EACdh1E,KAAK,SACLC,kBAAgB,oBAChBzQ,GAAIkI,KAAKH,MAAM/H,GACfg7C,UAAW9yC,KAAKH,MAAMizC,WAEtB,gBAAC,WAAD,CACInqC,aAAa,IAEjB,4BACI,gBAAC,SAAD,KACI,uBAAK3H,UAAU,wBACX,sBAAIlJ,GAAG,qBACFkI,KAAKH,MAAM2tC,kBAGpB,uBAAKxsC,UAAU,sBACVhB,KAAKH,MAAM0/B,WAGpB,gBAAC,WAAD,KACK89C,EACAD,M,EAxHJH,E,aArBjBj8E,U,WACAmH,O,oBACAqlC,gB,oBACA9lC,K,SACAg6C,a,SACAN,c,SACAH,kB,SACAU,uB,WACAT,iB,SACAC,kB,SACArpD,G,WACAolF,wB,SACAC,yB,SACAroE,a,aAQiBmoE,E,eACqB,CAClCv1E,MAAM,EACN5P,GAAI,eACJolF,yBAAyB,EACzBC,0BAA0B,EAC1BroE,cAAc,K,+6BChCP,MAAMggD,UAAuBxB,gBAAc,uDA8ErC,KACb,MAAMiqB,EAAKv9E,KAAKw9E,gBACVC,EAAWpxE,OAEjB,IAAIswD,EACJ,GAAI38D,KAAKH,MAAMu3D,UAAW,CACtB,IAAI6C,EAAa,gBAAiBwjB,EAAYA,EAASC,aAAel+E,SAASm+E,iBAAmBn+E,SAASlB,KAAKs/E,YAAcp+E,SAASlB,MAAM27D,UAEzI0C,EADA38D,KAAKH,MAAMg+E,UACF5jB,EAEAj6D,KAAK89E,qBAAqBP,IAAOA,EAAG1jB,aAAeI,EAAY5tD,OAAOmiC,kBAGnFmuB,EADO38D,KAAKH,MAAMg+E,UACTN,EAAGK,WAAW3jB,UAEdsjB,EAAG7rC,aAAe6rC,EAAGK,WAAW3jB,UAAYsjB,EAAGK,WAAWtd,aAGnE3D,EAASjiC,OAAO16B,KAAKH,MAAMm1D,aAC3Bh1D,KAAK+9E,uBAG8B,mBAAxB/9E,KAAKH,MAAMk1D,UAClB/0D,KAAKH,MAAMk1D,SAAS/0D,KAAKg+E,YAAc,OAzEnDlhD,oBACI98B,KAAKg+E,WAAah+E,KAAKH,MAAMq3D,UAC7Bl3D,KAAKi+E,uBACLj+E,KAAKk+E,oBAGTjhD,qBACIj9B,KAAKi+E,uBAGTx8E,SACI,QAcIzB,KAAKH,OAdH,SACF0/B,EADE,QAEFr5B,EAFE,QAGF0pD,EAHE,YAIFuH,EAJE,OAKFgnB,EALE,SAMFppB,EANE,UAOFmC,EAPE,UAQFlC,EARE,UASFoC,EATE,UAUFymB,EAVE,eAWFxuB,EAXE,gBAYF2H,GAZJ,EAaOn3D,E,kXAbP,MAgBAA,EAAM28B,IAAO4X,IACTp0C,KAAKw9E,gBAAkBppC,GAG3B,MAAMgqC,EAAepnB,EAAkB,EAAH,KAAOn3D,GAAP,IAAc+I,MAAO,CAACY,OAAQwtD,KAAoBn3D,EAEtF,OAAOF,gBAAoBuG,EAASk4E,EAAc7+C,EAAUqwB,IAAYuuB,GAAUn+E,KAAKq+E,gBAG3FP,qBAAqBP,GACjB,OAAKA,EAGEA,EAAG5jB,UAAY35D,KAAK89E,qBAAqBP,EAAGe,cAFxC,EAKfJ,oBACI,MAAM,eAAC7uB,GAAkBrvD,KAAKH,MACP,OAAnBwvD,GACAhjD,OAAOkoD,SAAS,EAAGlF,GAgC3B4uB,uBACI,IAAKj+E,KAAKH,MAAM+vD,QACZ,OAGJ,IAAI6tB,EAAWpxE,QACc,IAAzBrM,KAAKH,MAAMu3D,YACXqmB,EAAWz9E,KAAKw9E,gBAAgBI,YAGpCH,EAAStnB,iBAAiB,SAAUn2D,KAAKu+E,gBACzCd,EAAStnB,iBAAiB,SAAUn2D,KAAKu+E,gBAErCv+E,KAAKH,MAAMs3D,aACXn3D,KAAKu+E,iBAIbR,uBACI,IAAIN,EAAWpxE,QACc,IAAzBrM,KAAKH,MAAMu3D,YACXqmB,EAAWz9E,KAAKw9E,gBAAgBI,YAGpCH,EAASnnB,oBAAoB,SAAUt2D,KAAKu+E,gBAC5Cd,EAASnnB,oBAAoB,SAAUt2D,KAAKu+E,gBAGhD96C,uBACIzjC,KAAK+9E,uBAITS,iBAAiBL,GACbn+E,KAAKq+E,cAAgBF,G,EA5IRrpB,E,YACE,CACfv1B,SAAU+R,UACVprC,QAASorC,WACTse,QAASte,SACT6lB,YAAa7lB,SACb6sC,OAAQ7sC,WACRyjB,SAAUzjB,oBACV4lB,UAAW5lB,WACX0jB,UAAW1jB,WACX8lB,UAAW9lB,SACXusC,UAAWvsC,SACX0lB,gBAAiB1lB,WACjB+d,eAAgB/d,a,EAbHwjB,E,eAgBK,CAClB5uD,QAAS,MACT0pD,SAAS,EACTuH,aAAa,EACbD,UAAW,EACXlC,UAAW,IACXoC,WAAW,EACXymB,WAAW,EACX7mB,gBAAiB,KACjB3H,eAAgB,Q,8CC3BxB,MACA,EADuB,IAAM,K,mUCoBd,MAAMovB,UAAc9+E,gBACxBC,YAAYC,GACfC,MAAMD,GADuB,kBASd0oB,IACf,MAAM,QAACuoB,GAAW9wC,KAAKH,MAEvBG,KAAK8F,SAAS,CAACsqC,SAAS,IAEpBU,GACAA,EAAQvoB,MAfiB,iBAmBfA,IACd,MAAM,OAACwoB,GAAU/wC,KAAKH,MAEtBG,KAAK8F,SAAS,CAACsqC,SAAS,IACxBpwC,KAAK0+E,gBAED3tC,GACAA,EAAOxoB,MA1BkB,mBA8BbA,IAChB,MAAM,SAACtoB,GAAYD,KAAKH,MAExBG,KAAK8F,SAAS,CAACpO,MAAO,KAElBuI,GACAA,EAASsoB,MApCgB,wBAwCT,KACpB,MAAM,MAACxnB,EAAD,SAAQ49E,GAAY3+E,KAAKH,MAC/BG,KAAK8F,SAAS,CAACpO,MAAO,MAClBinF,GAAsB,MAAT59E,GAA2B,KAAVA,GAC9Bf,KAAK8F,SAAS,CAACpO,MA/CC,8BAMpBsI,KAAK9G,MAAQ,CACTk3C,SAAS,EACT14C,MAAO,IA2CPm0D,YAAYn0D,GAChB,OAAKA,EAKD,uBAAKsJ,UAAU,iBACX,qBAAGA,UAAU,4BACb,4BAAOtJ,IANJ,KAWPknF,aACJ,OAAK5+E,KAAKH,MAAMqsE,KAKZ,uBAAKlrE,UAAU,gBACVhB,KAAKH,MAAMqsE,MALT,KAURzqE,SACH,QAA4GzB,KAAKH,OAA3G,MAACkB,EAAD,YAAQF,EAAR,UAAqBG,EAAWtJ,MAAOmnF,EAAvC,SAAkDC,EAAlD,MAA4D1zB,EAA5D,KAAmEhrD,EAAnE,WAAyEirD,GAA/E,EAA8F/Y,E,kXAA9F,OACM,QAAClC,EAAS14C,MAAOqnF,GAAc/+E,KAAK9G,MAEpCsyD,EAAa5qB,QAAQwP,GAAWrvC,GAChCrJ,EAAQmnF,GAAaE,EAE3B,OACI,uBAAK/9E,UAAU,mBACX,4BACIA,UAAWs4B,IAAW,iBAAkBt4B,EAAW,CAC/CyqD,uBAAwB/zD,GAASonF,EACjCpzB,wBAAyBF,KAG7B,0BAAQxqD,UAAWs4B,IAAW,eAAgB,CAACqyB,qBAAsBH,KAChEA,EAAa3qD,EAAc,MAEhC,uBAAKG,UAAU,iBACVqqD,GAAc,4BAAOA,GACtB,uCACIvzD,GAAE,gBAAWsI,GACbY,UAAWs4B,IAAW,qBAAsBt4B,EAAW,CAAC4qD,aAAcJ,IACtEzqD,MAAOA,EACPF,YAAauvC,EAAU,GAAKvvC,EAC5BT,KAAMA,GACFkyC,EANR,CAOIxB,QAAS9wC,KAAK8wC,QACdC,OAAQ/wC,KAAK+wC,OACb9wC,SAAUD,KAAKC,aAGtBmrD,GAEJ1zD,EAAQsI,KAAK6rD,YAAYn0D,GAASsI,KAAK4+E,e,EA5GnCH,E,aAfjBvS,K,WACAx0E,M,WACAinF,S,SACAG,S,SACA1zB,M,YACAC,W,scCKW,MAAM2zB,UAAqBr/E,gBAA2B,qDAOGhB,IAChEqB,KAAKH,MAAMI,SAASD,KAAKH,MAAM/H,GAAI6G,EAAEu7B,OAAOn5B,UAGzCU,SACH,OACI,gBAAC,IAAD,CACIC,MAAO1B,KAAKH,MAAM6B,MAClB4uC,eAAgBtwC,KAAKH,MAAMywC,eAC3BC,eAAgBvwC,KAAKH,MAAM0wC,eAC3B5uC,SAAU3B,KAAKH,MAAM8B,SACrBs9E,QAASj/E,KAAKH,MAAM/H,IAGhBkI,KAAKH,MAAMxC,QAAQwM,KAAI,EAAE9I,QAAO2T,UAExB,uBACI1T,UAAU,QACV9D,IAAK6D,GAEL,6BACI,yBACIlF,KAAK,QACLkF,MAAOA,EACPX,KAAMJ,KAAKH,MAAM/H,GACjBonF,QAASn+E,IAAUf,KAAKH,MAAMkB,MAC9Bd,SAAUD,KAAK6yC,eAElBn+B,Q,0HAnChBsqE,E,aAXjBlnF,G,sBACAuF,Q,uBAAgBqX,K,sBAAc3T,M,yBAC9BW,M,oBAEAX,M,WACAuvC,e,WACAC,e,WACA5uC,S,aAIiBq9E,E,eAC4B,CACzC1uC,eAAgB,GAChBC,eAAgB,GAChBlzC,QAAS,KCFF,MAAM8hF,UAAsBx/E,gBAsBvCC,YAAYC,GACRC,MAAMD,GADS,yBA2BDiC,IACd,MAAM,KAAC1B,EAAD,WAAOgiB,EAAP,SAAmBniB,GAAYD,KAAKH,MAEvB,UAAfuiB,GACAniB,EAASG,EAAM0B,EAAShK,IACxBkI,KAAK8F,SAAS,CAAC/E,MAAOe,EAASG,YACT,aAAfmgB,GACPniB,EAASG,EAAM0B,EAAShK,IACxBkI,KAAK8F,SAAS,CAAC/E,MAAOe,EAASO,iBAE/BpC,EAASG,EAAM0B,EAASf,OACxBf,KAAK8F,SAAS,CAAC/E,MAAOe,EAAS4S,WAnCnC,IAAI0qE,EAAc,GAElB,GADAp/E,KAAKuC,UAAY,GACE,WAAf1C,EAAMhE,OACmB,UAArBgE,EAAMuiB,WACNpiB,KAAKuC,UAAY,CAAC,IAAIC,IAAoB3C,EAAMyC,QAAQG,oBAC5B,aAArB5C,EAAMuiB,WACbpiB,KAAKuC,UAAY,CAAC,IAAIG,IAAuB7C,EAAMyC,QAAQK,uBACpD9C,EAAMxC,UACb2C,KAAKuC,UAAY,CAAC,IAAI88E,IAAmBx/E,EAAMxC,WAG/CwC,EAAMkB,OAASlB,EAAMxC,SAAS,CAC9B,MAAMiiF,EAAgBz/E,EAAMxC,QAAQ4J,MAC/Bk1B,GAAWA,EAAOp7B,QAAUlB,EAAMkB,QAEvCq+E,EAAcE,EAAgBA,EAAc5qE,KAAO,GAI3D1U,KAAK9G,MAAQ,CACT6H,MAAOq+E,GAmBf39E,SACI,MAAM,KACFrB,EADE,QAEFiD,EAFE,YAGFN,EAHE,MAIFhC,EAJE,YAKFF,EALE,SAMFZ,EANE,SAOF0B,EAPE,UAQFkB,EARE,SASF2H,EATE,QAUFnN,GACA2C,KAAKH,MAET,IAAI,KAAChE,EAAD,UAAOyH,GAAatD,KAAKH,MAEzBoD,EAAqBF,EAErBE,EADAuH,EAEI,gBAAC,WAAD,KACKzH,EAAc,IACf,wBAAM/B,UAAU,6BACZ,gBAAC,IAAD,CACIlJ,GAAG,sCACH+N,eAAe,iBAO3B,gBAAC,WAAD,KACK9C,EACD,wBAAM/B,UAAU,cAAc,OAK1C,IAAIoC,EAAkBzB,EAYtB,OAXIkB,IACAO,EACI,gBAAC,WAAD,KACKzB,EACD,uBAAKX,UAAU,mBACV6B,KAMJ,SAAThH,GAA4B,aAATA,GACN,SAATA,GACAyH,EAAYA,GAvHI,IA0HZzH,EADAwH,GAAWI,wBAAgCJ,GACpCA,EAEA,SAGXC,EAAYA,GA9HQ,IAkIpB,gBAAC,IAAD,CACIK,UAAW3D,KAAKH,MAAM8D,UACtB7L,GAAIsI,EACJvE,KAAMA,EACN6F,MAAOuB,EACPK,UAAWA,EACXvC,MAAOA,GAAS,GAChBF,YAAaA,EACbc,SAAUyB,EACVnD,SAAUA,EACV4D,WAAW,KAGH,WAAThI,EAEH,gBAAC,IAAD,CACI/D,GAAIsI,EACJmC,UAAWvC,KAAKuC,UAChBwB,WAAY/D,KAAKgE,eACjBtC,MAAOuB,EACPtB,SAAUyB,EACVvC,YAAaA,EACbE,MAAOf,KAAK9G,MAAM6H,MAClB+B,cAAeoB,IACfssC,aAAa,WAGL,SAAT30C,EAEH,gBAAC,IAAD,CACI8H,UAAW3D,KAAKH,MAAM8D,UACtB7L,GAAIsI,EACJsB,MAAOuB,EACPlC,MAAOA,IAAS,EAChBY,SAAUyB,EACVvC,YAAaA,EACbZ,SAAUA,IAGF,UAATpE,EAEH,gBAACmjF,EAAD,CACIlnF,GAAIsI,EACJsB,MAAOuB,EACPtB,SAAUyB,EACV/F,QAASA,EACT0D,MAAOA,EACPd,SAAUA,IAKf,M,EApLMk/E,E,YACE,CACfp8E,YAAauuC,sBACblxC,KAAMkxC,sBACNz1C,KAAMy1C,sBACNjuC,QAASiuC,WACTzwC,YAAaywC,WACb3vC,SAAU2vC,WACVzuC,UAAWyuC,SACXhuC,UAAWguC,WACXlvB,WAAYkvB,WACZ9mC,SAAU8mC,SACVj0C,QAASi0C,YAAkBA,YAC3BvwC,MAAOuwC,QACPrxC,SAAUqxC,SACV3tC,UAAW2tC,SACXhvC,QAASgvC,UAAgB,CACrB3uC,qBAAsB2uC,oBACtB7uC,kBAAmB6uC,sBACpBixB,aCpBX,SAAep+D,aAAQ,MATvB,SAA4B/M,GACxB,MAAO,CACHkL,SAAS+B,wBAAmB,CACxB1B,qBADwB,KAExBF,kBAAiBA,MAClBrL,MAIX,CAAiD+nF,G,gCCXlC,MAAMI,UAA+B5/E,gBAOhD8B,SACI,MAAM+9E,EAAmBC,KACrBz/E,KAAKH,MAAMkB,MACX,CACI+7E,QAAQ,EACRC,UAAU,EACV2C,KAAK,EACL1iF,SAASoP,WAEbpM,KAAKH,MAAMy9D,UAGf,OACI,wBACIxlE,GAAIkI,KAAKH,MAAM/H,GACfs2E,wBAAyB,CAACC,OAAQmR,M,yrBAtB7BD,E,gBACE,CACfznF,GAAIw5C,WACJvwC,MAAOuwC,sBACPgsB,SAAUhsB,uB,6FCOH,MAAM1f,UAA0BjyB,gBAkB3CC,YAAYC,GACRC,MAAMD,GADS,uBAyBJtI,UACXoH,EAAEqH,iBAEF,MAAM,SAACd,GAAYlF,KAAKH,MAClB+E,EAAS5E,KAAK9G,MAAM0L,OACpB+B,EAAS,GAqBf,GApBIzB,GACAA,EAASJ,SAAS66E,IACd,MAAMjoF,GAAQyO,OACVw5E,EACA/6E,EAAO+6E,EAAKv/E,OAEZ1I,IACAiP,EAAOg5E,EAAKv/E,MACR,gBAAC,IAAD,CACItI,GAAIJ,EAAMI,GACV+N,eAAgBnO,EAAMmO,eACtBjB,OAAQlN,EAAMkN,aAOlC5E,KAAK8F,SAAS,CAACa,WAEoB,IAA/BrB,OAAOC,KAAKoB,GAAQnB,OACpB,OAGJ,MAAM,IAAC8d,EAAD,WAAMs8D,EAAN,MAAkB1mF,GAAS8G,KAAKH,MAEhC2xB,EAAS,CACXlO,MACAu8D,YAAaD,EACb1mF,QACAkN,WAAYxB,GAGhB5E,KAAK8F,SAAS,CAACO,YAAY,IAE3B,MAAM,KAAC1O,SAAcqI,KAAKH,MAAMyC,QAAQw9E,wBACpCtuD,GAGJxxB,KAAK8F,SAAS,CAACO,YAAY,IAE3B,IAAIhB,GAAY,EAEZ1N,IACIA,EAAKD,QACL2N,GAAY,EACZrF,KAAK8F,SAAS,CAACpO,MAAOC,EAAKD,SAI3BC,EAAKgP,QACLrB,OAAOC,KAAK5N,EAAKgP,QAAQnB,QAAU,IACnCC,OAA2B9N,EAAKgP,OAAQzB,KAExCG,GAAY,EACZrF,KAAK8F,SAAS,CAACa,OAAQhP,EAAKgP,WAI/BtB,GACDrF,KAAK4G,YAAW,MA3FL,iBA+FV,KACL5G,KAAK4G,YAAW,MAhGD,qBAmGN,CAACY,GAAY,KACtB,MAAM,IAAC8b,EAAD,WAAMs8D,EAAN,MAAkB1mF,EAAlB,eAAyB6mF,GAAkB//E,KAAKH,MAEtD,IAAK2H,GAAau4E,EAAgB,CAC9B,MAAMvuD,EAAS,CACXlO,MACAu8D,YAAaD,EACb1mF,QACA8mF,WAAW,GAGfhgF,KAAKH,MAAMyC,QAAQw9E,wBAAwBtuD,GAG/CxxB,KAAK8F,SAAS,CAAC4B,MAAM,OAjHN,mBAoHR,CAACtH,EAAMW,KACd,MAAM6D,EAAS,EAAH,KAAO5E,KAAK9G,MAAM0L,QAAlB,IAA0B,CAACxE,GAAOW,IAC9Cf,KAAK8F,SAAS,CAAClB,cAnHf,MAAMA,EAAS,GACO,MAAlB/E,EAAMqF,UACNrF,EAAMqF,SAASJ,SAASnG,IACL,SAAXA,EAAE9C,KACF+I,EAAOjG,EAAEyB,OACS,IAAdzB,EAAEshF,SACkC,SAApC//C,OAAOvhC,EAAEshF,SAAS5tE,cAEtBzN,EAAOjG,EAAEyB,MAAQzB,EAAEshF,SAAW,QAK1CjgF,KAAK9G,MAAQ,CACTwO,MAAM,EACN9C,SACAlN,MAAO,KACPiP,OAAQ,GACRN,YAAY,GAoGpB5E,SACI,MAAM,MACF0H,EADE,iBAEF+2E,EAFE,QAGFC,EAHE,YAIFC,EAJE,SAKFl7E,GACAlF,KAAKH,MAET,IAUIuJ,EAVAY,EACA,gBAAC,IAAD,CACIlS,GAAG,4BACH+N,eAAe,WAqBvB,OAlBIu6E,IACAp2E,EAAao2E,GAIbD,IACA/2E,EACI,uBACItR,GAAG,2BACHwR,IAAK,mBACLtI,UAAU,oBACVuI,MAAM,KACNC,OAAO,KACPC,IAAK02E,KAMb,gBAACl4E,EAAA,EAAD,CACInQ,GAAG,yBACHoQ,gBAAgB,0BAChBR,KAAM1H,KAAK9G,MAAMwO,KACjBS,OAAQnI,KAAKmI,OACbC,SAAUpI,KAAKH,MAAMsI,OACrBE,SAAS,SACTC,KAAK,SACLC,kBAAgB,+BAEhB,wBAAMC,SAAUxI,KAAKyI,cACjB,gBAACR,EAAA,SAAD,CACIU,aAAa,EACbC,MAAO,CAACC,aAA0B,MAAZ3D,GAAoB,QAE1C,gBAAC+C,EAAA,QAAD,CACIa,eAAe,KACfhR,GAAG,+BAEFsR,EACAD,KAGPjE,GAAYg7E,IACV,gBAACj4E,EAAA,OAAD,KACKi4E,GACG,gBAACX,EAAD,CACIznF,GAAG,yCACHiJ,MAAOm/E,EACP5iB,SAAUt9D,KAAKH,MAAMy9D,WAG5Bp4D,GACDA,EAAS2E,KAAI,CAAClL,EAAGmL,IAET,gBAAC,EAAD,CACInG,UAAqB,IAAVmG,EACX5M,IAAK,gBAAkByB,EAAEyB,KACzB2C,YAAapE,EAAE0D,aACfjC,KAAMzB,EAAEyB,KACRvE,KAAM8C,EAAE9C,KACRwH,QAAS1E,EAAE0E,QACX1B,SAAUhD,EAAE0hF,UACZx9E,UAAW7C,KAAK9G,MAAMyN,OAAOhI,EAAEyB,MAC/BS,YAAalC,EAAEkC,YACfy/E,UAAW3hF,EAAE4hF,WACbj9E,UAAW3E,EAAE4E,WACb6e,WAAYzjB,EAAE6hF,YACdh2E,SAAU7L,EAAE6L,SACZnN,QAASsB,EAAEtB,QACX0D,MAAOf,KAAK9G,MAAM0L,OAAOjG,EAAEyB,MAC3BH,SAAUD,KAAKC,cAMnC,gBAACgI,EAAA,SAAD,KACKjI,KAAK9G,MAAMxB,OACR,uBAAKsJ,UAAU,cAAchB,KAAK9G,MAAMxB,OAE5C,0BACII,GAAG,0BACH+D,KAAK,SACLmF,UAAU,6BACVuJ,QAASvK,KAAKmI,QAEd,gBAAC,IAAD,CACIrQ,GAAG,4BACH+N,eAAe,YAGvB,gBAAC,IAAD,CACI/N,GAAG,0BACH+D,KAAK,SACL8H,WAAYuB,GAAgC,IAApBA,EAASM,OACjCxE,UAAU,8BACVkJ,SAAUlK,KAAK9G,MAAMmN,WACrB8D,cAAcC,QACV,gCACA,kBAGHJ,O,EAhQR4nB,E,YACE,CACftO,IAAKguB,sBACLsuC,WAAYtuC,WACZpsC,SAAUosC,YAAkBA,YAC5BnoC,MAAOmoC,sBACP4uC,iBAAkB5uC,WAClB6uC,QAAS7uC,WACT8uC,YAAa9uC,WACbyuC,eAAgBzuC,SAChBp4C,MAAOo4C,WACPnpC,OAAQmpC,SACRhvC,QAASgvC,UAAgB,CACrBwuC,wBAAyBxuC,sBAC1BixB,WACHjF,SAAUhsB,wBCKlB,SAAentC,cA5Bf,SAAyBjL,GACrB,MAAMvB,EAAOuB,EAAMynB,SAAS+Q,aAAaF,OACzC,OAAK75B,GAASA,EAAK65B,OAIZ,CACHlO,IAAK3rB,EAAK2rB,IACVs8D,WAAYjoF,EAAK65B,OAAOquD,YACxB36E,SAAUvN,EAAK65B,OAAOtsB,SACtBiE,MAAOxR,EAAK65B,OAAOroB,MACnB+2E,iBAAkBvoF,EAAK65B,OAAOivD,kBAC9BN,QAASxoF,EAAK65B,OAAOkvD,SACrBN,YAAazoF,EAAK65B,OAAOmvD,aACzBZ,eAAgBpoF,EAAK65B,OAAOovD,iBAC5B1nF,MAAOvB,EAAK65B,OAAOt4B,MACnBokE,UAAUtR,QAAY9yD,IAbf,MAiBf,SAA4B9B,GACxB,MAAO,CACHkL,SAAS+B,wBAAmB,CACxBy7E,wBAAuBA,MACxB1oF,MAIX,CAA4Dw6B,I,mRC3BrD,SAASivD,EAAmB7lF,EAAQgD,EAAO8iF,GAC9C,OAAOvpF,MAAOH,EAAUE,KAChB0G,EAAMwH,OAAS,SACTpO,EAASoF,KAAgCxB,EAAQgD,EAAM6L,KAAKk3E,GAAMA,EAAEjpF,OAE9E,MAAMoB,EAAQ5B,IACR0pF,EAAO,GACPC,EAAU,GACVC,EAAa,GACnB,IAAK,MAAM1oF,KAAQwF,EAAO,CACtB,MAAM2X,GAASwrE,QAAcjoF,EAAO8B,EAAQxC,EAAKV,KAC7C0yB,QAAQhyB,GACRyoF,EAAQhiE,KAAK,CAACzmB,OAAM4oF,QAAQh3E,QAAgB,+BAAgC,0DACrEuL,EACPsrE,EAAQhiE,KAAK,CAACzmB,OAAM4oF,QAAQh3E,QAAgB,gCAAiC,2CAE7E82E,EAAWjiE,KAAKzmB,GAGxB,GAAI0oF,EAAW17E,OAAS,EAAG,CACvB,MACMilB,SADiBrzB,GAASiqF,QAAermF,EAAQkmF,EAAWr3E,KAAKk3E,GAAMA,EAAEjpF,QACtDH,MAAQ,GACjC,IAAK,MAAM2pF,KAAaJ,EAAY,CAChC,MAAMK,EAAkB92D,EAAQxjB,MAAMikB,GAAMA,EAAE5c,UAAYgzE,EAAUxpF,IAAMozB,EAAExzB,QACxE6pF,EACAN,EAAQhiE,KAAK,CAACzmB,KAAM8oF,EAAWF,OAAQG,EAAgB7pF,MAAMkH,UAE7DoiF,EAAK/hE,KAAK,CAACzmB,KAAM8oF,EAAWF,QAAQh3E,QAAgB,+BAAgC,8CAIhG,GAAI02E,EAAOt7E,OAAS,EAAG,CACnB,IAAIkH,EACJ,IACIA,QAAiBtV,EAASoF,KAA6CxB,EAAQ8lF,IACjF,MAAOniF,GACL+N,EAAW,CAAC/U,KAAMmpF,EAAOj3E,KAAK/P,IAAD,CAAaA,QAAOpC,MAAO,CAACA,OAAO0S,QAAgB,oDAAqD,6CAEzI,MAAMo3E,EAAoB90E,EAAS/U,MAAQ,GAC3C,GAAI+U,EAAShV,MAAO,CACuB,4CAAnCgV,EAAShV,MAAMK,kBACf2U,EAAShV,MAAMkH,SAAUwL,QAAgB,6BAA8B,uCAE3E,IAAK,MAAMtQ,KAASgnF,EAChBG,EAAQhiE,KAAK,CAACnlB,QAAOsnF,OAAQ10E,EAAShV,MAAMkH,eAGhD,IAAK,MAAM9E,KAASgnF,EAAQ,CACxB,MAAMW,EAAkBD,EAAkBv6E,MAAMmkB,GAAMtxB,EAAMuY,gBAAkB+Y,EAAEtxB,OAASsxB,EAAE1zB,QACvF+pF,EACAR,EAAQhiE,KAAK,CAACnlB,QAAOsnF,OAAQK,EAAgB/pF,MAAMkH,UAEnDoiF,EAAK/hE,KAAK,CAACnlB,QAAOsnF,QAAQh3E,QAAgB,6BAA8B,yCAKxF,MAAO,CAAC42E,OAAMC,YA0Cf,SAASS,EAAkB1mF,EAAQ4hB,EAAU5e,EAAO8iF,EAAQliF,GAC/D,OAAOrH,MAAOH,EAAUE,KAChB0G,EAAMwH,OAAS,SACTpO,EAASoF,KAAgCxB,EAAQgD,EAAM6L,KAAKk3E,GAAMA,EAAEjpF,OAE9E,MAAMoB,EAAQ5B,IACR0pF,EAAO,GACPC,EAAU,GACVx2D,GAAUC,QAA4BxxB,GACtCyoF,QAAgB3xE,QAAQC,IAAIjS,EAAM6L,KAAKrR,GA/C9CjB,eAAsCH,EAAUoB,EAAMwC,EAAQ4hB,EAAU6N,GAC3E,KAAKD,QAAQhyB,GACT,MAAO,CAACyoF,QAAS,CAACzoF,OAAM4oF,QAAQh3E,QAAgB,mCAAoC,sCAExF,IAAIw3E,GAAc,EACdC,GAAc,EAElB,IAAK,MAAMz/E,KAAWwa,EACH6N,GAAWA,EAAQroB,IAAYqoB,EAAQroB,GAAS5J,EAAKV,IAEhE+pF,GAAc,EAEdD,GAAc,EAItB,GAAIA,EACA,MAAO,CAACX,QAAS,CAACzoF,OAAM4oF,QAAQh3E,QAAgB,4CAA6C,0DAGjG,UACUhT,GAASiqF,QAAermF,EAAQ,CAACxC,EAAKV,MAC5C,IAAK,MAAMsK,KAAWwa,EACH6N,GAAWA,EAAQroB,IAAYqoB,EAAQroB,GAAS5J,EAAKV,WAE1DV,GAASgmB,QAAY5kB,EAAKV,GAAIkD,EAAQoH,IAGtD,MAAOzD,GACL,MAAO,CAACsiF,QAAS,CAACzoF,OAAM4oF,QAAQh3E,QAAgB,uDAAwD,8CAG5G,OAAIy3E,EACO,CAACZ,QAAS,CAACzoF,OAAM4oF,QAAQh3E,QAAgB,6CAA8C,8DAE3F,CAAC42E,KAAM,CAACxoF,OAAM4oF,OAAQ,CAACtpF,IAAIkc,OAAE,4BAA6BpV,QAAS,6FAA8FgG,OAAQ,CAAC4wB,MAAO5Y,EAASpX,WAYvIs8E,CAAuB1qF,EAAUoB,EAAMwC,EAAQ4hB,EAAU6N,MAE/G,IAAK,MAAMhc,KAAUkzE,EACblzE,EAAOuyE,MACPA,EAAK/hE,KAAKxQ,EAAOuyE,MAEjBvyE,EAAOwyE,SACPA,EAAQhiE,KAAKxQ,EAAOwyE,SAI5B,GAAIH,EAAOt7E,OAAS,EAAG,CACnB,IAAIkH,EACJ,IACIA,QAAiBtV,EAASoF,KAAsDxB,EAAQ4hB,EAAUkkE,EAAQliF,IAC5G,MAAOD,GACL+N,EAAW,CAAC/U,KAAMmpF,EAAOj3E,KAAK/P,IAAD,CAAaA,QAAOpC,MAAO,CAACA,OAAO0S,QAAgB,uDAAwD,kDAG5I,GAAIsC,EAAShV,MAAO,CACuB,4CAAnCgV,EAAShV,MAAMK,kBACf2U,EAAShV,MAAMkH,SAAUwL,QAAgB,6BAA8B,uCAE3E,IAAK,MAAMtQ,KAASgnF,EAChBG,EAAQhiE,KAAK,CAACnlB,QAAOsnF,OAAQ10E,EAAShV,MAAMkH,eAGhD,IAAK,MAAM0H,KAAQoG,EAAS/U,MAAQ,GAC5B2O,EAAI5O,MACJupF,EAAQhiE,KAAK,CAACnlB,MAAOwM,EAAIxM,MAAOsnF,OAAQ96E,EAAI5O,MAAMkH,UAElDoiF,EAAK/hE,KAAK,CAACnlB,MAAOwM,EAAIxM,MAAOsnF,QAAQh3E,QAAgB,iCAAkC,wCAKvG,MAAO,CAAC42E,OAAMC,Y,sICzJtB,MA4HA,EA5HuC,IACnC,uBACI13E,MAAM,MACNC,OAAO,MACPyjC,QAAQ,cACRC,KAAK,OACLC,MAAM,8BAEN,wBACIjM,QAAQ,MACRmM,EAAE,qoBACFH,KAAK,qBAET,wBACIhM,QAAQ,MACRmM,EAAE,ioBACFH,KAAK,qBAET,wBACIhM,QAAQ,MACRmM,EAAE,ghCACFH,KAAK,qBAET,wBACIhM,QAAQ,MACRmM,EAAE,2gCACFH,KAAK,qBAET,wBACIG,EAAE,uwBACFH,KAAK,4BAET,wBACIG,EAAE,0JACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,8vCACFH,KAAK,4BAET,wBACIhM,QAAQ,MACRmM,EAAE,oPACFH,KAAK,8BACLI,YAAY,SAEhB,wBACIpM,QAAQ,MACRmM,EAAE,0PACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,24BACFH,KAAK,4BAET,wBACIhM,QAAQ,MACRmM,EAAE,0PACFH,KAAK,8BACLI,YAAY,SAEhB,wBACIpM,QAAQ,MACRmM,EAAE,0PACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,owCACFH,KAAK,4BAET,wBACIhM,QAAQ,MACRmM,EAAE,gVACFH,KAAK,8BACLI,YAAY,SAEhB,wBACIpM,QAAQ,MACRmM,EAAE,6OACFH,KAAK,8BACLI,YAAY,SAEhB,wBACIpM,QAAQ,MACRmM,EAAE,ooBACFH,KAAK,qBAET,wBACIhM,QAAQ,MACRmM,EAAE,mhCACFH,KAAK,qBAET,wBACIhM,QAAQ,MACRmM,EAAE,ooBACFH,KAAK,qBAET,wBACIhM,QAAQ,MACRmM,EAAE,2gCACFH,KAAK,qBAET,wBACIG,EAAE,yIACFH,KAAK,8BACLI,YAAY,QAEhB,2BACIy0C,GAAG,MACHC,GAAG,UACHC,GAAG,UACHC,GAAG,UACHh1C,KAAK,SAET,wBACIG,EAAE,q7CACFH,KAAK,6BCxGXi1C,EAA2BtiF,GAEzB,gCACI,gBAACoI,EAAA,EAAD,CACIjH,UAAW,0BACX0G,KAAM7H,EAAM6H,KACZ5P,GAAG,0BACHwQ,KAAK,SACLH,OAAQtI,EAAMyC,QAAQu/B,YAEtB,gBAAC55B,EAAA,SAAD,CAAcU,aAAa,IAC3B,gBAACV,EAAA,OAAD,KACI,gBAAC,EAAD,MACA,uBAAKjH,UAAU,SACX,gBAAC,IAAD,CACIlJ,GAAI,iDACJ+N,eAAgB,gBAGxB,uBAAK7E,UAAU,eACX,gBAAC,IAAD,CACIlJ,GAAI,gDACJ+N,eAAgB,yDAGxB,uBAAK7E,UAAU,WACX,gBAACohF,EAAA,EAAD,CACIphF,UAAU,iBACVuJ,QAAS1K,EAAMyC,QAAQu/B,YAEvB,gBAAC,IAAD,CACI/pC,GAAI,gDACJ+N,eAAgB,c,aAtC5C6B,K,oBACApF,Q,WACIu/B,W,kCA8CR,UC3BA,GAAe19B,cAjBf,SAAyBjL,GACrB,MAAO,CACHwO,MAAMqzB,OAAY7hC,EAAO4S,+BAIjC,SAA4B1U,GACxB,MAAO,CACHkL,SAAS+B,wBACL,CACIw9B,WAAY,KAAMA,OAAW/1B,4BAEjC1U,MAKZ,CAGE+qF,GCqHF,EAtJqC,IACjC,uBACI54E,MAAM,MACNC,OAAO,MACPyjC,QAAQ,cACRC,KAAK,OACLC,MAAM,8BAEN,wBACIjM,QAAQ,MACRmM,EAAE,ooBACFH,KAAK,qBAET,wBACIhM,QAAQ,MACRmM,EAAE,goBACFH,KAAK,qBAET,wBACIhM,QAAQ,MACRmM,EAAE,wgCACFH,KAAK,qBAET,wBACIhM,QAAQ,MACRmM,EAAE,4/BACFH,KAAK,qBAET,wBACIG,EAAE,swBACFH,KAAK,4BAET,wBACIG,EAAE,gKACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,kMACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,25BACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,0FACFH,KAAK,qBAET,wBACIG,EAAE,kMACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,w5BACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,oGACFH,KAAK,qBAET,wBACIG,EAAE,sLACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,m5BACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,mGACFH,KAAK,qBAET,wBACIG,EAAE,gwCACFH,KAAK,4BAET,wBACIhM,QAAQ,MACRmM,EAAE,6OACFH,KAAK,8BACLI,YAAY,SAEhB,wBACIpM,QAAQ,MACRmM,EAAE,kPACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,24BACFH,KAAK,4BAET,wBACIhM,QAAQ,MACRmM,EAAE,iPACFH,KAAK,8BACLI,YAAY,SAEhB,wBACIpM,QAAQ,MACRmM,EAAE,kPACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,0wCACFH,KAAK,4BAET,wBACIhM,QAAQ,MACRmM,EAAE,+UACFH,KAAK,8BACLI,YAAY,SAEhB,wBACIpM,QAAQ,MACRmM,EAAE,gPACFH,KAAK,8BACLI,YAAY,SAEhB,wBACIpM,QAAQ,MACRmM,EAAE,goBACFH,KAAK,qBAET,wBACIhM,QAAQ,MACRmM,EAAE,qgCACFH,KAAK,qBAET,wBACIhM,QAAQ,MACRmM,EAAE,ioBACFH,KAAK,qBAET,wBACIhM,QAAQ,MACRmM,EAAE,wgCACFH,KAAK,sBCzHF,SAASm1C,EAAexiF,GACnC,MAAOyiF,EAAyBC,IAAoC30C,eAAS,IAC7EC,gBAAU,MACN20C,QACI/4C,sBACA,uCAEL,KAEHoE,gBAAU,MAC0B,IAA5By0C,IACAziF,EAAMyC,QAAQu/B,WAAW/1B,4BACzBjM,EAAMyC,QAAQsJ,UAAU,CACpBC,QAASC,0BACTC,WAAYo2E,OAGrB,CAACG,IAEJ,MAYM7gE,EAAQ,MACV9jB,QACI8rC,sBACA,kCAEJ5pC,EAAMyC,QAAQu/B,WAAW/1B,6BAGvB22E,EAAa5iF,EAAM+pC,YACrB,gBAACw4C,EAAA,EAAD,CACIphF,UAAU,iBACVuJ,QAvBS,MACb5M,QACI8rC,sBACA,kCAEJ5pC,EAAMyC,QAAQu/B,WAAW/1B,4BACzBjM,EAAMyC,QAAQsJ,UAAU,CACpBC,QAASC,oBACTC,WAAYm+B,QAiBZ,gBAAC,IAAD,CACIpyC,GAAI,gBACJ+N,eAAgB,8BAGvB,gBAAC,IAAD,CACD68E,UAAW,IAAMH,GAAiC,GAClDvhF,UAAU,mBAId,OACI,gCACKnB,EAAM6H,MACH,gBAACO,EAAA,EAAD,CACIjH,UAAW,iBACX0G,KAAM7H,EAAM6H,KACZ5P,GAAG,iBACHwQ,KAAK,SACLH,OAAQsZ,GAER,gBAACxZ,EAAA,SAAD,CAAcU,aAAa,IAC3B,gBAACV,EAAA,OAAD,KACI,gBAAC,EAAD,MACA,uBAAKjH,UAAU,SACX,gBAAC,IAAD,CACIlJ,GAAI,4BACJ+N,eAAgB,qCAGxB,uBAAK7E,UAAU,eACX,gBAAC,IAAD,CACIlJ,GAAI,2BACJ+N,eACI,oFAEJjB,OAAQ,CACJ+3B,IAAK98B,EAAM8iF,mBAIvB,uBAAK3hF,UAAU,WACX,gBAACohF,EAAA,EAAD,CACIphF,UAAU,eACVuJ,QAASkX,GAET,gBAAC,IAAD,CACI3pB,GAAI,4BACJ+N,eAAgB,mBAGvB48E,M,aAxGzB74C,Y,oBACAliC,K,oBACAi7E,e,sBACArgF,Q,WACIu/B,W,oBACAj2B,U,4DClBO,SAASg3E,EAAW/iF,GAC/B,MAAM,cAAC+F,IAAiBiyC,SACxB,OACI,uBAAUh4C,EACN,uBACI0J,MAAM,QACNC,OAAO,OACPyjC,QAAQ,aACR3kC,KAAK,MACLqqC,aAAY/sC,EAAc,CAAC9N,GAAI,uBAAwB+N,eAAgB,iBAEvE,wBAAMwnC,EAAE,mmBCXT,SAASw1C,EAAehjF,GACnC,MAAM,cAAC+F,IAAiBiyC,SACxB,OACI,uBAAUh4C,EACN,uBACI0J,MAAM,OACNC,OAAO,OACPyjC,QAAQ,YACR3kC,KAAK,MACLqqC,aAAY/sC,EAAc,CAAC9N,GAAI,oCAAqC+N,eAAgB,iBAEpF,wBAAMwnC,EAAE,kE,wHCJT,MAAMy1C,UAAmCnjF,gBAAoB,yDAQpDhB,IAChB,MAAMgvE,EAAOhvE,EAAEokF,MACD,KAATpV,GAA0B,KAATA,GAClB3tE,KAAKH,MAAMmjF,iBAXqD,0BAerDrkF,IACf,MAAMgvE,EAAOhvE,EAAEokF,MACD,KAATpV,GAA0B,KAATA,GAClB3tE,KAAKH,MAAMojF,gBAInBxhF,SACI,MAAM09B,EAAWn/B,KAAKH,MAAMs/B,SAC5B,OACI,uBAAKn+B,UAAU,8BACX,uBAAKA,UAAU,cACX,gBAAC4hF,EAAD,OAEJ,sBAAI9qF,GAAG,0BACH,gBAAC,IAAD,CACIA,GAAG,yBACH+N,eAAe,kCACfjB,OAAQ,CAACu6B,eAGjB,uBACIn+B,UAAU,0BACVuJ,QAASvK,KAAKH,MAAMmjF,YACpBtyC,cAAY,oBACZkrC,SAAS,IACTja,UAAW3hE,KAAKkjF,iBAChB36E,kBAAgB,6BAChB46E,mBAAiB,mCAEjB,uBAAKzyC,cAAY,wBACb,sBAAI54C,GAAG,8BACH,gBAAC,IAAD,CACIA,GAAG,wCACH+N,eAAe,wBAGtB7F,KAAKH,MAAMujF,yBACZ,gBAAC,IAAD,CACItrF,GAAG,8CACH+N,eAAe,uIAEb6O,GAAU,wBAAM5c,GAAG,mCAAmC4c,MAG1D1U,KAAKH,MAAMujF,yBACb,gBAAC,IAAD,CACItrF,GAAG,6DACH+N,eAAe,2HAEb6O,GAAU,wBAAM5c,GAAG,mCAAmC4c,MAIhE,gBAACmuE,EAAD,CAAgB7hF,UAAU,WAE9B,uBACIA,UAAU,0BACVuJ,QAASvK,KAAKH,MAAMojF,WACpBvyC,cAAY,kBACZkrC,SAAS,IACTja,UAAW3hE,KAAKqjF,gBAChB96E,kBAAgB,4BAChB46E,mBAAiB,kCAEjB,2BACI,sBAAIrrF,GAAG,6BACH,gBAAC,IAAD,CACIA,GAAG,uCACH+N,eAAe,uBAGvB,gBAAC,IAAD,CACI/N,GAAG,6CACH+N,eAAe,uIAEb6O,GAAU,wBAAM5c,GAAG,kCAAkC4c,MAG/D,gBAACmuE,EAAD,CAAgB7hF,UAAU,a,EA9FzB8hF,E,YACE,CACf3jD,SAAUmS,sBACV0xC,YAAa1xC,oBACb2xC,WAAY3xC,oBACZ8xC,wBAAyB9xC,sB,oECZlB,SAASgyC,EAAkBzjF,GACtC,MAAM,cAAC+F,IAAiBiyC,SACxB,OACI,uBAAUh4C,EACN,uBACI0J,MAAM,QACNC,OAAO,OACPyjC,QAAQ,aACR3kC,KAAK,MACLqqC,aAAY/sC,EAAc,CAAC9N,GAAI,+BAAgC+N,eAAgB,yBAE/E,wBAAMwnC,EAAE,+kJ,kDCXT,SAASk2C,GAAS1jF,GAC7B,MAAM,cAAC+F,IAAiBiyC,SACxB,OACI,uBAAUh4C,EACN,uBACI0J,MAAM,OACNC,OAAO,OACPyjC,QAAQ,YACR3kC,KAAK,MACLqqC,aAAY/sC,EAAc,CAAC9N,GAAI,qBAAsB+N,eAAgB,eAErE,wBAAMwnC,EAAE,8ICXT,SAASm2C,GAAa3jF,GACjC,MAAM,cAAC+F,IAAiBiyC,SACxB,OACI,uBAAUh4C,EACN,uBACI0J,MAAM,OACNC,OAAO,OACPyjC,QAAQ,YACR3kC,KAAK,MACLqqC,aAAY/sC,EAAc,CAAC9N,GAAI,yBAA0B+N,eAAgB,mBAEzE,wBAAMwnC,EAAE,kK,yLCUT,MAAMo2C,WAAyB9jF,gBAiC1CC,YAAYC,GACRC,MAAMD,GADS,0BAQDrH,IACd,MAAMkrF,GAAQC,QAAwBnrF,GACtC,IAAIorF,EAAW,KACXF,EAAME,WACNA,EAAY,wBAAM5iF,UAAU,YAAY0iF,EAAME,WAElD,IAAIC,EAAW,KAKf,OAJIH,EAAMG,WACNA,EAAY,wBAAM7iF,UAAU,YAAY0iF,EAAMG,WAI9C,gCACKH,EAAM3gF,YACN6gF,EACAC,MAvBM,0BA4BF,KACb,MAAMnvE,EACF,gBAAC,IAAD,CACI5c,GAAIkI,KAAKH,MAAMikF,iBACfj+E,eAAgB7F,KAAKH,MAAMkkF,wBAInC,OAAQ,gBAAC,KAAD,CAAgBrvE,KAAMA,OApCf,0BAuCDlc,GACPA,EAAKV,IAAMU,EAAKuI,QAxCR,6BA2CC,CAACvI,EAAM6E,KACvB,MAAM2mF,GAAalV,QAAgBt2E,EAAKV,GAAIU,EAAKg3C,qBACjD,IAAIy0C,EAAa,KACbC,EAAW,KAUf,OARI1rF,EAAKi+C,SACLytC,EAAW,gBAAC,KAAD,SAGVC,QAAQ3rF,EAAKuI,SAAUypB,QAAQhyB,KAChCyrF,EAAa,gBAAC,KAAD,OAGO,SAApB5mF,EAAQgO,QACJ7S,EAAKuI,QAASojF,QAAQ3rF,EAAKuI,OACpBf,KAAKokF,eAAe5rF,EAAKuI,OAGhC,gBAAC,WAAD,KACI,gBAAC,KAAD,CACIw1C,KAAK,KACLt0C,SAAUzJ,EAAKyJ,SACfqhB,IAAK0gE,IAERhkF,KAAKqkF,eAAe7rF,GACpB0rF,EACAD,GAKTzrF,EAAKuI,QAASojF,QAAQ3rF,EAAKuI,OAEvB,gBAAC,WAAD,KACI,gBAACwiF,GAAD,CAAUviF,UAAU,cACpB,4BAAOxI,EAAKuI,QAMpB,gBAAC,WAAD,KACI,gBAAC,KAAD,CACIw1C,KAAK,KACLt0C,SAAUzJ,EAAKyJ,SACfqhB,IAAK0gE,KAERM,QAAe9rF,GACf0rF,EACAD,MA5FM,oBAiGPljF,IACJf,KAAKH,MAAMI,UACXD,KAAKH,MAAMI,SAASc,EAAM8I,KAAKuxB,GACvBA,EAAEtjC,GACKsjC,EAEJA,EAAEr6B,YAvGF,0BA4GDA,GACd,gBAAC,WAAD,KACI,gBAACyiF,GAAD,CAAcxiF,UAAU,mBACxB,gBAAC,IAAD,CACI9D,IAAI,yCACJpF,GAAIkI,KAAKH,MAAM0kF,sBACf1+E,eAAgB7F,KAAKH,MAAM2kF,2BAC3B5/E,OAAQ,CAAC9K,MAAOiH,GAChB07E,cAAc,OApHP,4BAyHC58E,IAChB,MAAM4kF,EAAa5kF,EAAM6kF,YAAYD,WACrC,OAAKA,EAKD,uBAAKzjF,UAAU,qEACX,gBAAC,IAAD,CACIlJ,GAAIkI,KAAKH,MAAM8kF,iBACf9+E,eAAgB7F,KAAKH,MAAM+kF,sBAC3BhgF,OAAQ,CAAC8P,KAAM+vE,GACfhI,cAAc,IAEZ79E,GACE,gBAAC,uBAAgCiB,EAC5BjB,MAbV,QA5HI,4BAiJA,EAAE2gC,WAAUslD,gBAC3B,sBAASA,EACJtlD,GAAY,gBAAC,KAAD,SAnJF,qBAuJN,CACTulD,iBAAkB9kF,KAAK8kF,iBACvBC,iBAAkB/kF,KAAK+kF,iBACvBh6B,oBAAqB,IAAM,OA1JZ,6BA6JC,CAAC05B,EAAY7vE,KAC7B,GAAsB,eAAlBA,EAAOA,QAA0C,KAAf6vE,EAAmB,CACrD,MAAM7/E,EAAS5E,KAAKH,MAAMkB,MAAM8I,KAAKuxB,GAC7BA,EAAEtjC,GACKsjC,EAEJ,CAAC15B,MAAO05B,EAAGr6B,MAAOq6B,KAG7B,IAAK,MAAMe,KAAUn8B,KAAK9G,MAAMmE,QAAS,CACrC,GAAI2C,KAAKH,MAAM4kF,aAAetoD,EAAOl6B,UAAYjC,KAAKH,MAAM4kF,aAAgB,IAAMtoD,EAAOl6B,SAGrF,OAFAjC,KAAKC,SAAS,IAAI2E,EAAQu3B,SAC1Bn8B,KAAKH,MAAMmlF,cAAc,IAEtB,GAAIhlF,KAAKH,MAAM4kF,aAAetoD,EAAOriC,MAGxC,OAFAkG,KAAKC,SAAS,IAAI2E,EAAQu3B,SAC1Bn8B,KAAKH,MAAMmlF,cAAc,IAKjC,GAAIhlF,KAAKH,MAAMujF,0BAA2Be,QAAQnkF,KAAKH,MAAM4kF,YAAa,CACtE,MAAM3qF,EAAQkG,KAAKH,MAAM4kF,WACzBzkF,KAAKC,SAAS,IAAI2E,EAAQ,CAAC7D,MAAOjH,EAAO4H,MAAO5H,KAChDkG,KAAKH,MAAMmlF,cAAc,KAGX,eAAlBpwE,EAAOA,QAA6C,eAAlBA,EAAOA,QACzC5U,KAAKH,MAAMmlF,cAAcP,MAzLd,yBA6LH,CAACz0C,EAAO3zC,KACpB,MAAM4oF,EAAkB5nF,IACpB2C,KAAK8F,SAAS,CAACzI,YACfhB,EAASgB,IAEPoR,EAASzO,KAAKH,MAAMqlF,YAAYllF,KAAKH,MAAM4kF,WAAYQ,GACzDx2E,GAAUA,EAAO5G,MACjB4G,EAAO5G,KAAKo9E,MApMD,wBAwMJ,CAACj1C,EAAOprC,EAAQvH,IACpB2C,KAAKH,MAAMujF,yBAA8C,IAAnB/lF,EAAQmI,SAAgB2+E,QAAQn0C,KAzM9D,mBA4MT,KACNhwC,KAAKmlF,UAAU92C,QAAQ+2C,kBAAkBplF,KAAKH,MAAM4kF,WAAY,CAAC7vE,OAAQ,cA7M1D,kBAgNV,KACL5U,KAAKmlF,UAAU92C,QAAQ+2C,kBAAkBplF,KAAKH,MAAM4kF,WAAY,CAAC7vE,OAAQ,kBA/MzE5U,KAAKmlF,UAAYxlF,cACjBK,KAAK9G,MAAQ,CACTmE,QAAS,IAgNjBoE,SACI,MAAMmD,EAAS5E,KAAKH,MAAMkB,MAAM8I,KAAKuxB,GAC7BA,EAAEtjC,GACKsjC,EAEJ,CAAC15B,MAAO05B,EAAGr6B,MAAOq6B,KAE7B,OACI,gCACI,gBAAC,IAAD,CACIoB,IAAKx8B,KAAKmlF,UACV1lF,OAAQO,KAAKi1E,aACbh1E,SAAUD,KAAKC,SACfgB,YAAajB,KAAKqlF,cAClBC,iBAAkBtlF,KAAKulF,aACvBnkF,SAAS,EACThC,aAAa,EACb4B,UAAWs4B,KACP,mBACAt5B,KAAKH,MAAM2lF,UAAY,QAAU,GACjC,CAACC,MAAiC,KAA1BzlF,KAAKH,MAAM4kF,aAEvBnlF,gBAAgB,qBAChBuB,YAAab,KAAKH,MAAMgB,YACxBib,WAAY9b,KAAK8b,WACjB4pE,eAAgB1lF,KAAK0lF,eACrBC,kBAAmB3lF,KAAK2lF,kBACxBxkF,gBAAgB,EAChBykF,mBAAmB,EACnBC,iBAAiB,EACjBC,eAAgB9lF,KAAK8lF,eACrBd,cAAehlF,KAAKolF,kBACpBX,WAAYzkF,KAAKH,MAAM4kF,WACvBplF,iBAAiB,EACjByxC,QAAS9wC,KAAK8wC,QACdC,OAAQ/wC,KAAK+wC,OACbg1C,iBAAiB,EACjBhlF,MAAO6D,EACP+tC,aAAY3yC,KAAKH,MAAMmV,YAE1BhV,KAAKH,MAAM2lF,WACR,uBAAKxkF,UAAU,iBACX,gBAAC,IAAD,CACIlJ,GAAIkI,KAAKH,MAAMmmF,eACfngF,eAAgB7F,KAAKH,MAAMomF,oBAC3BrhF,OAAQ5E,KAAKH,MAAMqmF,oBAAsB,KACzCzJ,cAAc,IAEZ79E,GACE,gBAAC,uBAAD,KACKA,KAIZoB,KAAKH,MAAMsmF,gBAAkB,Q,GA3SjC1C,G,YACE,CACf5iF,YAAaywC,WACbt8B,UAAWs8B,sBACX4zC,YAAa5zC,SACbrxC,SAAUqxC,SACVk0C,UAAWl0C,SACX00C,eAAgB10C,WAChB20C,oBAAqB30C,WACrB40C,mBAAoB50C,WACpBvwC,MAAOuwC,YAAkBA,cAAoB,CAACA,WAAkBA,cAChE0zC,cAAe1zC,SACfmzC,WAAYnzC,WACZqzC,iBAAkBrzC,WAClBszC,sBAAuBtzC,WACvBizC,sBAAuBjzC,WACvBkzC,2BAA4BlzC,WAC5BwyC,iBAAkBxyC,WAClByyC,sBAAuBzyC,WACvB8xC,wBAAyB9xC,SACzB60C,eAAgB70C,U,GApBHmyC,G,eAuBK,CAClBkB,kBAAkB3wE,OAAE,qDACpB4wE,sBAAuB,uDACvBL,uBAAuBvwE,OAAE,0CACzBwwE,2BAA4B,kBAC5BV,kBAAkB9vE,OAAE,sCACpB+vE,sBAAuB,UACvByB,WAAW,I,gBCnDJ,SAASY,GAASvmF,GAC7B,MAAM,cAAC+F,IAAiBiyC,SACxB,OACI,uBAAUh4C,EACN,uBACI0J,MAAM,OACNC,OAAO,OACPyjC,QAAQ,YACR3kC,KAAK,MACLqqC,aAAY/sC,EAAc,CAAC9N,GAAI,qBAAsB+N,eAAgB,eAErE,wBAAMwnC,EAAE,mtB,qJCUxB,MAAMg5C,WAAmC1mF,gBAoBrCC,YAAYC,GACRC,MAAMD,GADS,oBAYR,KACHG,KAAKH,MAAMgqC,UACXlsC,QAAW,qBAAsB,mBAErC,MAAMqyC,EAAQhwC,KAAKsmF,cAAcj4C,QAE3Bk4C,EAAY/mF,SAASktE,cAAc,YACzC6Z,EAAUC,UAAYx2C,EAAMjvC,MAC5BwlF,EAAU39E,MAAMwqC,SAAW,QAC3BmzC,EAAU39E,MAAMs4B,QAAU,EAE1B1hC,SAASlB,KAAKmoF,YAAYF,GAC1BA,EAAUG,SAEV,IACI1mF,KAAK8F,SAAS,CAAC6gF,WAAYnnF,SAASonF,YAAY,UAClD,MAAOhvF,GACLoI,KAAK8F,SAAS,CAAC6gF,YAAY,IAE/BJ,EAAU5iD,SAEN3jC,KAAKs1B,SACLO,aAAa71B,KAAKs1B,SAEtBt1B,KAAKs1B,QAAUxU,YAAW,KACtB9gB,KAAK8F,SAAS,CAAC6gF,YAAY,MAC5B,QAtCY,mCAyCOttB,SAAS,CAAChqD,EAAMhT,KACtC2D,KAAKH,MACDw2C,eAAehnC,GACfxH,MAAK,EAAElQ,WACH0E,EAAS1E,GACW,IAAhBA,EAAK6N,OACLxF,KAAK8F,SAAS,CAAC+gF,mBAAoBx3E,IAEnCrP,KAAK8F,SAAS,CAAC+gF,mBAAoB,UAG3CjtE,OAAM,KACFvd,EAAS,SAElB,MAvDgB,uBAyDL,CAACgT,EAAMhT,KACjB,GACI2D,KAAK9G,MAAM2tF,oBACXx3E,EAAKiF,WAAWtU,KAAK9G,MAAM2tF,oBAE3BxqF,EAAS,SAGb,IACI2D,KAAK8mF,wBAAwBz3E,EAAMhT,GACrC,MAAO3E,GACL2E,EAAS,QApEE,oBAwEP0qF,IACR/mF,KAAK8F,SAAS,CAACihF,mBAAiB,KACxB/mF,KAAKgnF,yBAA2BhnF,KAAKH,MAAMgqC,UAC3ClsC,QAAW,qBAAsB,qBAAsB,CAACspF,UAAWjnF,KAAKknF,oBAAsBlnF,KAAK9G,MAAM6tF,eAAevhF,YAGhIxF,KAAKH,MAAMsnF,OACPJ,EAAevhF,OAAS,GAAKxF,KAAK9G,MAAMkuF,oBA/E7B,8BAmFGA,IAClBpnF,KAAK8F,SAAS,CAACshF,oBACfpnF,KAAKH,MAAMsnF,OACPnnF,KAAK9G,MAAM6tF,eAAevhF,OAAS,GAAK4hF,MAtF7B,kBA0FV,KACDpnF,KAAKH,MAAMgqC,UACXlsC,QAAW,qBAAsB,yBAA0B,CAAC0pF,gBAAiBrnF,KAAK9G,MAAM6tF,eAAevhF,SAE3G,MAAMxH,EAAQ,GACR8iF,EAAS,GACf,IAAK,MAAMwG,KAAetnF,KAAK9G,MAAM6tF,gBAC7B5C,QAAQmD,GACRxG,EAAO7hE,KAAKqoE,GAEZtpF,EAAMihB,KAAKqoE,GAGnBtnF,KAAKH,MAAM2I,SAASxK,EAAO8iF,EAAQ9gF,KAAK9G,MAAMkuF,oBAvG/B,6BA0GC,KAChB,MAAM,kBAAC7uC,GAAqBv4C,KAAKH,OAC3B,eAACknF,GAAkB/mF,KAAK9G,MAC9B,OAAOq/C,GAAqBA,EAAkBgvC,gBAAkBR,EAAevhF,UA7GhE,iCAgHK,KACpB,MAAM,UAACmkC,EAAD,QAAYE,EAAZ,kBAAqB0O,GAAqBv4C,KAAKH,MAErD,GAAI04C,GAAwD,SAAnCA,EAAkBxO,aACvC,OAAO,EAGX,GAAkB,MAAdJ,IAAsBE,EACtB,OAAO,EAIX,MAAM29C,EAAiBxnF,KAAKknF,oBAC5B,OAAuB,IAAnBM,GAAuD,KAA/BxnF,KAAK9G,MAAMkuF,iBAE5BI,EAAiB,KA7H5BxnF,KAAKsmF,cAAgB3mF,cACrBK,KAAKs1B,QAAU,KACft1B,KAAK9G,MAAQ,CACT6tF,eAAgB,GAChBJ,YAAY,EACZE,mBAAoB,KACpBO,gBAAiB,IA6HzB3lF,SACI,MAAMgmF,GACFr7E,WAAe,6BAA+BpM,KAAKH,MAAM6nF,SAE7D,IAAI7mF,GAAcuJ,QACd,sDACA,kCAEAu6E,GAAmB3wE,OACnB,sEAEA4wE,EACA,yDAEC5kF,KAAKH,MAAMujF,0BACZviF,GAAcuJ,QACV,qEACA,eAEJu6E,GAAmB3wE,OACf,qFAEJ4wE,EAAwB,oCAG5B,MAAM,kBAACrsC,GAAqBv4C,KAAKH,MAC3B8nF,EAAiBpvC,GAAqBA,EAAkBgvC,gBACxDK,EAA8B5nF,KAAK9G,MAAM6tF,eAAevhF,OAASwJ,4BAAwE,IAArChP,KAAK9G,MAAM6tF,eAAevhF,OAE9HqiF,EAAkB,CACpBrC,UAAWxlF,KAAKgnF,wBAChBhB,gBAAgBhyE,OACZ,wDAEJiyE,oBAAqB,+GACrBC,mBAAoB,CAChBvpD,IAAKgrD,EAAiB,EAAI,IAAMA,GAEpCxB,eAAiBnmF,KAAKH,MAAM+pC,YAAc,gBAAC,KAAD,CAAapC,cAAc,qCAAuC,gBAAC,IAAD,OAYhH,OATIxnC,KAAK9G,MAAM6tF,eAAevhF,OAASwJ,6BACnC64E,EAAgBrC,WAAY,EAC5BqC,EAAgB7B,gBAAiBhyE,OAC7B,kEAEJ6zE,EAAgB5B,oBAAsB,wDACtC4B,EAAgB3B,mBAAmBxxE,KAAO1F,4BAI1C,uBAAKhO,UAAU,8BACX,uBAAKA,UAAU,cACX,gBAACsiF,EAAD,OAEJ,sBAAIxrF,GAAG,0BACH,gBAAC,IAAD,CACIA,GAAG,iCACH+N,eAAe,mCACfjB,OAAQ,CAACu6B,SAAUn/B,KAAKH,MAAMs/B,aAGtC,uBACIn+B,UAAU,aACV0vC,cAAY,aAEZ,0BACI,gBAAC,IAAD,CACI54C,GAAG,4CACH+N,eAAe,qBAGvB,uBAAK7E,UAAU,0BACX,yBACIw7B,IAAKx8B,KAAKsmF,cACVtlF,UAAU,mBACVnF,KAAK,OACLgiD,UAAU,EACV98C,MAAO0mF,EACP90C,aAAY3yC,KAAKH,MAAM8F,KAAKC,cAAc,CACtC9N,GAAI,4CACJ+N,eAAgB,qBAEpB6qC,cAAY,mBAEhB,0BACI1vC,UAAU,0BACVuJ,QAASvK,KAAKopD,SACd1Y,cAAY,wBAEZ,gBAAC01C,GAAD,OACEpmF,KAAK9G,MAAMytF,YACT,gBAAC,IAAD,CACI7uF,GAAG,kDACH+N,eAAe,cAGtB7F,KAAK9G,MAAMytF,YACR,gBAAC,IAAD,CACI7uF,GAAG,kDACH+N,eAAe,kBAK/B,uBAAK7E,UAAU,aACX,gBAAC,IAAD,CACIlJ,GAAG,kDACH+N,eAAe,qDAI3B,uBAAK7E,UAAU,uBACX,2BACA,2BACI,gBAAC,IAAD,CACIlJ,GAAG,8BACH+N,eAAe,SAI3B,uBACI7E,UAAU,iBACV0vC,cAAY,aAEZ,0BACI,gBAAC,IAAD,CACI54C,GAAG,gDACH+N,eAAe,0BAGvB,uBAAK6qC,cAAY,oBACb,gBAAC+yC,GAAD,iBACQoE,EADR,CAEI3C,YAAallF,KAAKklF,YAClBrkF,YAAaA,EACbmU,WAAW5K,QACP,gDACA,iBAEJnK,SAAUD,KAAKC,SACfc,MAAOf,KAAK9G,MAAM6tF,eAClBxC,uBAAuBvwE,OACnB,2DAEJwwE,2BAA2B,sCAC3BG,iBAAkBA,EAClBC,sBAAuBA,EACvBI,cAAehlF,KAAK8nF,mBACpBrD,WAAYzkF,KAAK9G,MAAMkuF,gBACvBhE,wBACIpjF,KAAKH,MAAMujF,4BAIvB,uBAAKpiF,UAAU,aACVhB,KAAKH,MAAMujF,yBACR,gBAAC,IAAD,CACItrF,GAAG,sDACH+N,eAAe,gEAGrB7F,KAAKH,MAAMujF,yBACT,gBAAC,IAAD,CACItrF,GAAG,qEACH+N,eAAe,yCAK/B,uBAAK7E,UAAU,kBACX,0BACIA,UACI,QACC4mF,EACG,eACA,eAERr9E,QAASvK,KAAKuG,OACd3C,SAAUgkF,EACV9vF,GAAG,uBAEH,gBAAC,IAAD,CACIA,GAAG,yCACH+N,eAAe,uB,GAjVrCwgF,G,YACiB,CACflnD,SAAUmS,sBACV1+B,cAAe0+B,sBACf3rC,KAAM2rC,QACNo2C,SAAUp2C,sBACV+E,eAAgB/E,oBAChB8xC,wBAAyB9xC,oBACzB61C,OAAQ71C,oBACR9oC,SAAU8oC,oBACV3H,UAAW2H,sBACXy2C,aAAcz2C,sBACd1H,YAAa0H,oBACbzH,QAASyH,oBACTiH,kBAAmBjH,WACnBhvC,QAASgvC,UAAgB,CACrB3uB,qBAAsB2uB,sBACvBixB,aAyUX,UAAe93D,SAAW4/B,QAAyBg8C,KCnVnD,IAAeliF,cAff,SAAyBjL,GACrB,MAAO,CACHywC,WAAWlxB,QAAUvf,GAAOsxC,2BAC5BZ,aAAao+C,SAAQltE,QAAe5hB,GAAO00B,OAC3Cic,QAAqC,UAA5Bne,QAAWxyB,GAAOwpB,MAC3B61B,mBAAmB0vC,QAAwB/uF,OAInD,SAA4B9B,GACxB,MAAO,CACHkL,SAAS+B,wBAAmB,CAACse,qBAAoBA,MAAGvrB,MAI5D,CAA4DivF,IC5B7C,SAAS6B,GAAgBroF,GACpC,MAAM,cAAC+F,IAAiBiyC,SACxB,OACI,uBAAUh4C,EACN,uBACI0J,MAAM,OACNC,OAAO,OACPyjC,QAAQ,YACR3kC,KAAK,MACLqqC,aAAY/sC,EAAc,CAAC9N,GAAI,sBAAuB+N,eAAgB,gBAEtE,wBACIwnC,EAAE,2S,gKCIP,MAAM86C,WAAsBxoF,gBAsBvCC,YAAYC,GACRC,MAAMD,GADS,0BAQDuC,GAAYA,EAAQtK,KARnB,6BAUC,CAAC2sF,EAAY7vE,KAC7B,GAAsB,eAAlBA,EAAOA,QAA0C,KAAf6vE,EAClC,IAAK,MAAMtoD,KAAUn8B,KAAK9G,MAAMmE,QAC5B,GAAI2C,KAAKH,MAAM4kF,aAAetoD,EAAO/7B,KAGjC,OAFAJ,KAAKC,SAAS,IAAID,KAAKH,MAAMkB,MAAOo7B,SACpCn8B,KAAKH,MAAMmlF,cAAc,IAKf,eAAlBpwE,EAAOA,QAA6C,eAAlBA,EAAOA,QACzC5U,KAAKH,MAAMmlF,cAAcP,MArBd,yBAyBH,CAACz0C,EAAO3zC,KACpB,MAAM4oF,EAAkB5nF,IACpB2C,KAAK8F,SAAS,CAACzI,YACfhB,EAASgB,IAEPoR,EAASzO,KAAKH,MAAMuoF,eAAepoF,KAAKH,MAAM4kF,WAAYQ,GAC5Dx2E,GAAUA,EAAO5G,MACjB4G,EAAO5G,KAAKo9E,MAhCD,0BAoCF,KACb,MAAMvwE,EACF,gBAAC,IAAD,CACI5c,GAAIkI,KAAKH,MAAMikF,iBACfj+E,eAAgB7F,KAAKH,MAAMkkF,wBAInC,OAAQ,gBAAC,KAAD,CAAgBrvE,KAAMA,OA5Cf,4BA+CC7U,IAChB,MAAM4kF,EAAa5kF,EAAM6kF,YAAYD,WACrC,OAAKA,EAID,uBAAKzjF,UAAU,6DACX,gBAAC,IAAD,CACIlJ,GAAIkI,KAAKH,MAAMwoF,mBACfxiF,eAAgB7F,KAAKH,MAAMyoF,wBAC3B1jF,OAAQ,CAAC8P,KAAM+vE,KAEb7lF,GACE,gBAAC,uBAAgCiB,EAC5BjB,MAXV,QAlDI,6BAqEEwD,IACjB,IAAIgH,EAAO,gBAAC,KAAD,CAAmBpI,UAAU,wBAIxC,OAHIoB,EAAQvG,OAASmT,uBACjB5F,EAAO,gBAAC,KAAD,CAAoBpI,UAAU,0BAGrC,gBAAC,WAAD,KACKoI,EACAhH,EAAQC,aACT,wBAAMrB,UAAU,gBAAgBoB,EAAQhC,UA9EjC,oBAmFPW,IACJf,KAAKH,MAAMI,UACXD,KAAKH,MAAMI,SAASc,MArFT,4BAyFA,EAAEw+B,WAAUslD,gBAC3B,sBAASA,EACJtlD,GAAY,gBAAC,KAAD,SA3FF,qBA+FN,CACTulD,iBAAkB9kF,KAAK8kF,iBACvBC,iBAAkB/kF,KAAK+kF,iBACvBh6B,oBAAqB,IAAM,OAlGZ,mBAqGT,KACN/qD,KAAKmlF,UAAU92C,QAAQ+2C,kBAAkBplF,KAAKH,MAAM4kF,WAAY,CAAC7vE,OAAQ,cApGzE5U,KAAKmlF,UAAYxlF,cACjBK,KAAK9G,MAAQ,CACTmE,QAAS,IAqGjBoE,SACI,OACI,gBAAC8mF,GAAA,QAAD,CACI/rD,IAAKx8B,KAAKmlF,UACV1lF,OAAQO,KAAKi1E,aACbh1E,SAAUD,KAAKC,SACfgB,YAAajB,KAAKqlF,cAClBjkF,SAAS,EACThC,aAAa,EACb4B,UAAWs4B,KAAW,gBAAiB,CAACmsD,MAAiC,KAA1BzlF,KAAKH,MAAM4kF,aAC1DnlF,gBAAgB,iBAChBuB,YAAab,KAAKH,MAAMgB,YACxBib,WAAY9b,KAAK8b,WACjB4pE,eAAgB1lF,KAAK0lF,eACrBC,kBAAmB3lF,KAAK2lF,kBACxB6C,iBAAkBxoF,KAAKwoF,iBACvB1C,eAAgB9lF,KAAK8lF,eACrB3kF,gBAAgB,EAChBykF,mBAAmB,EACnBC,iBAAiB,EACjBb,cAAehlF,KAAKolF,kBACpBX,WAAYzkF,KAAKH,MAAM4kF,WACvBplF,iBAAiB,EACjByxC,QAAS9wC,KAAK8wC,QACdi1C,iBAAiB,EACjBhlF,MAAOf,KAAKH,MAAMkB,MAClB4xC,aAAY3yC,KAAKH,MAAMmV,a,4HAzJlBmzE,G,YACE,CACftnF,YAAaywC,WACbt8B,UAAWs8B,sBACX82C,eAAgB92C,SAChBrxC,SAAUqxC,SACVvwC,MAAOuwC,YAAkBA,YACzB0zC,cAAe1zC,SACfmzC,WAAYnzC,WACZwyC,iBAAkBxyC,WAClByyC,sBAAuBzyC,WACvB+2C,mBAAoB/2C,WACpBg3C,wBAAyBh3C,a,GAZZ62C,G,eAeK,CAClBrE,kBAAkB9vE,OAAE,kCACpB+vE,sBAAuB,UACvBsE,oBAAoBr0E,OAAE,gCACtBs0E,wBAAyB,sBCjBjC,MAAMG,WAAkC9oF,gBAqBpCC,YAAYC,GACRC,MAAMD,GADS,+BAaIknF,IACnB/mF,KAAK8F,SAAS,CAACihF,mBACf/mF,KAAKH,MAAMsnF,OAAOJ,EAAevhF,OAAS,GAAKxF,KAAK9G,MAAM0jB,SAASpX,OAAS,GAAkC,KAA7BxF,KAAK9G,MAAMwvF,eAAwB1oF,KAAK9G,MAAMkuF,iBAAmBpnF,KAAK9G,MAAMyvF,uBAf9I,4BAkBC/rE,IAChB5c,KAAK8F,SAAS,CAAC8W,aACf5c,KAAKH,MAAMsnF,OAAOnnF,KAAK9G,MAAM6tF,eAAevhF,OAAS,GAAKoX,EAASpX,OAAS,GAAkC,KAA7BxF,KAAK9G,MAAMwvF,eAAwB1oF,KAAK9G,MAAMkuF,iBAAmBpnF,KAAK9G,MAAMyvF,uBApB9I,2BAuBAhqF,IACfqB,KAAK8F,SAAS,CAAC4iF,cAAe/pF,EAAEu7B,OAAOn5B,QACvCf,KAAKH,MAAMsnF,OAAOnnF,KAAK9G,MAAM6tF,eAAevhF,OAAS,GAAKxF,KAAK9G,MAAM0jB,SAASpX,OAAS,GAAwB,KAAnB7G,EAAEu7B,OAAOn5B,OAAgBf,KAAK9G,MAAMkuF,iBAAmBpnF,KAAK9G,MAAMyvF,uBAzB/I,8BA4BGvB,IAClBpnF,KAAK8F,SAAS,CAACshF,oBACfpnF,KAAKH,MAAMsnF,OAAOnnF,KAAK9G,MAAM6tF,eAAevhF,OAAS,GAAKxF,KAAK9G,MAAM0jB,SAASpX,OAAS,GAAkC,KAA7BxF,KAAK9G,MAAMwvF,eAAwBtB,GAAmBpnF,KAAK9G,MAAMyvF,uBA9B9I,iCAiCMA,IACrB3oF,KAAK8F,SAAS,CAAC6iF,uBACf3oF,KAAKH,MAAMsnF,OAAOnnF,KAAK9G,MAAM6tF,eAAevhF,OAAS,GAAKxF,KAAK9G,MAAM0jB,SAASpX,OAAS,GAAkC,KAA7BxF,KAAK9G,MAAMwvF,eAAwB1oF,KAAK9G,MAAMkuF,iBAAmBuB,MAnC9I,mCAsCOtvB,SAAS,CAAChqD,EAAMhT,KACtC2D,KAAKH,MAAMw2C,eAAehnC,GAAMxH,MAAK,EAAElQ,WACnC0E,EAAS1E,GACW,IAAhBA,EAAK6N,OACLxF,KAAK8F,SAAS,CAAC+gF,mBAAoBx3E,IAEnCrP,KAAK8F,SAAS,CAAC+gF,mBAAoB,UAExCjtE,OAAM,KACLvd,EAAS,SAEd,MAjDgB,uBAmDL,CAACgT,EAAMhT,KACjB,GAAI2D,KAAK9G,MAAM2tF,oBAAsBx3E,EAAKiF,WAAWtU,KAAK9G,MAAM2tF,oBAC5DxqF,EAAS,SAGb,IACI2D,KAAK8mF,wBAAwBz3E,EAAMhT,GACrC,MAAO3E,GACL2E,EAAS,QA3DE,mCA+DOg9D,SAAUhqD,GAASrP,KAAKH,MAAM+oF,eAAe5oF,KAAKH,MAAM+S,cAAevD,IAAO,MA/DrF,0BAiEF9X,SACRwJ,GAILf,KAAK6oF,wBAAwB9nF,GACtBf,KAAKH,MAAMipF,oBAAoBxhF,QAAQlF,GACnCA,EAAQC,aAAagQ,cAAciC,WAAWvT,EAAMsR,gBAAkBjQ,EAAQhC,KAAKiS,cAAciC,WAAWvT,EAAMsR,kBALlHrS,KAAKH,MAAMipF,sBAnEP,6BA4EC,KAChB9oF,KAAK8F,SAAS,CAACijF,mBAAmB,IAClCjoE,YAAW,KACH9gB,KAAKgpF,YAAY36C,SACjBruC,KAAKgpF,YAAY36C,QAAQp0B,cAhFlB,8BAqFE,KACjBja,KAAK8F,SAAS,CAACijF,mBAAmB,OAtFnB,uBAyFL,KACV,MAAM/qF,EAAQ,GACR8iF,EAAS,GACf,IAAK,MAAMwG,KAAetnF,KAAK9G,MAAM6tF,gBAC7B5C,QAAQmD,GACRxG,EAAO7hE,KAAKqoE,GAEZtpF,EAAMihB,KAAKqoE,GAGnBtnF,KAAKH,MAAM2I,SAASxK,EAAO8iF,EAAQ9gF,KAAK9G,MAAM0jB,SAAU5c,KAAK9G,MAAM6vF,kBAAoB/oF,KAAK9G,MAAMwvF,cAAgB,GAAI1oF,KAAK9G,MAAMkuF,gBAAiBpnF,KAAK9G,MAAMyvF,uBAnG9I,6BAsGC,KAChB,MAAM,kBAACpwC,GAAqBv4C,KAAKH,OAC3B,eAACknF,GAAkB/mF,KAAK9G,MAC9B,OAAOq/C,GAAqBA,EAAkBgvC,gBAAkBR,EAAevhF,UAzGhE,iCA4GK,KACpB,MAAM,UACFmkC,EADE,YAEFC,EAFE,QAGFC,EAHE,kBAIF0O,GACAv4C,KAAKH,MAET,GAAI04C,GAAwD,SAAnCA,EAAkBxO,aACvC,OAAO,EAGX,GAAkB,MAAdJ,IAAsBC,IAAgBC,EACtC,OAAO,EAIX,MAAM29C,EAAiBxnF,KAAKknF,oBAC5B,OAAuB,IAAnBM,GAAuD,KAA/BxnF,KAAK9G,MAAMkuF,iBAE5BI,EAAiB,KA9H5BxnF,KAAKgpF,YAAcrpF,cACnBK,KAAK9G,MAAQ,CACT6vF,kBAAmBnoD,QAAQ/gC,EAAMgG,gBACjC6iF,cAAe7oF,EAAMgG,gBAAkB,GACvCkhF,eAAgB,GAChBnqE,SAAU/c,EAAMopF,iBAAmB,GACnC7B,gBAAiB,GACjBuB,mBAAoB,IA6H5BlnF,SACI,IAAIynF,GAAmB9+E,QAAgB,qDAAsD,iCACzFu6E,GAAmB3wE,OAAE,qEACrB4wE,EAAwB,yDAEvB5kF,KAAKH,MAAMujF,0BACZ8F,GAAmB9+E,QAAgB,oEAAqE,cACxGu6E,GAAmB3wE,OAAE,oFACrB4wE,EAAwB,oCAG5B,MAAM,kBAACrsC,GAAqBv4C,KAAKH,MAC3B8nF,EAAiBpvC,GAAqBA,EAAkBgvC,gBAC9D,OACI,uBAAKvmF,UAAU,6BACX,uBAAKA,UAAU,cACX,gBAAC4hF,EAAD,OAEJ,sBAAI9qF,GAAG,0BACH,gBAAC,IAAD,CACIA,GAAG,gCACH+N,eAAe,kCACfjB,OAAQ,CAACu6B,SAAUn/B,KAAKH,MAAMs/B,aAGtC,uBACIn+B,UAAU,aACV0vC,cAAY,aAEZ,0BACI,gBAAC,IAAD,CACI54C,GAAG,2CACH+N,eAAe,mBAGvB,uBAAK6qC,cAAY,oBACb,gBAAC+yC,GAAD,CACIyB,YAAallF,KAAKklF,YAClBrkF,YAAaqoF,EACbl0E,WAAW5K,QACP,2CACA,iBAEJo7E,UAAWxlF,KAAKgnF,wBAChBhB,gBAAgBhyE,OACZ,wDAEJiyE,oBACI,+GAEJC,mBAAoB,CAChBvpD,IAAKgrD,EAAiB,EAAI,IAAMA,GAEpCxB,eAAiB,gBAAC,KAAD,CAAav2C,YAAcjxC,GAAMqB,KAAKiuC,gBAAgBtvC,KACvEsB,SAAUD,KAAKmpF,oBACfpoF,MAAOf,KAAK9G,MAAM6tF,eAClB/B,cAAehlF,KAAK8nF,mBACpBrD,WAAYzkF,KAAK9G,MAAMkuF,gBACvB7C,uBAAuBvwE,OACnB,0DAEJwwE,2BAA2B,gCAC3BG,iBAAkBA,EAClBC,sBAAuBA,EACvBxB,wBACIpjF,KAAKH,MAAMujF,2BAIvB,uBAAKpiF,UAAU,aACVhB,KAAKH,MAAMujF,yBACR,gBAAC,IAAD,CACItrF,GAAG,iDACH+N,eAAe,8DAGrB7F,KAAKH,MAAMujF,yBACT,gBAAC,IAAD,CACItrF,GAAG,gEACH+N,eAAe,2BAK/B,uBACI7E,UAAU,eACV0vC,cAAY,sBAEZ,0BACI,gBAAC,IAAD,CACI54C,GAAG,6CACH+N,eAAe,6BAGvB,2BACI,gBAAC,IAAD,CACI/N,GAAG,mDACH+N,eAAe,4BAEbhF,GACE,gBAACsnF,GAAD,CACItnF,YAAaA,EACbmU,WAAW5K,QACP,6CACA,2BAEJg+E,eAAgBpoF,KAAKooF,eACrBnoF,SAAUD,KAAKopF,iBACfpE,cAAehlF,KAAKqpF,sBACpB5E,WAAYzkF,KAAK9G,MAAMyvF,mBACvB5nF,MAAOf,KAAK9G,MAAM0jB,cAKlC,uBAAK5b,UAAU,aACX,gBAAC,IAAD,CACIlJ,GAAG,mDACH+N,eAAe,sDAI3B,uBACI7E,UAAU,iBACV0vC,cAAY,kBAEV1wC,KAAK9G,MAAM6vF,mBACT,qBACIx+E,QAASvK,KAAKspF,kBACdlvD,KAAK,KAEL,gBAAC,IAAD,CACItiC,GAAG,8CACH+N,eAAe,0BAI1B7F,KAAK9G,MAAM6vF,mBACR,gBAAC,WAAD,KACI,2BACI,gBAAC,IAAD,CACIjxF,GAAG,+CACH+N,eAAe,mBAEnB,gBAACqiF,GAAD,CACI39E,QAASvK,KAAKupF,sBAGtB,4BACI/sD,IAAKx8B,KAAKgpF,YACV/oF,SAAUD,KAAKwpF,gBACfzoF,MAAOf,KAAK9G,MAAMwvF,iBAI9B,uBAAK1nF,UAAU,aACX,gBAAC,IAAD,CACIlJ,GAAG,qDACH+N,eAAe,iEAI3B,uBAAK7E,UAAU,iBACX,0BACIA,UACI,QACgC,IAA/BhB,KAAK9G,MAAM0jB,SAASpX,QACgB,IAArCxF,KAAK9G,MAAM6tF,eAAevhF,OACtB,eACA,eAER5B,SACmC,IAA/B5D,KAAK9G,MAAM0jB,SAASpX,QACiB,IAArCxF,KAAK9G,MAAM6tF,eAAevhF,OAE9B+E,QAASvK,KAAKypF,YACd3xF,GAAG,qBAEH,gBAAC,IAAD,CACIA,GAAG,wCACH+N,eAAe,sB,GA/UrC4iF,G,YACiB,CACftpD,SAAUmS,sBACVw3C,oBAAqBx3C,qBACrB1+B,cAAe0+B,sBACf+E,eAAgB/E,oBAChBs3C,eAAgBt3C,oBAChB23C,gBAAiB33C,UACjBzrC,eAAgByrC,WAChB61C,OAAQ71C,oBACR9oC,SAAU8oC,oBACV8xC,wBAAyB9xC,oBACzB3H,UAAW2H,sBACX1H,YAAa0H,oBACbzH,QAASyH,oBACTiH,kBAAmBjH,WACnBhvC,QAASgvC,UAAgB,CACrB3uB,qBAAsB2uB,sBACvBixB,aAsUX,UAAel4B,QAAyBo+C,IC9UxC,IAAetkF,cAff,SAAyBjL,GACrB,MAAO,CACHywC,WAAWlxB,QAAUvf,GAAOsxC,2BAC5BZ,aAAao+C,SAAQltE,QAAe5hB,GAAO00B,OAC3Cic,QAAqC,UAA5Bne,QAAWxyB,GAAOwpB,MAC3B61B,mBAAmB0vC,QAAwB/uF,OAInD,SAA4B9B,GACxB,MAAO,CACHkL,SAAS+B,wBAAmB,CAACse,qBAAoBA,MAAGvrB,MAI5D,CAA4DqxF,IC5B7C,SAASiB,GAAU7pF,GAC9B,MAAM,cAAC+F,IAAiBiyC,SACxB,OACI,uBAAUh4C,EACN,uBACI0J,MAAM,OACNC,OAAO,OACPyjC,QAAQ,YACR3kC,KAAK,MACLqqC,aAAY/sC,EAAc,CAAC9N,GAAI,sBAAuB+N,eAAgB,gBAEtE,wBAAMwnC,EAAE,0LCCT,MAAMs8C,WAAsChqF,gBAKvD8B,SACI,MAAM,WAACmoF,GAAc5pF,KAAKH,MAC1B,IAAIuJ,EACAnH,EACAjB,EACAijF,EACAC,EAEJ,GAAI0F,EAAWpxF,KAAM,CACjBwI,EAAY,OACZ,MAAMgjF,GAAalV,QAAgB8a,EAAWpxF,KAAKV,GAAI8xF,EAAWpxF,KAAKg3C,qBACvEpmC,EACI,gBAAC,KAAD,CACInH,SAAU2nF,EAAWpxF,KAAKyJ,SAC1BqhB,IAAK0gE,EACLztC,KAAK,OAGbt0C,GAAW4nF,QAAmBD,EAAWpxF,MACrCoxF,EAAWpxF,KAAKi+C,SAChBytC,EAAW,gBAAC,KAAD,QAEX15D,QAAQo/D,EAAWpxF,QACnByrF,EAAa,gBAAC,KAAD,YAEV2F,EAAW9vF,OAClBkH,EAAY,QACZoI,EAAO,gBAAC,GAAD,CAAWpI,UAAU,cAC5BiB,EAAW2nF,EAAW9vF,QAEtBkH,EAAY,OACZoI,EAAO,gBAACsgF,GAAD,CAAW1oF,UAAU,eAC5BiB,EAAW2nF,EAAWl1E,MAG1B,IAAI0sE,EAASwI,EAAWxI,OAWxB,OAVIwI,EAAWxI,QAAUwI,EAAWxI,OAAOtpF,KACvCspF,EACI,gBAAC,IAAD,CACItpF,GAAI8xF,EAAWxI,OAAOtpF,GACtB+N,eAAgB+jF,EAAWxI,OAAOxiF,QAClCgG,OAAQglF,EAAWxI,OAAOx8E,UAMlC,uBAAK5D,UAAU,iCACX,uBAAKA,UAAU,oBACVoI,EACD,wBAAMpI,UAAWA,GACZiB,EACAiiF,EACAD,IAGT,uBAAKjjF,UAAU,UACVogF,K,gBA9DAuI,G,kBACE,CACfC,WAAYt4C,uB,qGCTL,MAAMw4C,WAAwCnqF,gBAIzD8B,SACI,OACI,uBAAKT,UAAU,mCACX,uBAAKA,UAAU,gBACX,uBAAKA,UAAU,iBACX,gBAAC,IAAD,CACIlJ,GAAG,yCACH+N,eAAe,YAGvB,uBAAK7E,UAAU,kBACX,gBAAC,IAAD,CACIlJ,GAAG,0CACH+N,eAAe,cAI3B,uBAAK7E,UAAU,QACVhB,KAAKH,MAAMkqF,QAAQlgF,KAAK+/E,GACrB,gBAACD,GAAD,CACIzsF,IAAK0sF,EAAWl1E,MAAQk1E,EAAW9vF,OAAS8vF,EAAWpxF,KAAKV,GAC5D8xF,WAAYA,S,wOAzBnBE,G,YACE,CACfC,QAASz4C,YAAkBA,YAAkBixB,aCEtC,MAAMynB,WAAmCrqF,gBAAoB,iEAU9C,CAACsqF,EAAkBC,IACrCD,EAAmB,GAAKC,EAAsB,EAE1C,gBAAC,IAAD,CACIpyF,GAAG,4CACH+N,eAAe,yRACfjB,OAAQ,CAACulF,UAAWF,EAAkBG,aAAcF,KAK5DD,EAAmB,GAA6B,IAAxBC,EAEpB,gBAAC,IAAD,CACIpyF,GAAG,6DACH+N,eAAe,oIACfjB,OAAQ,CAACulF,UAAWF,KAIP,IAArBA,GAA0BC,EAAsB,EAE5C,gBAAC,IAAD,CACIpyF,GAAG,yDACH+N,eAAe,kJACfjB,OAAQ,CAACwlF,aAAcF,KAK/B,gBAAC,IAAD,CACIpyF,GAAG,sEACH+N,eAAe,yBAK3BpE,SACI,MAAM,SAAC09B,EAAD,YAAWkrD,EAAX,YAAwBC,EAAxB,eAAqCC,EAArC,OAAqDC,EAArD,aAA6DC,GAAgBzqF,KAAKH,MACxF,OACI,uBAAKmB,UAAU,8BACX,uBAAKA,UAAU,cACX,gBAAC4hF,EAAD,OAEHyH,IAAgBK,oBACb,sBAAI5yF,GAAG,0BACH,gBAAC,IAAD,CACIA,GAAG,yCACH+N,eAAe,wCACfjB,OAAQ,CAACu6B,eAGpBkrD,IAAgBK,mBACb,sBAAI5yF,GAAG,0BACH,gBAAC,IAAD,CACIA,GAAG,wCACH+N,eAAe,uCACfjB,OAAQ,CAACu6B,eAGrB,sBAAIn+B,UAAU,YACThB,KAAK2qF,wBAAwBL,EAAY9kF,OAAQ+kF,EAAe/kF,SAEpE8kF,EAAY9kF,OAAS,GAClB,uBAAKxE,UAAU,iCACX,0BACI,gBAAC,IAAD,CACIlJ,GAAG,uCACH+N,eAAe,wBAGvB,gBAACikF,GAAD,CAAiCC,QAASO,KAEjDC,EAAe/kF,OAAS,GACrB,uBAAKxE,UAAU,qCACX,0BACI,gBAAC,IAAD,CACIlJ,GAAG,2CACH+N,eAAe,0BAGvB,gBAACikF,GAAD,CAAiCC,QAASQ,KAElD,uBAAKvpF,UAAU,sBACX,0BACIA,UAAU,kBACVuJ,QAASkgF,GAET,gBAAC,IAAD,CACI3yF,GAAG,+BACH+N,eAAe,wBAGvB,0BACI7E,UAAU,+BACVuJ,QAASigF,GAET,gBAAC,IAAD,CACI1yF,GAAG,gCACH+N,eAAe,a,4HA7GtBmkF,G,YACE,CACf7qD,SAAUmS,sBACVk5C,OAAQl5C,oBACRm5C,aAAcn5C,oBACd+4C,YAAa/4C,UAAgB,CAACo5C,mBAA2BA,oBAA2BnoB,WACpF+nB,YAAah5C,qBACbi5C,eAAgBj5C,uBCAxB,MAAMs5C,GAAgB,UAChBC,GAAuB,UACvBC,GAAsB,SACtBC,GAAuB,UAEd,MAAMC,WAAwBrrF,gBAyBzCC,YAAYC,GACRC,MAAMD,GADS,gBAFXF,eAEW,yBAqCH,KACRK,KAAKH,MAAMorF,aAAejrF,KAAKH,MAAMqrF,gBACrClrF,KAAKmrF,kBACEnrF,KAAKH,MAAMorF,YAClBjrF,KAAKgjF,cACEhjF,KAAKH,MAAMqrF,gBAClBlrF,KAAKijF,aAELjjF,KAAKyhB,WA7CM,2BAiDD,KACVzhB,KAAK9G,MAAMkyF,WACXprF,KAAK8F,SAAS,CAACulF,aAAa,IAE5BrrF,KAAK8F,SAAS,CAACwlF,KAAMV,GAAeQ,YAAY,EAAOG,mBAAoB,GAAIC,mBAAoB,GAAIC,SAAUzrF,KAAK9G,MAAMoyF,OAE5HtrF,KAAK0rF,OAAS1rF,KAAK0rF,MAAMr9C,SACzBruC,KAAK0rF,MAAMr9C,QAAQv5B,kBAxDR,uBA4DL,KACN9U,KAAKH,MAAMgqC,UACXlsC,QAAW,qBAAsB,wBAErCqC,KAAK8F,SAAS,CAACwlF,KAAMT,GAAsBY,SAAUzrF,KAAK9G,MAAMoyF,KAAMF,YAAY,EAAOd,YAAa,GAAIC,eAAgB,GAAIF,YAAaK,qBACvI1qF,KAAK0rF,OAAS1rF,KAAK0rF,MAAMr9C,SACzBruC,KAAK0rF,MAAMr9C,QAAQv5B,kBAlER,sBAsEN,KACL9U,KAAKH,MAAMgqC,UACXlsC,QAAW,qBAAsB,uBAErCqC,KAAK8F,SAAS,CAACwlF,KAAMR,GAAqBW,SAAUzrF,KAAK9G,MAAMoyF,KAAMF,YAAY,EAAOd,YAAa,GAAIC,eAAgB,GAAIF,YAAaK,oBACtI1qF,KAAK0rF,OAAS1rF,KAAK0rF,MAAMr9C,SACzBruC,KAAK0rF,MAAMr9C,QAAQv5B,kBA5ER,wBAgFJ,KACP9U,KAAK9G,MAAMuyF,WAAaX,GACxB9qF,KAAK8F,SAAS,CAACwlF,KAAMR,GAAqBW,SAAUzrF,KAAK9G,MAAMoyF,KAAMF,YAAY,EAAOd,YAAa,GAAIC,eAAgB,GAAIF,YAAaK,oBACnI1qF,KAAK9G,MAAMuyF,WAAaZ,IAC/B7qF,KAAK8F,SAAS,CAACwlF,KAAMT,GAAsBY,SAAUzrF,KAAK9G,MAAMoyF,KAAMF,YAAY,EAAOd,YAAa,GAAIC,eAAgB,GAAIF,YAAaK,qBAE3I1qF,KAAK0rF,OAAS1rF,KAAK0rF,MAAMr9C,SACzBruC,KAAK0rF,MAAMr9C,QAAQv5B,kBAvFR,2BA2FD,IACV9U,KAAK9G,MAAMoyF,OAASP,IAAwB/qF,KAAK9G,MAAMqxF,eAAe/kF,OAAS,EACxExF,KAAK2rF,cAEX3rF,KAAK9G,MAAMoyF,OAAST,IAAwB7qF,KAAK9G,MAAMoyF,OAASR,KAAwB9qF,KAAKH,MAAMqrF,iBAAmBlrF,KAAKH,MAAMorF,YAC3HjrF,KAAKmrF,gBAET,OAlGQ,kBAqGTC,IACNprF,KAAK8F,SAAS,CAACslF,kBAtGA,iBAyGX,KACAprF,KAAK9G,MAAMkyF,WACXprF,KAAK8F,SAAS,CAAC8lF,cAAc,IAE7B5rF,KAAKH,MAAMyC,QAAQu/B,gBA7GR,uBAiHL,KACV7hC,KAAK8F,SAAS,CAACwlF,KAAMV,GAAeQ,YAAY,EAAOC,aAAa,OAlHrD,sBAqHP,KACRrrF,KAAK8F,SAAS,CAACulF,aAAa,OAtHb,wBAyHJ,KACXrrF,KAAKH,MAAMyC,QAAQu/B,aACnB7hC,KAAK8F,SAAS,CAAC8lF,cAAc,OA3Hd,uBA8HL,KACV5rF,KAAK8F,SAAS,CAAC8lF,cAAc,OA/Hd,2BAkIDr0F,MAAOyG,EAAO8iF,EAAQ73B,KACpC,MAAM8gC,QAAgB/pF,KAAKH,MAAMyC,QAAQu+E,mBAAmB7gF,KAAKH,MAAMyd,YAAYxlB,GAAIkG,EAAO8iF,GAE1F9gF,KAAKH,MAAMgqC,UACXlsC,QAAW,qBAAsB,mBAAoB,CAACkuF,qBAAsB9B,EAAQ/I,OAGtE,KAAd/3B,GACA8gC,EAAQ9I,QAAQhiE,KAAK,CACjBvK,KAAMu0C,EACNm4B,OACI,gBAAC,IAAD,CACItpF,GAAG,mDACH+N,eAAe,4CAM/B7F,KAAK8F,SAAS,CAACwlF,KAAMP,GAAsBU,SAAUzrF,KAAK9G,MAAMoyF,KAAMhB,YAAaP,EAAQ/I,KAAMuJ,eAAgBR,EAAQ9I,QAASoJ,YAAaK,mBAA2BU,YAAY,OArJvK,0BAwJF7zF,MAAOyG,EAAO8iF,EAAQlkE,EAAUhe,EAASktF,EAAeC,KACrE,MAAMhC,QAAgB/pF,KAAKH,MAAMyC,QAAQo/E,kBACrC1hF,KAAKH,MAAMyd,YAAYxlB,GACvB8kB,EAAS/S,KAAK6F,GAAMA,EAAE5X,KACtBkG,EACA8iF,EACAliF,GAEkB,KAAlBktF,GACA/B,EAAQ9I,QAAQhiE,KAAK,CACjBvK,KAAMo3E,EACN1K,OACI,gBAAC,IAAD,CACItpF,GAAG,mDACH+N,eAAe,4CAKN,KAArBkmF,GACAhC,EAAQ9I,QAAQhiE,KAAK,CACjBvK,KAAMq3E,EACN3K,OACI,gBAAC,IAAD,CACItpF,GAAG,6CACH+N,eAAe,2CAK/B7F,KAAK8F,SAAS,CAACwlF,KAAMP,GAAsBU,SAAUzrF,KAAK9G,MAAMoyF,KAAMC,mBAAoB3uE,EAAUovE,kBAAmBptF,EAAS0rF,YAAaP,EAAQ/I,KAAMuJ,eAAgBR,EAAQ9I,QAASoJ,YAAaK,kBAA0BU,YAAY,OApL/O,IAAIE,EAAOV,GACN/qF,EAAMqrF,kBACPI,EAAOT,IAGNhrF,EAAMorF,cACPK,EAAOR,IAGX9qF,KAAK9G,MAAQ,CACToyF,OACAG,SAAU,KACVF,mBAAoB,GACpBS,kBAAmB,GACnBJ,cAAc,EACdP,aAAa,EACbD,YAAY,EACZf,YAAaK,mBACbJ,YAAa,GACbC,eAAgB,IAIxBztD,oBACQ98B,KAAKH,MAAMgqC,UACX24C,QAAY,qBAAsB,yBAI1CvlD,mBAAmBC,EAAWv8B,GACtBX,KAAK9G,MAAMoyF,OAAST,IAAwBlqF,EAAU2qF,OAAST,IAAyB7qF,KAAKH,MAAMyd,YAAY2uE,WAC/GjsF,KAAKH,MAAMyC,QAAQ+Y,QAAQrb,KAAKH,MAAMyd,YAAYxlB,IAwJ1D2J,SACI,MAAMyqF,EAAmB,gBAAC,IAAD,KACrB,gBAAC,IAAD,CACIxkF,KAAMk5B,QAAQ5gC,KAAKH,MAAM6H,MACzBykF,QAASnsF,KAAKyhB,MACd2qE,SAAUpsF,KAAKqsF,kBACf7vD,IAAKx8B,KAAK0rF,MACVY,eAAe,0BAEf,uBACI57C,cAAY,kBACZ1vC,UAAU,mBAEV,gBAAC,IAAD,CACI0G,KAAM1H,KAAK9G,MAAM0yF,cAAgB5rF,KAAK9G,MAAMmyF,YAC5CliF,MACI,gBAAC,IAAD,CACIrR,GAAG,yCACH+N,eAAe,oBAGvBjH,QACI,gBAAC,IAAD,CACI9G,GAAG,2CACH+N,eAAe,wEAGvBo7C,kBACI,gBAAC,IAAD,CACInpD,GAAG,0CACH+N,eAAe,iBAGvB0mF,WAAW,2BACXC,UAAWxsF,KAAK9G,MAAM0yF,aAAe5rF,KAAKysF,aAAezsF,KAAKqrF,YAC9DqB,SAAU1sF,KAAK9G,MAAM0yF,aAAe5rF,KAAK2sF,YAAc3sF,KAAK4sF,aAE/D5sF,KAAK9G,MAAMoyF,OAASV,IACrB,gBAAC9H,EAAD,CACI3jD,SAAUn/B,KAAKH,MAAMyd,YAAYjb,aACjC2gF,YAAahjF,KAAKgjF,YAClBC,WAAYjjF,KAAKijF,WACjBG,wBAAyBpjF,KAAKH,MAAMujF,0BAGvCpjF,KAAK9G,MAAMoyF,OAAST,IACrB,gBAAC,GAAD,CACI1rD,SAAUn/B,KAAKH,MAAMyd,YAAYjb,aACjCuQ,cAAe5S,KAAKH,MAAMyd,YAAYxlB,GACtC4vF,SAAU1nF,KAAKH,MAAMyd,YAAY2uE,UACjC51C,eAAgBr2C,KAAKH,MAAMyC,QAAQ+zC,eACnC+sC,wBAAyBpjF,KAAKH,MAAMujF,wBACpC56E,SAAUxI,KAAK6sF,gBACf1F,OAAQnnF,KAAKmnF,SAGhBnnF,KAAK9G,MAAMoyF,OAASR,IACrB,gBAAC,GAAD,CACI3rD,SAAUn/B,KAAKH,MAAMyd,YAAYjb,aACjCuQ,cAAe5S,KAAKH,MAAMyd,YAAYxlB,GACtCgxF,oBAAqB9oF,KAAKH,MAAMitF,kBAChCz2C,eAAgBr2C,KAAKH,MAAMyC,QAAQ+zC,eACnCuyC,eAAgB5oF,KAAKH,MAAMyC,QAAQsmF,eACnCK,gBAAiBjpF,KAAK9G,MAAMqyF,mBAC5B1lF,eAAgB7F,KAAK9G,MAAM8yF,kBAC3B5I,wBAAyBpjF,KAAKH,MAAMujF,wBACpC56E,SAAUxI,KAAK+sF,eACf5F,OAAQnnF,KAAKmnF,SAGhBnnF,KAAK9G,MAAMoyF,OAASP,IACrB,gBAACf,GAAD,CACI7qD,SAAUn/B,KAAKH,MAAMyd,YAAYjb,aACjCuQ,cAAe5S,KAAKH,MAAMyd,YAAYxlB,GACtC0yF,OAAQxqF,KAAKyhB,MACbgpE,aAAczqF,KAAKgtF,cACnB3C,YAAarqF,KAAK9G,MAAMmxF,YACxBC,YAAatqF,KAAK9G,MAAMoxF,YACxBC,eAAgBvqF,KAAK9G,MAAMqxF,oBAOrC0C,EAAwB,CAC1BprD,WAAY7hC,KAAKH,MAAMyC,QAAQu/B,WAC/Bj2B,UAAW5L,KAAKH,MAAMyC,QAAQsJ,WAE5BshF,EACF,gBAAC7K,EAAD,CACIz4C,YAAa5pC,KAAKH,MAAM+pC,YACxB+4C,eAAgB3iF,KAAKH,MAAM8iF,eAC3Bj7E,KAAMk5B,QAAQ5gC,KAAKH,MAAM6H,MACzBpF,QAAS2qF,IAGjB,OACI,gCACKjtF,KAAKH,MAAMstF,0BAA4BD,EAAiBhB,I,GArTpDlB,G,YACE,CACftjF,KAAM4pC,SACNh0B,YAAag0B,sBACbw7C,kBAAmBx7C,qBACnB45C,gBAAiB55C,oBACjB25C,YAAa35C,oBACb8xC,wBAAyB9xC,oBACzBzH,QAASyH,oBACT67C,0BAA2B77C,oBAC3B1H,YAAa0H,oBACbqxC,eAAgBrxC,sBAChBhvC,QAASgvC,UAAgB,CACrBzP,WAAYyP,oBACZowC,kBAAmBpwC,oBACnBuvC,mBAAoBvvC,oBACpB+E,eAAgB/E,oBAChBs3C,eAAgBt3C,oBAChBj2B,QAASi2B,oBACT1lC,UAAW0lC,WACZixB,aCrBX,MAAMlsB,GAAiB,CAAChnC,EAAMhS,EAAU,KAC/BgS,GAGE+9E,QAAoB/9E,EAAMhS,IAFtBgwF,QAAY,EAAG,GAAIhwF,GAK5BurF,GAAiB,CAAC5tF,EAAQqU,KACrBi+E,QAAoBtyF,EAAQqU,GAuDvC,IAAelL,cApDR,SAAyBjL,GAC5B,MAAMoC,GAASmd,QAAUvf,GACnBuyB,GAAUC,QAAWxyB,GACrB0jB,GAAW2wE,QAAyBr0F,GACpCokB,GAAcC,QAAerkB,GAC7Bq/C,GAAoB51B,QAAqBzpB,GACzC4zF,EAAoBlwE,EAAStV,QAAQlF,GACnCA,EAAQvG,OAASmT,iBAAwB5M,EAAQvG,OAASmT,kBAG1D5M,EAAQvG,OAASmT,sBACVw+E,QAAuBt0F,EAAOokB,EAAYxlB,GAAIsK,EAAQtK,GAAI20B,sCAE9D+gE,QAAuBt0F,EAAOokB,EAAYxlB,GAAIsK,EAAQtK,GAAI20B,uCAE/DghE,EAAsD,SAA/BnyF,EAAOoyF,oBAC9BtK,EAA4D,SAAlC9nF,EAAOqyF,uBACjC/lC,EAAan8B,GAAkC,SAAvBA,EAAQI,WAEhCq/D,GADqBtqD,QAAQtjB,EAAY44B,oBACA0R,GAAc6lC,IAAwBG,QAA2B10F,EAAOuzB,mBACjHod,EAA4B,SAAlBpe,EAAQ/I,MAClByqE,EAA4BtjD,IAAY,IAAQ0O,IAAyD,UAAnCA,EAAkBxO,cAA4BwO,EAAkBgvC,iBAAmB,EAEzJ0D,GAAc2C,QAA2B10F,EAAOuzB,uBACtD,MAAO,CACHqgE,oBACAxvE,cACA4tE,kBACAD,cACAkC,4BACA/J,0BACA17E,MAAMqzB,OAAY7hC,EAAO4S,iBACzB+9B,UACAD,aAAao+C,SAAQltE,QAAe5hB,GAAO00B,OAC3C+0D,eAAgBrnF,EAAOkvC,4BAA8B,SAI7D,SAA4BpzC,GACxB,MAAO,CACHkL,SAAS+B,wBAAmB,CACxBw9B,WAAY,KAAMA,OAAW/1B,iBAC7B41E,kBAFwB,EAGxBb,mBAHwB,EAIxBxqC,kBACAuyC,kBACAvtE,QANwB,KAOxBzP,UAAYiiF,IAAcjiF,OAAUiiF,IACrCz2F,MAIX,CAA4D4zF,K,4FC5E5D,MAAM8C,EAAuC,EAAEtvD,UAAS+zC,WAAU3hC,qBAC9D,IAAIm9C,EACA,wBAAM/sF,UAAU,mBAWpB,OARIuxE,IACAwb,EACI,wBAAM/sF,UAAU,kBAAhB,UACQw9B,EADR,YACmB+zC,EADnB,OAOJ,uBAAKvxE,UAAW4vC,GACZ,gBAAC,IAAD,MACCm9C,I,aArBTvvD,Q,WACA+zC,S,WACA3hC,e,YAwBJk9C,EAAoBj0C,aAAe,CAC/BjJ,eAAgB,uBAGpB,W,mxBC1Be,MAAMo9C,UAAsBruF,gBAMhCC,YAAYC,GACfC,MAAMD,GACNG,KAAK9G,MAAQ,GAGVuI,SACH,IAAI7C,EACA,gBAAC,IAAD,CACI9G,GAAG,yBACH+N,eAAe,YAQvB,OAJI7F,KAAKH,MAAMjB,UACXA,EAAUoB,KAAKH,MAAMjB,SAIrB,uBACIoC,UAAU,iBACV4H,MAAK,GAAGwqC,SAAUpzC,KAAKH,MAAMuzC,UAAapzC,KAAKH,MAAM+I,QAErD,uBAAK5H,UAAU,oBACX,yBACKpC,GAEL,uBAAKoC,UAAU,kBACf,uBAAKA,UAAU,kBACf,uBAAKA,UAAU,qB,EAlCdgtF,E,aALjB56C,S,WAAU,WAAa,QAAU,WAAa,SAAW,YAEzDx0C,Q,aAGiBovF,E,eAC4B,CACzC56C,SAAU,WACVxqC,MAAO,M,8ICDf,MAAMqlF,EAAgBtuF,cAAiB,CAACE,EAAc28B,KAClD,MACIr/B,UAAWk0D,EAAY,IACvBloD,OAAO,GACHrR,EADG,eAEH+N,EAFG,OAGHjB,IAGJ/E,EADGyyC,E,kXAPP,CAQIzyC,EARJ,GAUA,GAAkB,MAAdwxD,GAAmC,SAAdA,EACrB,OAAO,KAGX,MAAM,cAACzrD,IAAiBiyC,SAExB,OACI,gBAACwZ,EAAD,iBACQ/e,EADR,CAEI9V,IAAKA,EACLrzB,MAAOvD,EAAc,CAAC9N,KAAI+N,kBAAiBjB,S,aA3BnDzH,U,WAAY,IAAM,UA+BtB8wF,EAAclrF,YAAc,gBAE5B,W,yHC5BA,MAAMmrF,EAAiBvuF,cAAiB,CAACE,EAAc28B,KACnD,MACI37B,aAAa,GACT/I,EADS,eAET+N,EAFS,OAGTjB,IAGJ/E,EADGyyC,E,kXANP,CAOIzyC,EAPJ,IASM,cAAC+F,IAAiBiyC,SAExB,OACI,yCACQvF,EADR,CAEI9V,IAAKA,EACL37B,YAAa+E,EAAc,CAAC9N,KAAI+N,kBAAiBjB,SAI7DspF,EAAenrF,YAAc,iBAE7B,W,4LCqCA,SAAeoB,cA3Bf,WACI,MAAMgqF,GAfCC,QACH,yBACAC,MACA,CAACn1F,EAAoB2G,IAAiBA,GAASA,EAAMyuF,kBACrD,CAACA,EAAiBC,IACVA,EACOjpF,OAAOuX,OAAO,GAAI0xE,EAAiBD,GAGvCA,IAQf,OAAO,SAAyBp1F,EAAoBusB,GAChD,MAAMnqB,GAASmd,QAAUvf,GAEzB,IAAI2W,EACiB,MAIrB,OAJI4V,EAAS9F,SACT9P,EAAS,WAAGmR,QAAQ9nB,EAAOusB,EAAS9F,eAA3B,aAAG,EAAiC9S,YAG1C,CACH2hF,sBAAsBC,QAAwBv1F,GAC9Co1F,gBAAiBH,EAAmBj1F,EAAOusB,GAC3CipE,kBAAkBC,QAAQz1F,EAAO+U,gCAAwC,cAAc,GACvF2gF,sBAAsBC,QAAwB31F,GAC9C41F,YAAarpE,EAASqpE,cAAeC,OAAsB71F,GAC3D8D,SAASoP,UACT+N,MAAMoD,QAAerkB,GACrBu7D,cAAwC,SAAzBn5D,EAAO45D,cACtB85B,qBAAsBv/D,SAASn0B,EAAO2zF,sBAAwB,GAAI,IAClE3xB,UAAUtR,QAAY9yD,GACtB2W,gBAKZ,CAA4C4vE,M,wOCuC7B,MAAMA,UAAiB9/E,gBASlC8B,SACI,IAAKzB,KAAKH,MAAM6uF,iBACZ,OAAO,4BAAO1uF,KAAKH,MAAMjB,SAG7B,MAAMvB,EAAUiI,OAAOuX,OAAO,CAC1B2xE,qBAAsBxuF,KAAKH,MAAM2uF,qBACjCxxF,QAASgD,KAAKH,MAAM7C,QACpB8xF,YAAa9uF,KAAKH,MAAMivF,YACxBI,YAAY,EACZZ,gBAAiBtuF,KAAKH,MAAMyuF,gBAC5Ba,YAAanvF,KAAKH,MAAM40D,eAAiBz0D,KAAKH,MAAMsvF,YACpDh1E,KAAMna,KAAKH,MAAMsa,KACjB60E,qBAAsBhvF,KAAKH,MAAMmvF,qBACjCJ,qBAAsB5uF,KAAKH,MAAM+uF,sBAClC5uF,KAAKH,MAAMxC,SAER+xF,GAAoBC,QAAWrvF,KAAKH,MAAMjB,QAASvB,EAAS2C,KAAKH,MAAMy9D,UAC7E,OAAOgyB,OAAuBF,EAAmBpvF,KAAKH,MAAM4vC,MAAO,CAC/D8/C,WAAYvvF,KAAKH,MAAM0vF,WACvBC,eAAgBxvF,KAAKH,MAAM2vF,eAC3BC,kBAAmBzvF,KAAKH,MAAM4vF,kBAC9B9vE,OAAQ3f,KAAKH,MAAM8f,OACnB9P,UAAW7P,KAAKH,MAAMgQ,UACtB6qE,SAAU16E,KAAKH,MAAM66E,SACrBl2E,iBAAkBxE,KAAKH,MAAMxC,QAAQmH,iBACrCyqC,sBAAuBjvC,KAAKH,MAAMxC,QAAQ4xC,yB,EAnCjCwwC,E,aAvFjB+O,qB,wBAKAE,iB,SAKAj/C,M,SAKAm/C,qB,wBAKAE,Y,UAKAlwF,Q,sBAUA5B,Q,WAUAy3D,c,SAKAu6B,qB,WAKAG,Y,SAMAI,W,WAUAE,kB,SAKA9vE,O,WAEA9P,U,eASiB4vE,E,eACqB,CAClCpiF,QAAS,GACToyC,OAAO,EACP0/C,aAAa,EACbK,eAAgB,GAChB7vE,OAAQ,M,4PCrGhB,MAAM+vE,UAA2B/vF,gBAA6C,gEACzC,KAC7B,IAAKK,KAAKH,MAAM8vF,iBACZ,OAAO3vF,KAAKH,MAAMnI,MAAMkH,QAG5B,MAAMgxF,EAAU5vF,KAAKH,MAAM8vF,iBAAiB9hE,MAAM,KAAK,GACvD,OACI,gBAAC,WAAD,KACI,gBAAC,IAAD,CACI/1B,GAAG,sCACH+N,eAAe,sDACfjB,OAAQ,CACJgrF,aAGR,qBACIx1D,KAAK,IACL7vB,QAASvK,KAAKH,MAAM4I,cAEpB,gBAAC,IAAD,CACI3Q,GAAG,yCACH+N,eAAe,0CAO5BpE,SACH,MAAM/J,EAAQsI,KAAKH,MAAMnI,MAEzB,IAAKA,EACD,OAAO,KAGX,IAAIm4F,EAAuCn4F,EAAMkH,QAKjD,OAJIkxF,QAA2Bp4F,KAC3Bm4F,EAAe7vF,KAAK+vF,2BAIpB,uBAAK/uF,UAAU,aACX,yBAAOA,UAAU,iBACZ6uF,K,EA5CfH,E,aAJFjnF,a,oBACAknF,iB,aAsDJ,W,gJC7De,MAAMK,UAAwBrwF,gBAoBzC8B,SACI,QAA2BzB,KAAKH,OAA1B,OAACowF,GAAP,EAAkBpwF,E,kXAAlB,OACM,WAACqwF,GAAcD,EAErB,IAAKA,EACD,OAAO,4BAGX,MAAME,EAAc,GAEpB,IAAK,MAAMtkF,KAAWqkF,EAClB,GAAIA,EAAW96D,eAAevpB,GAAU,CACpC,MAAM6/E,EAAQwE,EAAWrkF,GACzB,GAAI6/E,EAAMp/E,KAAM,CACZ,MAAM8jF,EAAiBzwF,gBAAoB+rF,EAAM3/E,WAAYzG,OAAOuX,OAAO,GAAI6uE,EAAM1/E,YAAa,CAC9F7D,OAAQtI,EAAMyC,QAAQu/B,WAAWyc,KAAKt+C,KAAM6L,GAC5C3O,IAAK,GAAF,OAAK2O,EAAL,aAGPskF,EAAYlxE,KAAKmxE,IAK7B,OACI,2BAAMD,I,YA7CGH,E,gBACE,CAKfC,OAAQ3+C,sBAKRhvC,QAASgvC,UAAgB,CAKrBzP,WAAYyP,sBACbixB,Y,6FCCX,SAAep+D,cAdf,SAAyBjL,GACrB,MAAO,CACH+2F,OAAQ/2F,EAAMwlC,MAAMuxD,WAI5B,SAA4B74F,GACxB,MAAO,CACHkL,SAAS+B,wBAAmB,CACxBw9B,WAAUA,KACXzqC,MAIX,CAA4D44F,I,ojBCG7C,MAAMK,UAA8B1wF,gBAChB,gCAACE,EAAO3G,GACnC,MAAO,CAACo3F,SAAUzwF,EAAMywF,SAAUnyF,KAAM0B,EAAMywF,WAAap3F,EAAMo3F,SAAW,EAAIp3F,EAAMiF,MAG1FyB,YAAYC,GACRC,MAAMD,GADS,2BAgCCuC,IAChB,MAAM4S,EAAY,UAAG5S,EAAQC,aAAX,aAA4BD,EAAQmuF,SAAUl+E,cAChE,IAAIm+E,EACAC,EACJ,MAAM,2BAACC,GAA8B1wF,KAAKH,MAoB1C,OAlBI6wF,IACAF,EACI,uBAAKxvF,UAAU,8BACX,gBAAC,IAAD,CAAaA,UAAU,yBAK/BoB,EAAQuuF,SACRF,EACI,gBAAC,IAAD,CACIzvF,UAAU,sBACV4vF,YAAaxuF,EAAQvG,KACrBg1F,aAAa,KAMrB,uBACI7vF,UAAU,kBACV9D,IAAKkF,EAAQtK,GACbA,GAAE,qBAAgBsK,EAAQhC,OAE1B,uBAAKY,UAAU,uBACX,0BACIuJ,QAASvK,KAAK8wF,WAAWxyC,KAAKt+C,KAAMoC,GACpCuwC,aAAY39B,EACZhU,UAAU,gCAETwvF,EACApuF,EAAQC,aACRouF,GAEL,qBAAGzvF,UAAU,2BAA2BoB,EAAQmuF,UAEpD,uBAAKvvF,UAAU,uBACX,0BACIuJ,QAASvK,KAAK8wF,WAAWxyC,KAAKt+C,KAAMoC,GACpCpB,UAAU,kBACV4C,SAAU5D,KAAK9G,MAAM63F,gBAErB,gBAAC,IAAD,CACIvyD,QAASx+B,KAAK9G,MAAM63F,iBAAmB3uF,EAAQtK,GAC/C4c,MAAMtK,QAAgB,wBAAyB,eAE/C,gBAAC,IAAD,CACItS,GAAI44F,GAA6B18E,OAAE,uBAAwBA,OAAE,sBAC7DnO,eAAgB6qF,EAA6B,OAAS,gBAtF/D,mBA+FP/xF,IACRA,EAAEqH,iBACFhG,KAAK8F,SAAS,CAAC3H,KAAM6B,KAAK9G,MAAMiF,KAAO,EAAG6yF,cAAc,IACxDhxF,KAAKixF,cAAgBnwE,YAAW,IAAM9gB,KAAK8F,SAAS,CAACkrF,cAAc,KAzGlC,KA0GjChxF,KAAKH,MAAMqxF,SAASlxF,KAAK9G,MAAMiF,KAAO,GACtC8uE,IAAET,cAAqBxsE,KAAKmxF,kBAAkB9iD,UAAU4rB,UAAU,MApGnD,uBAuGHt7D,IACZA,EAAEqH,iBACFhG,KAAK8F,SAAS,CAAC3H,KAAM6B,KAAK9G,MAAMiF,KAAO,IACvC8uE,IAAET,cAAqBxsE,KAAKmxF,kBAAkB9iD,UAAU4rB,UAAU,MA1GnD,mBA6GR,KACP,MAAM5qD,EAAOrP,KAAKsH,OAAO+mC,QAAQttC,MACjCf,KAAKH,MAAMg9B,OAAOxtB,GACL,KAATA,GACArP,KAAK8F,SAAS,CAAC3H,KAAM,OAjHV,mCAoHQ,KACvB6B,KAAKH,MAAMuxF,wBAAuB,MArHnB,oCAuHS,KACxBpxF,KAAKH,MAAMuxF,wBAAuB,MArHlCpxF,KAAKixF,cAAgB,EAErBjxF,KAAK9G,MAAQ,CACT63F,eAAgB,GAChB5yF,KAAM,EACN6yF,cAAc,GAGlBhxF,KAAKsH,OAAS3H,cACdK,KAAKmxF,kBAAoBxxF,cAG7Bm9B,qBAEStqB,QAAwBxS,KAAKsH,OAAO+mC,SACrCruC,KAAKsH,OAAO+mC,QAAQp0B,QAI5B62E,WAAW1uF,GACPpC,KAAK8F,SAAS,CAACirF,eAAgB3uF,EAAQtK,KACvCkI,KAAKH,MAAMixF,WACP1uF,GACA,KACIpC,KAAK8F,SAAS,CAACirF,eAAgB,QAgG3CtvF,SACI,MAAMmb,EAAW5c,KAAKH,MAAM+c,SAC5B,IAAIy0E,EACAC,EACAC,EAEJ,GAAIvxF,KAAKH,MAAM2+B,SAA+B,IAApB5hB,EAASpX,OAC/B6rF,EAAc,gBAAC,IAAD,WACX,GAAwB,IAApBz0E,EAASpX,OAChB6rF,EACI,uBAAKrwF,UAAU,sBACX,sBAAIA,UAAU,mBACV,gBAAC,IAAD,CACIlJ,GAAG,uBACH42D,QAAQ,SACR7oD,eAAe,8BAGtB7F,KAAKH,MAAM2xF,mBAGjB,CACH,MAAMt6B,EAAYl3D,KAAK9G,MAAMiF,KAAO6B,KAAKH,MAAM4xF,gBACzCC,EAAUx6B,EAAYl3D,KAAKH,MAAM4xF,gBACjCE,EAAoB3xF,KAAKH,MAAM+c,SAASpQ,MAAM0qD,EAAWw6B,GAC/DL,EAAcM,EAAkB9nF,IAAI7J,KAAK4xF,kBAErCD,EAAkBnsF,QAAUxF,KAAKH,MAAM4xF,iBAAmBC,EAAU1xF,KAAKH,MAAM+c,SAASpX,SACxF8rF,EACI,0BACItwF,UAAU,mDACVuJ,QAASvK,KAAKkxF,SACdttF,SAAU5D,KAAK9G,MAAM83F,cAErB,gBAAC,IAAD,CACIl5F,GAAG,qBACH+N,eAAe,WAM3B7F,KAAK9G,MAAMiF,KAAO,IAClBozF,EACI,0BACIvwF,UAAU,mDACVuJ,QAASvK,KAAK6xF,cAEd,gBAAC,IAAD,CACI/5F,GAAG,qBACH+N,eAAe,eAOnC,IAmCIisF,EAnCA9hD,EACA,uBAAKhvC,UAAU,+BACX,uBAAKA,UAAU,aACX,gBAAC,IAAD,CACIlJ,GAAG,wBACH0kC,IAAKx8B,KAAKsH,OACVtG,UAAU,8BACVH,YAAa,CAAC/I,IAAIkc,OAAE,iCAAkCnO,eAAgB,mBACtE28C,eAAgB0rC,IAChB77C,QAASryC,KAAK+xF,aAwD9B,OAlDI/xF,KAAKH,MAAMmyF,sBACXhiD,EACI,uBAAKhvC,UAAU,kBACX,uBAAKA,UAAU,gBACX,gBAAC,IAAD,CACIlJ,GAAG,wBACH0kC,IAAKx8B,KAAKsH,OACVtG,UAAU,8BACVH,YAAa,CAAC/I,IAAIkc,OAAE,iCAAkCnO,eAAgB,mBACtE28C,eAAgB0rC,IAChB77C,QAASryC,KAAK+xF,YAGtB,uBAAK/wF,UAAU,iBACVhB,KAAKH,MAAMmyF,uBAQxBhyF,KAAKH,MAAMoyF,0BACXH,EACI,uBAAK9wF,UAAU,wBACX,gBAAC,IAAD,CAAalJ,GAAG,wBACZ,yBACI,4BAAOkI,KAAKH,MAAM6wF,4BAA6BtmF,QAAgB,uCAAwC,4BAA6BA,QAAgB,qCAAsC,0BAC1L,wBAAMpJ,UAAU,WAEpB,gBAAC,IAAD,CACI+T,UAAU,EACVC,WAAW5K,QAAgB,sCAAuC,qCAElE,gBAAC,eAAD,CACItS,GAAG,6BACHyS,QAASvK,KAAKkyF,0BACdx9E,MAAMtK,QAAgB,2BAA4B,qBAEtD,gBAAC,eAAD,CACItS,GAAG,+BACHyS,QAASvK,KAAKmyF,yBACdz9E,MAAMtK,QAAgB,qBAAsB,2BAShE,uBAAKpJ,UAAU,sBACVgvC,EACA8hD,EACD,uBACIxpF,KAAK,cACLk0B,IAAI,cACJx7B,UAAU,oBAEV,uBACIlJ,GAAG,mBACH0kC,IAAKx8B,KAAKmxF,mBAETE,IAGT,uBAAKrwF,UAAU,mBACVuwF,EACAD,KAOrBjB,EAAsBx2C,aAAe,CACjCj9B,SAAU,GACV0zE,UAAU,GAGdD,EAAsB7hB,UAAY,CAC9B5xD,SAAU00B,YAAkBA,YAC5BmgD,gBAAiBngD,WACjB4/C,SAAU5/C,oBACVg/C,SAAUh/C,SACVzU,OAAQyU,oBACRw/C,WAAYx/C,oBACZkgD,cAAelgD,WACf9S,QAAS8S,SACT0gD,oBAAqB1gD,YACrB8/C,uBAAwB9/C,oBACxBo/C,2BAA4Bp/C,oBAC5B2gD,wBAAyB3gD,qB,kJCrQd,MAAM8gD,UAAqBzyF,gBAGtCC,YAAYC,GACRC,MAAMD,GADgB,sDAuBb,KACTG,KAAK8F,SAAS,CAAC4B,MAAM,IAEjB1H,KAAKH,MAAMwyF,UACXryF,KAAK26B,gBA3Ba,2BA+BP,KACf36B,KAAK26B,aACL36B,KAAKH,MAAMyC,QAAQsJ,UAAU,CACzBC,QAASC,sBACTC,WAAYumF,SAnCM,qBAuCb,KACTtyF,KAAKH,MAAMyC,QAAQu/B,WAAW/1B,uBAxCR,mBA2CdymF,IACJvyF,KAAK9G,MAAM2jC,SAAW01D,GAI1BvyF,KAAK8F,SAAS,CACV0sF,iBAAkB,GAClBnxD,YAAa,UAlDK,mBAsDdljC,IACR6B,KAAKH,MAAMyC,QAAQmwF,YAAYzyF,KAAKH,MAAM7E,OAAQmD,EAAO,EA/FvC,OAwCI,qBA0Db5G,MAAO6K,EAAkBswF,KAClC,MAAM,QAACpwF,EAAD,cAAUiL,EAAV,OAAyBvS,EAAzB,SAAiCmkC,GAAYn/B,KAAKH,MAClD4O,QAAenM,EAAQ8a,YAAY7P,EAAevS,EAAQoH,EAAQtK,IAEpE2W,EAAO/W,MACPsI,KAAK8F,SAAS,CAACu7B,YAAa5yB,EAAO/W,MAAMkH,WAEzC2N,UAAoBomF,QAAsBxzD,EAAU/8B,EAAQhC,OAC5DJ,KAAK4G,cAGL8rF,GACAA,OAtEkB,iBA0EhBrjF,IAGN,GAFAwmB,aAAa71B,KAAK48B,iBAEL,KAATvtB,EAIA,OAHArP,KAAKC,UAAS,GACdD,KAAK8F,SAAS,CAAC+2B,QAAQ,EAAO21D,iBAAkB,GAAII,WAAW,EAAO32D,WAAY5sB,SAClFrP,KAAK48B,gBAAkB,GAG3B58B,KAAK8F,SAAS,CAAC+2B,QAAQ,EAAM+1D,WAAW,EAAM32D,WAAY5sB,IAE1D,MAAMutB,EAAkBvwB,OAAOyU,YAC3BvpB,UACI,IACI,MAAM,KAACI,SAAcqI,KAAKH,MAAMyC,QAAQ8M,mBAAmBC,EAAMrP,KAAK9G,MAAMw3F,4BAC5E,GAAI9zD,IAAoB58B,KAAK48B,gBACzB,OAGAjlC,EACAqI,KAAK6yF,iBAAiBl7F,GAEtBqI,KAAK8F,SAAS,CAAC0sF,iBAAkB,GAAII,WAAW,IAEtD,MAAOE,GACL9yF,KAAK8F,SAAS,CAAC0sF,iBAAkB,GAAII,WAAW,OA1IhC,KAgJ5B5yF,KAAK48B,gBAAkBA,KAzGD,2BA4GNhgB,IAChB5c,KAAK8F,SAAS,CAAC0sF,iBAAkBxyF,KAAK9G,MAAMw3F,2BAA6B9zE,EAAStV,QAAQoI,GAAsB,IAAhBA,EAAE4L,YAAmBsB,EAAStV,QAAQoI,GAAsB,IAAhBA,EAAE4L,YAAkBs3E,WAAW,OA7GrJ,iCAgHAlC,IAEtB1wF,KAAK68B,OAAO78B,KAAK9G,MAAM+iC,YACvBj8B,KAAK8F,SAAS,CAAC4qF,kCAhHf1wF,KAAK48B,gBAAkB,EAEvB58B,KAAK9G,MAAQ,CACTwO,MAAM,EACNgpF,2BAAuE,YAA3C1wF,KAAKH,MAAMkzF,4BACvCl2D,QAAQ,EACR21D,iBAAkB,GAClBnxD,YAAa,KACbuxD,WAAW,EACX32D,WAAY,IAIpBa,oBACI98B,KAAKH,MAAMyC,QAAQmwF,YAAYzyF,KAAKH,MAAM7E,OAAQ,EAAGg4F,KACjDhzF,KAAKH,MAAMoyF,yBACXjyF,KAAKH,MAAMyC,QAAQ2wF,oBAAoBjzF,KAAKH,MAAM7E,OAAQ,EAAGg4F,KAmGrEvxF,SACI,MAAM,SACFmb,EADE,iBAEFs2E,EAFE,OAGFl4F,EAHE,uBAIFm4F,EAJE,SAKFd,GACAryF,KAAKH,OAEH,OACFg9B,EADE,iBAEF21D,EACAnxD,YAAa+xD,EAHX,KAIF1rF,EAJE,UAKFkrF,EALE,2BAMFlC,GACA1wF,KAAK9G,MAET,IAAIm6F,EAQAhyD,EALAgyD,EADA3C,EACiB7zD,EAAS21D,EAAmBU,EAE5Br2D,EAAS21D,EAAmB51E,EAI7Cw2E,IACA/xD,EACI,uBAAKrgC,UAAU,wBAAuB,yBAAOA,UAAU,iBAAiBoyF,KAGhF,MAAME,EACF,gBAAC,IAAD,CACIt4F,OAAQA,EACR4tD,YAAa,CAACn8B,4BAEd,0BACI30B,GAAG,mBACH+D,KAAK,SACLmF,UAAU,qCACVuJ,QAASvK,KAAKuzF,kBAEd,gBAAC,IAAD,CACIz7F,GAAG,uBACH+N,eAAe,qBAMzB2tF,EACF,gBAAC,IAAD,CACIx4F,OAAQA,EACR4tD,YAAa,CAACn8B,0BAAmCA,6BAEjD,qBAAGzrB,UAAU,qBACT,gBAAC,IAAD,CACIlJ,GAAG,4BACH+N,eAAe,mDAMzBvH,EACF,gBAAC,WAAD,KACI,gBAAC+xF,EAAD,CACIzzE,SAAUy2E,EACV5B,gBAnOM,GAoONP,SAAUlxF,KAAKkxF,SACfZ,SAAUzzD,EACVA,OAAQ78B,KAAK68B,OACbi0D,WAAY9wF,KAAK8wF,WACjBU,cAAegC,EACfh1D,QAAS3B,EAAS+1D,EAAYO,EAC9BnB,oBAAqBK,GAAYiB,EACjClC,uBAAwBpxF,KAAKoxF,uBAC7BV,2BAA4B1wF,KAAK9G,MAAMw3F,2BACvCuB,wBAAyBjyF,KAAKH,MAAMoyF,0BAEvC5wD,GAIT,OAAIgxD,EACO/zF,EAIP,gBAAC2J,EAAA,EAAD,CACIC,gBAAgB,4CAChBR,KAAMA,EACNS,OAAQnI,KAAK4G,WACbwB,SAAUpI,KAAK26B,WACfryB,KAAK,SACLxQ,GAAG,oBACHyQ,kBAAgB,0BAEhB,gBAACN,EAAA,SAAD,CACInQ,GAAG,0BACH6Q,aAAa,GAEb,gBAACV,EAAA,QAAD,CACIa,eAAe,KACfhR,GAAG,0BAEH,gBAAC,IAAD,CACIA,GAAG,sBACH+N,eAAe,mBAGtBytF,GAEL,gBAACrrF,EAAA,OAAD,KACK3J,K,EA5OA8zF,E,aAtBjBx1E,S,qBACAs2E,iB,qBACA3lF,c,sBACAvS,O,sBACAmkC,S,sBACAg0D,uB,SACAd,S,SACAJ,wB,SACAc,4B,WACAzwF,Q,WApBAmwF,Y,oBACAQ,oB,oBACA71E,Y,oBACAhO,mB,oBACAxD,U,oBAGAi2B,W,mCCRJ,MAAM4xD,GAA8BrF,QAChC,8BACAsF,MACC92E,GAAwBA,GAAYA,EAAStV,QAAQoI,GAAsB,IAAhBA,EAAE4L,cAG5Dq4E,GAA2BvF,QAC7B,2BACAb,MACC3wE,GAAwBA,GAAYA,EAAStV,QAAQoI,GAAsB,IAAhBA,EAAE4L,cAyClE,GAAenX,cAtCf,SAAyBjL,GACrB,MAAMihB,GAAOoD,QAAerkB,IAAU,GAEtC,MAAO,CACH0jB,SAAU62E,EAA4Bv6F,IAAU,GAChDg6F,iBAAkBS,EAAyBz6F,IAAU,GACrDqU,eAAeC,QAAiBtU,GAChC8B,OAAQmf,EAAKriB,GACbqnC,SAAUhlB,EAAK/Z,KACf+yF,uBAAwBj6F,EAAM4W,SAAS8M,SAAS61E,YAAY5gF,SAAW+M,aACvEqzE,wBAAgF,UAAtDx5E,QAAUvf,GAAOq1B,qCAenD,SAA4Bn3B,GACxB,MAAO,CACHkL,SAAS+B,wBAAiE,CACtEouF,YADsE,KAEtEQ,oBAFsE,KAGtE71E,YAHsE,KAItEhO,mBAJsE,KAKtExD,UALsE,IAMtEi2B,WAAUA,KACXzqC,MAIX,CAA4Dg7F,I,yGC3D5D,MAAMwB,EAAqB,CAAC7iE,EAAwC7uB,EAA6B2N,EAAmByI,EAAsBu7E,KACtI,MAAM/7F,EAAK+X,EAAYyI,EAEvB,GAAIu7E,EAAO/7F,GAAK,CACZ,MAAMkG,EAAQsH,OAAOC,KAAKsuF,EAAO/7F,IAEjC,GAAIkG,EAAMwH,OACN,OAAOxH,EAAM6L,KAAK5R,IACPkK,QAAgB4uB,EAAS94B,GAASiK,KAKrD,MAAO,KAeqDksF,QAC5D,iBACAnpE,KACA7gB,KACA0R,MACC5c,GAAUA,EAAMynB,SAAS3B,MAAM80E,iBAC/B56F,GAAUA,EAAMynB,SAASkzE,QAC1BD,G,iLCxCW,MAAMG,UAAkBp0F,gBAA2B,sDACtC,KACpB,IAAI3B,EAAkB,GAClBg2F,EAAW,EAMf,GALIh0F,KAAKH,MAAMo0F,cACXj2F,EAAQ,IAAIgC,KAAKH,MAAMo0F,aACvBD,EAAWh2F,EAAMwH,QAGJ,IAAbwuF,EACA,MAAO,GAEX,GAAiB,IAAbA,EACA,OACI,gBAAC,IAAD,CACIl8F,GAAG,sBACH+N,eAAe,sBACfjB,OAAQ,CACJpM,KAAMwF,EAAM,MAK5B,MAAMk2F,EAAOl2F,EAAMm2F,MACnB,OACI,gBAAC,IAAD,CACIr8F,GAAG,uBACH+N,eAAe,mCACfjB,OAAQ,CACJ5G,MAAQA,EAAM6mD,KAAK,MACnBqvC,aAMTzyF,SACH,OACI,wBAAMT,UAAU,cAAchB,KAAKo0F,kB,EAtC1BL,E,aAHjBE,Y,qCCqBJ,SAAe9vF,cAZf,WACI,MAAMkwF,GFeCjG,QACH,qCACAnpE,KACA7gB,MACA,CAAClL,EAAoBmE,IAAiDA,EAAQwS,YAC9E,CAAC3W,EAAoBmE,IAAiDA,EAAQsiB,SAC7EzmB,GAAuBA,EAAMynB,SAASkzE,QACvCD,GEpBJ,OAAO,SAAyB16F,EAAoBusB,GAGhD,MAAO,CACHwuE,YAHgBI,EAA+Bn7F,EAAO,CAAC2W,UAAW4V,EAAS5V,UAAW8P,OAAQ8F,EAAS9F,aAQnH,CAA4Co0E,I,gUCU5C,MAAMpiB,EAAW3iE,cAEF,MAAMslF,UAAyC30F,gBAWnDC,YAAYC,GACfC,MAAMD,GAD0B,mBAJhB,GAIgB,iBAHlBF,eAGkB,yBAFVA,eAEU,sBA0CdmC,IAClB9B,KAAK8F,SAAS,CAAChE,gBA3CiB,2BA8CRnD,IACxB,IAAI47E,QAAiB57E,IAAMA,EAAEqgE,SACzB,OAGJ,MAAM3hE,EAAU2C,KAAKH,MAAMxC,QAC3B,GAAuB,IAAnBA,EAAQmI,OACR,OAGJ,IAAI1D,EACJ,OAAQnD,EAAEzB,KACV,KAAKy0E,EAAS4iB,KAAK,GACf,IAA6B,IAAzBv0F,KAAK9G,MAAM4I,SAAiB,CAC5BA,EAAW,EACX,MAEJA,EAAWvB,KAAKu1D,IAAI91D,KAAK9G,MAAM4I,SAAW,EAAGzE,EAAQmI,OAAS,GAC9D,MACJ,KAAKmsE,EAAS6iB,GAAG,GACb,IAA6B,IAAzBx0F,KAAK9G,MAAM4I,SAAiB,CAC5BA,EAAW,EACX,MAEJA,EAAWvB,KAAKw1D,IAAI/1D,KAAK9G,MAAM4I,SAAW,EAAG,GAC7C,MACJ,QACI,OAGJnD,EAAEqH,iBACFhG,KAAK8F,SAAS,CAAChE,aACf9B,KAAKH,MAAM40F,SAASp3F,EAAQyE,OA9EI,gCAiFJ,CAC5Bq6B,EACAC,EACArX,EACA2hE,KAEA,IAAInqD,EAAc,GAKlB,OAJIH,IACAG,EAAc,6BAId,uBACIC,IAAKJ,EAAap8B,KAAKy8B,gBAAkBN,EAAOp7B,MAChDC,UAAWu7B,EACXr/B,IAAK,oBAAsBi/B,EAAOp7B,MAClCwJ,QAAS,IAAMwa,EAAIoX,GACnBie,aAAc,IAAMssC,EAAOvqD,IAE1BA,EAAOz6B,UApGgB,iBAyGlBy6B,IACd,MAAM/Q,EAAIprB,KAAKH,MAAMxC,QAAQ6U,QAAQiqB,IAC1B,IAAP/Q,GACIprB,KAAK9G,MAAM4I,WAAaspB,GACxBprB,KAAK00F,YAAYtpE,MA1GzBprB,KAAK9G,MAAQ,CACT4I,UAAW,GAIZg7B,oBACHt9B,SAAS22D,iBAAiB,UAAWn2D,KAAK20F,kBAGvClxD,uBACHjkC,SAAS82D,oBAAoB,UAAWt2D,KAAK20F,kBAG1C13D,mBAAmB23D,EAAaj0F,GAAkB,MACrD,MAAMtD,EAAU2C,KAAKH,MAAMxC,QAK3B,GAJIA,GAAWA,EAAQmI,OAAS,GAAKxF,KAAK9G,MAAM4I,UAAY,GACxD9B,KAAKH,MAAM40F,SAASp3F,EAAQ2C,KAAK9G,MAAM4I,WAGvCnB,EAAUmB,WAAa9B,KAAK9G,MAAM4I,SAClC,OAGJ,MAAMqjF,EAAYnlF,KAAKy8B,gBAAgB4R,UAArB,UAAgCruC,KAAKH,MAAM48B,uBAA3C,aAAgC,EAA4B4R,SAC9E,GAAIruC,KAAK60F,QAAQxmD,SAAW82C,EAAW,CACnC,MAAM2P,EAAU3P,EAAU72C,wBAAwBsY,IAC5CmuC,EAAa5P,EAAU72C,wBAAwB00B,OAC/CgyB,EAAUh1F,KAAK60F,QAAQxmD,QAAQC,wBAAwBsY,IAEzDmuC,EADe/0F,KAAK60F,QAAQxmD,QAAQC,wBAAwB00B,OAE5DmiB,EAAU8P,gBAAe,GAClBH,EAAUE,GACjB7P,EAAU8P,gBAAe,IA+E9BxzF,SACH,MAAMpE,EAAU2C,KAAKH,MAAMxC,QAC3B,IAAI63F,EAEJ,GAAIl1F,KAAKH,MAAM2+B,QACX02D,EACI,uBAAKliD,eAAa,GACd,gBAAC,IAAD,CACII,SAAS,WACTl2C,IAAI,kBAIb,GAAe,MAAXG,GAAsC,IAAnBA,EAAQmI,OAClC0vF,EACI,uBACIh4F,IAAI,iBACJ8D,UAAU,sBAEV,qBAAGA,UAAU,mBACT,gBAAC,IAAD,CACIlJ,GAAG,4BACH+N,eAAe,8CACfjB,OAAQ,CACJuwF,YAAan1F,KAAKH,MAAM2L,eAMzC,CACH,IAAIwxE,EAEAA,EADAh9E,KAAKH,MAAMk+B,eACA/9B,KAAKH,MAAMk+B,eAEX/9B,KAAKo1F,sBAGpB,MAAMC,EAAiBh4F,EAAQwM,KAAI,CAACS,EAAG8gB,IAAM4xD,EAAS1yE,EAAGtK,KAAK9G,MAAM4I,WAAaspB,EAAGprB,KAAKH,MAAMw8B,MAAOr8B,KAAK0mF,UAErG3mF,EAAiB1C,EAAQ2C,KAAK9G,MAAM4I,UACpCkT,EAAYhV,KAAKH,MAAMk3C,kBAAkBh3C,GAE/Cm1F,EACI,uBAAKl0F,UAAU,oBACX,uBACIA,UAAU,UACVshE,YAAU,SACVgzB,cAAY,QAEXtgF,GAEL,uBACIwnB,IAAKx8B,KAAK60F,QACV/8F,GAAG,kBACHkJ,UAAU,sBACVsH,KAAK,eACL0qC,eAAa,GAEZqiD,IAMjB,OACI,uBACIr0F,UAAU,wBACVshE,YAAU,UAET4yB,I,0HAnMIZ,E,aAtBjB91D,Q,SACAnC,M,oBACAk5D,a,SACAd,S,oBACA12D,e,oBAMAvyB,M,WAEAnO,Q,UACAc,K,sBACA0pB,Q,eAQiBysE,E,eACY,CACzBj3F,QAAS,GACTwqB,QAAS,GACT2tE,SAAU,IAAM,OCsBxB,MAAM7jB,EAAW3iE,cAEF,MAAMymF,UAAqC91F,gBAW/CC,YAAYC,GACfC,MAAMD,GAD0B,iBAVlBF,eAUkB,wBATXA,eASW,kBARP,MAQO,kCAiCF,KAC9BK,KAAK8F,SAAS,CAAC4vF,YAAY,OAlCK,oCAqCA,KAChC11F,KAAK8F,SAAS,CAAC4vF,YAAY,OAtCK,mBAyCjB,KACX11F,KAAKH,MAAMq+B,kBACXl+B,KAAKH,MAAMq+B,iBAAiBl+B,KAAK9G,MAAMiF,KAAO,EAAG6B,KAAK9G,MAAMiF,MAE5D6B,KAAK60F,QAAQxmD,SACbruC,KAAK60F,QAAQxmD,QAAQqmD,YAAY,GAErC10F,KAAK8F,SAAS,CAAC3H,KAAM6B,KAAK9G,MAAMiF,KAAO,OAhDP,mBAmDjB,KACS,IAApB6B,KAAK9G,MAAMiF,OAIX6B,KAAKH,MAAMq+B,kBACXl+B,KAAKH,MAAMq+B,iBAAiBl+B,KAAK9G,MAAMiF,KAAO,EAAG6B,KAAK9G,MAAMiF,MAG5D6B,KAAK60F,QAAQxmD,SACbruC,KAAK60F,QAAQxmD,QAAQqmD,YAAY,GAErC10F,KAAK8F,SAAS,CAAC3H,KAAM6B,KAAK9G,MAAMiF,KAAO,QA/DP,sBAkEf,KACjB6B,KAAK8F,SAAS,CAAC3H,KAAM,OAnEW,mBAsEhB2D,IAChB9B,KAAK8B,SAAWA,KAvEgB,gBA0EnBf,IACb,GAAIf,KAAKH,MAAM0+B,WAAav+B,KAAKH,MAAM+E,OAAOY,QAAUxF,KAAKH,MAAM0+B,UAC/D,OAGJ,IAAK,IAAInT,EAAI,EAAGA,EAAIprB,KAAKH,MAAM+E,OAAOY,OAAQ4lB,IAC1C,GAAIprB,KAAKH,MAAM+E,OAAOwmB,GAAGtzB,KAAOiJ,EAAMjJ,GAClC,OAIRkI,KAAKH,MAAMw+B,UAAUt9B,GACrBf,KAAK8B,SAAW,KAEZ9B,KAAK21F,eAAetnD,UACpBruC,KAAK21F,eAAetnD,QAAQq4C,OAAOtB,kBAC/B,CAACzS,cAAe,CAAC5xE,MAAO,MAE5Bf,KAAK21F,eAAetnD,QAAQp0B,SAGhC,MAAM27E,EAAsB51F,KAAKH,MAAM+1F,oBACnCA,GAAuBA,EAAoB70F,IAC3Cf,KAAKH,MAAM4I,aAAa,CAAC1H,OAjGG,kBAqGlB,CAACivC,EAAe6lD,KACzBA,GAIiB,eAAlBA,EAAOjhF,QAA6C,eAAlBihF,EAAOjhF,QAIzC5U,KAAK9G,MAAM82C,QAAUA,IAIzBhwC,KAAK8F,SAAS,CAACkqC,UAEXhwC,KAAK60F,QAAQxmD,UACC,KAAV2B,EACAhwC,KAAK60F,QAAQxmD,QAAQqmD,aAAa,GAElC10F,KAAK60F,QAAQxmD,QAAQqmD,YAAY,IAGzC10F,KAAK8B,SAAW,KAEhB9B,KAAKH,MAAMs+B,YAAY6R,EAAOhwC,UA7HE,yBAgIVrB,IACtB,OAAQA,EAAEzB,KACV,KAAKy0E,EAASmkB,MAAM,GAChBn3F,EAAEqH,qBAnI0B,2BAwIRrH,IACxB,OAAQA,EAAEzB,KACV,KAAKy0E,EAASmkB,MAAM,GAChB,GAAqB,MAAjB91F,KAAK8B,SAEL,YADA9B,KAAKH,MAAM4I,eAGfzI,KAAKq8B,MAAMr8B,KAAK8B,cA/IY,wBAoJXnD,IACrBA,EAAEqH,iBACFhG,KAAKH,MAAM4I,kBAtJqB,mBAyJQ,CAACmsF,EAAGiB,KAC5C,GAAsB,iBAAlBA,EAAOjhF,QAA+C,cAAlBihF,EAAOjhF,OAC3C,OAGJ,MAAMhQ,EAAS,IAAI5E,KAAKH,MAAM+E,QAC9B,IAAK,IAAIwmB,EAAI,EAAGA,EAAIxmB,EAAOY,OAAQ4lB,IAE/B,GAAIxmB,EAAOwmB,GAAGtzB,KAAQ+9F,EAAeE,aAAaj+F,GAAI,CAClD8M,EAAOoxF,OAAO5qE,EAAG,GACjB,MAIRprB,KAAKH,MAAMu+B,aAAax5B,MAvKQ,2BA0KjB,EAAE26B,WAAUslD,gBAC3B,sBAASA,EACJtlD,GAAY,gBAAC,IAAD,SA5Ke,4BAgLf/mC,IACjB,MAAMwrF,GAAalV,QAAgBt2E,EAAKV,GAAIU,EAAKg3C,qBAEjD,OACI,gBAAC,WAAD,KACI,gBAAC,IAAD,CACI+G,KAAK,KACLt0C,SAAUzJ,EAAKyJ,SACfqhB,IAAK0gE,IAET,uBAAKhjF,UAAU,8BACVsjF,QAAe9rF,QA3LI,wBAiMnBqH,GACNG,KAAKH,MAAMq3C,eAAiB,gBAAC,qBAA+Br3C,GAAWG,KAAKH,MAAMo+B,gBA/LzFj+B,KAAK9G,MAAQ,CACTw8F,YAAY,EACZv3F,KAAM,EACN6xC,MAAO,IAIRlT,oBACH,MAAMm5D,EAAoBj2F,KAAK21F,eAAetnD,SAAWruC,KAAK21F,eAAetnD,QAAQq4C,OAAOuP,SAE5Fz2F,SAAS22D,iBAA4B,UAAWn2D,KAAKk2F,kBACjDD,GAAkE,mBAA9CA,EAAyB9/B,mBAC5C8/B,EAAyB9/B,iBAAiBggC,cAA+Bn2F,KAAKo2F,yBAC9EH,EAAyB9/B,iBAAiBggC,gBAAiCn2F,KAAKq2F,2BAEjFr2F,KAAK21F,eAAetnD,QAASp0B,SAI9BwpB,uBACH,MAAMwyD,EAAoBj2F,KAAK21F,eAAetnD,SAAWruC,KAAK21F,eAAetnD,QAAQq4C,OAAOuP,SAExFA,GAAkE,mBAA9CA,EAAyB9/B,mBAC5C8/B,EAAyB3/B,oBAAoB6/B,cAA+Bn2F,KAAKo2F,yBACjFH,EAAyB3/B,oBAAoB6/B,gBAAiCn2F,KAAKq2F,4BAGxF72F,SAAS82D,oBAAoB,UAAWt2D,KAAKk2F,kBAuK1Cz0F,SACH,MAAMpE,EAAUiI,OAAOuX,OAAO,IAAI7c,KAAKH,MAAMxC,WACvC,WAACi5F,EAAD,MAAat4F,EAAb,OAAoB4G,GAAU5E,KAAKH,MAEzC,IAAIu9B,EAgBAC,EAfAr9B,KAAKH,MAAMu9B,iBACXA,EAAmBp9B,KAAKH,MAAMu9B,iBACC,MAAxBp9B,KAAKH,MAAM0+B,YAClBnB,EACI,gBAAC,IAAD,CACItlC,GAAG,2BACH+N,eAAe,gFACfjB,OAAQ,CACJmxD,IAAK/1D,KAAKH,MAAM0+B,UAChB5B,IAAK38B,KAAKH,MAAM0+B,UAAYv+B,KAAKH,MAAM+E,OAAOY,WAO1DxF,KAAKH,MAAMw9B,iBACXA,EAAmBr9B,KAAKH,MAAMw9B,iBACC,MAAxBr9B,KAAKH,MAAM0+B,YAClBlB,EACI,gBAAC,IAAD,CACIvlC,GAAG,iBACH+N,eAAe,QAK3B,IACIyrF,EACAC,EACAgF,EAHAC,EAAmB,GAKnBx2F,KAAKH,MAAM42F,WACXF,EACI,uBAAKv1F,UAAU,sBACX,uBAAKA,UAAU,cACX,gBAAC,IAAD,CACIlJ,GAAG,qBACH+N,eAAe,cAEbsD,GACE,wBACInI,UAAU,aACVmI,MAAOA,OAKvB,2BAAMnJ,KAAKH,MAAM42F,YAK7B,MAAMC,EAAoC,GAC1C,IAAK,IAAItrE,EAAI,EAAGA,EAAIxmB,EAAOY,OAAQ4lB,IAC/BsrE,EAAS9xF,EAAOwmB,GAAGtzB,KAAM,EAG7B,IAAK,IAAIszB,EAAI/tB,EAAQmI,OAAS,EAAG4lB,GAAK,EAAGA,IACjCsrE,EAASr5F,EAAQ+tB,GAAGtzB,KACpBuF,EAAQ24F,OAAO5qE,EAAG,GAI1B,GAAI/tB,GAAWA,EAAQmI,OAASxF,KAAKH,MAAMgoB,QAAS,CAChD,MAAMqvC,EAAYl3D,KAAK9G,MAAMiF,KAAO6B,KAAKH,MAAMgoB,QACzC6pE,EAAUx6B,EAAYl3D,KAAKH,MAAMgoB,QACvC2uE,EAAmBn5F,EAAQmP,MAAM0qD,EAAWw6B,GACvC1xF,KAAKH,MAAM2+B,UACRnhC,EAAQmI,OAASksF,IACjBJ,EACI,0BACItwF,UAAU,mDACVuJ,QAASvK,KAAKkxF,UAEd,gBAAC,IAAD,CACIp5F,GAAG,0BACH+N,eAAe,WAM3B7F,KAAK9G,MAAMiF,KAAO,IAClBozF,EACI,0BACIvwF,UAAU,mDACVuJ,QAASvK,KAAK87B,UAEd,gBAAC,IAAD,CACIhkC,GAAG,0BACH+N,eAAe,qBAOnC2wF,EAAmBn5F,EAGvB,IAAIs5F,EAuCAC,EAcJ,MAnDsC,WAAlC52F,KAAKH,MAAMo3C,mBACPj3C,KAAK9G,MAAM82C,QACX2mD,EACI,gBAACrC,EAAD,CACI93D,IAAKx8B,KAAK60F,QACVx3F,QAASm5F,EACTz4D,eAAgB/9B,KAAKH,MAAMk+B,eAC3BgZ,kBAAmB/2C,KAAKH,MAAMk3C,kBAC9B54C,KAAM6B,KAAK9G,MAAMiF,KACjB0pB,QAAS7nB,KAAKH,MAAMgoB,QACpB0tE,aAAcv1F,KAAKH,MAAMq+B,iBACzB7B,MAAOr8B,KAAKq8B,MACZo4D,SAAUz0F,KAAKy0F,SACfj2D,QAASx+B,KAAKH,MAAM2+B,QACpBhzB,MAAOxL,KAAK9G,MAAM82C,MAClBvT,gBAAiBz8B,KAAKH,MAAM48B,mBAKxCk6D,EACI,gBAACrC,EAAD,CACI93D,IAAKx8B,KAAK60F,QACVx3F,QAASm5F,EACTz4D,eAAgB/9B,KAAKH,MAAMk+B,eAC3BgZ,kBAAmB/2C,KAAKH,MAAMk3C,kBAC9B54C,KAAM6B,KAAK9G,MAAMiF,KACjB0pB,QAAS7nB,KAAKH,MAAMgoB,QACpB0tE,aAAcv1F,KAAKH,MAAMq+B,iBACzB7B,MAAOr8B,KAAKq8B,MACZo4D,SAAUz0F,KAAKy0F,SACfj2D,QAASx+B,KAAKH,MAAM2+B,QACpB/B,gBAAiBz8B,KAAKH,MAAM48B,kBAMpCz+B,GAASA,EAAMwH,QAAU8wF,IACzBM,EACI,gBAAC,IAAD,CACI9+F,GAAG,yBACH+N,eAAe,0DACfjB,OAAQ,CACJiyF,cAAeL,EAAiBhxF,OAChC8wF,WAAYt2F,KAAKH,MAAMy2F,eAOnC,gBAAC,WAAD,KACI,uBAAKt1F,UAAU,sBACX,uBAAKA,UAAU,+BACX,uBAAKA,UAAU,wCACX,gBAAC,KAAD,CACIlJ,GAAG,cACH0kC,IAAKx8B,KAAK21F,eACVv0F,SAAS,EACT/D,QAAS2C,KAAKH,MAAMxC,QACpBoC,OAAQA,EACRqc,WAAY,CACRg7E,KAAMC,EACNhsC,oBAAqBgsC,EACrBC,gBAAiBh3F,KAAKH,MAAMq3C,eAAiBp7B,qBAA6Bm7E,EAAgBj3F,KAAKH,MAAMo+B,eACrG8mD,iBAAkB/kF,KAAKH,MAAMq3C,eAAiBl3C,KAAK+kF,iBAAmBjpE,uBAE1E1c,aAAa,EACbC,iBAAiB,EACjB63F,YAAY,EACZlS,cAAehlF,KAAKqyC,QACpBsvB,UAAW3hE,KAAKm3F,eAChBl3F,SAAUD,KAAKC,SACfc,MAAOf,KAAKH,MAAM+E,OAClB+gF,kBAAmB3lF,KAAKH,MAAMq3C,eAAiBl3C,KAAK2lF,uBAAoB3+E,EACxEnG,YAAab,KAAKH,MAAM4+B,gBACxBgmD,WAAYzkF,KAAK9G,MAAM82C,MACvB01C,eAAiBvpD,GAAkBA,EAAOrkC,GAC1Cs/F,eAAgBp3F,KAAKH,MAAMk3C,kBAC3BpE,aAAY3yC,KAAKH,MAAM4+B,gBACvBz9B,UAAWhB,KAAK9G,MAAMw8F,WAAa,wBAA0B,GAC7Dp2F,gBAAgB,mCAEe,QAAlCU,KAAKH,MAAMo3C,oBACZ,gBAAC,IAAD,CACIn/C,GAAG,YACHojC,OAAQl7B,KAAKH,MAAMq7B,OACnBt3B,SAAU5D,KAAKH,MAAMq7B,OACrB3wB,QAASvK,KAAKq3F,cACdxxF,eAAgBw3B,EAChBi6D,cAAet3F,KAAKH,MAAMy9B,2BAGlC,uBACIxlC,GAAG,4BACHkJ,UAAU,sBAETo8B,EACAw5D,IAGRD,EACD,uBACI7+F,GAAG,yBACHkJ,UAAU,sBAETu1F,GAE8B,QAAlCv2F,KAAKH,MAAMo3C,oBACZ,uBAAKj2C,UAAU,mBACVuwF,EACAD,IAG0B,WAAlCtxF,KAAKH,MAAMo3C,oBACZ,uBAAKj2C,UAAU,wBACX,gBAAC,IAAD,CACIlJ,GAAG,YACHojC,OAAQl7B,KAAKH,MAAMq7B,OACnBt3B,SAAU5D,KAAKH,MAAMq7B,OACrB3wB,QAASvK,KAAKq3F,cACdxxF,eAAgBw3B,EAChBi6D,cAAet3F,KAAKH,MAAMy9B,6B,EAvb7Bm4D,E,aAvCjBn4D,wB,SACAD,iB,SACAgB,U,oBACAD,a,oBACAD,Y,oBACAD,iB,SACAz1B,a,oBACA+1B,Q,SACAyY,mB,WACA1Y,U,WACAk4D,S,SACAr5D,iB,SACAW,e,oBAOA1gC,Q,qBACAwqB,Q,sBACA4W,gB,WACAvD,O,SACA06D,oB,SACAU,W,WACAt4F,M,qBACAk5C,e,SACAjZ,c,SACAr5B,O,yBAWiB6wF,E,eAKY,CACzB1+C,kBAybR,SAAkC5a,GAC9B,OAAKA,EAGEA,EAAOz6B,MAFH,MA1bPu1C,mBAAoB,MACpBC,gBAAgB,IA8bxB,MAAM6/C,EAAgB,IAAM,KAEtBE,EAAmB3+C,GACbz4C,GAEA,uBAAKmB,UAAU,kCACX,gBAACs3C,EAAqBz4C,IAMhCJ,EAAS,CACXqzC,UAAW,KACA,CACH7R,QAAS,aACTs2D,cAAe,MACfhuF,MAAO,W,iaC3gBJ,MAAMiuF,UAAwB73F,gBAqEV,gCAACE,GAC5B,OAAmB,IAAfA,EAAM6H,KACC,CAAC+vF,iBAAkB,IAGvB,KAGX73F,YAAYC,GACRC,MAAMD,GADS,yBAYDlB,IACd,MAAM+4F,EAAeziF,KAAmBtW,EAAGqQ,sBACrC,SAAC2oF,GAAY33F,KAAKH,MAGpB83F,GAAYD,IAAiB/4F,EAAEi5F,QAC/Bj5F,EAAEqH,kBACM2xF,GAAYD,GAAgB/4F,EAAEi5F,UAAcD,GAAYD,IAAiB/4F,EAAEqgE,WAAargE,EAAEk5F,SAClG73F,KAAKyI,aAAa9J,MApBP,uBAwBHA,IACZA,EAAEqH,iBAEkBhG,KAAK83F,iBAAiBzpD,QAAQttC,MAAMuR,OACxC9M,OAASwJ,4BACrBhP,KAAK8F,SAAS,CAAC2xF,kBAAkB,IAIrCz3F,KAAKH,MAAMk4F,qBAjCI,uBAoCJ,KACX,MAAMC,EAAU,CACZj1F,YAAa/C,KAAK83F,iBAAiBzpD,QAAQttC,MAC3CiH,OAAQhI,KAAKi4F,mBAAmB5pD,QAAQttC,MACxCwvF,QAASvwF,KAAKk4F,oBAAoB7pD,QAAQttC,OAE9Cf,KAAKH,MAAMs4F,cAAcH,MA1CV,4BA6CEr5F,IACjBA,EAAEqH,iBACEhG,KAAKH,MAAMu4F,oBACXp4F,KAAKH,MAAMu4F,wBAhDA,iCAoDM,KACrBp4F,KAAKH,MAAMw4F,eAAe,QArDX,kCAwDO,KACtBr4F,KAAKH,MAAMw4F,eAAe,QAtD1Br4F,KAAK9G,MAAQ,CACTu+F,iBAAkB,IAGtBz3F,KAAKi4F,mBAAqBt4F,cAC1BK,KAAKk4F,oBAAsBv4F,cAC3BK,KAAK83F,iBAAmBn4F,cAmD5B8B,SACI,MAAM,uBAAC62F,EAAD,wBAAyBC,GAA2Bv4F,KAAKH,MAEzD24F,EAAsBF,GAA0BC,EACtD,IAAId,EAAmB,KACnBp2D,EAAc,KACdo3D,EAAmB,aAEnBz4F,KAAK9G,MAAMu+F,mBACXA,EACI,qBAAGz2F,UAAU,qBACT,gBAAC,IAAD,CACIlJ,GAAG,iCACH+N,eAAe,kDAElB7F,KAAK9G,MAAMu+F,kBAGpBgB,GAAoB,cAGpBz4F,KAAKH,MAAMwhC,cACXA,EACI,uBAAKrgC,UAAU,wBACX,uBAAKA,UAAU,aACX,qBACIlJ,GAAG,qBACHkJ,UAAU,qBAEThB,KAAKH,MAAMwhC,gBAOhC,MAAMq3D,EACF,uBAAK13F,UAAU,eACX,gBAAC,IAAD,CAAWA,UAAU,0CACrB,gBAAC,IAAD,CACIlJ,GAAG,2BACH+N,eAAe,WAEnB,gBAAC,IAAD,CACI/N,GAAG,2BACH+N,eAAe,qCAKrB8yF,EACF,uBAAK33F,UAAU,eACX,gBAAC,IAAD,CAAUA,UAAU,yCACpB,gBAAC,IAAD,CACIlJ,GAAG,4BACH+N,eAAe,YAEnB,gBAAC,IAAD,CACI/N,GAAG,4BACH+N,eAAe,mDAK3B,IAAI+yF,EAAc,KAEdA,EADAJ,EAEI,4BACIt7F,IAAI,cACJ8D,UAAU,uBAEV,uBAAKA,UAAU,SACX,6BACI,yBACIlJ,GAAG,SACH+D,KAAK,QACLuE,KAAK,cACL8+E,QAAoC,MAA3Bl/E,KAAKH,MAAM+wF,YACpB3wF,SAAUD,KAAK64F,uBACftwF,kBAAgB,0BAEnBmwF,IAGT,uBAAK13F,UAAU,SACX,6BACI,yBACIlJ,GAAG,UACH+D,KAAK,QACLuE,KAAK,cACL8+E,QAAoC,MAA3Bl/E,KAAKH,MAAM+wF,YACpB3wF,SAAUD,KAAK84F,wBACfvwF,kBAAgB,0BAEnBowF,KAOb,uBAAK33F,UAAU,sCACX,uBAAKA,UAAU,SACVs3F,EAAyBI,EAAoB,KAC7CH,EAA0BI,EAAqB,OAMhE,MAAMI,GAAgBC,UAEtB,OACI,4BACI,gBAAC/wF,EAAA,EAAD,CACIC,gBAAgB,6CAChBR,KAAM1H,KAAKH,MAAM6H,KACjBuxF,OAAO,QACP9wF,OAAQnI,KAAKH,MAAM4pE,iBACnBrhE,SAAUpI,KAAKH,MAAMq5F,cACrBv1F,WAAW,EACX25E,cAAc,EACdh1E,KAAK,SACLC,kBAAgB,wBAEhB,gBAACN,EAAA,SAAD,KACI,0BACIpM,KAAK,SACLmF,UAAU,QACVuJ,QAASvK,KAAKH,MAAM4pE,iBACpB92B,aAAW,QACXxpC,MAAM,SAEN,wBAAM6pC,cAAY,QAAQ,MAE9B,gBAAC/qC,EAAA,QAAD,CACIa,eAAe,KACfhR,GAAG,wBAEH,gBAAC,IAAD,CACIA,GAAG,2BACH+N,eAAe,kBAI3B,wBACIyC,KAAK,OACLtH,UAAU,mBAEV,gBAACiH,EAAA,OAAD,KACI,uBAAKjH,UAAU,cACX,yBACIA,UAAU,qCACVlJ,GAAG,yBAEH,gBAAC,IAAD,CACIA,GAAG,qBACH+N,eAAe,UAGvB,uBAAK7E,UAAU,YACV43F,IAGT,uBAAK53F,UAAWy3F,GACZ,yBACIz3F,UAAU,qCACVm4F,QAAQ,kBAER,gBAAC,IAAD,CACIrhG,GAAG,qBACH+N,eAAe,UAGvB,uBAAK7E,UAAU,YACX,gBAAC,IAAD,CACIlJ,GAAG,iBACHmI,SAAUD,KAAK6yC,aACfh3C,KAAK,OACL2gC,IAAKx8B,KAAK83F,iBACV92F,UAAU,eACVH,YAAa,CAAC/I,IAAIkc,OAAE,wBAAyBnO,eAAgB,qCAC7DvC,UAAW0L,4BACXjO,MAAOf,KAAKH,MAAMu5F,YAAYr2F,YAC9BY,WAAW,EACXg+D,UAAW3hE,KAAKq5F,iBAEnB5B,EACD,qBAAGz2F,UAAU,oBACR,QAAU+3F,EAAgB/4F,KAAKH,MAAMu5F,YAAYh5F,KAAO,KACzD,0BACIY,UAAU,0BACVuJ,QAASvK,KAAKs5F,mBAEd,gBAAC,IAAD,CACIxhG,GAAG,qBACH+N,eAAe,UAGtB,OAIb,uBAAK7E,UAAU,cACX,uBAAKA,UAAU,YACX,yBACIA,UAAU,4BACVm4F,QAAQ,qBAER,gBAAC,IAAD,CACIrhG,GAAG,wBACH+N,eAAe,aAGvB,yBAAO7E,UAAU,qBACb,gBAAC,IAAD,CACIlJ,GAAG,yBACH+N,eAAe,iBAI3B,uBAAK7E,UAAU,YACX,4BACIlJ,GAAG,oBACHkJ,UAAU,yBACVw7B,IAAKx8B,KAAKk4F,oBACV1lD,KAAK,IACL3xC,YAAaoU,KAAsB,0BAA2B,mDAC9D3R,UAAU,MACVvC,MAAOf,KAAKH,MAAMu5F,YAAY7I,QAC9BtwF,SAAUD,KAAK6yC,eAEnB,qBAAG7xC,UAAU,eACT,gBAAC,IAAD,CACIlJ,GAAG,gCACH+N,eAAe,iDAK/B,uBAAK7E,UAAU,mBACX,uBAAKA,UAAU,YACX,yBACIA,UAAU,4BACVm4F,QAAQ,oBAER,gBAAC,IAAD,CACIrhG,GAAG,uBACH+N,eAAe,YAGvB,yBAAO7E,UAAU,qBACb,gBAAC,IAAD,CACIlJ,GAAG,yBACH+N,eAAe,iBAI3B,uBAAK7E,UAAU,YACX,4BACIlJ,GAAG,mBACHkJ,UAAU,yBACVw7B,IAAKx8B,KAAKi4F,mBACVzlD,KAAK,IACL3xC,YAAaoU,KAAsB,yBAA0B,4CAC7D3R,UAAU,OACVvC,MAAOf,KAAKH,MAAMu5F,YAAYpxF,OAC9B/H,SAAUD,KAAK6yC,eAEnB,qBAAG7xC,UAAU,eACT,gBAAC,IAAD,CACIlJ,GAAG,2BACH+N,eAAe,4KAGtBw7B,KAIb,gBAACp5B,EAAA,SAAD,KACI,0BACInQ,GAAG,mBACH+D,KAAK,SACLmF,UAAU,eACVuJ,QAASvK,KAAKH,MAAM4pE,kBAEpB,gBAAC,IAAD,CACI3xE,GAAG,uBACH+N,eAAe,YAGvB,0BACI/N,GAAG,mBACHyS,QAASvK,KAAKyI,aACd5M,KAAK,SACLmF,UAAU,mBAEV,gBAAC,IAAD,CACIlJ,GAAG,0BACH+N,eAAe,yB,EApb9B2xF,E,YACE,CAKf9vF,KAAM4pC,oBAKNs/C,YAAat/C,sBAKb8nD,YAAa9nD,sBAKbqmD,SAAUrmD,SAKVjQ,YAAaiQ,SAKbymD,gBAAiBzmD,oBAKjBm4B,iBAAkBn4B,oBAKlB4nD,cAAe5nD,SAKf+mD,eAAgB/mD,oBAKhB8mD,mBAAoB9mD,oBAKpB6mD,cAAe7mD,oBAKfgnD,uBAAwBhnD,oBAKxBinD,wBAAyBjnD,sBClEjC,SAAentC,cANf,SAAyBjL,GACrB,MAAO,CACHy+F,UAAUhJ,QAAQz1F,EAAO+U,gCAAwC,yBAIzE,CAAwCupF,G,oKCkDzB,MAAM+B,UAAuB55F,gBAWxCC,YAAYC,GACRC,MAAMD,GADgB,iDAoBVlB,IACZ,MAAM2kB,EAAM3kB,EAAEu7B,OAAOn5B,MAAMuR,OAC3BtS,KAAK8F,SAAS,CAAC0zF,WAAYl2E,EAAI0rB,QAAQ,kBAAmB,IAAI38B,cAAeonF,UAAU,OAtBjE,mBAyBd96F,IAA2C,QACnDA,EAAEqH,iBACFrH,EAAEqH,iBACF,MAAMsd,GAAM,UAAAtjB,KAAK05F,gBAAL,mBAAerrD,eAAf,eAAwBttC,QAAS,GACvC44F,GAAYC,QAAmBt2E,GACjCq2E,EAAUn0F,OAAS,EACnBxF,KAAK8F,SAAS,CAAC6zF,eAGnB35F,KAAK8F,SAAS,CAAC6zF,UAAW,GAAIF,UAAU,IACxCz5F,KAAKH,MAAMg6F,cAAcv2E,OAnCH,mBAsCf,KACPtjB,KAAK8F,SAAS,CAAC6zF,UAAW,GAAIF,UAAU,IACxCz5F,KAAKH,MAAM4pE,sBAtCXzpE,KAAK05F,SAAW/5F,cAChBK,KAAK9G,MAAQ,CACTsgG,WAAY35F,EAAM25F,WAClBG,UAAW,GACXF,UAAU,GAIa,gCAAC55F,EAAc3G,GAG1C,OAAKA,EAAMugG,SAIJ,KAHI,CAACD,WAAY35F,EAAM25F,YA6BlC/3F,SACI,IAAIq4F,EAAW,iCACXpiG,EAAQ,KACRiK,EAAW,KAEX3B,KAAK9G,MAAMygG,YACXG,GAAY,cAGZ95F,KAAKH,MAAMwhC,aAAerhC,KAAK9G,MAAMygG,UACrCjiG,EACI,uBAAKsJ,UAAU,aACX,qBAAGA,UAAU,qBACRhB,KAAK9G,MAAMygG,WAAa35F,KAAKH,MAAMwhC,cAKhD1/B,EACI,qBAAGX,UAAU,eACT,gBAAC,IAAD,CACIlJ,GAAG,sBACH+N,eAAe,sEAM/B,MAAMk0F,EAAU/5F,KAAKH,MAAMm6F,eAAiB,YACtCC,GAAWjB,QAAgBe,GAC3BG,EACF,gBAAC91D,EAAA,EAAD,CAAStsC,GAAG,cAAciiG,GAG9B,OACI,gBAAC9xF,EAAA,EAAD,CACIC,gBAAgB,cAChBR,KAAM1H,KAAKH,MAAM6H,KACjBS,OAAQnI,KAAK0sF,SACbtkF,SAAUpI,KAAKH,MAAMq5F,cACrB5wF,KAAK,SACLC,kBAAgB,uBAEhB,gBAACN,EAAA,SAAD,CAAcU,aAAa,GACvB,gBAACV,EAAA,QAAD,CACIa,eAAe,KACfhR,GAAG,uBAEFkI,KAAKH,MAAMsJ,QAGpB,wBACIb,KAAK,OACLtH,UAAU,mBAEV,gBAACiH,EAAA,OAAD,KACI,uBAAKjH,UAAU,cACX,yBAAOA,UAAU,sCACb,gBAAC,IAAD,CACIlJ,GAAG,sBACH+N,eAAe,iBAGvB,uBAAK7E,UAAU,YACX,uBAAKA,UAAW84F,GACZ,gBAAC,IAAD,CACIx1D,UAAWt1B,wBACXu1B,UAAU,MACVC,QAAS01D,GAET,wBAAMl5F,UAAU,qBAAqBi5F,IAEzC,yBACIp+F,KAAK,OACL2gC,IAAKx8B,KAAK05F,SACV14F,UAAU,eACVsC,UAAW0L,4BACX/O,SAAUD,KAAKm6F,aACfp5F,MAAOf,KAAK9G,MAAMsgG,WAClB71F,WAAW,KAGlBjM,EACAiK,KAIb,gBAACsG,EAAA,SAAD,KACI,0BACIpM,KAAK,SACLmF,UAAU,eACVuJ,QAASvK,KAAK0sF,UAEd,gBAAC,IAAD,CACI50F,GAAG,mBACH+N,eAAe,WAGvB,0BACI0E,QAASvK,KAAKwI,SACd3M,KAAK,SACLmF,UAAU,mBAEThB,KAAKH,MAAMu6F,sB,EA7JnBb,E,aAjDjB7xF,K,SAKAyB,M,SAKAixF,iB,SAKAZ,W,WAKAQ,e,sBAKA34D,Y,SAKAw4D,c,oBAKAX,c,SAKAzvB,iB,wBASiB8vB,E,eAGY,CACzB7xF,MAAM,EACNyB,MAAO,aACPixF,iBAAkB,OAClBZ,WAAY,GACZn4D,YAAa,OCtDrB,SAAel9B,cARf,SAAyBjL,GACrB,MAAMokB,GAAcC,QAAerkB,GAEnC,MAAO,CACH8gG,eAFmB,GAAH,QAAM5tF,UAAN,YAAsBkR,EAAYld,SAM1D,CAAwCm5F,G,wHCAjC,SAASc,EAAwBx6F,GACpC,IAAI+wF,EAAc/wF,EAAM+wF,aAAe5hF,kBAOvC,OANKnP,EAAMy4F,wBAA0B1H,IAAgB5hF,oBACjD4hF,EAAc5hF,sBAEbnP,EAAM04F,yBAA2B3H,IAAgB5hF,uBAClD4hF,EAAc5hF,mBAEX4hF,EAiDI,MAAM0B,UAAuB3yF,gBAKjCC,YAAYC,GACfC,MAAMD,GADuB,mBAetB,KACP,IAAKG,KAAK9G,MAAMohG,mBAEZ,YADAt6F,KAAK8F,SAAS,CAACu7B,YAAapsB,KAAsB,2BAA4B,0BAIlF,GAAIjV,KAAK9G,MAAMuU,YAAYjI,OAAS,EAEhC,YADAxF,KAAK8F,SAAS,CAACy0F,UAtFgB,IA0FnC,MAAM,QAACj4F,EAAD,cAAUsQ,GAAiB5S,KAAKH,MAChCuC,EAAmB,CACrBwR,QAAShB,EACTxS,KAAMJ,KAAK9G,MAAMuU,YACjBpL,aAAcrC,KAAK9G,MAAMohG,mBACzB/J,QAASvwF,KAAK9G,MAAMshG,eACpBxyF,OAAQhI,KAAK9G,MAAMuhG,cACnB5+F,KAAMmE,KAAK9G,MAAM03F,YACjB/4E,UAAW,EACX6iF,WAAY,GACZp/E,UAAW,EACXq/E,gBAAiB,EACjBzkD,mBAAmB,EACnBp+C,GAAI,GACJ8iG,aAAc,EACdC,UAAW,GACXC,gBAAiB,EACjBC,qBAAsB,EACtBjjF,UAAW,GAGfxV,EAAQ04F,cAAc54F,GAASyF,MAAK,EAAElQ,OAAMD,YACpCA,EACAsI,KAAKi7F,qBAAqBvjG,GACnBC,IACPqI,KAAKypE,mBACLnnE,EAAQ6S,gBAAgBxd,UApDH,2BAyDd,KACfqI,KAAKH,MAAMyC,QAAQu/B,WAAW/1B,0BA1DD,+BA6DTlU,IACQ,+CAAxBA,EAAIG,gBACJiI,KAAK8F,SAAS,CACVy0F,UAhI2B,EAiI3Bl5D,YACI,gBAAC,IAAD,CACIvpC,GAAG,8BACH+N,eAAe,sEAII,8CAAxBjO,EAAIG,gBACXiI,KAAK8F,SAAS,CAACu7B,YAAapsB,KAAsB,4BAA6B,4CAE/EjV,KAAK8F,SAAS,CAACu7B,YAAazpC,EAAIgH,aA3EP,uBA+EjBgyF,IACZ5wF,KAAK8F,SAAS,CACV8qF,cACAvvD,YAAa,QAlFY,6BAsFX1iC,IACdA,GACAA,EAAEqH,iBAENhG,KAAK8F,SAAS,CAACy0F,UA3JM,OAiEQ,6BA6FXW,IA7JiB,IA8J/Bl7F,KAAK9G,MAAMqhG,UACXv6F,KAAK8F,SAAS,CAAC2H,YAAaytF,EAAQC,cAAc,GAAOn7F,KAAKwI,UAE9DxI,KAAK8F,SAAS,CAACy0F,UAnKK,EAmKwBl5D,YAAa,KAAM5zB,YAAaytF,EAAQC,cAAc,OAjGzE,6BAqGZ,KACjBn7F,KAAK8F,SAAS,CAACy0F,UAxKS,OAkEK,6BAyGX5iG,IAClBqI,KAAK8F,SAAS,CACVw0F,mBAAoB3iG,EAAKoL,YACzBy3F,eAAgB7iG,EAAK44F,QACrBkK,cAAe9iG,EAAKqQ,SAEnBhI,KAAK9G,MAAMiiG,cACZn7F,KAAK8F,SAAS,CAAC2H,aAAa2tF,QAAezjG,EAAKoL,YAAYuP,aA7GhEtS,KAAK9G,MAAQ,CACTmoC,YAAa,GACbuvD,YAAayJ,EAAwBx6F,GACrC06F,UAxEoB,EAyEpBD,mBAAoB,GACpB7sF,YAAa,GACb+sF,eAAgB,GAChBC,cAAe,GACfU,cAAc,GAyGtB15F,SACI,MAAM23F,EAAc,CAChBh5F,KAAMJ,KAAK9G,MAAMuU,YACjB1K,YAAa/C,KAAK9G,MAAMohG,mBACxB/J,QAASvwF,KAAK9G,MAAMshG,eACpBxyF,OAAQhI,KAAK9G,MAAMuhG,eAGvB,IAAIY,GAAmB,EACnBC,GAAqB,EAErBC,EAAuC,GACvCC,EAAkD,GAGtD,OAAQx7F,KAAK9G,MAAMqhG,WACnB,KAtMwB,EAuMpBc,GAAmB,EACnB,MACJ,KAxMqB,EAyMjBC,GAAqB,EACrBC,EACI,gBAAC,IAAD,CACIzjG,GAAG,8BACH+N,eAAe,uBAGvB21F,EAA4BD,EAC5B,MACJ,KAjNmC,EAkN/BD,GAAqB,EACrBC,EACI,gBAAC,IAAD,CACIzjG,GAAG,6BACH+N,eAAe,oBAGvB21F,EACI,gBAAC,IAAD,CACI1jG,GAAG,sBACH+N,eAAe,mBAM3B,OACI,4BACI,gBAAC,EAAD,CACI6B,KAAM2zF,EACNzK,YAAa5wF,KAAK9G,MAAM03F,YACxB0H,uBAAwBt4F,KAAKH,MAAMy4F,uBACnCC,wBAAyBv4F,KAAKH,MAAM04F,wBACpCa,YAAaA,EACb/3D,YAAarhC,KAAK9G,MAAMmoC,YACxB02D,gBAAiB/3F,KAAKwI,SACtBihE,iBAAkBzpE,KAAKypE,iBACvB4uB,eAAgBr4F,KAAKy7F,aACrBrD,mBAAoBp4F,KAAK07F,mBACzBvD,cAAen4F,KAAK27F,qBAExB,gBAAC,EAAD,CACIj0F,KAAM4zF,EACNnyF,MAAOoyF,EACPnB,iBAAkBoB,EAClBhC,WAAYx5F,KAAK9G,MAAMuU,YACvB4zB,YAAarhC,KAAK9G,MAAMmoC,YACxBw4D,cAAe75F,KAAK47F,mBACpBnyB,iBAAkBzpE,KAAK67F,uB,EA7LtBvJ,E,aApCjB1/E,c,sBAKA0lF,uB,oBAKAC,wB,oBAEAj2F,Q,WACI04F,c,oBACA7lF,gB,oBACA0sB,W,qCAqBaywD,E,eACY,CACzB1B,YAAa5hF,oBCjCrB,SAAe7K,cA5Bf,SAAyBjL,GACrB,MAAMokB,GAAcC,QAAerkB,GAEnC,IAAIo/F,GAAyB,EACzBC,GAA0B,EAO9B,OALIj7E,IACAg7E,GAAyBwD,QAA8B5iG,EAAOuzB,2BAC9D8rE,GAA0BuD,QAA8B5iG,EAAOuzB,6BAG5D,CACH7Z,cAAe0K,EAAYxlB,GAC3BygG,0BACAD,6BAIR,SAA4BlhG,GACxB,MAAO,CACHkL,SAAS+B,wBAA0E,CAC/E22F,cAD+E,KAE/E7lF,gBAF+E,KAG/E0sB,WAAUA,KACXzqC,MAIX,CAA4Dk7F,I,6YChC7C,MAAMyJ,UAAkBp8F,gBACnCC,YAAYC,GACRC,MAAMD,GADgB,sBAQXm8F,IACXh8F,KAAK8F,SAAS,CAACk2F,mBANfh8F,KAAK9G,MAAQ,CACT8iG,YAAan8F,EAAMo8F,oBAQ3Bx6F,SACI,OACI,uBACIT,UAAW,aAEVhB,KAAKH,MAAM0/B,SAASv/B,KAAKm0C,YAAan0C,KAAK9G,MAAM8iG,e,EAlB7CD,E,aARjBE,mB,sBACA18D,S,+CCPJ,QAAe,IAA0B,8C,iHCKzC,MAoiBA,EApiBwB,IACpB,uBACIh2B,MAAM,MACNC,OAAO,MACPyjC,QAAQ,cACRC,KAAK,OACLC,MAAM,8BAEN,wBACIE,EAAE,iMACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,sJACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,4zBACFH,KAAK,6BAET,wBACIG,EAAE,4zBACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,gFACFH,KAAK,6BAET,wBACIG,EAAE,gFACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,2CACFH,KAAK,6BAET,wBACIG,EAAE,2CACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,4CACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,2CACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,sBACFH,KAAK,6BAET,wBACI/nB,EAAE,KACFwhC,EAAE,IACFp9C,MAAM,KACNC,OAAO,KACP0jC,KAAK,sBAET,0BACIhM,QAAQ,OACR6gD,GAAG,UACHC,GAAG,SACHka,EAAE,IACFhvD,KAAK,6BAET,wBACIhM,QAAQ,OACR/b,EAAE,KACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,6BAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,SACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,6BAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,SACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,6BAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,SACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,6BAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,SACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,6BAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,SACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,6BAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,SACFp9C,MAAM,IACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,6BAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,SACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,6BAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,SACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,6BAET,0BACI60C,GAAG,UACHC,GAAG,UACHka,EAAE,IACFhvD,KAAK,8BACLI,YAAY,SAEhB,0BACIy0C,GAAG,UACHC,GAAG,UACHka,EAAE,IACFhvD,KAAK,8BACLI,YAAY,SAEhB,0BACIy0C,GAAG,UACHC,GAAG,UACHka,EAAE,IACFhvD,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,IACFp9C,MAAM,IACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,IACFp9C,MAAM,IACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,IACFp9C,MAAM,IACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,IACFp9C,MAAM,IACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,KACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,4eACFH,KAAK,2BACLI,YAAY,SAEhB,wBACID,EAAE,mFACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,kPACFH,KAAK,6BAET,wBACIG,EAAE,kPACFH,KAAK,gCAET,wBACIG,EAAE,sKACFH,KAAK,2BACLI,YAAY,SAEhB,wBACID,EAAE,0BACFH,KAAK,6BAET,0BACI60C,GAAG,QACHC,GAAG,OACHka,EAAE,MACFhvD,KAAK,8BACLI,YAAY,SAEhB,0BACIy0C,GAAG,QACHC,GAAG,OACHka,EAAE,MACFhvD,KAAK,8BACLI,YAAY,SAEhB,0BACIy0C,GAAG,QACHC,GAAG,OACHka,EAAE,MACFhvD,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,8BACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACP0jC,KAAK,sBAET,wBACIhM,QAAQ,OACR/b,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,6BAET,wBACIhM,QAAQ,OACR/b,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,IACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,6BAET,wBACIhM,QAAQ,OACR/b,EAAE,MACFwhC,EAAE,KACFp9C,MAAM,IACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,6BAET,wBACI/nB,EAAE,MACFwhC,EAAE,MACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,2BACLI,YAAY,UCjhBxB,SAAS6uD,EAAgBt8F,GACrB,OAAIyc,UAEI,uBAAKtb,UAAU,oCACX,gBAAC,IAAD,CAAMyyC,UAAU,GACZ,uBAAKzyC,UAAU,cACX,qBAAGA,UAAU,qBACb,gBAAC,IAAD,CACIlJ,GAAG,sCACH+N,eAAe,qEAM3Bu2F,SAiCL,KA/BC,uBAAKp7F,UAAU,2BACX,gBAAC,EAAD,MACA,uBAAKA,UAAU,+BACX,0BACI,gBAAC,IAAD,CACIlJ,GAAG,2CACH+N,eAAe,0CAGvB,uBAAK7E,UAAU,kCACX,0BACIA,UAAU,2EACVuJ,QAAS,IAAM8xF,EAAex8F,EAAMy8F,eAEnCC,KAEL,0BACIv7F,UAAU,kEACVuJ,QAAS,IAAMiyF,EAAW38F,EAAMy8F,eAEhC,gBAAC,IAAD,CACIxkG,GAAG,gCACH+N,eAAe,yB,aA1C3Cy2F,a,qBAsDJ,MAAMC,EAA0B,KACxBE,UAEI,gBAAC,IAAD,CACI3kG,GAAG,qCACH+N,eAAe,gCAKvB62F,UAEI,gBAAC,IAAD,CACI5kG,GAAG,iCACH+N,eAAe,2BAQvB,gBAAC,IAAD,CACI/N,GAAG,qCACH+N,eAAe,mBAKrB22F,EAAcxU,KAChBrqF,SAAWg/F,OAAqB3U,GAAU,sBAC1C37E,OAAOC,KAAK,kDAAmD,WAG7D+vF,EAAkBrU,IACpB,MAAM4U,EAAgB,oDAEtB,OAAIH,YACA9+F,SAAWg/F,OAAqB3U,GAAU,qBAAsB,CAACl1B,IAAK,iBACtEzmD,OAAOC,KAAP,UAAeswF,EAAf,OAAmC,YAInCF,YACA/+F,SAAWg/F,OAAqB3U,GAAU,qBAAsB,CAACl1B,IAAK,aACtEzmD,OAAOC,KAAP,UAAeswF,EAAf,OAAmC,gBAMvCJ,EAAWxU,IAGf,ICmSA,EA1ZqB,IACjB,uBACIz+E,MAAM,MACNC,OAAO,MACPyjC,QAAQ,cACRC,KAAK,OACLC,MAAM,6BACN0vD,WAAW,gCAEX,0BACI9a,GAAG,KACHC,GAAG,UACHka,EAAE,MACFlpC,OAAO,YAEX,qBAAG1rD,OAAO,wBACN,2BACIy6E,GAAG,KACHC,GAAG,UACHC,GAAG,IACHC,GAAG,IACHh1C,KAAK,YAET,2BACI60C,GAAG,KACHC,GAAG,UACHC,GAAG,IACHC,GAAG,IACHh1C,KAAK,wBAET,wBACIG,EAAE,oLACF2lB,OAAO,UACP8pC,cAAc,OACdrkC,YAAY,SAGpB,qBAAGnxD,OAAO,wBACN,2BACIy6E,GAAG,KACHC,GAAG,UACHC,GAAG,IACHC,GAAG,IACHh1C,KAAK,YAET,2BACI60C,GAAG,KACHC,GAAG,UACHC,GAAG,IACHC,GAAG,IACHh1C,KAAK,wBAET,wBACIG,EAAE,oLACF2lB,OAAO,UACP8pC,cAAc,OACdrkC,YAAY,SAGpB,qBAAGnxD,OAAO,wBACN,2BACIy6E,GAAG,KACHC,GAAG,UACHC,GAAG,IACHC,GAAG,IACHh1C,KAAK,YAET,2BACI60C,GAAG,KACHC,GAAG,UACHC,GAAG,IACHC,GAAG,IACHh1C,KAAK,wBAET,wBACIG,EAAE,oLACF2lB,OAAO,UACP8pC,cAAc,OACdrkC,YAAY,SAGpB,qBAAGnxD,OAAO,wBACN,wBACI6d,EAAE,KACFwhC,EAAE,KACFp9C,MAAM,MACNC,OAAO,KACPy4E,GAAG,IACH/0C,KAAK,YAET,wBACI/nB,EAAE,QACFwhC,EAAE,QACFp9C,MAAM,QACNC,OAAO,OACPy4E,GAAG,OACHjvB,OAAO,UACP8pC,cAAc,OACdrkC,YAAY,SAGpB,wBACItzC,EAAE,OACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,OACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,OACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,OACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,OACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,OACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,MACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,QACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,YAET,wBACI/nB,EAAE,QACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,YAET,wBACI/nB,EAAE,OACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,YAET,wBACI/nB,EAAE,QACFwhC,EAAE,QACFp9C,MAAM,OACNC,OAAO,MACPy4E,GAAG,OACHjvB,OAAO,UACP8pC,cAAc,OACdrkC,YAAY,QAEhB,wBACIprB,EAAE,8EACFH,KAAK,YAET,wBACIG,EAAE,mBACF2lB,OAAO,UAEX,wBACI3lB,EAAE,kBACF2lB,OAAO,UAEX,wBACI3lB,EAAE,mBACF2lB,OAAO,UAEX,wBACI3lB,EAAE,usBACFH,KAAK,YAET,4BACI,0BACIp1C,GAAG,iBACHqtB,EAAE,WACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPuzF,YAAY,iBACZC,0BAA0B,QAE1B,2BACIC,aAAa,IACbxuF,OAAO,uBAEX,iCACIyuF,GAAG,cACHrhG,KAAK,SACL+I,OAAO,8CAEX,4BAAUu4F,GAAG,YACb,kCAAgBC,aAAa,YAC7B,iCACIvhG,KAAK,SACL+I,OAAO,+CAEX,2BACI47B,KAAK,SACL68D,IAAI,qBACJ5uF,OAAO,uBAEX,2BACI+xB,KAAK,SACL08D,GAAG,gBACHG,IAAI,qBACJ5uF,OAAO,WAGf,2BACI3W,GAAG,gBACHwlG,oBAAoB,oBACpB/zF,MAAM,IACNC,OAAO,KAEP,uBACI+zF,UAAU,eACV7sC,UAAU,4CAGlB,0BACI54D,GAAG,iBACHqtB,EAAE,WACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPuzF,YAAY,iBACZC,0BAA0B,QAE1B,2BACIC,aAAa,IACbxuF,OAAO,uBAEX,iCACIyuF,GAAG,cACHrhG,KAAK,SACL+I,OAAO,8CAEX,4BAAUu4F,GAAG,YACb,kCAAgBC,aAAa,YAC7B,iCACIvhG,KAAK,SACL+I,OAAO,+CAEX,2BACI47B,KAAK,SACL68D,IAAI,qBACJ5uF,OAAO,uBAEX,2BACI+xB,KAAK,SACL08D,GAAG,gBACHG,IAAI,qBACJ5uF,OAAO,WAGf,2BACI3W,GAAG,gBACHwlG,oBAAoB,oBACpB/zF,MAAM,IACNC,OAAO,KAEP,uBACI+zF,UAAU,eACV7sC,UAAU,2CAGlB,0BACI54D,GAAG,iBACHqtB,EAAE,WACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPuzF,YAAY,iBACZC,0BAA0B,QAE1B,2BACIC,aAAa,IACbxuF,OAAO,uBAEX,iCACIyuF,GAAG,cACHrhG,KAAK,SACL+I,OAAO,8CAEX,4BAAUu4F,GAAG,YACb,kCAAgBC,aAAa,YAC7B,iCACIvhG,KAAK,SACL+I,OAAO,+CAEX,2BACI47B,KAAK,SACL68D,IAAI,qBACJ5uF,OAAO,uBAEX,2BACI+xB,KAAK,SACL08D,GAAG,gBACHG,IAAI,qBACJ5uF,OAAO,WAGf,2BACI3W,GAAG,gBACHwlG,oBAAoB,oBACpB/zF,MAAM,IACNC,OAAO,KAEP,uBACI+zF,UAAU,eACV7sC,UAAU,iCAGlB,0BACI54D,GAAG,iBACHqtB,EAAE,MACFwhC,EAAE,MACFp9C,MAAM,MACNC,OAAO,MACPuzF,YAAY,iBACZC,0BAA0B,QAE1B,2BACIC,aAAa,IACbxuF,OAAO,uBAEX,iCACIyuF,GAAG,cACHrhG,KAAK,SACL+I,OAAO,8CAEX,4BAAUu4F,GAAG,MACb,kCAAgBC,aAAa,OAC7B,iCACIvhG,KAAK,SACL+I,OAAO,+CAEX,2BACI47B,KAAK,SACL68D,IAAI,qBACJ5uF,OAAO,uBAEX,2BACI+xB,KAAK,SACL08D,GAAG,gBACHG,IAAI,qBACJ5uF,OAAO,WAGf,yBACI3W,GAAG,cACHyR,MAAM,KACNC,OAAO,KACP+zF,UAAU,4lDAEd,yBACIzlG,GAAG,cACHyR,MAAM,KACNC,OAAO,KACP+zF,UAAU,gnDAEd,yBACIzlG,GAAG,cACHyR,MAAM,KACNC,OAAO,KACP+zF,UAAU,0pDCsJ1B,EAziBqB,IACjB,uBACIh0F,MAAM,MACNC,OAAO,MACPyjC,QAAQ,cACRC,KAAK,OACLC,MAAM,8BAEN,wBACIE,EAAE,6/BACFH,KAAK,mBACLI,YAAY,SAEhB,qBAAGhmC,OAAO,wBACN,wBACI6d,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,KACPy4E,GAAG,IACHvxB,UAAU,8BACVxjB,KAAK,YAET,wBACI/nB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,OACNC,OAAO,OACPy4E,GAAG,OACHvxB,UAAU,8BACVsC,OAAO,UACP8pC,cAAc,OACdrkC,YAAY,SAGpB,qBAAGv3B,QAAQ,QACP,wBACImM,EAAE,+QACFH,KAAK,qBAET,wBACIG,EAAE,kRACFH,KAAK,qBAET,wBACIG,EAAE,6QACFH,KAAK,UACLI,YAAY,SAEhB,wBACID,EAAE,iRACFH,KAAK,UACLI,YAAY,SAEhB,wBACID,EAAE,iRACFH,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,8BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,8BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,SACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,6BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,8BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,SACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,6BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,8BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,8BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,8BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,8BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,SACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,6BACVxjB,KAAK,UACLI,YAAY,UAGpB,qBAAGhmC,OAAO,wBACN,wBACI6d,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,KACPy4E,GAAG,IACHvxB,UAAU,6BACVxjB,KAAK,YAET,wBACI/nB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,OACNC,OAAO,OACPy4E,GAAG,OACHvxB,UAAU,6BACVsC,OAAO,UACP8pC,cAAc,OACdrkC,YAAY,SAGpB,qBAAGv3B,QAAQ,QACP,wBACImM,EAAE,gRACFH,KAAK,qBAET,wBACIG,EAAE,iRACFH,KAAK,qBAET,wBACIG,EAAE,iRACFH,KAAK,UACLI,YAAY,SAEhB,wBACID,EAAE,gRACFH,KAAK,UACLI,YAAY,SAEhB,wBACID,EAAE,gRACFH,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,6BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,6BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,6BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,6BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,6BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,SACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,4BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,6BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,6BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,6BACVxjB,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACHvxB,UAAU,6BACVxjB,KAAK,UACLI,YAAY,UAGpB,qBAAGhmC,OAAO,wBACN,wBACI6d,EAAE,UACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,KACPy4E,GAAG,IACH/0C,KAAK,YAET,wBACI/nB,EAAE,UACFwhC,EAAE,QACFp9C,MAAM,OACNC,OAAO,OACPy4E,GAAG,OACHjvB,OAAO,UACP8pC,cAAc,OACdrkC,YAAY,SAGpB,wBACIprB,EAAE,oPACFH,KAAK,qBAET,wBACIG,EAAE,oPACFH,KAAK,qBAET,wBACIG,EAAE,oPACFH,KAAK,UACLI,YAAY,SAEhB,wBACID,EAAE,oPACFH,KAAK,UACLI,YAAY,SAEhB,wBACID,EAAE,oPACFH,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,MACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,IACPy4E,GAAG,IACH/0C,KAAK,UACLI,YAAY,SAEhB,4BACI,0BACIx1C,GAAG,iBACHqtB,EAAE,WACFwhC,EAAE,WACFp9C,MAAM,UACNC,OAAO,UACPuzF,YAAY,iBACZC,0BAA0B,QAE1B,2BACIC,aAAa,IACbxuF,OAAO,uBAEX,iCACIyuF,GAAG,cACHrhG,KAAK,SACL+I,OAAO,8CAEX,4BAAUu4F,GAAG,MACb,kCAAgBC,aAAa,OAC7B,iCACIvhG,KAAK,SACL+I,OAAO,+CAEX,2BACI47B,KAAK,SACL68D,IAAI,qBACJ5uF,OAAO,uBAEX,2BACI+xB,KAAK,SACL08D,GAAG,gBACHG,IAAI,qBACJ5uF,OAAO,WAGf,0BACI3W,GAAG,iBACHqtB,EAAE,SACFwhC,EAAE,WACFp9C,MAAM,UACNC,OAAO,UACPuzF,YAAY,iBACZC,0BAA0B,QAE1B,2BACIC,aAAa,IACbxuF,OAAO,uBAEX,iCACIyuF,GAAG,cACHrhG,KAAK,SACL+I,OAAO,8CAEX,4BAAUu4F,GAAG,MACb,kCAAgBC,aAAa,OAC7B,iCACIvhG,KAAK,SACL+I,OAAO,+CAEX,2BACI47B,KAAK,SACL68D,IAAI,qBACJ5uF,OAAO,uBAEX,2BACI+xB,KAAK,SACL08D,GAAG,gBACHG,IAAI,qBACJ5uF,OAAO,WAGf,0BACI3W,GAAG,iBACHqtB,EAAE,UACFwhC,EAAE,KACFp9C,MAAM,MACNC,OAAO,MACPuzF,YAAY,iBACZC,0BAA0B,QAE1B,2BACIC,aAAa,IACbxuF,OAAO,uBAEX,iCACIyuF,GAAG,cACHrhG,KAAK,SACL+I,OAAO,8CAEX,4BAAUu4F,GAAG,MACb,kCAAgBC,aAAa,OAC7B,iCACIvhG,KAAK,SACL+I,OAAO,+CAEX,2BACI47B,KAAK,SACL68D,IAAI,qBACJ5uF,OAAO,uBAEX,2BACI+xB,KAAK,SACL08D,GAAG,gBACHG,IAAI,qBACJ5uF,OAAO,aC6J3B,EA/rBmB,IACf,uBACIlF,MAAM,MACNC,OAAO,MACPyjC,QAAQ,cACRC,KAAK,OACLC,MAAM,6BACN0vD,WAAW,gCAEX,qBAAGv1F,OAAO,wBACN,wBACI6d,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,MACNC,OAAO,UACPy4E,GAAG,IACH/0C,KAAK,YAET,wBACI/nB,EAAE,KACFwhC,EAAE,UACFp9C,MAAM,QACNC,OAAO,UACPy4E,GAAG,OACHjvB,OAAO,UACP8pC,cAAc,OACdrkC,YAAY,SAGpB,wBACItzC,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,UACLI,YAAY,SAEhB,wBACInoB,EAAE,SACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,UACPy4E,GAAG,WACH/0C,KAAK,YAET,wBACI/nB,EAAE,SACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,UACPy4E,GAAG,WACH/0C,KAAK,YAET,wBACI/nB,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,KACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACI/nB,EAAE,OACFwhC,EAAE,UACFp9C,MAAM,OACNC,OAAO,UACPy4E,GAAG,UACHjvB,OAAO,UACP8pC,cAAc,OACdrkC,YAAY,QAEhB,wBACIprB,EAAE,sIACFH,KAAK,YAET,wBACIhM,QAAQ,OACR/b,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACIhM,QAAQ,OACR/b,EAAE,QACFwhC,EAAE,SACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,SACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACI/nB,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,4BAET,wBACI/nB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACI/nB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACIhM,QAAQ,OACR/b,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACIhM,QAAQ,OACR/b,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACI/nB,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,0BAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACIhM,QAAQ,OACR/b,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACIhM,QAAQ,OACR/b,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,wBACI/nB,EAAE,QACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,yBAET,wBACIhM,QAAQ,OACR/b,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPy4E,GAAG,UACH/0C,KAAK,YAET,qBAAG5lC,OAAO,wBACN,2BACIy6E,GAAG,UACHC,GAAG,UACHC,GAAG,KACHC,GAAG,UACHh1C,KAAK,YAET,wBACIG,EAAE,oNACF2lB,OAAO,UACP8pC,cAAc,OACdrkC,YAAY,cAGpB,wBACItzC,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACP0jC,KAAK,wBAET,qBAAG5lC,OAAO,wBACN,2BACIy6E,GAAG,UACHC,GAAG,SACHC,GAAG,KACHC,GAAG,UACHh1C,KAAK,YAET,wBACIG,EAAE,+MACF2lB,OAAO,UACP8pC,cAAc,OACdrkC,YAAY,cAGpB,wBACItzC,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACP0jC,KAAK,wBAET,qBAAG5lC,OAAO,wBACN,2BACIy6E,GAAG,UACHC,GAAG,UACHC,GAAG,KACHC,GAAG,UACHh1C,KAAK,YAET,wBACIG,EAAE,oNACF2lB,OAAO,UACP8pC,cAAc,OACdrkC,YAAY,cAGpB,wBACItzC,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACP0jC,KAAK,wBAET,qBAAG5lC,OAAO,wBACN,2BACIy6E,GAAG,UACHC,GAAG,UACHC,GAAG,KACHC,GAAG,UACHh1C,KAAK,YAET,wBACIG,EAAE,oNACF2lB,OAAO,UACP8pC,cAAc,OACdrkC,YAAY,cAGpB,wBACItzC,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACP0jC,KAAK,wBAET,qBAAG5lC,OAAO,wBACN,2BACIy6E,GAAG,UACHC,GAAG,UACHC,GAAG,KACHC,GAAG,UACHh1C,KAAK,YAET,wBACIG,EAAE,oNACF2lB,OAAO,UACP8pC,cAAc,OACdrkC,YAAY,cAGpB,wBACItzC,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACP0jC,KAAK,wBAET,4BACI,0BACIp1C,GAAG,iBACHqtB,EAAE,OACFwhC,EAAE,UACFp9C,MAAM,MACNC,OAAO,UACPuzF,YAAY,iBACZC,0BAA0B,QAE1B,2BACIC,aAAa,IACbxuF,OAAO,uBAEX,iCACIyuF,GAAG,cACHrhG,KAAK,SACL+I,OAAO,8CAEX,4BAAUu4F,GAAG,MACb,kCAAgBC,aAAa,OAC7B,iCACIvhG,KAAK,SACL+I,OAAO,+CAEX,2BACI47B,KAAK,SACL68D,IAAI,qBACJ5uF,OAAO,uBAEX,2BACI+xB,KAAK,SACL08D,GAAG,gBACHG,IAAI,qBACJ5uF,OAAO,WAGf,0BACI3W,GAAG,iBACHqtB,EAAE,UACFwhC,EAAE,WACFp9C,MAAM,UACNC,OAAO,UACPuzF,YAAY,iBACZC,0BAA0B,QAE1B,2BACIC,aAAa,IACbxuF,OAAO,uBAEX,iCACIyuF,GAAG,cACHrhG,KAAK,SACL+I,OAAO,8CAEX,4BAAUu4F,GAAG,YACb,kCAAgBC,aAAa,YAC7B,iCACIvhG,KAAK,SACL+I,OAAO,+CAEX,2BACI47B,KAAK,SACL68D,IAAI,qBACJ5uF,OAAO,uBAEX,2BACI+xB,KAAK,SACL08D,GAAG,gBACHG,IAAI,qBACJ5uF,OAAO,WAGf,2BACI3W,GAAG,gBACHwlG,oBAAoB,oBACpB/zF,MAAM,IACNC,OAAO,KAEP,uBACI+zF,UAAU,eACV7sC,UAAU,gDAGlB,0BACI54D,GAAG,iBACHqtB,EAAE,YACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPuzF,YAAY,iBACZC,0BAA0B,QAE1B,2BACIC,aAAa,IACbxuF,OAAO,uBAEX,iCACIyuF,GAAG,cACHrhG,KAAK,SACL+I,OAAO,8CAEX,4BAAUu4F,GAAG,YACb,kCAAgBC,aAAa,YAC7B,iCACIvhG,KAAK,SACL+I,OAAO,+CAEX,2BACI47B,KAAK,SACL68D,IAAI,qBACJ5uF,OAAO,uBAEX,2BACI+xB,KAAK,SACL08D,GAAG,gBACHG,IAAI,qBACJ5uF,OAAO,WAGf,2BACI3W,GAAG,gBACHwlG,oBAAoB,oBACpB/zF,MAAM,IACNC,OAAO,KAEP,uBACI+zF,UAAU,eACV7sC,UAAU,qDAGlB,0BACI54D,GAAG,iBACHqtB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPuzF,YAAY,iBACZC,0BAA0B,QAE1B,2BACIC,aAAa,IACbxuF,OAAO,uBAEX,iCACIyuF,GAAG,cACHrhG,KAAK,SACL+I,OAAO,8CAEX,4BAAUu4F,GAAG,YACb,kCAAgBC,aAAa,YAC7B,iCACIvhG,KAAK,SACL+I,OAAO,+CAEX,2BACI47B,KAAK,SACL68D,IAAI,qBACJ5uF,OAAO,uBAEX,2BACI+xB,KAAK,SACL08D,GAAG,gBACHG,IAAI,qBACJ5uF,OAAO,WAGf,2BACI3W,GAAG,gBACHwlG,oBAAoB,oBACpB/zF,MAAM,IACNC,OAAO,KAEP,uBACI+zF,UAAU,eACV7sC,UAAU,+CAGlB,0BACI54D,GAAG,iBACHqtB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPuzF,YAAY,iBACZC,0BAA0B,QAE1B,2BACIC,aAAa,IACbxuF,OAAO,uBAEX,iCACIyuF,GAAG,cACHrhG,KAAK,SACL+I,OAAO,8CAEX,4BAAUu4F,GAAG,YACb,kCAAgBC,aAAa,YAC7B,iCACIvhG,KAAK,SACL+I,OAAO,+CAEX,2BACI47B,KAAK,SACL68D,IAAI,qBACJ5uF,OAAO,uBAEX,2BACI+xB,KAAK,SACL08D,GAAG,gBACHG,IAAI,qBACJ5uF,OAAO,WAGf,2BACI3W,GAAG,gBACHwlG,oBAAoB,oBACpB/zF,MAAM,IACNC,OAAO,KAEP,uBACI+zF,UAAU,eACV7sC,UAAU,gDAGlB,0BACI54D,GAAG,iBACHqtB,EAAE,UACFwhC,EAAE,UACFp9C,MAAM,UACNC,OAAO,UACPuzF,YAAY,iBACZC,0BAA0B,QAE1B,2BACIC,aAAa,IACbxuF,OAAO,uBAEX,iCACIyuF,GAAG,cACHrhG,KAAK,SACL+I,OAAO,8CAEX,4BAAUu4F,GAAG,YACb,kCAAgBC,aAAa,YAC7B,iCACIvhG,KAAK,SACL+I,OAAO,+CAEX,2BACI47B,KAAK,SACL68D,IAAI,qBACJ5uF,OAAO,uBAEX,2BACI+xB,KAAK,SACL08D,GAAG,gBACHG,IAAI,qBACJ5uF,OAAO,WAGf,2BACI3W,GAAG,gBACHwlG,oBAAoB,oBACpB/zF,MAAM,IACNC,OAAO,KAEP,uBACI+zF,UAAU,eACV7sC,UAAU,sDAGlB,yBACI54D,GAAG,cACHyR,MAAM,MACNC,OAAO,MACP+zF,UAAU,mtIAEd,yBACIzlG,GAAG,cACHyR,MAAM,MACNC,OAAO,MACP+zF,UAAU,2gqBAEd,yBACIzlG,GAAG,cACHyR,MAAM,MACNC,OAAO,MACP+zF,UAAU,2zMAEd,yBACIzlG,GAAG,cACHyR,MAAM,MACNC,OAAO,MACP+zF,UAAU,27tDAEd,yBACIzlG,GAAG,cACHyR,MAAM,MACNC,OAAO,MACP+zF,UAAU,qusBCpoBX,SAASC,EAAc39F,GAClC,MAAMzI,GAAWunD,mBAKX8+C,GAAmB7xF,OAAU,CAACC,QAASC,mBAAgCC,WAAYqmF,MAEnFsL,GAAuB9xF,OAAU,CACnCC,QAASC,kBACTC,WAAY4xF,MAGVC,GAA2B/7D,OAAW/1B,8BAEtC+xF,EAAe,IAAMD,EAAyBxmG,GAE9C0mG,GAAiBlyF,OAAU,CAC7BC,QAASC,6BACTC,WAAYgyF,IACZ/xF,YAAa,CACTgyF,YAAa/oF,KACT,sCACA,qBAEJgpF,oBAAqBp+F,EAAMo+F,oBAC3BzR,UAAW,KACP3sF,EAAMwO,gBAAgBxO,EAAM0N,cAAe,CACvC,CACIe,QAASzO,EAAM0N,cACfS,SAAUC,4BACV7N,KAAMwhB,UACN7gB,MAAO,UAGflB,EAAM6hB,sBAAqB,GAC3Bm8E,KAEJnR,SAAUmR,KAIlB,IAAIK,EA+GAC,EA0DJ,OAxKKlpF,QAAoBpV,EAAMy8F,aAC3B4B,EACI,gCACI,gBAAC,IAAD,CAAMzqD,UAAU,GACZ,uBAAKzyC,UAAU,cACX,uBAAKA,UAAU,eACX,gBAAC,EAAD,OAEJ,0BACI,gBAAC,IAAD,CACIlJ,GAAG,sCACH+N,eAAe,iCAGvB,gBAAC,IAAD,CACI/N,GAAG,2CACH+N,eAAe,mEAEnB,0BACI7E,UAAU,4DACVuJ,QA7DM,MAC1B5M,SAAWg/F,OAAqB98F,EAAMy8F,cAAe,sBACrD1wF,OAAU,CAACC,QAASC,wBAAqCC,WAAYqyF,KAArExyF,CAAwFxU,KA6DpE,gBAAC,IAAD,CACIU,GAAG,yCACH+N,eAAe,mBAK/B,gBAAC,IAAD,CAAM4tC,UAAU,GACZ,uBAAKzyC,UAAU,cACX,uBAAKA,UAAU,eACX,gBAAC,EAAD,OAEJ,0BACI,gBAAC,IAAD,CACIlJ,GAAG,wCACH+N,eAAe,8BAGvB,gBAAC,IAAD,CACI/N,GAAG,6CACH+N,eAAe,wDAEnB,0BACI7E,UAAU,4DACVuJ,QAAS,KAAM8zF,OA1GdrW,EA0GkCnoF,EAAMy8F,aA1GtBniF,EA0GoCta,EAAMsa,MAzGrFxc,SAAWg/F,OAAqB3U,GAAU,6BAC1Cz7E,SAAA,WAAwB4N,EAAK/Z,KAA7B,yDAFwB,IAAC4nF,EAAkB7tE,IA4GnB,gBAAC,IAAD,CACIriB,GAAG,+CACH+N,eAAe,uBAO/BoP,QAAqBpV,EAAMy8F,eACnC4B,EACI,gCACI,gBAAC,IAAD,CAAMzqD,UAAU,GACZ,uBAAKzyC,UAAU,cACX,0BACI,gBAAC,IAAD,CACIlJ,GAAG,uCACH+N,eAAe,0BAGvB,gBAAC,IAAD,CACI/N,GAAG,4CACH+N,eAAe,wDAEnB,0BACI7E,UAAU,4DACVuJ,QAAS,IAAMmzF,EAAqBtmG,IAEpC,gBAAC,IAAD,CACIU,GAAG,mCACH+N,eAAe,yBAK/B,gBAAC,IAAD,CAAM4tC,UAAU,GACZ,uBAAKzyC,UAAU,cACX,0BACI,gBAAC,IAAD,CACIlJ,GAAG,mCACH+N,eAAe,8BAGvB,gBAAC,IAAD,CACI/N,GAAG,wCACH+N,eAAe,iEAEnB,0BACI7E,UAAU,4DACVuJ,QAASwM,MAET,gBAAC,IAAD,CACIjf,GAAG,0CACH+N,eAAe,uBAWvCs4F,EADAt+F,EAAMy8F,aAEF,gBAAC,IAAD,CAAM7oD,UAAU,GACZ,uBAAKzyC,UAAU,cACX,uBAAKA,UAAU,eACX,gBAAC,EAAD,OAEJ,0BACI,gBAAC,IAAD,CACIlJ,GAAG,uCACH+N,eAAe,2BAGvB,gBAAC,IAAD,CACI/N,GAAG,4CACH+N,eAAe,iEAEnB,0BACI0E,QAAS,KAAM+zF,OAlMbtW,EAkM8BnoF,EAAMy8F,cAjM1D3+F,SAAWg/F,OAAqB3U,GAAU,4BAC1Cz7E,SAAoB,mBAFEy7E,OAmMFhnF,UAAU,6DAEV,gBAAC,IAAD,CACIlJ,GAAG,8CACH+N,eAAe,+BAQ/B,gBAAC,IAAD,CAAM4tC,UAAU,GACZ,uBAAKzyC,UAAU,cACX,0BACI,gBAAC,IAAD,CACIlJ,GAAG,uCACH+N,eAAe,sBAGvB,gBAAC,IAAD,CACI/N,GAAG,4CACH+N,eAAe,gEAEnB,0BACI7E,UAAU,4DACVuJ,QAAS,IAAMkzF,EAAiBrmG,IAEhC,gBAAC,IAAD,CACIU,GAAG,8CACH+N,eAAe,uBASnC,uBACI7E,UAAWs4B,IACP,0DACA,CACIilE,UAAW1+F,EAAM2+F,gBACjBC,UAAW5+F,EAAM4+F,YAGzB/pD,gBAAiB70C,EAAM6+F,eAEvB,0BAAQ19F,UAAU,yBACd,uBAAKA,UAAU,oCACX,sBAAIA,UAAU,uCACV,gBAAC,IAAD,CACIlJ,GAAG,mCACH+N,eAAe,uBAGvB,sBAAI7E,UAAU,0CACV,gBAAC,IAAD,CACIlJ,GAAG,sCACH+N,eAAe,mCAI3B,gBAAC,IAAD,CACI/N,GAAG,YACHkJ,UAAU,aACVuJ,QAAS,IAAMuzF,EAAe1mG,MAGtC,uBAAK4J,UAAU,uBACX,uBAAKA,UAAU,iCACVk9F,EACAC,GAEL,gBAAC,EAAD,CAAiB7B,aAAcz8F,EAAMy8F,iB,aAnQjDkC,gB,oBACAC,U,oBACAlxF,c,sBACA+uF,a,oBAEA2B,oB,oBACAS,c,oBACArwF,gB,oBACAqT,qB,oCC7CJ,MAAMi9E,EAAuB,EAAE7mG,KAAK,UAChC,0BACIA,GAAIA,EACJm1C,QAAQ,eAER,wBACIjsC,UAAU,UACVmkB,EAAE,IACFwhC,EAAE,IACFp9C,MAAM,MACNC,OAAO,MACPo1F,KAAI,eAAU9mG,EAAV,iBACJ8Q,MAAO,CAACskC,KAAM,+BAElB,wBACIlsC,UAAU,YACV4H,MAAO,CAACskC,KAAM,qCACdG,EAAE,qFAEN,wBACIrsC,UAAU,sBACV4H,MAAO,CAACskC,KAAM,+CACdG,EAAE,qFAEN,wBACIrsC,UAAU,gBACV4H,MAAO,CAACskC,KAAM,QAAF,OAAUp1C,EAAV,mBACZu1C,EAAE,qFAEN,4BACI,wBAAMv1C,GAAE,UAAKA,EAAL,iBACJ,yBACIqtB,EAAE,IACFwhC,EAAE,IACFp9C,MAAM,MACNC,OAAO,MACP4wB,KAAK,ow+BAGb,kCAAgBtiC,GAAE,UAAKA,EAAL,kBACd,wBACI6kE,OAAO,MACP/zD,MAAO,CAACi2F,UAAW,oCAAqCC,YAAa,KAEzE,wBACIniC,OAAO,MACP/zD,MAAO,CAACi2F,UAAW,oCAAqCC,YAAa,Q,aAlDrFhnG,G,YAyDJ,UCvDMinG,EAA2BC,oBAAH,yCAAGA,CAAH,+MAexBC,EAAS,2BAgDf,EA9CwB,IACpB,gBAACF,EAAD,KACI,uBACI9xD,QAAQ,gBACRiyD,oBAAoB,gBACpBzuC,QAAQ,MACRtjB,MAAM,6BACN0vD,WAAW,gCAEX,qBAAGj0F,MAAO,CAAC8nD,UAAW,0CAClB,uBACI6sC,UAAS,WAAM0B,GACf11F,MAAM,MACNC,OAAO,MACPZ,MAAO,CAAC8nD,UAAW,0BAG3B,qBAAG9nD,MAAO,CAAC8nD,UAAW,6CAClB,uBACI6sC,UAAS,WAAM0B,GACf11F,MAAM,MACNC,OAAO,MACPZ,MAAO,CAAC8nD,UAAW,0BAG3B,qBAAG9nD,MAAO,CAAC8nD,UAAW,6CAClB,uBACI6sC,UAAS,WAAM0B,GACf11F,MAAM,MACNC,OAAO,MACPZ,MAAO,CAAC8nD,UAAW,0BAG3B,qBAAG9nD,MAAO,CAAC8nD,UAAW,0CAClB,uBACI6sC,UAAS,WAAM0B,GACf11F,MAAM,MACNC,OAAO,MACPZ,MAAO,CAAC8nD,UAAW,0BAG3B,gBAAC,EAAD,CAAsB54D,GAAImnG,MCsQtC,GAnU0B,IACtB,uBACI11F,MAAM,MACNC,OAAO,MACPyjC,QAAQ,cACRC,KAAK,OACLC,MAAM,6BACN0vD,WAAW,gCAEX,wBACIxvD,EAAE,uIACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,2IACFH,KAAK,6BAET,wBACIG,EAAE,2IACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,2JACFH,KAAK,6BAET,wBACIG,EAAE,2JACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,oDACFH,KAAK,6BAET,wBACIG,EAAE,gfACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,kDACFH,KAAK,6BAET,wBACIG,EAAE,kDACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,gJACFH,KAAK,4BAET,wBACIG,EAAE,kDACFH,KAAK,4BAET,wBACIG,EAAE,kDACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,oDACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,oDACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,oDACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,4lBACFH,KAAK,YAET,wBACIG,EAAE,6YACFH,KAAK,qBAET,wBACIG,EAAE,6YACFH,KAAK,QACLI,YAAY,SAEhB,wBACIx1C,GAAG,QACHqnG,YAAU,QACVC,UAAU,iBACVj6E,EAAE,KACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,OAEP,wBACI6jC,EAAE,2lBACFH,KAAK,aAGb,qBAAG0xD,KAAK,eACJ,wBACIz5E,EAAE,KACFwhC,EAAE,MACFp9C,MAAM,OACNC,OAAO,MACP0jC,KAAK,oBAGb,wBACIG,EAAE,8SACFH,KAAK,gCAET,wBACIG,EAAE,wkBACFH,KAAK,YAET,wBACIG,EAAE,gcACFH,KAAK,qBAET,wBACIG,EAAE,8MACFH,KAAK,gCAET,wBACIG,EAAE,+RACFH,KAAK,YAET,wBACIG,EAAE,iIACFH,KAAK,YAET,wBACIG,EAAE,iNACFH,KAAK,YAET,wBACIG,EAAE,i1BACFH,KAAK,YAET,wBACIG,EAAE,o3BACFH,KAAK,YAET,wBACIG,EAAE,q7EACFH,KAAK,6BAET,wBACIhM,QAAQ,OACRmM,EAAE,q7EACFH,KAAK,8BACLI,YAAY,SAEhB,wBACIx1C,GAAG,QACHqnG,YAAU,QACVC,UAAU,iBACVj6E,EAAE,KACFwhC,EAAE,KACFp9C,MAAM,MACNC,OAAO,MAEP,wBACI6jC,EAAE,w7EACFH,KAAK,8BAGb,qBAAG0xD,KAAK,eACJ,wBACIz5E,EAAE,MACFwhC,EAAE,OACFp9C,MAAM,KACNC,OAAO,OACP0jC,KAAK,oBAGb,wBACIG,EAAE,kNACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,6MACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,gNACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,mOACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,yOACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,mLACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,+KACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,iJACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,kJACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,gZACFH,KAAK,6BAET,wBACIG,EAAE,q4BACFH,KAAK,6BAET,wBACIG,EAAE,ouCACFH,KAAK,YAET,wBACIp1C,GAAG,QACHqnG,YAAU,QACVC,UAAU,iBACVj6E,EAAE,KACFwhC,EAAE,KACFp9C,MAAM,KACNC,OAAO,MAEP,wBACI6jC,EAAE,ouCACFH,KAAK,aAGb,qBAAG0xD,KAAK,eACJ,wBACIz5E,EAAE,OACFwhC,EAAE,KACFp9C,MAAM,OACNC,OAAO,KACP0jC,KAAK,oBAGb,wBACIG,EAAE,4WACFH,KAAK,6BAET,4BACI,2BACIp1C,GAAG,WACHwlG,oBAAoB,oBACpB/zF,MAAM,IACNC,OAAO,KAEP,uBACI+zF,UAAU,UACV7sC,UAAU,gCAGlB,2BACI54D,GAAG,WACHwlG,oBAAoB,oBACpB/zF,MAAM,IACNC,OAAO,KAEP,uBACI+zF,UAAU,UACV7sC,UAAU,iCAGlB,2BACI54D,GAAG,WACHwlG,oBAAoB,oBACpB/zF,MAAM,IACNC,OAAO,KAEP,uBACI+zF,UAAU,UACV7sC,UAAU,iCAGlB,yBACI54D,GAAG,SACHyR,MAAM,KACNC,OAAO,MACP+zF,UAAU,m2VAEd,yBACIzlG,GAAG,SACHyR,MAAM,KACNC,OAAO,MACP+zF,UAAU,2iQAEd,yBACIzlG,GAAG,SACHyR,MAAM,MACNC,OAAO,KACP+zF,UAAU,i/LCrQ1B,GAxDqB,IACjB,uBACIh0F,MAAM,MACNC,OAAO,KACPyjC,QAAQ,aACRC,KAAK,OACLC,MAAM,8BAEN,wBACIurB,SAAS,UACT2mC,SAAS,UACThyD,EAAE,s4XACFH,KAAK,qBAET,wBACIwrB,SAAS,UACT2mC,SAAS,UACThyD,EAAE,okCACFH,KAAK,qBAET,wBACIG,EAAE,upBACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,0CACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,00BACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,4dACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,gyBACFH,KAAK,8BACLI,YAAY,SAEhB,wBACIgyD,GAAG,QACHC,GAAG,cACHC,GAAG,QACHC,GAAG,KACHzsC,OAAO,8BACP8pC,cAAc,UC1B1B,GAzBa,IAEL,uBACIvzF,MAAM,MACNC,OAAO,KACPyjC,QAAQ,aACRC,KAAK,OACLC,MAAM,8BAEN,wBACIurB,SAAS,UACT2mC,SAAS,UACThyD,EAAE,w2XACFH,KAAK,qBAET,wBACIwrB,SAAS,UACT2mC,SAAS,UACThyD,EAAE,okCACFH,KAAK,sBC0JrB,GA7K6B,IACzB,uBACI3jC,MAAM,MACNC,OAAO,MACPyjC,QAAQ,cACRC,KAAK,OACLC,MAAM,8BAEN,qBAAG7lC,OAAO,mBACN,wBACIoxD,SAAS,UACT2mC,SAAS,UACThyD,EAAE,4lBACFH,KAAK,8BACLI,YAAY,UAGpB,wBACID,EAAE,oNACFH,KAAK,8BACLI,YAAY,SAEhB,wBACIpM,QAAQ,MACRmM,EAAE,oFACFH,KAAK,gCAET,wBACIG,EAAE,4HACFH,KAAK,6BAET,wBACIG,EAAE,6UACFH,KAAK,6BAET,wBACIG,EAAE,4HACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,mDACFH,KAAK,6BAET,wBACIG,EAAE,mDACFH,KAAK,8BACLI,YAAY,SAEhB,wBACIpM,QAAQ,MACRmM,EAAE,wDACFH,KAAK,gCAET,wBACIG,EAAE,6UACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,gUACFH,KAAK,6BAET,wBACIG,EAAE,6TACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,oDACFH,KAAK,6BAET,0BACI60C,GAAG,QACHC,GAAG,QACHka,EAAE,MACFhvD,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,gLACFH,KAAK,8BACLI,YAAY,SAEhB,wBACID,EAAE,oNACFH,KAAK,gCAET,wBACIG,EAAE,kNACFH,KAAK,gCAET,wBACIG,EAAE,kNACFH,KAAK,gCAET,wBACIG,EAAE,oNACFH,KAAK,gCAET,wBACIG,EAAE,oNACFH,KAAK,gCAET,wBACIG,EAAE,4MACFH,KAAK,gCAET,wBACIG,EAAE,gNACFH,KAAK,gCAET,wBACIG,EAAE,kuCACFH,KAAK,4BAET,wBACIhM,QAAQ,MACRmM,EAAE,6eACFH,KAAK,gCAET,wBACIG,EAAE,4rDACFH,KAAK,4BAET,wBACIG,EAAE,+rDACFH,KAAK,4BAET,wBACIG,EAAE,wrDACFH,KAAK,4BAET,2BACI60C,GAAG,MACHC,GAAG,QACHC,GAAG,KACHC,GAAG,OACHh1C,KAAK,6BAET,wBACIG,EAAE,06CACFH,KAAK,4BAET,4BACI,0BACIp1C,GAAG,YACHqtB,EAAE,KACFwhC,EAAE,KACFp9C,MAAM,UACNC,OAAO,MACPuzF,YAAY,iBACZC,0BAA0B,QAE1B,2BACIC,aAAa,IACbxuF,OAAO,uBAEX,2BACI+xB,KAAK,SACL08D,GAAG,gBACHG,IAAI,qBACJ5uF,OAAO,UAEX,kCACI2uF,aAAa,IACb3uF,OAAO,8B,yHCrHZ,MAAMixF,WAAsB//F,gBACvCC,YAAYC,GACRC,MAAMD,GADgB,6BAuBN,IACTG,KAAKH,MAAMsvB,YAAYvE,MAAMwf,GAASA,EAAKhqC,OAASwhB,WAA4C,SAAfwoB,EAAKrpC,UAxBvE,2BA2BR,KACd,IAAK,IAAIqqB,EAAI,EAAGA,EAAIprB,KAAKH,MAAM8/F,MAAMn6F,OAAQ4lB,IACzC,IAAKprB,KAAK4/F,eAAe5/F,KAAKH,MAAM8/F,MAAMv0E,GAAGtzB,IACzC,OAAOkI,KAAKH,MAAM8/F,MAAMv0E,GAAGtzB,GAGnC,OAAOkI,KAAKH,MAAM8/F,MAAM,GAAG7nG,MAjCL,6BAoCN,KAChB,IAAK,IAAIszB,EAAI,EAAGA,EAAIprB,KAAKH,MAAM8/F,MAAMn6F,OAAQ4lB,IACzC,IAAKprB,KAAK4/F,eAAe5/F,KAAKH,MAAM8/F,MAAMv0E,GAAGtzB,IACzC,OAAOkI,KAAKH,MAAM8/F,MAAMv0E,GAAGtzB,GAGnC,OAAO,QA1Ce,yBA6CV,CAACq8C,EAA4Cr8C,KACzD,MAAM+nG,EAAY7/F,KAAK8/F,oBAAoBhoG,IAC3C6F,SAAWg/F,OAAqB38F,KAAKH,MAAMy8F,cAAjC,+BAAwEuD,IAClF1rD,EAAYr8C,MAhDU,+BAmDHA,GACZkI,KAAKH,MAAM8/F,MAAMvwE,WAAWk8D,GAASA,EAAKxzF,KAAOA,IAAM,IApDxC,kBAuDhBq8C,GACEr8C,IACJkI,KAAK+/F,SAAS5rD,EAAar8C,MAzDT,qBA6DdP,UACRyI,KAAKw+F,kBACLx+F,KAAKH,MAAMyC,QAAQ+L,gBAAgBrO,KAAKH,MAAMuqB,YAAYtyB,GAAI,CAAC,CAC3DwW,QAAStO,KAAKH,MAAMuqB,YAAYtyB,GAChCkW,SAAUC,4BACV7N,KAAMwhB,UACN7gB,MAAO,aAnEW,oBAuEdozC,GACD58C,UACH,MAAMsoG,EAAY7/F,KAAK8/F,oBAAoBhoG,IAC3C6F,SAAWg/F,OAAqB38F,KAAKH,MAAMy8F,cAAjC,kCAA2EuD,UAE/E7/F,KAAKH,MAAMyC,QAAQ+L,gBAAgBrO,KAAKH,MAAMuqB,YAAYtyB,GAAI,CAAC,CACjEkW,SAAUC,4BACVK,QAAStO,KAAKH,MAAMuqB,YAAYtyB,GAChCsI,KAAMtI,EACNiJ,MAAO,UAGXf,KAAK+/F,SAAS5rD,EAAar8C,MAnFT,sCAuFG,MACzB0qF,SAAYma,OAAqB38F,KAAKH,MAAMy8F,cAAe,4BAC3Dt8F,KAAK8F,SAAS,CAAC04F,iBAAiB,EAAMC,WAAW,OAzF3B,2BA4FR,MACd9gG,SAAWg/F,OAAqB38F,KAAKH,MAAMy8F,cAAe,6BAA8B,CAAC0D,iBAAiB,KAC1Gxd,SAAYma,OAAqB38F,KAAKH,MAAMy8F,cAAe,4BAC3Dt8F,KAAK8F,SAAS,CAAC04F,iBAAiB,EAAMC,WAAW,OA/F3B,mCAkGA,KACtBz+F,KAAK8F,SAAS,CAACm6F,sBAAsB,EAAMxB,WAAW,OAnGhC,iCAsGF,KAChBz+F,KAAK9G,MAAM+mG,sBACXn/E,YAAW,MACP0hE,SAAYma,OAAqB38F,KAAKH,MAAMy8F,cAAe,4BAC3Dt8F,KAAK8F,SAAS,CAAC04F,iBAAiB,MApId,QA0BJ,yBA+GV,KACZx+F,KAAK8F,SAAS,CAAC24F,WAAW,OAhHJ,oBAmHf,CAACtqD,EAA4Cr8C,KACpD,MAAMooG,EAAelgG,KAAKH,MAAM8/F,MAAMvwE,WAAWk8D,GAASA,EAAKxzF,KAAOA,IACtE,GAAIooG,EAAe,EAAIlgG,KAAKH,MAAM8/F,MAAMn6F,OAAS,EAAG,CAEhD,MAAM26F,EAAiBngG,KAAKogG,oBACL,OAAnBD,GAEAhsD,EAAY,IACZrzB,YAAW,KACP9gB,KAAKqgG,4BACN,MAEHlsD,EAAYgsD,QAETngG,KAAK4/F,eAAe5/F,KAAKH,MAAM8/F,MAAMO,EAAe,GAAGpoG,IAC9DkI,KAAK+/F,SAAS5rD,EAAan0C,KAAKH,MAAM8/F,MAAMO,EAAe,GAAGpoG,IAE9Dq8C,EAAYn0C,KAAKH,MAAM8/F,MAAMO,EAAe,GAAGpoG,OApI7B,0BAwIRA,GACPkI,KAAKH,MAAMsvB,YAAYvE,MAAMwf,GAASA,EAAKhqC,OAAStI,GAAqB,SAAfsyC,EAAKrpC,UAzIhD,sBA4Ib,CAACuqF,EAAgBxhF,KAC1B,MAAM,GAAChS,EAAD,MAAKqR,GAASmiF,EAEpB,IAAIliF,EACA,uBAAKpI,UAAU,kCACX,4BAAO8I,EAAQ,IASvB,OANI9J,KAAK4/F,eAAe9nG,KACpBsR,EACI,qBAAGpI,UAAU,4BAId,CAACmzC,EAA4C6nD,IAChD,gBAAC,IAAD,CACIh7F,UAAWs4B,IAAW,CAACgnE,SAAUtgG,KAAK4/F,eAAe9nG,KACrD27C,SAAUuoD,IAAgBlkG,GAE1B,gBAAC,WAAD,KACI,0BACIyS,QAAS,IAAMvK,KAAKugG,cAAcpsD,EAAar8C,GAC/C8L,SAAU5D,KAAK4/F,eAAe9nG,GAC9BkJ,UAAU,6BAEToI,EACD,gBAAC,IAAD,CACItR,GAAIqR,EAAMq3F,QACV36F,eAAgBsD,EAAMs3F,iBAIlC,gBAAC,SAAD,KACI,gBAACnV,EAAKnuF,UAAN,CACIrF,GAAIA,EACJ27C,SAAUuoD,IAAgBlkG,EAC1BkwF,QAAShoF,KAAKH,MAAMy8F,aACpBlyE,YAAapqB,KAAKH,MAAMuqB,YACxBs2E,SAAU1gG,KAAK0gG,SAASvsD,GACxBwsD,OAAQ3gG,KAAK2gG,OAAOxsD,UAnLd,kCA0LD,IAEjB,uBACInzC,UAAWs4B,IAAW,2DAA4D,CAC9EsnE,cAAe5gG,KAAK9G,MAAM+mG,qBAC1B1B,UAAWv+F,KAAK9G,MAAM+mG,sBAAwBjgG,KAAK9G,MAAMslG,gBACzDC,UAAWz+F,KAAK9G,MAAMulG,YAE1B/pD,gBAAiB10C,KAAK6gG,uBAEtB,uBAAK7/F,UAAU,iCACX,gBAAC,GAAD,MACA,sBAAIA,UAAU,oCACV,gBAAC,IAAD,CACIlJ,GAAG,6BACH+N,eAAe,kCAGvB,qBAAG7E,UAAU,uCACT,uBAAKyI,IAAKq3F,IACV,gBAAC,IAAD,CACIhpG,GAAG,4BACH+N,eAAe,oBAhNb,0BAwNT,KACb,MAAMk7F,EAAgB/gG,KAAKH,MAAM8/F,MAAM91F,IAAI7J,KAAKghG,YAC1CC,EAAOjhG,KAAKH,MAAMgqC,QAAU,gBAAC,GAAD,MAAkB,gBAAC,GAAD,MAEpD,OACI,uBACI7oC,UAAWs4B,IAAW,qDAAsD,CACxEilE,UAAWv+F,KAAK9G,MAAMslG,iBAAmBx+F,KAAK9G,MAAM+mG,qBACpDxB,UAAWz+F,KAAK9G,MAAMulG,aAG1B,0BAAQz9F,UAAU,yBACd,uBAAKA,UAAU,oCACX,sBAAIA,UAAU,uCACV,gBAAC,IAAD,CACIlJ,GAAG,sCACH+N,eAAe,2BAGvB,sBAAI7E,UAAU,0CACV,gBAAC,IAAD,CACIlJ,GAAG,uCACH+N,eAAe,mEAI3B,uBAAK7E,UAAU,8BACVigG,IAGT,uBAAKjgG,UAAU,uBACX,uBAAKA,UAAU,4BACX,gBAAC+6F,EAAD,CAAWE,mBAAiD,OAA7Bj8F,KAAKogG,oBAA+B,GAAKpgG,KAAKkhG,oBACxE,CAAC/sD,EAAa6nD,IAEP,gCACK+E,EAAcl3F,KAAKyhF,GAASA,EAAKn3C,EAAa6nD,QAK/D,uBAAKh7F,UAAU,qCACX,0BACIA,UAAU,iCACVuJ,QAASvK,KAAKmhG,WAEd,gBAAC,IAAD,CACIrpG,GAAG,qCACH+N,eAAe,4BAK/B,uBAAK7E,UAAU,+BACX,gBAAC,GAAD,QAGR,gBAAC,EAAD,CAAiBs7F,aAAct8F,KAAKH,MAAMy8F,mBA/QlDt8F,KAAK9G,MAAQ,CACTslG,iBAAiB,EACjByB,sBAAsB,EACtBxB,WAAW,EACX/2F,MAAM,GAIS,gCACb1H,KAAKH,MAAMyC,QAAQ+qF,eAGQ,OAA7BrtF,KAAKogG,qBAAgCpgG,KAAKohG,sBAC1CphG,KAAKqhG,6BAGTrhG,KAAK8F,SAAS,CAAC4B,MAAM,KACrB86E,SAAYma,OAAqB38F,KAAKH,MAAMy8F,cAAe,oBAC3Dt8F,KAAKH,MAAMyC,QAAQwU,qBAkQvBrV,SACI,OACI,2BACI3J,GAAG,cACHkJ,UAAU,8BAEThB,KAAK9G,MAAMwO,MACZ,gCACI,gBAAC,EAAD,MACC1H,KAAKshG,iBACLthG,KAAKuhG,yBACN,gBAAC/D,EAAD,CACIgB,gBAAiBx+F,KAAK9G,MAAMslG,gBAC5BC,UAAWz+F,KAAK9G,MAAMulG,UACtBC,cAAe1+F,KAAK0+F,cACpBpC,aAAct8F,KAAKH,MAAMy8F,aACzBjuF,gBAAiBrO,KAAKH,MAAMyC,QAAQ+L,gBACpCd,cAAevN,KAAKH,MAAMuqB,YAAYtyB,GACtC4pB,qBAAsB1hB,KAAKH,MAAMyC,QAAQof,qBACzCvH,KAAMna,KAAKH,MAAMsa,KACjB8jF,oBAAqBj+F,KAAKH,MAAMo+F,yB,GA3SnCyB,G,aArBjBvwE,Y,qBACAmtE,a,oBACAqD,M,qBAEA91D,Q,oBACAo0D,oB,oBACA37F,Q,WACI+L,gB,oBACAqT,qB,oBACA5K,mB,oBACAu2E,Y,mCCYR,UAAelpF,cAjCf,WACI,MAAMmmC,GAAcC,UAEpB,OAAQrxC,IACJ,MAAM8B,GAAS8T,QAAiB5V,GAC1BihB,GAAOkB,QAAQniB,EAAO8B,GAAU,IACtC,MAAO,CACHovB,aAAatP,QAAe5hB,GAC5B8uF,SAAS/7D,QAAyB/yB,GAClCi2B,YAAamb,EAAYpxC,EAAO+U,6BAChC0xF,OAAO6B,QAAStoG,GAChBojG,cAAcA,QAAapjG,GAC3BihB,OACA0vB,QAAqC,UAA5Bne,QAAWxyB,GAAOwpB,MAC3Bu7E,qBAAqBwD,OAAuBvoG,QAKxD,SAA4B9B,GACxB,MAAO,CACHkL,SAAS+B,wBACL,CACIgK,gBADJ,KAEIqT,qBAFJ,IAGI2rE,YAHJ,KAIIv2E,mBAAkBA,MAEtB1f,MAKZ,CAAgEsoG,K,4BClDzD,SAAS/C,EAAqB3U,GACjC,OAAOA,EAAU,8BAAgC,4BAI9C,SAAS0Z,EAAcpW,EAAgB19D,GAE1C,OADkBA,EAAMC,MAAM,KAEhBjD,MAAMtiB,GAASgjF,EAAK19D,MAAMqD,SAAS3oB,MACrB,IAAtBgjF,EAAK19D,MAAMpoB,O,8mCCSrB,MAAMm8F,EAAoC9hG,IACtC,MAAM,KAACO,EAAD,IAAOqJ,EAAP,WAAYm4F,EAAZ,YAAwB/gG,EAAxB,eAAqCghG,EAArC,SAAqDpN,EAArD,SAA+DzoB,GAAYnsE,GAE1Es6D,EAAO2nC,IAAYl0D,iBACnBm0D,EAAmBC,IAAwBp0D,gBAE5CqoD,EAA8Ct2F,cAC9CsiG,EAAmDtiG,cAqDzD,IAAIuiG,EAiBJ,OA3BAr0D,gBAAU,KACDssB,IACG1wD,EACAq4F,EAASr4F,GACFm4F,GACPE,EAASF,MAGlB,CAACn4F,EAAK0wD,IAGLA,GAASA,IAAUynC,IACnBM,EACI,0BACIxxD,cAAY,gCACZ1vC,UAAU,gCACV4C,SAAUi+F,EACVt3F,QA1BS,KACjByhE,IAEI81B,EADAF,QAGS56F,KAuBL,gBAAC,IAAD,CACIlP,GAAG,kCACH+N,eAAe,qBAO3B,uBAAK7E,UAAU,mBACX,yBACIZ,KAAMA,EACNswC,cAAA,iCAAuCtwC,GACvCo8B,IAAKy5D,EACLj1F,UAAU,gCACVizE,OAAQjlE,yBACRnT,KAAK,OACLoE,SA7EctB,IACtB,GAAIA,EAAEu7B,OAAO0wC,OAASjsE,EAAEu7B,OAAO0wC,MAAM,GAAI,CACrC,MAAMvwE,EAAOsE,EAAEu7B,OAAO0wC,MAAM,GAEtBu3B,EAAS,IAAIC,WACnBD,EAAOE,OAAUC,IACbR,EAAS57E,IAAIq8E,gBAAgBloG,IAE7B,MAAMmoG,EAAcC,KAA6BH,EAAGpoE,OAAQzrB,QAC5DuzF,EAAqBS,KAA+BD,KAExDL,EAAOO,kBAAkBroG,GAEzBo6F,EAASp6F,KAiELuJ,SAAUi+F,EACV7uD,eAAa,EACb4oC,UAAW,IAEf,uBAAK56E,UAAU,mCACX,uBACI2xC,cAAYvoC,QAAgB,mCAAoC,0BAChEpJ,UAAU,yBACV4H,MAAK,GACDyjD,gBAAiB,OAAS8N,EAAQ,KAC/B4nC,KAGL5nC,GAASt5D,GAEf,0BACI27B,IAAKylE,EACLvxD,cAAY,gCACZ1vC,UAAU,gCACV4C,SAAUi+F,EACVt3F,QAjFQ,KAAM,MACtB1K,EAAM8iG,cACN9iG,EAAM8iG,eAGL1M,GAAaA,EAAS5nD,UAI3B,UAAA4zD,EAAa5zD,eAAb,SAAsB8B,OAEtB8lD,EAAS5nD,QAAQttC,MAAQ,GACzBk1F,EAAS5nD,QAAQysC,UAsELnoC,cAAYvoC,QAAgB,2CAA4C,mBAExE,qBAAGpJ,UAAU,+BAGpBkhG,I,aA3HT9hG,K,sBACAqJ,I,WACAm4F,W,WACA/gG,Y,SACAghG,e,SACAc,a,SACAlO,S,oBACAzoB,S,qBAyHJ,U,wHCpGe,MAAM42B,UAA4BjjG,gBAC7CC,YAAYC,GACRC,MAAMD,GADgB,4BAwBG0oB,IACzB,IAAIs6E,EACCt6E,EAAM2R,OAAOn5B,MAEPwnB,EAAM2R,OAAOn5B,MAAMyE,OAjDT,MAkDjBq9F,EAAgB5tF,KAAsB,uDAAwD,8CAF9F4tF,EAAgB5tF,KAAsB,8DAA+D,kCAKzGjV,KAAK8F,SAAS,CAAC89E,SAAUr7D,EAAM2R,OAAOn5B,MAAO8hG,qBAhCvB,2BAmCP,IACRjiE,SAAS5gC,KAAK9G,MAAM0qF,UAAY5jF,KAAK9G,MAAM2pG,eAAiB7iG,KAAK9G,MAAM4pG,uBApCxD,iBAuCjB,KACL9iG,KAAKH,MAAM8gG,OAAO3gG,KAAKH,MAAM/H,OAxCP,mBA2Cf,KACP,MAAMirG,EAAY/iG,KAAK9G,MAAM0qF,SAAS/1D,MAAM,KACtCm1E,EAAYD,EAAU,GAAGv2F,MAAM,EAjEhB,IAkEfy2F,EAAWF,EAAUv2F,MAAM,GAAGq4C,KAAK,KAAKr4C,MAAM,EAlE/B,IAmEfhU,EAAO8M,OAAOuX,OAAO,GAAI7c,KAAKH,MAAMuqB,YAAa,CAAC4X,WAAYghE,EAAW/gE,UAAWghE,IAE1FjjG,KAAKH,MAAMyC,QAAQ4gG,SAAS1qG,GAExBwH,KAAK9G,MAAMiqG,eACXnjG,KAAKH,MAAMyC,QAAQ8gG,mBAAmBpjG,KAAKH,MAAMuqB,YAAYtyB,GAAIkI,KAAK9G,MAAMiqG,gBACrEnjG,KAAK9G,MAAMmqG,sBAClBrjG,KAAKH,MAAMyC,QAAQghG,uBAAuBtjG,KAAKH,MAAMuqB,YAAYtyB,KAGrE6F,SAAWg/F,OAAqB38F,KAAKH,MAAMmoF,SAAU,sBAErDhoF,KAAKH,MAAM6gG,SAAS1gG,KAAKH,MAAM/H,OA3DT,8BA8DJ,MAClB6F,SAAWg/F,OAAqB38F,KAAKH,MAAMmoF,SAAU,8BA/D/B,0BAkEPmb,IACf,IAAKI,cAAmCJ,EAAetnG,OAASsnG,EAAe5sD,KAAOv2C,KAAKH,MAAMs2E,YAI7F,OAHAx4E,SAAWg/F,OAAqB38F,KAAKH,MAAMmoF,SAAU,oCAErDhoF,KAAK8F,SAAS,CAACg9F,qBAAqB,IAIxC9iG,KAAK8F,SAAS,CAACq9F,iBAAgBL,qBAAqB,EAAOO,sBAAsB,OA1E3D,0BA6ER,MACd1lG,SAAWg/F,OAAqB38F,KAAKH,MAAMmoF,SAAU,sBAErDhoF,KAAK8F,SAAS,CAACq9F,oBAAgBn8F,EAAW87F,qBAAqB,EAAOO,sBAAsB,OA7E5F,MAAM7qG,EAAOqH,EAAMuqB,YAEnBpqB,KAAK9G,MAAQ,CACT0qF,SAAWprF,EAAKwpC,YAAcxpC,EAAKypC,UAAzB,UAAyCzpC,EAAKwpC,WAA9C,YAA4DxpC,EAAKypC,WAAc,GACzF6gE,qBAAqB,EACrBO,sBAAsB,GAI9BvmE,oBACQ98B,KAAKH,MAAM4zC,WACX+uC,SAAYma,OAAqB38F,KAAKH,MAAMmoF,SAAU,6BAI9D/qD,mBAAmBC,GACXA,EAAUuW,WAAazzC,KAAKH,MAAM4zC,UAAYzzC,KAAKH,MAAM4zC,WACzD+uC,SAAYma,OAAqB38F,KAAKH,MAAMmoF,SAAU,6BA+D9DvmF,SACI,MAAM,YAAC2oB,GAAepqB,KAAKH,MAGrB2jG,EAAap5E,EAAYolB,oBAAsBv6B,KAAsBmV,EAAYtyB,GAAIsyB,EAAYolB,0BAAuBxoC,EACxH46F,EAAa3sF,KAA6BmV,EAAYtyB,IAE5D,OACI,uBAAKkJ,UAAU,8BACX,uBAAKA,UAAU,uBACX,uBAAKA,UAAU,uCACX,0BACI,gBAAC,IAAD,CACIlJ,GAAG,kDACH+N,eAAe,iBAGvB,gBAAC,EAAD,CACIzF,KAAK,sCACLuiG,aAAc3iG,KAAKyjG,oBACnBhP,SAAUz0F,KAAK0jG,gBACf13B,SAAUhsE,KAAK2jG,gBACfl6F,IAAK+5F,EACL5B,WAAYA,KAGpB,uBAAK5gG,UAAU,iCACX,0BACI,gBAAC,IAAD,CACIlJ,GAAG,sDACH+N,eAAe,qBAGvB,gBAAC,IAAD,CACIzF,KAAK,WACLvE,KAAK,OACLkF,MAAOf,KAAK9G,MAAM0qF,SAClB3jF,SAAUD,KAAKolF,kBACfvkF,YAAaoU,KAAsB,qDAAsD,kBACzFvd,MAAOsI,KAAK9G,MAAM2pG,cAClB32B,KAAMj3D,KAAsB,4DAA6D,sDAIpGjV,KAAK9G,MAAM4pG,qBACR,wBAAM9hG,UAAU,qCACZ,qBAAGA,UAAU,4BACb,gBAAC,IAAD,CACIlJ,GAAG,qDACH+N,eAAe,wEACfjB,OAAQ,CAACmxD,IAAK9gD,KAAuBjV,KAAKH,MAAMs2E,iBAI5D,uBAAKn1E,UAAU,gCACX,0BACI0vC,cAAY,yCACZ1vC,UAAWs4B,IAAW,4DAA6D,CAAC11B,SAAU5D,KAAK4jG,qBACnGr5F,QAASvK,KAAK0gG,SACd98F,SAAU5D,KAAK4jG,oBAEf,gBAAC,IAAD,CACI9rG,GAAG,oDACH+N,eAAe,qB,EAnJtB+8F,E,aAhBjBzsB,Y,sBACA7zE,Q,WACI4gG,S,oBACAI,uB,oBACAF,mB,mCCMR,SAAej/F,cAlBf,SAAyBjL,GACrB,MAAMoC,GAASmd,QAAUvf,GAEzB,MAAO,CACHi9E,YAAa1mD,SAASn0B,EAAO0gF,YAAc,QAInD,SAA4B5kF,GACxB,MAAO,CACHkL,SAAS+B,wBAAmB,CACxB6+F,SADwB,KAExBI,uBAFwB,KAGxBF,mBAAkBA,MACnBhsG,MAIX,CAA4DwrG,G,eC5B7C,SAASiB,EAAmBhkG,GAOvC,OACI,uBAAKmB,UAAW,sBACZ,uBAAKA,UAAW,aACZ,gBAAC,IAAD,CACIlJ,GAAI+H,EAAMikG,kBACVj+F,eAAgBhG,EAAMkkG,0BAG9B,uBAAK/iG,UAAU,gCACX,0BACIA,UAAU,4DACVuJ,QAAS1K,EAAM0K,SAEf,gBAAC,IAAD,CACIzS,GAAI+H,EAAMmkG,gBACVn+F,eAAgBhG,EAAMokG,0B,g4BCP9C,MAAMz5C,EAAa,CACfxa,MAAQ/wC,GAAD,EAAC,KACDA,GADA,IAEH8kC,MAAO,iCAITmgE,EAAuBrkG,GAErB,uBAAKmB,UAAWs4B,IAAW,kCAAmC,CAAC5hC,MAAOmI,EAAMlI,KAAKD,SAC7E,gBAAC,yBAAmCmI,IAK1CklF,EAAoBllF,GAElB,uBAAKmB,UAAU,gCACX,gBAAC,sBAAgCnB,EAC7B,qBAAGmB,UAAU,6BAMvBmjG,EAAetkG,GAEb,uBAAKmB,UAAU,2BACX,gBAAC,iBAA2BnB,IAKlCukG,EAAmCvkG,IACrC,MAAM,MAACkB,EAAD,YAAQF,EAAR,UAAqBG,EAArB,MAAgCoqD,EAAhC,KAAuChrD,EAAvC,WAA6CirD,EAA7C,OAAyDC,EAAzD,SAAiErrD,EAAjE,OAA2ER,GAAyBI,EAAdyyC,E,kXAA5F,CAA0GzyC,EAA1G,IAEOuwC,EAASmb,IAAc3d,eAAS,GAsBjC4d,EAAa5qB,QAAQwP,GAAWrvC,EAAMyE,QAE5C,OACI,uBAAKxE,UAAU,8BACX,4BACIA,UAAWs4B,IAAW,iBAAkBt4B,EAAW,CAC/C0qD,wBAAyBF,KAG7B,0BAAQxqD,UAAWs4B,IAAW,eAAgB,CAACqyB,qBAAsBH,KAChEA,EAAcF,GAAUzqD,EAAe,MAE5C,uBACIG,UAAU,gBACV8vC,QAlCMvoB,IAClB,MAAM,QAACuoB,GAAWjxC,EAElB0rD,GAAW,GAEPza,GACAA,EAAQvoB,IA6BAwoB,OAzBKxoB,IACjB,MAAM,OAACwoB,GAAUlxC,EAEjB0rD,GAAW,GAEPxa,GACAA,EAAOxoB,KAqBE8iC,GAAc,4BAAOA,GACtB,gBAAC,KAAD,eACIvzD,GAAE,qBAAgBsI,GAClB0b,WAAY,CACRg7E,KAAM,IAAM,KACZ/rC,oBAAqB,IAAM,KAC3Bm5C,sBACAnf,mBACAof,eAEJ/iG,SAAS,EACThC,aAAa,EACbC,iBAAiB,EACjB63F,YAAY,EACZr2F,YAAauvC,EAAU,GAAKvvC,EAC5BG,UAAWs4B,IAAW,QAASt4B,EAAW,CAAC4qD,aAAcJ,IACzDzqD,MAAOA,EACPd,SAAUA,EACVR,OAAM,OAAM+qD,GAAe/qD,IACvB6yC,KAGX8Y,K,aAtGbrqD,M,qBACAuqD,O,WACArrD,S,qBA0GJ,U,muBCpEA,MAAMR,GAAS,CACXgrD,QAAS,KACE,CACH45C,WAAY,eAGpBC,eAAiBrlG,GACb,SACOA,GADP,IAEI2rD,QAAS,OAKrB,MAAM25C,WAA0B5kG,gBAI5BC,YAAYC,GACRC,MAAMD,GADgB,uFA6BN,KAChB,MAAM,kBAAC04C,GAAqBv4C,KAAKH,OAC3B,OAACihF,GAAU9gF,KAAK9G,MACtB,OAAIq/C,EACOA,EAAkBgvC,gBAAkBzG,EAAOt7E,OAE/C,KAnCe,gCAsCFg/F,IACpB,MAAM,kBAACjsD,GAAqBv4C,KAAKH,MACjC,QAAI04C,GAAwD,SAAnCA,EAAkBxO,gBAIvCwO,GAAsBisD,EAAcjsD,EAAkBgvC,qBA5CpC,yBAmDV,CAACxmF,EAAe80F,KAC5B,GAAKA,GAIiB,eAAlBA,EAAOjhF,QAA6C,eAAlBihF,EAAOjhF,QAIzC5U,KAAK9G,MAAMurG,aAAe1jG,EAI9B,IAA4B,IAAxBA,EAAMmR,QAAQ,OAAuC,IAAxBnR,EAAMmR,QAAQ,KAAa,CACxD,MAAM4uE,EAAS//E,EAAM8sB,MAAM,UAAUvmB,QAAQxN,GAAUA,EAAM0L,SAAQqE,KAAK/P,IAAD,CAAa4H,MAAO5H,EAAOiH,MAAOjH,EAAOpC,QAAQysF,QAAQrqF,OAC5H4qG,EAAY,IAAI1kG,KAAK9G,MAAM4nF,UAAWA,IACtC,eAAC6B,GAAkB3iF,KAAKH,MAExB8kG,EAAiB3kG,KAAK4kG,qBAAqBF,EAAUl/F,QAE3DxF,KAAK8F,SAAS,CACVg7E,OAAQ4jB,EACRD,WAAY,GACZI,WAAYF,EAAiB3kG,KAAKH,MAAM8F,KAAKC,cAAc,CACvD9N,GAAI,oDACJ+N,eAAgB,8CACpB,CAAC82B,IAAKgmD,SAAmB37E,SAG7BhH,KAAK8F,SAAS,CAAC2+F,WAAY1jG,OAhFT,oBAoFf,CAACA,EAAwB6T,KAChC,GAAsB,iBAAlBA,EAAOA,QAA+C,cAAlBA,EAAOA,OAC3C,OAGC7T,EAAM6pB,MAAM9wB,GAAUA,EAAMpC,SAC7BsI,KAAK8F,SAAS,CAAC++F,gBAAY79F,IAG/B,MAAM,eAAC27E,GAAkB3iF,KAAKH,MACPG,KAAK4kG,qBAAqB7jG,EAAMyE,SAGnDxF,KAAK8F,SAAS,CAAC++F,WAAY7kG,KAAKH,MAAM8F,KAAKC,cAAc,CACrD9N,GAAI,oDACJ+N,eAAgB,8CACpB,CAAC82B,IAAKgmD,MAGV3iF,KAAK8F,SAAS,CAACg7E,OAAQ//E,OAvGD,kBA0GjB,KACL,GAAIf,KAAK9G,MAAMurG,WAAY,CACvB,MAAM3jB,EAAS9gF,KAAK9G,MAAMurG,WAAW52E,MAAM,UAAUvmB,QAAQxN,GAAUA,EAAM0L,SAAQqE,KAAK/P,IAAD,CAAa4H,MAAO5H,EAAOiH,MAAOjH,EAAOpC,QAAQysF,QAAQrqF,OAC5I4qG,EAAY,IAAI1kG,KAAK9G,MAAM4nF,UAAWA,IACtC,eAAC6B,GAAkB3iF,KAAKH,MACxB8kG,EAAiB3kG,KAAK4kG,qBAAqBF,EAAUl/F,QAE3DxF,KAAK8F,SAAS,CACVg7E,OAAQ4jB,EACRD,WAAY,GACZI,WAAYF,EAAiB3kG,KAAKH,MAAM8F,KAAKC,cAAc,CACvD9N,GAAI,oDACJ+N,eAAgB,8CACpB,CAAC82B,IAAKgmD,SAAmB37E,QAvHX,4BA4HPzP,UAEf,GAAiC,IAA7ByI,KAAK9G,MAAM4nF,OAAOt7E,OAClB,OAAO,EAGX,GAAIxF,KAAK9G,MAAM4nF,OAAOl2D,MAAM9wB,GAAUA,EAAMpC,QAExC,OADAsI,KAAK8F,SAAS,CAAC++F,WAAY5vF,KAAsB,mDAAoD,2CAA4C6vF,gBAAY99F,KACtJ,GAGXrJ,SAAWg/F,OAAqB38F,KAAKH,MAAMmoF,SAAU,yBAA0B,CAACX,gBAAiBrnF,KAAK9G,MAAM4nF,OAAOt7E,SAEnH,MAAMs7E,EAAS9gF,KAAK9G,MAAM4nF,OAAOj3E,KAAK9I,GAAUA,EAAMA,SAChD,KAACpJ,EAAD,MAAOD,SAAesI,KAAKH,MAAMyC,QAAQyiG,iCAAiC/kG,KAAKH,MAAMsa,KAAKriB,GAAIgpF,GAEpG,OAAIppF,IAAUC,EAAK6N,QAAU7N,EAAKizB,MAAMnc,GAAWA,EAAO/W,UACtDiG,SAAWg/F,OAAqB38F,KAAKH,MAAMmoF,SAAU,6BACrDhoF,KAAK8F,SAAS,CAAC++F,WAAY5vF,KAAsB,yDAA0D,mEAAoE6vF,gBAAY99F,KACpL,KAGXrJ,SAAWg/F,OAAqB38F,KAAKH,MAAMmoF,SAAU,mBAAoB,CAAC6D,qBAAsBl0F,EAAK6N,SAErGxF,KAAK8F,SAAS,CAAC++F,gBAAY79F,EAAW89F,WAAYntG,EAAK6N,SAAS,KAC5Dsb,YAAW,IAAM9gB,KAAK8F,SAAS,CAACg/F,gBAAY99F,KAAa,SAGtD,MAxJe,kBA2JjB,KACLhH,KAAKH,MAAM8gG,OAAO3gG,KAAKH,MAAM/H,OA5JP,oBA+JfP,gBACYyI,KAAKglG,oBAEpBhlG,KAAKH,MAAM6gG,SAAS1gG,KAAKH,MAAM/H,OAlKb,oBAsKf,MACP6F,SAAWg/F,OAAqB38F,KAAKH,MAAMmoF,SAAU,0BAErD,MAAMid,EAAYC,UAAUD,UAC5B,GAAIA,EACAA,EAAUE,UAAUnlG,KAAKolG,gBACzBplG,KAAK8F,SAAS,CAAC6gF,YAAY,QACxB,CACH,MAAMJ,EAAY/mF,SAASktE,cAAc,YACzC6Z,EAAUC,UAAYxmF,KAAKolG,eAC3B7e,EAAU39E,MAAMwqC,SAAW,QAC3BmzC,EAAU39E,MAAMs4B,QAAU,IAE1B1hC,SAASlB,KAAKmoF,YAAYF,GAC1BA,EAAUG,SAEV,IACI1mF,KAAK8F,SAAS,CAAC6gF,WAAYnnF,SAASonF,YAAY,UAClD,MAAOhvF,GACLoI,KAAK8F,SAAS,CAAC6gF,YAAY,IAE/BJ,EAAU5iD,SAGV3jC,KAAKs1B,SACLO,aAAa71B,KAAKs1B,SAEtBt1B,KAAKs1B,QAAUxU,YAAW,KACtB9gB,KAAK8F,SAAS,CAAC6gF,YAAY,MAC5B,QAnMmB,wBAsMX,IACX,WAAUv6E,UAAV,qCAAmDpM,KAAKH,MAAMsa,KAAK8xE,aApMnEjsF,KAAKsmF,cAAgB3mF,cAErBK,KAAK9G,MAAQ,CACTytF,YAAY,EACZ8d,WAAY,GACZ3jB,OAAQ,IAIhBhkD,oBACQ98B,KAAKH,MAAM4zC,WACX+uC,SAAYma,OAAqB38F,KAAKH,MAAMmoF,SAAU,2BAGrDhoF,KAAKH,MAAMsa,KAAK8xE,WAEjBjsF,KAAKH,MAAMyC,QAAQ+iG,uBAAuBrlG,KAAKH,MAAMsa,KAAKriB,IAIlEmlC,mBAAmBC,GACXA,EAAUuW,WAAazzC,KAAKH,MAAM4zC,UAAYzzC,KAAKH,MAAM4zC,WACzD+uC,SAAYma,OAAqB38F,KAAKH,MAAMmoF,SAAU,2BAiL9DvmF,SAAsB,QAClB,MAAM6jG,EAAUtlG,KAAKH,MAAMmoF,QAAU,gBAAC,IAAD,CAAaxgD,cAAc,sCAAwC,gBAAC,KAAD,MACxG,IAAI+9D,EACA,gBAAC,IAAD,CACIztG,GAAG,mDACH+N,eAAe,yEAIsC,QAW7D,MAXoD,WAAhD,UAAA7F,KAAKH,aAAL,mBAAY04C,yBAAZ,eAA+BxO,gBAC/Bw7D,EACI,gBAAC,IAAD,CACIztG,GAAG,uDACH+N,eAAe,uFACfjB,OAAQ,CACJ6lB,QAAO,UAAEzqB,KAAKH,aAAP,iBAAE,EAAY04C,yBAAd,aAAE,EAA+BgvC,oBAMpD,uBAAKvmF,UAAU,8BACX,uBAAKA,UAAU,qBACVhB,KAAKH,MAAM2lG,uBACR,uBAAKxkG,UAAU,uCACX,0BACI,gBAAC,IAAD,CACIlJ,GAAG,8DACH+N,eAAe,gCAGtB0/F,EACD,gBAAC,EAAD,CACIx0D,OAAQ/wC,KAAK+wC,OACbi0C,cAAehlF,KAAKglF,cACpB/kF,SAAUD,KAAKC,SACfc,MAAOf,KAAK9G,MAAM4nF,OAClB2D,WAAYzkF,KAAK9G,MAAMurG,WACvBn5C,OAAQr2C,KAAsB,qDAAsD,mBACpFpU,YAAaoU,KAAsB,0DAA2D,yBAC9FxV,OAAQA,GACRW,KAAK,wCAET,uBAAKY,UAAU,2BACX,0BACI0vC,cAAY,gCACZ1vC,UAAWs4B,IAAW,gEAClB,CAAC11B,SAAU5D,KAAK4kG,qBAAqB5kG,KAAK9G,MAAM4nF,OAAOt7E,UAAYxF,KAAK9G,MAAM4nF,OAAOt7E,QAAUo7B,QAAQ5gC,KAAK9G,MAAM4rG,aAAelkE,QAAQ5gC,KAAK9G,MAAM2rG,cAGxJjhG,SAAU5D,KAAK4kG,qBAAqB5kG,KAAK9G,MAAM4nF,OAAOt7E,UAAYxF,KAAK9G,MAAM4nF,OAAOt7E,QAAUo7B,QAAQ5gC,KAAK9G,MAAM4rG,aAAelkE,QAAQ5gC,KAAK9G,MAAM2rG,YACnJt6F,QAASvK,KAAKglG,kBAEd,qBAAGhkG,UAAU,mBACb,gBAAC,IAAD,CACIlJ,GAAG,2CACH+N,eAAe,UAGvB,uBAAK7E,UAAWs4B,IAAW,uCAAwC,CAAC5hC,MAAOsI,KAAK9G,MAAM2rG,cACjF7kG,KAAK9G,MAAM4rG,YACR,gCACI,qBAAG9jG,UAAU,oBACb,gBAAC,IAAD,CACIlJ,GAAG,sDACH+N,eAAe,yBACfjB,OAAQ,CAAC+3B,IAAK38B,KAAK9G,MAAM4rG,eAIpC9kG,KAAK9G,MAAM2rG,YACR,gCACI,qBAAG7jG,UAAU,4BACb,4BAAOhB,KAAK9G,MAAM2rG,aAGxB7kG,KAAK9G,MAAM2rG,aAAe,IAAO7kG,KAAKH,MAAM04C,oBAAsBv4C,KAAK4kG,qBAAqB5kG,KAAK9G,MAAM4nF,OAAOt7E,SAAY8/F,KAM5I,uBAAKtkG,UAAU,sCACX,0BACKhB,KAAKH,MAAM2lG,uBACR,gBAAC,IAAD,CACI1tG,GAAG,sDACH+N,eAAe,0CAGrB7F,KAAKH,MAAM2lG,uBACT,gBAAC,IAAD,CACI1tG,GAAG,oDACH+N,eAAe,uCAI3B,uBAAK7E,UAAU,qCACX,yBACIw7B,IAAKx8B,KAAKsmF,cACVtlF,UAAU,iDACVnF,KAAK,OACLgiD,UAAU,EACV98C,MAAOf,KAAKolG,eACZzyD,aAAY19B,KAAsB,CAACnd,GAAI,qDAAsD+N,eAAgB,qBAC7G6qC,cAAY,sCAEhB,0BACI1vC,UAAWs4B,IAAW,0EAA2E,CAACmsE,OAAQzlG,KAAK9G,MAAMytF,aACrHp8E,QAASvK,KAAKopD,SACd1Y,cAAY,4CAEV1wC,KAAK9G,MAAMytF,YACT,gCACI,qBAAG3lF,UAAU,2BACb,gBAAC,IAAD,CACIlJ,GAAG,kDACH+N,eAAe,eAI1B7F,KAAK9G,MAAMytF,YACR,gCACI,qBAAG3lF,UAAU,oBACb,gBAAC,IAAD,CACIlJ,GAAG,kDACH+N,eAAe,gBAQ3C,uBAAK7E,UAAU,gCACX,0BACI0vC,cAAY,kCACZ1vC,UAAW,4DACXuJ,QAASvK,KAAK0gG,UAEd,gBAAC,IAAD,CACI5oG,GAAG,2CACH+N,eAAe,a,GA5VrC0+F,G,aAvCFiB,sB,oBACA7iB,e,kDACArgF,Q,WACIyiG,iC,oBACAM,uB,iCAIJx7D,Q,sBAoYJ,UAAep/B,QAAW85F,ICjY1B,IAAepgG,cA1Bf,SAAyBjL,GACrB,MAAMoC,GAASmd,QAAUvf,GAEzB,MAAO,CACHihB,MAAMoD,QAAerkB,GACrBssG,sBAAyD,SAAlClqG,EAAOqyF,uBAC9B9jD,QAAqC,UAA5Bne,QAAWxyB,GAAOwpB,MAC3BigE,eAAgBrnF,EAAOkvC,4BAA8B,GACrD+N,mBAAmB51B,QAAqBzpB,OAShD,SAA4B9B,GACxB,MAAO,CACHkL,SAAS+B,wBAAiE,CACtE0gG,iCADsE,KAEtEM,uBAAsBA,MACvBjuG,MAIX,CAA4DmtG,I,kICD7C,MAAMmB,WAAwB/lG,gBACzCC,YAAYC,GACRC,MAAMD,GADgB,iCAsBO0oB,IAC7B,IAAIo9E,EACCp9E,EAAM2R,OAAOn5B,MAEPwnB,EAAM2R,OAAOn5B,MAAMyE,OAhDT,KAiDjBmgG,EAAgB1wF,KAAsB,+CAAgD,8CAFtF0wF,EAAgB1wF,KAAsB,sDAAuD,6BAKjGjV,KAAK8F,SAAS,CAACq5B,SAAU5W,EAAM2R,OAAOn5B,MAAO4kG,qBA9BvB,4BAiCP,IACR/kE,SAAS5gC,KAAK9G,MAAMimC,UAAYn/B,KAAK9G,MAAMysG,eAAiB3lG,KAAK9G,MAAM4pG,uBAlCxD,kBAqCjB,KACL9iG,KAAKH,MAAM8gG,OAAO3gG,KAAKH,MAAM/H,OAtCP,oBAyCf,KACP,MAAMqiB,EAAO7U,OAAOuX,OAAO,GAAI7c,KAAKH,MAAMsa,KAAM,CAAC9X,aAAcrC,KAAK9G,MAAMimC,WAE1En/B,KAAKH,MAAMyC,QAAQsjG,UAAUzrF,GAEzBna,KAAK9G,MAAMiqG,eACXnjG,KAAKH,MAAMyC,QAAQujG,YAAY7lG,KAAKH,MAAMsa,KAAKriB,GAAIkI,KAAK9G,MAAMiqG,gBACvDnjG,KAAK9G,MAAMmqG,sBAClBrjG,KAAKH,MAAMyC,QAAQwjG,eAAe9lG,KAAKH,MAAMsa,KAAKriB,KAGtD6F,SAAWg/F,OAAqB38F,KAAKH,MAAMmoF,SAAU,mBAErDhoF,KAAKH,MAAM6gG,SAAS1gG,KAAKH,MAAM/H,OAtDT,+BAyDJ,MAClB6F,SAAWg/F,OAAqB38F,KAAKH,MAAMmoF,SAAU,2BA1D/B,2BA6DPmb,IACf,IAAKI,cAAmCJ,EAAetnG,OAASsnG,EAAe5sD,KAAOv2C,KAAKH,MAAMs2E,YAI7F,OAHAx4E,SAAWg/F,OAAqB38F,KAAKH,MAAMmoF,SAAU,oCAErDhoF,KAAK8F,SAAS,CAACg9F,qBAAqB,IAIxC9iG,KAAK8F,SAAS,CAACq9F,iBAAgBL,qBAAqB,EAAOO,sBAAsB,OArE3D,2BAwER,MACd1lG,SAAWg/F,OAAqB38F,KAAKH,MAAMmoF,SAAU,sBAErDhoF,KAAK8F,SAAS,CAACq9F,oBAAgBn8F,EAAW87F,qBAAqB,EAAOO,sBAAsB,OAxE5FrjG,KAAK9G,MAAQ,CACTimC,SAAUt/B,EAAMsa,KAAK9X,aACrBygG,qBAAqB,EACrBO,sBAAsB,GAI9BvmE,oBACQ98B,KAAKH,MAAM4zC,WACX+uC,SAAYma,OAAqB38F,KAAKH,MAAMmoF,SAAU,sBAI9D/qD,mBAAmBC,GACXA,EAAUuW,WAAazzC,KAAKH,MAAM4zC,UAAYzzC,KAAKH,MAAM4zC,WACzD+uC,SAAYma,OAAqB38F,KAAKH,MAAMmoF,SAAU,sBA4D9DvmF,SACI,MAAM,KAAC0Y,GAAQna,KAAKH,MAGd2jG,EAAarpF,EAAK4rF,wBAA0B/lG,KAAK9G,MAAMmqG,sBAAuBpuF,KAAsBkF,SAAqBnT,EAE/H,OACI,uBAAKhG,UAAU,8BACX,uBAAKA,UAAU,mBACX,uBAAKA,UAAU,mCACX,0BACI,gBAAC,IAAD,CACIlJ,GAAG,8CACH+N,eAAe,gBAGvB,gBAAC,EAAD,CACIzF,KAAK,4BACLuiG,aAAc3iG,KAAKyjG,oBACnBhP,SAAUz0F,KAAK0jG,gBACf13B,SAAUhsE,KAAK2jG,gBACfl6F,IAAK+5F,EACL3iG,YACI,uBACI6vC,cAAY,kBACZ1vC,UAAW,4CACX2xC,aAAY,iBAEX3yC,KAAKH,MAAMsa,KAAK9X,aAAerC,KAAKH,MAAMsa,KAAK9X,aAAa2sC,QAAQ,MAAO,IAAI58B,UAAU,EAAG,GAAK,SAKlH,uBAAKpR,UAAU,+BACX,0BACI,gBAAC,IAAD,CACIlJ,GAAG,wDACH+N,eAAe,0BAGvB,gBAAC,IAAD,CACIzF,KAAK,WACLvE,KAAK,OACLkF,MAAOf,KAAK9G,MAAMimC,SAClBl/B,SAAUD,KAAKgmG,sBACfnlG,YAAaoU,KAAsB,6CAA8C,aACjFvd,MAAOsI,KAAK9G,MAAMysG,cAClBz5B,KAAMj3D,KAAsB,wDAAyD,wDAIhGjV,KAAK9G,MAAM4pG,qBACR,wBAAM9hG,UAAU,iCACZ,qBAAGA,UAAU,4BACb,gBAAC,IAAD,CACIlJ,GAAG,iDACH+N,eAAe,wEACfjB,OAAQ,CAACmxD,IAAK9gD,KAAuBjV,KAAKH,MAAMs2E,iBAI5D,uBAAKn1E,UAAU,gCACX,0BACI0vC,cAAY,kCACZ1vC,UAAWs4B,IAAW,4DAA6D,CAAC11B,SAAU5D,KAAK4jG,qBACnGr5F,QAASvK,KAAK0gG,SACd98F,SAAU5D,KAAK4jG,oBAEf,gBAAC,IAAD,CACI9rG,GAAG,6CACH+N,eAAe,kB,GArJtB6/F,G,aAjBjB1oG,Q,sBACAm5E,Y,sBACA7zE,Q,WACIsjG,U,oBACAE,e,oBACAD,Y,mCCIR,UAAe1hG,cApBf,SAAyBjL,GACrB,MAAMoC,GAASmd,QAAUvf,GAEzB,MAAO,CACHihB,MAAMoD,QAAerkB,GACrB8D,QAAS1B,EAAOqtC,QAChBwtC,YAAa1mD,SAASn0B,EAAO0gF,YAAc,QAInD,SAA4B5kF,GACxB,MAAO,CACHkL,SAAS+B,wBAAmB,CACxBuhG,UADwB,KAExBE,eAFwB,KAGxBD,YAAWA,MACZzuG,MAIX,CAA4DsuG,I,gBCWrD,MAAMO,GAAoB,CAC7B,CACInuG,GAAI8pB,sBACJzY,MAAO,CACHq3F,SAASxsF,OAAE,0CACXysF,aAAc,yBAElBtjG,UAAWylG,EACXh1E,MAAO,GACPmwC,SAAS,GAEb,CACIjmE,GAAI8pB,gBACJzY,MAAO,CACHq3F,SAASxsF,OAAE,oCACXysF,aAAc,kBAElB7yE,MAAO,CAAC,eACRzwB,UAAWuoG,GACX3nC,SAAS,GAEb,CACIjmE,GAAI8pB,wBACJzY,MAAO,CACHq3F,SAASxsF,OAAE,sDACXysF,aAAc,wBAElB7yE,MAAO,CAAC,eACRzwB,UC3DO,SAAiC0C,IAC5CguC,gBAAU,KACFhuC,EAAM4zC,WACN+uC,SAAYma,OAAqB98F,EAAMmoF,SAAU,mCAEtD,CAACnoF,EAAM4zC,WAEV,MAAMitD,EAAWnpG,WACboG,SAAWg/F,OAAqB98F,EAAMmoF,SAAU,8BAChD,UACUke,QAAiB,CACnB/8F,MAAO8L,KACH,6DACA,0BAEJ3W,KAAM2W,KACF,4DACA,yDAEJkxF,oBAAoB,EACpBC,QAAQ,EACR77F,QAAS,SAEf,MAAO3S,IAITiI,EAAM6gG,SAAS7gG,EAAM/H,KAezB,MAXU,iBAAkBuU,QAIQ,WAA5Bg6F,aAAa75E,WAyBjB,gBAACq3E,EAAD,CACIC,mBAAmB9vF,OAAE,qCACrB+vF,uBACI,8FAEJC,gBAAiB,qDACjBC,qBAAsB,uBACtB15F,QAASm2F,IAvBT,2BACI,gBAACmD,EAAD,CACIC,kBAAmB,yDACnBC,uBACI,6KAEJC,gBACI,iDAEJC,qBAAsB,iBACtB15F,QAASm2F,MDMrB3iC,SAAS,GAEb,CACIjmE,GAAI8pB,uBACJzY,MAAO,CACHq3F,SAASxsF,OAAE,0CACXysF,aAAc,wBAElB7yE,MAAO,CAAC,eACRzwB,UEpEO,SAA8B0C,IACzCguC,gBAAU,KACFhuC,EAAM4zC,WACN+uC,SAAYma,OAAqB98F,EAAMmoF,SAAU,mCAEtD,CAACnoF,EAAM4zC,WAEV,MAAMr8C,GAAWunD,mBAEX+hD,EAAW,KACb7gG,EAAM6gG,SAAS7gG,EAAM/H,KAezB,OACI,gCACI,gBAAC+rG,EAAD,CACIC,kBAAmB,kCACnBC,uBAAwB,6JACxBC,gBAAiB,iDACjBC,qBAAsB,kBACtB15F,QAnBI,MACZ5M,SAAWg/F,OAAqB98F,EAAMmoF,SAAU,yBAChD5wF,GAASwU,OAAU,CACfC,QAASC,mBACTC,WAAYoH,IACZnH,YAAa,CACT23D,OAAQ+8B,EACR10F,YAAa,CAACoH,0BAA0B,YFiDhD2qD,SAAS,GAEb,CACIjmE,GAAI8pB,oBACJzY,MAAO,CACHq3F,SAASxsF,OAAE,wCACXysF,aAAc,8BAElB7yE,MAAO,CAAC,eAAgB,eACxBzwB,UAAWonG,GACXxmC,SAAS,IAIJu+B,IAAelO,QACxB,gBACCl1F,IAAuB4hB,QAAe5hB,KACtCA,IAAuB+rB,QAAS/rB,KACjC,CAACkxB,EAAapsB,KACV,IAAKosB,EAAYwD,MAAMqD,SAAS,gBAC5B,OAAO,EAEX,MAAMziB,EAAUlJ,OAAOC,KAAKvH,GAC5B,IAAK,MAAM/F,KAAUuW,EAAS,CAC1B,MAAMhW,EAAOwF,EAAM/F,GACnB,GAAIO,EAAKo1B,MAAMqD,SAAS,iBAAmBz4B,EAAKqf,UAAYuS,EAAYvS,UAEpE,OAAO,EAGf,OAAO,KAIF2pF,IAAWpT,QACpB,YACCl1F,IAAuB4hB,QAAe5hB,KACtCA,GAAuBojG,GAAapjG,KACrC,CAACkxB,EAAak8E,KACV,MAAM14E,EAAQ04E,EAAa,eAAH,OAAkBl8E,EAAYwD,OAAUxD,EAAYwD,MAC5E,OAAOq4E,GAAM3+F,QAAQgkF,IACjBoW,OAAcpW,EAAM19D,IAAU09D,EAAKvtB,aAKzCzzB,IAAcC,UACPg8D,IAAiBnY,QAC1B,eACCl1F,GAAuBstG,GAActtG,KACrCA,GAAuButG,GAAkBvtG,KACzCA,GAAuBA,EAAMwlC,MAAMgoE,UAAUh/F,OAC9C,CAAC8+F,EAAeC,EAAmBE,KACvBA,IAA2BH,GAAiBC,KAG/CG,IAAqBxY,QAC9B,sBACCl1F,GAAuBoxC,GAAYpxC,EAAO+U,+BAC1C44F,GAGkC,IAA3BA,EAAgBrhG,QAGbqhG,EAAgBj8E,MAAMwf,GAAUA,EAAKhqC,OAASwhB,WAA4C,SAAfwoB,EAAKrpC,UAKlFylG,IAAgBpY,QACzB,iBACCl1F,GAAuBoxC,GAAYpxC,EAAO+U,+BAC1C/U,GAAuB4tG,GAAqB5tG,KAC7C,CAAC2tG,EAAiBC,KACVD,EAAgBj8E,MAAMwf,GAAUA,EAAKhqC,OAASwhB,WAA4C,SAAfwoB,EAAKrpC,SAI7E+lG,IAKFL,IAAoBrY,QAC7B,qBACCl1F,GAAuBoxC,GAAYpxC,EAAO+U,+BAC1C/U,GAAuB4tG,GAAqB5tG,KAC7C,CAAC2tG,EAAiBC,MACVD,EAAgBj8E,MAAMwf,GAAUA,EAAKhqC,OAASwhB,WAA4C,SAAfwoB,EAAKrpC,UAI5E+lG,IAKHA,IAAuB1Y,QAChC,wBACCl1F,GAAuBoxC,GAAYpxC,EAAO+U,+BAC1C/U,IAAuB4hB,QAAe5hB,KACtCA,GAAuBojG,GAAapjG,KACpCA,GAAuBsoG,GAAStoG,KACjC,CAAC2tG,EAAiBz8E,EAAak8E,EAAYS,KACvC,MAAMn5E,EAAQ04E,EAAa,eAAH,OAAkBl8E,EAAYwD,OAAUxD,EAAYwD,MAE5E,OAAQm5E,EAAQC,OADG1b,GAAmBub,EAAgBj8E,MAAMwf,GAAUA,EAAKhqC,OAASkrF,EAAKxzF,IAAqB,SAAfsyC,EAAKrpC,SAAsB2gG,OAAcpW,EAAM19D,W,uKGxLvI,SAASq5E,EAAQpnG,GAC5B,MAAM,cAAC+F,IAAiBiyC,SACxB,OACI,uBAAUh4C,EACN,uBACI0J,MAAM,OACNC,OAAO,OACPyjC,QAAQ,YACRwjB,QAAQ,MACRnoD,KAAK,MACLqqC,aAAY/sC,EAAc,CAAC9N,GAAI,oBAAqB+N,eAAgB,cAEpE,wBAAMwnC,EAAE,muC,yBCWxB,MAAM65D,EAAyD,CAC3D,CAAC5vC,mBAAiC,gBAAC,IAAD,CAAYt2D,UAAU,qBACxD,CAACs2D,cAA4B,gBAAC,IAAD,CAAct2D,UAAU,qBACrD,CAACs2D,kBAAgC,gBAAC,IAAD,CAAUt2D,UAAU,qBACrD,CAACs2D,iBAA+B,gBAAC2vC,EAAD,CAASjmG,UAAU,qBACnD,CAACs2D,kBAAgC,qBAAGt2D,UAAU,iDAC9C,CAACs2D,0BAAwC,qBAAGt2D,UAAU,kDAGpDmmG,EAA2D,CAC7D,CAAC7vC,mBAAiC,CAC9Bx/D,IAAIkc,OAAE,oCAEV,CAACsjD,cAA4B,CACzBx/D,IAAIkc,OAAE,8BAEV,CAACsjD,kBAAgC,CAC7Bx/D,IAAIkc,OAAE,mCAEV,CAACsjD,iBAA+B,CAC5Bx/D,IAAIkc,OAAE,kCAEV,CAACsjD,kBAAgC,CAC7Bx/D,IAAIkc,OAAE,mCAEV,CAACsjD,0BAAwC,CACrCx/D,IAAIkc,OAAE,6CAIRozF,EAA8D,CAChE,CAAC9vC,mBAAiC,CAC9Bx/D,IAAIkc,OAAE,uCAEV,CAACsjD,cAA4B,CACzBx/D,IAAIkc,OAAE,iCAEV,CAACsjD,kBAAgC,CAC7Bx/D,IAAIkc,OAAE,sCAEV,CAACsjD,iBAA+B,CAC5Bx/D,IAAIkc,OAAE,qCAEV,CAACsjD,kBAAgC,CAC7Bx/D,IAAIkc,OAAE,sCAEV,CAACsjD,0BAAwC,CACrCx/D,IAAIkc,OAAE,gDAMRqzF,EAAqB,EACvB5zD,WACA7qC,QACA83B,UACA4mE,eAAc5mE,EACV,uBAAK1/B,UAAU,+BACVkmG,EAAQxmE,IAEb,MACJ62B,cACApuD,SAAQu3B,EACJ,gBAAC,IAAD,iBACQymE,EAASzmE,GADjB,CAEI97B,OAAQ2yD,KAEZ,MACJgwC,iBACAhC,YAAW7kE,EACP,gBAAC,IAAD,iBACQ0mE,EAAY1mE,GADpB,CAEI97B,OAAQ2iG,KAEZ,UAEJ,IAAIzwD,EACA,uBACI91C,UAAU,sBACV4H,MAAOA,GAEN0+F,EAEAn+F,EACG,sBAAInI,UAAWs4B,IAAW,oBAAqB,CAAC,cAAeisE,KAC1Dp8F,GAEL,KAEHo8F,EACG,uBAAKvkG,UAAU,wBACVukG,GAEL,MAaZ,OARI9xD,IACAqD,EACI,uBAAK91C,UAAU,sBACV81C,IAKNA,G,aArHPrD,S,SACA6zD,Y,SACAn+F,M,SACAo8F,S,UAqHJ,W,6BCzIO,IAAKjuC,E,0BAAAA,K,8BAAAA,E,oBAAAA,E,4BAAAA,E,0BAAAA,E,4BAAAA,E,6CAAAA,M,muCCoBZ,MAAMkwC,EAAiB7nG,cAAiB,CAACE,EAAc28B,KACnD,MAAM,QACFgI,EADE,SAEF5gC,GAEA/D,EADGyyC,EAHP,EAIIzyC,EAJJ,GAQM4nG,EAAiB,QAAC,KAAC9hG,GAAF,EAAW+hG,EAAX,cACnB,gBAAC,EAAAC,SAAD,CAAUtwG,MAAOA,KACb,gBAAC,cAAD,CAAsB0J,MAAO4E,GACxBhG,eAAmB6kC,EAASkjE,MAKzC,OACI,gBAAC,cAAD,MACM/hG,IACE,MAAM+hG,EAAe,EAAH,GAAOljE,EAAQ3kC,OAIjC,OAHI+D,IACA8jG,EAAa9+F,MAAb,GAAsBg/F,WAAY,UAAaF,EAAa9+F,QAG5D,gBAAC,IAAD,iBACQ0pC,EADR,CAEI9V,IAAKA,EACLgI,QACI,gBAACijE,EAAD,iBACQC,EADR,CAEI/hG,KAAMA,c,aAnClC/B,S,SACA5C,U,YA4CJwmG,EAAe3tD,aAAe,CAC1BguD,qBAAqB,EACrBnyD,QAAS,CAAC,QAAS,UAEvB8xD,EAAezkG,YAAc,iBAE7B,W,iFCrEA,QAAe,IAA0B,6CCAzC,EAAe,IAA0B,6CCAzC,EAAe,IAA0B,6CCAzC,EAAe,IAA0B,6CCAzC,EAAe,IAA0B,6CCAzC,EAAe,IAA0B,6CCmB1B,SAAS+kG,EAAUjoG,GAC9B,MAAM,MAACggC,GAAShgC,EAEVkoG,EAcV,SAAsBloE,GAClB,OAAQA,GACR,IAAK,OACD,OAAOmoE,EACX,IAAK,SACD,OAAOC,EACX,IAAK,WACD,OAAOC,EACX,IAAK,MACD,OAAOC,EACX,IAAK,aACD,OAAOC,EACX,IAAK,OACD,OAAOC,EAGX,MAAO,GA9BcC,CAAazoE,GAClC,OAAIkoE,EAEI,uBACI/mG,UAAU,YACVyI,IAAKs+F,EACLz+F,IAAKu2B,IAKV,K,aAjBPA,M,kWCJJ,MAAM0oE,EAAuB,CACzBC,gBAAgB,EAChB5/F,MAAO,CACH6/F,KAAM,CACFC,WAAY,YACZ5sD,SAAU,OACV5a,QAAS,MACTynE,cAAe,iBA0BrBC,EAAsB,yBACtBC,EAAkB,mCAMxB,MAAMC,UAAkBnpG,gBACbC,YAAYC,GACfC,MAAMD,GADuB,kBAWf,KACd,MAAM,QAACixC,GAAW9wC,KAAKH,MAEvBG,KAAK8F,SAAS,CAACsqC,SAAS,IAEpBU,GACAA,OAjByB,iBAqBhB,KACb,MAAM,OAACC,GAAU/wC,KAAKH,MAEtBG,KAAK8F,SAAS,CAACsqC,SAAS,IACxBpwC,KAAK0+E,gBAED3tC,GACAA,OA5ByB,mBAgCbxoB,IAChBvoB,KAAK8F,SAAS,CAACpO,MAAO,GAAI+tF,MAAOl9D,EAAMk9D,MAAO6a,SAAU/3E,EAAM+3E,WAC1DtgG,KAAKH,MAAMkpG,mBACX/oG,KAAKH,MAAMkpG,kBAAkBxgF,MAnCJ,wBAuCT,KACpB,MAAM,SAACo2D,GAAY3+E,KAAKH,OAClB,MAAC4lF,EAAD,SAAQ6a,GAAYtgG,KAAK9G,MAC/B,IAAIxB,EAAQ,GAEZsI,KAAK8F,SAAS,CAACpO,MAAO,KAClBinF,GAAY8G,EACZ/tF,EAAQkxG,EACAtI,IACR5oG,EAAQmxG,GAGZ7oG,KAAK8F,SAAS,CAACpO,aAhDfsI,KAAK9G,MAAQ,CACTk3C,SAAS,EACT14C,MAAO,GACP+tF,OAAO,EACP6a,UAAU,GA+CVz0C,YAAYn0D,GAChB,IAAKA,EACD,OAAO,KAGX,IAAI+O,EAeJ,OAdI/O,IAAUkxG,EACVniG,EACI,gBAAC,IAAD,CACI3O,GAAG,yBACH+N,eAAe,2BAEhBnO,IAAUmxG,IACjBpiG,EACI,gBAAC,IAAD,CACI3O,GAAG,8BACH+N,eAAe,sCAKvB,uBAAK7E,UAAU,iBACX,qBAAGA,UAAU,4BACZyF,GAKNuiG,UAAgD,MACnD,iBAAOhpG,KAAKH,MAAMqF,gBAAlB,aAAO,EAAqB+jG,WAAWC,eAGpCznG,SACH,QAAqDzB,KAAKH,OAApD,UAACmB,EAAWtJ,MAAOmnF,GAAzB,EAAuCvsC,E,kXAAvC,OACM,MAACmzC,EAAD,QAAQr1C,EAAS14C,MAAOqnF,GAAc/+E,KAAK9G,MACjD,IAAIiwG,EAAgBnoG,EAAY,kBAAH,OAAqBA,GAAc,iBAC5DooG,EAAqBpoG,EAAY,yCAAH,OAA4CA,GAAc,wCAC5F,MAAMwqD,EAAa5qB,QAAQwP,IAAYq1C,GAEvC0jB,EAAgB39C,EAAa29C,EAAgB,2BAA6BA,EAC1EC,EAAqB59C,EAAa49C,EAAqB,2BAA6BA,EAEpF,MAAM1xG,EAAQmnF,GAAaE,EAE3B,OACI,uBAAK/9E,UAAU,mBACX,4BAAUA,UAAWtJ,EAAQ0xG,EAAqBD,GAC9C,0BAAQnoG,UAAWwqD,EAAa,oCAAsC,gBAClE,gBAAC,IAAD,CACI1zD,GAAG,sBACH+N,eAAe,iBAGvB,gBAAC,EAAAqjG,YAAD,iBACQ52D,EADR,CAEIj1C,QAASkrG,EACTx3D,OAAQ/wC,KAAK+wC,OACbD,QAAS9wC,KAAK8wC,QACd7wC,SAAUD,KAAKC,aAGtBD,KAAK6rD,YAAYn0D,K,EApH5BoxG,E,aAjBFC,kB,SAVArxG,M,WACAinF,S,SACA0qB,a,UAmJJ,MAAMC,EAAqBzpG,GAEnB,gBAAC,EAAA0pG,iBAAD,MACK,EAAErkG,cACC,gBAAC4jG,EAAD,eACItsE,IAAK38B,EAAMwpG,aACXnkG,SAAUA,GACNrF,M,aA5JpBnI,M,WACAinF,S,SACA0qB,a,SAiKJ,U,ssBC5Ie,MAAMG,UAAoB7pG,gBAQ9BC,YAAYC,GACfC,MAAMD,GADuB,8CAmBZ,KACjBG,KAAK8F,SAAS9F,KAAKypG,oBApBU,wBAuBT,CAAC5pG,EAAQG,KAAKH,SAClC,MAAM,sBAAC6pG,EAAD,cAAwBC,GAAiB9pG,EAEzC2Q,EAAiBk5F,GAAyB,GAEhD,MAAO,CACHx4F,QAASV,EAAeU,QACxBG,SAAUb,EAAea,SACzBC,KAAMd,EAAec,KACrBpY,MAAOsX,EAAetX,MACtBqY,SAASq4F,QAAQp5F,EAAee,SAAW,MAAOq4F,QAAQ,OAAS,GACnEl4F,WAAYlB,EAAekB,WAC3BtR,KAAMoQ,EAAepQ,KACrBypG,oBAAsC,MAAjBF,MApCI,4BAwCJphF,IACzB,MAAM2R,EAAS3R,EAAM2R,OAIf4vE,EAAgB,CAClB,CAJS5vE,EAAO95B,MACN85B,EAAOn5B,OAMrBf,KAAK8F,SAASgkG,GAEd,MAAM,cAAC9kB,GAAiBhlF,KAAKH,MACV,MAAfmlF,GACAA,EAAc,EAAD,OAAKhlF,KAAK9G,OAAU4wG,GAApB,IAAmC94F,KAAI,UAAEhR,KAAK+pG,QAAQ17D,eAAf,aAAE,EAAsB26D,gBArDnD,gCAyDAzgF,IACzBvoB,KAAKH,MAAMkpG,mBACX/oG,KAAKH,MAAMkpG,kBAAkBxgF,MA3DJ,4BA+DJyhF,IACzB,MAAMF,EAAgB,CAClB5wG,MAAO8wG,GAImB,MAF9BhqG,KAAK8F,SAASgkG,GAEV9pG,KAAKH,MAAMmlF,eACXhlF,KAAKH,MAAMmlF,cAAX,SAA6BhlF,KAAK9G,OAAU4wG,GAA5C,IAA2D94F,KAAI,UAAEhR,KAAK+pG,QAAQ17D,eAAf,aAAE,EAAsB26D,gBAtE9D,8BA0EF7sE,IAC3B,MAAM2tE,EAAgB,CAClBv4F,QAAS4qB,EAAOp7B,OAIU,MAF9Bf,KAAK8F,SAASgkG,GAEV9pG,KAAKH,MAAMmlF,eACXhlF,KAAKH,MAAMmlF,cAAX,SAA6BhlF,KAAK9G,OAAU4wG,GAA5C,IAA2D94F,KAAI,UAAEhR,KAAK+pG,QAAQ17D,eAAf,aAAE,EAAsB26D,gBAjF9D,iBAqFhB,KACb,MAAM,YAACiB,GAAejqG,KAAKH,MACV,MAAboqG,GACAA,EAAY,EAAD,KAAKjqG,KAAK9G,OAAV,IAAiB8X,KAAI,UAAEhR,KAAK+pG,QAAQ17D,eAAf,aAAE,EAAsB26D,gBAxF/B,8BA4FFzgF,IAC3BA,EAAMviB,iBACNhG,KAAK8F,SAAS,CAAC+jG,qBAAqB,OA3FpC7pG,KAAK+pG,QAAUpqG,cAEfK,KAAK9G,MAAQ8G,KAAKypG,cAAc5pG,GAG7Bo9B,mBAAmBC,GACS,MAA3BA,EAAUysE,eAAqD,MAA5B3pG,KAAKH,MAAM8pG,mBAKV3iG,IAApCk2B,EAAUwsE,4BAA4E1iG,IAArChH,KAAKH,MAAM6pG,uBAC5D1pG,KAAKkqG,aALLlqG,KAAKkqG,aAuFNzoG,SACH,MAAM,UAACT,EAAD,cAAY2oG,EAAZ,aAA2BQ,GAAgBnqG,KAAKH,OAChD,oBAACgqG,GAAuB7pG,KAAK9G,MAEnC,IAAIkxG,EACJ,GAAIP,EACAO,EACI,gBAAC,WAAD,KACI,uBAAKppG,UAAU,YACX,gBAAC,EAAD,CACIqoG,aAAcrpG,KAAK+pG,QACnBprB,UAAU,EACV5tC,OAAQ/wC,KAAK+wC,OACbg4D,kBAAmB/oG,KAAKqqG,yBAGhC,uBAAKrpG,UAAU,YACX,gBAAC,IAAD,CACIZ,KAAK,OACLvE,KAAK,OACLkF,MAAOf,KAAK9G,MAAMkH,KAClBH,SAAUD,KAAKolF,kBACfr0C,OAAQ/wC,KAAK+wC,OACblwC,YAAaoU,KACT,4BACA,gBAEJ0pE,UAAU,KAGlB,uBAAK39E,UAAU,iBACX,gBAAC,IAAD,CACIlJ,GAAG,+BACH+N,eAAe,qBAGvB,gBAAC,IAAD,CACI5F,SAAUD,KAAKsqG,oBACfvpG,MACIf,KAAK9G,MAAMqY,QAAU,CAACxQ,MAAOf,KAAK9G,MAAMqY,QAAS7P,MAAO1B,KAAK9G,MAAMqY,cAAWvK,EAElF3J,QAASktG,SAAeh5F,IAAD,CACnBxQ,MAAOwQ,EAAQnR,KACfsB,MAAO6P,EAAQnR,SAEnBkrD,OAAQr2C,KACJ,uBACA,WAEJpU,YAAaoU,KACT,uBACA,WAEJ7U,KAAM,qBAEV,uBAAKY,UAAU,YACX,gBAAC,IAAD,CACIZ,KAAK,UACLvE,KAAK,OACLkF,MAAOf,KAAK9G,MAAMgY,QAClBjR,SAAUD,KAAKolF,kBACfr0C,OAAQ/wC,KAAK+wC,OACblwC,YAAaoU,KACT,uBACA,WAEJ0pE,UAAU,KAGlB,uBAAK39E,UAAU,YACX,gBAAC,IAAD,CACIZ,KAAK,WACLvE,KAAK,OACLkF,MAAOf,KAAK9G,MAAMmY,SAClBpR,SAAUD,KAAKolF,kBACfr0C,OAAQ/wC,KAAK+wC,OACblwC,YAAaoU,KACT,yBACA,gBAIZ,uBAAKjU,UAAU,YACX,gBAAC,IAAD,CACIZ,KAAK,OACLvE,KAAK,OACLkF,MAAOf,KAAK9G,MAAMoY,KAClBrR,SAAUD,KAAKolF,kBACfr0C,OAAQ/wC,KAAK+wC,OACblwC,YAAaoU,KACT,oBACA,QAEJ0pE,UAAU,KAGlB,uBAAK39E,UAAU,YACX,uBAAKA,UAAU,6BACX,gBAAC,IAAD,CACIuQ,QAASvR,KAAK9G,MAAMqY,QACpBrY,MAAO8G,KAAK9G,MAAMA,MAClB+G,SAAUD,KAAKwqG,kBACfz5D,OAAQ/wC,KAAK+wC,UAGrB,uBAAK/vC,UAAU,oBACX,gBAAC,IAAD,CACIZ,KAAK,aACLvE,KAAK,OACLkF,MAAOf,KAAK9G,MAAMwY,WAClBzR,SAAUD,KAAKolF,kBACfr0C,OAAQ/wC,KAAK+wC,OACblwC,YAAaoU,KACT,uBACA,mBAEJ0pE,UAAU,MAIrBkrB,EAAsBM,EAAe,UAG3C,CACH,IAAIM,EAAkC,KAEtC,GAAId,EAAe,CACf,IAAIe,EACA,gBAAC,IAAD,CACI5yG,GAAG,8BACH+N,eAAe,yBAGnB8jG,EAAc3pE,YACd0qE,EACI,gBAAC,WAAD,KACI,gBAAC,IAAD,CAAW7qE,MAAO8pE,EAAc7pE,aADpC,yBAEuB6pE,EAAc3pE,WACjC,2BAHJ,kBAIgB2pE,EAAcxpE,UAJ9B,YAI2CwpE,EAAcrpE,YAIjE,IAAIqqE,EACA,yBACI,gBAAC,IAAD,CACI7yG,GAAG,kCACH+N,eAAe,8BAGvB7F,KAAK9G,MAAMA,QACXyxG,EACI,gBAAC,WAAD,KACK3qG,KAAK9G,MAAMgY,QACXlR,KAAK9G,MAAMmY,SACZ,2BAHJ,UAIQrR,KAAK9G,MAAMoY,KAJnB,aAI4BtR,KAAK9G,MAAMA,MAJvC,aAIiD8G,KAAK9G,MAAMqY,SACxD,2BACCvR,KAAK9G,MAAMwY,aAKxB+4F,EACI,gBAAC,WAAD,KACI,uBAAKzpG,UAAU,0BACV0pG,GAEL,uBAAK1pG,UAAU,6BACV2pG,IAMjBP,EACI,uBACItyG,GAAG,wBACHkJ,UAAU,qBAEV,uBAAKA,UAAU,2BACX,gBAAC,IAAD,CACIlJ,GAAG,oCACH+N,eAAe,0BAGtB4kG,EACD,0BACIzpG,UAAU,mCACVuJ,QAASvK,KAAK6pG,qBAEd,gBAAC,IAAD,CACI/xG,GAAG,qCACH+N,eAAe,4BAOnC,OACI,wBACI/N,GAAG,eACHkJ,UAAS,sBAAiBA,IAE1B,uBAAKA,UAAU,iBACX,gBAAC,IAAD,CACIlJ,GAAG,2BACH+N,eAAe,iBAGtBukG,I,EA5TIZ,E,aApBjBxoG,U,WAGA+nG,kB,SACA/jB,c,SACAilB,Y,SACAE,a,gBAciBX,E,eACK,CAClBoB,cAAc,EACd5pG,UAAW,M,6HC3CZ,MAAM6pG,EAAY,CACrB,CAACl9B,KAAM,KAAMvtE,KAAM,WACnB,CAACutE,KAAM,KAAMvtE,KAAM,UACnB,CAACutE,KAAM,KAAMvtE,KAAM,WACnB,CAACutE,KAAM,KAAMvtE,KAAM,YACnB,CAACutE,KAAM,KAAMvtE,KAAM,cACnB,CAACutE,KAAM,KAAMvtE,KAAM,YACnB,CAACutE,KAAM,KAAMvtE,KAAM,eACnB,CAACutE,KAAM,KAAMvtE,KAAM,YACnB,CAACutE,KAAM,KAAMvtE,KAAM,wBACnB,CAACutE,KAAM,KAAMvtE,KAAM,WACnB,CAACutE,KAAM,KAAMvtE,KAAM,WACnB,CAACutE,KAAM,KAAMvtE,KAAM,UACnB,CAACutE,KAAM,KAAMvtE,KAAM,SACnB,CAACutE,KAAM,KAAMvtE,KAAM,YACnB,CAACutE,KAAM,KAAMvtE,KAAM,WACnB,CAACutE,KAAM,KAAMvtE,KAAM,QACnB,CAACutE,KAAM,KAAMvtE,KAAM,UACnB,CAACutE,KAAM,KAAMvtE,KAAM,YACnB,CAACutE,KAAM,KAAMvtE,KAAM,aACnB,CAACutE,KAAM,KAAMvtE,KAAM,SACnB,CAACutE,KAAM,KAAMvtE,KAAM,YACnB,CAACutE,KAAM,KAAMvtE,KAAM,iBACnB,CAACutE,KAAM,KAAMvtE,KAAM,YACnB,CAACutE,KAAM,KAAMvtE,KAAM,aACnB,CAACutE,KAAM,KAAMvtE,KAAM,eACnB,CAACutE,KAAM,KAAMvtE,KAAM,YACnB,CAACutE,KAAM,KAAMvtE,KAAM,WACnB,CAACutE,KAAM,KAAMvtE,KAAM,YACnB,CAACutE,KAAM,KAAMvtE,KAAM,UACnB,CAACutE,KAAM,KAAMvtE,KAAM,iBACnB,CAACutE,KAAM,KAAMvtE,KAAM,cACnB,CAACutE,KAAM,KAAMvtE,KAAM,cACnB,CAACutE,KAAM,KAAMvtE,KAAM,YACnB,CAACutE,KAAM,KAAMvtE,KAAM,kBACnB,CAACutE,KAAM,KAAMvtE,KAAM,gBACnB,CAACutE,KAAM,KAAMvtE,KAAM,QACnB,CAACutE,KAAM,KAAMvtE,KAAM,YACnB,CAACutE,KAAM,KAAMvtE,KAAM,UACnB,CAACutE,KAAM,KAAMvtE,KAAM,gBACnB,CAACutE,KAAM,KAAMvtE,KAAM,eACnB,CAACutE,KAAM,KAAMvtE,KAAM,gBACnB,CAACutE,KAAM,KAAMv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","file":"764.50f96fe15c1f2d231c0a.js","sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport * as AdminActions from 'mattermost-redux/actions/admin';\nimport * as UserActions from 'mattermost-redux/actions/users';\nimport * as TeamActions from 'mattermost-redux/actions/teams';\nimport {Client4} from 'mattermost-redux/client';\nimport {bindClientFunc} from 'mattermost-redux/actions/helpers';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport {emitUserLoggedOutEvent} from 'actions/global_actions';\nimport {getOnNavigationConfirmed} from 'selectors/views/admin';\nimport store from 'stores/redux_store.jsx';\nimport {ActionTypes} from 'utils/constants';\n\nconst dispatch = store.dispatch;\nconst getState = store.getState;\n\nexport async function reloadConfig(success, error) {\n    const {data, error: err} = await dispatch(AdminActions.reloadConfig());\n    if (data && success) {\n        dispatch(AdminActions.getConfig());\n        dispatch(AdminActions.getEnvironmentConfig());\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function adminResetMfa(userId, success, error) {\n    const {data, error: err} = await UserActions.updateUserMfa(userId, false)(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function getClusterStatus(success, error) {\n    const {data, error: err} = await AdminActions.getClusterStatus()(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function ldapTest(success, error) {\n    const {data, error: err} = await AdminActions.testLdap()(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function invalidateAllCaches(success, error) {\n    const {data, error: err} = await AdminActions.invalidateCaches()(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function recycleDatabaseConnection(success, error) {\n    const {data, error: err} = await AdminActions.recycleDatabase()(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function adminResetEmail(user, success, error) {\n    const {data, error: err} = await UserActions.patchUser(user)(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function samlCertificateStatus(success, error) {\n    const {data, error: err} = await AdminActions.getSamlCertificateStatus()(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport function getOAuthAppInfo(clientId) {\n    return bindClientFunc({\n        clientFunc: Client4.getOAuthAppInfo,\n        params: [clientId],\n    });\n}\n\nexport function allowOAuth2({responseType, clientId, redirectUri, state, scope}) {\n    return bindClientFunc({\n        clientFunc: Client4.authorizeOAuthApp,\n        params: [responseType, clientId, redirectUri, state, scope],\n    });\n}\n\nexport async function emailToLdap(loginId, password, token, ldapId, ldapPassword, success, error) {\n    const {data, error: err} = await UserActions.switchEmailToLdap(loginId, password, ldapId, ldapPassword, token)(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function emailToOAuth(loginId, password, token, newType, success, error) {\n    const {data, error: err} = await UserActions.switchEmailToOAuth(newType, loginId, password, token)(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function oauthToEmail(currentService, email, password, success, error) {\n    const {data, error: err} = await UserActions.switchOAuthToEmail(currentService, email, password)(dispatch, getState);\n    if (data) {\n        if (data.follow_link) {\n            emitUserLoggedOutEvent(data.follow_link);\n        }\n        if (success) {\n            success(data);\n        }\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function uploadBrandImage(brandImage, success, error) {\n    const {data, error: err} = await AdminActions.uploadBrandImage(brandImage)(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function deleteBrandImage(success, error) {\n    const {data, error: err} = await AdminActions.deleteBrandImage()(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function uploadPublicSamlCertificate(file, success, error) {\n    const {data, error: err} = await AdminActions.uploadPublicSamlCertificate(file)(dispatch, getState);\n    if (data && success) {\n        success('saml-public.crt');\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function uploadPrivateSamlCertificate(file, success, error) {\n    const {data, error: err} = await AdminActions.uploadPrivateSamlCertificate(file)(dispatch, getState);\n    if (data && success) {\n        success('saml-private.key');\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function uploadPublicLdapCertificate(file, success, error) {\n    const {data, error: err} = await AdminActions.uploadPublicLdapCertificate(file)(dispatch, getState);\n    if (data && success) {\n        success('ldap-public.crt');\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\nexport async function uploadPrivateLdapCertificate(file, success, error) {\n    const {data, error: err} = await AdminActions.uploadPrivateLdapCertificate(file)(dispatch, getState);\n    if (data && success) {\n        success('ldap-private.key');\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function uploadIdpSamlCertificate(file, success, error) {\n    const {data, error: err} = await AdminActions.uploadIdpSamlCertificate(file)(dispatch, getState);\n    if (data && success) {\n        success('saml-idp.crt');\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function removePublicSamlCertificate(success, error) {\n    const {data, error: err} = await AdminActions.removePublicSamlCertificate()(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function removePrivateSamlCertificate(success, error) {\n    const {data, error: err} = await AdminActions.removePrivateSamlCertificate()(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function removePublicLdapCertificate(success, error) {\n    const {data, error: err} = await AdminActions.removePublicLdapCertificate()(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function removePrivateLdapCertificate(success, error) {\n    const {data, error: err} = await AdminActions.removePrivateLdapCertificate()(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function removeIdpSamlCertificate(success, error) {\n    const {data, error: err} = await AdminActions.removeIdpSamlCertificate()(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function getStandardAnalytics(teamId) {\n    await AdminActions.getStandardAnalytics(teamId)(dispatch, getState);\n}\n\nexport async function getAdvancedAnalytics(teamId) {\n    await AdminActions.getAdvancedAnalytics(teamId)(dispatch, getState);\n}\n\nexport async function getBotPostsPerDayAnalytics(teamId) {\n    await AdminActions.getBotPostsPerDayAnalytics(teamId)(dispatch, getState);\n}\n\nexport async function getPostsPerDayAnalytics(teamId) {\n    await AdminActions.getPostsPerDayAnalytics(teamId)(dispatch, getState);\n}\n\nexport async function getUsersPerDayAnalytics(teamId) {\n    await AdminActions.getUsersPerDayAnalytics(teamId)(dispatch, getState);\n}\n\nexport async function elasticsearchTest(config, success, error) {\n    const {data, error: err} = await AdminActions.testElasticsearch(config)(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function testS3Connection(success, error) {\n    const {data, error: err} = await AdminActions.testS3Connection()(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function elasticsearchPurgeIndexes(success, error) {\n    const {data, error: err} = await AdminActions.purgeElasticsearchIndexes()(dispatch, getState);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function blevePurgeIndexes(success, error) {\n    const purgeBleveIndexes = bindClientFunc({\n        clientFunc: Client4.purgeBleveIndexes,\n        params: [],\n    });\n\n    const {data, error: err} = await dispatch(purgeBleveIndexes);\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport function setNavigationBlocked(blocked) {\n    return {\n        type: ActionTypes.SET_NAVIGATION_BLOCKED,\n        blocked,\n    };\n}\n\nexport function deferNavigation(onNavigationConfirmed) {\n    return {\n        type: ActionTypes.DEFER_NAVIGATION,\n        onNavigationConfirmed,\n    };\n}\n\nexport function cancelNavigation() {\n    return {\n        type: ActionTypes.CANCEL_NAVIGATION,\n    };\n}\n\nexport function confirmNavigation() {\n    // have to rename these because of lint no-shadow\n    return (thunkDispatch, thunkGetState) => {\n        const callback = getOnNavigationConfirmed(thunkGetState());\n\n        if (callback) {\n            callback();\n        }\n\n        thunkDispatch({\n            type: ActionTypes.CONFIRM_NAVIGATION,\n        });\n    };\n}\n\nexport async function invalidateAllEmailInvites(success, error) {\n    const {data, error: err} = await dispatch(TeamActions.invalidateAllEmailInvites());\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function testSmtp(success, error) {\n    const {data, error: err} = await dispatch(AdminActions.testEmail());\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport function registerAdminConsolePlugin(pluginId, reducer) {\n    return (storeDispatch) => {\n        storeDispatch({\n            type: ActionTypes.RECEIVED_ADMIN_CONSOLE_REDUCER,\n            data: {\n                pluginId,\n                reducer,\n            },\n        });\n    };\n}\n\nexport function unregisterAdminConsolePlugin(pluginId) {\n    return (storeDispatch) => {\n        storeDispatch({\n            type: ActionTypes.REMOVED_ADMIN_CONSOLE_REDUCER,\n            data: {\n                pluginId,\n            },\n        });\n    };\n}\n\nexport async function testSiteURL(success, error, siteURL) {\n    const {data, error: err} = await dispatch(AdminActions.testSiteURL(siteURL));\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport function registerAdminConsoleCustomSetting(pluginId, key, component, {showTitle}) {\n    return (storeDispatch) => {\n        storeDispatch({\n            type: ActionTypes.RECEIVED_ADMIN_CONSOLE_CUSTOM_COMPONENT,\n            data: {\n                pluginId,\n                key,\n                component,\n                options: {showTitle},\n            },\n        });\n    };\n}\n\nexport async function getSamlMetadataFromIdp(success, error, samlMetadataURL) {\n    const {data, error: err} = await dispatch(AdminActions.getSamlMetadataFromIdp(samlMetadataURL));\n    if (data && success) {\n        success(data);\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport async function setSamlIdpCertificateFromMetadata(success, error, certData) {\n    const {data, error: err} = await AdminActions.setSamlIdpCertificateFromMetadata(certData)(dispatch, getState);\n    if (data && success) {\n        success('saml-idp.crt');\n    } else if (err && error) {\n        error({id: err.server_error_id, ...err});\n    }\n}\n\nexport function upgradeToE0() {\n    return async () => {\n        trackEvent('api', 'upgrade_to_e0_requested');\n        const data = await Client4.upgradeToEnterprise();\n        return data;\n    };\n}\n\nexport function upgradeToE0Status() {\n    return async () => {\n        const data = await Client4.upgradeToEnterpriseStatus();\n        return data;\n    };\n}\n\nexport function restartServer() {\n    return async () => {\n        const data = await Client4.restartServer();\n        return data;\n    };\n}\n\nexport function ping() {\n    return async () => {\n        const data = await Client4.ping();\n        return data;\n    };\n}\n\nexport function requestTrialLicense(users, termsAccepted, receiveEmailsAccepted, page) {\n    return async () => {\n        try {\n            trackEvent('api', 'api_request_trial_license', {from_page: page});\n            const response = await Client4.doFetch(`${Client4.getBaseRoute()}/trial-license`, {\n                method: 'POST', body: JSON.stringify({users, terms_accepted: termsAccepted, receive_emails_accepted: receiveEmailsAccepted}),\n            });\n            return {data: response};\n        } catch (e) {\n            return {error: e.message};\n        }\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport ReactSelect from 'react-select';\nimport {Props as AsyncSelectProps} from 'react-select/async';\n\nimport {AppField, AppSelectOption} from 'mattermost-redux/types/apps';\n\nconst AsyncSelect = require('react-select/lib/Async').default as React.ElementType<AsyncSelectProps<AppSelectOption>>; // eslint-disable-line global-require\n\nexport type Props = {\n    field: AppField;\n    label: React.ReactNode;\n    helpText: React.ReactNode;\n    value: AppSelectOption | null;\n    onChange: (value: AppSelectOption) => void;\n    performLookup: (name: string, userInput: string) => Promise<AppSelectOption[]>;\n};\n\nexport type State = {\n    refreshNonce: string;\n    field: AppField;\n}\n\nconst reactStyles = {\n    menuPortal: (provided: React.CSSProperties) => ({\n        ...provided,\n        zIndex: 9999,\n    }),\n};\n\nconst commonProps = {\n    isClearable: true,\n    openMenuOnFocus: false,\n    classNamePrefix: 'react-select-auto react-select',\n    menuPortalTarget: document.body,\n    styles: reactStyles,\n};\n\nexport default class AppsFormSelectField extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            field: props.field,\n            refreshNonce: Math.random().toString(),\n        };\n    }\n    static getDerivedStateFromProps(nextProps: Props, prevState: State) {\n        if (nextProps.field !== prevState.field) {\n            return {\n                field: nextProps.field,\n                refreshNonce: Math.random().toString(),\n            };\n        }\n\n        return null;\n    }\n\n    onChange = (selectedOption: AppSelectOption) => {\n        this.props.onChange(selectedOption);\n    }\n\n    loadDynamicOptions = async (userInput: string): Promise<AppSelectOption[]> => {\n        return this.props.performLookup(this.props.field.name, userInput);\n    }\n\n    renderDynamicSelect() {\n        const {field} = this.props;\n        const placeholder = field.hint || '';\n        const value = this.props.value;\n\n        return (\n            <div className={'react-select'}>\n                <AsyncSelect\n                    id={`MultiInput_${field.name}`}\n                    loadOptions={this.loadDynamicOptions}\n                    defaultOptions={true}\n                    isMulti={field.multiselect || false}\n                    placeholder={placeholder}\n                    value={value}\n                    onChange={this.onChange as any} // types are not working correctly for multiselect\n                    isDisabled={field.readonly}\n                    {...commonProps}\n                />\n            </div>\n        );\n    }\n\n    renderStaticSelect() {\n        const {field} = this.props;\n\n        const placeholder = field.hint || '';\n\n        const options = field.options;\n        const value = this.props.value;\n\n        return (\n            <div className={'react-select'}>\n                <ReactSelect\n                    id={`MultiInput_${field.name}`}\n                    options={options}\n                    isMulti={field.multiselect || false}\n                    placeholder={placeholder}\n                    value={value}\n                    onChange={this.onChange as any} // types are not working correctly for multiselect\n                    isDisabled={field.readonly}\n                    {...commonProps}\n                />\n            </div>\n        );\n    }\n\n    render() {\n        const {field, label, helpText} = this.props;\n\n        let selectComponent;\n        if (field.type === 'dynamic_select') {\n            selectComponent = this.renderDynamicSelect();\n        } else if (field.type === 'static_select') {\n            selectComponent = this.renderStaticSelect();\n        } else {\n            return null;\n        }\n\n        return (\n            <div className='form-group'>\n                <label>\n                    {label}\n                </label>\n                <React.Fragment key={this.state.refreshNonce}>\n                    {selectComponent}\n                    <div className='help-text'>\n                        {helpText}\n                    </div>\n                </React.Fragment>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {AppField, AppSelectOption} from 'mattermost-redux/types/apps';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport {AppFieldTypes} from 'mattermost-redux/constants/apps';\nimport {displayUsername} from 'mattermost-redux/utils/user_utils';\n\nimport GenericUserProvider from 'components/suggestion/generic_user_provider.jsx';\nimport GenericChannelProvider from 'components/suggestion/generic_channel_provider.jsx';\n\nimport TextSetting, {InputTypes} from 'components/widgets/settings/text_setting';\nimport AutocompleteSelector from 'components/autocomplete_selector';\nimport ModalSuggestionList from 'components/suggestion/modal_suggestion_list.jsx';\nimport BoolSetting from 'components/widgets/settings/bool_setting';\nimport Provider from 'components/suggestion/provider';\n\nimport Markdown from 'components/markdown';\n\nimport AppsFormSelectField from './apps_form_select_field';\n\nconst TEXT_DEFAULT_MAX_LENGTH = 150;\nconst TEXTAREA_DEFAULT_MAX_LENGTH = 3000;\n\nexport interface Props {\n    field: AppField;\n    name: string;\n    errorText?: React.ReactNode;\n    teammateNameDisplay?: string;\n\n    value: AppSelectOption | string | boolean | number | null;\n    onChange: (name: string, value: any) => void;\n    autoFocus?: boolean;\n    listComponent?: React.ComponentProps<typeof AutocompleteSelector>['listComponent'];\n    performLookup: (name: string, userInput: string) => Promise<AppSelectOption[]>;\n    actions: {\n        autocompleteChannels: (term: string, success: (channels: Channel[]) => void, error: () => void) => (dispatch: any, getState: any) => Promise<void>;\n        autocompleteUsers: (search: string) => Promise<UserProfile[]>;\n    };\n}\n\nexport default class AppsFormField extends React.PureComponent<Props> {\n    private providers: Provider[] = [];\n\n    static defaultProps = {\n        listComponent: ModalSuggestionList,\n    };\n\n    constructor(props: Props) {\n        super(props);\n        this.setProviders();\n    }\n\n    handleSelected = (selected: AppSelectOption | UserProfile | Channel) => {\n        const {name, field, onChange} = this.props;\n\n        if (field.type === AppFieldTypes.USER) {\n            const user = selected as UserProfile;\n            let selectedLabel = user.username;\n            if (this.props.teammateNameDisplay) {\n                selectedLabel = displayUsername(user, this.props.teammateNameDisplay);\n            }\n            const option = {label: selectedLabel, value: user.id};\n            onChange(name, option);\n        } else if (field.type === AppFieldTypes.CHANNEL) {\n            const channel = selected as Channel;\n            const option = {label: channel.display_name, value: channel.id};\n            onChange(name, option);\n        } else {\n            const option = selected as AppSelectOption;\n            onChange(name, option);\n        }\n    }\n\n    setProviders = () => {\n        const {actions, field} = this.props;\n\n        let providers: Provider[] = [];\n        if (field.type === AppFieldTypes.USER) {\n            providers = [new GenericUserProvider(actions.autocompleteUsers)];\n        } else if (field.type === AppFieldTypes.CHANNEL) {\n            providers = [new GenericChannelProvider(actions.autocompleteChannels)];\n        }\n\n        this.providers = providers;\n    }\n\n    render() {\n        const {\n            field,\n            name,\n            value,\n            onChange,\n            errorText,\n            listComponent,\n        } = this.props;\n\n        const placeholder = field.hint || '';\n\n        const displayName = (field.modal_label || field.label) as string;\n        let displayNameContent: React.ReactNode = (field.modal_label || field.label) as string;\n        if (field.is_required) {\n            displayNameContent = (\n                <React.Fragment>\n                    {displayName}\n                    <span className='error-text'>{' *'}</span>\n                </React.Fragment>\n            );\n        }\n\n        const helpText = field.description;\n        let helpTextContent: React.ReactNode = <Markdown message={helpText}/>;\n        if (errorText) {\n            helpTextContent = (\n                <React.Fragment>\n                    <Markdown message={helpText}/>\n                    <div className='error-text mt-3'>\n                        {errorText}\n                    </div>\n                </React.Fragment>\n            );\n        }\n\n        switch (field.type) {\n        case AppFieldTypes.TEXT: {\n            const subtype = field.subtype || 'text';\n\n            let maxLength = field.max_length;\n            if (!maxLength) {\n                if (subtype === 'textarea') {\n                    maxLength = TEXTAREA_DEFAULT_MAX_LENGTH;\n                } else {\n                    maxLength = TEXT_DEFAULT_MAX_LENGTH;\n                }\n            }\n\n            let textType: InputTypes = 'input';\n            if (subtype && TextSetting.validTypes.includes(subtype)) {\n                textType = subtype as InputTypes;\n            }\n\n            const textValue = value as string;\n            return (\n                <TextSetting\n                    autoFocus={this.props.autoFocus}\n                    id={name}\n                    disabled={field.readonly}\n                    type={textType}\n                    label={displayNameContent}\n                    maxLength={maxLength}\n                    value={textValue || ''}\n                    placeholder={placeholder}\n                    helpText={helpTextContent}\n                    onChange={onChange}\n                    resizable={false}\n                />\n            );\n        }\n        case AppFieldTypes.CHANNEL:\n        case AppFieldTypes.USER: {\n            let selectedValue: string | undefined;\n            if (this.props.value) {\n                selectedValue = (this.props.value as AppSelectOption).label;\n            }\n            return (\n                <AutocompleteSelector\n                    id={name}\n                    disabled={field.readonly}\n                    providers={this.providers}\n                    onSelected={this.handleSelected}\n                    label={displayNameContent}\n                    helpText={helpTextContent}\n                    placeholder={placeholder}\n                    value={selectedValue}\n                    listComponent={listComponent}\n                />\n            );\n        }\n        case AppFieldTypes.STATIC_SELECT:\n        case AppFieldTypes.DYNAMIC_SELECT: {\n            return (\n                <AppsFormSelectField\n                    {...this.props}\n                    field={field}\n                    label={displayNameContent}\n                    helpText={helpTextContent}\n                    onChange={this.handleSelected}\n                    value={this.props.value as AppSelectOption | null}\n                />\n            );\n        }\n        case AppFieldTypes.BOOL: {\n            const boolValue = value as boolean;\n            return (\n                <BoolSetting\n                    autoFocus={this.props.autoFocus}\n                    id={name}\n                    disabled={field.readonly}\n                    label={displayNameContent}\n                    value={boolValue || false}\n                    helpText={helpTextContent}\n                    placeholder={placeholder}\n                    onChange={onChange}\n                />\n            );\n        }\n        case AppFieldTypes.MARKDOWN: {\n            return (\n                <Markdown\n                    message={field.description}\n                />\n            );\n        }\n        }\n\n        return null;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport {getTeammateNameDisplaySetting} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport {autocompleteChannels} from 'actions/channel_actions';\nimport {autocompleteUsers} from 'actions/user_actions';\n\nimport AppsFormField from './apps_form_field';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        teammateNameDisplay: getTeammateNameDisplaySetting(state),\n    };\n}\ntype Actions = {\n    autocompleteChannels: (term: string, success: (channels: Channel[]) => void, error: () => void) => (dispatch: any, getState: any) => Promise<void>;\n    autocompleteUsers: (search: string) => Promise<UserProfile[]>;\n};\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            autocompleteChannels,\n            autocompleteUsers,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AppsFormField);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport Markdown from 'components/markdown';\n\ntype Props = {\n    id?: string;\n    value: string;\n};\n\nconst markdownOptions = {singleline: false, mentionHighlight: false};\n\nconst AppsFormHeader: React.FC<Props> = (props: Props) => {\n    return (\n        <Markdown\n            message={props.value}\n            options={markdownOptions}\n        />\n    );\n};\n\nexport default AppsFormHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage, injectIntl, WrappedComponentProps} from 'react-intl';\n\nimport {\n    checkDialogElementForError, checkIfErrorsMatchElements,\n} from 'mattermost-redux/utils/integration_utils';\nimport {AppCallResponse, AppField, AppForm, AppFormValues, AppSelectOption, FormResponseData, AppLookupResponse, AppFormValue} from 'mattermost-redux/types/apps';\nimport {DialogElement} from 'mattermost-redux/types/integrations';\nimport {AppCallResponseTypes, AppFieldTypes} from 'mattermost-redux/constants/apps';\n\nimport {DoAppCallResult} from 'types/apps';\n\nimport SpinnerButton from 'components/spinner_button';\nimport SuggestionList from 'components/suggestion/suggestion_list';\nimport ModalSuggestionList from 'components/suggestion/modal_suggestion_list';\n\nimport {localizeMessage} from 'utils/utils.jsx';\n\nimport {filterEmptyOptions} from 'utils/apps';\nimport Markdown from 'components/markdown';\n\nimport AppsFormField from './apps_form_field';\nimport AppsFormHeader from './apps_form_header';\n\nexport type AppsFormProps = {\n    form: AppForm;\n    isEmbedded?: boolean;\n    onHide: () => void;\n    actions: {\n        submit: (submission: {\n            values: AppFormValues;\n        }) => Promise<DoAppCallResult<FormResponseData>>;\n        performLookupCall: (field: AppField, values: AppFormValues, userInput: string) => Promise<DoAppCallResult<AppLookupResponse>>;\n        refreshOnSelect: (field: AppField, values: AppFormValues) => Promise<DoAppCallResult<FormResponseData>>;\n    };\n}\n\nexport type Props = AppsFormProps & WrappedComponentProps<'intl'>;\n\nexport type State = {\n    show: boolean;\n    values: AppFormValues;\n    formError: string | null;\n    fieldErrors: {[name: string]: React.ReactNode};\n    submitting: boolean;\n    form: AppForm;\n}\n\nconst initFormValues = (form: AppForm): AppFormValues => {\n    const values: AppFormValues = {};\n    if (form && form.fields) {\n        form.fields.forEach((f) => {\n            let defaultValue: AppFormValue = null;\n            if (f.type === AppFieldTypes.BOOL) {\n                defaultValue = false;\n            }\n\n            values[f.name] = f.value || defaultValue;\n        });\n    }\n\n    return values;\n};\n\nexport class AppsForm extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        const {form} = props;\n        const values = initFormValues(form);\n\n        this.state = {\n            show: true,\n            values,\n            formError: null,\n            fieldErrors: {},\n            submitting: false,\n            form,\n        };\n    }\n\n    static getDerivedStateFromProps(nextProps: Props, prevState: State) {\n        if (nextProps.form !== prevState.form) {\n            return {\n                values: initFormValues(nextProps.form),\n                form: nextProps.form,\n            };\n        }\n\n        return null;\n    }\n\n    updateErrors = (elements: DialogElement[], fieldErrors?: {[x: string]: string}, formError?: string): boolean => {\n        let hasErrors = false;\n        const state = {} as State;\n\n        if (formError) {\n            hasErrors = true;\n            state.formError = formError;\n        }\n\n        if (fieldErrors && Object.keys(fieldErrors).length >= 0) {\n            hasErrors = true;\n            if (checkIfErrorsMatchElements(fieldErrors as any, elements)) {\n                state.fieldErrors = {};\n                for (const [key, value] of Object.entries(fieldErrors)) {\n                    state.fieldErrors[key] = (<Markdown message={value}/>);\n                }\n            } else if (!state.formError) {\n                const field = Object.keys(fieldErrors)[0];\n                state.formError = this.props.intl.formatMessage({\n                    id: 'apps.error.responses.unknown_field_error',\n                    defaultMessage: 'Received an error for an unknown field. Field name: `{field}`. Error:\\n{error}',\n                }, {\n                    field,\n                    error: fieldErrors[field],\n                });\n            }\n        }\n\n        if (hasErrors) {\n            this.setState(state);\n        }\n\n        return hasErrors;\n    }\n\n    handleSubmit = async (e: React.FormEvent, submitName?: string, value?: string) => {\n        e.preventDefault();\n\n        const {fields} = this.props.form;\n        const values = this.state.values;\n        if (submitName && value) {\n            values[submitName] = value;\n        }\n\n        const fieldErrors: {[name: string]: React.ReactNode} = {};\n\n        const elements = fieldsAsElements(fields);\n        elements?.forEach((element) => {\n            const error = checkDialogElementForError( // TODO: make sure all required values are present in `element`\n                element,\n                values[element.name],\n            );\n            if (error) {\n                fieldErrors[element.name] = (\n                    <FormattedMessage\n                        id={error.id}\n                        defaultMessage={error.defaultMessage}\n                        values={error.values}\n                    />\n                );\n            }\n        });\n\n        this.setState({fieldErrors});\n        if (Object.keys(fieldErrors).length !== 0) {\n            return;\n        }\n\n        const submission = {\n            values,\n        };\n\n        this.setState({submitting: true});\n\n        const res = await this.props.actions.submit(submission);\n\n        this.setState({submitting: false});\n\n        if (res.error) {\n            const errorResponse = res.error;\n            const errorMessage = errorResponse.error;\n            const hasErrors = this.updateErrors(elements, errorResponse.data?.errors, errorMessage);\n            if (!hasErrors) {\n                this.handleHide(false);\n            }\n            return;\n        }\n\n        const callResponse = res.data as AppCallResponse<FormResponseData>;\n\n        let hasErrors = false;\n        let updatedForm = false;\n        switch (callResponse.type) {\n        case AppCallResponseTypes.FORM:\n            updatedForm = true;\n            break;\n        case AppCallResponseTypes.OK:\n        case AppCallResponseTypes.NAVIGATE:\n            break;\n        default:\n            hasErrors = true;\n            this.updateErrors([], undefined, this.props.intl.formatMessage({\n                id: 'apps.error.responses.unknown_type',\n                defaultMessage: 'App response type not supported. Response type: {type}.',\n            }, {\n                type: callResponse.type,\n            }));\n        }\n\n        if (!hasErrors && !updatedForm) {\n            this.handleHide(true);\n            return;\n        }\n\n        this.setState({submitting: false});\n    };\n\n    performLookup = async (name: string, userInput: string): Promise<AppSelectOption[]> => {\n        const intl = this.props.intl;\n        const field = this.props.form.fields.find((f) => f.name === name);\n        if (!field) {\n            return [];\n        }\n\n        const res = await this.props.actions.performLookupCall(field, this.state.values, userInput);\n        if (res.error) {\n            const errorResponse = res.error;\n            const errMsg = errorResponse.error || intl.formatMessage({\n                id: 'apps.error.unknown',\n                defaultMessage: 'Unknown error.',\n            });\n            this.setState({\n                fieldErrors: {\n                    ...this.state.fieldErrors,\n                    [field.name]: errMsg,\n                },\n            });\n            return [];\n        }\n\n        const callResp = res.data!;\n        switch (callResp.type) {\n        case AppCallResponseTypes.OK: {\n            let items = callResp.data?.items || [];\n            items = items?.filter(filterEmptyOptions);\n            return items;\n        }\n        case AppCallResponseTypes.FORM:\n        case AppCallResponseTypes.NAVIGATE: {\n            const errMsg = intl.formatMessage({\n                id: 'apps.error.responses.unexpected_type',\n                defaultMessage: 'App response type was not expected. Response type: {type}.',\n            }, {\n                type: callResp.type,\n            },\n            );\n            this.setState({\n                fieldErrors: {\n                    ...this.state.fieldErrors,\n                    [field.name]: errMsg,\n                },\n            });\n            return [];\n        }\n        default: {\n            const errMsg = intl.formatMessage({\n                id: 'apps.error.responses.unknown_type',\n                defaultMessage: 'App response type not supported. Response type: {type}.',\n            }, {\n                type: callResp.type,\n            },\n            );\n            this.setState({\n                fieldErrors: {\n                    ...this.state.fieldErrors,\n                    [field.name]: errMsg,\n                },\n            });\n            return [];\n        }\n        }\n    }\n\n    onHide = () => {\n        this.handleHide(false);\n    };\n\n    handleHide = (submitted = false) => {\n        const {form} = this.props;\n\n        if (!submitted && form.submit_on_cancel) {\n            // const dialog = {\n            //     url,\n            //     callback_id: callbackId,\n            //     state,\n            //     cancelled: true,\n            // };\n\n            // this.props.actions.submit(dialog);\n        }\n\n        this.setState({show: false});\n    };\n\n    onChange = (name: string, value: any) => {\n        const field = this.props.form.fields.find((f) => f.name === name);\n        if (!field) {\n            return;\n        }\n\n        const values = {...this.state.values, [name]: value};\n\n        if (field.refresh) {\n            this.props.actions.refreshOnSelect(field, values).then((res) => {\n                if (res.error) {\n                    const errorResponse = res.error;\n                    const errorMsg = errorResponse.error;\n                    const errors = errorResponse.data?.errors;\n                    const elements = fieldsAsElements(this.props.form.fields);\n                    this.updateErrors(elements, errors, errorMsg);\n                    return;\n                }\n\n                const callResponse = res.data!;\n                switch (callResponse.type) {\n                case AppCallResponseTypes.FORM:\n                    return;\n                case AppCallResponseTypes.OK:\n                case AppCallResponseTypes.NAVIGATE:\n                    this.updateErrors([], undefined, this.props.intl.formatMessage({\n                        id: 'apps.error.responses.unexpected_type',\n                        defaultMessage: 'App response type was not expected. Response type: {type}.',\n                    }, {\n                        type: callResponse.type,\n                    }));\n                    return;\n                default:\n                    this.updateErrors([], undefined, this.props.intl.formatMessage({\n                        id: 'apps.error.responses.unknown_type',\n                        defaultMessage: 'App response type not supported. Response type: {type}.',\n                    }, {\n                        type: callResponse.type,\n                    }));\n                }\n            });\n        }\n\n        this.setState({values});\n    };\n\n    renderModal() {\n        const {fields, header} = this.props.form;\n\n        return (\n            <Modal\n                id='appsModal'\n                dialogClassName='a11y__modal about-modal'\n                show={this.state.show}\n                onHide={this.onHide}\n                onExited={this.props.onHide}\n                backdrop='static'\n                role='dialog'\n                aria-labelledby='appsModalLabel'\n            >\n                <form\n                    onSubmit={this.handleSubmit}\n                    autoComplete={'off'}\n                >\n                    <Modal.Header\n                        closeButton={true}\n                        style={{borderBottom: fields && fields.length ? '' : '0px'}}\n                    >\n                        <Modal.Title\n                            componentClass='h1'\n                            id='appsModalLabel'\n                        >\n                            {this.renderHeader()}\n                        </Modal.Title>\n                    </Modal.Header>\n                    {(fields || header) && (\n                        <Modal.Body>\n                            {this.renderBody()}\n                        </Modal.Body>\n                    )}\n                    <Modal.Footer>\n                        {this.renderFooter()}\n                    </Modal.Footer>\n                </form>\n            </Modal>\n        );\n    }\n\n    renderEmbedded() {\n        const {fields, header} = this.props.form;\n\n        return (\n            <form onSubmit={this.handleSubmit}>\n                <div>\n                    {this.renderHeader()}\n                </div>\n                {(fields || header) && (\n                    <div>\n                        {this.renderBody()}\n                    </div>\n                )}\n                <div>\n                    {this.renderFooter()}\n                </div>\n            </form>\n        );\n    }\n\n    renderHeader() {\n        const {\n            title,\n            icon,\n        } = this.props.form;\n\n        let iconComponent;\n        if (icon) {\n            iconComponent = (\n                <img\n                    id='appsModalIconUrl'\n                    alt={'modal title icon'}\n                    className='more-modal__image'\n                    width='36'\n                    height='36'\n                    src={icon}\n                />\n            );\n        }\n\n        return (\n            <React.Fragment>\n                {iconComponent}\n                {title}\n            </React.Fragment>\n        );\n    }\n\n    renderElements() {\n        const {isEmbedded, form} = this.props;\n\n        const {fields} = form;\n        if (!fields) {\n            return null;\n        }\n\n        return fields.filter((f) => f.name !== form.submit_buttons).map((field, index) => {\n            return (\n                <AppsFormField\n                    field={field}\n                    key={field.name}\n                    autoFocus={index === 0}\n                    name={field.name}\n                    errorText={this.state.fieldErrors[field.name]}\n                    value={this.state.values[field.name]}\n                    performLookup={this.performLookup}\n                    onChange={this.onChange}\n                    listComponent={isEmbedded ? SuggestionList : ModalSuggestionList}\n                />\n            );\n        });\n    }\n\n    renderBody() {\n        const {fields, header} = this.props.form;\n\n        return (fields || header) && (\n            <React.Fragment>\n                {header && (\n                    <AppsFormHeader\n                        id='appsModalHeader'\n                        value={header}\n                    />\n                )}\n                {this.renderElements()}\n            </React.Fragment>\n        );\n    }\n\n    renderFooter() {\n        const {fields} = this.props.form;\n\n        const submitText: React.ReactNode = (\n            <FormattedMessage\n                id='interactive_dialog.submit'\n                defaultMessage='Submit'\n            />\n        );\n\n        let submitButtons = [(\n            <SpinnerButton\n                id='appsModalSubmit'\n                key='submit'\n                type='submit'\n                autoFocus={!fields || fields.length === 0}\n                className='btn btn-primary save-button'\n                spinning={this.state.submitting}\n                spinningText={localizeMessage(\n                    'interactive_dialog.submitting',\n                    'Submitting...',\n                )}\n            >\n                {submitText}\n            </SpinnerButton>\n        )];\n\n        if (this.props.form.submit_buttons) {\n            const field = fields?.find((f) => f.name === this.props.form.submit_buttons);\n            if (field) {\n                const buttons = field.options?.map((o) => (\n                    <SpinnerButton\n                        id={'appsModalSubmit' + o.value}\n                        key={o.value}\n                        type='submit'\n                        className='btn btn-primary save-button'\n                        spinningText={localizeMessage(\n                            'interactive_dialog.submitting',\n                            'Submitting...',\n                        )}\n                        onClick={(e: React.MouseEvent) => this.handleSubmit(e, field.name, o.value)}\n                    >\n                        {o.label}\n                    </SpinnerButton>\n                ));\n                if (buttons) {\n                    submitButtons = buttons;\n                }\n            }\n        }\n\n        return (\n            <React.Fragment>\n                {this.state.formError && (\n                    <div className='error-text'>\n                        <Markdown message={this.state.formError}/>\n                    </div>\n                )}\n                <button\n                    id='appsModalCancel'\n                    type='button'\n                    className='btn btn-link cancel-button'\n                    onClick={this.onHide}\n                >\n                    <FormattedMessage\n                        id='interactive_dialog.cancel'\n                        defaultMessage='Cancel'\n                    />\n                </button>\n                {submitButtons}\n            </React.Fragment>\n        );\n    }\n\n    render() {\n        return this.props.isEmbedded ? this.renderEmbedded() : this.renderModal();\n    }\n}\n\nfunction fieldsAsElements(fields?: AppField[]): DialogElement[] {\n    return fields?.map((f) => ({\n        name: f.name,\n        type: f.type,\n        subtype: f.subtype,\n        optional: !f.is_required,\n    })) as DialogElement[];\n}\n\nexport default injectIntl(AppsForm);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {injectIntl, IntlShape} from 'react-intl';\n\nimport {AppField, AppForm, AppFormValues, AppCallRequest, FormResponseData, AppLookupResponse} from 'mattermost-redux/types/apps';\nimport {AppCallTypes, AppCallResponseTypes} from 'mattermost-redux/constants/apps';\n\nimport {DoAppCall, DoAppCallResult, PostEphemeralCallResponseForContext} from 'types/apps';\nimport {makeCallErrorResponse} from 'utils/apps';\n\nimport AppsForm from './apps_form_component';\n\ntype Props = {\n    intl: IntlShape;\n    form?: AppForm;\n    call?: AppCallRequest;\n    onHide: () => void;\n    actions: {\n        doAppCall: DoAppCall<any>;\n        postEphemeralCallResponseForContext: PostEphemeralCallResponseForContext;\n    };\n};\n\ntype State = {\n    form?: AppForm;\n}\n\nclass AppsFormContainer extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        this.state = {form: props.form};\n    }\n\n    submitForm = async (submission: {values: AppFormValues}): Promise<DoAppCallResult<FormResponseData>> => {\n        //TODO use FormResponseData instead of Any\n        const makeErrorMsg = (msg: string) => {\n            return this.props.intl.formatMessage(\n                {\n                    id: 'apps.error.form.submit.pretext',\n                    defaultMessage: 'There has been an error submitting the modal. Contact the app developer. Details: {details}',\n                },\n                {details: msg},\n            );\n        };\n        const {form} = this.state;\n        if (!form) {\n            const errMsg = this.props.intl.formatMessage({id: 'apps.error.form.no_form', defaultMessage: '`form` is not defined'});\n            return {error: makeCallErrorResponse(makeErrorMsg(errMsg))};\n        }\n\n        const call = this.getCall();\n        if (!call) {\n            const errMsg = this.props.intl.formatMessage({id: 'apps.error.form.no_call', defaultMessage: '`call` is not defined'});\n            return {error: makeCallErrorResponse(makeErrorMsg(errMsg))};\n        }\n\n        const res = await this.props.actions.doAppCall({\n            ...call,\n            values: submission.values,\n        }, AppCallTypes.SUBMIT, this.props.intl) as DoAppCallResult<FormResponseData>;\n\n        if (res.error) {\n            return res;\n        }\n\n        const callResp = res.data!;\n        switch (callResp.type) {\n        case AppCallResponseTypes.OK:\n            if (callResp.markdown) {\n                this.props.actions.postEphemeralCallResponseForContext(\n                    callResp,\n                    callResp.markdown,\n                    call.context,\n                );\n            }\n            break;\n        case AppCallResponseTypes.FORM:\n            this.setState({form: callResp.form});\n            break;\n        case AppCallResponseTypes.NAVIGATE:\n        default:\n            return {error: makeCallErrorResponse(makeErrorMsg(this.props.intl.formatMessage(\n                {\n                    id: 'apps.error.responses.unknown_type',\n                    defaultMessage: 'App response type not supported. Response type: {type}.',\n                }, {\n                    type: callResp.type,\n                },\n            )))};\n        }\n        return res;\n    };\n\n    refreshOnSelect = async (field: AppField, values: AppFormValues): Promise<DoAppCallResult<FormResponseData>> => {\n        const makeErrMsg = (message: string) => this.props.intl.formatMessage(\n            {\n                id: 'apps.error.form.refresh',\n                defaultMessage: 'There has been an error updating the modal. Contact the app developer. Details: {details}',\n            },\n            {details: message},\n        );\n        const {form} = this.state;\n        if (!form) {\n            return {error: makeCallErrorResponse(makeErrMsg(this.props.intl.formatMessage({\n                id: 'apps.error.form.no_form',\n                defaultMessage: '`form` is not defined.',\n            })))};\n        }\n\n        const call = this.getCall();\n        if (!call) {\n            return {error: makeCallErrorResponse(makeErrMsg(this.props.intl.formatMessage({\n                id: 'apps.error.form.no_call',\n                defaultMessage: '`call` is not defined.',\n            })))};\n        }\n\n        if (!field.refresh) {\n            // Should never happen\n            return {error: makeCallErrorResponse(makeErrMsg(this.props.intl.formatMessage({\n                id: 'apps.error.form.refresh_no_refresh',\n                defaultMessage: 'Called refresh on no refresh field.',\n            })))};\n        }\n\n        const res = await this.props.actions.doAppCall({\n            ...call,\n            selected_field: field.name,\n            values,\n        }, AppCallTypes.FORM, this.props.intl);\n\n        if (res.error) {\n            return res;\n        }\n\n        const callResp = res.data!;\n        switch (callResp.type) {\n        case AppCallResponseTypes.FORM:\n            this.setState({form: callResp.form});\n            break;\n        case AppCallResponseTypes.OK:\n        case AppCallResponseTypes.NAVIGATE:\n            return {error: makeCallErrorResponse(makeErrMsg(this.props.intl.formatMessage({\n                id: 'apps.error.responses.unexpected_type',\n                defaultMessage: 'App response type was not expected. Response type: {type}.',\n            }, {\n                type: callResp.type,\n            },\n            )))};\n        default:\n            return {error: makeCallErrorResponse(makeErrMsg(this.props.intl.formatMessage({\n                id: 'apps.error.responses.unknown_type',\n                defaultMessage: 'App response type not supported. Response type: {type}.',\n            }, {\n                type: callResp.type,\n            },\n            )))};\n        }\n        return res;\n    };\n\n    performLookupCall = async (field: AppField, values: AppFormValues, userInput: string): Promise<DoAppCallResult<AppLookupResponse>> => {\n        const intl = this.props.intl;\n        const makeErrorMsg = (message: string) => intl.formatMessage(\n            {\n                id: 'apps.error.form.refresh',\n                defaultMessage: 'There has been an error fetching the select fields. Contact the app developer. Details: {details}',\n            },\n            {details: message},\n        );\n        const call = this.getCall();\n        if (!call) {\n            return {error: makeCallErrorResponse(makeErrorMsg(intl.formatMessage({\n                id: 'apps.error.form.no_call',\n                defaultMessage: '`call` is not defined.',\n            })))};\n        }\n\n        return this.props.actions.doAppCall({\n            ...call,\n            values,\n            selected_field: field.name,\n            query: userInput,\n        }, AppCallTypes.LOOKUP, intl);\n    }\n\n    getCall = (): AppCallRequest | null => {\n        const {form} = this.state;\n\n        const {call} = this.props;\n        if (!call) {\n            return null;\n        }\n\n        return {\n            ...call,\n            ...form?.call,\n            expand: {\n                ...form?.call?.expand,\n                ...call.expand,\n            },\n        };\n    }\n\n    onHide = () => {\n        this.props.onHide();\n    };\n\n    render() {\n        const call = this.getCall();\n        if (!call) {\n            return null;\n        }\n\n        const {form} = this.state;\n        if (!form) {\n            return null;\n        }\n\n        return (\n            <AppsForm\n                form={form}\n                onHide={this.onHide}\n                actions={{\n                    submit: this.submitForm,\n                    performLookupCall: this.performLookupCall,\n                    refreshOnSelect: this.refreshOnSelect,\n                }}\n            />\n        );\n    }\n}\n\nexport default injectIntl(AppsFormContainer);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\nimport {DoAppCall, PostEphemeralCallResponseForContext} from 'types/apps';\n\nimport {doAppCall, postEphemeralCallResponseForContext} from 'actions/apps';\n\nimport AppsFormContainer from './apps_form_container';\n\ntype Actions = {\n    doAppCall: DoAppCall<any>;\n    postEphemeralCallResponseForContext: PostEphemeralCallResponseForContext;\n};\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            doAppCall,\n            postEphemeralCallResponseForContext,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(AppsFormContainer);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Client4} from 'mattermost-redux/client';\nimport {Action, ActionFunc, DispatchFunc} from 'mattermost-redux/types/actions';\nimport {AppCallResponse, AppForm, AppCallType, AppCallRequest, AppContext} from 'mattermost-redux/types/apps';\nimport {AppCallTypes, AppCallResponseTypes} from 'mattermost-redux/constants/apps';\nimport {Post} from 'mattermost-redux/types/posts';\nimport {CommandArgs} from 'mattermost-redux/types/integrations';\n\nimport {openModal} from 'actions/views/modals';\n\nimport AppsForm from 'components/apps_form';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {getSiteURL, shouldOpenInNewTab} from 'utils/url';\nimport {browserHistory} from 'utils/browser_history';\nimport {makeCallErrorResponse} from 'utils/apps';\n\nimport {cleanForm} from 'mattermost-redux/utils/apps';\n\nimport {sendEphemeralPost} from './global_actions';\n\nexport function doAppCall<Res=unknown>(call: AppCallRequest, type: AppCallType, intl: any): ActionFunc {\n    return async (dispatch: DispatchFunc) => {\n        try {\n            const res = await Client4.executeAppCall(call, type) as AppCallResponse<Res>;\n            const responseType = res.type || AppCallResponseTypes.OK;\n\n            switch (responseType) {\n            case AppCallResponseTypes.OK:\n                return {data: res};\n            case AppCallResponseTypes.ERROR:\n                return {error: res};\n            case AppCallResponseTypes.FORM:\n                if (!res.form) {\n                    const errMsg = intl.formatMessage({\n                        id: 'apps.error.responses.form.no_form',\n                        defaultMessage: 'Response type is `form`, but no form was included in response.',\n                    });\n                    return {error: makeCallErrorResponse(errMsg)};\n                }\n\n                cleanForm(res.form);\n\n                if (type === AppCallTypes.SUBMIT) {\n                    dispatch(openAppsModal(res.form, call));\n                }\n\n                return {data: res};\n            case AppCallResponseTypes.NAVIGATE:\n                if (!res.navigate_to_url) {\n                    const errMsg = intl.formatMessage({\n                        id: 'apps.error.responses.navigate.no_url',\n                        defaultMessage: 'Response type is `navigate`, but no url was included in response.',\n                    });\n                    return {error: makeCallErrorResponse(errMsg)};\n                }\n\n                if (type !== AppCallTypes.SUBMIT) {\n                    const errMsg = intl.formatMessage({\n                        id: 'apps.error.responses.navigate.no_submit',\n                        defaultMessage: 'Response type is `navigate`, but the call was not a submission.',\n                    });\n                    return {error: makeCallErrorResponse(errMsg)};\n                }\n\n                if (shouldOpenInNewTab(res.navigate_to_url, getSiteURL())) {\n                    window.open(res.navigate_to_url);\n                    return {data: res};\n                }\n\n                browserHistory.push(res.navigate_to_url.slice(getSiteURL().length));\n                return {data: res};\n            default: {\n                const errMsg = intl.formatMessage({\n                    id: 'apps.error.responses.unknown_type',\n                    defaultMessage: 'App response type not supported. Response type: {type}.',\n                }, {type: responseType});\n                return {error: makeCallErrorResponse(errMsg)};\n            }\n            }\n        } catch (error) {\n            const errMsg = error.message || intl.formatMessage({\n                id: 'apps.error.responses.unexpected_error',\n                defaultMessage: 'Received an unexpected error.',\n            });\n            return {error: makeCallErrorResponse(errMsg)};\n        }\n    };\n}\n\nexport function openAppsModal(form: AppForm, call: AppCallRequest): Action {\n    return openModal({\n        modalId: ModalIdentifiers.APPS_MODAL,\n        dialogType: AppsForm,\n        dialogProps: {\n            form,\n            call,\n        },\n    });\n}\n\nexport function postEphemeralCallResponseForPost(response: AppCallResponse, message: string, post: Post): ActionFunc {\n    return sendEphemeralPost(\n        message,\n        post.channel_id,\n        post.root_id || post.id,\n        response.app_metadata?.bot_user_id,\n    );\n}\n\nexport function postEphemeralCallResponseForChannel(response: AppCallResponse, message: string, channelID: string): ActionFunc {\n    return sendEphemeralPost(\n        message,\n        channelID,\n        '',\n        response.app_metadata?.bot_user_id,\n    );\n}\n\nexport function postEphemeralCallResponseForContext(response: AppCallResponse, message: string, context: AppContext): ActionFunc {\n    return sendEphemeralPost(\n        message,\n        context.channel_id,\n        context.root_id || context.post_id,\n        response.app_metadata?.bot_user_id,\n    );\n}\n\nexport function postEphemeralCallResponseForCommandArgs(response: AppCallResponse, message: string, args: CommandArgs): ActionFunc {\n    return sendEphemeralPost(\n        message,\n        args.channel_id,\n        args.root_id,\n        response.app_metadata?.bot_user_id,\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {batchActions} from 'redux-batched-actions';\n\nimport {PreferenceTypes} from 'mattermost-redux/action_types';\nimport * as ChannelActions from 'mattermost-redux/actions/channels';\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getMyChannelMemberships} from 'mattermost-redux/selectors/entities/common';\nimport {getChannelByName, getUnreadChannelIds, getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeamUrl, getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\nimport {loadNewDMIfNeeded, loadNewGMIfNeeded, loadProfilesForSidebar} from 'actions/user_actions.jsx';\nimport {browserHistory} from 'utils/browser_history';\nimport {Constants, Preferences, NotificationLevels} from 'utils/constants';\nimport {getDirectChannelName} from 'utils/utils';\n\nexport function openDirectChannelToUserId(userId) {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const currentUserId = getCurrentUserId(state);\n        const channelName = getDirectChannelName(currentUserId, userId);\n        const channel = getChannelByName(state, channelName);\n\n        if (!channel) {\n            return dispatch(ChannelActions.createDirectChannel(currentUserId, userId));\n        }\n\n        trackEvent('api', 'api_channels_join_direct');\n        const now = Date.now();\n        const prefDirect = {\n            category: Preferences.CATEGORY_DIRECT_CHANNEL_SHOW,\n            name: userId,\n            value: 'true',\n        };\n        const prefOpenTime = {\n            category: Preferences.CATEGORY_CHANNEL_OPEN_TIME,\n            name: channel.id,\n            value: now.toString(),\n        };\n        const actions = [{\n            type: PreferenceTypes.RECEIVED_PREFERENCES,\n            data: [prefDirect],\n        }, {\n            type: PreferenceTypes.RECEIVED_PREFERENCES,\n            data: [prefOpenTime],\n        }];\n        dispatch(batchActions(actions));\n\n        dispatch(savePreferences(currentUserId, [\n            {user_id: currentUserId, ...prefDirect},\n            {user_id: currentUserId, ...prefOpenTime},\n        ]));\n\n        return {data: channel};\n    };\n}\n\nexport function openGroupChannelToUserIds(userIds) {\n    return async (dispatch, getState) => {\n        const result = await dispatch(ChannelActions.createGroupChannel(userIds));\n\n        if (result.error) {\n            browserHistory.push(getCurrentTeamUrl(getState()));\n        }\n\n        return result;\n    };\n}\n\nexport function loadChannelsForCurrentUser() {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const unreads = getUnreadChannelIds(state);\n\n        await dispatch(ChannelActions.fetchMyChannelsAndMembers(getCurrentTeamId(state)));\n        for (const id of unreads) {\n            const channel = getChannel(state, id);\n            if (channel && channel.type === Constants.DM_CHANNEL) {\n                dispatch(loadNewDMIfNeeded(channel.id));\n            } else if (channel && channel.type === Constants.GM_CHANNEL) {\n                dispatch(loadNewGMIfNeeded(channel.id));\n            }\n        }\n\n        loadProfilesForSidebar();\n    };\n}\n\nexport function searchMoreChannels(term, showArchivedChannels) {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const teamId = getCurrentTeamId(state);\n\n        if (!teamId) {\n            throw new Error('No team id');\n        }\n\n        const {data, error} = await dispatch(ChannelActions.searchChannels(teamId, term, showArchivedChannels));\n        if (data) {\n            const myMembers = getMyChannelMemberships(state);\n\n            // When searching public channels, only get channels user is not a member of\n            const channels = showArchivedChannels ? data : data.filter((c) => !myMembers[c.id]);\n            return {data: channels};\n        }\n\n        return {error};\n    };\n}\n\nexport function autocompleteChannels(term, success, error) {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const teamId = getCurrentTeamId(state);\n        if (!teamId) {\n            return {data: false};\n        }\n\n        const {data, error: err} = await dispatch(ChannelActions.autocompleteChannels(teamId, term));\n        if (data && success) {\n            success(data);\n        } else if (err && error) {\n            error({id: err.server_error_id, ...err});\n        }\n\n        return {data: true};\n    };\n}\n\nexport function autocompleteChannelsForSearch(term, success, error) {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const teamId = getCurrentTeamId(state);\n\n        if (!teamId) {\n            return;\n        }\n\n        const {data, error: err} = await dispatch(ChannelActions.autocompleteChannelsForSearch(teamId, term));\n        if (data && success) {\n            success(data);\n        } else if (err && error) {\n            error({id: err.server_error_id, ...err});\n        }\n    };\n}\n\nexport function addUsersToChannel(channelId, userIds) {\n    return async (dispatch) => {\n        try {\n            const requests = userIds.map((uId) => dispatch(ChannelActions.addChannelMember(channelId, uId)));\n\n            return await Promise.all(requests);\n        } catch (error) {\n            return {error};\n        }\n    };\n}\n\nexport function unmuteChannel(userId, channelId) {\n    return ChannelActions.updateChannelNotifyProps(userId, channelId, {\n        mark_unread: NotificationLevels.ALL,\n    });\n}\n\nexport function muteChannel(userId, channelId) {\n    return ChannelActions.updateChannelNotifyProps(userId, channelId, {\n        mark_unread: NotificationLevels.MENTION,\n    });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Stripe} from '@stripe/stripe-js';\nimport {getCode} from 'country-list';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport {getConfirmCardSetup} from 'components/payment_form/stripe';\n\nimport {StripeSetupIntent, BillingDetails} from 'types/cloud/sku';\n\n// Returns true for success, and false for any error\nexport function completeStripeAddPaymentMethod(\n    stripe: Stripe,\n    billingDetails: BillingDetails,\n    isDevMode: boolean,\n) {\n    return async () => {\n        let paymentSetupIntent: StripeSetupIntent;\n        try {\n            paymentSetupIntent = await Client4.createPaymentMethod() as StripeSetupIntent;\n        } catch (error) {\n            return error;\n        }\n        const cardSetupFunction = getConfirmCardSetup(isDevMode);\n        const confirmCardSetup = cardSetupFunction(stripe.confirmCardSetup);\n\n        const result = await confirmCardSetup(\n            paymentSetupIntent.client_secret,\n            {\n                payment_method: {\n                    card: billingDetails.card,\n                    billing_details: {\n                        name: billingDetails.name,\n                        address: {\n                            line1: billingDetails.address,\n                            line2: billingDetails.address2,\n                            city: billingDetails.city,\n                            state: billingDetails.state,\n                            country: getCode(billingDetails.country),\n                            postal_code: billingDetails.postalCode,\n                        },\n                    },\n                },\n            },\n        );\n\n        if (!result) {\n            return false;\n        }\n\n        const {setupIntent, error: stripeError} = result;\n\n        if (stripeError) {\n            return false;\n        }\n\n        if (setupIntent == null) {\n            return false;\n        }\n\n        if (setupIntent.status !== 'succeeded') {\n            return false;\n        }\n\n        try {\n            await Client4.confirmPaymentMethod(setupIntent.id);\n        } catch (error) {\n            return false;\n        }\n\n        return true;\n    };\n}\n\nexport function subscribeCloudSubscription(productId: string) {\n    return async () => {\n        try {\n            await Client4.subscribeCloudProduct(productId);\n        } catch (error) {\n            return error;\n        }\n        return true;\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Client4} from 'mattermost-redux/client';\nimport {unfavoriteChannel} from 'mattermost-redux/actions/channels';\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getCurrentChannel, getRedirectChannelNameForTeam, isFavoriteChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getCurrentRelativeTeamUrl, getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\nimport {IntegrationTypes} from 'mattermost-redux/action_types';\nimport {ActionFunc, DispatchFunc, GetStateFunc} from 'mattermost-redux/types/actions';\nimport type {CommandArgs} from 'mattermost-redux/types/integrations';\n\nimport {AppCallResponseTypes, AppCallTypes} from 'mattermost-redux/constants/apps';\n\nimport {DoAppCallResult} from 'types/apps';\n\nimport {openModal} from 'actions/views/modals';\nimport * as GlobalActions from 'actions/global_actions';\nimport * as PostActions from 'actions/post_actions.jsx';\n\nimport {isUrlSafe, getSiteURL} from 'utils/url';\nimport {localizeMessage, getUserIdFromChannelName, localizeAndFormatMessage} from 'utils/utils.jsx';\nimport * as UserAgent from 'utils/user_agent';\nimport {Constants, ModalIdentifiers} from 'utils/constants';\nimport {browserHistory} from 'utils/browser_history';\n\nimport UserSettingsModal from 'components/user_settings/modal';\nimport {AppCommandParser} from 'components/suggestion/command_provider/app_command_parser/app_command_parser';\nimport {intlShim} from 'components/suggestion/command_provider/app_command_parser/app_command_parser_dependencies';\n\nimport {GlobalState} from 'types/store';\n\nimport {t} from 'utils/i18n';\n\nimport {doAppCall, postEphemeralCallResponseForCommandArgs} from './apps';\n\nexport function executeCommand(message: string, args: CommandArgs): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState() as GlobalState;\n\n        let msg = message;\n\n        let cmdLength = msg.indexOf(' ');\n        if (cmdLength < 0) {\n            cmdLength = msg.length;\n        }\n        const cmd = msg.substring(0, cmdLength).toLowerCase();\n        msg = cmd + ' ' + msg.substring(cmdLength, msg.length).trim();\n\n        switch (cmd) {\n        case '/search':\n            dispatch(PostActions.searchForTerm(msg.substring(cmdLength + 1, msg.length)));\n            return {data: true};\n        case '/shortcuts':\n            if (UserAgent.isMobile()) {\n                const error = {message: localizeMessage('create_post.shortcutsNotSupported', 'Keyboard shortcuts are not supported on your device')};\n                return {error};\n            }\n\n            GlobalActions.toggleShortcutsModal();\n            return {data: true};\n        case '/leave': {\n            // /leave command not supported in reply threads.\n            if (args.channel_id && args.root_id) {\n                dispatch(GlobalActions.sendEphemeralPost('/leave is not supported in reply threads. Use it in the center channel instead.', args.channel_id, args.root_id));\n                return {data: true};\n            }\n            const channel = getCurrentChannel(state) || {};\n            if (channel.type === Constants.PRIVATE_CHANNEL) {\n                GlobalActions.showLeavePrivateChannelModal(channel);\n                return {data: true};\n            }\n            if (\n                channel.type === Constants.DM_CHANNEL ||\n                channel.type === Constants.GM_CHANNEL\n            ) {\n                const currentUserId = getCurrentUserId(state);\n                let name;\n                let category;\n                if (channel.type === Constants.DM_CHANNEL) {\n                    name = getUserIdFromChannelName(channel);\n                    category = Constants.Preferences.CATEGORY_DIRECT_CHANNEL_SHOW;\n                } else {\n                    name = channel.id;\n                    category = Constants.Preferences.CATEGORY_GROUP_CHANNEL_SHOW;\n                }\n                const currentTeamId = getCurrentTeamId(state);\n                const redirectChannel = getRedirectChannelNameForTeam(state, currentTeamId);\n                const teamUrl = getCurrentRelativeTeamUrl(state);\n                browserHistory.push(`${teamUrl}/channels/${redirectChannel}`);\n\n                dispatch(savePreferences(currentUserId, [{category, name, user_id: currentUserId, value: 'false'}]));\n                if (isFavoriteChannel(state, channel.id)) {\n                    dispatch(unfavoriteChannel(channel.id));\n                }\n\n                return {data: true};\n            }\n            break;\n        }\n        case '/settings':\n            dispatch(openModal({modalId: ModalIdentifiers.USER_SETTINGS, dialogType: UserSettingsModal, dialogProps: {isContentProductSettings: true}}));\n            return {data: true};\n        case '/collapse':\n        case '/expand':\n            dispatch(PostActions.resetEmbedVisibility());\n            dispatch(PostActions.resetInlineImageVisibility());\n        }\n\n        if (appsEnabled(state)) {\n            const getGlobalState = () => getState() as GlobalState;\n            const createErrorMessage = (errMessage: string) => {\n                return {error: {message: errMessage}};\n            };\n            const parser = new AppCommandParser({dispatch, getState: getGlobalState} as any, intlShim, args.channel_id, args.team_id, args.root_id);\n            if (parser.isAppCommand(msg)) {\n                try {\n                    const {call, errorMessage} = await parser.composeCallFromCommand(msg);\n                    if (!call) {\n                        return createErrorMessage(errorMessage!);\n                    }\n\n                    const res = await dispatch(doAppCall(call, AppCallTypes.SUBMIT, intlShim)) as DoAppCallResult;\n\n                    if (res.error) {\n                        const errorResponse = res.error;\n                        return createErrorMessage(errorResponse.error || intlShim.formatMessage({\n                            id: 'apps.error.unknown',\n                            defaultMessage: 'Unknown error.',\n                        }));\n                    }\n\n                    const callResp = res.data!;\n                    switch (callResp.type) {\n                    case AppCallResponseTypes.OK:\n                        if (callResp.markdown) {\n                            dispatch(postEphemeralCallResponseForCommandArgs(callResp, callResp.markdown, args));\n                        }\n                        return {data: true};\n                    case AppCallResponseTypes.FORM:\n                    case AppCallResponseTypes.NAVIGATE:\n                        return {data: true};\n                    default:\n                        return createErrorMessage(localizeAndFormatMessage(\n                            t('apps.error.responses.unknown_type'),\n                            'App response type not supported. Response type: {type}.',\n                            {type: callResp.type},\n                        ));\n                    }\n                } catch (err) {\n                    return createErrorMessage(err.message || localizeMessage('apps.error.unknown', 'Unknown error.'));\n                }\n            }\n        }\n\n        let data;\n        try {\n            data = await Client4.executeCommand(msg, args);\n        } catch (err) {\n            return {error: err};\n        }\n\n        const hasGotoLocation = data.goto_location && isUrlSafe(data.goto_location);\n\n        if (msg.trim() === '/logout') {\n            GlobalActions.emitUserLoggedOutEvent(hasGotoLocation ? data.goto_location : '/');\n            return {data: true};\n        }\n\n        if (data.trigger_id) {\n            dispatch({type: IntegrationTypes.RECEIVED_DIALOG_TRIGGER_ID, data: data.trigger_id});\n        }\n\n        if (hasGotoLocation) {\n            if (data.goto_location.startsWith('/')) {\n                browserHistory.push(data.goto_location);\n            } else if (data.goto_location.startsWith(getSiteURL())) {\n                browserHistory.push(data.goto_location.substr(getSiteURL().length));\n            } else {\n                window.open(data.goto_location);\n            }\n        }\n\n        return {data: true};\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\n\nimport MenuWrapper from '../../menu_wrapper';\nimport Menu from '../../menu';\nimport SubMenuItem from '../../menu_items/submenu_item';\n\nimport * as Utils from 'utils/utils.jsx';\n\nimport './submenu_modal.scss';\n\ntype Props = {\n    elements?: Array<React.ComponentProps<typeof SubMenuItem>>;\n    onHide: () => void;\n}\n\ntype State = {\n    show: boolean;\n}\n\nexport default class SubMenuModal extends React.PureComponent<Props, State> {\n    public constructor(props: Props) {\n        super(props);\n        this.state = {\n            show: true,\n        };\n    }\n\n    public onHide = () => { //public because it is used on tests\n        this.setState({show: false});\n    }\n\n    public render() {\n        let SubMenuItems;\n        if (this.props.elements) {\n            SubMenuItems = this.props.elements.map((element) => {\n                return (\n                    <Menu.ItemSubMenu\n                        key={element.id}\n                        id={element.id}\n                        text={element.text}\n                        subMenu={element.subMenu}\n                        action={element.action}\n                        filter={element.filter}\n                        root={false}\n                    />\n                );\n            });\n        }\n        return (\n            <Modal\n                dialogClassName={'SubMenuModal a11y__modal mobile-sub-menu'}\n                show={this.state.show}\n                onHide={this.onHide}\n                onExited={this.props.onHide}\n                enforceFocus={false}\n                id='submenuModal'\n                role='dialog'\n            >\n                <Modal.Body\n                    onClick={this.onHide}\n                >\n                    <MenuWrapper>\n                        <Menu\n                            openLeft={true}\n                            ariaLabel={Utils.localizeMessage('post_info.submenu.mobile', 'mobile submenu').toLowerCase()}\n                        >\n                            {SubMenuItems}\n                        </Menu>\n                        <div/>\n                    </MenuWrapper>\n                </Modal.Body>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {batchActions} from 'redux-batched-actions';\n\nimport {\n    createDirectChannel,\n    fetchMyChannelsAndMembers,\n    getChannelByNameAndTeamName,\n    getChannelStats,\n    selectChannel,\n} from 'mattermost-redux/actions/channels';\nimport {logout, loadMe} from 'mattermost-redux/actions/users';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeamId, getMyTeams, getTeam, getMyTeamMember, getTeamMemberships} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser, getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getCurrentChannelStats, getCurrentChannelId, getMyChannelMember, getRedirectChannelNameForTeam, getChannelsNameMapInTeam, getAllDirectChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\nimport {ChannelTypes} from 'mattermost-redux/action_types';\nimport {fetchAppBindings} from 'mattermost-redux/actions/apps';\nimport {Channel, ChannelMembership} from 'mattermost-redux/types/channels';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {ActionFunc, DispatchFunc, GetStateFunc} from 'mattermost-redux/types/actions';\nimport {Team} from 'mattermost-redux/types/teams';\n\nimport {browserHistory} from 'utils/browser_history';\nimport {handleNewPost} from 'actions/post_actions.jsx';\nimport {stopPeriodicStatusUpdates} from 'actions/status_actions.jsx';\nimport {loadProfilesForSidebar} from 'actions/user_actions.jsx';\nimport {closeRightHandSide, closeMenu as closeRhsMenu, updateRhsState} from 'actions/views/rhs';\nimport {clearUserCookie} from 'actions/views/cookie';\nimport {close as closeLhs} from 'actions/views/lhs';\nimport * as WebsocketActions from 'actions/websocket_actions.jsx';\nimport AppDispatcher from 'dispatcher/app_dispatcher.jsx';\nimport {getCurrentLocale} from 'selectors/i18n';\nimport {getIsRhsOpen, getRhsState} from 'selectors/rhs';\nimport BrowserStore from 'stores/browser_store';\nimport store from 'stores/redux_store.jsx';\nimport LocalStorageStore from 'stores/local_storage_store';\nimport WebSocketClient from 'client/web_websocket_client.jsx';\n\nimport {ActionTypes, Constants, PostTypes, RHSStates, ModalIdentifiers} from 'utils/constants';\nimport {filterAndSortTeamsByDisplayName} from 'utils/team_utils.jsx';\nimport * as Utils from 'utils/utils.jsx';\nimport SubMenuModal from '../components/widgets/menu/menu_modals/submenu_modal/submenu_modal';\n\nimport {openModal} from './views/modals';\n\nconst dispatch = store.dispatch;\nconst getState = store.getState;\n\nexport function emitChannelClickEvent(channel: Channel) {\n    async function userVisitedFakeChannel(chan: Channel, success: (received: Channel) => void, fail: () => void) {\n        const state = getState();\n        const currentUserId = getCurrentUserId(state);\n        const otherUserId = Utils.getUserIdFromChannelName(chan);\n        const res = await createDirectChannel(currentUserId, otherUserId)(dispatch, getState);\n        if ('data' in res) {\n            success(res.data);\n        } else {\n            fail();\n        }\n    }\n    function switchToChannel(chan: Channel) {\n        const state = getState();\n        const userId = getCurrentUserId(state);\n        const teamId = chan.team_id || getCurrentTeamId(state);\n        const isRHSOpened = getIsRhsOpen(state);\n        const isPinnedPostsShowing = getRhsState(state) === RHSStates.PIN;\n        const isChannelFilesShowing = getRhsState(state) === RHSStates.CHANNEL_FILES;\n        const member = getMyChannelMember(state, chan.id);\n        const currentChannelId = getCurrentChannelId(state);\n        dispatch(getChannelStats(chan.id));\n\n        const penultimate = LocalStorageStore.getPreviousChannelName(userId, teamId);\n        if (penultimate !== chan.name) {\n            LocalStorageStore.setPenultimateChannelName(userId, teamId, penultimate);\n            LocalStorageStore.setPreviousChannelName(userId, teamId, chan.name);\n        }\n\n        // When switching to a different channel if the pinned posts is showing\n        // Update the RHS state to reflect the pinned post of the selected channel\n        if (isRHSOpened && isPinnedPostsShowing) {\n            dispatch(updateRhsState(RHSStates.PIN, chan.id));\n        }\n\n        if (isRHSOpened && isChannelFilesShowing) {\n            dispatch(updateRhsState(RHSStates.CHANNEL_FILES, chan.id));\n        }\n\n        if (currentChannelId) {\n            loadProfilesForSidebar();\n        }\n\n        dispatch(batchActions([{\n            type: ChannelTypes.SELECT_CHANNEL,\n            data: chan.id,\n        }, {\n            type: ActionTypes.SELECT_CHANNEL_WITH_MEMBER,\n            data: chan.id,\n            channel: chan,\n            member: member || {},\n        }]));\n\n        if (appsEnabled(state)) {\n            dispatch(fetchAppBindings(userId, chan.id));\n        }\n    }\n\n    if (channel.fake) {\n        userVisitedFakeChannel(\n            channel,\n            (data) => {\n                switchToChannel(data);\n            },\n            () => {\n                browserHistory.push('/');\n            },\n        );\n    } else {\n        switchToChannel(channel);\n    }\n}\n\nexport function updateNewMessagesAtInChannel(channelId: string, lastViewedAt = Date.now()) {\n    return {\n        type: ActionTypes.UPDATE_CHANNEL_LAST_VIEWED_AT,\n        channel_id: channelId,\n        last_viewed_at: lastViewedAt,\n    };\n}\n\nexport function emitCloseRightHandSide() {\n    dispatch(closeRightHandSide());\n}\n\nexport function toggleShortcutsModal() {\n    AppDispatcher.handleViewAction({\n        type: ActionTypes.TOGGLE_SHORTCUTS_MODAL,\n        value: true,\n    });\n}\n\nexport function showChannelPurposeUpdateModal(channel: Channel) {\n    AppDispatcher.handleViewAction({\n        type: ActionTypes.TOGGLE_CHANNEL_PURPOSE_UPDATE_MODAL,\n        value: true,\n        channel,\n    });\n}\n\nexport function showChannelNameUpdateModal(channel: Channel) {\n    AppDispatcher.handleViewAction({\n        type: ActionTypes.TOGGLE_CHANNEL_NAME_UPDATE_MODAL,\n        value: true,\n        channel,\n    });\n}\n\nexport function showGetPublicLinkModal(fileId: string) {\n    AppDispatcher.handleViewAction({\n        type: ActionTypes.TOGGLE_GET_PUBLIC_LINK_MODAL,\n        value: true,\n        fileId,\n    });\n}\n\nexport function showGetTeamInviteLinkModal() {\n    AppDispatcher.handleViewAction({\n        type: Constants.ActionTypes.TOGGLE_GET_TEAM_INVITE_LINK_MODAL,\n        value: true,\n    });\n}\n\nexport function showLeavePrivateChannelModal(channel: Channel) {\n    AppDispatcher.handleViewAction({\n        type: ActionTypes.TOGGLE_LEAVE_PRIVATE_CHANNEL_MODAL,\n        value: channel,\n    });\n}\n\nexport function showMobileSubMenuModal(elements: any[]) { // TODO Use more specific type\n    const submenuModalData = {\n        ModalId: ModalIdentifiers.MOBILE_SUBMENU,\n        dialogType: SubMenuModal,\n        dialogProps: {\n            elements,\n        },\n    };\n\n    dispatch(openModal(submenuModalData));\n}\n\nexport function sendEphemeralPost(message: string, channelId?: string, parentId?: string, userId?: string): ActionFunc {\n    return (doDispatch: DispatchFunc, doGetState: GetStateFunc) => {\n        const timestamp = Utils.getTimestamp();\n        const post = {\n            id: Utils.generateId(),\n            user_id: userId || '0',\n            channel_id: channelId || getCurrentChannelId(doGetState()),\n            message,\n            type: PostTypes.EPHEMERAL,\n            create_at: timestamp,\n            update_at: timestamp,\n            root_id: parentId,\n            props: {},\n        };\n\n        return doDispatch(handleNewPost(post));\n    };\n}\n\nexport function sendAddToChannelEphemeralPost(user: UserProfile, addedUsername: string, addedUserId: string, channelId: string, postRootId = '', timestamp: number) {\n    const post = {\n        id: Utils.generateId(),\n        user_id: user.id,\n        channel_id: channelId || getCurrentChannelId(getState()),\n        message: '',\n        type: PostTypes.EPHEMERAL_ADD_TO_CHANNEL,\n        create_at: timestamp,\n        update_at: timestamp,\n        root_id: postRootId,\n        props: {\n            username: user.username,\n            addedUsername,\n            addedUserId,\n        },\n    };\n\n    dispatch(handleNewPost(post));\n}\n\nlet lastTimeTypingSent = 0;\nexport function emitLocalUserTypingEvent(channelId: string, parentPostId: string) {\n    const userTyping = async (actionDispatch: DispatchFunc, actionGetState: GetStateFunc) => {\n        const state = actionGetState();\n        const config = getConfig(state);\n        const t = Date.now();\n        const stats = getCurrentChannelStats(state);\n        const membersInChannel = stats ? stats.member_count : 0;\n\n        const timeBetweenUserTypingUpdatesMilliseconds = Utils.stringToNumber(config.TimeBetweenUserTypingUpdatesMilliseconds);\n        const maxNotificationsPerChannel = Utils.stringToNumber(config.MaxNotificationsPerChannel);\n\n        if (((t - lastTimeTypingSent) > timeBetweenUserTypingUpdatesMilliseconds) &&\n            (membersInChannel < maxNotificationsPerChannel) && (config.EnableUserTypingMessages === 'true')) {\n            WebSocketClient.userTyping(channelId, parentPostId);\n            lastTimeTypingSent = t;\n        }\n\n        return {data: true};\n    };\n\n    return dispatch(userTyping);\n}\n\nexport function emitUserLoggedOutEvent(redirectTo = '/', shouldSignalLogout = true, userAction = true) {\n    // If the logout was intentional, discard knowledge about having previously been logged in.\n    // This bit is otherwise used to detect session expirations on the login page.\n    if (userAction) {\n        LocalStorageStore.setWasLoggedIn(false);\n    }\n\n    dispatch(logout()).then(() => {\n        if (shouldSignalLogout) {\n            BrowserStore.signalLogout();\n        }\n\n        BrowserStore.clear();\n        stopPeriodicStatusUpdates();\n        WebsocketActions.close();\n\n        clearUserCookie();\n\n        browserHistory.push(redirectTo);\n    }).catch(() => {\n        browserHistory.push(redirectTo);\n    });\n}\n\nexport function toggleSideBarRightMenuAction() {\n    return (doDispatch: DispatchFunc) => {\n        doDispatch(closeRightHandSide());\n        doDispatch(closeLhs());\n        doDispatch(closeRhsMenu());\n    };\n}\n\nexport function emitBrowserFocus(focus: boolean) {\n    dispatch({\n        type: ActionTypes.BROWSER_CHANGE_FOCUS,\n        focus,\n    });\n}\n\nexport async function getTeamRedirectChannelIfIsAccesible(user: UserProfile, team: Team) {\n    let state = getState();\n    let channel = null;\n\n    const myMember = getMyTeamMember(state, team.id);\n    if (!myMember || Object.keys(myMember).length === 0) {\n        return null;\n    }\n\n    let teamChannels = getChannelsNameMapInTeam(state, team.id);\n    if (!teamChannels || Object.keys(teamChannels).length === 0) {\n        // This should be executed in pretty limited scenarios (empty teams)\n        await dispatch(fetchMyChannelsAndMembers(team.id)); // eslint-disable-line no-await-in-loop\n        state = getState();\n        teamChannels = getChannelsNameMapInTeam(state, team.id);\n    }\n\n    const channelName = LocalStorageStore.getPreviousChannelName(user.id, team.id);\n    channel = teamChannels[channelName];\n\n    if (typeof channel === 'undefined') {\n        const dmList = getAllDirectChannels(state);\n        channel = dmList.find((directChannel) => directChannel.name === channelName);\n    }\n\n    let channelMember: ChannelMembership | null | undefined;\n    if (channel) {\n        channelMember = getMyChannelMember(state, channel.id);\n    }\n\n    if (!channel || !channelMember) {\n        // This should be executed in pretty limited scenarios (when the last visited channel in the team has been removed)\n        await dispatch(getChannelByNameAndTeamName(team.name, channelName)); // eslint-disable-line no-await-in-loop\n        state = getState();\n        teamChannels = getChannelsNameMapInTeam(state, team.id);\n        channel = teamChannels[channelName];\n        channelMember = getMyChannelMember(state, channel && channel.id);\n    }\n\n    if (!channel || !channelMember) {\n        const redirectedChannelName = getRedirectChannelNameForTeam(state, team.id);\n        channel = teamChannels[redirectedChannelName];\n        channelMember = getMyChannelMember(state, channel && channel.id);\n    }\n\n    if (channel && channelMember) {\n        return channel;\n    }\n    return null;\n}\n\nexport async function redirectUserToDefaultTeam() {\n    let state = getState();\n\n    // Assume we need to load the user if they don't have any team memberships loaded or the user loaded\n    let user = getCurrentUser(state);\n    const shouldLoadUser = Utils.isEmptyObject(getTeamMemberships(state)) || !user;\n\n    if (shouldLoadUser) {\n        await dispatch(loadMe());\n        state = getState();\n        user = getCurrentUser(state);\n    }\n\n    if (!user) {\n        return;\n    }\n\n    const locale = getCurrentLocale(state);\n    const teamId = LocalStorageStore.getPreviousTeamId(user.id);\n\n    let myTeams = getMyTeams(state);\n    if (myTeams.length === 0) {\n        browserHistory.push('/select_team');\n        return;\n    }\n\n    let team: Team | undefined;\n    if (teamId) {\n        team = getTeam(state, teamId);\n    }\n\n    if (team && team.delete_at === 0) {\n        const channel = await getTeamRedirectChannelIfIsAccesible(user, team);\n        if (channel) {\n            dispatch(selectChannel(channel.id));\n            browserHistory.push(`/${team.name}/channels/${channel.name}`);\n            return;\n        }\n    }\n\n    myTeams = filterAndSortTeamsByDisplayName(myTeams, locale);\n\n    for (const myTeam of myTeams) {\n        // This should execute async behavior in a pretty limited set of situations, so shouldn't be a problem\n        const channel = await getTeamRedirectChannelIfIsAccesible(user, myTeam); // eslint-disable-line no-await-in-loop\n        if (channel) {\n            dispatch(selectChannel(channel.id));\n            browserHistory.push(`/${myTeam.name}/channels/${channel.name}`);\n            return;\n        }\n    }\n\n    browserHistory.push('/select_team');\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport function runMessageWillBePostedHooks(originalPost) {\n    return async (dispatch, getState) => {\n        const hooks = getState().plugins.components.MessageWillBePosted;\n        if (!hooks || hooks.length === 0) {\n            return {data: originalPost};\n        }\n\n        let post = originalPost;\n\n        for (const hook of hooks) {\n            const result = await hook.hook(post); // eslint-disable-line no-await-in-loop\n\n            if (result) {\n                if (result.error) {\n                    return {\n                        error: result.error,\n                    };\n                }\n\n                post = result.post;\n            }\n        }\n\n        return {data: post};\n    };\n}\n\nexport function runSlashCommandWillBePostedHooks(originalMessage, originalArgs) {\n    return async (dispatch, getState) => {\n        const hooks = getState().plugins.components.SlashCommandWillBePosted;\n        if (!hooks || hooks.length === 0) {\n            return {data: {message: originalMessage, args: originalArgs}};\n        }\n\n        let message = originalMessage;\n        let args = originalArgs;\n\n        for (const hook of hooks) {\n            const result = await hook.hook(message, args); // eslint-disable-line no-await-in-loop\n\n            if (result) {\n                if (result.error) {\n                    return {\n                        error: result.error,\n                    };\n                }\n\n                message = result.message;\n                args = result.args;\n\n                // The first plugin to consume the slash command by returning an empty object\n                // should terminate the processing by subsequent plugins.\n                if (Object.keys(result).length === 0) {\n                    break;\n                }\n            }\n        }\n\n        return {data: {message, args}};\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {batchActions} from 'redux-batched-actions';\n\nimport {\n    leaveChannel as leaveChannelRedux,\n    joinChannel,\n    markChannelAsRead,\n    unfavoriteChannel,\n} from 'mattermost-redux/actions/channels';\nimport * as PostActions from 'mattermost-redux/actions/posts';\nimport {TeamTypes} from 'mattermost-redux/action_types';\nimport {autocompleteUsers} from 'mattermost-redux/actions/users';\nimport {selectTeam} from 'mattermost-redux/actions/teams';\nimport {Posts, RequestStatus} from 'mattermost-redux/constants';\n\nimport {\n    getChannel,\n    getChannelsNameMapInCurrentTeam,\n    getCurrentChannel,\n    getRedirectChannelNameForTeam,\n    getMyChannels,\n    getMyChannelMemberships,\n    getAllDirectChannelsNameMapInCurrentTeam,\n    isFavoriteChannel,\n    isManuallyUnread,\n} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentRelativeTeamUrl, getCurrentTeam, getCurrentTeamId, getTeamsList} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId, getUserByUsername} from 'mattermost-redux/selectors/entities/users';\nimport {getMostRecentPostIdInChannel, getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {makeAddLastViewAtToProfiles} from 'mattermost-redux/selectors/entities/utils';\n\nimport {getChannelByName} from 'mattermost-redux/utils/channel_utils';\nimport EventEmitter from 'mattermost-redux/utils/event_emitter';\n\nimport {openDirectChannelToUserId} from 'actions/channel_actions.jsx';\nimport {loadCustomStatusEmojisForPostList} from 'actions/emoji_actions';\nimport {getLastViewedChannelName} from 'selectors/local_storage';\nimport {getLastPostsApiTimeForChannel} from 'selectors/views/channel';\nimport {getSocketStatus} from 'selectors/views/websocket';\n\nimport {browserHistory} from 'utils/browser_history';\nimport {Constants, ActionTypes, EventTypes, PostRequestTypes} from 'utils/constants';\nimport {isMobile} from 'utils/utils.jsx';\nimport LocalStorageStore from 'stores/local_storage_store.jsx';\nimport {isArchivedChannel} from 'utils/channel_utils';\n\nexport function checkAndSetMobileView() {\n    return (dispatch) => {\n        dispatch({\n            type: ActionTypes.UPDATE_MOBILE_VIEW,\n            data: isMobile(),\n        });\n    };\n}\n\nexport function goToLastViewedChannel() {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const currentChannel = getCurrentChannel(state) || {};\n        const channelsInTeam = getChannelsNameMapInCurrentTeam(state);\n        const directChannel = getAllDirectChannelsNameMapInCurrentTeam(state);\n        const channels = Object.assign({}, channelsInTeam, directChannel);\n\n        let channelToSwitchTo = getChannelByName(channels, getLastViewedChannelName(state));\n\n        if (currentChannel.id === channelToSwitchTo.id) {\n            channelToSwitchTo = getChannelByName(channels, getRedirectChannelNameForTeam(state, getCurrentTeamId(state)));\n        }\n\n        return dispatch(switchToChannel(channelToSwitchTo));\n    };\n}\n\nexport function switchToChannelById(channelId) {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const channel = getChannel(state, channelId);\n        return dispatch(switchToChannel(channel));\n    };\n}\n\nexport function switchToChannel(channel) {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const teamUrl = getCurrentRelativeTeamUrl(state);\n\n        if (channel.fake || channel.userId) {\n            const username = channel.userId ? channel.name : channel.display_name;\n            const user = getUserByUsername(state, username);\n            if (!user) {\n                return {error: true};\n            }\n\n            const direct = await dispatch(openDirectChannelToUserId(user.id));\n            if (direct.error) {\n                return {error: true};\n            }\n            browserHistory.push(`${teamUrl}/messages/@${channel.name}`);\n        } else if (channel.type === Constants.GM_CHANNEL) {\n            const gmChannel = getChannel(state, channel.id);\n            browserHistory.push(`${teamUrl}/channels/${gmChannel.name}`);\n        } else {\n            browserHistory.push(`${teamUrl}/channels/${channel.name}`);\n        }\n\n        return {data: true};\n    };\n}\n\nexport function joinChannelById(channelId) {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const currentUserId = getCurrentUserId(state);\n        const currentTeamId = getCurrentTeamId(state);\n\n        return dispatch(joinChannel(currentUserId, currentTeamId, channelId));\n    };\n}\n\nexport function leaveChannel(channelId) {\n    return async (dispatch, getState) => {\n        let state = getState();\n        const currentUserId = getCurrentUserId(state);\n        const currentTeam = getCurrentTeam(state);\n        const channel = getChannel(state, channelId);\n\n        if (isFavoriteChannel(state, channelId)) {\n            dispatch(unfavoriteChannel(channelId));\n        }\n\n        const teamUrl = getCurrentRelativeTeamUrl(state);\n\n        if (!isArchivedChannel(channel)) {\n            LocalStorageStore.removePreviousChannelName(currentUserId, currentTeam.id, state);\n        }\n        const {error} = await dispatch(leaveChannelRedux(channelId));\n        if (error) {\n            return {error};\n        }\n        state = getState();\n\n        const prevChannelName = LocalStorageStore.getPreviousChannelName(currentUserId, currentTeam.id, state);\n        const channelsInTeam = getChannelsNameMapInCurrentTeam(state);\n        const prevChannel = getChannelByName(channelsInTeam, prevChannelName);\n        if (!prevChannel || !getMyChannelMemberships(state)[prevChannel.id]) {\n            LocalStorageStore.removePreviousChannelName(currentUserId, currentTeam.id, state);\n        }\n\n        if (getMyChannels(getState()).filter((c) => c.type === Constants.OPEN_CHANNEL || c.type === Constants.PRIVATE_CHANNEL).length === 0) {\n            LocalStorageStore.removePreviousChannelName(currentUserId, currentTeam.id, state);\n            dispatch(selectTeam(''));\n            dispatch({type: TeamTypes.LEAVE_TEAM, data: currentTeam});\n            browserHistory.push('/');\n        } else {\n            browserHistory.push(teamUrl);\n        }\n\n        return {\n            data: true,\n        };\n    };\n}\n\nexport function leaveDirectChannel(channelName) {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const currentUserId = getCurrentUserId(state);\n        const teams = getTeamsList(state); // dms are shared across teams but on local storage are set linked to one, we need to look into all.\n        teams.forEach((currentTeam) => {\n            const previousChannel = LocalStorageStore.getPreviousChannelName(currentUserId, currentTeam.id, state);\n            const penultimateChannel = LocalStorageStore.getPenultimateChannelName(currentUserId, currentTeam.id, state);\n            if (channelName === previousChannel) {\n                LocalStorageStore.removePreviousChannelName(currentUserId, currentTeam.id, state);\n            } else if (channelName === penultimateChannel) {\n                LocalStorageStore.removePenultimateChannelName(currentUserId, currentTeam.id, state);\n            }\n        });\n        return {\n            data: true,\n        };\n    };\n}\n\nexport function autocompleteUsersInChannel(prefix, channelId) {\n    const addLastViewAtToProfiles = makeAddLastViewAtToProfiles();\n    return async (dispatch, getState) => {\n        const state = getState();\n        const currentTeamId = getCurrentTeamId(state);\n\n        const respose = await dispatch(autocompleteUsers(prefix, currentTeamId, channelId));\n        const data = respose.data;\n        if (data) {\n            return {\n                ...respose,\n                data: {\n                    ...data,\n                    users: addLastViewAtToProfiles(state, data.users || []),\n                    out_of_channel: addLastViewAtToProfiles(state, data.out_of_channel || []),\n                },\n            };\n        }\n\n        return respose;\n    };\n}\n\nexport function loadUnreads(channelId, prefetch = false) {\n    return async (dispatch) => {\n        const time = Date.now();\n        if (prefetch) {\n            dispatch({\n                type: ActionTypes.PREFETCH_POSTS_FOR_CHANNEL,\n                channelId,\n                status: RequestStatus.STARTED,\n            });\n        }\n        const {data, error} = await dispatch(PostActions.getPostsUnread(channelId));\n        if (error) {\n            if (prefetch) {\n                dispatch({\n                    type: ActionTypes.PREFETCH_POSTS_FOR_CHANNEL,\n                    channelId,\n                    status: RequestStatus.FAILURE,\n                });\n            }\n            return {\n                error,\n                atLatestMessage: false,\n                atOldestmessage: false,\n            };\n        }\n        dispatch(loadCustomStatusEmojisForPostList(data.posts));\n\n        const actions = [];\n        actions.push({\n            type: ActionTypes.INCREASE_POST_VISIBILITY,\n            data: channelId,\n            amount: data.order.length,\n        });\n\n        if (prefetch) {\n            actions.push({\n                type: ActionTypes.PREFETCH_POSTS_FOR_CHANNEL,\n                channelId,\n                status: RequestStatus.SUCCESS,\n            });\n        }\n\n        if (data.next_post_id === '') {\n            actions.push({\n                type: ActionTypes.RECEIVED_POSTS_FOR_CHANNEL_AT_TIME,\n                channelId,\n                time,\n            });\n        }\n\n        dispatch(batchActions(actions));\n        return {\n            atLatestMessage: data.next_post_id === '',\n            atOldestmessage: data.prev_post_id === '',\n        };\n    };\n}\n\nexport function loadPostsAround(channelId, focusedPostId) {\n    return async (dispatch) => {\n        const {data, error} = await dispatch(PostActions.getPostsAround(channelId, focusedPostId, Posts.POST_CHUNK_SIZE / 2));\n        if (error) {\n            return {\n                error,\n                atLatestMessage: false,\n                atOldestmessage: false,\n            };\n        }\n\n        dispatch({\n            type: ActionTypes.INCREASE_POST_VISIBILITY,\n            data: channelId,\n            amount: data.order.length,\n        });\n        return {\n            atLatestMessage: data.next_post_id === '',\n            atOldestmessage: data.prev_post_id === '',\n        };\n    };\n}\n\nexport function loadLatestPosts(channelId) {\n    return async (dispatch) => {\n        const time = Date.now();\n        const {data, error} = await dispatch(PostActions.getPosts(channelId, 0, Posts.POST_CHUNK_SIZE / 2));\n\n        if (error) {\n            return {\n                error,\n                atLatestMessage: false,\n                atOldestmessage: false,\n            };\n        }\n\n        dispatch({\n            type: ActionTypes.RECEIVED_POSTS_FOR_CHANNEL_AT_TIME,\n            channelId,\n            time,\n        });\n\n        return {\n            data,\n            atLatestMessage: data.next_post_id === '',\n            atOldestmessage: data.prev_post_id === '',\n        };\n    };\n}\n\nexport function loadPosts({channelId, postId, type}) {\n    //type here can be BEFORE_ID or AFTER_ID\n    return async (dispatch) => {\n        const POST_INCREASE_AMOUNT = Constants.POST_CHUNK_SIZE / 2;\n\n        dispatch({\n            type: ActionTypes.LOADING_POSTS,\n            data: true,\n            channelId,\n        });\n\n        const page = 0;\n        let result;\n        if (type === PostRequestTypes.BEFORE_ID) {\n            result = await dispatch(PostActions.getPostsBefore(channelId, postId, page, POST_INCREASE_AMOUNT));\n        } else {\n            result = await dispatch(PostActions.getPostsAfter(channelId, postId, page, POST_INCREASE_AMOUNT));\n        }\n\n        const {data} = result;\n\n        const actions = [{\n            type: ActionTypes.LOADING_POSTS,\n            data: false,\n            channelId,\n        }];\n\n        if (result.error) {\n            return {\n                error: result.error,\n                moreToLoad: true,\n            };\n        }\n\n        dispatch(loadCustomStatusEmojisForPostList(data.posts));\n        actions.push({\n            type: ActionTypes.INCREASE_POST_VISIBILITY,\n            data: channelId,\n            amount: data.order.length,\n        });\n\n        dispatch(batchActions(actions));\n\n        return {\n            moreToLoad: type === PostRequestTypes.BEFORE_ID ? data.prev_post_id !== '' : data.next_post_id !== '',\n        };\n    };\n}\n\nexport function syncPostsInChannel(channelId, since, prefetch = false) {\n    return async (dispatch, getState) => {\n        const time = Date.now();\n        const state = getState();\n        const socketStatus = getSocketStatus(state);\n        let sinceTimeToGetPosts = since;\n        const lastPostsApiCallForChannel = getLastPostsApiTimeForChannel(state, channelId);\n        const actions = [];\n\n        if (lastPostsApiCallForChannel && lastPostsApiCallForChannel < socketStatus.lastDisconnectAt) {\n            sinceTimeToGetPosts = lastPostsApiCallForChannel;\n        }\n\n        if (prefetch) {\n            dispatch({\n                type: ActionTypes.PREFETCH_POSTS_FOR_CHANNEL,\n                channelId,\n                status: RequestStatus.STARTED,\n            });\n        }\n\n        const {data, error} = await dispatch(PostActions.getPostsSince(channelId, sinceTimeToGetPosts));\n        if (data) {\n            actions.push({\n                type: ActionTypes.RECEIVED_POSTS_FOR_CHANNEL_AT_TIME,\n                channelId,\n                time,\n            });\n        }\n\n        if (prefetch) {\n            if (error) {\n                actions.push({\n                    type: ActionTypes.PREFETCH_POSTS_FOR_CHANNEL,\n                    channelId,\n                    status: RequestStatus.FAILURE,\n                });\n            } else {\n                actions.push({\n                    type: ActionTypes.PREFETCH_POSTS_FOR_CHANNEL,\n                    channelId,\n                    status: RequestStatus.SUCCESS,\n                });\n            }\n        }\n\n        dispatch(batchActions(actions));\n\n        return {data, error};\n    };\n}\n\nexport function prefetchChannelPosts(channelId, jitter) {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const recentPostIdInChannel = getMostRecentPostIdInChannel(state, channelId);\n\n        if (!state.entities.posts.postsInChannel[channelId] || !recentPostIdInChannel) {\n            if (jitter) {\n                await new Promise((resolve) => setTimeout(resolve, jitter));\n            }\n            return dispatch(loadUnreads(channelId, true));\n        }\n\n        const recentPost = getPost(state, recentPostIdInChannel);\n        return dispatch(syncPostsInChannel(channelId, recentPost.create_at, true));\n    };\n}\n\nexport function scrollPostListToBottom() {\n    return () => {\n        EventEmitter.emit(EventTypes.POST_LIST_SCROLL_TO_BOTTOM);\n    };\n}\n\nexport function markChannelAsReadOnFocus(channelId) {\n    return (dispatch, getState) => {\n        if (isManuallyUnread(getState(), channelId)) {\n            return;\n        }\n\n        dispatch(markChannelAsRead(channelId));\n    };\n}\n\nexport function updateToastStatus(status) {\n    return (dispatch) => {\n        dispatch({\n            type: ActionTypes.UPDATE_TOAST_STATUS,\n            data: status,\n        });\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionTypes} from 'utils/constants';\n\nexport const toggle = () => (dispatch) => dispatch({\n    type: ActionTypes.TOGGLE_LHS,\n});\n\nexport const open = () => (dispatch) => dispatch({\n    type: ActionTypes.OPEN_LHS,\n});\n\nexport const close = () => (dispatch) => dispatch({\n    type: ActionTypes.CLOSE_LHS,\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {DispatchFunc, GetStateFunc} from 'mattermost-redux/types/actions';\n\nimport {ActionTypes, Preferences, RecommendedNextSteps} from 'utils/constants';\n\nexport function setShowNextStepsView(show: boolean) {\n    return {\n        type: ActionTypes.SET_SHOW_NEXT_STEPS_VIEW,\n        show,\n    };\n}\n\nexport const unhideNextSteps = () => {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const userId = getCurrentUserId(getState());\n\n        dispatch(setShowNextStepsView(true));\n\n        dispatch(savePreferences(userId, [{\n            user_id: userId,\n            category: Preferences.RECOMMENDED_NEXT_STEPS,\n            name: RecommendedNextSteps.HIDE,\n            value: 'false',\n        }]));\n    };\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionTypes} from 'utils/constants';\n\nexport function dismissNotice(type) {\n    return (dispatch) => {\n        dispatch({\n            type: ActionTypes.DISMISS_NOTICE,\n            data: type,\n        });\n\n        return {data: true};\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport * as PostActions from 'mattermost-redux/actions/posts';\n\nimport {logError} from 'mattermost-redux/actions/errors';\n\nimport {ActionTypes, AnnouncementBarTypes} from 'utils/constants';\n\nexport function editPost(post) {\n    return async (dispatch, getState) => {\n        const result = await PostActions.editPost(post)(dispatch, getState);\n\n        // Send to error bar if it's an edit post error about time limit.\n        if (result.error && result.error.server_error_id === 'api.post.update_post.permissions_time_limit.app_error') {\n            dispatch(logError({type: AnnouncementBarTypes.ANNOUNCEMENT, message: result.error.message}, true));\n        }\n\n        return result;\n    };\n}\n\nexport function selectAttachmentMenuAction(postId, actionId, cookie, dataSource, text, value) {\n    return async (dispatch) => {\n        dispatch({\n            type: ActionTypes.SELECT_ATTACHMENT_MENU_ACTION,\n            postId,\n            data: {\n                [actionId]: {\n                    text,\n                    value,\n                },\n            },\n        });\n\n        dispatch(PostActions.doPostActionWithCookie(postId, actionId, cookie, value));\n\n        return {data: true};\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getClientConfig, getLicenseConfig} from 'mattermost-redux/actions/general';\nimport * as UserActions from 'mattermost-redux/actions/users';\nimport {getSubscriptionStats} from 'mattermost-redux/actions/cloud';\nimport {Client4} from 'mattermost-redux/client';\n\nimport {ActionTypes} from 'utils/constants';\nimport en from 'i18n/en.json';\nimport {getCurrentLocale, getTranslations} from 'selectors/i18n';\n\nexport function loadMeAndConfig() {\n    return async (dispatch) => {\n        // if any new promise needs to be added please be mindful of the order as it is used in root.jsx for redirection\n        const promises = [\n            dispatch(getClientConfig()),\n            dispatch(getLicenseConfig()),\n        ];\n\n        // need to await for clientConfig first as it is required for loadMe\n        const resolvedPromises = await Promise.all(promises);\n        if (document.cookie.indexOf('MMUSERID=') > -1) {\n            resolvedPromises.push(await dispatch(UserActions.loadMe()));\n        }\n\n        // load the cloud subscription stats\n        const isCloud = resolvedPromises[1]?.data?.Cloud === 'true';\n        if (isCloud) {\n            resolvedPromises.push(await dispatch(getSubscriptionStats()));\n        }\n\n        return resolvedPromises;\n    };\n}\n\nconst pluginTranslationSources = {};\n\nexport function registerPluginTranslationsSource(pluginId, sourceFunction) {\n    pluginTranslationSources[pluginId] = sourceFunction;\n    return (dispatch, getState) => {\n        const state = getState();\n        const locale = getCurrentLocale(state);\n        const immutableTranslations = getTranslations(state, locale);\n        const translations = {};\n        Object.assign(translations, immutableTranslations);\n        if (immutableTranslations) {\n            Object.assign(translations, sourceFunction(locale));\n            dispatch({\n                type: ActionTypes.RECEIVED_TRANSLATIONS,\n                data: {\n                    locale,\n                    translations,\n                },\n            });\n        }\n    };\n}\n\nexport function unregisterPluginTranslationsSource(pluginId) {\n    Reflect.deleteProperty(pluginTranslationSources, pluginId);\n}\n\nexport function loadTranslations(locale, url) {\n    return async (dispatch) => {\n        const translations = {...en};\n        Object.values(pluginTranslationSources).forEach((pluginFunc) => {\n            Object.assign(translations, pluginFunc(locale));\n        });\n\n        // Need to go to the server for languages other than English\n        if (locale !== 'en') {\n            try {\n                const serverTranslations = await Client4.getTranslations(url);\n                Object.assign(translations, serverTranslations);\n            } catch (error) {\n                console.error(error); //eslint-disable-line no-console\n            }\n        }\n        dispatch({\n            type: ActionTypes.RECEIVED_TRANSLATIONS,\n            data: {\n                locale,\n                translations,\n            },\n        });\n    };\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {SearchTypes} from 'utils/constants';\n\nexport function setModalSearchTerm(term) {\n    return {\n        type: SearchTypes.SET_MODAL_SEARCH,\n        data: term,\n    };\n}\n\nexport function setModalFilters(filters = {}) {\n    return {\n        type: SearchTypes.SET_MODAL_FILTERS,\n        data: filters,\n    };\n}\n\nexport function setUserGridSearch(term) {\n    return {\n        type: SearchTypes.SET_USER_GRID_SEARCH,\n        data: term,\n    };\n}\n\nexport function setUserGridFilters(filters = {}) {\n    return {\n        type: SearchTypes.SET_USER_GRID_FILTERS,\n        data: filters,\n    };\n}\n\nexport function setSystemUsersSearch(term, team = '', filter = '') {\n    return {\n        type: SearchTypes.SET_SYSTEM_USERS_SEARCH,\n        data: {term, team, filter},\n    };\n}\n\nexport function setTeamListSearch(term) {\n    return {\n        type: SearchTypes.SET_TEAM_LIST_SEARCH,\n        data: term,\n    };\n}\n\nexport function setChannelListSearch(term) {\n    return {\n        type: SearchTypes.SET_CHANNEL_LIST_SEARCH,\n        data: term,\n    };\n}\n\nexport function setChannelListFilters(filters = {}) {\n    return {\n        type: SearchTypes.SET_CHANNEL_LIST_FILTERS,\n        data: filters,\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {ActionTypes} from '../../utils/constants';\n\nexport function setShowPreviewOnCreateComment(showPreview) {\n    return {\n        type: ActionTypes.SET_SHOW_PREVIEW_ON_CREATE_COMMENT,\n        showPreview,\n    };\n}\n\nexport function setShowPreviewOnCreatePost(showPreview) {\n    return {\n        type: ActionTypes.SET_SHOW_PREVIEW_ON_CREATE_POST,\n        showPreview,\n    };\n}\n\nexport function setShowPreviewOnEditChannelHeaderModal(showPreview) {\n    return {\n        type: ActionTypes.SET_SHOW_PREVIEW_ON_EDIT_CHANNEL_HEADER_MODAL,\n        showPreview,\n    };\n}\n\nexport function setShowPreviewOnEditPostModal(showPreview) {\n    return {\n        type: ActionTypes.SET_SHOW_PREVIEW_ON_EDIT_POST_MODAL,\n        showPreview,\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {UserTypes} from 'mattermost-redux/action_types';\n\nimport {getCurrentUserId, getUsers} from 'mattermost-redux/selectors/entities/users';\n\nimport {ActionFunc, DispatchFunc, GetStateFunc, batchActions} from 'mattermost-redux/types/actions';\n\nimport {getKnownUsers} from './users';\n\nexport function removeNotVisibleUsers(): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState();\n        let knownUsers: Set<string>;\n        try {\n            const fetchResult = await dispatch(getKnownUsers());\n            knownUsers = new Set((fetchResult as any).data);\n        } catch (err) {\n            return {error: err};\n        }\n        knownUsers.add(getCurrentUserId(state));\n\n        const allUsers = Object.keys(getUsers(state));\n        const usersToRemove = new Set(allUsers.filter((x) => !knownUsers.has(x)));\n\n        const actions = [];\n        for (const userToRemove of usersToRemove.values()) {\n            actions.push({type: UserTypes.PROFILE_NO_LONGER_VISIBLE, data: {user_id: userToRemove}});\n        }\n        if (actions.length > 0) {\n            dispatch(batchActions(actions));\n        }\n\n        return {data: true};\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\ntype Props = {\n    currentUserId: string;\n    onHide: () => void;\n    channelName?: string;\n    remover?: string;\n}\n\ntype State = {\n    show: boolean;\n}\n\nexport default class RemovedFromChannelModal extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {show: true};\n    }\n\n    onHide = () => {\n        this.setState({show: false});\n    }\n\n    render() {\n        let channelName: JSX.Element | string;\n        let remover: JSX.Element | string;\n\n        channelName = (\n            <FormattedMessage\n                id='removed_channel.channelName'\n                defaultMessage='the channel'\n            />\n        );\n        if (this.props.channelName) {\n            channelName = this.props.channelName;\n        }\n\n        remover = (\n            <FormattedMessage\n                id='removed_channel.someone'\n                defaultMessage='Someone'\n            />\n        );\n        if (this.props.remover) {\n            remover = this.props.remover;\n        }\n\n        if (this.props.currentUserId === '') {\n            return null;\n        }\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal'\n                show={this.state.show}\n                onHide={this.onHide}\n                onExited={this.props.onHide}\n                role='dialog'\n                aria-labelledby='removeFromChannelModalLabel'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='removeFromChannelModalLabel'\n                    >\n                        <FormattedMessage\n                            id='removed_channel.from'\n                            defaultMessage='Removed from '\n                        />\n                        <span className='name'>\n                            {channelName}\n                        </span>\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    <p>\n                        <FormattedMessage\n                            id='removed_channel.remover'\n                            defaultMessage='{remover} removed you from {channel}'\n                            values={{\n                                remover,\n                                channel: (channelName),\n                            }}\n                        />\n                    </p>\n                </Modal.Body>\n                <Modal.Footer>\n                    <button\n                        type='button'\n                        className='btn btn-primary'\n                        onClick={this.onHide}\n                        id='removedChannelBtn'\n                    >\n                        <FormattedMessage\n                            id='removed_channel.okay'\n                            defaultMessage='Okay'\n                        />\n                    </button>\n                </Modal.Footer>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentUserId, getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {GlobalState} from 'types/store';\n\nimport RemovedFromChannelModal from './removed_from_channel_modal';\n\ntype Props = {\n    removerId: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const remover = getUser(state, ownProps.removerId);\n    return {\n        currentUserId: getCurrentUserId(state),\n        remover: remover && remover.username,\n    };\n}\n\nexport default connect(mapStateToProps)(RemovedFromChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable max-lines */\n\nimport {batchActions} from 'redux-batched-actions';\n\nimport {\n    ChannelTypes,\n    EmojiTypes,\n    GroupTypes,\n    PostTypes,\n    TeamTypes,\n    UserTypes,\n    RoleTypes,\n    GeneralTypes,\n    AdminTypes,\n    IntegrationTypes,\n    PreferenceTypes,\n} from 'mattermost-redux/action_types';\nimport {WebsocketEvents, General, Permissions} from 'mattermost-redux/constants';\nimport {addChannelToInitialCategory, fetchMyCategories, receivedCategoryOrder} from 'mattermost-redux/actions/channel_categories';\nimport {\n    getChannelAndMyMember,\n    getMyChannelMember,\n    getChannelMember,\n    getChannelStats,\n    viewChannel,\n    markChannelAsRead,\n    getChannelMemberCountsByGroup,\n} from 'mattermost-redux/actions/channels';\nimport {getCloudSubscription, getSubscriptionStats} from 'mattermost-redux/actions/cloud';\nimport {loadRolesIfNeeded} from 'mattermost-redux/actions/roles';\n\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getThread, getThreads} from 'mattermost-redux/selectors/entities/threads';\nimport {\n    getThread as fetchThread,\n    getThreads as fetchThreads,\n    handleAllMarkedRead,\n    handleReadChanged,\n    handleFollowChanged,\n    handleThreadArrived,\n    handleAllThreadsInChannelMarkedRead,\n    updateThreadRead,\n} from 'mattermost-redux/actions/threads';\n\nimport {setServerVersion} from 'mattermost-redux/actions/general';\nimport {\n    getCustomEmojiForReaction,\n    getPosts,\n    getProfilesAndStatusesForPosts,\n    getThreadsForPosts,\n    postDeleted,\n    receivedNewPost,\n    receivedPost,\n} from 'mattermost-redux/actions/posts';\nimport {clearErrors, logError} from 'mattermost-redux/actions/errors';\n\nimport * as TeamActions from 'mattermost-redux/actions/teams';\nimport {\n    checkForModifiedUsers,\n    getMe,\n    getMissingProfilesByIds,\n    getStatusesByIds,\n    getUser as loadUser,\n} from 'mattermost-redux/actions/users';\nimport {removeNotVisibleUsers} from 'mattermost-redux/actions/websocket';\nimport {Client4} from 'mattermost-redux/client';\nimport {getCurrentUser, getCurrentUserId, getStatusForUserId, getUser, getIsManualStatusForUserId, isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\nimport {getMyTeams, getCurrentRelativeTeamUrl, getCurrentTeamId, getCurrentTeamUrl, getTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getChannelsInTeam, getChannel, getCurrentChannel, getCurrentChannelId, getRedirectChannelNameForTeam, getMembersInCurrentChannel, getChannelMembersInChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getPost, getMostRecentPostIdInChannel} from 'mattermost-redux/selectors/entities/posts';\nimport {haveISystemPermission, haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\nimport {getStandardAnalytics} from 'mattermost-redux/actions/admin';\n\nimport {fetchAppBindings} from 'mattermost-redux/actions/apps';\n\nimport {getSelectedChannelId} from 'selectors/rhs';\nimport {isThreadOpen, isThreadManuallyUnread} from 'selectors/views/threads';\n\nimport {openModal} from 'actions/views/modals';\nimport {incrementWsErrorCount, resetWsErrorCount} from 'actions/views/system';\nimport {closeRightHandSide} from 'actions/views/rhs';\nimport {syncPostsInChannel} from 'actions/views/channel';\nimport {updateThreadLastOpened} from 'actions/views/threads';\n\nimport {browserHistory} from 'utils/browser_history';\nimport {loadChannelsForCurrentUser} from 'actions/channel_actions.jsx';\nimport {loadCustomEmojisIfNeeded} from 'actions/emoji_actions';\nimport {redirectUserToDefaultTeam} from 'actions/global_actions';\nimport {handleNewPost} from 'actions/post_actions.jsx';\nimport * as StatusActions from 'actions/status_actions.jsx';\nimport {loadProfilesForSidebar} from 'actions/user_actions.jsx';\nimport store from 'stores/redux_store.jsx';\nimport WebSocketClient from 'client/web_websocket_client.jsx';\nimport {loadPlugin, loadPluginsIfNecessary, removePlugin} from 'plugins';\nimport {ActionTypes, Constants, AnnouncementBarMessages, SocketEvents, UserStatuses, ModalIdentifiers, WarnMetricTypes} from 'utils/constants';\nimport {getSiteURL} from 'utils/url';\nimport {isGuest} from 'utils/utils';\nimport RemovedFromChannelModal from 'components/removed_from_channel_modal';\nimport InteractiveDialog from 'components/interactive_dialog';\n\nconst dispatch = store.dispatch;\nconst getState = store.getState;\n\nconst MAX_WEBSOCKET_FAILS = 7;\n\nconst pluginEventHandlers = {};\n\nexport function initialize() {\n    if (!window.WebSocket) {\n        console.log('Browser does not support websocket'); //eslint-disable-line no-console\n        return;\n    }\n\n    const config = getConfig(getState());\n    let connUrl = '';\n    if (config.WebsocketURL) {\n        connUrl = config.WebsocketURL;\n    } else {\n        connUrl = new URL(getSiteURL());\n\n        // replace the protocol with a websocket one\n        if (connUrl.protocol === 'https:') {\n            connUrl.protocol = 'wss:';\n        } else {\n            connUrl.protocol = 'ws:';\n        }\n\n        // append a port number if one isn't already specified\n        if (!(/:\\d+$/).test(connUrl.host)) {\n            if (connUrl.protocol === 'wss:') {\n                connUrl.host += ':' + config.WebsocketSecurePort;\n            } else {\n                connUrl.host += ':' + config.WebsocketPort;\n            }\n        }\n\n        connUrl = connUrl.toString();\n    }\n\n    // Strip any trailing slash before appending the pathname below.\n    if (connUrl.length > 0 && connUrl[connUrl.length - 1] === '/') {\n        connUrl = connUrl.substring(0, connUrl.length - 1);\n    }\n\n    connUrl += Client4.getUrlVersion() + '/websocket';\n\n    WebSocketClient.setEventCallback(handleEvent);\n    WebSocketClient.setFirstConnectCallback(handleFirstConnect);\n    WebSocketClient.setReconnectCallback(() => reconnect(false));\n    WebSocketClient.setMissedEventCallback(() => reconnect(false));\n    WebSocketClient.setCloseCallback(handleClose);\n    WebSocketClient.initialize(connUrl);\n}\n\nexport function close() {\n    WebSocketClient.close();\n}\n\nfunction reconnectWebSocket() {\n    close();\n    initialize();\n}\n\nconst pluginReconnectHandlers = {};\n\nexport function registerPluginReconnectHandler(pluginId, handler) {\n    pluginReconnectHandlers[pluginId] = handler;\n}\n\nexport function unregisterPluginReconnectHandler(pluginId) {\n    Reflect.deleteProperty(pluginReconnectHandlers, pluginId);\n}\n\nexport function reconnect(includeWebSocket = true) {\n    if (includeWebSocket) {\n        reconnectWebSocket();\n    }\n\n    dispatch({\n        type: GeneralTypes.WEBSOCKET_SUCCESS,\n        timestamp: Date.now(),\n    });\n\n    loadPluginsIfNecessary();\n\n    Object.values(pluginReconnectHandlers).forEach((handler) => {\n        if (handler && typeof handler === 'function') {\n            handler();\n        }\n    });\n\n    const state = getState();\n    const currentTeamId = state.entities.teams.currentTeamId;\n    if (currentTeamId) {\n        const currentUserId = getCurrentUserId(state);\n        const currentChannelId = getCurrentChannelId(state);\n        const mostRecentId = getMostRecentPostIdInChannel(state, currentChannelId);\n        const mostRecentPost = getPost(state, mostRecentId);\n\n        dispatch(loadChannelsForCurrentUser());\n        dispatch(handleRefreshAppsBindings());\n\n        if (mostRecentPost) {\n            dispatch(syncPostsInChannel(currentChannelId, mostRecentPost.create_at));\n        } else {\n            // if network timed-out the first time when loading a channel\n            // we can request for getPosts again when socket is connected\n            dispatch(getPosts(currentChannelId));\n        }\n        StatusActions.loadStatusesForChannelAndSidebar();\n\n        const crtEnabled = isCollapsedThreadsEnabled(state);\n        dispatch(TeamActions.getMyTeamUnreads(crtEnabled, true));\n        if (crtEnabled) {\n            dispatch(fetchThreads(currentUserId, currentTeamId, {unread: true, perPage: 200}));\n        }\n    }\n\n    if (state.websocket.lastDisconnectAt) {\n        dispatch(checkForModifiedUsers());\n    }\n\n    dispatch(resetWsErrorCount());\n    dispatch(clearErrors());\n}\n\nlet intervalId = '';\nconst SYNC_INTERVAL_MILLISECONDS = 1000 * 60 * 15; // 15 minutes\n\nexport function startPeriodicSync() {\n    clearInterval(intervalId);\n\n    intervalId = setInterval(\n        () => {\n            if (getCurrentUser(getState()) != null) {\n                reconnect(false);\n            }\n        },\n        SYNC_INTERVAL_MILLISECONDS,\n    );\n}\n\nexport function stopPeriodicSync() {\n    clearInterval(intervalId);\n}\n\nexport function registerPluginWebSocketEvent(pluginId, event, action) {\n    if (!pluginEventHandlers[pluginId]) {\n        pluginEventHandlers[pluginId] = {};\n    }\n    pluginEventHandlers[pluginId][event] = action;\n}\n\nexport function unregisterPluginWebSocketEvent(pluginId, event) {\n    const events = pluginEventHandlers[pluginId];\n    if (!events) {\n        return;\n    }\n\n    Reflect.deleteProperty(events, event);\n}\n\nexport function unregisterAllPluginWebSocketEvents(pluginId) {\n    Reflect.deleteProperty(pluginEventHandlers, pluginId);\n}\n\nfunction handleFirstConnect() {\n    dispatch(batchActions([\n        {\n            type: GeneralTypes.WEBSOCKET_SUCCESS,\n            timestamp: Date.now(),\n        },\n        clearErrors(),\n    ]));\n}\n\nfunction handleClose(failCount) {\n    if (failCount > MAX_WEBSOCKET_FAILS) {\n        dispatch(logError({type: 'critical', message: AnnouncementBarMessages.WEBSOCKET_PORT_ERROR}, true));\n    }\n    dispatch(batchActions([\n        {\n            type: GeneralTypes.WEBSOCKET_FAILURE,\n            timestamp: Date.now(),\n        },\n        incrementWsErrorCount(),\n    ]));\n}\n\nexport function handleEvent(msg) {\n    switch (msg.event) {\n    case SocketEvents.POSTED:\n    case SocketEvents.EPHEMERAL_MESSAGE:\n        handleNewPostEventDebounced(msg);\n        break;\n\n    case SocketEvents.POST_EDITED:\n        handlePostEditEvent(msg);\n        break;\n\n    case SocketEvents.POST_DELETED:\n        handlePostDeleteEvent(msg);\n        break;\n\n    case SocketEvents.POST_UNREAD:\n        handlePostUnreadEvent(msg);\n        break;\n\n    case SocketEvents.LEAVE_TEAM:\n        handleLeaveTeamEvent(msg);\n        break;\n\n    case SocketEvents.UPDATE_TEAM:\n        handleUpdateTeamEvent(msg);\n        break;\n\n    case SocketEvents.UPDATE_TEAM_SCHEME:\n        handleUpdateTeamSchemeEvent(msg);\n        break;\n\n    case SocketEvents.DELETE_TEAM:\n        handleDeleteTeamEvent(msg);\n        break;\n\n    case SocketEvents.ADDED_TO_TEAM:\n        handleTeamAddedEvent(msg);\n        break;\n\n    case SocketEvents.USER_ADDED:\n        dispatch(handleUserAddedEvent(msg));\n        break;\n\n    case SocketEvents.USER_REMOVED:\n        handleUserRemovedEvent(msg);\n        break;\n\n    case SocketEvents.USER_UPDATED:\n        handleUserUpdatedEvent(msg);\n        break;\n\n    case SocketEvents.ROLE_ADDED:\n        handleRoleAddedEvent(msg);\n        break;\n\n    case SocketEvents.ROLE_REMOVED:\n        handleRoleRemovedEvent(msg);\n        break;\n\n    case SocketEvents.CHANNEL_SCHEME_UPDATED:\n        handleChannelSchemeUpdatedEvent(msg);\n        break;\n\n    case SocketEvents.MEMBERROLE_UPDATED:\n        handleUpdateMemberRoleEvent(msg);\n        break;\n\n    case SocketEvents.ROLE_UPDATED:\n        handleRoleUpdatedEvent(msg);\n        break;\n\n    case SocketEvents.CHANNEL_CREATED:\n        dispatch(handleChannelCreatedEvent(msg));\n        break;\n\n    case SocketEvents.CHANNEL_DELETED:\n        handleChannelDeletedEvent(msg);\n        break;\n\n    case SocketEvents.CHANNEL_UNARCHIVED:\n        handleChannelUnarchivedEvent(msg);\n        break;\n\n    case SocketEvents.CHANNEL_CONVERTED:\n        handleChannelConvertedEvent(msg);\n        break;\n\n    case SocketEvents.CHANNEL_UPDATED:\n        dispatch(handleChannelUpdatedEvent(msg));\n        break;\n\n    case SocketEvents.CHANNEL_MEMBER_UPDATED:\n        handleChannelMemberUpdatedEvent(msg);\n        break;\n\n    case SocketEvents.DIRECT_ADDED:\n        dispatch(handleDirectAddedEvent(msg));\n        break;\n\n    case SocketEvents.GROUP_ADDED:\n        dispatch(handleGroupAddedEvent(msg));\n        break;\n\n    case SocketEvents.PREFERENCE_CHANGED:\n        handlePreferenceChangedEvent(msg);\n        break;\n\n    case SocketEvents.PREFERENCES_CHANGED:\n        handlePreferencesChangedEvent(msg);\n        break;\n\n    case SocketEvents.PREFERENCES_DELETED:\n        handlePreferencesDeletedEvent(msg);\n        break;\n\n    case SocketEvents.TYPING:\n        dispatch(handleUserTypingEvent(msg));\n        break;\n\n    case SocketEvents.STATUS_CHANGED:\n        handleStatusChangedEvent(msg);\n        break;\n\n    case SocketEvents.HELLO:\n        handleHelloEvent(msg);\n        break;\n\n    case SocketEvents.REACTION_ADDED:\n        handleReactionAddedEvent(msg);\n        break;\n\n    case SocketEvents.REACTION_REMOVED:\n        handleReactionRemovedEvent(msg);\n        break;\n\n    case SocketEvents.EMOJI_ADDED:\n        handleAddEmoji(msg);\n        break;\n\n    case SocketEvents.CHANNEL_VIEWED:\n        handleChannelViewedEvent(msg);\n        break;\n\n    case SocketEvents.PLUGIN_ENABLED:\n        handlePluginEnabled(msg);\n        break;\n\n    case SocketEvents.PLUGIN_DISABLED:\n        handlePluginDisabled(msg);\n        break;\n\n    case SocketEvents.USER_ROLE_UPDATED:\n        handleUserRoleUpdated(msg);\n        break;\n\n    case SocketEvents.CONFIG_CHANGED:\n        handleConfigChanged(msg);\n        break;\n\n    case SocketEvents.LICENSE_CHANGED:\n        handleLicenseChanged(msg);\n        break;\n\n    case SocketEvents.PLUGIN_STATUSES_CHANGED:\n        handlePluginStatusesChangedEvent(msg);\n        break;\n\n    case SocketEvents.OPEN_DIALOG:\n        handleOpenDialogEvent(msg);\n        break;\n\n    case SocketEvents.RECEIVED_GROUP:\n        handleGroupUpdatedEvent(msg);\n        break;\n\n    case SocketEvents.RECEIVED_GROUP_ASSOCIATED_TO_TEAM:\n        handleGroupAssociatedToTeamEvent(msg);\n        break;\n\n    case SocketEvents.RECEIVED_GROUP_NOT_ASSOCIATED_TO_TEAM:\n        handleGroupNotAssociatedToTeamEvent(msg);\n        break;\n\n    case SocketEvents.RECEIVED_GROUP_ASSOCIATED_TO_CHANNEL:\n        handleGroupAssociatedToChannelEvent(msg);\n        break;\n\n    case SocketEvents.RECEIVED_GROUP_NOT_ASSOCIATED_TO_CHANNEL:\n        handleGroupNotAssociatedToChannelEvent(msg);\n        break;\n\n    case SocketEvents.WARN_METRIC_STATUS_RECEIVED:\n        handleWarnMetricStatusReceivedEvent(msg);\n        break;\n\n    case SocketEvents.WARN_METRIC_STATUS_REMOVED:\n        handleWarnMetricStatusRemovedEvent(msg);\n        break;\n\n    case SocketEvents.SIDEBAR_CATEGORY_CREATED:\n        dispatch(handleSidebarCategoryCreated(msg));\n        break;\n\n    case SocketEvents.SIDEBAR_CATEGORY_UPDATED:\n        dispatch(handleSidebarCategoryUpdated(msg));\n        break;\n\n    case SocketEvents.SIDEBAR_CATEGORY_DELETED:\n        dispatch(handleSidebarCategoryDeleted(msg));\n        break;\n    case SocketEvents.SIDEBAR_CATEGORY_ORDER_UPDATED:\n        dispatch(handleSidebarCategoryOrderUpdated(msg));\n        break;\n    case SocketEvents.USER_ACTIVATION_STATUS_CHANGED:\n        dispatch(handleUserActivationStatusChange());\n        break;\n    case SocketEvents.CLOUD_PAYMENT_STATUS_UPDATED:\n        dispatch(handleCloudPaymentStatusUpdated(msg));\n        break;\n    case SocketEvents.FIRST_ADMIN_VISIT_MARKETPLACE_STATUS_RECEIVED:\n        handleFirstAdminVisitMarketplaceStatusReceivedEvent(msg);\n        break;\n    case SocketEvents.THREAD_FOLLOW_CHANGED:\n        dispatch(handleThreadFollowChanged(msg));\n        break;\n    case SocketEvents.THREAD_READ_CHANGED:\n        dispatch(handleThreadReadChanged(msg));\n        break;\n    case SocketEvents.THREAD_UPDATED:\n        dispatch(handleThreadUpdated(msg));\n        break;\n\n    case SocketEvents.APPS_FRAMEWORK_REFRESH_BINDINGS: {\n        dispatch(handleRefreshAppsBindings(msg));\n        break;\n    }\n    default:\n    }\n\n    Object.values(pluginEventHandlers).forEach((pluginEvents) => {\n        if (!pluginEvents) {\n            return;\n        }\n\n        if (pluginEvents.hasOwnProperty(msg.event) && typeof pluginEvents[msg.event] === 'function') {\n            pluginEvents[msg.event](msg);\n        }\n    });\n}\n\n// handleChannelConvertedEvent handles updating of channel which is converted from public to private\nfunction handleChannelConvertedEvent(msg) {\n    const channelId = msg.data.channel_id;\n    if (channelId) {\n        const channel = getChannel(getState(), channelId);\n        if (channel) {\n            dispatch({\n                type: ChannelTypes.RECEIVED_CHANNEL,\n                data: {...channel, type: General.PRIVATE_CHANNEL},\n            });\n        }\n    }\n}\n\nexport function handleChannelUpdatedEvent(msg) {\n    return (doDispatch, doGetState) => {\n        const channel = JSON.parse(msg.data.channel);\n\n        doDispatch({type: ChannelTypes.RECEIVED_CHANNEL, data: channel});\n\n        const state = doGetState();\n        if (channel.id === getCurrentChannelId(state)) {\n            browserHistory.replace(`${getCurrentRelativeTeamUrl(state)}/channels/${channel.name}`);\n        }\n    };\n}\n\nfunction handleChannelMemberUpdatedEvent(msg) {\n    const channelMember = JSON.parse(msg.data.channelMember);\n    const roles = channelMember.roles.split(' ');\n    dispatch(loadRolesIfNeeded(roles));\n    dispatch({type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER, data: channelMember});\n}\n\nfunction debouncePostEvent(wait) {\n    let timeout;\n    let queue = [];\n    let count = 0;\n\n    // Called when timeout triggered\n    const triggered = () => {\n        timeout = null;\n\n        if (queue.length > 0) {\n            dispatch(handleNewPostEvents(queue));\n        }\n\n        queue = [];\n        count = 0;\n    };\n\n    return function fx(msg) {\n        if (timeout && count > 4) {\n            // If the timeout is going this is the second or further event so queue them up.\n            if (queue.push(msg) > 200) {\n                // Don't run us out of memory, give up if the queue gets insane\n                queue = [];\n                console.log('channel broken because of too many incoming messages'); //eslint-disable-line no-console\n            }\n            clearTimeout(timeout);\n            timeout = setTimeout(triggered, wait);\n        } else {\n            // Apply immediately for events up until count reaches limit\n            count += 1;\n            dispatch(handleNewPostEvent(msg));\n            clearTimeout(timeout);\n            timeout = setTimeout(triggered, wait);\n        }\n    };\n}\n\nconst handleNewPostEventDebounced = debouncePostEvent(100);\n\nexport function handleNewPostEvent(msg) {\n    return (myDispatch, myGetState) => {\n        const post = JSON.parse(msg.data.post);\n        myDispatch(handleNewPost(post, msg));\n\n        getProfilesAndStatusesForPosts([post], myDispatch, myGetState);\n\n        // Since status updates aren't real time, assume another user is online if they have posted and:\n        // 1. The user hasn't set their status manually to something that isn't online\n        // 2. The server hasn't told the client not to set the user to online. This happens when:\n        //     a. The post is from the auto responder\n        //     b. The post is a response to a push notification\n        if (\n            post.user_id !== getCurrentUserId(myGetState()) &&\n            !getIsManualStatusForUserId(myGetState(), post.user_id) &&\n            msg.data.set_online\n        ) {\n            myDispatch({\n                type: UserTypes.RECEIVED_STATUSES,\n                data: [{user_id: post.user_id, status: UserStatuses.ONLINE}],\n            });\n        }\n    };\n}\n\nexport function handleNewPostEvents(queue) {\n    return (myDispatch, myGetState) => {\n        // Note that this method doesn't properly update the sidebar state for these posts\n        const posts = queue.map((msg) => JSON.parse(msg.data.post));\n\n        // Receive the posts as one continuous block since they were received within a short period\n        const crtEnabled = isCollapsedThreadsEnabled(myGetState());\n        const actions = posts.map((post) => receivedNewPost(post, crtEnabled));\n        myDispatch(batchActions(actions));\n\n        // Load the posts' threads\n        myDispatch(getThreadsForPosts(posts));\n\n        // And any other data needed for them\n        getProfilesAndStatusesForPosts(posts, myDispatch, myGetState);\n    };\n}\n\nexport function handlePostEditEvent(msg) {\n    // Store post\n    const post = JSON.parse(msg.data.post);\n    dispatch(receivedPost(post));\n\n    getProfilesAndStatusesForPosts([post], dispatch, getState);\n    const currentChannelId = getCurrentChannelId(getState());\n\n    // Update channel state\n    if (currentChannelId === msg.broadcast.channel_id) {\n        dispatch(getChannelStats(currentChannelId));\n        if (window.isActive) {\n            dispatch(viewChannel(currentChannelId));\n        }\n    }\n}\n\nfunction handlePostDeleteEvent(msg) {\n    const post = JSON.parse(msg.data.post);\n    dispatch(postDeleted(post));\n    if (post.is_pinned) {\n        dispatch(getChannelStats(post.channel_id));\n    }\n}\n\nexport function handlePostUnreadEvent(msg) {\n    dispatch(\n        {\n            type: ActionTypes.POST_UNREAD_SUCCESS,\n            data: {\n                lastViewedAt: msg.data.last_viewed_at,\n                channelId: msg.broadcast.channel_id,\n                msgCount: msg.data.msg_count,\n                msgCountRoot: msg.data.msg_count_root,\n                mentionCount: msg.data.mention_count,\n                mentionCountRoot: msg.data.mention_count_root,\n            },\n        },\n    );\n}\n\nasync function handleTeamAddedEvent(msg) {\n    await dispatch(TeamActions.getTeam(msg.data.team_id));\n    await dispatch(TeamActions.getMyTeamMembers());\n    const state = getState();\n    await dispatch(TeamActions.getMyTeamUnreads(isCollapsedThreadsEnabled(state)));\n}\n\nexport function handleLeaveTeamEvent(msg) {\n    const state = getState();\n\n    const actions = [\n        {\n            type: UserTypes.RECEIVED_PROFILE_NOT_IN_TEAM,\n            data: {id: msg.data.team_id, user_id: msg.data.user_id},\n        },\n        {\n            type: TeamTypes.REMOVE_MEMBER_FROM_TEAM,\n            data: {team_id: msg.data.team_id, user_id: msg.data.user_id},\n        },\n    ];\n\n    const channelsPerTeam = getChannelsInTeam(state);\n    const channels = (channelsPerTeam && channelsPerTeam[msg.data.team_id]) || [];\n\n    for (const channel of channels) {\n        actions.push({\n            type: ChannelTypes.REMOVE_MEMBER_FROM_CHANNEL,\n            data: {id: channel, user_id: msg.data.user_id},\n        });\n    }\n\n    dispatch(batchActions(actions));\n    const currentUser = getCurrentUser(state);\n\n    if (currentUser.id === msg.data.user_id) {\n        dispatch({type: TeamTypes.LEAVE_TEAM, data: {id: msg.data.team_id}});\n\n        // if they are on the team being removed redirect them to default team\n        if (getCurrentTeamId(state) === msg.data.team_id) {\n            if (!global.location.pathname.startsWith('/admin_console')) {\n                redirectUserToDefaultTeam();\n            }\n        }\n        if (isGuest(currentUser)) {\n            dispatch(removeNotVisibleUsers());\n        }\n    } else {\n        const team = getTeam(state, msg.data.team_id);\n        const members = getChannelMembersInChannels(state);\n        const isMember = Object.values(members).some((member) => member[msg.data.user_id]);\n        if (team && isGuest(currentUser) && !isMember) {\n            dispatch(batchActions([\n                {\n                    type: UserTypes.PROFILE_NO_LONGER_VISIBLE,\n                    data: {user_id: msg.data.user_id},\n                },\n                {\n                    type: TeamTypes.REMOVE_MEMBER_FROM_TEAM,\n                    data: {team_id: team.id, user_id: msg.data.user_id},\n                },\n            ]));\n        }\n    }\n}\n\nfunction handleUpdateTeamEvent(msg) {\n    dispatch({type: TeamTypes.UPDATED_TEAM, data: JSON.parse(msg.data.team)});\n}\n\nfunction handleUpdateTeamSchemeEvent() {\n    dispatch(TeamActions.getMyTeamMembers());\n}\n\nfunction handleDeleteTeamEvent(msg) {\n    const deletedTeam = JSON.parse(msg.data.team);\n    const state = store.getState();\n    const {teams} = state.entities.teams;\n    if (\n        deletedTeam &&\n        teams &&\n        teams[deletedTeam.id] &&\n        teams[deletedTeam.id].delete_at === 0\n    ) {\n        const {currentUserId} = state.entities.users;\n        const {currentTeamId, myMembers} = state.entities.teams;\n        const teamMembers = Object.values(myMembers);\n        const teamMember = teamMembers.find((m) => m.user_id === currentUserId && m.team_id === currentTeamId);\n\n        let newTeamId = '';\n        if (\n            deletedTeam &&\n            teamMember &&\n            deletedTeam.id === teamMember.team_id\n        ) {\n            const myTeams = {};\n            getMyTeams(state).forEach((t) => {\n                myTeams[t.id] = t;\n            });\n\n            for (let i = 0; i < teamMembers.length; i++) {\n                const memberTeamId = teamMembers[i].team_id;\n                if (\n                    myTeams &&\n                    myTeams[memberTeamId] &&\n                    myTeams[memberTeamId].delete_at === 0 &&\n                    deletedTeam.id !== memberTeamId\n                ) {\n                    newTeamId = memberTeamId;\n                    break;\n                }\n            }\n        }\n\n        dispatch(batchActions([\n            {type: TeamTypes.RECEIVED_TEAM_DELETED, data: {id: deletedTeam.id}},\n            {type: TeamTypes.UPDATED_TEAM, data: deletedTeam},\n        ]));\n\n        if (browserHistory.location?.pathname === `/admin_console/user_management/teams/${deletedTeam.id}`) {\n            return;\n        }\n\n        if (newTeamId) {\n            dispatch({type: TeamTypes.SELECT_TEAM, data: newTeamId});\n            const globalState = getState();\n            const redirectChannel = getRedirectChannelNameForTeam(globalState, newTeamId);\n            browserHistory.push(`${getCurrentTeamUrl(globalState)}/channels/${redirectChannel}`);\n        } else {\n            browserHistory.push('/');\n        }\n    }\n}\n\nfunction handleUpdateMemberRoleEvent(msg) {\n    const memberData = JSON.parse(msg.data.member);\n    const newRoles = memberData.roles.split(' ');\n\n    dispatch(loadRolesIfNeeded(newRoles));\n\n    dispatch({\n        type: TeamTypes.RECEIVED_MY_TEAM_MEMBER,\n        data: memberData,\n    });\n}\n\nfunction handleDirectAddedEvent(msg) {\n    return fetchChannelAndAddToSidebar(msg.broadcast.channel_id);\n}\n\nfunction handleGroupAddedEvent(msg) {\n    return fetchChannelAndAddToSidebar(msg.broadcast.channel_id);\n}\n\nfunction handleUserAddedEvent(msg) {\n    return async (doDispatch, doGetState) => {\n        const state = doGetState();\n        const config = getConfig(state);\n        const license = getLicense(state);\n        const isTimezoneEnabled = config.ExperimentalTimezone === 'true';\n        const currentChannelId = getCurrentChannelId(state);\n        if (currentChannelId === msg.broadcast.channel_id) {\n            doDispatch(getChannelStats(currentChannelId));\n            doDispatch({\n                type: UserTypes.RECEIVED_PROFILE_IN_CHANNEL,\n                data: {id: msg.broadcast.channel_id, user_id: msg.data.user_id},\n            });\n            if (license?.IsLicensed === 'true' && license?.LDAPGroups === 'true') {\n                doDispatch(getChannelMemberCountsByGroup(currentChannelId, isTimezoneEnabled));\n            }\n        }\n\n        // Load the channel so that it appears in the sidebar\n        const currentTeamId = getCurrentTeamId(doGetState());\n        const currentUserId = getCurrentUserId(doGetState());\n        if (currentTeamId === msg.data.team_id && currentUserId === msg.data.user_id) {\n            doDispatch(fetchChannelAndAddToSidebar(msg.broadcast.channel_id));\n        }\n\n        // This event is fired when a user first joins the server, so refresh analytics to see if we're now over the user limit\n        if (license.Cloud === 'true' && isCurrentUserSystemAdmin(doGetState())) {\n            doDispatch(getStandardAnalytics());\n        }\n    };\n}\n\nfunction fetchChannelAndAddToSidebar(channelId) {\n    return async (doDispatch) => {\n        const {data, error} = await doDispatch(getChannelAndMyMember(channelId));\n\n        if (!error) {\n            doDispatch(addChannelToInitialCategory(data.channel));\n        }\n    };\n}\n\nexport async function handleUserRemovedEvent(msg) {\n    const state = getState();\n    const currentChannel = getCurrentChannel(state) || {};\n    const currentUser = getCurrentUser(state);\n    const config = getConfig(state);\n    const license = getLicense(state);\n    const isTimezoneEnabled = config.ExperimentalTimezone === 'true';\n\n    if (msg.broadcast.user_id === currentUser.id) {\n        dispatch(loadChannelsForCurrentUser());\n\n        const rhsChannelId = getSelectedChannelId(state);\n        if (msg.data.channel_id === rhsChannelId) {\n            dispatch(closeRightHandSide());\n        }\n\n        if (msg.data.channel_id === currentChannel.id) {\n            if (msg.data.remover_id === msg.broadcast.user_id) {\n                browserHistory.push(getCurrentRelativeTeamUrl(state));\n\n                await dispatch({\n                    type: ChannelTypes.LEAVE_CHANNEL,\n                    data: {id: msg.data.channel_id, user_id: msg.broadcast.user_id},\n                });\n            } else {\n                const user = getUser(state, msg.data.remover_id);\n                if (!user) {\n                    dispatch(loadUser(msg.data.remover_id));\n                }\n\n                dispatch(openModal({\n                    modalId: ModalIdentifiers.REMOVED_FROM_CHANNEL,\n                    dialogType: RemovedFromChannelModal,\n                    dialogProps: {\n                        channelName: currentChannel.display_name,\n                        removerId: msg.data.remover_id,\n                    },\n                }));\n\n                await dispatch({\n                    type: ChannelTypes.LEAVE_CHANNEL,\n                    data: {id: msg.data.channel_id, user_id: msg.broadcast.user_id},\n                });\n\n                redirectUserToDefaultTeam();\n            }\n        }\n\n        if (isGuest(currentUser)) {\n            dispatch(removeNotVisibleUsers());\n        }\n    } else if (msg.broadcast.channel_id === currentChannel.id) {\n        dispatch(getChannelStats(currentChannel.id));\n        dispatch({\n            type: UserTypes.RECEIVED_PROFILE_NOT_IN_CHANNEL,\n            data: {id: msg.broadcast.channel_id, user_id: msg.data.user_id},\n        });\n        if (license?.IsLicensed === 'true' && license?.LDAPGroups === 'true') {\n            dispatch(getChannelMemberCountsByGroup(currentChannel.id, isTimezoneEnabled));\n        }\n    }\n\n    if (msg.broadcast.user_id !== currentUser.id) {\n        const channel = getChannel(state, msg.broadcast.channel_id);\n        const members = getChannelMembersInChannels(state);\n        const isMember = Object.values(members).some((member) => member[msg.data.user_id]);\n        if (channel && isGuest(currentUser) && !isMember) {\n            const actions = [\n                {\n                    type: UserTypes.PROFILE_NO_LONGER_VISIBLE,\n                    data: {user_id: msg.data.user_id},\n                },\n                {\n                    type: TeamTypes.REMOVE_MEMBER_FROM_TEAM,\n                    data: {team_id: channel.team_id, user_id: msg.data.user_id},\n                },\n            ];\n            dispatch(batchActions(actions));\n        }\n    }\n\n    const channelId = msg.broadcast.channel_id || msg.data.channel_id;\n    const userId = msg.broadcast.user_id || msg.data.user_id;\n    const channel = getChannel(state, channelId);\n    if (channel && !haveISystemPermission(state, {permission: Permissions.VIEW_MEMBERS}) && !haveITeamPermission(state, channel.team_id, Permissions.VIEW_MEMBERS)) {\n        dispatch(batchActions([\n            {\n                type: UserTypes.RECEIVED_PROFILE_NOT_IN_TEAM,\n                data: {id: channel.team_id, user_id: userId},\n            },\n            {\n                type: TeamTypes.REMOVE_MEMBER_FROM_TEAM,\n                data: {team_id: channel.team_id, user_id: userId},\n            },\n        ]));\n    }\n}\n\nexport async function handleUserUpdatedEvent(msg) {\n    const state = getState();\n    const currentUser = getCurrentUser(state);\n    const user = msg.data.user;\n    if (user && user.props) {\n        const customStatus = user.props.customStatus ? JSON.parse(user.props.customStatus) : undefined;\n        dispatch(loadCustomEmojisIfNeeded([customStatus?.emoji]));\n    }\n\n    const config = getConfig(state);\n    const license = getLicense(state);\n\n    const userIsGuest = isGuest(user);\n    const isTimezoneEnabled = config.ExperimentalTimezone === 'true';\n    const isLDAPEnabled = license?.IsLicensed === 'true' && license?.LDAPGroups === 'true';\n\n    if (userIsGuest || (isTimezoneEnabled && isLDAPEnabled)) {\n        let members = getMembersInCurrentChannel(state);\n        const currentChannelId = getCurrentChannelId(state);\n        let memberExists = members && members[user.id];\n        if (!memberExists) {\n            await dispatch(getChannelMember(currentChannelId, user.id));\n            members = getMembersInCurrentChannel(getState());\n            memberExists = members && members[user.id];\n        }\n\n        if (memberExists) {\n            if (isLDAPEnabled && isTimezoneEnabled) {\n                dispatch(getChannelMemberCountsByGroup(currentChannelId, true));\n            }\n            if (isGuest(user)) {\n                dispatch(getChannelStats(currentChannelId));\n            }\n        }\n    }\n\n    if (currentUser.id === user.id) {\n        if (user.update_at > currentUser.update_at) {\n            // Need to request me to make sure we don't override with sanitized fields from the\n            // websocket event\n            getMe()(dispatch, getState);\n        }\n    } else {\n        dispatch({\n            type: UserTypes.RECEIVED_PROFILE,\n            data: user,\n        });\n    }\n}\n\nfunction handleRoleAddedEvent(msg) {\n    const role = JSON.parse(msg.data.role);\n\n    dispatch({\n        type: RoleTypes.RECEIVED_ROLE,\n        data: role,\n    });\n}\n\nfunction handleRoleRemovedEvent(msg) {\n    const role = JSON.parse(msg.data.role);\n\n    dispatch({\n        type: RoleTypes.ROLE_DELETED,\n        data: role,\n    });\n}\n\nfunction handleChannelSchemeUpdatedEvent(msg) {\n    dispatch(getMyChannelMember(msg.broadcast.channel_id));\n}\n\nfunction handleRoleUpdatedEvent(msg) {\n    const role = JSON.parse(msg.data.role);\n\n    dispatch({\n        type: RoleTypes.RECEIVED_ROLE,\n        data: role,\n    });\n}\n\nfunction handleChannelCreatedEvent(msg) {\n    return async (myDispatch, myGetState) => {\n        const channelId = msg.data.channel_id;\n        const teamId = msg.data.team_id;\n        const state = myGetState();\n\n        if (getCurrentTeamId(state) === teamId) {\n            let channel = getChannel(state, channelId);\n\n            if (!channel) {\n                await myDispatch(getChannelAndMyMember(channelId));\n\n                channel = getChannel(myGetState(), channelId);\n            }\n\n            myDispatch(addChannelToInitialCategory(channel, false));\n        }\n    };\n}\n\nfunction handleChannelDeletedEvent(msg) {\n    const state = getState();\n    const config = getConfig(state);\n    const viewArchivedChannels = config.ExperimentalViewArchivedChannels === 'true';\n    if (getCurrentChannelId(state) === msg.data.channel_id && !viewArchivedChannels) {\n        const teamUrl = getCurrentRelativeTeamUrl(state);\n        const currentTeamId = getCurrentTeamId(state);\n        const redirectChannel = getRedirectChannelNameForTeam(state, currentTeamId);\n        browserHistory.push(teamUrl + '/channels/' + redirectChannel);\n    }\n\n    dispatch({type: ChannelTypes.RECEIVED_CHANNEL_DELETED, data: {id: msg.data.channel_id, team_id: msg.broadcast.team_id, deleteAt: msg.data.delete_at, viewArchivedChannels}});\n}\n\nfunction handleChannelUnarchivedEvent(msg) {\n    const state = getState();\n    const config = getConfig(state);\n    const viewArchivedChannels = config.ExperimentalViewArchivedChannels === 'true';\n\n    dispatch({type: ChannelTypes.RECEIVED_CHANNEL_UNARCHIVED, data: {id: msg.data.channel_id, team_id: msg.broadcast.team_id, viewArchivedChannels}});\n}\n\nfunction handlePreferenceChangedEvent(msg) {\n    const preference = JSON.parse(msg.data.preference);\n    dispatch({type: PreferenceTypes.RECEIVED_PREFERENCES, data: [preference]});\n\n    if (addedNewDmUser(preference)) {\n        loadProfilesForSidebar();\n    }\n}\n\nfunction handlePreferencesChangedEvent(msg) {\n    const preferences = JSON.parse(msg.data.preferences);\n    dispatch({type: PreferenceTypes.RECEIVED_PREFERENCES, data: preferences});\n\n    if (preferences.findIndex(addedNewDmUser) !== -1) {\n        loadProfilesForSidebar();\n    }\n}\n\nfunction handlePreferencesDeletedEvent(msg) {\n    const preferences = JSON.parse(msg.data.preferences);\n    dispatch({type: PreferenceTypes.DELETED_PREFERENCES, data: preferences});\n}\n\nfunction addedNewDmUser(preference) {\n    return preference.category === Constants.Preferences.CATEGORY_DIRECT_CHANNEL_SHOW && preference.value === 'true';\n}\n\nexport function handleUserTypingEvent(msg) {\n    return async (doDispatch, doGetState) => {\n        const state = doGetState();\n        const config = getConfig(state);\n        const currentUserId = getCurrentUserId(state);\n        const userId = msg.data.user_id;\n\n        const data = {\n            id: msg.broadcast.channel_id + msg.data.parent_id,\n            userId,\n            now: Date.now(),\n        };\n\n        doDispatch({\n            type: WebsocketEvents.TYPING,\n            data,\n        });\n\n        setTimeout(() => {\n            doDispatch({\n                type: WebsocketEvents.STOP_TYPING,\n                data,\n            });\n        }, parseInt(config.TimeBetweenUserTypingUpdatesMilliseconds, 10));\n\n        if (userId !== currentUserId) {\n            const result = await doDispatch(getMissingProfilesByIds([userId]));\n            if (result.data && result.data.length > 0) {\n                // Already loaded the user status\n                return;\n            }\n        }\n\n        const status = getStatusForUserId(state, userId);\n        if (status !== General.ONLINE) {\n            doDispatch(getStatusesByIds([userId]));\n        }\n    };\n}\n\nfunction handleStatusChangedEvent(msg) {\n    dispatch({\n        type: UserTypes.RECEIVED_STATUSES,\n        data: [{user_id: msg.data.user_id, status: msg.data.status}],\n    });\n}\n\nfunction handleHelloEvent(msg) {\n    setServerVersion(msg.data.server_version)(dispatch, getState);\n}\n\nfunction handleReactionAddedEvent(msg) {\n    const reaction = JSON.parse(msg.data.reaction);\n\n    dispatch(getCustomEmojiForReaction(reaction.emoji_name));\n\n    dispatch({\n        type: PostTypes.RECEIVED_REACTION,\n        data: reaction,\n    });\n}\n\nfunction handleAddEmoji(msg) {\n    const data = JSON.parse(msg.data.emoji);\n\n    dispatch({\n        type: EmojiTypes.RECEIVED_CUSTOM_EMOJI,\n        data,\n    });\n}\n\nfunction handleReactionRemovedEvent(msg) {\n    const reaction = JSON.parse(msg.data.reaction);\n\n    dispatch({\n        type: PostTypes.REACTION_DELETED,\n        data: reaction,\n    });\n}\n\nfunction handleChannelViewedEvent(msg) {\n    // Useful for when multiple devices have the app open to different channels\n    if ((!window.isActive || getCurrentChannelId(getState()) !== msg.data.channel_id) &&\n        getCurrentUserId(getState()) === msg.broadcast.user_id) {\n        dispatch(markChannelAsRead(msg.data.channel_id, '', false));\n    }\n}\n\nexport function handlePluginEnabled(msg) {\n    const manifest = msg.data.manifest;\n    loadPlugin(manifest).catch((error) => {\n        console.error(error.message); //eslint-disable-line no-console\n    });\n}\n\nexport function handlePluginDisabled(msg) {\n    const manifest = msg.data.manifest;\n    removePlugin(manifest);\n}\n\nfunction handleUserRoleUpdated(msg) {\n    const user = store.getState().entities.users.profiles[msg.data.user_id];\n\n    if (user) {\n        const roles = msg.data.roles;\n        const newRoles = roles.split(' ');\n        const demoted = user.roles.includes(Constants.PERMISSIONS_SYSTEM_ADMIN) && !roles.includes(Constants.PERMISSIONS_SYSTEM_ADMIN);\n\n        store.dispatch({type: UserTypes.RECEIVED_PROFILE, data: {...user, roles}});\n        dispatch(loadRolesIfNeeded(newRoles));\n\n        if (demoted && global.location.pathname.startsWith('/admin_console')) {\n            redirectUserToDefaultTeam();\n        }\n    }\n}\n\nfunction handleConfigChanged(msg) {\n    store.dispatch({type: GeneralTypes.CLIENT_CONFIG_RECEIVED, data: msg.data.config});\n}\n\nfunction handleLicenseChanged(msg) {\n    store.dispatch({type: GeneralTypes.CLIENT_LICENSE_RECEIVED, data: msg.data.license});\n}\n\nfunction handlePluginStatusesChangedEvent(msg) {\n    store.dispatch({type: AdminTypes.RECEIVED_PLUGIN_STATUSES, data: msg.data.plugin_statuses});\n}\n\nfunction handleOpenDialogEvent(msg) {\n    const data = (msg.data && msg.data.dialog) || {};\n    const dialog = JSON.parse(data);\n\n    store.dispatch({type: IntegrationTypes.RECEIVED_DIALOG, data: dialog});\n\n    const currentTriggerId = getState().entities.integrations.dialogTriggerId;\n\n    if (dialog.trigger_id !== currentTriggerId) {\n        return;\n    }\n\n    store.dispatch(openModal({modalId: ModalIdentifiers.INTERACTIVE_DIALOG, dialogType: InteractiveDialog}));\n}\n\nfunction handleGroupUpdatedEvent(msg) {\n    const data = JSON.parse(msg.data.group);\n    dispatch(batchActions([\n        {\n            type: GroupTypes.RECEIVED_GROUP,\n            data,\n        },\n        {\n            type: GroupTypes.RECEIVED_MY_GROUPS,\n            data: [data],\n        },\n    ]));\n}\n\nfunction handleGroupAssociatedToTeamEvent(msg) {\n    store.dispatch({\n        type: GroupTypes.RECEIVED_GROUP_ASSOCIATED_TO_TEAM,\n        data: {teamID: msg.broadcast.team_id, groups: [{id: msg.data.group_id}]},\n    });\n}\n\nfunction handleGroupNotAssociatedToTeamEvent(msg) {\n    store.dispatch({\n        type: GroupTypes.RECEIVED_GROUP_NOT_ASSOCIATED_TO_TEAM,\n        data: {teamID: msg.broadcast.team_id, groups: [{id: msg.data.group_id}]},\n    });\n}\n\nfunction handleGroupAssociatedToChannelEvent(msg) {\n    store.dispatch({\n        type: GroupTypes.RECEIVED_GROUP_ASSOCIATED_TO_CHANNEL,\n        data: {channelID: msg.broadcast.channel_id, groups: [{id: msg.data.group_id}]},\n    });\n}\n\nfunction handleGroupNotAssociatedToChannelEvent(msg) {\n    store.dispatch({\n        type: GroupTypes.RECEIVED_GROUP_NOT_ASSOCIATED_TO_CHANNEL,\n        data: {channelID: msg.broadcast.channel_id, groups: [{id: msg.data.group_id}]},\n    });\n}\n\nfunction handleWarnMetricStatusReceivedEvent(msg) {\n    var receivedData = JSON.parse(msg.data.warnMetricStatus);\n    let bannerData;\n    if (receivedData.id === WarnMetricTypes.SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_500) {\n        bannerData = AnnouncementBarMessages.WARN_METRIC_STATUS_NUMBER_OF_USERS;\n    } else if (receivedData.id === WarnMetricTypes.SYSTEM_WARN_METRIC_NUMBER_OF_POSTS_2M) {\n        bannerData = AnnouncementBarMessages.WARN_METRIC_STATUS_NUMBER_OF_POSTS;\n    }\n    store.dispatch(batchActions([\n        {\n            type: GeneralTypes.WARN_METRIC_STATUS_RECEIVED,\n            data: receivedData,\n        },\n        {\n            type: ActionTypes.SHOW_NOTICE,\n            data: [bannerData],\n        },\n    ]));\n}\n\nfunction handleWarnMetricStatusRemovedEvent(msg) {\n    store.dispatch({type: GeneralTypes.WARN_METRIC_STATUS_REMOVED, data: {id: msg.data.warnMetricId}});\n}\n\nfunction handleSidebarCategoryCreated(msg) {\n    return (doDispatch, doGetState) => {\n        const state = doGetState();\n\n        if (msg.broadcast.team_id !== getCurrentTeamId(state)) {\n            // The new category will be loaded when we switch teams.\n            return;\n        }\n\n        // Fetch all categories, including ones that weren't explicitly updated, in case any other categories had channels\n        // moved out of them.\n        doDispatch(fetchMyCategories(msg.broadcast.team_id));\n    };\n}\n\nfunction handleSidebarCategoryUpdated(msg) {\n    return (doDispatch, doGetState) => {\n        const state = doGetState();\n\n        if (msg.broadcast.team_id !== getCurrentTeamId(state)) {\n            // The updated categories will be loaded when we switch teams.\n            return;\n        }\n\n        // Fetch all categories in case any other categories had channels moved out of them.\n        doDispatch(fetchMyCategories(msg.broadcast.team_id));\n    };\n}\n\nfunction handleSidebarCategoryDeleted(msg) {\n    return (doDispatch, doGetState) => {\n        const state = doGetState();\n\n        if (msg.broadcast.team_id !== getCurrentTeamId(state)) {\n            // The category will be removed when we switch teams.\n            return;\n        }\n\n        // Fetch all categories since any channels that were in the deleted category were moved to other categories.\n        doDispatch(fetchMyCategories(msg.broadcast.team_id));\n    };\n}\n\nfunction handleSidebarCategoryOrderUpdated(msg) {\n    return receivedCategoryOrder(msg.broadcast.team_id, msg.data.order);\n}\n\nexport function handleUserActivationStatusChange() {\n    return (doDispatch, doGetState) => {\n        const state = doGetState();\n        const license = getLicense(state);\n\n        // This event is fired when a user first joins the server, so refresh analytics to see if we're now over the user limit\n        if (license.Cloud === 'true') {\n            if (isCurrentUserSystemAdmin(state)) {\n                doDispatch(getStandardAnalytics());\n            }\n            doDispatch(getSubscriptionStats());\n        }\n    };\n}\n\nfunction handleCloudPaymentStatusUpdated() {\n    return (doDispatch) => doDispatch(getCloudSubscription());\n}\n\nfunction handleRefreshAppsBindings() {\n    return (doDispatch, doGetState) => {\n        const state = doGetState();\n        if (appsEnabled(state)) {\n            doDispatch(fetchAppBindings(getCurrentUserId(state), getCurrentChannelId(state)));\n        }\n        return {data: true};\n    };\n}\n\nfunction handleFirstAdminVisitMarketplaceStatusReceivedEvent(msg) {\n    const receivedData = JSON.parse(msg.data.firstAdminVisitMarketplaceStatus);\n    store.dispatch({type: GeneralTypes.FIRST_ADMIN_VISIT_MARKETPLACE_STATUS_RECEIVED, data: receivedData});\n}\n\nfunction handleThreadReadChanged(msg) {\n    return (doDispatch, doGetState) => {\n        if (msg.data.thread_id) {\n            const state = doGetState();\n            const thread = getThreads(state)?.[msg.data.thread_id];\n            if (thread) {\n                // skip marking the thread as read (when the user is viewing the thread)\n                if (!isThreadOpen(state, thread.id)) {\n                    doDispatch(updateThreadLastOpened(thread.id, msg.data.timestamp));\n                }\n\n                handleReadChanged(\n                    doDispatch,\n                    msg.data.thread_id,\n                    msg.broadcast.team_id,\n                    msg.data.channel_id,\n                    {\n                        lastViewedAt: msg.data.timestamp,\n                        prevUnreadMentions: thread.unread_mentions,\n                        newUnreadMentions: msg.data.unread_mentions,\n                        prevUnreadReplies: thread.unread_replies,\n                        newUnreadReplies: msg.data.unread_replies,\n                    },\n                );\n            }\n        } else if (msg.broadcast.channel_id) {\n            handleAllThreadsInChannelMarkedRead(doDispatch, doGetState, msg.broadcast.channel_id, msg.data.timestamp);\n        } else {\n            handleAllMarkedRead(doDispatch, msg.broadcast.team_id);\n        }\n    };\n}\n\nfunction handleThreadUpdated(msg) {\n    return (doDispatch, doGetState) => {\n        let threadData;\n        try {\n            threadData = JSON.parse(msg.data.thread);\n        } catch {\n            // invalid JSON\n            return;\n        }\n\n        const state = doGetState();\n        const currentUserId = getCurrentUserId(state);\n        const currentTeamId = getCurrentTeamId(state);\n\n        let lastViewedAt;\n\n        // if current user has replied to the thread\n        // make sure to set following as true\n        if (currentUserId === threadData.post.user_id) {\n            threadData.is_following = true;\n        }\n\n        if (isThreadOpen(state, threadData.id) && !isThreadManuallyUnread(state, threadData.id)) {\n            lastViewedAt = Date.now();\n\n            // Sometimes `Date.now()` was generating a timestamp before the\n            // last_reply_at of the thread, thus marking the thread as unread\n            // instead of read. Here we set the timestamp to after the\n            // last_reply_at if this happens.\n            if (lastViewedAt < threadData.last_reply_at) {\n                lastViewedAt = threadData.last_reply_at + 1;\n            }\n\n            // prematurely update thread data as read\n            // so we won't flash the indicators when\n            // we mark the thread as read on the server\n            threadData.last_viewed_at = lastViewedAt;\n            threadData.unread_mentions = 0;\n            threadData.unread_replies = 0;\n\n            // mark thread as read on the server\n            dispatch(updateThreadRead(currentUserId, currentTeamId, threadData.id, lastViewedAt));\n        }\n\n        handleThreadArrived(doDispatch, doGetState, threadData, msg.broadcast.team_id);\n    };\n}\n\nfunction handleThreadFollowChanged(msg) {\n    return async (doDispatch, doGetState) => {\n        const state = doGetState();\n        const thread = getThread(state, msg.data.thread_id);\n        if (!thread && msg.data.state && msg.data.reply_count) {\n            await doDispatch(fetchThread(getCurrentUserId(state), getCurrentTeamId(state), msg.data.thread_id, true));\n        }\n        handleFollowChanged(doDispatch, msg.data.thread_id, msg.broadcast.team_id, msg.data.state);\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionTypes} from 'utils/constants';\n\nexport function incrementWsErrorCount() {\n    return async (dispatch) => {\n        dispatch({\n            type: ActionTypes.INCREMENT_WS_ERROR_COUNT,\n        });\n    };\n}\n\nexport function resetWsErrorCount() {\n    return async (dispatch) => {\n        dispatch({\n            type: ActionTypes.RESET_WS_ERROR_COUNT,\n        });\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport store from 'stores/redux_store.jsx';\nimport {SocketEvents} from 'utils/constants';\n\nconst MAX_WEBSOCKET_FAILS = 7;\nconst MIN_WEBSOCKET_RETRY_TIME = 3000; // 3 sec\nconst MAX_WEBSOCKET_RETRY_TIME = 300000; // 5 mins\n\nexport default class WebSocketClient {\n    private conn: WebSocket | null;\n    private connectionUrl: string | null;\n\n    // responseSequence is the number to track a response sent\n    // via the websocket. A response will always have the same sequence number\n    // as the request.\n    private responseSequence: number;\n\n    // serverSequence is the incrementing sequence number from the\n    // server-sent event stream.\n    private serverSequence: number;\n    private connectFailCount: number;\n    private eventCallback: ((msg: any) => void) | null;\n    private responseCallbacks: {[x: number]: ((msg: any) => void)};\n    private firstConnectCallback: (() => void) | null;\n    private reconnectCallback: (() => void) | null;\n    private missedEventCallback: (() => void) | null;\n    private errorCallback: ((event: Event) => void) | null;\n    private closeCallback: ((connectFailCount: number) => void) | null;\n    private connectionId: string | null;\n\n    constructor() {\n        this.conn = null;\n        this.connectionUrl = null;\n        this.responseSequence = 1;\n        this.serverSequence = 0;\n        this.connectFailCount = 0;\n        this.eventCallback = null;\n        this.responseCallbacks = {};\n        this.firstConnectCallback = null;\n        this.reconnectCallback = null;\n        this.missedEventCallback = null;\n        this.errorCallback = null;\n        this.closeCallback = null;\n        this.connectionId = '';\n    }\n\n    // on connect, only send auth cookie and blank state.\n    // on hello, get the connectionID and store it.\n    // on reconnect, send cookie, connectionID, sequence number.\n    initialize(connectionUrl = this.connectionUrl, token?: string) {\n        if (this.conn) {\n            return;\n        }\n\n        if (connectionUrl == null) {\n            console.log('websocket must have connection url'); //eslint-disable-line no-console\n            return;\n        }\n\n        if (this.connectFailCount === 0) {\n            console.log('websocket connecting to ' + connectionUrl); //eslint-disable-line no-console\n        }\n\n        // Add connection id, and last_sequence_number to the query param.\n        // We cannot use a cookie because it will bleed across tabs.\n        // We cannot also send it as part of the auth_challenge, because the session cookie is already sent with the request.\n        this.conn = new WebSocket(`${connectionUrl}?connection_id=${this.connectionId}&sequence_number=${this.serverSequence}`);\n        this.connectionUrl = connectionUrl;\n\n        const config = getConfig(store.getState());\n        const reliableWebSockets = config.EnableReliableWebSockets === 'true';\n\n        this.conn.onopen = () => {\n            // No need to reset sequence number here.\n            if (!reliableWebSockets) {\n                this.serverSequence = 0;\n            }\n\n            if (token) {\n                this.sendMessage('authentication_challenge', {token});\n            }\n\n            if (this.connectFailCount > 0) {\n                console.log('websocket re-established connection'); //eslint-disable-line no-console\n                if (this.reconnectCallback) {\n                    this.reconnectCallback();\n                }\n            } else if (this.firstConnectCallback) {\n                this.firstConnectCallback();\n            }\n\n            this.connectFailCount = 0;\n        };\n\n        this.conn.onclose = () => {\n            this.conn = null;\n            this.responseSequence = 1;\n\n            if (this.connectFailCount === 0) {\n                console.log('websocket closed'); //eslint-disable-line no-console\n            }\n\n            this.connectFailCount++;\n\n            if (this.closeCallback) {\n                this.closeCallback(this.connectFailCount);\n            }\n\n            let retryTime = MIN_WEBSOCKET_RETRY_TIME;\n\n            // If we've failed a bunch of connections then start backing off\n            if (this.connectFailCount > MAX_WEBSOCKET_FAILS) {\n                retryTime = MIN_WEBSOCKET_RETRY_TIME * this.connectFailCount * this.connectFailCount;\n                if (retryTime > MAX_WEBSOCKET_RETRY_TIME) {\n                    retryTime = MAX_WEBSOCKET_RETRY_TIME;\n                }\n            }\n\n            setTimeout(\n                () => {\n                    this.initialize(connectionUrl, token);\n                },\n                retryTime,\n            );\n        };\n\n        this.conn.onerror = (evt) => {\n            if (this.connectFailCount <= 1) {\n                console.log('websocket error'); //eslint-disable-line no-console\n                console.log(evt); //eslint-disable-line no-console\n            }\n\n            if (this.errorCallback) {\n                this.errorCallback(evt);\n            }\n        };\n\n        this.conn.onmessage = (evt) => {\n            const msg = JSON.parse(evt.data);\n            if (msg.seq_reply) {\n                // This indicates a reply to a websocket request.\n                // We ignore sequence number validation of message responses\n                // and only focus on the purely server side event stream.\n                if (msg.error) {\n                    console.log(msg); //eslint-disable-line no-console\n                }\n\n                if (this.responseCallbacks[msg.seq_reply]) {\n                    this.responseCallbacks[msg.seq_reply](msg);\n                    Reflect.deleteProperty(this.responseCallbacks, msg.seq_reply);\n                }\n            } else if (this.eventCallback) {\n                if (reliableWebSockets) {\n                    // We check the hello packet, which is always the first packet in a stream.\n                    if (msg.event === SocketEvents.HELLO && this.missedEventCallback) {\n                        console.log('got connection id ', msg.data.connection_id); //eslint-disable-line no-console\n                        // If we already have a connectionId present, and server sends a different one,\n                        // that means it's either a long timeout, or server restart, or sequence number is not found.\n                        // Then we do the sync calls, and reset sequence number to 0.\n                        if (this.connectionId !== '' && this.connectionId !== msg.data.connection_id) {\n                            console.log('long timeout, or server restart, or sequence number is not found.'); //eslint-disable-line no-console\n                            this.missedEventCallback();\n                            this.serverSequence = 0;\n                        }\n\n                        // If it's a fresh connection, we have to set the connectionId regardless.\n                        // And if it's an existing connection, setting it again is harmless, and keeps the code simple.\n                        this.connectionId = msg.data.connection_id;\n                    }\n\n                    // Now we check for sequence number, and if it does not match,\n                    // we just disconnect and reconnect.\n                    if (msg.seq !== this.serverSequence) {\n                        console.log('missed websocket event, act_seq=' + msg.seq + ' exp_seq=' + this.serverSequence); //eslint-disable-line no-console\n                        // We are not calling this.close() because we need to auto-restart.\n                        this.connectFailCount = 0;\n                        this.responseSequence = 1;\n                        this.conn?.close(); // Will auto-reconnect after MIN_WEBSOCKET_RETRY_TIME.\n                        return;\n                    }\n                } else if (msg.seq !== this.serverSequence && this.missedEventCallback) {\n                    console.log('missed websocket event, act_seq=' + msg.seq + ' exp_seq=' + this.serverSequence); //eslint-disable-line no-console\n                    this.missedEventCallback();\n                }\n                this.serverSequence = msg.seq + 1;\n                this.eventCallback(msg);\n            }\n        };\n    }\n\n    setEventCallback(callback: (msg: any) => void) {\n        this.eventCallback = callback;\n    }\n\n    setFirstConnectCallback(callback: () => void) {\n        this.firstConnectCallback = callback;\n    }\n\n    setReconnectCallback(callback: () => void) {\n        this.reconnectCallback = callback;\n    }\n\n    setMissedEventCallback(callback: () => void) {\n        this.missedEventCallback = callback;\n    }\n\n    setErrorCallback(callback: (event: Event) => void) {\n        this.errorCallback = callback;\n    }\n\n    setCloseCallback(callback: (connectFailCount: number) => void) {\n        this.closeCallback = callback;\n    }\n\n    close() {\n        this.connectFailCount = 0;\n        this.responseSequence = 1;\n        if (this.conn && this.conn.readyState === WebSocket.OPEN) {\n            this.conn.onclose = () => {}; //eslint-disable-line no-empty-function\n            this.conn.close();\n            this.conn = null;\n            console.log('websocket closed'); //eslint-disable-line no-console\n        }\n    }\n\n    sendMessage(action: string, data: any, responseCallback?: () => void) {\n        const msg = {\n            action,\n            seq: this.responseSequence++,\n            data,\n        };\n\n        if (responseCallback) {\n            this.responseCallbacks[msg.seq] = responseCallback;\n        }\n\n        if (this.conn && this.conn.readyState === WebSocket.OPEN) {\n            this.conn.send(JSON.stringify(msg));\n        } else if (!this.conn || this.conn.readyState === WebSocket.CLOSED) {\n            this.conn = null;\n            this.initialize();\n        }\n    }\n\n    userTyping(channelId: string, parentId: string, callback?: () => void) {\n        const data = {\n            channel_id: channelId,\n            parent_id: parentId,\n        };\n        this.sendMessage('user_typing', data, callback);\n    }\n\n    userUpdateActiveStatus(userIsActive: boolean, manual: boolean, callback?: () => void) {\n        const data = {\n            user_is_active: userIsActive,\n            manual,\n        };\n        this.sendMessage('user_update_active_status', data, callback);\n    }\n\n    getStatuses(callback?: () => void) {\n        this.sendMessage('get_statuses', null, callback);\n    }\n\n    getStatusesByIds(userIds: string[], callback?: () => void) {\n        const data = {\n            user_ids: userIds,\n        };\n        this.sendMessage('get_statuses_by_ids', data, callback);\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport WebSocketClient from './websocket_client';\n\nvar WebClient = new WebSocketClient();\nexport default WebClient;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\nimport classNames from 'classnames';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport MattermostLogo from 'components/widgets/icons/mattermost_logo';\n\nimport './about_build_modal_cloud.scss';\n\ntype Props = {\n    onHide: () => void;\n    config: any;\n    license: any;\n    show: boolean;\n    doHide: () => void;\n};\n\n// Webpack global var\ndeclare const COMMIT_HASH: string;\n\nexport default function AboutBuildModalCloud(props: Props) {\n    const handleExit = () => {\n        props.onHide();\n    };\n\n    const config = props.config;\n    const license = props.license;\n\n    const title = (\n        <FormattedMessage\n            id='about.cloudEdition'\n            defaultMessage='Cloud'\n        />\n    );\n\n    const subTitle = (\n        <FormattedMessage\n            id='about.enterpriseEditionSst'\n            defaultMessage='High trust messaging for the enterprise'\n        />\n    );\n\n    const licensee = (\n        <div className='form-group'>\n            <FormattedMessage\n                id='about.licensed'\n                defaultMessage='Licensed to:'\n            />\n            {'\\u00a0' + license.Company}\n        </div>\n    );\n\n    let mmversion = config.BuildNumber;\n    if (!isNaN(config.BuildNumber)) {\n        mmversion = 'ci';\n    }\n\n    return (\n        <Modal\n            dialogClassName={classNames('a11y__modal', 'about-modal', 'cloud')}\n            show={props.show}\n            onHide={props.doHide}\n            onExited={handleExit}\n            role='dialog'\n            aria-labelledby='aboutModalLabel'\n        >\n            <Modal.Header closeButton={true}>\n                <Modal.Title\n                    componentClass='h1'\n                    id='aboutModalLabel'\n                >\n                    <FormattedMessage\n                        id='about.title'\n                        values={{appTitle: config.SiteName || 'Mattermost'}}\n                        defaultMessage='About {appTitle}'\n                    />\n                </Modal.Title>\n            </Modal.Header>\n            <Modal.Body>\n                <div className='about-modal__content'>\n                    <div className='about-modal__logo'>\n                        <MattermostLogo/>\n                    </div>\n                    <div>\n                        <h3 className='about-modal__title'>\n                            <strong>{'Mattermost'} {title}</strong>\n                        </h3>\n                        <p className='subtitle'>{subTitle}</p>\n                        <div className='description'>\n                            <div>\n                                <FormattedMessage\n                                    id='about.version'\n                                    defaultMessage='Mattermost Version:'\n                                />\n                                <span id='versionString'>{'\\u00a0' + mmversion}</span>\n                            </div>\n                        </div>\n                        {licensee}\n                        <div className='about-footer'>\n                            <FormattedMarkdownMessage\n                                id='about.notice'\n                                defaultMessage='Mattermost is made possible by the open source software used in our [server](!https://about.mattermost.com/platform-notice-txt/), [desktop](!https://about.mattermost.com/desktop-notice-txt/) and [mobile](!https://about.mattermost.com/mobile-notice-txt/) apps.'\n                            />\n                            <div className='copy-right'>\n                                <FormattedMessage\n                                    id='about.copyright'\n                                    defaultMessage='Copyright 2015 - {currentYear} Mattermost, Inc. All rights reserved'\n                                    values={{\n                                        currentYear: new Date().getFullYear(),\n                                    }}\n                                />\n                            </div>\n                        </div>\n                    </div>\n                    <div/>\n                </div>\n                <div className='about-modal__hash'>\n                    <p>\n                        <FormattedMessage\n                            id='about.hash'\n                            defaultMessage='Build Hash:'\n                        />\n                        {config.BuildHash}\n                        <br/>\n                        <FormattedMessage\n                            id='about.hashee'\n                            defaultMessage='EE Build Hash:'\n                        />\n                        {config.BuildHashEnterprise}\n                        <br/>\n                        <FormattedMessage\n                            id='about.hashwebapp'\n                            defaultMessage='Webapp Build Hash:'\n                        />\n                        {typeof COMMIT_HASH === 'undefined' ? '' : COMMIT_HASH}\n                    </p>\n                    <p>\n                        <FormattedMessage\n                            id='about.date'\n                            defaultMessage='Build Date:'\n                        />\n                        {config.BuildDate}\n                    </p>\n                </div>\n            </Modal.Body>\n        </Modal>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {ClientConfig, ClientLicense} from 'mattermost-redux/types/config';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport MattermostLogo from 'components/widgets/icons/mattermost_logo';\nimport Nbsp from 'components/html_entities/nbsp';\n\nimport {AboutLinks} from 'utils/constants';\n\nimport AboutBuildModalCloud from './about_build_modal_cloud/about_build_modal_cloud';\n\ntype Props = {\n\n    /**\n     * Function that is called when the modal is dismissed\n     */\n    onHide: () => void;\n\n    /**\n     * Global config object\n     */\n    config: Partial<ClientConfig>;\n\n    /**\n     * Global license object\n     */\n    license: ClientLicense;\n\n    /**\n     * Webapp build hash override. By default, webpack sets this (so it must be overridden in tests).\n     */\n    webappBuildHash?: string;\n\n    show?: boolean;\n};\n\ntype State = {\n    show: boolean;\n};\n\nexport default class AboutBuildModal extends React.PureComponent<Props, State> {\n    // static defaultProps = {\n    //     show: false,\n    // };\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            show: true,\n        };\n    }\n\n    doHide = () => {\n        this.setState({show: false});\n    }\n\n    handleExit = () => {\n        this.props.onHide();\n    }\n\n    render() {\n        const config = this.props.config;\n        const license = this.props.license;\n\n        if (license.Cloud === 'true') {\n            return (\n                <AboutBuildModalCloud\n                    {...this.props}\n                    {...this.state}\n                    doHide={this.doHide}\n                />\n            );\n        }\n\n        let title = (\n            <FormattedMessage\n                id='about.teamEditiont0'\n                defaultMessage='Team Edition'\n            />\n        );\n\n        let subTitle = (\n            <FormattedMessage\n                id='about.teamEditionSt'\n                defaultMessage='All your team communication in one place, instantly searchable and accessible anywhere.'\n            />\n        );\n\n        let learnMore = (\n            <div>\n                <FormattedMessage\n                    id='about.teamEditionLearn'\n                    defaultMessage='Join the Mattermost community at '\n                />\n                <a\n                    target='_blank'\n                    rel='noopener noreferrer'\n                    href='http://www.mattermost.org/'\n                >\n                    {'mattermost.org'}\n                </a>\n            </div>\n        );\n\n        let licensee;\n        if (config.BuildEnterpriseReady === 'true') {\n            title = (\n                <FormattedMessage\n                    id='about.teamEditiont1'\n                    defaultMessage='Enterprise Edition'\n                />\n            );\n\n            subTitle = (\n                <FormattedMessage\n                    id='about.enterpriseEditionSt'\n                    defaultMessage='Modern communication from behind your firewall.'\n                />\n            );\n\n            learnMore = (\n                <div>\n                    <FormattedMessage\n                        id='about.enterpriseEditionLearn'\n                        defaultMessage='Learn more about Enterprise Edition at '\n                    />\n                    <a\n                        target='_blank'\n                        rel='noopener noreferrer'\n                        href='http://about.mattermost.com/'\n                    >\n                        {'about.mattermost.com'}\n                    </a>\n                </div>\n            );\n\n            if (license.IsLicensed === 'true') {\n                title = (\n                    <FormattedMessage\n                        id='about.enterpriseEditione1'\n                        defaultMessage='Enterprise Edition'\n                    />\n                );\n                licensee = (\n                    <div className='form-group'>\n                        <FormattedMessage\n                            id='about.licensed'\n                            defaultMessage='Licensed to:'\n                        />\n                        <Nbsp/>{license.Company}\n                    </div>\n                );\n            }\n        }\n\n        const termsOfService = (\n            <a\n                target='_blank'\n                id='tosLink'\n                rel='noopener noreferrer'\n                href={AboutLinks.TERMS_OF_SERVICE}\n            >\n                <FormattedMessage\n                    id='about.tos'\n                    defaultMessage='Terms of Service'\n                />\n            </a>\n        );\n\n        const privacyPolicy = (\n            <a\n                target='_blank'\n                id='privacyLink'\n                rel='noopener noreferrer'\n                href={AboutLinks.PRIVACY_POLICY}\n            >\n                <FormattedMessage\n                    id='about.privacy'\n                    defaultMessage='Privacy Policy'\n                />\n            </a>\n        );\n\n        // Only show build number if it's a number (so only builds from Jenkins)\n        let buildnumber: JSX.Element | null = (\n            <div>\n                <FormattedMessage\n                    id='about.buildnumber'\n                    defaultMessage='Build Number:'\n                />\n                <span id='buildnumberString'>{'\\u00a0' + config.BuildNumber}</span>\n            </div>\n        );\n        if (isNaN(Number(config.BuildNumber))) {\n            buildnumber = null;\n        }\n\n        let mmversion: string | undefined = config.BuildNumber;\n        if (!isNaN(Number(config.BuildNumber))) {\n            mmversion = 'ci';\n        }\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal about-modal'\n                show={this.state.show}\n                onHide={this.doHide}\n                onExited={this.handleExit}\n                role='dialog'\n                aria-labelledby='aboutModalLabel'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='aboutModalLabel'\n                    >\n                        <FormattedMessage\n                            id='about.title'\n                            values={{appTitle: config.SiteName || 'Mattermost'}}\n                            defaultMessage='About {appTitle}'\n                        />\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    <div className='about-modal__content'>\n                        <div className='about-modal__logo'>\n                            <MattermostLogo/>\n                        </div>\n                        <div>\n                            <h3 className='about-modal__title'>\n                                <strong>{'Mattermost'} {title}</strong>\n                            </h3>\n                            <p className='about-modal__subtitle pb-2'>{subTitle}</p>\n                            <div className='form-group less'>\n                                <div>\n                                    <FormattedMessage\n                                        id='about.version'\n                                        defaultMessage='Mattermost Version:'\n                                    />\n                                    <span id='versionString'>{'\\u00a0' + mmversion}</span>\n                                </div>\n                                <div>\n                                    <FormattedMessage\n                                        id='about.dbversion'\n                                        defaultMessage='Database Schema Version:'\n                                    />\n                                    <span id='dbversionString'>{'\\u00a0' + config.Version}</span>\n                                </div>\n                                {buildnumber}\n                                <div>\n                                    <FormattedMessage\n                                        id='about.database'\n                                        defaultMessage='Database:'\n                                    />\n                                    {'\\u00a0' + config.SQLDriverName}\n                                </div>\n                            </div>\n                            {licensee}\n                        </div>\n                    </div>\n                    <div className='about-modal__footer'>\n                        {learnMore}\n                        <div className='form-group'>\n                            <div className='about-modal__copyright'>\n                                <FormattedMessage\n                                    id='about.copyright'\n                                    defaultMessage='Copyright 2015 - {currentYear} Mattermost, Inc. All rights reserved'\n                                    values={{\n                                        currentYear: new Date().getFullYear(),\n                                    }}\n                                />\n                            </div>\n                            <div className='about-modal__links'>\n                                {termsOfService}\n                                {' - '}\n                                {privacyPolicy}\n                            </div>\n                        </div>\n                    </div>\n                    <div className='about-modal__notice form-group pt-3'>\n                        <p>\n                            <FormattedMarkdownMessage\n                                id='about.notice'\n                                defaultMessage='Mattermost is made possible by the open source software used in our [server](!https://about.mattermost.com/platform-notice-txt/), [desktop](!https://about.mattermost.com/desktop-notice-txt/) and [mobile](!https://about.mattermost.com/mobile-notice-txt/) apps.'\n                            />\n                        </p>\n                    </div>\n                    <div className='about-modal__hash'>\n                        <p>\n                            <FormattedMessage\n                                id='about.hash'\n                                defaultMessage='Build Hash:'\n                            />\n                            <Nbsp/>{config.BuildHash}\n                            <br/>\n                            <FormattedMessage\n                                id='about.hashee'\n                                defaultMessage='EE Build Hash:'\n                            />\n                            <Nbsp/>{config.BuildHashEnterprise}\n                            <br/>\n                            <FormattedMessage\n                                id='about.hashwebapp'\n                                defaultMessage='Webapp Build Hash:'\n                            />\n                            <Nbsp/>{/* global COMMIT_HASH */ this.props.webappBuildHash || (typeof COMMIT_HASH === 'undefined' ? '' : COMMIT_HASH)}\n                        </p>\n                        <p>\n                            <FormattedMessage\n                                id='about.date'\n                                defaultMessage='Build Date:'\n                            />\n                            <Nbsp/>{config.BuildDate}\n                        </p>\n                    </div>\n                </Modal.Body>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport {GlobalState} from 'types/store';\n\nimport AboutBuildModal from './about_build_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n    const modalId = ModalIdentifiers.ABOUT;\n    return {\n        config: getConfig(state),\n        license: getLicense(state),\n        show: isModalOpen(state, modalId),\n    };\n}\n\nexport default connect(mapStateToProps)(AboutBuildModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Groups} from 'mattermost-redux/constants';\n\nimport {Group, SyncablePatch} from 'mattermost-redux/types/groups';\n\nimport {ActionFunc} from 'mattermost-redux/types/actions';\n\nimport {ServerError} from 'mattermost-redux/types/errors';\n\nimport Constants from 'utils/constants';\nimport {localizeMessage} from 'utils/utils.jsx';\n\nimport MultiSelect, {Value} from 'components/multiselect/multiselect';\nimport groupsAvatar from 'images/groups-avatar.png';\nimport AddIcon from 'components/widgets/icons/fa_add_icon';\n\nconst GROUPS_PER_PAGE = 50;\nconst MAX_SELECTABLE_VALUES = 10;\n\ntype GroupValue = (Group & Value);\n\nexport type Props = {\n    currentChannelName: string;\n    currentChannelId: string;\n    teamID: string;\n    searchTerm: string;\n    groups: Group[];\n\n    excludeGroups?: Group[];\n    includeGroups?: Group[];\n    onHide?: () => void;\n    skipCommit?: boolean;\n    onAddCallback?: (groupIDs: string[]) => void;\n\n    actions: {\n        getGroupsNotAssociatedToChannel: (channelID: string, q?: string, page?: number | null, perPage?: number | null, filterParentTeamPermitted?: boolean) => Promise<ActionFunc>;\n        setModalSearchTerm: (term: string) => { type: string; data: string};\n        linkGroupSyncable: (groupID: string, syncableID: string, syncableType: string, patch: Partial<SyncablePatch>) => Promise<{error?: ServerError; data?: null}>;\n        getAllGroupsAssociatedToChannel: (channelID: string, filterAllowReference: boolean, includeMemberCount: boolean) => ActionFunc;\n        getTeam: (teamId: string) => ActionFunc;\n        getAllGroupsAssociatedToTeam: (teamID: string, filterAllowReference: boolean, includeMemberCount: boolean) => ActionFunc;\n    };\n}\n\ntype State = {\n    values: GroupValue[];\n    show: boolean;\n    search: boolean;\n    saving: boolean;\n    addError: string | null;\n    loadingGroups: boolean;\n}\n\nexport default class AddGroupsToChannelModal extends React.PureComponent<Props, State> {\n    private searchTimeoutId: number;\n    private selectedItemRef: React.RefObject<HTMLDivElement>;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.searchTimeoutId = 0;\n\n        this.state = {\n            values: [],\n            show: true,\n            search: false,\n            saving: false,\n            addError: null,\n            loadingGroups: true,\n        };\n\n        this.selectedItemRef = React.createRef();\n    }\n\n    componentDidMount() {\n        Promise.all([\n            this.props.actions.getTeam(this.props.teamID),\n            this.props.actions.getAllGroupsAssociatedToTeam(this.props.teamID, false, true),\n            this.props.actions.getGroupsNotAssociatedToChannel(this.props.currentChannelId, '', 0, GROUPS_PER_PAGE + 1, true),\n            this.props.actions.getAllGroupsAssociatedToChannel(this.props.currentChannelId, false, true),\n        ]).then(() => {\n            this.setGroupsLoadingState(false);\n        });\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (this.props.searchTerm !== prevProps.searchTerm) {\n            clearTimeout(this.searchTimeoutId);\n\n            const searchTerm = this.props.searchTerm;\n            if (searchTerm === '') {\n                return;\n            }\n\n            this.searchTimeoutId = window.setTimeout(\n                async () => {\n                    this.setGroupsLoadingState(true);\n                    await this.props.actions.getGroupsNotAssociatedToChannel(this.props.currentChannelId, searchTerm, null, null, true);\n                    this.setGroupsLoadingState(false);\n                },\n                Constants.SEARCH_TIMEOUT_MILLISECONDS,\n            );\n        }\n    }\n\n    handleHide = () => {\n        this.props.actions.setModalSearchTerm('');\n        this.setState({show: false});\n    }\n\n    handleExit = () => {\n        if (this.props.onHide) {\n            this.props.onHide();\n        }\n    }\n\n    handleResponse = (err?: ServerError) => {\n        let addError = null;\n        if (err && err.message) {\n            addError = err.message;\n        }\n\n        this.setState({\n            saving: false,\n            addError,\n        });\n    }\n\n    handleSubmit = async () => {\n        const groupIDs = this.state.values.map((v) => v.id);\n        if (groupIDs.length === 0) {\n            return;\n        }\n\n        if (this.props.skipCommit) {\n            if (this.props.onAddCallback) {\n                this.props.onAddCallback(groupIDs);\n            }\n            this.handleHide();\n            return;\n        }\n\n        this.setState({saving: true});\n\n        await Promise.all(groupIDs.map(async (groupID) => {\n            const {error} = await this.props.actions.linkGroupSyncable(groupID, this.props.currentChannelId, Groups.SYNCABLE_TYPE_CHANNEL, {auto_add: true});\n            this.handleResponse(error);\n            if (!error) {\n                this.handleHide();\n            }\n        }));\n    }\n\n    addValue = (value: GroupValue) => {\n        const values = Object.assign([], this.state.values);\n        const userIds = values.map((v: Group) => v.id);\n        if (value && value.id && userIds.indexOf(value.id) === -1) {\n            values.push(value);\n        }\n\n        this.setState({values});\n    }\n\n    setGroupsLoadingState = (loadingState: boolean) => {\n        this.setState({\n            loadingGroups: loadingState,\n        });\n    }\n\n    handlePageChange = (page: number, prevPage: number) => {\n        if (page > prevPage) {\n            this.setGroupsLoadingState(true);\n            this.props.actions.getGroupsNotAssociatedToChannel(this.props.currentChannelId, this.props.searchTerm, page, GROUPS_PER_PAGE + 1, true).then(() => {\n                this.setGroupsLoadingState(false);\n            });\n        }\n    }\n\n    handleDelete = (values: GroupValue[]) => {\n        this.setState({values});\n    }\n\n    search = (term: string) => {\n        this.props.actions.setModalSearchTerm(term);\n    }\n\n    renderOption = (option: GroupValue, isSelected: boolean, onAdd: (value: GroupValue) => void, onMouseMove?: (value: GroupValue) => void) => {\n        const rowSelected = isSelected ? 'more-modal__row--selected' : '';\n\n        return (\n            <div\n                key={option.id}\n                ref={isSelected ? this.selectedItemRef : option.id}\n                className={'more-modal__row clickable ' + rowSelected}\n                onClick={() => onAdd(option)}\n                onMouseMove={() => (onMouseMove ? onMouseMove(option) : undefined)}\n            >\n                <img\n                    className='more-modal__image'\n                    src={groupsAvatar}\n                    alt='group picture'\n                    width='32'\n                    height='32'\n                />\n                <div\n                    className='more-modal__details'\n                >\n                    <div className='more-modal__name'>\n                        {option.display_name}{'\\u00A0-\\u00A0'}<span className='more-modal__name_sub'>\n                            <FormattedMessage\n                                id='numMembers'\n                                defaultMessage='{num, number} {num, plural, one {member} other {members}}'\n                                values={{\n                                    num: option.member_count,\n                                }}\n                            />\n                        </span>\n                    </div>\n                </div>\n                <div className='more-modal__actions'>\n                    <div className='more-modal__actions--round'>\n                        <AddIcon/>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n\n    renderValue(props: { data: Partial<Value> }) {\n        return props.data.display_name;\n    }\n\n    render() {\n        const numRemainingText = (\n            <div id='numGroupsRemaining'>\n                <FormattedMessage\n                    id='multiselect.numGroupsRemaining'\n                    defaultMessage='Use ↑↓ to browse, ↵ to select. You can add {num, number} more {num, plural, one {group} other {groups}}. '\n                    values={{\n                        num: MAX_SELECTABLE_VALUES - this.state.values.length,\n                    }}\n                />\n            </div>\n        );\n\n        const buttonSubmitText = localizeMessage('multiselect.add', 'Add');\n        const buttonSubmitLoadingText = localizeMessage('multiselect.adding', 'Adding...');\n\n        let addError = null;\n        if (this.state.addError) {\n            addError = (<div className='has-error col-sm-12'><label className='control-label font-weight--normal'>{this.state.addError}</label></div>);\n        }\n        let groupsToShow = this.props.groups;\n        if (this.props.excludeGroups) {\n            const hasGroup = (og: Group) => !this.props.excludeGroups!.find((g) => g.id === og.id);\n            groupsToShow = groupsToShow.filter(hasGroup);\n        }\n        if (this.props.includeGroups) {\n            const hasGroup = (og: Group) => this.props.includeGroups!.find((g) => g.id === og.id);\n            groupsToShow = [...groupsToShow, ...this.props.includeGroups.filter(hasGroup)];\n        }\n        const groupsToShowValues = groupsToShow.map((group) => {\n            return {label: group.display_name, value: group.id, ...group};\n        });\n\n        return (\n            <Modal\n                id='addGroupsToChannelModal'\n                dialogClassName={'a11y__modal more-modal more-direct-channels'}\n                show={this.state.show}\n                onHide={this.handleHide}\n                onExited={this.handleExit}\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title>\n                        <FormattedMessage\n                            id='add_groups_to_channel.title'\n                            defaultMessage='Add New Groups to {channelName} Channel'\n                            values={{\n                                channelName: (\n                                    <strong>{this.props.currentChannelName}</strong>\n                                ),\n                            }}\n                        />\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    {addError}\n                    <MultiSelect\n                        key='addGroupsToChannelKey'\n                        options={groupsToShowValues}\n                        optionRenderer={this.renderOption}\n                        selectedItemRef={this.selectedItemRef}\n                        values={this.state.values}\n                        valueRenderer={this.renderValue}\n                        perPage={GROUPS_PER_PAGE}\n                        handlePageChange={this.handlePageChange}\n                        handleInput={this.search}\n                        handleDelete={this.handleDelete}\n                        handleAdd={this.addValue}\n                        handleSubmit={this.handleSubmit}\n                        maxValues={MAX_SELECTABLE_VALUES}\n                        numRemainingText={numRemainingText}\n                        buttonSubmitText={buttonSubmitText}\n                        buttonSubmitLoadingText={buttonSubmitLoadingText}\n                        saving={this.state.saving}\n                        loading={this.state.loadingGroups}\n                        placeholderText={localizeMessage('multiselect.addGroupsPlaceholder', 'Search and add groups')}\n                    />\n                </Modal.Body>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {getGroupsNotAssociatedToChannel, linkGroupSyncable, getAllGroupsAssociatedToChannel, getAllGroupsAssociatedToTeam} from 'mattermost-redux/actions/groups';\nimport {getTeam} from 'mattermost-redux/actions/teams';\nimport {getGroupsNotAssociatedToChannel as selectGroupsNotAssociatedToChannel} from 'mattermost-redux/selectors/entities/groups';\nimport {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\n\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\nimport {Group} from 'mattermost-redux/types/groups';\n\nimport {GlobalState} from 'types/store';\nimport {setModalSearchTerm} from 'actions/views/search';\n\nimport AddGroupsToChannelModal, {Props} from './add_groups_to_channel_modal';\n\ntype OwnProps = {\n    channel: Channel;\n    skipCommit: boolean;\n    onAddCallback: (groupIDs: string[]) => void;\n    excludeGroups: Group[];\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const searchTerm = state.views.search.modalSearch;\n\n    const channel = ownProps.channel || getCurrentChannel(state) || {};\n\n    let groups = selectGroupsNotAssociatedToChannel(state, channel.id, channel.team_id);\n    if (searchTerm) {\n        const regex = RegExp(searchTerm, 'i');\n        groups = groups.filter((group) => regex.test(group.display_name) || regex.test(group.name));\n    }\n\n    return {\n        currentChannelName: channel.display_name,\n        currentChannelId: channel.id,\n        skipCommit: ownProps.skipCommit,\n        onAddCallback: ownProps.onAddCallback,\n        excludeGroups: ownProps.excludeGroups,\n        searchTerm,\n        groups,\n        teamID: channel.team_id,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc| GenericAction>, Props['actions']>({\n            getGroupsNotAssociatedToChannel,\n            setModalSearchTerm,\n            linkGroupSyncable,\n            getAllGroupsAssociatedToChannel,\n            getTeam,\n            getAllGroupsAssociatedToTeam,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddGroupsToChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {RefObject} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Groups} from 'mattermost-redux/constants';\n\nimport {Group, GroupsWithCount, SyncablePatch, SyncableType} from 'mattermost-redux/types/groups';\n\nimport Constants from 'utils/constants';\nimport {localizeMessage} from 'utils/utils.jsx';\n\nimport MultiSelect, {Value} from 'components/multiselect/multiselect';\nimport groupsAvatar from 'images/groups-avatar.png';\nimport AddIcon from 'components/widgets/icons/fa_add_icon';\nimport Nbsp from 'components/html_entities/nbsp';\n\nconst GROUPS_PER_PAGE = 50;\nconst MAX_SELECTABLE_VALUES = 10;\n\ntype GroupValue = Value & {member_count?: number};\n\ntype Props = {\n    currentTeamName: string;\n    currentTeamId: string;\n    searchTerm: string;\n    groups: Group[];\n\n    // used in tandem with 'skipCommit' to allow using this component without performing actual linking\n    excludeGroups?: Group[];\n    includeGroups?: Group[];\n    onHide?: () => void;\n    skipCommit?: boolean;\n    onAddCallback?: (groupIDs: string[]) => void;\n    actions: Actions;\n}\n\nexport type Actions = {\n    getGroupsNotAssociatedToTeam: (teamID: string, q?: string, page?: number, perPage?: number) => Promise<{ data: Group[] } | { error: Error }>;\n    setModalSearchTerm: (term: string) => void;\n    linkGroupSyncable: (groupID: string, syncableID: string, syncableType: SyncableType, patch: SyncablePatch) => Promise<{ data?: boolean; error?: Error }>;\n    getAllGroupsAssociatedToTeam: (teamID: string, filterAllowReference: boolean, includeMemberCount: boolean) => Promise<{ data: GroupsWithCount } | { error: Error }>;\n};\n\ntype State = {\n    values: GroupValue[];\n    show: boolean;\n    search: boolean;\n    saving: boolean;\n    addError: null | string;\n    loadingGroups: boolean;\n}\n\nexport default class AddGroupsToTeamModal extends React.PureComponent<Props, State> {\n    private searchTimeoutId: number;\n    private readonly selectedItemRef: RefObject<HTMLDivElement>;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.searchTimeoutId = 0;\n\n        this.state = {\n            values: [],\n            show: true,\n            search: false,\n            saving: false,\n            addError: null,\n            loadingGroups: true,\n        };\n\n        this.selectedItemRef = React.createRef();\n    }\n\n    public componentDidMount() {\n        Promise.all([\n            this.props.actions.getGroupsNotAssociatedToTeam(this.props.currentTeamId, '', 0, GROUPS_PER_PAGE + 1),\n            this.props.actions.getAllGroupsAssociatedToTeam(this.props.currentTeamId, false, true),\n        ]).then(() => {\n            this.setGroupsLoadingState(false);\n        });\n    }\n\n    public componentDidUpdate(prevProps: Props) {\n        if (this.props.searchTerm !== prevProps.searchTerm) {\n            clearTimeout(this.searchTimeoutId);\n\n            const searchTerm = this.props.searchTerm;\n            if (searchTerm === '') {\n                return;\n            }\n\n            this.searchTimeoutId = window.setTimeout(\n                async () => {\n                    this.setGroupsLoadingState(true);\n                    await this.props.actions.getGroupsNotAssociatedToTeam(this.props.currentTeamId, searchTerm);\n                    this.setGroupsLoadingState(false);\n                },\n                Constants.SEARCH_TIMEOUT_MILLISECONDS,\n            );\n        }\n    }\n\n    // public for tests\n    public handleHide = () => {\n        this.props.actions.setModalSearchTerm('');\n        this.setState({show: false});\n    }\n\n    // public for tests\n    public handleExit = (): void => {\n        if (this.props.onHide) {\n            this.props.onHide();\n        }\n    }\n\n    // public for tests\n    public handleResponse = (err?: Error): void => {\n        let addError = null;\n        if (err && err.message) {\n            addError = err.message;\n        }\n\n        this.setState({\n            saving: false,\n            addError,\n        });\n    }\n\n    // public for tests\n    public handleSubmit = async () => {\n        const groupIDs = this.state.values.map((v) => v.id);\n        if (groupIDs.length === 0) {\n            return;\n        }\n        if (this.props.skipCommit) {\n            if (this.props.onAddCallback) {\n                this.props.onAddCallback(groupIDs);\n            }\n            this.handleHide();\n            return;\n        }\n\n        this.setState({saving: true});\n\n        await Promise.all(groupIDs.map(async (groupID) => {\n            const {error} = await this.props.actions.linkGroupSyncable(groupID, this.props.currentTeamId, Groups.SYNCABLE_TYPE_TEAM, {auto_add: true, scheme_admin: false});\n            this.handleResponse(error);\n            if (!error) {\n                this.handleHide();\n            }\n        }));\n    }\n\n    // public for tests\n    public addValue = (value: GroupValue): void => {\n        const values = Object.assign<GroupValue[], GroupValue[]>([], this.state.values);\n        const userIds = values.map((v) => v.id);\n        if (value && value.id && userIds.indexOf(value.id) === -1) {\n            values.push(value);\n        }\n\n        this.setState({values});\n    }\n\n    private setGroupsLoadingState = (loadingState: boolean) => {\n        this.setState({\n            loadingGroups: loadingState,\n        });\n    }\n\n    // public for tests\n    public handlePageChange = (page: number, prevPage: number): void => {\n        if (page > prevPage) {\n            this.setGroupsLoadingState(true);\n            this.props.actions.getGroupsNotAssociatedToTeam(this.props.currentTeamId, this.props.searchTerm, page, GROUPS_PER_PAGE + 1).then(() => {\n                this.setGroupsLoadingState(false);\n            });\n        }\n    }\n\n    // public for tests\n    public handleDelete = (values: GroupValue[]): void => this.setState({values});\n\n    // public for tests\n    public search = (term: string): void => this.props.actions.setModalSearchTerm(term);\n\n    // public for tests\n    public renderOption = (option: GroupValue, isSelected: boolean, onAdd: (value: GroupValue) => void, onMouseMove: (value: GroupValue) => void): JSX.Element => {\n        const rowSelected = isSelected ? 'more-modal__row--selected' : '';\n\n        return (\n            <div\n                key={option.id}\n                ref={isSelected ? this.selectedItemRef : option.id}\n                className={'more-modal__row clickable ' + rowSelected}\n                onClick={() => onAdd(option)}\n                onMouseMove={() => onMouseMove(option)}\n            >\n                <img\n                    className='more-modal__image'\n                    src={groupsAvatar}\n                    alt='group picture'\n                    width='32'\n                    height='32'\n                />\n                <div\n                    className='more-modal__details'\n                >\n                    <div className='more-modal__name'>\n                        {option.display_name}<Nbsp/>{'-'}<Nbsp/><span className='more-modal__name_sub'>\n                            <FormattedMessage\n                                id='numMembers'\n                                defaultMessage='{num, number} {num, plural, one {member} other {members}}'\n                                values={{\n                                    num: option.member_count,\n                                }}\n                            />\n                        </span>\n                    </div>\n                </div>\n                <div className='more-modal__actions'>\n                    <div className='more-modal__actions--round'>\n                        <AddIcon/>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n\n    // public for tests\n    public renderValue = (props: { data: Value }): string | undefined => props.data.display_name;\n\n    public render(): JSX.Element {\n        const numRemainingText = (\n            <div id='numGroupsRemaining'>\n                <FormattedMessage\n                    id='multiselect.numGroupsRemaining'\n                    defaultMessage='Use ↑↓ to browse, ↵ to select. You can add {num, number} more {num, plural, one {group} other {groups}}. '\n                    values={{\n                        num: MAX_SELECTABLE_VALUES - this.state.values.length,\n                    }}\n                />\n            </div>\n        );\n\n        const buttonSubmitText = localizeMessage('multiselect.add', 'Add');\n        const buttonSubmitLoadingText = localizeMessage('multiselect.adding', 'Adding...');\n\n        let addError = null;\n        if (this.state.addError) {\n            addError = (\n                <div className='has-error col-sm-12'>\n                    <label className='control-label font-weight--normal'>\n                        {this.state.addError}\n                    </label>\n                </div>\n            );\n        }\n\n        let groupsToShow = this.props.groups;\n        if (this.props.excludeGroups) {\n            const hasGroup = (og: Group) => !this.props.excludeGroups?.find((g) => g.id === og.id);\n            groupsToShow = groupsToShow.filter(hasGroup);\n        }\n        if (this.props.includeGroups) {\n            const hasGroup = (og: Group) => this.props.includeGroups?.find((g) => g.id === og.id);\n            groupsToShow = [...groupsToShow, ...this.props.includeGroups.filter(hasGroup)];\n        }\n\n        const groupsOptionsToShow = groupsToShow.map((group) => {\n            return {...group, label: group.display_name, value: group.id};\n        });\n\n        return (\n            <Modal\n                id='addGroupsToTeamModal'\n                dialogClassName={'a11y__modal more-modal more-direct-channels'}\n                show={this.state.show}\n                onHide={this.handleHide}\n                onExited={this.handleExit}\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title componentClass='h1'>\n                        <FormattedMessage\n                            id='add_groups_to_team.title'\n                            defaultMessage='Add New Groups to {teamName} Team'\n                            values={{\n                                teamName: (\n                                    <strong>{this.props.currentTeamName}</strong>\n                                ),\n                            }}\n                        />\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    {addError}\n                    <MultiSelect\n                        key='addGroupsToTeamKey'\n                        options={groupsOptionsToShow}\n                        optionRenderer={this.renderOption}\n                        selectedItemRef={this.selectedItemRef}\n                        values={this.state.values}\n                        valueRenderer={this.renderValue}\n                        perPage={GROUPS_PER_PAGE}\n                        handlePageChange={this.handlePageChange}\n                        handleInput={this.search}\n                        handleDelete={this.handleDelete}\n                        handleAdd={this.addValue}\n                        handleSubmit={this.handleSubmit}\n                        maxValues={MAX_SELECTABLE_VALUES}\n                        numRemainingText={numRemainingText}\n                        buttonSubmitText={buttonSubmitText}\n                        buttonSubmitLoadingText={buttonSubmitLoadingText}\n                        saving={this.state.saving}\n                        loading={this.state.loadingGroups}\n                        placeholderText={localizeMessage('multiselect.addGroupsPlaceholder', 'Search and add groups')}\n                    />\n                </Modal.Body>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {getGroupsNotAssociatedToTeam, linkGroupSyncable, getAllGroupsAssociatedToTeam} from 'mattermost-redux/actions/groups';\nimport {getGroupsNotAssociatedToTeam as selectGroupsNotAssociatedToTeam} from 'mattermost-redux/selectors/entities/groups';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {Team} from 'mattermost-redux/types/teams';\nimport {Group} from 'mattermost-redux/types/groups';\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\n\nimport {setModalSearchTerm} from 'actions/views/search';\nimport {GlobalState} from '../../types/store';\n\nimport AddGroupsToTeamModal, {Actions} from './add_groups_to_team_modal';\n\ntype Props = {\n    team?: Team;\n    skipCommit?: boolean;\n    onAddCallback?: (groupIDs: string[]) => void;\n    excludeGroups?: Group[];\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const searchTerm = state.views.search.modalSearch;\n\n    const team = ownProps.team || getCurrentTeam(state) || {};\n\n    let groups = selectGroupsNotAssociatedToTeam(state, team.id);\n    if (searchTerm) {\n        const regex = RegExp(searchTerm, 'i');\n        groups = groups.filter((group) => regex.test(group.display_name) || regex.test(group.name));\n    }\n\n    return {\n        currentTeamName: team.display_name,\n        currentTeamId: team.id,\n        skipCommit: ownProps.skipCommit,\n        onAddCallback: ownProps.onAddCallback,\n        excludeGroups: ownProps.excludeGroups,\n        searchTerm,\n        groups,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc|GenericAction>, Actions>({\n            getGroupsNotAssociatedToTeam,\n            setModalSearchTerm,\n            linkGroupSyncable,\n            getAllGroupsAssociatedToTeam,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddGroupsToTeamModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport CardImage from 'components/payment_form/card_image';\nimport {GlobalState} from 'types/store';\n\nexport interface PaymentDetailsProps {\n    children?: React.ReactNode;\n}\n\nconst PaymentDetails: React.FC<PaymentDetailsProps> = ({children}: PaymentDetailsProps) => {\n    const customerPaymentInfo = useSelector((state: GlobalState) => state.entities.cloud.customer);\n\n    if (!customerPaymentInfo?.payment_method && !customerPaymentInfo?.billing_address) {\n        return null;\n    }\n    const address = customerPaymentInfo.billing_address;\n\n    return (\n        <div className='PaymentInfoDisplay__paymentInfo-text'>\n            <CardImage brand={customerPaymentInfo.payment_method.card_brand}/>\n            <div className='PaymentInfoDisplay__paymentInfo-cardInfo'>\n                <FormattedMarkdownMessage\n                    id='admin.billing.payment_info.cardBrandAndDigits'\n                    defaultMessage='{brand} ending in {digits}'\n                    values={{\n                        brand: customerPaymentInfo.payment_method.card_brand,\n                        digits: customerPaymentInfo.payment_method.last_four,\n                    }}\n                />\n                <br/>\n                <FormattedMarkdownMessage\n                    id='admin.billing.payment_info.cardExpiry'\n                    defaultMessage='Expires {month}/{year}'\n                    values={{\n                        month: String(customerPaymentInfo.payment_method.exp_month).padStart(2, '0'),\n                        year: String(customerPaymentInfo.payment_method.exp_year).padStart(2, '0'),\n                    }}\n                />\n            </div>\n            <div className='PaymentInfoDisplay__paymentInfo-addressTitle'>\n                <FormattedMessage\n                    id='admin.billing.payment_info.billingAddress'\n                    defaultMessage='Billing Address'\n                />\n            </div>\n            <div className='PaymentInfoDisplay__paymentInfo-address'>\n                <div>{address.line1}</div>\n                {address.line2 && <div>{address.line2}</div>}\n                <div>{`${address.city}, ${address.state}, ${address.postal_code}`}</div>\n                <div>{address.country}</div>\n            </div>\n            {children}\n        </div>\n    );\n};\n\nexport default PaymentDetails;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport classNames from 'classnames';\n\nimport './alert_banner.scss';\n\ntype Props = {\n    mode: 'danger' | 'warning' | 'info';\n    title?: React.ReactNode;\n    message: React.ReactNode;\n    className?: string;\n    onDismiss?: () => void;\n    variant?: 'sys' | 'app';\n}\n\nconst AlertBanner: React.FC<Props> = (props: Props) => {\n    const {mode, title, message, className, onDismiss} = props;\n\n    const variant = props.variant || 'sys';\n\n    return (\n        <div className={classNames('AlertBanner', mode, className, `AlertBanner--${variant}`)}>\n            <div className='AlertBanner__icon'>\n                {mode === 'info' &&\n                    <i className='icon-alert-circle-outline'/>\n                }\n                {mode !== 'info' &&\n                    <i className='icon-alert-outline'/>\n                }\n            </div>\n            <div className='AlertBanner__body'>\n                {title &&\n                    <div className='AlertBanner__title'>\n                        {title}\n                    </div>\n                }\n                <div\n                    className={classNames({\n                        AlertBanner__message: Boolean(title),\n                    })}\n                >\n                    {message}\n                </div>\n            </div>\n            {onDismiss &&\n                <button\n                    className='AlertBanner__closeButton'\n                    onClick={onDismiss}\n                >\n                    <i className='icon-close'/>\n                </button>\n            }\n        </div>\n    );\n};\n\nexport default AlertBanner;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionTypes} from 'utils/constants';\n\nexport function incrementAnnouncementBarCount() {\n    return {\n        type: ActionTypes.TRACK_ANNOUNCEMENT_BAR,\n    };\n}\n\nexport function decrementAnnouncementBarCount() {\n    return {\n        type: ActionTypes.DISMISS_ANNOUNCEMENT_BAR,\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {CSSProperties} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {Dictionary} from 'mattermost-redux/types/utilities';\nimport {AnalyticsRow} from 'mattermost-redux/types/admin';\nimport {ActionFunc} from 'mattermost-redux/types/actions';\nimport {WarnMetricStatus} from 'mattermost-redux/types/config';\n\nimport {getSiteURL} from 'utils/url';\nimport {t} from 'utils/i18n';\nimport {Constants, ModalIdentifiers, WarnMetricTypes} from 'utils/constants';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport * as AdminActions from 'actions/admin_actions.jsx';\n\nconst StatTypes = Constants.StatTypes;\n\nimport * as Utils from 'utils/utils.jsx';\n\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\nimport ErrorLink from 'components/error_page/error_link';\n\ntype Props = {\n    user: UserProfile;\n    telemetryId?: string;\n    show: boolean;\n    closeParentComponent?: () => Promise<void>;\n    stats?: Dictionary<number | AnalyticsRow[]>;\n    warnMetricStatus: WarnMetricStatus;\n    actions: {\n        closeModal: (arg: string) => void;\n        getStandardAnalytics: () => any;\n        sendWarnMetricAck: (arg0: string, arg1: boolean) => ActionFunc & Partial<{error?: string}>;\n    };\n}\n\ntype State = {\n    serverError: string | null;\n    gettingTrial: boolean;\n    gettingTrialError: string | null;\n    saving: boolean;\n}\n\nconst containerStyles: CSSProperties = {\n    display: 'flex',\n    opacity: '0.56',\n    flexWrap: 'wrap',\n};\n\nexport default class WarnMetricAckModal extends React.PureComponent<Props, State> {\n    public constructor(props: Props) {\n        super(props);\n        this.state = {\n            saving: false,\n            serverError: null,\n            gettingTrial: false,\n            gettingTrialError: null,\n        };\n    }\n\n    componentDidMount() {\n        AdminActions.getStandardAnalytics();\n    }\n\n    onContactUsClick = async (e: any) => {\n        if (this.state.saving) {\n            return;\n        }\n\n        this.setState({saving: true, serverError: null});\n\n        let forceAck = false;\n        if (e && e.target && e.target.dataset && e.target.dataset.forceack) {\n            forceAck = true;\n            trackEvent('admin', 'click_warn_metric_mailto', {metric: this.props.warnMetricStatus.id});\n        } else {\n            trackEvent('admin', 'click_warn_metric_contact_us', {metric: this.props.warnMetricStatus.id});\n        }\n\n        const {error} = await this.props.actions.sendWarnMetricAck(this.props.warnMetricStatus.id, forceAck);\n        if (error) {\n            this.setState({serverError: error, saving: false});\n        } else {\n            this.onHide();\n        }\n    }\n\n    onHide = () => {\n        this.setState({serverError: null, saving: false});\n\n        this.setState({gettingTrialError: null, gettingTrial: false});\n        this.props.actions.closeModal(ModalIdentifiers.WARN_METRIC_ACK);\n        if (this.props.closeParentComponent) {\n            this.props.closeParentComponent();\n        }\n    }\n\n    renderContactUsError = () => {\n        const {serverError} = this.state;\n        if (!serverError) {\n            return '';\n        }\n\n        const mailRecipient = 'support-advisor@mattermost.com';\n        const mailSubject = 'Mattermost Contact Us request';\n        let mailBody = 'Mattermost Contact Us request.';\n        if (this.props.warnMetricStatus.id === WarnMetricTypes.SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_500) {\n            mailBody = 'Mattermost Contact Us request.\\r\\nMy team now has 500 users, and I am considering Mattermost Enterprise Edition.';\n        } else if (this.props.warnMetricStatus.id === WarnMetricTypes.SYSTEM_WARN_METRIC_NUMBER_OF_POSTS_2M) {\n            mailBody = 'Mattermost Contact Us request.\\r\\nI am interested in learning more about improving performance with Elasticsearch.';\n        }\n\n        mailBody += '\\r\\n';\n        mailBody += 'Contact ' + this.props.user.first_name + ' ' + this.props.user.last_name;\n        mailBody += '\\r\\n';\n        mailBody += 'Email ' + this.props.user.email;\n        mailBody += '\\r\\n';\n\n        if (this.props.stats && this.props.stats[StatTypes.TOTAL_USERS]) {\n            mailBody += 'Registered Users ' + this.props.stats[StatTypes.TOTAL_USERS];\n            mailBody += '\\r\\n';\n        }\n        mailBody += 'Site URL ' + getSiteURL();\n        mailBody += '\\r\\n';\n\n        mailBody += 'Telemetry Id ' + this.props.telemetryId;\n        mailBody += '\\r\\n';\n\n        mailBody += 'If you have any additional inquiries, please contact support@mattermost.com';\n\n        const mailToLinkText = 'mailto:' + mailRecipient + '?cc=' + this.props.user.email + '&subject=' + encodeURIComponent(mailSubject) + '&body=' + encodeURIComponent(mailBody);\n\n        return (\n            <div className='form-group has-error'>\n                <br/>\n                <label className='control-label'>\n                    <FormattedMessage\n                        id='warn_metric_ack_modal.mailto.message'\n                        defaultMessage='Support could not be reached. Please {link}.'\n                        values={{\n                            link: (\n                                <WarnMetricAckErrorLink\n                                    url={mailToLinkText}\n                                    messageId={t('warn_metric_ack_modal.mailto.link')}\n                                    forceAck={true}\n                                    defaultMessage='email us'\n                                    onClickHandler={this.onContactUsClick}\n                                />\n                            ),\n                        }}\n                    />\n                </label>\n            </div>\n        );\n    }\n\n    render() {\n        let headerTitle;\n        if (this.props.warnMetricStatus.id === WarnMetricTypes.SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_500) {\n            headerTitle = (\n                <FormattedMessage\n                    id='warn_metric_ack_modal.number_of_users.header.title'\n                    defaultMessage='Scaling with Mattermost'\n                />\n            );\n        } else if (this.props.warnMetricStatus.id === WarnMetricTypes.SYSTEM_WARN_METRIC_NUMBER_OF_POSTS_2M) {\n            headerTitle = (\n                <FormattedMessage\n                    id='warn_metric_ack_modal.number_of_posts.header.title'\n                    defaultMessage='Improve Performance'\n                />\n            );\n        }\n\n        let descriptionText;\n        const learnMoreLink = 'https://mattermost.com/pl/default-admin-advisory';\n\n        if (this.props.warnMetricStatus.id === WarnMetricTypes.SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_500) {\n            descriptionText = (\n                <FormattedMessage\n                    id='warn_metric_ack_modal.number_of_active_users.description'\n                    defaultMessage='Mattermost strongly recommends that deployments of over {limit}} users take advantage of features such as user management, server clustering, and performance monitoring. Contact us to learn more and let us know how we can help.'\n                    values={{\n                        limit: this.props.warnMetricStatus.limit,\n                    }}\n                />\n            );\n        } else if (this.props.warnMetricStatus.id === WarnMetricTypes.SYSTEM_WARN_METRIC_NUMBER_OF_POSTS_2M) {\n            descriptionText = (\n                <FormattedMessage\n                    id='warn_metric_ack_modal.number_of_posts.description'\n                    defaultMessage='Your Mattermost system has a large number of messages. The default Mattermost database search starts to show performance degradation at around 2.5 million posts. With over 5 million posts, Elasticsearch can help avoid significant performance issues, such as timeouts, with search and at-mentions. Contact us to learn more and let us know how we can help.'\n                    values={{\n                        limit: this.props.warnMetricStatus.limit,\n                    }}\n                />\n            );\n        }\n\n        const subText = (\n            <div\n                style={containerStyles}\n                className='help__format-text'\n            >\n                <FormattedMessage\n                    id='warn_metric_ack_modal.subtext'\n                    defaultMessage='By clicking Acknowledge, you will be sharing your information with Mattermost Inc. {link}'\n                    values={{\n                        link: (\n                            <ErrorLink\n                                url={learnMoreLink}\n                                messageId={t('warn_metric_ack_modal.learn_more.link')}\n                                defaultMessage='Learn more'\n                            />\n                        ),\n                    }}\n                />\n            </div>\n        );\n\n        const error = this.renderContactUsError();\n        const footer = (\n            <Modal.Footer>\n                <button\n                    className='btn btn-primary save-button'\n                    data-dismiss='modal'\n                    disabled={this.state.saving}\n                    autoFocus={true}\n                    onClick={this.onContactUsClick}\n                >\n                    <LoadingWrapper\n                        loading={this.state.saving}\n                        text={Utils.localizeMessage('admin.warn_metric.sending-email', 'Sending email')}\n                    >\n                        <FormattedMessage\n                            id='warn_metric_ack_modal.contact_support'\n                            defaultMessage='Acknowledge'\n                        />\n                    </LoadingWrapper>\n                </button>\n            </Modal.Footer>\n        );\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal'\n                show={this.props.show}\n                keyboard={false}\n                onHide={this.onHide}\n                onExited={this.onHide}\n                role='dialog'\n                aria-labelledby='warnMetricAckHeaderModalLabel'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='warnMetricAckHeaderModalLabel'\n                    >\n                        {headerTitle}\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    <div>\n                        {descriptionText}\n                        <br/>\n                        {error}\n                        <br/>\n                        {subText}\n                    </div>\n                </Modal.Body>\n                {footer}\n            </Modal>\n        );\n    }\n}\n\ntype ErrorLinkProps = {\n    defaultMessage: string;\n    messageId: string;\n    onClickHandler: (e: React.MouseEvent<HTMLAnchorElement>) => Promise<void>;\n    url: string;\n    forceAck: boolean;\n}\n\nconst WarnMetricAckErrorLink: React.FC<ErrorLinkProps> = ({defaultMessage, messageId, onClickHandler, url, forceAck}: ErrorLinkProps) => {\n    return (\n        <a\n            href={url}\n            rel='noopener noreferrer'\n            target='_blank'\n            data-forceAck={forceAck}\n            onClick={\n                (e) => {\n                    onClickHandler(e);\n                }\n            }\n        >\n            <FormattedMessage\n                id={messageId}\n                defaultMessage={defaultMessage}\n            />\n        </a>\n    );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {ActionFunc} from 'mattermost-redux/types/actions';\nimport {getStandardAnalytics, sendWarnMetricAck} from 'mattermost-redux/actions/admin';\n\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/common';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {closeModal} from 'actions/views/modals';\n\nimport {isModalOpen} from '../../selectors/views/modals';\nimport {ModalIdentifiers} from '../../utils/constants';\n\nimport WarnMetricAckModal from './warn_metric_ack_modal';\n\ntype Props = {\n    closeParentComponent: () => Promise<void>;\n};\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const config = getConfig(state);\n\n    return {\n        stats: state.entities.admin.analytics,\n        user: getCurrentUser(state),\n        telemetryId: config.DiagnosticId,\n        show: isModalOpen(state, ModalIdentifiers.WARN_METRIC_ACK),\n        closeParentComponent: ownProps.closeParentComponent,\n    };\n}\n\ntype Actions = {\n    closeModal: (arg: string) => void;\n    getStandardAnalytics: () => any;\n    sendWarnMetricAck: (arg0: string, arg1: boolean) => ActionFunc & Partial<{error?: string}>;\n};\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>(\n            {\n                closeModal,\n                getStandardAnalytics,\n                sendWarnMetricAck,\n            },\n            dispatch,\n        ),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(WarnMetricAckModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport {Tooltip} from 'react-bootstrap';\n\nimport {WarnMetricStatus} from 'mattermost-redux/types/config';\n\nimport {Constants, AnnouncementBarTypes, ModalIdentifiers} from 'utils/constants';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport WarnMetricAckModal from 'components/warn_metric_ack_modal';\nimport ToggleModalButtonRedux from 'components/toggle_modal_button_redux';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\ntype Props = {\n    showCloseButton: boolean;\n    color: string;\n    textColor: string;\n    type: string;\n    message: React.ReactNode;\n    tooltipMsg?: React.ReactNode;\n    handleClose?: (e?: any) => void;\n    showModal?: boolean;\n    announcementBarCount?: number;\n    onButtonClick?: () => void;\n    modalButtonText?: string;\n    modalButtonDefaultText?: string;\n    showLinkAsButton: boolean;\n    icon?: React.ReactNode;\n    warnMetricStatus?: WarnMetricStatus;\n    actions: {\n        incrementAnnouncementBarCount: () => void;\n        decrementAnnouncementBarCount: () => void;\n    };\n}\n\nexport default class AnnouncementBar extends React.PureComponent<Props> {\n    static defaultProps = {\n        showCloseButton: false,\n        color: '',\n        textColor: '',\n        type: AnnouncementBarTypes.CRITICAL,\n        showLinkAsButton: false,\n        isTallBanner: false,\n    }\n\n    componentDidMount() {\n        this.props.actions.incrementAnnouncementBarCount();\n        document.body.classList.add('announcement-bar--fixed');\n    }\n\n    componentWillUnmount() {\n        if (this.props.announcementBarCount === 1) {\n            document.body.classList.remove('announcement-bar--fixed');\n        }\n        this.props.actions.decrementAnnouncementBarCount();\n    }\n\n    handleClose = (e: any) => {\n        e.preventDefault();\n        if (this.props.handleClose) {\n            this.props.handleClose();\n        }\n    }\n\n    render() {\n        if (!this.props.message) {\n            return null;\n        }\n\n        let barClass = 'announcement-bar';\n        const barStyle = {backgroundColor: '', color: ''};\n        const linkStyle = {color: ''};\n        if (this.props.color && this.props.textColor) {\n            barStyle.backgroundColor = this.props.color;\n            barStyle.color = this.props.textColor;\n            linkStyle.color = this.props.textColor;\n        } else if (this.props.type === AnnouncementBarTypes.CRITICAL) {\n            barClass = 'announcement-bar announcement-bar-critical';\n        } else if (this.props.type === AnnouncementBarTypes.SUCCESS) {\n            barClass = 'announcement-bar announcement-bar-success';\n        } else if (this.props.type === AnnouncementBarTypes.ADVISOR) {\n            barClass = 'announcement-bar announcement-bar-advisor';\n        } else if (this.props.type === AnnouncementBarTypes.ADVISOR_ACK) {\n            barClass = 'announcement-bar announcement-bar-advisor-ack';\n        } else if (this.props.type === AnnouncementBarTypes.GENERAL) {\n            barClass = 'announcement-bar announcement-bar-general';\n        }\n\n        let closeButton;\n        if (this.props.showCloseButton) {\n            closeButton = (\n                <a\n                    href='#'\n                    className='announcement-bar__close'\n                    style={linkStyle}\n                    onClick={this.handleClose}\n                >\n                    {'×'}\n                </a>\n            );\n        }\n\n        let message = this.props.message;\n        if (typeof message == 'string') {\n            message = (\n                <FormattedMarkdownMessage id={this.props.message}/>\n            );\n        }\n        const announcementTooltip = (\n            <Tooltip id='announcement-bar__tooltip'>\n                {this.props.tooltipMsg ? this.props.tooltipMsg : message}\n            </Tooltip>\n        );\n\n        const announcementIcon = () => {\n            return this.props.showLinkAsButton &&\n            (this.props.showCloseButton ? <div className='content__icon'>{'\\uF5D6'}</div> : <div className='content__icon'>{'\\uF02A'}</div>);\n        };\n\n        return (\n            <div\n                className={barClass}\n                style={barStyle}\n            >\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='bottom'\n                    overlay={announcementTooltip}\n                >\n                    <div className='announcement-bar__text'>\n                        {this.props.icon ? this.props.icon : announcementIcon()}\n                        {message}\n                        {\n                            !this.props.showLinkAsButton &&\n                            <span className='announcement-bar__link'>\n                                {this.props.showModal &&\n                                <FormattedMessage\n                                    id={this.props.modalButtonText}\n                                    defaultMessage={this.props.modalButtonDefaultText}\n                                >\n                                    {(linkmessage) => (\n                                        <ToggleModalButtonRedux\n                                            ariaLabel={linkmessage}\n                                            className={'color--link--adminack'}\n                                            dialogType={WarnMetricAckModal}\n                                            onClick={() => trackEvent('admin', 'click_warn_metric_learn_more')}\n                                            modalId={ModalIdentifiers.WARN_METRIC_ACK}\n                                            dialogProps={{\n                                                warnMetricStatus: this.props.warnMetricStatus,\n                                                closeParentComponent: this.props.handleClose,\n                                            }}\n                                        >\n                                            {linkmessage}\n                                        </ToggleModalButtonRedux>\n                                    )}\n                                </FormattedMessage>\n                                }\n                            </span>\n                        }\n                        {\n                            this.props.showLinkAsButton &&\n                            <button\n                                className='upgrade-button'\n                                onClick={this.props.onButtonClick}\n                            >\n                                <FormattedMessage\n                                    id={this.props.modalButtonText}\n                                    defaultMessage={this.props.modalButtonDefaultText}\n                                />\n                            </button>\n                        }\n                    </div>\n                </OverlayTrigger>\n                {closeButton}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {incrementAnnouncementBarCount, decrementAnnouncementBarCount} from 'actions/views/announcement_bar';\nimport {getAnnouncementBarCount} from 'selectors/views/announcement_bar';\n\nimport AnnouncementBar from './announcement_bar';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        announcementBarCount: getAnnouncementBarCount(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            incrementAnnouncementBarCount,\n            decrementAnnouncementBarCount,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AnnouncementBar);\n","export default __webpack_public_path__ + \"files/5212bbecd561ec97c98cbb4e71471ee3.svg\";","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\nimport Markdown from 'components/markdown';\n\nimport alertIcon from 'images/icons/round-white-info-icon.svg';\n\nimport AnnouncementBar from './default_announcement_bar';\n\nconst localStoragePrefix = '__announcement__';\n\ntype AnnouncementBarProps = React.ComponentProps<typeof AnnouncementBar>;\n\ninterface Props extends Partial<AnnouncementBarProps> {\n    allowDismissal: boolean;\n    text: string;\n    onDismissal?: () => void;\n}\n\ntype State = {\n    dismissed: boolean;\n}\n\nexport default class TextDismissableBar extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            dismissed: true,\n        };\n    }\n\n    static getDerivedStateFromProps(props: Props) {\n        const dismissed = localStorage.getItem(localStoragePrefix + props.text);\n        return {\n            dismissed: (dismissed === 'true'),\n        };\n    }\n\n    handleDismiss = () => {\n        if (!this.props.allowDismissal) {\n            return;\n        }\n        trackEvent('signup', 'click_dismiss_bar');\n\n        localStorage.setItem(localStoragePrefix + this.props.text, 'true');\n        this.setState({\n            dismissed: true,\n        });\n        if (this.props.onDismissal) {\n            this.props.onDismissal();\n        }\n    }\n\n    render() {\n        if (this.state.dismissed) {\n            return null;\n        }\n        const {allowDismissal, text, ...extraProps} = this.props;\n        return (\n            <AnnouncementBar\n                {...extraProps}\n                showCloseButton={allowDismissal}\n                handleClose={this.handleDismiss}\n                message={\n                    <>\n                        <img\n                            className='advisor-icon'\n                            src={alertIcon}\n                        />\n                        <Markdown\n                            message={text}\n                            options={{\n                                singleline: true,\n                                mentionHighlight: false,\n                            }}\n                        />\n                    </>\n                }\n            />\n        );\n    }\n}\n\n","export default __webpack_public_path__ + \"files/9054075a1cdd8c2a0ed11da3e9632fd0.svg\";","export default __webpack_public_path__ + \"files/2aa0257a61023b2faad41b5b075e05b3.svg\";","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {FormattedMessage, injectIntl, IntlShape} from 'react-intl';\n\nimport {ClientConfig, WarnMetricStatus} from 'mattermost-redux/types/config';\n\nimport {Dictionary} from 'mattermost-redux/types/utilities';\n\nimport {daysToLicenseExpire, isLicenseExpired, isLicenseExpiring, isLicensePastGracePeriod, isTrialLicense} from 'utils/license_utils.jsx';\nimport {AnnouncementBarTypes, AnnouncementBarMessages, WarnMetricTypes} from 'utils/constants';\n\nimport {t} from 'utils/i18n';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\n\nimport AnnouncementBar from '../default_announcement_bar';\nimport TextDismissableBar from '../text_dismissable_bar';\n\nimport ackIcon from 'images/icons/check-circle-outline.svg';\nimport alertIcon from 'images/icons/round-white-info-icon.svg';\nimport warningIcon from 'images/icons/warning-icon.svg';\n\nimport RenewalLink from '../renewal_link/';\nimport PurchaseLink from 'components/announcement_bar/purchase_link/purchase_link';\n\ntype Props = {\n    config?: Partial<ClientConfig>;\n    intl: IntlShape;\n    license?: any;\n    canViewSystemErrors: boolean;\n    dismissedExpiringTrialLicense?: boolean;\n    dismissedExpiringLicense?: boolean;\n    dismissedNumberOfActiveUsersWarnMetricStatus?: boolean;\n    dismissedNumberOfActiveUsersWarnMetricStatusAck?: boolean;\n    dismissedNumberOfPostsWarnMetricStatus?: boolean;\n    dismissedNumberOfPostsWarnMetricStatusAck?: boolean;\n    siteURL: string;\n    warnMetricsStatus?: Dictionary<WarnMetricStatus>;\n    actions: {\n        dismissNotice: (notice: string) => void;\n    };\n};\n\nconst ConfigurationAnnouncementBar: React.FC<Props> = (props: Props) => {\n    const dismissExpiringLicense = () => {\n        props.actions.dismissNotice(AnnouncementBarMessages.LICENSE_EXPIRING);\n    };\n\n    const dismissExpiringTrialLicense = () => {\n        props.actions.dismissNotice(AnnouncementBarMessages.TRIAL_LICENSE_EXPIRING);\n    };\n\n    const dismissNumberOfActiveUsersWarnMetric = () => {\n        props.actions.dismissNotice(AnnouncementBarMessages.WARN_METRIC_STATUS_NUMBER_OF_USERS);\n    };\n\n    const dismissNumberOfPostsWarnMetric = () => {\n        props.actions.dismissNotice(AnnouncementBarMessages.WARN_METRIC_STATUS_NUMBER_OF_POSTS);\n    };\n\n    const dismissNumberOfActiveUsersWarnMetricAck = () => {\n        props.actions.dismissNotice(AnnouncementBarMessages.WARN_METRIC_STATUS_NUMBER_OF_USERS_ACK);\n    };\n\n    const dismissNumberOfPostsWarnMetricAck = () => {\n        props.actions.dismissNotice(AnnouncementBarMessages.WARN_METRIC_STATUS_NUMBER_OF_POSTS_ACK);\n    };\n\n    const renewLinkTelemetry = {success: 'renew_license_banner_success', error: 'renew_license_banner_fail'};\n\n    const getNoticeForWarnMetric = (warnMetricStatus: any) => {\n        if (!warnMetricStatus ||\n            (warnMetricStatus.id !== WarnMetricTypes.SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_500 &&\n            warnMetricStatus.id !== WarnMetricTypes.SYSTEM_WARN_METRIC_NUMBER_OF_POSTS_2M)) {\n            return null;\n        }\n\n        let message: JSX.Element | string = '';\n        let type = '';\n        let showModal = false;\n        let dismissFunc;\n        let isDismissed = null;\n        let canCloseBar = false;\n\n        if (warnMetricStatus.acked) {\n            message = (\n                <>\n                    <img\n                        className='advisor-icon'\n                        src={ackIcon}\n                    />\n                    <FormattedMessage\n                        id='announcement_bar.warn_metric_status_ack.text'\n                        defaultMessage='Thank you for contacting Mattermost. We will follow up with you soon.'\n                    />\n                </>\n            );\n\n            if (warnMetricStatus.id === WarnMetricTypes.SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_500) {\n                dismissFunc = dismissNumberOfActiveUsersWarnMetricAck;\n                isDismissed = props.dismissedNumberOfActiveUsersWarnMetricStatusAck;\n            } else if (warnMetricStatus.id === WarnMetricTypes.SYSTEM_WARN_METRIC_NUMBER_OF_POSTS_2M) {\n                dismissFunc = dismissNumberOfPostsWarnMetricAck;\n                isDismissed = props.dismissedNumberOfPostsWarnMetricStatusAck;\n            }\n\n            type = AnnouncementBarTypes.ADVISOR_ACK;\n            showModal = false;\n            canCloseBar = true;\n        } else {\n            if (warnMetricStatus.id === WarnMetricTypes.SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_500) {\n                message = (\n                    <>\n                        <img\n                            className='advisor-icon'\n                            src={alertIcon}\n                        />\n                        <FormattedMarkdownMessage\n                            id='announcement_bar.number_active_users_warn_metric_status.text'\n                            defaultMessage='You now have over {limit} users. We strongly recommend using advanced features for large-scale servers.'\n                            values={{\n                                limit: warnMetricStatus.limit,\n                            }}\n                        />\n                    </>\n                );\n                dismissFunc = dismissNumberOfActiveUsersWarnMetric;\n                isDismissed = props.dismissedNumberOfActiveUsersWarnMetricStatus;\n            } else if (warnMetricStatus.id === WarnMetricTypes.SYSTEM_WARN_METRIC_NUMBER_OF_POSTS_2M) {\n                message = (\n                    <>\n                        <img\n                            className='advisor-icon'\n                            src={alertIcon}\n                        />\n                        <FormattedMarkdownMessage\n                            id='announcement_bar.number_of_posts_warn_metric_status.text'\n                            defaultMessage='You now have over {limit} posts. We strongly recommend using advanced features for large-scale servers.'\n                            values={{\n                                limit: warnMetricStatus.limit,\n                            }}\n                        />\n                    </>\n                );\n                dismissFunc = dismissNumberOfPostsWarnMetric;\n                isDismissed = props.dismissedNumberOfPostsWarnMetricStatus;\n            }\n            type = AnnouncementBarTypes.ADVISOR;\n            showModal = true;\n            canCloseBar = false;\n        }\n        return {\n            Message: message,\n            DismissFunc: dismissFunc,\n            IsDismissed: isDismissed,\n            Type: type,\n            ShowModal: showModal,\n            CanCloseBar: canCloseBar,\n        };\n    };\n\n    // System administrators\n    if (props.canViewSystemErrors) {\n        if (isLicensePastGracePeriod(props.license)) {\n            const message = (<>\n                <img\n                    className='advisor-icon'\n                    src={warningIcon}\n                />\n                <FormattedMessage\n                    id='announcement_bar.error.license_expired'\n                    defaultMessage='Enterprise license is expired and some features may be disabled.'\n                />\n            </>);\n            return (\n                <AnnouncementBar\n                    type={AnnouncementBarTypes.CRITICAL}\n                    message={\n                        <>\n                            {message}\n                            <RenewalLink telemetryInfo={renewLinkTelemetry}/>\n                        </>\n                    }\n                    tooltipMsg={message}\n                />\n            );\n        }\n\n        if (isLicenseExpired(props.license)) {\n            const message = (<>\n                <img\n                    className='advisor-icon'\n                    src={warningIcon}\n                />\n                <FormattedMessage\n                    id='announcement_bar.error.license_expired'\n                    defaultMessage='Enterprise license is expired and some features may be disabled.'\n                />\n            </>);\n            return (\n                <AnnouncementBar\n                    type={AnnouncementBarTypes.CRITICAL}\n                    message={\n                        <>\n                            {message}\n                            <RenewalLink telemetryInfo={renewLinkTelemetry}/>\n                        </>\n                    }\n                    tooltipMsg={message}\n                />\n            );\n        }\n\n        const daysUntilLicenseExpires = daysToLicenseExpire(props.license);\n        if (isTrialLicense(props.license) && typeof daysUntilLicenseExpires !== 'undefined' && daysUntilLicenseExpires <= 14 && !props.dismissedExpiringTrialLicense) {\n            const purchaseLicense = (\n                <PurchaseLink\n                    buttonTextElement={\n                        <FormattedMarkdownMessage\n                            id='announcement_bar.error.purchase_a_license_now'\n                            defaultMessage='Purchase a License Now'\n                        />\n                    }\n                />\n            );\n\n            let message = (\n                <>\n                    <img\n                        className='advisor-icon'\n                        src={alertIcon}\n                    />\n                    <FormattedMarkdownMessage\n                        id='announcement_bar.error.trial_license_expiring'\n                        defaultMessage='**There are {days} days left on your free trial.**'\n                        values={{\n                            days: daysUntilLicenseExpires,\n                        }}\n                    />\n                </>\n            );\n\n            let announcementBarType = AnnouncementBarTypes.ANNOUNCEMENT;\n\n            if (daysUntilLicenseExpires < 1) {\n                message = (\n                    <>\n                        <img\n                            className='advisor-icon'\n                            src={warningIcon}\n                        />\n                        <FormattedMarkdownMessage\n                            id='announcement_bar.error.trial_license_expiring_last_day'\n                            defaultMessage={'**This is the last day of your free trial. Purchase a license now to continue using Mattermost Professional and Enterprise features.**'}\n                        />\n                    </>\n                );\n                announcementBarType = AnnouncementBarTypes.CRITICAL;\n            }\n\n            return (\n                <AnnouncementBar\n                    showCloseButton={true}\n                    handleClose={dismissExpiringTrialLicense}\n                    type={announcementBarType}\n                    message={\n                        <>\n                            {message}\n                            {purchaseLicense}\n                        </>\n                    }\n                    tooltipMsg={message}\n                />\n            );\n        }\n\n        if (!isTrialLicense(props.license) && isLicenseExpiring(props.license) && !props.dismissedExpiringLicense) {\n            const message = (<>\n                <img\n                    className='advisor-icon'\n                    src={alertIcon}\n                />\n                <FormattedMessage\n                    id='announcement_bar.error.license_expiring'\n                    defaultMessage='Enterprise license expires on {date, date, long}.'\n                    values={{\n                        date: new Date(parseInt(props.license?.ExpiresAt, 10)),\n                    }}\n                />\n            </>);\n            return (\n                <AnnouncementBar\n                    showCloseButton={true}\n                    handleClose={dismissExpiringLicense}\n                    type={AnnouncementBarTypes.ANNOUNCEMENT}\n                    message={\n                        <>\n                            {message}\n                            <RenewalLink telemetryInfo={renewLinkTelemetry}/>\n                        </>\n                    }\n                    tooltipMsg={message}\n                />\n            );\n        }\n\n        if (props.license?.IsLicensed === 'false' &&\n                props.warnMetricsStatus) {\n            for (const status of Object.values(props.warnMetricsStatus)) {\n                const notice = getNoticeForWarnMetric(status);\n                if (!notice || notice.IsDismissed) {\n                    continue;\n                }\n\n                return (\n                    <AnnouncementBar\n                        showCloseButton={notice.CanCloseBar}\n                        handleClose={notice.DismissFunc}\n                        type={notice.Type}\n                        showModal={notice.ShowModal}\n                        modalButtonText={t('announcement_bar.error.warn_metric_status.link')}\n                        modalButtonDefaultText='Learn more'\n                        warnMetricStatus={status}\n                        message={notice.Message}\n                    />\n                );\n            }\n        }\n    } else {\n        // Regular users\n        if (isLicensePastGracePeriod(props.license)) { //eslint-disable-line no-lonely-if\n            return (\n                <AnnouncementBar\n                    type={AnnouncementBarTypes.CRITICAL}\n                    message={\n                        <>\n                            <img\n                                className='advisor-icon'\n                                src={warningIcon}\n                            />\n                            <FormattedMessage\n                                id={AnnouncementBarMessages.LICENSE_PAST_GRACE}\n                                defaultMessage='Enterprise license is expired and some features may be disabled. Please contact your System Administrator for details.'\n                            />\n                        </>\n                    }\n                />\n            );\n        }\n    }\n\n    const {formatMessage} = props.intl;\n\n    if (props.config?.SendEmailNotifications !== 'true' &&\n            props.config?.EnablePreviewModeBanner === 'true'\n    ) {\n        const emailMessage = formatMessage({\n            id: AnnouncementBarMessages.PREVIEW_MODE,\n            defaultMessage: 'Preview Mode: Email notifications have not been configured',\n        });\n\n        return (\n            <TextDismissableBar\n                allowDismissal={true}\n                text={emailMessage}\n                type={AnnouncementBarTypes.SUCCESS}\n            />\n        );\n    }\n\n    if (props.canViewSystemErrors && props.config?.SiteURL === '') {\n        let id;\n        let defaultMessage;\n        if (props.config?.EnableSignUpWithGitLab === 'true') {\n            id = t('announcement_bar.error.site_url_gitlab.full');\n            defaultMessage = 'Please configure your [site URL](https://docs.mattermost.com/administration/config-settings.html#site-url) either on the [System Console](/admin_console/environment/web_server) or, if you\\'re using GitLab Mattermost, in gitlab.rb.';\n        } else {\n            id = t('announcement_bar.error.site_url.full');\n            defaultMessage = 'Please configure your [site URL](https://docs.mattermost.com/administration/config-settings.html#site-url) on the [System Console](/admin_console/environment/web_server).';\n        }\n\n        const values = {siteURL: props.siteURL};\n        const siteURLMessage = formatMessage({id, defaultMessage}, values);\n\n        return (\n            <TextDismissableBar\n                allowDismissal={true}\n                text={siteURLMessage}\n                type={AnnouncementBarTypes.ANNOUNCEMENT}\n            />\n        );\n    }\n\n    return null;\n};\n\nexport default injectIntl(ConfigurationAnnouncementBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {GlobalState} from 'types/store';\n\nimport {AnnouncementBarMessages} from 'utils/constants';\nimport {dismissNotice} from 'actions/views/notice';\nimport {getSiteURL} from 'utils/url';\n\nimport ConfigurationBar from './configuration_bar';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        siteURL: getSiteURL(),\n        dismissedExpiringTrialLicense: Boolean(state.views.notice.hasBeenDismissed[AnnouncementBarMessages.TRIAL_LICENSE_EXPIRING]),\n        dismissedExpiringLicense: Boolean(state.views.notice.hasBeenDismissed[AnnouncementBarMessages.LICENSE_EXPIRING]),\n        dismissedNumberOfActiveUsersWarnMetricStatus: Boolean(state.views.notice.hasBeenDismissed[AnnouncementBarMessages.WARN_METRIC_STATUS_NUMBER_OF_USERS]),\n        dismissedNumberOfActiveUsersWarnMetricStatusAck: Boolean(state.views.notice.hasBeenDismissed[AnnouncementBarMessages.WARN_METRIC_STATUS_NUMBER_OF_USERS_ACK]),\n        dismissedNumberOfPostsWarnMetricStatus: Boolean(state.views.notice.hasBeenDismissed[AnnouncementBarMessages.WARN_METRIC_STATUS_NUMBER_OF_POSTS]),\n        dismissedNumberOfPostsWarnMetricStatusAck: Boolean(state.views.notice.hasBeenDismissed[AnnouncementBarMessages.WARN_METRIC_STATUS_NUMBER_OF_POSTS_ACK]),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            dismissNotice,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ConfigurationBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport {equalServerVersions} from 'utils/server_version';\nimport {AnnouncementBarTypes} from 'utils/constants';\n\nimport AnnouncementBar from '../default_announcement_bar';\n\ninterface Props {\n    serverVersion: string;\n}\n\ninterface State {\n    serverVersionOnAppLoad: string;\n}\n\nexport default class VersionBar extends React.PureComponent <Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            serverVersionOnAppLoad: props.serverVersion,\n        };\n    }\n\n    static getDerivedStateFromProps(props: Props, state: State) {\n        if (!state.serverVersionOnAppLoad && props.serverVersion) {\n            return {\n                serverVersionOnAppLoad: props.serverVersion,\n            };\n        }\n\n        return null;\n    }\n\n    reloadPage = () => {\n        window.location.reload();\n    }\n\n    render() {\n        const {serverVersionOnAppLoad} = this.state;\n        const {serverVersion} = this.props;\n\n        if (!serverVersionOnAppLoad) {\n            return null;\n        }\n\n        if (!equalServerVersions(serverVersionOnAppLoad, serverVersion)) {\n            return (\n                <AnnouncementBar\n                    type={AnnouncementBarTypes.ANNOUNCEMENT}\n                    message={\n                        <React.Fragment>\n                            <FormattedMessage\n                                id='version_bar.new'\n                                defaultMessage='A new version of Mattermost is available.'\n                            />\n                            <a\n                                onClick={this.reloadPage}\n                                style={{marginLeft: '.5rem'}}\n                            >\n                                <FormattedMessage\n                                    id='version_bar.refresh'\n                                    defaultMessage='Refresh the app now'\n                                />\n                            </a>\n                            {'.'}\n                        </React.Fragment>\n                    }\n                />\n            );\n        }\n\n        return null;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport VersionBar from './version_bar';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        serverVersion: state.entities.general.serverVersion,\n    };\n}\n\nexport default connect(mapStateToProps)(VersionBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {isEmpty} from 'lodash';\n\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {Dictionary} from 'mattermost-redux/types/utilities';\nimport {AnalyticsRow} from 'mattermost-redux/types/admin';\nimport {Subscription} from 'mattermost-redux/types/cloud';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport {t} from 'utils/i18n';\nimport PurchaseModal from 'components/purchase_modal';\n\nimport {\n    Preferences,\n    CloudBanners,\n    AnnouncementBarTypes,\n    ModalIdentifiers,\n    TELEMETRY_CATEGORIES,\n} from 'utils/constants';\n\nimport AnnouncementBar from '../default_announcement_bar';\nimport withGetCloudSubscription from '../../common/hocs/cloud/with_get_cloud_subscription';\n\ntype Props = {\n    userLimit: number;\n    userIsAdmin: boolean;\n    currentUser: UserProfile;\n    preferences: PreferenceType[];\n    isCloud: boolean;\n    analytics?: Dictionary<number | AnalyticsRow[]>;\n    subscription?: Subscription;\n    actions: {\n        savePreferences: (userId: string, preferences: PreferenceType[]) => void;\n        getStandardAnalytics: () => void;\n        getCloudSubscription: () => void;\n        openModal: (modalData: { modalId: string; dialogType: any; dialogProps?: any }) => void;\n    };\n};\n\nclass UserLimitAnnouncementBar extends React.PureComponent<Props> {\n    async componentDidMount() {\n        if (isEmpty(this.props.analytics)) {\n            await this.props.actions.getStandardAnalytics();\n        }\n\n        if (!isEmpty(this.props.subscription) && !isEmpty(this.props.analytics) && this.shouldShowBanner()) {\n            if (this.isDismissable()) {\n                trackEvent(\n                    TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n                    'bannerview_user_limit_reached',\n                );\n            } else {\n                trackEvent(\n                    TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n                    'bannerview_user_limit_exceeded',\n                );\n            }\n        }\n    }\n\n    handleButtonClick = () => {\n        // Do nothing for now\n    }\n\n    handleClose = async () => {\n        trackEvent(\n            TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n            'click_close_banner_user_limit_reached',\n        );\n        await this.props.actions.savePreferences(this.props.currentUser.id, [{\n            category: Preferences.CLOUD_UPGRADE_BANNER,\n            user_id: this.props.currentUser.id,\n            name: CloudBanners.HIDE,\n            value: 'true',\n        }]);\n    }\n\n    shouldShowBanner = () => {\n        const {userLimit, analytics, userIsAdmin, isCloud, subscription} = this.props;\n\n        // Prevents banner flashes if the subscription hasn't been loaded yet\n        if (subscription === null) {\n            return false;\n        }\n\n        if (subscription?.is_paid_tier === 'true') {\n            return false;\n        }\n\n        if (!isCloud) {\n            return false;\n        }\n\n        if (!userIsAdmin) {\n            return false;\n        }\n\n        if (!userLimit || userLimit > analytics!.TOTAL_USERS || !userLimit) {\n            return false;\n        }\n\n        return true;\n    }\n\n    isDismissable = () => {\n        const {userLimit, analytics} = this.props;\n        let dismissable = true;\n\n        // If the user limit is less than the current number of users, the banner is not dismissable\n        if (userLimit < analytics!.TOTAL_USERS) {\n            dismissable = false;\n        }\n        return dismissable;\n    }\n\n    showModal = () => {\n        if (this.isDismissable()) {\n            trackEvent(\n                TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n                'click_upgrade_banner_user_limit_reached',\n            );\n        } else {\n            trackEvent(\n                TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n                'click_upgrade_banner_user_limit_exceeded',\n            );\n        }\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.CLOUD_PURCHASE,\n            dialogType: PurchaseModal,\n        });\n    }\n\n    render() {\n        const {userLimit, analytics, preferences} = this.props;\n\n        if (isEmpty(this.props.analytics)) {\n            // If the analytics aren't yet loaded, return null to avoid a flash of the banner\n            return null;\n        }\n\n        if (!this.shouldShowBanner()) {\n            return null;\n        }\n\n        // If AT user limit, and banner hidden, don't render anything\n        if (userLimit === analytics!.TOTAL_USERS &&\n            preferences.some((pref) => pref.name === CloudBanners.HIDE && pref.value === 'true')) {\n            return null;\n        }\n\n        const dismissable = this.isDismissable();\n\n        return (\n            <AnnouncementBar\n                type={dismissable ? AnnouncementBarTypes.ADVISOR : AnnouncementBarTypes.CRITICAL}\n                showCloseButton={dismissable}\n                handleClose={this.handleClose}\n                onButtonClick={this.showModal}\n                modalButtonText={t('admin.billing.subscription.upgradeMattermostCloud.upgradeButton')}\n                modalButtonDefaultText={'Upgrade Mattermost Cloud'}\n                message={dismissable ? t('upgrade.cloud_banner_reached') : t('upgrade.cloud_banner_over')}\n                showLinkAsButton={true}\n            />\n\n        );\n    }\n}\n\nexport default withGetCloudSubscription(UserLimitAnnouncementBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {getStandardAnalytics} from 'mattermost-redux/actions/admin';\nimport {makeGetCategory} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCloudSubscription} from 'mattermost-redux/actions/cloud';\n\nimport {getCurrentUser, isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {openModal} from 'actions/views/modals';\n\nimport {GlobalState} from 'types/store';\n\nimport {Preferences} from 'utils/constants';\n\nimport UserLimitAnnouncementBar from './user_limit_announcement_bar';\n\nfunction mapStateToProps(state: GlobalState) {\n    const getCategory = makeGetCategory();\n    return {\n        userLimit: parseInt(getConfig(state).ExperimentalCloudUserLimit!, 10),\n        analytics: state.entities.admin.analytics,\n        userIsAdmin: isCurrentUserSystemAdmin(state),\n        currentUser: getCurrentUser(state),\n        isCloud: getLicense(state).Cloud === 'true',\n        subscription: state.entities.cloud.subscription,\n        preferences: getCategory(state, Preferences.CLOUD_UPGRADE_BANNER),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators(\n            {\n                savePreferences,\n                getStandardAnalytics,\n                openModal,\n                getCloudSubscription,\n            },\n            dispatch,\n        ),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(UserLimitAnnouncementBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {isEmpty} from 'lodash';\n\nimport {CloudCustomer, Subscription} from 'mattermost-redux/types/cloud';\n\nimport {browserHistory} from 'utils/browser_history';\nimport {isCustomerCardExpired} from 'utils/cloud_utils';\nimport {AnnouncementBarTypes} from 'utils/constants';\nimport {t} from 'utils/i18n';\n\nimport AnnouncementBar from '../default_announcement_bar';\nimport withGetCloudSubscription from '../../common/hocs/cloud/with_get_cloud_subscription';\n\ntype Props = {\n    userIsAdmin: boolean;\n    isCloud: boolean;\n    subscription?: Subscription;\n    customer?: CloudCustomer;\n    actions: {\n        getCloudSubscription: () => void;\n        getCloudCustomer: () => void;\n    };\n};\n\nclass PaymentAnnouncementBar extends React.PureComponent<Props> {\n    async componentDidMount() {\n        if (isEmpty(this.props.customer)) {\n            await this.props.actions.getCloudCustomer();\n        }\n    }\n\n    isMostRecentPaymentFailed = () => {\n        return this.props.subscription?.last_invoice?.status === 'failed';\n    }\n\n    shouldShowBanner = () => {\n        const {userIsAdmin, isCloud, subscription} = this.props;\n\n        // Prevents banner flashes if the subscription hasn't been loaded yet\n        if (subscription === null) {\n            return false;\n        }\n\n        if (subscription?.is_paid_tier !== 'true') {\n            return false;\n        }\n\n        if (!isCloud) {\n            return false;\n        }\n\n        if (!userIsAdmin) {\n            return false;\n        }\n\n        if (!isCustomerCardExpired(this.props.customer) && !this.isMostRecentPaymentFailed()) {\n            return false;\n        }\n\n        return true;\n    }\n\n    updatePaymentInfo = () => {\n        browserHistory.push('/admin_console/billing/payment_info');\n    }\n\n    render() {\n        if (isEmpty(this.props.customer) || isEmpty(this.props.subscription)) {\n            return null;\n        }\n\n        if (!this.shouldShowBanner()) {\n            return null;\n        }\n\n        return (\n            <AnnouncementBar\n                type={AnnouncementBarTypes.CRITICAL}\n                showCloseButton={false}\n                onButtonClick={this.updatePaymentInfo}\n                modalButtonText={t('admin.billing.subscription.updatePaymentInfo')}\n                modalButtonDefaultText={'Update payment info'}\n                message={this.isMostRecentPaymentFailed() ? t('admin.billing.subscription.mostRecentPaymentFailed') : t('admin.billing.subscription.creditCardExpired')}\n                showLinkAsButton={true}\n                isTallBanner={true}\n            />\n\n        );\n    }\n}\n\nexport default withGetCloudSubscription(PaymentAnnouncementBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {getStandardAnalytics} from 'mattermost-redux/actions/admin';\nimport {getCloudSubscription, getCloudCustomer} from 'mattermost-redux/actions/cloud';\n\nimport {isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {openModal} from 'actions/views/modals';\n\nimport {GlobalState} from 'types/store';\n\nimport PaymentAnnouncementBar from './payment_announcement_bar';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        userIsAdmin: isCurrentUserSystemAdmin(state),\n        isCloud: getLicense(state).Cloud === 'true',\n        subscription: state.entities.cloud.subscription,\n        customer: state.entities.cloud.customer,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators(\n            {\n                savePreferences,\n                getStandardAnalytics,\n                openModal,\n                getCloudSubscription,\n                getCloudCustomer,\n            },\n            dispatch,\n        ),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PaymentAnnouncementBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {isEmpty} from 'lodash';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {Dictionary} from 'mattermost-redux/types/utilities';\nimport {AnalyticsRow} from 'mattermost-redux/types/admin';\nimport {Subscription} from 'mattermost-redux/types/cloud';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport {t} from 'utils/i18n';\nimport PurchaseModal from 'components/purchase_modal';\n\nimport {\n    Preferences,\n    CloudBanners,\n    AnnouncementBarTypes,\n    ModalIdentifiers,\n    TELEMETRY_CATEGORIES,\n    TrialPeriodDays,\n} from 'utils/constants';\n\nimport AnnouncementBar from '../default_announcement_bar';\nimport withGetCloudSubscription from '../../common/hocs/cloud/with_get_cloud_subscription';\nimport {getLocaleDateFromUTC} from 'utils/utils';\n\ntype Props = {\n    userIsAdmin: boolean;\n    isFreeTrial: boolean;\n    currentUser: UserProfile;\n    preferences: PreferenceType[];\n    daysLeftOnTrial: number;\n    isCloud: boolean;\n    analytics?: Dictionary<number | AnalyticsRow[]>;\n    subscription?: Subscription;\n    actions: {\n        savePreferences: (userId: string, preferences: PreferenceType[]) => void;\n        getStandardAnalytics: () => void;\n        getCloudSubscription: () => void;\n        openModal: (modalData: { modalId: string; dialogType: any; dialogProps?: any }) => void;\n    };\n};\n\nclass CloudTrialAnnouncementBar extends React.PureComponent<Props> {\n    async componentDidMount() {\n        if (isEmpty(this.props.analytics)) {\n            await this.props.actions.getStandardAnalytics();\n        }\n\n        if (!isEmpty(this.props.subscription) && !isEmpty(this.props.analytics) && this.shouldShowBanner()) {\n            const {daysLeftOnTrial} = this.props;\n            if (this.isDismissable()) {\n                trackEvent(\n                    TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n                    `bannerview_trial_${daysLeftOnTrial}_days`,\n                );\n            } else {\n                trackEvent(\n                    TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n                    'bannerview_trial_limit_ended',\n                );\n            }\n        }\n    }\n\n    handleClose = async () => {\n        const {daysLeftOnTrial} = this.props;\n        let dismissValue = '';\n        if (daysLeftOnTrial > TrialPeriodDays.TRIAL_WARNING_THRESHOLD) {\n            dismissValue = '14_days_banner';\n        } else if (daysLeftOnTrial <= TrialPeriodDays.TRIAL_WARNING_THRESHOLD && daysLeftOnTrial >= TrialPeriodDays.TRIAL_1_DAY) {\n            dismissValue = '3_days_banner';\n        }\n        trackEvent(\n            TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n            `dismissed_banner_trial_${daysLeftOnTrial}_days`,\n        );\n        await this.props.actions.savePreferences(this.props.currentUser.id, [{\n            category: Preferences.CLOUD_TRIAL_BANNER,\n            user_id: this.props.currentUser.id,\n            name: CloudBanners.TRIAL,\n            value: `${dismissValue}`,\n        }]);\n    }\n\n    shouldShowBanner = () => {\n        const {isFreeTrial, userIsAdmin, isCloud} = this.props;\n        return isFreeTrial && userIsAdmin && isCloud;\n    }\n\n    isDismissable = () => {\n        const {daysLeftOnTrial} = this.props;\n        let dismissable = true;\n\n        if (daysLeftOnTrial <= TrialPeriodDays.TRIAL_1_DAY) {\n            dismissable = false;\n        }\n        return dismissable;\n    }\n\n    showModal = () => {\n        const {daysLeftOnTrial} = this.props;\n        if (this.isDismissable()) {\n            trackEvent(\n                TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n                `click_subscribe_from_trial_banner_${daysLeftOnTrial}_days`,\n            );\n        } else {\n            trackEvent(\n                TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n                'click_subscribe_from_banner_trial_ended',\n            );\n        }\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.CLOUD_PURCHASE,\n            dialogType: PurchaseModal,\n        });\n    }\n\n    render() {\n        const {daysLeftOnTrial, preferences} = this.props;\n\n        if (isEmpty(this.props.analytics)) {\n            // If the analytics aren't yet loaded, return null to avoid a flash of the banner\n            return null;\n        }\n\n        if (!this.shouldShowBanner()) {\n            return null;\n        }\n\n        if ((preferences.some((pref) => pref.name === CloudBanners.TRIAL && pref.value === '14_days_banner') && daysLeftOnTrial > TrialPeriodDays.TRIAL_WARNING_THRESHOLD) ||\n            ((daysLeftOnTrial <= TrialPeriodDays.TRIAL_WARNING_THRESHOLD && daysLeftOnTrial >= TrialPeriodDays.TRIAL_1_DAY) &&\n            preferences.some((pref) => pref.name === CloudBanners.TRIAL && pref.value === '3_days_banner'))) {\n            return null;\n        }\n\n        const trialMoreThan3DaysMsg = (\n            <FormattedMessage\n                id='admin.billing.subscription.cloudTrial.moreThan3Days'\n                defaultMessage='Your trial has started! There are {daysLeftOnTrial} days left'\n                values={{daysLeftOnTrial}}\n            />\n        );\n\n        const trialLessThan3DaysMsg = (\n            <FormattedMessage\n                id='admin.billing.subscription.cloudTrial.daysLeftOnTrial'\n                defaultMessage='There are {daysLeftOnTrial} days left on your free trial'\n                values={{daysLeftOnTrial}}\n            />\n        );\n\n        const userEndTrialDate = getLocaleDateFromUTC((this.props.subscription?.trial_end_at as number / 1000), 'MMMM Do YYYY');\n        const userEndTrialHour = getLocaleDateFromUTC((this.props.subscription?.trial_end_at as number / 1000), 'HH:mm:ss', this.props.currentUser.timezone?.automaticTimezone as string);\n\n        const trialLastDaysMsg = (\n            <FormattedMessage\n                id='admin.billing.subscription.cloudTrial.lastDay'\n                defaultMessage='This is the last day of your free trial. Your access will expire on {userEndTrialDate} at {userEndTrialHour}.'\n                values={{userEndTrialHour, userEndTrialDate}}\n            />\n        );\n\n        let bannerMessage;\n        let icon;\n        switch (daysLeftOnTrial) {\n        case TrialPeriodDays.TRIAL_WARNING_THRESHOLD:\n        case TrialPeriodDays.TRIAL_2_DAYS:\n            bannerMessage = trialLessThan3DaysMsg;\n            break;\n        case TrialPeriodDays.TRIAL_1_DAY:\n        case TrialPeriodDays.TRIAL_0_DAYS:\n            bannerMessage = trialLastDaysMsg;\n            break;\n        default:\n            bannerMessage = trialMoreThan3DaysMsg;\n            icon = <i className='icon-check-outline-circle'/>;\n            break;\n        }\n\n        const dismissable = this.isDismissable();\n\n        return (\n            <AnnouncementBar\n                type={dismissable ? AnnouncementBarTypes.ADVISOR : AnnouncementBarTypes.CRITICAL}\n                showCloseButton={dismissable}\n                handleClose={this.handleClose}\n                onButtonClick={this.showModal}\n                modalButtonText={t('admin.billing.subscription.cloudTrial.subscribeButton')}\n                modalButtonDefaultText={'Subscribe Now'}\n                message={bannerMessage}\n                showLinkAsButton={true}\n                icon={icon}\n            />\n        );\n    }\n}\n\nexport default withGetCloudSubscription(CloudTrialAnnouncementBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {getStandardAnalytics} from 'mattermost-redux/actions/admin';\nimport {makeGetCategory} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCloudSubscription} from 'mattermost-redux/actions/cloud';\n\nimport {getCurrentUser, isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {openModal} from 'actions/views/modals';\n\nimport {GlobalState} from 'types/store';\n\nimport {Preferences, TrialPeriodDays} from 'utils/constants';\n\nimport {getRemainingDaysFromFutureTimestamp} from 'utils/utils.jsx';\n\nimport CloudTrialAnnouncementBar from './cloud_trial_announcement_bar';\n\nfunction mapStateToProps(state: GlobalState) {\n    const getCategory = makeGetCategory();\n\n    const subscription = state.entities.cloud.subscription;\n    const isCloud = getLicense(state).Cloud === 'true';\n    let isFreeTrial = false;\n    let daysLeftOnTrial = 0;\n\n    if (isCloud && subscription?.is_free_trial === 'true') {\n        isFreeTrial = true;\n        daysLeftOnTrial = getRemainingDaysFromFutureTimestamp(subscription.trial_end_at);\n        if (daysLeftOnTrial > TrialPeriodDays.TRIAL_MAX_DAYS) {\n            daysLeftOnTrial = TrialPeriodDays.TRIAL_MAX_DAYS;\n        }\n    }\n\n    return {\n        isFreeTrial,\n        daysLeftOnTrial,\n        analytics: state.entities.admin.analytics,\n        userIsAdmin: isCurrentUserSystemAdmin(state),\n        currentUser: getCurrentUser(state),\n        isCloud,\n        subscription,\n        preferences: getCategory(state, Preferences.CLOUD_TRIAL_BANNER),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators(\n            {\n                savePreferences,\n                getStandardAnalytics,\n                openModal,\n                getCloudSubscription,\n            },\n            dispatch,\n        ),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CloudTrialAnnouncementBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {ClientLicense, ClientConfig, WarnMetricStatus} from 'mattermost-redux/types/config';\nimport {Dictionary} from 'mattermost-redux/types/utilities';\n\nimport ConfigurationAnnouncementBar from './configuration_bar';\nimport VersionBar from './version_bar';\nimport TextDismissableBar from './text_dismissable_bar';\nimport AnnouncementBar from './default_announcement_bar';\n\nimport CloudAnnouncementBar from './cloud_announcement_bar';\nimport PaymentAnnouncementBar from './payment_announcement_bar';\nimport CloudTrialAnnouncementBar from './cloud_trial_announcement_bar';\n\ntype Props = {\n    license?: ClientLicense;\n    config?: Partial<ClientConfig>;\n    canViewSystemErrors: boolean;\n    latestError?: {\n        error: any;\n    };\n    warnMetricsStatus?: Dictionary<WarnMetricStatus>;\n    actions: {\n        dismissError: (index: number) => void;\n    };\n}\n\nexport default class AnnouncementBarController extends React.PureComponent<Props> {\n    render() {\n        let adminConfiguredAnnouncementBar = null;\n        if (this.props.config?.EnableBanner === 'true' && this.props.config.BannerText?.trim()) {\n            adminConfiguredAnnouncementBar = (\n                <TextDismissableBar\n                    color={this.props.config.BannerColor}\n                    textColor={this.props.config.BannerTextColor}\n                    allowDismissal={this.props.config.AllowBannerDismissal === 'true'}\n                    text={this.props.config.BannerText}\n                />\n            );\n        }\n\n        let errorBar = null;\n        if (this.props.latestError) {\n            errorBar = (\n                <AnnouncementBar\n                    type={this.props.latestError.error.type}\n                    message={this.props.latestError.error.message}\n                    showCloseButton={true}\n                    handleClose={this.props.actions.dismissError}\n                />\n            );\n        }\n        let cloudAnnouncementBar = null;\n        let paymentAnnouncementBar = null;\n        let cloudTrialAnnouncementBar = null;\n        if (this.props.license?.Cloud === 'true') {\n            cloudAnnouncementBar = (\n                <CloudAnnouncementBar/>\n            );\n            paymentAnnouncementBar = (\n                <PaymentAnnouncementBar/>\n            );\n            cloudTrialAnnouncementBar = (\n                <CloudTrialAnnouncementBar/>\n            );\n        }\n\n        return (\n            <>\n                {adminConfiguredAnnouncementBar}\n                {errorBar}\n                {cloudAnnouncementBar}\n                {paymentAnnouncementBar}\n                {cloudTrialAnnouncementBar}\n                <VersionBar/>\n                <ConfigurationAnnouncementBar\n                    config={this.props.config}\n                    license={this.props.license}\n                    canViewSystemErrors={this.props.canViewSystemErrors}\n                    warnMetricsStatus={this.props.warnMetricsStatus}\n                />\n            </>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {Permissions} from 'mattermost-redux/constants';\nimport {haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getConfig, getLicense, warnMetricsStatus as getWarnMetricsStatus} from 'mattermost-redux/selectors/entities/general';\nimport {getDisplayableErrors} from 'mattermost-redux/selectors/errors';\nimport {dismissError} from 'mattermost-redux/actions/errors';\nimport {getStandardAnalytics} from 'mattermost-redux/actions/admin';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {dismissNotice} from 'actions/views/notice';\nimport {GlobalState} from 'types/store';\n\nimport AnnouncementBarController from './announcement_bar_controller';\n\nfunction mapStateToProps(state: GlobalState) {\n    const canViewSystemErrors = haveISystemPermission(state, {permission: Permissions.MANAGE_SYSTEM});\n    const license = getLicense(state);\n    const config = getConfig(state);\n    const errors = getDisplayableErrors(state);\n    const warnMetricsStatus = getWarnMetricsStatus(state);\n\n    let latestError = null;\n    if (errors && errors.length >= 1) {\n        latestError = errors[0];\n    }\n\n    return {\n        license,\n        config,\n        canViewSystemErrors,\n        latestError,\n        warnMetricsStatus,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    const dismissFirstError = dismissError.bind(null, 0);\n    return {\n        actions: bindActionCreators({\n            getStandardAnalytics,\n            dismissError: dismissFirstError,\n            dismissNotice,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AnnouncementBarController);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nexport function getDisplayableErrors(state: GlobalState) {\n    return state.errors.filter((error) => error.displayable);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\n\nconst NoInternetConnectionSvg: React.FC = () => {\n    return (\n        <svg\n            width='311'\n            height='216'\n            viewBox='0 0 311 216'\n            fill='none'\n            xmlns='http://www.w3.org/2000/svg'\n        >\n            <g clipPath='url(#clip0)'>\n                <path\n                    d='M61.9647 216C96.1868 216 123.929 213.897 123.929 211.302C123.929 208.707 96.1868 206.604 61.9647 206.604C27.7425 206.604 0 208.707 0 211.302C0 213.897 27.7425 216 61.9647 216Z'\n                    fill='#3D3C40'\n                    fillOpacity='0.08'\n                />\n                <path\n                    d='M47.3647 47.9266C58.1484 43.348 71.5797 46.2489 84.6968 48.2623C84.8189 45.8241 86.2984 42.8567 84.7486 41.1556C82.8656 39.089 83.039 36.9175 84.172 34.7336C87.0694 29.1489 82.9183 23.2065 78.7269 18.2655C77.7822 17.1543 76.5882 16.2813 75.242 15.7172C73.8958 15.1532 72.4353 14.9141 70.9792 15.0193L63.2149 15.5729C61.3256 15.7076 59.5225 16.4151 58.047 17.6008C56.5715 18.7864 55.4939 20.3936 54.9584 22.2072C53.1044 24.7242 52.1122 27.2343 52.7369 29.7312C49.96 31.6256 49.4934 33.9123 50.7413 36.4901C51.7994 38.1132 51.7881 39.6932 50.6931 41.2294C49.2551 43.188 48.1537 45.3718 47.4341 47.6915L47.3647 47.9266Z'\n                    fill='#152235'\n                />\n                <path\n                    d='M303.63 186.728H83.8449C81.8904 186.728 80.0159 185.953 78.6339 184.574C77.2518 183.194 76.4754 181.323 76.4754 179.372C156.148 170.129 234.322 170.129 311 179.372C311 181.323 310.224 183.194 308.842 184.574C307.459 185.953 305.585 186.728 303.63 186.728Z'\n                    fill='#0D1521'\n                />\n                <path\n                    d='M311 179.805L76.4754 179.372L103.656 133.718L103.786 133.501V32.8841C103.786 31.6628 104.027 30.4535 104.495 29.3252C104.963 28.1968 105.649 27.1716 106.514 26.308C107.379 25.4445 108.406 24.7595 109.537 24.2922C110.667 23.8248 111.879 23.5844 113.102 23.5845H273.073C274.296 23.5844 275.508 23.8248 276.638 24.2922C277.768 24.7595 278.795 25.4445 279.66 26.308C280.526 27.1716 281.212 28.1968 281.68 29.3252C282.148 30.4535 282.389 31.6628 282.389 32.8841V134.194L311 179.805Z'\n                    fill='#152235'\n                />\n                <path\n                    d='M112.89 30.0757C112.085 30.0766 111.314 30.396 110.745 30.9639C110.176 31.5318 109.856 32.3018 109.855 33.1049V124.846C109.856 125.649 110.176 126.419 110.745 126.987C111.314 127.555 112.085 127.875 112.89 127.876H274.586C275.39 127.875 276.162 127.555 276.73 126.987C277.299 126.419 277.619 125.649 277.62 124.846V33.1049C277.619 32.3018 277.299 31.5318 276.731 30.964C276.162 30.3961 275.39 30.0766 274.586 30.0757H112.89Z'\n                    fill='white'\n                />\n                <path\n                    d='M113.567 139.992C113.318 139.993 113.075 140.064 112.866 140.198C112.657 140.332 112.49 140.523 112.386 140.748L104.01 158.923C103.919 159.121 103.879 159.338 103.894 159.555C103.91 159.773 103.979 159.983 104.097 160.166C104.214 160.349 104.376 160.5 104.568 160.605C104.759 160.709 104.974 160.764 105.192 160.764H281.317C281.539 160.764 281.757 160.707 281.951 160.6C282.144 160.492 282.307 160.336 282.424 160.148C282.54 159.96 282.606 159.745 282.616 159.524C282.626 159.303 282.579 159.083 282.48 158.885L273.377 140.71C273.269 140.494 273.103 140.312 272.898 140.185C272.692 140.058 272.455 139.991 272.214 139.992H113.567Z'\n                    fill='#0D1521'\n                />\n                <path\n                    d='M193.087 28.5612C194.165 28.5612 195.038 27.6893 195.038 26.6138C195.038 25.5384 194.165 24.6665 193.087 24.6665C192.01 24.6665 191.137 25.5384 191.137 26.6138C191.137 27.6893 192.01 28.5612 193.087 28.5612Z'\n                    fill='white'\n                />\n                <path\n                    d='M175.776 164.226C175.49 164.226 175.212 164.321 174.985 164.494C174.758 164.668 174.595 164.911 174.52 165.187L172.419 172.976C172.367 173.168 172.36 173.37 172.399 173.566C172.438 173.761 172.521 173.945 172.643 174.103C172.764 174.261 172.92 174.39 173.099 174.478C173.278 174.566 173.475 174.612 173.675 174.612H213.628C213.835 174.612 214.04 174.562 214.224 174.468C214.408 174.373 214.567 174.235 214.687 174.067C214.808 173.898 214.886 173.703 214.915 173.498C214.945 173.293 214.924 173.085 214.857 172.889L212.156 165.1C212.067 164.845 211.901 164.623 211.681 164.467C211.461 164.31 211.197 164.226 210.927 164.226H175.776Z'\n                    fill='#0D1521'\n                />\n                <path\n                    d='M282.389 131.987V133.718H103.656L103.79 133.502V131.987H282.389Z'\n                    fill='#0D1521'\n                />\n                <path\n                    d='M277.404 60.584C294.163 60.584 307.749 47.0218 307.749 30.292C307.749 13.5622 294.163 0 277.404 0C260.644 0 247.058 13.5622 247.058 30.292C247.058 47.0218 260.644 60.584 277.404 60.584Z'\n                    fill='#0058CC'\n                />\n                <path\n                    d='M289.975 43.4908H264.832C264.372 43.4903 263.931 43.3078 263.606 42.9833C263.281 42.6587 263.098 42.2187 263.098 41.7598V26.6138C263.099 26.1548 263.281 25.7149 263.606 25.3903C263.932 25.0658 264.372 24.8833 264.832 24.8828H289.975C290.435 24.8833 290.876 25.0658 291.201 25.3903C291.526 25.7149 291.709 26.1548 291.709 26.6138V41.7598C291.709 42.2187 291.526 42.6587 291.201 42.9833C290.876 43.3078 290.435 43.4903 289.975 43.4908ZM264.832 26.6138V41.7598H289.976L289.975 26.6138L264.832 26.6138Z'\n                    fill='white'\n                />\n                <path\n                    d='M285.207 26.6134H269.601V19.6895C269.601 14.6745 272.882 11.0347 277.404 11.0347C281.925 11.0347 285.207 14.6745 285.207 19.6895L285.207 26.6134ZM271.335 24.8824H283.473V19.6895C283.473 15.6129 280.977 12.7656 277.404 12.7656C273.83 12.7656 271.335 15.6129 271.335 19.6895L271.335 24.8824Z'\n                    fill='white'\n                />\n                <path\n                    d='M277.404 35.4849C278.361 35.4849 279.138 34.7099 279.138 33.7539C279.138 32.7979 278.361 32.0229 277.404 32.0229C276.446 32.0229 275.67 32.7979 275.67 33.7539C275.67 34.7099 276.446 35.4849 277.404 35.4849Z'\n                    fill='white'\n                />\n                <path\n                    d='M256.22 96.7577H131.255C130.642 96.757 130.054 96.5133 129.62 96.0803C129.186 95.6472 128.942 95.06 128.941 94.4476V63.5035C128.942 62.891 129.186 62.3038 129.62 61.8708C130.054 61.4377 130.642 61.1941 131.255 61.1934H256.22C256.834 61.1941 257.422 61.4377 257.856 61.8708C258.289 62.3038 258.534 62.891 258.534 63.5035V94.4476C258.534 95.06 258.289 95.6472 257.856 96.0803C257.422 96.5133 256.834 96.757 256.22 96.7577ZM131.255 62.1174C130.887 62.1178 130.534 62.264 130.274 62.5238C130.014 62.7837 129.867 63.136 129.867 63.5035V94.4476C129.867 94.8151 130.014 95.1674 130.274 95.4272C130.534 95.6871 130.887 95.8332 131.255 95.8336H256.22C256.588 95.8332 256.941 95.6871 257.201 95.4272C257.462 95.1674 257.608 94.8151 257.609 94.4476V63.5035C257.608 63.136 257.462 62.7837 257.201 62.5238C256.941 62.264 256.588 62.1178 256.22 62.1174L131.255 62.1174Z'\n                    fill='#3D3C40'\n                    fillOpacity='0.16'\n                />\n                <path\n                    d='M150.672 87.1982C155.878 87.1982 160.099 82.9851 160.099 77.7881C160.099 72.591 155.878 68.3779 150.672 68.3779C145.466 68.3779 141.246 72.591 141.246 77.7881C141.246 82.9851 145.466 87.1982 150.672 87.1982Z'\n                    fill='#3D3C40'\n                    fillOpacity='0.16'\n                />\n                <path\n                    d='M172.443 71.5147C172.237 71.5143 172.032 71.5546 171.841 71.6333C171.65 71.712 171.477 71.8275 171.331 71.9731C171.185 72.1188 171.069 72.2918 170.99 72.4822C170.91 72.6727 170.87 72.8768 170.87 73.083C170.87 73.2892 170.91 73.4933 170.99 73.6838C171.069 73.8742 171.185 74.0472 171.331 74.1929C171.477 74.3385 171.65 74.454 171.841 74.5327C172.032 74.6113 172.237 74.6517 172.443 74.6514H246.51C246.927 74.6514 247.326 74.4861 247.621 74.192C247.915 73.8979 248.081 73.499 248.081 73.083C248.081 72.667 247.915 72.2681 247.621 71.974C247.326 71.6799 246.927 71.5147 246.51 71.5147H172.443Z'\n                    fill='#3D3C40'\n                    fillOpacity='0.16'\n                />\n                <path\n                    d='M172.443 80.9248C172.027 80.9248 171.627 81.09 171.332 81.3842C171.038 81.6783 170.872 82.0772 170.872 82.4932C170.872 82.9091 171.038 83.308 171.332 83.6022C171.627 83.8963 172.027 84.0615 172.443 84.0615H204.314C204.731 84.0615 205.131 83.8963 205.425 83.6022C205.72 83.308 205.886 82.9091 205.886 82.4932C205.886 82.0772 205.72 81.6783 205.425 81.3842C205.131 81.09 204.731 80.9248 204.314 80.9248H172.443Z'\n                    fill='#3D3C40'\n                    fillOpacity='0.16'\n                />\n                <path\n                    d='M103.348 81.5594L80.2478 93.8193L79.9554 83.6027C87.4953 82.3462 94.6687 80.1586 101.302 76.5971L103.718 70.6385C103.981 69.9892 104.409 69.4194 104.959 68.9851C105.51 68.5508 106.164 68.2668 106.858 68.161C107.551 68.0553 108.26 68.1314 108.916 68.382C109.571 68.6325 110.15 69.0489 110.595 69.5901C111.247 70.382 111.572 71.3916 111.506 72.4143C111.44 73.437 110.987 74.3963 110.239 75.098L103.348 81.5594Z'\n                    fill='#A1616A'\n                />\n                <path\n                    d='M46.9042 152.343C46.7357 151.726 46.6999 151.081 46.7992 150.449C46.8985 149.817 47.1307 149.214 47.4804 148.678L52.555 140.904C53.7552 139.065 55.5969 137.737 57.7227 137.177C59.8485 136.617 62.1069 136.865 64.0596 137.874C61.9269 141.497 62.2243 144.677 64.7962 147.439C60.8036 149.385 57.1134 151.896 53.8402 154.895C53.2426 155.302 52.5563 155.56 51.8385 155.648C51.1208 155.737 50.3922 155.653 49.7136 155.403C49.035 155.153 48.426 154.745 47.9374 154.213C47.4487 153.681 47.0944 153.04 46.9042 152.343Z'\n                    fill='#2F2E41'\n                />\n                <path\n                    d='M104.401 142.178C103.633 143.456 102.549 144.515 101.253 145.254C99.9568 145.993 98.4923 146.387 96.9998 146.398L63.2878 146.653L61.8257 138.188L76.7388 133.809L64.165 124.177L77.9084 108.122L102.871 131.347C104.33 132.705 105.278 134.521 105.556 136.492C105.835 138.464 105.427 140.471 104.401 142.178Z'\n                    fill='#152235'\n                />\n                <path\n                    d='M58.0243 200.072H50.1291C43.0404 151.566 35.8248 102.925 57.1471 84.7705L82.2946 88.8571L79.0781 110.166L65.0422 126.221L58.0243 200.072Z'\n                    fill='#152235'\n                />\n                <path\n                    d='M64.9645 211.06C64.3465 211.228 63.6997 211.264 63.0668 211.165C62.4339 211.065 61.8292 210.834 61.2925 210.485L52.72 209.334C50.8779 208.136 49.5473 206.298 48.9863 204.176C48.4254 202.054 48.674 199.799 49.6841 197.85C53.3144 199.979 56.499 199.682 59.2665 197.114C61.2219 201.056 64.4436 200.815 67.5205 204.136C67.9279 204.732 68.1867 205.417 68.2752 206.134C68.3637 206.85 68.2794 207.578 68.0293 208.255C67.7792 208.932 67.3706 209.54 66.8375 210.028C66.3044 210.516 65.6623 210.87 64.9645 211.06Z'\n                    fill='#0058CC'\n                />\n                <path\n                    d='M76.7388 52.3693L62.1181 48.8664C64.5464 43.9047 64.7463 38.3837 63.5802 32.5199L73.5222 32.228C73.8337 39.5198 74.7762 46.3321 76.7388 52.3693Z'\n                    fill='#965962'\n                />\n                <path\n                    d='M80.7571 97.646C70.1137 104.886 62.5935 97.8937 56.8546 87.1056C57.6521 80.5043 56.3609 72.6044 53.9695 64.0206C52.9059 60.2345 53.303 56.188 55.0823 52.6799C56.8616 49.1718 59.8937 46.4571 63.5802 45.0718L76.154 50.326C86.8306 59.0134 88.932 68.4237 84.9264 78.3486L80.7571 97.646Z'\n                    fill='#0058CC'\n                />\n                <path\n                    d='M50.1291 59.6667L38.4326 65.7966L59.194 78.0565L62.0828 85.1698C62.2756 85.6445 62.3695 86.1535 62.3588 86.6657C62.3482 87.1779 62.2331 87.6826 62.0206 88.1489C61.8082 88.6153 61.5028 89.0336 61.1232 89.3783C60.7435 89.7229 60.2975 89.9868 59.8123 90.1538C59.2608 90.3437 58.6728 90.4035 58.0943 90.3286C57.5157 90.2537 56.9624 90.0461 56.4777 89.7221C55.9929 89.3982 55.5899 88.9665 55.3001 88.4611C55.0104 87.9556 54.8417 87.3901 54.8075 86.8088L54.5154 81.8512L28.1279 73.1586C27.2388 72.8657 26.4282 72.3747 25.7574 71.7228C25.0865 71.0709 24.5731 70.2751 24.256 69.3958C23.7938 68.114 23.7702 66.7154 24.1891 65.4189C24.608 64.1224 25.4456 63.0011 26.5709 62.2304L47.7898 47.6987L50.1291 59.6667Z'\n                    fill='#A1616A'\n                />\n                <path\n                    d='M61.8257 60.8345C56.9475 58.7004 52.5117 61.0186 46.9126 62.8778L46.0354 47.407C51.595 44.449 56.8957 43.6514 61.8257 45.9475L61.8257 60.8345Z'\n                    fill='#0058CC'\n                />\n                <path\n                    d='M67.6611 39.8912C72.8166 39.8912 76.9959 35.7192 76.9959 30.5728C76.9959 25.4264 72.8166 21.2544 67.6611 21.2544C62.5057 21.2544 58.3264 25.4264 58.3264 30.5728C58.3264 35.7192 62.5057 39.8912 67.6611 39.8912Z'\n                    fill='#A1616A'\n                />\n                <path\n                    d='M78.8285 29.3971C69.5863 30.3007 62.5438 28.7918 58.0429 24.4956V21.0356H78.0441L78.8285 29.3971Z'\n                    fill='#152235'\n                />\n            </g>\n            <defs>\n                <clipPath id='clip0'>\n                    <rect\n                        width='311'\n                        height='216'\n                        fill='white'\n                    />\n                </clipPath>\n            </defs>\n        </svg>\n    );\n};\n\nexport default NoInternetConnectionSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\n\nimport GenericModal from 'components/generic_modal';\n\nimport './no_internet_connection.scss';\nimport NoInternetConnectionSvg from './no-internet-connection-svg';\n\ntype NoInternetConnectionProps = {\n    onHide: () => void;\n};\nconst NoInternetConnection: React.FC<NoInternetConnectionProps> = (props: NoInternetConnectionProps) => {\n    return (\n        <GenericModal\n            onHide={props.onHide}\n            modalHeaderText=''\n        >\n            <div className='noInternetConnection__container'>\n                <div className='noInternetConnection__image'>\n                    <NoInternetConnectionSvg/>\n                </div>\n                <span className='noInternetConnection__noAccessToInternet'>\n                    <FormattedMessage\n                        id='announcement_bar.warn.no_internet_connection'\n                        defaultMessage='Looks like you do not have access to the internet.'\n                    />\n                </span>\n                <span className='noInternetConnection__contactSupport'>\n                    <FormattedMessage\n                        id='announcement_bar.warn.contact_support_text'\n                        defaultMessage='To renew your license, contact support at support@mattermost.com.'\n                    />\n                </span>\n                <span className='noInternetConnection__emailUs'>\n                    <FormattedMarkdownMessage\n                        id='announcement_bar.warn.email_support'\n                        defaultMessage='[Contact support](!{email}).'\n                        values={{email: 'mailto:support@mattermost.com'}}\n                    />\n                </span>\n            </div>\n        </GenericModal>\n    );\n};\n\nexport default NoInternetConnection;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {\n    ModalIdentifiers,\n} from 'utils/constants';\n\nimport NoInternetConnection from '../no_internet_connection/no_internet_connection';\nimport './renew_link.scss';\n\nexport interface RenewalLinkProps {\n    telemetryInfo?: {success: string; error: string};\n    actions: {\n        openModal: (modalData: { modalId: string; dialogType: any; dialogProps?: any }) => void;\n    };\n    isDisabled?: boolean;\n}\n\nconst RenewalLink: React.FC<RenewalLinkProps> = (props: RenewalLinkProps) => {\n    const [renewalLink, setRenewalLink] = useState('');\n    useEffect(() => {\n        Client4.getRenewalLink().then(({renewal_link: renewalLinkParam}) => {\n            try {\n                if (renewalLinkParam && (/^http[s]?:\\/\\//).test(renewalLinkParam)) {\n                    setRenewalLink(renewalLinkParam);\n                }\n            } catch (error) {\n                console.error('No link returned', error); // eslint-disable-line no-console\n            }\n        });\n    }, []);\n\n    const handleLinkClick = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n        e.preventDefault();\n        try {\n            const {status} = await Client4.ping();\n            if (status === 'OK' && renewalLink !== '') {\n                if (props.telemetryInfo?.success) {\n                    trackEvent('renew_license', props.telemetryInfo.success);\n                }\n                window.open(renewalLink, '_blank');\n            } else {\n                showConnectionErrorModal();\n            }\n        } catch (error) {\n            showConnectionErrorModal();\n        }\n    };\n\n    const showConnectionErrorModal = () => {\n        if (props.telemetryInfo?.error) {\n            trackEvent('renew_license', props.telemetryInfo.error);\n        }\n        props.actions.openModal({\n            modalId: ModalIdentifiers.NO_INTERNET_CONNECTION,\n            dialogType: NoInternetConnection,\n        });\n    };\n\n    return (\n        <>\n            <button\n                className='btn btn-primary annnouncementBar__renewLicense'\n                disabled={props.isDisabled}\n                onClick={(e) => handleLinkClick(e)}\n            >\n                <FormattedMessage\n                    id='announcement_bar.warn.renew_license_now'\n                    defaultMessage='Renew license now'\n                />\n            </button>\n        </>\n    );\n};\n\nexport default RenewalLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {openModal} from 'actions/views/modals';\n\nimport RenewalLink from './renewal_link';\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators(\n            {\n                openModal,\n            },\n            dispatch,\n        ),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(RenewalLink);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Overlay} from 'react-bootstrap';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {displayUsername} from 'mattermost-redux/utils/user_utils';\nimport {NameMappedObjects, UsernameMappedObjects} from 'mattermost-redux/types/utilities';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {Group} from 'mattermost-redux/types/groups';\n\nimport ProfilePopover from 'components/profile_popover';\n\nimport {popOverOverlayPosition} from 'utils/position_utils';\n\nconst spaceRequiredForPopOver = 300;\n\ntype Props = {\n    currentUserId: string;\n    mentionName: string;\n    teammateNameDisplay: string;\n    usersByUsername: UsernameMappedObjects<UserProfile>;\n    groupsByName: NameMappedObjects<Group>;\n    children?: React.ReactNode;\n    channelId?: string;\n    hasMention?: boolean;\n    disableHighlight?: boolean;\n    disableGroupHighlight?: boolean;\n    isRHS?: boolean;\n}\n\ntype State = {\n    show: boolean;\n    target?: HTMLAnchorElement;\n    placement?: string;\n}\n\nexport default class AtMention extends React.PureComponent<Props, State> {\n    overlayRef: React.RefObject<HTMLAnchorElement>;\n\n    static defaultProps: Partial<Props> = {\n        isRHS: false,\n        hasMention: false,\n        disableHighlight: false,\n        disableGroupHighlight: false,\n    }\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            show: false,\n        };\n\n        this.overlayRef = React.createRef();\n    }\n\n    handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n        const targetBounds = this.overlayRef.current?.getBoundingClientRect();\n\n        if (targetBounds) {\n            const placement = popOverOverlayPosition(targetBounds, window.innerHeight, spaceRequiredForPopOver);\n            this.setState({target: e.target as HTMLAnchorElement, show: !this.state.show, placement});\n        }\n    }\n\n    hideOverlay = () => {\n        this.setState({show: false});\n    }\n\n    getUserFromMentionName() {\n        const {usersByUsername, mentionName} = this.props;\n        let mentionNameToLowerCase = mentionName.toLowerCase();\n\n        while (mentionNameToLowerCase.length > 0) {\n            if (usersByUsername.hasOwnProperty(mentionNameToLowerCase)) {\n                return usersByUsername[mentionNameToLowerCase];\n            }\n\n            // Repeatedly trim off trailing punctuation in case this is at the end of a sentence\n            if ((/[._-]$/).test(mentionNameToLowerCase)) {\n                mentionNameToLowerCase = mentionNameToLowerCase.substring(0, mentionNameToLowerCase.length - 1);\n            } else {\n                break;\n            }\n        }\n\n        return '';\n    }\n\n    getGroupFromMentionName() {\n        const {groupsByName, mentionName} = this.props;\n        const mentionNameTrimmed = mentionName.toLowerCase().replace(/[._-]*$/, '');\n        return groupsByName?.[mentionNameTrimmed] || {};\n    }\n\n    render() {\n        const user = this.getUserFromMentionName();\n\n        if (!this.props.disableGroupHighlight && !user) {\n            const group = this.getGroupFromMentionName();\n            if (group.allow_reference) {\n                return <span className='group-mention-link'>{'@' + group.name}</span>;\n            }\n        }\n\n        if (!user) {\n            return <React.Fragment>{this.props.children}</React.Fragment>;\n        }\n\n        const suffix = this.props.mentionName.substring(user.username.length);\n\n        let className = 'mention-link';\n        if (!this.props.disableHighlight && user.id === this.props.currentUserId) {\n            className += ' mention--highlight';\n        }\n\n        return (\n            <span>\n                <Overlay\n                    placement={this.state.placement}\n                    show={this.state.show}\n                    target={this.state.target}\n                    rootClose={true}\n                    onHide={this.hideOverlay}\n                >\n                    <ProfilePopover\n                        className='user-profile-popover'\n                        userId={user.id}\n                        src={Client4.getProfilePictureUrl(user.id, user.last_picture_update)}\n                        isRHS={this.props.isRHS}\n                        hasMention={this.props.hasMention}\n                        hide={this.hideOverlay}\n                        channelId={this.props.channelId}\n                    />\n                </Overlay>\n                <a\n                    className={className}\n                    onClick={this.handleClick}\n                    ref={this.overlayRef}\n                >\n                    {'@' + displayUsername(user, this.props.teammateNameDisplay)}\n                </a>\n                {suffix}\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getTeammateNameDisplaySetting} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId, getUsersByUsername} from 'mattermost-redux/selectors/entities/users';\nimport {getAllGroupsForReferenceByName} from 'mattermost-redux/selectors/entities/groups';\n\nimport {GlobalState} from 'types/store';\n\nimport AtMention from './at_mention';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        currentUserId: getCurrentUserId(state),\n        teammateNameDisplay: getTeammateNameDisplaySetting(state),\n        usersByUsername: getUsersByUsername(state),\n        groupsByName: getAllGroupsForReferenceByName(state),\n    };\n}\n\nexport default connect(mapStateToProps)(AtMention);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport SuggestionBox from 'components/suggestion/suggestion_box.jsx';\nimport SuggestionList from 'components/suggestion/suggestion_list';\n\nexport default class AutocompleteSelector extends React.PureComponent {\n    static propTypes = {\n        providers: PropTypes.array.isRequired,\n        value: PropTypes.string.isRequired,\n        onSelected: PropTypes.func,\n        label: PropTypes.node,\n        labelClassName: PropTypes.string,\n        inputClassName: PropTypes.string,\n        helpText: PropTypes.node,\n        placeholder: PropTypes.string,\n        footer: PropTypes.node,\n        disabled: PropTypes.bool,\n        toggleFocus: PropTypes.func,\n        listComponent: PropTypes.elementType,\n        listPosition: PropTypes.string,\n    };\n\n    static defaultProps = {\n        value: '',\n        id: '',\n        labelClassName: '',\n        inputClassName: '',\n        listComponent: SuggestionList,\n        listPosition: 'top',\n    };\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            input: '',\n        };\n    }\n\n    onChange = (e) => {\n        if (!e || !e.target) {\n            return;\n        }\n\n        this.setState({input: e.target.value});\n    }\n\n    handleSelected = (selected) => {\n        this.setState({input: ''});\n\n        if (this.props.onSelected) {\n            this.props.onSelected(selected);\n        }\n\n        requestAnimationFrame(() => {\n            if (this.suggestionRef) {\n                this.suggestionRef.blur();\n            }\n        });\n    }\n\n    setSuggestionRef = (ref) => {\n        this.suggestionRef = ref;\n    }\n\n    onFocus = () => {\n        this.setState({focused: true});\n\n        if (this.props.toggleFocus) {\n            this.props.toggleFocus(true);\n        }\n    }\n\n    onBlur = () => {\n        this.setState({focused: false});\n\n        if (this.props.toggleFocus) {\n            this.props.toggleFocus(false);\n        }\n    }\n\n    render() {\n        const {\n            providers,\n            placeholder,\n            footer,\n            label,\n            labelClassName,\n            helpText,\n            inputClassName,\n            value,\n            disabled,\n            listComponent,\n            listPosition,\n        } = this.props;\n\n        const {focused} = this.state;\n        let {input} = this.state;\n\n        if (!focused) {\n            input = value;\n        }\n\n        let labelContent;\n        if (label) {\n            labelContent = (\n                <label\n                    className={'control-label ' + labelClassName}\n                >\n                    {label}\n                </label>\n            );\n        }\n\n        let helpTextContent;\n        if (helpText) {\n            helpTextContent = (\n                <div className='help-text'>\n                    {helpText}\n                </div>\n            );\n        }\n\n        return (\n            <div\n                data-testid='autoCompleteSelector'\n                className='form-group'\n            >\n                {labelContent}\n                <div className={inputClassName}>\n                    <SuggestionBox\n                        placeholder={placeholder}\n                        ref={this.setSuggestionRef}\n                        listComponent={listComponent}\n                        className='form-control'\n                        containerClass='select-suggestion-container'\n                        value={input}\n                        onChange={this.onChange}\n                        onItemSelected={this.handleSelected}\n                        onFocus={this.onFocus}\n                        onBlur={this.onBlur}\n                        providers={providers}\n                        completeOnTab={true}\n                        renderDividers={false}\n                        renderNoResults={true}\n                        openOnFocus={true}\n                        openWhenEmpty={true}\n                        replaceAllInputOnSelect={true}\n                        disabled={disabled}\n                        listPosition={listPosition}\n                    />\n                    {helpTextContent}\n                    {footer}\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ChangeEvent, FormEvent, CSSProperties} from 'react';\n\ntype Props = {\n    id?: string;\n    disabled?: boolean;\n    value?: string;\n    defaultValue?: string;\n    onChange?: (e: ChangeEvent<HTMLTextAreaElement>) => void;\n    onHeightChange?: (height: number, maxHeight: number) => void;\n    onInput?: (e: FormEvent<HTMLTextAreaElement>) => void;\n    placeholder?: string;\n}\n\nexport default class AutosizeTextarea extends React.PureComponent<Props> {\n    private height: number;\n    private textAreaRef: React.RefObject<HTMLTextAreaElement>;\n    private referenceRef: React.RefObject<HTMLTextAreaElement>;\n    constructor(props: Props) {\n        super(props);\n\n        this.height = 0;\n\n        this.textAreaRef = React.createRef();\n        this.referenceRef = React.createRef();\n    }\n\n    get value() {\n        return (this.textAreaRef.current as HTMLTextAreaElement).value;\n    }\n\n    set value(value: string) {\n        (this.textAreaRef.current as HTMLTextAreaElement).value = value;\n    }\n\n    get selectionStart() {\n        return (this.textAreaRef.current as HTMLTextAreaElement).selectionStart;\n    }\n\n    set selectionStart(selectionStart) {\n        (this.textAreaRef.current as HTMLTextAreaElement).selectionStart = selectionStart;\n    }\n\n    get selectionEnd() {\n        return (this.textAreaRef.current as HTMLTextAreaElement).selectionEnd;\n    }\n\n    set selectionEnd(selectionEnd) {\n        (this.textAreaRef.current as HTMLTextAreaElement).selectionEnd = selectionEnd;\n    }\n\n    focus() {\n        this.textAreaRef.current?.focus();\n    }\n\n    blur() {\n        this.textAreaRef.current?.blur();\n    }\n\n    componentDidMount() {\n        this.recalculateSize();\n    }\n\n    componentDidUpdate() {\n        this.recalculateSize();\n    }\n\n    recalculateSize = () => {\n        if (!this.referenceRef.current || !(this.textAreaRef.current)) {\n            return;\n        }\n\n        const height = (this.referenceRef.current).scrollHeight;\n        const textarea = (this.textAreaRef.current);\n\n        if (height > 0 && height !== this.height) {\n            const style = getComputedStyle(textarea);\n            const borderWidth = parseInt(style.borderTopWidth || '0', 10) + parseInt(style.borderBottomWidth || '0', 10);\n\n            // Directly change the height to avoid circular rerenders\n            textarea.style.height = String(height + borderWidth) + 'px';\n\n            this.height = height;\n\n            window.requestAnimationFrame(() => {\n                this.props.onHeightChange?.(height, parseInt(style.maxHeight || '0', 10));\n            });\n        }\n    }\n\n    getDOMNode = () => {\n        return (this.textAreaRef.current);\n    };\n\n    handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n        if (this.props.onChange) {\n            this.props.onChange(e);\n        }\n    };\n\n    render() {\n        const props = {...this.props};\n\n        Reflect.deleteProperty(props, 'onHeightChange');\n        Reflect.deleteProperty(props, 'providers');\n        Reflect.deleteProperty(props, 'channelId');\n\n        const {\n            value,\n            defaultValue,\n            placeholder,\n            disabled,\n            onInput,\n\n            // TODO: The provided `id` is sometimes hard-coded and used to interface with the\n            // component, e.g. `post_textbox`, so it can't be changed. This would ideally be\n            // abstracted to avoid passing in an `id` prop at all, but we intentionally maintain\n            // the old behaviour to address ABC-213.\n            id,\n            ...otherProps\n        } = props;\n\n        const heightProps = {\n            rows: 0,\n            height: 0,\n        };\n\n        if (this.height <= 0) {\n            // Set an initial number of rows so that the textarea doesn't appear too large when its first rendered\n            heightProps.rows = 1;\n        } else {\n            heightProps.height = this.height;\n        }\n\n        let textareaPlaceholder = null;\n        const placeholderAriaLabel = placeholder ? placeholder.toLowerCase() : '';\n        if (!this.props.value && !this.props.defaultValue) {\n            textareaPlaceholder = (\n                <div\n                    {...otherProps as any}\n                    data-testid={`${id}_placeholder`}\n                    style={style.placeholder}\n                >\n                    {placeholder}\n                </div>\n            );\n        }\n\n        return (\n            <div>\n                {textareaPlaceholder}\n                <textarea\n                    ref={this.textAreaRef}\n                    data-testid={id}\n                    id={id}\n                    {...heightProps}\n                    {...otherProps}\n                    role='textbox'\n                    aria-label={placeholderAriaLabel}\n                    dir='auto'\n                    disabled={disabled}\n                    onChange={this.handleChange}\n                    onInput={onInput}\n                    value={value}\n                    defaultValue={defaultValue}\n                />\n                <div style={style.container}>\n                    <textarea\n                        ref={this.referenceRef}\n                        id={id + '-reference'}\n                        style={style.reference}\n                        dir='auto'\n                        disabled={true}\n                        rows={1}\n                        {...otherProps}\n                        value={value || defaultValue}\n                        aria-hidden={true}\n                    />\n                </div>\n            </div>\n        );\n    }\n}\n\nconst style: { [Key: string]: CSSProperties} = {\n    container: {height: 0, overflow: 'hidden'},\n    reference: {height: 'auto', width: '100%'},\n    placeholder: {overflow: 'hidden', textOverflow: 'ellipsis', opacity: 0.5, pointerEvents: 'none', position: 'absolute', whiteSpace: 'nowrap', background: 'none', borderColor: 'transparent'},\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport classNames from 'classnames';\n\ntype Props = {\n    children: React.ReactNode;\n    expanded?: boolean;\n};\n\nconst CardHeader: React.FC<Props> = (props: Props) => {\n    return (\n        <div className={classNames('Card__header', {expanded: props.expanded})}>\n            {props.children}\n            {props.expanded && <hr className='Card__hr'/>}\n        </div>\n    );\n};\n\nexport default CardHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {Children, isValidElement, cloneElement} from 'react';\nimport classNames from 'classnames';\n\nimport CardHeader from './card_header';\nimport CardBody from './card_body';\n\nimport './card.scss';\n\ntype Props = {\n    expanded?: boolean;\n    className?: string;\n}\n\nexport default class Card extends React.PureComponent<Props> {\n    public static Header = CardHeader;\n    public static Body = CardBody;\n\n    render() {\n        const {expanded, children} = this.props;\n\n        const childrenWithProps = Children.map(children, (child) => {\n            // Checking isValidElement is the safe way and avoids a TS error too.\n            if (isValidElement(child)) {\n                return cloneElement(child, {expanded});\n            }\n            return child;\n        });\n\n        return (\n            <div\n                className={classNames('Card', this.props.className, {\n                    expanded,\n                })}\n            >\n                {childrenWithProps}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, useEffect} from 'react';\nimport classNames from 'classnames';\n\nimport './card.scss';\n\nexport default function CardBody(props: {expanded?: boolean; children: React.ReactNode}) {\n    const [height, setHeight] = useState(0);\n    const [expanding, setExpanding] = useState(false);\n    const [expanded, setExpanded] = useState(false);\n\n    const stopExpanding = () => setExpanding(false);\n\n    const card = (node: HTMLDivElement) => {\n        if (node && node.children) {\n            setHeight(Array.from(node.children).map((child) => child.scrollHeight).reduce((a, b) => a + b, 0));\n        }\n    };\n\n    useEffect(() => {\n        setExpanding(true);\n        if (props.expanded) {\n            setExpanded(true);\n        }\n    }, [props.expanded]);\n\n    useEffect(() => {\n        if (!props.expanded) {\n            setExpanded(false);\n        }\n    }, [expanding]);\n\n    return (\n        <div\n            ref={card}\n            style={{\n                height: (expanding && expanded) ? height : '',\n            }}\n            className={classNames('Card__body', {expanded, expanding})}\n            onTransitionEnd={stopExpanding}\n        >\n            {props.children}\n        </div>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Tooltip} from 'react-bootstrap';\n\nimport OverlayTrigger from 'components/overlay_trigger';\n\nimport {localizeMessage} from 'utils/utils.jsx';\nimport {Constants} from 'utils/constants';\nimport {t} from 'utils/i18n';\n\ntype Props = {\n    ariaLabel?: boolean;\n    buttonClass?: string;\n    buttonId: string;\n    iconComponent: React.ReactNode;\n    onClick: (event: React.MouseEvent<HTMLButtonElement>) => void;\n    tooltipKey: string;\n    tooltipText?: React.ReactNode;\n    isRhsOpen?: boolean;\n}\n\ntype TooltipInfo = {\n    class: string;\n    id: string;\n    messageID: string;\n    message: string;\n}\n\nconst HeaderIconWrapper: React.FC<Props> = (props: Props) => {\n    const {\n        ariaLabel,\n        buttonClass,\n        buttonId,\n        iconComponent,\n        onClick,\n        tooltipKey,\n        tooltipText,\n        isRhsOpen,\n    } = props;\n\n    const toolTips: Record<string, TooltipInfo> = {\n        flaggedPosts: {\n            class: 'text-nowrap',\n            id: 'flaggedTooltip',\n            messageID: t('channel_header.flagged'),\n            message: 'Saved posts',\n        },\n        pinnedPosts: {\n            class: 'pinned-posts',\n            id: 'pinnedPostTooltip',\n            messageID: t('channel_header.pinnedPosts'),\n            message: 'Pinned posts',\n        },\n        recentMentions: {\n            class: '',\n            id: 'recentMentionsTooltip',\n            messageID: t('channel_header.recentMentions'),\n            message: 'Recent mentions',\n        },\n        search: {\n            class: '',\n            id: 'searchTooltip',\n            messageID: t('channel_header.search'),\n            message: 'Search',\n        },\n        channelFiles: {\n            class: 'channel-files',\n            id: 'channelFilesTooltip',\n            messageID: t('channel_header.channelFiles'),\n            message: 'Channel files',\n        },\n    };\n\n    function getTooltip(key: string) {\n        if (toolTips[key] == null) {\n            return null;\n        }\n\n        return (\n            <Tooltip\n                id={toolTips[key].id}\n                className={toolTips[key].class}\n            >\n                <FormattedMessage\n                    id={toolTips[key].messageID}\n                    defaultMessage={toolTips[key].message}\n                />\n            </Tooltip>\n        );\n    }\n\n    let tooltip;\n    if (tooltipKey === 'plugin' && tooltipText) {\n        tooltip = (\n            <Tooltip\n                id='pluginTooltip'\n                className=''\n            >\n                <span>{tooltipText}</span>\n            </Tooltip>\n        );\n    } else {\n        tooltip = getTooltip(tooltipKey);\n    }\n\n    let ariaLabelText;\n    if (ariaLabel) {\n        ariaLabelText = `${localizeMessage(toolTips[tooltipKey].messageID, toolTips[tooltipKey].message)}`;\n    }\n\n    if (tooltip) {\n        return (\n            <div>\n                <OverlayTrigger\n                    trigger={['hover']}\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='bottom'\n                    overlay={isRhsOpen ? <></> : tooltip}\n                >\n                    <button\n                        id={buttonId}\n                        aria-label={ariaLabelText}\n                        className={buttonClass || 'channel-header__icon'}\n                        onClick={onClick}\n                    >\n                        {iconComponent}\n                    </button>\n                </OverlayTrigger>\n            </div>\n        );\n    }\n\n    return (\n        <div className='flex-child'>\n            <button\n                id={buttonId}\n                className={buttonClass || 'channel-header__icon'}\n                onClick={onClick}\n            >\n                {iconComponent}\n            </button>\n        </div>\n    );\n};\n\nexport default HeaderIconWrapper;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {Dictionary, RelationOneToOne} from 'mattermost-redux/types/utilities';\nimport {ActionFunc} from 'mattermost-redux/types/actions';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport {filterProfilesStartingWithTerm} from 'mattermost-redux/utils/user_utils';\n\nimport {displayEntireNameForUser, localizeMessage, isGuest} from 'utils/utils.jsx';\nimport ProfilePicture from 'components/profile_picture';\nimport MultiSelect, {Value} from 'components/multiselect/multiselect';\nimport AddIcon from 'components/widgets/icons/fa_add_icon';\nimport GuestBadge from 'components/widgets/badges/guest_badge';\nimport BotBadge from 'components/widgets/badges/bot_badge';\n\nimport Constants from 'utils/constants';\n\nconst USERS_PER_PAGE = 50;\nconst MAX_SELECTABLE_VALUES = 20;\n\ntype UserProfileValue = Value & UserProfile;\n\nexport type Props = {\n    profilesNotInCurrentChannel: UserProfileValue[];\n    profilesNotInCurrentTeam: UserProfileValue[];\n    userStatuses: RelationOneToOne<UserProfile, string>;\n    onHide: () => void;\n    channel: Channel;\n\n    // skipCommit = true used with onAddCallback will result in users not being committed immediately\n    skipCommit?: boolean;\n\n    // onAddCallback takes an array of UserProfiles and should set usersToAdd in state of parent component\n    onAddCallback?: (userProfiles?: UserProfileValue[]) => void;\n\n    // Dictionaries of userid mapped users to exclude or include from this list\n    excludeUsers?: Dictionary<UserProfileValue>;\n    includeUsers?: Dictionary<UserProfileValue>;\n\n    actions: {\n        addUsersToChannel: any;\n        getProfilesNotInChannel: any;\n        getTeamStats: (teamId: string) => ActionFunc;\n        loadStatusesForProfilesList: (users: UserProfile[]) => Promise<{data: boolean}>;\n        searchProfiles: (term: string, options: any) => ActionFunc;\n    };\n}\n\ntype State = {\n    values: UserProfileValue[];\n    term: string;\n    show: boolean;\n    saving: boolean;\n    loadingUsers: boolean;\n    inviteError?: string;\n}\n\nexport default class ChannelInviteModal extends React.PureComponent<Props, State> {\n    private searchTimeoutId = 0;\n    private selectedItemRef = React.createRef<HTMLDivElement>();\n\n    public static defaultProps = {\n        includeUsers: {},\n        excludeUsers: {},\n        skipCommit: false,\n    };\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            values: [],\n            term: '',\n            show: true,\n            saving: false,\n            loadingUsers: true,\n        } as State;\n    }\n\n    private addValue = (value: UserProfileValue): void => {\n        const values: UserProfileValue[] = Object.assign([], this.state.values);\n        if (values.indexOf(value) === -1) {\n            values.push(value);\n        }\n\n        this.setState({values});\n    };\n\n    public componentDidMount(): void {\n        this.props.actions.getProfilesNotInChannel(this.props.channel.team_id, this.props.channel.id, this.props.channel.group_constrained, 0).then(() => {\n            this.setUsersLoadingState(false);\n        });\n        this.props.actions.getTeamStats(this.props.channel.team_id);\n        this.props.actions.loadStatusesForProfilesList(this.props.profilesNotInCurrentChannel);\n    }\n\n    public onHide = (): void => {\n        this.setState({show: false});\n        this.props.actions.loadStatusesForProfilesList(this.props.profilesNotInCurrentChannel);\n    };\n\n    public handleInviteError = (err: any): void => {\n        if (err) {\n            this.setState({\n                saving: false,\n                inviteError: err.message,\n            });\n        }\n    };\n\n    private handleDelete = (values: UserProfileValue[]): void => {\n        this.setState({values});\n    };\n\n    private setUsersLoadingState = (loadingState: boolean): void => {\n        this.setState({\n            loadingUsers: loadingState,\n        });\n    };\n\n    private handlePageChange = (page: number, prevPage: number): void => {\n        if (page > prevPage) {\n            this.setUsersLoadingState(true);\n            this.props.actions.getProfilesNotInChannel(\n                this.props.channel.team_id,\n                this.props.channel.id,\n                this.props.channel.group_constrained,\n                page + 1, USERS_PER_PAGE).then(() => this.setUsersLoadingState(false));\n        }\n    };\n\n    public handleSubmit = (): void => {\n        const {actions, channel} = this.props;\n\n        const userIds = this.state.values.map((v) => v.id);\n        if (userIds.length === 0) {\n            return;\n        }\n\n        if (this.props.skipCommit && this.props.onAddCallback) {\n            this.props.onAddCallback(this.state.values);\n            this.setState({\n                saving: false,\n                inviteError: undefined,\n            });\n            this.onHide();\n            return;\n        }\n\n        this.setState({saving: true});\n\n        actions.addUsersToChannel(channel.id, userIds).then((result: any) => {\n            if (result.error) {\n                this.handleInviteError(result.error);\n            } else {\n                this.setState({\n                    saving: false,\n                    inviteError: undefined,\n                });\n                this.onHide();\n            }\n        });\n    };\n\n    public search = (searchTerm: string): void => {\n        const term = searchTerm.trim();\n        clearTimeout(this.searchTimeoutId);\n        this.setState({\n            term,\n        });\n\n        if (term) {\n            this.setUsersLoadingState(true);\n            this.searchTimeoutId = window.setTimeout(\n                async () => {\n                    const options = {\n                        team_id: this.props.channel.team_id,\n                        not_in_channel_id: this.props.channel.id,\n                        group_constrained: this.props.channel.group_constrained,\n                    };\n                    await this.props.actions.searchProfiles(term, options);\n                    this.setUsersLoadingState(false);\n                },\n                Constants.SEARCH_TIMEOUT_MILLISECONDS,\n            );\n        } else {\n            return;\n        }\n\n        this.searchTimeoutId = window.setTimeout(\n            async () => {\n                if (!term) {\n                    return;\n                }\n\n                const options = {\n                    team_id: this.props.channel.team_id,\n                    not_in_channel_id: this.props.channel.id,\n                    group_constrained: this.props.channel.group_constrained,\n                };\n                await this.props.actions.searchProfiles(term, options);\n                this.setUsersLoadingState(false);\n            },\n            Constants.SEARCH_TIMEOUT_MILLISECONDS,\n        );\n    };\n\n    private renderAriaLabel = (option: UserProfileValue): string => {\n        if (!option) {\n            return '';\n        }\n        return option.username;\n    }\n\n    renderOption = (option: UserProfileValue, isSelected: boolean, onAdd: (user: UserProfileValue) => void, onMouseMove: (user: UserProfileValue) => void) => {\n        let rowSelected = '';\n        if (isSelected) {\n            rowSelected = 'more-modal__row--selected';\n        }\n\n        return (\n            <div\n                key={option.id}\n                ref={isSelected ? this.selectedItemRef : option.id}\n                className={'more-modal__row clickable ' + rowSelected}\n                onClick={() => onAdd(option)}\n                onMouseMove={() => onMouseMove(option)}\n            >\n                <ProfilePicture\n                    src={Client4.getProfilePictureUrl(option.id, option.last_picture_update)}\n                    status={this.props.userStatuses[option.id]}\n                    size='md'\n                    username={option.username}\n                />\n                <div className='more-modal__details'>\n                    <div className='more-modal__name'>\n                        {displayEntireNameForUser(option)}\n                        <BotBadge\n                            show={Boolean(option.is_bot)}\n                            className='badge-popoverlist'\n                        />\n                        <GuestBadge\n                            show={isGuest(option)}\n                            className='popoverlist'\n                        />\n                    </div>\n                </div>\n                <div className='more-modal__actions'>\n                    <div className='more-modal__actions--round'>\n                        <AddIcon/>\n                    </div>\n                </div>\n            </div>\n        );\n    };\n\n    public render = (): JSX.Element => {\n        let inviteError = null;\n        if (this.state.inviteError) {\n            inviteError = (<label className='has-error control-label'>{this.state.inviteError}</label>);\n        }\n\n        const header = (\n            <h1>\n                <FormattedMessage\n                    id='channel_invite.addNewMembers'\n                    defaultMessage='Add people to {channel}'\n                    values={{\n                        channel: this.props.channel.display_name,\n                    }}\n                />\n            </h1>\n        );\n\n        const buttonSubmitText = localizeMessage('multiselect.add', 'Add');\n        const buttonSubmitLoadingText = localizeMessage('multiselect.adding', 'Adding...');\n\n        let users = filterProfilesStartingWithTerm(this.props.profilesNotInCurrentChannel, this.state.term).filter((user) => {\n            return user.delete_at === 0 &&\n                !this.props.profilesNotInCurrentTeam.includes(user as UserProfileValue) &&\n                (this.props.excludeUsers !== undefined && !this.props.excludeUsers[user.id]);\n        }).map((user) => user as UserProfileValue);\n\n        if (this.props.includeUsers) {\n            const includeUsers = Object.values(this.props.includeUsers);\n            users = [...users, ...includeUsers];\n        }\n\n        const content = (\n            <MultiSelect\n                key='addUsersToChannelKey'\n                options={users}\n                optionRenderer={this.renderOption}\n                selectedItemRef={this.selectedItemRef}\n                values={this.state.values}\n                ariaLabelRenderer={this.renderAriaLabel}\n                saveButtonPosition={'bottom'}\n                perPage={USERS_PER_PAGE}\n                handlePageChange={this.handlePageChange}\n                handleInput={this.search}\n                handleDelete={this.handleDelete}\n                handleAdd={this.addValue}\n                handleSubmit={this.handleSubmit}\n                maxValues={MAX_SELECTABLE_VALUES}\n                buttonSubmitText={buttonSubmitText}\n                buttonSubmitLoadingText={buttonSubmitLoadingText}\n                saving={this.state.saving}\n                loading={this.state.loadingUsers}\n                placeholderText={localizeMessage('multiselect.placeholder', 'Search for people')}\n                valueWithImage={true}\n            />\n        );\n\n        return (\n            <Modal\n                id='addUsersToChannelModal'\n                dialogClassName='a11y__modal channel-invite'\n                show={this.state.show}\n                onHide={this.onHide}\n                onExited={this.props.onHide}\n                role='dialog'\n                aria-labelledby='channelInviteModalLabel'\n            >\n                <Modal.Header\n                    id='channelInviteModalLabel'\n                    closeButton={true}\n                />\n                <Modal.Body\n                    role='application'\n                    className='overflow--visible'\n                >\n                    <div className='channel-invite__header'>\n                        {header}\n                    </div>\n                    {inviteError}\n                    <div className='channel-invite__content'>\n                        {content}\n                    </div>\n                </Modal.Body>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {getTeamStats} from 'mattermost-redux/actions/teams';\nimport {getProfilesNotInChannel, searchProfiles} from 'mattermost-redux/actions/users';\nimport {getProfilesNotInCurrentChannel, getProfilesNotInCurrentTeam, getProfilesNotInTeam, getUserStatuses, makeGetProfilesNotInChannel} from 'mattermost-redux/selectors/entities/users';\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport {Value} from 'components/multiselect/multiselect';\n\nimport {addUsersToChannel} from 'actions/channel_actions';\nimport {loadStatusesForProfilesList} from 'actions/status_actions.jsx';\nimport {GlobalState} from 'types/store';\n\nimport ChannelInviteModal, {Props} from './channel_invite_modal';\n\ntype UserProfileValue = Value & UserProfile;\n\ntype InitialProps = {\n    channelId: string;\n    teamId: string;\n}\n\nfunction makeMapStateToProps(initialState: GlobalState, initialProps: InitialProps) {\n    let doGetProfilesNotInChannel: (state: GlobalState, channelId: string, filters?: any) => UserProfile[];\n    if (initialProps.channelId && initialProps.teamId) {\n        doGetProfilesNotInChannel = makeGetProfilesNotInChannel();\n    }\n\n    return (state: GlobalState, props: InitialProps) => {\n        let profilesNotInCurrentChannel: UserProfileValue[];\n        let profilesNotInCurrentTeam: UserProfileValue[];\n\n        if (doGetProfilesNotInChannel) {\n            profilesNotInCurrentChannel = doGetProfilesNotInChannel(state, props.channelId) as UserProfileValue[];\n            profilesNotInCurrentTeam = getProfilesNotInTeam(state, props.teamId) as UserProfileValue[];\n        } else {\n            profilesNotInCurrentChannel = getProfilesNotInCurrentChannel(state) as UserProfileValue[];\n            profilesNotInCurrentTeam = getProfilesNotInCurrentTeam(state) as UserProfileValue[];\n        }\n\n        const userStatuses = getUserStatuses(state);\n\n        return {\n            profilesNotInCurrentChannel,\n            profilesNotInCurrentTeam,\n            userStatuses,\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc | GenericAction>, Props['actions']>({\n            addUsersToChannel,\n            getProfilesNotInChannel,\n            getTeamStats,\n            loadStatusesForProfilesList,\n            searchProfiles,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(ChannelInviteModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function ReplyIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='16px'\n                height='14px'\n                viewBox='0 0 16 14'\n                enableBackground='new -158 242 18 18'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.reply', defaultMessage: 'Reply Icon'})}\n            >\n                <path d='M5.2 3.88001V5.48001L6.72 5.56001C8.85333 5.63467 10.64 6.51467 12.08 8.20001C11.312 7.94401 10.448 7.76801 9.488 7.67201C8.76267 7.59734 7.84 7.56001 6.72 7.56001H5.12V9.72001L2.16 6.76001L5.2 3.88001ZM6.64 0.600005C6.48 0.600005 6.34667 0.626672 6.24 0.680005L0.08 6.44001C0.048 6.47201 0.0266667 6.50934 0.016 6.55201C0.00533333 6.59467 0 6.66934 0 6.77601C0 6.87201 0.0266667 6.94667 0.08 7.00001L6.24 12.92C6.29333 12.9733 6.4 13 6.56 13C6.61333 12.9467 6.65067 12.8987 6.672 12.856C6.704 12.792 6.72 12.7067 6.72 12.6V9.08001C8.17067 9.08001 9.328 9.16001 10.192 9.32001C11.312 9.53334 12.272 9.91734 13.072 10.472C13.9573 11.0907 14.72 11.9867 15.36 13.16C15.4667 13.2667 15.5467 13.32 15.6 13.32H15.68C15.7653 13.2773 15.824 13.2187 15.856 13.144C15.888 13.0693 15.8827 12.9947 15.84 12.92C15.872 12.8133 15.8453 12.5413 15.76 12.104C15.6533 11.5707 15.4827 11.0107 15.248 10.424C14.96 9.66667 14.5973 8.95201 14.16 8.28001C13.2853 6.88267 12.2187 5.81067 10.96 5.06401C9.70133 4.30667 8.288 3.88534 6.72 3.80001V0.840006C6.752 0.765339 6.75733 0.706672 6.736 0.664005C6.71467 0.621339 6.68267 0.600005 6.64 0.600005Z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {localizeMessage} from 'utils/utils.jsx';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport ReplyIcon from 'components/widgets/icons/reply_icon';\n\ntype Props = {\n    location: 'CENTER' | 'SEARCH';\n    handleCommentClick: React.EventHandler<React.MouseEvent>;\n    searchStyle: string;\n    commentCount: number;\n    postId?: string;\n    extraClass: string;\n}\n\nexport default class CommentIcon extends React.PureComponent<Props> {\n    public static defaultProps: Partial<Props> = {\n        location: 'CENTER',\n        searchStyle: '',\n        commentCount: 0,\n        extraClass: '',\n    }\n\n    public render(): JSX.Element {\n        let commentCountSpan: JSX.Element | null = null;\n        let iconStyle = 'post-menu__item post-menu__item--wide';\n        if (this.props.commentCount > 0) {\n            iconStyle += ' post-menu__item--show';\n            commentCountSpan = (\n                <span className='post-menu__comment-count'>\n                    {this.props.commentCount}\n                </span>\n            );\n        } else if (this.props.searchStyle !== '') {\n            iconStyle = iconStyle + ' ' + this.props.searchStyle;\n        }\n\n        const tooltip = (\n            <Tooltip\n                id='comment-icon-tooltip'\n                className='hidden-xs'\n            >\n                <FormattedMessage\n                    id='post_info.comment_icon.tooltip.reply'\n                    defaultMessage='Reply'\n                />\n            </Tooltip>\n        );\n\n        return (\n            <OverlayTrigger\n                delayShow={500}\n                placement='top'\n                overlay={tooltip}\n            >\n                <button\n                    id={`${this.props.location}_commentIcon_${this.props.postId}`}\n                    aria-label={localizeMessage('post_info.comment_icon.tooltip.reply', 'Reply').toLowerCase()}\n                    className={iconStyle + ' ' + this.props.extraClass}\n                    onClick={this.props.handleCommentClick}\n                >\n                    <span className='d-flex align-items-center'>\n                        <ReplyIcon className='icon icon--small'/>\n                        {commentCountSpan}\n                    </span>\n                </button>\n            </OverlayTrigger>\n        );\n    }\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ComponentType} from 'react';\n\nimport {isEmpty} from 'lodash';\n\nimport {Subscription, SubscriptionStats} from 'mattermost-redux/types/cloud';\n\ninterface Actions {\n    getCloudSubscription?: () => void;\n    getSubscriptionStats?: () => void;\n}\n\ninterface UsedHocProps {\n    subscription?: Subscription;\n    subscriptionStats?: SubscriptionStats;\n    isCloud: boolean;\n    actions: Actions;\n    userIsAdmin?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction withGetCloudSubscription<P>(WrappedComponent: ComponentType<P>): ComponentType<any> {\n    return class extends React.Component<P & UsedHocProps> {\n        async componentDidMount() {\n            const {subscription, actions: {getSubscriptionStats, getCloudSubscription}, isCloud, userIsAdmin, subscriptionStats} = this.props;\n\n            if (isEmpty(subscriptionStats) && isCloud) {\n                if (getSubscriptionStats) {\n                    await getSubscriptionStats();\n                }\n            }\n\n            if (isEmpty(subscription) && isCloud && userIsAdmin) {\n                if (getCloudSubscription) {\n                    await getCloudSubscription();\n                }\n            }\n        }\n\n        render(): JSX.Element {\n            return <WrappedComponent {...this.props}/>;\n        }\n    };\n}\n\nexport default withGetCloudSubscription;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {useMemo} from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {useSelector} from 'react-redux';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport RenderEmoji from 'components/emoji/render_emoji';\nimport {CustomStatusDuration} from 'mattermost-redux/types/users';\nimport {getCurrentUserTimezone} from 'selectors/general';\nimport {makeGetCustomStatus, isCustomStatusEnabled, isCustomStatusExpired} from 'selectors/views/custom_status';\nimport {GlobalState} from 'types/store';\nimport Constants from 'utils/constants';\n\nimport ExpiryTime from './expiry_time';\n\ninterface ComponentProps {\n    emojiSize?: number;\n    showTooltip?: boolean;\n    tooltipDirection?: 'top' | 'right' | 'bottom' | 'left';\n    spanStyle?: React.CSSProperties;\n    emojiStyle?: React.CSSProperties;\n    userID?: string;\n    onClick?: () => void;\n}\n\nconst CustomStatusEmoji = (props: ComponentProps) => {\n    const getCustomStatus = useMemo(makeGetCustomStatus, []);\n    const {emojiSize, emojiStyle, spanStyle, showTooltip, tooltipDirection, userID, onClick} = props;\n\n    const customStatusEnabled = useSelector(isCustomStatusEnabled);\n    const customStatus = useSelector((state: GlobalState) => getCustomStatus(state, userID));\n    const customStatusExpired = useSelector((state: GlobalState) => isCustomStatusExpired(state, customStatus));\n    const timezone = useSelector(getCurrentUserTimezone);\n\n    const isCustomStatusSet = Boolean(customStatusEnabled && customStatus?.emoji && !customStatusExpired);\n    if (!isCustomStatusSet) {\n        return null;\n    }\n\n    const statusEmoji = (\n        <RenderEmoji\n            emojiName={customStatus.emoji}\n            size={emojiSize}\n            emojiStyle={emojiStyle}\n            onClick={onClick}\n        />\n    );\n\n    if (!showTooltip) {\n        return statusEmoji;\n    }\n\n    return (\n        <OverlayTrigger\n            delayShow={Constants.OVERLAY_TIME_DELAY}\n            placement={tooltipDirection}\n            overlay={\n                <Tooltip id='custom-status-tooltip'>\n                    <div className='custom-status'>\n                        <RenderEmoji\n                            emojiName={customStatus.emoji}\n                            size={14}\n                            emojiStyle={{\n                                marginTop: 2,\n                            }}\n                        />\n                        {customStatus.text &&\n                            <span\n                                className='custom-status-text'\n                                style={{marginLeft: 5}}\n                            >\n                                {customStatus.text}\n                            </span>\n                        }\n                    </div>\n                    {customStatus.expires_at && customStatus.duration !== CustomStatusDuration.DONT_CLEAR &&\n                        <div>\n                            <ExpiryTime\n                                time={customStatus.expires_at}\n                                timezone={timezone}\n                                className='custom-status-expiry'\n                            />\n                        </div>\n                    }\n                </Tooltip>\n            }\n        >\n            <span style={spanStyle}>\n                {statusEmoji}\n            </span>\n        </OverlayTrigger>\n    );\n};\n\nCustomStatusEmoji.defaultProps = {\n    userID: '',\n    emojiSize: 16,\n    tooltipDirection: 'top',\n    showTooltip: false,\n    spanStyle: {},\n    emojiStyle: {\n        marginLeft: 4,\n    },\n};\n\nexport default CustomStatusEmoji;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {useState} from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\nimport classNames from 'classnames';\n\nimport {CustomStatusDuration, UserCustomStatus} from 'mattermost-redux/types/users';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport RenderEmoji from 'components/emoji/render_emoji';\nimport Constants, {durationValues} from 'utils/constants';\n\nimport CustomStatusText from './custom_status_text';\n\nimport './custom_status.scss';\n\ntype Props = {\n    handleSuggestionClick: (status: UserCustomStatus) => void;\n    handleClear?: (status: UserCustomStatus) => void;\n    status: UserCustomStatus;\n};\n\nconst CustomStatusSuggestion: React.FC<Props> = (props: Props) => {\n    const {handleSuggestionClick, handleClear, status} = props;\n    const {emoji, text, duration} = status;\n    const [show, setShow] = useState(false);\n\n    const showClearButton = () => setShow(true);\n\n    const hideClearButton = () => setShow(false);\n\n    const handleRecentCustomStatusClear = (event: React.MouseEvent<HTMLButtonElement>) => {\n        event.stopPropagation();\n        event.preventDefault();\n        if (handleClear) {\n            handleClear(status);\n        }\n    };\n\n    const clearButton = handleClear ?\n        (\n            <div\n                className='suggestion-clear'\n            >\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='top'\n                    overlay={\n                        <Tooltip id='clear-recent-custom-status'>\n                            {'Clear'}\n                        </Tooltip>\n                    }\n                >\n                    <button\n                        className='style--none input-clear-x'\n                        onClick={handleRecentCustomStatusClear}\n                    >\n                        <i className='icon icon-close-circle'/>\n                    </button>\n                </OverlayTrigger>\n            </div>\n        ) : null;\n\n    return (\n        <div\n            className='statusSuggestion__row cursor--pointer'\n            onMouseEnter={showClearButton}\n            onMouseLeave={hideClearButton}\n            onClick={() => handleSuggestionClick(status)}\n        >\n            <div className='statusSuggestion__icon'>\n                <RenderEmoji\n                    emojiName={emoji}\n                    size={20}\n                />\n            </div>\n            <CustomStatusText\n                text={text}\n                tooltipDirection='top'\n                className={classNames('statusSuggestion__text', {\n                    with_duration: duration,\n                })}\n            />\n            {duration &&\n            duration !== CustomStatusDuration.CUSTOM_DATE_TIME &&\n            duration !== CustomStatusDuration.DATE_AND_TIME && (\n                <span className='statusSuggestion__duration'>\n                    <FormattedMessage\n                        id={durationValues[duration].id}\n                        defaultMessage={durationValues[duration].defaultMessage}\n                    />\n                </span>\n            )}\n            {show && clearButton}\n        </div>\n    );\n};\n\nexport default CustomStatusSuggestion;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {useState, useEffect} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport Menu from 'components/widgets/menu/menu';\nimport {CustomStatusDuration} from 'mattermost-redux/types/users';\nimport {durationValues} from 'utils/constants';\n\nimport ExpiryTime from './expiry_time';\n\ntype ExpiryMenuItem = {\n    text: string;\n    value: string;\n}\n\ntype Props = {\n    duration: CustomStatusDuration;\n    expiryTime?: string;\n    handleDurationChange: (expiryValue: CustomStatusDuration) => void;\n}\n\nconst {\n    DONT_CLEAR,\n    THIRTY_MINUTES,\n    ONE_HOUR,\n    FOUR_HOURS,\n    TODAY,\n    THIS_WEEK,\n    DATE_AND_TIME,\n    CUSTOM_DATE_TIME,\n} = CustomStatusDuration;\n\nconst ExpiryMenu: React.FC<Props> = (props: Props) => {\n    const {duration, handleDurationChange, expiryTime} = props;\n    const {formatMessage} = useIntl();\n    const [menuItems, setMenuItems] = useState<JSX.Element[]>([]);\n\n    const expiryMenuItems: { [key in CustomStatusDuration]?: ExpiryMenuItem } = {\n        [DONT_CLEAR]: {\n            text: formatMessage(durationValues[DONT_CLEAR]),\n            value: formatMessage(durationValues[DONT_CLEAR]),\n        },\n        [THIRTY_MINUTES]: {\n            text: formatMessage(durationValues[THIRTY_MINUTES]),\n            value: formatMessage(durationValues[THIRTY_MINUTES]),\n        },\n        [ONE_HOUR]: {\n            text: formatMessage(durationValues[ONE_HOUR]),\n            value: formatMessage(durationValues[ONE_HOUR]),\n        },\n        [FOUR_HOURS]: {\n            text: formatMessage(durationValues[FOUR_HOURS]),\n            value: formatMessage(durationValues[FOUR_HOURS]),\n        },\n        [TODAY]: {\n            text: formatMessage(durationValues[TODAY]),\n            value: formatMessage(durationValues[TODAY]),\n        },\n        [THIS_WEEK]: {\n            text: formatMessage(durationValues[THIS_WEEK]),\n            value: formatMessage(durationValues[THIS_WEEK]),\n        },\n        [CUSTOM_DATE_TIME]: {\n            text: formatMessage({id: 'custom_status.expiry_dropdown.choose_date_and_time', defaultMessage: 'Choose date and time'}),\n            value: formatMessage(durationValues[CUSTOM_DATE_TIME]),\n        },\n    };\n\n    useEffect(() => {\n        const menuItemArray = Object.keys(expiryMenuItems).map((item, index) => (\n            <Menu.ItemAction\n                key={item.toString()}\n                onClick={(event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n                    event.preventDefault();\n                    handleDurationChange(item as CustomStatusDuration);\n                }}\n                ariaLabel={expiryMenuItems[item as CustomStatusDuration]?.text.toLowerCase()}\n                text={expiryMenuItems[item as CustomStatusDuration]?.text}\n                id={`expiry_menu_item_${index}`}\n            />\n        ));\n\n        setMenuItems(menuItemArray);\n    }, []);\n\n    return (\n        <div className='statusExpiry'>\n            <div className='statusExpiry__content'>\n                <MenuWrapper\n                    className={'statusExpiry__menu'}\n                >\n                    <span className='expiry-wrapper expiry-selector'>\n                        <FormattedMessage\n                            id='custom_status.expiry_dropdown.clear_after'\n                            defaultMessage='Clear after'\n                        />{': '}\n                        {expiryTime && duration !== DONT_CLEAR ? (\n                            <ExpiryTime\n                                time={expiryTime}\n                                className='expiry-value'\n                                showPrefix={false}\n                            />\n                        ) : (\n                            <span className='expiry-value'>\n                                {expiryMenuItems[duration === DATE_AND_TIME ? CUSTOM_DATE_TIME : duration]?.value}\n                            </span>\n                        )}\n                        <span>\n                            <i\n                                className='fa fa-angle-down'\n                                aria-hidden='true'\n                            />\n                        </span>\n                    </span>\n                    <Menu\n                        ariaLabel={formatMessage({id: 'custom_status.expiry_dropdown.clear_after', defaultMessage: 'Clear after'})}\n                        id='statusExpiryMenu'\n                    >\n                        <Menu.Group>\n                            {menuItems}\n                        </Menu.Group>\n                    </Menu>\n                </MenuWrapper>\n            </div>\n        </div>\n    );\n};\n\nexport default ExpiryMenu;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {useEffect, useState, useCallback} from 'react';\nimport {useSelector} from 'react-redux';\nimport DayPickerInput from 'react-day-picker/DayPickerInput';\nimport {DayModifiers, NavbarElementProps} from 'react-day-picker';\nimport {useIntl} from 'react-intl';\n\nimport moment, {Moment} from 'moment-timezone';\n\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport Menu from 'components/widgets/menu/menu';\nimport Timestamp from 'components/timestamp';\nimport {getCurrentLocale} from 'selectors/i18n';\nimport {getCurrentMomentForTimezone} from 'utils/timezone';\n\nconst CUSTOM_STATUS_TIME_PICKER_INTERVALS_IN_MINUTES = 30;\n\nconst Navbar: React.FC<Partial<NavbarElementProps>> = (navbarProps: Partial<NavbarElementProps>) => {\n    const {\n        onPreviousClick,\n        onNextClick,\n        className,\n    } = navbarProps;\n    const styleLeft: React.CSSProperties = {\n        float: 'left',\n        fontSize: 18,\n    };\n    const styleRight: React.CSSProperties = {\n        float: 'right',\n        fontSize: 18,\n    };\n\n    return (\n        <div className={className}>\n            <button\n                className='style--none'\n                style={styleLeft}\n                onClick={(e) => {\n                    e.preventDefault();\n                    if (onPreviousClick) {\n                        onPreviousClick();\n                    }\n                }}\n            >\n                <i\n                    className='fa fa-angle-left'\n                    aria-hidden='true'\n                />\n            </button>\n            <button\n                className='style--none'\n                style={styleRight}\n                onClick={(e) => {\n                    e.preventDefault();\n                    if (onNextClick) {\n                        onNextClick();\n                    }\n                }}\n            >\n                <i\n                    className='fa fa-angle-right'\n                    aria-hidden='true'\n                />\n            </button>\n        </div>\n    );\n};\n\nexport function getRoundedTime(value: Moment) {\n    const roundedTo = CUSTOM_STATUS_TIME_PICKER_INTERVALS_IN_MINUTES;\n    const start = moment(value);\n    const diff = start.minute() % roundedTo;\n    if (diff === 0) {\n        return value;\n    }\n    const remainder = roundedTo - diff;\n    return start.add(remainder, 'm').seconds(0).milliseconds(0);\n}\n\nconst getTimeInIntervals = (startTime: Moment): Date[] => {\n    const interval = CUSTOM_STATUS_TIME_PICKER_INTERVALS_IN_MINUTES;\n    let time = moment(startTime);\n    const nextDay = moment(startTime).add(1, 'days').startOf('day');\n    const intervals: Date[] = [];\n    while (time.isBefore(nextDay)) {\n        intervals.push(time.toDate());\n        time = time.add(interval, 'minutes').seconds(0).milliseconds(0);\n    }\n\n    return intervals;\n};\n\ntype Props = {\n    time: Moment;\n    handleChange: (date: Moment) => void;\n    timezone?: string;\n}\n\nconst DateTimeInputContainer: React.FC<Props> = (props: Props) => {\n    const locale = useSelector(getCurrentLocale);\n    const {time, handleChange, timezone} = props;\n    const [timeOptions, setTimeOptions] = useState<Date[]>([]);\n    const {formatMessage} = useIntl();\n\n    const setTimeAndOptions = () => {\n        const currentTime = getCurrentMomentForTimezone(timezone);\n        let startTime = moment(time).startOf('day');\n        if (time.date() === currentTime.date()) {\n            startTime = getRoundedTime(currentTime);\n        }\n        setTimeOptions(getTimeInIntervals(startTime));\n    };\n\n    useEffect(setTimeAndOptions, [time]);\n\n    const handleDayChange = (day: Date, modifiers: DayModifiers) => {\n        if (modifiers.today) {\n            const currentTime = getCurrentMomentForTimezone(timezone);\n            const roundedTime = getRoundedTime(currentTime);\n            handleChange(roundedTime);\n        } else {\n            const dayWithTimezone = timezone ? moment.tz(day, timezone) : moment(day);\n            handleChange(dayWithTimezone.startOf('day'));\n        }\n    };\n\n    const handleTimeChange = useCallback((time: Date, e: React.MouseEvent) => {\n        e.preventDefault();\n        handleChange(moment(time));\n    }, [handleChange]);\n\n    const currentTime = getCurrentMomentForTimezone(timezone).toDate();\n    const modifiers = {\n        today: currentTime,\n    };\n\n    return (\n        <div className='dateTime'>\n            <div className='dateTime__date'>\n                <span className='dateTime__input-title'>{formatMessage({id: 'custom_status.expiry.date_picker.title', defaultMessage: 'Date'})}</span>\n                <span className='dateTime__date-icon'>\n                    <i className='icon-calendar-outline'/>\n                </span>\n                <DayPickerInput\n                    value={time.toDate()}\n                    onDayChange={handleDayChange}\n                    inputProps={{\n                        readOnly: true,\n                        className: 'dateTime__input',\n                    }}\n                    dayPickerProps={{\n                        navbarElement: <Navbar/>,\n                        fromMonth: currentTime,\n                        modifiers,\n                        locale: locale.toLowerCase(),\n                        disabledDays: {\n                            before: currentTime,\n                        },\n                    }}\n                />\n            </div>\n            <div className='dateTime__time'>\n                <MenuWrapper\n                    className='dateTime__time-menu'\n                >\n                    <div>\n                        <span className='dateTime__input-title'>{formatMessage({id: 'custom_status.expiry.time_picker.title', defaultMessage: 'Time'})}</span>\n                        <span className='dateTime__time-icon'>\n                            <i className='icon-clock-outline'/>\n                        </span>\n                        <div\n                            className='dateTime__input'\n                        >\n                            <Timestamp\n                                useRelative={false}\n                                useDate={false}\n                                value={time.toString()}\n                            />\n                        </div>\n                    </div>\n                    <Menu\n                        ariaLabel={formatMessage({id: 'time_dropdown.choose_time', defaultMessage: 'Choose a time'})}\n                        id='expiryTimeMenu'\n                    >\n                        <Menu.Group>\n                            {Array.isArray(timeOptions) && timeOptions.map((option, index) => (\n                                <Menu.ItemAction\n                                    onClick={handleTimeChange.bind(this, option)}\n                                    key={index}\n                                    text={\n                                        <Timestamp\n                                            useRelative={false}\n                                            useDate={false}\n                                            value={option}\n                                        />\n                                    }\n                                />\n                            ))}\n                        </Menu.Group>\n                    </Menu>\n                </MenuWrapper>\n            </div>\n        </div>\n    );\n};\n\nexport default DateTimeInputContainer;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {useEffect, useMemo, useRef, useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport classNames from 'classnames';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport moment, {Moment} from 'moment-timezone';\n\nimport {setCustomStatus, unsetCustomStatus, removeRecentCustomStatus} from 'mattermost-redux/actions/users';\nimport {setCustomStatusInitialisationState} from 'mattermost-redux/actions/preferences';\nimport {Preferences} from 'mattermost-redux/constants';\nimport {UserCustomStatus, CustomStatusDuration} from 'mattermost-redux/types/users';\nimport {Emoji} from 'mattermost-redux/types/emojis';\n\nimport {loadCustomEmojisIfNeeded} from 'actions/emoji_actions';\nimport GenericModal from 'components/generic_modal';\nimport EmojiIcon from 'components/widgets/icons/emoji_icon';\nimport EmojiPickerOverlay from 'components/emoji_picker/emoji_picker_overlay.jsx';\nimport RenderEmoji from 'components/emoji/render_emoji';\nimport QuickInput, {MaxLengthInput} from 'components/quick_input';\nimport {makeGetCustomStatus, getRecentCustomStatuses, showStatusDropdownPulsatingDot, isCustomStatusExpired} from 'selectors/views/custom_status';\nimport {getCurrentUserTimezone} from 'selectors/general';\nimport {GlobalState} from 'types/store';\nimport {getCurrentMomentForTimezone} from 'utils/timezone';\nimport {Constants} from 'utils/constants';\nimport {t} from 'utils/i18n';\n\nimport CustomStatusSuggestion from 'components/custom_status/custom_status_suggestion';\nimport ExpiryMenu from 'components/custom_status/expiry_menu';\nimport DateTimeInput, {getRoundedTime} from 'components/custom_status/date_time_input';\n\nimport 'components/category_modal.scss';\nimport './custom_status.scss';\n\ntype Props = {\n    onHide: () => void;\n};\n\n// This is the same limit set\n// https://github.com/mattermost/mattermost-server/pull/16835/files#diff-73c61af5954b16f5e3cb5ee786af9eb698f660eff0d65db5556949be5fb6e60bR15\nconst CUSTOM_STATUS_TEXT_CHARACTER_LIMIT = 100;\nconst EMOJI_PICKER_WIDTH_OFFSET = 308;\n\ntype DefaultUserCustomStatus = {\n    emoji: string;\n    message: string;\n    messageDefault: string;\n    duration: CustomStatusDuration;\n};\n\nconst {\n    DONT_CLEAR,\n    THIRTY_MINUTES,\n    ONE_HOUR,\n    FOUR_HOURS,\n    TODAY,\n    THIS_WEEK,\n    DATE_AND_TIME,\n    CUSTOM_DATE_TIME,\n} = CustomStatusDuration;\n\nconst defaultCustomStatusSuggestions: DefaultUserCustomStatus[] = [\n    {\n        emoji: 'calendar',\n        message: t('custom_status.suggestions.in_a_meeting'),\n        messageDefault: 'In a meeting',\n        duration: ONE_HOUR,\n    },\n    {\n        emoji: 'hamburger',\n        message: t('custom_status.suggestions.out_for_lunch'),\n        messageDefault: 'Out for lunch',\n        duration: THIRTY_MINUTES,\n    },\n    {\n        emoji: 'sneezing_face',\n        message: t('custom_status.suggestions.out_sick'),\n        messageDefault: 'Out sick',\n        duration: TODAY,\n    },\n    {\n        emoji: 'house',\n        message: t('custom_status.suggestions.working_from_home'),\n        messageDefault: 'Working from home',\n        duration: TODAY,\n    },\n    {\n        emoji: 'palm_tree',\n        message: t('custom_status.suggestions.on_a_vacation'),\n        messageDefault: 'On a vacation',\n        duration: THIS_WEEK,\n    },\n];\n\nconst defaultDuration = TODAY;\nconst CustomStatusModal: React.FC<Props> = (props: Props) => {\n    const getCustomStatus = useMemo(makeGetCustomStatus, []);\n    const dispatch = useDispatch();\n    const currentCustomStatus = useSelector(getCustomStatus);\n    const customStatusExpired = useSelector((state: GlobalState) => isCustomStatusExpired(state, currentCustomStatus));\n    const recentCustomStatuses = useSelector(getRecentCustomStatuses);\n    const customStatusControlRef = useRef<HTMLDivElement>(null);\n    const {formatMessage} = useIntl();\n    const isCurrentCustomStatusSet = !customStatusExpired && (currentCustomStatus?.text || currentCustomStatus?.emoji);\n    const [showEmojiPicker, setShowEmojiPicker] = useState<boolean>(false);\n    const [text, setText] = useState<string>(isCurrentCustomStatusSet ? currentCustomStatus?.text : '');\n    const [emoji, setEmoji] = useState<string>(isCurrentCustomStatusSet ? currentCustomStatus?.emoji : '');\n    const initialDuration = isCurrentCustomStatusSet ? currentCustomStatus?.duration : defaultDuration;\n    const [duration, setDuration] = useState<CustomStatusDuration>(initialDuration === undefined ? defaultDuration : initialDuration);\n    const isStatusSet = Boolean(emoji || text);\n    const firstTimeModalOpened = useSelector(showStatusDropdownPulsatingDot);\n    const timezone = useSelector(getCurrentUserTimezone);\n\n    const currentTime = getCurrentMomentForTimezone(timezone);\n    let initialCustomExpiryTime: Moment = getRoundedTime(currentTime);\n    if (isCurrentCustomStatusSet && currentCustomStatus?.duration === DATE_AND_TIME && currentCustomStatus?.expires_at) {\n        initialCustomExpiryTime = moment(currentCustomStatus.expires_at);\n    }\n    const [customExpiryTime, setCustomExpiryTime] = useState<Moment>(initialCustomExpiryTime);\n\n    const handleCustomStatusInitializationState = () => {\n        if (firstTimeModalOpened) {\n            dispatch(setCustomStatusInitialisationState({[Preferences.CUSTOM_STATUS_MODAL_VIEWED]: true}));\n        }\n    };\n\n    const loadCustomEmojisForRecentStatuses = () => {\n        const emojisToLoad = new Set<string>();\n        recentCustomStatuses.forEach((customStatus: UserCustomStatus) => emojisToLoad.add(customStatus.emoji));\n        dispatch(loadCustomEmojisIfNeeded(Array.from(emojisToLoad)));\n    };\n\n    useEffect(() => {\n        handleCustomStatusInitializationState();\n        loadCustomEmojisForRecentStatuses();\n    }, []);\n\n    const handleSetStatus = () => {\n        const expiresAt = calculateExpiryTime();\n        const customStatus: UserCustomStatus = {\n            emoji: emoji || 'speech_balloon',\n            text: text.trim(),\n            duration: duration === CUSTOM_DATE_TIME ? DATE_AND_TIME : duration,\n        };\n        if (expiresAt) {\n            customStatus.expires_at = expiresAt;\n        }\n        dispatch(setCustomStatus(customStatus));\n    };\n\n    const calculateExpiryTime = (): string => {\n        switch (duration) {\n        case DONT_CLEAR:\n            return '';\n        case THIRTY_MINUTES:\n            return moment().add(30, 'minutes').seconds(0).milliseconds(0).toISOString();\n        case ONE_HOUR:\n            return moment().add(1, 'hour').seconds(0).milliseconds(0).toISOString();\n        case FOUR_HOURS:\n            return moment().add(4, 'hours').seconds(0).milliseconds(0).toISOString();\n        case TODAY:\n            return moment().endOf('day').toISOString();\n        case THIS_WEEK:\n            return moment().endOf('week').toISOString();\n        case DATE_AND_TIME:\n        case CUSTOM_DATE_TIME:\n            return customExpiryTime.toISOString();\n        default:\n            return '';\n        }\n    };\n\n    const handleClearStatus = isCurrentCustomStatusSet ? () => dispatch(unsetCustomStatus()) : undefined;\n\n    const getCustomStatusControlRef = () => customStatusControlRef.current;\n\n    const handleEmojiClose = () => setShowEmojiPicker(false);\n\n    const handleEmojiClick = (selectedEmoji: Emoji) => {\n        setShowEmojiPicker(false);\n        const emojiName = ('short_name' in selectedEmoji) ? selectedEmoji.short_name : selectedEmoji.name;\n        setEmoji(emojiName);\n    };\n\n    const toggleEmojiPicker = () => setShowEmojiPicker((prevShow) => !prevShow);\n\n    const handleTextChange = (event: React.ChangeEvent<HTMLInputElement>) => setText(event.target.value);\n\n    const handleRecentCustomStatusClear = (status: UserCustomStatus) => dispatch(removeRecentCustomStatus(status));\n\n    const customStatusEmoji = emoji || text ? (\n        <RenderEmoji\n            emojiName={emoji || 'speech_balloon'}\n            size={20}\n        />\n    ) : <EmojiIcon className={'icon icon--emoji'}/>;\n\n    const clearHandle = () => {\n        setEmoji('');\n        setText('');\n        setDuration(defaultDuration);\n    };\n\n    const handleSuggestionClick = (status: UserCustomStatus) => {\n        setEmoji(status.emoji);\n        setText(status.text);\n        setDuration(status.duration || DONT_CLEAR);\n    };\n\n    const calculateRightOffSet = () => {\n        let rightOffset = Constants.DEFAULT_EMOJI_PICKER_RIGHT_OFFSET;\n        const target = getCustomStatusControlRef();\n        if (target) {\n            rightOffset = window.innerWidth - target.getBoundingClientRect().left - EMOJI_PICKER_WIDTH_OFFSET;\n            if (rightOffset < 0) {\n                rightOffset = Constants.DEFAULT_EMOJI_PICKER_RIGHT_OFFSET;\n            }\n        }\n\n        return rightOffset;\n    };\n\n    const recentStatuses = (\n        <div id='statusSuggestion__recents'>\n            <div className='statusSuggestion__title'>\n                {formatMessage({id: 'custom_status.suggestions.recent_title', defaultMessage: 'RECENT'})}\n            </div>\n            {\n                recentCustomStatuses.map((status: UserCustomStatus) => (\n                    <CustomStatusSuggestion\n                        key={status.text}\n                        handleSuggestionClick={handleSuggestionClick}\n                        handleClear={handleRecentCustomStatusClear}\n                        status={status}\n                    />\n                ))\n            }\n        </div>\n    );\n\n    const renderCustomStatusSuggestions = () => {\n        const recentCustomStatusTexts = recentCustomStatuses.map((status: UserCustomStatus) => status.text);\n        const customStatusSuggestions = defaultCustomStatusSuggestions.\n            map((status) => ({\n                emoji: status.emoji,\n                text: formatMessage({id: status.message, defaultMessage: status.messageDefault}),\n                duration: status.duration,\n            })).\n            filter((status: UserCustomStatus) => !recentCustomStatusTexts.includes(status.text)).\n            map((status: UserCustomStatus, index: number) => (\n                <CustomStatusSuggestion\n                    key={index}\n                    handleSuggestionClick={handleSuggestionClick}\n                    status={status}\n                />\n            ));\n\n        if (customStatusSuggestions.length <= 0) {\n            return null;\n        }\n\n        return (\n            <>\n                <div className='statusSuggestion__title'>\n                    {formatMessage({id: 'custom_status.suggestions.title', defaultMessage: 'SUGGESTIONS'})}\n                </div>\n                {customStatusSuggestions}\n            </>\n        );\n    };\n\n    const areEmojiAndTextSame = currentCustomStatus?.emoji === emoji && currentCustomStatus?.text === text;\n    const areSelectedAndSetStatusSame = areEmojiAndTextSame && duration === currentCustomStatus?.duration;\n\n    const showSuggestions = !isStatusSet || areSelectedAndSetStatusSame;\n\n    const disableSetStatus = !isStatusSet || text.length > CUSTOM_STATUS_TEXT_CHARACTER_LIMIT;\n\n    const showDateAndTimeField = !showSuggestions && (duration === CUSTOM_DATE_TIME || duration === DATE_AND_TIME);\n\n    const suggestion = (\n        <div\n            className='statusSuggestion'\n            style={{marginTop: isStatusSet ? 44 : 8}}\n        >\n            <div className='statusSuggestion__content'>\n                {recentCustomStatuses.length > 0 && recentStatuses}\n                <div id='statusSuggestion__suggestions'>\n                    {renderCustomStatusSuggestions()}\n                </div>\n            </div>\n        </div>\n    );\n\n    return (\n        <GenericModal\n            enforceFocus={false}\n            onHide={props.onHide}\n            modalHeaderText={\n                <FormattedMessage\n                    id='custom_status.set_status'\n                    defaultMessage='Set a status'\n                />\n            }\n            confirmButtonText={\n                <FormattedMessage\n                    id='custom_status.modal_confirm'\n                    defaultMessage='Set Status'\n                />\n            }\n            cancelButtonText={\n                <FormattedMessage\n                    id='custom_status.modal_cancel'\n                    defaultMessage='Clear Status'\n                />\n            }\n            isConfirmDisabled={disableSetStatus}\n            id='custom_status_modal'\n            className={'StatusModal'}\n            handleConfirm={handleSetStatus}\n            handleCancel={handleClearStatus}\n            confirmButtonClassName='btn btn-primary'\n        >\n            <div className='StatusModal__body'>\n                <div className='StatusModal__input'>\n                    <div\n                        ref={customStatusControlRef}\n                        className='StatusModal__emoji-container'\n                    >\n                        {showEmojiPicker && (\n                            <EmojiPickerOverlay\n                                target={getCustomStatusControlRef}\n                                show={showEmojiPicker}\n                                onHide={handleEmojiClose}\n                                onEmojiClose={handleEmojiClose}\n                                onEmojiClick={handleEmojiClick}\n                                rightOffset={calculateRightOffSet()}\n                                leftOffset={3}\n                                topOffset={3}\n                                defaultHorizontalPosition='right'\n                            />\n                        )}\n                        <button\n                            type='button'\n                            onClick={toggleEmojiPicker}\n                            className={classNames('emoji-picker__container', 'StatusModal__emoji-button', {\n                                'StatusModal__emoji-button--active': showEmojiPicker,\n                            })}\n                        >\n                            {customStatusEmoji}\n                        </button>\n                    </div>\n                    <QuickInput\n                        inputComponent={MaxLengthInput}\n                        value={text}\n                        maxLength={CUSTOM_STATUS_TEXT_CHARACTER_LIMIT}\n                        clearableWithoutValue={Boolean(isStatusSet)}\n                        onClear={clearHandle}\n                        className='form-control'\n                        clearClassName='StatusModal__clear-container'\n                        tooltipPosition='top'\n                        onChange={handleTextChange}\n                        placeholder={formatMessage({id: 'custom_status.set_status', defaultMessage: 'Set a status'})}\n                    />\n                </div>\n                {showSuggestions && suggestion}\n                {showDateAndTimeField && (\n                    <DateTimeInput\n                        time={customExpiryTime}\n                        handleChange={setCustomExpiryTime}\n                        timezone={timezone}\n                    />\n                )}\n                {isStatusSet && (\n                    <ExpiryMenu\n                        duration={duration}\n                        expiryTime={showSuggestions ? currentCustomStatus?.expires_at : undefined}\n                        handleDurationChange={setDuration}\n                    />\n                )}\n            </div>\n        </GenericModal >\n    );\n};\n\nexport default CustomStatusModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {useState} from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {useSelector} from 'react-redux';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport {isCustomStatusEnabled} from 'selectors/views/custom_status';\nimport {GlobalState} from 'types/store';\nimport Constants from 'utils/constants';\n\ninterface ComponentProps {\n    tooltipDirection?: 'top' | 'right' | 'bottom' | 'left';\n    text: string;\n    className?: string;\n}\n\nconst CustomStatusText = (props: ComponentProps) => {\n    const {tooltipDirection, text, className} = props;\n    const customStatusEnabled = useSelector((state: GlobalState) => {\n        return isCustomStatusEnabled(state);\n    });\n    const [show, setShow] = useState<boolean>(false);\n    let spanElement: HTMLSpanElement | null = null;\n    if (!customStatusEnabled) {\n        return null;\n    }\n\n    const showTooltip = () => {\n        setShow(Boolean(spanElement && spanElement.offsetWidth < spanElement.scrollWidth));\n    };\n\n    const customStatusTextComponent = (\n        <span\n            className={`overflow--ellipsis text-nowrap ${className}`}\n            ref={(element) => {\n                spanElement = element;\n                showTooltip();\n            }}\n        >\n            {text}\n        </span>\n    );\n\n    if (!show) {\n        return customStatusTextComponent;\n    }\n\n    return (\n        <OverlayTrigger\n            delayShow={Constants.OVERLAY_TIME_DELAY}\n            placement={tooltipDirection}\n            overlay={\n                <Tooltip id='custom-status-tooltip'>\n                    {text}\n                </Tooltip>\n            }\n        >\n            {customStatusTextComponent}\n        </OverlayTrigger>\n    );\n};\n\nCustomStatusText.defaultProps = {\n    tooltipDirection: 'bottom',\n    text: '',\n    className: '',\n};\n\nexport default CustomStatusText;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\n\nimport moment from 'moment-timezone';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\nimport {Props as TimestampProps} from 'components/timestamp/timestamp';\n\nimport {getCurrentMomentForTimezone} from 'utils/timezone';\n\nconst CUSTOM_STATUS_EXPIRY_RANGES = [\n    RelativeRanges.TODAY_TITLE_CASE,\n    RelativeRanges.TOMORROW_TITLE_CASE,\n];\n\ninterface Props {\n    time: string;\n    timezone?: string;\n    className?: string;\n    showPrefix?: boolean;\n    withinBrackets?: boolean;\n}\n\nconst ExpiryTime = ({time, timezone, className, showPrefix, withinBrackets}: Props) => {\n    const currentMomentTime = getCurrentMomentForTimezone(timezone);\n    const timestampProps: Partial<TimestampProps> = {\n        value: time,\n        ranges: CUSTOM_STATUS_EXPIRY_RANGES,\n    };\n\n    if (moment(time).isSame(currentMomentTime.clone().endOf('day')) || moment(time).isAfter(currentMomentTime.clone().add(1, 'day').endOf('day'))) {\n        timestampProps.useTime = false;\n    }\n\n    if (moment(time).isBefore(currentMomentTime.clone().endOf('day'))) {\n        timestampProps.useDate = false;\n        delete timestampProps.ranges;\n    }\n\n    if (moment(time).isAfter(currentMomentTime.clone().add(1, 'day').endOf('day')) && moment(time).isBefore(currentMomentTime.clone().add(6, 'days'))) {\n        timestampProps.useDate = {weekday: 'long'};\n    }\n\n    if (moment(time).isAfter(currentMomentTime.clone().add(6, 'days'))) {\n        timestampProps.month = 'short';\n    }\n\n    if (moment(time).isAfter(currentMomentTime.clone().endOf('year'))) {\n        timestampProps.year = 'numeric';\n    }\n\n    const prefix = showPrefix && (\n        <>\n            <FormattedMessage\n                id='custom_status.expiry.until'\n                defaultMessage='Until'\n            />{' '}\n        </>\n    );\n\n    return (\n        <span className={className}>\n            {withinBrackets && '('}\n            {prefix}\n            <Timestamp\n                {...timestampProps}\n            />\n            {withinBrackets && ')'}\n        </span>\n    );\n};\n\nExpiryTime.defaultProps = {\n    showPrefix: true,\n    withinBrackets: false,\n};\n\nexport default React.memo(ExpiryTime);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport hoistStatics from 'hoist-non-react-statics';\nimport React from 'react';\n\n/**\n * Allows two animation frames to complete to allow other components to update\n * and re-render before mounting and rendering an expensive `WrappedComponent`.\n * If provided, `PreRenderComponent` will be rendered instead of null when not\n * rendering the `Wrapped Component`.\n *\n * Based on this Twitter built component\n * https://gist.github.com/paularmstrong/cc2ead7e2a0dec37d8b2096fc8d85759#file-defercomponentrender-js\n */\nexport default function deferComponentRender(WrappedComponent, PreRenderComponent = null) {\n    class DeferredRenderWrapper extends React.PureComponent {\n        constructor(props, context) {\n            super(props, context);\n\n            this.state = {\n                shouldRender: false,\n            };\n        }\n\n        componentDidMount() {\n            window.requestAnimationFrame(() => {\n                window.requestAnimationFrame(() => this.setState({shouldRender: true}));\n            });\n        }\n\n        render() {\n            return this.state.shouldRender ? <WrappedComponent {...this.props}/> : PreRenderComponent;\n        }\n    }\n\n    return hoistStatics(DeferredRenderWrapper, WrappedComponent);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\nimport {matchPath} from 'react-router-dom';\n\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport * as UserAgent from 'utils/user_agent';\nimport {browserHistory} from 'utils/browser_history';\n\nconst urlFormatForDMGMPermalink = '/:teamName/messages/:username/:postid';\nconst urlFormatForChannelPermalink = '/:teamName/channels/:channelname/:postid';\n\ntype Props = {\n    channelName: string;\n    teamName: string;\n    post: Post;\n    commentCount: number;\n    isRHS: boolean;\n    onHide: () => void;\n    actions: {\n        deleteAndRemovePost: (post: Post) => Promise<{data: boolean}>;\n    };\n    location: {\n        pathname: string;\n    };\n}\n\ntype State = {\n    show: boolean;\n}\n\nexport default class DeletePostModal extends React.PureComponent<Props, State> {\n    deletePostBtn: React.RefObject<HTMLButtonElement>;\n\n    constructor(props: Props) {\n        super(props);\n        this.deletePostBtn = React.createRef();\n\n        this.state = {\n            show: true,\n        };\n    }\n\n    handleDelete = async () => {\n        const {\n            actions,\n            post,\n        } = this.props;\n\n        let permalinkPostId = '';\n\n        const result = await actions.deleteAndRemovePost(post);\n\n        const matchUrlForDMGM = matchPath<{postid: string}>(this.props.location.pathname, {\n            path: urlFormatForDMGMPermalink,\n        });\n\n        const matchUrlForChannel = matchPath<{postid: string}>(this.props.location.pathname, {\n            path: urlFormatForChannelPermalink,\n        });\n\n        if (matchUrlForDMGM) {\n            permalinkPostId = matchUrlForDMGM.params.postid;\n        } else if (matchUrlForChannel) {\n            permalinkPostId = matchUrlForChannel.params.postid;\n        }\n\n        if (permalinkPostId === post.id) {\n            const channelUrl = this.props.location.pathname.split('/').slice(0, -1).join('/');\n            browserHistory.replace(channelUrl);\n        }\n\n        if (result.data) {\n            this.onHide();\n        }\n    }\n\n    handleEntered = () => {\n        this.deletePostBtn?.current?.focus();\n    }\n\n    onHide = () => {\n        this.setState({show: false});\n\n        if (!UserAgent.isMobile()) {\n            let element;\n            if (this.props.isRHS) {\n                element = document.getElementById('reply_textbox');\n            } else {\n                element = document.getElementById('post_textbox');\n            }\n            if (element) {\n                element.focus();\n            }\n        }\n    }\n\n    render() {\n        let commentWarning: React.ReactNode = '';\n\n        if (this.props.commentCount > 0 && this.props.post.root_id === '') {\n            commentWarning = (\n                <FormattedMessage\n                    id='delete_post.warning'\n                    defaultMessage='This post has {count, number} {count, plural, one {comment} other {comments}} on it.'\n                    values={{\n                        count: this.props.commentCount,\n                    }}\n                />\n            );\n        }\n\n        const postTerm = this.props.post.root_id ? (\n            <FormattedMessage\n                id='delete_post.comment'\n                defaultMessage='Comment'\n            />\n        ) : (\n            <FormattedMessage\n                id='delete_post.post'\n                defaultMessage='Post'\n            />\n        );\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal'\n                show={this.state.show}\n                onEntered={this.handleEntered}\n                onHide={this.onHide}\n                onExited={this.props.onHide}\n                enforceFocus={false}\n                id='deletePostModal'\n                role='dialog'\n                aria-labelledby='deletePostModalLabel'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='deletePostModalLabel'\n                    >\n                        <FormattedMessage\n                            id='delete_post.confirm'\n                            defaultMessage='Confirm {term} Delete'\n                            values={{\n                                term: (postTerm),\n                            }}\n                        />\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    <FormattedMessage\n                        id='delete_post.question'\n                        defaultMessage='Are you sure you want to delete this {term}?'\n                        values={{\n                            term: (postTerm),\n                        }}\n                    />\n                    <br/>\n                    <br/>\n                    {commentWarning}\n                </Modal.Body>\n                <Modal.Footer>\n                    <button\n                        type='button'\n                        className='btn btn-link'\n                        onClick={this.onHide}\n                    >\n                        <FormattedMessage\n                            id='delete_post.cancel'\n                            defaultMessage='Cancel'\n                        />\n                    </button>\n                    <button\n                        ref={this.deletePostBtn}\n                        type='button'\n                        autoFocus={true}\n                        className='btn btn-danger'\n                        onClick={this.handleDelete}\n                        id='deletePostModalButton'\n                    >\n                        <FormattedMessage\n                            id='delete_post.del'\n                            defaultMessage='Delete'\n                        />\n                    </button>\n                </Modal.Footer>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\nimport {withRouter} from 'react-router-dom';\n\nimport {ActionFunc} from 'mattermost-redux/types/actions';\nimport {Post} from 'mattermost-redux/types/posts';\nimport {makeGetCommentCountForPost} from 'mattermost-redux/selectors/entities/posts';\n\nimport {GlobalState} from 'types/store';\nimport {deleteAndRemovePost} from 'actions/post_actions.jsx';\n\nimport DeletePostModal from './delete_post_modal';\n\ntype Actions = {\n    deleteAndRemovePost: (post: Post) => Promise<{data: boolean}>;\n};\n\ntype Props = {\n    channelName: string;\n    teamName: string;\n    post: Post;\n    commentCount: number;\n    isRHS: boolean;\n    onHide: () => void;\n    actions: {\n        deleteAndRemovePost: (post: Post) => Promise<{data: boolean}>;\n    };\n    location: {\n        pathname: string;\n    };\n}\n\nfunction makeMapStateToProps() {\n    const getReplyCount = makeGetCommentCountForPost();\n\n    return (state: GlobalState, ownProps: Props) => {\n        const post = ownProps.post;\n\n        return {\n            commentCount: getReplyCount(state, post),\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            deleteAndRemovePost,\n        }, dispatch),\n    };\n}\n\nexport default withRouter(connect<any, any, any>(makeMapStateToProps, mapDispatchToProps)(DeletePostModal));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nexport default class DotsHorizontalIcon extends React.PureComponent<React.HTMLAttributes<HTMLSpanElement>> {\n    render() {\n        return (\n            <span {...this.props}>\n                <svg\n                    width='14px'\n                    height='4px'\n                    viewBox='0 0 14 4'\n                    role='img'\n                    aria-label='dots horizontal icon'\n                >\n                    <path d='M10.2 2.00001C10.2 1.56267 10.3547 1.18934 10.664 0.880006C10.984 0.560006 11.3627 0.400006 11.8 0.400006C12.2373 0.400006 12.6107 0.560006 12.92 0.880006C13.24 1.18934 13.4 1.56267 13.4 2.00001C13.4 2.43734 13.24 2.81601 12.92 3.13601C12.6107 3.44534 12.2373 3.60001 11.8 3.60001C11.3627 3.60001 10.984 3.44534 10.664 3.13601C10.3547 2.81601 10.2 2.43734 10.2 2.00001ZM5.4 2.00001C5.4 1.56267 5.55467 1.18934 5.864 0.880006C6.184 0.560006 6.56267 0.400006 7 0.400006C7.43733 0.400006 7.81067 0.560006 8.12 0.880006C8.44 1.18934 8.6 1.56267 8.6 2.00001C8.6 2.43734 8.44 2.81601 8.12 3.13601C7.81067 3.44534 7.43733 3.60001 7 3.60001C6.56267 3.60001 6.184 3.44534 5.864 3.13601C5.55467 2.81601 5.4 2.43734 5.4 2.00001ZM0.6 2.00001C0.6 1.56267 0.754667 1.18934 1.064 0.880006C1.384 0.560006 1.76267 0.400006 2.2 0.400006C2.63733 0.400006 3.01067 0.560006 3.32 0.880006C3.64 1.18934 3.8 1.56267 3.8 2.00001C3.8 2.43734 3.64 2.81601 3.32 3.13601C3.01067 3.44534 2.63733 3.60001 2.2 3.60001C1.76267 3.60001 1.384 3.44534 1.064 3.13601C0.754667 2.81601 0.6 2.43734 0.6 2.00001Z'/>\n                </svg>\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport classNames from 'classnames';\nimport {FormattedMessage, injectIntl, IntlShape} from 'react-intl';\nimport {Tooltip} from 'react-bootstrap';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {Post} from 'mattermost-redux/types/posts';\nimport {AppBinding} from 'mattermost-redux/types/apps';\nimport {AppCallResponseTypes, AppCallTypes, AppExpandLevels} from 'mattermost-redux/constants/apps';\nimport {UserThread} from 'mattermost-redux/types/threads';\nimport {Team} from 'mattermost-redux/types/teams';\nimport {$ID} from 'mattermost-redux/types/utilities';\n\nimport {DoAppCall, PostEphemeralCallResponseForPost} from 'types/apps';\nimport {Locations, ModalIdentifiers, Constants} from 'utils/constants';\nimport DeletePostModal from 'components/delete_post_modal';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport DelayedAction from 'utils/delayed_action';\nimport * as PostUtils from 'utils/post_utils';\nimport * as Utils from 'utils/utils.jsx';\nimport ChannelPermissionGate from 'components/permissions_gates/channel_permission_gate';\nimport Pluggable from 'plugins/pluggable';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport DotsHorizontalIcon from 'components/widgets/icons/dots_horizontal';\nimport {PluginComponent} from 'types/store/plugins';\nimport {createCallContext, createCallRequest} from 'utils/apps';\n\nconst MENU_BOTTOM_MARGIN = 80;\n\nexport const PLUGGABLE_COMPONENT = 'PostDropdownMenuItem';\ntype Props = {\n    intl: IntlShape;\n    post: Post;\n    teamId?: string;\n    location?: 'CENTER' | 'RHS_ROOT' | 'RHS_COMMENT' | 'SEARCH' | string;\n    isFlagged?: boolean;\n    handleCommentClick?: React.EventHandler<React.MouseEvent>;\n    handleDropdownOpened?: (open: boolean) => void;\n    handleAddReactionClick?: () => void;\n    isMenuOpen?: boolean;\n    isReadOnly: boolean | null;\n    pluginMenuItems?: PluginComponent[];\n    isLicensed?: boolean; // TechDebt: Made non-mandatory while converting to typescript\n    postEditTimeLimit?: string; // TechDebt: Made non-mandatory while converting to typescript\n    enableEmojiPicker?: boolean; // TechDebt: Made non-mandatory while converting to typescript\n    channelIsArchived?: boolean; // TechDebt: Made non-mandatory while converting to typescript\n    currentTeamUrl?: string; // TechDebt: Made non-mandatory while converting to typescript\n    appBindings?: AppBinding[];\n    appsEnabled: boolean;\n\n    /**\n     * Components for overriding provided by plugins\n     */\n    components: {\n        [componentName: string]: PluginComponent[];\n    };\n\n    actions: {\n\n        /**\n         * Function flag the post\n         */\n        flagPost: (postId: string) => void;\n\n        /**\n         * Function to unflag the post\n         */\n        unflagPost: (postId: string) => void;\n\n        /**\n         * Function to set the editing post\n         */\n        setEditingPost: (postId?: string, refocusId?: string, title?: string, isRHS?: boolean) => void;\n\n        /**\n         * Function to pin the post\n         */\n        pinPost: (postId: string) => void;\n\n        /**\n         * Function to unpin the post\n         */\n        unpinPost: (postId: string) => void;\n\n        /**\n         * Function to open a modal\n         */\n        openModal: (postId: any) => void;\n\n        /**\n         * Function to set the unread mark at given post\n         */\n        markPostAsUnread: (post: Post, location?: 'CENTER' | 'RHS_ROOT' | 'RHS_COMMENT' | string) => void;\n\n        /**\n         * Function to perform an app call\n         */\n        doAppCall: DoAppCall;\n\n        /**\n         * Function to post the ephemeral message for a call response\n         */\n        postEphemeralCallResponseForPost: PostEphemeralCallResponseForPost;\n\n        /**\n         * Function to set the thread as followed/unfollowed\n         */\n        setThreadFollow: (userId: string, teamId: string, threadId: string, newState: boolean) => void;\n\n    }; // TechDebt: Made non-mandatory while converting to typescript\n\n    canEdit: boolean;\n    canDelete: boolean;\n    userId: string;\n    currentTeamId: $ID<Team>;\n    threadId: $ID<UserThread>;\n    isCollapsedThreadsEnabled: boolean;\n    isFollowingThread?: boolean;\n    threadReplyCount?: number;\n}\n\ntype State = {\n    openUp: boolean;\n    canEdit: boolean;\n    canDelete: boolean;\n}\n\nexport class DotMenuClass extends React.PureComponent<Props, State> {\n    public static defaultProps: Partial<Props> = {\n        isFlagged: false,\n        isReadOnly: false,\n        location: Locations.CENTER,\n        pluginMenuItems: [],\n        appBindings: [],\n    }\n    private editDisableAction: DelayedAction;\n    private buttonRef: React.RefObject<HTMLButtonElement>;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.editDisableAction = new DelayedAction(this.handleEditDisable);\n\n        this.state = {\n            openUp: false,\n            canEdit: props.canEdit && !props.isReadOnly,\n            canDelete: props.canDelete && !props.isReadOnly,\n        };\n\n        this.buttonRef = React.createRef<HTMLButtonElement>();\n    }\n\n    disableCanEditPostByTime() {\n        const {post, isLicensed} = this.props;\n        const {canEdit} = this.state;\n\n        const postEditTimeLimit = this.props.postEditTimeLimit || Constants.UNSET_POST_EDIT_TIME_LIMIT;\n\n        if (canEdit && isLicensed) {\n            if (postEditTimeLimit !== String(Constants.UNSET_POST_EDIT_TIME_LIMIT)) {\n                const milliseconds = 1000;\n                const timeLeft = (post.create_at + (Number(postEditTimeLimit) * milliseconds)) - Utils.getTimestamp();\n                if (timeLeft > 0) {\n                    this.editDisableAction.fireAfter(timeLeft + milliseconds);\n                }\n            }\n        }\n    }\n\n    componentDidMount() {\n        this.disableCanEditPostByTime();\n    }\n\n    static getDerivedStateFromProps(props: Props) {\n        return {\n            canEdit: props.canEdit && !props.isReadOnly,\n            canDelete: props.canDelete && !props.isReadOnly,\n        };\n    }\n\n    componentWillUnmount() {\n        this.editDisableAction.cancel();\n    }\n\n    handleEditDisable = () => {\n        this.setState({canEdit: false});\n    }\n\n    handleFlagMenuItemActivated = () => {\n        if (this.props.isFlagged) {\n            this.props.actions.unflagPost(this.props.post.id);\n        } else {\n            this.props.actions.flagPost(this.props.post.id);\n        }\n    }\n\n    // listen to clicks/taps on add reaction menu item and pass to parent handler\n    handleAddReactionMenuItemActivated = (e: React.MouseEvent) => {\n        e.preventDefault();\n\n        // to be safe, make sure the handler function has been defined\n        if (this.props.handleAddReactionClick) {\n            this.props.handleAddReactionClick();\n        }\n    }\n\n    copyLink = () => {\n        Utils.copyToClipboard(`${this.props.currentTeamUrl}/pl/${this.props.post.id}`);\n    }\n\n    handlePinMenuItemActivated = () => {\n        if (this.props.post.is_pinned) {\n            this.props.actions.unpinPost(this.props.post.id);\n        } else {\n            this.props.actions.pinPost(this.props.post.id);\n        }\n    }\n\n    handleUnreadMenuItemActivated = (e: React.MouseEvent) => {\n        e.preventDefault();\n        this.props.actions.markPostAsUnread(this.props.post, this.props.location);\n    }\n\n    handleDeleteMenuItemActivated = (e: React.MouseEvent) => {\n        e.preventDefault();\n\n        const deletePostModalData = {\n            ModalId: ModalIdentifiers.DELETE_POST,\n            dialogType: DeletePostModal,\n            dialogProps: {\n                post: this.props.post,\n                isRHS: this.props.location === Locations.RHS_ROOT || this.props.location === Locations.RHS_COMMENT,\n            },\n        };\n\n        this.props.actions.openModal(deletePostModalData);\n    }\n\n    handleEditMenuItemActivated = () => {\n        this.props.actions.setEditingPost(\n            this.props.post.id,\n            this.props.location === Locations.CENTER ? 'post_textbox' : 'reply_textbox',\n            this.props.post.root_id ? Utils.localizeMessage('rhs_comment.comment', 'Comment') : Utils.localizeMessage('create_post.post', 'Post'),\n            this.props.location === Locations.RHS_ROOT || this.props.location === Locations.RHS_COMMENT,\n        );\n    }\n\n    handleSetThreadFollow = () => {\n        const {actions, currentTeamId, threadId, userId, isFollowingThread} = this.props;\n        actions.setThreadFollow(\n            userId,\n            currentTeamId,\n            threadId,\n            !isFollowingThread,\n        );\n    }\n\n    tooltip = (\n        <Tooltip\n            id='dotmenu-icon-tooltip'\n            className='hidden-xs'\n        >\n            <FormattedMessage\n                id='post_info.dot_menu.tooltip.more_actions'\n                defaultMessage='More actions'\n            />\n        </Tooltip>\n    )\n\n    refCallback = (menuRef: Menu) => {\n        if (menuRef) {\n            const buttonRect = this.buttonRef.current?.getBoundingClientRect();\n            let y;\n            if (typeof buttonRect?.y === 'undefined') {\n                y = typeof buttonRect?.top == 'undefined' ? 0 : buttonRect?.top;\n            } else {\n                y = buttonRect?.y;\n            }\n            const windowHeight = window.innerHeight;\n\n            const totalSpace = windowHeight - MENU_BOTTOM_MARGIN;\n            const spaceOnTop = y - Constants.CHANNEL_HEADER_HEIGHT;\n            const spaceOnBottom = (totalSpace - (spaceOnTop + Constants.POST_AREA_HEIGHT));\n\n            this.setState({\n                openUp: (spaceOnTop > spaceOnBottom),\n            });\n        }\n    }\n\n    renderDivider = (suffix: string) => {\n        return (\n            <li\n                id={`divider_post_${this.props.post.id}_${suffix}`}\n                className='MenuItem__divider'\n                role='menuitem'\n            />\n        );\n    }\n\n    onClickAppBinding = async (binding: AppBinding) => {\n        const {post, intl} = this.props;\n\n        if (!binding.call) {\n            return;\n        }\n        const context = createCallContext(\n            binding.app_id,\n            binding.location,\n            this.props.post.channel_id,\n            this.props.teamId,\n            this.props.post.id,\n            this.props.post.root_id,\n        );\n        const call = createCallRequest(\n            binding.call,\n            context,\n            {\n                post: AppExpandLevels.ALL,\n            },\n        );\n\n        const res = await this.props.actions.doAppCall(call, AppCallTypes.SUBMIT, intl);\n\n        if (res.error) {\n            const errorResponse = res.error;\n            const errorMessage = errorResponse.error || intl.formatMessage({\n                id: 'apps.error.unknown',\n                defaultMessage: 'Unknown error occurred.',\n            });\n            this.props.actions.postEphemeralCallResponseForPost(errorResponse, errorMessage, post);\n            return;\n        }\n\n        const callResp = res.data!;\n        switch (callResp.type) {\n        case AppCallResponseTypes.OK:\n            if (callResp.markdown) {\n                this.props.actions.postEphemeralCallResponseForPost(callResp, callResp.markdown, post);\n            }\n            break;\n        case AppCallResponseTypes.NAVIGATE:\n        case AppCallResponseTypes.FORM:\n            break;\n        default: {\n            const errorMessage = intl.formatMessage({\n                id: 'apps.error.responses.unknown_type',\n                defaultMessage: 'App response type not supported. Response type: {type}.',\n            }, {\n                type: callResp.type,\n            });\n            this.props.actions.postEphemeralCallResponseForPost(callResp, errorMessage, post);\n        }\n        }\n    }\n\n    render() {\n        const isSystemMessage = PostUtils.isSystemMessage(this.props.post);\n        const isMobile = Utils.isMobile();\n\n        const pluginItems = this.props.pluginMenuItems?.\n            filter((item) => {\n                return item.filter ? item.filter(this.props.post.id) : item;\n            }).\n            map((item) => {\n                if (item.subMenu) {\n                    return (\n                        <Menu.ItemSubMenu\n                            key={item.id + '_pluginmenuitem'}\n                            id={item.id}\n                            postId={this.props.post.id}\n                            text={item.text}\n                            subMenu={item.subMenu}\n                            action={item.action}\n                            root={true}\n                        />\n                    );\n                }\n                return (\n                    <Menu.ItemAction\n                        key={item.id + '_pluginmenuitem'}\n                        text={item.text}\n                        onClick={() => {\n                            if (item.action) {\n                                item.action(this.props.post.id);\n                            }\n                        }}\n                    />\n                );\n            }) || [];\n\n        let appBindings = [] as JSX.Element[];\n        if (this.props.appsEnabled && this.props.appBindings) {\n            appBindings = this.props.appBindings.map((item) => {\n                let icon: JSX.Element | undefined;\n                if (item.icon) {\n                    icon = (<img src={item.icon}/>);\n                }\n\n                return (\n                    <Menu.ItemAction\n                        text={item.label}\n                        key={item.app_id + item.location}\n                        onClick={() => this.onClickAppBinding(item)}\n                        icon={icon}\n                    />\n                );\n            });\n        }\n\n        if (!this.state.canDelete && !this.state.canEdit && typeof pluginItems !== 'undefined' && pluginItems.length === 0 && isSystemMessage) {\n            return null;\n        }\n\n        return (\n            <MenuWrapper onToggle={this.props.handleDropdownOpened}>\n                <OverlayTrigger\n                    className='hidden-xs'\n                    delayShow={500}\n                    placement='top'\n                    overlay={this.tooltip}\n                    rootClose={true}\n                >\n                    <button\n                        ref={this.buttonRef}\n                        id={`${this.props.location}_button_${this.props.post.id}`}\n                        aria-label={Utils.localizeMessage('post_info.dot_menu.tooltip.more_actions', 'More actions').toLowerCase()}\n                        className={classNames('post-menu__item', {\n                            'post-menu__item--active': this.props.isMenuOpen,\n                        })}\n                        type='button'\n                        aria-expanded='false'\n                    >\n                        <DotsHorizontalIcon className={'icon icon--small'}/>\n                    </button>\n                </OverlayTrigger>\n                <Menu\n                    id={`${this.props.location}_dropdown_${this.props.post.id}`}\n                    openLeft={true}\n                    openUp={this.state.openUp}\n                    ref={this.refCallback}\n                    ariaLabel={Utils.localizeMessage('post_info.menuAriaLabel', 'Post extra options')}\n                >\n                    <Menu.ItemAction\n                        show={!isSystemMessage && this.props.location === Locations.CENTER}\n                        text={Utils.localizeMessage('post_info.reply', 'Reply')}\n                        onClick={this.props.handleCommentClick}\n                    />\n                    <ChannelPermissionGate\n                        channelId={this.props.post.channel_id}\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.ADD_REACTION]}\n                    >\n                        <Menu.ItemAction\n                            show={isMobile && !isSystemMessage && !this.props.isReadOnly && this.props.enableEmojiPicker}\n                            text={Utils.localizeMessage('rhs_root.mobile.add_reaction', 'Add Reaction')}\n                            onClick={this.handleAddReactionMenuItemActivated}\n                        />\n                    </ChannelPermissionGate>\n                    <Menu.ItemAction\n                        id={`follow_post_thread_${this.props.post.id}`}\n                        onClick={this.handleSetThreadFollow}\n                        show={(\n                            !isSystemMessage &&\n                            this.props.isCollapsedThreadsEnabled &&\n                                (\n                                    this.props.location === Locations.CENTER ||\n                                    this.props.location === Locations.RHS_ROOT ||\n                                    this.props.location === Locations.RHS_COMMENT\n                                )\n                        )}\n                        {...this.props.isFollowingThread ? {\n                            text: this.props.threadReplyCount ? Utils.localizeMessage('threading.threadMenu.unfollow', 'Unfollow thread') : Utils.localizeMessage('threading.threadMenu.unfollowMessage', 'Unfollow message'),\n                            extraText: Utils.localizeMessage('threading.threadMenu.unfollowExtra', 'You won’t be notified about replies'),\n                        } : {\n                            text: this.props.threadReplyCount ? Utils.localizeMessage('threading.threadMenu.follow', 'Follow thread') : Utils.localizeMessage('threading.threadMenu.followMessage', 'Follow message'),\n                            extraText: Utils.localizeMessage('threading.threadMenu.followExtra', 'You will be notified about replies'),\n                        }}\n                    />\n                    <Menu.ItemAction\n                        id={`unread_post_${this.props.post.id}`}\n                        show={!isSystemMessage && !this.props.channelIsArchived && this.props.location !== Locations.SEARCH}\n                        text={Utils.localizeMessage('post_info.unread', 'Mark as Unread')}\n                        onClick={this.handleUnreadMenuItemActivated}\n                    />\n                    <Menu.ItemAction\n                        id={`permalink_${this.props.post.id}`}\n                        show={!isSystemMessage}\n                        text={Utils.localizeMessage('post_info.permalink', 'Copy Link')}\n                        onClick={this.copyLink}\n                    />\n                    <Menu.ItemAction\n                        show={isMobile && !isSystemMessage && this.props.isFlagged}\n                        text={Utils.localizeMessage('rhs_root.mobile.unflag', 'Remove from Saved')}\n                        onClick={this.handleFlagMenuItemActivated}\n                    />\n                    <Menu.ItemAction\n                        show={isMobile && !isSystemMessage && !this.props.isFlagged}\n                        text={Utils.localizeMessage('rhs_root.mobile.flag', 'Save')}\n                        onClick={this.handleFlagMenuItemActivated}\n                    />\n                    <Menu.ItemAction\n                        id={`unpin_post_${this.props.post.id}`}\n                        show={!isSystemMessage && !this.props.isReadOnly && this.props.post.is_pinned}\n                        text={Utils.localizeMessage('post_info.unpin', 'Unpin')}\n                        onClick={this.handlePinMenuItemActivated}\n                    />\n                    <Menu.ItemAction\n                        id={`pin_post_${this.props.post.id}`}\n                        show={!isSystemMessage && !this.props.isReadOnly && !this.props.post.is_pinned}\n                        text={Utils.localizeMessage('post_info.pin', 'Pin')}\n                        onClick={this.handlePinMenuItemActivated}\n                    />\n                    {!isSystemMessage && (this.state.canEdit || this.state.canDelete) && this.renderDivider('edit')}\n                    <Menu.ItemAction\n                        id={`edit_post_${this.props.post.id}`}\n                        show={this.state.canEdit}\n                        text={Utils.localizeMessage('post_info.edit', 'Edit')}\n                        onClick={this.handleEditMenuItemActivated}\n                    />\n                    <Menu.ItemAction\n                        id={`delete_post_${this.props.post.id}`}\n                        show={this.state.canDelete}\n                        text={Utils.localizeMessage('post_info.del', 'Delete')}\n                        onClick={this.handleDeleteMenuItemActivated}\n                        isDangerous={true}\n                    />\n                    {((typeof pluginItems !== 'undefined' && pluginItems.length > 0) || appBindings.length > 0 || (this.props.components[PLUGGABLE_COMPONENT] && this.props.components[PLUGGABLE_COMPONENT].length > 0)) && this.renderDivider('plugins')}\n                    {pluginItems}\n                    {appBindings}\n                    <Pluggable\n                        postId={this.props.post.id}\n                        pluggableName={PLUGGABLE_COMPONENT}\n                    />\n                </Menu>\n            </MenuWrapper>\n        );\n    }\n}\n\nexport default injectIntl(DotMenuClass);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ComponentProps} from 'react';\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {getLicense, getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getCurrentTeamId, getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {appsEnabled, makeAppBindingsSelector} from 'mattermost-redux/selectors/entities/apps';\nimport {getThreadOrSynthetic} from 'mattermost-redux/selectors/entities/threads';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {AppBindingLocations} from 'mattermost-redux/constants/apps';\nimport {isSystemMessage} from 'mattermost-redux/utils/post_utils';\nimport {isCombinedUserActivityPost} from 'mattermost-redux/utils/post_list';\n\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\n\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {DoAppCall, PostEphemeralCallResponseForPost} from 'types/apps';\nimport {setThreadFollow} from 'mattermost-redux/actions/threads';\n\nimport {GlobalState} from 'types/store';\n\nimport {openModal} from 'actions/views/modals';\nimport {doAppCall, postEphemeralCallResponseForPost} from 'actions/apps';\n\nimport {\n    flagPost,\n    unflagPost,\n    pinPost,\n    unpinPost,\n    setEditingPost,\n    markPostAsUnread,\n} from 'actions/post_actions.jsx';\nimport * as PostUtils from 'utils/post_utils';\n\nimport {isArchivedChannel} from 'utils/channel_utils';\nimport {getSiteURL} from 'utils/url';\n\nimport {Locations} from 'utils/constants';\n\nimport DotMenu from './dot_menu';\n\ntype Props = {\n    post: Post;\n    isFlagged?: boolean;\n    handleCommentClick: React.EventHandler<React.MouseEvent>;\n    handleCardClick?: (post: Post) => void;\n    handleDropdownOpened: (open: boolean) => void;\n    handleAddReactionClick: () => void;\n    isMenuOpen: boolean;\n    isReadOnly: boolean | null;\n    enableEmojiPicker?: boolean;\n    location?: ComponentProps<typeof DotMenu>['location'];\n};\n\nconst getPostMenuBindings = makeAppBindingsSelector(AppBindingLocations.POST_MENU_ITEM);\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const {post} = ownProps;\n\n    const license = getLicense(state);\n    const config = getConfig(state);\n    const userId = getCurrentUserId(state);\n    const channel = getChannel(state, post.channel_id);\n    const currentTeam = getCurrentTeam(state) || {};\n    const currentTeamUrl = `${getSiteURL()}/${currentTeam.name}`;\n\n    const systemMessage = isSystemMessage(post);\n    const collapsedThreads = isCollapsedThreadsEnabled(state);\n\n    const rootId = post.root_id || post.id;\n    let threadId = rootId;\n    let isFollowingThread = false;\n    let threadReplyCount = 0;\n\n    if (\n        collapsedThreads &&\n        rootId && !systemMessage &&\n        (\n\n            // default prop location would be CENTER\n            !ownProps.location ||\n            ownProps.location === Locations.RHS_ROOT ||\n            ownProps.location === Locations.RHS_COMMENT ||\n            ownProps.location === Locations.CENTER\n        )\n    ) {\n        const root = getPost(state, rootId);\n        if (root) {\n            const thread = getThreadOrSynthetic(state, root);\n            threadReplyCount = thread.reply_count;\n            isFollowingThread = thread.is_following;\n            threadId = thread.id;\n        }\n    }\n\n    const apps = appsEnabled(state);\n    const showBindings = apps && !systemMessage && !isCombinedUserActivityPost(post.id);\n    const appBindings = showBindings ? getPostMenuBindings(state) : undefined;\n\n    return {\n        channelIsArchived: isArchivedChannel(channel),\n        components: state.plugins.components,\n        postEditTimeLimit: config.PostEditTimeLimit,\n        isLicensed: license.IsLicensed === 'true',\n        teamId: getCurrentTeamId(state),\n        pluginMenuItems: state.plugins.components.PostDropdownMenu,\n        canEdit: PostUtils.canEditPost(state, post, license, config, channel, userId),\n        canDelete: PostUtils.canDeletePost(state, post, channel),\n        currentTeamUrl,\n        currentTeamId: currentTeam.id,\n        userId,\n        threadId,\n        isFollowingThread,\n        isCollapsedThreadsEnabled: collapsedThreads,\n        threadReplyCount,\n        appBindings,\n        appsEnabled: apps,\n        ...ownProps,\n    };\n}\n\ntype Actions = {\n    flagPost: (postId: string) => void;\n    unflagPost: (postId: string) => void;\n    setEditingPost: (postId?: string, refocusId?: string, title?: string, isRHS?: boolean) => void;\n    pinPost: (postId: string) => void;\n    unpinPost: (postId: string) => void;\n    openModal: (postId: any) => void;\n    markPostAsUnread: (post: Post) => void;\n    doAppCall: DoAppCall;\n    postEphemeralCallResponseForPost: PostEphemeralCallResponseForPost;\n    setThreadFollow: (userId: string, teamId: string, threadId: string, newState: boolean) => void;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            flagPost,\n            unflagPost,\n            setEditingPost,\n            pinPost,\n            unpinPost,\n            openModal,\n            markPostAsUnread,\n            doAppCall,\n            postEphemeralCallResponseForPost,\n            setThreadFollow,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DotMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, CSSProperties} from 'react';\nimport ReactSelect, {Props as SelectProps, ActionMeta, components} from 'react-select';\nimport classNames from 'classnames';\n\nimport './dropdown_input.scss';\n\n// TODO: This component needs work, should not be used outside of AddressInfo until this comment is removed.\n\ntype ValueType = {\n    label: string;\n    value: string;\n}\n\ntype Props<T> = Omit<SelectProps<T>, 'onChange'> & {\n    value?: T;\n    legend?: string;\n    error?: string;\n    onChange: (value: T, action: ActionMeta<T>) => void;\n};\n\nconst baseStyles = {\n    input: (provided: CSSProperties) => ({\n        ...provided,\n        color: 'var(--center-channel-color)',\n    }),\n    control: (provided: CSSProperties) => ({\n        ...provided,\n        border: 'none',\n        boxShadow: 'none',\n        padding: '0 2px',\n        cursor: 'pointer',\n    }),\n    indicatorSeparator: (provided: CSSProperties) => ({\n        ...provided,\n        display: 'none',\n    }),\n};\n\nconst IndicatorsContainer = (props: any) => {\n    return (\n        <div className='DropdownInput__indicatorsContainer'>\n            <components.IndicatorsContainer {...props}>\n                <i className='icon icon-chevron-down'/>\n            </components.IndicatorsContainer>\n        </div>\n    );\n};\n\nconst Control = (props: any) => {\n    return (\n        <div className='DropdownInput__controlContainer'>\n            <components.Control {...props}/>\n        </div>\n    );\n};\n\nconst Option = (props: any) => {\n    return (\n        <div\n            className={classNames('DropdownInput__option', {\n                selected: props.isSelected,\n                focused: props.isFocused,\n            })}\n        >\n            <components.Option {...props}/>\n        </div>\n    );\n};\n\nconst renderError = (error?: string) => {\n    if (!error) {\n        return null;\n    }\n\n    return (\n        <div className='Input___error'>\n            <i className='icon icon-alert-outline'/>\n            <span>{error}</span>\n        </div>\n    );\n};\n\nconst DropdownInput = <T extends ValueType>(props: Props<T>) => {\n    const {value, placeholder, className, addon, name, textPrefix, legend, onChange, styles, options, error, ...otherProps} = props;\n\n    const [focused, setFocused] = useState(false);\n\n    const onInputFocus = (event: React.FocusEvent<HTMLElement>) => {\n        const {onFocus} = props;\n\n        setFocused(true);\n\n        if (onFocus) {\n            onFocus(event);\n        }\n    };\n\n    const onInputBlur = (event: React.FocusEvent<HTMLElement>) => {\n        const {onBlur} = props;\n\n        setFocused(false);\n\n        if (onBlur) {\n            onBlur(event);\n        }\n    };\n\n    const showLegend = Boolean(focused || value);\n\n    return (\n        <div className='DropdownInput Input_container'>\n            <fieldset\n                className={classNames('Input_fieldset', className, {\n                    Input_fieldset___error: error,\n                    Input_fieldset___legend: showLegend,\n                })}\n            >\n                <legend className={classNames('Input_legend', {Input_legend___focus: showLegend})}>\n                    {showLegend ? (legend || placeholder) : null}\n                </legend>\n                <div\n                    className='Input_wrapper'\n                    onFocus={onInputFocus}\n                    onBlur={onInputBlur}\n                >\n                    {textPrefix && <span>{textPrefix}</span>}\n                    <ReactSelect\n                        id={`DropdownInput_${name}`}\n                        options={options}\n                        placeholder={focused ? '' : placeholder}\n                        components={{\n                            IndicatorsContainer,\n                            Option,\n                            Control,\n                        }}\n                        className={classNames('Input', className, {Input__focus: showLegend})}\n                        classNamePrefix={'DropDown'}\n                        value={value}\n                        onChange={onChange as any} // types are not working correctly for multiselect\n                        styles={{...baseStyles, ...styles}}\n                        {...otherProps}\n                    />\n                </div>\n                {addon}\n            </fieldset>\n            {renderError(error)}\n        </div>\n    );\n};\n\nexport default DropdownInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {getEmojiImageUrl} from 'mattermost-redux/utils/emoji_utils';\n\nimport {getEmojiMap} from 'selectors/emojis';\nimport {GlobalState} from 'types/store';\n\ninterface ComponentProps {\n    emojiName: string;\n    size?: number;\n    emojiStyle?: React.CSSProperties;\n    onClick?: () => void;\n}\n\nconst RenderEmoji = ({emojiName, emojiStyle, size, onClick}: ComponentProps) => {\n    if (!emojiName) {\n        return null;\n    }\n\n    const emojiMap = useSelector((state: GlobalState) => getEmojiMap(state));\n    const emojiFromMap = emojiMap.get(emojiName);\n    if (!emojiFromMap) {\n        return null;\n    }\n    const emojiImageUrl = getEmojiImageUrl(emojiFromMap);\n\n    return (\n        <span\n            onClick={onClick}\n            className='emoticon'\n            alt={`:${emojiName}:`}\n            data-emoticon={emojiName}\n            style={{\n                backgroundImage: `url(${emojiImageUrl})`,\n                backgroundSize: size,\n                height: size,\n                width: size,\n                maxHeight: size,\n                maxWidth: size,\n                minHeight: size,\n                minWidth: size,\n                overflow: 'hidden',\n                ...emojiStyle,\n            }}\n        />\n    );\n};\n\nRenderEmoji.defaultProps = {\n    emoji: '',\n    emojiStyle: {},\n    size: 16,\n};\n\nexport default React.memo(RenderEmoji);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport Gfycat from 'gfycat-sdk';\nconst defaultKey = '2_KtH_W5';\nconst defaultSecret = '3wLVZPiswc3DnaiaFoLkDvB4X0IV6CpMkj4tf2inJRsBY6-FnkT08zGmppWFgeof';\nlet activeKey: string|null = null;\nlet activeSecret: string | null = null;\n\nlet instance: any = null;\nexport default function gfycatSdk(key: string, secret: string): any {\n    if (instance && activeKey === key && activeSecret === secret) {\n        return instance;\n    }\n\n    if (!key || !secret) {\n        instance = new Gfycat({client_id: defaultKey, client_secret: defaultSecret});\n        return instance;\n    }\n\n    activeKey = key;\n    activeSecret = secret;\n    instance = new Gfycat({client_id: key, client_secret: secret});\n    return instance;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {GifTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\nimport gfycatSdk from 'mattermost-redux/utils/gfycat_sdk';\nimport {DispatchFunc, GetStateFunc} from 'mattermost-redux/types/actions';\nimport {GlobalState} from 'mattermost-redux/types/store';\n\n// APP PROPS\n\nexport function saveAppPropsRequest(props: any) {\n    return {\n        type: GifTypes.SAVE_APP_PROPS,\n        props,\n    };\n}\n\nexport function saveAppProps(appProps: any) {\n    return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const {GfycatAPIKey, GfycatAPISecret} = getState().entities.general.config;\n        gfycatSdk(GfycatAPIKey!, GfycatAPISecret!).authenticate();\n        dispatch(saveAppPropsRequest(appProps));\n    };\n}\n\n// SEARCH\n\nexport function selectSearchText(searchText: string) {\n    return {\n        type: GifTypes.SELECT_SEARCH_TEXT,\n        searchText,\n    };\n}\n\nexport function updateSearchText(searchText: string) {\n    return {\n        type: GifTypes.UPDATE_SEARCH_TEXT,\n        searchText,\n    };\n}\n\nexport function searchBarTextSave(searchBarText: string) {\n    return {\n        type: GifTypes.SAVE_SEARCH_BAR_TEXT,\n        searchBarText,\n    };\n}\n\nexport function invalidateSearchText(searchText: string) {\n    return {\n        type: GifTypes.INVALIDATE_SEARCH_TEXT,\n        searchText,\n    };\n}\n\nexport function requestSearch(searchText: string) {\n    return {\n        type: GifTypes.REQUEST_SEARCH,\n        searchText,\n    };\n}\n\nexport function receiveSearch({searchText, count, start, json}: {searchText: string; count: number; start: number; json: any}) {\n    return {\n        type: GifTypes.RECEIVE_SEARCH,\n        searchText,\n        ...json,\n        count,\n        start,\n        currentPage: start / count,\n        receivedAt: Date.now(),\n    };\n}\n\nexport function receiveSearchEnd(searchText: string) {\n    return {\n        type: GifTypes.RECEIVE_SEARCH_END,\n        searchText,\n    };\n}\n\nexport function errorSearching(err: any, searchText: string) {\n    return {\n        type: GifTypes.SEARCH_FAILURE,\n        searchText,\n        err,\n    };\n}\n\nexport function receiveCategorySearch({tagName, json}: {tagName: string; json: any}) {\n    return {\n        type: GifTypes.RECEIVE_CATEGORY_SEARCH,\n        searchText: tagName,\n        ...json,\n        receiveAt: Date.now(),\n    };\n}\n\nexport function clearSearchResults() {\n    return {\n        type: GifTypes.CLEAR_SEARCH_RESULTS,\n    };\n}\n\nexport function requestSearchById(gfyId: string) {\n    return {\n        type: GifTypes.SEARCH_BY_ID_REQUEST,\n        payload: {\n            gfyId,\n        },\n    };\n}\n\nexport function receiveSearchById(gfyId: string, gfyItem: any) {\n    return {\n        type: GifTypes.SEARCH_BY_ID_SUCCESS,\n        payload: {\n            gfyId,\n            gfyItem,\n        },\n    };\n}\n\nexport function errorSearchById(err: any, gfyId: string) {\n    return {\n        type: GifTypes.SEARCH_BY_ID_FAILURE,\n        err,\n        gfyId,\n    };\n}\n\nexport function searchScrollPosition(scrollPosition: number) {\n    return {\n        type: GifTypes.SAVE_SEARCH_SCROLL_POSITION,\n        scrollPosition,\n    };\n}\n\nexport function searchPriorLocation(priorLocation: number) {\n    return {\n        type: GifTypes.SAVE_SEARCH_PRIOR_LOCATION,\n        priorLocation,\n    };\n}\n\nexport function searchGfycat({searchText, count = 30, startIndex = 0}: { searchText: string; count?: number; startIndex?: number}) {\n    let start = startIndex;\n    return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const {GfycatAPIKey, GfycatAPISecret} = getState().entities.general.config;\n        const {resultsByTerm} = getState().entities.gifs.search;\n        if (resultsByTerm[searchText]) {\n            start = resultsByTerm[searchText].start + count;\n        }\n        dispatch(requestSearch(searchText));\n        const sdk = gfycatSdk(GfycatAPIKey!, GfycatAPISecret!);\n        sdk.authenticate();\n        return sdk.search({search_text: searchText, count, start}).then((json: any) => {\n            if (json.errorMessage) {\n                // There was no results before\n                if (resultsByTerm[searchText].items) {\n                    dispatch(receiveSearchEnd(searchText));\n                } else {\n                    dispatch(errorSearching(json, searchText));\n                }\n            } else {\n                dispatch(updateSearchText(searchText));\n                dispatch(cacheGifsRequest(json.gfycats));\n                dispatch(receiveSearch({searchText, count, start, json}));\n\n                const context = getState().entities.gifs.categories.tagsDict[searchText] ?\n                    'category' :\n                    'search';\n                Client4.trackEvent(\n                    'gfycat',\n                    'views',\n                    {context, count: json.gfycats.length, keyword: searchText},\n                );\n            }\n        }).catch(\n            (err: any) => dispatch(errorSearching(err, searchText)),\n        );\n    };\n}\n\nexport function searchCategory({tagName = '', gfyCount = 30, cursorPos = undefined}) {\n    let cursor = cursorPos;\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const {GfycatAPIKey, GfycatAPISecret} = getState().entities.general.config;\n        const {resultsByTerm} = getState().entities.gifs.search;\n        if (resultsByTerm[tagName]) {\n            cursor = resultsByTerm[tagName].cursor;\n        }\n        dispatch(requestSearch(tagName));\n        return gfycatSdk(GfycatAPIKey!, GfycatAPISecret!).getTrendingCategories({tagName, gfyCount, cursor}).then(\n            (json: any) => {\n                if (json.errorMessage) {\n                    if (resultsByTerm[tagName].gfycats) {\n                        dispatch(receiveSearchEnd(tagName));\n                    } else {\n                        dispatch(errorSearching(json, tagName));\n                    }\n                } else {\n                    dispatch(updateSearchText(tagName));\n                    dispatch(cacheGifsRequest(json.gfycats));\n                    dispatch(receiveCategorySearch({tagName, json}));\n\n                    Client4.trackEvent(\n                        'gfycat',\n                        'views',\n                        {context: 'category', count: json.gfycats.length, keyword: tagName},\n                    );\n\n                    // preload categories list\n                    if (tagName === 'trending') {\n                        dispatch(requestCategoriesListIfNeeded() as any);\n                    }\n                }\n            },\n        ).catch((err: any) => dispatch(errorSearching(err, tagName)));\n    };\n}\n\nexport function shouldSearch(state: GlobalState, searchText: string) {\n    const resultsByTerm = state.entities.gifs.search.resultsByTerm[searchText];\n    if (!resultsByTerm) {\n        return true;\n    } else if (resultsByTerm.isFetching) {\n        return false;\n    } else if (resultsByTerm.moreRemaining) {\n        return true;\n    }\n    return resultsByTerm.didInvalidate;\n}\n\nexport function searchIfNeeded(searchText: string) {\n    return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        if (shouldSearch(getState(), searchText)) {\n            if (searchText.toLowerCase() === 'trending') {\n                return dispatch(searchCategory({tagName: searchText}));\n            }\n            return dispatch(searchGfycat({searchText}));\n        }\n        return Promise.resolve();\n    };\n}\n\nexport function searchIfNeededInitial(searchText: string) {\n    return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        dispatch(updateSearchText(searchText));\n        if (shouldSearchInitial(getState(), searchText)) {\n            if (searchText.toLowerCase() === 'trending') {\n                return dispatch(searchCategory({tagName: searchText}));\n            }\n            return dispatch(searchGfycat({searchText}));\n        }\n        return Promise.resolve();\n    };\n}\n\nexport function shouldSearchInitial(state: GlobalState, searchText: string) {\n    const resultsByTerm = state.entities.gifs.search.resultsByTerm[searchText];\n    if (!resultsByTerm) {\n        return true;\n    } else if (resultsByTerm.isFetching) {\n        return false;\n    }\n\n    return false;\n}\n\nexport function searchById(gfyId: string) {\n    return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const {GfycatAPIKey, GfycatAPISecret} = getState().entities.general.config;\n        dispatch(requestSearchById(gfyId));\n        return gfycatSdk(GfycatAPIKey!, GfycatAPISecret!).searchById({id: gfyId}).then(\n            (response: any) => {\n                dispatch(receiveSearchById(gfyId, response.gfyItem));\n                dispatch(cacheGifsRequest([response.gfyItem]));\n            },\n        ).catch((err: any) => dispatch(errorSearchById(err, gfyId)));\n    };\n}\n\nexport function shouldSearchById(state: GlobalState, gfyId: string) {\n    return !state.entities.gifs.cache.gifs[gfyId]; //TODO investigate, used to be !state.cache.gifs[gfyId];\n}\n\nexport function searchByIdIfNeeded(gfyId: string) {\n    return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        if (shouldSearchById(getState(), gfyId)) {\n            return dispatch(searchById(gfyId));\n        }\n\n        return Promise.resolve(getState().entities.gifs.cache.gifs[gfyId]); //TODO: investigate, used to be getState().cache.gifs[gfyId]\n    };\n}\n\nexport function saveSearchScrollPosition(scrollPosition: number) {\n    return (dispatch: DispatchFunc) => {\n        dispatch(searchScrollPosition(scrollPosition));\n    };\n}\n\nexport function saveSearchPriorLocation(priorLocation: number) {\n    return (dispatch: DispatchFunc) => {\n        dispatch(searchPriorLocation(priorLocation));\n    };\n}\n\nexport function searchTextUpdate(searchText: string) {\n    return (dispatch: DispatchFunc) => {\n        dispatch(updateSearchText(searchText));\n    };\n}\n\nexport function saveSearchBarText(searchBarText: string) {\n    return (dispatch: DispatchFunc) => {\n        dispatch(searchBarTextSave(searchBarText));\n    };\n}\n\n// CATEGORIES\n\nexport function categoriesListRequest() {\n    return {\n        type: GifTypes.REQUEST_CATEGORIES_LIST,\n    };\n}\n\nexport function categoriesListReceived(json: any) {\n    return {\n        type: GifTypes.CATEGORIES_LIST_RECEIVED,\n        ...json,\n    };\n}\n\nexport function categoriesListFailure(err: any) {\n    return {\n        type: GifTypes.CATEGORIES_LIST_FAILURE,\n        err,\n    };\n}\n\nexport function requestCategoriesList({count = 60} = {}) {\n    return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const {GfycatAPIKey, GfycatAPISecret} = getState().entities.general.config;\n        const state = getState().entities.gifs.categories;\n        if (!shouldRequestCategoriesList(state)) {\n            return Promise.resolve();\n        }\n        dispatch(categoriesListRequest());\n        const {cursor} = state;\n        const options = {\n            ...(count && {count}),\n            ...(cursor && {cursor}),\n        };\n        return gfycatSdk(GfycatAPIKey!, GfycatAPISecret!).getCategories(options).then((json: any) => {\n            const newGfycats = json.tags.reduce((gfycats: any[], tag: any) => {\n                if (tag.gfycats[0] && tag.gfycats[0].width) {\n                    return [...gfycats, ...tag.gfycats];\n                }\n                return gfycats;\n            }, []);\n            dispatch(cacheGifsRequest(newGfycats));\n            dispatch(categoriesListReceived(json));\n        }).catch(\n            (err: any) => {\n                dispatch(categoriesListFailure(err));\n            },\n        );\n    };\n}\n\nexport function requestCategoriesListIfNeeded({\n    count,\n} = {count: undefined}) {\n    return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState().entities.gifs.categories;\n        if (state.tagsList && state.tagsList.length) {\n            return Promise.resolve();\n        }\n        return dispatch(requestCategoriesList({count}));\n    };\n}\n\nexport function shouldRequestCategoriesList(state: {hasMore: boolean; isFetching: boolean; tagsList: any[]}) {\n    const {hasMore, isFetching, tagsList} = state;\n    if (!tagsList || !tagsList.length) {\n        return true;\n    } else if (isFetching) {\n        return false;\n    } else if (hasMore) {\n        return true;\n    }\n    return false;\n}\n\n// CACHE\n\nexport function cacheRequest() {\n    return {\n        type: GifTypes.CACHE_REQUEST,\n        payload: {\n            updating: true,\n        },\n    };\n}\n\nexport function cacheGifs(gifs: any) {\n    return {\n        type: GifTypes.CACHE_GIFS,\n        gifs,\n    };\n}\n\nexport function cacheGifsRequest(gifs: any) {\n    return async (dispatch: DispatchFunc) => {\n        dispatch(cacheRequest());\n        dispatch(cacheGifs(gifs));\n        return {data: true};\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport default {\n    ItemTapAction: {\n        OPEN_EMBED_PAGE: 1,\n        SHARE: 2,\n    },\n\n    Tab: {\n        TRENDING: 0,\n        REACTIONS: 1,\n    },\n\n    appName: {\n        mattermost: 'mattermost',\n    },\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nexport default class GifSearchIcon extends React.PureComponent<React.HTMLAttributes<HTMLSpanElement>> {\n    render() {\n        return (\n            <span {...this.props}>\n                <svg\n                    width='100%'\n                    height='100%'\n                    viewBox='-10 -10 40 40'\n                    version='1.1'\n                >\n                    <g\n                        id='ic_search'\n                        transform='matrix(0.959095,-9.6091e-18,-1.00189e-17,0.959095,-0.0633002,-0.777826)'\n                    >\n                        <path\n                            d='M2.648,15.872C3.433,16.658 4.376,17.287 5.454,17.758C6.553,18.229 7.698,18.454 8.888,18.454C10.728,18.454 12.389,17.938 13.893,16.905L18.18,21.192C18.494,21.506 18.854,21.664 19.302,21.664C19.751,21.664 20.111,21.506 20.447,21.192C20.761,20.855 20.919,20.496 20.919,20.047C20.919,19.621 20.761,19.239 20.447,18.925L16.16,14.638C17.193,13.134 17.709,11.473 17.709,9.633C17.709,8.443 17.484,7.298 17.013,6.198C16.542,5.121 15.913,4.178 15.128,3.393C14.342,2.607 13.399,1.979 12.322,1.507C11.222,1.036 10.077,0.811 8.888,0.811C7.698,0.811 6.553,1.036 5.454,1.507C4.376,1.979 3.433,2.607 2.648,3.393C1.862,4.178 1.234,5.121 0.762,6.198C0.291,7.298 0.066,8.443 0.066,9.633C0.066,10.822 0.291,11.967 0.762,13.067C1.234,14.144 1.862,15.087 2.648,15.872ZM8.888,4.021C10.436,4.021 11.761,4.56 12.861,5.66C13.96,6.76 14.499,8.084 14.499,9.633C14.499,11.181 13.96,12.506 12.861,13.606C11.761,14.705 10.436,15.244 8.888,15.244C7.339,15.244 6.015,14.705 4.915,13.606C3.815,12.506 3.276,11.181 3.276,9.633C3.276,8.084 3.815,6.76 4.915,5.66C6.015,4.56 7.339,4.021 8.888,4.021Z'\n                            style={{fill: 'inherit'}}\n                        />\n                    </g>\n                </svg>\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nexport default class GifSearchClearIcon extends React.PureComponent<React.HTMLAttributes<HTMLSpanElement>> {\n    render() {\n        return (\n            <span {...this.props}>\n                <svg\n                    width='100%'\n                    height='100%'\n                    viewBox='-10 -10 40 40'\n                    enableBackground='new 0 0 20 20'\n                    version='1.1'\n                >\n                    <g transform='matrix(0.952381,0,0,1,0,0)'>\n                        <path\n                            fill='inherit'\n                            d='M10.5 11.7L2.2 19.8C2 19.9 1.9 20 1.7 20 1.6 20 1.4 19.9 1.3 19.8L0.2 18.8C0.1 18.7 0 18.5 0 18.3 0 18.2 0.1 18 0.2 17.9L8.3 10 0.2 2.1C0.1 2 0 1.8 0 1.7 0 1.5 0.1 1.3 0.2 1.2L1.3 0.2C1.4 0.1 1.6 0 1.7 0 1.9 0 2 0.1 2.2 0.2L10.5 8.3 18.8 0.2C19 0.1 19.1 0 19.3 0 19.4 0 19.6 0.1 19.7 0.2L20.8 1.2C20.9 1.3 21 1.5 21 1.7 21 1.8 20.9 2 20.8 2.1L12.7 10 20.8 17.9C20.9 18 21 18.2 21 18.3 21 18.5 20.9 18.7 20.8 18.8L19.7 19.8C19.6 19.9 19.4 20 19.3 20 19.1 20 19 19.9 18.8 19.8L10.5 11.7Z'\n                        />\n                    </g>\n                </svg>\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport {connect} from 'react-redux';\n\nimport {saveSearchScrollPosition, saveSearchBarText, searchTextUpdate} from 'mattermost-redux/actions/gifs';\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\nimport {changeOpacity, makeStyleFromTheme} from 'mattermost-redux/utils/theme_utils';\n\nimport GifSearchIcon from 'components/widgets/icons/gif_search_icon';\nimport GifSearchClearIcon from 'components/widgets/icons/gif_search_clear_icon';\nimport LocalizedInput from 'components/localized_input/localized_input';\nimport {t} from 'utils/i18n.jsx';\n\nimport './SearchBar.scss';\n\nfunction mapStateToProps(state) {\n    return {\n        ...state.entities.gifs.categories,\n        ...state.entities.gifs.search,\n        theme: getTheme(state),\n        appProps: state.entities.gifs.app,\n    };\n}\n\nconst mapDispatchToProps = ({\n    saveSearchBarText,\n    saveSearchScrollPosition,\n    searchTextUpdate,\n});\n\nconst getStyle = makeStyleFromTheme((theme) => {\n    return {\n        background: {\n            backgroundColor: theme.centerChannelBg,\n        },\n        icon: {\n            fill: changeOpacity(theme.centerChannelColor, 0.4),\n        },\n        inputBackground: {\n            backgroundColor: theme.centerChannelBg,\n        },\n        input: {\n            borderColor: changeOpacity(theme.centerChannelColor, 0.12),\n        },\n    };\n});\n\nexport class SearchBar extends Component {\n    static propTypes = {\n        searchBarText: PropTypes.string,\n        tagsList: PropTypes.array,\n        theme: PropTypes.object.isRequired,\n        onTrending: PropTypes.func,\n        onSearch: PropTypes.func,\n        onCategories: PropTypes.func,\n        action: PropTypes.string,\n        saveSearchScrollPosition: PropTypes.func,\n        saveSearchBarText: PropTypes.func,\n        searchTextUpdate: PropTypes.func,\n        defaultSearchText: PropTypes.string,\n        handleSearchTextChange: PropTypes.func.isRequired,\n    }\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            inputFocused: false,\n        };\n\n        this.searchTimeout = null;\n\n        const defaultSearchText = this.props.defaultSearchText || '';\n\n        this.props.saveSearchBarText(defaultSearchText);\n        this.props.searchTextUpdate(defaultSearchText);\n    }\n\n    componentDidUpdate(prevProps) {\n        const {searchBarText} = this.props;\n\n        if (searchBarText !== prevProps.searchBarText) {\n            if (searchBarText === 'trending') {\n                this.updateSearchInputValue('');\n            } else {\n                this.updateSearchInputValue(searchBarText);\n            }\n        }\n    }\n\n    /**\n     * Returns text request with hyphens\n     */\n    parseSearchText = (searchText) => {\n        return searchText.trim().split(/ +/).join('-');\n    }\n\n    removeExtraSpaces = (searchText) => {\n        return searchText.trim().split(/ +/).join(' ');\n    }\n\n    updateSearchInputValue = (searchText) => {\n        this.searchInput.value = searchText;\n        this.props.saveSearchBarText(searchText);\n        this.props.handleSearchTextChange(searchText);\n    }\n\n    handleSubmit = (event) => {\n        event.preventDefault();\n        this.triggerSearch(this.searchInput.value);\n        this.searchInput.blur();\n    }\n\n    triggerSearch = (searchText) => {\n        const {onSearch} = this.props;\n        this.props.searchTextUpdate(this.parseSearchText(searchText));\n        onSearch();\n        this.props.saveSearchScrollPosition(0);\n    }\n\n    handleChange = (event) => {\n        clearTimeout(this.searchTimeout);\n\n        const searchText = event.target.value;\n\n        const {onCategories, action} = this.props;\n        this.props.saveSearchBarText(searchText);\n        this.props.handleSearchTextChange(searchText);\n\n        if (searchText === '') {\n            onCategories();\n        } else if (action !== 'reactions' || !this.isFilteredTags(searchText)) {\n            // not reactions page or there's no reactions for this search request\n            this.searchTimeout = setTimeout(() => {\n                this.triggerSearch(searchText);\n            }, 500);\n        }\n    }\n\n    focusInput = () => {\n        this.setState({inputFocused: true});\n    }\n\n    blurInput = () => {\n        this.setState({inputFocused: false});\n    }\n\n    /**\n     * Checks if there're reactions for a current searchText\n     */\n    isFilteredTags = (searchText) => {\n        var text = this.removeExtraSpaces(searchText);\n\n        const {tagsList} = this.props;\n        const substr = text.toLowerCase();\n        const filteredTags = tagsList && tagsList.length ? tagsList.filter((tag) => {\n            if (!text || tag.tagName.indexOf(substr) !== -1) {\n                return tag;\n            }\n            return '';\n        }) : [];\n\n        return Boolean(filteredTags.length);\n    }\n\n    clearSearchHandle = () => {\n        const {action, onTrending, onCategories} = this.props;\n        this.updateSearchInputValue('');\n        if (action === 'reactions') {\n            onCategories();\n        } else {\n            onTrending();\n        }\n    }\n\n    shouldComponentUpdate(nextProps, nextState) {\n        return ((!nextProps.searchBarText && this.props.searchBarText) ||\n            (nextProps.searchBarText && !this.props.searchBarText) ||\n            (nextState.inputFocused !== this.state.inputFocused) ||\n            (nextProps.searchBarText !== this.props.searchBarText));\n    }\n\n    render() {\n        const style = getStyle(this.props.theme);\n        const {searchBarText} = this.props;\n        const clearSearchButton = searchBarText ?\n            (\n                <GifSearchClearIcon\n                    className='ic-clear-search'\n                    style={style.icon}\n                    onClick={this.clearSearchHandle}\n                />\n            ) : null;\n\n        return (\n            <form\n                className='gfycat-search'\n                method='get'\n                target='_top'\n                noValidate=''\n                onSubmit={this.handleSubmit}\n            >\n                <div\n                    className='search-bar'\n                    style={style.background}\n                >\n                    <div\n                        className='search-input-bg'\n                        style={style.inputBackground}\n                    />\n                    <LocalizedInput\n                        className='search-input'\n                        name='searchText'\n                        autoFocus={true}\n                        placeholder={{id: t('gif_picker.gfycat'), defaultMessage: 'Search Gfycat'}}\n                        onChange={this.handleChange}\n                        autoComplete='off'\n                        autoCapitalize='off'\n                        onFocus={this.focusInput}\n                        onBlur={this.blurInput}\n                        ref={(input) => {\n                            this.searchInput = input;\n                            return input;\n                        }}\n                        style={style.input}\n                        value={searchBarText}\n                    />\n                    <GifSearchIcon\n                        className='ic ic-search'\n                        style={style.icon}\n                    />\n                    {clearSearchButton}\n                </div>\n                <button\n                    type='submit'\n                    className='submit-button'\n                />\n            </form>\n        );\n    }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SearchBar);\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nexport default class GifTrendingIcon extends React.PureComponent<React.HTMLAttributes<HTMLSpanElement>> {\n    render() {\n        return (\n            <span {...this.props}>\n                <svg\n                    className='ic-svg ic-trending-svg'\n                    width='11px'\n                    height='15px'\n                    viewBox='0 0 11 15'\n                    version='1.1'\n                >\n                    <g\n                        id='Finalized-Design'\n                        stroke='none'\n                        fill='inherit'\n                    >\n                        <g\n                            id='GfyCat---Gycat-Tab'\n                            transform='translate(-1212.000000, -619.000000)'\n                            fill='inherit'\n                        >\n                            <g\n                                id='modal---emojis'\n                                transform='translate(1147.000000, 542.000000)'\n                            >\n                                <g\n                                    id='tabs---gfycat'\n                                    transform='translate(1.000000, 68.000000)'\n                                >\n                                    <g id='tab---trending---selected'>\n                                        <path\n                                            d='M69.90625,10.4062776 C69.90625,10.9531513 70.0976562,11.4909106 70.4804688,12.019555 C70.6992188,12.32945 71.1276043,12.7760638 71.765625,13.3593956 C72.3489582,13.9062693 72.7773438,14.3346538 73.0507812,14.6445488 C73.5065106,15.1731932 73.8528644,15.7109525 74.0898438,16.2578262 C74.3632812,16.9505327 74.5,17.6979271 74.5,18.5000083 C74.5,19.4479229 74.2630207,20.3229208 73.7890625,21.1250021 C73.3151043,21.9270834 72.6770832,22.565103 71.875,23.03906 C71.0729168,23.5130171 70.1979168,23.7499958 69.25,23.7499958 C68.3020832,23.7499958 67.4270832,23.5130171 66.625,23.03906 C65.8229168,22.565103 65.1848957,21.9270834 64.7109375,21.1250021 C64.2369793,20.3229208 64,19.4479229 64,18.5000083 C64,17.6432397 64.2005207,16.8320436 64.6015625,16.0664204 C65.0026043,15.3007972 65.5494793,14.6718925 66.2421875,14.1797061 C66.4609375,14.0338733 66.6888019,14.0247585 66.9257812,14.1523625 C67.1627606,14.2799665 67.28125,14.4713723 67.28125,14.7265798 L67.28125,17.6250104 C67.28125,17.9349054 67.3860676,18.1946704 67.5957031,18.4043054 C67.8053387,18.6139405 68.0651043,18.7187578 68.375,18.7187578 C68.6848957,18.7187578 68.9446613,18.6139405 69.1542969,18.4043054 C69.3639324,18.1946704 69.46875,17.9349054 69.46875,17.6250104 C69.46875,17.4427191 69.4049481,17.2330844 69.2773438,16.9961057 C69.2044269,16.8320436 69.0677082,16.576836 68.8671875,16.2304825 C68.4661457,15.5742341 68.1835938,15.0547041 68.0195312,14.6718925 C67.7643231,13.9791859 67.6640625,13.2955938 67.71875,12.6211161 C67.8098957,11.7825763 68.1380207,10.9258077 68.703125,10.0508097 C68.8125,9.86851837 68.9628906,9.76825847 69.1542969,9.75002921 C69.3457031,9.73179994 69.5188801,9.78648731 69.6738281,9.91409132 C69.8287762,10.0416953 69.90625,10.2057574 69.90625,10.4062776 Z M69.2499875,22.437499 C69.9609233,22.437499 70.6171717,22.259765 71.2187328,21.9042971 C71.8202939,21.5488292 72.2988083,21.0703147 72.6542762,20.4687537 C73.0097441,19.8671926 73.1874781,19.2109441 73.1874781,18.5000083 C73.1874781,17.880218 73.0781034,17.3060006 72.8593539,16.7773562 C72.6588337,16.3398572 72.376282,15.9023583 72.0116996,15.4648593 C71.7929502,15.1914225 71.4329248,14.8131683 70.9316241,14.3300964 C70.4303233,13.8470245 70.070298,13.4687703 69.8515485,13.1953335 C69.4869662,12.7760638 69.2135294,12.3567937 69.031238,11.937524 C68.8671759,12.5573143 68.8945196,13.1953335 69.1132691,13.8515819 C69.2408731,14.2343935 69.5143099,14.7812672 69.9335796,15.492203 C70.2252457,15.9661601 70.4166515,16.321628 70.507797,16.5586067 C70.6900884,16.9414183 70.7812338,17.2968862 70.7812338,17.6250104 C70.7812338,18.2812589 70.5442551,18.8463618 70.070298,19.3203189 C69.596341,19.794276 69.031238,20.0312547 68.3749896,20.0312547 C67.7187411,20.0312547 67.1536382,19.794276 66.6796811,19.3203189 C66.205724,18.8463618 65.9687453,18.2812589 65.9687453,17.6250104 L65.9687453,16.0937641 C65.7682251,16.403659 65.60872,16.7819136 65.4902308,17.228527 C65.3717417,17.6751404 65.3124969,18.0989675 65.3124969,18.5000083 C65.3124969,19.2109441 65.4902308,19.8671926 65.8456987,20.4687537 C66.2011666,21.0703147 66.6796811,21.5488292 67.2812422,21.9042971 C67.8828032,22.259765 68.5390517,22.437499 69.2499875,22.437499 Z'\n                                            id='icon---trending'\n                                        />\n                                    </g>\n                                </g>\n                            </g>\n                        </g>\n                    </g>\n                </svg>\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nexport default class GifReactionsIcon extends React.PureComponent<React.HTMLAttributes<HTMLSpanElement>> {\n    render() {\n        return (\n            <span {...this.props}>\n                <svg\n                    className='ic-svg ic-reactions-svg'\n                    width='14px'\n                    height='14px'\n                    viewBox='0 0 14 14'\n                    version='1.1'\n                >\n                    <g\n                        id='Finalized-Design'\n                        stroke='none'\n                        fill='inherit'\n                    >\n                        <g\n                            id='GfyCat---Gycat-Tab'\n                            transform='translate(-1348.000000, -620.000000)'\n                            fill='inherit'\n                        >\n                            <g\n                                id='modal---emojis'\n                                transform='translate(1147.000000, 542.000000)'\n                            >\n                                <g\n                                    id='tabs---gfycat'\n                                    transform='translate(1.000000, 68.000000)'\n                                >\n                                    <g\n                                        id='tab---category---deselected'\n                                        transform='translate(138.000000, 0.000000)'\n                                    >\n                                        <path\n                                            d='M62,16 L62,10 L68,10 L68,16 L62,16 Z M64,12 L64,14 L66,14 L66,12 L64,12 Z M70,24 L70,18 L76,18 L76,24 L70,24 Z M72,20 L72,22 L74,22 L74,20 L72,20 Z M70,10 L76,10 L76,16 L70,16 L70,10 Z M74,14 L74,12 L72,12 L72,14 L74,14 Z M62,24 L62,18 L68,18 L68,24 L62,24 Z M64,20 L64,22 L66,22 L66,20 L64,20 Z'\n                                            id='icon---categories'\n                                        />\n                                    </g>\n                                </g>\n                            </g>\n                        </g>\n                    </g>\n                </svg>\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent} from 'react';\nimport PropTypes from 'prop-types';\nimport {connect} from 'react-redux';\n\nimport {saveSearchBarText, searchTextUpdate} from 'mattermost-redux/actions/gifs';\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\nimport {changeOpacity, makeStyleFromTheme} from 'mattermost-redux/utils/theme_utils';\n\nimport constants from 'components/gif_picker/utils/constants';\nimport SearchBar from 'components/gif_picker/components/SearchBar';\nimport GifTrendingIcon from 'components/widgets/icons/gif_trending_icon';\nimport GifReactionsIcon from 'components/widgets/icons/gif_reactions_icon';\nimport './Header.scss';\n\nfunction mapStateToProps(state) {\n    return {\n        theme: getTheme(state),\n    };\n}\n\nconst mapDispatchToProps = ({\n    saveSearchBarText,\n    searchTextUpdate,\n});\n\nconst getStyle = makeStyleFromTheme((theme) => {\n    return {\n        background: {\n            backgroundColor: theme.centerChannelBg,\n        },\n        header: {\n            borderBottomColor: changeOpacity(theme.centerChannelColor, 0.2),\n        },\n        icon: {\n            fill: changeOpacity(theme.centerChannelColor, 0.3),\n        },\n        iconActive: {\n            fill: theme.centerChannelColor,\n        },\n        iconHover: {\n            fill: changeOpacity(theme.centerChannelColor, 0.8),\n        },\n    };\n});\n\nexport class Header extends PureComponent {\n    static propTypes = {\n        action: PropTypes.string,\n        appProps: PropTypes.object,\n        saveSearchBarText: PropTypes.func,\n        searchTextUpdate: PropTypes.func,\n        theme: PropTypes.object.isRequired,\n        defaultSearchText: PropTypes.string,\n        handleSearchTextChange: PropTypes.func.isRequired,\n    }\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            hovering: '',\n        };\n    }\n\n    render() {\n        const style = getStyle(this.props.theme);\n\n        return (\n            <header\n                className='header-container'\n                style={style.background}\n            >\n                <SearchBar {...this.props}/>\n                <nav\n                    className='nav-bar'\n                    style={style.header}\n                >\n                    {this.renderTabs(this.props, style)}\n                </nav>\n            </header>\n        );\n    }\n\n    renderTabs(props, style) {\n        const {appProps, onTrending, onCategories} = props;\n        const {header} = appProps;\n        return header.tabs.map((tab, index) => {\n            let link;\n            if (tab === constants.Tab.TRENDING) {\n                link = this.renderTab('trending', onTrending, GifTrendingIcon, index, style);\n            } else if (tab === constants.Tab.REACTIONS) {\n                link = this.renderTab('reactions', onCategories, GifReactionsIcon, index, style);\n            }\n            return link;\n        });\n    }\n\n    renderTab(name, callback, Icon, index, style) {\n        var props = this.props;\n        const {action} = props;\n        function callbackWrapper() {\n            props.searchTextUpdate('');\n            props.saveSearchBarText('');\n            callback();\n        }\n        return (\n            <a\n                onClick={callbackWrapper}\n                onMouseOver={() => {\n                    this.setState({hovering: name});\n                }}\n                onMouseOut={() => {\n                    this.setState({hovering: ''});\n                }}\n                style={{cursor: 'pointer'}}\n                key={index}\n            >\n                <div style={{paddingTop: '2px'}}>\n                    <Icon\n                        style={(() => {\n                            if (this.state.hovering === name) {\n                                return style.iconHover;\n                            }\n                            return action === name ? style.iconActive : style.icon;\n                        })()}\n                    />\n                </div>\n            </a>\n        );\n    }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Header);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent} from 'react';\nimport PropTypes from 'prop-types';\nimport {connect} from 'react-redux';\n\nimport {saveAppProps} from 'mattermost-redux/actions/gifs';\n\nimport Header from 'components/gif_picker/components/Header';\n\nconst mapDispatchToProps = ({\n    saveAppProps,\n});\n\nexport class App extends PureComponent {\n    static propTypes = {\n        appProps: PropTypes.object,\n        action: PropTypes.string,\n        onCategories: PropTypes.func,\n        onSearch: PropTypes.func,\n        onTrending: PropTypes.func,\n        children: PropTypes.object,\n        saveAppProps: PropTypes.func,\n        authenticateSdk: PropTypes.func,\n        defaultSearchText: PropTypes.string,\n        handleSearchTextChange: PropTypes.func.isRequired,\n    }\n\n    constructor(props) {\n        super(props);\n        const {appProps} = this.props;\n        this.props.saveAppProps(appProps);\n    }\n\n    render() {\n        const {\n            appProps,\n            action,\n            onCategories,\n            onSearch,\n            onTrending,\n            children,\n            defaultSearchText,\n            handleSearchTextChange,\n        } = this.props;\n        const appClassName = 'main-container ' + (appProps.appClassName || '');\n        return (\n            <div className={appClassName}>\n                <Header\n                    appProps={appProps}\n                    action={action}\n                    onCategories={onCategories}\n                    onSearch={onSearch}\n                    onTrending={onTrending}\n                    defaultSearchText={defaultSearchText}\n                    handleSearchTextChange={handleSearchTextChange}\n                />\n                <div className='component-container'>\n                    {children}\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default connect(null, mapDispatchToProps)(App);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent} from 'react';\nimport PropTypes from 'prop-types';\nimport {connect} from 'react-redux';\n\nimport {requestCategoriesList, requestCategoriesListIfNeeded, saveSearchBarText, saveSearchScrollPosition, searchTextUpdate} from 'mattermost-redux/actions/gifs';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\nimport * as PostUtils from 'utils/post_utils';\n\nimport InfiniteScroll from 'components/gif_picker/components/InfiniteScroll';\n\nimport './Categories.scss';\n\nfunction mapStateToProps(state) {\n    return {\n        ...state.entities.gifs.categories,\n        ...state.entities.gifs.cache,\n        appProps: state.entities.gifs.app,\n        searchText: state.entities.gifs.search.searchText,\n        searchBarText: state.entities.gifs.search.searchBarText,\n        hasImageProxy: state.entities.general.config.HasImageProxy,\n    };\n}\n\nconst mapDispatchToProps = ({\n    saveSearchBarText,\n    saveSearchScrollPosition,\n    searchTextUpdate,\n    requestCategoriesList,\n    requestCategoriesListIfNeeded,\n});\n\nexport class Categories extends PureComponent {\n    static propTypes = {\n        appProps: PropTypes.object,\n        gifs: PropTypes.object,\n        hasMore: PropTypes.bool,\n        onSearch: PropTypes.func,\n        onTrending: PropTypes.func,\n        requestCategoriesList: PropTypes.func,\n        requestCategoriesListIfNeeded: PropTypes.func,\n        saveSearchBarText: PropTypes.func,\n        saveSearchScrollPosition: PropTypes.func,\n        searchTextUpdate: PropTypes.func,\n        searchBarText: PropTypes.string,\n        tagsList: PropTypes.array,\n        hasImageProxy: PropTypes.string,\n    }\n\n    componentDidMount() {\n        window.scrollTo(0, 0);\n        this.props.requestCategoriesListIfNeeded();\n        this.sendImpressions();\n    }\n\n    sendImpressions = () => {\n        const {tagsList} = this.props;\n        const gfycats = tagsList.map((tag) => {\n            return {gfyId: tag.gfyId};\n        });\n\n        if (gfycats.length) {\n            trackEvent('gfycat', 'views', {context: 'category_list', count: gfycats.length});\n        }\n    }\n\n    componentWillUnmount() {\n        this.props.saveSearchScrollPosition(0);\n    }\n\n    filterTagsList = () => {\n        const {searchBarText, tagsList} = this.props;\n\n        const substr = searchBarText.toLowerCase().trim().split(/ +/).join(' ');\n        return tagsList && tagsList.length ? tagsList.filter((tag) => {\n            if (!searchBarText || tag.tagName.indexOf(substr) !== -1) {\n                return tag;\n            }\n            return '';\n        }) : [];\n    }\n\n    loadMore = () => {\n        this.props.requestCategoriesList();\n    }\n\n    render() {\n        const {hasMore, tagsList, gifs, onSearch, onTrending, hasImageProxy} = this.props;\n\n        const content = tagsList && tagsList.length ? this.filterTagsList(tagsList).map((item, index) => {\n            const {tagName, gfyId} = item;\n\n            if (!gifs[gfyId]) {\n                return null;\n            }\n\n            const gfyItem = gifs[gfyId];\n            const {max1mbGif, avgColor} = gfyItem;\n            const url = PostUtils.getImageSrc(max1mbGif, hasImageProxy === 'true');\n            const searchText = tagName.replace(/\\s/g, '-');\n            const backgroundImage = {backgroundImage: `url(${url}`};\n            const backgroundColor = {backgroundColor: avgColor};\n            const props = this.props;\n            function callback() {\n                props.searchTextUpdate(tagName);\n                props.saveSearchBarText(tagName);\n                if (searchText === 'trending') {\n                    onTrending();\n                } else {\n                    onSearch();\n                }\n            }\n            return (\n                <a\n                    onClick={callback}\n                    key={index}\n                >\n                    <div className='category-container'>\n                        <div\n                            className='category'\n                            style={{...backgroundImage, ...backgroundColor}}\n                        >\n                            <div className='category-name'>{tagName}</div>\n                        </div>\n                    </div>\n                </a>\n            );\n        }) : [];\n\n        return content && content.length ? (\n            <div\n                className='categories-container'\n            >\n                <InfiniteScroll\n                    hasMore={hasMore}\n                    loadMore={this.loadMore}\n                    threshold={1}\n                >\n                    {content}\n                </InfiniteScroll>\n            </div>\n        ) : (\n            <div\n                className='categories-container'\n            />\n        );\n    }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Categories);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent} from 'react';\nimport {connect} from 'react-redux';\n\nimport PropTypes from 'prop-types';\n\nimport './SearchItem.scss';\nimport * as PostUtils from 'utils/post_utils';\n\nfunction mapStateToProps(state) {\n    return {\n        hasImageProxy: state.entities.general.config.HasImageProxy,\n    };\n}\n\nexport class SearchItem extends PureComponent {\n    static propTypes = {\n        gfyItem: PropTypes.object,\n        top: PropTypes.string,\n        left: PropTypes.string,\n        itemWidth: PropTypes.number,\n        itemClickHandler: PropTypes.func,\n        hasImageProxy: PropTypes.string,\n    }\n\n    render() {\n        const {\n            gfyItem,\n            top,\n            left,\n            itemWidth,\n            itemClickHandler,\n        } = this.props;\n\n        const {width, height, max1mbGif, avgColor} = gfyItem;\n        const {hasImageProxy} = this.props;\n        const url = PostUtils.getImageSrc(max1mbGif, hasImageProxy === 'true');\n\n        const backgroundImage = {backgroundImage: `url(${url})`};\n        const backgroundColor = {backgroundColor: avgColor};\n        const paddingBottom = {paddingBottom: ((itemWidth / width) * height) + 'px'};\n\n        return (\n            <div\n                className='search-item-wrapper'\n                style={{top, left, width: itemWidth ? `${itemWidth}px` : ''}}\n            >\n                <div\n                    className='search-item'\n                    style={{...backgroundImage, ...backgroundColor, ...paddingBottom}}\n                    onClick={() => itemClickHandler(gfyItem)}\n                />\n            </div>\n        );\n    }\n}\n\nexport default connect(mapStateToProps)(SearchItem);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent} from 'react';\nimport PropTypes from 'prop-types';\nimport {connect} from 'react-redux';\n\nimport {saveSearchScrollPosition} from 'mattermost-redux/actions/gifs';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport NoResultsIndicator from 'components/no_results_indicator/no_results_indicator.tsx';\nimport {NoResultsVariant} from 'components/no_results_indicator/types';\n\nimport InfiniteScroll from 'components/gif_picker/components/InfiniteScroll';\nimport SearchItem from 'components/gif_picker/components/SearchItem';\n\nimport './SearchGrid.scss';\n\nconst ITEMS_PADDING = 8;\nconst NUMBER_OF_COLUMNS_PORTRAIT = 2;\nconst NUMBER_OF_COLUMNS_LANDSCAPE = 2;\nconst WEBKIT_SCROLLBAR_WIDTH = 8;\n\nfunction mapStateToProps(state) {\n    return {\n        ...state.entities.gifs.cache,\n        ...state.entities.gifs.search,\n        appProps: state.entities.gifs.app,\n    };\n}\n\nconst mapDispatchToProps = ({\n    saveSearchScrollPosition,\n});\n\nexport class SearchGrid extends PureComponent {\n    static propTypes = {\n        appProps: PropTypes.object,\n        gifs: PropTypes.object,\n        resultsByTerm: PropTypes.object,\n        containerClassName: PropTypes.string,\n        keyword: PropTypes.string, // searchText, tagName\n        handleItemClick: PropTypes.func,\n        loadMore: PropTypes.func,\n        numberOfColumns: PropTypes.number,\n        scrollPosition: PropTypes.number,\n        saveSearchScrollPosition: PropTypes.func,\n    }\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            containerWidth: null,\n        };\n        this.scrollPosition = this.props.scrollPosition;\n        this.setNumberOfColumns();\n\n        /**\n         * Inital values for columns heights\n         */\n        this.columnsHeights = Array(this.numberOfColumns).fill(0);\n\n        /**\n         * Items padding value\n         */\n        this.padding = ITEMS_PADDING;\n    }\n\n    componentDidMount() {\n        this.container = document.getElementById('search-grid-container');\n        // eslint-disable-next-line react/no-did-mount-set-state\n        this.setState({\n            ...this.state,\n            containerWidth: this.container.offsetWidth - WEBKIT_SCROLLBAR_WIDTH,\n        });\n        window.addEventListener('resize', this.resizeHandler);\n        window.addEventListener('scroll', this.scrollHandler);\n    }\n\n    componentDidUpdate(prevProps) {\n        if (prevProps.keyword !== this.props.keyword) {\n            window.scrollTo(0, 0);\n        }\n    }\n\n    componentWillUnmount() {\n        const {keyword} = this.props;\n        if (keyword !== 'trending') {\n            this.props.saveSearchScrollPosition(this.scrollPosition);\n        }\n\n        window.removeEventListener('resize', this.resizeHandler);\n        window.removeEventListener('scroll', this.scrollHandler);\n    }\n\n    setNumberOfColumns = () => {\n        if (window.matchMedia('(orientation: portrait)').matches) {\n            this.numberOfColumns = NUMBER_OF_COLUMNS_PORTRAIT;\n        } else {\n            this.numberOfColumns = NUMBER_OF_COLUMNS_LANDSCAPE;\n        }\n    }\n\n    itemClickHandler = (gfyItem) => {\n        const {keyword, handleItemClick} = this.props;\n        this.props.saveSearchScrollPosition(this.scrollPosition);\n\n        trackEvent('gfycat', 'shares', {gfyid: gfyItem.gfyId, keyword});\n        handleItemClick(gfyItem);\n    }\n\n    minHeightColumnIndex = () => {\n        return this.columnsHeights.indexOf(Math.min(...this.columnsHeights));\n    }\n\n    maxHeightColumnIndex = () => {\n        return this.columnsHeights.indexOf(Math.max(...this.columnsHeights));\n    }\n\n    maxColumnHeight = () => {\n        return Math.max(...this.columnsHeights);\n    }\n\n    resizeHandler = () => {\n        if (this.state.containerWidth !== this.container.offsetWidth - WEBKIT_SCROLLBAR_WIDTH) {\n            this.setNumberOfColumns();\n            this.setState({\n                ...this.state,\n                containerWidth: this.container.offsetWidth - WEBKIT_SCROLLBAR_WIDTH,\n            });\n            this.columnsHeights = Array(this.numberOfColumns).fill(0);\n        }\n    }\n\n    scrollHandler = () => {\n        this.scrollPosition = window.scrollY;\n    }\n\n    render() {\n        const {\n            containerClassName,\n            gifs,\n            keyword,\n            resultsByTerm,\n            scrollPosition,\n            loadMore,\n        } = this.props;\n\n        const {containerWidth} = this.state;\n        const {moreRemaining, items = [], isEmpty = items.length === 0, isFetching} = resultsByTerm[keyword] ? resultsByTerm[keyword] : {};\n\n        /**\n         * Columns 'left' values\n         */\n        const columnWidth = parseInt(containerWidth / this.numberOfColumns, 10);\n        const leftPosition = Array(this.numberOfColumns).fill(0).map((item, index) => this.padding + ((index * columnWidth) - (index * (this.padding / 2))));\n\n        this.columnsHeights = Array(this.numberOfColumns).fill(this.padding);\n\n        // Item width in %\n        //const itemWidth = this.numberOfColumns === NUMBER_OF_COLUMNS_PORTRAIT ? 100 / NUMBER_OF_COLUMNS_PORTRAIT : 100 / this.numberOfColumns;\n        const itemWidth = 140;\n\n        const searchItems = containerWidth && items.length ?\n            items.map((item, index) => {\n                const gfyItem = gifs[item];\n                const {gfyId} = gfyItem;\n\n                // Position calculation\n                const colIndex = this.minHeightColumnIndex();\n                const top = this.columnsHeights[colIndex] + 'px';\n                const left = leftPosition[colIndex] + 'px';\n                const itemHeight = ((itemWidth / gfyItem.width) * gfyItem.height) + this.padding;\n                this.columnsHeights[colIndex] += itemHeight;\n\n                return (\n                    <SearchItem\n                        gfyItem={gfyItem}\n                        top={top}\n                        left={left}\n                        itemWidth={itemWidth}\n                        itemClickHandler={this.itemClickHandler}\n                        key={`${index}-${gfyId}`}\n                    />\n                );\n            }) : null;\n\n        this.containerHeight = this.maxColumnHeight();\n\n        const content = searchItems ? (\n            <InfiniteScroll\n                className='search-grid-infinite-scroll'\n                pageStart={0}\n                loadMore={loadMore}\n                initialLoad={false}\n                hasMore={moreRemaining}\n                threshold={1}\n                containerHeight={this.containerHeight}\n                scrollPosition={scrollPosition}\n                useWindow={false}\n            >\n                {searchItems}\n            </InfiniteScroll>\n        ) : null;\n\n        const emptySearch = !isFetching && isEmpty ? (\n            <NoResultsIndicator\n                variant={NoResultsVariant.ChannelSearch}\n                titleValues={{channelName: `\"${keyword}\"`}}\n            />\n        ) : null;\n\n        return (\n            <div\n                id='search-grid-container'\n                className={`search-grid-container ${containerClassName}`}\n            >\n                {content}\n                {emptySearch}\n            </div>\n        );\n    }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SearchGrid);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {saveSearchScrollPosition} from 'mattermost-redux/actions/gifs';\n\nimport SearchGrid from './SearchGrid';\n\nfunction mapStateToProps(state) {\n    return {\n        ...state.entities.gifs.cache,\n        ...state.entities.gifs.search,\n        appProps: state.entities.gifs.app,\n    };\n}\n\nfunction mapDispatchToProps() {\n    return {\n        saveSearchScrollPosition,\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SearchGrid);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent} from 'react';\nimport PropTypes from 'prop-types';\nimport {connect} from 'react-redux';\n\nimport {searchIfNeededInitial, searchGfycat} from 'mattermost-redux/actions/gifs';\n\nimport SearchGrid from 'components/gif_picker/components/SearchGrid';\n\nfunction mapStateToProps(state) {\n    return {\n        ...state.entities.gifs.search,\n    };\n}\n\nconst mapDispatchToProps = ({\n    searchGfycat,\n    searchIfNeededInitial,\n});\n\nexport class Search extends PureComponent {\n    static propTypes = {\n        handleItemClick: PropTypes.func,\n        onCategories: PropTypes.func,\n        searchText: PropTypes.string,\n        searchIfNeededInitial: PropTypes.func,\n        searchGfycat: PropTypes.func,\n    }\n\n    componentDidMount() {\n        const {searchText} = this.props;\n        this.props.searchIfNeededInitial(searchText.split('-').join(' '));\n    }\n\n    componentDidUpdate(prevProps) {\n        const {searchText} = this.props;\n        if (prevProps.searchText !== searchText) {\n            this.props.searchIfNeededInitial(searchText.split('-').join(' '));\n        }\n    }\n\n    loadMore = () => {\n        const {searchText} = this.props;\n        this.props.searchGfycat({searchText});\n    }\n\n    render() {\n        const {handleItemClick, searchText, onCategories} = this.props;\n\n        return (\n            <SearchGrid\n                keyword={searchText}\n                handleItemClick={handleItemClick}\n                onCategories={onCategories}\n                loadMore={this.loadMore}\n            />\n        );\n    }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Search);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent} from 'react';\nimport PropTypes from 'prop-types';\nimport {connect} from 'react-redux';\n\nimport {\n    searchCategory,\n    searchIfNeededInitial,\n    saveSearchScrollPosition,\n} from 'mattermost-redux/actions/gifs';\n\nimport SearchGrid from 'components/gif_picker/components/SearchGrid';\n\nconst mapDispatchToProps = ({\n    searchCategory,\n    searchIfNeededInitial,\n    saveSearchScrollPosition,\n});\n\nexport class Trending extends PureComponent {\n    static propTypes = {\n        handleItemClick: PropTypes.func,\n        onCategories: PropTypes.func,\n        searchCategory: PropTypes.func,\n        searchIfNeededInitial: PropTypes.func,\n        saveSearchScrollPosition: PropTypes.func,\n    }\n\n    componentDidMount() {\n        this.props.searchIfNeededInitial('trending');\n    }\n\n    componentWillUnmount() {\n        this.props.saveSearchScrollPosition(0);\n    }\n\n    loadMore = () => {\n        this.props.searchCategory({tagName: 'trending'});\n    }\n\n    render() {\n        const {handleItemClick, onCategories} = this.props;\n        return (\n            <SearchGrid\n                keyword='trending'\n                handleItemClick={handleItemClick}\n                onCategories={onCategories}\n                loadMore={this.loadMore}\n            />\n        );\n    }\n}\n\nexport default connect(null, mapDispatchToProps)(Trending);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nimport App from 'components/gif_picker/components/App';\nimport Categories from 'components/gif_picker/components/Categories';\nimport Search from 'components/gif_picker/components/Search';\nimport Trending from 'components/gif_picker/components/Trending';\nimport constants from 'components/gif_picker/utils/constants';\n\nexport const appProps = {\n    appName: constants.appName.mattermost,\n    basePath: '/mattermost',\n    itemTapType: constants.ItemTapAction.SHARE,\n    appClassName: 'gfycat',\n    shareEvent: 'shareMattermost',\n    appId: 'mattermostwebviews',\n    enableHistory: true,\n    header: {\n        tabs: [constants.Tab.TRENDING, constants.Tab.REACTIONS],\n        displayText: false,\n    },\n};\n\nexport default class GifPicker extends React.PureComponent {\n    static propTypes = {\n        onGifClick: PropTypes.func.isRequired,\n        defaultSearchText: PropTypes.string,\n        handleSearchTextChange: PropTypes.func.isRequired,\n    }\n\n    constructor(props) {\n        super(props);\n\n        const action = props.defaultSearchText ? 'search' : 'trending';\n        this.state = {\n            action,\n        };\n    }\n\n    handleTrending = () => {\n        this.setState({\n            action: 'trending',\n        });\n    }\n\n    handleCategories = () => {\n        this.setState({\n            action: 'reactions',\n        });\n    }\n\n    handleSearch = () => {\n        this.setState({\n            action: 'search',\n        });\n    }\n\n    handleItemClick = (gif) => {\n        this.props.onGifClick('![' + gif.title.replace(/]|\\[/g, '\\\\$&') + '](' + gif.max5mbGif + ')');\n    }\n\n    render() {\n        const {action} = this.state;\n        let component;\n        switch (action) {\n        case 'reactions':\n            component = (\n                <Categories\n                    appProps={appProps}\n                    onTrending={this.handleTrending}\n                    onSearch={this.handleSearch}\n                />\n            );\n            break;\n        case 'search':\n            component = (\n                <Search\n                    appProps={appProps}\n                    onCategories={this.handleCategories}\n                    handleItemClick={this.handleItemClick}\n                />\n            );\n            break;\n        case 'trending':\n            component = (\n                <Trending\n                    appProps={appProps}\n                    onCategories={this.handleCategories}\n                    handleItemClick={this.handleItemClick}\n                />\n            );\n            break;\n        }\n        return (\n            <div>\n                <App\n                    appProps={appProps}\n                    action={action}\n                    onTrending={this.handleTrending}\n                    onCategories={this.handleCategories}\n                    onSearch={this.handleSearch}\n                    defaultSearchText={this.props.defaultSearchText}\n                    handleSearchTextChange={this.props.handleSearchTextChange}\n                >\n                    {component}\n                </App>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nexport default class GfycatIcon extends React.PureComponent<React.HTMLAttributes<HTMLSpanElement>> {\n    render() {\n        return (\n            <span {...this.props}>\n                <svg\n                    width='22px'\n                    height='14px'\n                    viewBox='0 0 22 14'\n                >\n                    <g\n                        stroke='none'\n                        strokeWidth='1'\n                        fill='inherit'\n                        fillRule='evenodd'\n                    >\n                        <g\n                            transform='translate(-1344.000000, -552.000000)'\n                            fill='inherit'\n                        >\n                            <g transform='translate(1147.000000, 542.000000)'>\n                                <g transform='translate(1.000000, 1.000000)'>\n                                    <g transform='translate(138.000000, 0.000000)'>\n                                        <path d='M63.6748519,23 L62.2292481,23 C61.8176589,23 61.4619872,22.8510143 61.1631497,22.5539741 C60.8633954,22.2569338 60.71306,21.8993681 60.71306,21.4831393 C60.71306,21.0678417 60.8597287,20.710276 61.1539829,20.4132358 C61.4473204,20.1161955 61.800242,19.9672098 62.2118312,19.9672098 L63.6565183,19.9672098 C64.0681075,19.9672098 64.4182791,19.8219488 64.7061166,19.5304955 C64.993954,19.2390422 65.1378727,18.8917193 65.1378727,18.4866644 L65.1378727,15.4371134 C65.1378727,15.0208846 64.993954,14.6670436 64.7061166,14.3755903 C64.4182791,14.084137 64.0745243,13.938876 63.6748519,13.938876 C63.2632628,13.938876 62.9103411,14.0869305 62.6170036,14.3849019 C62.3227494,14.6819421 62.1760807,15.0329897 62.1760807,15.4371134 C62.1760807,15.7294978 62.3016658,16.0563352 62.5519193,16.4185567 L62.575753,16.4530096 C62.8269232,16.8143 62.9515917,17.1420685 62.9515917,17.4344529 C62.9515917,17.8506817 62.8049229,18.2073163 62.5115854,18.5043565 C62.2173313,18.8023279 61.8653263,18.9503824 61.4537371,18.9503824 C60.7836443,18.9503824 60.2198863,18.5164616 59.7615465,17.6486199 C59.373791,16.9232458 59.1794549,16.1857665 59.1794549,15.4371134 C59.1794549,14.188427 59.6176278,13.1213169 60.4930568,12.234852 C61.3684859,11.3493183 62.4226675,10.9060858 63.6565183,10.9060858 C64.8912858,10.9060858 65.9482175,11.3493183 66.8300633,12.234852 C67.7109925,13.1213169 68.1519154,14.188427 68.1519154,15.4371134 L68.1519154,18.4866644 C68.1519154,19.7353508 67.7137425,20.7996674 66.8383134,21.6796142 C65.9628844,22.559561 64.9087028,23 63.6748519,23 Z M80,15.9269039 C80,16.3068174 79.8689148,16.6317925 79.6076611,16.9027602 C79.3454907,17.173728 79.0319863,17.3096774 78.6653144,17.3096774 L76.8438719,17.3096774 L76.8438719,18.6589292 C76.8438719,19.0388427 76.7127867,19.3638178 76.4506164,19.6347855 C76.1893627,19.9057532 75.8749415,20.0417027 75.5082697,20.0417027 C75.1315143,20.0417027 74.8125098,19.9057532 74.5503394,19.6347855 C74.2890857,19.3638178 74.1580005,19.0388427 74.1580005,18.6589292 L74.1580005,13.1464583 C74.1580005,12.00858 74.5485061,11.0355171 75.3276838,10.2272697 C76.1077782,9.41995344 77.0473748,9.01582973 78.1473904,9.01582973 L78.6653144,9.01582973 C79.0319863,9.01582973 79.3454907,9.15177918 79.6076611,9.42274692 C79.8689148,9.69371467 80,10.0186897 80,10.3986033 C80,10.7775856 79.8689148,11.1034919 79.6076611,11.3744596 C79.3454907,11.6454273 79.0319863,11.7804456 78.6653144,11.7804456 L78.162974,11.7804456 C77.7963021,11.7804456 77.481881,11.9163951 77.2206273,12.1873628 C76.9584569,12.4583306 76.8282884,12.7777187 76.8282884,13.1464583 L76.8282884,14.5450615 L78.6653144,14.5450615 C79.0319863,14.5450615 79.3454907,14.681011 79.6076611,14.9519787 C79.8689148,15.2229465 80,15.5479215 80,15.9269039 Z M72.6344789,18.6589292 C72.6344789,19.0388427 72.5043104,19.3638178 72.24214,19.6347855 C71.9808863,19.9057532 71.6664652,20.0417027 71.2997933,20.0417027 C70.9340382,20.0417027 70.616867,19.9057532 70.3501132,19.6347855 C70.0833594,19.3638178 69.9495242,19.0388427 69.9495242,18.6589292 L69.9495242,14.170735 C69.9495242,13.7917526 70.0806094,13.4667775 70.3418631,13.1958098 C70.6040335,12.9239109 70.9175379,12.7888926 71.2842098,12.7888926 C71.6508817,12.7888926 71.9671361,12.9239109 72.2348066,13.1958098 C72.5015604,13.4667775 72.6344789,13.7917526 72.6344789,14.170735 L72.6344789,18.6589292 Z M58.3370263,12.5356169 C58.1023563,11.7441304 58.0042716,10.9163286 58.0042716,10.9163286 C57.9721878,10.6937812 58.1243566,10.547589 58.3425264,10.5904223 C58.3425264,10.5904223 58.5350291,10.6267376 58.8017829,10.6807449 C59.0767868,10.7375457 59.4324585,10.8139009 59.7404628,10.8921184 C60.3473048,11.0448287 60.95323,11.2720319 60.95323,11.2720319 C60.95323,11.2720319 60.2904706,11.6621882 59.7239626,12.3018956 C59.1565379,12.9406718 58.8650338,13.8420353 58.8650338,13.8420353 C58.8650338,13.8420353 58.5716963,13.3280346 58.3370263,12.5356169 Z M69.088762,12.5356169 C69.323432,11.7441304 69.4224334,10.9163286 69.4224334,10.9163286 C69.4536005,10.6937812 69.3014317,10.547589 69.0832619,10.5904223 C69.0832619,10.5904223 68.2921674,10.7384769 67.6853254,10.8921184 C67.0794002,11.0448287 66.4725583,11.2720319 66.4725583,11.2720319 C66.4725583,11.2720319 67.1353177,11.6621882 67.7027424,12.3018956 C68.2692504,12.9406718 68.5616712,13.8420353 68.5616712,13.8420353 C68.5616712,13.8420353 68.8550087,13.3280346 69.088762,12.5356169 Z M72.6344789,10.3818424 C72.6344789,10.7617559 72.5043104,11.086731 72.24214,11.3576987 C71.9808863,11.6286664 71.6664652,11.7646159 71.2997933,11.7646159 C70.9340382,11.7646159 70.616867,11.6286664 70.3501132,11.3576987 C70.0833594,11.086731 69.9495242,10.7617559 69.9495242,10.3818424 C69.9495242,10.00286 70.0806094,9.67788494 70.3418631,9.40691719 C70.6040335,9.13594945 70.9175379,9 71.2842098,9 C71.6508817,9 71.9671361,9.13594945 72.2348066,9.40691719 C72.5015604,9.67788494 72.6344789,10.00286 72.6344789,10.3818424 Z'/>\n                                    </g>\n                                </g>\n                            </g>\n                        </g>\n                    </g>\n                </svg>\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nexport default class EmojiPickerHeader extends React.PureComponent {\n    static propTypes = {\n        handleEmojiPickerClose: PropTypes.func.isRequired,\n    };\n\n    render() {\n        return (\n            <div className='emoji-picker__header modal-header'>\n                <button\n                    type='button'\n                    className='close emoji-picker__header-close-button'\n                    onClick={this.props.handleEmojiPickerClose}\n                >\n                    <span aria-hidden='true'>{'×'}</span>\n                    <span className='sr-only'>\n                        <FormattedMessage\n                            id={'emoji_picker.close'}\n                            defaultMessage={'Close'}\n                        />\n                    </span>\n                </button>\n                <h4 className='modal-title emoji-picker__header-title'>\n                    <FormattedMessage\n                        id={'emoji_picker.header'}\n                        defaultMessage={'Emoji Picker'}\n                    />\n                </h4>\n            </div>\n        );\n    }\n}\n","export default __webpack_public_path__ + \"files/bb70781ccd4fbf5f99bf8a8060f82662.gif\";","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {injectIntl, FormattedMessage} from 'react-intl';\nimport {Tooltip} from 'react-bootstrap';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport {Constants} from 'utils/constants';\n\nclass EmojiPickerCategory extends React.Component {\n    static propTypes = {\n        category: PropTypes.object.isRequired,\n        icon: PropTypes.node.isRequired,\n        onCategoryClick: PropTypes.func.isRequired,\n        selected: PropTypes.bool.isRequired,\n        enable: PropTypes.bool.isRequired,\n    }\n\n    shouldComponentUpdate(nextProps) {\n        return nextProps.selected !== this.props.selected ||\n            nextProps.enable !== this.props.enable;\n    }\n\n    handleClick = (e) => {\n        e.preventDefault();\n        this.props.onCategoryClick(this.props.category.name);\n    }\n\n    render() {\n        let className = 'emoji-picker__category';\n        if (this.props.selected) {\n            className += ' emoji-picker__category--selected';\n        }\n\n        if (!this.props.enable) {\n            className += ' disable';\n        }\n\n        const tooltip = (\n            <Tooltip\n                id='skinTooltip'\n                className='emoji-tooltip'\n            >\n                <span>\n                    <FormattedMessage\n                        id={`emoji_picker.${this.props.category.name}`}\n                        defaultMessage={this.props.category.message}\n                    />\n                </span>\n            </Tooltip>);\n\n        return (\n            <OverlayTrigger\n                trigger={['hover']}\n                delayShow={Constants.OVERLAY_TIME_DELAY}\n                placement='bottom'\n                overlay={tooltip}\n            >\n                <a\n                    className={className}\n                    href='#'\n                    onClick={this.handleClick}\n                    aria-label={this.props.category.id}\n                >\n                    {this.props.icon}\n                </a>\n            </OverlayTrigger>\n        );\n    }\n}\n\nexport default injectIntl(EmojiPickerCategory);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {injectIntl} from 'react-intl';\nimport debounce from 'lodash/debounce';\n\nimport {getEmojiImageUrl} from 'mattermost-redux/utils/emoji_utils';\n\nimport imgTrans from 'images/img_trans.gif';\nimport {intlShape} from 'utils/react_intl';\n\nconst SCROLLING_ADDITIONAL_VISUAL_SPACING = 10; // to make give the emoji some visual 'breathing room'\nconst EMOJI_LAZY_LOAD_SCROLL_THROTTLE = 150;\n\nclass EmojiPickerItem extends React.Component {\n    static propTypes = {\n        emoji: PropTypes.object.isRequired,\n        onItemOver: PropTypes.func.isRequired,\n        onItemClick: PropTypes.func.isRequired,\n        category: PropTypes.string.isRequired,\n        isSelected: PropTypes.bool,\n        categoryIndex: PropTypes.number.isRequired,\n        emojiIndex: PropTypes.number.isRequired,\n        containerRef: PropTypes.any,\n        containerTop: PropTypes.number.isRequired,\n        containerBottom: PropTypes.number.isRequired,\n        intl: intlShape.isRequired,\n    };\n\n    shouldComponentUpdate(nextProps) {\n        return nextProps.isSelected !== this.props.isSelected;\n    }\n\n    emojiItemRef = (emojiItem) => {\n        this.emojiItem = emojiItem;\n    };\n\n    emojiName = () => {\n        const name = 'short_name' in this.props.emoji ? this.props.emoji.short_name : this.props.emoji.name;\n        const {formatMessage} = this.props.intl;\n        return formatMessage({\n            id: 'emoji_picker_item.emoji_aria_label',\n            defaultMessage: '{emojiName} emoji',\n        },\n        {\n            emojiName: name.replace(/_/g, ' '),\n        });\n    }\n\n    componentDidUpdate(prevProps) {\n        if (!prevProps.isSelected && this.props.isSelected) {\n            const topOfTheEmojiItem = this.emojiItem.offsetTop;\n            const bottomOfTheEmojiItem = topOfTheEmojiItem + this.emojiItem.offsetHeight;\n            const {containerRef, containerTop, containerBottom} = this.props;\n            if (topOfTheEmojiItem < containerTop) {\n                containerRef.scrollTop = topOfTheEmojiItem - SCROLLING_ADDITIONAL_VISUAL_SPACING;\n            } else if (bottomOfTheEmojiItem > containerBottom) {\n                containerRef.scrollTop = (bottomOfTheEmojiItem - containerRef.offsetHeight) + SCROLLING_ADDITIONAL_VISUAL_SPACING;\n            }\n        }\n    }\n\n    handleMouseOver = () => {\n        if (!this.props.isSelected) {\n            this.props.onItemOver(this.props.categoryIndex, this.props.emojiIndex);\n        }\n    };\n\n    handleMouseOverThrottle = debounce(this.handleMouseOver, EMOJI_LAZY_LOAD_SCROLL_THROTTLE, {leading: true, trailing: true});\n\n    handleClick = () => {\n        this.props.onItemClick(this.props.emoji);\n    };\n\n    render() {\n        const {emoji} = this.props;\n\n        let itemClassName = 'emoji-picker__item';\n        if (this.props.isSelected) {\n            itemClassName += ' selected';\n        }\n\n        let spriteClassName = 'emojisprite';\n        spriteClassName += ' emoji-category-' + emoji.category;\n        spriteClassName += ' emoji-' + emoji.image;\n\n        let image;\n        if (emoji.category && emoji.category !== 'custom') {\n            image = (\n                <img\n                    alt={'emoji image'}\n                    data-testid={emoji.short_names}\n                    onMouseOver={this.handleMouseOverThrottle}\n                    src={imgTrans}\n                    className={spriteClassName}\n                    onClick={this.handleClick}\n                    id={'emoji-' + emoji.image}\n                    aria-label={this.emojiName()}\n                    role='button'\n                />\n            );\n        } else {\n            image = (\n                <img\n                    alt={'custom emoji image'}\n                    onMouseOver={this.handleMouseOver}\n                    src={getEmojiImageUrl(emoji)}\n                    className={'emoji-category--custom'}\n                    onClick={this.handleClick}\n                />\n            );\n        }\n\n        return (\n            <div\n                className={itemClassName}\n                ref={this.emojiItemRef}\n            >\n                <div data-testid='emojiItem'>\n                    {image}\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default injectIntl(EmojiPickerItem);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nexport default class EmojiPickerCategorySection extends React.PureComponent {\n    static propTypes = {\n        categoryName: PropTypes.string.isRequired,\n        children: PropTypes.any,\n        updateCategoryOffset: PropTypes.func.isRequired,\n    };\n\n    componentDidMount() {\n        this.updateOffsetFrame = window.requestAnimationFrame(() => {\n            this.props.updateCategoryOffset(this.props.categoryName, this.div.offsetTop);\n        });\n    }\n\n    componentWillUnmount() {\n        if (this.updateOffsetFrame) {\n            window.cancelAnimationFrame(this.updateOffsetFrame);\n        }\n    }\n\n    divRef = (div) => {\n        this.div = div;\n    };\n\n    render() {\n        return (\n            <div\n                ref={this.divRef}\n            >\n                <div className='emoji-picker-items__container'>\n                    <div\n                        className='emoji-picker__category-header'\n                        id={`emojipickercat-${this.props.categoryName}`}\n                    >\n                        <FormattedMessage id={'emoji_picker.' + this.props.categoryName}/>\n                    </div>\n                </div>\n                <div className='emoji-picker-items__container'>\n                    {this.props.children}\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {getEmojiImageUrl} from 'mattermost-redux/utils/emoji_utils';\nimport AnyTeamPermissionGate from 'components/permissions_gates/any_team_permission_gate';\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nimport imgTrans from 'images/img_trans.gif';\n\nexport default class EmojiPickerPreview extends React.PureComponent {\n    static propTypes = {\n        emoji: PropTypes.object,\n        customEmojisEnabled: PropTypes.bool,\n        currentTeamName: PropTypes.string.isRequired,\n    }\n\n    customEmojis = () => {\n        if (!this.props.customEmojisEnabled) {\n            return null;\n        }\n        if (!this.props.currentTeamName) {\n            return null;\n        }\n        return (\n            <AnyTeamPermissionGate permissions={[Permissions.CREATE_EMOJIS]}>\n                <div className='emoji-picker__custom'>\n                    <a\n                        className='btn btn-link'\n                        href={`/${this.props.currentTeamName}/emoji`}\n                    >\n                        <FormattedMessage\n                            id='emoji_picker.custom_emoji'\n                            defaultMessage='Custom Emoji'\n                        />\n                    </a>\n                </div>\n            </AnyTeamPermissionGate>\n        );\n    }\n\n    render() {\n        const emoji = this.props.emoji;\n\n        if (emoji) {\n            let name;\n            let aliases;\n            let previewImage;\n\n            if (emoji.short_names && emoji.image !== 'mattermost') {\n                // This is a system emoji which only has a list of aliases\n                name = emoji.short_names[0];\n                aliases = emoji.short_names;\n\n                previewImage = (\n                    <span className='sprite-preview'>\n                        <img\n                            id='emojiPickerSpritePreview'\n                            alt={'emoji category image'}\n                            src={imgTrans}\n                            className={'emojisprite-preview emoji-category-' + emoji.category + ' emoji-' + emoji.image}\n                        />\n                    </span>\n                );\n            } else {\n                // This is a custom emoji that matches the model on the server\n                name = emoji.name;\n                aliases = [name];\n                previewImage = (\n                    <img\n                        id='emojiPickerSpritePreview'\n                        alt={'emoji preview image'}\n                        className='emoji-picker__preview-image'\n                        src={getEmojiImageUrl(emoji)}\n                    />\n                );\n            }\n\n            return (\n                <div className='emoji-picker__footer'>\n                    <div className='emoji-picker__preview'>\n                        <div className='emoji-picker__preview-image-box'>\n                            {previewImage}\n                        </div>\n                        <div className='emoji-picker__preview-image-label-box'>\n                            <span className='emoji-picker__preview-name'>{':' + aliases.join(': :') + ':'}</span>\n                        </div>\n                    </div>\n                    {this.customEmojis()}\n                </div>\n            );\n        }\n\n        return (\n            <div className='emoji-picker__footer'>\n                <div className='emoji-picker__preview emoji-picker__preview-placeholder'>\n                    <FormattedMessage\n                        id='emoji_picker.emojiPicker'\n                        defaultMessage='Select an Emoji'\n                    />\n                </div>\n                {this.customEmojis()}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {injectIntl, FormattedMessage} from 'react-intl';\nimport {Tooltip} from 'react-bootstrap';\nimport classNames from 'classnames';\n\nimport OverlayTrigger from 'components/overlay_trigger';\n\nimport {Constants} from 'utils/constants';\nimport {intlShape} from 'utils/react_intl';\n\nimport * as Emoji from 'utils/emoji.jsx';\n\nimport imgTrans from 'images/img_trans.gif';\n\nconst skinsList = [['raised_hand_with_fingers_splayed', 'default'],\n    ['raised_hand_with_fingers_splayed_light_skin_tone', '1F3FB'],\n    ['raised_hand_with_fingers_splayed_medium_light_skin_tone', '1F3FC'],\n    ['raised_hand_with_fingers_splayed_medium_skin_tone', '1F3FD'],\n    ['raised_hand_with_fingers_splayed_medium_dark_skin_tone', '1F3FE'],\n    ['raised_hand_with_fingers_splayed_dark_skin_tone', '1F3FF']];\n\nconst skinToneEmojis = new Map(skinsList.map((pair) => [pair[1], Emoji.Emojis[Emoji.EmojiIndicesByAlias.get(pair[0])]]));\n\nexport class EmojiPickerSkin extends React.PureComponent {\n    static propTypes = {\n        userSkinTone: PropTypes.string.isRequired,\n        onSkinSelected: PropTypes.func.isRequired,\n        intl: intlShape.isRequired,\n    };\n\n    constructor() {\n        super();\n\n        this.state = {\n            pickerExtended: false,\n        };\n    }\n\n    ariaLabel = (skin) => {\n        return this.props.intl.formatMessage({\n            id: 'emoji_skin_item.emoji_aria_label',\n            defaultMessage: '{skinName} emoji',\n        },\n        {\n            skinName: Emoji.SkinTranslations.get(skin),\n        });\n    }\n\n    hideSkinTonePicker = (skin) => {\n        this.setState({pickerExtended: false});\n        if (skin !== this.props.userSkinTone) {\n            this.props.onSkinSelected(skin);\n        }\n    }\n\n    showSkinTonePicker = () => {\n        this.setState({pickerExtended: true});\n    }\n\n    extended() {\n        const choices = skinsList.map((skinPair) => {\n            const skin = skinPair[1];\n            const emoji = skinToneEmojis.get(skin);\n            const spriteClassName = classNames('emojisprite', `emoji-category-${emoji.category}`, `emoji-${emoji.image}`);\n\n            return (\n                <div\n                    className='skin-tones__icon'\n                    key={skin}\n                    onClick={() => this.hideSkinTonePicker(skin)}\n                >\n                    <img\n                        data-testid={`skin-pick-${skin}`}\n                        src={imgTrans}\n                        className={spriteClassName}\n                        aria-label={this.ariaLabel(skin)}\n                        role='button'\n                    />\n                </div>\n            );\n        });\n        return (\n            <>\n                <div className='skin-tones__close'>\n                    <button\n                        className='skin-tones__close-icon'\n                        onClick={() => this.hideSkinTonePicker(this.props.userSkinTone)}\n                    >\n                        <i className='icon-close icon--no-spacing icon-16'/>\n                    </button>\n                    <div className='skin-tones__close-text'>\n                        <FormattedMessage\n                            id={Emoji.SkinTranslations.get('default')}\n                        />\n                    </div>\n                </div>\n                <div className='skin-tones__icons'>\n                    {choices}\n                </div>\n            </>\n        );\n    }\n    collapsed() {\n        const emoji = skinToneEmojis.get(this.props.userSkinTone);\n        const spriteClassName = classNames('emojisprite', `emoji-category-${emoji.category}`, `emoji-${emoji.image}`);\n        const tooltip = (\n            <Tooltip\n                id='skinTooltip'\n                className='emoji-tooltip'\n            >\n                <span>\n                    <FormattedMessage\n                        id={'emoji_picker.skin_tone'}\n                        defaultMessage={'Skin tone'}\n                    />\n                </span>\n            </Tooltip>);\n        return (\n            <OverlayTrigger\n                trigger={['hover']}\n                delayShow={Constants.OVERLAY_TIME_DELAY}\n                placement='top'\n                overlay={tooltip}\n            >\n                <div className='skin-tones__icon'>\n                    <img\n                        alt={'emoji skin tone picker'}\n                        data-testid={`skin-picked-${this.props.userSkinTone}`}\n                        src={imgTrans}\n                        className={spriteClassName}\n                        onClick={this.showSkinTonePicker}\n                        aria-label={this.ariaLabel(this.props.userSkinTone)}\n                        role='button'\n                    />\n                </div>\n            </OverlayTrigger>);\n    }\n\n    render() {\n        return (\n            <div className={classNames('skin-tones', {'skin-tones--active': this.state.pickerExtended})}>\n                <div className={classNames('skin-tones__content', {'skin-tones__content__single': !this.state.pickerExtended})}>\n                    {this.state.pickerExtended ? this.extended() : this.collapsed()}\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default injectIntl(EmojiPickerSkin);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable max-lines */\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport throttle from 'lodash/throttle';\n\nimport * as Emoji from 'utils/emoji.jsx';\nimport {compareEmojis} from 'utils/emoji_utils';\nimport {t} from 'utils/i18n';\nimport imgTrans from 'images/img_trans.gif';\n\nimport LocalizedInput from 'components/localized_input/localized_input';\n\nimport NoResultsIndicator from 'components/no_results_indicator/no_results_indicator.tsx';\n\nimport {NoResultsVariant} from 'components/no_results_indicator/types';\n\nimport EmojiPickerCategory from './components/emoji_picker_category';\nimport EmojiPickerItem from './components/emoji_picker_item';\nimport EmojiPickerCategorySection from './emoji_picker_category_section';\nimport EmojiPickerPreview from './components/emoji_picker_preview';\nimport EmojiPickerSkin from './components/emoji_picker_skin';\n\nconst CATEGORY_SEARCH_RESULTS = 'searchResults';\n\nconst EMOJI_HEIGHT = 27;\n\n// If this changes, the spaceRequiredAbove and spaceRequiredBelow props passed to the EmojiPickerOverlay must be updated\nconst EMOJI_CONTAINER_HEIGHT = 290;\nconst EMOJI_CONTAINER_STYLE = {\n    height: EMOJI_CONTAINER_HEIGHT,\n};\n\nconst EMOJI_LAZY_LOAD_BUFFER = 75;\nconst EMOJI_PER_ROW = 9; // needs to match variable `$emoji-per-row` in _variables.scss\nconst EMOJI_TO_LOAD_PER_UPDATE = 135;\nconst SYSTEM_EMOJIS_COUNT = 1476;\nconst EMOJI_LAZY_LOAD_SCROLL_THROTTLE = 100;\n\n// we know some categories, but there might be new ones in an upgrade\nconst categoryClass = new Map([\n    ['recent', 'icon-clock-outline'],\n    ['searchResults', ''],\n    ['smileys-emotion', 'icon-emoticon-happy-outline'],\n    ['people-body', 'icon-account-outline'],\n    ['animals-nature', 'icon-leaf-outline'],\n    ['food-drink', 'icon-food-apple'],\n    ['activities', 'icon-basketball'],\n    ['travel-places', 'icon-airplane-variant'],\n    ['objects', 'icon-lightbulb-outline'],\n    ['symbols', 'icon-heart-outline'],\n    ['flags', 'icon-flag-outline'],\n    ['custom', 'icon-emoticon-custom-outline'],\n]);\n\nconst DEFAULT_CLASS = categoryClass.get('smileys-emotion');\n\nfunction createCategory(name) {\n    return {\n        name,\n        id: Emoji.CategoryTranslations.get(name, `emoji_picker.${name}`),\n        className: categoryClass.get(name, DEFAULT_CLASS),\n        message: Emoji.CategoryMessage.get(name, name),\n        offset: 0,\n    };\n}\n\nconst CATEGORIES = {};\n\nfor (const cat of Emoji.CategoryNames) {\n    if (cat === 'recent' || cat === 'searchResults') {\n        continue;\n    }\n    CATEGORIES[cat] = createCategory(cat);\n}\n\nconst smileysCategory = {'smileys-emotion': CATEGORIES['smileys-emotion']};\nconst recentEmojiCategory = {recent: createCategory('recent')};\n\nconst searchResultsCategory = createCategory(CATEGORY_SEARCH_RESULTS);\n\nfunction getEmojiFilename(emoji) {\n    return emoji.image || emoji.filename || emoji.id;\n}\n\nexport function filterEmojiSearchInput(input) {\n    return input.toLowerCase().replace(/^:|:$/g, '');\n}\n\nconst EMOJIS_PER_PAGE = 200;\nconst LOAD_MORE_AT_PIXELS_FROM_BOTTOM = 500;\n\nexport default class EmojiPicker extends React.PureComponent {\n    static propTypes = {\n        onEmojiClick: PropTypes.func.isRequired,\n        customEmojisEnabled: PropTypes.bool,\n        emojiMap: PropTypes.object.isRequired,\n        recentEmojis: PropTypes.array.isRequired,\n        userSkinTone: PropTypes.string.isRequired,\n        customEmojiPage: PropTypes.number.isRequired,\n        visible: PropTypes.bool,\n        currentTeamName: PropTypes.string.isRequired,\n        actions: PropTypes.shape({\n            getCustomEmojis: PropTypes.func.isRequired,\n            searchCustomEmojis: PropTypes.func.isRequired,\n            incrementEmojiPickerPage: PropTypes.func.isRequired,\n            setUserSkinTone: PropTypes.func.isRequired,\n        }).isRequired,\n        filter: PropTypes.string.isRequired,\n        handleFilterChange: PropTypes.func.isRequired,\n    };\n\n    static defaultProps = {\n        listHeight: 245,\n        customEmojiPage: 0,\n        customEmojisEnabled: false,\n    };\n\n    static getEmojis(props, state) {\n        const {categories, allEmojis} = state;\n        const emojiMap = props.emojiMap;\n        const customEmojiMap = emojiMap.customEmojis;\n\n        for (const category of Object.keys(categories)) {\n            let categoryEmojis = [];\n            if (category === 'recent' && props.recentEmojis.length) {\n                const recentEmojis = [...props.recentEmojis].reverse();\n                categoryEmojis = recentEmojis.filter((name) => {\n                    return emojiMap.has(name);\n                }).map((name) => {\n                    return emojiMap.get(name);\n                });\n            } else {\n                const indices = Emoji.EmojiIndicesByCategory.get(props.userSkinTone).get(category) || [];\n                categoryEmojis = indices.map((index) => Emoji.Emojis[index]);\n                if (category === 'custom') {\n                    categoryEmojis = categoryEmojis.concat([...customEmojiMap.values()]);\n                }\n            }\n            categories[category].emojiIds = categoryEmojis.map((emoji) => getEmojiFilename(emoji));\n            for (let i = 0; i < categoryEmojis.length; i++) {\n                const currentEmoji = categoryEmojis[i];\n                const fileName = getEmojiFilename(currentEmoji);\n                allEmojis[fileName] = {\n                    ...currentEmoji,\n                    visible: false,\n                    offset: null,\n                };\n                if (!currentEmoji.image) {\n                    // if custom emoji, set proper attributes\n                    allEmojis[fileName] = {\n                        ...allEmojis[fileName],\n                        aliases: currentEmoji.short_names ? currentEmoji.short_names : [currentEmoji.name],\n                        category: 'custom',\n                        image: fileName,\n                    };\n                }\n            }\n        }\n\n        return {categories, allEmojis};\n    }\n\n    static getDerivedStateFromProps(props, state) {\n        let updatedState = {emojiMap: props.emojiMap, userSkinTone: props.userSkinTone};\n        if (JSON.stringify(Object.keys(state.categories)) !== state.categoryKeys || props.emojiMap !== state.emojiMap || props.userSkinTone !== state.userSkinTone) {\n            const {categories, allEmojis} = EmojiPicker.getEmojis(props, state);\n            updatedState = {...updatedState, categories, allEmojis, categoryKeys: JSON.stringify(Object.keys(categories))};\n        }\n\n        return updatedState;\n    }\n\n    constructor(props) {\n        super(props);\n\n        this.handleScrollThrottle = throttle(this.handleScroll, EMOJI_LAZY_LOAD_SCROLL_THROTTLE, {leading: false, trailing: true});\n\n        this.divHeight = 0;\n        this.missingPages = true;\n        this.loadingMoreEmojis = false;\n\n        const categories = props.recentEmojis.length ? {...recentEmojiCategory, ...smileysCategory} : smileysCategory;\n        this.state = {\n            allEmojis: {},\n            categories,\n            cursor: [-1, -1], // categoryIndex, emojiIndex\n            divTopOffset: 0,\n            emojisToShow: SYSTEM_EMOJIS_COUNT,\n            renderAllCategories: false,\n        };\n    }\n\n    componentDidMount() {\n        if (this.props.customEmojiPage === 0) {\n            this.loadMoreCustomEmojis();\n        }\n\n        // Delay taking focus because this briefly renders offscreen when using an Overlay\n        // so focusing it immediately on mount can cause weird scrolling\n        window.requestAnimationFrame(() => {\n            if (this.searchInput) {\n                this.searchInput.focus();\n            }\n            this.renderAllCategoriesFrame = window.requestAnimationFrame(() => {\n                this.renderAllCategories();\n            });\n        });\n\n        if (this.emojiPickerContainer) {\n            this.divHeight = this.emojiPickerContainer.offsetHeight;\n        }\n\n        const rootComponent = document.getElementById('root');\n        if (rootComponent) {\n            rootComponent.classList.add('emoji-picker--active');\n        }\n    }\n\n    updateEmojisToShow(divTopOffset) {\n        if (divTopOffset === this.state.divTopOffset) {\n            return;\n        }\n\n        this.setState({divTopOffset});\n        if (this.lastVisibleEmoji) {\n            const difference = this.lastVisibleEmoji.offsetTop - (divTopOffset + EMOJI_CONTAINER_HEIGHT + EMOJI_LAZY_LOAD_BUFFER);\n            if (difference <= 0) {\n                const numToLoad = EMOJI_TO_LOAD_PER_UPDATE + Math.ceil((difference / EMOJI_HEIGHT) * EMOJI_PER_ROW * -1);\n                this.setState((state) => ({\n                    emojisToShow: state.emojisToShow + numToLoad,\n                }));\n            }\n        }\n    }\n\n    componentWillUnmount() {\n        if (this.renderAllCategoriesFrame) {\n            window.cancelAnimationFrame(this.renderAllCategoriesFrame);\n        }\n\n        const rootComponent = document.getElementById('root');\n        if (rootComponent) {\n            rootComponent.classList.remove('emoji-picker--active');\n        }\n    }\n\n    renderAllCategories = () => {\n        const categories = this.props.recentEmojis.length ? {...recentEmojiCategory, ...CATEGORIES} : CATEGORIES;\n        this.setState((state) => ({\n            categories: {\n                ...categories,\n                ...state.categories,\n            },\n            renderAllCategories: true,\n        }));\n    }\n\n    loadMoreCustomEmojis = async () => {\n        if (!this.props.customEmojisEnabled || this.loadingMoreEmojis) {\n            return;\n        }\n\n        this.loadingMoreEmojis = true;\n\n        const {data} = await this.props.actions.getCustomEmojis(this.props.customEmojiPage, EMOJIS_PER_PAGE);\n        if (!data) {\n            this.loadingMoreEmojis = false;\n            return;\n        }\n\n        if (data.length < EMOJIS_PER_PAGE) {\n            this.missingPages = false;\n            this.loadingMoreEmojis = false;\n            return;\n        }\n\n        await this.props.actions.incrementEmojiPickerPage();\n\n        this.loadingMoreEmojis = false;\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.visible && !prevProps.visible) {\n            this.searchInput.focus();\n        }\n\n        if (!this.missingPages || !this.emojiPickerContainer) {\n            return;\n        }\n\n        const pixelsFromBottom = this.emojiPickerContainer.scrollHeight - this.state.divTopOffset - this.emojiPickerContainer.clientHeight;\n        if (pixelsFromBottom <= LOAD_MORE_AT_PIXELS_FROM_BOTTOM) {\n            this.loadMoreCustomEmojis();\n        }\n    }\n\n    lastVisibleEmojiRef = (lastVisibleEmoji) => {\n        this.lastVisibleEmoji = lastVisibleEmoji;\n    };\n    emojiPickerContainerRef = (emojiPickerContainer) => {\n        this.emojiPickerContainer = emojiPickerContainer;\n    };\n    emojiSearchInput = (input) => {\n        this.searchInput = input;\n    };\n\n    handleCategoryClick = (categoryName) => {\n        this.setState({\n            cursor: [Object.keys(this.state.categories).indexOf(categoryName), 0],\n        });\n        if (this.state.categories[categoryName]) {\n            this.updateEmojisToShow(this.state.categories[categoryName].offset);\n            this.emojiPickerContainer.scrollTop = this.state.categories[categoryName].offset;\n        }\n    }\n\n    handleFilterChange = (e) => {\n        e.preventDefault();\n        const filter = filterEmojiSearchInput(e.target.value);\n\n        if (this.props.customEmojisEnabled && filter && filter.trim() !== '') {\n            this.props.actions.searchCustomEmojis(filter);\n        }\n\n        this.props.handleFilterChange(filter);\n\n        this.setState(() => ({\n            cursor: [-1, -1],\n        }));\n    }\n\n    handleItemOver = (categoryIndex, emojiIndex) => {\n        this.setState({\n            cursor: [categoryIndex, emojiIndex],\n        });\n    }\n\n    handleItemClick = (emoji) => {\n        this.props.onEmojiClick(emoji);\n    }\n\n    handleCategoryKeyDown = (e) => {\n        switch (e.key) {\n        case 'ArrowRight':\n            e.preventDefault();\n            this.selectNextEmoji();\n            this.searchInput.focus();\n            break;\n        case 'ArrowLeft':\n            e.preventDefault();\n            this.selectPrevEmoji();\n            this.searchInput.focus();\n            break;\n        case 'ArrowUp':\n            e.preventDefault();\n            this.selectPrevEmoji(EMOJI_PER_ROW);\n            this.searchInput.focus();\n            break;\n        case 'ArrowDown':\n            e.preventDefault();\n            this.selectNextEmoji(EMOJI_PER_ROW);\n            this.searchInput.focus();\n            break;\n        }\n    }\n\n    handleKeyDown = (e) => {\n        switch (e.key) {\n        case 'ArrowRight':\n            if ((this.state.cursor[0] !== -1 || this.state.cursor[1] !== -1) || e.target.selectionStart + 1 > this.props.filter.length) {\n                e.preventDefault();\n                this.selectNextEmoji();\n            }\n            break;\n        case 'ArrowLeft':\n            if (this.state.cursor[0] > 0 || this.state.cursor[1] > 0) {\n                e.preventDefault();\n                this.selectPrevEmoji();\n            } else if (this.state.cursor[0] === 0 && this.state.cursor[1] === 0) {\n                this.setState({\n                    cursor: [-1, -1],\n                });\n                e.target.selectionStart = this.props.filter.length;\n                e.target.selectionEnd = this.props.filter.length;\n                e.preventDefault();\n                this.searchInput.focus();\n            }\n            break;\n        case 'ArrowUp':\n            e.preventDefault();\n            if (e.shiftKey) {\n                // If Shift + Ctrl/Cmd + Up is pressed at any time,\n                // select/highlight the string to the left of the cursor.\n                e.target.selectionStart = 0;\n            } else if (this.state.cursor[0] === -1) {\n                // If cursor is on the textbox,\n                // set the cursor to the beginning of the string.\n                e.target.selectionStart = 0;\n                e.target.selectionEnd = 0;\n            } else if (this.state.cursor[0] === 0 && this.state.cursor[1] < EMOJI_PER_ROW) {\n                // If the cursor is highlighting an emoji in the top row,\n                // move the cursor back into the text box to the end of the string.\n                this.setState({\n                    cursor: [-1, -1],\n                });\n                e.target.selectionStart = this.props.filter.length;\n                e.target.selectionEnd = this.props.filter.length;\n                this.searchInput.focus();\n            } else {\n                // Otherwise, move the emoji selector up a row.\n                this.selectPrevEmoji(EMOJI_PER_ROW);\n            }\n            break;\n        case 'ArrowDown':\n            e.preventDefault();\n            if (e.shiftKey) {\n                // If Shift + Ctrl/Cmd + Down is pressed at any time,\n                // select/highlight the string to the right of the cursor.\n                e.target.selectionEnd = this.props.filter.length;\n            } else if (this.props.filter && e.target.selectionStart === 0) {\n                // If the cursor is at the beginning of the string,\n                // move the cursor to the end of the string.\n                e.target.selectionStart = this.props.filter.length;\n                e.target.selectionEnd = this.props.filter.length;\n            } else {\n                // Otherwise, move the selection down in the emoji picker.\n                this.selectNextEmoji(EMOJI_PER_ROW);\n            }\n            break;\n        case 'Enter':\n            e.preventDefault();\n            if (this.getCurrentEmojiByCursor(this.state.cursor)) {\n                this.props.onEmojiClick(this.getCurrentEmojiByCursor(this.state.cursor));\n            }\n            break;\n        }\n    }\n\n    handleScroll = () => {\n        if (this.emojiPickerContainer) {\n            this.updateEmojisToShow(this.emojiPickerContainer.scrollTop);\n        }\n    }\n\n    selectNextEmoji(offset = 1) {\n        const {cursor} = this.state;\n\n        // try moving to next emoji in index\n        let newCursor = [cursor[0], cursor[1] + offset];\n        if (this.getCurrentEmojiByCursor(newCursor)) {\n            this.setState({cursor: newCursor});\n            return;\n        }\n\n        // try moving to next category\n        newCursor = [cursor[0] + 1, 0];\n        if (this.getCurrentEmojiByCursor(newCursor)) {\n            this.setState({cursor: newCursor});\n        }\n    }\n\n    selectPrevEmoji(offset = 1) {\n        const {cursor} = this.state;\n\n        // try moving to prev emoji in index\n        let newCursor = [cursor[0], cursor[1] - offset];\n        if (this.getCurrentEmojiByCursor(newCursor)) {\n            this.setState({cursor: newCursor});\n            return;\n        }\n\n        // try moving to end of prev category\n        if (cursor[0] !== 0) {\n            const newCategory = this.getCategoryByIndex(cursor[0] - 1);\n            const lastVisibleEmojiInNewCategory = this.state.categories[newCategory.name].emojiIds.length - 1;\n            newCursor = [cursor[0] - 1, lastVisibleEmojiInNewCategory];\n            if (this.getCurrentEmojiByCursor(newCursor)) {\n                this.setState({cursor: newCursor});\n            }\n        }\n    }\n\n    onSkinSelected = (skin) => {\n        this.props.actions.setUserSkinTone(skin);\n    }\n\n    getCategoryByIndex = (index) => {\n        if (this.props.filter && index !== 0) {\n            return null;\n        }\n        return this.getCategoriesByKey(Object.keys(this.state.categories)[index]);\n    }\n\n    getCurrentEmojiByCursor(cursor) {\n        const category = this.getCategoryByIndex(cursor[0]);\n        if (!category) {\n            return null;\n        }\n        return this.getEmojisByCategory(category)[cursor[1]];\n    }\n\n    getCategoriesByKey(key) {\n        return this.props.filter ? searchResultsCategory : this.state.categories[key];\n    }\n\n    sortEmojis(emojis) {\n        const {recentEmojis: recentEmojisProps} = this.props;\n        const recentEmojis = [];\n        const emojisMinusRecent = [];\n\n        Object.values(emojis).forEach((emoji) => {\n            let emojiArray = emojisMinusRecent;\n            const alias = 'short_names' in emoji ? emoji.short_names : [emoji.name];\n            for (let i = 0; i < alias.length; i++) {\n                if (recentEmojisProps.includes(alias[i].toLowerCase())) {\n                    emojiArray = recentEmojis;\n                }\n            }\n\n            emojiArray.push(emoji);\n        });\n\n        const sortEmojisHelper = (a, b) => {\n            return compareEmojis(a, b, this.props.filter);\n        };\n\n        recentEmojis.sort(sortEmojisHelper);\n\n        emojisMinusRecent.sort(sortEmojisHelper);\n\n        return [\n            ...recentEmojis,\n            ...emojisMinusRecent,\n        ];\n    }\n\n    getEmojisByCategory(category) {\n        if (this.props.filter) {\n            const emojis = Object.values(this.state.allEmojis).filter((emoji) => {\n                const alias = 'short_names' in emoji ? emoji.short_names : [emoji.name];\n                for (let i = 0; i < alias.length; i++) {\n                    if (alias[i].toLowerCase().includes(this.props.filter)) {\n                        return true;\n                    }\n                }\n\n                return false;\n            });\n\n            return this.sortEmojis(emojis);\n        }\n        return this.state.categories[category.name].emojiIds.map((emojiId) =>\n            this.state.allEmojis[emojiId]);\n    }\n\n    getCurrentEmojiName() {\n        const emoji = this.getCurrentEmojiByCursor(this.state.cursor);\n        if (!emoji) {\n            return '';\n        }\n        const name = 'short_name' in emoji ? emoji.short_name : emoji.name;\n        return name.replace(/_/g, ' ');\n    }\n\n    getCurrentEmojiCategoryName() {\n        const categories = Object.keys(this.state.categories);\n        let currentCategoryName = categories[0];\n\n        for (let i = categories.length - 1; i >= 0; i--) {\n            // go through in reverse so that you get the last category that matches\n            const category = this.state.categories[categories[i]];\n            if (category.offset && this.state.divTopOffset > category.offset - 20) {\n                currentCategoryName = categories[i];\n                break;\n            }\n        }\n        return currentCategoryName;\n    }\n\n    emojiCategories() {\n        const categories = this.props.recentEmojis.length ? {...recentEmojiCategory, ...CATEGORIES} : CATEGORIES;\n        const categoryKeys = Object.keys(categories);\n        const currentCategoryName = this.props.filter ? categoryKeys[0] : this.getCurrentEmojiCategoryName();\n        const emojiPickerCategories = categoryKeys.map((categoryName) => {\n            const category = categories[categoryName];\n\n            return (\n                <EmojiPickerCategory\n                    key={'header-' + category.name}\n                    category={category}\n                    icon={\n                        <i\n                            className={category.className}\n                        />\n                    }\n                    onCategoryClick={this.handleCategoryClick}\n                    selected={currentCategoryName === category.name}\n                    enable={!this.props.filter}\n                />\n            );\n        });\n        return (\n            <div\n                id='emojiPickerCategories'\n                className='emoji-picker__categories'\n                onKeyDown={this.handleCategoryKeyDown}\n            >\n                {emojiPickerCategories}\n            </div>\n        );\n    }\n\n    emojiSearch() {\n        return (\n            <div className='emoji-picker__search-container'>\n                <div className='emoji-picker__text-container'>\n                    <span className='icon-magnify icon emoji-picker__search-icon'/>\n                    <FormattedMessage\n                        id='emoji_picker.search_emoji'\n                        defaultMessage='Search for an emoji'\n                    >\n                        {(ariaLabel) => (\n                            <LocalizedInput\n                                id='emojiPickerSearch'\n                                aria-label={ariaLabel}\n                                ref={this.emojiSearchInput}\n                                className='emoji-picker__search'\n                                data-testid='emojiInputSearch'\n                                type='text'\n                                onChange={this.handleFilterChange}\n                                onKeyDown={this.handleKeyDown}\n                                autoComplete='off'\n                                placeholder={{id: t('emoji_picker.search'), defaultMessage: 'Search Emoji'}}\n                                value={this.props.filter}\n                            />\n                        )}\n                    </FormattedMessage>\n                </div>\n                <EmojiPickerSkin\n                    userSkinTone={this.props.userSkinTone}\n                    onSkinSelected={this.onSkinSelected}\n                />\n            </div>\n        );\n    }\n\n    emojiCurrentResults() {\n        const {filter} = this.props;\n        const categories = filter ? [CATEGORY_SEARCH_RESULTS] : Object.keys(this.state.categories);\n        let numEmojisLoaded = 0;\n\n        let categoryComponents = [];\n        for (let i = 0; i < categories.length; i++) {\n            const category = this.getCategoriesByKey(categories[i]);\n            const emojis = this.getEmojisByCategory(category);\n            const items = this.emojiCurrentResultsItems(i, emojis, numEmojisLoaded);\n            numEmojisLoaded += items.length;\n            categoryComponents = [...categoryComponents, (\n                <EmojiPickerCategorySection\n                    key={category.id}\n                    categoryName={category.name}\n                    updateCategoryOffset={this.updateCategoryOffset}\n                    role='application'\n                >\n                    {items}\n                </EmojiPickerCategorySection>\n            )];\n\n            if (items.length === 0) {\n                return (\n                    <NoResultsIndicator\n                        variant={NoResultsVariant.ChannelSearch}\n                        titleValues={{channelName: `\"${this.props.filter}\"`}}\n                    />);\n            }\n        }\n\n        return (\n            <div\n                ref={this.emojiPickerContainerRef}\n                onScroll={this.handleScrollThrottle}\n                className='emoji-picker__items'\n                style={(EMOJI_CONTAINER_STYLE, {overflowY: this.state.renderAllCategories ? 'auto' : 'hidden'})}\n            >\n                <div className='emoji-picker__container'>\n                    {categoryComponents}\n                </div>\n            </div>\n        );\n    }\n    emojiCurrentResultsItems = (categoryIndex, emojis, currentEmojiLoadedCount) => {\n        const {cursor, emojisToShow} = this.state;\n        let numEmojisLoaded = currentEmojiLoadedCount;\n\n        return emojis.map((emoji, emojiIndex) => {\n            numEmojisLoaded++;\n\n            // set ref on first unloaded emoji\n            let ref;\n            if (numEmojisLoaded === emojisToShow) {\n                ref = this.lastVisibleEmojiRef;\n            }\n            if (numEmojisLoaded >= emojisToShow) {\n                return (\n                    <div\n                        key={numEmojisLoaded}\n                        className='emoji-picker__item'\n                        ref={ref}\n                    >\n                        <img\n                            alt={'emoji image'}\n                            src={imgTrans}\n                            className='emojisprite'\n                        />\n                    </div>\n                );\n            }\n            return (\n                <EmojiPickerItem\n                    // eslint-disable-next-line react/no-array-index-key\n                    key={emoji.image + ':' + emojiIndex}\n                    emoji={emoji}\n                    onItemOver={this.handleItemOver}\n                    onItemClick={this.handleItemClick}\n                    onItemUnmount={emoji}\n                    category={emoji.category}\n                    isSelected={cursor[0] === (categoryIndex) && cursor[1] === emojiIndex}\n                    categoryIndex={categoryIndex}\n                    emojiIndex={emojiIndex}\n                    containerRef={this.emojiPickerContainer}\n                    containerTop={this.state.divTopOffset}\n                    containerBottom={this.state.divTopOffset + this.divHeight}\n                />\n            );\n        });\n    };\n\n    updateCategoryOffset = (categoryName, offset) => {\n        if (categoryName !== CATEGORY_SEARCH_RESULTS) {\n            this.setState((state) => ({\n                categories: {\n                    ...state.categories,\n                    [categoryName]: {\n                        ...state.categories[categoryName],\n                        offset,\n                    },\n                },\n            }));\n        }\n    }\n\n    render() {\n        return (\n            <div\n                className='emoji-picker__inner'\n                role='application'\n            >\n                <div\n                    aria-live='assertive'\n                    className='sr-only'\n                >\n                    <FormattedMessage\n                        id='emoji_picker_item.emoji_aria_label'\n                        defaultMessage='{emojiName} emoji'\n                        values={{\n                            emojiName: this.getCurrentEmojiName(),\n                        }}\n                    />\n                </div>\n                {this.emojiSearch()}\n                {this.emojiCategories()}\n                {this.emojiCurrentResults()}\n                <EmojiPickerPreview\n                    emoji={this.getCurrentEmojiByCursor(this.state.cursor)}\n                    customEmojisEnabled={this.props.customEmojisEnabled}\n                    currentTeamName={this.props.currentTeamName}\n                />\n            </div>\n        );\n    }\n}\n\n/* eslint-enable max-lines */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {getCustomEmojis, searchCustomEmojis} from 'mattermost-redux/actions/emojis';\n\nimport {incrementEmojiPickerPage, setUserSkinTone} from 'actions/emoji_actions';\nimport {getEmojiMap, getRecentEmojis, getUserSkinTone} from 'selectors/emojis';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport EmojiPicker from './emoji_picker.jsx';\n\nfunction mapStateToProps(state) {\n    const currentTeam = getCurrentTeam(state);\n    return {\n        customEmojisEnabled: state.entities.general.config.EnableCustomEmoji === 'true',\n        customEmojiPage: state.views.emoji.emojiPickerCustomPage,\n        emojiMap: getEmojiMap(state),\n        recentEmojis: getRecentEmojis(state),\n        userSkinTone: getUserSkinTone(state),\n        currentTeamName: currentTeam ? currentTeam.name : '',\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            getCustomEmojis,\n            searchCustomEmojis,\n            incrementEmojiPickerPage,\n            setUserSkinTone,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EmojiPicker);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React, {PureComponent} from 'react';\nimport {Tab, Tabs} from 'react-bootstrap';\n\nimport GifPicker from 'components/gif_picker/gif_picker.jsx';\nimport EmojiIcon from 'components/widgets/icons/emoji_icon';\nimport GfycatIcon from 'components/widgets/icons/gfycat_icon';\n\nimport EmojiPickerHeader from './components/emoji_picker_header';\n\nimport EmojiPicker from './';\n\nexport default class EmojiPickerTabs extends PureComponent {\n    static propTypes = {\n        style: PropTypes.object,\n        rightOffset: PropTypes.number,\n        topOffset: PropTypes.number,\n        leftOffset: PropTypes.number,\n        placement: PropTypes.oneOf(['top', 'bottom', 'left', 'right']),\n        customEmojis: PropTypes.object,\n        onEmojiClose: PropTypes.func.isRequired,\n        onEmojiClick: PropTypes.func.isRequired,\n        onGifClick: PropTypes.func,\n        enableGifPicker: PropTypes.bool,\n    };\n\n    static defaultProps = {\n        rightOffset: 0,\n        topOffset: 0,\n        leftOffset: 0,\n    };\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            emojiTabVisible: true,\n            filter: '',\n        };\n    }\n\n    handleEnterEmojiTab = () => {\n        this.setState({\n            emojiTabVisible: true,\n        });\n    };\n\n    handleExitEmojiTab = () => {\n        this.setState({\n            emojiTabVisible: false,\n        });\n    };\n\n    handleEmojiPickerClose = () => {\n        this.props.onEmojiClose();\n    };\n\n    handleFilterChange = (filter) => {\n        this.setState({filter});\n    };\n\n    render() {\n        let pickerStyle;\n        if (this.props.style && !(this.props.style.left === 0 && this.props.style.top === 0)) {\n            if (this.props.placement === 'top' || this.props.placement === 'bottom') {\n                // Only take the top/bottom position passed by React Bootstrap since we want to be right-aligned\n                pickerStyle = {\n                    top: this.props.style.top,\n                    bottom: this.props.style.bottom,\n                    right: this.props.rightOffset,\n                };\n            } else {\n                pickerStyle = {...this.props.style};\n            }\n\n            pickerStyle.top = pickerStyle.top ? pickerStyle.top + this.props.topOffset : this.props.topOffset;\n\n            if (pickerStyle.left) {\n                pickerStyle.left += this.props.leftOffset;\n            }\n        }\n\n        let pickerClass = 'emoji-picker';\n        if (this.props.placement === 'bottom') {\n            pickerClass += ' bottom';\n        }\n\n        if (this.props.enableGifPicker && typeof this.props.onGifClick != 'undefined') {\n            return (\n                <Tabs\n                    defaultActiveKey={1}\n                    id='emoji-picker-tabs'\n                    style={pickerStyle}\n                    className={pickerClass}\n                    justified={true}\n                >\n                    <EmojiPickerHeader handleEmojiPickerClose={this.handleEmojiPickerClose}/>\n                    <Tab\n                        eventKey={1}\n                        onEnter={this.handleEnterEmojiTab}\n                        onExit={this.handleExitEmojiTab}\n                        title={\n                            <div className={'custom-emoji-tab__icon__text'}>\n                                <EmojiIcon\n                                    className='custom-emoji-tab__icon'\n                                />\n                                <div>\n                                    {'Emojis'}\n                                </div>\n                            </div>\n                        }\n                        tabClassName={'custom-emoji-tab'}\n                    >\n                        <EmojiPicker\n                            style={this.props.style}\n                            onEmojiClose={this.props.onEmojiClose}\n                            onEmojiClick={this.props.onEmojiClick}\n                            customEmojis={this.props.customEmojis}\n                            visible={this.state.emojiTabVisible}\n                            filter={this.state.filter}\n                            handleFilterChange={this.handleFilterChange}\n                        />\n                    </Tab>\n                    <Tab\n                        eventKey={2}\n                        title={<GfycatIcon/>}\n                        mountOnEnter={true}\n                        unmountOnExit={true}\n                        tabClassName={'custom-emoji-tab'}\n                    >\n                        <GifPicker\n                            onGifClick={this.props.onGifClick}\n                            defaultSearchText={this.state.filter}\n                            handleSearchTextChange={this.handleFilterChange}\n                        />\n                    </Tab>\n                </Tabs>\n            );\n        }\n\n        return (\n            <div\n                id='emojiPicker'\n                style={pickerStyle}\n                className={`a11y__popup ${pickerClass} emoji-picker--single`}\n            >\n                <EmojiPickerHeader handleEmojiPickerClose={this.handleEmojiPickerClose}/>\n                <EmojiPicker\n                    style={this.props.style}\n                    onEmojiClose={this.props.onEmojiClose}\n                    onEmojiClick={this.props.onEmojiClick}\n                    customEmojis={this.props.customEmojis}\n                    filter={this.state.filter}\n                    handleFilterChange={this.handleFilterChange}\n                />\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {Overlay} from 'react-bootstrap';\nimport memoize from 'memoize-one';\n\nimport {popOverOverlayPosition} from 'utils/position_utils.tsx';\nimport {Constants} from 'utils/constants';\n\nimport EmojiPickerTabs from './emoji_picker_tabs.jsx';\n\nexport default class EmojiPickerOverlay extends React.PureComponent {\n    // An emoji picker in the center channel is contained within the post list, so it needs space\n    // above for the channel header and below for the post textbox\n    static CENTER_SPACE_REQUIRED_ABOVE = 476;\n    static CENTER_SPACE_REQUIRED_BELOW = 497;\n\n    // An emoji picker in the RHS isn't constrained by the RHS, so it just needs space to fit\n    // the emoji picker itself\n    static RHS_SPACE_REQUIRED_ABOVE = 420;\n    static RHS_SPACE_REQUIRED_BELOW = 420;\n\n    static propTypes = {\n        show: PropTypes.bool.isRequired,\n        container: PropTypes.func,\n        target: PropTypes.func.isRequired,\n        onEmojiClick: PropTypes.func.isRequired,\n        onGifClick: PropTypes.func,\n        onHide: PropTypes.func.isRequired,\n        topOffset: PropTypes.number,\n        rightOffset: PropTypes.number,\n        leftOffset: PropTypes.number,\n        spaceRequiredAbove: PropTypes.number,\n        spaceRequiredBelow: PropTypes.number,\n        enableGifPicker: PropTypes.bool,\n        defaultHorizontalPosition: PropTypes.oneOf(['left', 'right']),\n    };\n\n    // Reasonable defaults calculated from from the center channel\n    static defaultProps = {\n        spaceRequiredAbove: EmojiPickerOverlay.CENTER_SPACE_REQUIRED_ABOVE,\n        spaceRequiredBelow: EmojiPickerOverlay.CENTER_SPACE_REQUIRED_BELOW,\n        enableGifPicker: false,\n    };\n\n    emojiPickerPosition = memoize((emojiTrigger, show) => {\n        let calculatedRightOffset = Constants.DEFAULT_EMOJI_PICKER_RIGHT_OFFSET;\n\n        if (!show) {\n            return calculatedRightOffset;\n        }\n\n        if (emojiTrigger) {\n            calculatedRightOffset = window.innerWidth - emojiTrigger.getBoundingClientRect().left - Constants.DEFAULT_EMOJI_PICKER_LEFT_OFFSET;\n\n            if (calculatedRightOffset < Constants.DEFAULT_EMOJI_PICKER_RIGHT_OFFSET) {\n                calculatedRightOffset = Constants.DEFAULT_EMOJI_PICKER_RIGHT_OFFSET;\n            }\n        }\n\n        return calculatedRightOffset;\n    });\n\n    getPlacement = memoize((target, spaceRequiredAbove, spaceRequiredBelow, defaultHorizontalPosition, show) => {\n        if (!show) {\n            return 'top';\n        }\n\n        if (target) {\n            const targetBounds = target.getBoundingClientRect();\n            return popOverOverlayPosition(targetBounds, window.innerHeight, spaceRequiredAbove, spaceRequiredBelow, defaultHorizontalPosition);\n        }\n\n        return 'top';\n    });\n\n    render() {\n        const {target, rightOffset, spaceRequiredAbove, spaceRequiredBelow, defaultHorizontalPosition, show} = this.props;\n\n        const calculatedRightOffset = typeof rightOffset === 'undefined' ? this.emojiPickerPosition(target(), show) : rightOffset;\n        const placement = this.getPlacement(target(), spaceRequiredAbove, spaceRequiredBelow, defaultHorizontalPosition, show);\n\n        return (\n            <Overlay\n                show={show}\n                placement={placement}\n                rootClose={true}\n                container={this.props.container}\n                onHide={this.props.onHide}\n                target={target}\n                animation={false}\n            >\n                <EmojiPickerTabs\n                    enableGifPicker={this.props.enableGifPicker}\n                    onEmojiClose={this.props.onHide}\n                    onEmojiClick={this.props.onEmojiClick}\n                    onGifClick={this.props.onGifClick}\n                    rightOffset={calculatedRightOffset}\n                    topOffset={this.props.topOffset}\n                    leftOffset={this.props.leftOffset}\n                />\n            </Overlay>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\ntype Props = {\n    url: string;\n    messageId: string;\n    defaultMessage: string;\n}\n\nconst ErrorLink: React.FC<Props> = ({url, messageId, defaultMessage}: Props) => {\n    return (\n        <a\n            href={url}\n            rel='noopener noreferrer'\n            target='_blank'\n        >\n            <FormattedMessage\n                id={messageId}\n                defaultMessage={defaultMessage}\n            />\n        </a>\n    );\n};\n\nErrorLink.defaultProps = {\n    url: '',\n    messageId: '',\n    defaultMessage: '',\n};\n\nexport default ErrorLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {PostImage} from 'mattermost-redux/types/posts';\n\nimport {getImageSrc} from 'utils/post_utils';\n\ninterface Props {\n    children: (src: string) => React.ReactNode;\n    enableSVGs: boolean;\n    hasImageProxy: boolean;\n    imageMetadata?: PostImage;\n    src: string;\n}\n\nexport default class ExternalImage extends React.PureComponent<Props> {\n    isSVGImage = () => {\n        if (!this.props.imageMetadata) {\n            // Just check if the string contains an svg extension instead of if it ends with one because it avoids\n            // having to deal with query strings and proxied image URLs\n            return this.props.src.indexOf('.svg') !== -1;\n        }\n\n        return this.props.imageMetadata.format === 'svg';\n    }\n\n    shouldRenderImage = () => {\n        // Return true unless the image is an SVG and we have SVG rendering disabled\n        return this.props.enableSVGs || !this.isSVGImage();\n    }\n\n    render() {\n        let src = getImageSrc(this.props.src, this.props.hasImageProxy);\n\n        if (!this.shouldRenderImage()) {\n            src = '';\n        }\n\n        return this.props.children(src);\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {GlobalState} from 'types/store';\n\nimport ExternalImage from './external_image';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n\n    return {\n        enableSVGs: config.EnableSVGs === 'true',\n        hasImageProxy: config.HasImageProxy === 'true',\n    };\n}\n\nexport default connect(mapStateToProps)(ExternalImage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {getFileThumbnailUrl, getFileUrl} from 'mattermost-redux/utils/file_utils';\nimport {FileInfo} from 'mattermost-redux/types/files';\n\nimport Constants, {FileTypes} from 'utils/constants';\nimport {\n    getFileType,\n    getIconClassName,\n    isGIFImage,\n} from 'utils/utils.jsx';\n\ntype Props = {\n    enableSVGs: boolean;\n    fileInfo: FileInfo;\n}\n\nexport default class FileThumbnail extends React.PureComponent<Props> {\n    render() {\n        const {fileInfo} = this.props;\n        const type = getFileType(fileInfo.extension);\n\n        let thumbnail;\n        if (type === FileTypes.IMAGE) {\n            let className = 'post-image';\n\n            if (fileInfo.width < Constants.THUMBNAIL_WIDTH && fileInfo.height < Constants.THUMBNAIL_HEIGHT) {\n                className += ' small';\n            } else {\n                className += ' normal';\n            }\n\n            let thumbnailUrl = getFileThumbnailUrl(fileInfo.id);\n            if (isGIFImage(fileInfo.extension) && !fileInfo.has_preview_image) {\n                thumbnailUrl = getFileUrl(fileInfo.id);\n            }\n\n            return (\n                <div\n                    className={className}\n                    style={{\n                        backgroundImage: `url(${thumbnailUrl})`,\n                        backgroundSize: 'cover',\n                    }}\n                />\n            );\n        } else if (fileInfo.extension === FileTypes.SVG && this.props.enableSVGs) {\n            thumbnail = (\n                <img\n                    alt={'file thumbnail image'}\n                    className='post-image normal'\n                    src={getFileUrl(fileInfo.id)}\n                />\n            );\n        } else {\n            thumbnail = <div className={'file-icon ' + getIconClassName(type)}/>;\n        }\n\n        return thumbnail;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {GlobalState} from 'types/store';\n\nimport FileThumbnail from './file_thumbnail';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        enableSVGs: getConfig(state).EnableSVGs === 'true',\n    };\n}\n\nexport default connect(mapStateToProps)(FileThumbnail);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\n\nimport {getFileDownloadUrl} from 'mattermost-redux/utils/file_utils';\nimport {FileInfo} from 'mattermost-redux/types/files';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport AttachmentIcon from 'components/widgets/icons/attachment_icon';\nimport {trimFilename} from 'utils/file_utils';\nimport {localizeMessage} from 'utils/utils.jsx';\n\ntype Props = {\n\n    /*\n     * File detailed information\n     */\n    fileInfo: FileInfo;\n\n    /*\n     * Handler for when the thumbnail is clicked passed the index above\n     */\n    handleImageClick?: (event: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => void;\n\n    /*\n     * Display in compact format\n     */\n    compactDisplay?: boolean;\n\n    /*\n     * If it should display link to download on file name\n     */\n    canDownload?: boolean;\n\n    /*\n     * Optional children like download icon\n     */\n    children?: React.ReactNode;\n\n    /*\n     * Optional class like for icon\n     */\n    iconClass?: string;\n}\n\nexport default class FilenameOverlay extends React.PureComponent<Props> {\n    render() {\n        const {\n            canDownload,\n            children,\n            compactDisplay,\n            fileInfo,\n            handleImageClick,\n            iconClass,\n        } = this.props;\n\n        const fileName = fileInfo.name;\n        const trimmedFilename = trimFilename(fileName);\n\n        let filenameOverlay;\n        if (compactDisplay) {\n            filenameOverlay = (\n                <OverlayTrigger\n                    delayShow={1000}\n                    placement='top'\n                    overlay={<Tooltip id='file-name__tooltip'>{fileName}</Tooltip>}\n                >\n                    <a\n                        id='file-attachment-link'\n                        href='#'\n                        onClick={handleImageClick}\n                        className='post-image__name'\n                        rel='noopener noreferrer'\n                    >\n                        <AttachmentIcon className='icon'/>\n                        {trimmedFilename}\n                    </a>\n                </OverlayTrigger>\n            );\n        } else if (canDownload) {\n            filenameOverlay = (\n                <div className={iconClass || 'post-image__name'}>\n                    <OverlayTrigger\n                        delayShow={1000}\n                        placement='top'\n                        overlay={\n                            <Tooltip id='file-name__tooltip'>\n                                {localizeMessage('view_image_popover.download', 'Download')}\n                            </Tooltip>\n                        }\n                    >\n                        <a\n                            href={getFileDownloadUrl(fileInfo.id)}\n                            aria-label={localizeMessage('view_image_popover.download', 'Download').toLowerCase()}\n                            download={fileName}\n                            target='_blank'\n                            rel='noopener noreferrer'\n                        >\n                            {children || trimmedFilename}\n                        </a>\n                    </OverlayTrigger>\n                </div>\n            );\n        } else {\n            filenameOverlay = (\n                <span className='post-image__name'>\n                    {trimmedFilename}\n                </span>\n            );\n        }\n\n        return (filenameOverlay);\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport classNames from 'classnames';\n\nimport * as GlobalActions from 'actions/global_actions';\n\nimport {getFileThumbnailUrl, getFileUrl} from 'mattermost-redux/utils/file_utils';\nimport {FileInfo} from 'mattermost-redux/types/files';\nimport {FileDropdownPluginComponent} from 'types/store/plugins';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport Menu from 'components/widgets/menu/menu';\n\nimport {Constants, FileTypes} from 'utils/constants';\nimport {trimFilename} from 'utils/file_utils';\nimport {\n    fileSizeToString,\n    getFileType,\n    loadImage,\n    localizeMessage,\n} from 'utils/utils.jsx';\n\nimport FilenameOverlay from './filename_overlay';\nimport FileThumbnail from './file_thumbnail';\n\ninterface Props {\n\n    /*\n    * File detailed information\n    */\n    fileInfo: FileInfo;\n\n    /*\n    * The index of this attachment preview in the parent FileAttachmentList\n    */\n    index: number;\n\n    /*\n    * Handler for when the thumbnail is clicked passed the index above\n    */\n    handleImageClick?: (index: number) => void;\n\n    /*\n    * Display in compact format\n    */\n    compactDisplay?: boolean;\n    canDownloadFiles?: boolean;\n    enableSVGs: boolean;\n    enablePublicLink: boolean;\n    pluginMenuItems: FileDropdownPluginComponent[];\n    handleFileDropdownOpened?: (open: boolean) => void;\n}\n\ninterface State {\n    loaded: boolean;\n    keepOpen: boolean;\n    openUp: boolean;\n    fileInfo: FileInfo;\n}\n\nexport default class FileAttachment extends React.PureComponent<Props, State> {\n    mounted = false;\n    private readonly buttonRef: React.RefObject<HTMLButtonElement>;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            loaded: getFileType(props.fileInfo.extension) !== FileTypes.IMAGE,\n            fileInfo: props.fileInfo,\n            keepOpen: false,\n            openUp: false,\n        };\n        this.buttonRef = React.createRef<HTMLButtonElement>();\n    }\n\n    componentDidMount() {\n        this.mounted = true;\n        this.loadFiles();\n    }\n\n    static getDerivedStateFromProps(nextProps: Props, prevState: State) {\n        if (nextProps.fileInfo.id !== prevState.fileInfo.id) {\n            const extension = nextProps.fileInfo.extension;\n\n            return {\n                loaded: getFileType(extension) !== FileTypes.IMAGE && !(nextProps.enableSVGs && extension === FileTypes.SVG),\n                fileInfo: nextProps.fileInfo,\n            };\n        }\n\n        return null;\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (!this.state.loaded && this.props.fileInfo.id !== prevProps.fileInfo.id) {\n            this.loadFiles();\n        }\n    }\n\n    componentWillUnmount() {\n        this.mounted = false;\n    }\n\n    loadFiles = () => {\n        const fileInfo = this.props.fileInfo;\n        const fileType = getFileType(fileInfo.extension);\n\n        if (fileType === FileTypes.IMAGE) {\n            const thumbnailUrl = getFileThumbnailUrl(fileInfo.id);\n\n            loadImage(thumbnailUrl, this.handleImageLoaded);\n        } else if (fileInfo.extension === FileTypes.SVG && this.props.enableSVGs) {\n            loadImage(getFileUrl(fileInfo.id), this.handleImageLoaded);\n        }\n    }\n\n    handleImageLoaded = () => {\n        if (this.mounted) {\n            this.setState({\n                loaded: true,\n            });\n        }\n    }\n\n    onAttachmentClick = (e: React.MouseEvent<HTMLElement, MouseEvent>) => {\n        e.preventDefault();\n\n        if ('blur' in e.target) {\n            (e.target as HTMLElement).blur();\n        }\n\n        if (this.props.handleImageClick) {\n            this.props.handleImageClick(this.props.index);\n        }\n    }\n\n    refCallback = (menuRef: Menu) => {\n        if (menuRef) {\n            const anchorRect = this.buttonRef.current?.getBoundingClientRect();\n            let y;\n            if (typeof anchorRect?.y === 'undefined') {\n                y = typeof anchorRect?.top === 'undefined' ? 0 : anchorRect?.top;\n            } else {\n                y = anchorRect?.y;\n            }\n            const windowHeight = window.innerHeight;\n\n            const totalSpace = windowHeight - 80;\n            const spaceOnTop = y - Constants.CHANNEL_HEADER_HEIGHT;\n            const spaceOnBottom = (totalSpace - (spaceOnTop + Constants.POST_AREA_HEIGHT));\n\n            this.setState({\n                openUp: (spaceOnTop > spaceOnBottom),\n            });\n        }\n    }\n\n    private handleDropdownOpened = (open: boolean) => {\n        this.props.handleFileDropdownOpened?.(open);\n        this.setState({keepOpen: open});\n    }\n\n    handleGetPublicLink = () => {\n        GlobalActions.showGetPublicLinkModal(this.props.fileInfo.id);\n    }\n\n    private renderFileMenuItems = () => {\n        const {enablePublicLink, fileInfo, pluginMenuItems} = this.props;\n\n        let divider;\n        const defaultItems = [];\n        if (enablePublicLink) {\n            defaultItems.push(\n                <Menu.ItemAction\n                    data-title='Public Image'\n                    onClick={this.handleGetPublicLink}\n                    ariaLabel={localizeMessage('view_image_popover.publicLink', 'Get a public link')}\n                    text={localizeMessage('view_image_popover.publicLink', 'Get a public link')}\n                />,\n            );\n        }\n\n        const pluginItems = pluginMenuItems?.filter((item) => item?.match(fileInfo)).map((item) => {\n            return (\n                <Menu.ItemAction\n                    id={item.id + '_pluginmenuitem'}\n                    key={item.id + '_pluginmenuitem'}\n                    onClick={() => item?.action(fileInfo)}\n                    text={item.text}\n                />\n            );\n        });\n\n        const isMenuVisible = defaultItems?.length || pluginItems?.length;\n        if (!isMenuVisible) {\n            return null;\n        }\n\n        const isDividerVisible = defaultItems?.length && pluginItems?.length;\n        if (isDividerVisible) {\n            divider = (\n                <li\n                    id={`divider_file_${fileInfo.id}_plugins`}\n                    className='MenuItem__divider'\n                    role='menuitem'\n                />\n            );\n        }\n\n        const tooltip = (\n            <Tooltip id='file-name__tooltip'>\n                {localizeMessage('file_search_result_item.more_actions', 'More Actions')}\n            </Tooltip>\n        );\n\n        return (\n            <MenuWrapper\n                onToggle={this.handleDropdownOpened}\n                stopPropagationOnToggle={true}\n            >\n                <OverlayTrigger\n                    className='hidden-xs'\n                    delayShow={1000}\n                    placement='top'\n                    overlay={tooltip}\n                >\n                    <button\n                        ref={this.buttonRef}\n                        id={`file_action_button_${this.props.fileInfo.id}`}\n                        aria-label={localizeMessage('file_search_result_item.more_actions', 'More Actions').toLowerCase()}\n                        className={classNames(\n                            'file-dropdown-icon', 'dots-icon',\n                            {'a11y--active': this.state.keepOpen},\n                        )}\n                        aria-expanded={this.state.keepOpen}\n                    >\n                        <i className='icon icon-dots-vertical'/>\n                    </button>\n                </OverlayTrigger>\n                <Menu\n                    id={`file_dropdown_${this.props.fileInfo.id}`}\n                    ariaLabel={'file menu'}\n                    openLeft={true}\n                    openUp={this.state.openUp}\n                    ref={this.refCallback}\n                >\n                    {defaultItems}\n                    {divider}\n                    {pluginItems}\n                </Menu>\n            </MenuWrapper>\n        );\n    }\n\n    render() {\n        const {\n            compactDisplay,\n            fileInfo,\n        } = this.props;\n\n        const trimmedFilename = trimFilename(fileInfo.name);\n        let fileThumbnail;\n        let fileDetail;\n        let fileActions;\n        const ariaLabelImage = `${localizeMessage('file_attachment.thumbnail', 'file thumbnail')} ${fileInfo.name}`.toLowerCase();\n\n        if (!compactDisplay) {\n            fileThumbnail = (\n                <a\n                    aria-label={ariaLabelImage}\n                    className='post-image__thumbnail'\n                    href='#'\n                    onClick={this.onAttachmentClick}\n                >\n                    {this.state.loaded ? (\n                        <FileThumbnail fileInfo={fileInfo}/>\n                    ) : (\n                        <div className='post-image__load'/>\n                    )}\n                </a>\n            );\n\n            fileDetail = (\n                <div\n                    className='post-image__detail_wrapper'\n                    onClick={this.onAttachmentClick}\n                >\n                    <div className='post-image__detail'>\n                        <span className={'post-image__name'}>\n                            {trimmedFilename}\n                        </span>\n                        <span className='post-image__type'>{fileInfo.extension.toUpperCase()}</span>\n                        <span className='post-image__size'>{fileSizeToString(fileInfo.size)}</span>\n                    </div>\n                </div>\n            );\n\n            fileActions = this.renderFileMenuItems();\n        }\n\n        let filenameOverlay;\n        if (this.props.canDownloadFiles) {\n            filenameOverlay = (\n                <FilenameOverlay\n                    fileInfo={fileInfo}\n                    compactDisplay={compactDisplay}\n                    canDownload={this.props.canDownloadFiles}\n                    handleImageClick={this.onAttachmentClick}\n                    iconClass={'post-image__download'}\n                >\n                    <i className='icon icon-download-outline'/>\n                </FilenameOverlay>\n            );\n        }\n\n        return (\n            <div\n                className={\n                    classNames([\n                        'post-image__column',\n                        {'keep-open': this.state.keepOpen},\n                    ])\n                }\n            >\n                {fileThumbnail}\n                <div className='post-image__details'>\n                    {fileDetail}\n                    {fileActions}\n                    {filenameOverlay}\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {getFilesDropdownPluginMenuItems} from 'selectors/plugins';\nimport {GlobalState} from 'types/store';\nimport {canDownloadFiles} from 'utils/file_utils';\n\nimport FileAttachment from './file_attachment';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n\n    return {\n        canDownloadFiles: canDownloadFiles(config),\n        enableSVGs: config.EnableSVGs === 'true',\n        enablePublicLink: config.EnablePublicLink === 'true',\n        pluginMenuItems: getFilesDropdownPluginMenuItems(state),\n    };\n}\n\nexport default connect(mapStateToProps)(FileAttachment);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {getFilePreviewUrl, getFileUrl} from 'mattermost-redux/utils/file_utils';\nimport {FileInfo} from 'mattermost-redux/types/files';\n\nimport SizeAwareImage from 'components/size_aware_image';\nimport {FileTypes} from 'utils/constants';\nimport {\n    getFileType,\n} from 'utils/utils';\n\nimport FilePreviewModal from 'components/file_preview_modal';\n\nconst PREVIEW_IMAGE_MIN_DIMENSION = 50;\n\ntype Props = {\n    postId: string;\n    fileInfo?: FileInfo;\n    isRhsOpen: boolean;\n    compactDisplay?: boolean;\n    isEmbedVisible?: boolean;\n    actions: {\n        toggleEmbedVisibility: (postId: string) => void;\n    };\n}\n\ntype State = {\n    loaded: boolean;\n    showPreviewModal: boolean;\n    dimensions: {\n        width: number;\n        height: number;\n    };\n}\n\nexport default class SingleImageView extends React.PureComponent<Props, State> {\n    private mounted: boolean;\n    static defaultProps = {\n        compactDisplay: false,\n    };\n\n    constructor(props: Props) {\n        super(props);\n        this.mounted = true;\n        this.state = {\n            loaded: false,\n            showPreviewModal: false,\n            dimensions: {\n                width: props.fileInfo?.width || 0,\n                height: props.fileInfo?.height || 0,\n            },\n        };\n    }\n\n    componentDidMount() {\n        this.mounted = true;\n    }\n\n    static getDerivedStateFromProps(props: Props, state: State) {\n        if ((props.fileInfo?.width !== state.dimensions.width) || props.fileInfo.height !== state.dimensions.height) {\n            return {\n                dimensions: {\n                    width: props.fileInfo?.width,\n                    height: props.fileInfo?.height,\n                },\n            };\n        }\n        return null;\n    }\n\n    componentWillUnmount() {\n        this.mounted = false;\n    }\n\n    imageLoaded = () => {\n        if (this.mounted) {\n            this.setState({loaded: true});\n        }\n    }\n\n    handleImageClick = (e: React.MouseEvent<HTMLDivElement>) => {\n        e.preventDefault();\n        this.setState({showPreviewModal: true});\n    }\n\n    showPreviewModal = () => {\n        this.setState({showPreviewModal: false});\n    }\n\n    toggleEmbedVisibility = () => {\n        this.props.actions.toggleEmbedVisibility(this.props.postId);\n    }\n\n    render() {\n        const {fileInfo, compactDisplay} = this.props;\n        const {\n            loaded,\n        } = this.state;\n\n        if (fileInfo === undefined) {\n            return <></>;\n        }\n\n        const {has_preview_image: hasPreviewImage, id} = fileInfo;\n        const fileURL = getFileUrl(id);\n        const previewURL = hasPreviewImage ? getFilePreviewUrl(id) : fileURL;\n\n        const previewHeight = fileInfo.height;\n        const previewWidth = fileInfo.width;\n\n        let minPreviewClass = '';\n        if (\n            previewWidth < PREVIEW_IMAGE_MIN_DIMENSION ||\n            previewHeight < PREVIEW_IMAGE_MIN_DIMENSION\n        ) {\n            minPreviewClass = 'min-preview ';\n\n            if (previewHeight > previewWidth) {\n                minPreviewClass += 'min-preview--portrait ';\n            }\n        }\n\n        // Add compact display class to image class if in compact mode\n        if (compactDisplay) {\n            minPreviewClass += ' compact-display';\n        }\n\n        const toggle = (\n            <button\n                key='toggle'\n                className='style--none post__embed-visibility'\n                data-expanded={this.props.isEmbedVisible}\n                aria-label='Toggle Embed Visibility'\n                onClick={this.toggleEmbedVisibility}\n            />\n        );\n\n        let imageNameClass = 'image-name';\n        if (compactDisplay) {\n            imageNameClass += ' compact-display';\n        }\n\n        const fileHeader = (\n            <div className='image-header'>\n                <div\n                    data-testid='image-name'\n                    className={imageNameClass}\n                >\n                    <div\n                        onClick={this.handleImageClick}\n                    >\n                        {fileInfo.name}\n                    </div>\n                </div>\n                {toggle}\n            </div>\n        );\n\n        let viewImageModal;\n        let fadeInClass = '';\n\n        const fileType = getFileType(fileInfo.extension);\n        let styleIfSvgWithDimensions = {};\n        let imageContainerStyle = {};\n        let svgClass = '';\n        if (fileType === FileTypes.SVG) {\n            svgClass = 'svg';\n            if (this.state.dimensions.height) {\n                styleIfSvgWithDimensions = {\n                    width: '100%',\n                };\n            } else {\n                imageContainerStyle = {\n                    height: 350,\n                    maxWidth: '100%',\n                };\n            }\n        }\n\n        if (loaded) {\n            viewImageModal = (\n                <FilePreviewModal\n                    show={this.state.showPreviewModal}\n                    onModalDismissed={this.showPreviewModal}\n                    fileInfos={[fileInfo]}\n                    postId={this.props.postId}\n                />\n            );\n\n            fadeInClass = 'image-fade-in';\n        }\n\n        return (\n            <div\n                className={`${'file-view--single'}`}\n            >\n                <div\n                    className='file__image'\n                >\n                    {fileHeader}\n                    {this.props.isEmbedVisible &&\n                    <div\n                        className='image-container'\n                        style={imageContainerStyle}\n                    >\n                        <div\n                            className={`image-loaded ${fadeInClass} ${svgClass}`}\n                            style={styleIfSvgWithDimensions}\n                        >\n                            <SizeAwareImage\n                                onClick={this.handleImageClick}\n                                className={minPreviewClass}\n                                src={previewURL}\n                                dimensions={this.state.dimensions}\n                                fileInfo={this.props.fileInfo}\n                                onImageLoaded={this.imageLoaded}\n                                showLoader={this.props.isEmbedVisible}\n                                handleSmallImageContainer={true}\n                            />\n                        </div>\n                    </div>\n                    }\n                    {viewImageModal}\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {GlobalState} from 'types/store';\n\nimport {toggleEmbedVisibility} from 'actions/post_actions';\n\nimport {getIsRhsOpen} from 'selectors/rhs';\n\nimport SingleImageView from 'components/single_image_view/single_image_view';\n\nfunction mapStateToProps(state: GlobalState) {\n    const isRhsOpen = getIsRhsOpen(state);\n\n    return {\n        isRhsOpen,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            toggleEmbedVisibility,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SingleImageView);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {sortFileInfos} from 'mattermost-redux/utils/file_utils';\n\nimport {FileInfo} from 'mattermost-redux/types/files';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {FileTypes} from 'utils/constants';\nimport {getFileType} from 'utils/utils';\n\nimport FileAttachment from 'components/file_attachment';\nimport SingleImageView from 'components/single_image_view';\nimport FilePreviewModal from 'components/file_preview_modal';\n\nexport type Props = {\n\n    /*\n     * The post the files are attached to\n     */\n    post: Post;\n    fileCount: number;\n\n    /*\n     * Sorted array of metadata for each file attached to the post\n     */\n    fileInfos: FileInfo[];\n\n    compactDisplay?: boolean;\n    enableSVGs?: boolean;\n    isEmbedVisible?: boolean;\n    locale: string;\n\n    handleFileDropdownOpened: (open: boolean) => void;\n}\n\ntype State = {\n    showPreviewModal: boolean;\n    startImgIndex: number;\n}\n\nexport default class FileAttachmentList extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {showPreviewModal: false, startImgIndex: 0};\n    }\n\n    handleImageClick = (indexClicked: number) => {\n        this.setState({showPreviewModal: true, startImgIndex: indexClicked});\n    }\n\n    hidePreviewModal = () => {\n        this.setState({showPreviewModal: false});\n    }\n\n    render() {\n        const {\n            compactDisplay,\n            enableSVGs,\n            fileInfos,\n            fileCount,\n            locale,\n        } = this.props;\n\n        if (fileInfos && fileInfos.length === 1) {\n            const fileType = getFileType(fileInfos[0].extension);\n\n            if (fileType === FileTypes.IMAGE || (fileType === FileTypes.SVG && enableSVGs)) {\n                return (\n                    <SingleImageView\n                        fileInfo={fileInfos[0]}\n                        isEmbedVisible={this.props.isEmbedVisible}\n                        postId={this.props.post.id}\n                        compactDisplay={compactDisplay}\n                    />\n                );\n            }\n        } else if (fileCount === 1 && this.props.isEmbedVisible) {\n            return (\n                <div style={style.minHeightPlaceholder}/>\n            );\n        }\n\n        const sortedFileInfos = sortFileInfos(fileInfos, locale);\n        const postFiles = [];\n        if (sortedFileInfos && sortedFileInfos.length > 0) {\n            for (let i = 0; i < sortedFileInfos.length; i++) {\n                const fileInfo = sortedFileInfos[i];\n                postFiles.push(\n                    <FileAttachment\n                        key={fileInfo.id}\n                        fileInfo={sortedFileInfos[i]}\n                        index={i}\n                        handleImageClick={this.handleImageClick}\n                        compactDisplay={compactDisplay}\n                        handleFileDropdownOpened={this.props.handleFileDropdownOpened}\n                    />,\n                );\n            }\n        } else if (fileCount > 0) {\n            for (let i = 0; i < fileCount; i++) {\n                // Add a placeholder to avoid pop-in once we get the file infos for this post\n                postFiles.push(\n                    <div\n                        key={`fileCount-${i}`}\n                        className='post-image__column post-image__column--placeholder'\n                    />,\n                );\n            }\n        }\n\n        return (\n            <>\n                <div\n                    data-testid='fileAttachmentList'\n                    className='post-image__columns clearfix'\n                >\n                    {postFiles}\n                </div>\n                <FilePreviewModal\n                    show={this.state.showPreviewModal}\n                    onModalDismissed={this.hidePreviewModal}\n                    startIndex={this.state.startImgIndex}\n                    fileInfos={sortedFileInfos}\n                    postId={this.props.post.id}\n                />\n            </>\n        );\n    }\n}\n\nconst style = {\n    minHeightPlaceholder: {minHeight: '385px'},\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {makeGetFilesForPost} from 'mattermost-redux/selectors/entities/files';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {GlobalState} from 'types/store';\nimport {getCurrentLocale} from 'selectors/i18n';\nimport {isEmbedVisible} from 'selectors/posts';\n\nimport FileAttachmentList from './file_attachment_list';\n\ntype OwnProps = {\n    post: Post;\n}\n\nfunction makeMapStateToProps() {\n    const selectFilesForPost = makeGetFilesForPost();\n\n    return function mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n        const postId = ownProps.post ? ownProps.post.id : '';\n        const fileInfos = selectFilesForPost(state, postId);\n\n        let fileCount = 0;\n        if (ownProps.post.metadata && ownProps.post.metadata.files) {\n            fileCount = (ownProps.post.metadata.files || []).length;\n        } else if (ownProps.post.file_ids) {\n            fileCount = ownProps.post.file_ids.length;\n        } else if (ownProps.post.filenames) {\n            fileCount = ownProps.post.filenames.length;\n        }\n\n        return {\n            enableSVGs: getConfig(state).EnableSVGs === 'true',\n            fileInfos,\n            fileCount,\n            isEmbedVisible: isEmbedVisible(state, ownProps.post.id),\n            locale: getCurrentLocale(state),\n        };\n    };\n}\n\nexport default connect(makeMapStateToProps)(FileAttachmentList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport * as Utils from 'utils/utils.jsx';\n\ntype Props = {\n    fileInfo: {\n        name: string;\n        extension: string;\n        size: number;\n    };\n    fileUrl: string;\n    canDownloadFiles: boolean;\n};\n\nexport default class FileInfoPreview extends React.PureComponent<Props> {\n    render() {\n        const fileInfo = this.props.fileInfo;\n        const fileUrl = this.props.fileUrl;\n\n        // non-image files include a section providing details about the file\n        const infoParts = [];\n\n        if (fileInfo.extension !== '') {\n            infoParts.push(Utils.localizeMessage('file_info_preview.type', 'File type ') + fileInfo.extension.toUpperCase());\n        }\n\n        if (fileInfo.size) {\n            infoParts.push(Utils.localizeMessage('file_info_preview.size', 'Size ') + Utils.fileSizeToString(fileInfo.size));\n        }\n\n        const infoString = infoParts.join(', ');\n\n        let preview = null;\n        if (this.props.canDownloadFiles) {\n            preview = (\n                <a\n                    className='file-details__preview'\n                    href={fileUrl}\n                    target='_blank'\n                    rel='noopener noreferrer'\n                >\n                    <span className='file-details__preview-helper'/>\n                    <img\n                        alt={'file preview'}\n                        src={Utils.getFileIconPath(fileInfo)}\n                    />\n                </a>\n            );\n        } else {\n            preview = (\n                <span className='file-details__preview'>\n                    <span className='file-details__preview-helper'/>\n                    <img\n                        alt={'file preview'}\n                        src={Utils.getFileIconPath(fileInfo)}\n                    />\n                </span>\n            );\n        }\n\n        return (\n            <div className='file-details__container'>\n                {preview}\n                <div className='file-details'>\n                    <div className='file-details__name'>{fileInfo.name}</div>\n                    <div className='file-details__info'>{infoString}</div>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {GlobalState} from 'types/store';\n\nimport {canDownloadFiles} from 'utils/file_utils.jsx';\n\nimport FileInfoPreview from './file_info_preview';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n\n    return {\n        canDownloadFiles: canDownloadFiles(config),\n    };\n}\n\nexport default connect(mapStateToProps)(FileInfoPreview);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {ProgressBar} from 'react-bootstrap';\n\nimport FilenameOverlay from 'components/file_attachment/filename_overlay';\nimport {getFileTypeFromMime} from 'utils/file_utils';\nimport * as Utils from 'utils/utils.jsx';\n\nimport {FilePreviewInfo} from './file_preview';\n\ntype Props = {\n    handleRemove: (id: string) => void;\n    clientId: string;\n    fileInfo: FilePreviewInfo;\n}\n\nexport default class FileProgressPreview extends React.PureComponent<Props> {\n    handleRemove = () => {\n        this.props.handleRemove(this.props.clientId);\n    }\n\n    render() {\n        let percent = 0;\n        let fileNameComponent;\n        let previewImage;\n        let progressBar;\n        const {fileInfo, clientId} = this.props;\n\n        if (fileInfo) {\n            percent = fileInfo.percent ? fileInfo.percent : 0;\n            const percentTxt = ` (${percent.toFixed(0)}%)`;\n            const fileType = getFileTypeFromMime(fileInfo.type);\n            previewImage = <div className={'file-icon ' + Utils.getIconClassName(fileType)}/>;\n\n            fileNameComponent = (\n                <React.Fragment>\n                    <FilenameOverlay\n                        fileInfo={fileInfo}\n                        compactDisplay={false}\n                        canDownload={false}\n                    />\n                    <span className='post-image__uploadingTxt'>\n                        {percent === 100 ? (\n                            <FormattedMessage\n                                id='create_post.fileProcessing'\n                                defaultMessage='Processing...'\n                            />\n                        ) : (\n                            <React.Fragment>\n                                <FormattedMessage\n                                    id='admin.plugin.uploading'\n                                    defaultMessage='Uploading...'\n                                />\n                                <span>{percentTxt}</span>\n                            </React.Fragment>\n                        )}\n                    </span>\n                </React.Fragment>\n            );\n\n            if (percent) {\n                progressBar = (\n                    <ProgressBar\n                        className='post-image__progressBar'\n                        now={percent}\n                        active={percent === 100}\n                    />\n                );\n            }\n        }\n\n        return (\n            <div\n                ref={clientId}\n                key={clientId}\n                className='file-preview post-image__column'\n                data-client-id={clientId}\n            >\n                <div className='post-image__thumbnail'>\n                    {previewImage}\n                </div>\n                <div className='post-image__details'>\n                    <div className='post-image__detail_wrapper'>\n                        <div className='post-image__detail'>\n                            {fileNameComponent}\n                        </div>\n                    </div>\n                    <div>\n                        <a\n                            className='file-preview__remove'\n                            onClick={this.handleRemove}\n                        >\n                            <i className='icon icon-close'/>\n                        </a>\n                    </div>\n                    {progressBar}\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport React, {ReactNode} from 'react';\n\nimport {getFileThumbnailUrl, getFileUrl} from 'mattermost-redux/utils/file_utils';\nimport {FileInfo} from 'mattermost-redux/types/files';\n\nimport FilenameOverlay from 'components/file_attachment/filename_overlay';\nimport Constants, {FileTypes} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\n\nimport FileProgressPreview from './file_progress_preview';\n\ntype UploadInfo = {\n    name: string;\n    percent?: number;\n    type?: string;\n}\nexport type FilePreviewInfo = FileInfo & UploadInfo;\n\ntype Props = {\n    enableSVGs: boolean;\n    onRemove: (id: string) => void;\n    fileInfos: FilePreviewInfo[];\n    uploadsInProgress?: string[];\n    uploadsProgressPercent?: {[clientID: string]: FilePreviewInfo};\n}\n\nexport default class FilePreview extends React.PureComponent<Props> {\n    static defaultProps = {\n        fileInfos: [],\n        uploadsInProgress: [],\n        uploadsProgressPercent: {},\n    };\n\n    handleRemove = (id: string) => {\n        this.props.onRemove(id);\n    }\n\n    render() {\n        const previews: ReactNode[] = [];\n\n        this.props.fileInfos.forEach((info) => {\n            const type = Utils.getFileType(info.extension);\n\n            let className = 'file-preview post-image__column';\n            let previewImage;\n            if (type === FileTypes.SVG && this.props.enableSVGs) {\n                previewImage = (\n                    <img\n                        alt={'file preview'}\n                        className='post-image normal'\n                        src={getFileUrl(info.id)}\n                    />\n                );\n            } else if (type === FileTypes.IMAGE) {\n                let imageClassName = 'post-image';\n\n                if ((info.width && info.width < Constants.THUMBNAIL_WIDTH) && (info.height && info.height < Constants.THUMBNAIL_HEIGHT)) {\n                    imageClassName += ' small';\n                } else {\n                    imageClassName += ' normal';\n                }\n\n                let thumbnailUrl = getFileThumbnailUrl(info.id);\n                if (Utils.isGIFImage(info.extension) && !info.has_preview_image) {\n                    thumbnailUrl = getFileUrl(info.id);\n                }\n\n                previewImage = (\n                    <div\n                        className={imageClassName}\n                        style={{\n                            backgroundImage: `url(${thumbnailUrl})`,\n                            backgroundSize: 'cover',\n                        }}\n                    />\n                );\n            } else {\n                className += ' custom-file';\n                previewImage = <div className={'file-icon ' + Utils.getIconClassName(type)}/>;\n            }\n\n            previews.push(\n                <div\n                    key={info.id}\n                    className={className}\n                >\n                    <div className='post-image__thumbnail'>\n                        {previewImage}\n                    </div>\n                    <div className='post-image__details'>\n                        <div className='post-image__detail_wrapper'>\n                            <div className='post-image__detail'>\n                                <FilenameOverlay\n                                    fileInfo={info}\n                                    compactDisplay={false}\n                                    canDownload={false}\n                                />\n                                {info.extension && <span className='post-image__type'>{info.extension.toUpperCase()}</span>}\n                                <span className='post-image__size'>{Utils.fileSizeToString(info.size)}</span>\n                            </div>\n                        </div>\n                        <div>\n                            <a\n                                className='file-preview__remove'\n                                onClick={this.handleRemove.bind(this, info.id)}\n                            >\n                                <i className='icon icon-close'/>\n                            </a>\n                        </div>\n                    </div>\n                </div>,\n            );\n        });\n\n        if (this.props.uploadsInProgress && this.props.uploadsProgressPercent) {\n            const uploadsProgressPercent = this.props.uploadsProgressPercent;\n            this.props.uploadsInProgress.forEach((clientId) => {\n                const fileInfo = uploadsProgressPercent[clientId];\n                if (fileInfo) {\n                    previews.push(\n                        <FileProgressPreview\n                            key={clientId}\n                            clientId={clientId}\n                            fileInfo={fileInfo}\n                            handleRemove={this.handleRemove}\n                        />,\n                    );\n                }\n            });\n        }\n\n        return (\n            <div\n                className='file-preview__container'\n                ref='container'\n            >\n                {previews}\n            </div>\n        );\n    }\n}\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {GlobalState} from 'types/store';\n\nimport FilePreview from './file_preview';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n\n    return {\n        enableSVGs: config.EnableSVGs === 'true',\n    };\n}\n\nexport default connect(mapStateToProps)(FilePreview);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport $ from 'jquery';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport Constants from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\n\nimport FileInfoPreview from 'components/file_info_preview';\n\nexport default class AudioVideoPreview extends React.PureComponent {\n    static propTypes = {\n\n        /**\n        * Compare file types\n        */\n        fileInfo: PropTypes.object.isRequired,\n\n        /**\n        *  URL of pdf file to output and compare to update props url\n        */\n        fileUrl: PropTypes.string.isRequired,\n    }\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            canPlay: true,\n        };\n        this.videoRef = React.createRef();\n        this.sourceRef = React.createRef();\n    }\n\n    componentDidMount() {\n        this.handleFileInfoChanged(this.props.fileInfo);\n\n        if (this.sourceRef.current) {\n            $(ReactDOM.findDOMNode(this.sourceRef.current)).one('error', this.handleLoadError);\n        }\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.fileUrl !== prevProps.fileUrl) {\n            this.handleFileInfoChanged(this.props.fileInfo);\n        }\n\n        if (this.sourceRef.current) {\n            $(ReactDOM.findDOMNode(this.sourceRef.current)).one('error', this.handleLoadError);\n        }\n    }\n\n    handleFileInfoChanged = (fileInfo) => {\n        let video = ReactDOM.findDOMNode(this.videoRef.current);\n        if (!video) {\n            video = document.createElement('video');\n        }\n\n        const canPlayType = video.canPlayType(fileInfo.mime_type);\n\n        this.setState({\n            canPlay: canPlayType === 'probably' || canPlayType === 'maybe',\n        });\n    }\n\n    handleLoadError = () => {\n        this.setState({\n            canPlay: false,\n        });\n    }\n\n    stop = () => {\n        if (this.videoRef.current) {\n            const video = ReactDOM.findDOMNode(this.videoRef.current);\n            video.pause();\n            video.currentTime = 0;\n        }\n    }\n\n    render() {\n        if (!this.state.canPlay) {\n            return (\n                <FileInfoPreview\n                    fileInfo={this.props.fileInfo}\n                    fileUrl={this.props.fileUrl}\n                />\n            );\n        }\n\n        let width = Constants.WEB_VIDEO_WIDTH;\n        let height = Constants.WEB_VIDEO_HEIGHT;\n        if (Utils.isMobile()) {\n            width = Constants.MOBILE_VIDEO_WIDTH;\n            height = Constants.MOBILE_VIDEO_HEIGHT;\n        }\n\n        // add a key to the video to prevent React from using an old video source while a new one is loading\n        return (\n            <video\n                key={this.props.fileInfo.id}\n                ref={this.videoRef}\n                data-setup='{}'\n                controls='controls'\n                width={width}\n                height={height}\n            >\n                <source\n                    ref={this.sourceRef}\n                    src={this.props.fileUrl}\n                />\n            </video>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport $ from 'jquery';\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport Constants from 'utils/constants.jsx';\nimport * as SyntaxHighlighting from 'utils/syntax_highlighting';\n\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\nimport FileInfoPreview from 'components/file_info_preview';\n\nexport default class CodePreview extends React.PureComponent {\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            code: '',\n            lang: '',\n            loading: true,\n            success: true,\n        };\n    }\n\n    componentDidMount() {\n        this.getCode();\n    }\n\n    static getDerivedStateFromProps(props, state) {\n        if (props.fileUrl !== state.prevFileUrl) {\n            const usedLanguage = SyntaxHighlighting.getLanguageFromFileExtension(props.fileInfo.extension);\n\n            if (!usedLanguage || props.fileInfo.size > Constants.CODE_PREVIEW_MAX_FILE_SIZE) {\n                return {\n                    code: '',\n                    lang: '',\n                    loading: false,\n                    success: false,\n                    prevFileUrl: props.fileUrl,\n                };\n            }\n\n            return {\n                code: '',\n                lang: usedLanguage,\n                loading: true,\n                prevFileUrl: props.fileUrl,\n            };\n        }\n        return null;\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.fileUrl !== prevProps.fileUrl) {\n            this.getCode();\n        }\n    }\n\n    getCode = () => {\n        if (!this.state.lang || this.props.fileInfo.size > Constants.CODE_PREVIEW_MAX_FILE_SIZE) {\n            return;\n        }\n        $.ajax({ // eslint-disable-line jquery/no-ajax\n            async: true,\n            url: this.props.fileUrl,\n            type: 'GET',\n            dataType: 'text',\n            error: this.handleReceivedError,\n            success: this.handleReceivedCode,\n        });\n    }\n\n    handleReceivedCode = (data) => {\n        let code = data;\n        if (data.nodeName === '#document') {\n            code = new XMLSerializer().serializeToString(data);\n        }\n        this.setState({\n            code,\n            loading: false,\n            success: true,\n        });\n    }\n\n    handleReceivedError = () => {\n        this.setState({loading: false, success: false});\n    }\n\n    static supports(fileInfo) {\n        return Boolean(SyntaxHighlighting.getLanguageFromFileExtension(fileInfo.extension));\n    }\n\n    render() {\n        if (this.state.loading) {\n            return (\n                <div className='view-image__loading'>\n                    <LoadingSpinner/>\n                </div>\n            );\n        }\n\n        if (!this.state.success) {\n            return (\n                <FileInfoPreview\n                    fileInfo={this.props.fileInfo}\n                    fileUrl={this.props.fileUrl}\n                />\n            );\n        }\n\n        const language = SyntaxHighlighting.getLanguageName(this.state.lang);\n\n        const highlighted = SyntaxHighlighting.highlight(this.state.lang, this.state.code);\n\n        return (\n            <div className='post-code code-preview'>\n                <span className='post-code__language'>\n                    {`${this.props.fileInfo.name} - ${language}`}\n                </span>\n                <div className='hljs'>\n                    <div className='post-code__line-numbers'>\n                        {SyntaxHighlighting.renderLineNumbers(this.state.code)}\n                    </div>\n                    <code dangerouslySetInnerHTML={{__html: highlighted}}/>\n                </div>\n            </div>\n        );\n    }\n}\n\nCodePreview.propTypes = {\n    fileInfo: PropTypes.object.isRequired,\n    fileUrl: PropTypes.string.isRequired,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport {getFilePreviewUrl, getFileDownloadUrl} from 'mattermost-redux/utils/file_utils';\n\nimport './image_preview.scss';\n\nexport default function ImagePreview({fileInfo, canDownloadFiles}) {\n    const isExternalFile = !fileInfo.id;\n\n    let fileUrl;\n    let previewUrl;\n    if (isExternalFile) {\n        fileUrl = fileInfo.link;\n        previewUrl = fileInfo.link;\n    } else {\n        fileUrl = getFileDownloadUrl(fileInfo.id);\n        previewUrl = fileInfo.has_preview_image ? getFilePreviewUrl(fileInfo.id) : fileUrl;\n    }\n\n    if (!canDownloadFiles) {\n        return <img src={previewUrl}/>;\n    }\n\n    return (\n        <a\n            className='image_preview'\n            href='#'\n        >\n            <img\n                className='image_preview__image'\n                data-testid='imagePreview'\n                alt={'preview url image'}\n                src={previewUrl}\n            />\n        </a>\n    );\n}\n\nImagePreview.propTypes = {\n    fileInfo: PropTypes.object.isRequired,\n    canDownloadFiles: PropTypes.bool.isRequired,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {memo} from 'react';\n\nimport {useSelector} from 'react-redux';\nimport {FormattedMessage} from 'react-intl';\n\nimport Avatar from '../../widgets/users/avatar/avatar';\nimport {imageURLForUser} from '../../../utils/utils';\nimport {GlobalState} from '../../../types/store';\nimport {\n    getUser as selectUser,\n    makeGetDisplayName,\n} from 'mattermost-redux/selectors/entities/users';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {getChannel as selectChannel} from 'mattermost-redux/selectors/entities/channels';\nimport Post from '../../post_view/post/post';\n\nimport './file_preview_modal_info.scss';\n\ninterface Props {\n    showFileName: boolean;\n    filename: string;\n    post: React.ComponentProps<typeof Post>;\n}\n\nconst displayNameGetter = makeGetDisplayName();\n\nconst FilePreviewModalInfo: React.FC<Props> = (props: Props) => {\n    const user = useSelector((state: GlobalState) => selectUser(state, props.post.user_id)) as UserProfile | undefined;\n    const channel = useSelector((state: GlobalState) => selectChannel(state, props.post.channel_id));\n    const name = useSelector((state: GlobalState) => displayNameGetter(state, props.post.user_id, true));\n\n    let info;\n    const channelName = (\n        <FormattedMessage\n            id='file_preview_modal_info.shared_in'\n            defaultMessage='Shared in ~{name}'\n            values={{\n                name: channel.name,\n            }}\n        />\n    );\n    if (props.showFileName) {\n        info = (\n            <>\n                <h5 className='file-preview-modal__file-name'>{props.filename}\n                </h5>\n                <span className='file-preview-modal__file-details'>\n                    <span className='file-preview-modal__file-details-user-name'>{name}</span>\n                    <span className='file-preview-modal__channel'>{channelName}</span>\n                </span>\n            </>\n        );\n    } else {\n        info = (\n            <>\n                <h5 className='file-preview-modal__user-name'>{name}\n                </h5>\n                <span className='file-preview-modal__channel'>{channelName}\n                </span>\n            </>\n        );\n    }\n\n    return (\n        <div className='file-preview-modal__info'>\n            <Avatar\n                size='lg'\n                url={imageURLForUser(props.post.user_id, user?.last_picture_update)}\n                className='file-preview-modal__avatar'\n            />\n            <div className='file-preview-modal__info-details'>\n                {info}\n            </div>\n        </div>\n    );\n};\n\nexport default memo(FilePreviewModalInfo);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {memo, useEffect, useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {Tooltip} from 'react-bootstrap';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport OverlayTrigger from '../../overlay_trigger';\nimport Constants from '../../../utils/constants';\n\nimport './file_preview_modal_main_actions.scss';\n\nimport {GlobalState} from '../../../types/store';\nimport {getFilePublicLink} from 'mattermost-redux/actions/files';\nimport {getFilePublicLink as selectFilePublicLink} from 'mattermost-redux/selectors/entities/files';\nimport {copyToClipboard} from '../../../utils/utils';\nimport {FileInfo} from 'mattermost-redux/types/files';\n\ninterface DownloadLinkProps {\n    download?: string;\n}\n\ninterface Props {\n    usedInside?: 'Header' | 'Footer';\n    showOnlyClose?: boolean;\n    showClose?: boolean;\n    filename: string;\n    fileURL: string;\n    fileInfo: FileInfo;\n    enablePublicLink: boolean;\n    canDownloadFiles: boolean;\n    handleModalClose: () => void;\n}\n\nconst FilePreviewModalMainActions: React.FC<Props> = (props: Props) => {\n    const tooltipPlacement = props.usedInside === 'Header' ? 'bottom' : 'top';\n    const selectedFilePublicLink = useSelector((state: GlobalState) => selectFilePublicLink(state)?.link);\n    const dispatch = useDispatch();\n    const [publicLinkCopied, setPublicLinkCopied] = useState(false);\n\n    useEffect(() => {\n        dispatch(getFilePublicLink(props.fileInfo.id));\n    }, [props.fileInfo]);\n    const copyPublicLink = () => {\n        copyToClipboard(selectedFilePublicLink);\n        setPublicLinkCopied(true);\n    };\n\n    const closeButton = (\n        <OverlayTrigger\n            delayShow={Constants.OVERLAY_TIME_DELAY}\n            key='publicLink'\n            placement={tooltipPlacement}\n            overlay={\n                <Tooltip id='close-icon-tooltip'>\n                    <FormattedMessage\n                        id='full_screen_modal.close'\n                        defaultMessage='Close'\n                    />\n                </Tooltip>\n            }\n        >\n            <button\n                className='file-preview-modal-main-actions__action-item'\n                onClick={props.handleModalClose}\n            >\n                <i className='icon icon-close'/>\n            </button>\n        </OverlayTrigger>\n    );\n    let publicTooltipMessage = (\n        <FormattedMessage\n            id='view_image_popover.publicLink'\n            defaultMessage='Get a public link'\n        />\n    );\n    if (publicLinkCopied) {\n        publicTooltipMessage = (\n            <FormattedMessage\n                id='file_preview_modal_main_actions.public_link-copied'\n                defaultMessage='Public link copied'\n            />\n        );\n    }\n    const publicLink = (\n        <OverlayTrigger\n            delayShow={Constants.OVERLAY_TIME_DELAY}\n            key='filePreviewPublicLink'\n            placement={tooltipPlacement}\n            shouldUpdatePosition={true}\n            onExit={() => setPublicLinkCopied(false)}\n            overlay={\n                <Tooltip id='link-variant-icon-tooltip'>\n                    {publicTooltipMessage}\n                </Tooltip>\n            }\n        >\n            <a\n                href='#'\n                className='file-preview-modal-main-actions__action-item'\n                onClick={copyPublicLink}\n            >\n                <i className='icon icon-link-variant'/>\n            </a>\n        </OverlayTrigger>\n    );\n    const downloadLinkProps: DownloadLinkProps = {};\n    downloadLinkProps.download = props.filename;\n    const download = (\n        <OverlayTrigger\n            delayShow={Constants.OVERLAY_TIME_DELAY}\n            key='download'\n            placement={tooltipPlacement}\n            overlay={\n                <Tooltip id='download-icon-tooltip'>\n                    <FormattedMessage\n                        id='view_image_popover.download'\n                        defaultMessage='Download'\n                    />\n                </Tooltip>\n            }\n        >\n            <a\n                href={props.fileURL}\n                className='file-preview-modal-main-actions__action-item'\n                target='_blank'\n                rel='noopener noreferrer'\n                download={props.filename}\n            >\n                <i className='icon icon-download-outline'/>\n            </a>\n        </OverlayTrigger>\n    );\n    return (\n        <div className='file-preview-modal-main-actions__actions'>\n            {!props.showOnlyClose && props.enablePublicLink && publicLink}\n            {!props.showOnlyClose && props.canDownloadFiles && download}\n            {props.showClose && closeButton}\n        </div>\n    );\n};\n\nFilePreviewModalMainActions.defaultProps = {\n    showOnlyClose: false,\n    usedInside: 'Header',\n    showClose: true,\n};\n\nexport default memo(FilePreviewModalMainActions);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {memo} from 'react';\n\nimport Post from '../../post_view/post/post';\nimport FilePreviewModalInfo from '../file_preview_modal_info/file_preview_modal_info';\nimport FilePreviewModalMainActions from '../file_preview_modal_main_actions/file_preview_modal_main_actions';\n\nimport './file_preview_modal_footer.scss';\nimport {FileInfo} from 'mattermost-redux/types/files';\n\ninterface Props {\n    fileInfo: FileInfo;\n    filename: string;\n    post: React.ComponentProps<typeof Post>;\n    fileURL: string;\n    showPublicLink?: boolean;\n    enablePublicLink: boolean;\n    canDownloadFiles: boolean;\n    isExternalFile: boolean;\n    handlePrev: () => void;\n    handleNext: () => void;\n    handleModalClose: () => void;\n}\n\nconst FilePreviewModalFooter: React.FC<Props> = ({post, ...actionProps}: Props) => {\n    return (\n        <div className='file-preview-modal-footer'>\n            <FilePreviewModalInfo\n                showFileName={false}\n                post={post}\n                filename={actionProps.filename}\n            />\n            <FilePreviewModalMainActions\n                {...actionProps}\n                showClose={false}\n                usedInside='Footer'\n                showOnlyClose={false}\n            />\n        </div>\n    );\n};\nexport default memo(FilePreviewModalFooter);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport './file_preview_modal_main_nav.scss';\nimport {Tooltip} from 'react-bootstrap';\n\nimport OverlayTrigger from '../../overlay_trigger';\nimport Constants from '../../../utils/constants';\n\ninterface Props {\n    fileIndex: number;\n    totalFiles: number;\n    handlePrev: () => void;\n    handleNext: () => void;\n}\n\nconst FilePreviewModalMainNav: React.FC<Props> = (props: Props) => {\n    const leftArrow = (\n        <OverlayTrigger\n            delayShow={Constants.OVERLAY_TIME_DELAY}\n            key='previewArrowLeft'\n            placement='bottom'\n            overlay={\n                <Tooltip id='close-icon-tooltip'>\n                    <FormattedMessage\n                        id='generic.previous'\n                        defaultMessage='Close'\n                    />\n                </Tooltip>\n            }\n        >\n            <button\n                id='previewArrowLeft'\n                className='file_preview_modal_main_nav__prev'\n                onClick={props.handlePrev}\n            >\n                <i className='icon icon-chevron-left'/>\n            </button>\n        </OverlayTrigger>\n    );\n\n    const rightArrow = (\n        <OverlayTrigger\n            delayShow={Constants.OVERLAY_TIME_DELAY}\n            key='publicLink'\n            placement='bottom'\n            overlay={\n                <Tooltip id='close-icon-tooltip'>\n                    <FormattedMessage\n                        id='generic.next'\n                        defaultMessage='Next'\n                    />\n                </Tooltip>\n            }\n        >\n            <button\n                id='previewArrowRight'\n                className='file_preview_modal_main_nav__next'\n                onClick={props.handleNext}\n            >\n                <i className='icon icon-chevron-right'/>\n            </button>\n        </OverlayTrigger>\n    );\n    return (\n        <div className='file_preview_modal_main_nav'>\n            {leftArrow}\n            <span className='modal-bar-file-count'>\n                <FormattedMessage\n                    id='file_preview_modal_main_nav.file'\n                    defaultMessage='{count, number} of {total, number}'\n                    values={{\n                        count: (props.fileIndex + 1),\n                        total: props.totalFiles,\n                    }}\n                />\n            </span>\n            {rightArrow}\n        </div>\n    );\n};\n\nexport default memo(FilePreviewModalMainNav);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {memo} from 'react';\n\nimport Post from '../../post_view/post/post';\n\nimport './file_preview_modal_header.scss';\nimport FilePreviewModalInfo from '../file_preview_modal_info/file_preview_modal_info';\nimport FilePreviewModalMainNav from '../file_preview_modal_main_nav/file_preview_modal_main_nav';\nimport FilePreviewModalMainActions from '../file_preview_modal_main_actions/file_preview_modal_main_actions';\nimport {FileInfo} from 'mattermost-redux/types/files';\n\ninterface Props {\n    isMobile: boolean;\n    fileIndex: number;\n    fileInfo: FileInfo;\n    totalFiles: number;\n    filename: string;\n    post: React.ComponentProps<typeof Post>;\n    fileURL: string;\n    showPublicLink?: boolean;\n    enablePublicLink: boolean;\n    canDownloadFiles: boolean;\n    isExternalFile: boolean;\n    handlePrev: () => void;\n    handleNext: () => void;\n    handleModalClose: () => void;\n}\n\nconst FilePreviewModalHeader: React.FC<Props> = ({post, totalFiles, fileIndex, ...actionProps}: Props) => {\n    let mainActions = (<div/>);\n    if (totalFiles > 1) {\n        mainActions = (\n            <FilePreviewModalMainNav\n                totalFiles={totalFiles}\n                fileIndex={fileIndex}\n                handlePrev={actionProps.handlePrev}\n                handleNext={actionProps.handleNext}\n            />\n        );\n    }\n    const actions = (\n        <FilePreviewModalMainActions\n            {...actionProps}\n            showOnlyClose={actionProps.isMobile}\n            usedInside='Header'\n        />);\n    return (\n        <div className='file-preview-modal-header'>\n            {actionProps.isMobile && actions}\n            {!actionProps.isMobile &&\n            <FilePreviewModalInfo\n                showFileName={true}\n                post={post}\n                filename={actionProps.filename}\n            />\n            }\n            {mainActions}\n            {!actionProps.isMobile && actions}\n        </div>\n    );\n};\n\nexport default memo(FilePreviewModalHeader);\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport debounce from 'lodash/debounce';\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport {Constants, ZoomSettings} from 'utils/constants';\n\nexport interface Props {\n    scale?: number;\n    showZoomControls?: boolean;\n    handleZoomIn?: () => void;\n    handleZoomOut?: () => void;\n    handleZoomReset?: () => void;\n}\n\nexport default class PopoverBar extends React.PureComponent<Props> {\n    render() {\n        const zoomControls: React.ReactNode[] = [];\n        let wrappedZoomControls: React.ReactNode = null;\n        if (this.props.showZoomControls) {\n            let zoomResetButton;\n            let zoomOutButton;\n            let zoomInButton;\n\n            if (this.props.scale && this.props.scale > ZoomSettings.MIN_SCALE) {\n                zoomOutButton = (\n                    <span className='modal-zoom-btn'>\n                        <a onClick={this.props.handleZoomOut && debounce(this.props.handleZoomOut, 300, {maxWait: 300})}>\n                            <i className='icon icon-minus'/>\n                        </a>\n                    </span>\n                );\n            } else {\n                zoomOutButton = (\n                    <span className='btn-inactive'>\n                        <i className='icon icon-minus'/>\n                    </span>\n                );\n            }\n            zoomControls.push(\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    key='zoomOut'\n                    placement='top'\n                    overlay={\n                        <Tooltip id='zoom-out-icon-tooltip'>\n                            <FormattedMessage\n                                id='view_image.zoom_out'\n                                defaultMessage='Zoom Out'\n                            />\n                        </Tooltip>\n                    }\n                >\n                    {zoomOutButton}\n                </OverlayTrigger>,\n            );\n\n            if (this.props.scale && this.props.scale > ZoomSettings.DEFAULT_SCALE) {\n                zoomResetButton = (\n                    <span className='modal-zoom-btn'>\n                        <a onClick={this.props.handleZoomReset}>\n                            <i className='icon icon-magnify-minus'/>\n                        </a>\n                    </span>\n                );\n            } else if (this.props.scale && this.props.scale < ZoomSettings.DEFAULT_SCALE) {\n                zoomResetButton = (\n                    <span className='modal-zoom-btn'>\n                        <a onClick={this.props.handleZoomReset}>\n                            <i className='icon icon-magnify-plus'/>\n                        </a>\n                    </span>\n                );\n            } else {\n                zoomResetButton = (\n                    <span className='btn-inactive'>\n                        <i className='icon icon-magnify-minus'/>\n                    </span>\n                );\n            }\n            zoomControls.push(\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    key='zoomReset'\n                    placement='top'\n                    overlay={\n                        <Tooltip id='zoom-reset-icon-tooltip'>\n                            <FormattedMessage\n                                id='view_image.zoom_reset'\n                                defaultMessage='Reset Zoom'\n                            />\n                        </Tooltip>\n                    }\n                >\n                    {zoomResetButton}\n                </OverlayTrigger>,\n            );\n\n            if (this.props.scale && this.props.scale < ZoomSettings.MAX_SCALE) {\n                zoomInButton = (\n                    <span className='modal-zoom-btn'>\n                        <a onClick={this.props.handleZoomIn && debounce(this.props.handleZoomIn, 300, {maxWait: 300})}>\n                            <i className='icon icon-plus'/>\n                        </a>\n                    </span>\n\n                );\n            } else {\n                zoomInButton = (\n                    <span className='btn-inactive'>\n                        <i className='icon icon-plus'/>\n                    </span>\n                );\n            }\n            zoomControls.push(\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    key='zoomIn'\n                    placement='top'\n                    overlay={\n                        <Tooltip id='zoom-in-icon-tooltip'>\n                            <FormattedMessage\n                                id='view_image.zoom_in'\n                                defaultMessage='Zoom In'\n                            />\n                        </Tooltip>\n                    }\n                >\n                    {zoomInButton}\n                </OverlayTrigger>,\n            );\n\n            wrappedZoomControls = (\n                <div className='modal-column'>\n                    {zoomControls}\n                </div>\n            );\n        }\n\n        return (\n            <div\n                data-testid='fileCountFooter'\n                ref='imageFooter'\n                className='modal-button-bar file-preview-modal__zoom-bar'\n            >\n                {wrappedZoomControls}\n            </div>\n        );\n    }\n}\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PopoverBar from './popover_bar';\n\nexport default PopoverBar;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\n\nimport {getFileDownloadUrl, getFilePreviewUrl, getFileUrl} from 'mattermost-redux/utils/file_utils';\nimport LoadingImagePreview from 'components/loading_image_preview';\nimport Constants, {FileTypes, ZoomSettings} from 'utils/constants';\nimport * as Utils from 'utils/utils';\nimport AudioVideoPreview from 'components/audio_video_preview';\nimport CodePreview from 'components/code_preview';\nimport FileInfoPreview from 'components/file_info_preview';\n\nimport ImagePreview from './image_preview';\nimport './file_preview_modal.scss';\nimport FilePreviewModalFooter from './file_preview_modal_footer/file_preview_modal_footer';\nimport FilePreviewModalHeader from './file_preview_modal_header/file_preview_modal_header';\nimport PopoverBar from './popover_bar';\n\nconst PDFPreview = React.lazy(() => import('components/pdf_preview'));\n\nconst KeyCodes = Constants.KeyCodes;\n\nexport default class FilePreviewModal extends React.PureComponent {\n    static propTypes = {\n\n        /**\n         * The post the files are attached to\n         */\n        postId: PropTypes.string,\n\n        /**\n         * The post the files are attached to\n         */\n        post: PropTypes.object,\n\n        /**\n         * Set whether to show this modal or not\n         */\n        show: PropTypes.bool.isRequired,\n\n        /**\n         * Function to call when this modal is dismissed\n         **/\n        onModalDismissed: PropTypes.func.isRequired,\n\n        /**\n         * List of FileInfo to view\n         **/\n        fileInfos: PropTypes.arrayOf(PropTypes.object).isRequired,\n\n        /**\n         * The index number of starting image\n         **/\n        startIndex: PropTypes.number,\n\n        canDownloadFiles: PropTypes.bool,\n        enablePublicLink: PropTypes.bool,\n        pluginFilePreviewComponents: PropTypes.arrayOf(PropTypes.object),\n    };\n\n    static defaultProps = {\n        show: false,\n        fileInfos: [],\n        startIndex: 0,\n        pluginFilePreviewComponents: [],\n        post: {}, // Needed to avoid proptypes console errors for cases like channel header, which doesn't have a proper value\n    };\n\n    constructor(props) {\n        super(props);\n        const isMobile = Utils.isMobile();\n\n        this.state = {\n            isMobile,\n            imageIndex: this.props.startIndex,\n            imageHeight: '100%',\n            loaded: Utils.fillArray(false, this.props.fileInfos.length),\n            progress: Utils.fillArray(0, this.props.fileInfos.length),\n            showCloseBtn: false,\n            showZoomControls: false,\n            scale: Utils.fillArray(ZoomSettings.DEFAULT_SCALE, this.props.fileInfos.length),\n        };\n        this.videoRef = React.createRef();\n    }\n\n    handleNext = (e) => {\n        if (e) {\n            e.stopPropagation();\n        }\n        let id = this.state.imageIndex + 1;\n        if (id > this.props.fileInfos.length - 1) {\n            id = 0;\n        }\n        this.showImage(id);\n    }\n\n    handlePrev = (e) => {\n        if (e) {\n            e.stopPropagation();\n        }\n        let id = this.state.imageIndex - 1;\n        if (id < 0) {\n            id = this.props.fileInfos.length - 1;\n        }\n        this.showImage(id);\n    }\n\n    handleKeyPress = (e) => {\n        if (Utils.isKeyPressed(e, KeyCodes.RIGHT)) {\n            this.handleNext();\n        } else if (Utils.isKeyPressed(e, KeyCodes.LEFT)) {\n            this.handlePrev();\n        }\n    }\n\n    onModalShown = (nextProps) => {\n        document.addEventListener('keyup', this.handleKeyPress);\n\n        this.showImage(nextProps.startIndex);\n    }\n\n    onModalHidden = () => {\n        document.removeEventListener('keyup', this.handleKeyPress);\n\n        if (this.videoRef.current) {\n            this.videoRef.current.stop();\n        }\n    }\n    handleWindowResize = () => {\n        const isMobile = Utils.isMobile();\n        if (isMobile !== this.state.isMobile) {\n            this.setState({\n                isMobile,\n            });\n        }\n    }\n    componentDidMount() {\n        window.addEventListener('resize', this.handleWindowResize);\n    }\n\n    componentWillUnmount() {\n        window.removeEventListener('resize', this.handleWindowResize);\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.show === true && prevProps.show === false) {\n            this.onModalShown(this.props);\n        } else if (this.props.show === false && prevProps.show === true) {\n            this.onModalHidden();\n        }\n    }\n\n    static getDerivedStateFromProps(props, state) {\n        const updatedProps = {};\n        if (props.fileInfos[state.imageIndex] && props.fileInfos[state.imageIndex].extension === FileTypes.PDF) {\n            updatedProps.showZoomControls = true;\n        } else {\n            updatedProps.showZoomControls = false;\n        }\n        if (props.fileInfos.length !== state.prevFileInfosCount) {\n            updatedProps.loaded = Utils.fillArray(false, props.fileInfos.length);\n            updatedProps.progress = Utils.fillArray(0, props.fileInfos.length);\n            updatedProps.prevFileInfosCount = props.fileInfos.length;\n        }\n        return Object.keys(updatedProps).length ? updatedProps : null;\n    }\n\n    showImage = (id) => {\n        this.setState({imageIndex: id});\n\n        const imageHeight = window.innerHeight - 100;\n        this.setState({imageHeight});\n\n        if (!this.state.loaded[id]) {\n            this.loadImage(id);\n        }\n    }\n\n    loadImage = (index) => {\n        const fileInfo = this.props.fileInfos[index];\n        const fileType = Utils.getFileType(fileInfo.extension);\n\n        if (fileType === FileTypes.IMAGE && Boolean(fileInfo.id)) {\n            let previewUrl;\n            if (fileInfo.has_image_preview) {\n                previewUrl = getFilePreviewUrl(fileInfo.id);\n            } else {\n                // some images (eg animated gifs) just show the file itself and not a preview\n                previewUrl = getFileUrl(fileInfo.id);\n            }\n\n            Utils.loadImage(\n                previewUrl,\n                () => this.handleImageLoaded(index),\n                (completedPercentage) => this.handleImageProgress(index, completedPercentage),\n            );\n        } else {\n            // there's nothing to load for non-image files\n            this.handleImageLoaded(index);\n        }\n    }\n\n    handleImageLoaded = (index) => {\n        this.setState((prevState) => {\n            return {\n                loaded: {\n                    ...prevState.loaded,\n                    [index]: true,\n                },\n            };\n        });\n    }\n\n    handleImageProgress = (index, completedPercentage) => {\n        this.setState((prevState) => {\n            return {\n                progress: {\n                    ...prevState.progress,\n                    [index]: completedPercentage,\n                },\n            };\n        });\n    }\n\n    onMouseEnterImage = () => {\n        this.setState({showCloseBtn: true});\n    }\n\n    onMouseLeaveImage = () => {\n        this.setState({showCloseBtn: false});\n    }\n\n    setScale = (index, scale) => {\n        this.setState((prevState) => {\n            return {\n                scale: {\n                    ...prevState.scale,\n                    [index]: scale,\n                },\n            };\n        });\n    }\n\n    handleZoomIn = () => {\n        let newScale = this.state.scale[this.state.imageIndex];\n        newScale = Math.min(newScale + ZoomSettings.SCALE_DELTA, ZoomSettings.MAX_SCALE);\n        this.setScale(this.state.imageIndex, newScale);\n    };\n\n    handleZoomOut = () => {\n        let newScale = this.state.scale[this.state.imageIndex];\n        newScale = Math.max(newScale - ZoomSettings.SCALE_DELTA, ZoomSettings.MIN_SCALE);\n        this.setScale(this.state.imageIndex, newScale);\n    };\n\n    handleZoomReset = () => {\n        this.setScale(this.state.imageIndex, ZoomSettings.DEFAULT_SCALE);\n    }\n\n    handleModalClose = () => {\n        this.props.onModalDismissed();\n        this.setState({scale: Utils.fillArray(ZoomSettings.DEFAULT_SCALE, this.props.fileInfos.length)});\n    }\n    handleBgClose = (e) => {\n        if (e.currentTarget === e.target) {\n            this.handleModalClose();\n        }\n    }\n\n    render() {\n        if (this.props.fileInfos.length < 1 || this.props.fileInfos.length - 1 < this.state.imageIndex) {\n            return null;\n        }\n\n        const fileInfo = this.props.fileInfos[this.state.imageIndex];\n        const showPublicLink = !fileInfo.link;\n        const fileName = fileInfo.name || fileInfo.link;\n        const fileType = Utils.getFileType(fileInfo.extension);\n        const fileUrl = fileInfo.link || getFileUrl(fileInfo.id);\n        const fileDownloadUrl = fileInfo.link || getFileDownloadUrl(fileInfo.id);\n        const isExternalFile = !fileInfo.id;\n        let dialogClassName = 'a11y__modal modal-image file-preview-modal';\n\n        let content;\n        let modalImageClass = '';\n        let zoomBar;\n\n        if (this.state.loaded[this.state.imageIndex]) {\n            if (fileType === FileTypes.IMAGE || fileType === FileTypes.SVG) {\n                content = (\n                    <ImagePreview\n                        fileInfo={fileInfo}\n                        canDownloadFiles={this.props.canDownloadFiles}\n                    />\n                );\n            } else if (fileType === FileTypes.VIDEO || fileType === FileTypes.AUDIO) {\n                content = (\n                    <AudioVideoPreview\n                        fileInfo={fileInfo}\n                        fileUrl={fileUrl}\n                    />\n                );\n            } else if (fileType === FileTypes.PDF) {\n                modalImageClass = ' file-preview-modal__content-scrollable';\n                content = (\n                    <div\n                        className='file-preview-modal__scrollable'\n                        onClick={this.handleBgClose}\n                    >\n                        <React.Suspense fallback={null}>\n                            <PDFPreview\n                                fileInfo={fileInfo}\n                                fileUrl={fileUrl}\n                                scale={this.state.scale[this.state.imageIndex]}\n                                handleBgClose={this.handleBgClose}\n                            />\n                        </React.Suspense>\n                    </div>\n                );\n                zoomBar = (\n                    <PopoverBar\n                        scale={this.state.scale[this.state.imageIndex]}\n                        showZoomControls={this.state.showZoomControls}\n                        handleZoomIn={this.handleZoomIn}\n                        handleZoomOut={this.handleZoomOut}\n                        handleZoomReset={this.handleZoomReset}\n                    />\n                );\n            } else if (CodePreview.supports(fileInfo)) {\n                dialogClassName += ' modal-code';\n                content = (\n                    <CodePreview\n                        fileInfo={fileInfo}\n                        fileUrl={fileUrl}\n                        className='file-preview-modal__code-preview'\n                    />\n                );\n            } else {\n                content = (\n                    <FileInfoPreview\n                        fileInfo={fileInfo}\n                        fileUrl={fileUrl}\n                    />\n                );\n            }\n        } else {\n            // display a progress indicator when the preview for an image is still loading\n            const loading = Utils.localizeMessage('view_image.loading', 'Loading');\n            const progress = Math.floor(this.state.progress[this.state.imageIndex]);\n\n            content = (\n                <LoadingImagePreview\n                    loading={loading}\n                    progress={progress}\n                />\n            );\n        }\n\n        for (const preview of this.props.pluginFilePreviewComponents) {\n            if (preview.override(fileInfo, this.props.post)) {\n                content = (\n                    <preview.component\n                        fileInfo={fileInfo}\n                        post={this.props.post}\n                        onModalDismissed={this.props.onModalDismissed}\n                    />\n                );\n                break;\n            }\n        }\n\n        return (\n            <Modal\n                show={this.props.show}\n                onHide={this.handleModalClose}\n                className='modal-image file-preview-modal'\n                dialogClassName={dialogClassName}\n                animation={true}\n                backdrop={false}\n                role='dialog'\n                style={{'padding-left': 0}}\n                aria-labelledby='viewImageModalLabel'\n            >\n                <Modal.Body className='file-preview-modal__body'>\n                    <div\n                        className={'modal-image__wrapper'}\n                        onClick={this.handleModalClose}\n                    >\n                        <div\n                            className='file-preview-modal__main-ctr'\n                            onMouseEnter={this.onMouseEnterImage}\n                            onMouseLeave={this.onMouseLeaveImage}\n                            onClick={(e) => e.stopPropagation()}\n                        >\n                            <Modal.Title\n                                componentClass='div'\n                                id='viewImageModalLabel'\n                                className='file-preview-modal__title'\n                            >\n                                <FilePreviewModalHeader\n                                    isMobile={this.state.isMobile}\n                                    post={this.props.post}\n                                    showPublicLink={showPublicLink}\n                                    fileIndex={this.state.imageIndex}\n                                    totalFiles={this.props.fileInfos?.length}\n                                    filename={fileName}\n                                    fileURL={fileDownloadUrl}\n                                    fileInfo={fileInfo}\n                                    enablePublicLink={this.props.enablePublicLink || false}\n                                    canDownloadFiles={this.props.canDownloadFiles || false}\n                                    isExternalFile={isExternalFile}\n                                    handlePrev={this.handlePrev}\n                                    handleNext={this.handleNext}\n                                    handleModalClose={this.handleModalClose}\n                                />\n                                {zoomBar}\n                            </Modal.Title>\n                            <div\n                                className={'file-preview-modal__content' + modalImageClass}\n                                onClick={this.handleBgClose}\n                            >\n                                {content}\n                            </div>\n                            { this.state.isMobile &&\n                                <FilePreviewModalFooter\n                                    post={this.props.post}\n                                    showPublicLink={showPublicLink}\n                                    filename={fileName}\n                                    fileURL={fileDownloadUrl}\n                                    fileInfo={fileInfo}\n                                    enablePublicLink={this.props.enablePublicLink || false}\n                                    canDownloadFiles={this.props.canDownloadFiles || false}\n                                    isExternalFile={isExternalFile}\n                                    handlePrev={this.handlePrev}\n                                    handleNext={this.handleNext}\n                                    handleModalClose={this.handleModalClose}\n                                />\n                            }\n                        </div>\n                    </div>\n                </Modal.Body>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\n\nimport {canDownloadFiles} from 'utils/file_utils.jsx';\n\nimport FilePreviewModal from './file_preview_modal';\n\nfunction mapStateToProps(state, ownProps) {\n    const config = getConfig(state);\n\n    return {\n        canDownloadFiles: canDownloadFiles(config),\n        enablePublicLink: config.EnablePublicLink === 'true',\n        pluginFilePreviewComponents: state.plugins.components.FilePreview,\n        post: ownProps.post || getPost(state, ownProps.postId),\n    };\n}\n\nexport default connect(mapStateToProps)(FilePreviewModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {batchActions} from 'redux-batched-actions';\nimport request from 'superagent';\n\nimport {FileTypes} from 'mattermost-redux/action_types';\nimport {getLogErrorAction} from 'mattermost-redux/actions/errors';\nimport {forceLogoutIfNecessary} from 'mattermost-redux/actions/helpers';\nimport {Client4} from 'mattermost-redux/client';\n\nimport * as Utils from 'utils/utils.jsx';\n\nexport function uploadFile(file, name, channelId, rootId, clientId) {\n    return (dispatch) => {\n        dispatch({type: FileTypes.UPLOAD_FILES_REQUEST});\n\n        return request.\n            post(Client4.getFilesRoute()).\n            set(Client4.getOptions({method: 'post'}).headers).\n\n            // The order here is important:\n            // keeping the channel_id/client_ids fields before the files contents\n            // allows the server to stream the uploads instead of loading them in memory.\n            field('channel_id', channelId).\n            field('client_ids', clientId).\n            attach('files', file, name).\n            accept('application/json');\n    };\n}\n\nexport function handleFileUploadEnd(file, name, channelId, rootId, clientId, {err, res}) {\n    return (dispatch, getState) => {\n        if (err) {\n            let e;\n            if (res && res.body && res.body.id) {\n                e = res.body;\n            } else if (err.status === 0 || !err.status) {\n                e = {message: Utils.localizeMessage('file_upload.generic_error', 'There was a problem uploading your files.')};\n            } else {\n                e = {message: Utils.localizeMessage('channel_loader.unknown_error', 'We received an unexpected status code from the server.') + ' (' + err.status + ')'};\n            }\n\n            forceLogoutIfNecessary(err, dispatch, getState);\n\n            const failure = {\n                type: FileTypes.UPLOAD_FILES_FAILURE,\n                clientIds: [clientId],\n                channelId,\n                rootId,\n                error: err,\n            };\n\n            dispatch(batchActions([failure, getLogErrorAction(err)]));\n            return {error: e};\n        }\n        const data = res.body.file_infos.map((fileInfo, index) => {\n            return {\n                ...fileInfo,\n                clientId: res.body.client_ids[index],\n            };\n        });\n\n        dispatch(batchActions([\n            {\n                type: FileTypes.RECEIVED_UPLOAD_FILES,\n                data,\n                channelId,\n                rootId,\n            },\n            {\n                type: FileTypes.UPLOAD_FILES_SUCCESS,\n            },\n        ]));\n\n        return {data: res.body};\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React, {PureComponent} from 'react';\nimport ReactDOM from 'react-dom';\nimport {defineMessages, FormattedMessage, injectIntl} from 'react-intl';\n\nimport dragster from 'utils/dragster';\nimport Constants from 'utils/constants';\nimport DelayedAction from 'utils/delayed_action';\nimport {t} from 'utils/i18n';\nimport {\n    isIosChrome,\n    isMobileApp,\n} from 'utils/user_agent';\nimport {getTable} from 'utils/paste';\nimport {intlShape} from 'utils/react_intl';\nimport {\n    clearFileInput,\n    cmdOrCtrlPressed,\n    isKeyPressed,\n    generateId,\n    isFileTransfer,\n    isUriDrop,\n    localizeMessage,\n} from 'utils/utils.jsx';\n\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport Menu from 'components/widgets/menu/menu';\n\nimport AttachmentIcon from 'components/widgets/icons/attachment_icon';\n\nconst holders = defineMessages({\n    limited: {\n        id: t('file_upload.limited'),\n        defaultMessage: 'Uploads limited to {count, number} files maximum. Please use additional posts for more files.',\n    },\n    filesAbove: {\n        id: t('file_upload.filesAbove'),\n        defaultMessage: 'Files above {max}MB could not be uploaded: {filenames}',\n    },\n    fileAbove: {\n        id: t('file_upload.fileAbove'),\n        defaultMessage: 'File above {max}MB could not be uploaded: {filename}',\n    },\n    zeroBytesFiles: {\n        id: t('file_upload.zeroBytesFiles'),\n        defaultMessage: 'You are uploading empty files: {filenames}',\n    },\n    zeroBytesFile: {\n        id: t('file_upload.zeroBytesFile'),\n        defaultMessage: 'You are uploading an empty file: {filename}',\n    },\n    pasted: {\n        id: t('file_upload.pasted'),\n        defaultMessage: 'Image Pasted at ',\n    },\n    uploadFile: {\n        id: t('file_upload.upload_files'),\n        defaultMessage: 'Upload files',\n    },\n});\n\nconst OVERLAY_TIMEOUT = 500;\n\nconst customStyles = {\n    left: 'inherit',\n    right: 0,\n    bottom: '100%',\n    top: 'auto',\n};\n\nexport class FileUpload extends PureComponent {\n    static propTypes = {\n        channelId: PropTypes.string.isRequired,\n\n        /**\n         * Current root post's ID\n         */\n        rootId: PropTypes.string,\n\n        /**\n         * Number of files to attach\n         */\n        fileCount: PropTypes.number.isRequired,\n\n        /**\n         * Function to get file upload targeted input\n         */\n        getTarget: PropTypes.func.isRequired,\n\n        intl: intlShape.isRequired,\n\n        locale: PropTypes.string.isRequired,\n\n        /**\n         * Function to be called when file upload input is clicked\n         */\n        onClick: PropTypes.func,\n\n        /**\n         * Function to be called when file upload is complete\n         */\n        onFileUpload: PropTypes.func,\n\n        /**\n         * Function to be called when file upload input's change event is fired\n         */\n        onFileUploadChange: PropTypes.func,\n\n        /**\n         * Function to be called when upload fails\n         */\n        onUploadError: PropTypes.func,\n\n        /**\n         * Function to be called when file upload starts\n         */\n        onUploadStart: PropTypes.func,\n\n        /**\n         * Type of the object which the uploaded file is attached to\n         */\n        postType: PropTypes.string,\n\n        /**\n         * The maximum uploaded file size.\n         */\n        maxFileSize: PropTypes.number,\n\n        /**\n         * Whether or not file upload is allowed.\n         */\n        canUploadFiles: PropTypes.bool.isRequired,\n\n        /**\n         * Plugin file upload methods to be added\n         */\n        pluginFileUploadMethods: PropTypes.arrayOf(PropTypes.object),\n        pluginFilesWillUploadHooks: PropTypes.arrayOf(PropTypes.object),\n\n        /**\n         * Function called when superAgent fires progress event.\n         */\n        onUploadProgress: PropTypes.func.isRequired,\n        actions: PropTypes.shape({\n\n            /**\n             * Function to be called to upload file\n             */\n            uploadFile: PropTypes.func.isRequired,\n\n            /**\n             * Function to be called when file is uploaded or failed\n             */\n            handleFileUploadEnd: PropTypes.func.isRequired,\n        }).isRequired,\n    };\n\n    static defaultProps = {\n        pluginFileUploadMethods: [],\n        pluginFilesWillUploadHooks: [],\n    };\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            requests: {},\n            menuOpen: false,\n        };\n        this.fileInput = React.createRef();\n    }\n\n    componentDidMount() {\n        if (this.props.postType === 'post') {\n            this.registerDragEvents('.row.main', '.center-file-overlay');\n        } else if (this.props.postType === 'comment') {\n            this.registerDragEvents('.post-right__container', '.right-file-overlay');\n        }\n\n        document.addEventListener('paste', this.pasteUpload);\n        document.addEventListener('keydown', this.keyUpload);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('paste', this.pasteUpload);\n        document.removeEventListener('keydown', this.keyUpload);\n\n        this.unbindDragsterEvents();\n    }\n\n    fileUploadSuccess = (data, channelId, currentRootId) => {\n        if (data) {\n            this.props.onFileUpload(data.file_infos, data.client_ids, channelId, currentRootId);\n\n            const requests = Object.assign({}, this.state.requests);\n            for (var j = 0; j < data.client_ids.length; j++) {\n                Reflect.deleteProperty(requests, data.client_ids[j]);\n            }\n            this.setState({requests});\n        }\n    }\n\n    fileUploadFail = (err, clientId, channelId, currentRootId) => {\n        this.props.onUploadError(err, clientId, channelId, currentRootId);\n    }\n\n    pluginUploadFiles = (files) => {\n        // clear any existing errors\n        this.props.onUploadError(null);\n        this.uploadFiles(files);\n    }\n\n    checkPluginHooksAndUploadFiles = (files) => {\n        // clear any existing errors\n        this.props.onUploadError(null);\n\n        let sortedFiles = Array.from(files).sort((a, b) => a.name.localeCompare(b.name, this.props.locale, {numeric: true}));\n\n        const willUploadHooks = this.props.pluginFilesWillUploadHooks;\n        for (const h of willUploadHooks) {\n            const result = h.hook(sortedFiles, this.pluginUploadFiles);\n\n            // Display an error message if there is one but don't reject the upload\n            if (result.message) {\n                this.props.onUploadError(result.message);\n            }\n\n            sortedFiles = result.files;\n        }\n\n        if (sortedFiles) {\n            this.uploadFiles(sortedFiles);\n        }\n    }\n\n    uploadFiles = (sortedFiles) => {\n        const {channelId, rootId} = this.props;\n\n        const uploadsRemaining = Constants.MAX_UPLOAD_FILES - this.props.fileCount;\n        let numUploads = 0;\n\n        // keep track of how many files have been too large\n        const tooLargeFiles = [];\n        const zeroFiles = [];\n        const clientIds = [];\n\n        for (let i = 0; i < sortedFiles.length && numUploads < uploadsRemaining; i++) {\n            if (sortedFiles[i].size > this.props.maxFileSize) {\n                tooLargeFiles.push(sortedFiles[i]);\n                continue;\n            }\n            if (sortedFiles[i].size === 0) {\n                zeroFiles.push(sortedFiles[i]);\n            }\n\n            // generate a unique id that can be used by other components to refer back to this upload\n            const clientId = generateId();\n\n            const request = this.props.actions.uploadFile(\n                sortedFiles[i],\n                sortedFiles[i].name,\n                channelId,\n                rootId,\n                clientId,\n            );\n\n            request.on('progress', (progressEvent) => {\n                this.props.onUploadProgress({\n                    clientId,\n                    name: sortedFiles[i].name,\n                    percent: progressEvent.percent,\n                    type: sortedFiles[i].type,\n                });\n            });\n\n            request.end((err, res) => {\n                const {error, data} = this.props.actions.handleFileUploadEnd(\n                    sortedFiles[i],\n                    sortedFiles[i].name,\n                    channelId,\n                    rootId,\n                    clientId,\n                    {err, res},\n                );\n\n                if (error) {\n                    this.fileUploadFail(error, clientId, channelId, rootId);\n                } else if (data) {\n                    this.fileUploadSuccess(data, channelId, rootId);\n                }\n            });\n\n            this.setState({requests: {...this.state.requests, [clientId]: request}});\n            clientIds.push(clientId);\n\n            numUploads += 1;\n        }\n\n        this.props.onUploadStart(clientIds, channelId);\n\n        const {formatMessage} = this.props.intl;\n        const errors = [];\n        if (sortedFiles.length > uploadsRemaining) {\n            errors.push(formatMessage(holders.limited, {count: Constants.MAX_UPLOAD_FILES}));\n        }\n\n        if (tooLargeFiles.length > 1) {\n            var tooLargeFilenames = tooLargeFiles.map((file) => file.name).join(', ');\n\n            errors.push(formatMessage(holders.filesAbove, {max: (this.props.maxFileSize / 1048576), filenames: tooLargeFilenames}));\n        } else if (tooLargeFiles.length > 0) {\n            errors.push(formatMessage(holders.fileAbove, {max: (this.props.maxFileSize / 1048576), filename: tooLargeFiles[0].name}));\n        }\n\n        if (zeroFiles.length > 1) {\n            var zeroFilenames = zeroFiles.map((file) => file.name).join(', ');\n\n            errors.push(formatMessage(holders.zeroBytesFiles, {filenames: zeroFilenames}));\n        } else if (zeroFiles.length > 0) {\n            errors.push(formatMessage(holders.zeroBytesFile, {filename: zeroFiles[0].name}));\n        }\n\n        if (errors.length > 0) {\n            this.props.onUploadError(errors.join(', '));\n        }\n    }\n\n    handleChange = (e) => {\n        if (e.target.files.length > 0) {\n            this.checkPluginHooksAndUploadFiles(e.target.files);\n\n            clearFileInput(e.target);\n        }\n\n        this.props.onFileUploadChange();\n    }\n\n    handleDrop = (e) => {\n        if (!this.props.canUploadFiles) {\n            this.props.onUploadError(localizeMessage('file_upload.disabled', 'File attachments are disabled.'));\n            return;\n        }\n\n        this.props.onUploadError(null);\n\n        const items = e.dataTransfer.items || [];\n        const droppedFiles = e.dataTransfer.files;\n        const files = [];\n        Array.from(droppedFiles).forEach((file, index) => {\n            const item = items[index];\n            if (item && item.webkitGetAsEntry && (item.webkitGetAsEntry() === null || item.webkitGetAsEntry().isDirectory)) {\n                return;\n            }\n            files.push(file);\n        });\n\n        const types = e.dataTransfer.types;\n        if (types) {\n            if (isUriDrop(e.dataTransfer)) {\n                return;\n            }\n\n            // For non-IE browsers\n            if (types.includes && !types.includes('Files')) {\n                return;\n            }\n\n            // For IE browsers\n            if (types.contains && !types.contains('Files')) {\n                return;\n            }\n        }\n\n        if (files.length === 0) {\n            this.props.onUploadError(localizeMessage('file_upload.drag_folder', 'Folders cannot be uploaded. Please drag all files separately.'));\n            return;\n        }\n\n        if (files.length) {\n            this.checkPluginHooksAndUploadFiles(files);\n        }\n\n        this.props.onFileUploadChange();\n    }\n\n    registerDragEvents = (containerSelector, overlaySelector) => {\n        const self = this;\n\n        const overlay = document.querySelector(overlaySelector);\n\n        const dragTimeout = new DelayedAction(() => {\n            overlay.classList.add('hidden');\n        });\n\n        let dragsterActions = {};\n        if (this.props.canUploadFiles) {\n            dragsterActions = {\n                enter(e) {\n                    var files = e.detail.dataTransfer;\n                    if (!isUriDrop(files) && isFileTransfer(files)) {\n                        overlay.classList.remove('hidden');\n                    }\n                },\n                leave(e) {\n                    var files = e.detail.dataTransfer;\n\n                    if (!isUriDrop(files) && isFileTransfer(files)) {\n                        overlay.classList.add('hidden');\n                    }\n\n                    dragTimeout.cancel();\n                },\n                over() {\n                    dragTimeout.fireAfter(OVERLAY_TIMEOUT);\n                },\n                drop(e) {\n                    overlay.classList.add('hidden');\n                    dragTimeout.cancel();\n\n                    self.handleDrop(e.detail);\n                },\n            };\n        } else {\n            dragsterActions = {\n                drop(e) {\n                    self.handleDrop(e.detail);\n                },\n            };\n        }\n\n        this.unbindDragsterEvents = dragster(containerSelector, dragsterActions);\n    }\n\n    containsEventTarget = (targetElement, eventTarget) => targetElement && targetElement.contains(eventTarget);\n\n    pasteUpload = (e) => {\n        const {formatMessage} = this.props.intl;\n\n        if (!e.clipboardData || !e.clipboardData.items || getTable(e.clipboardData)) {\n            return;\n        }\n\n        const target = this.props.getTarget();\n        const textarea = ReactDOM.findDOMNode(target);\n        if (!this.containsEventTarget(textarea, e.target)) {\n            return;\n        }\n\n        this.props.onUploadError(null);\n\n        const items = [];\n        for (let i = 0; i < e.clipboardData.items.length; i++) {\n            const item = e.clipboardData.items[i];\n\n            if (item.kind !== 'file') {\n                continue;\n            }\n\n            items.push(item);\n        }\n\n        if (items && items.length > 0) {\n            if (!this.props.canUploadFiles) {\n                this.props.onUploadError(localizeMessage('file_upload.disabled', 'File attachments are disabled.'));\n                return;\n            }\n\n            e.preventDefault();\n\n            const files = [];\n\n            for (let i = 0; i < items.length; i++) {\n                const file = items[i].getAsFile();\n                if (!file) {\n                    continue;\n                }\n\n                var d = new Date();\n                let hour = d.getHours();\n                hour = hour < 10 ? `0${hour}` : `${hour}`;\n\n                let minute = d.getMinutes();\n                minute = minute < 10 ? `0${minute}` : `${minute}`;\n\n                var ext = '';\n                if (file.name) {\n                    if (file.name.includes('.')) {\n                        ext = file.name.substr(file.name.lastIndexOf('.'));\n                    }\n                } else if (items[i].type.includes('/')) {\n                    ext = '.' + items[i].type.split('/')[1].toLowerCase();\n                }\n\n                const name = formatMessage(holders.pasted) + d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate() + ' ' + hour + '-' + minute + ext;\n\n                const newFile = new Blob([file], {type: file.type});\n                newFile.name = name;\n                files.push(newFile);\n            }\n\n            if (files.length > 0) {\n                this.checkPluginHooksAndUploadFiles(files);\n                this.props.onFileUploadChange();\n            }\n        }\n    }\n\n    keyUpload = (e) => {\n        if (cmdOrCtrlPressed(e) && isKeyPressed(e, Constants.KeyCodes.U)) {\n            e.preventDefault();\n\n            if (!this.props.canUploadFiles) {\n                this.props.onUploadError(localizeMessage('file_upload.disabled', 'File attachments are disabled.'));\n                return;\n            }\n            const postTextbox = this.props.postType === 'post' && document.activeElement.id === 'post_textbox';\n            const commentTextbox = this.props.postType === 'comment' && document.activeElement.id === 'reply_textbox';\n            if (postTextbox || commentTextbox) {\n                this.fileInput.current.focus();\n                this.fileInput.current.click();\n            }\n        }\n    }\n\n    cancelUpload = (clientId) => {\n        const requests = Object.assign({}, this.state.requests);\n        const request = requests[clientId];\n\n        if (request) {\n            request.abort();\n\n            Reflect.deleteProperty(requests, clientId);\n            this.setState({requests});\n        }\n    }\n\n    handleMaxUploadReached = (e) => {\n        if (e) {\n            e.preventDefault();\n        }\n\n        const {onUploadError} = this.props;\n        const {formatMessage} = this.props.intl;\n\n        onUploadError(formatMessage(holders.limited, {count: Constants.MAX_UPLOAD_FILES}));\n    }\n\n    toggleMenu = (open) => {\n        this.setState({menuOpen: open});\n    }\n\n    handleLocalFileUploaded = (e) => {\n        const uploadsRemaining = Constants.MAX_UPLOAD_FILES - this.props.fileCount;\n        if (uploadsRemaining > 0) {\n            if (this.props.onClick) {\n                this.props.onClick();\n            }\n        } else {\n            this.handleMaxUploadReached(e);\n        }\n        this.setState({menuOpen: false});\n    }\n\n    simulateInputClick = (e) => {\n        e.preventDefault();\n        e.stopPropagation();\n        this.fileInput.current.click();\n    }\n\n    render() {\n        const {formatMessage} = this.props.intl;\n        let multiple = true;\n        if (isMobileApp()) {\n            // iOS WebViews don't upload videos properly in multiple mode\n            multiple = false;\n        }\n\n        let accept = '';\n        if (isIosChrome()) {\n            // iOS Chrome can't upload videos at all\n            accept = 'image/*';\n        }\n\n        const uploadsRemaining = Constants.MAX_UPLOAD_FILES - this.props.fileCount;\n\n        let bodyAction;\n        const ariaLabel = formatMessage({id: 'accessibility.button.attachment', defaultMessage: 'attachment'});\n\n        if (this.props.pluginFileUploadMethods.length === 0) {\n            bodyAction = (\n                <div>\n                    <button\n                        type='button'\n                        id='fileUploadButton'\n                        aria-label={ariaLabel}\n                        className='style--none post-action icon icon--attachment'\n                        onClick={this.simulateInputClick}\n                        onTouchEnd={this.simulateInputClick}\n                    >\n                        <AttachmentIcon className='d-flex'/>\n                    </button>\n                    <input\n                        id='fileUploadInput'\n                        tabIndex='-1'\n                        aria-label={formatMessage(holders.uploadFile)}\n                        ref={this.fileInput}\n                        type='file'\n                        onChange={this.handleChange}\n                        onClick={this.handleLocalFileUploaded}\n                        multiple={multiple}\n                        accept={accept}\n                    />\n                </div>\n            );\n        } else {\n            const pluginFileUploadMethods = this.props.pluginFileUploadMethods.map((item) => {\n                return (\n                    <li\n                        key={item.pluginId + '_fileuploadpluginmenuitem'}\n                        onClick={() => {\n                            if (item.action) {\n                                item.action(this.checkPluginHooksAndUploadFiles);\n                            }\n                            this.setState({menuOpen: false});\n                        }}\n                    >\n                        <a href='#'>\n                            <span className='mr-2'>\n                                {item.icon}\n                            </span>\n                            {item.text}\n                        </a>\n                    </li>\n                );\n            });\n            bodyAction = (\n                <div>\n                    <input\n                        tabIndex='-1'\n                        aria-label={formatMessage(holders.uploadFile)}\n                        ref={this.fileInput}\n                        type='file'\n                        className='file-attachment-menu-item-input'\n                        onChange={this.handleChange}\n                        onClick={this.handleLocalFileUploaded}\n                        multiple={multiple}\n                        accept={accept}\n                    />\n                    <MenuWrapper>\n                        <button\n                            type='button'\n                            aria-label={ariaLabel}\n                            className='style--none post-action'\n                        >\n                            <div\n                                id='fileUploadButton'\n                                className='icon icon--attachment'\n                            >\n                                <AttachmentIcon className='d-flex'/>\n                            </div>\n                        </button>\n                        <Menu\n                            id='fileUploadOptions'\n                            openLeft={true}\n                            openUp={true}\n                            ariaLabel={formatMessage({id: 'file_upload.menuAriaLabel', defaultMessage: 'Upload type selector'})}\n                            customStyles={customStyles}\n                        >\n                            <li>\n                                <a\n                                    href='#'\n                                    onClick={this.simulateInputClick}\n                                    onTouchEnd={this.simulateInputClick}\n                                >\n                                    <span className='mr-2'>\n                                        <i className='fa fa-laptop'/>\n                                    </span>\n                                    <FormattedMessage\n                                        id='yourcomputer'\n                                        defaultMessage='Your computer'\n                                    />\n                                </a>\n                            </li>\n                            {pluginFileUploadMethods}\n                        </Menu>\n                    </MenuWrapper>\n                </div>\n            );\n        }\n\n        if (!this.props.canUploadFiles) {\n            bodyAction = null;\n        }\n\n        return (\n            <div className={uploadsRemaining <= 0 ? ' style--none btn-file__disabled' : 'style--none'}>\n                {bodyAction}\n            </div>\n        );\n    }\n}\n\nconst wrappedComponent = injectIntl(FileUpload, {forwardRef: true});\nwrappedComponent.displayName = 'injectIntl(FileUpload)';\nexport default wrappedComponent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\ntype Options = {\n    enter?: (event: CustomEvent) => void;\n    leave?: (event: CustomEvent) => void;\n    over?: (event: CustomEvent) => void;\n    drop?: (event: CustomEvent) => void;\n}\n\nexport default function dragster(query: string, options: Options) {\n    const noop = () => {}; // eslint-disable-line no-empty-function\n\n    const defaults = {\n        enter: noop,\n        leave: noop,\n        over: noop,\n        drop: noop,\n    };\n\n    const settings = Object.assign(defaults, options);\n    const node = document.querySelector(query);\n\n    if (!node) {\n        return noop;\n    }\n\n    let first = false;\n    let second = false;\n\n    const dragenter = (event: Event) => {\n        if (first) {\n            second = true;\n            return;\n        }\n\n        first = true;\n        const enterEvent = new CustomEvent('dragster:enter', {detail: event});\n        node.dispatchEvent(enterEvent);\n\n        event.preventDefault();\n    };\n\n    const dragleave = (event: Event) => {\n        if (second) {\n            second = false;\n        } else if (first) {\n            first = false;\n        }\n        if (!first && !second) {\n            const leaveEvent = new CustomEvent('dragster:leave', {detail: event});\n            node.dispatchEvent(leaveEvent);\n        }\n        event.preventDefault();\n    };\n\n    const dragover = (event: Event) => {\n        const overEvent = new CustomEvent('dragster:over', {detail: event});\n        node.dispatchEvent(overEvent);\n        event.preventDefault();\n    };\n\n    const drop = (event: Event) => {\n        if (second) {\n            second = false;\n        } else if (first) {\n            first = false;\n        }\n        if (!first && !second) {\n            const dropEvent = new CustomEvent('dragster:drop', {detail: event});\n            node.dispatchEvent(dropEvent);\n        }\n        event.preventDefault();\n    };\n\n    node.addEventListener('dragenter', dragenter);\n    node.addEventListener('dragleave', dragleave);\n    node.addEventListener('dragover', dragover);\n    node.addEventListener('drop', drop);\n\n    node.addEventListener('dragster:enter', settings.enter);\n    node.addEventListener('dragster:leave', settings.leave);\n    node.addEventListener('dragster:over', settings.over);\n    node.addEventListener('dragster:drop', settings.drop);\n\n    const unbindEvents = () => {\n        node.removeEventListener('dragenter', dragenter);\n        node.removeEventListener('dragleave', dragleave);\n        node.removeEventListener('dragover', dragover);\n        node.removeEventListener('drop', drop);\n\n        node.removeEventListener('dragster:enter', settings.enter);\n        node.removeEventListener('dragster:leave', settings.leave);\n        node.removeEventListener('dragster:over', settings.over);\n        node.removeEventListener('dragster:drop', settings.drop);\n    };\n\n    return unbindEvents;\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {uploadFile, handleFileUploadEnd} from 'actions/file_actions.jsx';\nimport {getCurrentLocale} from 'selectors/i18n';\nimport {canUploadFiles} from 'utils/file_utils';\n\nimport FileUpload from './file_upload.jsx';\n\nfunction mapStateToProps(state) {\n    const config = getConfig(state);\n    const maxFileSize = parseInt(config.MaxFileSize, 10);\n\n    return {\n        maxFileSize,\n        canUploadFiles: canUploadFiles(config),\n        locale: getCurrentLocale(state),\n        pluginFileUploadMethods: state.plugins.components.FileUploadMethod,\n        pluginFilesWillUploadHooks: state.plugins.components.FilesWillUploadHook,\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            uploadFile,\n            handleFileUploadEnd,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps, null, {forwardRef: true})(FileUpload);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\n// accepts either a single error or an array of errors\ntype Props = {\n    type?: React.ReactNode;\n    error?: React.ReactNode;\n    textClassName?: string;\n    iconClassName?: string;\n    margin?: boolean;\n    errors?: React.ReactNode[];\n}\n\nexport default class FormError extends React.PureComponent<Props> {\n    public static defaultProps = {\n        error: null,\n        errors: [],\n    }\n    public render() {\n        const {error = null, errors = [], iconClassName, margin, textClassName, type} = this.props;\n\n        if (!error && errors.length === 0) {\n            return null;\n        }\n\n        // look for the first truthy error to display\n        let message = error;\n\n        if (!message) {\n            for (const err of errors) {\n                if (err) {\n                    message = err;\n                }\n            }\n        }\n\n        if (!message) {\n            return null;\n        }\n\n        if (type === 'modal') {\n            return (\n                <div className='form-group'>\n                    <label className='col-sm-12 has-error'>\n                        {message}\n                    </label>\n                </div>\n            );\n        }\n\n        if (type === 'backstage') {\n            return (\n                <div className='pull-left has-error'>\n                    <label className='control-label'>\n                        {message}\n                    </label>\n                </div>\n            );\n        }\n\n        if (margin) {\n            return (\n                <div className='form-group has-error'>\n                    <label className='control-label'>\n                        {message}\n                    </label>\n                </div>\n            );\n        }\n\n        return (\n            <div className={`col-sm-12 ${textClassName || 'has-error'}`}>\n                <label className='control-label'>\n                    <i className={`fa ${iconClassName || 'fa-exclamation-circle'}`}/> {message}\n                </label>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {injectIntl} from 'react-intl';\nimport PropTypes from 'prop-types';\nimport marked from 'marked';\n\nimport {intlShape} from 'utils/react_intl';\n\nconst TARGET_BLANK_URL_PREFIX = '!';\n\nexport class CustomRenderer extends marked.Renderer {\n    constructor(disableLinks = false) {\n        super();\n        this.disableLinks = disableLinks;\n    }\n\n    link(href, title, text) {\n        if (this.disableLinks) {\n            return text;\n        }\n        if (href[0] === TARGET_BLANK_URL_PREFIX) {\n            return `<a href=\"${href.substring(1, href.length)}\" rel=\"noopener noreferrer\" target=\"_blank\">${text}</a>`;\n        }\n        return `<a href=\"${href}\">${text}</a>`;\n    }\n\n    paragraph(text) {\n        return text;\n    }\n}\n\n/*\n* Translations component with the same API as react-intl's <FormattedMessage> component except the message string\n* accepts markdown. It supports the following non-block-level markdown:\n* - *italic*\n* - **bold**\n* - `inline code`\n* - ~~strikethrough~~\n* - [link](http://example.com/)\n* - [link in new tab](!http://example.com/)\n* - line\\nbreaks\n*\n* Note: Line breaks (\\n) in a defaultMessage parameter string must be surrounded by curly brackets {} in JSX. Example:\n* <FormattedMarkdownMessage id='my.example' defaultMessage={'first line\\nsecond line'} />\n*/\nclass FormattedMarkdownMessage extends React.PureComponent {\n    static defaultProps = {\n        disableLinks: false,\n    };\n\n    static get propTypes() {\n        return {\n            intl: intlShape.isRequired,\n            id: PropTypes.string.isRequired,\n            defaultMessage: PropTypes.string.isRequired,\n            values: PropTypes.object,\n            disableLinks: PropTypes.bool,\n        };\n    }\n\n    render() {\n        const {\n            intl,\n            id,\n            defaultMessage,\n            values,\n            disableLinks,\n        } = this.props;\n\n        const origMsg = intl.formatMessage({id, defaultMessage}, values);\n\n        const markedUpMessage = marked(origMsg, {\n            breaks: true,\n            sanitize: true,\n            renderer: new CustomRenderer(disableLinks),\n        });\n\n        return (<span dangerouslySetInnerHTML={{__html: markedUpMessage}}/>);\n    }\n}\n\nexport default injectIntl(FormattedMarkdownMessage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport './generic_modal.scss';\n\ntype Props = {\n    className?: string;\n    onHide: () => void;\n    modalHeaderText: React.ReactNode;\n    show?: boolean;\n    handleCancel?: () => void;\n    handleConfirm?: () => void;\n    confirmButtonText?: React.ReactNode;\n    confirmButtonClassName?: string;\n    cancelButtonText?: React.ReactNode;\n    isConfirmDisabled?: boolean;\n    id: string;\n    autoCloseOnCancelButton?: boolean;\n    autoCloseOnConfirmButton?: boolean;\n    enforceFocus?: boolean;\n    container?: React.ReactNode | React.ReactNodeArray;\n};\n\ntype State = {\n    show: boolean;\n}\n\nexport default class GenericModal extends React.PureComponent<Props, State> {\n    static defaultProps: Partial<Props> = {\n        show: true,\n        id: 'genericModal',\n        autoCloseOnCancelButton: true,\n        autoCloseOnConfirmButton: true,\n        enforceFocus: true,\n    };\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            show: props.show!,\n        };\n    }\n\n    onHide = () => {\n        this.setState({show: false}, this.props.onHide);\n    }\n\n    handleCancel = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n        event.preventDefault();\n        if (this.props.autoCloseOnCancelButton) {\n            this.onHide();\n        }\n        if (this.props.handleCancel) {\n            this.props.handleCancel();\n        }\n    }\n\n    handleConfirm = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n        event.preventDefault();\n        if (this.props.autoCloseOnConfirmButton) {\n            this.onHide();\n        }\n        if (this.props.handleConfirm) {\n            this.props.handleConfirm();\n        }\n    }\n\n    render() {\n        let confirmButton;\n        if (this.props.handleConfirm) {\n            let confirmButtonText: React.ReactNode = (\n                <FormattedMessage\n                    id='generic_modal.confirm'\n                    defaultMessage='Confirm'\n                />\n            );\n            if (this.props.confirmButtonText) {\n                confirmButtonText = this.props.confirmButtonText;\n            }\n\n            confirmButton = (\n                <button\n                    type='submit'\n                    className={classNames(`GenericModal__button confirm ${this.props.confirmButtonClassName}`, {\n                        disabled: this.props.isConfirmDisabled,\n                    })}\n                    onClick={this.handleConfirm}\n                    disabled={this.props.isConfirmDisabled}\n                >\n                    {confirmButtonText}\n                </button>\n            );\n        }\n\n        let cancelButton;\n        if (this.props.handleCancel) {\n            let cancelButtonText: React.ReactNode = (\n                <FormattedMessage\n                    id='generic_modal.cancel'\n                    defaultMessage='Cancel'\n                />\n            );\n            if (this.props.cancelButtonText) {\n                cancelButtonText = this.props.cancelButtonText;\n            }\n\n            cancelButton = (\n                <button\n                    type='button'\n                    className='GenericModal__button cancel'\n                    onClick={this.handleCancel}\n                >\n                    {cancelButtonText}\n                </button>\n            );\n        }\n\n        return (\n            <Modal\n                dialogClassName={classNames('a11y__modal GenericModal', this.props.className)}\n                show={this.state.show}\n                onHide={this.onHide}\n                onExited={this.onHide}\n                enforceFocus={this.props.enforceFocus}\n                restoreFocus={true}\n                role='dialog'\n                aria-labelledby='genericModalLabel'\n                id={this.props.id}\n                container={this.props.container}\n            >\n                <Modal.Header\n                    closeButton={true}\n                />\n                <form>\n                    <Modal.Body>\n                        <div className='GenericModal__header'>\n                            <h1 id='genericModalLabel'>\n                                {this.props.modalHeaderText}\n                            </h1>\n                        </div>\n                        <div className='GenericModal__body'>\n                            {this.props.children}\n                        </div>\n                    </Modal.Body>\n                    <Modal.Footer>\n                        {cancelButton}\n                        {confirmButton}\n                    </Modal.Footer>\n                </form>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent} from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class InfiniteScroll extends PureComponent {\n    static propTypes = {\n        children: PropTypes.array,\n        element: PropTypes.string,\n        hasMore: PropTypes.bool,\n        initialLoad: PropTypes.bool,\n        loader: PropTypes.object,\n        loadMore: PropTypes.func.isRequired,\n        pageStart: PropTypes.number,\n        threshold: PropTypes.number,\n        useWindow: PropTypes.bool,\n        isReverse: PropTypes.bool,\n        containerHeight: PropTypes.number,\n        scrollPosition: PropTypes.number,\n    }\n\n    static defaultProps = {\n        element: 'div',\n        hasMore: false,\n        initialLoad: true,\n        pageStart: 0,\n        threshold: 250,\n        useWindow: true,\n        isReverse: false,\n        containerHeight: null,\n        scrollPosition: null,\n    }\n\n    componentDidMount() {\n        this.pageLoaded = this.props.pageStart;\n        this.attachScrollListener();\n        this.setScrollPosition();\n    }\n\n    componentDidUpdate() {\n        this.attachScrollListener();\n    }\n\n    render() {\n        const {\n            children,\n            element,\n            hasMore,\n            initialLoad, // eslint-disable-line no-unused-vars\n            loader,\n            loadMore, // eslint-disable-line no-unused-vars\n            pageStart, // eslint-disable-line no-unused-vars\n            threshold, // eslint-disable-line no-unused-vars\n            useWindow, // eslint-disable-line no-unused-vars\n            isReverse, // eslint-disable-line no-unused-vars\n            scrollPosition, // eslint-disable-line no-unused-vars\n            containerHeight,\n            ...props\n        } = this.props;\n\n        props.ref = (node) => {\n            this.scrollComponent = node;\n        };\n\n        const elementProps = containerHeight ? {...props, style: {height: containerHeight}} : props;\n\n        return React.createElement(element, elementProps, children, hasMore && (loader || this.defaultLoader));\n    }\n\n    calculateTopPosition(el) {\n        if (!el) {\n            return 0;\n        }\n        return el.offsetTop + this.calculateTopPosition(el.offsetParent);\n    }\n\n    setScrollPosition() {\n        const {scrollPosition} = this.props;\n        if (scrollPosition !== null) {\n            window.scrollTo(0, scrollPosition);\n        }\n    }\n\n    scrollListener = () => {\n        const el = this.scrollComponent;\n        const scrollEl = window;\n\n        let offset;\n        if (this.props.useWindow) {\n            var scrollTop = ('pageYOffset' in scrollEl) ? scrollEl.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop;\n            if (this.props.isReverse) {\n                offset = scrollTop;\n            } else {\n                offset = this.calculateTopPosition(el) + (el.offsetHeight - scrollTop - window.innerHeight);\n            }\n        } else if (this.props.isReverse) {\n            offset = el.parentNode.scrollTop;\n        } else {\n            offset = el.scrollHeight - el.parentNode.scrollTop - el.parentNode.clientHeight;\n        }\n\n        if (offset < Number(this.props.threshold)) {\n            this.detachScrollListener();\n\n            // Call loadMore after detachScrollListener to allow for non-async loadMore functions\n            if (typeof this.props.loadMore === 'function') {\n                this.props.loadMore(this.pageLoaded += 1);\n            }\n        }\n    }\n\n    attachScrollListener() {\n        if (!this.props.hasMore) {\n            return;\n        }\n\n        let scrollEl = window;\n        if (this.props.useWindow === false) {\n            scrollEl = this.scrollComponent.parentNode;\n        }\n\n        scrollEl.addEventListener('scroll', this.scrollListener);\n        scrollEl.addEventListener('resize', this.scrollListener);\n\n        if (this.props.initialLoad) {\n            this.scrollListener();\n        }\n    }\n\n    detachScrollListener() {\n        var scrollEl = window;\n        if (this.props.useWindow === false) {\n            scrollEl = this.scrollComponent.parentNode;\n        }\n\n        scrollEl.removeEventListener('scroll', this.scrollListener);\n        scrollEl.removeEventListener('resize', this.scrollListener);\n    }\n\n    componentWillUnmount() {\n        this.detachScrollListener();\n    }\n\n    // Set a defaut loader for all your `InfiniteScroll` components\n    setDefaultLoader(loader) {\n        this.defaultLoader = loader;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n// https://stackoverflow.com/a/54485712\nconst Nbsp: React.FC = () => '\\u00A0' as unknown as React.ReactElement;\nexport default Nbsp;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport classNames from 'classnames';\n\nimport './input.css';\n\ninterface Props extends React.InputHTMLAttributes<HTMLInputElement> {\n    info?: string;\n    error?: string;\n    required?: boolean;\n    hasError?: boolean;\n    addon?: React.ReactElement;\n    textPrefix?: string;\n}\n\ntype State = {\n    focused: boolean;\n    error: string;\n}\n\nconst REQUIRED_FIELD_TEXT = 'This field is required';\n\nexport default class Input extends React.PureComponent<Props, State> {\n    public constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            focused: false,\n            error: '',\n        };\n    }\n\n    private onFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n        const {onFocus} = this.props;\n\n        this.setState({focused: true});\n\n        if (onFocus) {\n            onFocus(event);\n        }\n    }\n\n    private onBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n        const {onBlur} = this.props;\n\n        this.setState({focused: false});\n        this.validateInput();\n\n        if (onBlur) {\n            onBlur(event);\n        }\n    }\n\n    private onChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n        const {onChange} = this.props;\n\n        this.setState({error: ''});\n\n        if (onChange) {\n            onChange(event);\n        }\n    }\n\n    private validateInput = () => {\n        const {value, required} = this.props;\n        this.setState({error: ''});\n        if (required && (value == null || value === '')) {\n            this.setState({error: REQUIRED_FIELD_TEXT});\n        }\n    }\n\n    private renderError(error: string) {\n        if (!error) {\n            return null;\n        }\n\n        return (\n            <div className='Input___error'>\n                <i className='icon icon-alert-outline'/>\n                <span>{error}</span>\n            </div>\n        );\n    }\n\n    private renderInfo() {\n        if (!this.props.info) {\n            return null;\n        }\n\n        return (\n            <div className='Input___info'>\n                {this.props.info}\n            </div>\n        );\n    }\n\n    public render() {\n        const {value, placeholder, className, error: propError, hasError, addon, name, textPrefix, ...otherProps} = this.props;\n        const {focused, error: stateError} = this.state;\n\n        const showLegend = Boolean(focused || value);\n        const error = propError || stateError;\n\n        return (\n            <div className='Input_container'>\n                <fieldset\n                    className={classNames('Input_fieldset', className, {\n                        Input_fieldset___error: error || hasError,\n                        Input_fieldset___legend: showLegend,\n                    })}\n                >\n                    <legend className={classNames('Input_legend', {Input_legend___focus: showLegend})}>\n                        {showLegend ? placeholder : null}\n                    </legend>\n                    <div className='Input_wrapper'>\n                        {textPrefix && <span>{textPrefix}</span>}\n                        <input\n                            id={`input_${name}`}\n                            className={classNames('Input form-control', className, {Input__focus: showLegend})}\n                            value={value}\n                            placeholder={focused ? '' : placeholder}\n                            name={name}\n                            {...otherProps}\n                            onFocus={this.onFocus}\n                            onBlur={this.onBlur}\n                            onChange={this.onChange}\n                        />\n                    </div>\n                    {addon}\n                </fieldset>\n                {error ? this.renderError(error) : this.renderInfo()}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport Setting from './setting';\n\ntype Props = {\n    id: string;\n    options: Array<{text: string; value: string}>;\n    label: React.ReactNode;\n    onChange(name: string, value: any): void;\n    value?: string;\n    labelClassName?: string;\n    inputClassName?: string;\n    helpText?: React.ReactNode;\n\n}\n\nexport default class RadioSetting extends React.PureComponent<Props> {\n    public static defaultProps: Partial<Props> = {\n        labelClassName: '',\n        inputClassName: '',\n        options: [],\n    };\n\n    private handleChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n        this.props.onChange(this.props.id, e.target.value);\n    }\n\n    public render(): JSX.Element {\n        return (\n            <Setting\n                label={this.props.label}\n                labelClassName={this.props.labelClassName}\n                inputClassName={this.props.inputClassName}\n                helpText={this.props.helpText}\n                inputId={this.props.id}\n            >\n                {\n                    this.props.options.map(({value, text}) => {\n                        return (\n                            <div\n                                className='radio'\n                                key={value}\n                            >\n                                <label>\n                                    <input\n                                        type='radio'\n                                        value={value}\n                                        name={this.props.id}\n                                        checked={value === this.props.value}\n                                        onChange={this.handleChange}\n                                    />\n                                    {text}\n                                </label>\n                            </div>\n                        );\n                    })\n                }\n            </Setting>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport MenuActionProvider from 'components/suggestion/menu_action_provider';\nimport GenericUserProvider from 'components/suggestion/generic_user_provider.jsx';\nimport GenericChannelProvider from 'components/suggestion/generic_channel_provider.jsx';\n\nimport TextSetting from 'components/widgets/settings/text_setting';\nimport AutocompleteSelector from 'components/autocomplete_selector';\nimport ModalSuggestionList from 'components/suggestion/modal_suggestion_list.jsx';\nimport BoolSetting from 'components/widgets/settings/bool_setting';\nimport RadioSetting from 'components/widgets/settings/radio_setting';\n\nconst TEXT_DEFAULT_MAX_LENGTH = 150;\nconst TEXTAREA_DEFAULT_MAX_LENGTH = 3000;\n\nexport default class DialogElement extends React.PureComponent {\n    static propTypes = {\n        displayName: PropTypes.string.isRequired,\n        name: PropTypes.string.isRequired,\n        type: PropTypes.string.isRequired,\n        subtype: PropTypes.string,\n        placeholder: PropTypes.string,\n        helpText: PropTypes.string,\n        errorText: PropTypes.node,\n        maxLength: PropTypes.number,\n        dataSource: PropTypes.string,\n        optional: PropTypes.bool,\n        options: PropTypes.arrayOf(PropTypes.object),\n        value: PropTypes.any,\n        onChange: PropTypes.func,\n        autoFocus: PropTypes.bool,\n        actions: PropTypes.shape({\n            autocompleteChannels: PropTypes.func.isRequired,\n            autocompleteUsers: PropTypes.func.isRequired,\n        }).isRequired,\n    }\n\n    constructor(props) {\n        super(props);\n\n        let defaultText = '';\n        this.providers = [];\n        if (props.type === 'select') {\n            if (props.dataSource === 'users') {\n                this.providers = [new GenericUserProvider(props.actions.autocompleteUsers)];\n            } else if (props.dataSource === 'channels') {\n                this.providers = [new GenericChannelProvider(props.actions.autocompleteChannels)];\n            } else if (props.options) {\n                this.providers = [new MenuActionProvider(props.options)];\n            }\n\n            if (props.value && props.options) {\n                const defaultOption = props.options.find(\n                    (option) => option.value === props.value,\n                );\n                defaultText = defaultOption ? defaultOption.text : '';\n            }\n        }\n\n        this.state = {\n            value: defaultText,\n        };\n    }\n\n    handleSelected = (selected) => {\n        const {name, dataSource, onChange} = this.props;\n\n        if (dataSource === 'users') {\n            onChange(name, selected.id);\n            this.setState({value: selected.username});\n        } else if (dataSource === 'channels') {\n            onChange(name, selected.id);\n            this.setState({value: selected.display_name});\n        } else {\n            onChange(name, selected.value);\n            this.setState({value: selected.text});\n        }\n    }\n\n    render() {\n        const {\n            name,\n            subtype,\n            displayName,\n            value,\n            placeholder,\n            onChange,\n            helpText,\n            errorText,\n            optional,\n            options,\n        } = this.props;\n\n        let {type, maxLength} = this.props;\n\n        let displayNameContent = displayName;\n        if (optional) {\n            displayNameContent = (\n                <React.Fragment>\n                    {displayName + ' '}\n                    <span className='font-weight--normal light'>\n                        <FormattedMessage\n                            id='interactive_dialog.element.optional'\n                            defaultMessage='(optional)'\n                        />\n                    </span>\n                </React.Fragment>\n            );\n        } else {\n            displayNameContent = (\n                <React.Fragment>\n                    {displayName}\n                    <span className='error-text'>{' *'}</span>\n                </React.Fragment>\n            );\n        }\n\n        let helpTextContent = helpText;\n        if (errorText) {\n            helpTextContent = (\n                <React.Fragment>\n                    {helpText}\n                    <div className='error-text mt-3'>\n                        {errorText}\n                    </div>\n                </React.Fragment>\n            );\n        }\n\n        if (type === 'text' || type === 'textarea') {\n            if (type === 'text') {\n                maxLength = maxLength || TEXT_DEFAULT_MAX_LENGTH;\n\n                if (subtype && TextSetting.validTypes.includes(subtype)) {\n                    type = subtype;\n                } else {\n                    type = 'input';\n                }\n            } else {\n                maxLength = maxLength || TEXTAREA_DEFAULT_MAX_LENGTH;\n            }\n\n            return (\n                <TextSetting\n                    autoFocus={this.props.autoFocus}\n                    id={name}\n                    type={type}\n                    label={displayNameContent}\n                    maxLength={maxLength}\n                    value={value || ''}\n                    placeholder={placeholder}\n                    helpText={helpTextContent}\n                    onChange={onChange}\n                    resizable={false}\n                />\n            );\n        } else if (type === 'select') {\n            return (\n                <AutocompleteSelector\n                    id={name}\n                    providers={this.providers}\n                    onSelected={this.handleSelected}\n                    label={displayNameContent}\n                    helpText={helpTextContent}\n                    placeholder={placeholder}\n                    value={this.state.value}\n                    listComponent={ModalSuggestionList}\n                    listPosition='bottom'\n                />\n            );\n        } else if (type === 'bool') {\n            return (\n                <BoolSetting\n                    autoFocus={this.props.autoFocus}\n                    id={name}\n                    label={displayNameContent}\n                    value={value || false}\n                    helpText={helpTextContent}\n                    placeholder={placeholder}\n                    onChange={onChange}\n                />\n            );\n        } else if (type === 'radio') {\n            return (\n                <RadioSetting\n                    id={name}\n                    label={displayNameContent}\n                    helpText={helpTextContent}\n                    options={options}\n                    value={value}\n                    onChange={onChange}\n                />\n            );\n        }\n\n        return null;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {autocompleteChannels} from 'actions/channel_actions';\nimport {autocompleteUsers} from 'actions/user_actions';\n\nimport DialogElement from './dialog_element';\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            autocompleteChannels,\n            autocompleteUsers,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(DialogElement);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nimport * as Markdown from 'utils/markdown';\nimport {getSiteURL} from 'utils/url';\n\nexport default class DialogIntroductionText extends React.PureComponent {\n    static propTypes = {\n        id: PropTypes.string,\n        value: PropTypes.string.isRequired,\n        emojiMap: PropTypes.object.isRequired,\n    };\n\n    render() {\n        const formattedMessage = Markdown.format(\n            this.props.value,\n            {\n                breaks: true,\n                sanitize: true,\n                gfm: true,\n                siteURL: getSiteURL(),\n            },\n            this.props.emojiMap,\n        );\n\n        return (\n            <span\n                id={this.props.id}\n                dangerouslySetInnerHTML={{__html: formattedMessage}}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {\n    checkDialogElementForError,\n    checkIfErrorsMatchElements,\n} from 'mattermost-redux/utils/integration_utils';\n\nimport SpinnerButton from 'components/spinner_button';\n\nimport {localizeMessage} from 'utils/utils.jsx';\n\nimport DialogElement from './dialog_element';\nimport DialogIntroductionText from './dialog_introduction_text';\n\nexport default class InteractiveDialog extends React.PureComponent {\n    static propTypes = {\n        url: PropTypes.string.isRequired,\n        callbackId: PropTypes.string,\n        elements: PropTypes.arrayOf(PropTypes.object),\n        title: PropTypes.string.isRequired,\n        introductionText: PropTypes.string,\n        iconUrl: PropTypes.string,\n        submitLabel: PropTypes.string,\n        notifyOnCancel: PropTypes.bool,\n        state: PropTypes.string,\n        onHide: PropTypes.func,\n        actions: PropTypes.shape({\n            submitInteractiveDialog: PropTypes.func.isRequired,\n        }).isRequired,\n        emojiMap: PropTypes.object.isRequired,\n    };\n\n    constructor(props) {\n        super(props);\n\n        const values = {};\n        if (props.elements != null) {\n            props.elements.forEach((e) => {\n                if (e.type === 'bool') {\n                    values[e.name] =\n                        e.default === true ||\n                        String(e.default).toLowerCase() === 'true';\n                } else {\n                    values[e.name] = e.default || null;\n                }\n            });\n        }\n\n        this.state = {\n            show: true,\n            values,\n            error: null,\n            errors: {},\n            submitting: false,\n        };\n    }\n\n    handleSubmit = async (e) => {\n        e.preventDefault();\n\n        const {elements} = this.props;\n        const values = this.state.values;\n        const errors = {};\n        if (elements) {\n            elements.forEach((elem) => {\n                const error = checkDialogElementForError(\n                    elem,\n                    values[elem.name],\n                );\n                if (error) {\n                    errors[elem.name] = (\n                        <FormattedMessage\n                            id={error.id}\n                            defaultMessage={error.defaultMessage}\n                            values={error.values}\n                        />\n                    );\n                }\n            });\n        }\n\n        this.setState({errors});\n\n        if (Object.keys(errors).length !== 0) {\n            return;\n        }\n\n        const {url, callbackId, state} = this.props;\n\n        const dialog = {\n            url,\n            callback_id: callbackId,\n            state,\n            submission: values,\n        };\n\n        this.setState({submitting: true});\n\n        const {data} = await this.props.actions.submitInteractiveDialog(\n            dialog,\n        );\n\n        this.setState({submitting: false});\n\n        let hasErrors = false;\n\n        if (data) {\n            if (data.error) {\n                hasErrors = true;\n                this.setState({error: data.error});\n            }\n\n            if (\n                data.errors &&\n                Object.keys(data.errors).length >= 0 &&\n                checkIfErrorsMatchElements(data.errors, elements)\n            ) {\n                hasErrors = true;\n                this.setState({errors: data.errors});\n            }\n        }\n\n        if (!hasErrors) {\n            this.handleHide(true);\n        }\n    };\n\n    onHide = () => {\n        this.handleHide(false);\n    };\n\n    handleHide = (submitted = false) => {\n        const {url, callbackId, state, notifyOnCancel} = this.props;\n\n        if (!submitted && notifyOnCancel) {\n            const dialog = {\n                url,\n                callback_id: callbackId,\n                state,\n                cancelled: true,\n            };\n\n            this.props.actions.submitInteractiveDialog(dialog);\n        }\n\n        this.setState({show: false});\n    };\n\n    onChange = (name, value) => {\n        const values = {...this.state.values, [name]: value};\n        this.setState({values});\n    };\n\n    render() {\n        const {\n            title,\n            introductionText,\n            iconUrl,\n            submitLabel,\n            elements,\n        } = this.props;\n\n        let submitText = (\n            <FormattedMessage\n                id='interactive_dialog.submit'\n                defaultMessage='Submit'\n            />\n        );\n        if (submitLabel) {\n            submitText = submitLabel;\n        }\n\n        let icon;\n        if (iconUrl) {\n            icon = (\n                <img\n                    id='interactiveDialogIconUrl'\n                    alt={'modal title icon'}\n                    className='more-modal__image'\n                    width='36'\n                    height='36'\n                    src={iconUrl}\n                />\n            );\n        }\n\n        return (\n            <Modal\n                id='interactiveDialogModal'\n                dialogClassName='a11y__modal about-modal'\n                show={this.state.show}\n                onHide={this.onHide}\n                onExited={this.props.onHide}\n                backdrop='static'\n                role='dialog'\n                aria-labelledby='interactiveDialogModalLabel'\n            >\n                <form onSubmit={this.handleSubmit}>\n                    <Modal.Header\n                        closeButton={true}\n                        style={{borderBottom: elements == null && '0px'}}\n                    >\n                        <Modal.Title\n                            componentClass='h1'\n                            id='interactiveDialogModalLabel'\n                        >\n                            {icon}\n                            {title}\n                        </Modal.Title>\n                    </Modal.Header>\n                    {(elements || introductionText) && (\n                        <Modal.Body>\n                            {introductionText && (\n                                <DialogIntroductionText\n                                    id='interactiveDialogModalIntroductionText'\n                                    value={introductionText}\n                                    emojiMap={this.props.emojiMap}\n                                />\n                            )}\n                            {elements &&\n                            elements.map((e, index) => {\n                                return (\n                                    <DialogElement\n                                        autoFocus={index === 0}\n                                        key={'dialogelement' + e.name}\n                                        displayName={e.display_name}\n                                        name={e.name}\n                                        type={e.type}\n                                        subtype={e.subtype}\n                                        helpText={e.help_text}\n                                        errorText={this.state.errors[e.name]}\n                                        placeholder={e.placeholder}\n                                        minLength={e.min_length}\n                                        maxLength={e.max_length}\n                                        dataSource={e.data_source}\n                                        optional={e.optional}\n                                        options={e.options}\n                                        value={this.state.values[e.name]}\n                                        onChange={this.onChange}\n                                    />\n                                );\n                            })}\n                        </Modal.Body>\n                    )}\n                    <Modal.Footer>\n                        {this.state.error && (\n                            <div className='error-text'>{this.state.error}</div>\n                        )}\n                        <button\n                            id='interactiveDialogCancel'\n                            type='button'\n                            className='btn btn-link cancel-button'\n                            onClick={this.onHide}\n                        >\n                            <FormattedMessage\n                                id='interactive_dialog.cancel'\n                                defaultMessage='Cancel'\n                            />\n                        </button>\n                        <SpinnerButton\n                            id='interactiveDialogSubmit'\n                            type='submit'\n                            autoFocus={!elements || elements.length === 0}\n                            className='btn btn-primary save-button'\n                            spinning={this.state.submitting}\n                            spinningText={localizeMessage(\n                                'interactive_dialog.submitting',\n                                'Submitting...',\n                            )}\n                        >\n                            {submitText}\n                        </SpinnerButton>\n                    </Modal.Footer>\n                </form>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {submitInteractiveDialog} from 'mattermost-redux/actions/integrations';\n\nimport {getEmojiMap} from 'selectors/emojis';\n\nimport InteractiveDialog from './interactive_dialog';\n\nfunction mapStateToProps(state) {\n    const data = state.entities.integrations.dialog;\n    if (!data || !data.dialog) {\n        return {};\n    }\n\n    return {\n        url: data.url,\n        callbackId: data.dialog.callback_id,\n        elements: data.dialog.elements,\n        title: data.dialog.title,\n        introductionText: data.dialog.introduction_text,\n        iconUrl: data.dialog.icon_url,\n        submitLabel: data.dialog.submit_label,\n        notifyOnCancel: data.dialog.notify_on_cancel,\n        state: data.dialog.state,\n        emojiMap: getEmojiMap(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            submitInteractiveDialog,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InteractiveDialog);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport * as TeamActions from 'mattermost-redux/actions/teams';\nimport {getTeamMember} from 'mattermost-redux/selectors/entities/teams';\nimport {getChannelMembersInChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {joinChannel} from 'mattermost-redux/actions/channels';\n\nimport {addUsersToTeam} from 'actions/team_actions';\n\nimport {t} from 'utils/i18n';\nimport {isGuest, localizeMessage} from 'utils/utils';\n\nexport function sendMembersInvites(teamId, users, emails) {\n    return async (dispatch, getState) => {\n        if (users.length > 0) {\n            await dispatch(TeamActions.getTeamMembersByIds(teamId, users.map((u) => u.id)));\n        }\n        const state = getState();\n        const sent = [];\n        const notSent = [];\n        const usersToAdd = [];\n        for (const user of users) {\n            const member = getTeamMember(state, teamId, user.id);\n            if (isGuest(user)) {\n                notSent.push({user, reason: localizeMessage('invite.members.user-is-guest', 'Contact your admin to make this guest a full member.')});\n            } else if (member) {\n                notSent.push({user, reason: localizeMessage('invite.members.already-member', 'This person is already a team member.')});\n            } else {\n                usersToAdd.push(user);\n            }\n        }\n        if (usersToAdd.length > 0) {\n            const response = await dispatch(addUsersToTeam(teamId, usersToAdd.map((u) => u.id)));\n            const members = response.data || [];\n            for (const userToAdd of usersToAdd) {\n                const memberWithError = members.find((m) => m.user_id === userToAdd.id && m.error);\n                if (memberWithError) {\n                    notSent.push({user: userToAdd, reason: memberWithError.error.message});\n                } else {\n                    sent.push({user: userToAdd, reason: localizeMessage('invite.members.added-to-team', 'This member has been added to the team.')});\n                }\n            }\n        }\n        if (emails.length > 0) {\n            let response;\n            try {\n                response = await dispatch(TeamActions.sendEmailInvitesToTeamGracefully(teamId, emails));\n            } catch (e) {\n                response = {data: emails.map((email) => ({email, error: {error: localizeMessage('invite.members.unable-to-add-the-user-to-the-team', 'Unable to add the user to the team.')}}))};\n            }\n            const invitesWithErrors = response.data || [];\n            if (response.error) {\n                if (response.error.server_error_id === 'app.email.rate_limit_exceeded.app_error') {\n                    response.error.message = localizeMessage('invite.rate-limit-exceeded', 'Invite emails rate limit exceeded.');\n                }\n                for (const email of emails) {\n                    notSent.push({email, reason: response.error.message});\n                }\n            } else {\n                for (const email of emails) {\n                    const inviteWithError = invitesWithErrors.find((i) => email.toLowerCase() === i.email && i.error);\n                    if (inviteWithError) {\n                        notSent.push({email, reason: inviteWithError.error.message});\n                    } else {\n                        sent.push({email, reason: localizeMessage('invite.members.invite-sent', 'An invitation email has been sent.')});\n                    }\n                }\n            }\n        }\n        return {sent, notSent};\n    };\n}\n\nexport async function sendGuestInviteForUser(dispatch, user, teamId, channels, members) {\n    if (!isGuest(user)) {\n        return {notSent: {user, reason: localizeMessage('invite.members.user-is-not-guest', 'This person is already a member.')}};\n    }\n    let memberOfAll = true;\n    let memberOfAny = false;\n\n    for (const channel of channels) {\n        const member = members && members[channel] && members[channel][user.id];\n        if (member) {\n            memberOfAny = true;\n        } else {\n            memberOfAll = false;\n        }\n    }\n\n    if (memberOfAll) {\n        return {notSent: {user, reason: localizeMessage('invite.guests.already-all-channels-member', 'This person is already a member of all the channels.')}};\n    }\n\n    try {\n        await dispatch(addUsersToTeam(teamId, [user.id]));\n        for (const channel of channels) {\n            const member = members && members[channel] && members[channel][user.id];\n            if (!member) {\n                await dispatch(joinChannel(user.id, teamId, channel)); // eslint-disable-line no-await-in-loop\n            }\n        }\n    } catch (e) {\n        return {notSent: {user, reason: localizeMessage('invite.guests.unable-to-add-the-user-to-the-channels', 'Unable to add the guest to the channels.')}};\n    }\n\n    if (memberOfAny) {\n        return {notSent: {user, reason: localizeMessage('invite.guests.already-some-channels-member', 'This person is already a member of some of the channels.')}};\n    }\n    return {sent: {user, reason: {id: t('invite.guests.new-member'), message: 'This guest has been added to the team and {count, plural, one {channel} other {channels}}.', values: {count: channels.length}}}};\n}\n\nexport function sendGuestsInvites(teamId, channels, users, emails, message) {\n    return async (dispatch, getState) => {\n        if (users.length > 0) {\n            await dispatch(TeamActions.getTeamMembersByIds(teamId, users.map((u) => u.id)));\n        }\n        const state = getState();\n        const sent = [];\n        const notSent = [];\n        const members = getChannelMembersInChannels(state);\n        const results = await Promise.all(users.map((user) => sendGuestInviteForUser(dispatch, user, teamId, channels, members)));\n\n        for (const result of results) {\n            if (result.sent) {\n                sent.push(result.sent);\n            }\n            if (result.notSent) {\n                notSent.push(result.notSent);\n            }\n        }\n\n        if (emails.length > 0) {\n            let response;\n            try {\n                response = await dispatch(TeamActions.sendEmailGuestInvitesToChannelsGracefully(teamId, channels, emails, message));\n            } catch (e) {\n                response = {data: emails.map((email) => ({email, error: {error: localizeMessage('invite.guests.unable-to-add-the-user-to-the-channels', 'Unable to add the guest to the channels.')}}))};\n            }\n\n            if (response.error) {\n                if (response.error.server_error_id === 'app.email.rate_limit_exceeded.app_error') {\n                    response.error.message = localizeMessage('invite.rate-limit-exceeded', 'Invite emails rate limit exceeded.');\n                }\n                for (const email of emails) {\n                    notSent.push({email, reason: response.error.message});\n                }\n            } else {\n                for (const res of (response.data || [])) {\n                    if (res.error) {\n                        notSent.push({email: res.email, reason: res.error.message});\n                    } else {\n                        sent.push({email: res.email, reason: localizeMessage('invite.guests.added-to-channel', 'An invitation email has been sent.')});\n                    }\n                }\n            }\n        }\n        return {sent, notSent};\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {FC} from 'react';\n\nconst ConfirmNotifyAdminModalSvg: FC = () => (\n    <svg\n        width='512'\n        height='156'\n        viewBox='0 0 250 156'\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n    >\n        <path\n            opacity='0.1'\n            d='M154.728 52.6597C153.343 52.398 151.911 52.5537 150.616 53.1067C149.834 53.4519 148.988 53.6284 148.133 53.6246C147.278 53.6209 146.434 53.4369 145.655 53.0848C144.737 52.6839 143.742 52.4863 142.739 52.5057C141.737 52.5251 140.751 52.761 139.848 53.1971C139.333 53.4696 138.759 53.613 138.176 53.6148C135.822 53.6148 133.863 51.2527 133.456 48.1359C133.926 47.7929 134.325 47.3634 134.633 46.8706C136.013 44.655 138.152 43.2334 140.552 43.2334C142.953 43.2334 145.064 44.6379 146.437 46.8315C146.85 47.4949 147.429 48.0407 148.116 48.4156C148.804 48.7905 149.577 48.982 150.361 48.9713H150.422C152.303 48.981 153.926 50.4784 154.728 52.6597Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            opacity='0.1'\n            d='M218.4 76.0436C216.577 75.7024 214.693 75.9053 212.987 76.6264C211.958 77.0764 210.845 77.3065 209.719 77.3016C208.594 77.2967 207.482 77.0568 206.458 76.5977C205.249 76.0751 203.939 75.8175 202.62 75.8428C201.3 75.8681 200.002 76.1757 198.815 76.7442C198.137 77.0995 197.381 77.2864 196.613 77.2888C193.515 77.2888 190.936 74.2092 190.4 70.1456C191.019 69.6985 191.545 69.1385 191.949 68.4959C193.766 65.6074 196.581 63.7539 199.741 63.7539C202.901 63.7539 205.68 65.5851 207.487 68.4449C208.031 69.3099 208.792 70.0214 209.697 70.5103C210.602 70.9991 211.62 71.2487 212.652 71.2347H212.732C215.208 71.2475 217.345 73.1997 218.4 76.0436Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            opacity='0.1'\n            d='M161.888 42.8765L158.082 45.2825L160.392 41.0957C159.737 40.5762 158.927 40.2883 158.09 40.2774H158.029C157.764 40.2821 157.5 40.2633 157.239 40.2212L155.954 41.0347L156.508 40.0332C155.594 39.7152 154.804 39.1165 154.252 38.3233L151.942 39.7889L153.414 37.1483C152.063 35.5337 150.243 34.542 148.242 34.542C145.842 34.542 143.703 35.9661 142.323 38.1816C141.915 38.8468 141.336 39.392 140.647 39.7611C139.957 40.1303 139.182 40.3101 138.399 40.2823H138.269C135.619 40.2823 133.471 43.2771 133.471 46.968C133.471 50.6589 135.619 53.6536 138.269 53.6536C138.852 53.6517 139.426 53.5093 139.942 53.2383C140.844 52.8012 141.83 52.5646 142.832 52.5447C143.835 52.5249 144.83 52.7224 145.748 53.1235C146.525 53.4709 147.365 53.6515 148.216 53.6536C149.067 53.6557 149.909 53.4793 150.687 53.1358C151.599 52.7423 152.584 52.5485 153.578 52.5675C154.571 52.5864 155.549 52.8177 156.444 53.2457C156.955 53.5116 157.521 53.6515 158.097 53.6536C160.748 53.6536 162.896 50.6613 162.896 46.968C162.91 45.5414 162.564 44.1343 161.888 42.8765V42.8765Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            opacity='0.1'\n            d='M228.257 62.9219L223.187 66.1324L226.264 60.5458C225.391 59.8525 224.312 59.4684 223.197 59.4539H223.115C222.763 59.4601 222.411 59.435 222.063 59.3789L220.352 60.4643L221.09 59.1279C219.872 58.7036 218.819 57.9048 218.085 56.8464L215.007 58.802L216.967 55.2786C215.168 53.1241 212.744 51.8008 210.078 51.8008C206.88 51.8008 204.032 53.701 202.193 56.6573C201.649 57.545 200.878 58.2724 199.96 58.7649C199.041 59.2575 198.008 59.4975 196.966 59.4604H196.793C193.262 59.4604 190.4 63.4564 190.4 68.3814C190.4 73.3064 193.262 77.3024 196.793 77.3024C197.569 77.2999 198.334 77.1098 199.021 76.7483C200.222 76.1651 201.536 75.8493 202.871 75.8228C204.207 75.7964 205.533 76.0599 206.756 76.5951C207.79 77.0586 208.91 77.2996 210.044 77.3024C211.177 77.3053 212.299 77.0698 213.335 76.6114C214.549 76.0864 215.863 75.8278 217.186 75.8531C218.509 75.8784 219.812 76.1871 221.005 76.7581C221.685 77.113 222.44 77.2997 223.207 77.3024C226.738 77.3024 229.599 73.3097 229.599 68.3814C229.619 66.4779 229.157 64.6003 228.257 62.9219V62.9219Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            d='M127.166 35.4361C127.137 35.2133 127.068 34.9974 126.963 34.7986C126.879 34.6801 126.779 34.5747 126.664 34.4859C126.479 34.3143 126.262 34.18 126.026 34.0902C125.906 34.0435 125.776 34.0267 125.648 34.0412C125.52 34.0556 125.397 34.101 125.29 34.1733C125.101 34.3433 124.986 34.5813 124.972 34.8352C124.92 35.1796 124.98 35.5313 125.143 35.8392C125.34 36.1787 125.678 36.4059 125.96 36.677C126.167 36.8728 126.347 37.0955 126.494 37.339C126.562 37.4662 126.644 37.585 126.74 37.6932C126.787 37.7467 126.847 37.7883 126.914 37.8146C126.981 37.8409 127.053 37.8512 127.125 37.8446C127.244 37.8138 127.353 37.7504 127.439 37.6614C127.554 37.5613 127.868 37.3781 127.877 37.2169C127.887 37.0556 127.632 36.7918 127.581 36.6697C127.399 36.2742 127.261 35.8607 127.166 35.4361Z'\n            fill='var(--online-indicator)'\n        />\n        <path\n            d='M128 156C198.692 156 256 153.485 256 150.382C256 147.279 198.692 144.764 128 144.764C57.3076 144.764 0 147.279 0 150.382C0 153.485 57.3076 156 128 156Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.08'\n        />\n        <path\n            d='M216.08 148.526H205.663C205.09 148.526 204.541 148.299 204.135 147.895C203.73 147.492 203.503 146.945 203.503 146.374C203.503 145.803 203.73 145.256 204.135 144.852C204.541 144.449 205.09 144.222 205.663 144.222C205.373 144.232 205.085 144.183 204.814 144.079C204.544 143.976 204.297 143.819 204.089 143.618C203.88 143.417 203.715 143.177 203.601 142.911C203.488 142.645 203.43 142.36 203.43 142.071C203.43 141.782 203.488 141.497 203.601 141.231C203.715 140.965 203.88 140.725 204.089 140.524C204.297 140.323 204.544 140.166 204.814 140.063C205.085 139.959 205.373 139.91 205.663 139.92H206.139C206.411 138.069 208.507 136.627 211.058 136.625C213.608 136.623 215.717 138.061 215.984 139.91H216.08C216.369 139.901 216.658 139.949 216.928 140.053C217.199 140.157 217.446 140.313 217.654 140.514C217.862 140.715 218.028 140.955 218.141 141.221C218.254 141.487 218.313 141.773 218.313 142.061C218.313 142.35 218.254 142.636 218.141 142.901C218.028 143.167 217.862 143.408 217.654 143.608C217.446 143.809 217.199 143.966 216.928 144.07C216.658 144.173 216.369 144.222 216.08 144.212C216.653 144.212 217.202 144.439 217.607 144.842C218.012 145.246 218.24 145.793 218.24 146.364C218.24 146.935 218.012 147.482 217.607 147.886C217.202 148.289 216.653 148.516 216.08 148.516V148.526Z'\n            fill='var(--online-indicator)'\n        />\n        <path\n            opacity='0.1'\n            d='M218.238 142.069C218.237 142.64 218.009 143.186 217.605 143.59C217.2 143.993 216.652 144.22 216.08 144.222H205.666L216.013 139.91H216.077C216.651 139.911 217.201 140.14 217.606 140.544C218.011 140.949 218.238 141.498 218.238 142.069V142.069Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            opacity='0.1'\n            d='M203.567 146.395C203.569 146.965 203.797 147.511 204.202 147.914C204.606 148.317 205.155 148.543 205.727 148.545H216.143L205.788 144.253H205.732C205.16 144.254 204.612 144.479 204.207 144.88C203.801 145.281 203.571 145.826 203.567 146.395V146.395Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            d='M152.766 145.955H146.854C146.529 145.955 146.217 145.827 145.987 145.598C145.757 145.368 145.628 145.058 145.628 144.734C145.628 144.41 145.757 144.099 145.987 143.87C146.217 143.641 146.529 143.513 146.854 143.513C146.529 143.513 146.217 143.384 145.987 143.155C145.757 142.926 145.628 142.615 145.628 142.291C145.628 141.967 145.757 141.657 145.987 141.428C146.217 141.199 146.529 141.07 146.854 141.07H147.126C147.278 140.019 148.47 139.201 149.917 139.201C151.364 139.201 152.555 140.015 152.712 141.065H152.766C153.091 141.065 153.403 141.194 153.633 141.423C153.863 141.652 153.992 141.962 153.992 142.286C153.992 142.61 153.863 142.921 153.633 143.15C153.403 143.379 153.091 143.508 152.766 143.508C153.091 143.508 153.403 143.636 153.633 143.865C153.863 144.094 153.992 144.405 153.992 144.729C153.992 145.053 153.863 145.364 153.633 145.593C153.403 145.822 153.091 145.95 152.766 145.95V145.955Z'\n            fill='var(--online-indicator)'\n        />\n        <path\n            opacity='0.1'\n            d='M153.992 142.292C153.992 142.616 153.863 142.926 153.633 143.155C153.403 143.384 153.091 143.513 152.766 143.513H146.854L152.739 141.07H152.766C153.091 141.07 153.403 141.199 153.633 141.428C153.863 141.657 153.992 141.968 153.992 142.292V142.292Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            opacity='0.1'\n            d='M145.667 144.742C145.667 145.066 145.797 145.376 146.027 145.605C146.257 145.835 146.568 145.963 146.894 145.963H152.803L146.918 143.521H146.881C146.558 143.524 146.25 143.654 146.022 143.883C145.795 144.111 145.667 144.42 145.667 144.742V144.742Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            d='M42.0414 152.885H29.5356C29.1887 152.896 28.8432 152.837 28.5195 152.712C28.1959 152.587 27.9007 152.399 27.6516 152.158C27.4024 151.918 27.2043 151.63 27.069 151.311C26.9337 150.993 26.864 150.651 26.864 150.305C26.864 149.959 26.9337 149.617 27.069 149.298C27.2043 148.98 27.4024 148.692 27.6516 148.451C27.9007 148.211 28.1959 148.022 28.5195 147.897C28.8432 147.772 29.1887 147.713 29.5356 147.724C29.1887 147.735 28.8432 147.676 28.5195 147.551C28.1959 147.426 27.9007 147.238 27.6516 146.997C27.4024 146.756 27.2043 146.468 27.069 146.15C26.9337 145.831 26.864 145.489 26.864 145.143C26.864 144.798 26.9337 144.455 27.069 144.137C27.2043 143.819 27.4024 143.53 27.6516 143.29C27.9007 143.049 28.1959 142.861 28.5195 142.736C28.8432 142.611 29.1887 142.552 29.5356 142.563H30.1045C30.4306 140.342 32.9489 138.613 36.0067 138.61C39.0645 138.608 41.5853 140.332 41.9163 142.55H42.0291C42.7024 142.571 43.3412 142.852 43.8101 143.334C44.279 143.815 44.5413 144.46 44.5413 145.131C44.5413 145.802 44.279 146.447 43.8101 146.929C43.3412 147.41 42.7024 147.691 42.0291 147.712C42.7024 147.732 43.3412 148.013 43.8101 148.495C44.279 148.977 44.5413 149.622 44.5413 150.293C44.5413 150.964 44.279 151.608 43.8101 152.09C43.3412 152.572 42.7024 152.853 42.0291 152.873L42.0414 152.885Z'\n            fill='var(--online-indicator)'\n        />\n        <path\n            opacity='0.1'\n            d='M44.6284 145.142C44.6271 145.826 44.3543 146.481 43.8695 146.965C43.3848 147.449 42.7276 147.722 42.0414 147.724H29.5356L41.9482 142.551H42.0242C42.3661 142.55 42.7047 142.617 43.0206 142.747C43.3365 142.877 43.6236 143.068 43.8655 143.309C44.1073 143.55 44.2992 143.836 44.4301 144.15C44.561 144.465 44.6284 144.802 44.6284 145.142Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            opacity='0.1'\n            d='M27.0271 150.321C27.0303 151.005 27.3049 151.66 27.791 152.142C28.277 152.625 28.935 152.897 29.6214 152.898H42.1272L29.7023 147.749H29.6263C28.9401 147.75 28.282 148.02 27.7951 148.502C27.3083 148.984 27.0323 149.638 27.0271 150.321Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            opacity='0.1'\n            d='M67.6781 37.3877C66.7052 37.2017 65.6986 37.3089 64.7871 37.6955C64.2432 37.9378 63.6541 38.063 63.0583 38.063C62.4626 38.063 61.8735 37.9378 61.3296 37.6955C60.6866 37.415 59.9901 37.2767 59.2882 37.2902C58.5863 37.3037 57.8957 37.4686 57.264 37.7737C56.9037 37.9642 56.5023 38.0647 56.0944 38.0668C54.4466 38.0668 53.0758 36.4131 52.7914 34.2293C53.1205 33.99 53.4002 33.6898 53.6153 33.3451C54.5814 31.794 56.0674 30.7998 57.7569 30.7998C59.4464 30.7998 60.9177 31.7769 61.8838 33.3182C62.1727 33.7806 62.5762 34.1613 63.0554 34.4235C63.5347 34.6857 64.0736 34.8208 64.6203 34.8156H64.6645C65.9764 34.8131 67.1117 35.8611 67.6781 37.3877Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            opacity='0.1'\n            d='M72.6854 30.5407L70.0224 32.2237L71.6384 29.2925C71.1809 28.927 70.6137 28.7249 70.0273 28.7184H69.9857C69.8009 28.7227 69.6162 28.7096 69.4339 28.6793L68.5291 29.2485L68.9165 28.5474C68.2771 28.3247 67.7245 27.9067 67.3374 27.353L65.7165 28.3764L66.7366 26.5273C65.7926 25.3988 64.5175 24.7051 63.1173 24.7051C61.4376 24.7051 59.9296 25.6993 58.9733 27.2504C58.6866 27.7131 58.2823 28.0924 57.8014 28.3497C57.3205 28.607 56.7799 28.7334 56.2342 28.716H56.1533C54.2995 28.716 52.7939 30.8118 52.7939 33.3962C52.7939 35.9805 54.2995 38.0764 56.1533 38.0764C56.5614 38.0755 56.963 37.9748 57.323 37.7832C57.9547 37.4782 58.6453 37.3132 59.3472 37.2997C60.0491 37.2862 60.7455 37.4245 61.3886 37.7051C61.9357 37.9484 62.5279 38.0749 63.1271 38.0764C63.7185 38.0756 64.3032 37.9517 64.8436 37.7124C65.4816 37.4372 66.1714 37.3017 66.8665 37.3152C67.5616 37.3287 68.2457 37.4908 68.8724 37.7906C69.2296 37.977 69.6266 38.0751 70.0298 38.0764C71.886 38.0764 73.3892 35.9805 73.3892 33.3962C73.3982 32.4007 73.1562 31.4188 72.6854 30.5407V30.5407Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            opacity='0.1'\n            d='M32.5198 64.2579C33.4888 64.0743 34.4907 64.1815 35.3986 64.5656C35.942 64.808 36.5307 64.9333 37.1261 64.9333C37.7215 64.9333 38.3102 64.808 38.8536 64.5656C39.4966 64.2851 40.1931 64.1468 40.895 64.1603C41.5969 64.1738 42.2875 64.3388 42.9192 64.6438C43.2796 64.834 43.6809 64.9346 44.0888 64.9369C45.7366 64.9369 47.1098 63.2832 47.3943 61.0995C47.0646 60.8608 46.7847 60.5605 46.5704 60.2152C45.6042 58.6641 44.106 57.6699 42.4263 57.6699C40.7466 57.6699 39.268 58.647 38.3018 60.1883C38.0118 60.6517 37.6066 61.0328 37.1255 61.2946C36.6444 61.5565 36.1037 61.6904 35.5555 61.6833H35.5138C34.2093 61.6833 33.0715 62.7312 32.5198 64.2579Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            opacity='0.1'\n            d='M27.498 57.4103L30.1609 59.0933L28.5425 56.1621C29.0002 55.797 29.5673 55.5949 30.1536 55.588H30.1977C30.3825 55.5923 30.5672 55.5792 30.7494 55.549L31.6518 56.1181L31.2644 55.4171C31.9045 55.1945 32.458 54.7765 32.846 54.2226L34.4619 55.2436L33.4394 53.3945C34.3859 52.266 35.6586 51.5723 37.0612 51.5723C38.7409 51.5723 40.2366 52.5664 41.2052 54.1176C41.4917 54.5805 41.8959 54.9599 42.3769 55.2172C42.8579 55.4746 43.3986 55.6008 43.9442 55.5832H44.0325C45.8888 55.5832 47.3919 57.679 47.3919 60.2634C47.3919 62.8477 45.8888 64.9435 44.0325 64.9435C43.6245 64.9421 43.223 64.8414 42.8629 64.6504C42.2312 64.3454 41.5406 64.1804 40.8387 64.1669C40.1368 64.1534 39.4403 64.2917 38.7973 64.5723C38.251 64.8156 37.6596 64.9421 37.0612 64.9435C36.4697 64.9433 35.885 64.8193 35.3447 64.5796C34.7063 64.3043 34.016 64.1689 33.3205 64.1823C32.625 64.1958 31.9406 64.358 31.3134 64.6578C30.9564 64.8445 30.5593 64.9425 30.156 64.9435C28.3022 64.9435 26.7966 62.8477 26.7966 60.2634C26.7873 59.2689 27.0284 58.288 27.498 57.4103V57.4103Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            d='M128 152C150.091 152 168 151.105 168 150C168 148.895 150.091 148 128 148C105.909 148 88 148.895 88 150C88 151.105 105.909 152 128 152Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.2'\n        />\n        <ellipse\n            cx='125'\n            cy='75.4243'\n            rx='50.6957'\n            ry='50.1196'\n            fill='none'\n        />\n        <path\n            d='M178 76.0017C178 86.4841 174.891 96.731 169.067 105.447C163.243 114.162 154.965 120.955 145.281 124.966C135.596 128.977 124.939 130.027 114.659 127.981C104.378 125.936 94.9341 120.888 87.5221 113.475C80.1102 106.063 75.0628 96.6192 73.0181 86.3381C70.9734 76.057 72.0233 65.4005 76.0351 55.7162C80.0468 46.0318 86.8402 37.7546 95.5562 31.9312C104.272 26.1077 114.519 22.9997 125.002 23C131.962 23.0002 138.854 24.3713 145.284 27.035C151.714 29.6988 157.557 33.6029 162.478 38.5246C167.399 43.4462 171.303 49.289 173.966 55.7194C176.63 62.1497 178 69.0416 178 76.0017V76.0017ZM118.875 104.056L158.19 64.7408C158.508 64.4234 158.761 64.0465 158.933 63.6314C159.105 63.2164 159.194 62.7714 159.194 62.3221C159.194 61.8727 159.105 61.4278 158.933 61.0127C158.761 60.5977 158.508 60.2207 158.19 59.9034L153.353 55.1014C153.036 54.7834 152.66 54.5311 152.245 54.359C151.831 54.1868 151.386 54.0982 150.937 54.0982C150.489 54.0982 150.044 54.1868 149.63 54.359C149.215 54.5311 148.839 54.7834 148.522 55.1014L116.457 87.1675L101.485 72.1601C100.842 71.5209 99.9724 71.1622 99.066 71.1622C98.1596 71.1622 97.29 71.5209 96.6473 72.1601L91.81 77.0259C91.1708 77.6687 90.8121 78.5382 90.8121 79.4446C90.8121 80.351 91.1708 81.2206 91.81 81.8633L114.039 104.084C114.356 104.402 114.733 104.655 115.148 104.827C115.563 104.999 116.008 105.088 116.458 105.088C116.907 105.088 117.352 104.999 117.767 104.827C118.182 104.655 118.559 104.402 118.876 104.084L118.875 104.056Z'\n            fill='var(--online-indicator)'\n        />\n    </svg>\n);\n\nexport default ConfirmNotifyAdminModalSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Button, Modal} from 'react-bootstrap';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport ConfirmNotifyAdminModalSvg from './confirm_notify_admin.svg';\n\nimport './confirm_notify_admin_modal.scss';\n\ntype Props = {\n    show: boolean;\n    actions: {\n        closeModal: () => void;\n    };\n};\n\nconst ConfirmNotifyAdminModal = (props: Props): JSX.Element => {\n    return (\n        <>\n            <Modal\n                className={'ConfirmNotifyAdminModal'}\n                show={props.show}\n                id='confirmNotifyAdminModal'\n                role='dialog'\n                onHide={props.actions.closeModal}\n            >\n                <Modal.Header closeButton={true}/>\n                <Modal.Body>\n                    <ConfirmNotifyAdminModalSvg/>\n                    <div className='title'>\n                        <FormattedMessage\n                            id={'confirm.notification_sent_to_admin.modal_title'}\n                            defaultMessage={'Thank you!'}\n                        />\n                    </div>\n                    <div className='description'>\n                        <FormattedMessage\n                            id={'confirm.notification_sent_to_admin.modal_body'}\n                            defaultMessage={'A notification has been sent to your administrator.'}\n                        />\n                    </div>\n                    <div className='buttons'>\n                        <Button\n                            className='confirm-button'\n                            onClick={props.actions.closeModal}\n                        >\n                            <FormattedMessage\n                                id={'confirm.notification_sent_to_admin.modal_done'}\n                                defaultMessage={'Done'}\n                            />\n                        </Button>\n                    </div>\n                </Modal.Body>\n            </Modal>\n        </>\n    );\n};\n\nexport default ConfirmNotifyAdminModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {GlobalState} from 'types/store';\n\nimport {closeModal} from 'actions/views/modals';\nimport {isModalOpen} from 'selectors/views/modals';\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport ConfirmNotifyAdminModal from './confirm_notify_admin_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        show: isModalOpen(state, ModalIdentifiers.CONFIRM_NOTIFY_ADMIN),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators(\n            {\n                closeModal: () => closeModal(ModalIdentifiers.CONFIRM_NOTIFY_ADMIN),\n            },\n            dispatch,\n        ),\n    };\n}\n\nexport default connect(\n    mapStateToProps,\n    mapDispatchToProps,\n)(ConfirmNotifyAdminModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {FC} from 'react';\n\nconst UpgradeUserLimitModalSvg: FC = () => (\n    <svg\n        width='512'\n        height='156'\n        viewBox='0 0 512 156'\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n    >\n        <path\n            opacity='0.1'\n            d='M282.728 52.6597C281.343 52.398 279.911 52.5537 278.616 53.1067C277.834 53.4519 276.988 53.6284 276.133 53.6246C275.278 53.6209 274.434 53.4369 273.655 53.0848C272.737 52.6839 271.742 52.4863 270.74 52.5057C269.737 52.5251 268.751 52.761 267.849 53.1971C267.334 53.4696 266.76 53.613 266.176 53.6148C263.822 53.6148 261.863 51.2527 261.456 48.1359C261.926 47.7929 262.326 47.3634 262.633 46.8706C264.014 44.655 266.152 43.2334 268.552 43.2334C270.953 43.2334 273.064 44.6379 274.438 46.8315C274.851 47.4949 275.429 48.0407 276.117 48.4156C276.804 48.7905 277.577 48.982 278.361 48.9713H278.422C280.303 48.981 281.926 50.4784 282.728 52.6597Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            opacity='0.1'\n            d='M346.4 76.0436C344.578 75.7024 342.693 75.9053 340.988 76.6264C339.959 77.0764 338.845 77.3065 337.72 77.3016C336.594 77.2967 335.483 77.0568 334.458 76.5977C333.249 76.0751 331.94 75.8175 330.62 75.8428C329.301 75.8681 328.002 76.1757 326.815 76.7442C326.137 77.0995 325.381 77.2864 324.614 77.2888C321.515 77.2888 318.936 74.2092 318.4 70.1456C319.019 69.6985 319.545 69.1385 319.95 68.4959C321.767 65.6074 324.581 63.7539 327.741 63.7539C330.901 63.7539 333.68 65.5851 335.488 68.4449C336.032 69.3099 336.793 70.0214 337.698 70.5103C338.603 70.9991 339.62 71.2487 340.652 71.2347H340.733C343.208 71.2475 345.345 73.1997 346.4 76.0436Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            opacity='0.1'\n            d='M289.888 42.8765L286.082 45.2825L288.392 41.0957C287.737 40.5762 286.927 40.2883 286.09 40.2774H286.029C285.764 40.2821 285.5 40.2633 285.239 40.2212L283.954 41.0347L284.508 40.0332C283.594 39.7152 282.804 39.1165 282.252 38.3233L279.942 39.7889L281.414 37.1483C280.063 35.5337 278.243 34.542 276.242 34.542C273.842 34.542 271.703 35.9661 270.323 38.1816C269.915 38.8468 269.336 39.392 268.647 39.7611C267.957 40.1303 267.182 40.3101 266.399 40.2823H266.269C263.619 40.2823 261.471 43.2771 261.471 46.968C261.471 50.6589 263.619 53.6536 266.269 53.6536C266.852 53.6517 267.426 53.5093 267.942 53.2383C268.844 52.8012 269.83 52.5646 270.832 52.5447C271.835 52.5249 272.83 52.7224 273.748 53.1235C274.525 53.4709 275.365 53.6515 276.216 53.6536C277.067 53.6557 277.909 53.4793 278.687 53.1357C279.599 52.7423 280.584 52.5485 281.578 52.5675C282.571 52.5864 283.549 52.8177 284.444 53.2457C284.955 53.5116 285.521 53.6515 286.097 53.6536C288.748 53.6536 290.896 50.6613 290.896 46.968C290.91 45.5414 290.564 44.1343 289.888 42.8765Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            opacity='0.1'\n            d='M356.257 62.9219L351.187 66.1324L354.265 60.5458C353.392 59.8525 352.313 59.4684 351.197 59.4539H351.116C350.763 59.4601 350.411 59.435 350.064 59.3789L348.352 60.4643L349.09 59.1279C347.872 58.7036 346.82 57.9048 346.085 56.8464L343.008 58.802L344.968 55.2786C343.168 53.1241 340.744 51.8008 338.079 51.8008C334.88 51.8008 332.032 53.701 330.193 56.6573C329.649 57.545 328.878 58.2724 327.96 58.7649C327.042 59.2575 326.008 59.4975 324.966 59.4604H324.793C321.262 59.4604 318.4 63.4564 318.4 68.3814C318.4 73.3064 321.262 77.3024 324.793 77.3024C325.57 77.2999 326.334 77.1098 327.021 76.7483C328.222 76.1651 329.536 75.8493 330.872 75.8228C332.207 75.7964 333.533 76.0599 334.756 76.5951C335.79 77.0586 336.911 77.2996 338.044 77.3024C339.178 77.3053 340.299 77.0698 341.335 76.6114C342.55 76.0864 343.863 75.8278 345.186 75.8531C346.51 75.8784 347.812 76.1871 349.005 76.7581C349.685 77.113 350.44 77.2997 351.207 77.3024C354.738 77.3024 357.6 73.3097 357.6 68.3814C357.619 66.4779 357.157 64.6003 356.257 62.9219Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            d='M255.167 35.4361C255.137 35.2133 255.068 34.9974 254.963 34.7986C254.88 34.6801 254.779 34.5747 254.664 34.4859C254.479 34.3143 254.263 34.18 254.026 34.0902C253.906 34.0435 253.777 34.0267 253.648 34.0412C253.52 34.0556 253.397 34.101 253.291 34.1733C253.101 34.3433 252.986 34.5813 252.972 34.8352C252.92 35.1796 252.981 35.5313 253.144 35.8392C253.34 36.1787 253.678 36.4059 253.96 36.677C254.167 36.8728 254.347 37.0955 254.495 37.339C254.562 37.4662 254.645 37.585 254.74 37.6932C254.788 37.7467 254.848 37.7883 254.914 37.8146C254.981 37.8409 255.053 37.8512 255.125 37.8446C255.245 37.8138 255.353 37.7504 255.439 37.6614C255.554 37.5613 255.868 37.3781 255.878 37.2169C255.888 37.0556 255.633 36.7918 255.581 36.6697C255.4 36.2742 255.261 35.8607 255.167 35.4361Z'\n            fill='var(--online-indicator)'\n        />\n        <path\n            d='M256 156C326.692 156 384 153.485 384 150.382C384 147.279 326.692 144.764 256 144.764C185.308 144.764 128 147.279 128 150.382C128 153.485 185.308 156 256 156Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M251.2 152.213C266.664 152.213 279.2 151.321 279.2 150.221C279.2 149.121 266.664 148.229 251.2 148.229C235.736 148.229 223.2 149.121 223.2 150.221C223.2 151.321 235.736 152.213 251.2 152.213Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M253.016 150.152C252.148 150.321 251.253 150.283 250.403 150.044C249.552 149.804 248.77 149.368 248.119 148.772C247.469 148.176 246.968 147.436 246.658 146.611C246.347 145.787 246.235 144.901 246.332 144.026C246.974 138.369 248.973 129.255 254.438 115.573C260.775 99.7106 258.489 95.8781 251.699 84.5025C249.507 80.8262 247.021 76.6614 244.343 71.3119C237.438 57.5693 240.062 46.9778 243.47 40.5316C247.094 33.6701 252.278 30.0769 252.857 29.6885L258.207 38.5066L257.717 38.9951C257.705 38.9951 257.962 38.9951 258.335 39.6718C256.241 41.4795 254.519 43.6755 253.266 46.1376C250.299 52.0562 250.692 58.8395 254.431 66.2824C256.935 71.2704 259.308 75.2495 261.402 78.7597C265.164 85.0618 268.133 90.04 269.117 96.3251C270.134 102.83 268.871 109.828 264.926 119.726C259.725 132.743 258.06 140.89 257.553 145.262C257.416 146.45 256.904 147.564 256.089 148.442C255.275 149.32 254.201 149.918 253.023 150.147L253.016 150.152Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M228.291 22.6071L250.985 0L273.9 22.6071H258.327V39.894H243.864V22.717L228.291 22.6071Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            d='M300.8 149.822C308.753 149.822 315.2 149.287 315.2 148.627C315.2 147.967 308.753 147.432 300.8 147.432C292.847 147.432 286.4 147.967 286.4 148.627C286.4 149.287 292.847 149.822 300.8 149.822Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M301.631 148.924C301.178 149.012 300.711 148.993 300.267 148.868C299.823 148.743 299.414 148.515 299.075 148.204C298.735 147.893 298.474 147.507 298.311 147.076C298.149 146.646 298.091 146.183 298.142 145.726C298.475 142.773 299.52 138.015 302.374 130.872C305.682 122.589 304.488 120.588 300.945 114.648C299.799 112.73 298.492 110.554 297.097 107.759C293.498 100.585 294.866 95.0575 296.646 91.6915C297.819 89.4517 299.498 87.5136 301.55 86.0293L304.343 90.6338L304.083 90.878C304.083 90.878 304.216 90.878 304.407 91.2322C303.313 92.1757 302.413 93.3222 301.759 94.608C300.211 97.698 300.417 101.237 302.369 105.126C303.676 107.73 304.915 109.809 306.008 111.641C307.97 114.931 309.522 117.53 310.037 120.813C310.567 124.209 309.912 127.863 307.847 133.027C305.133 139.822 304.262 144.075 303.997 146.359C303.928 146.98 303.661 147.562 303.236 148.021C302.811 148.481 302.249 148.792 301.634 148.911L301.631 148.924Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M288.721 82.3295L300.569 70.5264L312.536 82.3295H304.404V91.3552H296.852V82.3881L288.721 82.3295Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            d='M201.6 149.026C209.553 149.026 216 148.49 216 147.83C216 147.17 209.553 146.635 201.6 146.635C193.647 146.635 187.2 147.17 187.2 147.83C187.2 148.49 193.647 149.026 201.6 149.026Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M200.561 148.924C201.013 149.012 201.481 148.993 201.925 148.868C202.369 148.743 202.777 148.515 203.117 148.204C203.457 147.893 203.718 147.507 203.88 147.076C204.042 146.646 204.1 146.183 204.05 145.726C203.716 142.773 202.672 138.015 199.818 130.872C196.51 122.589 197.704 120.588 201.247 114.648C202.392 112.73 203.699 110.554 205.094 107.759C208.694 100.585 207.326 95.0575 205.546 91.6915C204.372 89.4517 202.694 87.5136 200.641 86.0293L197.848 90.6338L198.108 90.878C198.108 90.878 197.976 90.878 197.785 91.2322C198.879 92.1757 199.778 93.3222 200.433 94.608C201.98 97.698 201.774 101.237 199.822 105.126C198.515 107.73 197.277 109.809 196.184 111.641C194.222 114.931 192.67 117.53 192.155 120.813C191.625 124.209 192.28 127.863 194.344 133.027C197.059 139.822 197.929 144.075 198.194 146.359C198.264 146.98 198.531 147.562 198.956 148.021C199.381 148.481 199.942 148.792 200.558 148.911L200.561 148.924Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M213.471 82.3295L201.623 70.5264L189.656 82.3295H197.787V91.3552H205.34V82.3881L213.471 82.3295Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            d='M344.079 148.526H333.663C333.09 148.526 332.54 148.299 332.135 147.895C331.73 147.492 331.502 146.945 331.502 146.374C331.502 145.803 331.73 145.256 332.135 144.852C332.54 144.449 333.09 144.222 333.663 144.222C333.373 144.232 333.084 144.183 332.814 144.079C332.544 143.976 332.297 143.819 332.088 143.618C331.88 143.417 331.714 143.177 331.601 142.911C331.488 142.645 331.43 142.36 331.43 142.071C331.43 141.782 331.488 141.497 331.601 141.231C331.714 140.965 331.88 140.725 332.088 140.524C332.297 140.323 332.544 140.166 332.814 140.063C333.084 139.959 333.373 139.91 333.663 139.92H334.138C334.411 138.069 336.507 136.627 339.057 136.625C341.608 136.623 343.716 138.061 343.984 139.91H344.079C344.369 139.901 344.658 139.949 344.928 140.053C345.199 140.157 345.445 140.313 345.654 140.514C345.862 140.715 346.028 140.955 346.141 141.221C346.254 141.487 346.312 141.773 346.312 142.061C346.312 142.35 346.254 142.636 346.141 142.901C346.028 143.167 345.862 143.408 345.654 143.608C345.445 143.809 345.199 143.966 344.928 144.07C344.658 144.173 344.369 144.222 344.079 144.212C344.652 144.212 345.202 144.439 345.607 144.842C346.012 145.246 346.24 145.793 346.24 146.364C346.24 146.935 346.012 147.482 345.607 147.886C345.202 148.289 344.652 148.516 344.079 148.516V148.526Z'\n            fill='var(--online-indicator)'\n        />\n        <path\n            opacity='0.1'\n            d='M346.238 142.069C346.237 142.64 346.01 143.186 345.605 143.59C345.201 143.993 344.652 144.22 344.08 144.222H333.666L344.014 139.91H344.078C344.652 139.911 345.201 140.14 345.606 140.544C346.011 140.949 346.239 141.498 346.238 142.069Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            opacity='0.1'\n            d='M331.566 146.395C331.568 146.965 331.797 147.511 332.201 147.914C332.606 148.317 333.155 148.543 333.727 148.545H344.143L333.788 144.253H333.732C333.16 144.254 332.612 144.479 332.206 144.88C331.801 145.281 331.571 145.826 331.566 146.395Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            d='M280.766 145.955H274.854C274.529 145.955 274.217 145.827 273.987 145.598C273.757 145.368 273.628 145.058 273.628 144.734C273.628 144.41 273.757 144.099 273.987 143.87C274.217 143.641 274.529 143.513 274.854 143.513C274.529 143.513 274.217 143.384 273.987 143.155C273.757 142.926 273.628 142.615 273.628 142.291C273.628 141.967 273.757 141.657 273.987 141.428C274.217 141.199 274.529 141.07 274.854 141.07H275.126C275.278 140.019 276.47 139.201 277.917 139.201C279.363 139.201 280.555 140.015 280.712 141.065H280.766C281.091 141.065 281.403 141.194 281.633 141.423C281.863 141.652 281.992 141.962 281.992 142.286C281.992 142.61 281.863 142.921 281.633 143.15C281.403 143.379 281.091 143.508 280.766 143.508C281.091 143.508 281.403 143.636 281.633 143.865C281.863 144.094 281.992 144.405 281.992 144.729C281.992 145.053 281.863 145.364 281.633 145.593C281.403 145.822 281.091 145.95 280.766 145.95V145.955Z'\n            fill='var(--online-indicator)'\n        />\n        <path\n            opacity='0.1'\n            d='M281.993 142.292C281.993 142.616 281.863 142.926 281.633 143.155C281.404 143.384 281.092 143.513 280.767 143.513H274.854L280.74 141.07H280.767C281.092 141.07 281.404 141.199 281.633 141.428C281.863 141.657 281.993 141.968 281.993 142.292Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            opacity='0.1'\n            d='M273.668 144.742C273.668 145.066 273.797 145.376 274.027 145.605C274.257 145.835 274.569 145.963 274.894 145.963H280.804L274.919 143.521H274.882C274.559 143.524 274.25 143.654 274.023 143.883C273.795 144.111 273.668 144.42 273.668 144.742Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            d='M170.042 152.885H157.536C157.189 152.896 156.843 152.837 156.52 152.712C156.196 152.587 155.901 152.399 155.652 152.158C155.403 151.918 155.205 151.63 155.069 151.311C154.934 150.993 154.864 150.651 154.864 150.305C154.864 149.959 154.934 149.617 155.069 149.298C155.205 148.98 155.403 148.692 155.652 148.451C155.901 148.211 156.196 148.022 156.52 147.897C156.843 147.772 157.189 147.713 157.536 147.724C157.189 147.735 156.843 147.676 156.52 147.551C156.196 147.426 155.901 147.238 155.652 146.997C155.403 146.756 155.205 146.468 155.069 146.15C154.934 145.831 154.864 145.489 154.864 145.143C154.864 144.798 154.934 144.455 155.069 144.137C155.205 143.819 155.403 143.53 155.652 143.29C155.901 143.049 156.196 142.861 156.52 142.736C156.843 142.611 157.189 142.552 157.536 142.563H158.105C158.431 140.342 160.949 138.613 164.007 138.61C167.065 138.608 169.586 140.332 169.917 142.55H170.029C170.703 142.571 171.341 142.852 171.81 143.334C172.279 143.815 172.542 144.46 172.542 145.131C172.542 145.802 172.279 146.447 171.81 146.929C171.341 147.41 170.703 147.691 170.029 147.712C170.703 147.732 171.341 148.013 171.81 148.495C172.279 148.977 172.542 149.622 172.542 150.293C172.542 150.964 172.279 151.608 171.81 152.09C171.341 152.572 170.703 152.853 170.029 152.873L170.042 152.885Z'\n            fill='var(--online-indicator)'\n        />\n        <path\n            opacity='0.1'\n            d='M172.628 145.142C172.627 145.826 172.354 146.481 171.869 146.965C171.384 147.449 170.727 147.722 170.041 147.724H157.535L169.948 142.551H170.024C170.366 142.55 170.704 142.617 171.02 142.747C171.336 142.877 171.623 143.068 171.865 143.309C172.107 143.55 172.299 143.836 172.43 144.15C172.561 144.465 172.628 144.802 172.628 145.142Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            opacity='0.1'\n            d='M155.027 150.321C155.031 151.005 155.305 151.66 155.791 152.142C156.277 152.625 156.935 152.897 157.622 152.898H170.127L157.703 147.749H157.627C156.94 147.75 156.282 148.02 155.795 148.502C155.309 148.984 155.033 149.638 155.027 150.321Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            opacity='0.1'\n            d='M195.678 37.3877C194.705 37.2017 193.698 37.3089 192.787 37.6955C192.243 37.9378 191.654 38.063 191.058 38.063C190.462 38.063 189.873 37.9378 189.329 37.6955C188.686 37.415 187.99 37.2767 187.288 37.2902C186.586 37.3037 185.895 37.4686 185.264 37.7737C184.903 37.9642 184.502 38.0647 184.094 38.0668C182.446 38.0668 181.075 36.4131 180.791 34.2293C181.12 33.99 181.4 33.6898 181.615 33.3451C182.581 31.794 184.067 30.7998 185.757 30.7998C187.446 30.7998 188.917 31.7769 189.883 33.3182C190.172 33.7806 190.576 34.1613 191.055 34.4235C191.534 34.6857 192.073 34.8208 192.62 34.8156H192.664C193.976 34.8131 195.111 35.8611 195.678 37.3877Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            opacity='0.1'\n            d='M200.685 30.5407L198.022 32.2237L199.638 29.2925C199.181 28.927 198.614 28.7249 198.027 28.7184H197.986C197.801 28.7227 197.616 28.7096 197.434 28.6793L196.529 29.2485L196.917 28.5474C196.277 28.3247 195.725 27.9067 195.337 27.353L193.717 28.3764L194.737 26.5273C193.793 25.3988 192.517 24.7051 191.117 24.7051C189.438 24.7051 187.93 25.6993 186.973 27.2504C186.687 27.7131 186.282 28.0924 185.801 28.3497C185.32 28.607 184.78 28.7334 184.234 28.716H184.153C182.3 28.716 180.794 30.8118 180.794 33.3962C180.794 35.9805 182.3 38.0764 184.153 38.0764C184.561 38.0755 184.963 37.9748 185.323 37.7832C185.955 37.4782 186.645 37.3132 187.347 37.2997C188.049 37.2862 188.746 37.4245 189.389 37.7051C189.936 37.9484 190.528 38.0749 191.127 38.0764C191.718 38.0756 192.303 37.9517 192.844 37.7124C193.482 37.4372 194.171 37.3017 194.867 37.3152C195.562 37.3287 196.246 37.4908 196.872 37.7906C197.23 37.977 197.627 38.0751 198.03 38.0764C199.886 38.0764 201.389 35.9805 201.389 33.3962C201.398 32.4007 201.156 31.4188 200.685 30.5407Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            opacity='0.1'\n            d='M160.52 64.2579C161.489 64.0743 162.49 64.1815 163.398 64.5656C163.942 64.808 164.53 64.9333 165.126 64.9333C165.721 64.9333 166.31 64.808 166.853 64.5656C167.496 64.2851 168.193 64.1468 168.895 64.1603C169.597 64.1738 170.287 64.3388 170.919 64.6438C171.279 64.834 171.681 64.9346 172.089 64.9369C173.736 64.9369 175.11 63.2832 175.394 61.0995C175.064 60.8608 174.784 60.5605 174.57 60.2152C173.604 58.6641 172.106 57.6699 170.426 57.6699C168.746 57.6699 167.268 58.647 166.302 60.1883C166.012 60.6517 165.606 61.0328 165.125 61.2946C164.644 61.5565 164.103 61.6904 163.555 61.6833H163.514C162.209 61.6833 161.071 62.7312 160.52 64.2579Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            opacity='0.1'\n            d='M155.498 57.4103L158.161 59.0933L156.543 56.1621C157.001 55.797 157.568 55.5949 158.154 55.588H158.198C158.383 55.5923 158.568 55.5792 158.75 55.549L159.652 56.1181L159.265 55.4171C159.905 55.1945 160.458 54.7765 160.846 54.2226L162.462 55.2436L161.44 53.3945C162.386 52.266 163.659 51.5723 165.062 51.5723C166.741 51.5723 168.237 52.5664 169.206 54.1176C169.492 54.5805 169.896 54.9599 170.377 55.2172C170.858 55.4746 171.399 55.6008 171.945 55.5832H172.033C173.889 55.5832 175.392 57.679 175.392 60.2634C175.392 62.8477 173.889 64.9436 172.033 64.9436C171.625 64.9421 171.223 64.8414 170.863 64.6504C170.232 64.3454 169.541 64.1804 168.839 64.1669C168.137 64.1534 167.441 64.2917 166.798 64.5723C166.251 64.8156 165.66 64.9421 165.062 64.9436C164.47 64.9433 163.885 64.8193 163.345 64.5796C162.707 64.3043 162.017 64.1689 161.321 64.1823C160.626 64.1958 159.941 64.358 159.314 64.6578C158.957 64.8445 158.56 64.9425 158.157 64.9436C156.303 64.9436 154.797 62.8477 154.797 60.2634C154.788 59.2689 155.029 58.288 155.498 57.4103Z'\n            fill='var(--button-bg)'\n        />\n    </svg>\n);\n\nexport default UpgradeUserLimitModalSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport {Modal, Button} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {trackEvent, pageVisited} from 'actions/telemetry_actions';\n\nimport {ModalIdentifiers, TELEMETRY_CATEGORIES} from 'utils/constants';\nimport PurchaseModal from 'components/purchase_modal';\nimport NotifyLink from 'components/widgets/links/notify_link';\nimport ConfirmNotifyAdminModal from 'components/confirm_notify_admin_modal';\n\nimport UpgradeUserLimitModalSvg from './user_limit_upgrade_svg';\n\nimport './user_limit_modal.scss';\n\ntype Props = {\n    userIsAdmin: boolean;\n    show: boolean;\n    cloudUserLimit: string;\n    actions: {\n        closeModal: (identifier: string) => void;\n        openModal: (modalData: {modalId: string; dialogType: any; dialogProps?: any}) => void;\n    };\n};\n\nexport default function UserLimitModal(props: Props): JSX.Element {\n    const [notificationProcessDone, setNotificationProcessDoneStatus] = useState(false);\n    useEffect(() => {\n        pageVisited(\n            TELEMETRY_CATEGORIES.CLOUD_PURCHASING,\n            'pageview_modal_user_limit_reached',\n        );\n    }, []);\n\n    useEffect(() => {\n        if (notificationProcessDone === true) {\n            props.actions.closeModal(ModalIdentifiers.UPGRADE_CLOUD_ACCOUNT);\n            props.actions.openModal({\n                modalId: ModalIdentifiers.CONFIRM_NOTIFY_ADMIN,\n                dialogType: ConfirmNotifyAdminModal,\n            });\n        }\n    }, [notificationProcessDone]);\n\n    const onSubmit = () => {\n        trackEvent(\n            TELEMETRY_CATEGORIES.CLOUD_PURCHASING,\n            'click_modal_user_limit_upgrade',\n        );\n        props.actions.closeModal(ModalIdentifiers.UPGRADE_CLOUD_ACCOUNT);\n        props.actions.openModal({\n            modalId: ModalIdentifiers.CLOUD_PURCHASE,\n            dialogType: PurchaseModal,\n        });\n    };\n\n    const close = () => {\n        trackEvent(\n            TELEMETRY_CATEGORIES.CLOUD_PURCHASING,\n            'click_modal_user_limit_not_now',\n        );\n        props.actions.closeModal(ModalIdentifiers.UPGRADE_CLOUD_ACCOUNT);\n    };\n\n    const confirmBtn = props.userIsAdmin ? (\n        <Button\n            className='confirm-button'\n            onClick={onSubmit}\n        >\n            <FormattedMessage\n                id={'upgrade.cloud'}\n                defaultMessage={'Upgrade Mattermost Cloud'}\n            />\n        </Button>\n    ) : (<NotifyLink\n        extraFunc={() => setNotificationProcessDoneStatus(true)}\n        className='confirm-button'\n    // eslint-disable-next-line react/jsx-closing-bracket-location\n    />);\n\n    return (\n        <>\n            {props.show && (\n                <Modal\n                    className={'UserLimitModal'}\n                    show={props.show}\n                    id='userLimitModal'\n                    role='dialog'\n                    onHide={close}\n                >\n                    <Modal.Header closeButton={true}/>\n                    <Modal.Body>\n                        <UpgradeUserLimitModalSvg/>\n                        <div className='title'>\n                            <FormattedMessage\n                                id={'upgrade.cloud_modal_title'}\n                                defaultMessage={\"You've reached the user limit\\\"\"}\n                            />\n                        </div>\n                        <div className='description'>\n                            <FormattedMessage\n                                id={'upgrade.cloud_modal_body'}\n                                defaultMessage={\n                                    'The free tier is limited to {num} users. Upgrade Mattermost Cloud for more users.'\n                                }\n                                values={{\n                                    num: props.cloudUserLimit,\n                                }}\n                            />\n                        </div>\n                        <div className='buttons'>\n                            <Button\n                                className='dismiss-link'\n                                onClick={close}\n                            >\n                                <FormattedMessage\n                                    id={'cloud.upgrade.notrightnow'}\n                                    defaultMessage={'Not right now'}\n                                />\n                            </Button>\n                            {confirmBtn}\n                        </div>\n                    </Modal.Body>\n                </Modal>\n            )}\n        </>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function InviteIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='126px'\n                height='32px'\n                viewBox='0 0 126 32'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.invite', defaultMessage: 'Invite Icon'})}\n            >\n                <path d='M 106,18 86,5.52 V 4 c 0,-2.22 1.78,-4 4,-4 h 32 c 2.20914,0 4,1.790861 4,4 v 1.5 z m 20,10 c 0,2.209139 -1.79086,4 -4,4 H 90 c -2.22,0 -4,-1.8 -4,-4 V 10.22 l 4,2.5 V 28 h 32 V 12.72 l 4,-2.5 z M 1,15 h 62 c 0.552285,0 1,0.447715 1,1 0,0.552285 -0.447715,1 -1,1 H 1 C 0.44771525,17 0,16.552285 0,16 0,15.447715 0.44771525,15 1,15 Z M 21,5 h 48 c 0.552285,0 1,0.447715 1,1 0,0.552285 -0.447715,1 -1,1 H 21 C 20.447715,7 20,6.552285 20,6 20,5.447715 20.447715,5 21,5 Z m 0,20 h 48 c 0.552285,0 1,0.447715 1,1 0,0.552285 -0.447715,1 -1,1 H 21 c -0.552285,0 -1,-0.447715 -1,-1 0,-0.552285 0.447715,-1 1,-1 z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function ArrowRightIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='24px'\n                height='24px'\n                viewBox='0 0 24 24'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.channel.arrow-right', defaultMessage: 'Arrow right'})}\n            >\n                <path d='M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z'/>\n            </svg>\n        </span>\n    );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport InviteIcon from 'components/widgets/icons/invite_icon';\nimport ArrowRightIcon from 'components/widgets/icons/arrow_right_icon';\n\nimport './invitation_modal_initial_step.scss';\n\nexport default class InvitationModalInitialStep extends React.PureComponent {\n    static propTypes = {\n        teamName: PropTypes.string.isRequired,\n        goToMembers: PropTypes.func.isRequired,\n        goToGuests: PropTypes.func.isRequired,\n        emailInvitationsEnabled: PropTypes.bool.isRequired,\n    }\n\n    onMembersKeyDown = (e) => {\n        const code = e.which;\n        if ((code === 13) || (code === 32)) {\n            this.props.goToMembers();\n        }\n    }\n\n    onGuestsKeyDown = (e) => {\n        const code = e.which;\n        if ((code === 13) || (code === 32)) {\n            this.props.goToGuests();\n        }\n    }\n\n    render() {\n        const teamName = this.props.teamName;\n        return (\n            <div className='InvitationModalInitialStep'>\n                <div className='modal-icon'>\n                    <InviteIcon/>\n                </div>\n                <h1 id='invitation_modal_title'>\n                    <FormattedMarkdownMessage\n                        id='invitation_modal.title'\n                        defaultMessage='Invite people to **{teamName}**'\n                        values={{teamName}}\n                    />\n                </h1>\n                <div\n                    className='invitation-modal-option'\n                    onClick={this.props.goToMembers}\n                    data-testid='inviteMembersLink'\n                    tabIndex='0'\n                    onKeyDown={this.onMembersKeyDown}\n                    aria-labelledby='inviteMembersSectionHeader'\n                    aria-describedby='inviteMembersSectionDescription'\n                >\n                    <div data-testid='inviteMembersSection'>\n                        <h2 id='inviteMembersSectionHeader'>\n                            <FormattedMarkdownMessage\n                                id='invitation_modal.invite_members.title'\n                                defaultMessage='Invite **Members**'\n                            />\n                        </h2>\n                        {this.props.emailInvitationsEnabled &&\n                        <FormattedMessage\n                            id='invitation_modal.invite_members.description'\n                            defaultMessage='Invite new team members with a link or by email. Team members have access to messages and files in open teams and public channels.'\n                        >\n                            {(text) => (<span id='inviteMembersSectionDescription'>{text}</span>)}\n                        </FormattedMessage>\n                        }\n                        {!this.props.emailInvitationsEnabled &&\n                        <FormattedMessage\n                            id='invitation_modal.invite_members.description-email-disabled'\n                            defaultMessage='Invite new team members with a link. Team members have access to messages and files in open teams and public channels.'\n                        >\n                            {(text) => (<span id='inviteMembersSectionDescription'>{text}</span>)}\n                        </FormattedMessage>\n                        }\n                    </div>\n                    <ArrowRightIcon className='arrow'/>\n                </div>\n                <div\n                    className='invitation-modal-option'\n                    onClick={this.props.goToGuests}\n                    data-testid='inviteGuestLink'\n                    tabIndex='0'\n                    onKeyDown={this.onGuestsKeyDown}\n                    aria-labelledby='inviteGuestsSectionHeader'\n                    aria-describedby='inviteGuestsSectionDescription'\n                >\n                    <div>\n                        <h2 id='inviteGuestsSectionHeader'>\n                            <FormattedMarkdownMessage\n                                id='invitation_modal.invite_guests.title'\n                                defaultMessage='Invite **Guests**'\n                            />\n                        </h2>\n                        <FormattedMessage\n                            id='invitation_modal.invite_guests.description'\n                            defaultMessage='Invite guests to one or more channels. Guests only have access to messages, files, and people in the channels they are members of.'\n                        >\n                            {(text) => (<span id='inviteGuestsSectionDescription'>{text}</span>)}\n                        </FormattedMessage>\n                    </div>\n                    <ArrowRightIcon className='arrow'/>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function InviteMembersIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='126px'\n                height='38px'\n                viewBox='0 0 126 38'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.invite_members', defaultMessage: 'Invite Members Icon'})}\n            >\n                <path d='M 108.83398 0.03515625 C 108.64165 0.03515625 108.4496 0.04983111 108.25977 0.08203125 C 109.08339 0.57981559 109.86736 1.165576 110.60156 1.8359375 C 113.34699 4.3426243 115.07813 7.1515117 115.07812 10.777344 L 115.07812 15.908203 C 115.07812 17.577458 114.81586 19.392207 114.32812 21.453125 C 114.19039 22.035006 114.02467 22.601886 113.83008 23.152344 C 116.57398 24.811724 118.17106 25.88194 118.62109 26.361328 C 120.0119 27.842823 120.78516 29.798054 120.78516 31.830078 L 120.78516 32 C 122.99178 32 124.78125 32.008356 124.78125 30.001953 C 124.78125 26.755542 122.78085 23.90476 118.77734 21.453125 L 118.46875 21.267578 L 118.46094 21.285156 C 118.44384 21.330296 118.43871 21.318446 118.44531 21.253906 L 118.46875 21.267578 L 118.47266 21.251953 C 118.52056 21.104379 118.6246 20.690139 118.78516 20.011719 C 119.2074 18.22759 119.07227 17.224165 119.07227 15.908203 L 119.07227 10.777344 C 119.07227 8.5210935 117.78998 3.8565489 115.79297 2.0332031 C 113.81134 0.22387865 111.50192 0.03515625 108.83594 0.03515625 L 108.83398 0.03515625 z M 100.84375 2.0332031 C 98.23721 2.0332031 95.848767 2.9659792 93.835938 4.7363281 C 91.761167 6.5611731 90.535156 8.4793085 90.535156 10.777344 L 90.535156 15.908203 C 90.535156 17.293336 90.80759 18.870238 91.328125 20.703125 C 91.751681 22.194536 92.389981 23.518449 93.25 24.634766 L 87.810547 27.792969 C 87.734577 27.827779 87.659451 27.865141 87.585938 27.904297 C 87.562827 27.916627 87.538385 27.928746 87.515625 27.941406 C 87.254658 28.067724 87.009242 28.216755 86.775391 28.382812 L 86.509766 28.574219 C 85.454567 29.323561 84.826172 30.535879 84.826172 31.830078 L 84.826172 33.994141 C 84.826172 36.20075 86.615661 37.992188 88.822266 37.992188 L 112.79492 37.992188 C 115.00153 37.992188 116.79102 36.20075 116.79102 33.994141 L 116.79102 31.830078 C 116.79102 30.814065 116.40241 29.834497 115.70703 29.09375 C 115.33382 28.696209 114.89968 28.36777 114.42188 28.113281 L 114.13867 27.962891 C 114.10527 27.945041 114.06897 27.932866 114.03516 27.916016 C 113.99746 27.894746 113.96392 27.869949 113.92578 27.849609 L 108.53711 24.673828 C 109.43906 23.498248 110.06724 22.107856 110.43945 20.535156 C 110.86169 18.751027 111.08203 17.224166 111.08203 15.908203 L 111.08203 10.777344 C 111.08203 8.5210941 109.90325 6.6104541 107.90625 4.7871094 C 105.92461 2.977785 103.50974 2.0332043 100.84375 2.0332031 z M 100.84375 6.0273438 C 102.50853 6.0273438 103.96628 6.5982778 105.21484 7.7382812 C 106.46343 8.878286 107.08789 9.8906745 107.08789 10.777344 L 107.08789 15.908203 C 107.08789 16.870874 106.90948 18.105944 106.55273 19.613281 C 106.19601 21.12062 105.52977 22.279175 104.55469 23.089844 C 104.24552 23.343181 104.012 23.661015 103.85742 24.041016 C 103.70244 24.421017 103.65168 24.811463 103.69922 25.216797 C 103.72302 25.622132 103.84065 25.997842 104.05469 26.339844 C 104.26872 26.681846 104.54401 26.953582 104.87695 27.15625 L 112.04492 31.375 C 112.09262 31.40033 112.13432 31.425832 112.16992 31.451172 C 112.20552 31.476502 112.23401 31.488281 112.25781 31.488281 L 112.54297 31.640625 C 112.63817 31.691295 112.72361 31.754092 112.79492 31.830078 L 112.79492 33.994141 L 88.822266 33.994141 L 88.822266 31.830078 L 89.089844 31.640625 C 89.196862 31.564625 89.297447 31.513613 89.392578 31.488281 C 89.416398 31.462951 89.439071 31.442357 89.462891 31.429688 C 89.486711 31.416988 89.513289 31.412109 89.537109 31.412109 L 96.921875 27.117188 C 97.254845 26.939854 97.526184 26.681846 97.740234 26.339844 C 97.954274 25.997845 98.073886 25.622132 98.097656 25.216797 C 98.145256 24.811463 98.089577 24.421017 97.935547 24.041016 C 97.780967 23.661012 97.562734 23.343179 97.277344 23.089844 C 96.302254 22.279177 95.599958 21.120619 95.171875 19.613281 C 94.743792 18.105943 94.529297 16.870874 94.529297 15.908203 L 94.529297 10.777344 C 94.529297 9.8906751 95.178468 8.8782834 96.474609 7.7382812 C 97.770749 6.5982776 99.22654 6.0273453 100.84375 6.0273438 z M 21 7.9707031 C 20.447715 7.9707031 20 8.4184181 20 8.9707031 C 20 9.5229881 20.447715 9.9707031 21 9.9707031 L 69 9.9707031 C 69.552285 9.9707031 70 9.5229881 70 8.9707031 C 70 8.4184181 69.552285 7.9707031 69 7.9707031 L 21 7.9707031 z M 1 17.970703 C 0.4477153 17.970703 -2.220446e-16 18.418418 0 18.970703 C 0 19.522988 0.4477153 19.970703 1 19.970703 L 63 19.970703 C 63.552285 19.970703 64 19.522988 64 18.970703 C 64 18.418418 63.552285 17.970703 63 17.970703 L 1 17.970703 z M 21 27.970703 C 20.447715 27.970703 20 28.418418 20 28.970703 C 20 29.522988 20.447715 29.970703 21 29.970703 L 69 29.970703 C 69.552285 29.970703 70 29.522988 70 28.970703 C 70 28.418418 69.552285 27.970703 69 27.970703 L 21 27.970703 z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function MailIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='24px'\n                height='24px'\n                viewBox='0 0 24 24'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.mail', defaultMessage: 'Mail Icon'})}\n            >\n                <path d='M4,4H20A2,2 0 0,1 22,6V18A2,2 0 0,1 20,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4M12,11L20,6H4L12,11M4,18H20V8.37L12,13.36L4,8.37V18Z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function MailPlusIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='24px'\n                height='24px'\n                viewBox='0 0 24 24'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.add-mail', defaultMessage: 'Add Mail Icon'})}\n            >\n                <path d='M3,4C1.89,4 1,4.89 1,6V18A2,2 0 0,0 3,20H14V18H3V8.37L11,13.36L19,8.37V13H21V6A2,2 0 0,0 19,4H3M3,6H19L11,11L3,6M19,15V18H16V20H19V23H21V20H24V18H21V15H19Z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport AsyncSelect from 'react-select/lib/AsyncCreatable';\nimport {components} from 'react-select';\nimport classNames from 'classnames';\n\nimport {isEmail} from 'mattermost-redux/utils/helpers';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport MailIcon from 'components/widgets/icons/mail_icon';\nimport MailPlusIcon from 'components/widgets/icons/mail_plus_icon';\nimport CloseCircleSolidIcon from 'components/widgets/icons/close_circle_solid_icon';\nimport GuestBadge from 'components/widgets/badges/guest_badge';\nimport BotBadge from 'components/widgets/badges/bot_badge';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\nimport Avatar from 'components/widgets/users/avatar';\nimport {imageURLForUser, getDisplayName, getLongDisplayNameParts} from 'utils/utils.jsx';\n\nimport {t} from 'utils/i18n.jsx';\nimport {isGuest} from 'utils/utils';\n\nimport './users_emails_input.scss';\n\nexport default class UsersEmailsInput extends React.PureComponent {\n    static propTypes = {\n        placeholder: PropTypes.string,\n        ariaLabel: PropTypes.string.isRequired,\n        usersLoader: PropTypes.func,\n        onChange: PropTypes.func,\n        showError: PropTypes.bool,\n        errorMessageId: PropTypes.string,\n        errorMessageDefault: PropTypes.string,\n        errorMessageValues: PropTypes.object,\n        value: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.object, PropTypes.string])),\n        onInputChange: PropTypes.func,\n        inputValue: PropTypes.string,\n        noMatchMessageId: PropTypes.string,\n        noMatchMessageDefault: PropTypes.string,\n        validAddressMessageId: PropTypes.string,\n        validAddressMessageDefault: PropTypes.string,\n        loadingMessageId: PropTypes.string,\n        loadingMessageDefault: PropTypes.string,\n        emailInvitationsEnabled: PropTypes.bool,\n        extraErrorText: PropTypes.any,\n    }\n\n    static defaultProps = {\n        noMatchMessageId: t('widgets.users_emails_input.no_user_found_matching'),\n        noMatchMessageDefault: 'No one found matching **{text}**, type email address',\n        validAddressMessageId: t('widgets.users_emails_input.valid_email'),\n        validAddressMessageDefault: 'Add **{email}**',\n        loadingMessageId: t('widgets.users_emails_input.loading'),\n        loadingMessageDefault: 'Loading',\n        showError: false,\n    };\n\n    constructor(props) {\n        super(props);\n        this.selectRef = React.createRef();\n        this.state = {\n            options: [],\n        };\n    }\n\n    renderUserName = (user) => {\n        const parts = getLongDisplayNameParts(user);\n        let fullName = null;\n        if (parts.fullName) {\n            fullName = (<span className='fullname'>{parts.fullName}</span>);\n        }\n        let nickname = null;\n        if (parts.nickname) {\n            nickname = (<span className='nickname'>{parts.nickname}</span>);\n        }\n\n        return (\n            <>\n                {parts.displayName}\n                {fullName}\n                {nickname}\n            </>\n        );\n    }\n\n    loadingMessage = () => {\n        const text = (\n            <FormattedMessage\n                id={this.props.loadingMessageId}\n                defaultMessage={this.props.loadingMessageDefault}\n            />\n        );\n\n        return (<LoadingSpinner text={text}/>);\n    }\n\n    getOptionValue = (user) => {\n        return user.id || user.value;\n    }\n\n    formatOptionLabel = (user, options) => {\n        const profileImg = imageURLForUser(user.id, user.last_picture_update);\n        let guestBadge = null;\n        let botBadge = null;\n\n        if (user.is_bot) {\n            botBadge = <BotBadge/>;\n        }\n\n        if (!isEmail(user.value) && isGuest(user)) {\n            guestBadge = <GuestBadge/>;\n        }\n\n        if (options.context === 'menu') {\n            if (user.value && isEmail(user.value)) {\n                return this.getCreateLabel(user.value);\n            }\n            return (\n                <React.Fragment>\n                    <Avatar\n                        size='lg'\n                        username={user.username}\n                        url={profileImg}\n                    />\n                    {this.renderUserName(user)}\n                    {botBadge}\n                    {guestBadge}\n                </React.Fragment>\n            );\n        }\n\n        if (user.value && isEmail(user.value)) {\n            return (\n                <React.Fragment>\n                    <MailIcon className='mail-icon'/>\n                    <span>{user.value}</span>\n                </React.Fragment>\n            );\n        }\n\n        return (\n            <React.Fragment>\n                <Avatar\n                    size='sm'\n                    username={user.username}\n                    url={profileImg}\n                />\n                {getDisplayName(user)}\n                {botBadge}\n                {guestBadge}\n            </React.Fragment>\n        );\n    }\n\n    onChange = (value) => {\n        if (this.props.onChange) {\n            this.props.onChange(value.map((v) => {\n                if (v.id) {\n                    return v;\n                }\n                return v.value;\n            }));\n        }\n    }\n\n    getCreateLabel = (value) => (\n        <React.Fragment>\n            <MailPlusIcon className='mail-plus-icon'/>\n            <FormattedMarkdownMessage\n                key='widgets.users_emails_input.valid_email'\n                id={this.props.validAddressMessageId}\n                defaultMessage={this.props.validAddressMessageDefault}\n                values={{email: value}}\n                disableLinks={true}\n            />\n        </React.Fragment>\n    );\n\n    NoOptionsMessage = (props) => {\n        const inputValue = props.selectProps.inputValue;\n        if (!inputValue) {\n            return null;\n        }\n\n        return (\n            <div className='users-emails-input__option users-emails-input__option--no-matches'>\n                <FormattedMarkdownMessage\n                    id={this.props.noMatchMessageId}\n                    defaultMessage={this.props.noMatchMessageDefault}\n                    values={{text: inputValue}}\n                    disableLinks={true}\n                >\n                    {(message) => (\n                        <components.NoOptionsMessage {...props}>\n                            {message}\n                        </components.NoOptionsMessage>\n                    )}\n                </FormattedMarkdownMessage>\n            </div>\n        );\n    };\n\n    MultiValueRemove = ({children, innerProps}) => (\n        <div {...innerProps}>\n            {children || <CloseCircleSolidIcon/>}\n        </div>\n    );\n\n    components = {\n        NoOptionsMessage: this.NoOptionsMessage,\n        MultiValueRemove: this.MultiValueRemove,\n        IndicatorsContainer: () => null,\n    };\n\n    handleInputChange = (inputValue, action) => {\n        if (action.action === 'input-blur' && inputValue !== '') {\n            const values = this.props.value.map((v) => {\n                if (v.id) {\n                    return v;\n                }\n                return {label: v, value: v};\n            });\n\n            for (const option of this.state.options) {\n                if (this.props.inputValue === option.username || this.props.inputValue === ('@' + option.username)) {\n                    this.onChange([...values, option]);\n                    this.props.onInputChange('');\n                    return;\n                } else if (this.props.inputValue === option.email) {\n                    this.onChange([...values, option]);\n                    this.props.onInputChange('');\n                    return;\n                }\n            }\n\n            if (this.props.emailInvitationsEnabled && isEmail(this.props.inputValue)) {\n                const email = this.props.inputValue;\n                this.onChange([...values, {value: email, label: email}]);\n                this.props.onInputChange('');\n            }\n        }\n        if (action.action !== 'input-blur' && action.action !== 'menu-close') {\n            this.props.onInputChange(inputValue);\n        }\n    }\n\n    optionsLoader = (input, callback) => {\n        const customCallback = (options) => {\n            this.setState({options});\n            callback(options);\n        };\n        const result = this.props.usersLoader(this.props.inputValue, customCallback);\n        if (result && result.then) {\n            result.then(customCallback);\n        }\n    }\n\n    showAddEmail = (input, values, options) => {\n        return this.props.emailInvitationsEnabled && options.length === 0 && isEmail(input);\n    }\n\n    onFocus = () => {\n        this.selectRef.current.handleInputChange(this.props.inputValue, {action: 'custom'});\n    }\n\n    onBlur = () => {\n        this.selectRef.current.handleInputChange(this.props.inputValue, {action: 'input-blur'});\n    }\n\n    render() {\n        const values = this.props.value.map((v) => {\n            if (v.id) {\n                return v;\n            }\n            return {label: v, value: v};\n        });\n        return (\n            <>\n                <AsyncSelect\n                    ref={this.selectRef}\n                    styles={this.customStyles}\n                    onChange={this.onChange}\n                    loadOptions={this.optionsLoader}\n                    isValidNewOption={this.showAddEmail}\n                    isMulti={true}\n                    isClearable={false}\n                    className={classNames(\n                        'UsersEmailsInput',\n                        this.props.showError ? 'error' : '',\n                        {empty: this.props.inputValue === ''},\n                    )}\n                    classNamePrefix='users-emails-input'\n                    placeholder={this.props.placeholder}\n                    components={this.components}\n                    getOptionValue={this.getOptionValue}\n                    formatOptionLabel={this.formatOptionLabel}\n                    defaultOptions={false}\n                    defaultMenuIsOpen={false}\n                    openMenuOnClick={false}\n                    loadingMessage={this.loadingMessage}\n                    onInputChange={this.handleInputChange}\n                    inputValue={this.props.inputValue}\n                    openMenuOnFocus={true}\n                    onFocus={this.onFocus}\n                    onBlur={this.onBlur}\n                    tabSelectsValue={true}\n                    value={values}\n                    aria-label={this.props.ariaLabel}\n                />\n                {this.props.showError && (\n                    <div className='InputErrorBox'>\n                        <FormattedMarkdownMessage\n                            id={this.props.errorMessageId}\n                            defaultMessage={this.props.errorMessageDefault}\n                            values={this.props.errorMessageValues || null}\n                            disableLinks={true}\n                        >\n                            {(message) => (\n                                <components.NoOptionsMessage>\n                                    {message}\n                                </components.NoOptionsMessage>\n                            )}\n                        </FormattedMarkdownMessage>\n                        {this.props.extraErrorText || null}\n                    </div>\n                )}\n            </>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function LinkIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='24px'\n                height='24px'\n                viewBox='0 0 24 24'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.link', defaultMessage: 'Link Icon'})}\n            >\n                <path d='M10.59,13.41C11,13.8 11,14.44 10.59,14.83C10.2,15.22 9.56,15.22 9.17,14.83C7.22,12.88 7.22,9.71 9.17,7.76V7.76L12.71,4.22C14.66,2.27 17.83,2.27 19.78,4.22C21.73,6.17 21.73,9.34 19.78,11.29L18.29,12.78C18.3,11.96 18.17,11.14 17.89,10.36L18.36,9.88C19.54,8.71 19.54,6.81 18.36,5.64C17.19,4.46 15.29,4.46 14.12,5.64L10.59,9.17C9.41,10.34 9.41,12.24 10.59,13.41M13.41,9.17C13.8,8.78 14.44,8.78 14.83,9.17C16.78,11.12 16.78,14.29 14.83,16.24V16.24L11.29,19.78C9.34,21.73 6.17,21.73 4.22,19.78C2.27,17.83 2.27,14.66 4.22,12.71L5.71,11.22C5.7,12.04 5.83,12.86 6.11,13.65L5.64,14.12C4.46,15.29 4.46,17.19 5.64,18.36C6.81,19.54 8.71,19.54 9.88,18.36L13.41,14.83C14.59,13.66 14.59,11.76 13.41,10.59C13,10.2 13,9.56 13.41,9.17Z'/>\n            </svg>\n        </span>\n    );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {injectIntl, FormattedMessage} from 'react-intl';\n\nimport {debounce} from 'mattermost-redux/actions/helpers';\nimport {isEmail} from 'mattermost-redux/utils/helpers';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport InviteMembersIcon from 'components/widgets/icons/invite_members_icon';\nimport UsersEmailsInput from 'components/widgets/inputs/users_emails_input.jsx';\nimport UpgradeLink from 'components/widgets/links/upgrade_link';\nimport NotifyLink from 'components/widgets/links/notify_link';\n\nimport LinkIcon from 'components/widgets/icons/link_icon';\n\nimport {getSiteURL} from 'utils/url';\nimport {t} from 'utils/i18n.jsx';\nimport {localizeMessage} from 'utils/utils.jsx';\nimport {Constants} from 'utils/constants';\nimport withGetCloudSubscription from '../../common/hocs/cloud/with_get_cloud_subscription';\n\nimport './invitation_modal_members_step.scss';\n\nclass InvitationModalMembersStep extends React.PureComponent {\n    static propTypes = {\n        teamName: PropTypes.string.isRequired,\n        currentTeamId: PropTypes.string.isRequired,\n        intl: PropTypes.any,\n        inviteId: PropTypes.string.isRequired,\n        searchProfiles: PropTypes.func.isRequired,\n        emailInvitationsEnabled: PropTypes.bool.isRequired,\n        onEdit: PropTypes.func.isRequired,\n        onSubmit: PropTypes.func.isRequired,\n        userLimit: PropTypes.string.isRequired,\n        currentUsers: PropTypes.number.isRequired,\n        userIsAdmin: PropTypes.bool.isRequired,\n        isCloud: PropTypes.bool.isRequired,\n        subscriptionStats: PropTypes.object,\n        actions: PropTypes.shape({\n            getSubscriptionStats: PropTypes.func.isRequired,\n        }).isRequired,\n    };\n\n    constructor(props) {\n        super(props);\n        this.inviteLinkRef = React.createRef();\n        this.timeout = null;\n        this.state = {\n            usersAndEmails: [],\n            copiedLink: false,\n            termWithoutResults: null,\n            usersInputValue: '',\n        };\n    }\n\n    copyLink = () => {\n        if (this.props.isCloud) {\n            trackEvent('cloud_invite_users', 'click_copy_link');\n        }\n        const input = this.inviteLinkRef.current;\n\n        const textField = document.createElement('textarea');\n        textField.innerText = input.value;\n        textField.style.position = 'fixed';\n        textField.style.opacity = 0;\n\n        document.body.appendChild(textField);\n        textField.select();\n\n        try {\n            this.setState({copiedLink: document.execCommand('copy')});\n        } catch (err) {\n            this.setState({copiedLink: false});\n        }\n        textField.remove();\n\n        if (this.timeout) {\n            clearTimeout(this.timeout);\n        }\n        this.timeout = setTimeout(() => {\n            this.setState({copiedLink: false});\n        }, 3000);\n    };\n\n    debouncedSearchProfiles = debounce((term, callback) => {\n        this.props.\n            searchProfiles(term).\n            then(({data}) => {\n                callback(data);\n                if (data.length === 0) {\n                    this.setState({termWithoutResults: term});\n                } else {\n                    this.setState({termWithoutResults: null});\n                }\n            }).\n            catch(() => {\n                callback([]);\n            });\n    }, 150);\n\n    usersLoader = (term, callback) => {\n        if (\n            this.state.termWithoutResults &&\n            term.startsWith(this.state.termWithoutResults)\n        ) {\n            callback([]);\n            return;\n        }\n        try {\n            this.debouncedSearchProfiles(term, callback);\n        } catch (error) {\n            callback([]);\n        }\n    };\n\n    onChange = (usersAndEmails) => {\n        this.setState({usersAndEmails}, () => {\n            if (this.shouldShowPickerError() && this.props.isCloud) {\n                trackEvent('cloud_invite_users', 'warning_near_limit', {remaining: this.getRemainingUsers() - this.state.usersAndEmails.length});\n            }\n        });\n        this.props.onEdit(\n            usersAndEmails.length > 0 || this.state.usersInputValue,\n        );\n    };\n\n    onUsersInputChange = (usersInputValue) => {\n        this.setState({usersInputValue});\n        this.props.onEdit(\n            this.state.usersAndEmails.length > 0 || usersInputValue,\n        );\n    };\n\n    submit = () => {\n        if (this.props.isCloud) {\n            trackEvent('cloud_invite_users', 'click_send_invitations', {num_invitations: this.state.usersAndEmails.length});\n        }\n        const users = [];\n        const emails = [];\n        for (const userOrEmail of this.state.usersAndEmails) {\n            if (isEmail(userOrEmail)) {\n                emails.push(userOrEmail);\n            } else {\n                users.push(userOrEmail);\n            }\n        }\n        this.props.onSubmit(users, emails, this.state.usersInputValue);\n    };\n\n    getRemainingUsers = () => {\n        const {subscriptionStats} = this.props;\n        const {usersAndEmails} = this.state;\n        return subscriptionStats && subscriptionStats.remaining_seats - usersAndEmails.length;\n    }\n\n    shouldShowPickerError = () => {\n        const {userLimit, isCloud, subscriptionStats} = this.props;\n\n        if (subscriptionStats && subscriptionStats.is_paid_tier === 'true') {\n            return false;\n        }\n\n        if (userLimit === '0' || !isCloud) {\n            return false;\n        }\n\n        // usersRemaining is calculated against the limit, the current users, and how many are being invited in the current flow\n        const usersRemaining = this.getRemainingUsers();\n        if (usersRemaining === 0 && this.state.usersInputValue !== '') {\n            return true;\n        } else if (usersRemaining < 0) {\n            return true;\n        }\n        return false;\n    };\n\n    render() {\n        const inviteUrl =\n            getSiteURL() + '/signup_user_complete/?id=' + this.props.inviteId;\n\n        let placeholder = localizeMessage(\n            'invitation_modal.members.search-and-add.placeholder',\n            'Add members or email addresses',\n        );\n        let noMatchMessageId = t(\n            'invitation_modal.members.users_emails_input.no_user_found_matching',\n        );\n        let noMatchMessageDefault =\n            'No one found matching **{text}**, type email to invite';\n\n        if (!this.props.emailInvitationsEnabled) {\n            placeholder = localizeMessage(\n                'invitation_modal.members.search-and-add.placeholder-email-disabled',\n                'Add members',\n            );\n            noMatchMessageId = t(\n                'invitation_modal.members.users_emails_input.no_user_found_matching-email-disabled',\n            );\n            noMatchMessageDefault = 'No one found matching **{text}**';\n        }\n\n        const {subscriptionStats} = this.props;\n        const remainingUsers = subscriptionStats && subscriptionStats.remaining_seats;\n        const inviteMembersButtonDisabled = this.state.usersAndEmails.length > Constants.MAX_ADD_MEMBERS_BATCH || this.state.usersAndEmails.length === 0;\n\n        const errorProperties = {\n            showError: this.shouldShowPickerError(),\n            errorMessageId: t(\n                'invitation_modal.invite_members.hit_cloud_user_limit',\n            ),\n            errorMessageDefault: 'You can only invite **{num} more {num, plural, one {member} other {members}}** to the team on the free tier.',\n            errorMessageValues: {\n                num: remainingUsers < 0 ? '0' : remainingUsers,\n            },\n            extraErrorText: (this.props.userIsAdmin ? <UpgradeLink telemetryInfo='click_upgrade_users_emails_input'/> : <NotifyLink/>),\n        };\n\n        if (this.state.usersAndEmails.length > Constants.MAX_ADD_MEMBERS_BATCH) {\n            errorProperties.showError = true;\n            errorProperties.errorMessageId = t(\n                'invitation_modal.invite_members.exceeded_max_add_members_batch',\n            );\n            errorProperties.errorMessageDefault = 'No more than **{text}** people can be invited at once';\n            errorProperties.errorMessageValues.text = Constants.MAX_ADD_MEMBERS_BATCH;\n        }\n\n        return (\n            <div className='InvitationModalMembersStep'>\n                <div className='modal-icon'>\n                    <InviteMembersIcon/>\n                </div>\n                <h1 id='invitation_modal_title'>\n                    <FormattedMarkdownMessage\n                        id='invitation_modal.members.title'\n                        defaultMessage='Invite **Members** to {teamName}'\n                        values={{teamName: this.props.teamName}}\n                    />\n                </h1>\n                <div\n                    className='share-link'\n                    data-testid='shareLink'\n                >\n                    <h5>\n                        <FormattedMessage\n                            id='invitation_modal.members.share_link.title'\n                            defaultMessage='Share This Link'\n                        />\n                    </h5>\n                    <div className='share-link-input-block'>\n                        <input\n                            ref={this.inviteLinkRef}\n                            className='share-link-input'\n                            type='text'\n                            readOnly={true}\n                            value={inviteUrl}\n                            aria-label={this.props.intl.formatMessage({\n                                id: 'invitation_modal.members.share_link.input',\n                                defaultMessage: 'team invite link',\n                            })}\n                            data-testid='shareLinkInput'\n                        />\n                        <button\n                            className='share-link-input-button'\n                            onClick={this.copyLink}\n                            data-testid='shareLinkInputButton'\n                        >\n                            <LinkIcon/>\n                            {!this.state.copiedLink && (\n                                <FormattedMessage\n                                    id='invitation_modal.members.share_link.copy_button'\n                                    defaultMessage='Copy Link'\n                                />\n                            )}\n                            {this.state.copiedLink && (\n                                <FormattedMessage\n                                    id='invitation_modal.members.share_link.link_copied'\n                                    defaultMessage='Link Copied'\n                                />\n                            )}\n                        </button>\n                    </div>\n                    <div className='help-text'>\n                        <FormattedMessage\n                            id='invitation_modal.members.share_link.description'\n                            defaultMessage='Share this link to invite people to this team.'\n                        />\n                    </div>\n                </div>\n                <div className='invitation-modal-or'>\n                    <hr/>\n                    <div>\n                        <FormattedMessage\n                            id='invitation_modal.members.or'\n                            defaultMessage='OR'\n                        />\n                    </div>\n                </div>\n                <div\n                    className='search-and-add'\n                    data-testid='searchAdd'\n                >\n                    <h5>\n                        <FormattedMessage\n                            id='invitation_modal.members.search_and_add.title'\n                            defaultMessage='Add or Invite People'\n                        />\n                    </h5>\n                    <div data-testid='inputPlaceholder'>\n                        <UsersEmailsInput\n                            {...errorProperties}\n                            usersLoader={this.usersLoader}\n                            placeholder={placeholder}\n                            ariaLabel={localizeMessage(\n                                'invitation_modal.members.search_and_add.title',\n                                'Invite People',\n                            )}\n                            onChange={this.onChange}\n                            value={this.state.usersAndEmails}\n                            validAddressMessageId={t(\n                                'invitation_modal.members.users_emails_input.valid_email',\n                            )}\n                            validAddressMessageDefault='Invite **{email}** as a team member'\n                            noMatchMessageId={noMatchMessageId}\n                            noMatchMessageDefault={noMatchMessageDefault}\n                            onInputChange={this.onUsersInputChange}\n                            inputValue={this.state.usersInputValue}\n                            emailInvitationsEnabled={\n                                this.props.emailInvitationsEnabled\n                            }\n                        />\n                    </div>\n                    <div className='help-text'>\n                        {this.props.emailInvitationsEnabled && (\n                            <FormattedMessage\n                                id='invitation_modal.members.search-and-add.description'\n                                defaultMessage='Add existing members or send email invites to new members.'\n                            />\n                        )}\n                        {!this.props.emailInvitationsEnabled && (\n                            <FormattedMessage\n                                id='invitation_modal.members.search-and-add.description-email-disabled'\n                                defaultMessage='Add existing members to this team.'\n                            />\n                        )}\n                    </div>\n                </div>\n                <div className='invite-members'>\n                    <button\n                        className={\n                            'btn ' +\n                            (inviteMembersButtonDisabled ?\n                                'btn-inactive' :\n                                'btn-primary')\n                        }\n                        onClick={this.submit}\n                        disabled={inviteMembersButtonDisabled}\n                        id='inviteMembersButton'\n                    >\n                        <FormattedMessage\n                            id='invitation_modal.members.invite_button'\n                            defaultMessage='Invite Members'\n                        />\n                    </button>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default injectIntl(withGetCloudSubscription(InvitationModalMembersStep));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {\n    getConfig,\n    getLicense,\n    getSubscriptionStats as selectSubscriptionStats,\n} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {getSubscriptionStats} from 'mattermost-redux/actions/cloud';\n\nimport {GlobalState} from 'types/store';\n\nimport {isAdmin} from 'utils/utils.jsx';\n\nimport InvitationModalMembersStep from './invitation_modal_members_step';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        userLimit: getConfig(state).ExperimentalCloudUserLimit,\n        userIsAdmin: isAdmin(getCurrentUser(state).roles),\n        isCloud: getLicense(state).Cloud === 'true',\n        subscriptionStats: selectSubscriptionStats(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({getSubscriptionStats}, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InvitationModalMembersStep);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function CloseCircleIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='24px'\n                height='24px'\n                viewBox='0 0 24 24'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.close', defaultMessage: 'Close Icon'})}\n            >\n                <path\n                    d='M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2C6.47,2 2,6.47 2,12C2,17.53 6.47,22 12,22C17.53,22 22,17.53 22,12C22,6.47 17.53,2 12,2M14.59,8L12,10.59L9.41,8L8,9.41L10.59,12L8,14.59L9.41,16L12,13.41L14.59,16L16,14.59L13.41,12L16,9.41L14.59,8Z'\n                />\n            </svg>\n        </span>\n    );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport AsyncSelect from 'react-select/lib/Async';\nimport {components} from 'react-select';\nimport classNames from 'classnames';\n\nimport {Constants} from 'utils/constants';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport PublicChannelIcon from 'components/widgets/icons/globe_icon';\nimport PrivateChannelIcon from 'components/widgets/icons/lock_icon';\nimport CloseCircleSolidIcon from 'components/widgets/icons/close_circle_solid_icon';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport {t} from 'utils/i18n.jsx';\n\nimport './channels_input.scss';\n\nexport default class ChannelsInput extends React.PureComponent {\n    static propTypes = {\n        placeholder: PropTypes.string,\n        ariaLabel: PropTypes.string.isRequired,\n        channelsLoader: PropTypes.func,\n        onChange: PropTypes.func,\n        value: PropTypes.arrayOf(PropTypes.object),\n        onInputChange: PropTypes.func,\n        inputValue: PropTypes.string,\n        loadingMessageId: PropTypes.string,\n        loadingMessageDefault: PropTypes.string,\n        noOptionsMessageId: PropTypes.string,\n        noOptionsMessageDefault: PropTypes.string,\n    }\n\n    static defaultProps = {\n        loadingMessageId: t('widgets.channels_input.loading'),\n        loadingMessageDefault: 'Loading',\n        noOptionsMessageId: t('widgets.channels_input.empty'),\n        noOptionsMessageDefault: 'No channels found',\n    };\n\n    constructor(props) {\n        super(props);\n        this.selectRef = React.createRef();\n        this.state = {\n            options: [],\n        };\n    }\n\n    getOptionValue = (channel) => channel.id\n\n    handleInputChange = (inputValue, action) => {\n        if (action.action === 'input-blur' && inputValue !== '') {\n            for (const option of this.state.options) {\n                if (this.props.inputValue === option.name) {\n                    this.onChange([...this.props.value, option]);\n                    this.props.onInputChange('');\n                    return;\n                }\n            }\n        }\n        if (action.action !== 'input-blur' && action.action !== 'menu-close') {\n            this.props.onInputChange(inputValue);\n        }\n    }\n\n    optionsLoader = (input, callback) => {\n        const customCallback = (options) => {\n            this.setState({options});\n            callback(options);\n        };\n        const result = this.props.channelsLoader(this.props.inputValue, customCallback);\n        if (result && result.then) {\n            result.then(customCallback);\n        }\n    }\n\n    loadingMessage = () => {\n        const text = (\n            <FormattedMessage\n                id={this.props.loadingMessageId}\n                defaultMessage={this.props.loadingMessageDefault}\n            />\n        );\n\n        return (<LoadingSpinner text={text}/>);\n    }\n\n    NoOptionsMessage = (props) => {\n        const inputValue = props.selectProps.inputValue;\n        if (!inputValue) {\n            return null;\n        }\n        return (\n            <div className='channels-input__option channels-input__option--no-matches'>\n                <FormattedMarkdownMessage\n                    id={this.props.noOptionsMessageId}\n                    defaultMessage={this.props.noOptionsMessageDefault}\n                    values={{text: inputValue}}\n                >\n                    {(message) => (\n                        <components.NoOptionsMessage {...props}>\n                            {message}\n                        </components.NoOptionsMessage>\n                    )}\n                </FormattedMarkdownMessage>\n            </div>\n        );\n    };\n\n    formatOptionLabel = (channel) => {\n        let icon = <PublicChannelIcon className='public-channel-icon'/>;\n        if (channel.type === Constants.PRIVATE_CHANNEL) {\n            icon = <PrivateChannelIcon className='private-channel-icon'/>;\n        }\n        return (\n            <React.Fragment>\n                {icon}\n                {channel.display_name}\n                <span className='channel-name'>{channel.name}</span>\n            </React.Fragment>\n        );\n    }\n\n    onChange = (value) => {\n        if (this.props.onChange) {\n            this.props.onChange(value);\n        }\n    }\n\n    MultiValueRemove = ({children, innerProps}) => (\n        <div {...innerProps}>\n            {children || <CloseCircleSolidIcon/>}\n        </div>\n    );\n\n    components = {\n        NoOptionsMessage: this.NoOptionsMessage,\n        MultiValueRemove: this.MultiValueRemove,\n        IndicatorsContainer: () => null,\n    };\n\n    onFocus = () => {\n        this.selectRef.current.handleInputChange(this.props.inputValue, {action: 'custom'});\n    }\n\n    render() {\n        return (\n            <AsyncSelect\n                ref={this.selectRef}\n                styles={this.customStyles}\n                onChange={this.onChange}\n                loadOptions={this.optionsLoader}\n                isMulti={true}\n                isClearable={false}\n                className={classNames('ChannelsInput', {empty: this.props.inputValue === ''})}\n                classNamePrefix='channels-input'\n                placeholder={this.props.placeholder}\n                components={this.components}\n                getOptionValue={this.getOptionValue}\n                formatOptionLabel={this.formatOptionLabel}\n                noOptionsMessage={this.noOptionsMessage}\n                loadingMessage={this.loadingMessage}\n                defaultOptions={false}\n                defaultMenuIsOpen={false}\n                openMenuOnClick={false}\n                onInputChange={this.handleInputChange}\n                inputValue={this.props.inputValue}\n                openMenuOnFocus={true}\n                onFocus={this.onFocus}\n                tabSelectsValue={true}\n                value={this.props.value}\n                aria-label={this.props.ariaLabel}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {isEmail} from 'mattermost-redux/utils/helpers';\nimport {debounce} from 'mattermost-redux/actions/helpers';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport InviteIcon from 'components/widgets/icons/invite_icon';\nimport CloseCircleIcon from 'components/widgets/icons/close_circle_icon';\nimport UpgradeLink from 'components/widgets/links/upgrade_link';\n\nimport ChannelsInput from 'components/widgets/inputs/channels_input.jsx';\nimport UsersEmailsInput from 'components/widgets/inputs/users_emails_input.jsx';\nimport withGetCloudSubscription from '../../common/hocs/cloud/with_get_cloud_subscription';\n\nimport './invitation_modal_guests_step.scss';\n\nimport {t} from 'utils/i18n.jsx';\nimport {localizeMessage} from 'utils/utils.jsx';\n\nclass InvitationModalGuestsStep extends React.PureComponent {\n    static propTypes = {\n        teamName: PropTypes.string.isRequired,\n        myInvitableChannels: PropTypes.array.isRequired,\n        currentTeamId: PropTypes.string.isRequired,\n        searchProfiles: PropTypes.func.isRequired,\n        searchChannels: PropTypes.func.isRequired,\n        defaultChannels: PropTypes.array,\n        defaultMessage: PropTypes.string,\n        onEdit: PropTypes.func.isRequired,\n        onSubmit: PropTypes.func.isRequired,\n        emailInvitationsEnabled: PropTypes.bool.isRequired,\n        userLimit: PropTypes.string.isRequired,\n        userIsAdmin: PropTypes.bool.isRequired,\n        isCloud: PropTypes.bool.isRequired,\n        subscriptionStats: PropTypes.object,\n        actions: PropTypes.shape({\n            getSubscriptionStats: PropTypes.func.isRequired,\n        }).isRequired,\n    }\n\n    constructor(props) {\n        super(props);\n        this.textareaRef = React.createRef();\n        this.state = {\n            customMessageOpen: Boolean(props.defaultMessage),\n            customMessage: props.defaultMessage || '',\n            usersAndEmails: [],\n            channels: props.defaultChannels || [],\n            usersInputValue: '',\n            channelsInputValue: '',\n        };\n    }\n\n    onUsersEmailsChange = (usersAndEmails) => {\n        this.setState({usersAndEmails});\n        this.props.onEdit(usersAndEmails.length > 0 || this.state.channels.length > 0 || this.state.customMessage !== '' || this.state.usersInputValue || this.state.channelsInputValue);\n    }\n\n    onChannelsChange = (channels) => {\n        this.setState({channels});\n        this.props.onEdit(this.state.usersAndEmails.length > 0 || channels.length > 0 || this.state.customMessage !== '' || this.state.usersInputValue || this.state.channelsInputValue);\n    }\n\n    onMessageChange = (e) => {\n        this.setState({customMessage: e.target.value});\n        this.props.onEdit(this.state.usersAndEmails.length > 0 || this.state.channels.length > 0 || e.target.value !== '' || this.state.usersInputValue || this.state.channelsInputValue);\n    }\n\n    onUsersInputChange = (usersInputValue) => {\n        this.setState({usersInputValue});\n        this.props.onEdit(this.state.usersAndEmails.length > 0 || this.state.channels.length > 0 || this.state.customMessage !== '' || usersInputValue || this.state.channelsInputValue);\n    }\n\n    onChannelsInputChange = (channelsInputValue) => {\n        this.setState({channelsInputValue});\n        this.props.onEdit(this.state.usersAndEmails.length > 0 || this.state.channels.length > 0 || this.state.customMessage !== '' || this.state.usersInputValue || channelsInputValue);\n    }\n\n    debouncedSearchProfiles = debounce((term, callback) => {\n        this.props.searchProfiles(term).then(({data}) => {\n            callback(data);\n            if (data.length === 0) {\n                this.setState({termWithoutResults: term});\n            } else {\n                this.setState({termWithoutResults: null});\n            }\n        }).catch(() => {\n            callback([]);\n        });\n    }, 150);\n\n    usersLoader = (term, callback) => {\n        if (this.state.termWithoutResults && term.startsWith(this.state.termWithoutResults)) {\n            callback([]);\n            return;\n        }\n        try {\n            this.debouncedSearchProfiles(term, callback);\n        } catch (error) {\n            callback([]);\n        }\n    }\n\n    debouncedSearchChannels = debounce((term) => this.props.searchChannels(this.props.currentTeamId, term), 150);\n\n    channelsLoader = async (value) => {\n        if (!value) {\n            return this.props.myInvitableChannels;\n        }\n\n        this.debouncedSearchChannels(value);\n        return this.props.myInvitableChannels.filter((channel) => {\n            return channel.display_name.toLowerCase().startsWith(value.toLowerCase()) || channel.name.toLowerCase().startsWith(value.toLowerCase());\n        });\n    }\n\n    openCustomMessage = () => {\n        this.setState({customMessageOpen: true});\n        setTimeout(() => {\n            if (this.textareaRef.current) {\n                this.textareaRef.current.focus();\n            }\n        });\n    }\n\n    closeCustomMessage = () => {\n        this.setState({customMessageOpen: false});\n    }\n\n    sendInvites = () => {\n        const users = [];\n        const emails = [];\n        for (const userOrEmail of this.state.usersAndEmails) {\n            if (isEmail(userOrEmail)) {\n                emails.push(userOrEmail);\n            } else {\n                users.push(userOrEmail);\n            }\n        }\n        this.props.onSubmit(users, emails, this.state.channels, this.state.customMessageOpen ? this.state.customMessage : '', this.state.usersInputValue, this.state.channelsInputValue);\n    }\n\n    getRemainingUsers = () => {\n        const {subscriptionStats} = this.props;\n        const {usersAndEmails} = this.state;\n        return subscriptionStats && subscriptionStats.remaining_seats - usersAndEmails.length;\n    }\n\n    shouldShowPickerError = () => {\n        const {\n            userLimit,\n            userIsAdmin,\n            isCloud,\n            subscriptionStats,\n        } = this.props;\n\n        if (subscriptionStats && subscriptionStats.is_paid_tier === 'true') {\n            return false;\n        }\n\n        if (userLimit === '0' || !userIsAdmin || !isCloud) {\n            return false;\n        }\n\n        // usersRemaining is calculated against the limit, the current users, and how many are being invited in the current flow\n        const usersRemaining = this.getRemainingUsers();\n        if (usersRemaining === 0 && this.state.usersInputValue !== '') {\n            return true;\n        } else if (usersRemaining < 0) {\n            return true;\n        }\n        return false;\n    };\n\n    render() {\n        let inputPlaceholder = localizeMessage('invitation_modal.guests.search-and-add.placeholder', 'Add guests or email addresses');\n        let noMatchMessageId = t('invitation_modal.guests.users_emails_input.no_user_found_matching');\n        let noMatchMessageDefault = 'No one found matching **{text}**, type email to invite';\n\n        if (!this.props.emailInvitationsEnabled) {\n            inputPlaceholder = localizeMessage('invitation_modal.guests.search-and-add.placeholder-email-disabled', 'Add guests');\n            noMatchMessageId = t('invitation_modal.guests.users_emails_input.no_user_found_matching-email-disabled');\n            noMatchMessageDefault = 'No one found matching **{text}**';\n        }\n\n        const {subscriptionStats} = this.props;\n        const remainingUsers = subscriptionStats && subscriptionStats.remaining_seats;\n        return (\n            <div className='InvitationModalGuestsStep'>\n                <div className='modal-icon'>\n                    <InviteIcon/>\n                </div>\n                <h1 id='invitation_modal_title'>\n                    <FormattedMarkdownMessage\n                        id='invitation_modal.guests.title'\n                        defaultMessage='Invite **Guests** to {teamName}'\n                        values={{teamName: this.props.teamName}}\n                    />\n                </h1>\n                <div\n                    className='add-people'\n                    data-testid='addPeople'\n                >\n                    <h5>\n                        <FormattedMessage\n                            id='invitation_modal.guests.add_people.title'\n                            defaultMessage='Invite People'\n                        />\n                    </h5>\n                    <div data-testid='emailPlaceholder'>\n                        <UsersEmailsInput\n                            usersLoader={this.usersLoader}\n                            placeholder={inputPlaceholder}\n                            ariaLabel={localizeMessage(\n                                'invitation_modal.guests.add_people.title',\n                                'Invite People',\n                            )}\n                            showError={this.shouldShowPickerError()}\n                            errorMessageId={t(\n                                'invitation_modal.invite_members.hit_cloud_user_limit',\n                            )}\n                            errorMessageDefault={\n                                'You can only invite **{num} more {num, plural, one {member} other {members}}** to the team on the free tier.'\n                            }\n                            errorMessageValues={{\n                                num: remainingUsers < 0 ? '0' : remainingUsers,\n                            }}\n                            extraErrorText={(<UpgradeLink handleClick={(e) => this.handleLinkClick(e)}/>)}\n                            onChange={this.onUsersEmailsChange}\n                            value={this.state.usersAndEmails}\n                            onInputChange={this.onUsersInputChange}\n                            inputValue={this.state.usersInputValue}\n                            validAddressMessageId={t(\n                                'invitation_modal.guests.users_emails_input.valid_email',\n                            )}\n                            validAddressMessageDefault='Invite **{email}** as a guest'\n                            noMatchMessageId={noMatchMessageId}\n                            noMatchMessageDefault={noMatchMessageDefault}\n                            emailInvitationsEnabled={\n                                this.props.emailInvitationsEnabled\n                            }\n                        />\n                    </div>\n                    <div className='help-text'>\n                        {this.props.emailInvitationsEnabled && (\n                            <FormattedMessage\n                                id='invitation_modal.guests.add_people.description'\n                                defaultMessage='Add existing guests or send email invites to new guests.'\n                            />\n                        )}\n                        {!this.props.emailInvitationsEnabled && (\n                            <FormattedMessage\n                                id='invitation_modal.guests.add_people.description-email-disabled'\n                                defaultMessage='Add existing guests.'\n                            />\n                        )}\n                    </div>\n                </div>\n                <div\n                    className='add-channels'\n                    data-testid='channelPlaceholder'\n                >\n                    <h5>\n                        <FormattedMessage\n                            id='invitation_modal.guests.add_channels.title'\n                            defaultMessage='Search and Add Channels'\n                        />\n                    </h5>\n                    <div>\n                        <FormattedMessage\n                            id='invitation_modal.guests.add_channels.placeholder'\n                            defaultMessage='Search and add channels'\n                        >\n                            {(placeholder) => (\n                                <ChannelsInput\n                                    placeholder={placeholder}\n                                    ariaLabel={localizeMessage(\n                                        'invitation_modal.guests.add_channels.title',\n                                        'Search and Add Channels',\n                                    )}\n                                    channelsLoader={this.channelsLoader}\n                                    onChange={this.onChannelsChange}\n                                    onInputChange={this.onChannelsInputChange}\n                                    inputValue={this.state.channelsInputValue}\n                                    value={this.state.channels}\n                                />\n                            )}\n                        </FormattedMessage>\n                    </div>\n                    <div className='help-text'>\n                        <FormattedMessage\n                            id='invitation_modal.guests.add-channels.description'\n                            defaultMessage='Specify the channels the guests have access to.'\n                        />\n                    </div>\n                </div>\n                <div\n                    className='custom-message'\n                    data-testid='customMessage'\n                >\n                    {!this.state.customMessageOpen && (\n                        <a\n                            onClick={this.openCustomMessage}\n                            href='#'\n                        >\n                            <FormattedMessage\n                                id='invitation_modal.guests.custom-message.link'\n                                defaultMessage='Set a custom message'\n                            />\n                        </a>\n                    )}\n                    {this.state.customMessageOpen && (\n                        <React.Fragment>\n                            <div>\n                                <FormattedMessage\n                                    id='invitation_modal.guests.custom-message.title'\n                                    defaultMessage='Custom message'\n                                />\n                                <CloseCircleIcon\n                                    onClick={this.closeCustomMessage}\n                                />\n                            </div>\n                            <textarea\n                                ref={this.textareaRef}\n                                onChange={this.onMessageChange}\n                                value={this.state.customMessage}\n                            />\n                        </React.Fragment>\n                    )}\n                    <div className='help-text'>\n                        <FormattedMessage\n                            id='invitation_modal.guests.custom-message.description'\n                            defaultMessage='Create a custom message to make your invite more personal.'\n                        />\n                    </div>\n                </div>\n                <div className='invite-guests'>\n                    <button\n                        className={\n                            'btn ' +\n                            (this.state.channels.length === 0 ||\n                            this.state.usersAndEmails.length === 0 ?\n                                'btn-inactive' :\n                                'btn-primary')\n                        }\n                        disabled={\n                            this.state.channels.length === 0 ||\n                            this.state.usersAndEmails.length === 0\n                        }\n                        onClick={this.sendInvites}\n                        id='inviteGuestButton'\n                    >\n                        <FormattedMessage\n                            id='invitation_modal.guests.invite_button'\n                            defaultMessage='Invite Guests'\n                        />\n                    </button>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default withGetCloudSubscription(InvitationModalGuestsStep);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {\n    getConfig,\n    getLicense,\n    getSubscriptionStats as selectSubscriptionStats,\n} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {getSubscriptionStats} from 'mattermost-redux/actions/cloud';\n\nimport {GlobalState} from 'types/store';\n\nimport {isAdmin} from 'utils/utils.jsx';\n\nimport InvitationModalGuestsStep from './invitation_modal_guests_step';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        userLimit: getConfig(state).ExperimentalCloudUserLimit,\n        userIsAdmin: isAdmin(getCurrentUser(state).roles),\n        isCloud: getLicense(state).Cloud === 'true',\n        subscriptionStats: selectSubscriptionStats(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({getSubscriptionStats}, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InvitationModalGuestsStep);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function AlertIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='24px'\n                height='24px'\n                viewBox='0 0 24 24'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.alert', defaultMessage: 'Alert Icon'})}\n            >\n                <path d='M11,15H13V17H11V15M11,7H13V13H11V7M12,2C6.47,2 2,6.5 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20Z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport EmailIcon from 'components/widgets/icons/mail_icon';\nimport AlertIcon from 'components/widgets/icons/alert_icon';\nimport GuestBadge from 'components/widgets/badges/guest_badge';\nimport BotBadge from 'components/widgets/badges/bot_badge';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport {imageURLForUser, isGuest, getLongDisplayName} from 'utils/utils.jsx';\n\nimport './invitation_modal_confirm_step_row.scss';\n\nexport default class InvitationModalConfirmStepRow extends React.PureComponent {\n    static propTypes = {\n        invitation: PropTypes.object.isRequired,\n    }\n\n    render() {\n        const {invitation} = this.props;\n        let icon;\n        let username;\n        let className;\n        let guestBadge;\n        let botBadge;\n\n        if (invitation.user) {\n            className = 'name';\n            const profileImg = imageURLForUser(invitation.user.id, invitation.user.last_picture_update);\n            icon = (\n                <Avatar\n                    username={invitation.user.username}\n                    url={profileImg}\n                    size='lg'\n                />\n            );\n            username = getLongDisplayName(invitation.user);\n            if (invitation.user.is_bot) {\n                botBadge = <BotBadge/>;\n            }\n            if (isGuest(invitation.user)) {\n                guestBadge = <GuestBadge/>;\n            }\n        } else if (invitation.email) {\n            className = 'email';\n            icon = <EmailIcon className='mail-icon'/>;\n            username = invitation.email;\n        } else {\n            className = 'name';\n            icon = <AlertIcon className='alert-icon'/>;\n            username = invitation.text;\n        }\n\n        let reason = invitation.reason;\n        if (invitation.reason && invitation.reason.id) {\n            reason = (\n                <FormattedMessage\n                    id={invitation.reason.id}\n                    defaultMessage={invitation.reason.message}\n                    values={invitation.reason.values}\n                />\n            );\n        }\n\n        return (\n            <div className='InvitationModalConfirmStepRow'>\n                <div className='username-or-icon'>\n                    {icon}\n                    <span className={className}>\n                        {username}\n                        {botBadge}\n                        {guestBadge}\n                    </span>\n                </div>\n                <div className='reason'>\n                    {reason}\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport InvitationModalConfirmStepRow from 'components/invitation_modal/invitation_modal_confirm_step_row';\n\nimport './invitation_modal_confirm_step_table.scss';\n\nexport default class InvitationModalConfirmStepTable extends React.PureComponent {\n    static propTypes = {\n        invites: PropTypes.arrayOf(PropTypes.object).isRequired,\n    }\n    render() {\n        return (\n            <div className='InvitationModalConfirmStepTable'>\n                <div className='table-header'>\n                    <div className='people-header'>\n                        <FormattedMessage\n                            id='invitation-modal.confirm.people-header'\n                            defaultMessage='People'\n                        />\n                    </div>\n                    <div className='details-header'>\n                        <FormattedMessage\n                            id='invitation-modal.confirm.details-header'\n                            defaultMessage='Details'\n                        />\n                    </div>\n                </div>\n                <div className='rows'>\n                    {this.props.invites.map((invitation) => (\n                        <InvitationModalConfirmStepRow\n                            key={invitation.text || invitation.email || invitation.user.id}\n                            invitation={invitation}\n                        />\n                    ))}\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport InviteIcon from 'components/widgets/icons/invite_icon';\nimport InvitationModalConfirmStepTable from 'components/invitation_modal/invitation_modal_confirm_step_table';\n\nimport {InviteTypes} from 'utils/constants';\n\nimport './invitation_modal_confirm_step.scss';\n\nexport default class InvitationModalConfirmStep extends React.PureComponent {\n    static propTypes = {\n        teamName: PropTypes.string.isRequired,\n        onDone: PropTypes.func.isRequired,\n        onInviteMore: PropTypes.func.isRequired,\n        invitesType: PropTypes.oneOf([InviteTypes.INVITE_MEMBER, InviteTypes.INVITE_GUEST]).isRequired,\n        invitesSent: PropTypes.array.isRequired,\n        invitesNotSent: PropTypes.array.isRequired,\n    }\n\n    getInvitesCountsMessage = (invitesSentCount, invitesNotSentCount) => {\n        if (invitesSentCount > 0 && invitesNotSentCount > 0) {\n            return (\n                <FormattedMarkdownMessage\n                    id='invitation_modal.confirm.members_subtitle'\n                    defaultMessage='**{sentCount, number} {sentCount, plural, one {person} other {people}}** {sentCount, plural, one {has} other {have}} been invited, and **{notSentCount, number} {notSentCount, plural, one {invitation} other {invitations}}** {notSentCount, plural, one {was} other {were}} not sent'\n                    values={{sentCount: invitesSentCount, notSentCount: invitesNotSentCount}}\n                />\n            );\n        }\n\n        if (invitesSentCount > 0 && invitesNotSentCount === 0) {\n            return (\n                <FormattedMarkdownMessage\n                    id='invitation_modal.confirm.members_subtitle_without_not_sent'\n                    defaultMessage='**{sentCount, number} {sentCount, plural, one {person} other {people}}** {sentCount, plural, one {has} other {have}} been invited'\n                    values={{sentCount: invitesSentCount}}\n                />\n            );\n        }\n        if (invitesSentCount === 0 && invitesNotSentCount > 0) {\n            return (\n                <FormattedMarkdownMessage\n                    id='invitation_modal.confirm.members_subtitle_without_sent'\n                    defaultMessage='**{notSentCount, number} {notSentCount, plural, one {invitation} other {invitations}}** {notSentCount, plural, one {was} other {were}} not sent'\n                    values={{notSentCount: invitesNotSentCount}}\n                />\n            );\n        }\n        return (\n            <FormattedMarkdownMessage\n                id='invitation_modal.confirm.members_subtitle_without_sent_and_not_sent'\n                defaultMessage='No invitation sent'\n            />\n        );\n    }\n\n    render() {\n        const {teamName, invitesType, invitesSent, invitesNotSent, onDone, onInviteMore} = this.props;\n        return (\n            <div className='InvitationModalConfirmStep'>\n                <div className='modal-icon'>\n                    <InviteIcon/>\n                </div>\n                {invitesType === InviteTypes.INVITE_MEMBER &&\n                    <h1 id='invitation_modal_title'>\n                        <FormattedMarkdownMessage\n                            id='invitation_modal.confirm.members_title'\n                            defaultMessage='**Members** Invited to **{teamName}**'\n                            values={{teamName}}\n                        />\n                    </h1>}\n                {invitesType === InviteTypes.INVITE_GUEST &&\n                    <h1 id='invitation_modal_title'>\n                        <FormattedMarkdownMessage\n                            id='invitation_modal.confirm.guests_title'\n                            defaultMessage='**Guests** Invited to **{teamName}**'\n                            values={{teamName}}\n                        />\n                    </h1>}\n                <h2 className='subtitle'>\n                    {this.getInvitesCountsMessage(invitesSent.length, invitesNotSent.length)}\n                </h2>\n                {invitesSent.length > 0 &&\n                    <div className='invitation-modal-confirm-sent'>\n                        <h2>\n                            <FormattedMessage\n                                id='invitation_modal.confirm.sent-header'\n                                defaultMessage='Successful Invites'\n                            />\n                        </h2>\n                        <InvitationModalConfirmStepTable invites={invitesSent}/>\n                    </div>}\n                {invitesNotSent.length > 0 &&\n                    <div className='invitation-modal-confirm-not-sent'>\n                        <h2>\n                            <FormattedMessage\n                                id='invitation_modal.confirm.not-sent-header'\n                                defaultMessage='Invitations Not Sent'\n                            />\n                        </h2>\n                        <InvitationModalConfirmStepTable invites={invitesNotSent}/>\n                    </div>}\n                <div className='button-input-block'>\n                    <button\n                        className='btn invite-more'\n                        onClick={onInviteMore}\n                    >\n                        <FormattedMessage\n                            id='invitation_modal.invite.more'\n                            defaultMessage='Invite More People'\n                        />\n                    </button>\n                    <button\n                        className='btn btn-primary confirm-done'\n                        onClick={onDone}\n                    >\n                        <FormattedMessage\n                            id='invitation_modal.confirm.done'\n                            defaultMessage='Done'\n                        />\n                    </button>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {trackEvent, pageVisited} from 'actions/telemetry_actions.jsx';\nimport FullScreenModal from 'components/widgets/modals/full_screen_modal';\nimport ConfirmModal from 'components/confirm_modal';\nimport RootPortal from 'components/root_portal';\nimport UserLimitModal from 'components/user_limit_modal/user_limit_modal';\n\nimport {InviteTypes} from 'utils/constants';\n\nimport InvitationModalInitialStep from './invitation_modal_initial_step.jsx';\nimport InvitationModalMembersStep from './invitation_modal_members_step';\nimport InvitationModalGuestsStep from './invitation_modal_guest_step';\nimport InvitationModalConfirmStep from './invitation_modal_confirm_step.jsx';\n\nimport './invitation_modal.scss';\n\nconst STEPS_INITIAL = 'initial';\nconst STEPS_INVITE_MEMBERS = 'members';\nconst STEPS_INVITE_GUESTS = 'guests';\nconst STEPS_INVITE_CONFIRM = 'confirm';\n\nexport default class InvitationModal extends React.PureComponent {\n    static propTypes = {\n        show: PropTypes.bool,\n        currentTeam: PropTypes.object.isRequired,\n        invitableChannels: PropTypes.array.isRequired,\n        canInviteGuests: PropTypes.bool.isRequired,\n        canAddUsers: PropTypes.bool.isRequired,\n        emailInvitationsEnabled: PropTypes.bool.isRequired,\n        isCloud: PropTypes.bool.isRequired,\n        isFreeTierWithNoFreeSeats: PropTypes.bool.isRequired,\n        userIsAdmin: PropTypes.bool.isRequired,\n        cloudUserLimit: PropTypes.string.isRequired,\n        actions: PropTypes.shape({\n            closeModal: PropTypes.func.isRequired,\n            sendGuestsInvites: PropTypes.func.isRequired,\n            sendMembersInvites: PropTypes.func.isRequired,\n            searchProfiles: PropTypes.func.isRequired,\n            searchChannels: PropTypes.func.isRequired,\n            getTeam: PropTypes.func.isRequired,\n            openModal: PropTypes.func,\n        }).isRequired,\n    }\n\n    modal = React.createRef();\n\n    constructor(props) {\n        super(props);\n        let step = STEPS_INITIAL;\n        if (!props.canInviteGuests) {\n            step = STEPS_INVITE_MEMBERS;\n        }\n\n        if (!props.canAddUsers) {\n            step = STEPS_INVITE_GUESTS;\n        }\n\n        this.state = {\n            step,\n            prevStep: null,\n            lastInviteChannels: [],\n            lastInviteMessage: '',\n            confirmModal: false,\n            confirmBack: false,\n            hasChanges: false,\n            invitesType: InviteTypes.INVITE_MEMBER,\n            invitesSent: [],\n            invitesNotSent: [],\n        };\n    }\n\n    componentDidMount() {\n        if (this.props.isCloud) {\n            pageVisited('cloud_invite_users', 'pageview_invite_users');\n        }\n    }\n\n    componentDidUpdate(prevProps, prevState) {\n        if (this.state.step === STEPS_INVITE_MEMBERS && prevState.step !== STEPS_INVITE_MEMBERS && !this.props.currentTeam.invite_id) {\n            this.props.actions.getTeam(this.props.currentTeam.id);\n        }\n    }\n\n    goToFirstStep = () => {\n        if (this.props.canAddUsers && this.props.canInviteGuests) {\n            this.goToInitialStep();\n        } else if (this.props.canAddUsers) {\n            this.goToMembers();\n        } else if (this.props.canInviteGuests) {\n            this.goToGuests();\n        } else {\n            this.close();\n        }\n    }\n\n    goToInitialStep = () => {\n        if (this.state.hasChanges) {\n            this.setState({confirmBack: true});\n        } else {\n            this.setState({step: STEPS_INITIAL, hasChanges: false, lastInviteChannels: [], lastInviteMesssage: '', prevStep: this.state.step});\n        }\n        if (this.modal && this.modal.current) {\n            this.modal.current.enforceFocus();\n        }\n    }\n\n    goToMembers = () => {\n        if (this.props.isCloud) {\n            trackEvent('cloud_invite_users', 'click_invite_members');\n        }\n        this.setState({step: STEPS_INVITE_MEMBERS, prevStep: this.state.step, hasChanges: false, invitesSent: [], invitesNotSent: [], invitesType: InviteTypes.INVITE_MEMBER});\n        if (this.modal && this.modal.current) {\n            this.modal.current.enforceFocus();\n        }\n    }\n\n    goToGuests = () => {\n        if (this.props.isCloud) {\n            trackEvent('cloud_invite_users', 'click_invite_guests');\n        }\n        this.setState({step: STEPS_INVITE_GUESTS, prevStep: this.state.step, hasChanges: false, invitesSent: [], invitesNotSent: [], invitesType: InviteTypes.INVITE_GUEST});\n        if (this.modal && this.modal.current) {\n            this.modal.current.enforceFocus();\n        }\n    }\n\n    goToPrevStep = () => {\n        if (this.state.prevStep === STEPS_INVITE_GUESTS) {\n            this.setState({step: STEPS_INVITE_GUESTS, prevStep: this.state.step, hasChanges: false, invitesSent: [], invitesNotSent: [], invitesType: InviteTypes.INVITE_GUEST});\n        } else if (this.state.prevStep === STEPS_INVITE_MEMBERS) {\n            this.setState({step: STEPS_INVITE_MEMBERS, prevStep: this.state.step, hasChanges: false, invitesSent: [], invitesNotSent: [], invitesType: InviteTypes.INVITE_MEMBER});\n        }\n        if (this.modal && this.modal.current) {\n            this.modal.current.enforceFocus();\n        }\n    }\n\n    getBackFunction = () => {\n        if (this.state.step === STEPS_INVITE_CONFIRM && this.state.invitesNotSent.length > 0) {\n            return this.goToPrevStep;\n        }\n        if ((this.state.step === STEPS_INVITE_MEMBERS || this.state.step === STEPS_INVITE_GUESTS) && this.props.canInviteGuests && this.props.canAddUsers) {\n            return this.goToInitialStep;\n        }\n        return null;\n    }\n\n    onEdit = (hasChanges) => {\n        this.setState({hasChanges});\n    }\n\n    close = () => {\n        if (this.state.hasChanges) {\n            this.setState({confirmModal: true});\n        } else {\n            this.props.actions.closeModal();\n        }\n    }\n\n    confirmBack = () => {\n        this.setState({step: STEPS_INITIAL, hasChanges: false, confirmBack: false});\n    }\n\n    cancelBack= () => {\n        this.setState({confirmBack: false});\n    }\n\n    confirmClose = () => {\n        this.props.actions.closeModal();\n        this.setState({confirmModal: false});\n    }\n\n    cancelClose = () => {\n        this.setState({confirmModal: false});\n    }\n\n    onMembersSubmit = async (users, emails, extraText) => {\n        const invites = await this.props.actions.sendMembersInvites(this.props.currentTeam.id, users, emails);\n\n        if (this.props.isCloud) {\n            trackEvent('cloud_invite_users', 'invitations_sent', {num_invitations_sent: invites.sent});\n        }\n\n        if (extraText !== '') {\n            invites.notSent.push({\n                text: extraText,\n                reason: (\n                    <FormattedMessage\n                        id='invitation-modal.confirm.not-valid-user-or-email'\n                        defaultMessage='Does not match a valid user or email.'\n                    />\n                ),\n            });\n        }\n\n        this.setState({step: STEPS_INVITE_CONFIRM, prevStep: this.state.step, invitesSent: invites.sent, invitesNotSent: invites.notSent, invitesType: InviteTypes.INVITE_MEMBER, hasChanges: false});\n    }\n\n    onGuestsSubmit = async (users, emails, channels, message, extraUserText, extraChannelText) => {\n        const invites = await this.props.actions.sendGuestsInvites(\n            this.props.currentTeam.id,\n            channels.map((c) => c.id),\n            users,\n            emails,\n            message,\n        );\n        if (extraUserText !== '') {\n            invites.notSent.push({\n                text: extraUserText,\n                reason: (\n                    <FormattedMessage\n                        id='invitation-modal.confirm.not-valid-user-or-email'\n                        defaultMessage='Does not match a valid user or email.'\n                    />\n                ),\n            });\n        }\n        if (extraChannelText !== '') {\n            invites.notSent.push({\n                text: extraChannelText,\n                reason: (\n                    <FormattedMessage\n                        id='invitation-modal.confirm.not-valid-channel'\n                        defaultMessage='Does not match a valid channel name.'\n                    />\n                ),\n            });\n        }\n        this.setState({step: STEPS_INVITE_CONFIRM, prevStep: this.state.step, lastInviteChannels: channels, lastInviteMessage: message, invitesSent: invites.sent, invitesNotSent: invites.notSent, invitesType: InviteTypes.INVITE_GUEST, hasChanges: false});\n    }\n\n    render() {\n        const invitationModal = (<RootPortal>\n            <FullScreenModal\n                show={Boolean(this.props.show)}\n                onClose={this.close}\n                onGoBack={this.getBackFunction()}\n                ref={this.modal}\n                ariaLabelledBy='invitation_modal_title'\n            >\n                <div\n                    data-testid='invitationModal'\n                    className='InvitationModal'\n                >\n                    <ConfirmModal\n                        show={this.state.confirmModal || this.state.confirmBack}\n                        title={\n                            <FormattedMessage\n                                id='invitation-modal.discard-changes.title'\n                                defaultMessage='Discard Changes'\n                            />\n                        }\n                        message={\n                            <FormattedMessage\n                                id='invitation-modal.discard-changes.message'\n                                defaultMessage='You have unsent invitations, are you sure you want to discard them?'\n                            />\n                        }\n                        confirmButtonText={\n                            <FormattedMessage\n                                id='invitation-modal.discard-changes.button'\n                                defaultMessage='Yes, Discard'\n                            />\n                        }\n                        modalClass='invitation-modal-confirm'\n                        onConfirm={this.state.confirmModal ? this.confirmClose : this.confirmBack}\n                        onCancel={this.state.confirmModal ? this.cancelClose : this.cancelBack}\n                    />\n                    {this.state.step === STEPS_INITIAL &&\n                    <InvitationModalInitialStep\n                        teamName={this.props.currentTeam.display_name}\n                        goToMembers={this.goToMembers}\n                        goToGuests={this.goToGuests}\n                        emailInvitationsEnabled={this.props.emailInvitationsEnabled}\n                    />\n                    }\n                    {this.state.step === STEPS_INVITE_MEMBERS &&\n                    <InvitationModalMembersStep\n                        teamName={this.props.currentTeam.display_name}\n                        currentTeamId={this.props.currentTeam.id}\n                        inviteId={this.props.currentTeam.invite_id}\n                        searchProfiles={this.props.actions.searchProfiles}\n                        emailInvitationsEnabled={this.props.emailInvitationsEnabled}\n                        onSubmit={this.onMembersSubmit}\n                        onEdit={this.onEdit}\n                    />\n                    }\n                    {this.state.step === STEPS_INVITE_GUESTS &&\n                    <InvitationModalGuestsStep\n                        teamName={this.props.currentTeam.display_name}\n                        currentTeamId={this.props.currentTeam.id}\n                        myInvitableChannels={this.props.invitableChannels}\n                        searchProfiles={this.props.actions.searchProfiles}\n                        searchChannels={this.props.actions.searchChannels}\n                        defaultChannels={this.state.lastInviteChannels}\n                        defaultMessage={this.state.lastInviteMessage}\n                        emailInvitationsEnabled={this.props.emailInvitationsEnabled}\n                        onSubmit={this.onGuestsSubmit}\n                        onEdit={this.onEdit}\n                    />\n                    }\n                    {this.state.step === STEPS_INVITE_CONFIRM &&\n                    <InvitationModalConfirmStep\n                        teamName={this.props.currentTeam.display_name}\n                        currentTeamId={this.props.currentTeam.id}\n                        onDone={this.close}\n                        onInviteMore={this.goToFirstStep}\n                        invitesType={this.state.invitesType}\n                        invitesSent={this.state.invitesSent}\n                        invitesNotSent={this.state.invitesNotSent}\n                    />\n                    }\n                </div>\n            </FullScreenModal>\n        </RootPortal>);\n\n        const actionsUserLimitModal = {\n            closeModal: this.props.actions.closeModal,\n            openModal: this.props.actions.openModal,\n        };\n        const userLimitModal = (\n            <UserLimitModal\n                userIsAdmin={this.props.userIsAdmin}\n                cloudUserLimit={this.props.cloudUserLimit}\n                show={Boolean(this.props.show)}\n                actions={actionsUserLimitModal}\n            />\n        );\n        return (\n            <>\n                {this.props.isFreeTierWithNoFreeSeats ? userLimitModal : invitationModal}\n            </>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {isEmpty} from 'lodash';\n\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getChannelsInCurrentTeam} from 'mattermost-redux/selectors/entities/channels';\nimport {haveIChannelPermission, haveICurrentTeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getConfig, getLicense, getSubscriptionStats} from 'mattermost-redux/selectors/entities/general';\nimport {getProfiles, searchProfiles as reduxSearchProfiles} from 'mattermost-redux/actions/users';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {searchChannels as reduxSearchChannels} from 'mattermost-redux/actions/channels';\nimport {getTeam} from 'mattermost-redux/actions/teams';\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport {closeModal, openModal} from 'actions/views/modals';\nimport {isModalOpen} from 'selectors/views/modals';\nimport {ModalIdentifiers, Constants} from 'utils/constants';\nimport {isAdmin} from 'utils/utils';\nimport {sendMembersInvites, sendGuestsInvites} from 'actions/invite_actions';\n\nimport InvitationModal from './invitation_modal.jsx';\n\nconst searchProfiles = (term, options = {}) => {\n    if (!term) {\n        return getProfiles(0, 20, options);\n    }\n    return reduxSearchProfiles(term, options);\n};\n\nconst searchChannels = (teamId, term) => {\n    return reduxSearchChannels(teamId, term);\n};\n\nexport function mapStateToProps(state) {\n    const config = getConfig(state);\n    const license = getLicense(state);\n    const channels = getChannelsInCurrentTeam(state);\n    const currentTeam = getCurrentTeam(state);\n    const subscriptionStats = getSubscriptionStats(state);\n    const invitableChannels = channels.filter((channel) => {\n        if (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL) {\n            return false;\n        }\n        if (channel.type === Constants.PRIVATE_CHANNEL) {\n            return haveIChannelPermission(state, currentTeam.id, channel.id, Permissions.MANAGE_PRIVATE_CHANNEL_MEMBERS);\n        }\n        return haveIChannelPermission(state, currentTeam.id, channel.id, Permissions.MANAGE_PUBLIC_CHANNEL_MEMBERS);\n    });\n    const guestAccountsEnabled = config.EnableGuestAccounts === 'true';\n    const emailInvitationsEnabled = config.EnableEmailInvitations === 'true';\n    const isLicensed = license && license.IsLicensed === 'true';\n    const isGroupConstrained = Boolean(currentTeam.group_constrained);\n    const canInviteGuests = !isGroupConstrained && isLicensed && guestAccountsEnabled && haveICurrentTeamPermission(state, Permissions.INVITE_GUEST);\n    const isCloud = license.Cloud === 'true';\n    const isFreeTierWithNoFreeSeats = isCloud && !isEmpty(subscriptionStats) && subscriptionStats.is_paid_tier === 'false' && subscriptionStats.remaining_seats <= 0;\n\n    const canAddUsers = haveICurrentTeamPermission(state, Permissions.ADD_USER_TO_TEAM);\n    return {\n        invitableChannels,\n        currentTeam,\n        canInviteGuests,\n        canAddUsers,\n        isFreeTierWithNoFreeSeats,\n        emailInvitationsEnabled,\n        show: isModalOpen(state, ModalIdentifiers.INVITATION),\n        isCloud,\n        userIsAdmin: isAdmin(getCurrentUser(state).roles),\n        cloudUserLimit: config.ExperimentalCloudUserLimit || '10',\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            closeModal: () => closeModal(ModalIdentifiers.INVITATION),\n            sendGuestsInvites,\n            sendMembersInvites,\n            searchProfiles,\n            searchChannels,\n            getTeam,\n            openModal: (modalData) => openModal(modalData),\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InvitationModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\ntype Props = {\n    loading?: string;\n    progress?: number;\n    containerClass?: string;\n}\n\nconst LoadingImagePreview: React.FC<Props> = ({loading, progress, containerClass}: Props) => {\n    let progressView: JSX.Element = (\n        <span className='loader-percent'/>\n    );\n\n    if (progress) {\n        progressView = (\n            <span className='loader-percent'>\n                {`${loading} ${progress}%`}\n            </span>\n        );\n    }\n\n    return (\n        <div className={containerClass}>\n            <LoadingSpinner/>\n            {progressView}\n        </div>\n    );\n};\n\nLoadingImagePreview.defaultProps = {\n    containerClass: 'view-image__loading',\n};\n\nexport default LoadingImagePreview;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ReactNode, CSSProperties} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\ntype Props = {\n    position: 'absolute' | 'fixed' | 'relative' | 'static' | 'inherit';\n    style?: CSSProperties;\n    message?: ReactNode;\n}\n\nexport default class LoadingScreen extends React.PureComponent<Props> {\n    public static defaultProps: Partial<Props> = {\n        position: 'relative',\n        style: {},\n    }\n\n    public constructor(props: Props) {\n        super(props);\n        this.state = {};\n    }\n\n    public render(): JSX.Element {\n        let message: ReactNode = (\n            <FormattedMessage\n                id='loading_screen.loading'\n                defaultMessage='Loading'\n            />\n        );\n\n        if (this.props.message) {\n            message = this.props.message;\n        }\n\n        return (\n            <div\n                className='loading-screen'\n                style={{position: this.props.position, ...this.props.style}}\n            >\n                <div className='loading__content'>\n                    <p>\n                        {message}\n                    </p>\n                    <div className='round round-1'/>\n                    <div className='round round-2'/>\n                    <div className='round round-3'/>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {HTMLAttributes} from 'react';\nimport {useIntl, MessageDescriptor} from 'react-intl';\nimport {PrimitiveType, FormatXMLElementFn} from 'intl-messageformat';\n\ntype Props = Omit<HTMLAttributes<HTMLSpanElement | HTMLElement>, 'title' | 'component'> & {\n    component?: 'i' | 'span';\n    title: MessageDescriptor & {\n        values?: Record<string, PrimitiveType | FormatXMLElementFn<string, string>>;\n    };\n}\n\nconst LocalizedIcon = React.forwardRef((props: Props, ref?: React.Ref<HTMLSpanElement | HTMLElement>) => {\n    const {\n        component: Component = 'i',\n        title: {\n            id,\n            defaultMessage,\n            values,\n        },\n        ...otherProps\n    } = props;\n\n    if (Component !== 'i' && Component !== 'span') {\n        return null;\n    }\n\n    const {formatMessage} = useIntl();\n\n    return (\n        <Component\n            {...otherProps}\n            ref={ref}\n            title={formatMessage({id, defaultMessage}, values)}\n        />\n    );\n});\nLocalizedIcon.displayName = 'LocalizedIcon';\n\nexport default LocalizedIcon;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {InputHTMLAttributes} from 'react';\nimport {useIntl, MessageDescriptor} from 'react-intl';\nimport {PrimitiveType, FormatXMLElementFn} from 'intl-messageformat';\n\nexport type Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'placeholder'> & {\n    placeholder: MessageDescriptor & {\n        values?: Record<string, PrimitiveType | FormatXMLElementFn<string, string>>;\n    };\n};\n\nconst LocalizedInput = React.forwardRef((props: Props, ref?: React.Ref<HTMLInputElement>) => {\n    const {\n        placeholder: {\n            id,\n            defaultMessage,\n            values,\n        },\n        ...otherProps\n    } = props;\n\n    const {formatMessage} = useIntl();\n\n    return (\n        <input\n            {...otherProps}\n            ref={ref}\n            placeholder={formatMessage({id, defaultMessage}, values)}\n        />\n    );\n});\nLocalizedInput.displayName = 'LocalizedInput';\n\nexport default LocalizedInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {createSelector} from 'reselect';\n\nimport {Preferences} from 'mattermost-redux/constants';\nimport {getChannelNameToDisplayNameMap} from 'mattermost-redux/selectors/entities/channels';\nimport {getAutolinkedUrlSchemes, getConfig, getManagedResourcePaths} from 'mattermost-redux/selectors/entities/general';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getAllUserMentionKeys} from 'mattermost-redux/selectors/entities/search';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport {getEmojiMap} from 'selectors/emojis';\nimport {getSiteURL} from 'utils/url';\nimport {ChannelNamesMap, MentionKey} from 'utils/text_formatting';\n\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\n\nimport Markdown from './markdown';\n\ntype Props = {\n    channelNamesMap?: ChannelNamesMap;\n    mentionKeys?: MentionKey[];\n    postId?: string;\n}\n\nfunction makeGetChannelNamesMap() {\n    return createSelector(\n        'makeGetChannelNamesMap',\n        getChannelNameToDisplayNameMap,\n        (state: GlobalState, props: Props) => props && props.channelNamesMap,\n        (channelNamesMap, channelMentions) => {\n            if (channelMentions) {\n                return Object.assign({}, channelMentions, channelNamesMap);\n            }\n\n            return channelNamesMap;\n        },\n    );\n}\n\nfunction makeMapStateToProps() {\n    const getChannelNamesMap = makeGetChannelNamesMap();\n\n    return function mapStateToProps(state: GlobalState, ownProps: Props) {\n        const config = getConfig(state);\n\n        let channelId;\n        if (ownProps.postId) {\n            channelId = getPost(state, ownProps.postId)?.channel_id;\n        }\n\n        return {\n            autolinkedUrlSchemes: getAutolinkedUrlSchemes(state),\n            channelNamesMap: getChannelNamesMap(state, ownProps),\n            enableFormatting: getBool(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'formatting', true),\n            managedResourcePaths: getManagedResourcePaths(state),\n            mentionKeys: ownProps.mentionKeys || getAllUserMentionKeys(state),\n            siteURL: getSiteURL(),\n            team: getCurrentTeam(state),\n            hasImageProxy: config.HasImageProxy === 'true',\n            minimumHashtagLength: parseInt(config.MinimumHashtagLength || '', 10),\n            emojiMap: getEmojiMap(state),\n            channelId,\n        };\n    };\n}\n\nexport default connect(makeMapStateToProps)(Markdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {Team} from 'mattermost-redux/types/teams';\nimport {PostImage, PostType} from 'mattermost-redux/types/posts';\nimport {Dictionary} from 'mattermost-redux/types/utilities';\n\nimport messageHtmlToComponent from 'utils/message_html_to_component';\nimport EmojiMap from 'utils/emoji_map';\nimport {ChannelNamesMap, TextFormattingOptions, formatText, MentionKey} from 'utils/text_formatting';\n\ntype Props = {\n\n    /*\n     * An object mapping channel names to channels for the current team\n     */\n    channelNamesMap?: ChannelNamesMap;\n\n    /*\n     * An array of URL schemes that should be turned into links. Anything that looks\n     * like a link will be turned into a link if this is not provided.\n     */\n    autolinkedUrlSchemes?: string[];\n\n    /*\n     * Whether or not to do Markdown rendering\n     */\n    enableFormatting?: boolean;\n\n    /*\n     * Whether or not this text is part of the RHS\n     */\n    isRHS?: boolean;\n\n    /*\n     * An array of paths on the server that are managed by another server\n     */\n    managedResourcePaths?: string[];\n\n    /*\n     * An array of words that can be used to mention a user\n     */\n    mentionKeys?: MentionKey[];\n\n    /*\n     * The text to be rendered\n     */\n    message: string;\n\n    /*\n     * Any additional text formatting options to be used\n     */\n    options: Partial<TextFormattingOptions>;\n\n    /*\n     * The root Site URL for the page\n     */\n    siteURL?: string;\n\n    /*\n     * The current team\n     */\n    team?: Team;\n\n    /**\n     * If an image proxy is enabled.\n     */\n    hasImageProxy?: boolean;\n\n    /**\n     * Minimum number of characters in a hashtag.\n     */\n    minimumHashtagLength?: number;\n\n    /**\n     * Whether or not to proxy image URLs\n     */\n    proxyImages?: boolean;\n\n    /**\n     * Any extra props that should be passed into the image component\n     */\n    // eslint-disable-next-line @typescript-eslint/ban-types\n    imageProps?: object;\n\n    /**\n     * prop for passed down to image component for dimensions\n     */\n    imagesMetadata?: Dictionary<PostImage>;\n\n    /**\n     * Whether or not to place the LinkTooltip component inside links\n     */\n    hasPluginTooltips?: boolean;\n\n    /**\n     * Post id prop passed down to markdown image\n     */\n    postId?: string;\n\n    channelId?: string;\n\n    /**\n     * Post id prop passed down to markdown image\n     */\n    postType?: PostType;\n    emojiMap: EmojiMap;\n}\n\nexport default class Markdown extends React.PureComponent<Props> {\n    static defaultProps: Partial<Props> = {\n        options: {},\n        isRHS: false,\n        proxyImages: true,\n        imagesMetadata: {},\n        postId: '', // Needed to avoid proptypes console errors for cases like channel header, which doesn't have a proper value\n    }\n\n    render() {\n        if (!this.props.enableFormatting) {\n            return <span>{this.props.message}</span>;\n        }\n\n        const options = Object.assign({\n            autolinkedUrlSchemes: this.props.autolinkedUrlSchemes,\n            siteURL: this.props.siteURL,\n            mentionKeys: this.props.mentionKeys,\n            atMentions: true,\n            channelNamesMap: this.props.channelNamesMap,\n            proxyImages: this.props.hasImageProxy && this.props.proxyImages,\n            team: this.props.team,\n            minimumHashtagLength: this.props.minimumHashtagLength,\n            managedResourcePaths: this.props.managedResourcePaths,\n        }, this.props.options);\n\n        const htmlFormattedText = formatText(this.props.message, options, this.props.emojiMap);\n        return messageHtmlToComponent(htmlFormattedText, this.props.isRHS, {\n            imageProps: this.props.imageProps,\n            imagesMetadata: this.props.imagesMetadata,\n            hasPluginTooltips: this.props.hasPluginTooltips,\n            postId: this.props.postId,\n            channelId: this.props.channelId,\n            postType: this.props.postType,\n            mentionHighlight: this.props.options.mentionHighlight,\n            disableGroupHighlight: this.props.options.disableGroupHighlight,\n        });\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ReactFragment} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {ServerError} from 'mattermost-redux/types/errors';\n\nimport {isErrorInvalidSlashCommand} from 'utils/post_utils';\n\ninterface MessageSubmitErrorProps {\n    error: ServerError;\n    handleSubmit: (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => void;\n    submittedMessage?: string;\n}\n\nclass MessageSubmitError extends React.PureComponent<MessageSubmitErrorProps> {\n    public renderSlashCommandError = (): string | ReactFragment => {\n        if (!this.props.submittedMessage) {\n            return this.props.error.message;\n        }\n\n        const command = this.props.submittedMessage.split(' ')[0];\n        return (\n            <React.Fragment>\n                <FormattedMessage\n                    id='message_submit_error.invalidCommand'\n                    defaultMessage=\"Command with a trigger of ''{command}'' not found. \"\n                    values={{\n                        command,\n                    }}\n                />\n                <a\n                    href='#'\n                    onClick={this.props.handleSubmit}\n                >\n                    <FormattedMessage\n                        id='message_submit_error.sendAsMessageLink'\n                        defaultMessage='Click here to send as a message.'\n                    />\n                </a>\n            </React.Fragment>\n        );\n    }\n\n    public render(): JSX.Element | null {\n        const error = this.props.error;\n\n        if (!error) {\n            return null;\n        }\n\n        let errorContent: string | ReactFragment = error.message;\n        if (isErrorInvalidSlashCommand(error)) {\n            errorContent = this.renderSlashCommandError();\n        }\n\n        return (\n            <div className='has-error'>\n                <label className='control-label'>\n                    {errorContent}\n                </label>\n            </div>\n        );\n    }\n}\n\nexport default MessageSubmitError;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nexport default class ModalController extends React.PureComponent {\n    static propTypes = {\n\n        /**\n         * Object that has map of modal's id and element\n         */\n        modals: PropTypes.object.isRequired,\n\n        /**\n         * Object with action creators\n         */\n        actions: PropTypes.shape({\n\n            /**\n             * Action creator to close modal\n             */\n            closeModal: PropTypes.func.isRequired,\n        }).isRequired,\n    }\n\n    render() {\n        const {modals, ...props} = this.props;\n        const {modalState} = modals;\n\n        if (!modals) {\n            return <div/>;\n        }\n\n        const modalOutput = [];\n\n        for (const modalId in modalState) {\n            if (modalState.hasOwnProperty(modalId)) {\n                const modal = modalState[modalId];\n                if (modal.open) {\n                    const modalComponent = React.createElement(modal.dialogType, Object.assign({}, modal.dialogProps, {\n                        onHide: props.actions.closeModal.bind(this, modalId),\n                        key: `${modalId}_modal`,\n                    }));\n\n                    modalOutput.push(modalComponent);\n                }\n            }\n        }\n\n        return (\n            <div>{modalOutput}</div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {closeModal} from 'actions/views/modals';\n\nimport ModalController from './modal_controller.jsx';\n\nfunction mapStateToProps(state) {\n    return {\n        modals: state.views.modals,\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            closeModal,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ModalController);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport $ from 'jquery';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport {FormattedMessage} from 'react-intl';\n\nimport LoadingScreen from 'components/loading_screen';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\nimport QuickInput from 'components/quick_input';\nimport * as UserAgent from 'utils/user_agent';\nimport {localizeMessage} from 'utils/utils.jsx';\nimport LocalizedInput from 'components/localized_input/localized_input';\n\nimport ArchiveIcon from 'components/widgets/icons/archive_icon';\nimport SharedChannelIndicator from 'components/shared_channel_indicator';\n\nimport {t} from 'utils/i18n';\n\nimport MenuWrapper from './widgets/menu/menu_wrapper';\nimport Menu from './widgets/menu/menu';\n\nconst NEXT_BUTTON_TIMEOUT_MILLISECONDS = 500;\n\nexport default class SearchableChannelList extends React.PureComponent {\n    static getDerivedStateFromProps(props, state) {\n        return {isSearch: props.isSearch, page: props.isSearch && !state.isSearch ? 0 : state.page};\n    }\n\n    constructor(props) {\n        super(props);\n\n        this.nextTimeoutId = 0;\n\n        this.state = {\n            joiningChannel: '',\n            page: 0,\n            nextDisabled: false,\n        };\n\n        this.filter = React.createRef();\n        this.channelListScroll = React.createRef();\n    }\n\n    componentDidMount() {\n        // only focus the search box on desktop so that we don't cause the keyboard to open on mobile\n        if (!UserAgent.isMobile() && this.filter.current) {\n            this.filter.current.focus();\n        }\n    }\n\n    handleJoin(channel) {\n        this.setState({joiningChannel: channel.id});\n        this.props.handleJoin(\n            channel,\n            () => {\n                this.setState({joiningChannel: ''});\n            },\n        );\n    }\n\n    createChannelRow = (channel) => {\n        const ariaLabel = `${channel.display_name}, ${channel.purpose}`.toLowerCase();\n        let archiveIcon;\n        let sharedIcon;\n        const {shouldShowArchivedChannels} = this.props;\n\n        if (shouldShowArchivedChannels) {\n            archiveIcon = (\n                <div className='more-modal__icon-container'>\n                    <ArchiveIcon className='icon icon__archive'/>\n                </div>\n            );\n        }\n\n        if (channel.shared) {\n            sharedIcon = (\n                <SharedChannelIndicator\n                    className='shared-channel-icon'\n                    channelType={channel.type}\n                    withTooltip={true}\n                />\n            );\n        }\n\n        return (\n            <div\n                className='more-modal__row'\n                key={channel.id}\n                id={`ChannelRow-${channel.name}`}\n            >\n                <div className='more-modal__details'>\n                    <button\n                        onClick={this.handleJoin.bind(this, channel)}\n                        aria-label={ariaLabel}\n                        className='style--none more-modal__name'\n                    >\n                        {archiveIcon}\n                        {channel.display_name}\n                        {sharedIcon}\n                    </button>\n                    <p className='more-modal__description'>{channel.purpose}</p>\n                </div>\n                <div className='more-modal__actions'>\n                    <button\n                        onClick={this.handleJoin.bind(this, channel)}\n                        className='btn btn-primary'\n                        disabled={this.state.joiningChannel}\n                    >\n                        <LoadingWrapper\n                            loading={this.state.joiningChannel === channel.id}\n                            text={localizeMessage('more_channels.joining', 'Joining...')}\n                        >\n                            <FormattedMessage\n                                id={shouldShowArchivedChannels ? t('more_channels.view') : t('more_channels.join')}\n                                defaultMessage={shouldShowArchivedChannels ? 'View' : 'Join'}\n                            />\n                        </LoadingWrapper>\n                    </button>\n                </div>\n            </div>\n        );\n    }\n\n    nextPage = (e) => {\n        e.preventDefault();\n        this.setState({page: this.state.page + 1, nextDisabled: true});\n        this.nextTimeoutId = setTimeout(() => this.setState({nextDisabled: false}), NEXT_BUTTON_TIMEOUT_MILLISECONDS);\n        this.props.nextPage(this.state.page + 1);\n        $(ReactDOM.findDOMNode(this.channelListScroll.current)).scrollTop(0);\n    }\n\n    previousPage = (e) => {\n        e.preventDefault();\n        this.setState({page: this.state.page - 1});\n        $(ReactDOM.findDOMNode(this.channelListScroll.current)).scrollTop(0);\n    }\n\n    doSearch = () => {\n        const term = this.filter.current.value;\n        this.props.search(term);\n        if (term === '') {\n            this.setState({page: 0});\n        }\n    }\n    toggleArchivedChannelsOn = () => {\n        this.props.toggleArchivedChannels(true);\n    }\n    toggleArchivedChannelsOff = () => {\n        this.props.toggleArchivedChannels(false);\n    }\n\n    render() {\n        const channels = this.props.channels;\n        let listContent;\n        let nextButton;\n        let previousButton;\n\n        if (this.props.loading && channels.length === 0) {\n            listContent = <LoadingScreen/>;\n        } else if (channels.length === 0) {\n            listContent = (\n                <div className='no-channel-message'>\n                    <h3 className='primary-message'>\n                        <FormattedMessage\n                            id='more_channels.noMore'\n                            tagName='strong'\n                            defaultMessage='No more channels to join'\n                        />\n                    </h3>\n                    {this.props.noResultsText}\n                </div>\n            );\n        } else {\n            const pageStart = this.state.page * this.props.channelsPerPage;\n            const pageEnd = pageStart + this.props.channelsPerPage;\n            const channelsToDisplay = this.props.channels.slice(pageStart, pageEnd);\n            listContent = channelsToDisplay.map(this.createChannelRow);\n\n            if (channelsToDisplay.length >= this.props.channelsPerPage && pageEnd < this.props.channels.length) {\n                nextButton = (\n                    <button\n                        className='btn btn-link filter-control filter-control__next'\n                        onClick={this.nextPage}\n                        disabled={this.state.nextDisabled}\n                    >\n                        <FormattedMessage\n                            id='more_channels.next'\n                            defaultMessage='Next'\n                        />\n                    </button>\n                );\n            }\n\n            if (this.state.page > 0) {\n                previousButton = (\n                    <button\n                        className='btn btn-link filter-control filter-control__prev'\n                        onClick={this.previousPage}\n                    >\n                        <FormattedMessage\n                            id='more_channels.prev'\n                            defaultMessage='Previous'\n                        />\n                    </button>\n                );\n            }\n        }\n\n        let input = (\n            <div className='filter-row filter-row--full'>\n                <div className='col-sm-12'>\n                    <QuickInput\n                        id='searchChannelsTextbox'\n                        ref={this.filter}\n                        className='form-control filter-textbox'\n                        placeholder={{id: t('filtered_channels_list.search'), defaultMessage: 'Search channels'}}\n                        inputComponent={LocalizedInput}\n                        onInput={this.doSearch}\n                    />\n                </div>\n            </div>\n        );\n\n        if (this.props.createChannelButton) {\n            input = (\n                <div className='channel_search'>\n                    <div className='search_input'>\n                        <QuickInput\n                            id='searchChannelsTextbox'\n                            ref={this.filter}\n                            className='form-control filter-textbox'\n                            placeholder={{id: t('filtered_channels_list.search'), defaultMessage: 'Search channels'}}\n                            inputComponent={LocalizedInput}\n                            onInput={this.doSearch}\n                        />\n                    </div>\n                    <div className='create_button'>\n                        {this.props.createChannelButton}\n                    </div>\n                </div>\n            );\n        }\n\n        let channelDropdown;\n\n        if (this.props.canShowArchivedChannels) {\n            channelDropdown = (\n                <div className='more-modal__dropdown'>\n                    <MenuWrapper id='channelsMoreDropdown'>\n                        <a>\n                            <span>{this.props.shouldShowArchivedChannels ? localizeMessage('more_channels.show_archived_channels', 'Show: Archived Channels') : localizeMessage('more_channels.show_public_channels', 'Show: Public Channels')}</span>\n                            <span className='caret'/>\n                        </a>\n                        <Menu\n                            openLeft={false}\n                            ariaLabel={localizeMessage('team_members_dropdown.menuAriaLabel', 'Change the role of a team member')}\n                        >\n                            <Menu.ItemAction\n                                id='channelsMoreDropdownPublic'\n                                onClick={this.toggleArchivedChannelsOff}\n                                text={localizeMessage('suggestion.search.public', 'Public Channels')}\n                            />\n                            <Menu.ItemAction\n                                id='channelsMoreDropdownArchived'\n                                onClick={this.toggleArchivedChannelsOn}\n                                text={localizeMessage('suggestion.archive', 'Archived Channels')}\n                            />\n                        </Menu>\n                    </MenuWrapper>\n                </div>\n            );\n        }\n\n        return (\n            <div className='filtered-user-list'>\n                {input}\n                {channelDropdown}\n                <div\n                    role='application'\n                    ref='channelList'\n                    className='more-modal__list'\n                >\n                    <div\n                        id='moreChannelsList'\n                        ref={this.channelListScroll}\n                    >\n                        {listContent}\n                    </div>\n                </div>\n                <div className='filter-controls'>\n                    {previousButton}\n                    {nextButton}\n                </div>\n            </div>\n        );\n    }\n}\n\nSearchableChannelList.defaultProps = {\n    channels: [],\n    isSearch: false,\n};\n\nSearchableChannelList.propTypes = {\n    channels: PropTypes.arrayOf(PropTypes.object),\n    channelsPerPage: PropTypes.number,\n    nextPage: PropTypes.func.isRequired,\n    isSearch: PropTypes.bool,\n    search: PropTypes.func.isRequired,\n    handleJoin: PropTypes.func.isRequired,\n    noResultsText: PropTypes.object,\n    loading: PropTypes.bool,\n    createChannelButton: PropTypes.element,\n    toggleArchivedChannels: PropTypes.func.isRequired,\n    shouldShowArchivedChannels: PropTypes.bool.isRequired,\n    canShowArchivedChannels: PropTypes.bool.isRequired,\n};\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {ActionFunc, ActionResult} from 'mattermost-redux/types/actions';\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nimport {browserHistory} from 'utils/browser_history';\n\nimport {getRelativeChannelURL} from 'utils/url';\n\nimport NewChannelFlow from 'components/new_channel_flow';\nimport SearchableChannelList from 'components/searchable_channel_list.jsx';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\nimport {ModalIdentifiers} from 'utils/constants';\n\nconst CHANNELS_CHUNK_SIZE = 50;\nconst CHANNELS_PER_PAGE = 50;\nconst SEARCH_TIMEOUT_MILLISECONDS = 100;\n\ntype Actions = {\n    getChannels: (teamId: string, page: number, perPage: number) => ActionFunc | void;\n    getArchivedChannels: (teamId: string, page: number, channelsPerPage: number) => ActionFunc | void;\n    joinChannel: (currentUserId: string, teamId: string, channelId: string) => Promise<ActionResult>;\n    searchMoreChannels: (term: string, shouldShowArchivedChannels: boolean) => Promise<ActionResult>;\n    openModal: (modalData: {modalId: string; dialogType: any; dialogProps?: any}) => Promise<{\n        data: boolean;\n    }>;\n    closeModal: (modalId: string) => void;\n}\n\nexport type Props = {\n    channels: Channel[];\n    archivedChannels: Channel[];\n    currentUserId: string;\n    teamId: string;\n    teamName: string;\n    channelsRequestStarted?: boolean;\n    bodyOnly?: boolean;\n    canShowArchivedChannels?: boolean;\n    morePublicChannelsModalType?: string;\n    actions: Actions;\n}\n\ntype State = {\n    show: boolean;\n    shouldShowArchivedChannels: boolean;\n    search: boolean;\n    searchedChannels: Channel[];\n    serverError: React.ReactNode | string;\n    searching: boolean;\n    searchTerm: string;\n}\n\nexport default class MoreChannels extends React.PureComponent<Props, State> {\n    public searchTimeoutId: number;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.searchTimeoutId = 0;\n\n        this.state = {\n            show: true,\n            shouldShowArchivedChannels: this.props.morePublicChannelsModalType === 'private',\n            search: false,\n            searchedChannels: [],\n            serverError: null,\n            searching: false,\n            searchTerm: '',\n        };\n    }\n\n    componentDidMount() {\n        this.props.actions.getChannels(this.props.teamId, 0, CHANNELS_CHUNK_SIZE * 2);\n        if (this.props.canShowArchivedChannels) {\n            this.props.actions.getArchivedChannels(this.props.teamId, 0, CHANNELS_CHUNK_SIZE * 2);\n        }\n    }\n\n    handleHide = () => {\n        this.setState({show: false});\n\n        if (this.props.bodyOnly) {\n            this.handleExit();\n        }\n    }\n\n    handleNewChannel = () => {\n        this.handleExit();\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.NEW_CHANNEL_FLOW,\n            dialogType: NewChannelFlow,\n        });\n    }\n\n    handleExit = () => {\n        this.props.actions.closeModal(ModalIdentifiers.MORE_CHANNELS);\n    }\n\n    onChange = (force: boolean) => {\n        if (this.state.search && !force) {\n            return;\n        }\n\n        this.setState({\n            searchedChannels: [],\n            serverError: null,\n        });\n    }\n\n    nextPage = (page: number) => {\n        this.props.actions.getChannels(this.props.teamId, page + 1, CHANNELS_PER_PAGE);\n    }\n\n    handleJoin = async (channel: Channel, done: () => void) => {\n        const {actions, currentUserId, teamId, teamName} = this.props;\n        const result = await actions.joinChannel(currentUserId, teamId, channel.id) as { error: any };\n\n        if (result.error) {\n            this.setState({serverError: result.error.message});\n        } else {\n            browserHistory.push(getRelativeChannelURL(teamName, channel.name));\n            this.handleHide();\n        }\n\n        if (done) {\n            done();\n        }\n    }\n\n    search = (term: string) => {\n        clearTimeout(this.searchTimeoutId);\n\n        if (term === '') {\n            this.onChange(true);\n            this.setState({search: false, searchedChannels: [], searching: false, searchTerm: term});\n            this.searchTimeoutId = 0;\n            return;\n        }\n        this.setState({search: true, searching: true, searchTerm: term});\n\n        const searchTimeoutId = window.setTimeout(\n            async () => {\n                try {\n                    const {data} = await this.props.actions.searchMoreChannels(term, this.state.shouldShowArchivedChannels) as { data: any };\n                    if (searchTimeoutId !== this.searchTimeoutId) {\n                        return;\n                    }\n\n                    if (data) {\n                        this.setSearchResults(data);\n                    } else {\n                        this.setState({searchedChannels: [], searching: false});\n                    }\n                } catch (ignoredErr) {\n                    this.setState({searchedChannels: [], searching: false});\n                }\n            },\n            SEARCH_TIMEOUT_MILLISECONDS,\n        );\n\n        this.searchTimeoutId = searchTimeoutId;\n    }\n\n    setSearchResults = (channels: Channel[]) => {\n        this.setState({searchedChannels: this.state.shouldShowArchivedChannels ? channels.filter((c) => c.delete_at !== 0) : channels.filter((c) => c.delete_at === 0), searching: false});\n    }\n\n    toggleArchivedChannels = (shouldShowArchivedChannels: boolean) => {\n        // search again when switching channels to update search results\n        this.search(this.state.searchTerm);\n        this.setState({shouldShowArchivedChannels});\n    }\n\n    render() {\n        const {\n            channels,\n            archivedChannels,\n            teamId,\n            channelsRequestStarted,\n            bodyOnly,\n        } = this.props;\n\n        const {\n            search,\n            searchedChannels,\n            serverError: serverErrorState,\n            show,\n            searching,\n            shouldShowArchivedChannels,\n        } = this.state;\n\n        let activeChannels;\n\n        if (shouldShowArchivedChannels) {\n            activeChannels = search ? searchedChannels : archivedChannels;\n        } else {\n            activeChannels = search ? searchedChannels : channels;\n        }\n\n        let serverError;\n        if (serverErrorState) {\n            serverError =\n                <div className='form-group has-error'><label className='control-label'>{serverErrorState}</label></div>;\n        }\n\n        const createNewChannelButton = (\n            <TeamPermissionGate\n                teamId={teamId}\n                permissions={[Permissions.CREATE_PUBLIC_CHANNEL]}\n            >\n                <button\n                    id='createNewChannel'\n                    type='button'\n                    className='btn btn-primary channel-create-btn'\n                    onClick={this.handleNewChannel}\n                >\n                    <FormattedMessage\n                        id='more_channels.create'\n                        defaultMessage='Create Channel'\n                    />\n                </button>\n            </TeamPermissionGate>\n        );\n\n        const createChannelHelpText = (\n            <TeamPermissionGate\n                teamId={teamId}\n                permissions={[Permissions.CREATE_PUBLIC_CHANNEL, Permissions.CREATE_PRIVATE_CHANNEL]}\n            >\n                <p className='secondary-message'>\n                    <FormattedMessage\n                        id='more_channels.createClick'\n                        defaultMessage=\"Click 'Create New Channel' to make a new one\"\n                    />\n                </p>\n            </TeamPermissionGate>\n        );\n\n        const body = (\n            <React.Fragment>\n                <SearchableChannelList\n                    channels={activeChannels}\n                    channelsPerPage={CHANNELS_PER_PAGE}\n                    nextPage={this.nextPage}\n                    isSearch={search}\n                    search={this.search}\n                    handleJoin={this.handleJoin}\n                    noResultsText={createChannelHelpText}\n                    loading={search ? searching : channelsRequestStarted}\n                    createChannelButton={bodyOnly && createNewChannelButton}\n                    toggleArchivedChannels={this.toggleArchivedChannels}\n                    shouldShowArchivedChannels={this.state.shouldShowArchivedChannels}\n                    canShowArchivedChannels={this.props.canShowArchivedChannels}\n                />\n                {serverError}\n            </React.Fragment>\n        );\n\n        if (bodyOnly) {\n            return body;\n        }\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal more-modal more-modal--action'\n                show={show}\n                onHide={this.handleHide}\n                onExited={this.handleExit}\n                role='dialog'\n                id='moreChannelsModal'\n                aria-labelledby='moreChannelsModalLabel'\n            >\n                <Modal.Header\n                    id='moreChannelsModalHeader'\n                    closeButton={true}\n                >\n                    <Modal.Title\n                        componentClass='h1'\n                        id='moreChannelsModalLabel'\n                    >\n                        <FormattedMessage\n                            id='more_channels.title'\n                            defaultMessage='More Channels'\n                        />\n                    </Modal.Title>\n                    {createNewChannelButton}\n                </Modal.Header>\n                <Modal.Body>\n                    {body}\n                </Modal.Body>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {createSelector} from 'reselect';\n\nimport {RequestStatus} from 'mattermost-redux/constants';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {ActionFunc, ActionResult} from 'mattermost-redux/types/actions';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getChannels, getArchivedChannels, joinChannel} from 'mattermost-redux/actions/channels';\nimport {getOtherChannels, getChannelsInCurrentTeam} from 'mattermost-redux/selectors/entities/channels';\n\nimport {searchMoreChannels} from 'actions/channel_actions.jsx';\nimport {openModal, closeModal} from 'actions/views/modals';\n\nimport {GlobalState} from '../../types/store';\n\nimport MoreChannels from './more_channels';\n\nconst getNotArchivedOtherChannels = createSelector(\n    'getNotArchivedOtherChannels',\n    getOtherChannels,\n    (channels: Channel[]) => channels && channels.filter((c) => c.delete_at === 0),\n);\n\nconst getArchivedOtherChannels = createSelector(\n    'getArchivedOtherChannels',\n    getChannelsInCurrentTeam,\n    (channels: Channel[]) => channels && channels.filter((c) => c.delete_at !== 0),\n);\n\nfunction mapStateToProps(state: GlobalState) {\n    const team = getCurrentTeam(state) || {};\n\n    return {\n        channels: getNotArchivedOtherChannels(state) || [],\n        archivedChannels: getArchivedOtherChannels(state) || [],\n        currentUserId: getCurrentUserId(state),\n        teamId: team.id,\n        teamName: team.name,\n        channelsRequestStarted: state.requests.channels.getChannels.status === RequestStatus.STARTED,\n        canShowArchivedChannels: (getConfig(state).ExperimentalViewArchivedChannels === 'true'),\n    };\n}\n\ntype Actions = {\n    getChannels: (teamId: string, page: number, perPage: number) => ActionFunc | void;\n    getArchivedChannels: (teamId: string, page: number, channelsPerPage: number) => ActionFunc | void;\n    joinChannel: (currentUserId: string, teamId: string, channelId: string) => Promise<ActionResult>;\n    searchMoreChannels: (term: string, shouldShowArchivedChannels: boolean) => Promise<ActionResult>;\n    openModal: (modalData: {modalId: string; dialogType: any; dialogProps?: any}) => Promise<{\n        data: boolean;\n    }>;\n    closeModal: (modalId: string) => void;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            getChannels,\n            getArchivedChannels,\n            joinChannel,\n            searchMoreChannels,\n            openModal,\n            closeModal,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MoreChannels);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createSelector} from 'reselect';\n\nimport {getCurrentChannelId, getUsers} from 'mattermost-redux/selectors/entities/common';\nimport {getTeammateNameDisplaySetting} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {Typing} from 'mattermost-redux/types/typing';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {IDMappedObjects} from 'mattermost-redux/types/utilities';\n\nimport {displayUsername} from 'mattermost-redux/utils/user_utils';\n\nconst getUsersTypingImpl = (profiles: IDMappedObjects<UserProfile>, teammateNameDisplay: string, channelId: string, parentPostId: string, typing: Typing): string[] => {\n    const id = channelId + parentPostId;\n\n    if (typing[id]) {\n        const users = Object.keys(typing[id]);\n\n        if (users.length) {\n            return users.map((userId) => {\n                return displayUsername(profiles[userId], teammateNameDisplay);\n            });\n        }\n    }\n\n    return [];\n};\n\nexport function makeGetUsersTypingByChannelAndPost(): (state: GlobalState, props: {channelId: string; postId: string}) => string[] {\n    return createSelector(\n        'makeGetUsersTypingByChannelAndPost',\n        getUsers,\n        getTeammateNameDisplaySetting,\n        (state: GlobalState, options: {channelId: string; postId: string}) => options.channelId,\n        (state: GlobalState, options: {channelId: string; postId: string}) => options.postId,\n        (state: GlobalState) => state.entities.typing,\n        getUsersTypingImpl,\n    );\n}\n\nexport const getUsersTyping: (state: GlobalState) => string[] = createSelector(\n    'getUsersTyping',\n    getUsers,\n    getTeammateNameDisplaySetting,\n    getCurrentChannelId,\n    (state) => state.entities.posts.selectedPostId,\n    (state) => state.entities.typing,\n    getUsersTypingImpl,\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\ntype Props = {\n    typingUsers: string[];\n}\n\nexport default class MsgTyping extends React.PureComponent<Props> {\n    private getTypingText = () => {\n        let users: string[] = [];\n        let numUsers = 0;\n        if (this.props.typingUsers) {\n            users = [...this.props.typingUsers];\n            numUsers = users.length;\n        }\n\n        if (numUsers === 0) {\n            return '';\n        }\n        if (numUsers === 1) {\n            return (\n                <FormattedMessage\n                    id='msg_typing.isTyping'\n                    defaultMessage='{user} is typing...'\n                    values={{\n                        user: users[0],\n                    }}\n                />\n            );\n        }\n        const last = users.pop();\n        return (\n            <FormattedMessage\n                id='msg_typing.areTyping'\n                defaultMessage='{users} and {last} are typing...'\n                values={{\n                    users: (users.join(', ')),\n                    last,\n                }}\n            />\n        );\n    }\n\n    public render() {\n        return (\n            <span className='msg-typing'>{this.getTypingText()}</span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {makeGetUsersTypingByChannelAndPost} from 'mattermost-redux/selectors/entities/typing';\n\nimport {GlobalState} from 'types/store';\n\nimport MsgTyping from './msg_typing';\n\ntype Props = {\n    channelId: string;\n    postId: string;\n};\n\nfunction makeMapStateToProps() {\n    const getUsersTypingByChannelAndPost = makeGetUsersTypingByChannelAndPost();\n\n    return function mapStateToProps(state: GlobalState, ownProps: Props) {\n        const typingUsers = getUsersTypingByChannelAndPost(state, {channelId: ownProps.channelId, postId: ownProps.postId});\n\n        return {\n            typingUsers,\n        };\n    };\n}\n\nexport default connect(makeMapStateToProps)(MsgTyping);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport React from 'react';\n\nimport {getOptionValue} from 'react-select/src/builtins';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport Constants from 'utils/constants';\nimport {cmdOrCtrlPressed} from 'utils/utils.jsx';\n\nimport LoadingScreen from 'components/loading_screen';\n\nimport {Value} from './multiselect';\n\nexport type Props<T extends Value> = {\n    ariaLabelRenderer: getOptionValue<T>;\n    loading?: boolean;\n    onAdd: (value: T) => void;\n    onPageChange?: (newPage: number, currentPage: number) => void;\n    onSelect: (value: T | null) => void;\n    optionRenderer: (\n        option: T,\n        isSelected: boolean,\n        add: (value: T) => void,\n        select: (value: T) => void\n    ) => void;\n    query?: string;\n    selectedItemRef?: React.RefObject<HTMLDivElement>;\n    options: T[];\n    page: number;\n    perPage: number;\n}\n\ntype State = {\n    selected: number;\n}\nconst KeyCodes = Constants.KeyCodes;\n\nexport default class MultiSelectList<T extends Value> extends React.PureComponent<Props<T>, State> {\n    public static defaultProps = {\n        options: [],\n        perPage: 50,\n        onAction: () => null,\n    };\n\n    private toSelect = -1\n    private listRef = React.createRef<HTMLDivElement>()\n    private selectedItemRef = React.createRef<HTMLDivElement>()\n\n    public constructor(props: Props<T>) {\n        super(props);\n\n        this.state = {\n            selected: -1,\n        };\n    }\n\n    public componentDidMount() {\n        document.addEventListener('keydown', this.handleArrowPress);\n    }\n\n    public componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleArrowPress);\n    }\n\n    public componentDidUpdate(_: Props<T>, prevState: State) {\n        const options = this.props.options;\n        if (options && options.length > 0 && this.state.selected >= 0) {\n            this.props.onSelect(options[this.state.selected]);\n        }\n\n        if (prevState.selected === this.state.selected) {\n            return;\n        }\n\n        const selectRef = this.selectedItemRef.current || this.props.selectedItemRef?.current;\n        if (this.listRef.current && selectRef) {\n            const elemTop = selectRef.getBoundingClientRect().top;\n            const elemBottom = selectRef.getBoundingClientRect().bottom;\n            const listTop = this.listRef.current.getBoundingClientRect().top;\n            const listBottom = this.listRef.current.getBoundingClientRect().bottom;\n            if (elemBottom > listBottom) {\n                selectRef.scrollIntoView(false);\n            } else if (elemTop < listTop) {\n                selectRef.scrollIntoView(true);\n            }\n        }\n    }\n\n    // setSelected updates the selected index and is referenced\n    // externally by the MultiSelect component.\n    public setSelected = (selected: number) => {\n        this.setState({selected});\n    }\n\n    private handleArrowPress = (e: KeyboardEvent) => {\n        if (cmdOrCtrlPressed(e) && e.shiftKey) {\n            return;\n        }\n\n        const options = this.props.options;\n        if (options.length === 0) {\n            return;\n        }\n\n        let selected;\n        switch (e.key) {\n        case KeyCodes.DOWN[0]:\n            if (this.state.selected === -1) {\n                selected = 0;\n                break;\n            }\n            selected = Math.min(this.state.selected + 1, options.length - 1);\n            break;\n        case KeyCodes.UP[0]:\n            if (this.state.selected === -1) {\n                selected = 0;\n                break;\n            }\n            selected = Math.max(this.state.selected - 1, 0);\n            break;\n        default:\n            return;\n        }\n\n        e.preventDefault();\n        this.setState({selected});\n        this.props.onSelect(options[selected]);\n    }\n\n    private defaultOptionRenderer = (\n        option: T,\n        isSelected: boolean,\n        add: (value: T) => void,\n        select: (value: T) => void,\n    ) => {\n        let rowSelected = '';\n        if (isSelected) {\n            rowSelected = 'more-modal__row--selected';\n        }\n\n        return (\n            <div\n                ref={isSelected ? this.selectedItemRef : option.value}\n                className={rowSelected}\n                key={'multiselectoption' + option.value}\n                onClick={() => add(option)}\n                onMouseEnter={() => select(option)}\n            >\n                {option.label}\n            </div>\n        );\n    }\n\n    private select = (option: T) => {\n        const i = this.props.options.indexOf(option);\n        if (i !== -1) {\n            if (this.state.selected !== i) {\n                this.setSelected(i);\n            }\n        }\n    }\n\n    public render() {\n        const options = this.props.options;\n        let renderOutput;\n\n        if (this.props.loading) {\n            renderOutput = (\n                <div aria-hidden={true}>\n                    <LoadingScreen\n                        position='absolute'\n                        key='loading'\n                    />\n                </div>\n            );\n        } else if (options == null || options.length === 0) {\n            renderOutput = (\n                <div\n                    key='no-users-found'\n                    className='no-channel-message'\n                >\n                    <p className='primary-message'>\n                        <FormattedMarkdownMessage\n                            id='multiselect.list.notFound'\n                            defaultMessage='No results found matching **{searchQuery}**'\n                            values={{\n                                searchQuery: this.props.query,\n                            }}\n                        />\n                    </p>\n                </div>\n            );\n        } else {\n            let renderer: Props<T>['optionRenderer'];\n            if (this.props.optionRenderer) {\n                renderer = this.props.optionRenderer;\n            } else {\n                renderer = this.defaultOptionRenderer;\n            }\n\n            const optionControls = options.map((o, i) => renderer(o, this.state.selected === i, this.props.onAdd, this.select));\n\n            const selectedOption = options[this.state.selected];\n            const ariaLabel = this.props.ariaLabelRenderer(selectedOption);\n\n            renderOutput = (\n                <div className='more-modal__list'>\n                    <div\n                        className='sr-only'\n                        aria-live='polite'\n                        aria-atomic='true'\n                    >\n                        {ariaLabel}\n                    </div>\n                    <div\n                        ref={this.listRef}\n                        id='multiSelectList'\n                        className='more-modal__options'\n                        role='presentation'\n                        aria-hidden={true}\n                    >\n                        {optionControls}\n                    </div>\n                </div>\n            );\n        }\n\n        return (\n            <div\n                className='multi-select__wrapper'\n                aria-live='polite'\n            >\n                {renderOutput}\n            </div>\n        );\n    }\n}\n\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ReactNode} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport ReactSelect, {components} from 'react-select';\n\nimport {InputActionMeta} from 'react-select/src/types';\nimport {getOptionValue} from 'react-select/src/builtins';\n\nimport {imageURLForUser, getDisplayName} from 'utils/utils.jsx';\nimport CloseCircleSolidIcon from 'components/widgets/icons/close_circle_solid_icon';\nimport {Constants, A11yCustomEventTypes} from 'utils/constants';\nimport SaveButton from 'components/save_button';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport MultiSelectList from './multiselect_list';\n\nexport type Value = {\n    deleteAt?: number;\n    display_name?: string;\n    id: string;\n    label: string;\n    scheme_id?: string;\n    value: string;\n};\n\nexport type Props<T extends Value> = {\n    ariaLabelRenderer: getOptionValue<T>;\n    buttonSubmitLoadingText?: ReactNode;\n    buttonSubmitText?: ReactNode;\n    handleAdd: (value: T) => void;\n    handleDelete: (values: T[]) => void;\n    handleInput: (input: string, multiselect: MultiSelect<T>) => void;\n    handlePageChange?: (newPage: number, currentPage: number) => void;\n    handleSubmit: (value?: T[]) => void;\n    loading?: boolean;\n    saveButtonPosition?: string;\n    maxValues?: number;\n    noteText?: ReactNode;\n    numRemainingText?: ReactNode;\n    optionRenderer: (\n        option: T,\n        isSelected: boolean,\n        add: (value: T) => void,\n        select: (value: T) => void\n    ) => void;\n    selectedItemRef?: React.RefObject<HTMLDivElement>;\n    options: T[];\n    perPage: number;\n    placeholderText?: string;\n    saving?: boolean;\n    submitImmediatelyOn?: (value: T) => void;\n    totalCount?: number;\n    users?: unknown[];\n    valueWithImage: boolean;\n    valueRenderer?: (props: {data: T}) => any;\n    values: T[];\n}\n\nexport type State = {\n    a11yActive: boolean;\n    input: string;\n    page: number;\n}\n\nconst KeyCodes = Constants.KeyCodes;\n\nexport default class MultiSelect<T extends Value> extends React.PureComponent<Props<T>, State> {\n    private listRef = React.createRef<MultiSelectList<T>>()\n    private reactSelectRef = React.createRef<ReactSelect>()\n    private selected: T | null = null\n\n    public static defaultProps = {\n        ariaLabelRenderer: defaultAriaLabelRenderer,\n        saveButtonPosition: 'top',\n        valueWithImage: false,\n    }\n\n    public constructor(props: Props<T>) {\n        super(props);\n\n        this.state = {\n            a11yActive: false,\n            page: 0,\n            input: '',\n        };\n    }\n\n    public componentDidMount() {\n        const inputRef: unknown = this.reactSelectRef.current && this.reactSelectRef.current.select.inputRef;\n\n        document.addEventListener<'keydown'>('keydown', this.handleEnterPress);\n        if (inputRef && typeof (inputRef as HTMLElement).addEventListener === 'function') {\n            (inputRef as HTMLElement).addEventListener(A11yCustomEventTypes.ACTIVATE, this.handleA11yActivateEvent);\n            (inputRef as HTMLElement).addEventListener(A11yCustomEventTypes.DEACTIVATE, this.handleA11yDeactivateEvent);\n\n            this.reactSelectRef.current!.focus(); // known from ternary definition of inputRef\n        }\n    }\n\n    public componentWillUnmount() {\n        const inputRef: unknown = this.reactSelectRef.current && this.reactSelectRef.current.select.inputRef;\n\n        if (inputRef && typeof (inputRef as HTMLElement).addEventListener === 'function') {\n            (inputRef as HTMLElement).removeEventListener(A11yCustomEventTypes.ACTIVATE, this.handleA11yActivateEvent);\n            (inputRef as HTMLElement).removeEventListener(A11yCustomEventTypes.DEACTIVATE, this.handleA11yDeactivateEvent);\n        }\n\n        document.removeEventListener('keydown', this.handleEnterPress);\n    }\n\n    private handleA11yActivateEvent = () => {\n        this.setState({a11yActive: true});\n    }\n\n    private handleA11yDeactivateEvent = () => {\n        this.setState({a11yActive: false});\n    }\n\n    private nextPage = () => {\n        if (this.props.handlePageChange) {\n            this.props.handlePageChange(this.state.page + 1, this.state.page);\n        }\n        if (this.listRef.current) {\n            this.listRef.current.setSelected(0);\n        }\n        this.setState({page: this.state.page + 1});\n    }\n\n    private prevPage = () => {\n        if (this.state.page === 0) {\n            return;\n        }\n\n        if (this.props.handlePageChange) {\n            this.props.handlePageChange(this.state.page - 1, this.state.page);\n        }\n\n        if (this.listRef.current) {\n            this.listRef.current.setSelected(0);\n        }\n        this.setState({page: this.state.page - 1});\n    }\n\n    public resetPaging = () => {\n        this.setState({page: 0});\n    }\n\n    private onSelect = (selected: T | null) => {\n        this.selected = selected;\n    }\n\n    private onAdd = (value: T) => {\n        if (this.props.maxValues && this.props.values.length >= this.props.maxValues) {\n            return;\n        }\n\n        for (let i = 0; i < this.props.values.length; i++) {\n            if (this.props.values[i].id === value.id) {\n                return;\n            }\n        }\n\n        this.props.handleAdd(value);\n        this.selected = null;\n\n        if (this.reactSelectRef.current) {\n            this.reactSelectRef.current.select.handleInputChange(\n                {currentTarget: {value: ''}} as React.KeyboardEvent<HTMLInputElement>,\n            );\n            this.reactSelectRef.current.focus();\n        }\n\n        const submitImmediatelyOn = this.props.submitImmediatelyOn;\n        if (submitImmediatelyOn && submitImmediatelyOn(value)) {\n            this.props.handleSubmit([value]);\n        }\n    }\n\n    private onInput = (input: string, change: InputActionMeta) => {\n        if (!change) {\n            return;\n        }\n\n        if (change.action === 'input-blur' || change.action === 'menu-close') {\n            return;\n        }\n\n        if (this.state.input === input) {\n            return;\n        }\n\n        this.setState({input});\n\n        if (this.listRef.current) {\n            if (input === '') {\n                this.listRef.current.setSelected(-1);\n            } else {\n                this.listRef.current.setSelected(0);\n            }\n        }\n        this.selected = null;\n\n        this.props.handleInput(input, this);\n    }\n\n    private onInputKeyDown = (e: React.KeyboardEvent) => {\n        switch (e.key) {\n        case KeyCodes.ENTER[0]:\n            e.preventDefault();\n            break;\n        }\n    }\n\n    private handleEnterPress = (e: KeyboardEvent) => {\n        switch (e.key) {\n        case KeyCodes.ENTER[0]:\n            if (this.selected == null) {\n                this.props.handleSubmit();\n                return;\n            }\n            this.onAdd(this.selected);\n            break;\n        }\n    }\n\n    private handleOnClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n        e.preventDefault();\n        this.props.handleSubmit();\n    }\n\n    private onChange: ReactSelect['onChange'] = (_, change) => {\n        if (change.action !== 'remove-value' && change.action !== 'pop-value') {\n            return;\n        }\n\n        const values = [...this.props.values];\n        for (let i = 0; i < values.length; i++) {\n            // Types of ReactSelect do not match the behavior here,\n            if (values[i].id === (change as any).removedValue.id) {\n                values.splice(i, 1);\n                break;\n            }\n        }\n\n        this.props.handleDelete(values);\n    }\n\n    MultiValueRemove = ({children, innerProps}: any) => (\n        <div {...innerProps}>\n            {children || <CloseCircleSolidIcon/>}\n        </div>\n    );\n\n    formatOptionLabel = (user: any) => {\n        const profileImg = imageURLForUser(user.id, user.last_picture_update);\n\n        return (\n            <React.Fragment>\n                <Avatar\n                    size='sm'\n                    username={user.username}\n                    url={profileImg}\n                />\n                <div className='react-select__value__name'>\n                    {getDisplayName(user)}\n                </div>\n            </React.Fragment>\n        );\n    }\n\n    valueRenderer = (props: any) => {\n        return this.props.valueWithImage ? <components.MultiValueLabel {...props}/> : this.props.valueRenderer;\n    }\n\n    public render() {\n        const options = Object.assign([...this.props.options]);\n        const {totalCount, users, values} = this.props;\n\n        let numRemainingText;\n        if (this.props.numRemainingText) {\n            numRemainingText = this.props.numRemainingText;\n        } else if (this.props.maxValues != null) {\n            numRemainingText = (\n                <FormattedMessage\n                    id='multiselect.numRemaining'\n                    defaultMessage='Up to {max, number} can be added at a time. You have {num, number} remaining.'\n                    values={{\n                        max: this.props.maxValues,\n                        num: this.props.maxValues - this.props.values.length,\n                    }}\n                />\n            );\n        }\n\n        let buttonSubmitText: ReactNode;\n        if (this.props.buttonSubmitText) {\n            buttonSubmitText = this.props.buttonSubmitText;\n        } else if (this.props.maxValues != null) {\n            buttonSubmitText = (\n                <FormattedMessage\n                    id='multiselect.go'\n                    defaultMessage='Go'\n                />\n            );\n        }\n\n        let optionsToDisplay = [];\n        let nextButton;\n        let previousButton;\n        let noteTextContainer;\n\n        if (this.props.noteText) {\n            noteTextContainer = (\n                <div className='multi-select__note'>\n                    <div className='note__icon'>\n                        <FormattedMessage\n                            id='generic_icons.info'\n                            defaultMessage='Info Icon'\n                        >\n                            {(title) => (\n                                <span\n                                    className='fa fa-info'\n                                    title={title as string}\n                                />\n                            )}\n                        </FormattedMessage>\n                    </div>\n                    <div>{this.props.noteText}</div>\n                </div>\n            );\n        }\n\n        const valueMap: Record<string, boolean> = {};\n        for (let i = 0; i < values.length; i++) {\n            valueMap[values[i].id] = true;\n        }\n\n        for (let i = options.length - 1; i >= 0; i--) {\n            if (valueMap[options[i].id]) {\n                options.splice(i, 1);\n            }\n        }\n\n        if (options && options.length > this.props.perPage) {\n            const pageStart = this.state.page * this.props.perPage;\n            const pageEnd = pageStart + this.props.perPage;\n            optionsToDisplay = options.slice(pageStart, pageEnd);\n            if (!this.props.loading) {\n                if (options.length > pageEnd) {\n                    nextButton = (\n                        <button\n                            className='btn btn-link filter-control filter-control__next'\n                            onClick={this.nextPage}\n                        >\n                            <FormattedMessage\n                                id='filtered_user_list.next'\n                                defaultMessage='Next'\n                            />\n                        </button>\n                    );\n                }\n\n                if (this.state.page > 0) {\n                    previousButton = (\n                        <button\n                            className='btn btn-link filter-control filter-control__prev'\n                            onClick={this.prevPage}\n                        >\n                            <FormattedMessage\n                                id='filtered_user_list.prev'\n                                defaultMessage='Previous'\n                            />\n                        </button>\n                    );\n                }\n            }\n        } else {\n            optionsToDisplay = options;\n        }\n\n        let multiSelectList;\n\n        if (this.props.saveButtonPosition === 'bottom') {\n            if (this.state.input) {\n                multiSelectList = (\n                    <MultiSelectList\n                        ref={this.listRef}\n                        options={optionsToDisplay}\n                        optionRenderer={this.props.optionRenderer}\n                        ariaLabelRenderer={this.props.ariaLabelRenderer}\n                        page={this.state.page}\n                        perPage={this.props.perPage}\n                        onPageChange={this.props.handlePageChange}\n                        onAdd={this.onAdd}\n                        onSelect={this.onSelect}\n                        loading={this.props.loading}\n                        query={this.state.input}\n                        selectedItemRef={this.props.selectedItemRef}\n                    />\n                );\n            }\n        } else {\n            multiSelectList = (\n                <MultiSelectList\n                    ref={this.listRef}\n                    options={optionsToDisplay}\n                    optionRenderer={this.props.optionRenderer}\n                    ariaLabelRenderer={this.props.ariaLabelRenderer}\n                    page={this.state.page}\n                    perPage={this.props.perPage}\n                    onPageChange={this.props.handlePageChange}\n                    onAdd={this.onAdd}\n                    onSelect={this.onSelect}\n                    loading={this.props.loading}\n                    selectedItemRef={this.props.selectedItemRef}\n                />\n            );\n        }\n\n        let memberCount;\n        if (users && users.length && totalCount) {\n            memberCount = (\n                <FormattedMessage\n                    id='multiselect.numMembers'\n                    defaultMessage='{memberOptions, number} of {totalCount, number} members'\n                    values={{\n                        memberOptions: optionsToDisplay.length,\n                        totalCount: this.props.totalCount,\n                    }}\n                />\n            );\n        }\n\n        return (\n            <React.Fragment>\n                <div className='filtered-user-list'>\n                    <div className='filter-row filter-row--full'>\n                        <div className='multi-select__container react-select'>\n                            <ReactSelect\n                                id='selectItems'\n                                ref={this.reactSelectRef as React.RefObject<any>} // type of ref on @types/react-select is outdated\n                                isMulti={true}\n                                options={this.props.options}\n                                styles={styles}\n                                components={{\n                                    Menu: nullComponent,\n                                    IndicatorsContainer: nullComponent,\n                                    MultiValueLabel: this.props.valueWithImage ? components.MultiValueLabel : paddedComponent(this.props.valueRenderer),\n                                    MultiValueRemove: this.props.valueWithImage ? this.MultiValueRemove : components.MultiValueRemove,\n                                }}\n                                isClearable={false}\n                                openMenuOnFocus={false}\n                                menuIsOpen={false}\n                                onInputChange={this.onInput}\n                                onKeyDown={this.onInputKeyDown as React.KeyboardEventHandler}\n                                onChange={this.onChange}\n                                value={this.props.values}\n                                formatOptionLabel={this.props.valueWithImage ? this.formatOptionLabel : undefined}\n                                placeholder={this.props.placeholderText}\n                                inputValue={this.state.input}\n                                getOptionValue={(option: Value) => option.id}\n                                getOptionLabel={this.props.ariaLabelRenderer}\n                                aria-label={this.props.placeholderText}\n                                className={this.state.a11yActive ? 'multi-select__focused' : ''}\n                                classNamePrefix='react-select-auto react-select'\n                            />\n                            {this.props.saveButtonPosition === 'top' &&\n                            <SaveButton\n                                id='saveItems'\n                                saving={this.props.saving}\n                                disabled={this.props.saving}\n                                onClick={this.handleOnClick}\n                                defaultMessage={buttonSubmitText}\n                                savingMessage={this.props.buttonSubmitLoadingText}\n                            />}\n                        </div>\n                        <div\n                            id='multiSelectHelpMemberInfo'\n                            className='multi-select__help'\n                        >\n                            {numRemainingText}\n                            {memberCount}\n                        </div>\n                    </div>\n                    {multiSelectList}\n                    <div\n                        id='multiSelectMessageNote'\n                        className='multi-select__help'\n                    >\n                        {noteTextContainer}\n                    </div>\n                    {this.props.saveButtonPosition === 'top' &&\n                    <div className='filter-controls'>\n                        {previousButton}\n                        {nextButton}\n                    </div>}\n                </div>\n                {this.props.saveButtonPosition === 'bottom' &&\n                <div className='multi-select__footer'>\n                    <SaveButton\n                        id='saveItems'\n                        saving={this.props.saving}\n                        disabled={this.props.saving}\n                        onClick={this.handleOnClick}\n                        defaultMessage={buttonSubmitText}\n                        savingMessage={this.props.buttonSubmitLoadingText}\n                    />\n                </div>}\n            </React.Fragment>\n        );\n    }\n}\n\nfunction defaultAriaLabelRenderer(option: Value) {\n    if (!option) {\n        return null;\n    }\n    return option.label;\n}\n\nconst nullComponent = () => null;\n\nconst paddedComponent = (WrappedComponent: any) => {\n    return (props: {data: any}) => {\n        return (\n            <div className='react-select__padded-component'>\n                <WrappedComponent {...props}/>\n            </div>\n        );\n    };\n};\n\nconst styles = {\n    container: () => {\n        return {\n            display: 'table-cell',\n            verticalAlign: 'top',\n            width: '100%',\n        };\n    },\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport GlobeIcon from 'components/widgets/icons/globe_icon';\nimport LockIcon from 'components/widgets/icons/lock_icon';\nimport LocalizedInput from 'components/localized_input/localized_input';\nimport Constants from 'utils/constants.jsx';\nimport {getShortenedURL} from 'utils/url';\nimport * as Utils from 'utils/utils.jsx';\nimport {t} from 'utils/i18n.jsx';\n\nexport default class NewChannelModal extends React.PureComponent {\n    static propTypes = {\n\n        /**\n         * Set whether to show the modal or not\n         */\n        show: PropTypes.bool.isRequired,\n\n        /**\n         * The type of channel to create, 'O' or 'P'\n         */\n        channelType: PropTypes.string.isRequired,\n\n        /**\n         * The data needed to create the channel\n         */\n        channelData: PropTypes.object.isRequired,\n\n        /**\n         * Set to force form submission on CTRL/CMD + ENTER instead of ENTER\n         */\n        ctrlSend: PropTypes.bool,\n\n        /**\n         * Server error from failed channel creation\n         */\n        serverError: PropTypes.node,\n\n        /**\n         * Function used to submit the channel\n         */\n        onSubmitChannel: PropTypes.func.isRequired,\n\n        /**\n         * Function to call when modal is dimissed\n         */\n        onModalDismissed: PropTypes.func.isRequired,\n\n        /**\n         * Function to call when modal has exited\n         */\n        onModalExited: PropTypes.func,\n\n        /**\n         * Function to call to switch channel type\n         */\n        onTypeSwitched: PropTypes.func.isRequired,\n\n        /**\n         * Function to call when edit URL button is pressed\n         */\n        onChangeURLPressed: PropTypes.func.isRequired,\n\n        /**\n         * Function to call when channel data is modified\n         */\n        onDataChanged: PropTypes.func.isRequired,\n\n        /**\n         * Permission to create public channel\n         */\n        canCreatePublicChannel: PropTypes.bool.isRequired,\n\n        /**\n         * Permission to create private channel\n         */\n        canCreatePrivateChannel: PropTypes.bool.isRequired,\n    }\n\n    static getDerivedStateFromProps(props) {\n        if (props.show === false) {\n            return {displayNameError: ''};\n        }\n\n        return null;\n    }\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            displayNameError: '',\n        };\n\n        this.channelHeaderInput = React.createRef();\n        this.channelPurposeInput = React.createRef();\n        this.displayNameInput = React.createRef();\n    }\n\n    onEnterKeyDown = (e) => {\n        const enterPressed = Utils.isKeyPressed(e, Constants.KeyCodes.ENTER);\n        const {ctrlSend} = this.props;\n\n        // Enter pressed alone without required cmd or ctrl key\n        if (ctrlSend && enterPressed && !e.ctrlKey) {\n            e.preventDefault();\n        } else if ((ctrlSend && enterPressed && e.ctrlKey) || (!ctrlSend && enterPressed && !e.shiftKey && !e.altKey)) {\n            this.handleSubmit(e);\n        }\n    }\n\n    handleSubmit = (e) => {\n        e.preventDefault();\n\n        const displayName = this.displayNameInput.current.value.trim();\n        if (displayName.length < Constants.MIN_CHANNELNAME_LENGTH) {\n            this.setState({displayNameError: true});\n            return;\n        }\n\n        this.props.onSubmitChannel();\n    }\n\n    handleChange = () => {\n        const newData = {\n            displayName: this.displayNameInput.current.value,\n            header: this.channelHeaderInput.current.value,\n            purpose: this.channelPurposeInput.current.value,\n        };\n        this.props.onDataChanged(newData);\n    }\n\n    handleOnURLChange = (e) => {\n        e.preventDefault();\n        if (this.props.onChangeURLPressed) {\n            this.props.onChangeURLPressed();\n        }\n    }\n\n    handlePublicTypeSelect = () => {\n        this.props.onTypeSwitched('O');\n    }\n\n    handlePrivateTypeSelect = () => {\n        this.props.onTypeSwitched('P');\n    }\n\n    render() {\n        const {canCreatePublicChannel, canCreatePrivateChannel} = this.props;\n\n        const enableTypeSelection = canCreatePublicChannel && canCreatePrivateChannel;\n        var displayNameError = null;\n        var serverError = null;\n        var displayNameClass = 'form-group';\n\n        if (this.state.displayNameError) {\n            displayNameError = (\n                <p className='input__help error'>\n                    <FormattedMessage\n                        id='channel_modal.displayNameError'\n                        defaultMessage='Display name must have at least 2 characters.'\n                    />\n                    {this.state.displayNameError}\n                </p>\n            );\n            displayNameClass += ' has-error';\n        }\n\n        if (this.props.serverError) {\n            serverError = (\n                <div className='form-group has-error'>\n                    <div className='col-sm-12'>\n                        <p\n                            id='createChannelError'\n                            className='input__help error'\n                        >\n                            {this.props.serverError}\n                        </p>\n                    </div>\n                </div>\n            );\n        }\n\n        const publicChannelDesc = (\n            <div className='flex-parent'>\n                <GlobeIcon className='icon icon__globe icon--body type-icon'/>\n                <FormattedMessage\n                    id='channel_modal.publicName'\n                    defaultMessage='Public'\n                />\n                <FormattedMessage\n                    id='channel_modal.publicHint'\n                    defaultMessage=' - Anyone can join this channel'\n                />\n            </div>\n        );\n\n        const privateChannelDesc = (\n            <div className='flex-parent'>\n                <LockIcon className='icon icon__lock icon--body type-icon'/>\n                <FormattedMessage\n                    id='channel_modal.privateName'\n                    defaultMessage='Private'\n                />\n                <FormattedMessage\n                    id='channel_modal.privateHint'\n                    defaultMessage=' - Only invited members can join this channel'\n                />\n            </div>\n        );\n\n        let typeOptions = null;\n        if (enableTypeSelection) {\n            typeOptions = (\n                <fieldset\n                    key='channelType'\n                    className='multi-select__radio'\n                >\n                    <div className='radio'>\n                        <label>\n                            <input\n                                id='public'\n                                type='radio'\n                                name='channelType'\n                                checked={this.props.channelType === 'O'}\n                                onChange={this.handlePublicTypeSelect}\n                                aria-labelledby='channelModalTypeLabel'\n                            />\n                            {publicChannelDesc}\n                        </label>\n                    </div>\n                    <div className='radio'>\n                        <label>\n                            <input\n                                id='private'\n                                type='radio'\n                                name='channelType'\n                                checked={this.props.channelType === 'P'}\n                                onChange={this.handlePrivateTypeSelect}\n                                aria-labelledby='channelModalTypeLabel'\n                            />\n                            {privateChannelDesc}\n                        </label>\n                    </div>\n                </fieldset>\n            );\n        } else {\n            typeOptions = (\n                <div className='type-container multi-select__radio'>\n                    <div className='radio'>\n                        {canCreatePublicChannel ? publicChannelDesc : null}\n                        {canCreatePrivateChannel ? privateChannelDesc : null}\n                    </div>\n                </div>\n            );\n        }\n\n        const prettyTeamURL = getShortenedURL();\n\n        return (\n            <span>\n                <Modal\n                    dialogClassName='a11y__modal new-channel__modal new-channel'\n                    show={this.props.show}\n                    bsSize='large'\n                    onHide={this.props.onModalDismissed}\n                    onExited={this.props.onModalExited}\n                    autoFocus={true}\n                    restoreFocus={true}\n                    role='dialog'\n                    aria-labelledby='newChannelModalLabel'\n                >\n                    <Modal.Header>\n                        <button\n                            type='button'\n                            className='close'\n                            onClick={this.props.onModalDismissed}\n                            aria-label='Close'\n                            title='Close'\n                        >\n                            <span aria-hidden='true'>{'×'}</span>\n                        </button>\n                        <Modal.Title\n                            componentClass='h1'\n                            id='newChannelModalLabel'\n                        >\n                            <FormattedMessage\n                                id='channel_modal.modalTitle'\n                                defaultMessage='New Channel'\n                            />\n                        </Modal.Title>\n                    </Modal.Header>\n                    <form\n                        role='form'\n                        className='form-horizontal'\n                    >\n                        <Modal.Body>\n                            <div className='form-group'>\n                                <label\n                                    className='col-sm-3 form__label control-label'\n                                    id='channelModalTypeLabel'\n                                >\n                                    <FormattedMessage\n                                        id='channel_modal.type'\n                                        defaultMessage='Type'\n                                    />\n                                </label>\n                                <div className='col-sm-9'>\n                                    {typeOptions}\n                                </div>\n                            </div>\n                            <div className={displayNameClass}>\n                                <label\n                                    className='col-sm-3 form__label control-label'\n                                    htmlFor='newChannelName'\n                                >\n                                    <FormattedMessage\n                                        id='channel_modal.name'\n                                        defaultMessage='Name'\n                                    />\n                                </label>\n                                <div className='col-sm-9'>\n                                    <LocalizedInput\n                                        id='newChannelName'\n                                        onChange={this.handleChange}\n                                        type='text'\n                                        ref={this.displayNameInput}\n                                        className='form-control'\n                                        placeholder={{id: t('channel_modal.nameEx'), defaultMessage: 'E.g.: \"Bugs\", \"Marketing\", \"客户支持\"'}}\n                                        maxLength={Constants.MAX_CHANNELNAME_LENGTH}\n                                        value={this.props.channelData.displayName}\n                                        autoFocus={true}\n                                        onKeyDown={this.onEnterKeyDown}\n                                    />\n                                    {displayNameError}\n                                    <p className='input__help dark'>\n                                        {'URL: ' + prettyTeamURL + this.props.channelData.name + ' ('}\n                                        <button\n                                            className='color--link style--none'\n                                            onClick={this.handleOnURLChange}\n                                        >\n                                            <FormattedMessage\n                                                id='channel_modal.edit'\n                                                defaultMessage='Edit'\n                                            />\n                                        </button>\n                                        {')'}\n                                    </p>\n                                </div>\n                            </div>\n                            <div className='form-group'>\n                                <div className='col-sm-3'>\n                                    <label\n                                        className='form__label control-label'\n                                        htmlFor='newChannelPurpose'\n                                    >\n                                        <FormattedMessage\n                                            id='channel_modal.purpose'\n                                            defaultMessage='Purpose'\n                                        />\n                                    </label>\n                                    <label className='form__label light'>\n                                        <FormattedMessage\n                                            id='channel_modal.optional'\n                                            defaultMessage='(optional)'\n                                        />\n                                    </label>\n                                </div>\n                                <div className='col-sm-9'>\n                                    <textarea\n                                        id='newChannelPurpose'\n                                        className='form-control no-resize'\n                                        ref={this.channelPurposeInput}\n                                        rows='4'\n                                        placeholder={Utils.localizeMessage('channel_modal.purposeEx', 'E.g.: \"A channel to file bugs and improvements\"')}\n                                        maxLength='250'\n                                        value={this.props.channelData.purpose}\n                                        onChange={this.handleChange}\n                                    />\n                                    <p className='input__help'>\n                                        <FormattedMessage\n                                            id='channel_modal.descriptionHelp'\n                                            defaultMessage='Describe how this channel should be used.'\n                                        />\n                                    </p>\n                                </div>\n                            </div>\n                            <div className='form-group less'>\n                                <div className='col-sm-3'>\n                                    <label\n                                        className='form__label control-label'\n                                        htmlFor='newChannelHeader'\n                                    >\n                                        <FormattedMessage\n                                            id='channel_modal.header'\n                                            defaultMessage='Header'\n                                        />\n                                    </label>\n                                    <label className='form__label light'>\n                                        <FormattedMessage\n                                            id='channel_modal.optional'\n                                            defaultMessage='(optional)'\n                                        />\n                                    </label>\n                                </div>\n                                <div className='col-sm-9'>\n                                    <textarea\n                                        id='newChannelHeader'\n                                        className='form-control no-resize'\n                                        ref={this.channelHeaderInput}\n                                        rows='4'\n                                        placeholder={Utils.localizeMessage('channel_modal.headerEx', 'E.g.: \"[Link Title](http://example.com)\"')}\n                                        maxLength='1024'\n                                        value={this.props.channelData.header}\n                                        onChange={this.handleChange}\n                                    />\n                                    <p className='input__help'>\n                                        <FormattedMessage\n                                            id='channel_modal.headerHelp'\n                                            defaultMessage='Set text that will appear in the header of the channel beside the channel name. For example, include frequently used links by typing [Link Title](http://example.com).'\n                                        />\n                                    </p>\n                                    {serverError}\n                                </div>\n                            </div>\n                        </Modal.Body>\n                        <Modal.Footer>\n                            <button\n                                id='cancelNewChannel'\n                                type='button'\n                                className='btn btn-link'\n                                onClick={this.props.onModalDismissed}\n                            >\n                                <FormattedMessage\n                                    id='channel_modal.cancel'\n                                    defaultMessage='Cancel'\n                                />\n                            </button>\n                            <button\n                                id='submitNewChannel'\n                                onClick={this.handleSubmit}\n                                type='submit'\n                                className='btn btn-primary'\n                            >\n                                <FormattedMessage\n                                    id='channel_modal.createNew'\n                                    defaultMessage='Create Channel'\n                                />\n                            </button>\n                        </Modal.Footer>\n                    </form>\n                </Modal>\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {Preferences} from 'mattermost-redux/constants';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\n\nimport NewChannelModal from './new_channel_modal.jsx';\n\nfunction mapStateToProps(state) {\n    return {\n        ctrlSend: getBool(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter'),\n    };\n}\n\nexport default connect(mapStateToProps)(NewChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal, Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport OverlayTrigger from 'components/overlay_trigger';\n\nimport Constants from 'utils/constants';\nimport {getShortenedURL, validateChannelUrl} from 'utils/url';\n\ntype Props = {\n\n    /**\n     * Set whether to show the modal or not\n     */\n    show: boolean;\n\n    /**\n     * Set to change the title of the modal\n     */\n    title?: React.ReactNode;\n\n    /**\n     * Set to change the submit button text\n     */\n    submitButtonText?: React.ReactNode;\n\n    /**\n     * Set to change the current URL\n     */\n    currentURL?: string;\n\n    /**\n     * Set to the current team URL\n     */\n    currentTeamURL: string;\n\n    /**\n     * Server error from failed channel creation\n     */\n    serverError?: React.ReactNode;\n\n    /**\n     * Function to call when modal is submitted\n     */\n    onModalSubmit: (newURL: string) => void;\n\n    /**\n     * Function to call when modal is exited\n     */\n    onModalExited?: () => void;\n\n    /**\n     * Function to call when modal is dismissed\n     */\n    onModalDismissed: () => void;\n}\n\ntype State = {\n    currentURL?: string;\n    urlErrors: JSX.Element[] | string;\n    userEdit: boolean;\n};\n\nexport default class ChangeURLModal extends React.PureComponent<Props, State> {\n    private urlInput: React.RefObject<HTMLInputElement>;\n\n    public static defaultProps = {\n        show: false,\n        title: 'Change URL',\n        submitButtonText: 'Save',\n        currentURL: '',\n        serverError: null,\n    }\n\n    constructor(props: Props) {\n        super(props);\n        this.urlInput = React.createRef();\n        this.state = {\n            currentURL: props.currentURL,\n            urlErrors: '',\n            userEdit: false,\n        };\n    }\n\n    static getDerivedStateFromProps(props: Props, state: State) {\n        // This check prevents the url being deleted when we re-render\n        // because of user status check\n        if (!state.userEdit) {\n            return {currentURL: props.currentURL};\n        }\n\n        return null;\n    }\n\n    onURLChanged = (e: React.ChangeEvent<HTMLInputElement>) => {\n        const url = e.target.value.trim();\n        this.setState({currentURL: url.replace(/[^A-Za-z0-9-_]/g, '').toLowerCase(), userEdit: true});\n    }\n\n    onSubmit = (e: React.MouseEvent<HTMLButtonElement>) => {\n        e.preventDefault();\n        e.preventDefault();\n        const url = this.urlInput?.current?.value || '';\n        const urlErrors = validateChannelUrl(url);\n        if (urlErrors.length > 0) {\n            this.setState({urlErrors});\n            return;\n        }\n        this.setState({urlErrors: '', userEdit: false});\n        this.props.onModalSubmit(url);\n    }\n\n    onCancel = () => {\n        this.setState({urlErrors: '', userEdit: false});\n        this.props.onModalDismissed();\n    }\n\n    render() {\n        let urlClass = 'input-group input-group--limit';\n        let error = null;\n        let helpText = null;\n\n        if (this.state.urlErrors) {\n            urlClass += ' has-error';\n        }\n\n        if (this.props.serverError || this.state.urlErrors) {\n            error = (\n                <div className='has-error'>\n                    <p className='input__help error'>\n                        {this.state.urlErrors || this.props.serverError}\n                    </p>\n                </div>\n            );\n        } else {\n            helpText = (\n                <p className='input__help'>\n                    <FormattedMessage\n                        id='change_url.helpText'\n                        defaultMessage='You can use lowercase letters, numbers, dashes, and underscores.'\n                    />\n                </p>\n            );\n        }\n\n        const fullURL = this.props.currentTeamURL + '/channels';\n        const shortURL = getShortenedURL(fullURL);\n        const urlTooltip = (\n            <Tooltip id='urlTooltip'>{fullURL}</Tooltip>\n        );\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal'\n                show={this.props.show}\n                onHide={this.onCancel}\n                onExited={this.props.onModalExited}\n                role='dialog'\n                aria-labelledby='changeUrlModalLabel'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='changeUrlModalLabel'\n                    >\n                        {this.props.title}\n                    </Modal.Title>\n                </Modal.Header>\n                <form\n                    role='form'\n                    className='form-horizontal'\n                >\n                    <Modal.Body>\n                        <div className='form-group'>\n                            <label className='col-sm-3 form__label control-label'>\n                                <FormattedMessage\n                                    id='change_url.urlLabel'\n                                    defaultMessage='Channel URL'\n                                />\n                            </label>\n                            <div className='col-sm-9'>\n                                <div className={urlClass}>\n                                    <OverlayTrigger\n                                        delayShow={Constants.OVERLAY_TIME_DELAY}\n                                        placement='top'\n                                        overlay={urlTooltip}\n                                    >\n                                        <span className='input-group-addon'>{shortURL}</span>\n                                    </OverlayTrigger>\n                                    <input\n                                        type='text'\n                                        ref={this.urlInput}\n                                        className='form-control'\n                                        maxLength={Constants.MAX_CHANNELNAME_LENGTH}\n                                        onChange={this.onURLChanged}\n                                        value={this.state.currentURL}\n                                        autoFocus={true}\n                                    />\n                                </div>\n                                {error}\n                                {helpText}\n                            </div>\n                        </div>\n                    </Modal.Body>\n                    <Modal.Footer>\n                        <button\n                            type='button'\n                            className='btn btn-link'\n                            onClick={this.onCancel}\n                        >\n                            <FormattedMessage\n                                id='change_url.close'\n                                defaultMessage='Close'\n                            />\n                        </button>\n                        <button\n                            onClick={this.onSubmit}\n                            type='submit'\n                            className='btn btn-primary'\n                        >\n                            {this.props.submitButtonText}\n                        </button>\n                    </Modal.Footer>\n                </form>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport {getSiteURL} from 'utils/url';\n\nimport ChangeURLModal from './change_url_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n    const currentTeam = getCurrentTeam(state);\n    const currentTeamURL = `${getSiteURL()}/${currentTeam.name}`;\n    return {\n        currentTeamURL,\n    };\n}\n\nexport default connect(mapStateToProps)(ChangeURLModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {ChannelType, Channel} from 'mattermost-redux/types/channels';\nimport {ServerError} from 'mattermost-redux/types/errors';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\nimport * as Utils from 'utils/utils';\nimport {cleanUpUrlable} from 'utils/url';\n\nimport NewChannelModal from 'components/new_channel_modal';\nimport ChangeURLModal from 'components/change_url_modal';\n\nexport const SHOW_NEW_CHANNEL = 1;\nexport const SHOW_EDIT_URL = 2;\nexport const SHOW_EDIT_URL_THEN_COMPLETE = 3;\n\nexport function getChannelTypeFromProps(props: Props): ChannelType {\n    let channelType = props.channelType || Constants.OPEN_CHANNEL;\n    if (!props.canCreatePublicChannel && channelType === Constants.OPEN_CHANNEL) {\n        channelType = Constants.PRIVATE_CHANNEL as ChannelType;\n    }\n    if (!props.canCreatePrivateChannel && channelType === Constants.PRIVATE_CHANNEL) {\n        channelType = Constants.OPEN_CHANNEL as ChannelType;\n    }\n    return channelType;\n}\n\nexport type Props = {\n\n    /**\n     * Set to Constants.OPEN_CHANNEL or Constants.PRIVATE_CHANNEL depending on which modal we should show first\n     */\n    channelType: ChannelType;\n\n    /**\n     * The current team ID\n     */\n    currentTeamId: string;\n\n    /**\n     * Permission to create public channel\n     */\n    canCreatePublicChannel: boolean;\n\n    /**\n     * Permission to create private channel\n     */\n    canCreatePrivateChannel: boolean;\n\n    actions: {\n        createChannel: (channel: Channel) => Promise<{data?: Channel; error?: ServerError}>;\n        switchToChannel: (channel: Channel) => Promise<{data?: true; error?: true}>;\n        closeModal: (modalId: string) => void;\n    };\n};\n\ntype State = {\n    serverError: JSX.Element | string | null;\n    channelType: ChannelType;\n    flowState: number;\n    channelDisplayName: string;\n    channelName: string;\n    channelPurpose: string;\n    channelHeader: string;\n    nameModified: boolean;\n}\n\ntype NewChannelData = {\n    displayName: string;\n    purpose: string;\n    header: string;\n}\n\nexport default class NewChannelFlow extends React.PureComponent<Props, State> {\n    public static defaultProps = {\n        channelType: Constants.OPEN_CHANNEL as ChannelType,\n    };\n\n    public constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            serverError: '',\n            channelType: getChannelTypeFromProps(props),\n            flowState: SHOW_NEW_CHANNEL,\n            channelDisplayName: '',\n            channelName: '',\n            channelPurpose: '',\n            channelHeader: '',\n            nameModified: false,\n        };\n    }\n\n    onSubmit = () => {\n        if (!this.state.channelDisplayName) {\n            this.setState({serverError: Utils.localizeMessage('channel_flow.invalidName', 'Invalid Channel Name')});\n            return;\n        }\n\n        if (this.state.channelName.length < 2) {\n            this.setState({flowState: SHOW_EDIT_URL_THEN_COMPLETE});\n            return;\n        }\n\n        const {actions, currentTeamId} = this.props;\n        const channel: Channel = {\n            team_id: currentTeamId,\n            name: this.state.channelName,\n            display_name: this.state.channelDisplayName,\n            purpose: this.state.channelPurpose,\n            header: this.state.channelHeader,\n            type: this.state.channelType,\n            create_at: 0,\n            creator_id: '',\n            delete_at: 0,\n            extra_update_at: 0,\n            group_constrained: false,\n            id: '',\n            last_post_at: 0,\n            scheme_id: '',\n            total_msg_count: 0,\n            total_msg_count_root: 0,\n            update_at: 0,\n        };\n\n        actions.createChannel(channel).then(({data, error}) => {\n            if (error) {\n                this.onCreateChannelError(error);\n            } else if (data) {\n                this.onModalDismissed();\n                actions.switchToChannel(data);\n            }\n        });\n    };\n\n    onModalDismissed = () => {\n        this.props.actions.closeModal(ModalIdentifiers.NEW_CHANNEL_FLOW);\n    }\n\n    onCreateChannelError = (err: ServerError) => {\n        if (err.server_error_id === 'model.channel.is_valid.2_or_more.app_error') {\n            this.setState({\n                flowState: SHOW_EDIT_URL_THEN_COMPLETE,\n                serverError: (\n                    <FormattedMessage\n                        id='channel_flow.handleTooShort'\n                        defaultMessage='Channel URL must be 2 or more lowercase alphanumeric characters'\n                    />\n                ),\n            });\n        } else if (err.server_error_id === 'store.sql_channel.update.exists.app_error') {\n            this.setState({serverError: Utils.localizeMessage('channel_flow.alreadyExist', 'A channel with that URL already exists')});\n        } else {\n            this.setState({serverError: err.message});\n        }\n    };\n\n    typeSwitched = (channelType: ChannelType) => {\n        this.setState({\n            channelType,\n            serverError: '',\n        });\n    };\n\n    urlChangeRequested = (e: React.MouseEvent) => {\n        if (e) {\n            e.preventDefault();\n        }\n        this.setState({flowState: SHOW_EDIT_URL});\n    };\n\n    urlChangeSubmitted = (newURL: string) => {\n        if (this.state.flowState === SHOW_EDIT_URL_THEN_COMPLETE) {\n            this.setState({channelName: newURL, nameModified: true}, this.onSubmit);\n        } else {\n            this.setState({flowState: SHOW_NEW_CHANNEL, serverError: null, channelName: newURL, nameModified: true});\n        }\n    };\n\n    urlChangeDismissed = () => {\n        this.setState({flowState: SHOW_NEW_CHANNEL});\n    };\n\n    channelDataChanged = (data: NewChannelData) => {\n        this.setState({\n            channelDisplayName: data.displayName,\n            channelPurpose: data.purpose,\n            channelHeader: data.header,\n        });\n        if (!this.state.nameModified) {\n            this.setState({channelName: cleanUpUrlable(data.displayName.trim())});\n        }\n    };\n\n    render() {\n        const channelData = {\n            name: this.state.channelName,\n            displayName: this.state.channelDisplayName,\n            purpose: this.state.channelPurpose,\n            header: this.state.channelHeader,\n        };\n\n        let showChannelModal = false;\n        let showChangeURLModal = false;\n\n        let changeURLTitle: string | JSX.Element = '';\n        let changeURLSubmitButtonText: string | JSX.Element = '';\n\n        // Only listen to flow state if we are being shown\n        switch (this.state.flowState) {\n        case SHOW_NEW_CHANNEL:\n            showChannelModal = true;\n            break;\n        case SHOW_EDIT_URL:\n            showChangeURLModal = true;\n            changeURLTitle = (\n                <FormattedMessage\n                    id='channel_flow.changeUrlTitle'\n                    defaultMessage='Change Channel URL'\n                />\n            );\n            changeURLSubmitButtonText = changeURLTitle;\n            break;\n        case SHOW_EDIT_URL_THEN_COMPLETE:\n            showChangeURLModal = true;\n            changeURLTitle = (\n                <FormattedMessage\n                    id='channel_flow.set_url_title'\n                    defaultMessage='Set Channel URL'\n                />\n            );\n            changeURLSubmitButtonText = (\n                <FormattedMessage\n                    id='channel_flow.create'\n                    defaultMessage='Create Channel'\n                />\n            );\n            break;\n        }\n\n        return (\n            <span>\n                <NewChannelModal\n                    show={showChannelModal}\n                    channelType={this.state.channelType}\n                    canCreatePublicChannel={this.props.canCreatePublicChannel}\n                    canCreatePrivateChannel={this.props.canCreatePrivateChannel}\n                    channelData={channelData}\n                    serverError={this.state.serverError}\n                    onSubmitChannel={this.onSubmit}\n                    onModalDismissed={this.onModalDismissed}\n                    onTypeSwitched={this.typeSwitched}\n                    onChangeURLPressed={this.urlChangeRequested}\n                    onDataChanged={this.channelDataChanged}\n                />\n                <ChangeURLModal\n                    show={showChangeURLModal}\n                    title={changeURLTitle}\n                    submitButtonText={changeURLSubmitButtonText}\n                    currentURL={this.state.channelName}\n                    serverError={this.state.serverError}\n                    onModalSubmit={this.urlChangeSubmitted}\n                    onModalDismissed={this.urlChangeDismissed}\n                />\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {haveICurrentChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\nimport {createChannel} from 'mattermost-redux/actions/channels';\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport {switchToChannel} from 'actions/views/channel';\nimport {closeModal} from 'actions/views/modals';\n\nimport NewChannelFlow, {Props} from './new_channel_flow';\n\nfunction mapStateToProps(state: GlobalState) {\n    const currentTeam = getCurrentTeam(state);\n\n    let canCreatePublicChannel = false;\n    let canCreatePrivateChannel = false;\n\n    if (currentTeam) {\n        canCreatePublicChannel = haveICurrentChannelPermission(state, Permissions.CREATE_PUBLIC_CHANNEL);\n        canCreatePrivateChannel = haveICurrentChannelPermission(state, Permissions.CREATE_PRIVATE_CHANNEL);\n    }\n\n    return {\n        currentTeamId: currentTeam.id,\n        canCreatePrivateChannel,\n        canCreatePublicChannel,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Props['actions']>({\n            createChannel,\n            switchToChannel,\n            closeModal,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(NewChannelFlow);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n    defaultExpandedKey: string;\n    children: (setExpanded: (expandedKey: string) => void, expandedKey: string) => React.ReactNode;\n};\n\ntype State = {\n    expandedKey: string;\n};\n\nexport default class Accordion extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            expandedKey: props.defaultExpandedKey,\n        };\n    }\n\n    setExpanded = (expandedKey: string) => {\n        this.setState({expandedKey});\n    }\n\n    render() {\n        return (\n            <div\n                className={'Accordion'}\n            >\n                {this.props.children(this.setExpanded, this.state.expandedKey)}\n            </div>\n        );\n    }\n}\n","export default __webpack_public_path__ + \"files/bc39a70bb1048e5a929335dd8e40d958.apng\";","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nconst DownloadAppsSvg = () => (\n    <svg\n        width='168'\n        height='119'\n        viewBox='0 0 168 119'\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n    >\n        <path\n            d='M66.8589 108C102.148 108 130.755 106.964 130.755 105.687C130.755 104.409 102.148 103.373 66.8589 103.373C31.5698 103.373 2.9624 104.409 2.9624 105.687C2.9624 106.964 31.5698 108 66.8589 108Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M141.5 119C153.926 119 164 117.881 164 116.5C164 115.119 153.926 114 141.5 114C129.074 114 119 115.119 119 116.5C119 117.881 129.074 119 141.5 119Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M13.2399 86H130.746C131.178 86.0001 131.605 85.9135 132.003 85.7453C132.401 85.5771 132.762 85.3306 133.065 85.0203C133.368 84.7099 133.606 84.3419 133.767 83.9376C133.927 83.5333 134.006 83.1009 134 82.6654V3.33458C134.006 2.89913 133.927 2.46666 133.767 2.06238C133.606 1.6581 133.368 1.29007 133.065 0.97973C132.762 0.669392 132.401 0.422953 132.003 0.254751C131.605 0.0865491 131.178 -5.37496e-05 130.746 2.50274e-08H13.2538C12.8222 -5.37496e-05 12.395 0.0865491 11.9969 0.254751C11.5988 0.422953 11.2378 0.669392 10.935 0.97973C10.6323 1.29007 10.3937 1.6581 10.2332 2.06238C10.0728 2.46666 9.99362 2.89913 10.0004 3.33458V82.6654C9.99363 83.0997 10.0723 83.531 10.2319 83.9344C10.3915 84.3377 10.6289 84.7051 10.9302 85.0153C11.2315 85.3254 11.5908 85.5722 11.9872 85.7412C12.3837 85.9102 12.8095 85.9982 13.2399 86V86Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M13.2399 86H130.746C131.178 86.0001 131.605 85.9135 132.003 85.7453C132.401 85.5771 132.762 85.3306 133.065 85.0203C133.368 84.7099 133.606 84.3419 133.767 83.9376C133.927 83.5333 134.006 83.1009 134 82.6654V3.33458C134.006 2.89913 133.927 2.46666 133.767 2.06238C133.606 1.6581 133.368 1.29007 133.065 0.97973C132.762 0.669392 132.401 0.422953 132.003 0.254751C131.605 0.0865491 131.178 -5.37496e-05 130.746 2.50274e-08H13.2538C12.8222 -5.37496e-05 12.395 0.0865491 11.9969 0.254751C11.5988 0.422953 11.2378 0.669392 10.935 0.97973C10.6323 1.29007 10.3937 1.6581 10.2332 2.06238C10.0728 2.46666 9.99362 2.89913 10.0004 3.33458V82.6654C9.99363 83.0997 10.0723 83.531 10.2319 83.9344C10.3915 84.3377 10.6289 84.7051 10.9302 85.0153C11.2315 85.3254 11.5908 85.5722 11.9872 85.7412C12.3837 85.9102 12.8095 85.9982 13.2399 86V86Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.72'\n        />\n        <path\n            d='M0 97C0 101 3.21676 105 7.14114 105H135.864C139.588 105 143 101.009 143 97H0Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M0 97C0 101 3.21676 105 7.14114 105H135.864C139.588 105 143 101.009 143 97H0Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.72'\n        />\n        <path\n            d='M131.083 86H11.9171L0 97H143L131.083 86Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M131.083 86H11.9171L0 97H143L131.083 86Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M128.001 87H15.9941L12 91H132L128.001 87Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <path\n            d='M84.1735 94H59.8265L58 96H86L84.1735 94Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.72'\n        />\n        <path\n            d='M127 7H17V78H127V7Z'\n            fill='var(--center-channel-bg)'\n        />\n        <rect\n            x='17'\n            y='7'\n            width='23'\n            height='71'\n            fill='var(--sidebar-bg)'\n        />\n        <circle\n            opacity='0.32'\n            cx='21.1863'\n            cy='10.384'\n            r='2'\n            fill='var(--center-channel-bg)'\n        />\n        <rect\n            opacity='0.32'\n            x='24'\n            y='10'\n            width='14'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-bg)'\n        />\n        <rect\n            opacity='0.32'\n            x='20.1863'\n            y='16.384'\n            width='17'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-bg)'\n        />\n        <rect\n            opacity='0.32'\n            x='20.1863'\n            y='19.384'\n            width='11'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-bg)'\n        />\n        <rect\n            opacity='0.32'\n            x='20.1863'\n            y='22.384'\n            width='16'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-bg)'\n        />\n        <rect\n            opacity='0.32'\n            x='20.1863'\n            y='25.384'\n            width='13'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-bg)'\n        />\n        <rect\n            opacity='0.32'\n            x='20.1863'\n            y='28.384'\n            width='18'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-bg)'\n        />\n        <rect\n            opacity='0.32'\n            x='20.1863'\n            y='31.384'\n            width='9'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-bg)'\n        />\n        <rect\n            opacity='0.32'\n            x='20.1863'\n            y='34.384'\n            width='18'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-bg)'\n        />\n        <rect\n            opacity='0.32'\n            x='20.1863'\n            y='37.384'\n            width='13'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-bg)'\n        />\n        <circle\n            cx='46.1863'\n            cy='23.5272'\n            r='3'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <circle\n            cx='46.1863'\n            cy='39.5272'\n            r='3'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <circle\n            cx='46.1863'\n            cy='55.5272'\n            r='3'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='51.1863'\n            y='20.5272'\n            width='15'\n            height='2'\n            rx='1'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='51.1863'\n            y='36.5272'\n            width='15'\n            height='2'\n            rx='1'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='51.1863'\n            y='52.5272'\n            width='15'\n            height='2'\n            rx='1'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='51.1863'\n            y='24.5272'\n            width='54'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='51.1863'\n            y='40.5272'\n            width='54'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='51.1863'\n            y='56.5272'\n            width='54'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='51.1863'\n            y='27.5272'\n            width='60'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='51.1863'\n            y='43.5272'\n            width='60'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='51.1863'\n            y='59.5272'\n            width='60'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='51.1863'\n            y='30.5272'\n            width='37'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='51.1863'\n            y='46.5272'\n            width='37'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='51.1863'\n            y='62.5272'\n            width='37'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='98.1863'\n            y='10'\n            width='14'\n            height='2'\n            rx='1'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <rect\n            x='43.1863'\n            y='10'\n            width='14'\n            height='2'\n            rx='1'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <rect\n            x='91.1863'\n            y='9'\n            width='4'\n            height='4'\n            rx='2'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <rect\n            x='121.186'\n            y='9'\n            width='4'\n            height='4'\n            rx='2'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <rect\n            x='115.186'\n            y='9'\n            width='4'\n            height='4'\n            rx='2'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <rect\n            x='85.1863'\n            y='9'\n            width='4'\n            height='4'\n            rx='2'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <rect\n            x='43'\n            y='71'\n            width='79'\n            height='4'\n            rx='2'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M71.7666 1.85419C72.1361 1.85419 72.4973 1.96376 72.8046 2.16904C73.1118 2.37432 73.3512 2.66609 73.4926 3.00746C73.634 3.34882 73.6711 3.72447 73.599 4.08686C73.5269 4.44926 73.349 4.78212 73.0877 5.0434C72.8264 5.30467 72.4935 5.4826 72.1311 5.55469C71.7687 5.62677 71.3931 5.58979 71.0518 5.44839C70.7104 5.30699 70.4186 5.06752 70.2133 4.7603C70.008 4.45308 69.8984 4.09188 69.8984 3.72238C69.8984 3.22691 70.0953 2.75172 70.4456 2.40137C70.796 2.05101 71.2712 1.85419 71.7666 1.85419Z'\n            fill='var(--center-channel-bg)'\n            fillOpacity='0.32'\n        />\n        <path\n            d='M82.3863 102H61.609C60.8944 102 59 102 59 100H85C85 102 83.0445 102 82.3863 102Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.72'\n        />\n        <path\n            d='M161.803 111.909C161.803 114.344 159.414 116.784 157.025 116.784H125.969C123.581 116.784 121.192 114.344 121.192 111.909V40.094C121.192 37.6564 123.578 35.2188 125.967 35.2188H157.025C159.414 35.2188 161.803 37.6564 161.803 40.094V111.909Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M161.803 111.909C161.803 114.344 159.414 116.784 157.025 116.784H125.969C123.581 116.784 121.192 114.344 121.192 111.909V40.094C121.192 37.6564 123.578 35.2188 125.967 35.2188H157.025C159.414 35.2188 161.803 37.6564 161.803 40.094V111.909Z'\n            fill='var(--center-channel-color)'\n        />\n        <path\n            d='M145 39.4989C145 39.776 144.847 40 144.653 40H138.35C138.159 40 138 39.7691 138 39.4989C138 39.2286 138.159 39 138.35 39H144.642C144.836 39 145 39.224 145 39.4989Z'\n            fill='var(--center-channel-bg)'\n            fillOpacity='0.32'\n        />\n        <path\n            d='M160 44H123V108H160V44Z'\n            fill='var(--center-channel-bg)'\n        />\n        <circle\n            cx='127.5'\n            cy='56.5'\n            r='2.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <circle\n            cx='127.5'\n            cy='71.5'\n            r='2.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <circle\n            cx='127.5'\n            cy='86.5'\n            r='2.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='131'\n            y='55'\n            width='17'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='131'\n            y='70'\n            width='17'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='131'\n            y='85'\n            width='17'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='131'\n            y='61'\n            width='24'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='131'\n            y='76'\n            width='24'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='131'\n            y='91'\n            width='24'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='131'\n            y='64'\n            width='12'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='131'\n            y='79'\n            width='12'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='131'\n            y='94'\n            width='12'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='131'\n            y='58'\n            width='26'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='131'\n            y='73'\n            width='26'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='131'\n            y='88'\n            width='26'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <rect\n            x='123'\n            y='44'\n            width='37'\n            height='7'\n            fill='var(--sidebar-bg)'\n        />\n        <rect\n            opacity='0.48'\n            x='129'\n            y='47'\n            width='12'\n            height='1'\n            rx='0.5'\n            fill='var(--center-channel-bg)'\n        />\n        <rect\n            opacity='0.48'\n            x='155'\n            y='46'\n            width='3'\n            height='3'\n            rx='1.5'\n            fill='var(--center-channel-bg)'\n        />\n        <rect\n            opacity='0.48'\n            x='125'\n            y='46'\n            width='3'\n            height='3'\n            rx='1.5'\n            fill='var(--center-channel-bg)'\n        />\n        <rect\n            x='137'\n            y='111'\n            width='10'\n            height='2'\n            rx='1'\n            fill='var(--center-channel-bg)'\n            fillOpacity='0.32'\n        />\n    </svg>\n);\n\nexport default DownloadAppsSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {isDesktopApp, isWindows, isMac} from 'utils/user_agent';\nimport {isMobile} from 'utils/utils';\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport Card from 'components/card/card';\n\nimport DownloadApps from './images/download-apps.svg';\nimport {getAnalyticsCategory} from './step_helpers';\n\ntype Props = {\n    isFirstAdmin: boolean;\n}\n\nfunction DownloadSection(props: Props): JSX.Element | null {\n    if (isMobile()) {\n        return (\n            <div className='NextStepsView__tipsMobileMessage'>\n                <Card expanded={true}>\n                    <div className='Card__body'>\n                        <i className='icon icon-laptop'/>\n                        <FormattedMessage\n                            id='next_steps_view.mobile_tips_message'\n                            defaultMessage='To configure your workspace, continue on a desktop computer.'\n                        />\n                    </div>\n                </Card>\n            </div>\n        );\n    } else if (!isDesktopApp()) {\n        return (\n            <div className='NextStepsView__download'>\n                <DownloadApps/>\n                <div className='NextStepsView__downloadText'>\n                    <h4>\n                        <FormattedMessage\n                            id='next_steps_view.downloadDesktopAndMobile'\n                            defaultMessage='Download the Desktop and Mobile apps'\n                        />\n                    </h4>\n                    <div className='NextStepsView__downloadButtons'>\n                        <button\n                            className='NextStepsView__button NextStepsView__downloadForPlatformButton secondary'\n                            onClick={() => downloadLatest(props.isFirstAdmin)}\n                        >\n                            {getDownloadButtonString()}\n                        </button>\n                        <button\n                            className='NextStepsView__button NextStepsView__downloadAnyButton tertiary'\n                            onClick={() => seeAllApps(props.isFirstAdmin)}\n                        >\n                            <FormattedMessage\n                                id='next_steps_view.seeAllTheApps'\n                                defaultMessage='See all the apps'\n                            />\n                        </button>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n\n    return null;\n}\n\nconst getDownloadButtonString = () => {\n    if (isWindows()) {\n        return (\n            <FormattedMessage\n                id='next_steps_view.tips.getForWindows'\n                defaultMessage='Get Mattermost for Windows'\n            />\n        );\n    }\n\n    if (isMac()) {\n        return (\n            <FormattedMessage\n                id='next_steps_view.tips.getForMac'\n                defaultMessage='Get Mattermost for Mac'\n            />\n        );\n    }\n\n    // TODO: isLinux?\n\n    return (\n        <FormattedMessage\n            id='next_steps_view.tips.getForDefault'\n            defaultMessage='Get Mattermost'\n        />\n    );\n};\n\nconst seeAllApps = (isAdmin: boolean) => {\n    trackEvent(getAnalyticsCategory(isAdmin), 'cloud_see_all_apps');\n    window.open('https://mattermost.com/download/#mattermostApps', '_blank');\n};\n\nconst downloadLatest = (isAdmin: boolean) => {\n    const baseLatestURL = 'https://latest.mattermost.com/mattermost-desktop-';\n\n    if (isWindows()) {\n        trackEvent(getAnalyticsCategory(isAdmin), 'click_download_app', {app: 'windows'});\n        window.open(`${baseLatestURL}exe`, '_blank');\n        return;\n    }\n\n    if (isMac()) {\n        trackEvent(getAnalyticsCategory(isAdmin), 'click_download_app', {app: 'mac'});\n        window.open(`${baseLatestURL}dmg`, '_blank');\n        return;\n    }\n\n    // TODO: isLinux?\n\n    seeAllApps(isAdmin);\n};\n\nexport default DownloadSection;\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nconst IncidentsSvg = () => (\n    <svg\n        width='185'\n        height='125'\n        viewBox='0 0 185 125'\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n        xmlnsXlink='http://www.w3.org/1999/xlink'\n    >\n        <circle\n            cx='17'\n            cy='32.2084'\n            r='9.5'\n            stroke='#5D89EA'\n        />\n        <g filter='url(#svg1-filter0_d)'>\n            <ellipse\n                cx='17'\n                cy='32.2084'\n                rx='8'\n                ry='8'\n                fill='#FFFFFF'\n            />\n            <ellipse\n                cx='17'\n                cy='32.2084'\n                rx='8'\n                ry='8'\n                fill='url(#svg1-pattern0)'\n            />\n            <path\n                d='M17 40.4584C21.5563 40.4584 25.25 36.7647 25.25 32.2084C25.25 27.652 21.5563 23.9584 17 23.9584C12.4437 23.9584 8.75 27.652 8.75 32.2084C8.75 36.7647 12.4437 40.4584 17 40.4584Z'\n                stroke='#3F4350'\n                strokeOpacity='0.08'\n                strokeWidth='0.5'\n            />\n        </g>\n        <g filter='url(#svg1-filter1_d)'>\n            <ellipse\n                cx='17'\n                cy='56.2084'\n                rx='8'\n                ry='8'\n                fill='#FFFFFF'\n            />\n            <ellipse\n                cx='17'\n                cy='56.2084'\n                rx='8'\n                ry='8'\n                fill='url(#svg1-pattern1)'\n            />\n            <path\n                d='M17 64.4584C21.5563 64.4584 25.25 60.7647 25.25 56.2084C25.25 51.652 21.5563 47.9584 17 47.9584C12.4437 47.9584 8.75 51.652 8.75 56.2084C8.75 60.7647 12.4437 64.4584 17 64.4584Z'\n                stroke='#3F4350'\n                strokeOpacity='0.08'\n                strokeWidth='0.5'\n            />\n        </g>\n        <g filter='url(#svg1-filter2_d)'>\n            <ellipse\n                cx='17'\n                cy='80.2084'\n                rx='8'\n                ry='8'\n                fill='#FFFFFF'\n            />\n            <ellipse\n                cx='17'\n                cy='80.2084'\n                rx='8'\n                ry='8'\n                fill='url(#svg1-pattern2)'\n            />\n            <path\n                d='M17 88.4584C21.5563 88.4584 25.25 84.7647 25.25 80.2084C25.25 75.652 21.5563 71.9584 17 71.9584C12.4437 71.9584 8.75 75.652 8.75 80.2084C8.75 84.7647 12.4437 88.4584 17 88.4584Z'\n                stroke='#3F4350'\n                strokeOpacity='0.08'\n                strokeWidth='0.5'\n            />\n        </g>\n        <g filter='url(#svg1-filter3_d)'>\n            <rect\n                x='32'\n                y='20'\n                width='128'\n                height='72'\n                rx='4'\n                fill='#FFFFFF'\n            />\n            <rect\n                x='31.75'\n                y='19.75'\n                width='128.5'\n                height='72.5'\n                rx='4.25'\n                stroke='#3F4350'\n                strokeOpacity='0.16'\n                strokeWidth='0.5'\n            />\n        </g>\n        <rect\n            x='76.5'\n            y='25'\n            width='78'\n            height='3'\n            rx='1.5'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='76.5'\n            y='33'\n            width='78'\n            height='3'\n            rx='1.5'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='76.5'\n            y='40'\n            width='78'\n            height='3'\n            rx='1.5'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='76.5'\n            y='53'\n            width='78'\n            height='3'\n            rx='1.5'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='76.5'\n            y='61'\n            width='78'\n            height='3'\n            rx='1.5'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='76.5'\n            y='68'\n            width='78'\n            height='3'\n            rx='1.5'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='103.5'\n            y='75'\n            width='24'\n            height='2'\n            rx='1'\n            fill='#5D89EA'\n        />\n        <rect\n            x='103.5'\n            y='47'\n            width='24'\n            height='2'\n            rx='1'\n            fill='#5D89EA'\n        />\n        <rect\n            x='76.5'\n            y='80'\n            width='80'\n            height='8'\n            rx='4'\n            fill='#FFFFFF'\n        />\n        <rect\n            x='76.75'\n            y='80.25'\n            width='79.5'\n            height='7.5'\n            rx='3.75'\n            stroke='#3F4350'\n            strokeOpacity='0.16'\n            strokeWidth='0.5'\n        />\n        <path\n            d='M32 24C32 21.7909 33.7909 20 36 20H72V92H36C33.7909 92 32 90.2091 32 88V24Z'\n            fill='#174ab5'\n        />\n        <path\n            d='M38 45L27.5 38.5'\n            stroke='white'\n        />\n        <path\n            d='M37.5 56.5H27.5'\n            stroke='white'\n        />\n        <path\n            d='M39.5 65L27 76.5'\n            stroke='white'\n        />\n        <path\n            d='M64 54.0795C64 56.49 63.4773 58.8061 62.432 61.0279C61.3867 63.2079 59.968 65.0734 58.176 66.6244C56.32 68.1965 54.2613 69.255 52 69.8C49.7387 69.255 47.68 68.1965 45.824 66.6244C44.032 65.0734 42.6133 63.2079 41.568 61.0279C40.5227 58.8061 40 56.49 40 54.0795V46.2192L52 41L64 46.2192V54.0795ZM52 67.1904C53.6427 66.7502 55.1893 65.8699 56.64 64.5493C58.048 63.2288 59.1787 61.6777 60.032 59.8961C60.9067 58.0515 61.344 56.207 61.344 54.3624V47.917L52 43.8297L42.656 47.917V54.3624C42.656 56.207 43.0933 58.0515 43.968 59.8961C44.8213 61.6777 45.952 63.2288 47.36 64.5493C48.8107 65.8699 50.3573 66.7502 52 67.1904ZM50.656 48.8603H53.344V56.7205H50.656V48.8603ZM50.656 59.3301H53.344V61.9397H50.656V59.3301Z'\n            fill='#FFFFFF'\n        />\n        <defs>\n            <filter\n                id='svg1-filter0_d'\n                x='0.806709'\n                y='19.3122'\n                width='32.3866'\n                height='32.3866'\n                filterUnits='userSpaceOnUse'\n                colorInterpolationFilters='sRGB'\n            >\n                <feFlood\n                    floodOpacity='0'\n                    result='BackgroundImageFix'\n                />\n                <feColorMatrix\n                    in='SourceAlpha'\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n                />\n                <feOffset dy='3.29712'/>\n                <feGaussianBlur stdDeviation='3.84665'/>\n                <feColorMatrix\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0'\n                />\n                <feBlend\n                    mode='normal'\n                    in2='BackgroundImageFix'\n                    result='effect1_dropShadow'\n                />\n                <feBlend\n                    mode='normal'\n                    in='SourceGraphic'\n                    in2='effect1_dropShadow'\n                    result='shape'\n                />\n            </filter>\n            <pattern\n                id='svg1-pattern0'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    xlinkHref='#svg1-image0'\n                    transform='translate(0 -0.261905) scale(0.047619)'\n                />\n            </pattern>\n            <filter\n                id='svg1-filter1_d'\n                x='0.806709'\n                y='43.3122'\n                width='32.3866'\n                height='32.3866'\n                filterUnits='userSpaceOnUse'\n                colorInterpolationFilters='sRGB'\n            >\n                <feFlood\n                    floodOpacity='0'\n                    result='BackgroundImageFix'\n                />\n                <feColorMatrix\n                    in='SourceAlpha'\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n                />\n                <feOffset dy='3.29712'/>\n                <feGaussianBlur stdDeviation='3.84665'/>\n                <feColorMatrix\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0'\n                />\n                <feBlend\n                    mode='normal'\n                    in2='BackgroundImageFix'\n                    result='effect1_dropShadow'\n                />\n                <feBlend\n                    mode='normal'\n                    in='SourceGraphic'\n                    in2='effect1_dropShadow'\n                    result='shape'\n                />\n            </filter>\n            <pattern\n                id='svg1-pattern1'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    xlinkHref='#svg1-image1'\n                    transform='translate(-0.388889) scale(0.0555556)'\n                />\n            </pattern>\n            <filter\n                id='svg1-filter2_d'\n                x='0.806709'\n                y='67.3122'\n                width='32.3866'\n                height='32.3866'\n                filterUnits='userSpaceOnUse'\n                colorInterpolationFilters='sRGB'\n            >\n                <feFlood\n                    floodOpacity='0'\n                    result='BackgroundImageFix'\n                />\n                <feColorMatrix\n                    in='SourceAlpha'\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n                />\n                <feOffset dy='3.29712'/>\n                <feGaussianBlur stdDeviation='3.84665'/>\n                <feColorMatrix\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0'\n                />\n                <feBlend\n                    mode='normal'\n                    in2='BackgroundImageFix'\n                    result='effect1_dropShadow'\n                />\n                <feBlend\n                    mode='normal'\n                    in='SourceGraphic'\n                    in2='effect1_dropShadow'\n                    result='shape'\n                />\n            </filter>\n            <pattern\n                id='svg1-pattern2'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    xlinkHref='#svg1-image2'\n                    transform='translate(-0.3) scale(0.05)'\n                />\n            </pattern>\n            <filter\n                id='svg1-filter3_d'\n                x='7.5'\n                y='3.5'\n                width='177'\n                height='121'\n                filterUnits='userSpaceOnUse'\n                colorInterpolationFilters='sRGB'\n            >\n                <feFlood\n                    floodOpacity='0'\n                    result='BackgroundImageFix'\n                />\n                <feColorMatrix\n                    in='SourceAlpha'\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n                />\n                <feOffset dy='8'/>\n                <feGaussianBlur stdDeviation='12'/>\n                <feColorMatrix\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0'\n                />\n                <feBlend\n                    mode='normal'\n                    in2='BackgroundImageFix'\n                    result='effect1_dropShadow'\n                />\n                <feBlend\n                    mode='normal'\n                    in='SourceGraphic'\n                    in2='effect1_dropShadow'\n                    result='shape'\n                />\n            </filter>\n            <image\n                id='svg1-image0'\n                width='21'\n                height='32'\n                xlinkHref='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4gIcSUNDX1BST0ZJTEUAAQEAAAIMbGNtcwIQAABtbnRyUkdCIFhZWiAH3AABABkAAwApADlhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApkZXNjAAAA/AAAAF5jcHJ0AAABXAAAAAt3dHB0AAABaAAAABRia3B0AAABfAAAABRyWFlaAAABkAAAABRnWFlaAAABpAAAABRiWFlaAAABuAAAABRyVFJDAAABzAAAAEBnVFJDAAABzAAAAEBiVFJDAAABzAAAAEBkZXNjAAAAAAAAAANjMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAElYAABYWVogAAAAAAAA9tYAAQAAAADTLVhZWiAAAAAAAAADFgAAAzMAAAKkWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPY3VydgAAAAAAAAAaAAAAywHJA2MFkghrC/YQPxVRGzQh8SmQMhg7kkYFUXdd7WtwegWJsZp8rGm/fdPD6TD////bAIQAAgICAwMDAwQEAwUFBQUFBwYGBgYHCgcIBwgHCg8KCwoKCwoPDhEODQ4RDhgTERETGBwYFxgcIh8fIispKzg4SwECAgIDAwMDBAQDBQUFBQUHBgYGBgcKBwgHCAcKDwoLCgoLCg8OEQ4NDhEOGBMRERMYHBgXGBwiHx8iKykrODhL/8AAEQgAIAAVAwEiAAIRAQMRAf/EAHMAAAIDAQEAAAAAAAAAAAAAAAAFAwcJBggQAAICAQMDAwQDAAAAAAAAAAECAwQSAAURBiFBEzJRBwgUMRUjYQEBAQAAAAAAAAAAAAAAAAAABAURAAIBBAIBBQAAAAAAAAAAAAECAwAREiEEkWEFFDFS0f/aAAwDAQACEQMRAD8Az7NSncnZZJ5cMGbh1Lh3xyPPABYsRwBr0NtH2A9d7r0dc6kobptNmetA1l9pjdzYMKDI8Pxh6gA9mqT2nZ7AqGeNDJL66LBGtb1S6MCWObEBCNa0fZ91cdr6Yt37m8VVpwUZfy4ymAqTpOUCyv5BQqWGiGRVaxW5Pmi+jcT3azkTACJMvFYf2arUZ7FaaDCSKQqyuGPHnxo1PvFd49x3BElWMLYkXhDmnZj7T5H+6NGY7P6afE7Yr3oaq0V3U7FSmluWZY52/qjcZK6sex4Xv+tJ+ivr19SOja1v+M3tzTvyShxcrRWoZy3Z+VnVgch7tQ7juJmkgyr/AJUkZxhXnLv5Z/jXEdVUd7ntRpNI0+CgqicYRlv2qqNNiVL7Hyaj8KZotK2OiCb2vSa71DYv27VmeOFXmlaVlgiWvGC55OMcYCqPgAcDRpbJTkhllSRMWU8FfjRpGMf0Xqm4E7yPdf/Z'\n            />\n            <image\n                id='svg1-image1'\n                width='32'\n                height='18'\n                xlinkHref='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4gIcSUNDX1BST0ZJTEUAAQEAAAIMbGNtcwIQAABtbnRyUkdCIFhZWiAH3AABABkAAwApADlhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApkZXNjAAAA/AAAAF5jcHJ0AAABXAAAAAt3dHB0AAABaAAAABRia3B0AAABfAAAABRyWFlaAAABkAAAABRnWFlaAAABpAAAABRiWFlaAAABuAAAABRyVFJDAAABzAAAAEBnVFJDAAABzAAAAEBiVFJDAAABzAAAAEBkZXNjAAAAAAAAAANjMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAElYAABYWVogAAAAAAAA9tYAAQAAAADTLVhZWiAAAAAAAAADFgAAAzMAAAKkWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPY3VydgAAAAAAAAAaAAAAywHJA2MFkghrC/YQPxVRGzQh8SmQMhg7kkYFUXdd7WtwegWJsZp8rGm/fdPD6TD////bAIQAAgICAwMDAwQEAwUFBQUFBwYGBgYHCgcIBwgHCg8KCwoKCwoPDhEODQ4RDhgTERETGBwYFxgcIh8fIispKzg4SwECAgIDAwMDBAQDBQUFBQUHBgYGBgcKBwgHCAcKDwoLCgoLCg8OEQ4NDhEOGBMRERMYHBgXGBwiHx8iKykrODhL/8AAEQgAEgAgAwEiAAIRAQMRAf/EAHYAAAMBAQAAAAAAAAAAAAAAAAAICQYHEAACAgEEAQIHAQAAAAAAAAABAgMEBQAGEiERB0EIExQiIzJRcQEBAQAAAAAAAAAAAAAAAAAABgURAAECBQIEBwAAAAAAAAAAAAECAwAEBhEhEjE0NWHBQXFyc4Kxsv/aAAwDAQACEQMRAD8Aj40ZXwv91Qr4Zc5tjGUq4z9MFnnSCC1LCksScv1Rj2UJJ6JHjSL26aJflMLq0cJDAseiBprsLvzAx+ny0hJjoruQuqknKqxl+UHDFzL5ACJ7e+pNWoVNy0u0lCyHHEglN7pvFKhtMo9NuqcSkpbwlRFlAHr1ii+xt07doY+xRtIqzyZO+wiiqtLyT6ggMAikcNRa3hbrtuXMPHEEhe1fUKB4AjMj8dUly299l1satw2b+alw8ch+px1OOvBDGrllZ7Lqft8n9dTazWMd5ZJpy0bWRNJzYMeXI8yQBo1REsWX5xbgUNdk5xnJwDmEtdOh2XlktEHQrUbG48BvtmMttiGOfMU0lRZFaUAq45A/6DruHpN3Ruqewps+B7DxETo0abVHwqvj3gPRXGjyX2hsvivszVvS/aFaGV44Jp6IliQlUcCAsOSjo96SSv8Aku44P934SO++vkNo0aH0jy9XvTH0Ib1RzBXolv0Y/9k='\n            />\n            <image\n                id='svg1-image2'\n                width='32'\n                height='20'\n                xlinkHref='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4gIcSUNDX1BST0ZJTEUAAQEAAAIMbGNtcwIQAABtbnRyUkdCIFhZWiAH3AABABkAAwApADlhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApkZXNjAAAA/AAAAF5jcHJ0AAABXAAAAAt3dHB0AAABaAAAABRia3B0AAABfAAAABRyWFlaAAABkAAAABRnWFlaAAABpAAAABRiWFlaAAABuAAAABRyVFJDAAABzAAAAEBnVFJDAAABzAAAAEBiVFJDAAABzAAAAEBkZXNjAAAAAAAAAANjMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAElYAABYWVogAAAAAAAA9tYAAQAAAADTLVhZWiAAAAAAAAADFgAAAzMAAAKkWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPY3VydgAAAAAAAAAaAAAAywHJA2MFkghrC/YQPxVRGzQh8SmQMhg7kkYFUXdd7WtwegWJsZp8rGm/fdPD6TD////bAIQAAgICAwMDAwQEAwUFBQUFBwYGBgYHCgcIBwgHCg8KCwoKCwoPDhEODQ4RDhgTERETGBwYFxgcIh8fIispKzg4SwECAgIDAwMDBAQDBQUFBQUHBgYGBgcKBwgHCAcKDwoLCgoLCg8OEQ4NDhEOGBMRERMYHBgXGBwiHx8iKykrODhL/8AAEQgAFAAgAwEiAAIRAQMRAf/EAHEAAAMBAQEAAAAAAAAAAAAAAAAHCQgFBhAAAgEEAQQDAQEAAAAAAAAAAQIDBAUGEQAIEiEiBzFREzIBAQEBAQAAAAAAAAAAAAAAAAQFAQYRAAICAgEDBQEAAAAAAAAAAAECAxEAIQQFMTISE1FhgWL/2gAMAwEAAhEDEQA/AF1m3UjmVuhWlq8kragF0HYZ2bWz+fbc5dszzMctgrjbsgNJSUJQ3Comcg06zkrGTrz2l/B54vIbV8aVVxYx3d6KtUED+iyRsCR4ADKRyivTphdoxLDqWtgZqprmjyVhlQMkys+438De1C856PlAJaq6ue3qFDKXN40SUZIkZbAr5/clnluUZU/YLhJURmGZ4WLxvFqQElSe4D/S6Zf0cVVRfaotM09YCWPglyd8r/1M5jR3vGbZbKigiakq65ZBG2kBNN7F9ykHftzB82IYZTJO0tpo4CqM7SzzxmLYOl9wT9jlGLqz6BiYn+cDD06AoXUJGt6vEAmc5FW07Vcl5nGu7UKdqwgfnYB9co3l/UhkOC11gsNutVqkpFsNtmBnilL7lplYj0kQa4cOJ6lDGvt0ijy7DBpK7+Tk6B2bzKfzv833nPLDGK63W+lkt1fBLTzUaSxyAy7RlJeRxriAul7mu9/tcldFDOBDE7xmMJHKypvbqmtkk+eHDmQaiJHcLJX1oYzjgWgrRdNfpz//2Q=='\n            />\n        </defs>\n\n    </svg>\n);\n\nexport default IncidentsSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nconst DocumentsSvg = () => (\n    <svg\n        width='209'\n        height='132'\n        viewBox='0 0 209 132'\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n    >\n        <path\n            d='M115.763 16.4239C105.251 16.4389 95.1322 13.264 85.454 9.73694C75.7757 6.2099 66.172 2.26035 55.8553 0.586729C49.2203 -0.489061 41.6755 -0.390172 36.489 3.51593C31.4966 7.27371 30.0509 13.4932 29.3533 19.2392C28.8288 23.5619 28.5869 28.0988 30.5515 32.0528C31.9156 34.7977 34.2501 37.0602 35.8955 39.6763C41.6389 48.777 38.185 60.4024 32.6033 69.7145C29.9862 74.0836 26.9204 78.2713 24.9417 82.8906C22.9631 87.5099 22.1516 92.7481 24.1697 97.3074C26.1695 101.826 30.6865 105.106 35.5341 107.346C45.3783 111.904 56.8397 112.881 67.9932 113.257C92.6824 114.092 117.419 112.389 142.09 110.687C151.22 110.058 160.391 109.424 169.332 107.601C174.296 106.589 179.408 105.088 182.928 101.798C187.396 97.6206 188.31 90.8002 185.059 85.8978C179.607 77.675 165.23 76.1243 161.32 67.2273C159.164 62.3293 161.024 56.7121 163.762 51.9909C169.634 41.8608 179.743 32.787 179.913 21.4568C180.03 13.676 174.773 6.08554 166.922 2.70385C158.692 -0.838168 147.471 0.0728072 141.705 6.67438C135.776 13.4752 125.045 16.4134 115.763 16.4239Z'\n            fill='var(--button-bg)'\n            fillOpacity='0.08'\n        />\n        <g filter='url(#svg2-filter0_d)'>\n            <rect\n                x='24.0001'\n                y='30.4735'\n                width='56'\n                height='72'\n                rx='4'\n                transform='rotate(-15 24.0001 30.4735)'\n                fill='#FFFFFF'\n            />\n            <rect\n                x='24.3063'\n                y='30.6503'\n                width='55.5'\n                height='71.5'\n                rx='3.75'\n                transform='rotate(-15 24.3063 30.6503)'\n                stroke='#3F4350'\n                strokeOpacity='0.08'\n                strokeWidth='0.5'\n            />\n        </g>\n        <g opacity='0.48'>\n            <path\n                d='M44.872 31.0926L33.2809 34.1984C32.2139 34.4843 31.5808 35.581 31.8666 36.6479L32.9019 40.5116C33.1878 41.5786 34.2845 42.2117 35.3514 41.9258L46.9425 38.82C48.0094 38.5341 48.6426 37.4374 48.3567 36.3705L47.3215 32.5068C47.0356 31.4399 45.9389 30.8067 44.872 31.0926Z'\n                fill='var(--button-bg)'\n            />\n            <path\n                d='M47.9779 42.6837L36.3868 45.7895C35.3199 46.0754 34.6867 47.172 34.9726 48.239L36.0079 52.1027C36.2938 53.1696 37.3904 53.8028 38.4574 53.5169L50.0485 50.4111C51.1154 50.1252 51.7486 49.0285 51.4627 47.9616L50.4274 44.0979C50.1415 43.0309 49.0448 42.3978 47.9779 42.6837Z'\n                fill='var(--button-bg)'\n            />\n            <path\n                d='M47.2199 55.31L39.4925 57.3806C38.4256 57.6664 37.7924 58.7631 38.0783 59.83L39.1136 63.6937C39.3995 64.7607 40.4961 65.3938 41.5631 65.108L49.2905 63.0374C50.3574 62.7515 50.9906 61.6549 50.7047 60.5879L49.6694 56.7242C49.3835 55.6573 48.2869 55.0241 47.2199 55.31Z'\n                fill='#3F4350'\n                fillOpacity='0.72'\n            />\n            <path\n                d='M50.3259 66.9012L42.5985 68.9717C41.5315 69.2576 40.8984 70.3543 41.1843 71.4212L42.2195 75.2849C42.5054 76.3519 43.6021 76.985 44.669 76.6991L52.3964 74.6286C53.4634 74.3427 54.0965 73.246 53.8106 72.1791L52.7754 68.3154C52.4895 67.2485 51.3928 66.6153 50.3259 66.9012Z'\n                fill='#3F4350'\n                fillOpacity='0.48'\n            />\n            <path\n                d='M53.4316 78.4923L45.7042 80.5628C44.6373 80.8487 44.0041 81.9454 44.29 83.0123L45.3253 86.876C45.6111 87.9429 46.7078 88.5761 47.7747 88.2902L55.5021 86.2197C56.5691 85.9338 57.2022 84.8371 56.9164 83.7702L55.8811 79.9065C55.5952 78.8395 54.4985 78.2064 53.4316 78.4923Z'\n                fill='#3F4350'\n                fillOpacity='0.48'\n            />\n            <rect\n                x='50.9264'\n                y='30.5056'\n                width='24'\n                height='2'\n                rx='1'\n                transform='rotate(-15 50.9264 30.5056)'\n                fill='#3F4350'\n                fillOpacity='0.16'\n            />\n            <rect\n                x='54.0323'\n                y='42.0967'\n                width='24'\n                height='2'\n                rx='1'\n                transform='rotate(-15 54.0323 42.0967)'\n                fill='#3F4350'\n                fillOpacity='0.16'\n            />\n            <rect\n                x='53.2743'\n                y='54.723'\n                width='28'\n                height='2'\n                rx='1'\n                transform='rotate(-15 53.2743 54.723)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n            <rect\n                x='56.3802'\n                y='66.3142'\n                width='28'\n                height='2'\n                rx='1'\n                transform='rotate(-15 56.3802 66.3142)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n            <rect\n                x='59.486'\n                y='77.9053'\n                width='28'\n                height='2'\n                rx='1'\n                transform='rotate(-15 59.486 77.9053)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n            <rect\n                x='51.9618'\n                y='34.3693'\n                width='24'\n                height='2'\n                rx='1'\n                transform='rotate(-15 51.9618 34.3693)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n            <rect\n                x='55.0675'\n                y='45.9603'\n                width='24'\n                height='2'\n                rx='1'\n                transform='rotate(-15 55.0675 45.9603)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n            <rect\n                x='54.3097'\n                y='58.5868'\n                width='28'\n                height='2'\n                rx='1'\n                transform='rotate(-15 54.3097 58.5868)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n            <rect\n                x='57.4154'\n                y='70.1779'\n                width='28'\n                height='2'\n                rx='1'\n                transform='rotate(-15 57.4154 70.1779)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n            <rect\n                x='60.5214'\n                y='81.769'\n                width='28'\n                height='2'\n                rx='1'\n                transform='rotate(-15 60.5214 81.769)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n        </g>\n        <g filter='url(#svg2-filter1_d)'>\n            <rect\n                x='131.362'\n                y='15.9796'\n                width='56'\n                height='72'\n                rx='4'\n                transform='rotate(15 131.362 15.9796)'\n                fill='#FFFFFF'\n            />\n            <rect\n                x='131.539'\n                y='16.2858'\n                width='55.5'\n                height='71.5'\n                rx='3.75'\n                transform='rotate(15 131.539 16.2858)'\n                stroke='#3F4350'\n                strokeOpacity='0.08'\n                strokeWidth='0.5'\n            />\n        </g>\n        <g opacity='0.48'>\n            <path\n                d='M149.128 26.9517L137.537 23.8459C136.47 23.56 135.373 24.1932 135.087 25.2601L134.052 29.1238C133.766 30.1907 134.399 31.2874 135.466 31.5733L147.058 34.6791C148.124 34.965 149.221 34.3318 149.507 33.2649L150.542 29.4012C150.828 28.3343 150.195 27.2376 149.128 26.9517Z'\n                fill='var(--button-bg)'\n            />\n            <path\n                d='M146.022 38.5428L134.431 35.4369C133.364 35.1511 132.267 35.7842 131.982 36.8512L130.946 40.7149C130.66 41.7818 131.294 42.8785 132.36 43.1644L143.952 46.2702C145.018 46.5561 146.115 45.9229 146.401 44.856L147.436 40.9923C147.722 39.9253 147.089 38.8287 146.022 38.5428Z'\n                fill='var(--button-bg)'\n            />\n            <path\n                d='M139.053 49.0986L131.325 47.028C130.258 46.7421 129.162 47.3753 128.876 48.4422L127.841 52.3059C127.555 53.3729 128.188 54.4695 129.255 54.7554L136.982 56.826C138.049 57.1119 139.146 56.4787 139.432 55.4118L140.467 51.5481C140.753 50.4811 140.12 49.3845 139.053 49.0986Z'\n                fill='#3F4350'\n                fillOpacity='0.72'\n            />\n            <path\n                d='M135.947 60.6898L128.219 58.6192C127.152 58.3333 126.056 58.9665 125.77 60.0334L124.735 63.8971C124.449 64.964 125.082 66.0607 126.149 66.3466L133.876 68.4172C134.943 68.703 136.04 68.0699 136.326 67.0029L137.361 63.1392C137.647 62.0723 137.014 60.9756 135.947 60.6898Z'\n                fill='#3F4350'\n                fillOpacity='0.48'\n            />\n            <path\n                d='M132.841 72.2808L125.114 70.2103C124.047 69.9244 122.95 70.5575 122.664 71.6245L121.629 75.4882C121.343 76.5551 121.976 77.6518 123.043 77.9377L130.77 80.0082C131.837 80.2941 132.934 79.6609 133.22 78.594L134.255 74.7303C134.541 73.6634 133.908 72.5667 132.841 72.2808Z'\n                fill='#3F4350'\n                fillOpacity='0.48'\n            />\n            <rect\n                x='154.665'\n                y='29.4705'\n                width='24'\n                height='2'\n                rx='1'\n                transform='rotate(15 154.665 29.4705)'\n                fill='#3F4350'\n                fillOpacity='0.16'\n            />\n            <rect\n                x='151.559'\n                y='41.0616'\n                width='24'\n                height='2'\n                rx='1'\n                transform='rotate(15 151.559 41.0616)'\n                fill='#3F4350'\n                fillOpacity='0.16'\n            />\n            <rect\n                x='144.589'\n                y='51.6174'\n                width='28'\n                height='2'\n                rx='1'\n                transform='rotate(15 144.589 51.6174)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n            <rect\n                x='141.484'\n                y='63.2086'\n                width='28'\n                height='2'\n                rx='1'\n                transform='rotate(15 141.484 63.2086)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n            <rect\n                x='138.378'\n                y='74.7997'\n                width='28'\n                height='2'\n                rx='1'\n                transform='rotate(15 138.378 74.7997)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n            <rect\n                x='153.63'\n                y='33.3342'\n                width='24'\n                height='2'\n                rx='1'\n                transform='rotate(15 153.63 33.3342)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n            <rect\n                x='150.524'\n                y='44.9253'\n                width='24'\n                height='2'\n                rx='1'\n                transform='rotate(15 150.524 44.9253)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n            <rect\n                x='143.554'\n                y='55.4812'\n                width='28'\n                height='2'\n                rx='1'\n                transform='rotate(15 143.554 55.4812)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n            <rect\n                x='140.448'\n                y='67.0723'\n                width='28'\n                height='2'\n                rx='1'\n                transform='rotate(15 140.448 67.0723)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n            <rect\n                x='137.342'\n                y='78.6633'\n                width='28'\n                height='2'\n                rx='1'\n                transform='rotate(15 137.342 78.6633)'\n                fill='#3F4350'\n                fillOpacity='0.08'\n            />\n        </g>\n        <g filter='url(#svg2-filter2_d)'>\n            <rect\n                x='70.9996'\n                y='10'\n                width='68'\n                height='88'\n                rx='4'\n                fill='#FFFFFF'\n            />\n            <rect\n                x='71.2496'\n                y='10.25'\n                width='67.5'\n                height='87.5'\n                rx='3.75'\n                stroke='#3F4350'\n                strokeOpacity='0.16'\n                strokeWidth='0.5'\n            />\n        </g>\n        <path\n            d='M96.9995 17.9999H80.9995C79.8949 17.9999 78.9995 18.8954 78.9995 19.9999V25.9999C78.9995 27.1045 79.8949 27.9999 80.9995 27.9999H96.9995C98.1041 27.9999 98.9995 27.1045 98.9995 25.9999V19.9999C98.9995 18.8954 98.1041 17.9999 96.9995 17.9999Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            d='M96.9995 31.9999H80.9995C79.8949 31.9999 78.9995 32.8954 78.9995 33.9999V39.9999C78.9995 41.1045 79.8949 41.9999 80.9995 41.9999H96.9995C98.1041 41.9999 98.9995 41.1045 98.9995 39.9999V33.9999C98.9995 32.8954 98.1041 31.9999 96.9995 31.9999Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            d='M88.9995 45.9999H80.9995C79.8949 45.9999 78.9995 46.8954 78.9995 47.9999V53.9999C78.9995 55.1045 79.8949 55.9999 80.9995 55.9999H88.9995C90.1041 55.9999 90.9995 55.1045 90.9995 53.9999V47.9999C90.9995 46.8954 90.1041 45.9999 88.9995 45.9999Z'\n            fill='#3F4350'\n            fillOpacity='0.72'\n        />\n        <path\n            d='M88.9995 59.9999H80.9995C79.8949 59.9999 78.9995 60.8954 78.9995 61.9999V67.9999C78.9995 69.1045 79.8949 69.9999 80.9995 69.9999H88.9995C90.1041 69.9999 90.9995 69.1045 90.9995 67.9999V61.9999C90.9995 60.8954 90.1041 59.9999 88.9995 59.9999Z'\n            fill='#3F4350'\n            fillOpacity='0.48'\n        />\n        <path\n            d='M88.9995 73.9999H80.9995C79.8949 73.9999 78.9995 74.8954 78.9995 75.9999V81.9999C78.9995 83.1045 79.8949 83.9999 80.9995 83.9999H88.9995C90.1041 83.9999 90.9995 83.1045 90.9995 81.9999V75.9999C90.9995 74.8954 90.1041 73.9999 88.9995 73.9999Z'\n            fill='#3F4350'\n            fillOpacity='0.48'\n        />\n        <rect\n            x='103'\n            y='19.9999'\n            width='28'\n            height='2'\n            rx='1'\n            fill='#3F4350'\n            fillOpacity='0.16'\n        />\n        <rect\n            x='103'\n            y='33.9999'\n            width='28'\n            height='2'\n            rx='1'\n            fill='#3F4350'\n            fillOpacity='0.16'\n        />\n        <rect\n            x='94.9995'\n            y='47.9999'\n            width='36'\n            height='2'\n            rx='1'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='94.9995'\n            y='61.9999'\n            width='36'\n            height='2'\n            rx='1'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='94.9995'\n            y='75.9999'\n            width='36'\n            height='2'\n            rx='1'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='103'\n            y='23.9999'\n            width='28'\n            height='2'\n            rx='1'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='103'\n            y='37.9999'\n            width='28'\n            height='2'\n            rx='1'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='94.9995'\n            y='51.9999'\n            width='36'\n            height='2'\n            rx='1'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='94.9995'\n            y='65.9999'\n            width='36'\n            height='2'\n            rx='1'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='94.9995'\n            y='79.9999'\n            width='36'\n            height='2'\n            rx='1'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <defs>\n            <filter\n                id='svg2-filter0_d'\n                x='0.898071'\n                y='0.877625'\n                width='118.931'\n                height='130.245'\n                filterUnits='userSpaceOnUse'\n                colorInterpolationFilters='sRGB'\n            >\n                <feFlood\n                    floodOpacity='0'\n                    result='BackgroundImageFix'\n                />\n                <feColorMatrix\n                    in='SourceAlpha'\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n                />\n                <feOffset dy='8'/>\n                <feGaussianBlur stdDeviation='12'/>\n                <feColorMatrix\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0'\n                />\n                <feBlend\n                    mode='normal'\n                    in2='BackgroundImageFix'\n                    result='effect1_dropShadow'\n                />\n                <feBlend\n                    mode='normal'\n                    in='SourceGraphic'\n                    in2='effect1_dropShadow'\n                    result='shape'\n                />\n            </filter>\n            <filter\n                id='svg2-filter1_d'\n                x='89.625'\n                y='0.877625'\n                width='118.931'\n                height='130.245'\n                filterUnits='userSpaceOnUse'\n                colorInterpolationFilters='sRGB'\n            >\n                <feFlood\n                    floodOpacity='0'\n                    result='BackgroundImageFix'\n                />\n                <feColorMatrix\n                    in='SourceAlpha'\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n                />\n                <feOffset dy='8'/>\n                <feGaussianBlur stdDeviation='12'/>\n                <feColorMatrix\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0'\n                />\n                <feBlend\n                    mode='normal'\n                    in2='BackgroundImageFix'\n                    result='effect1_dropShadow'\n                />\n                <feBlend\n                    mode='normal'\n                    in='SourceGraphic'\n                    in2='effect1_dropShadow'\n                    result='shape'\n                />\n            </filter>\n            <filter\n                id='svg2-filter2_d'\n                x='46.9996'\n                y='-6'\n                width='116'\n                height='136'\n                filterUnits='userSpaceOnUse'\n                colorInterpolationFilters='sRGB'\n            >\n                <feFlood\n                    floodOpacity='0'\n                    result='BackgroundImageFix'\n                />\n                <feColorMatrix\n                    in='SourceAlpha'\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n                />\n                <feOffset dy='8'/>\n                <feGaussianBlur stdDeviation='12'/>\n                <feColorMatrix\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0'\n                />\n                <feBlend\n                    mode='normal'\n                    in2='BackgroundImageFix'\n                    result='effect1_dropShadow'\n                />\n                <feBlend\n                    mode='normal'\n                    in='SourceGraphic'\n                    in2='effect1_dropShadow'\n                    result='shape'\n                />\n            </filter>\n        </defs>\n    </svg>\n);\n\nexport default DocumentsSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nconst PluginsSvg = () => (\n    <svg\n        width='189'\n        height='132'\n        viewBox='0 0 189 132'\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n        xmlnsXlink='http://www.w3.org/1999/xlink'\n    >\n        <g filter='url(#svg3-filter0_d)'>\n            <rect\n                x='34.25'\n                y='27.7565'\n                width='128'\n                height='71.3739'\n                rx='4'\n                fill='#FFFFFF'\n            />\n            <rect\n                x='34'\n                y='27.5065'\n                width='128.5'\n                height='71.8739'\n                rx='4.25'\n                stroke='#3F4350'\n                strokeOpacity='0.16'\n                strokeWidth='0.5'\n            />\n        </g>\n        <rect\n            x='78.25'\n            y='32.7131'\n            width='78'\n            height='2.97391'\n            rx='1.48696'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='78.25'\n            y='40.6436'\n            width='78'\n            height='2.97391'\n            rx='1.48696'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='78.25'\n            y='47.5827'\n            width='78'\n            height='2.97391'\n            rx='1.48696'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='78.25'\n            y='60.4697'\n            width='78'\n            height='2.97391'\n            rx='1.48696'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='78.25'\n            y='68.4001'\n            width='78'\n            height='2.97391'\n            rx='1.48696'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='78.25'\n            y='75.3392'\n            width='78'\n            height='2.97391'\n            rx='1.48696'\n            fill='#3F4350'\n            fillOpacity='0.08'\n        />\n        <rect\n            x='105.25'\n            y='82.2784'\n            width='24'\n            height='1.98261'\n            rx='0.991304'\n            fill='#5D89EA'\n        />\n        <rect\n            x='105.25'\n            y='54.5219'\n            width='24'\n            height='1.98261'\n            rx='0.991304'\n            fill='#5D89EA'\n        />\n        <rect\n            x='78.25'\n            y='87.2349'\n            width='80'\n            height='7.93043'\n            rx='3.96522'\n            fill='#FFFFFF'\n        />\n        <rect\n            x='78.5'\n            y='87.4849'\n            width='79.5'\n            height='7.43043'\n            rx='3.71522'\n            stroke='#3F4350'\n            strokeOpacity='0.16'\n            strokeWidth='0.5'\n        />\n        <path\n            d='M34.25 31.7565C34.25 29.5474 36.0409 27.7565 38.25 27.7565H74.25V99.1304H38.25C36.0409 99.1304 34.25 97.3396 34.25 95.1304V31.7565Z'\n            fill='#174ab5'\n        />\n        <rect\n            opacity='0.48'\n            x='38.25'\n            y='31.7218'\n            width='3.04766'\n            height='3.22594'\n            rx='1.52383'\n            fill='#FFFFFF'\n        />\n        <rect\n            opacity='0.48'\n            x='43.3301'\n            y='31.7218'\n            width='21.8416'\n            height='3.22594'\n            rx='1.61297'\n            fill='#FFFFFF'\n        />\n        <rect\n            opacity='0.48'\n            x='38.25'\n            y='39.249'\n            width='3.04766'\n            height='3.22594'\n            rx='1.52383'\n            fill='#FFFFFF'\n        />\n        <rect\n            opacity='0.48'\n            x='43.3301'\n            y='39.249'\n            width='21.8416'\n            height='3.22594'\n            rx='1.61297'\n            fill='#FFFFFF'\n        />\n        <rect\n            x='38.25'\n            y='46.7763'\n            width='3.04766'\n            height='3.22594'\n            rx='1.52383'\n            fill='var(--online-indicator)'\n        />\n        <rect\n            x='43.3301'\n            y='46.7763'\n            width='21.8416'\n            height='3.22594'\n            rx='1.61297'\n            fill='#FFFFFF'\n        />\n        <rect\n            x='67.2024'\n            y='46.7763'\n            width='3.04766'\n            height='3.22594'\n            rx='1.52383'\n            fill='#FFFFFF'\n        />\n        <rect\n            opacity='0.48'\n            x='38.25'\n            y='54.3036'\n            width='3.04766'\n            height='3.22594'\n            rx='1.52383'\n            fill='#FFFFFF'\n        />\n        <rect\n            opacity='0.48'\n            x='43.3301'\n            y='54.3036'\n            width='21.8416'\n            height='3.22594'\n            rx='1.61297'\n            fill='#FFFFFF'\n        />\n        <rect\n            opacity='0.48'\n            x='38.25'\n            y='61.8307'\n            width='3.04766'\n            height='3.22594'\n            rx='1.52383'\n            fill='#FFFFFF'\n        />\n        <rect\n            opacity='0.48'\n            x='43.3301'\n            y='61.8307'\n            width='21.8416'\n            height='3.22594'\n            rx='1.61297'\n            fill='#FFFFFF'\n        />\n        <rect\n            x='38.25'\n            y='69.3578'\n            width='3.04766'\n            height='3.22594'\n            rx='1.52383'\n            fill='var(--away-indicator)'\n        />\n        <rect\n            opacity='0.48'\n            x='43.3301'\n            y='69.3578'\n            width='21.8416'\n            height='3.22594'\n            rx='1.61297'\n            fill='#FFFFFF'\n        />\n        <rect\n            opacity='0.48'\n            x='38.25'\n            y='76.8849'\n            width='3.04766'\n            height='3.22594'\n            rx='1.52383'\n            fill='#FFFFFF'\n        />\n        <rect\n            opacity='0.48'\n            x='43.3301'\n            y='76.8849'\n            width='21.8416'\n            height='3.22594'\n            rx='1.61297'\n            fill='#FFFFFF'\n        />\n        <rect\n            opacity='0.48'\n            x='38.25'\n            y='84.4124'\n            width='3.04766'\n            height='3.22594'\n            rx='1.52383'\n            fill='#FFFFFF'\n        />\n        <rect\n            opacity='0.48'\n            x='43.3301'\n            y='84.4124'\n            width='21.8416'\n            height='3.22594'\n            rx='1.61297'\n            fill='#FFFFFF'\n        />\n        <rect\n            x='38.25'\n            y='91.9395'\n            width='3.04766'\n            height='3.22594'\n            rx='1.52383'\n            fill='var(--dnd-indicator)'\n        />\n        <rect\n            opacity='0.48'\n            x='43.3301'\n            y='91.9394'\n            width='21.8416'\n            height='3.22594'\n            rx='1.61297'\n            fill='#FFFFFF'\n        />\n        <g filter='url(#svg3-filter1_d)'>\n            <ellipse\n                cx='160.251'\n                cy='19.8261'\n                rx='20'\n                ry='19.8261'\n                fill='#FFFFFF'\n            />\n            <path\n                d='M179.976 19.8261C179.976 30.6217 171.147 39.3774 160.251 39.3774C149.355 39.3774 140.526 30.6217 140.526 19.8261C140.526 9.03044 149.355 0.27476 160.251 0.27476C171.147 0.27476 179.976 9.03044 179.976 19.8261Z'\n                stroke='#3F4350'\n                strokeOpacity='0.08'\n                strokeWidth='0.549521'\n            />\n        </g>\n        <rect\n            x='148.043'\n            y='7.72437'\n            width='23.8961'\n            height='23.6883'\n            fill='url(#svg3-pattern0)'\n        />\n        <g filter='url(#svg3-filter2_d)'>\n            <ellipse\n                cx='25.7493'\n                cy='35.687'\n                rx='18'\n                ry='17.8435'\n                fill='#FFFFFF'\n            />\n            <path\n                d='M43.4746 35.687C43.4746 45.3877 35.541 53.2558 25.7493 53.2558C15.9577 53.2558 8.02409 45.3877 8.02409 35.687C8.02409 25.9864 15.9577 18.1183 25.7493 18.1183C35.541 18.1183 43.4746 25.9864 43.4746 35.687Z'\n                stroke='#3F4350'\n                strokeOpacity='0.08'\n                strokeWidth='0.549521'\n            />\n        </g>\n        <rect\n            x='14.7614'\n            y='24.7956'\n            width='21.5065'\n            height='21.3195'\n            fill='url(#svg3-pattern1)'\n        />\n        <g filter='url(#svg3-filter3_d)'>\n            <ellipse\n                cx='36.2481'\n                cy='94.1739'\n                rx='15'\n                ry='14.8696'\n                fill='#FFFFFF'\n            />\n            <path\n                d='M50.9733 94.1739C50.9733 102.232 44.3829 108.769 36.2481 108.769C28.1133 108.769 21.5229 102.232 21.5229 94.1739C21.5229 86.1157 28.1133 79.5791 36.2481 79.5791C44.3829 79.5791 50.9733 86.1157 50.9733 94.1739Z'\n                stroke='#3F4350'\n                strokeOpacity='0.08'\n                strokeWidth='0.549521'\n            />\n        </g>\n        <rect\n            x='27.0955'\n            y='85.0977'\n            width='17.9221'\n            height='17.7662'\n            fill='url(#svg3-pattern2)'\n        />\n        <g filter='url(#svg3-filter4_d)'>\n            <ellipse\n                cx='84.2494'\n                cy='24.7826'\n                rx='15'\n                ry='14.8696'\n                fill='#FFFFFF'\n            />\n            <path\n                d='M98.9746 24.7826C98.9746 32.8408 92.3842 39.3774 84.2494 39.3774C76.1146 39.3774 69.5241 32.8408 69.5241 24.7826C69.5241 16.7244 76.1146 10.1878 84.2494 10.1878C92.3842 10.1878 98.9746 16.7244 98.9746 24.7826Z'\n                stroke='#3F4350'\n                strokeOpacity='0.08'\n                strokeWidth='0.549521'\n            />\n        </g>\n        <rect\n            x='75.0923'\n            y='15.7063'\n            width='17.9221'\n            height='17.7662'\n            fill='url(#svg3-pattern3)'\n        />\n        <g filter='url(#svg3-filter5_d)'>\n            <ellipse\n                cx='166.249'\n                cy='99.1304'\n                rx='15'\n                ry='14.8696'\n                fill='#FFFFFF'\n            />\n            <path\n                d='M180.975 99.1304C180.975 107.189 174.384 113.725 166.249 113.725C158.115 113.725 151.524 107.189 151.524 99.1304C151.524 91.0721 158.115 84.5356 166.249 84.5356C174.384 84.5356 180.975 91.0721 180.975 99.1304Z'\n                stroke='#3F4350'\n                strokeOpacity='0.08'\n                strokeWidth='0.549521'\n            />\n        </g>\n        <rect\n            x='157.095'\n            y='90.0544'\n            width='17.9221'\n            height='17.7662'\n            fill='url(#svg3-pattern4)'\n        />\n        <defs>\n            <filter\n                id='svg3-filter0_d'\n                x='9.75'\n                y='11.2565'\n                width='177'\n                height='120.374'\n                filterUnits='userSpaceOnUse'\n                colorInterpolationFilters='sRGB'\n            >\n                <feFlood\n                    floodOpacity='0'\n                    result='BackgroundImageFix'\n                />\n                <feColorMatrix\n                    in='SourceAlpha'\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n                />\n                <feOffset dy='8'/>\n                <feGaussianBlur stdDeviation='12'/>\n                <feColorMatrix\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0'\n                />\n                <feBlend\n                    mode='normal'\n                    in2='BackgroundImageFix'\n                    result='effect1_dropShadow'\n                />\n                <feBlend\n                    mode='normal'\n                    in='SourceGraphic'\n                    in2='effect1_dropShadow'\n                    result='shape'\n                />\n            </filter>\n            <filter\n                id='svg3-filter1_d'\n                x='132.558'\n                y='-4.39617'\n                width='55.3866'\n                height='55.0388'\n                filterUnits='userSpaceOnUse'\n                colorInterpolationFilters='sRGB'\n            >\n                <feFlood\n                    floodOpacity='0'\n                    result='BackgroundImageFix'\n                />\n                <feColorMatrix\n                    in='SourceAlpha'\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n                />\n                <feOffset dy='3.29712'/>\n                <feGaussianBlur stdDeviation='3.84665'/>\n                <feColorMatrix\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0'\n                />\n                <feBlend\n                    mode='normal'\n                    in2='BackgroundImageFix'\n                    result='effect1_dropShadow'\n                />\n                <feBlend\n                    mode='normal'\n                    in='SourceGraphic'\n                    in2='effect1_dropShadow'\n                    result='shape'\n                />\n            </filter>\n            <pattern\n                id='svg3-pattern0'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    xlinkHref='#svg3-image0'\n                    transform='translate(0 -0.00438597) scale(0.00666667)'\n                />\n            </pattern>\n            <filter\n                id='svg3-filter2_d'\n                x='0.0560379'\n                y='13.4474'\n                width='51.3866'\n                height='51.0735'\n                filterUnits='userSpaceOnUse'\n                colorInterpolationFilters='sRGB'\n            >\n                <feFlood\n                    floodOpacity='0'\n                    result='BackgroundImageFix'\n                />\n                <feColorMatrix\n                    in='SourceAlpha'\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n                />\n                <feOffset dy='3.29712'/>\n                <feGaussianBlur stdDeviation='3.84665'/>\n                <feColorMatrix\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0'\n                />\n                <feBlend\n                    mode='normal'\n                    in2='BackgroundImageFix'\n                    result='effect1_dropShadow'\n                />\n                <feBlend\n                    mode='normal'\n                    in='SourceGraphic'\n                    in2='effect1_dropShadow'\n                    result='shape'\n                />\n            </filter>\n            <pattern\n                id='svg3-pattern1'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    xlinkHref='#svg3-image1'\n                    transform='translate(0.027471 0.0869565) scale(0.00279603)'\n                />\n            </pattern>\n            <filter\n                id='svg3-filter3_d'\n                x='13.5548'\n                y='74.9082'\n                width='45.3866'\n                height='45.1257'\n                filterUnits='userSpaceOnUse'\n                colorInterpolationFilters='sRGB'\n            >\n                <feFlood\n                    floodOpacity='0'\n                    result='BackgroundImageFix'\n                />\n                <feColorMatrix\n                    in='SourceAlpha'\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n                />\n                <feOffset dy='3.29712'/>\n                <feGaussianBlur stdDeviation='3.84665'/>\n                <feColorMatrix\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0'\n                />\n                <feBlend\n                    mode='normal'\n                    in2='BackgroundImageFix'\n                    result='effect1_dropShadow'\n                />\n                <feBlend\n                    mode='normal'\n                    in='SourceGraphic'\n                    in2='effect1_dropShadow'\n                    result='shape'\n                />\n            </filter>\n            <pattern\n                id='svg3-pattern2'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    xlinkHref='#svg3-image2'\n                    transform='translate(0 -0.0217786) scale(0.00689655)'\n                />\n            </pattern>\n            <filter\n                id='svg3-filter4_d'\n                x='61.5561'\n                y='5.51686'\n                width='45.3866'\n                height='45.1257'\n                filterUnits='userSpaceOnUse'\n                colorInterpolationFilters='sRGB'\n            >\n                <feFlood\n                    floodOpacity='0'\n                    result='BackgroundImageFix'\n                />\n                <feColorMatrix\n                    in='SourceAlpha'\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n                />\n                <feOffset dy='3.29712'/>\n                <feGaussianBlur stdDeviation='3.84665'/>\n                <feColorMatrix\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0'\n                />\n                <feBlend\n                    mode='normal'\n                    in2='BackgroundImageFix'\n                    result='effect1_dropShadow'\n                />\n                <feBlend\n                    mode='normal'\n                    in='SourceGraphic'\n                    in2='effect1_dropShadow'\n                    result='shape'\n                />\n            </filter>\n            <pattern\n                id='svg3-pattern3'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    xlinkHref='#svg3-image3'\n                    transform='translate(0 -0.00438595) scale(0.00109649)'\n                />\n            </pattern>\n            <filter\n                id='svg3-filter5_d'\n                x='143.556'\n                y='79.8646'\n                width='45.3866'\n                height='45.1257'\n                filterUnits='userSpaceOnUse'\n                colorInterpolationFilters='sRGB'\n            >\n                <feFlood\n                    floodOpacity='0'\n                    result='BackgroundImageFix'\n                />\n                <feColorMatrix\n                    in='SourceAlpha'\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n                />\n                <feOffset dy='3.29712'/>\n                <feGaussianBlur stdDeviation='3.84665'/>\n                <feColorMatrix\n                    type='matrix'\n                    values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0'\n                />\n                <feBlend\n                    mode='normal'\n                    in2='BackgroundImageFix'\n                    result='effect1_dropShadow'\n                />\n                <feBlend\n                    mode='normal'\n                    in='SourceGraphic'\n                    in2='effect1_dropShadow'\n                    result='shape'\n                />\n            </filter>\n            <pattern\n                id='svg3-pattern4'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    xlinkHref='#svg3-image4'\n                    transform='translate(0.0326079 0.0326079) scale(0.00519325)'\n                />\n            </pattern>\n            <image\n                id='svg3-image0'\n                width='150'\n                height='150'\n                xlinkHref='data:image/png;base64,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'\n            />\n            <image\n                id='svg3-image1'\n                width='338'\n                height='311'\n                xlinkHref='data:image/png;base64,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'\n            />\n            <image\n                id='svg3-image2'\n                width='145'\n                height='150'\n                xlinkHref='data:image/png;base64,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'\n            />\n            <image\n                id='svg3-image3'\n                width='912'\n                height='912'\n                xlinkHref='data:image/png;base64,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'\n            />\n            <image\n                id='svg3-image4'\n                width='180'\n                height='180'\n                xlinkHref='data:image/png;base64,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'\n            />\n        </defs>\n    </svg>\n);\n\nexport default PluginsSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useDispatch} from 'react-redux';\nimport {FormattedMessage} from 'react-intl';\nimport classNames from 'classnames';\n\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\nimport {Team} from 'mattermost-redux/types/teams';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {toggleShortcutsModal} from 'actions/global_actions';\nimport {openModal, closeModal} from 'actions/views/modals';\nimport Card from 'components/card/card';\nimport MoreChannels from 'components/more_channels';\nimport TeamMembersModal from 'components/team_members_modal';\nimport MarketplaceModal from 'components/plugin_marketplace';\nimport RemoveNextStepsModal from 'components/sidebar/sidebar_next_steps/remove_next_steps_modal';\n\nimport {browserHistory} from 'utils/browser_history';\nimport {\n    ModalIdentifiers,\n    RecommendedNextSteps,\n    Preferences,\n} from 'utils/constants';\nimport CloseIcon from 'components/widgets/icons/close_icon';\nimport * as Utils from 'utils/utils';\n\nimport DownloadSection from './download_section';\n\nimport {getAnalyticsCategory} from './step_helpers';\nimport IncidentsSvg from './images/incidents.svg';\nimport DocumentsSvg from './images/documents.svg';\nimport PluginsSvg from './images/plugins.svg';\n\nconst openAdminConsole = (isAdmin: boolean) => {\n    trackEvent(getAnalyticsCategory(isAdmin), 'click_admin_console');\n    browserHistory.push('/admin_console/');\n};\n\nconst openIncidentsPlugin = (isAdmin: boolean, team: Team) => {\n    trackEvent(getAnalyticsCategory(isAdmin), 'click_open_incidents');\n    browserHistory.push(`/${team.name}/com.mattermost.plugin-incident-management/playbooks`);\n};\n\ntype Props = {\n    showFinalScreen: boolean;\n    animating: boolean;\n    currentUserId: string;\n    isFirstAdmin: boolean;\n    team: Team;\n    globalHeaderEnabled: boolean;\n    stopAnimating: () => void;\n    savePreferences: (userId: string, preferences: PreferenceType[]) => void;\n    setShowNextStepsView: (show: boolean) => void;\n}\n\nexport default function NextStepsTips(props: Props) {\n    const dispatch = useDispatch();\n    const openPluginMarketplace = () => {\n        trackEvent(getAnalyticsCategory(props.isFirstAdmin), 'click_add_plugins');\n        openModal({modalId: ModalIdentifiers.PLUGIN_MARKETPLACE, dialogType: MarketplaceModal})(dispatch);\n    };\n    const openMoreChannels = openModal({modalId: ModalIdentifiers.MORE_CHANNELS, dialogType: MoreChannels});\n\n    const openViewMembersModal = openModal({\n        modalId: ModalIdentifiers.TEAM_MEMBERS,\n        dialogType: TeamMembersModal,\n    });\n\n    const closeCloseNextStepsModal = closeModal(ModalIdentifiers.REMOVE_NEXT_STEPS_MODAL);\n\n    const onCloseModal = () => closeCloseNextStepsModal(dispatch);\n\n    const closeNextSteps = openModal({\n        modalId: ModalIdentifiers.REMOVE_NEXT_STEPS_MODAL,\n        dialogType: RemoveNextStepsModal,\n        dialogProps: {\n            screenTitle: Utils.localizeMessage(\n                'sidebar_next_steps.tipsAndNextSteps',\n                'Tips & Next Steps',\n            ),\n            globalHeaderEnabled: props.globalHeaderEnabled,\n            onConfirm: () => {\n                props.savePreferences(props.currentUserId, [\n                    {\n                        user_id: props.currentUserId,\n                        category: Preferences.RECOMMENDED_NEXT_STEPS,\n                        name: RecommendedNextSteps.HIDE,\n                        value: 'true',\n                    },\n                ]);\n                props.setShowNextStepsView(false);\n                onCloseModal();\n            },\n            onCancel: onCloseModal,\n        },\n    });\n\n    let nonMobileTips;\n    if (!Utils.isMobile() && props.isFirstAdmin) {\n        nonMobileTips = (\n            <>\n                <Card expanded={true}>\n                    <div className='Card__body'>\n                        <div className='Card__image'>\n                            <PluginsSvg/>\n                        </div>\n                        <h4>\n                            <FormattedMessage\n                                id='next_steps_view.tips.connectPlugins'\n                                defaultMessage='Connect your favorite tools'\n                            />\n                        </h4>\n                        <FormattedMessage\n                            id='next_steps_view.tips.connectPlugins.text'\n                            defaultMessage='Install Mattermost plugins to connect with your favorite tools'\n                        />\n                        <button\n                            className='NextStepsView__button NextStepsView__finishButton primary'\n                            onClick={openPluginMarketplace}\n                        >\n                            <FormattedMessage\n                                id='next_steps_view.tips.addPlugins.button'\n                                defaultMessage='Add plugins'\n                            />\n                        </button>\n                    </div>\n                </Card>\n                <Card expanded={true}>\n                    <div className='Card__body'>\n                        <div className='Card__image'>\n                            <IncidentsSvg/>\n                        </div>\n                        <h4>\n                            <FormattedMessage\n                                id='next_steps_view.tips.resolveIncidents'\n                                defaultMessage='Resolve incidents faster'\n                            />\n                        </h4>\n                        <FormattedMessage\n                            id='next_steps_view.tips.resolveIncidents.text'\n                            defaultMessage='Resolve incidents faster with Mattermost Playbooks.'\n                        />\n                        <button\n                            className='NextStepsView__button NextStepsView__finishButton primary'\n                            onClick={() => openIncidentsPlugin(props.isFirstAdmin, props.team)}\n                        >\n                            <FormattedMessage\n                                id='next_steps_view.tips.resolveIncidents.button'\n                                defaultMessage='Open playbooks'\n                            />\n                        </button>\n                    </div>\n                </Card>\n            </>\n        );\n    } else if (!Utils.isMobile() && !props.isFirstAdmin) {\n        nonMobileTips = (\n            <>\n                <Card expanded={true}>\n                    <div className='Card__body'>\n                        <h4>\n                            <FormattedMessage\n                                id='next_steps_view.tips.configureLogins'\n                                defaultMessage='See who else is here'\n                            />\n                        </h4>\n                        <FormattedMessage\n                            id='next_steps_view.tips.configureLogin.texts'\n                            defaultMessage='Browse or search through the team members directory'\n                        />\n                        <button\n                            className='NextStepsView__button NextStepsView__finishButton primary'\n                            onClick={() => openViewMembersModal(dispatch)}\n                        >\n                            <FormattedMessage\n                                id='next_steps_view.tips.viewMembers'\n                                defaultMessage='View team members'\n                            />\n                        </button>\n                    </div>\n                </Card>\n                <Card expanded={true}>\n                    <div className='Card__body'>\n                        <h4>\n                            <FormattedMessage\n                                id='next_steps_view.tips.addPluginss'\n                                defaultMessage='Learn Keyboard Shortcuts'\n                            />\n                        </h4>\n                        <FormattedMessage\n                            id='next_steps_view.tips.addPlugins.texts'\n                            defaultMessage='Work more efficiently with Keyboard Shortcuts in Mattermost.'\n                        />\n                        <button\n                            className='NextStepsView__button NextStepsView__finishButton primary'\n                            onClick={toggleShortcutsModal}\n                        >\n                            <FormattedMessage\n                                id='next_steps_view.tips.addPlugins.buttons'\n                                defaultMessage='See shortcuts'\n                            />\n                        </button>\n                    </div>\n                </Card>\n            </>\n        );\n    }\n\n    let channelsSection;\n    if (props.isFirstAdmin) {\n        channelsSection = (\n            <Card expanded={true}>\n                <div className='Card__body'>\n                    <div className='Card__image'>\n                        <DocumentsSvg/>\n                    </div>\n                    <h4>\n                        <FormattedMessage\n                            id='next_steps_view.tips.manageWorkspace'\n                            defaultMessage='Manage your workspace'\n                        />\n                    </h4>\n                    <FormattedMessage\n                        id='next_steps_view.tips.manageWorkspace.text'\n                        defaultMessage='Visit the system console to manage users, teams, and plugins'\n                    />\n                    <button\n                        onClick={() => openAdminConsole(props.isFirstAdmin)}\n                        className='NextStepsView__button NextStepsView__finishButton primary'\n                    >\n                        <FormattedMessage\n                            id='next_steps_view.tips.manageWorkspace.button'\n                            defaultMessage='Open the system console'\n                        />\n                    </button>\n                </div>\n            </Card>\n        );\n    } else {\n        channelsSection = (\n            <Card expanded={true}>\n                <div className='Card__body'>\n                    <h4>\n                        <FormattedMessage\n                            id='next_steps_view.tips.exploreChannels'\n                            defaultMessage='Explore channels'\n                        />\n                    </h4>\n                    <FormattedMessage\n                        id='next_steps_view.tips.exploreChannels.text'\n                        defaultMessage='See the channels in your workspace or create a new channel.'\n                    />\n                    <button\n                        className='NextStepsView__button NextStepsView__finishButton primary'\n                        onClick={() => openMoreChannels(dispatch)}\n                    >\n                        <FormattedMessage\n                            id='next_steps_view.tips.exploreChannels.button'\n                            defaultMessage='Browse channels'\n                        />\n                    </button>\n                </div>\n            </Card>\n        );\n    }\n\n    return (\n        <div\n            className={classNames(\n                'NextStepsView__viewWrapper NextStepsView__completedView',\n                {\n                    completed: props.showFinalScreen,\n                    animating: props.animating,\n                },\n            )}\n            onTransitionEnd={props.stopAnimating}\n        >\n            <header className='NextStepsView__header'>\n                <div className='NextStepsView__header-headerText'>\n                    <h1 className='NextStepsView__header-headerTopText'>\n                        <FormattedMessage\n                            id='next_steps_view.tipsAndNextSteps'\n                            defaultMessage='Tips & Next Steps'\n                        />\n                    </h1>\n                    <h2 className='NextStepsView__header-headerBottomText'>\n                        <FormattedMessage\n                            id='next_steps_view.otherAreasToExplore'\n                            defaultMessage='A few other areas to explore'\n                        />\n                    </h2>\n                </div>\n                <CloseIcon\n                    id='closeIcon'\n                    className='close-icon'\n                    onClick={() => closeNextSteps(dispatch)}\n                />\n            </header>\n            <div className='NextStepsView__body'>\n                <div className='NextStepsView__nextStepsCards'>\n                    {nonMobileTips}\n                    {channelsSection}\n                </div>\n                <DownloadSection isFirstAdmin={props.isFirstAdmin}/>\n            </div>\n        </div>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n    id?: string;\n}\n\n// NOTE: this SVG Symbol component needs to be included inside an <SVG /> container\nconst BackgroundPillSymbol = ({id = 'pill'}: Props): JSX.Element => (\n    <symbol\n        id={id}\n        viewBox='0 0 900 535'\n    >\n        <rect\n            className='stipple'\n            x='0'\n            y='0'\n            width='900'\n            height='535'\n            mask={`url(#${id}_stippleMask)`}\n            style={{fill: 'rgba(128, 128, 128, 0.12)'}}\n        />\n        <path\n            className='pill-base'\n            style={{fill: 'rgb(var(--center-channel-bg-rgb))'}}\n            d='M600 40H0V490H600C724.264 490 825 389.264 825 265C825 140.736 724.264 40 600 40Z'\n        />\n        <path\n            className='pill-colour-overlay'\n            style={{fill: 'rgba(var(--center-channel-color-rgb), 0.08)'}}\n            d='M600 40H0V490H600C724.264 490 825 389.264 825 265C825 140.736 724.264 40 600 40Z'\n        />\n        <path\n            className='pill-gradient'\n            style={{fill: `url(#${id}_pillGradient)`}}\n            d='M600 40H0V490H600C724.264 490 825 389.264 825 265C825 140.736 724.264 40 600 40Z'\n        />\n        <defs>\n            <mask id={`${id}_stippleMask`}>\n                <image\n                    x='0'\n                    y='0'\n                    width='900'\n                    height='535'\n                    href='data:image/jpg;base64,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'\n                />\n            </mask>\n            <linearGradient id={`${id}_pillGradient`}>\n                <stop\n                    offset='35%'\n                    style={{stopColor: 'rgb(var(--center-channel-bg-rgb))', stopOpacity: 0}}\n                />\n                <stop\n                    offset='90%'\n                    style={{stopColor: 'rgb(var(--center-channel-bg-rgb))', stopOpacity: 1}}\n                />\n            </linearGradient>\n        </defs>\n    </symbol>\n);\n\nexport default BackgroundPillSymbol;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport styled from 'styled-components';\n\nimport BackgroundPillSymbol from 'components/widgets/background_pill_symbol';\n\nconst OnboardingBgSvgContainer = styled.div`\n    position: relative;\n    background: rgba(var(--center-channel-color-rgb), 0.08);\n    width: 100%;\n    height: 100%;\n    overflow: hidden;\n\n    > svg {\n        position: relative;\n        width: calc(1700 / 1366 * 100%);\n        max-width: 3400px;\n        min-width: 1700px;\n    }\n`;\n\nconst pillID = 'onboardingBackgroundPill';\n\nconst OnboardingBgSvg = (): JSX.Element => (\n    <OnboardingBgSvgContainer>\n        <svg\n            viewBox='0 0 1700 1178'\n            preserveAspectRatio='xMinYMin meet'\n            version='1.1'\n            xmlns='http://www.w3.org/2000/svg'\n            xmlnsXlink='http://www.w3.org/1999/xlink'\n        >\n            <g style={{transform: 'translate(620px, -40px) rotate(45deg)'}}>\n                <use\n                    xlinkHref={`#${pillID}`}\n                    width='900'\n                    height='535'\n                    style={{transform: 'translate(0, -40px)'}}\n                />\n            </g>\n            <g style={{transform: 'translate(400px, 1150px) rotate(-135deg)'}}>\n                <use\n                    xlinkHref={`#${pillID}`}\n                    width='900'\n                    height='535'\n                    style={{transform: 'translate(0, -40px)'}}\n                />\n            </g>\n            <g style={{transform: 'translate(1350px, 750px) rotate(-135deg)'}}>\n                <use\n                    xlinkHref={`#${pillID}`}\n                    width='900'\n                    height='535'\n                    style={{transform: 'translate(0, -40px)'}}\n                />\n            </g>\n            <g style={{transform: 'translate(65px, -350px) rotate(45deg)'}}>\n                <use\n                    xlinkHref={`#${pillID}`}\n                    width='900'\n                    height='535'\n                    style={{transform: 'translate(0, -40px)'}}\n                />\n            </g>\n            <BackgroundPillSymbol id={pillID}/>\n        </svg>\n    </OnboardingBgSvgContainer>\n);\n\nexport default OnboardingBgSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nconst GettingStartedSvg = (): JSX.Element => (\n    <svg\n        width='362'\n        height='263'\n        viewBox='0 0 362 263'\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n        xmlnsXlink='http://www.w3.org/1999/xlink'\n    >\n        <path\n            d='M362 19.9611C362 13.8908 355.93 7.82043 349.861 7.82043H192.052C185.983 7.82043 179.913 13.8908 179.913 19.9611V135.366H362V19.9611Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.64'\n        />\n        <path\n            d='M179.913 135.366V147.507C179.913 153.577 185.983 159.648 192.052 159.648H349.861C355.93 159.648 362 153.577 362 147.507V135.366H179.913Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M179.913 135.366V147.507C179.913 153.577 185.983 159.648 192.052 159.648H349.861C355.93 159.648 362 153.577 362 147.507V135.366H179.913Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M246.678 165.695C246.678 177.835 234.539 177.836 222.446 177.836H319.559C307.42 177.836 295.327 177.835 295.327 165.695V159.601H246.771L246.678 165.695Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M246.678 165.695C246.678 177.835 234.539 177.835 222.446 177.835H319.559C307.42 177.835 295.327 177.835 295.327 165.695V159.601H246.771L246.678 165.695Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <path\n            d='M349.861 20.0072H192.052V123.203H349.861V20.0072Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M270.957 144.264C271.557 144.264 272.144 144.442 272.643 144.776C273.142 145.109 273.531 145.583 273.76 146.138C273.99 146.692 274.05 147.303 273.933 147.891C273.816 148.48 273.527 149.021 273.103 149.445C272.678 149.87 272.137 150.159 271.549 150.276C270.96 150.393 270.35 150.333 269.795 150.103C269.241 149.874 268.767 149.485 268.433 148.986C268.1 148.486 267.922 147.9 267.922 147.299C267.922 146.494 268.242 145.722 268.811 145.153C269.38 144.584 270.152 144.264 270.957 144.264V144.264Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.32'\n        />\n        <path\n            d='M319.513 177.835H222.4V189.976H319.513V177.835Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M319.513 177.835H222.4V189.976H319.513V177.835Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.32'\n        />\n        <path\n            d='M232.301 37.3873L223.9 46.0427L221.108 43.1691L218.292 46.0311L223.889 51.8014L223.9 51.7899L223.912 51.8014L235.105 40.2724L232.301 37.3873Z'\n            fill='var(--online-indicator)'\n        />\n        <path\n            d='M322.617 43.723H245.871V48.0623H322.617V43.723Z'\n            fill='var(--online-indicator)'\n        />\n        <path\n            d='M322.617 70.924H245.871V75.2633H322.617V70.924Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <path\n            d='M232.058 67.1503H220.196V79.0139H232.058V67.1503Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <path\n            d='M322.617 97.0056H245.871V101.345H322.617V97.0056Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <path\n            d='M232.058 93.2319H220.196V105.096H232.058V93.2319Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <path\n            d='M98.0321 246.444C98.3091 242.982 96.1974 238.665 92.8396 233.518C92.2395 232.595 91.6048 231.637 90.924 230.668C84.2775 221.02 74.3308 208.637 67.2343 193.023C54.7721 165.602 58.13 121.056 61.7532 96.7748C61.7532 96.7748 82.8929 89.6541 92.7242 99.5559C93.1071 99.9164 93.4655 100.302 93.7973 100.71C98.4129 106.48 97.6051 119.452 93.0356 136.001C85.6506 162.648 85.6507 175.504 88.824 186.883C91.5703 196.715 96.6821 205.452 101.517 221.008C102.036 222.693 102.521 224.274 102.959 225.74L103.917 228.983C106.063 236.346 107.044 240.593 107.183 243.212C104.125 244.355 101.078 245.405 98.0321 246.444Z'\n            fill='#FFBC1F'\n        />\n        <path\n            d='M103.398 227.391L101.494 228.06L100.698 228.325L94.9974 230.345C93.8598 230.741 92.8589 231.454 92.1126 232.399C85.4892 222.532 74.8039 209.595 67.2343 193.023C54.7721 165.603 58.13 121.056 61.7532 96.775C61.7532 96.775 84.5429 89.112 93.7973 100.756C98.4129 106.527 97.6051 119.498 93.0356 136.047C79.2811 185.672 91.1202 187.46 101.494 221.066C102.198 223.386 102.832 225.475 103.398 227.391Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            d='M103.398 227.391L101.494 228.06L100.698 228.325L94.9974 230.345C93.8598 230.741 92.8589 231.454 92.1126 232.399C85.4892 222.532 74.8039 209.595 67.2343 193.023C54.7721 165.603 58.13 121.056 61.7532 96.775C61.7532 96.775 84.5429 89.112 93.7973 100.756C98.4129 106.527 97.6051 119.498 93.0356 136.047C79.2811 185.672 91.1202 187.46 101.494 221.066C102.198 223.386 102.832 225.475 103.398 227.391Z'\n            fill='black'\n            fillOpacity='0.08'\n        />\n        <mask\n            id='mask3'\n            mask-type='alpha'\n            maskUnits='userSpaceOnUse'\n            x='58'\n            y='94'\n            width='50'\n            height='153'\n        >\n            <path\n                d='M98.0322 246.444C98.3091 242.982 96.1974 238.666 92.8396 233.518C92.2395 232.595 91.6049 231.637 90.924 230.668C84.2775 221.02 74.3308 208.637 67.2343 193.023C54.7721 165.602 58.13 121.056 61.7532 96.7748C61.7532 96.7748 82.8929 89.6542 92.7242 99.556C93.1071 99.9165 93.4655 100.302 93.7973 100.71C98.4129 106.48 97.6051 119.452 93.0356 136.001C85.6506 162.648 85.6508 175.504 88.824 186.883C91.5703 196.716 96.6821 205.452 101.517 221.008C102.036 222.693 102.521 224.275 102.959 225.74L103.917 228.983C106.063 236.346 107.044 240.593 107.183 243.212C104.125 244.355 101.078 245.405 98.0322 246.444Z'\n                fill='#1542A2'\n            />\n        </mask>\n        <g mask='url(#mask3)'>\n            <rect\n                x='69'\n                y='122'\n                width='38.5'\n                height='120'\n                fill='url(#pattern6)'\n            />\n        </g>\n        <path\n            d='M97.9512 241.02C97.6636 241.122 97.3658 241.191 97.0628 241.228C97.8719 243.465 97.8719 245.915 97.0628 248.152C96.2551 250.645 94.4549 253.922 93.901 255.63C92.2048 260.719 93.9702 260.119 99.232 252.884C104.494 245.648 109.167 250.483 106.34 238.054C103.532 239.039 100.736 240.027 97.9512 241.02Z'\n            fill='var(--center-channel-color)'\n        />\n        <path\n            d='M161.197 188.73C155.312 179.855 162.224 182.036 144.892 189.676C143.911 190.126 142.838 190.576 141.684 191.038C140.888 191.372 140.046 191.707 139.157 192.054C118.572 200.028 100.825 197.593 88.824 186.941C86.4815 184.849 84.3868 182.495 82.5813 179.924C71.9653 164.853 76.2233 131.893 92.7242 99.5676C94.1319 96.8094 95.6319 94.0513 97.2128 91.3162L119.922 76.2327C119.922 76.2327 135.523 92.7358 115.364 134.639C96.1397 174.604 117.672 177.928 138.846 176.393L141.915 176.139H142.261C163.932 174.108 161.22 171.984 163.678 182.602C166.136 193.219 167.659 198.458 161.197 188.73Z'\n            fill='#FFBC1F'\n        />\n        <path\n            d='M143.531 190.288C142.192 190.853 140.75 191.442 139.157 192.054C114.637 201.551 94.155 196.289 82.6159 179.913C71.0769 163.537 77.1002 126.122 97.2474 91.3047L119.956 76.2211C119.956 76.2211 135.557 92.7242 115.398 134.628C95.4473 176.081 119.391 178.113 141.246 176.174C141.465 177.409 141.696 178.655 141.915 179.901L142.054 180.767C142.308 182.221 142.55 183.675 142.781 185.129L142.919 185.983C143.15 187.426 143.323 188.857 143.531 190.288Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            d='M163.678 182.555C161.682 173.969 163.066 173.727 152.22 175.008C152.82 178.37 153.377 181.729 153.893 185.083C159.57 181.621 156.778 182.071 161.197 188.73C167.659 198.458 166.159 193.23 163.678 182.555Z'\n            fill='var(--center-channel-color)'\n        />\n        <path\n            d='M84.6929 32.3902C85.0662 26.5153 86.2666 20.7227 88.2585 15.1833C90.6471 9.17072 95.4012 4.48518 97.4898 4.70445C102.29 5.21223 105.959 3.25017 107.69 5.97374C109.075 8.43187 107.483 21.5996 105.936 22.719C104.801 23.2995 103.589 23.7154 102.336 23.954L100.34 34.7445L84.6929 32.3902Z'\n            fill='#FFBC1F'\n        />\n        <path\n            d='M108.36 11.2826C109.94 14.6409 110.956 17.0528 110.956 17.0528C110.806 18.2069 106.767 17.8491 106.767 17.8491L108.36 11.2826Z'\n            fill='#FFBC1F'\n        />\n        <path\n            d='M99.232 23.1463C100.854 23.6071 102.562 23.6782 104.217 23.354C104.852 23.2386 102.948 24.0004 102.313 24.1158C100.467 24.4736 100.813 24.6236 98.9898 24.1158C98.3782 23.9427 98.6089 22.9732 99.232 23.1463Z'\n            fill='#CC8F00'\n        />\n        <path\n            d='M88.0162 2.41948C85.8238 4.05824 84.2315 9.26297 83.4814 11.8942C82.7314 14.5254 84.266 17.0414 84.5429 19.7649C84.5279 20.2919 84.6334 20.8151 84.8514 21.2951C85.0694 21.7751 85.3941 22.1991 85.8008 22.5345C87.197 23.3655 88.9163 22.0037 89.6779 20.5612C90.4395 19.1186 90.9472 17.353 92.4011 16.6144C93.4396 16.072 94.9165 16.1065 95.4935 15.0794C95.9666 14.2369 95.4935 13.1522 95.7935 12.2289C96.1743 11.0056 97.6167 10.5325 98.8629 10.2324L106.317 8.47826C107.736 8.2416 109.091 7.71508 110.298 6.93172C110.945 6.56825 111.444 5.99052 111.71 5.29813C111.976 4.60574 111.993 3.84211 111.756 3.13907C111.519 2.43604 111.045 1.83769 110.414 1.44716C109.784 1.05663 109.037 0.898393 108.302 0.999878C106.629 0.999878 105.394 1.95776 103.848 2.31551C102.279 2.47681 100.697 2.47681 99.1283 2.31551C95.8397 2.32706 90.774 0.342186 88.0162 2.41948Z'\n            fill='#66320A'\n        />\n        <path\n            d='M188.152 7.07052C184.137 7.49752 180.329 12.8406 175.252 22.7886C170.174 32.7365 157.743 45.1167 144 37.5C130.257 29.8832 119.5 31 102.509 30.6708C99.6591 30.44 81.3656 30.5016 77.5 30.9286C49.1369 31.8634 47.3178 61.0802 32.6055 59.3261C13.8083 57.0872 16.2546 35.6101 7.21952 30.3361C-1.81558 25.0621 0.723098 28.905 3.55017 30.2321C6.37724 31.5593 3.55021 32.8404 4.88874 39.5454C6.22728 46.2505 5.86957 69.8854 23.3513 78.1253C36.1366 84.161 51.4719 77.9984 62.9302 68.8929C62.861 71.201 63.0923 73.438 63 76C62.5384 89.3524 59.0692 98.376 59 103.5C75.8246 102.937 92.0167 103.487 108.798 104.819C113.125 105.05 123.568 106.273 127.872 106.561C127.872 106.561 126.626 98.0674 125.887 87.3693C124.86 72.609 124.999 65.177 124.191 56.9024C154.827 66.331 174.801 47.2662 179.002 38.5184C187.079 21.6 185.637 15.4949 185.775 12.9445C186.064 8.96298 192.191 6.65506 188.152 7.07052Z'\n            fill='#FFBC1F'\n        />\n        <path\n            d='M146.831 38.2414C146.219 45.2811 145.25 55.1712 142.815 61.1954C141.557 61.0569 140.392 60.9645 139.238 60.8953L138.396 60.826L136.457 60.6992L135.603 60.6299C132.175 60.3448 128.788 59.679 125.507 58.6449C125.744 61.1996 125.829 63.7661 125.761 66.3308C125.761 66.6078 125.761 66.8963 125.761 67.1733C125.761 68.6158 125.68 70.1276 125.645 71.7895C125.645 71.9626 125.645 72.1357 125.645 72.3318C125.645 72.528 125.645 72.528 125.645 72.6319C125.645 73.786 125.645 74.9401 125.645 76.198C125.645 77.456 125.645 78.5062 125.645 79.7411C125.645 82.0492 125.807 84.5765 126.014 87.4616C126.153 89.4235 126.303 91.3276 126.464 93.1048C126.464 93.3933 126.464 93.6821 126.545 93.9591C126.672 95.4478 126.81 96.8325 126.949 98.1135C126.949 98.3905 126.949 98.6789 127.041 98.9444C127.561 103.653 127.999 106.665 127.999 106.665C123.695 106.365 113.252 105.142 108.925 104.911C92.1475 103.58 75.3084 103.195 58.4877 103.757C58.5889 101.852 58.8788 99.9613 59.3531 98.1135C59.4108 97.825 59.4801 97.5249 59.5609 97.2364C59.7455 96.4055 59.9415 95.5168 60.1608 94.6051C60.23 94.3166 60.2878 94.0165 60.357 93.7165C60.6224 92.5624 60.8879 91.4085 61.1417 90.1044C61.4417 88.5926 61.7302 86.9886 61.9956 85.2806C62.3187 83.0648 62.5956 80.6642 62.7341 78.1483C62.7341 77.8713 62.7341 77.5828 62.7341 77.2943C62.7341 77.0058 62.7341 76.602 62.7341 76.2558C62.7341 75.9096 62.7341 75.5979 62.7341 75.2747V74.4901C62.7341 72.5743 62.8494 70.7509 62.8955 68.9968L57.853 72.9782L57.1953 73.4975L56.0414 74.3976L55.3951 74.9285C53.5027 76.4057 52.0488 77.5251 51.9334 77.5251C46.3485 72.3318 43.8561 62.9264 41.7329 55.7021C42.7728 54.7122 43.7516 53.6601 44.6639 52.5515C44.8831 52.2976 45.0908 52.0323 45.31 51.7668C45.8523 51.1206 46.3832 50.4397 46.9255 49.7472L47.6178 48.8702C47.7794 48.6509 47.9525 48.4431 48.1256 48.2238C52.9028 42.1766 58.5107 35.3562 68.1459 32.3787C69.2075 32.0556 70.3268 31.7671 71.4922 31.5247C72.6461 31.3054 73.8808 31.1208 75.1731 31.0054L76.0963 30.9246C76.5002 30.9246 76.9271 30.9245 77.354 30.8553H77.4578C77.8963 30.8553 78.5311 30.7631 79.3158 30.7285C79.4255 30.9154 79.5448 31.0964 79.6734 31.2709C87.5084 41.9574 99.6129 38.8414 107.067 30.7054H110.021H111.994C115.006 30.7054 117.868 30.7052 120.637 30.8437C127.109 30.9908 133.499 32.3208 139.492 34.7677L140.3 35.1137C140.992 35.4252 141.696 35.76 142.4 36.1063C142.669 36.2371 142.935 36.3757 143.196 36.5218C143.6 36.718 143.992 36.9371 144.35 37.1563C145.15 37.5761 145.979 37.9389 146.831 38.2414Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            opacity='0.56'\n            d='M146.831 38.2414C146.219 45.2811 145.25 55.1712 142.815 61.1954C141.557 61.0569 140.392 60.9645 139.238 60.8953L138.396 60.826L136.457 60.6992L135.603 60.6299C132.175 60.3448 128.788 59.679 125.507 58.6449C125.744 61.1996 125.829 63.7661 125.761 66.3308C125.761 66.6078 125.761 66.8963 125.761 67.1733C125.761 68.6158 125.68 70.1276 125.645 71.7895C125.645 71.9626 125.645 72.1357 125.645 72.3318C125.645 72.528 125.645 72.528 125.645 72.6319C125.645 73.786 125.645 74.9401 125.645 76.198C125.645 77.456 125.645 78.5062 125.645 79.7411C125.645 82.0492 125.807 84.5765 126.014 87.4616C126.153 89.4235 126.303 91.3276 126.464 93.1048C126.464 93.3933 126.464 93.6821 126.545 93.9591C126.672 95.4478 126.81 96.8325 126.949 98.1135C126.949 98.3905 126.949 98.6789 127.041 98.9444C127.561 103.653 127.999 106.665 127.999 106.665C123.695 106.365 113.252 105.142 108.925 104.911C92.1475 103.58 75.3084 103.195 58.4877 103.757C58.5889 101.852 58.8788 99.9613 59.3531 98.1135C59.4108 97.825 59.4801 97.5249 59.5609 97.2364C59.7455 96.4055 59.9415 95.5168 60.1608 94.6051C60.23 94.3166 60.2878 94.0165 60.357 93.7165C60.6224 92.5624 60.8879 91.4085 61.1417 90.1044C61.4417 88.5926 61.7302 86.9886 61.9956 85.2806C62.3187 83.0648 62.5956 80.6642 62.7341 78.1483C62.7341 77.8713 62.7341 77.5828 62.7341 77.2943C62.7341 77.0058 62.7341 76.602 62.7341 76.2558C62.7341 75.9096 62.7341 75.5979 62.7341 75.2747V74.4901C62.7341 72.5743 62.8494 70.7509 62.8955 68.9968L57.853 72.9782L57.1953 73.4975L56.0414 74.3976L55.3951 74.9285C53.5027 76.4057 52.0488 77.5251 51.9334 77.5251C46.3485 72.3318 43.8561 62.9264 41.7329 55.7021C42.7728 54.7122 43.7516 53.6601 44.6639 52.5515C44.8831 52.2976 45.0908 52.0323 45.31 51.7668C45.8523 51.1206 46.3832 50.4397 46.9255 49.7472L47.6178 48.8702C47.7794 48.6509 47.9525 48.4431 48.1256 48.2238C52.9028 42.1766 58.5107 35.3562 68.1459 32.3787C69.2075 32.0556 70.3268 31.7671 71.4922 31.5247C72.6461 31.3054 73.8808 31.1208 75.1731 31.0054L76.0963 30.9246C76.5002 30.9246 76.9271 30.9245 77.354 30.8553H77.4578C77.8963 30.8553 78.5311 30.7631 79.3158 30.7285C79.4255 30.9154 79.5448 31.0964 79.6734 31.2709C87.5084 41.9574 99.6129 38.8414 107.067 30.7054H110.021H111.994C115.006 30.7054 117.868 30.7052 120.637 30.8437C127.109 30.9908 133.499 32.3208 139.492 34.7677L140.3 35.1137C140.992 35.4252 141.696 35.76 142.4 36.1063C142.669 36.2371 142.935 36.3757 143.196 36.5218C143.6 36.718 143.992 36.9371 144.35 37.1563C145.15 37.5761 145.979 37.9389 146.831 38.2414Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <mask\n            id='mask4'\n            mask-type='alpha'\n            maskUnits='userSpaceOnUse'\n            x='41'\n            y='30'\n            width='106'\n            height='77'\n        >\n            <path\n                d='M146.831 38.2414C146.219 45.2812 145.25 55.1713 142.815 61.1954C141.557 61.0569 140.392 60.9646 139.238 60.8953L138.396 60.826L136.457 60.6992L135.603 60.6299C132.174 60.3448 128.788 59.6791 125.507 58.645C125.744 61.1996 125.829 63.7661 125.761 66.3309C125.761 66.6079 125.761 66.8964 125.761 67.1733C125.761 68.6159 125.68 70.1277 125.645 71.7895C125.645 71.9626 125.645 72.1357 125.645 72.3319C125.645 72.5281 125.645 72.5281 125.645 72.632C125.645 73.786 125.645 74.9402 125.645 76.1981C125.645 77.456 125.645 78.5063 125.645 79.7411C125.645 82.0492 125.807 84.5765 126.014 87.4617C126.153 89.4235 126.303 91.3276 126.464 93.1049C126.464 93.3934 126.464 93.6821 126.545 93.9591C126.672 95.4478 126.81 96.8325 126.949 98.1135C126.949 98.3905 126.949 98.679 127.041 98.9444C127.561 103.653 127.999 106.665 127.999 106.665C123.695 106.365 113.252 105.142 108.925 104.911C92.1475 103.58 75.3084 103.195 58.4877 103.757C58.5889 101.852 58.8788 99.9614 59.3531 98.1135C59.4108 97.825 59.4801 97.525 59.5609 97.2365C59.7455 96.4055 59.9415 95.5169 60.1608 94.6052C60.23 94.3167 60.2878 94.0166 60.357 93.7165C60.6224 92.5625 60.8879 91.4086 61.1417 90.1045C61.4417 88.5927 61.7302 86.9886 61.9956 85.2806C62.3187 83.0648 62.5956 80.6642 62.7341 78.1484C62.7341 77.8714 62.7341 77.5829 62.7341 77.2944C62.7341 77.0059 62.7341 76.6021 62.7341 76.2559C62.7341 75.9096 62.7341 75.5979 62.7341 75.2748V74.4901C62.7341 72.5744 62.8494 70.751 62.8955 68.9968L57.853 72.9782L57.1953 73.4975L56.0414 74.3977L55.3951 74.9285C53.5027 76.4057 52.0488 77.5251 51.9334 77.5251C46.3485 72.3319 43.8561 62.9265 41.7329 55.7021C42.7728 54.7122 43.7516 53.6601 44.6639 52.5516C44.8831 52.2977 45.0908 52.0323 45.31 51.7669C45.8523 51.1206 46.3832 50.4397 46.9255 49.7473L47.6178 48.8702C47.7794 48.6509 47.9525 48.4431 48.1256 48.2239C52.9028 42.1766 58.5107 35.3562 68.1459 32.3788C69.2075 32.0556 70.3268 31.7671 71.4922 31.5248C72.6461 31.3055 73.8807 31.1209 75.1731 31.0055L76.0963 30.9246C76.5002 30.9246 76.9271 30.9246 77.354 30.8553H77.4578C77.8963 30.8553 78.5311 30.7632 79.3158 30.7285C79.4255 30.9154 79.5448 31.0964 79.6734 31.2709C87.5084 41.9574 99.6129 38.8415 107.067 30.7054H110.021H111.994C115.006 30.7054 117.868 30.7053 120.637 30.8438C127.109 30.9909 133.499 32.3209 139.492 34.7677L140.3 35.1137C140.992 35.4253 141.696 35.7601 142.4 36.1063C142.669 36.2371 142.934 36.3757 143.196 36.5219C143.6 36.7181 143.992 36.9371 144.35 37.1564C145.15 37.5762 145.979 37.9389 146.831 38.2414Z'\n                fill='var(--center-channel-bg)'\n            />\n        </mask>\n        <g mask='url(#mask4)'>\n            <rect\n                x='104'\n                y='41.5'\n                width='43'\n                height='65.5'\n                fill='url(#pattern7)'\n            />\n        </g>\n        <path\n            d='M126.995 98.9212C104.402 97.421 81.785 94.5012 59.3069 98.0788C59.3646 97.7903 59.4339 97.4902 59.5147 97.2017C81.9005 93.7395 104.413 96.5901 126.903 98.0903C126.926 98.3673 126.995 98.6558 126.995 98.9212Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M126.499 93.936C104.445 91.1229 82.1106 91.3363 60.1147 94.5705C60.184 94.282 60.2416 93.9819 60.3108 93.6819C82.2186 90.4996 104.456 90.298 126.418 93.082C126.441 93.3705 126.464 93.659 126.499 93.936Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M125.633 71.7547C125.633 72.0317 125.633 72.3089 125.633 72.5974C104.644 71.3049 83.4237 74.6745 62.711 78.1136C62.711 77.8366 62.711 77.5481 62.711 77.2596C83.4467 73.8205 104.655 70.4737 125.633 71.7547Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M125.761 66.3308C125.761 66.6078 125.761 66.8963 125.761 67.1733C104.618 67.2719 83.5684 69.9853 63.0917 75.2516C63.0056 75.2807 62.9124 75.2807 62.8264 75.2516V74.467C83.3882 69.1672 104.527 66.4344 125.761 66.3308V66.3308Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M111.094 30.6476C108.533 36.7756 104.436 42.0266 97.132 42.5113C88.8008 43.0768 78.9003 38.8183 75.3578 30.9708L76.281 30.8899C79.7427 38.2643 89.2047 42.2113 97.132 41.6689C103.929 41.2073 107.771 36.3486 110.206 30.6476H111.094Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M143.208 36.4641C142.169 44.6425 140.846 52.7862 139.238 60.8953L138.396 60.826C140.034 52.6245 141.373 44.3654 142.411 36.0485C142.681 36.1793 142.946 36.3179 143.208 36.4641Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M56.1683 74.363L55.5222 74.8941C50.7249 68.0906 47.1123 60.5248 44.837 52.5168C45.0562 52.263 45.2638 51.9976 45.4831 51.7322C47.7257 59.831 51.3398 67.4854 56.1683 74.363Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M47.7909 48.8124C49.3659 57.5003 52.8414 65.7325 57.9685 72.9204L57.3107 73.44C52.233 66.3529 48.7492 58.2505 47.0986 49.6895L47.7909 48.8124Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M140.311 35.0562C139.542 43.6734 138.255 52.2365 136.457 60.6992L135.603 60.6299C137.427 52.0769 138.73 43.421 139.503 34.7099L140.311 35.0562Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M104.344 10.7287C102.44 10.7287 100.594 10.7287 99.0822 10.7287C96.232 10.8556 94.9049 11.3057 93.4972 13.9139C93.2548 14.3755 94.0049 14.664 94.2472 14.2139C94.5249 13.5004 94.9959 12.8785 95.6073 12.4178C96.2188 11.9571 96.9466 11.6758 97.7089 11.6058C99.1746 11.4772 100.646 11.4234 102.117 11.4443C102.74 11.4443 103.479 11.4443 104.275 11.4443C104.286 11.1904 104.309 10.9364 104.344 10.7287Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M104.921 14.0063C104.471 13.6024 104.145 13.0783 103.981 12.4959C103.818 11.9134 103.823 11.2965 103.998 10.7172C103.992 10.3313 104.074 9.94918 104.239 9.60004C104.403 9.2509 104.645 8.9439 104.947 8.70294C105.248 8.46199 105.601 8.29338 105.978 8.20988C106.355 8.12638 106.745 8.13039 107.121 8.22143C107.496 8.31247 107.845 8.48811 108.141 8.73506C108.438 8.98202 108.674 9.29359 108.832 9.64596C108.989 9.99834 109.064 10.3822 109.05 10.7679C109.036 11.1536 108.934 11.531 108.752 11.8712C108.348 13.5677 106.952 14.687 105.648 14.3754C105.382 14.3063 105.134 14.1805 104.921 14.0063ZM107.356 9.19375C107.223 9.09945 107.074 9.02922 106.917 8.9861C106.029 8.77837 105.071 9.63227 104.771 10.9017C104.471 12.1712 104.956 13.3599 105.833 13.5677C106.709 13.7754 107.667 12.9215 107.967 11.652C108.106 11.228 108.125 10.7736 108.021 10.3396C107.917 9.90566 107.695 9.50894 107.379 9.19375H107.356Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M81.3812 12.5868C78.2656 12.5868 76.0386 16.2449 75.0693 20.1109C74.3424 23.0192 69.8537 23.5731 66.9113 22.9961C63.9688 22.4191 61.3032 19.6609 58.1299 19.5339C55.8221 19.4647 53.7567 20.7918 51.7258 21.842C49.6949 22.8922 47.2024 23.7462 45.1484 22.7191C42.8406 21.5651 42.0099 18.6454 39.7251 17.5836C37.4404 16.5219 34.6595 17.8606 32.8017 19.6148C29.9051 22.3785 28.0919 26.087 27.6898 30.0706C27.4098 32.1351 27.7767 34.2357 28.7399 36.0831C29.2309 36.9965 29.9626 37.7581 30.8556 38.285C31.7486 38.8119 32.7688 39.0841 33.8056 39.0722C36.3788 38.9107 38.5827 36.6255 41.1444 36.914C42.5958 37.1938 43.8845 38.0199 44.7446 39.2221C45.6677 40.3762 46.3717 41.6573 47.2948 42.7882C48.704 44.5097 50.5921 45.7743 52.7203 46.4217C54.8484 47.0692 57.121 47.0704 59.2499 46.4254C61.3788 45.7803 63.2684 44.5179 64.6795 42.7981C66.0906 41.0783 66.9597 38.9783 67.1766 36.7641C67.3267 35.2639 67.1766 33.6481 68.0421 32.4018C69.196 30.763 71.5037 30.4975 73.4423 30.5436C75.3809 30.5898 77.631 30.6821 79.2118 29.3896C82.4774 26.6314 79.6157 20.3189 82.8351 17.4915C83.6789 16.8761 84.6029 16.3791 85.5814 16.0143C86.8392 15.4026 89.1701 12.9675 86.92 12.125C86.193 11.848 84.9698 12.3327 84.2313 12.4251C83.2868 12.552 82.334 12.6062 81.3812 12.5868Z'\n            fill='#66320A'\n        />\n        <mask\n            id='mask5'\n            mask-type='alpha'\n            maskUnits='userSpaceOnUse'\n            x='27'\n            y='12'\n            width='61'\n            height='35'\n        >\n            <path\n                d='M81.3812 12.5868C78.2656 12.5868 76.0386 16.2449 75.0693 20.111C74.3424 23.0192 69.8537 23.5732 66.9113 22.9961C63.9688 22.4191 61.3031 19.6609 58.1299 19.534C55.8221 19.4647 53.7567 20.7919 51.7258 21.8421C49.6949 22.8923 47.2024 23.7463 45.1484 22.7192C42.8406 21.5651 42.0099 18.6454 39.7251 17.5837C37.4404 16.522 34.6595 17.8607 32.8017 19.6148C29.9051 22.3785 28.0919 26.0871 27.6898 30.0706C27.4098 32.1352 27.7767 34.2358 28.7399 36.0832C29.2309 36.9965 29.9626 37.7582 30.8556 38.2851C31.7486 38.812 32.7688 39.0842 33.8056 39.0723C36.3788 38.9107 38.5827 36.6256 41.1444 36.9141C42.5958 37.1938 43.8845 38.02 44.7446 39.2222C45.6677 40.3762 46.3717 41.6573 47.2948 42.7883C48.704 44.5097 50.5921 45.7743 52.7203 46.4218C54.8484 47.0692 57.121 47.0705 59.2499 46.4254C61.3788 45.7804 63.2684 44.518 64.6795 42.7982C66.0906 41.0783 66.9597 38.9783 67.1766 36.7642C67.3266 35.2639 67.1766 33.6482 68.0421 32.4018C69.196 30.7631 71.5037 30.4975 73.4423 30.5437C75.3808 30.5899 77.631 30.6822 79.2118 29.3896C82.4774 26.6315 79.6157 20.319 82.8351 17.4916C83.6789 16.8762 84.6029 16.3792 85.5814 16.0144C86.8392 15.4027 89.1701 12.9675 86.92 12.1251C86.193 11.8481 84.9698 12.3328 84.2313 12.4251C83.2868 12.5521 82.334 12.6063 81.3812 12.5868Z'\n                fill='#66320A'\n            />\n        </mask>\n        <g mask='url(#mask5)'>\n            <rect\n                x='27.5'\n                y='12'\n                width='60.5'\n                height='35'\n                fill='url(#pattern8)'\n            />\n        </g>\n        <path\n            d='M84.4275 17.8259C84.2158 16.1537 84.1426 14.4671 84.2083 12.7828C84.2891 10.6017 80.8966 10.6132 80.8273 12.7828C80.7693 14.7703 80.8852 16.7588 81.1736 18.7261C81.2997 19.1522 81.5879 19.5119 81.9763 19.7277C82.3647 19.9435 82.8221 19.9982 83.2505 19.8801C83.6709 19.7513 84.0265 19.4674 84.2451 19.0859C84.4637 18.7044 84.5289 18.2538 84.4275 17.8259V17.8259Z'\n            fill='var(--center-channel-bg)'\n        />\n        <defs>\n            <pattern\n                id='pattern6'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    xlinkHref='#image6'\n                    transform='scale(0.012987 0.00416667)'\n                />\n            </pattern>\n            <pattern\n                id='pattern7'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    xlinkHref='#image7'\n                    transform='scale(0.0116279 0.00763359)'\n                />\n            </pattern>\n            <pattern\n                id='pattern8'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    xlinkHref='#image8'\n                    transform='scale(0.00826446 0.0142857)'\n                />\n            </pattern>\n            <image\n                id='image6'\n                width='77'\n                height='240'\n                xlinkHref='data:image/png;base64,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'\n            />\n            <image\n                id='image7'\n                width='86'\n                height='131'\n                xlinkHref='data:image/png;base64,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'\n            />\n            <image\n                id='image8'\n                width='121'\n                height='70'\n                xlinkHref='data:image/png;base64,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'\n            />\n        </defs>\n    </svg>\n);\n\nexport default GettingStartedSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nconst CloudLogoSvg = () => (\n    <svg\n        width='250'\n        height='28'\n        viewBox='0 0 250 28'\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n    >\n        <path\n            fillRule='evenodd'\n            clipRule='evenodd'\n            d='M65.0078 13.9091C65.0078 13.485 64.9367 13.1399 64.7947 12.8744C64.6531 12.6095 64.4579 12.4012 64.2096 12.2513C63.9614 12.1008 63.6553 11.9988 63.2919 11.9461C62.9282 11.893 62.5247 11.8666 62.0813 11.8666C61.1237 11.8666 60.1041 12.0521 59.0222 12.4235C58.7738 11.9636 58.5877 11.5301 58.4638 11.1235C58.3397 10.7169 58.2773 10.2305 58.2773 9.66432C59.0577 9.39911 59.8379 9.20461 60.6183 9.08082C61.3984 8.95703 62.126 8.89497 62.7995 8.89497C64.6441 8.89497 66.085 9.33705 67.1225 10.2217C68.1599 11.106 68.6787 12.5206 68.6787 14.4661V22.4249C68.0579 22.6194 67.3041 22.8053 66.4174 22.9821C65.531 23.159 64.5288 23.2475 63.4115 23.2475C62.5071 23.2475 61.6778 23.1678 60.924 23.0086C60.1704 22.8495 59.5229 22.584 58.9826 22.2126C58.4414 21.8416 58.0248 21.3639 57.7318 20.7802C57.4395 20.1964 57.2931 19.4803 57.2931 18.6312C57.2931 17.7825 57.4749 17.0706 57.8384 16.4958C58.2019 15.9211 58.6721 15.461 59.2482 15.1163C59.8248 14.7714 60.4675 14.5238 61.1771 14.3734C61.8864 14.223 62.5957 14.1479 63.305 14.1479C63.8194 14.1479 64.3868 14.1746 65.0078 14.2274V13.9091ZM65.0078 16.6418C64.7947 16.6063 64.5643 16.5751 64.3157 16.5488C64.0675 16.5224 63.8463 16.5092 63.6509 16.5092C62.7818 16.5092 62.0946 16.6636 61.589 16.9733C61.0837 17.2828 60.831 17.7825 60.831 18.4722C60.831 18.9322 60.9286 19.2856 61.1237 19.5335C61.3187 19.7809 61.5538 19.9622 61.8286 20.077C62.1036 20.1921 62.3959 20.2629 62.7063 20.2895C63.017 20.3158 63.2874 20.3295 63.5176 20.3295C63.7839 20.3295 64.05 20.3071 64.3157 20.2629C64.582 20.2186 64.8124 20.1791 65.0078 20.1435V16.6418ZM71.1971 12.0785H69.4678L69.3345 11.5479L74.3094 5.20742H74.9212V9.21326H78.1399C78.1928 9.47881 78.2285 9.7174 78.2466 9.92954C78.2639 10.142 78.2727 10.363 78.2727 10.5931C78.2727 10.8405 78.2639 11.0792 78.2466 11.3092C78.2285 11.5393 78.1928 11.7957 78.1399 12.0785H74.9212V17.4642C74.9212 18.0123 74.9657 18.4543 75.0545 18.7906C75.1427 19.1262 75.2714 19.3918 75.4398 19.5864C75.6086 19.7809 75.8167 19.9135 76.065 19.9842C76.3133 20.0553 76.6062 20.0906 76.9427 20.0906C77.209 20.0906 77.4703 20.0684 77.7278 20.0241C77.9847 19.98 78.2108 19.9402 78.4059 19.9049C78.5303 20.2405 78.6186 20.59 78.672 20.9527C78.7254 21.3152 78.7517 21.6383 78.7517 21.9211C78.7517 22.1156 78.7475 22.2791 78.7385 22.4119C78.7296 22.5443 78.7165 22.673 78.6985 22.7965C77.8829 22.9913 77.0407 23.0881 76.1716 23.0881C74.5576 23.0881 73.3249 22.7125 72.4739 21.9611C71.6227 21.2092 71.1971 19.9842 71.1971 18.2865V12.0785ZM81.1775 12.0785H79.4485L79.3152 11.5479L84.2899 5.20742H84.9017V9.21326H88.1205C88.1736 9.47881 88.2093 9.7174 88.2271 9.92954C88.2445 10.142 88.2535 10.363 88.2535 10.5931C88.2535 10.8405 88.2445 11.0792 88.2271 11.3092C88.2093 11.5393 88.1736 11.7957 88.1205 12.0785H84.9017V17.4642C84.9017 18.0123 84.9465 18.4543 85.0349 18.7906C85.1236 19.1262 85.2522 19.3918 85.4205 19.5864C85.5892 19.7809 85.7971 19.9135 86.0457 19.9842C86.2938 20.0553 86.5868 20.0906 86.9233 20.0906C87.1894 20.0906 87.4509 20.0684 87.7083 20.0241C87.9654 19.98 88.1916 19.9402 88.3866 19.9049C88.5107 20.2405 88.5993 20.59 88.6524 20.9527C88.7059 21.3152 88.7325 21.6383 88.7325 21.9211C88.7325 22.1156 88.728 22.2791 88.719 22.4119C88.7104 22.5443 88.6971 22.673 88.6792 22.7965C87.8634 22.9913 87.0214 23.0881 86.152 23.0881C84.5384 23.0881 83.3056 22.7125 82.4544 21.9611C81.6032 21.2092 81.1775 19.9842 81.1775 18.2865V12.0785ZM98.6515 14.5993C98.6161 13.7499 98.3809 13.0648 97.9465 12.543C97.5121 12.0212 96.9047 11.7601 96.1242 11.7601C95.2375 11.7601 94.5637 12.0078 94.1025 12.503C93.6415 12.9983 93.3668 13.697 93.2782 14.5993H98.6515ZM93.2513 17.2253C93.3224 18.2865 93.6948 19.0558 94.3686 19.5335C95.0425 20.011 95.9292 20.2498 97.029 20.2498C97.6319 20.2498 98.2478 20.1921 98.8776 20.077C99.5073 19.9622 100.106 19.7986 100.673 19.5864C100.868 19.9402 101.037 20.3646 101.179 20.8599C101.321 21.3547 101.4 21.8857 101.418 22.4515C100.035 22.9821 98.4739 23.2475 96.7359 23.2475C95.4592 23.2475 94.3644 23.0707 93.4506 22.7168C92.5375 22.3632 91.7926 21.8721 91.2163 21.2447C90.6399 20.6168 90.2141 19.8694 89.9394 19.0026C89.6646 18.1361 89.5274 17.19 89.5274 16.1644C89.5274 15.1561 89.669 14.2099 89.9528 13.3256C90.2363 12.4409 90.6576 11.6719 91.2163 11.0177C91.7749 10.363 92.4664 9.84577 93.2913 9.46541C94.1159 9.08523 95.078 8.89497 96.1775 8.89497C97.1351 8.89497 97.9865 9.06301 98.7312 9.39911C99.4761 9.73504 100.11 10.1951 100.633 10.7789C101.156 11.3621 101.551 12.0567 101.817 12.8613C102.083 13.6659 102.216 14.5284 102.216 15.4478C102.216 15.7839 102.203 16.1158 102.176 16.4427C102.15 16.7696 102.118 17.0308 102.083 17.2253H93.2513ZM103.659 9.21326C103.925 9.16052 104.177 9.1205 104.417 9.09422C104.657 9.06725 104.918 9.0542 105.202 9.0542C105.468 9.0542 105.73 9.07217 105.986 9.1071C106.244 9.14254 106.496 9.18697 106.744 9.24005C106.798 9.32857 106.847 9.4566 106.891 9.62464C106.935 9.79269 106.975 9.96956 107.011 10.1554C107.046 10.3411 107.077 10.5264 107.104 10.7125C107.13 10.8983 107.152 11.0525 107.17 11.1769C107.56 10.6283 108.039 10.1374 108.607 9.70434C109.174 9.27091 109.884 9.0542 110.735 9.0542C110.912 9.0542 111.116 9.06301 111.347 9.08082C111.577 9.09846 111.746 9.12491 111.852 9.16052C111.888 9.33705 111.914 9.54053 111.932 9.77048C111.95 10.0004 111.959 10.2392 111.959 10.4869C111.959 10.7876 111.945 11.1147 111.919 11.4684C111.892 11.8221 111.843 12.1581 111.772 12.4765C111.577 12.4409 111.36 12.4235 111.121 12.4235C110.881 12.4235 110.735 12.4235 110.682 12.4235C110.38 12.4235 110.043 12.4545 109.671 12.5162C109.298 12.5783 108.944 12.7417 108.607 13.0073C108.27 13.2725 107.99 13.6705 107.769 14.2013C107.547 14.7315 107.436 15.4744 107.436 16.4296V22.9559C107.117 23.0086 106.798 23.044 106.478 23.0617C106.159 23.0795 105.849 23.0881 105.547 23.0881C105.246 23.0881 104.94 23.0795 104.63 23.0617C104.319 23.044 103.996 23.0086 103.659 22.9559V9.21326ZM113.729 9.21326C113.977 9.16052 114.226 9.1205 114.474 9.09422C114.722 9.06725 114.997 9.0542 115.299 9.0542C115.6 9.0542 115.866 9.06725 116.097 9.09422C116.327 9.1205 116.567 9.16052 116.815 9.21326C116.868 9.30177 116.917 9.43014 116.961 9.59819C117.006 9.76607 117.046 9.94327 117.081 10.1286C117.117 10.3145 117.147 10.4956 117.174 10.6724C117.201 10.8493 117.223 10.9997 117.241 11.1235C117.382 10.8585 117.569 10.5931 117.799 10.3275C118.03 10.0627 118.305 9.82406 118.624 9.61142C118.943 9.39911 119.302 9.22665 119.701 9.09422C120.1 8.96127 120.548 8.89497 121.045 8.89497C123.19 8.89497 124.565 9.70875 125.168 11.336C125.522 10.6814 126.024 10.1113 126.671 9.62464C127.318 9.13814 128.138 8.89497 129.132 8.89497C130.692 8.89497 131.84 9.32433 132.576 10.182C133.313 11.0396 133.681 12.3794 133.681 14.2013V22.9292C133.042 23.0354 132.412 23.0881 131.792 23.0881C131.171 23.0881 130.541 23.0354 129.903 22.9292V15.1824C129.903 14.2274 129.783 13.4936 129.544 12.9808C129.305 12.4679 128.821 12.2113 128.094 12.2113C127.792 12.2113 127.496 12.2557 127.203 12.3439C126.91 12.4321 126.644 12.5957 126.405 12.8347C126.166 13.0734 125.971 13.4097 125.82 13.843C125.669 14.2759 125.594 14.8378 125.594 15.5275V22.9292C124.955 23.0354 124.325 23.0881 123.705 23.0881C123.084 23.0881 122.454 23.0354 121.816 22.9292V15.1824C121.816 14.2274 121.696 13.4936 121.457 12.9808C121.217 12.4679 120.734 12.2113 120.007 12.2113C119.706 12.2113 119.404 12.2557 119.103 12.3439C118.802 12.4321 118.531 12.6047 118.291 12.8613C118.052 13.1175 117.861 13.4757 117.72 13.9357C117.578 14.3954 117.507 14.9969 117.507 15.7396V22.9292C116.868 23.0354 116.239 23.0881 115.618 23.0881C114.997 23.0881 114.368 23.0354 113.729 22.9292V9.21326ZM141.374 20.3822C142.367 20.3822 143.081 20.0154 143.515 19.2812C143.95 18.5474 144.167 17.4905 144.167 16.1112C144.167 14.7315 143.95 13.6749 143.515 12.9408C143.081 12.2066 142.367 11.8398 141.374 11.8398C140.398 11.8398 139.693 12.2066 139.259 12.9408C138.824 13.6749 138.607 14.7315 138.607 16.1112C138.607 17.4905 138.824 18.5474 139.259 19.2812C139.693 20.0154 140.398 20.3822 141.374 20.3822ZM141.374 23.2475C140.256 23.2475 139.285 23.0661 138.461 22.7035C137.636 22.3412 136.953 21.837 136.412 21.1913C135.872 20.5457 135.464 19.7897 135.189 18.923C134.914 18.0564 134.776 17.1193 134.776 16.1112C134.776 15.1031 134.914 14.1567 135.189 13.2725C135.464 12.3882 135.872 11.6232 136.412 10.9777C136.953 10.3319 137.636 9.82406 138.461 9.45219C139.285 9.08082 140.256 8.89497 141.374 8.89497C142.491 8.89497 143.466 9.08082 144.3 9.45219C145.133 9.82406 145.825 10.3319 146.375 10.9777C146.925 11.6232 147.332 12.3882 147.599 13.2725C147.865 14.1567 147.997 15.1031 147.997 16.1112C147.997 17.1193 147.865 18.0564 147.599 18.923C147.332 19.7897 146.925 20.5457 146.375 21.1913C145.825 21.837 145.133 22.3412 144.3 22.7035C143.466 23.0661 142.491 23.2475 141.374 23.2475ZM152.101 16.9601C151.107 16.6769 150.331 16.257 149.773 15.6998C149.214 15.1429 148.935 14.3071 148.935 13.1926C148.935 11.8484 149.418 10.7966 150.385 10.036C151.351 9.27532 152.668 8.89497 154.335 8.89497C155.027 8.89497 155.709 8.95703 156.383 9.08082C157.057 9.20461 157.74 9.39012 158.432 9.63804C158.396 10.0976 158.307 10.5751 158.165 11.0706C158.024 11.5656 157.855 11.9988 157.66 12.3707C157.235 12.1937 156.765 12.0389 156.25 11.9061C155.736 11.7737 155.195 11.7073 154.628 11.7073C154.025 11.7073 153.555 11.8001 153.218 11.9858C152.881 12.1716 152.712 12.4679 152.712 12.8744C152.712 13.2635 152.832 13.5377 153.071 13.697C153.311 13.856 153.652 14.0068 154.096 14.1479L155.612 14.5993C156.109 14.7405 156.556 14.9128 156.955 15.1163C157.354 15.3198 157.696 15.5718 157.979 15.8722C158.263 16.1729 158.485 16.5444 158.644 16.9865C158.804 17.4288 158.884 17.968 158.884 18.6046C158.884 19.2593 158.746 19.8694 158.472 20.4353C158.197 21.0013 157.798 21.4921 157.275 21.9075C156.751 22.3235 156.117 22.6506 155.372 22.8892C154.628 23.1281 153.785 23.2475 152.845 23.2475C152.419 23.2475 152.03 23.2341 151.675 23.2077C151.32 23.1809 150.979 23.1368 150.651 23.0751C150.323 23.013 149.999 22.938 149.68 22.8495C149.361 22.7612 149.015 22.6462 148.642 22.5046C148.678 22.0269 148.762 21.545 148.895 21.0588C149.028 20.5727 149.201 20.0992 149.414 19.6393C149.999 19.8694 150.553 20.0417 151.077 20.1567C151.6 20.2718 152.145 20.3295 152.712 20.3295C152.961 20.3295 153.231 20.3071 153.524 20.2629C153.816 20.2186 154.087 20.1391 154.335 20.0241C154.584 19.9091 154.792 19.7587 154.96 19.5732C155.129 19.3875 155.213 19.1443 155.213 18.8434C155.213 18.4192 155.084 18.114 154.827 17.9283C154.57 17.7428 154.211 17.5787 153.75 17.4374L152.101 16.9601ZM161.301 12.0785H159.573L159.439 11.5479L164.414 5.20742H165.026V9.21326H168.245C168.298 9.47881 168.333 9.7174 168.351 9.92954C168.369 10.142 168.378 10.363 168.378 10.5931C168.378 10.8405 168.369 11.0792 168.351 11.3092C168.333 11.5393 168.298 11.7957 168.245 12.0785H165.026V17.4642C165.026 18.0123 165.07 18.4543 165.159 18.7906C165.248 19.1262 165.376 19.3918 165.544 19.5864C165.713 19.7809 165.921 19.9135 166.17 19.9842C166.418 20.0553 166.711 20.0906 167.047 20.0906C167.314 20.0906 167.575 20.0684 167.832 20.0241C168.089 19.98 168.315 19.9402 168.51 19.9049C168.635 20.2405 168.723 20.59 168.776 20.9527C168.83 21.3152 168.856 21.6383 168.856 21.9211C168.856 22.1156 168.852 22.2791 168.843 22.4119C168.834 22.5443 168.821 22.673 168.803 22.7965C167.988 22.9913 167.145 23.0881 166.276 23.0881C164.662 23.0881 163.43 22.7125 162.578 21.9611C161.727 21.2092 161.301 19.9842 161.301 18.2865V12.0785ZM36.6469 5.01376C37.4156 4.9071 38.1551 4.85352 38.8659 4.85352C39.6152 4.85352 40.355 4.9071 41.085 5.01376L45.84 14.8563L50.7391 5.01376C51.3347 4.9071 51.9972 4.85352 52.7275 4.85352C53.4576 4.85352 54.1585 4.9071 54.8312 5.01376L55.8109 23.0874C55.0811 23.1943 54.3894 23.2475 53.7363 23.2475C53.0827 23.2475 52.4394 23.1943 51.8056 23.0874L51.2866 10.0199L47.0791 19.0516C46.8099 19.0872 46.5316 19.1187 46.2432 19.145C45.955 19.1718 45.6671 19.185 45.3787 19.185C45.1288 19.185 44.8793 19.1762 44.6297 19.1584C44.3799 19.1406 44.1206 19.1048 43.8515 19.0516L39.9323 9.83271L39.5288 23.0874C38.9142 23.1943 38.3185 23.2475 37.7419 23.2475C37.1271 23.2475 36.4929 23.1943 35.8401 23.0874L36.6469 5.01376Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            fillRule='evenodd'\n            clipRule='evenodd'\n            d='M18.7948 11.4403C18.7948 11.4403 18.8382 13.3508 17.5134 14.6487C16.1884 15.9466 14.5611 15.828 13.5025 15.4695C12.4437 15.1111 11.079 14.2168 10.8149 12.3811C10.5508 10.5453 11.7458 9.05398 11.7458 9.05398L14.3497 5.81577L15.8663 3.96632L17.1681 2.35463C17.1681 2.35463 17.7655 1.55441 17.9358 1.38925C17.9695 1.35653 18.0041 1.33505 18.038 1.31852L18.0627 1.30591L18.0672 1.3042C18.1388 1.27335 18.2213 1.26671 18.3009 1.29364C18.3787 1.32006 18.4391 1.37357 18.4773 1.43953L18.4853 1.45232L18.4923 1.46698C18.5108 1.50209 18.5263 1.54214 18.5337 1.59157C18.5684 1.82626 18.557 2.82488 18.557 2.82488L18.6121 4.89573L18.6934 7.28616L18.7948 11.4403ZM22.1655 2.67214C26.9815 6.17725 29.1903 12.5383 27.1819 18.4877C24.7101 25.8095 16.7872 29.7357 9.48576 27.2572C2.18429 24.7785 -1.73091 16.8337 0.740758 9.51193C2.75249 3.55281 8.37502 -0.156665 14.3346 0.00508354L12.4243 2.26837C8.88883 2.90939 5.83622 5.33051 4.63642 8.88471C2.85125 14.1726 5.84335 19.9664 11.3195 21.8253C16.7956 23.6842 22.682 20.9045 24.4672 15.6166C25.6631 12.0742 24.7149 8.30504 22.3125 5.6436L22.1655 2.67214Z'\n            fill='var(--button-bg)'\n        />\n        <path\n            d='M198.691 7.40234C196.809 7.40234 195.32 8.03125 194.227 9.28906C193.141 10.5391 192.598 12.2539 192.598 14.4336C192.598 16.6758 193.121 18.4102 194.168 19.6367C195.223 20.8555 196.723 21.4648 198.668 21.4648C199.863 21.4648 201.227 21.25 202.758 20.8203V22.5664C201.57 23.0117 200.105 23.2344 198.363 23.2344C195.84 23.2344 193.891 22.4688 192.516 20.9375C191.148 19.4062 190.465 17.2305 190.465 14.4102C190.465 12.6445 190.793 11.0977 191.449 9.76953C192.113 8.44141 193.066 7.41797 194.309 6.69922C195.559 5.98047 197.027 5.62109 198.715 5.62109C200.512 5.62109 202.082 5.94922 203.426 6.60547L202.582 8.31641C201.285 7.70703 199.988 7.40234 198.691 7.40234Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            d='M207.188 23H205.243V4.76562H207.188V23Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            d='M221.439 16.5664C221.439 18.6602 220.912 20.2969 219.857 21.4766C218.803 22.6484 217.346 23.2344 215.486 23.2344C214.338 23.2344 213.318 22.9648 212.428 22.4258C211.537 21.8867 210.85 21.1133 210.365 20.1055C209.881 19.0977 209.639 17.918 209.639 16.5664C209.639 14.4727 210.162 12.8438 211.209 11.6797C212.256 10.5078 213.709 9.92188 215.568 9.92188C217.365 9.92188 218.791 10.5195 219.846 11.7148C220.908 12.9102 221.439 14.5273 221.439 16.5664ZM211.654 16.5664C211.654 18.207 211.982 19.457 212.639 20.3164C213.295 21.1758 214.26 21.6055 215.533 21.6055C216.807 21.6055 217.771 21.1797 218.428 20.3281C219.092 19.4688 219.424 18.2148 219.424 16.5664C219.424 14.9336 219.092 13.6953 218.428 12.8516C217.771 12 216.799 11.5742 215.51 11.5742C214.236 11.5742 213.275 11.9922 212.627 12.8281C211.978 13.6641 211.654 14.9102 211.654 16.5664Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            d='M225.729 10.1562V18.4883C225.729 19.5352 225.968 20.3164 226.444 20.832C226.921 21.3477 227.667 21.6055 228.682 21.6055C230.026 21.6055 231.007 21.2383 231.624 20.5039C232.249 19.7695 232.561 18.5703 232.561 16.9062V10.1562H234.507V23H232.901L232.62 21.2773H232.515C232.116 21.9102 231.561 22.3945 230.85 22.7305C230.147 23.0664 229.343 23.2344 228.436 23.2344C226.874 23.2344 225.702 22.8633 224.921 22.1211C224.147 21.3789 223.761 20.1914 223.761 18.5586V10.1562H225.729Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <path\n            d='M246.426 21.2773H246.32C245.422 22.582 244.078 23.2344 242.289 23.2344C240.609 23.2344 239.301 22.6602 238.363 21.5117C237.433 20.3633 236.969 18.7305 236.969 16.6133C236.969 14.4961 237.437 12.8516 238.375 11.6797C239.312 10.5078 240.617 9.92188 242.289 9.92188C244.031 9.92188 245.367 10.5547 246.297 11.8203H246.449L246.367 10.8945L246.32 9.99219V4.76562H248.265V23H246.683L246.426 21.2773ZM242.535 21.6055C243.863 21.6055 244.824 21.2461 245.418 20.5273C246.019 19.8008 246.32 18.6328 246.32 17.0234V16.6133C246.32 14.793 246.015 13.4961 245.406 12.7227C244.805 11.9414 243.84 11.5508 242.512 11.5508C241.371 11.5508 240.496 11.9961 239.887 12.8867C239.285 13.7695 238.984 15.0195 238.984 16.6367C238.984 18.2773 239.285 19.5156 239.887 20.3516C240.488 21.1875 241.371 21.6055 242.535 21.6055Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.48'\n        />\n        <line\n            x1='180.5'\n            y1='2.18557e-08'\n            x2='180.5'\n            y2='28'\n            stroke='var(--center-channel-color)'\n            strokeOpacity='0.32'\n        />\n    </svg>\n);\n\nexport default CloudLogoSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nconst Logo = (): JSX.Element => {\n    return (\n        <svg\n            width='170'\n            height='28'\n            viewBox='0 0 170 28'\n            fill='none'\n            xmlns='http://www.w3.org/2000/svg'\n        >\n            <path\n                fillRule='evenodd'\n                clipRule='evenodd'\n                d='M65.0077 13.909C65.0077 13.4849 64.9366 13.1398 64.7946 12.8742C64.653 12.6094 64.4578 12.4011 64.2095 12.2512C63.9613 12.1006 63.6552 11.9987 63.2918 11.946C62.9281 11.8929 62.5246 11.8665 62.0812 11.8665C61.1235 11.8665 60.104 12.052 59.0221 12.4233C58.7736 11.9635 58.5876 11.53 58.4637 11.1234C58.3395 10.7167 58.2771 10.2304 58.2771 9.6642C59.0576 9.39899 59.8377 9.20449 60.6182 9.0807C61.3983 8.95691 62.1259 8.89485 62.7994 8.89485C64.6439 8.89485 66.0848 9.33692 67.1224 10.2216C68.1598 11.1059 68.6785 12.5205 68.6785 14.466V22.4248C68.0577 22.6193 67.304 22.8052 66.4172 22.982C65.5309 23.1589 64.5287 23.2474 63.4114 23.2474C62.5069 23.2474 61.6777 23.1677 60.9239 23.0085C60.1703 22.8494 59.5228 22.5839 58.9825 22.2125C58.4412 21.8415 58.0246 21.3638 57.7317 20.7801C57.4394 20.1963 57.293 19.4801 57.293 18.6311C57.293 17.7824 57.4748 17.0705 57.8383 16.4957C58.2018 15.921 58.672 15.4609 59.248 15.1162C59.8246 14.7713 60.4674 14.5237 61.1769 14.3733C61.8863 14.2229 62.5955 14.1477 63.3049 14.1477C63.8193 14.1477 64.3867 14.1745 65.0077 14.2273V13.909ZM65.0077 16.6417C64.7946 16.6062 64.5642 16.575 64.3156 16.5487C64.0674 16.5223 63.8461 16.509 63.6508 16.509C62.7817 16.509 62.0944 16.6635 61.5889 16.9732C61.0836 17.2826 60.8309 17.7824 60.8309 18.472C60.8309 18.9321 60.9285 19.2855 61.1235 19.5334C61.3186 19.7808 61.5537 19.9621 61.8285 20.0769C62.1034 20.192 62.3957 20.2627 62.7062 20.2894C63.0169 20.3156 63.2872 20.3294 63.5175 20.3294C63.7837 20.3294 64.0498 20.307 64.3156 20.2627C64.5819 20.2185 64.8123 20.179 65.0077 20.1434V16.6417ZM71.1969 12.0784H69.4677L69.3344 11.5478L74.3093 5.20729H74.9211V9.21313H78.1398C78.1927 9.47869 78.2284 9.71728 78.2464 9.92942C78.2638 10.1419 78.2726 10.3628 78.2726 10.593C78.2726 10.8404 78.2638 11.0791 78.2464 11.3091C78.2284 11.5392 78.1927 11.7956 78.1398 12.0784H74.9211V17.4641C74.9211 18.0121 74.9656 18.4542 75.0544 18.7905C75.1426 19.1261 75.2713 19.3916 75.4397 19.5863C75.6085 19.7808 75.8166 19.9134 76.0649 19.9841C76.3131 20.0552 76.6061 20.0904 76.9426 20.0904C77.2089 20.0904 77.4702 20.0682 77.7277 20.024C77.9846 19.9799 78.2107 19.94 78.4058 19.9048C78.5302 20.2403 78.6185 20.5898 78.6719 20.9526C78.7253 21.3151 78.7516 21.6381 78.7516 21.921C78.7516 22.1155 78.7474 22.279 78.7383 22.4117C78.7295 22.5442 78.7164 22.6729 78.6984 22.7963C77.8827 22.9912 77.0405 23.088 76.1715 23.088C74.5575 23.088 73.3248 22.7124 72.4737 21.961C71.6225 21.2091 71.1969 19.9841 71.1969 18.2863V12.0784ZM81.1773 12.0784H79.4484L79.3151 11.5478L84.2898 5.20729H84.9016V9.21313H88.1204C88.1734 9.47869 88.2091 9.71728 88.227 9.92942C88.2443 10.1419 88.2533 10.3628 88.2533 10.593C88.2533 10.8404 88.2443 11.0791 88.227 11.3091C88.2091 11.5392 88.1734 11.7956 88.1204 12.0784H84.9016V17.4641C84.9016 18.0121 84.9463 18.4542 85.0348 18.7905C85.1235 19.1261 85.2521 19.3916 85.4204 19.5863C85.5891 19.7808 85.797 19.9134 86.0456 19.9841C86.2937 20.0552 86.5867 20.0904 86.9232 20.0904C87.1893 20.0904 87.4508 20.0682 87.7082 20.024C87.9653 19.9799 88.1915 19.94 88.3865 19.9048C88.5106 20.2403 88.5992 20.5898 88.6523 20.9526C88.7058 21.3151 88.7323 21.6381 88.7323 21.921C88.7323 22.1155 88.7279 22.279 88.7189 22.4117C88.7102 22.5442 88.697 22.6729 88.6791 22.7963C87.8633 22.9912 87.0213 23.088 86.1519 23.088C84.5382 23.088 83.3055 22.7124 82.4543 21.961C81.6031 21.2091 81.1773 19.9841 81.1773 18.2863V12.0784ZM98.6514 14.5991C98.616 13.7497 98.3808 13.0647 97.9464 12.5429C97.5119 12.0211 96.9046 11.76 96.1241 11.76C95.2374 11.76 94.5635 12.0077 94.1024 12.5029C93.6414 12.9982 93.3667 13.6968 93.2781 14.5991H98.6514ZM93.2512 17.2252C93.3223 18.2863 93.6946 19.0557 94.3685 19.5334C95.0424 20.0109 95.9291 20.2497 97.0289 20.2497C97.6318 20.2497 98.2477 20.192 98.8775 20.0769C99.5071 19.9621 100.105 19.7984 100.673 19.5863C100.868 19.94 101.037 20.3645 101.179 20.8598C101.32 21.3546 101.4 21.8856 101.418 22.4514C100.035 22.982 98.4738 23.2474 96.7357 23.2474C95.4591 23.2474 94.3643 23.0705 93.4505 22.7166C92.5374 22.3631 91.7925 21.872 91.2162 21.2446C90.6398 20.6166 90.214 19.8693 89.9393 19.0025C89.6645 18.1359 89.5273 17.1899 89.5273 16.1643C89.5273 15.156 89.6689 14.2098 89.9527 13.3255C90.2361 12.4408 90.6575 11.6718 91.2162 11.0176C91.7748 10.3628 92.4663 9.84564 93.2912 9.46529C94.1158 9.08511 95.0779 8.89485 96.1773 8.89485C97.135 8.89485 97.9863 9.06289 98.7311 9.39899C99.476 9.73491 100.11 10.195 100.633 10.7788C101.156 11.362 101.551 12.0565 101.817 12.8612C102.083 13.6658 102.216 14.5283 102.216 15.4477C102.216 15.7838 102.203 16.1156 102.176 16.4426C102.15 16.7695 102.118 17.0307 102.083 17.2252H93.2512ZM103.659 9.21313C103.925 9.1604 104.177 9.12038 104.417 9.09409C104.656 9.06713 104.918 9.05407 105.202 9.05407C105.468 9.05407 105.729 9.07205 105.986 9.10698C106.244 9.14242 106.496 9.18685 106.744 9.23993C106.798 9.32844 106.847 9.45647 106.891 9.62452C106.935 9.79257 106.975 9.96943 107.01 10.1553C107.046 10.341 107.077 10.5263 107.103 10.7123C107.13 10.8982 107.152 11.0523 107.17 11.1768C107.56 10.6282 108.039 10.1373 108.607 9.70422C109.174 9.27079 109.884 9.05407 110.735 9.05407C110.912 9.05407 111.116 9.06289 111.347 9.0807C111.577 9.09833 111.745 9.12479 111.852 9.1604C111.887 9.33692 111.914 9.54041 111.932 9.77035C111.95 10.0003 111.958 10.2391 111.958 10.4868C111.958 10.7875 111.945 11.1146 111.919 11.4683C111.892 11.822 111.843 12.158 111.772 12.4764C111.577 12.4408 111.36 12.4233 111.121 12.4233C110.881 12.4233 110.735 12.4233 110.682 12.4233C110.38 12.4233 110.043 12.4544 109.67 12.5161C109.298 12.5782 108.944 12.7416 108.607 13.0072C108.269 13.2724 107.99 13.6704 107.768 14.2011C107.547 14.7314 107.436 15.4743 107.436 16.4295V22.9557C107.117 23.0085 106.798 23.0439 106.478 23.0615C106.159 23.0794 105.849 23.088 105.547 23.088C105.246 23.088 104.94 23.0794 104.629 23.0615C104.319 23.0439 103.996 23.0085 103.659 22.9557V9.21313ZM113.729 9.21313C113.977 9.1604 114.226 9.12038 114.474 9.09409C114.722 9.06713 114.997 9.05407 115.299 9.05407C115.6 9.05407 115.866 9.06713 116.097 9.09409C116.327 9.12038 116.567 9.1604 116.815 9.21313C116.868 9.30165 116.917 9.43002 116.961 9.59807C117.005 9.76595 117.046 9.94315 117.081 10.1285C117.117 10.3143 117.147 10.4955 117.174 10.6723C117.201 10.8492 117.223 10.9996 117.241 11.1234C117.382 10.8583 117.569 10.593 117.799 10.3274C118.03 10.0625 118.305 9.82394 118.624 9.61129C118.943 9.39899 119.302 9.22653 119.701 9.09409C120.1 8.96115 120.548 8.89485 121.045 8.89485C123.19 8.89485 124.565 9.70863 125.168 11.3359C125.522 10.6813 126.023 10.1112 126.671 9.62452C127.318 9.13801 128.138 8.89485 129.132 8.89485C130.692 8.89485 131.84 9.32421 132.576 10.1819C133.313 11.0394 133.68 12.3792 133.68 14.2011V22.9291C133.042 23.0353 132.412 23.088 131.792 23.088C131.171 23.088 130.541 23.0353 129.903 22.9291V15.1823C129.903 14.2273 129.783 13.4935 129.544 12.9807C129.304 12.4678 128.821 12.2112 128.094 12.2112C127.792 12.2112 127.496 12.2556 127.203 12.3438C126.91 12.432 126.644 12.5956 126.405 12.8346C126.166 13.0733 125.971 13.4096 125.82 13.8428C125.669 14.2758 125.593 14.8377 125.593 15.5274V22.9291C124.955 23.0353 124.325 23.088 123.705 23.088C123.084 23.088 122.454 23.0353 121.816 22.9291V15.1823C121.816 14.2273 121.696 13.4935 121.457 12.9807C121.217 12.4678 120.734 12.2112 120.007 12.2112C119.706 12.2112 119.404 12.2556 119.103 12.3438C118.801 12.432 118.531 12.6046 118.291 12.8612C118.052 13.1174 117.861 13.4755 117.719 13.9356C117.577 14.3953 117.506 14.9968 117.506 15.7395V22.9291C116.868 23.0353 116.239 23.088 115.618 23.088C114.997 23.088 114.368 23.0353 113.729 22.9291V9.21313ZM141.374 20.3821C142.367 20.3821 143.081 20.0153 143.515 19.2811C143.949 18.5473 144.167 17.4904 144.167 16.1111C144.167 14.7314 143.949 13.6748 143.515 12.9407C143.081 12.2065 142.367 11.8397 141.374 11.8397C140.398 11.8397 139.693 12.2065 139.259 12.9407C138.824 13.6748 138.607 14.7314 138.607 16.1111C138.607 17.4904 138.824 18.5473 139.259 19.2811C139.693 20.0153 140.398 20.3821 141.374 20.3821ZM141.374 23.2474C140.256 23.2474 139.285 23.066 138.461 22.7034C137.636 22.341 136.953 21.8369 136.412 21.1911C135.871 20.5456 135.463 19.7896 135.189 18.9229C134.914 18.0562 134.776 17.1192 134.776 16.1111C134.776 15.1029 134.914 14.1566 135.189 13.2724C135.463 12.3881 135.871 11.6231 136.412 10.9776C136.953 10.3318 137.636 9.82394 138.461 9.45206C139.285 9.0807 140.256 8.89485 141.374 8.89485C142.491 8.89485 143.466 9.0807 144.3 9.45206C145.133 9.82394 145.825 10.3318 146.375 10.9776C146.925 11.6231 147.332 12.3881 147.599 13.2724C147.865 14.1566 147.997 15.1029 147.997 16.1111C147.997 17.1192 147.865 18.0562 147.599 18.9229C147.332 19.7896 146.925 20.5456 146.375 21.1911C145.825 21.8369 145.133 22.341 144.3 22.7034C143.466 23.066 142.491 23.2474 141.374 23.2474ZM152.1 16.9599C151.107 16.6768 150.331 16.2569 149.773 15.6997C149.214 15.1428 148.935 14.307 148.935 13.1925C148.935 11.8483 149.418 10.7964 150.385 10.0359C151.351 9.2752 152.668 8.89485 154.335 8.89485C155.027 8.89485 155.709 8.95691 156.383 9.0807C157.057 9.20449 157.74 9.39 158.431 9.63792C158.396 10.0975 158.307 10.575 158.165 11.0705C158.024 11.5655 157.855 11.9987 157.66 12.3706C157.234 12.1936 156.765 12.0387 156.25 11.906C155.736 11.7735 155.195 11.7072 154.628 11.7072C154.025 11.7072 153.555 11.8 153.218 11.9857C152.881 12.1715 152.712 12.4678 152.712 12.8742C152.712 13.2634 152.832 13.5376 153.071 13.6968C153.311 13.8559 153.652 14.0066 154.095 14.1477L155.612 14.5991C156.108 14.7404 156.556 14.9127 156.955 15.1162C157.354 15.3197 157.696 15.5716 157.979 15.8721C158.263 16.1728 158.485 16.5443 158.644 16.9864C158.804 17.4286 158.884 17.9679 158.884 18.6045C158.884 19.2592 158.746 19.8693 158.471 20.4352C158.197 21.0012 157.797 21.492 157.274 21.9074C156.751 22.3234 156.117 22.6505 155.372 22.8891C154.628 23.128 153.785 23.2474 152.845 23.2474C152.419 23.2474 152.03 23.234 151.675 23.2076C151.32 23.1808 150.979 23.1367 150.651 23.0749C150.323 23.0129 149.999 22.9379 149.68 22.8494C149.36 22.7611 149.015 22.6461 148.642 22.5045C148.678 22.0268 148.762 21.5449 148.895 21.0587C149.028 20.5725 149.201 20.0991 149.414 19.6392C149.999 19.8693 150.553 20.0416 151.076 20.1566C151.6 20.2717 152.145 20.3294 152.712 20.3294C152.961 20.3294 153.231 20.307 153.523 20.2627C153.816 20.2185 154.087 20.1389 154.335 20.024C154.583 19.909 154.792 19.7586 154.96 19.5731C155.129 19.3874 155.213 19.1442 155.213 18.8432C155.213 18.4191 155.084 18.1139 154.827 17.9282C154.57 17.7427 154.211 17.5785 153.75 17.4373L152.1 16.9599ZM161.301 12.0784H159.573L159.439 11.5478L164.414 5.20729H165.025V9.21313H168.244C168.298 9.47869 168.333 9.71728 168.351 9.92942C168.368 10.1419 168.378 10.3628 168.378 10.593C168.378 10.8404 168.368 11.0791 168.351 11.3091C168.333 11.5392 168.298 11.7956 168.244 12.0784H165.025V17.4641C165.025 18.0121 165.07 18.4542 165.159 18.7905C165.248 19.1261 165.376 19.3916 165.544 19.5863C165.713 19.7808 165.921 19.9134 166.169 19.9841C166.418 20.0552 166.711 20.0904 167.047 20.0904C167.313 20.0904 167.575 20.0682 167.832 20.024C168.089 19.9799 168.315 19.94 168.51 19.9048C168.635 20.2403 168.723 20.5898 168.776 20.9526C168.83 21.3151 168.856 21.6381 168.856 21.921C168.856 22.1155 168.852 22.279 168.843 22.4117C168.834 22.5442 168.821 22.6729 168.803 22.7963C167.987 22.9912 167.145 23.088 166.276 23.088C164.662 23.088 163.429 22.7124 162.578 21.961C161.727 21.2091 161.301 19.9841 161.301 18.2863V12.0784ZM36.6468 5.01364C37.4155 4.90698 38.155 4.85339 38.8657 4.85339C39.6151 4.85339 40.3549 4.90698 41.0849 5.01364L45.8399 14.8562L50.739 5.01364C51.3346 4.90698 51.9971 4.85339 52.7274 4.85339C53.4575 4.85339 54.1584 4.90698 54.831 5.01364L55.8108 23.0873C55.081 23.1942 54.3893 23.2474 53.7362 23.2474C53.0826 23.2474 52.4393 23.1942 51.8054 23.0873L51.2865 10.0198L47.079 19.0515C46.8098 19.0871 46.5314 19.1186 46.2431 19.1449C45.9549 19.1717 45.667 19.1849 45.3786 19.1849C45.1287 19.1849 44.8792 19.1761 44.6296 19.1583C44.3798 19.1405 44.1205 19.1047 43.8513 19.0515L39.9322 9.83259L39.5287 23.0873C38.914 23.1942 38.3184 23.2474 37.7418 23.2474C37.127 23.2474 36.4927 23.1942 35.84 23.0873L36.6468 5.01364Z'\n                fill='var(--button-bg)'\n            />\n            <path\n                fillRule='evenodd'\n                clipRule='evenodd'\n                d='M18.7948 11.4403C18.7948 11.4403 18.8382 13.3508 17.5134 14.6487C16.1884 15.9466 14.5611 15.828 13.5025 15.4695C12.4437 15.1111 11.079 14.2168 10.8149 12.3811C10.5508 10.5453 11.7458 9.05398 11.7458 9.05398L14.3497 5.81577L15.8663 3.96632L17.1681 2.35463C17.1681 2.35463 17.7655 1.55441 17.9358 1.38925C17.9695 1.35653 18.0041 1.33505 18.038 1.31852L18.0627 1.30591L18.0672 1.3042C18.1388 1.27335 18.2213 1.26671 18.3009 1.29364C18.3787 1.32006 18.4391 1.37357 18.4773 1.43953L18.4853 1.45232L18.4923 1.46698C18.5108 1.50209 18.5263 1.54214 18.5337 1.59157C18.5684 1.82626 18.557 2.82488 18.557 2.82488L18.6121 4.89573L18.6934 7.28616L18.7948 11.4403ZM22.1655 2.67214C26.9815 6.17725 29.1903 12.5383 27.1819 18.4877C24.7101 25.8095 16.7872 29.7357 9.48576 27.2572C2.18429 24.7785 -1.73091 16.8337 0.740758 9.51193C2.75249 3.55281 8.37502 -0.156665 14.3346 0.00508354L12.4243 2.26837C8.88883 2.90939 5.83622 5.33051 4.63642 8.88471C2.85125 14.1726 5.84335 19.9664 11.3195 21.8253C16.7956 23.6842 22.682 20.9045 24.4672 15.6166C25.6631 12.0742 24.7149 8.30504 22.3125 5.6436L22.1655 2.67214Z'\n                fill='var(--button-bg)'\n            />\n        </svg>\n    );\n};\n\nexport default Logo;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nconst OnboardingSuccessSvg = () => (\n    <svg\n        width='444'\n        height='313'\n        viewBox='0 0 444 313'\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n    >\n        <g filter='url(#filter0_f)'>\n            <path\n                fillRule='evenodd'\n                clipRule='evenodd'\n                d='M375.682 51.9045C375.687 51.0023 375.514 50.1079 375.173 49.2725C374.832 48.4372 374.329 47.6771 373.695 47.0359C373.06 46.3947 372.305 45.8849 371.473 45.5356C370.641 45.1862 369.748 45.0042 368.846 45H63.8364C62.0143 45.0098 60.2706 45.7425 58.9887 47.0373C57.7068 48.332 56.9915 50.0827 57.0001 51.9045V235H57V256.651C57 258.464 57.7203 260.203 59.0023 261.484C60.2844 262.766 62.0232 263.486 63.8363 263.486H177.93L174.5 293H257L252.492 263.486H366C372.432 263.491 375.686 260.871 375.682 254C375.681 253.275 375.682 241.333 375.682 236.761C375.682 235.671 375.682 235 375.682 235L375.682 51.9045Z'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.08'\n            />\n        </g>\n        <path\n            d='M211.507 300.921C293.251 300.921 359.518 298.651 359.518 295.849C359.518 293.048 293.251 290.777 211.507 290.777C129.762 290.777 63.4951 293.048 63.4951 295.849C63.4951 298.651 129.762 300.921 211.507 300.921Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.08'\n        />\n        <path\n            opacity='0.1'\n            d='M253.208 293.482H212.135L170.979 292.955L171.224 290.845H252.802L253.208 293.482Z'\n            fill='var(--center-channel-color)'\n        />\n        <path\n            d='M253.287 294.008L170.979 292.955L171.224 290.844L175.201 256.026H247.485L252.802 290.844L253.208 293.482L253.287 294.008Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M370.682 46.9045C370.687 46.0023 370.514 45.1079 370.173 44.2725C369.832 43.4372 369.329 42.6771 368.695 42.0359C368.06 41.3947 367.305 40.8849 366.473 40.5356C365.641 40.1862 364.748 40.0042 363.846 40H58.8364C57.0143 40.0098 55.2706 40.7425 53.9887 42.0373C52.7068 43.332 51.9915 45.0827 52.0001 46.9045V231.761H370.682V46.9045Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M253.287 294.008L170.979 292.955L171.224 290.844L175.201 256.026H247.485L252.802 290.844L253.208 293.482L253.287 294.008Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <path\n            d='M266.479 291.371H157.26V294.008H266.479V291.371Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M266.479 291.371H157.26V294.008H266.479V291.371Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <path\n            opacity='0.1'\n            d='M220.048 258.4L252.885 291.371L247.846 258.4H220.048Z'\n            fill='var(--center-channel-color)'\n        />\n        <path\n            d='M370.682 46.9045C370.687 46.0023 370.514 45.1079 370.173 44.2725C369.832 43.4372 369.329 42.6771 368.695 42.0359C368.06 41.3947 367.305 40.8849 366.473 40.5356C365.641 40.1862 364.748 40.0042 363.846 40H58.8364C57.0143 40.0098 55.2706 40.7425 53.9887 42.0373C52.7068 43.332 51.9915 45.0827 52.0001 46.9045V231.761H370.682V46.9045Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.72'\n        />\n        <path\n            d='M52 229.914V251.565C52 253.378 52.7203 255.116 54.0023 256.398C55.2844 257.68 57.0232 258.4 58.8363 258.4H363.846C364.743 258.401 365.633 258.224 366.462 257.881C367.292 257.538 368.046 257.034 368.681 256.399C369.316 255.765 369.819 255.011 370.163 254.181C370.506 253.352 370.682 252.463 370.682 251.565V229.914H52Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M52 230V251.651C52 253.464 52.7203 255.202 54.0023 256.484C55.2844 257.766 57.0232 258.486 58.8363 258.486H363.846C364.743 258.487 365.633 258.311 366.462 257.967C367.292 257.624 368.046 257.121 368.681 256.486C369.316 255.851 369.819 255.097 370.163 254.268C370.506 253.438 370.682 252.549 370.682 251.651V230H52Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <path\n            d='M359.074 51.6061H65.1924V217.781H359.074V51.6061Z'\n            fill='var(--center-channel-bg)'\n        />\n        <circle\n            cx='211.5'\n            cy='244.5'\n            r='7.5'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.16'\n        />\n        <path\n            d='M142 297.109C150.284 297.109 157 296.438 157 295.609C157 294.781 150.284 294.109 142 294.109C133.716 294.109 127 294.781 127 295.609C127 296.438 133.716 297.109 142 297.109Z'\n            fill='var(--center-channel-color)'\n            fillOpacity='0.24'\n        />\n        <path\n            d='M141.665 296.388C142.625 296.388 143.402 295.371 143.402 294.116C143.402 292.861 142.625 291.843 141.665 291.843C140.706 291.843 139.929 292.861 139.929 294.116C139.929 295.371 140.706 296.388 141.665 296.388Z'\n            fill='var(--center-channel-color)'\n        />\n        <path\n            d='M141.665 293.612C142.625 293.612 143.402 292.595 143.402 291.34C143.402 290.085 142.625 289.068 141.665 289.068C140.706 289.068 139.929 290.085 139.929 291.34C139.929 292.595 140.706 293.612 141.665 293.612Z'\n            fill='var(--center-channel-color)'\n        />\n        <path\n            d='M141.665 290.832C142.625 290.832 143.402 289.815 143.402 288.56C143.402 287.305 142.625 286.288 141.665 286.288C140.706 286.288 139.929 287.305 139.929 288.56C139.929 289.815 140.706 290.832 141.665 290.832Z'\n            fill='var(--center-channel-color)'\n        />\n        <path\n            d='M141.665 288.056C142.625 288.056 143.402 287.039 143.402 285.784C143.402 284.529 142.625 283.512 141.665 283.512C140.706 283.512 139.929 284.529 139.929 285.784C139.929 287.039 140.706 288.056 141.665 288.056Z'\n            fill='var(--center-channel-color)'\n        />\n        <path\n            d='M141.665 285.276C142.625 285.276 143.402 284.259 143.402 283.004C143.402 281.749 142.625 280.732 141.665 280.732C140.706 280.732 139.929 281.749 139.929 283.004C139.929 284.259 140.706 285.276 141.665 285.276Z'\n            fill='var(--center-channel-color)'\n        />\n        <path\n            d='M141.665 282.5C142.625 282.5 143.402 281.483 143.402 280.228C143.402 278.973 142.625 277.956 141.665 277.956C140.706 277.956 139.929 278.973 139.929 280.228C139.929 281.483 140.706 282.5 141.665 282.5Z'\n            fill='var(--center-channel-color)'\n        />\n        <path\n            d='M141.665 279.72C142.625 279.72 143.402 278.703 143.402 277.448C143.402 276.193 142.625 275.176 141.665 275.176C140.706 275.176 139.929 276.193 139.929 277.448C139.929 278.703 140.706 279.72 141.665 279.72Z'\n            fill='var(--center-channel-color)'\n        />\n        <path\n            d='M148.165 258.438C148.402 258.137 148.618 257.819 148.811 257.487L144.248 256.739L149.181 256.776C149.654 255.746 149.913 254.63 149.94 253.497C149.968 252.364 149.765 251.237 149.342 250.185L142.719 253.621L148.825 249.132C148.252 248.147 147.482 247.29 146.564 246.615C145.645 245.94 144.598 245.461 143.486 245.208C142.375 244.955 141.223 244.933 140.103 245.143C138.983 245.354 137.918 245.792 136.974 246.432C136.03 247.071 135.228 247.898 134.618 248.86C134.007 249.823 133.601 250.9 133.424 252.026C133.248 253.152 133.305 254.303 133.592 255.406C133.879 256.509 134.39 257.541 135.093 258.438C134.723 258.91 134.404 259.419 134.141 259.958L140.067 263.034L133.748 260.914C133.459 261.774 133.31 262.676 133.31 263.583C133.306 265.449 133.935 267.261 135.093 268.724C134.129 269.95 133.53 271.423 133.364 272.974C133.198 274.524 133.471 276.091 134.153 277.493C134.835 278.896 135.898 280.079 137.22 280.906C138.543 281.733 140.071 282.172 141.631 282.172C143.191 282.172 144.719 281.733 146.041 280.906C147.364 280.079 148.427 278.896 149.109 277.493C149.791 276.091 150.064 274.524 149.898 272.974C149.732 271.423 149.133 269.95 148.169 268.724C149.323 267.257 149.95 265.446 149.949 263.58C149.948 261.715 149.319 259.904 148.165 258.438Z'\n            fill='var(--online-indicator)'\n        />\n        <path\n            opacity='0.1'\n            d='M133.31 263.579C133.306 265.444 133.935 267.256 135.093 268.719C134.129 269.946 133.53 271.418 133.364 272.969C133.198 274.52 133.471 276.086 134.153 277.489C134.835 278.892 135.898 280.074 137.22 280.901C138.543 281.729 140.071 282.168 141.631 282.168C143.191 282.168 144.719 281.729 146.041 280.901C147.364 280.074 148.427 278.892 149.109 277.489C149.791 276.086 150.064 274.52 149.898 272.969C149.732 271.418 149.133 269.946 148.169 268.719C149.282 267.306 133.31 262.646 133.31 263.579Z'\n            fill='var(--center-channel-color)'\n        />\n        <path\n            d='M443.193 16.0555C443.193 16.0555 400.368 13.4855 405.413 43.3313C405.413 43.3313 404.396 48.6073 409.218 51C409.218 51 409.294 48.7894 413.612 49.543C415.149 49.7964 416.711 49.8711 418.266 49.7654C420.363 49.6282 422.358 48.8169 423.952 47.4536C423.952 47.4536 435.991 42.5063 440.67 22.9399C440.67 22.9399 444.133 18.6706 443.996 17.5726L436.769 20.643C436.769 20.643 439.241 25.8281 437.278 30.1362C437.278 30.1362 437.044 20.8283 435.655 21.0308C435.376 21.0715 431.902 22.8264 431.902 22.8264C431.902 22.8264 436.149 31.8558 432.944 38.4224C432.944 38.4224 434.16 27.2936 430.574 23.4792L425.488 26.4334C425.488 26.4334 430.452 35.7616 427.085 43.3747C427.085 43.3747 427.949 31.6994 424.415 27.1517L419.807 30.7279C419.807 30.7279 424.471 39.9192 421.628 46.2335C421.628 46.2335 421.256 32.646 418.81 31.6194C418.81 31.6194 414.776 35.1603 414.161 36.6069C414.161 36.6069 417.355 43.2843 415.371 46.8049C415.371 46.8049 414.156 37.7502 413.159 37.6996C413.159 37.6996 409.141 43.6988 408.724 47.8166C408.724 47.8166 408.897 41.7007 412.187 37.1331C412.187 37.1331 408.301 37.7958 406.033 40.2975C406.033 40.2975 406.658 36.0586 413.179 35.6843C413.179 35.6843 416.5 31.1316 417.385 30.8586C417.385 30.8586 410.905 30.3161 406.974 32.0524C406.974 32.0524 410.432 28.0513 418.575 29.8722L423.127 26.1743C423.127 26.1743 414.593 25.0157 410.972 26.2959C410.972 26.2959 415.137 22.755 424.353 25.3349L429.307 22.3906C429.307 22.3906 422.029 20.8324 417.696 21.3789C417.696 21.3789 422.273 18.9256 430.762 21.5864L434.322 20.0042C434.322 20.0042 428.992 18.9622 427.43 18.7954C425.868 18.6286 425.788 18.2037 425.788 18.2037C429.164 17.6437 432.631 18.0272 435.802 19.3116C435.802 19.3116 443.32 16.5261 443.193 16.0555Z'\n            fill='var(--online-indicator)'\n        />\n        <path\n            d='M384.646 0.0251977C384.646 0.0251977 365.998 -1.14679 368.177 12.495C368.177 12.495 367.739 14.9053 369.836 16C369.836 16 369.87 14.9766 371.754 15.3296C372.424 15.4471 373.104 15.4815 373.781 15.4321C374.696 15.3689 375.567 14.995 376.259 14.3675C376.259 14.3675 381.51 12.1059 383.551 3.16163C383.551 3.16163 385.058 1.21228 384.998 0.710652L381.848 2.11265C381.848 2.11265 382.923 4.48177 382.078 6.4517C382.078 6.4517 381.975 2.19907 381.372 2.29693C381.249 2.29693 379.733 3.12002 379.733 3.12002C379.733 3.12002 381.588 7.24919 380.189 10.248C380.189 10.248 380.719 5.16174 379.154 3.41679L376.936 4.78861C376.936 4.78861 379.1 9.05084 377.632 12.5307C377.632 12.5307 378.011 7.19386 376.469 5.11647L374.462 6.75396C374.462 6.75396 376.494 10.9549 375.257 13.8417C375.257 13.8417 375.091 7.62963 374.025 7.1591C374.025 7.1591 372.269 8.77602 371.999 9.44135C371.999 9.44135 373.392 12.5115 372.529 14.1028C372.529 14.1028 371.999 9.9631 371.547 9.94161C371.547 9.94161 369.795 12.6852 369.614 14.5468C369.701 12.8102 370.223 11.1276 371.125 9.66541C370.114 9.8651 369.181 10.3685 368.441 11.1136C368.441 11.1136 368.716 9.1743 371.557 9.00557C371.557 9.00557 373.03 6.92315 373.393 6.79512C373.393 6.79512 370.566 6.54956 368.853 7.34384C368.853 7.34384 370.36 5.51704 373.908 6.34607L375.871 4.65737C375.871 4.65737 372.148 4.14065 370.569 4.71041C370.569 4.71041 372.384 3.09349 376.404 4.27051L378.563 2.92476C378.563 2.92476 375.388 2.2137 373.499 2.46749C373.499 2.46749 375.496 1.34671 379.196 2.55894L380.742 1.83737C380.742 1.83737 378.418 1.36135 377.734 1.28452C377.05 1.2077 377.017 1.01336 377.017 1.01336C378.49 0.757829 380.003 0.935008 381.385 1.52505C381.385 1.52505 384.704 0.238287 384.646 0.0251977Z'\n            fill='var(--online-indicator)'\n        />\n        <path\n            d='M0.35387 32.0252C0.35387 32.0252 19.0016 30.8532 16.8229 44.495C16.8229 44.495 17.2615 46.9053 15.1644 48C15.1644 48 15.1302 46.9766 13.2457 47.3296C12.5765 47.4471 11.8963 47.4815 11.2192 47.4321C10.3039 47.3689 9.43347 46.995 8.74103 46.3675C8.74103 46.3675 3.49032 44.1059 1.44889 35.1616C1.44889 35.1616 -0.0575027 33.2123 0.00170135 32.7107L3.15221 34.1126C3.15221 34.1126 2.07734 36.4818 2.92154 38.4517C2.92154 38.4517 3.02461 34.1991 3.62804 34.2969C3.75084 34.2969 5.26731 35.12 5.26731 35.12C5.26731 35.12 3.41226 39.2492 4.81078 42.248C4.81078 42.248 4.28103 37.1617 5.84619 35.4168L8.06434 36.7886C8.06434 36.7886 5.90013 41.0508 7.3675 44.5307C7.3675 44.5307 6.98947 39.1939 8.53051 37.1165L10.5377 38.754C10.5377 38.754 8.50597 42.9549 9.74267 45.8417C9.74267 45.8417 9.90929 39.6296 10.9745 39.1591C10.9745 39.1591 12.7313 40.776 13.0015 41.4414C13.0015 41.4414 11.6078 44.5115 12.4713 46.1028C12.4713 46.1028 13.0015 41.9631 13.4527 41.9416C13.4527 41.9416 15.2047 44.6852 15.3863 46.5468C15.2985 44.8102 14.7775 43.1276 13.8746 41.6654C14.8856 41.8651 15.8186 42.3685 16.5589 43.1136C16.5589 43.1136 16.284 41.1743 13.4426 41.0056C13.4426 41.0056 11.9705 38.9232 11.6073 38.7951C11.6073 38.7951 14.4338 38.5496 16.1467 39.3438C16.1467 39.3438 14.6403 37.517 11.0921 38.3461L9.12912 36.6574C9.12912 36.6574 12.8524 36.1406 14.4311 36.7104C14.4311 36.7104 12.6156 35.0935 8.5963 36.2705L6.43691 34.9248C6.43691 34.9248 9.61196 34.2137 11.5012 34.4675C11.5012 34.4675 9.5041 33.3467 5.80366 34.5589L4.25778 33.8374C4.25778 33.8374 6.58206 33.3613 7.26619 33.2845C7.95032 33.2077 7.98279 33.0134 7.98279 33.0134C6.50964 32.7578 4.99733 32.935 3.6153 33.525C3.6153 33.525 0.296421 32.2383 0.35387 32.0252Z'\n            fill='var(--online-indicator)'\n        />\n        <ellipse\n            cx='212'\n            cy='135.5'\n            rx='44'\n            ry='43.5'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M258 136.001C258 145.099 255.302 153.993 250.247 161.557C245.192 169.122 238.008 175.018 229.602 178.499C221.197 181.98 211.947 182.891 203.024 181.116C194.101 179.341 185.905 174.959 179.472 168.526C173.039 162.092 168.658 153.896 166.884 144.973C165.109 136.05 166.02 126.8 169.502 118.395C172.984 109.99 178.88 102.806 186.445 97.7516C194.01 92.6973 202.904 89.9997 212.001 90C218.042 90.0002 224.024 91.1902 229.605 93.5021C235.186 95.814 240.257 99.2025 244.528 103.474C248.799 107.746 252.187 112.817 254.499 118.398C256.811 123.979 258 129.961 258 136.001ZM206.684 160.35L240.806 126.228C241.083 125.952 241.302 125.625 241.451 125.265C241.601 124.905 241.678 124.519 241.678 124.129C241.678 123.739 241.601 123.352 241.451 122.992C241.302 122.632 241.083 122.305 240.806 122.029L236.608 117.862C236.333 117.586 236.006 117.367 235.647 117.217C235.287 117.068 234.901 116.991 234.512 116.991C234.122 116.991 233.737 117.068 233.377 117.217C233.017 117.367 232.69 117.586 232.415 117.862L204.585 145.693L191.59 132.667C191.033 132.113 190.278 131.801 189.491 131.801C188.705 131.801 187.95 132.113 187.392 132.667L183.194 136.89C182.639 137.448 182.327 138.203 182.327 138.99C182.327 139.776 182.639 140.531 183.194 141.089L202.487 160.375C202.762 160.651 203.089 160.87 203.449 161.02C203.81 161.169 204.196 161.246 204.586 161.246C204.976 161.246 205.362 161.169 205.722 161.02C206.082 160.87 206.41 160.651 206.685 160.375L206.684 160.35Z'\n            fill='var(--online-indicator)'\n        />\n        <defs>\n            <filter\n                id='filter0_f'\n                x='53'\n                y='41'\n                width='326.682'\n                height='256'\n                filterUnits='userSpaceOnUse'\n                colorInterpolationFilters='sRGB'\n            >\n                <feFlood\n                    floodOpacity='0'\n                    result='BackgroundImageFix'\n                />\n                <feBlend\n                    mode='normal'\n                    in='SourceGraphic'\n                    in2='BackgroundImageFix'\n                    result='shape'\n                />\n                <feGaussianBlur\n                    stdDeviation='2'\n                    result='effect1_foregroundBlur'\n                />\n            </filter>\n        </defs>\n    </svg>\n);\n\nexport default OnboardingSuccessSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport classNames from 'classnames';\nimport {FormattedMessage} from 'react-intl';\n\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {Team} from 'mattermost-redux/types/teams';\n\nimport {pageVisited, trackEvent} from 'actions/telemetry_actions';\nimport Accordion from 'components/accordion';\nimport Card from 'components/card/card';\nimport {getAnalyticsCategory} from 'components/next_steps_view/step_helpers';\nimport {Preferences, RecommendedNextSteps} from 'utils/constants';\n\nimport loadingIcon from 'images/spinner-48x48-blue.apng';\n\nimport {StepType} from './steps';\nimport './next_steps_view.scss';\nimport NextStepsTips from './next_steps_tips';\nimport DownloadSection from './download_section';\nimport OnboardingBgSvg from './images/onboarding-bg-svg';\nimport GettingStartedSvg from './images/getting-started-svg';\nimport CloudLogoSvg from './images/cloud-logo-svg';\nimport LogoSvg from './images/logo-svg';\nimport OnboardingSuccessSvg from './images/onboarding-success-svg';\n\nconst TRANSITION_SCREEN_TIMEOUT = 3000;\n\ntype Props = {\n    currentUser: UserProfile;\n    preferences: PreferenceType[];\n    isFirstAdmin: boolean;\n    steps: StepType[];\n    team: Team;\n    isCloud: boolean;\n    globalHeaderEnabled: boolean;\n    actions: {\n        savePreferences: (userId: string, preferences: PreferenceType[]) => void;\n        setShowNextStepsView: (show: boolean) => void;\n        closeRightHandSide: () => void;\n        getProfiles: () => void;\n    };\n};\n\ntype State = {\n    showFinalScreen: boolean;\n    showTransitionScreen: boolean;\n    animating: boolean;\n    show: boolean;\n}\n\nexport default class NextStepsView extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            showFinalScreen: false,\n            showTransitionScreen: false,\n            animating: false,\n            show: false,\n        };\n    }\n\n    async componentDidMount() {\n        await this.props.actions.getProfiles();\n\n        // If all steps are complete, or user has skipped, don't render this and skip to the tips screen\n        if (this.getIncompleteStep() === null || this.checkStepsSkipped()) {\n            this.showFinalScreenNoAnimation();\n        }\n        // eslint-disable-next-line react/no-did-mount-set-state\n        this.setState({show: true});\n        pageVisited(getAnalyticsCategory(this.props.isFirstAdmin), 'pageview_welcome');\n        this.props.actions.closeRightHandSide();\n    }\n\n    checkStepsSkipped = () => {\n        return this.props.preferences.some((pref) => pref.name === RecommendedNextSteps.SKIP && pref.value === 'true');\n    }\n\n    getStartingStep = () => {\n        for (let i = 0; i < this.props.steps.length; i++) {\n            if (!this.isStepComplete(this.props.steps[i].id)) {\n                return this.props.steps[i].id;\n            }\n        }\n        return this.props.steps[0].id;\n    }\n\n    getIncompleteStep = () => {\n        for (let i = 0; i < this.props.steps.length; i++) {\n            if (!this.isStepComplete(this.props.steps[i].id)) {\n                return this.props.steps[i].id;\n            }\n        }\n        return null;\n    }\n\n    onClickHeader = (setExpanded: (expandedKey: string) => void, id: string) => {\n        const stepIndex = this.getStepNumberFromId(id);\n        trackEvent(getAnalyticsCategory(this.props.isFirstAdmin), `click_onboarding_step${stepIndex}`);\n        setExpanded(id);\n    }\n\n    getStepNumberFromId = (id: string) => {\n        return this.props.steps.findIndex((step) => step.id === id) + 1;\n    }\n\n    onSkip = (setExpanded: (expandedKey: string) => void) => {\n        return (id: string) => {\n            this.nextStep(setExpanded, id);\n        };\n    }\n\n    onSkipAll = async () => {\n        this.showFinalScreen();\n        this.props.actions.savePreferences(this.props.currentUser.id, [{\n            user_id: this.props.currentUser.id,\n            category: Preferences.RECOMMENDED_NEXT_STEPS,\n            name: RecommendedNextSteps.SKIP,\n            value: 'true',\n        }]);\n    }\n\n    onFinish = (setExpanded: (expandedKey: string) => void) => {\n        return async (id: string) => {\n            const stepIndex = this.getStepNumberFromId(id);\n            trackEvent(getAnalyticsCategory(this.props.isFirstAdmin), `complete_onboarding_step${stepIndex}`);\n\n            await this.props.actions.savePreferences(this.props.currentUser.id, [{\n                category: Preferences.RECOMMENDED_NEXT_STEPS,\n                user_id: this.props.currentUser.id,\n                name: id,\n                value: 'true',\n            }]);\n\n            this.nextStep(setExpanded, id);\n        };\n    }\n\n    showFinalScreenNoAnimation = () => {\n        pageVisited(getAnalyticsCategory(this.props.isFirstAdmin), 'pageview_tips_next_steps');\n        this.setState({showFinalScreen: true, animating: false});\n    }\n\n    showFinalScreen = () => {\n        trackEvent(getAnalyticsCategory(this.props.isFirstAdmin), 'click_skip_getting_started', {channel_sidebar: false});\n        pageVisited(getAnalyticsCategory(this.props.isFirstAdmin), 'pageview_tips_next_steps');\n        this.setState({showFinalScreen: true, animating: true});\n    }\n\n    transitionToFinalScreen = () => {\n        this.setState({showTransitionScreen: true, animating: true});\n    }\n\n    setTimerToFinalScreen = () => {\n        if (this.state.showTransitionScreen) {\n            setTimeout(() => {\n                pageVisited(getAnalyticsCategory(this.props.isFirstAdmin), 'pageview_tips_next_steps');\n                this.setState({showFinalScreen: true});\n            }, TRANSITION_SCREEN_TIMEOUT);\n        }\n    }\n\n    stopAnimating = () => {\n        this.setState({animating: false});\n    }\n\n    nextStep = (setExpanded: (expandedKey: string) => void, id: string) => {\n        const currentIndex = this.props.steps.findIndex((step) => step.id === id);\n        if (currentIndex + 1 > this.props.steps.length - 1) {\n            // Check if previous steps were skipped before moving on\n            const incompleteStep = this.getIncompleteStep();\n            if (incompleteStep === null) {\n                // Collapse all accordion tiles\n                setExpanded('');\n                setTimeout(() => {\n                    this.transitionToFinalScreen();\n                }, 300);\n            } else {\n                setExpanded(incompleteStep);\n            }\n        } else if (this.isStepComplete(this.props.steps[currentIndex + 1].id)) {\n            this.nextStep(setExpanded, this.props.steps[currentIndex + 1].id);\n        } else {\n            setExpanded(this.props.steps[currentIndex + 1].id);\n        }\n    }\n\n    isStepComplete = (id: string) => {\n        return this.props.preferences.some((pref) => pref.name === id && pref.value === 'true');\n    }\n\n    renderStep = (step: StepType, index: number) => {\n        const {id, title} = step;\n\n        let icon = (\n            <div className='NextStepsView__cardHeaderBadge'>\n                <span>{index + 1}</span>\n            </div>\n        );\n        if (this.isStepComplete(id)) {\n            icon = (\n                <i className='icon icon-check-circle'/>\n            );\n        }\n\n        return (setExpanded: (expandedKey: string) => void, expandedKey: string) => (\n            <Card\n                className={classNames({complete: this.isStepComplete(id)})}\n                expanded={expandedKey === id}\n            >\n                <Card.Header>\n                    <button\n                        onClick={() => this.onClickHeader(setExpanded, id)}\n                        disabled={this.isStepComplete(id)}\n                        className='NextStepsView__cardHeader'\n                    >\n                        {icon}\n                        <FormattedMessage\n                            id={title.titleId}\n                            defaultMessage={title.titleMessage}\n                        />\n                    </button>\n                </Card.Header>\n                <Card.Body>\n                    <step.component\n                        id={id}\n                        expanded={expandedKey === id}\n                        isAdmin={this.props.isFirstAdmin}\n                        currentUser={this.props.currentUser}\n                        onFinish={this.onFinish(setExpanded)}\n                        onSkip={this.onSkip(setExpanded)}\n                    />\n                </Card.Body>\n            </Card>\n        );\n    }\n\n    renderTransitionScreen = () => {\n        return (\n            <div\n                className={classNames('NextStepsView__viewWrapper NextStepsView__transitionView', {\n                    transitioning: this.state.showTransitionScreen,\n                    completed: this.state.showTransitionScreen && this.state.showFinalScreen,\n                    animating: this.state.animating,\n                })}\n                onTransitionEnd={this.setTimerToFinalScreen}\n            >\n                <div className='NextStepsView__transitionBody'>\n                    <OnboardingSuccessSvg/>\n                    <h1 className='NextStepsView__transitionTopText'>\n                        <FormattedMessage\n                            id='next_steps_view.nicelyDone'\n                            defaultMessage='Nicely done! You’re all set.'\n                        />\n                    </h1>\n                    <p className='NextStepsView__transitionBottomText'>\n                        <img src={loadingIcon}/>\n                        <FormattedMessage\n                            id='next_steps_view.oneMoment'\n                            defaultMessage='One moment'\n                        />\n                    </p>\n                </div>\n            </div>\n        );\n    }\n\n    renderMainBody = () => {\n        const renderedSteps = this.props.steps.map(this.renderStep);\n        const logo = this.props.isCloud ? <CloudLogoSvg/> : <LogoSvg/>;\n\n        return (\n            <div\n                className={classNames('NextStepsView__viewWrapper NextStepsView__mainView', {\n                    completed: this.state.showFinalScreen || this.state.showTransitionScreen,\n                    animating: this.state.animating,\n                })}\n            >\n                <header className='NextStepsView__header'>\n                    <div className='NextStepsView__header-headerText'>\n                        <h1 className='NextStepsView__header-headerTopText'>\n                            <FormattedMessage\n                                id='next_steps_view.welcomeToMattermost'\n                                defaultMessage='Welcome to Mattermost'\n                            />\n                        </h1>\n                        <h2 className='NextStepsView__header-headerBottomText'>\n                            <FormattedMessage\n                                id='next_steps_view.hereAreSomeNextSteps'\n                                defaultMessage='Here are some recommended next steps to help you get started'\n                            />\n                        </h2>\n                    </div>\n                    <div className='NextStepsView__header-logo'>\n                        {logo}\n                    </div>\n                </header>\n                <div className='NextStepsView__body'>\n                    <div className='NextStepsView__body-main'>\n                        <Accordion defaultExpandedKey={this.getIncompleteStep() === null ? '' : this.getStartingStep()}>\n                            {(setExpanded, expandedKey) => {\n                                return (\n                                    <>\n                                        {renderedSteps.map((step) => step(setExpanded, expandedKey))}\n                                    </>\n                                );\n                            }}\n                        </Accordion>\n                        <div className='NextStepsView__skipGettingStarted'>\n                            <button\n                                className='NextStepsView__button tertiary'\n                                onClick={this.onSkipAll}\n                            >\n                                <FormattedMessage\n                                    id='next_steps_view.skipGettingStarted'\n                                    defaultMessage='Skip Getting Started'\n                                />\n                            </button>\n                        </div>\n                    </div>\n                    <div className='NextStepsView__body-graphic'>\n                        <GettingStartedSvg/>\n                    </div>\n                </div>\n                <DownloadSection isFirstAdmin={this.props.isFirstAdmin}/>\n            </div>\n        );\n    }\n\n    render() {\n        return (\n            <section\n                id='app-content'\n                className='app__content NextStepsView'\n            >\n                {this.state.show &&\n                <>\n                    <OnboardingBgSvg/>\n                    {this.renderMainBody()}\n                    {this.renderTransitionScreen()}\n                    <NextStepsTips\n                        showFinalScreen={this.state.showFinalScreen}\n                        animating={this.state.animating}\n                        stopAnimating={this.stopAnimating}\n                        isFirstAdmin={this.props.isFirstAdmin}\n                        savePreferences={this.props.actions.savePreferences}\n                        currentUserId={this.props.currentUser.id}\n                        setShowNextStepsView={this.props.actions.setShowNextStepsView}\n                        team={this.props.team}\n                        globalHeaderEnabled={this.props.globalHeaderEnabled}\n                    />\n                </>}\n            </section>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getProfiles} from 'mattermost-redux/actions/users';\nimport {makeGetCategory} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUser, isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\nimport {getTeam, getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport {setShowNextStepsView} from 'actions/views/next_steps';\nimport {closeRightHandSide} from 'actions/views/rhs';\nimport {getGlobalHeaderEnabled} from 'selectors/global_header';\nimport {GlobalState} from 'types/store';\nimport {Preferences} from 'utils/constants';\n\nimport {getSteps, isFirstAdmin} from './steps';\nimport NextStepsView from './next_steps_view';\n\nfunction makeMapStateToProps() {\n    const getCategory = makeGetCategory();\n\n    return (state: GlobalState) => {\n        const teamId = getCurrentTeamId(state);\n        const team = getTeam(state, teamId || '');\n        return {\n            currentUser: getCurrentUser(state),\n            isAdmin: isCurrentUserSystemAdmin(state),\n            preferences: getCategory(state, Preferences.RECOMMENDED_NEXT_STEPS),\n            steps: getSteps(state),\n            isFirstAdmin: isFirstAdmin(state),\n            team,\n            isCloud: getLicense(state).Cloud === 'true',\n            globalHeaderEnabled: getGlobalHeaderEnabled(state),\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators(\n            {\n                savePreferences,\n                setShowNextStepsView,\n                getProfiles,\n                closeRightHandSide,\n            },\n            dispatch,\n        ),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(NextStepsView);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {StepType} from './steps';\n\nexport function getAnalyticsCategory(isAdmin: boolean) {\n    return isAdmin ? 'cloud_first_user_onboarding' : 'cloud_end_user_onboarding';\n}\n\n// Filter the steps shown by checking if our user has any of the required roles for that step\nexport function isStepForUser(step: StepType, roles: string): boolean {\n    const userRoles = roles.split(' ');\n    return (\n        userRoles.some((role) => step.roles.includes(role)) ||\n          step.roles.length === 0\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, useEffect} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {localizeMessage} from 'utils/utils';\nimport {Constants} from 'utils/constants';\nimport * as FileUtils from 'utils/file_utils';\n\nimport './picture_selector.scss';\n\ntype Props = {\n    name: string;\n    src?: string;\n    defaultSrc?: string;\n    placeholder?: React.ReactNode;\n    loadingPicture?: boolean;\n    onOpenDialog?: () => void;\n    onSelect: (file: File) => void;\n    onRemove: () => void;\n};\n\nconst PictureSelector: React.FC<Props> = (props: Props) => {\n    const {name, src, defaultSrc, placeholder, loadingPicture, onSelect, onRemove} = props;\n\n    const [image, setImage] = useState<string>();\n    const [orientationStyles, setOrientationStyles] = useState<{transform: any; transformOrigin: any}>();\n\n    const inputRef: React.RefObject<HTMLInputElement> = React.createRef();\n    const selectButton: React.RefObject<HTMLButtonElement> = React.createRef();\n\n    const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n        if (e.target.files && e.target.files[0]) {\n            const file = e.target.files[0];\n\n            const reader = new FileReader();\n            reader.onload = (ev) => {\n                setImage(URL.createObjectURL(file));\n\n                const orientation = FileUtils.getExifOrientation(ev.target!.result);\n                setOrientationStyles(FileUtils.getOrientationStyles(orientation));\n            };\n            reader.readAsArrayBuffer(file);\n\n            onSelect(file);\n        }\n    };\n\n    const handleInputFile = () => {\n        if (props.onOpenDialog) {\n            props.onOpenDialog();\n        }\n\n        if (!inputRef || !inputRef.current) {\n            return;\n        }\n\n        selectButton.current?.blur();\n\n        inputRef.current.value = '';\n        inputRef.current.click();\n    };\n\n    const handleRemove = () => {\n        onRemove();\n        if (defaultSrc) {\n            setImage(defaultSrc);\n        } else {\n            setImage(undefined);\n        }\n    };\n\n    useEffect(() => {\n        if (!image) {\n            if (src) {\n                setImage(src);\n            } else if (defaultSrc) {\n                setImage(defaultSrc);\n            }\n        }\n    }, [src, image]);\n\n    let removeButton;\n    if (image && image !== defaultSrc) {\n        removeButton = (\n            <button\n                data-testid='PictureSelector__removeButton'\n                className='PictureSelector__removeButton'\n                disabled={loadingPicture}\n                onClick={handleRemove}\n            >\n                <FormattedMessage\n                    id='picture_selector.remove_picture'\n                    defaultMessage='Remove picture'\n                />\n            </button>\n        );\n    }\n\n    return (\n        <div className='PictureSelector'>\n            <input\n                name={name}\n                data-testid={`PictureSelector__input-${name}`}\n                ref={inputRef}\n                className='PictureSelector__input hidden'\n                accept={Constants.ACCEPT_STATIC_IMAGE}\n                type='file'\n                onChange={handleFileChange}\n                disabled={loadingPicture}\n                aria-hidden={true}\n                tabIndex={-1}\n            />\n            <div className='PictureSelector__imageContainer'>\n                <div\n                    aria-label={localizeMessage('picture_selector.image.ariaLabel', 'Picture selector image')}\n                    className='PictureSelector__image'\n                    style={{\n                        backgroundImage: 'url(' + image + ')',\n                        ...orientationStyles,\n                    }}\n                >\n                    {!image && placeholder}\n                </div>\n                <button\n                    ref={selectButton}\n                    data-testid='PictureSelector__selectButton'\n                    className='PictureSelector__selectButton'\n                    disabled={loadingPicture}\n                    onClick={handleInputFile}\n                    aria-label={localizeMessage('picture_selector.select_button.ariaLabel', 'Select picture')}\n                >\n                    <i className='icon icon-pencil-outline'/>\n                </button>\n            </div>\n            {removeButton}\n        </div>\n    );\n};\n\nexport default PictureSelector;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport classNames from 'classnames';\n\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport {pageVisited, trackEvent} from 'actions/telemetry_actions';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport {getAnalyticsCategory} from 'components/next_steps_view/step_helpers';\nimport Input from 'components/input';\nimport PictureSelector from 'components/picture_selector';\nimport {AcceptedProfileImageTypes} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport {StepComponentProps} from '../../steps';\n\nimport './complete_profile_step.scss';\n\nconst MAX_FULL_NAME_LENGTH = 128;\nconst MAX_NAME_PART_LENGTH = 64;\n\ntype Props = StepComponentProps & {\n    maxFileSize: number;\n    actions: {\n        updateMe: (user: UserProfile) => void;\n        setDefaultProfileImage: (userId: string) => void;\n        uploadProfileImage: (userId: string, imageData: File) => void;\n    };\n};\n\ntype State = {\n    fullName: string;\n    fullNameError?: string;\n    profilePicture?: File;\n    profilePictureError: boolean;\n    removeProfilePicture: boolean;\n};\n\nexport default class CompleteProfileStep extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        const user = props.currentUser;\n\n        this.state = {\n            fullName: (user.first_name || user.last_name) ? `${user.first_name} ${user.last_name}` : '',\n            profilePictureError: false,\n            removeProfilePicture: false,\n        };\n    }\n\n    componentDidMount() {\n        if (this.props.expanded) {\n            pageVisited(getAnalyticsCategory(this.props.isAdmin), 'pageview_complete_profile');\n        }\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (prevProps.expanded !== this.props.expanded && this.props.expanded) {\n            pageVisited(getAnalyticsCategory(this.props.isAdmin), 'pageview_complete_profile');\n        }\n    }\n\n    private handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n        let fullNameError;\n        if (!event.target.value) {\n            fullNameError = Utils.localizeMessage('next_steps_view.complete_profile_step.fullNameCannotBeBlank', 'Your full name cannot be blank');\n        } else if (event.target.value.length > MAX_FULL_NAME_LENGTH) {\n            fullNameError = Utils.localizeMessage('next_steps_view.complete_profile_step.fullNameTooBig', 'Your name must be less than 128 character');\n        }\n\n        this.setState({fullName: event.target.value, fullNameError});\n    }\n\n    isFinishDisabled = () => {\n        return Boolean(!this.state.fullName || this.state.fullNameError || this.state.profilePictureError);\n    }\n\n    onSkip = () => {\n        this.props.onSkip(this.props.id);\n    }\n\n    onFinish = () => {\n        const splitName = this.state.fullName.split(' ');\n        const firstName = splitName[0].slice(0, MAX_NAME_PART_LENGTH);\n        const lastName = splitName.slice(1).join(' ').slice(0, MAX_NAME_PART_LENGTH);\n        const user = Object.assign({}, this.props.currentUser, {first_name: firstName, last_name: lastName});\n\n        this.props.actions.updateMe(user);\n\n        if (this.state.profilePicture) {\n            this.props.actions.uploadProfileImage(this.props.currentUser.id, this.state.profilePicture);\n        } else if (this.state.removeProfilePicture) {\n            this.props.actions.setDefaultProfileImage(this.props.currentUser.id);\n        }\n\n        trackEvent(getAnalyticsCategory(this.props.isAdmin), 'click_save_profile');\n\n        this.props.onFinish(this.props.id);\n    }\n\n    onOpenPictureDialog = () => {\n        trackEvent(getAnalyticsCategory(this.props.isAdmin), 'click_add_profile_photo');\n    }\n\n    onSelectPicture = (profilePicture: File) => {\n        if (!AcceptedProfileImageTypes.includes(profilePicture.type) || profilePicture.size > this.props.maxFileSize) {\n            trackEvent(getAnalyticsCategory(this.props.isAdmin), 'error_profile_photo_invalid');\n\n            this.setState({profilePictureError: true});\n            return;\n        }\n\n        this.setState({profilePicture, profilePictureError: false, removeProfilePicture: false});\n    }\n\n    onRemovePicture = () => {\n        trackEvent(getAnalyticsCategory(this.props.isAdmin), 'click_remove_photo');\n\n        this.setState({profilePicture: undefined, profilePictureError: false, removeProfilePicture: true});\n    }\n\n    render() {\n        const {currentUser} = this.props;\n\n        // Make sure picture has been set\n        const pictureSrc = currentUser.last_picture_update ? Utils.imageURLForUser(currentUser.id, currentUser.last_picture_update) : undefined;\n        const defaultSrc = Utils.defaultImageURLForUser(currentUser.id);\n\n        return (\n            <div className='NextStepsView__stepWrapper'>\n                <div className='CompleteProfileStep'>\n                    <div className='CompleteProfileStep__profilePicture'>\n                        <h4>\n                            <FormattedMessage\n                                id='next_steps_view.complete_profile_step.addAPhoto'\n                                defaultMessage='Add a photo'\n                            />\n                        </h4>\n                        <PictureSelector\n                            name='CompleteProfileStep__profilePicture'\n                            onOpenDialog={this.onOpenPictureDialog}\n                            onSelect={this.onSelectPicture}\n                            onRemove={this.onRemovePicture}\n                            src={pictureSrc}\n                            defaultSrc={defaultSrc}\n                        />\n                    </div>\n                    <div className='CompleteProfileStep__fullName'>\n                        <h4>\n                            <FormattedMessage\n                                id='next_steps_view.complete_profile_step.enterYourName'\n                                defaultMessage='Enter your name'\n                            />\n                        </h4>\n                        <Input\n                            name='fullName'\n                            type='text'\n                            value={this.state.fullName}\n                            onChange={this.handleInputChange}\n                            placeholder={Utils.localizeMessage('next_steps_view.complete_profile_step.yourFullName', 'Your full name')}\n                            error={this.state.fullNameError}\n                            info={Utils.localizeMessage('next_steps_view.complete_profile_step.nameWillBeDisplayed', 'Your name will be displayed with your messages')}\n                        />\n                    </div>\n                </div>\n                {this.state.profilePictureError &&\n                    <span className='CompleteProfileStep__pictureError'>\n                        <i className='icon icon-alert-outline'/>\n                        <FormattedMarkdownMessage\n                            id='next_steps_view.complete_profile_step.pictureError'\n                            defaultMessage='Photos must be in BMP, JPG or PNG format. Maximum file size is {max}.'\n                            values={{max: Utils.fileSizeToString(this.props.maxFileSize)}}\n                        />\n                    </span>\n                }\n                <div className='NextStepsView__wizardButtons'>\n                    <button\n                        data-testid='CompleteProfileStep__saveProfileButton'\n                        className={classNames('NextStepsView__button NextStepsView__finishButton primary', {disabled: this.isFinishDisabled()})}\n                        onClick={this.onFinish}\n                        disabled={this.isFinishDisabled()}\n                    >\n                        <FormattedMessage\n                            id='next_steps_view.complete_profile_step.saveProfile'\n                            defaultMessage='Save profile'\n                        />\n                    </button>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {\n    updateMe,\n    setDefaultProfileImage,\n    uploadProfileImage,\n} from 'mattermost-redux/actions/users';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {GlobalState} from 'types/store';\n\nimport CompleteProfileStep from './complete_profile_step';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n\n    return {\n        maxFileSize: parseInt(config.MaxFileSize!, 10),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            updateMe,\n            setDefaultProfileImage,\n            uploadProfileImage,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CompleteProfileStep);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport './text_card_with_action.scss';\n\nexport default function TextCardWithAction(props: {\n    cardBodyMessageId: string;\n    cardBodyDefaultMessage: string;\n    buttonMessageId: string;\n    buttonDefaultMessage: string;\n    onClick: () => void;\n}) {\n    return (\n        <div className={'TextCardWithAction'}>\n            <div className={'card-body'}>\n                <FormattedMessage\n                    id={props.cardBodyMessageId}\n                    defaultMessage={props.cardBodyDefaultMessage}\n                />\n            </div>\n            <div className='NextStepsView__wizardButtons'>\n                <button\n                    className='NextStepsView__button NextStepsView__finishButton primary'\n                    onClick={props.onClick}\n                >\n                    <FormattedMessage\n                        id={props.buttonMessageId}\n                        defaultMessage={props.buttonDefaultMessage}\n                    />\n                </button>\n            </div>\n        </div>\n    );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, CSSProperties} from 'react';\nimport ReactSelect, {components, Props as SelectProps, ActionMeta} from 'react-select';\nimport classNames from 'classnames';\n\nimport './multi_input.scss';\n\n// TODO: This component needs work, should not be used outside of InviteMembersStep until this comment is removed.\n\ntype ValueType = {\n    label: string;\n    value: string;\n}\n\ntype Props<T> = Omit<SelectProps<T>, 'onChange'> & {\n    value: T[];\n    legend?: string;\n    onChange: (value: T[], action: ActionMeta<T[]>) => void;\n};\n\nconst baseStyles = {\n    input: (provided: CSSProperties) => ({\n        ...provided,\n        color: 'var(--center-channel-color)',\n    }),\n};\n\nconst MultiValueContainer = (props: any) => {\n    return (\n        <div className={classNames('MultiInput__multiValueContainer', {error: props.data.error})}>\n            <components.MultiValueContainer {...props}/>\n        </div>\n    );\n};\n\nconst MultiValueRemove = (props: any) => {\n    return (\n        <div className='MultiInput__multiValueRemove'>\n            <components.MultiValueRemove {...props}>\n                <i className='icon icon-close-circle'/>\n            </components.MultiValueRemove>\n        </div>\n    );\n};\n\nconst Placeholder = (props: any) => {\n    return (\n        <div className='MultiInput__placeholder'>\n            <components.Placeholder {...props}/>\n        </div>\n    );\n};\n\nconst MultiInput = <T extends ValueType>(props: Props<T>) => {\n    const {value, placeholder, className, addon, name, textPrefix, legend, onChange, styles, ...otherProps} = props;\n\n    const [focused, setFocused] = useState(false);\n\n    const onInputFocus = (event: React.FocusEvent<HTMLElement>) => {\n        const {onFocus} = props;\n\n        setFocused(true);\n\n        if (onFocus) {\n            onFocus(event);\n        }\n    };\n\n    const onInputBlur = (event: React.FocusEvent<HTMLElement>) => {\n        const {onBlur} = props;\n\n        setFocused(false);\n\n        if (onBlur) {\n            onBlur(event);\n        }\n    };\n\n    const showLegend = Boolean(focused || value.length);\n\n    return (\n        <div className='MultiInput Input_container'>\n            <fieldset\n                className={classNames('Input_fieldset', className, {\n                    Input_fieldset___legend: showLegend,\n                })}\n            >\n                <legend className={classNames('Input_legend', {Input_legend___focus: showLegend})}>\n                    {showLegend ? (legend || placeholder) : null}\n                </legend>\n                <div\n                    className='Input_wrapper'\n                    onFocus={onInputFocus}\n                    onBlur={onInputBlur}\n                >\n                    {textPrefix && <span>{textPrefix}</span>}\n                    <ReactSelect\n                        id={`MultiInput_${name}`}\n                        components={{\n                            Menu: () => null,\n                            IndicatorsContainer: () => null,\n                            MultiValueContainer,\n                            MultiValueRemove,\n                            Placeholder,\n                        }}\n                        isMulti={true}\n                        isClearable={false}\n                        openMenuOnFocus={false}\n                        menuIsOpen={false}\n                        placeholder={focused ? '' : placeholder}\n                        className={classNames('Input', className, {Input__focus: showLegend})}\n                        value={value}\n                        onChange={onChange as any} // types are not working correctly for multiselect\n                        styles={{...baseStyles, ...styles}}\n                        {...otherProps}\n                    />\n                </div>\n                {addon}\n            </fieldset>\n        </div>\n    );\n};\n\nexport default MultiInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {CSSProperties} from 'react';\nimport {FormattedMessage, injectIntl, IntlShape} from 'react-intl';\nimport {ActionMeta, InputActionMeta} from 'react-select';\nimport classNames from 'classnames';\n\nimport {isNull} from 'lodash';\n\nimport {ServerError} from 'mattermost-redux/types/errors';\nimport {TeamInviteWithError, Team} from 'mattermost-redux/types/teams';\nimport {isEmail} from 'mattermost-redux/utils/helpers';\n\nimport {SubscriptionStats} from 'mattermost-redux/types/cloud';\n\nimport {pageVisited, trackEvent} from 'actions/telemetry_actions';\nimport {getAnalyticsCategory} from 'components/next_steps_view/step_helpers';\nimport MultiInput from 'components/multi_input';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport UpgradeLink from 'components/widgets/links/upgrade_link';\n\nimport {getSiteURL} from 'utils/url';\nimport * as Utils from 'utils/utils';\n\nimport {StepComponentProps} from '../../steps';\n\nimport './invite_members_step.scss';\nimport NotifyLink from 'components/widgets/links/notify_link';\n\ntype Props = StepComponentProps & {\n    team: Team;\n    isEmailInvitesEnabled: boolean;\n    cloudUserLimit: string | number;\n    actions: {\n        sendEmailInvitesToTeamGracefully: (teamId: string, emails: string[]) => Promise<{ data: TeamInviteWithError[]; error: ServerError }>;\n        regenerateTeamInviteId: (teamId: string) => void;\n    };\n    subscriptionStats: SubscriptionStats | null;\n    intl: IntlShape;\n    isCloud: boolean;\n};\n\ntype State = {\n    copiedLink: boolean;\n    emails: SelectionType[];\n    emailsSent?: number;\n    emailInput: string;\n    emailError?: string;\n};\n\ntype SelectionType = {\n    label: string;\n    value: string;\n    error: boolean;\n}\n\nconst styles = {\n    control: () => {\n        return {\n            alignItems: 'flex-start',\n        };\n    },\n    valueContainer: (provided: CSSProperties) => {\n        return {\n            ...provided,\n            padding: '0',\n        };\n    },\n};\n\nclass InviteMembersStep extends React.PureComponent<Props, State> {\n    inviteLinkRef: React.RefObject<HTMLInputElement>;\n    timeout?: NodeJS.Timeout;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.inviteLinkRef = React.createRef();\n\n        this.state = {\n            copiedLink: false,\n            emailInput: '',\n            emails: [],\n        };\n    }\n\n    componentDidMount() {\n        if (this.props.expanded) {\n            pageVisited(getAnalyticsCategory(this.props.isAdmin), 'pageview_invite_members');\n        }\n\n        if (!this.props.team.invite_id) {\n            // force a regenerate if an invite ID hasn't been generated yet\n            this.props.actions.regenerateTeamInviteId(this.props.team.id);\n        }\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (prevProps.expanded !== this.props.expanded && this.props.expanded) {\n            pageVisited(getAnalyticsCategory(this.props.isAdmin), 'pageview_invite_members');\n        }\n    }\n\n    getRemainingUsers = (): number => {\n        const {subscriptionStats} = this.props;\n        const {emails} = this.state;\n        if (subscriptionStats) {\n            return subscriptionStats.remaining_seats - emails.length;\n        }\n        return 0;\n    }\n\n    shouldShowLimitError = (emailLength: number): boolean => {\n        const {subscriptionStats} = this.props;\n        if (subscriptionStats && subscriptionStats.is_paid_tier === 'true') {\n            return false;\n        }\n\n        if (subscriptionStats && (emailLength > subscriptionStats.remaining_seats)) {\n            return true;\n        }\n\n        return false;\n    }\n\n    onInputChange = (value: string, change: InputActionMeta) => {\n        if (!change) {\n            return;\n        }\n\n        if (change.action === 'input-blur' || change.action === 'menu-close') {\n            return;\n        }\n\n        if (this.state.emailInput === value) {\n            return;\n        }\n\n        if (value.indexOf(' ') !== -1 || value.indexOf(',') !== -1) {\n            const emails = value.split(/[\\s,]+/).filter((email) => email.length).map((email) => ({label: email, value: email, error: !isEmail(email)}));\n            const newEmails = [...this.state.emails, ...emails];\n            const {cloudUserLimit} = this.props;\n\n            const showLimitError = this.shouldShowLimitError(newEmails.length);\n\n            this.setState({\n                emails: newEmails,\n                emailInput: '',\n                emailError: showLimitError ? this.props.intl.formatMessage({\n                    id: 'next_steps_view.invite_members_step.tooManyEmails',\n                    defaultMessage: 'The free tier is limited to {num} members.'},\n                {num: cloudUserLimit}) : undefined,\n            });\n        } else {\n            this.setState({emailInput: value});\n        }\n    }\n\n    onChange = (value: SelectionType[], action: ActionMeta<SelectionType[]>) => {\n        if (action.action !== 'remove-value' && action.action !== 'pop-value') {\n            return;\n        }\n\n        if (!value.some((email) => email.error)) {\n            this.setState({emailError: undefined});\n        }\n\n        const {cloudUserLimit} = this.props;\n        const showLimitError = this.shouldShowLimitError(value.length);\n\n        if (showLimitError) {\n            this.setState({emailError: this.props.intl.formatMessage({\n                id: 'next_steps_view.invite_members_step.tooManyEmails',\n                defaultMessage: 'The free tier is limited to {num} members.'},\n            {num: cloudUserLimit})});\n        }\n\n        this.setState({emails: value});\n    }\n\n    onBlur = () => {\n        if (this.state.emailInput) {\n            const emails = this.state.emailInput.split(/[\\s,]+/).filter((email) => email.length).map((email) => ({label: email, value: email, error: !isEmail(email)}));\n            const newEmails = [...this.state.emails, ...emails];\n            const {cloudUserLimit} = this.props;\n            const showLimitError = this.shouldShowLimitError(newEmails.length);\n\n            this.setState({\n                emails: newEmails,\n                emailInput: '',\n                emailError: showLimitError ? this.props.intl.formatMessage({\n                    id: 'next_steps_view.invite_members_step.tooManyEmails',\n                    defaultMessage: 'The free tier is limited to {num} members.'},\n                {num: cloudUserLimit}) : undefined,\n            });\n        }\n    }\n\n    sendEmailInvites = async (): Promise<boolean> => {\n        // if no emails in the input, do nothing\n        if (this.state.emails.length === 0) {\n            return true;\n        }\n\n        if (this.state.emails.some((email) => email.error)) {\n            this.setState({emailError: Utils.localizeMessage('next_steps_view.invite_members_step.invalidEmail', 'One or more email addresses are invalid'), emailsSent: undefined});\n            return false;\n        }\n\n        trackEvent(getAnalyticsCategory(this.props.isAdmin), 'click_send_invitations', {num_invitations: this.state.emails.length});\n\n        const emails = this.state.emails.map((value) => value.value);\n        const {data, error} = await this.props.actions.sendEmailInvitesToTeamGracefully(this.props.team.id, emails);\n\n        if (error || !data.length || data.some((result) => result.error)) {\n            trackEvent(getAnalyticsCategory(this.props.isAdmin), 'error_sending_invitations');\n            this.setState({emailError: Utils.localizeMessage('next_steps_view.invite_members_step.errorSendingEmails', 'There was a problem sending your invitations. Please try again.'), emailsSent: undefined});\n            return false;\n        }\n\n        trackEvent(getAnalyticsCategory(this.props.isAdmin), 'invitations_sent', {num_invitations_sent: data.length});\n\n        this.setState({emailError: undefined, emailsSent: data.length}, () => {\n            setTimeout(() => this.setState({emailsSent: undefined}), 4000);\n        });\n\n        return true;\n    }\n\n    onSkip = () => {\n        this.props.onSkip(this.props.id);\n    }\n\n    onFinish = async () => {\n        const sent = await this.sendEmailInvites();\n        if (sent) {\n            this.props.onFinish(this.props.id);\n        }\n    }\n\n    copyLink = () => {\n        trackEvent(getAnalyticsCategory(this.props.isAdmin), 'click_copy_invite_link');\n\n        const clipboard = navigator.clipboard;\n        if (clipboard) {\n            clipboard.writeText(this.getInviteURL());\n            this.setState({copiedLink: true});\n        } else {\n            const textField = document.createElement('textarea');\n            textField.innerText = this.getInviteURL();\n            textField.style.position = 'fixed';\n            textField.style.opacity = '0';\n\n            document.body.appendChild(textField);\n            textField.select();\n\n            try {\n                this.setState({copiedLink: document.execCommand('copy')});\n            } catch (err) {\n                this.setState({copiedLink: false});\n            }\n            textField.remove();\n        }\n\n        if (this.timeout) {\n            clearTimeout(this.timeout);\n        }\n        this.timeout = setTimeout(() => {\n            this.setState({copiedLink: false});\n        }, 4000);\n    }\n\n    getInviteURL = () => {\n        return `${getSiteURL()}/signup_user_complete/?id=${this.props.team.invite_id}`;\n    }\n\n    render(): JSX.Element {\n        const linkBtn = this.props.isAdmin ? <UpgradeLink telemetryInfo='click_upgrade_invite_members_step'/> : <NotifyLink/>;\n        let subtitle = (\n            <FormattedMessage\n                id='next_steps_view.invite_members_step.youCanInvite'\n                defaultMessage='You can invite team members using a space or comma between addresses'\n            />\n        );\n\n        if (this.props?.subscriptionStats?.is_paid_tier === 'false') {\n            subtitle = (\n                <FormattedMessage\n                    id='next_steps_view.invite_members_step.youCanInviteUpTo'\n                    defaultMessage='You can invite up to {members} team members using a space or comma between addresses'\n                    values={{\n                        members: this.props?.subscriptionStats?.remaining_seats,\n                    }}\n                />\n            );\n        }\n        return (\n            <div className='NextStepsView__stepWrapper'>\n                <div className='InviteMembersStep'>\n                    {this.props.isEmailInvitesEnabled &&\n                        <div className='InviteMembersStep__emailInvitations'>\n                            <h4>\n                                <FormattedMessage\n                                    id='next_steps_view.invite_members_step.sendInvitationsViaEmail'\n                                    defaultMessage='Send invitations via email'\n                                />\n                            </h4>\n                            {subtitle}\n                            <MultiInput\n                                onBlur={this.onBlur}\n                                onInputChange={this.onInputChange}\n                                onChange={this.onChange}\n                                value={this.state.emails}\n                                inputValue={this.state.emailInput}\n                                legend={Utils.localizeMessage('next_steps_view.invite_members_step.emailAddresses', 'Email addresses')}\n                                placeholder={Utils.localizeMessage('next_steps_view.invite_members_step.enterEmailAddresses', 'Enter email addresses')}\n                                styles={styles}\n                                name='InviteMembersStep__membersListInput'\n                            />\n                            <div className='InviteMembersStep__send'>\n                                <button\n                                    data-testid='InviteMembersStep__sendButton'\n                                    className={classNames('NextStepsView__button InviteMembersStep__sendButton secondary',\n                                        {disabled: this.shouldShowLimitError(this.state.emails.length) || !this.state.emails.length || Boolean(this.state.emailsSent) || Boolean(this.state.emailError)},\n                                    )\n                                    }\n                                    disabled={this.shouldShowLimitError(this.state.emails.length) || !this.state.emails.length || Boolean(this.state.emailsSent) || Boolean(this.state.emailError)}\n                                    onClick={this.sendEmailInvites}\n                                >\n                                    <i className='icon icon-send'/>\n                                    <FormattedMessage\n                                        id='next_steps_view.invite_members_step.send'\n                                        defaultMessage='Send'\n                                    />\n                                </button>\n                                <div className={classNames('InviteMembersStep__invitationResults', {error: this.state.emailError})}>\n                                    {this.state.emailsSent &&\n                                        <>\n                                            <i className='icon icon-check'/>\n                                            <FormattedMarkdownMessage\n                                                id='next_steps_view.invite_members_step.invitationsSent'\n                                                defaultMessage='{num} invitations sent'\n                                                values={{num: this.state.emailsSent}}\n                                            />\n                                        </>\n                                    }\n                                    {this.state.emailError &&\n                                        <>\n                                            <i className='icon icon-alert-outline'/>\n                                            <span>{this.state.emailError}</span>\n                                        </>\n                                    }\n                                    {(this.state.emailError && !isNull(this.props.subscriptionStats) && this.shouldShowLimitError(this.state.emails.length)) && linkBtn\n                                    }\n                                </div>\n                            </div>\n                        </div>\n                    }\n                    <div className='InviteMembersStep__shareInviteLink'>\n                        <h4>\n                            {this.props.isEmailInvitesEnabled &&\n                                <FormattedMessage\n                                    id='next_steps_view.invite_members_step.orShareThisLink'\n                                    defaultMessage='Or share this link to invite members'\n                                />\n                            }\n                            {!this.props.isEmailInvitesEnabled &&\n                                <FormattedMessage\n                                    id='next_steps_view.invite_members_step.shareThisLink'\n                                    defaultMessage='Share this link to invite members'\n                                />\n                            }\n                        </h4>\n                        <div className='InviteMembersStep__shareLinkBlock'>\n                            <input\n                                ref={this.inviteLinkRef}\n                                className='InviteMembersStep__shareLinkInput form-control'\n                                type='text'\n                                readOnly={true}\n                                value={this.getInviteURL()}\n                                aria-label={Utils.localizeMessage({id: 'next_steps_view.invite_members_step.shareLinkInput', defaultMessage: 'team invite link'})}\n                                data-testid='InviteMembersStep__shareLinkInput'\n                            />\n                            <button\n                                className={classNames('NextStepsView__button InviteMembersStep__shareLinkInputButton secondary', {copied: this.state.copiedLink})}\n                                onClick={this.copyLink}\n                                data-testid='InviteMembersStep__shareLinkInputButton'\n                            >\n                                {!this.state.copiedLink &&\n                                    <>\n                                        <i className='icon icon-link-variant'/>\n                                        <FormattedMessage\n                                            id='next_steps_view.invite_members_step.copy_button'\n                                            defaultMessage='Copy Link'\n                                        />\n                                    </>\n                                }\n                                {this.state.copiedLink &&\n                                    <>\n                                        <i className='icon icon-check'/>\n                                        <FormattedMessage\n                                            id='next_steps_view.invite_members_step.link_copied'\n                                            defaultMessage='Copied'\n                                        />\n                                    </>\n                                }\n                            </button>\n                        </div>\n                    </div>\n                </div>\n                <div className='NextStepsView__wizardButtons'>\n                    <button\n                        data-testid='InviteMembersStep__finishButton'\n                        className={'NextStepsView__button NextStepsView__finishButton primary'}\n                        onClick={this.onFinish}\n                    >\n                        <FormattedMessage\n                            id='next_steps_view.invite_members_step.next'\n                            defaultMessage='Next'\n                        />\n                    </button>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default injectIntl(InviteMembersStep);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport {sendEmailInvitesToTeamGracefully, regenerateTeamInviteId} from 'mattermost-redux/actions/teams';\nimport {getConfig, getLicense, getSubscriptionStats} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {GenericAction, ActionFunc} from 'mattermost-redux/types/actions';\nimport {ServerError} from 'mattermost-redux/types/errors';\nimport {TeamInviteWithError} from 'mattermost-redux/types/teams';\n\nimport {GlobalState} from 'types/store';\n\nimport InviteMembersStep from './invite_members_step';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n\n    return {\n        team: getCurrentTeam(state),\n        isEmailInvitesEnabled: config.EnableEmailInvitations === 'true',\n        isCloud: getLicense(state).Cloud === 'true',\n        cloudUserLimit: config.ExperimentalCloudUserLimit || 10,\n        subscriptionStats: getSubscriptionStats(state),\n    };\n}\n\ntype Actions = {\n    sendEmailInvitesToTeamGracefully: (teamId: string, emails: string[]) => Promise<{ data: TeamInviteWithError[]; error: ServerError }>;\n    regenerateTeamInviteId: (teamId: string) => void;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            sendEmailInvitesToTeamGracefully,\n            regenerateTeamInviteId,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InviteMembersStep);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport classNames from 'classnames';\n\nimport {Team} from 'mattermost-redux/types/teams';\n\nimport {pageVisited, trackEvent} from 'actions/telemetry_actions';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport Input from 'components/input';\nimport {getAnalyticsCategory} from 'components/next_steps_view/step_helpers';\nimport PictureSelector from 'components/picture_selector';\nimport {AcceptedProfileImageTypes} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport {StepComponentProps} from '../../steps';\n\nimport './team_profile_step.scss';\n\nconst MAX_TEAM_NAME_LENGTH = 64;\n\ntype Props = StepComponentProps & {\n    team: Team & {last_team_icon_update?: number};\n    siteURL: string;\n    maxFileSize: number;\n    actions: {\n        patchTeam: (team: Team) => void;\n        removeTeamIcon: (teamId: string) => void;\n        setTeamIcon: (teamId: string, imageData: File) => void;\n    };\n};\n\ntype State = {\n    teamName: string;\n    teamNameError?: string;\n    profilePicture?: File;\n    profilePictureError: boolean;\n    removeProfilePicture: boolean;\n};\n\nexport default class TeamProfileStep extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            teamName: props.team.display_name,\n            profilePictureError: false,\n            removeProfilePicture: false,\n        };\n    }\n\n    componentDidMount() {\n        if (this.props.expanded) {\n            pageVisited(getAnalyticsCategory(this.props.isAdmin), 'pageview_name_team');\n        }\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (prevProps.expanded !== this.props.expanded && this.props.expanded) {\n            pageVisited(getAnalyticsCategory(this.props.isAdmin), 'pageview_name_team');\n        }\n    }\n\n    private handleNameInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n        let teamNameError;\n        if (!event.target.value) {\n            teamNameError = Utils.localizeMessage('next_steps_view.team_profile_step.nameCannotBeBlank', 'Team name cannot be blank');\n        } else if (event.target.value.length > MAX_TEAM_NAME_LENGTH) {\n            teamNameError = Utils.localizeMessage('next_steps_view.team_profile_step.nameTooBig', 'Team name must be less than 64 characters');\n        }\n\n        this.setState({teamName: event.target.value, teamNameError});\n    }\n\n    isFinishDisabled = () => {\n        return Boolean(!this.state.teamName || this.state.teamNameError || this.state.profilePictureError);\n    }\n\n    onSkip = () => {\n        this.props.onSkip(this.props.id);\n    }\n\n    onFinish = () => {\n        const team = Object.assign({}, this.props.team, {display_name: this.state.teamName});\n\n        this.props.actions.patchTeam(team);\n\n        if (this.state.profilePicture) {\n            this.props.actions.setTeamIcon(this.props.team.id, this.state.profilePicture);\n        } else if (this.state.removeProfilePicture) {\n            this.props.actions.removeTeamIcon(this.props.team.id);\n        }\n\n        trackEvent(getAnalyticsCategory(this.props.isAdmin), 'click_save_team');\n\n        this.props.onFinish(this.props.id);\n    }\n\n    onOpenPictureDialog = () => {\n        trackEvent(getAnalyticsCategory(this.props.isAdmin), 'click_add_team_image');\n    }\n\n    onSelectPicture = (profilePicture: File) => {\n        if (!AcceptedProfileImageTypes.includes(profilePicture.type) || profilePicture.size > this.props.maxFileSize) {\n            trackEvent(getAnalyticsCategory(this.props.isAdmin), 'error_profile_photo_invalid');\n\n            this.setState({profilePictureError: true});\n            return;\n        }\n\n        this.setState({profilePicture, profilePictureError: false, removeProfilePicture: false});\n    }\n\n    onRemovePicture = () => {\n        trackEvent(getAnalyticsCategory(this.props.isAdmin), 'click_remove_photo');\n\n        this.setState({profilePicture: undefined, profilePictureError: false, removeProfilePicture: true});\n    }\n\n    render() {\n        const {team} = this.props;\n\n        // Make sure picture has been set\n        const pictureSrc = team.last_team_icon_update && !this.state.removeProfilePicture ? Utils.imageURLForTeam(team) || undefined : undefined;\n\n        return (\n            <div className='NextStepsView__stepWrapper'>\n                <div className='TeamProfileStep'>\n                    <div className='TeamProfileStep__profilePicture'>\n                        <h3>\n                            <FormattedMessage\n                                id='next_steps_view.team_profile_step.teamImage'\n                                defaultMessage='Team image'\n                            />\n                        </h3>\n                        <PictureSelector\n                            name='TeamProfileStep__teamIcon'\n                            onOpenDialog={this.onOpenPictureDialog}\n                            onSelect={this.onSelectPicture}\n                            onRemove={this.onRemovePicture}\n                            src={pictureSrc}\n                            placeholder={(\n                                <div\n                                    data-testid='teamIconInitial'\n                                    className={'TeamIcon__initials TeamIcon__initials__lg'}\n                                    aria-label={'Team Initials'}\n                                >\n                                    {this.props.team.display_name ? this.props.team.display_name.replace(/\\s/g, '').substring(0, 2) : '??'}\n                                </div>\n                            )}\n                        />\n                    </div>\n                    <div className='TeamProfileStep__textInputs'>\n                        <h3>\n                            <FormattedMessage\n                                id='next_steps_view.team_profile_step.enterYourNameAndURL'\n                                defaultMessage='Enter your team name'\n                            />\n                        </h3>\n                        <Input\n                            name='teamName'\n                            type='text'\n                            value={this.state.teamName}\n                            onChange={this.handleNameInputChange}\n                            placeholder={Utils.localizeMessage('next_steps_view.team_profile_step.teamName', 'Team name')}\n                            error={this.state.teamNameError}\n                            info={Utils.localizeMessage('next_steps_view.team_profile_step.nameWillBeDisplayed', 'Your team name will be displayed in your sidebar')}\n                        />\n                    </div>\n                </div>\n                {this.state.profilePictureError &&\n                    <span className='TeamProfileStep__pictureError'>\n                        <i className='icon icon-alert-outline'/>\n                        <FormattedMarkdownMessage\n                            id='next_steps_view.team_profile_step.pictureError'\n                            defaultMessage='Photos must be in BMP, JPG or PNG format. Maximum file size is {max}.'\n                            values={{max: Utils.fileSizeToString(this.props.maxFileSize)}}\n                        />\n                    </span>\n                }\n                <div className='NextStepsView__wizardButtons'>\n                    <button\n                        data-testid='TeamProfileStep__saveTeamButton'\n                        className={classNames('NextStepsView__button NextStepsView__finishButton primary', {disabled: this.isFinishDisabled()})}\n                        onClick={this.onFinish}\n                        disabled={this.isFinishDisabled()}\n                    >\n                        <FormattedMessage\n                            id='next_steps_view.team_profile_step.saveTeam'\n                            defaultMessage='Save team'\n                        />\n                    </button>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {patchTeam, removeTeamIcon, setTeamIcon} from 'mattermost-redux/actions/teams';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {GlobalState} from 'types/store';\n\nimport TeamProfileStep from './team_profile_step';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n\n    return {\n        team: getCurrentTeam(state),\n        siteURL: config.SiteURL!,\n        maxFileSize: parseInt(config.MaxFileSize!, 10),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            patchTeam,\n            removeTeamIcon,\n            setTeamIcon,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamProfileStep);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {createSelector} from 'reselect';\n\nimport {makeGetCategory} from 'mattermost-redux/selectors/entities/preferences';\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport {getCurrentUser, getUsers} from 'mattermost-redux/selectors/entities/users';\n\nimport {GlobalState} from 'types/store';\nimport {RecommendedNextSteps, Preferences} from 'utils/constants';\nimport {t} from 'utils/i18n';\n\nimport CompleteProfileStep from './steps/complete_profile_step';\nimport SetupPreferencesStep from './steps/setup_preferences_step/setup_preferences_step';\nimport InviteMembersStep from './steps/invite_members_step';\nimport TeamProfileStep from './steps/team_profile_step';\nimport EnableNotificationsStep from './steps/enable_notifications_step/enable_notifications_step';\n\nimport {isStepForUser} from './step_helpers';\n\nexport type StepComponentProps = {\n    id: string;\n    expanded: boolean;\n    isAdmin: boolean;\n    currentUser: UserProfile;\n    onSkip: (id: string) => void;\n    onFinish: (id: string) => void;\n}\nexport type StepType = {\n    id: string;\n    title: {\n        titleId: string;\n        titleMessage: string;\n    };\n    component: React.ComponentType<StepComponentProps | StepComponentProps & {isFirstAdmin: boolean}>;\n    visible: boolean;\n\n    // An array of all roles a user must have in order to see the step e.g. admins are both system_admin and system_user\n    // so you would require ['system_admin','system_user'] to match.\n    // to show step for all roles, leave the roles array blank.\n    // for a step that must be shown only to the first admin, add the first_admin role to that step\n    roles: string[];\n};\n\nexport const Steps: StepType[] = [\n    {\n        id: RecommendedNextSteps.COMPLETE_PROFILE,\n        title: {\n            titleId: t('next_steps_view.titles.completeProfile'),\n            titleMessage: 'Complete your profile',\n        },\n        component: CompleteProfileStep,\n        roles: [],\n        visible: true,\n    },\n    {\n        id: RecommendedNextSteps.TEAM_SETUP,\n        title: {\n            titleId: t('next_steps_view.titles.teamSetup'),\n            titleMessage: 'Name your team',\n        },\n        roles: ['first_admin'],\n        component: TeamProfileStep,\n        visible: true,\n    },\n    {\n        id: RecommendedNextSteps.NOTIFICATION_SETUP,\n        title: {\n            titleId: t('next_steps_view.notificationSetup.setNotifications'),\n            titleMessage: 'Set up notifications',\n        },\n        roles: ['system_user'],\n        component: EnableNotificationsStep,\n        visible: true,\n    },\n    {\n        id: RecommendedNextSteps.PREFERENCES_SETUP,\n        title: {\n            titleId: t('next_steps_view.titles.preferenceSetup'),\n            titleMessage: 'Set your preferences',\n        },\n        roles: ['system_user'],\n        component: SetupPreferencesStep,\n        visible: false,\n    },\n    {\n        id: RecommendedNextSteps.INVITE_MEMBERS,\n        title: {\n            titleId: t('next_steps_view.titles.inviteMembers'),\n            titleMessage: 'Invite members to the team',\n        },\n        roles: ['system_admin', 'system_user'],\n        component: InviteMembersStep,\n        visible: true,\n    },\n];\n\nexport const isFirstAdmin = createSelector(\n    'isFirstAdmin',\n    (state: GlobalState) => getCurrentUser(state),\n    (state: GlobalState) => getUsers(state),\n    (currentUser, users) => {\n        if (!currentUser.roles.includes('system_admin')) {\n            return false;\n        }\n        const userIds = Object.keys(users);\n        for (const userId of userIds) {\n            const user = users[userId];\n            if (user.roles.includes('system_admin') && user.create_at < currentUser.create_at) {\n            // If the user in the list is an admin with create_at less than our user, than that user is older than the current one, so it can't be the first admin.\n                return false;\n            }\n        }\n        return true;\n    },\n);\n\nexport const getSteps = createSelector(\n    'getSteps',\n    (state: GlobalState) => getCurrentUser(state),\n    (state: GlobalState) => isFirstAdmin(state),\n    (currentUser, firstAdmin) => {\n        const roles = firstAdmin ? `first_admin ${currentUser.roles}` : currentUser.roles;\n        return Steps.filter((step) =>\n            isStepForUser(step, roles) && step.visible,\n        );\n    },\n);\n\nconst getCategory = makeGetCategory();\nexport const showOnboarding = createSelector(\n    'getCategory',\n    (state: GlobalState) => showNextSteps(state),\n    (state: GlobalState) => showNextStepsTips(state),\n    (state: GlobalState) => state.views.nextSteps.show,\n    (showNextSteps, showNextStepsTips, showNextStepsEphemeral) => {\n        return !showNextStepsEphemeral && (showNextSteps || showNextStepsTips);\n    });\n\nexport const isOnboardingHidden = createSelector(\n    'isOnboardingHidden',\n    (state: GlobalState) => getCategory(state, Preferences.RECOMMENDED_NEXT_STEPS),\n    (stepPreferences) => {\n        // Before onboarding was introduced, there were existing users that didn't have step preferences set.\n        // We don't want onboarding to suddenly pop up for them.\n        if (stepPreferences.length === 0) {\n            return true;\n        }\n        return stepPreferences.some((pref) => (pref.name === RecommendedNextSteps.HIDE && pref.value === 'true'));\n    },\n);\n\n// Only show next steps if they haven't been skipped and there are steps unfinished\nexport const showNextSteps = createSelector(\n    'showNextSteps',\n    (state: GlobalState) => getCategory(state, Preferences.RECOMMENDED_NEXT_STEPS),\n    (state: GlobalState) => nextStepsNotFinished(state),\n    (stepPreferences, nextStepsNotFinished) => {\n        if (stepPreferences.some((pref) => (pref.name === RecommendedNextSteps.SKIP && pref.value === 'true'))) {\n            return false;\n        }\n\n        return nextStepsNotFinished;\n    },\n);\n\n// Only show tips if they have been skipped, or there are no unfinished steps\nexport const showNextStepsTips = createSelector(\n    'showNextStepsTips',\n    (state: GlobalState) => getCategory(state, Preferences.RECOMMENDED_NEXT_STEPS),\n    (state: GlobalState) => nextStepsNotFinished(state),\n    (stepPreferences, nextStepsNotFinished) => {\n        if (stepPreferences.some((pref) => (pref.name === RecommendedNextSteps.SKIP && pref.value === 'true'))) {\n            return true;\n        }\n\n        return !nextStepsNotFinished;\n    },\n);\n\n// Loop through all Steps. For each step, check that\nexport const nextStepsNotFinished = createSelector(\n    'nextStepsNotFinished',\n    (state: GlobalState) => getCategory(state, Preferences.RECOMMENDED_NEXT_STEPS),\n    (state: GlobalState) => getCurrentUser(state),\n    (state: GlobalState) => isFirstAdmin(state),\n    (state: GlobalState) => getSteps(state),\n    (stepPreferences, currentUser, firstAdmin, mySteps) => {\n        const roles = firstAdmin ? `first_admin ${currentUser.roles}` : currentUser.roles;\n        const checkPref = (step: StepType) => stepPreferences.some((pref) => (pref.name === step.id && pref.value === 'true') || !isStepForUser(step, roles));\n        return !mySteps.every(checkPref);\n    },\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\n\nimport {pageVisited, trackEvent} from 'actions/telemetry_actions';\nimport {getAnalyticsCategory} from 'components/next_steps_view/step_helpers';\nimport * as Utils from 'utils/utils.jsx';\nimport {t} from 'utils/i18n';\nimport {showNotification} from 'utils/notifications';\nimport {StepComponentProps} from '../../steps';\n\nimport TextCardWithAction from '../text_card_with_action/text_card_with_action';\n\nexport default function EnableNotificationsStep(props: StepComponentProps) {\n    useEffect(() => {\n        if (props.expanded) {\n            pageVisited(getAnalyticsCategory(props.isAdmin), 'pageview_enable_notifications');\n        }\n    }, [props.expanded]);\n\n    const onFinish = async () => {\n        trackEvent(getAnalyticsCategory(props.isAdmin), 'click_enable_notifications');\n        try {\n            await showNotification({\n                title: Utils.localizeMessage(\n                    'next_steps_view.notificationSetup.notficationsEnabledTitle',\n                    'Notifications Enabled!',\n                ),\n                body: Utils.localizeMessage(\n                    'next_steps_view.notificationSetup.notficationsEnabledBody',\n                    'This is how notifications from Mattermost will appear',\n                ),\n                requireInteraction: false,\n                silent: false,\n                onClick: () => { },\n            });\n        } catch (err) {\n            // If the user Clicks \"Block\" when prompted to enable notifications, we throw an exception\n            // This blank catch allows us to continue\n        }\n        props.onFinish(props.id);\n    };\n\n    const notificationsDisabled = () => {\n        if (!('Notification' in window)) {\n            return true;\n        }\n\n        if (Notification.permission === 'denied') {\n            return true;\n        }\n\n        return false;\n    };\n\n    if (notificationsDisabled()) {\n        return (\n            <div>\n                <TextCardWithAction\n                    cardBodyMessageId={'next_steps_view.notificationSetupNotificationsDisabled'}\n                    cardBodyDefaultMessage={\n                        'Notifications were previously disabled or you may be browsing in private mode. You\\'ll need to open your browser settings or turn off private mode to enable notifications.'\n                    }\n                    buttonMessageId={\n                        'next_steps_view.notificationSetup.skipThisStep'\n                    }\n                    buttonDefaultMessage={'Skip this step'}\n                    onClick={onFinish}\n                />\n            </div>\n        );\n    }\n    return (\n        <TextCardWithAction\n            cardBodyMessageId={t('next_steps_view.notificationSetup')}\n            cardBodyDefaultMessage={\n                'We recommend enabling desktop notifications so you don’t miss any important communications.'\n            }\n            buttonMessageId={'next_steps_view.notificationSetup.setNotifications'}\n            buttonDefaultMessage={'Set up notifications'}\n            onClick={onFinish}\n        />\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\n\nimport {useDispatch} from 'react-redux';\n\nimport {pageVisited, trackEvent} from 'actions/telemetry_actions';\nimport {getAnalyticsCategory} from 'components/next_steps_view/step_helpers';\nimport {ModalIdentifiers} from 'utils/constants';\nimport UserSettingsModal from '../../../user_settings/modal';\nimport {StepComponentProps} from '../../steps';\nimport TextCardWithAction from '../text_card_with_action/text_card_with_action';\nimport {openModal} from 'actions/views/modals';\n\nexport default function SetupPreferencesStep(props: StepComponentProps) {\n    useEffect(() => {\n        if (props.expanded) {\n            pageVisited(getAnalyticsCategory(props.isAdmin), 'pageview_enable_notifications');\n        }\n    }, [props.expanded]);\n\n    const dispatch = useDispatch();\n\n    const onFinish = () => {\n        props.onFinish(props.id);\n    };\n\n    const onClick = () => {\n        trackEvent(getAnalyticsCategory(props.isAdmin), 'click_set_preferences');\n        dispatch(openModal({\n            modalId: ModalIdentifiers.USER_SETTINGS,\n            dialogType: UserSettingsModal,\n            dialogProps: {\n                onExit: onFinish,\n                dialogProps: {isContentProductSettings: true},\n            },\n        }));\n    };\n\n    return (\n        <>\n            <TextCardWithAction\n                cardBodyMessageId={'next_steps_view.preferenceSetup'}\n                cardBodyDefaultMessage={'You can change how you receive notifications, update your profile, customize display settings and more. Preferences can be accessed through the Main Menu.'}\n                buttonMessageId={'next_steps_view.preferenceSetup.setPreferences'}\n                buttonDefaultMessage={'Set Preferences'}\n                onClick={onClick}\n            />\n        </>\n    );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function PinIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='16px'\n                height='16px'\n                viewBox='0 0 18 18'\n                version='1.1'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.pin', defaultMessage: 'Pin Icon'})}\n            >\n                <path d='M17.73 7.01999L16.83 6.11999L10.98 0.251987C10.812 0.0839874 10.602 -1.26362e-05 10.35 -1.26362e-05C10.098 -1.26362e-05 9.888 0.0899873 9.72 0.269987C9.54 0.449987 9.45 0.665987 9.45 0.917987C9.45 1.15799 9.54 1.36799 9.72 1.54799L9.99 1.79999L5.994 5.75999C4.422 5.57999 2.922 5.77799 1.494 6.35399C1.35 6.40199 1.224 6.48599 1.116 6.60599C1.02 6.72599 0.954 6.86399 0.918 7.01999C0.894 7.16399 0.9 7.30799 0.936 7.45199C0.984 7.59599 1.062 7.72199 1.17 7.82999L5.004 11.664L1.35 15.3L0.45 17.55L2.7 16.65L6.354 13.014L10.17 16.83C10.278 16.938 10.404 17.01 10.548 17.046C10.704 17.094 10.854 17.1 10.998 17.064C11.154 17.04 11.286 16.974 11.394 16.866C11.514 16.77 11.598 16.644 11.646 16.488C12.246 15.024 12.444 13.524 12.24 11.988L16.2 8.02799L16.452 8.29799C16.632 8.47799 16.848 8.56799 17.1 8.56799C17.352 8.56799 17.562 8.47799 17.73 8.29799C17.91 8.11799 18 7.90799 18 7.66799C18 7.41599 17.91 7.19999 17.73 7.01999ZM10.584 11.052C10.464 11.172 10.386 11.316 10.35 11.484C10.314 11.64 10.32 11.796 10.368 11.952C10.584 12.792 10.584 13.638 10.368 14.49L3.51 7.63199C4.362 7.41599 5.208 7.41599 6.048 7.63199C6.204 7.67999 6.36 7.68599 6.516 7.64999C6.684 7.60199 6.828 7.51799 6.948 7.39799L11.25 3.07799L14.904 6.73199L10.584 11.052Z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ReactNode, CSSProperties} from 'react';\nimport {FormattedMessage, MessageDescriptor} from 'react-intl';\nimport classNames from 'classnames';\n\nimport {Dictionary} from 'mattermost-redux/types/utilities';\n\nimport {t} from 'utils/i18n';\n\nimport FlagIcon from 'components/widgets/icons/flag_icon';\nimport MentionsIcon from 'components/widgets/icons/mentions_icon';\nimport PinIcon from 'components/widgets/icons/pin_icon';\nimport SearchIcon from 'components/widgets/icons/search_icon';\n\nimport {NoResultsVariant} from './types';\n\ninterface Props {\n    expanded?: boolean;\n    iconGraphic?: ReactNode;\n    title?: ReactNode;\n    subtitle?: ReactNode;\n    variant?: NoResultsVariant;\n    titleValues?: Dictionary<ReactNode>;\n    subtitleValues?: Dictionary<ReactNode>;\n    style?: CSSProperties;\n}\n\nconst iconMap: {[key in NoResultsVariant]: React.ReactNode } = {\n    [NoResultsVariant.ChannelSearch]: <SearchIcon className='no-results__icon'/>,\n    [NoResultsVariant.Mentions]: <MentionsIcon className='no-results__icon'/>,\n    [NoResultsVariant.FlaggedPosts]: <FlagIcon className='no-results__icon'/>,\n    [NoResultsVariant.PinnedPosts]: <PinIcon className='no-results__icon'/>,\n    [NoResultsVariant.ChannelFiles]: <i className='icon icon-file-text-outline no-results__icon'/>,\n    [NoResultsVariant.ChannelFilesFiltered]: <i className='icon icon-file-text-outline no-results__icon'/>,\n};\n\nconst titleMap: {[key in NoResultsVariant]: MessageDescriptor} = {\n    [NoResultsVariant.ChannelSearch]: {\n        id: t('no_results.channel_search.title'),\n    },\n    [NoResultsVariant.Mentions]: {\n        id: t('no_results.mentions.title'),\n    },\n    [NoResultsVariant.FlaggedPosts]: {\n        id: t('no_results.flagged_posts.title'),\n    },\n    [NoResultsVariant.PinnedPosts]: {\n        id: t('no_results.pinned_posts.title'),\n    },\n    [NoResultsVariant.ChannelFiles]: {\n        id: t('no_results.channel_files.title'),\n    },\n    [NoResultsVariant.ChannelFilesFiltered]: {\n        id: t('no_results.channel_files_filtered.title'),\n    },\n};\n\nconst subtitleMap: {[key in NoResultsVariant]: MessageDescriptor} = {\n    [NoResultsVariant.ChannelSearch]: {\n        id: t('no_results.channel_search.subtitle'),\n    },\n    [NoResultsVariant.Mentions]: {\n        id: t('no_results.mentions.subtitle'),\n    },\n    [NoResultsVariant.FlaggedPosts]: {\n        id: t('no_results.flagged_posts.subtitle'),\n    },\n    [NoResultsVariant.PinnedPosts]: {\n        id: t('no_results.pinned_posts.subtitle'),\n    },\n    [NoResultsVariant.ChannelFiles]: {\n        id: t('no_results.channel_files.subtitle'),\n    },\n    [NoResultsVariant.ChannelFilesFiltered]: {\n        id: t('no_results.channel_files_filtered.subtitle'),\n    },\n};\n\nimport './no_results_indicator.scss';\n\nconst NoResultsIndicator = ({\n    expanded,\n    style,\n    variant,\n    iconGraphic = variant ? (\n        <div className='no-results__variant-wrapper'>\n            {iconMap[variant]}\n        </div>\n    ) : null,\n    titleValues,\n    title = variant ? (\n        <FormattedMessage\n            {...titleMap[variant]}\n            values={titleValues}\n        />\n    ) : null,\n    subtitleValues,\n    subtitle = variant ? (\n        <FormattedMessage\n            {...subtitleMap[variant]}\n            values={subtitleValues}\n        />\n    ) : null,\n}: Props) => {\n    let content = (\n        <div\n            className='no-results__wrapper'\n            style={style}\n        >\n            {iconGraphic}\n\n            {title ? (\n                <h3 className={classNames('no-results__title', {'only-title': !subtitle})}>\n                    {title}\n                </h3>\n            ) : null}\n\n            {subtitle ? (\n                <div className='no-results__subtitle'>\n                    {subtitle}\n                </div>\n            ) : null}\n\n        </div>\n    );\n\n    if (expanded) {\n        content = (\n            <div className='no-results__holder'>\n                {content}\n            </div>\n        );\n    }\n\n    return content;\n};\n\nexport default NoResultsIndicator;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nexport enum NoResultsVariant {\n    ChannelSearch = 'ChannelSearch',\n    Mentions = 'Mentions',\n    FlaggedPosts = 'FlaggedPosts',\n    PinnedPosts = 'PinnedPosts',\n    ChannelFiles = 'ChannelFiles',\n    ChannelFilesFiltered = 'ChannelFilesFiltered',\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\n// eslint-disable-next-line no-restricted-imports\nimport {OverlayTrigger as OriginalOverlayTrigger, OverlayTriggerProps} from 'react-bootstrap';\nimport {IntlContext, IntlShape} from 'react-intl';\n\nimport {Provider} from 'react-redux';\n\nimport store from 'stores/redux_store.jsx';\n\nexport type BaseOverlayTrigger = OriginalOverlayTrigger & {\n    hide: () => void;\n}\n\ntype Props = OverlayTriggerProps & {\n    disabled?: boolean;\n    className?: string;\n};\n\nconst OverlayTrigger = React.forwardRef((props: Props, ref?: React.Ref<OriginalOverlayTrigger>) => {\n    const {\n        overlay,\n        disabled,\n        ...otherProps\n    } = props;\n\n    // The overlay is rendered outside of the regular React context, and our version react-bootstrap can't forward\n    // that context itself, so we have to manually forward the react-intl context to this component's child.\n    const OverlayWrapper = ({intl, ...overlayProps}: { intl: IntlShape }) => (\n        <Provider store={store}>\n            <IntlContext.Provider value={intl}>\n                {React.cloneElement(overlay, overlayProps)}\n            </IntlContext.Provider>\n        </Provider>\n    );\n\n    return (\n        <IntlContext.Consumer>\n            {(intl): React.ReactNode => {\n                const overlayProps = {...overlay.props};\n                if (disabled) {\n                    overlayProps.style = {visibility: 'hidden', ...overlayProps.style};\n                }\n                return (\n                    <OriginalOverlayTrigger\n                        {...otherProps}\n                        ref={ref}\n                        overlay={\n                            <OverlayWrapper\n                                {...overlayProps}\n                                intl={intl}\n                            />\n                        }\n                    />\n                );\n            }}\n        </IntlContext.Consumer>\n    );\n});\n\nOverlayTrigger.defaultProps = {\n    defaultOverlayShown: false,\n    trigger: ['hover', 'focus'],\n};\nOverlayTrigger.displayName = 'OverlayTrigger';\n\nexport default OverlayTrigger;\n","export default __webpack_public_path__ + \"files/2c5822f8df09cab9d59c37cf805af370.png\";","export default __webpack_public_path__ + \"files/85f92b639485f3804bb173daab1383a1.png\";","export default __webpack_public_path__ + \"files/9dec2b83083c1216ab4e0367f21224d2.jpg\";","export default __webpack_public_path__ + \"files/24f51892c8813505b11ad2c26740ee7a.png\";","export default __webpack_public_path__ + \"files/ad02dc088755e3884a5b5c97211665bb.png\";","export default __webpack_public_path__ + \"files/a37832275fd33b01dc279fc8788128da.jpg\";","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport amex from 'images/cloud/cards/amex.png';\n\nimport dinersclub from 'images/cloud/cards/dinersclub.png';\nimport discover from 'images/cloud/cards/discover.jpg';\nimport jcb from 'images/cloud/cards/jcb.png';\nimport mastercard from 'images/cloud/cards/mastercard.png';\nimport visa from 'images/cloud/cards/visa.jpg';\n\nimport './card_image.css';\n\ntype Props = {\n    brand: string;\n}\n\nexport default function CardImage(props: Props) {\n    const {brand} = props;\n\n    const cardImageSrc = getCardImage(brand);\n    if (cardImageSrc) {\n        return (\n            <img\n                className='CardImage'\n                src={cardImageSrc}\n                alt={brand}\n            />\n        );\n    }\n\n    return null;\n}\n\nfunction getCardImage(brand: string): string {\n    switch (brand) {\n    case 'amex':\n        return amex;\n    case 'diners':\n        return dinersclub;\n    case 'discover':\n        return discover;\n    case 'jcb':\n        return jcb;\n    case 'mastercard':\n        return mastercard;\n    case 'visa':\n        return visa;\n    }\n\n    return '';\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {StripeElements, StripeCardElement, StripeCardElementChangeEvent} from '@stripe/stripe-js';\nimport {ElementsConsumer, CardElement} from '@stripe/react-stripe-js';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport './card_input.css';\nimport 'components/input.css';\n\nconst CARD_ELEMENT_OPTIONS = {\n    hidePostalCode: true,\n    style: {\n        base: {\n            fontFamily: 'Open Sans',\n            fontSize: '14px',\n            opacity: '0.5',\n            fontSmoothing: 'antialiased',\n        },\n    },\n};\n\ntype OwnProps = {\n    error?: string;\n    required?: boolean;\n    forwardedRef?: any;\n\n    // Stripe doesn't give type exports\n    [propName: string]: any; //eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\ntype Props = {\n    elements: StripeElements | null | undefined;\n    onCardInputChange?: (event: StripeCardElementChangeEvent) => void;\n} & OwnProps;\n\ntype State = {\n    focused: boolean;\n    error: string;\n    empty: boolean;\n    complete: boolean;\n}\n\nconst REQUIRED_FIELD_TEXT = 'This field is required';\nconst VALID_CARD_TEXT = 'Please enter a valid credit card';\n\nexport interface CardInputType extends React.PureComponent {\n    getCard(): StripeCardElement | undefined;\n}\n\nclass CardInput extends React.PureComponent<Props, State> {\n    public constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            focused: false,\n            error: '',\n            empty: true,\n            complete: false,\n        };\n    }\n\n    private onFocus = () => {\n        const {onFocus} = this.props;\n\n        this.setState({focused: true});\n\n        if (onFocus) {\n            onFocus();\n        }\n    }\n\n    private onBlur = () => {\n        const {onBlur} = this.props;\n\n        this.setState({focused: false});\n        this.validateInput();\n\n        if (onBlur) {\n            onBlur();\n        }\n    }\n\n    private onChange = (event: StripeCardElementChangeEvent) => {\n        this.setState({error: '', empty: event.empty, complete: event.complete});\n        if (this.props.onCardInputChange) {\n            this.props.onCardInputChange(event);\n        }\n    }\n\n    private validateInput = () => {\n        const {required} = this.props;\n        const {empty, complete} = this.state;\n        let error = '';\n\n        this.setState({error: ''});\n        if (required && empty) {\n            error = REQUIRED_FIELD_TEXT;\n        } else if (!complete) {\n            error = VALID_CARD_TEXT;\n        }\n\n        this.setState({error});\n    }\n\n    private renderError(error: string) {\n        if (!error) {\n            return null;\n        }\n\n        let errorMessage;\n        if (error === REQUIRED_FIELD_TEXT) {\n            errorMessage = (\n                <FormattedMessage\n                    id='payment.field_required'\n                    defaultMessage='This field is required'\n                />);\n        } else if (error === VALID_CARD_TEXT) {\n            errorMessage = (\n                <FormattedMessage\n                    id='payment.invalid_card_number'\n                    defaultMessage='Please enter a valid credit card'\n                />);\n        }\n\n        return (\n            <div className='Input___error'>\n                <i className='icon icon-alert-outline'/>\n                {errorMessage}\n            </div>\n        );\n    }\n\n    public getCard(): StripeCardElement | null | undefined {\n        return this.props.elements?.getElement(CardElement);\n    }\n\n    public render() {\n        const {className, error: propError, ...otherProps} = this.props;\n        const {empty, focused, error: stateError} = this.state;\n        let fieldsetClass = className ? `Input_fieldset ${className}` : 'Input_fieldset';\n        let fieldsetErrorClass = className ? `Input_fieldset Input_fieldset___error ${className}` : 'Input_fieldset Input_fieldset___error';\n        const showLegend = Boolean(focused || !empty);\n\n        fieldsetClass = showLegend ? fieldsetClass + ' Input_fieldset___legend' : fieldsetClass;\n        fieldsetErrorClass = showLegend ? fieldsetErrorClass + ' Input_fieldset___legend' : fieldsetErrorClass;\n\n        const error = propError || stateError;\n\n        return (\n            <div className='Input_container'>\n                <fieldset className={error ? fieldsetErrorClass : fieldsetClass}>\n                    <legend className={showLegend ? 'Input_legend Input_legend___focus' : 'Input_legend'}>\n                        <FormattedMessage\n                            id='payment.card_number'\n                            defaultMessage='Card Number'\n                        />\n                    </legend>\n                    <CardElement\n                        {...otherProps}\n                        options={CARD_ELEMENT_OPTIONS}\n                        onBlur={this.onBlur}\n                        onFocus={this.onFocus}\n                        onChange={this.onChange}\n                    />\n                </fieldset>\n                {this.renderError(error)}\n            </div>\n        );\n    }\n}\n\nconst InjectedCardInput = (props: OwnProps) => {\n    return (\n        <ElementsConsumer>\n            {({elements}) => (\n                <CardInput\n                    ref={props.forwardedRef}\n                    elements={elements}\n                    {...props}\n                />\n            )}\n        </ElementsConsumer>\n    );\n};\n\nexport default InjectedCardInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {getName} from 'country-list';\nimport {FormattedMessage} from 'react-intl';\n\nimport {\n    StripeCardElementChangeEvent,\n} from '@stripe/stripe-js';\n\nimport {PaymentMethod} from 'mattermost-redux/types/cloud';\n\nimport {BillingDetails} from 'types/cloud/sku';\n\nimport DropdownInput from 'components/dropdown_input';\nimport Input from 'components/input';\nimport * as Utils from 'utils/utils';\nimport {COUNTRIES} from 'utils/countries';\n\nimport StateSelector from './state_selector';\nimport CardInput, {CardInputType} from './card_input';\nimport CardImage from './card_image';\n\nimport './payment_form.scss';\nimport 'components/input.css';\n\ntype Props = {\n    className: string;\n    initialBillingDetails?: BillingDetails;\n    paymentMethod?: PaymentMethod;\n    onCardInputChange?: (change: StripeCardElementChangeEvent) => void;\n    onInputChange?: (billing: BillingDetails) => void;\n    onInputBlur?: (billing: BillingDetails) => void;\n    buttonFooter?: JSX.Element;\n};\n\ntype State = {\n    address: string;\n    address2: string;\n    city: string;\n    state: string;\n    country: string;\n    postalCode: string;\n    name: string;\n    changePaymentMethod: boolean;\n}\n\nexport default class PaymentForm extends React.PureComponent<Props, State> {\n    static defaultProps = {\n        showSaveCard: false,\n        className: '',\n    };\n\n    cardRef: React.RefObject<CardInputType>;\n\n    public constructor(props: Props) {\n        super(props);\n\n        this.cardRef = React.createRef<CardInputType>();\n\n        this.state = this.getResetState(props);\n    }\n\n    public componentDidUpdate(prevProps: Props) {\n        if (prevProps.paymentMethod == null && this.props.paymentMethod != null) {\n            this.resetState();\n            return;\n        }\n\n        if (prevProps.initialBillingDetails === undefined && this.props.initialBillingDetails !== undefined) {\n            this.resetState();\n        }\n    }\n\n    private resetState = () => {\n        this.setState(this.getResetState());\n    }\n\n    private getResetState = (props = this.props) => {\n        const {initialBillingDetails, paymentMethod} = props;\n\n        const billingDetails = initialBillingDetails || {} as BillingDetails;\n\n        return {\n            address: billingDetails.address,\n            address2: billingDetails.address2,\n            city: billingDetails.city,\n            state: billingDetails.state,\n            country: getName(billingDetails.country || '') || getName('US') || '',\n            postalCode: billingDetails.postalCode,\n            name: billingDetails.name,\n            changePaymentMethod: paymentMethod == null,\n        };\n    }\n\n    private handleInputChange = (event: React.ChangeEvent<HTMLInputElement> | React.ChangeEvent<HTMLSelectElement>) => {\n        const target = event.target;\n        const name = target.name;\n        const value = target.value;\n\n        const newStateValue = {\n            [name]: value,\n        } as unknown as Pick<State, keyof State>;\n\n        this.setState(newStateValue);\n\n        const {onInputChange} = this.props;\n        if (onInputChange) {\n            onInputChange({...this.state, ...newStateValue, card: this.cardRef.current?.getCard()} as BillingDetails);\n        }\n    }\n\n    private handleCardInputChange = (event: StripeCardElementChangeEvent) => {\n        if (this.props.onCardInputChange) {\n            this.props.onCardInputChange(event);\n        }\n    }\n\n    private handleStateChange = (stateValue: string) => {\n        const newStateValue = {\n            state: stateValue,\n        } as unknown as Pick<State, keyof State>;\n        this.setState(newStateValue);\n\n        if (this.props.onInputChange) {\n            this.props.onInputChange({...this.state, ...newStateValue, card: this.cardRef.current?.getCard()} as BillingDetails);\n        }\n    }\n\n    private handleCountryChange = (option: any) => {\n        const newStateValue = {\n            country: option.value,\n        } as unknown as Pick<State, keyof State>;\n        this.setState(newStateValue);\n\n        if (this.props.onInputChange) {\n            this.props.onInputChange({...this.state, ...newStateValue, card: this.cardRef.current?.getCard()} as BillingDetails);\n        }\n    }\n\n    private onBlur = () => {\n        const {onInputBlur} = this.props;\n        if (onInputBlur) {\n            onInputBlur({...this.state, card: this.cardRef.current?.getCard()} as BillingDetails);\n        }\n    }\n\n    private changePaymentMethod = (event: React.MouseEvent<HTMLElement>) => {\n        event.preventDefault();\n        this.setState({changePaymentMethod: true});\n    }\n\n    public render() {\n        const {className, paymentMethod, buttonFooter} = this.props;\n        const {changePaymentMethod} = this.state;\n\n        let paymentDetails: JSX.Element;\n        if (changePaymentMethod) {\n            paymentDetails = (\n                <React.Fragment>\n                    <div className='form-row'>\n                        <CardInput\n                            forwardedRef={this.cardRef}\n                            required={true}\n                            onBlur={this.onBlur}\n                            onCardInputChange={this.handleCardInputChange}\n                        />\n                    </div>\n                    <div className='form-row'>\n                        <Input\n                            name='name'\n                            type='text'\n                            value={this.state.name}\n                            onChange={this.handleInputChange}\n                            onBlur={this.onBlur}\n                            placeholder={Utils.localizeMessage(\n                                'payment_form.name_on_card',\n                                'Name on Card',\n                            )}\n                            required={true}\n                        />\n                    </div>\n                    <div className='section-title'>\n                        <FormattedMessage\n                            id='payment_form.billing_address'\n                            defaultMessage='Billing address'\n                        />\n                    </div>\n                    <DropdownInput\n                        onChange={this.handleCountryChange}\n                        value={\n                            this.state.country ? {value: this.state.country, label: this.state.country} : undefined\n                        }\n                        options={COUNTRIES.map((country) => ({\n                            value: country.name,\n                            label: country.name,\n                        }))}\n                        legend={Utils.localizeMessage(\n                            'payment_form.country',\n                            'Country',\n                        )}\n                        placeholder={Utils.localizeMessage(\n                            'payment_form.country',\n                            'Country',\n                        )}\n                        name={'billing_dropdown'}\n                    />\n                    <div className='form-row'>\n                        <Input\n                            name='address'\n                            type='text'\n                            value={this.state.address}\n                            onChange={this.handleInputChange}\n                            onBlur={this.onBlur}\n                            placeholder={Utils.localizeMessage(\n                                'payment_form.address',\n                                'Address',\n                            )}\n                            required={true}\n                        />\n                    </div>\n                    <div className='form-row'>\n                        <Input\n                            name='address2'\n                            type='text'\n                            value={this.state.address2}\n                            onChange={this.handleInputChange}\n                            onBlur={this.onBlur}\n                            placeholder={Utils.localizeMessage(\n                                'payment_form.address_2',\n                                'Address 2',\n                            )}\n                        />\n                    </div>\n                    <div className='form-row'>\n                        <Input\n                            name='city'\n                            type='text'\n                            value={this.state.city}\n                            onChange={this.handleInputChange}\n                            onBlur={this.onBlur}\n                            placeholder={Utils.localizeMessage(\n                                'payment_form.city',\n                                'City',\n                            )}\n                            required={true}\n                        />\n                    </div>\n                    <div className='form-row'>\n                        <div className='form-row-third-1 selector'>\n                            <StateSelector\n                                country={this.state.country}\n                                state={this.state.state}\n                                onChange={this.handleStateChange}\n                                onBlur={this.onBlur}\n                            />\n                        </div>\n                        <div className='form-row-third-2'>\n                            <Input\n                                name='postalCode'\n                                type='text'\n                                value={this.state.postalCode}\n                                onChange={this.handleInputChange}\n                                onBlur={this.onBlur}\n                                placeholder={Utils.localizeMessage(\n                                    'payment_form.zipcode',\n                                    'Zip/Postal Code',\n                                )}\n                                required={true}\n                            />\n                        </div>\n                    </div>\n                    {changePaymentMethod ? buttonFooter : null}\n                </React.Fragment>\n            );\n        } else {\n            let cardContent: JSX.Element | null = null;\n\n            if (paymentMethod) {\n                let cardDetails = (\n                    <FormattedMessage\n                        id='payment_form.no_credit_card'\n                        defaultMessage='No credit card added'\n                    />\n                );\n                if (paymentMethod.last_four) {\n                    cardDetails = (\n                        <React.Fragment>\n                            <CardImage brand={paymentMethod.card_brand}/>\n                            {`Card ending in ${paymentMethod.last_four}`}\n                            <br/>\n                            {`Expires ${paymentMethod.exp_month}/${paymentMethod.exp_year}`}\n                        </React.Fragment>\n                    );\n                }\n                let addressDetails = (\n                    <i>\n                        <FormattedMessage\n                            id='payment_form.no_billing_address'\n                            defaultMessage='No billing address added'\n                        />\n                    </i>);\n                if (this.state.state) {\n                    addressDetails = (\n                        <React.Fragment>\n                            {this.state.address}\n                            {this.state.address2}\n                            <br/>\n                            {`${this.state.city}, ${this.state.state}, ${this.state.country}`}\n                            <br/>\n                            {this.state.postalCode}\n                        </React.Fragment>\n                    );\n                }\n\n                cardContent = (\n                    <React.Fragment>\n                        <div className='PaymentForm-saved-card'>\n                            {cardDetails}\n                        </div>\n                        <div className='PaymentForm-saved-address'>\n                            {addressDetails}\n                        </div>\n                    </React.Fragment>\n                );\n            }\n\n            paymentDetails = (\n                <div\n                    id='console_payment_saved'\n                    className='PaymentForm-saved'\n                >\n                    <div className='PaymentForm-saved-title'>\n                        <FormattedMessage\n                            id='payment_form.saved_payment_method'\n                            defaultMessage='Saved Payment Method'\n                        />\n                    </div>\n                    {cardContent}\n                    <button\n                        className='Form-btn-link PaymentForm-change'\n                        onClick={this.changePaymentMethod}\n                    >\n                        <FormattedMessage\n                            id='payment_form.change_payment_method'\n                            defaultMessage='Change Payment Method'\n                        />\n                    </button>\n                </div>\n            );\n        }\n\n        return (\n            <form\n                id='payment_form'\n                className={`PaymentForm ${className}`}\n            >\n                <div className='section-title'>\n                    <FormattedMessage\n                        id='payment_form.credit_card'\n                        defaultMessage='Credit Card'\n                    />\n                </div>\n                {paymentDetails}\n            </form>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport interface StateCode {\n    code: string;\n    name: string;\n}\n\nexport const US_STATES = [\n    {code: 'AL', name: 'Alabama'},\n    {code: 'AK', name: 'Alaska'},\n    {code: 'AZ', name: 'Arizona'},\n    {code: 'AR', name: 'Arkansas'},\n    {code: 'CA', name: 'California'},\n    {code: 'CO', name: 'Colorado'},\n    {code: 'CT', name: 'Connecticut'},\n    {code: 'DE', name: 'Delaware'},\n    {code: 'DC', name: 'District of Columbia'},\n    {code: 'FL', name: 'Florida'},\n    {code: 'GA', name: 'Georgia'},\n    {code: 'HI', name: 'Hawaii'},\n    {code: 'ID', name: 'Idaho'},\n    {code: 'IL', name: 'Illinois'},\n    {code: 'IN', name: 'Indiana'},\n    {code: 'IA', name: 'Iowa'},\n    {code: 'KS', name: 'Kansas'},\n    {code: 'KY', name: 'Kentucky'},\n    {code: 'LA', name: 'Louisiana'},\n    {code: 'ME', name: 'Maine'},\n    {code: 'MD', name: 'Maryland'},\n    {code: 'MA', name: 'Massachusetts'},\n    {code: 'MI', name: 'Michigan'},\n    {code: 'MN', name: 'Minnesota'},\n    {code: 'MS', name: 'Mississippi'},\n    {code: 'MO', name: 'Missouri'},\n    {code: 'MT', name: 'Montana'},\n    {code: 'NE', name: 'Nebraska'},\n    {code: 'NV', name: 'Nevada'},\n    {code: 'NH', name: 'New Hampshire'},\n    {code: 'NJ', name: 'New Jersey'},\n    {code: 'NM', name: 'New Mexico'},\n    {code: 'NY', name: 'New York'},\n    {code: 'NC', name: 'North Carolina'},\n    {code: 'ND', name: 'North Dakota'},\n    {code: 'OH', name: 'Ohio'},\n    {code: 'OK', name: 'Oklahoma'},\n    {code: 'OR', name: 'Oregon'},\n    {code: 'PA', name: 'Pennsylvania'},\n    {code: 'PR', name: 'Puerto Rico'},\n    {code: 'RI', name: 'Rhode Island'},\n    {code: 'SC', name: 'South Carolina'},\n    {code: 'SD', name: 'South Dakota'},\n    {code: 'TN', name: 'Tennessee'},\n    {code: 'TX', name: 'Texas'},\n    {code: 'UT', name: 'Utah'},\n    {code: 'VT', name: 'Vermont'},\n    {code: 'VA', name: 'Virginia'},\n    {code: 'WA', name: 'Washington'},\n    {code: 'WV', name: 'West Virginia'},\n    {code: 'WI', name: 'Wisconsin'},\n    {code: 'WY', name: 'Wyoming'},\n] as StateCode[];\n\nexport const CA_PROVINCES = [\n    {code: 'AB', name: 'Alberta'},\n    {code: 'BC', name: 'British Columbia'},\n    {code: 'MB', name: 'Manitoba'},\n    {code: 'NB', name: 'New Brunswick'},\n    {code: 'NL', name: 'Newfoundland and Labrador'},\n    {code: 'NT', name: 'Northwest Territories'},\n    {code: 'NS', name: 'Nova Scotia'},\n    {code: 'NU', name: 'Nunavut'},\n    {code: 'ON', name: 'Ontario'},\n    {code: 'PE', name: 'Prince Edward Island'},\n    {code: 'QC', name: 'Quebec'},\n    {code: 'SK', name: 'Saskatchewan'},\n    {code: 'YT', name: 'Yukon Territory'},\n] as StateCode[];\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\nimport {getName} from 'country-list';\n\nimport DropdownInput from 'components/dropdown_input';\n\nimport Input from 'components/input';\n\nimport {US_STATES, CA_PROVINCES, StateCode} from 'utils/states';\n\ntype Props = {\n    country: string;\n    state: string;\n    onChange: (newValue: string) => void;\n    onBlur?: () => void;\n}\n\n// StateSelector will display a state dropdown for US and Canada.\n// Will display a open text input for any other country.\nexport default function StateSelector(props: Props) {\n    // Making TS happy here with the react-select event handler\n    const {formatMessage} = useIntl();\n    const onStateSelected = (option: any) => {\n        props.onChange(option.value);\n    };\n\n    let stateList = [] as StateCode[];\n    if (props.country === getName('US')) {\n        stateList = US_STATES;\n    } else if (props.country === getName('CA')) {\n        stateList = CA_PROVINCES;\n    }\n\n    if (stateList.length > 0) {\n        return (\n            <DropdownInput\n                onChange={onStateSelected}\n                value={props.state ? {value: props.state, label: props.state} : undefined}\n                options={stateList.map((stateCode) => ({\n                    value: stateCode.code,\n                    label: stateCode.name,\n                }))}\n                legend={formatMessage({id: 'admin.billing.subscription.stateprovince', defaultMessage: 'State/Province'})}\n                placeholder={formatMessage({id: 'admin.billing.subscription.stateprovince', defaultMessage: 'State/Province'})}\n                name={'billing_dropdown'}\n            />\n        );\n    }\n\n    return (\n        <Input\n            name='state'\n            type='text'\n            value={props.state}\n            onChange={(e) => {\n                props.onChange(e.target.value);\n            }}\n            onBlur={props.onBlur}\n            placeholder={formatMessage({id: 'admin.billing.subscription.stateprovince', defaultMessage: 'State/Province'})}\n            required={true}\n        />);\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/* eslint-disable no-process-env */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport {\n    StripeError,\n    ConfirmCardSetupData,\n    ConfirmCardSetupOptions,\n    SetupIntent,\n} from '@stripe/stripe-js';\n\ntype ConfirmCardSetupType = (clientSecret: string, data?: ConfirmCardSetupData | undefined, options?: ConfirmCardSetupOptions | undefined) => Promise<{ setupIntent?: SetupIntent | undefined; error?: StripeError | undefined }> | undefined;\n\nfunction prodConfirmCardSetup(confirmCardSetup: ConfirmCardSetupType): ConfirmCardSetupType {\n    return confirmCardSetup;\n}\n\nfunction devConfirmCardSetup(confirmCardSetup: ConfirmCardSetupType): ConfirmCardSetupType {\n    return async (clientSecret: string, data?: ConfirmCardSetupData | undefined, options?: ConfirmCardSetupOptions | undefined) => {\n        return {setupIntent: {id: 'testid', status: 'succeeded'} as SetupIntent};\n    };\n}\n\nexport const getConfirmCardSetup = (isDevMode: boolean) => (isDevMode ? devConfirmCardSetup : prodConfirmCardSetup);\n\nexport const STRIPE_CSS_SRC = 'https://fonts.googleapis.com/css?family=Open+Sans:400,400i,600,600i&display=swap';\nexport const STRIPE_PUBLIC_KEY = 'pk_test_ttEpW6dCHksKyfAFzh6MvgBj';\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nexport type Props = {\n\n    /**\n     * Permissions enough to pass the gate (binary OR)\n     */\n    permissions: string[];\n\n    /**\n     * Has permission\n     */\n    hasPermission: boolean;\n\n    /**\n     * Invert the permission (used for else)\n     */\n    invert: boolean;\n\n    /**\n     * Content protected by the permissions gate\n     */\n    children: React.ReactNode;\n}\n\nexport default class AnyTeamPermissionGate extends React.PureComponent<Props> {\n    static defaultProps = {\n        invert: false,\n    }\n\n    render() {\n        if (this.props.hasPermission !== this.props.invert) {\n            return this.props.children;\n        }\n        return null;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getMyTeams} from 'mattermost-redux/selectors/entities/teams';\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport AnyTeamPermissionGate from './any_team_permission_gate';\n\ntype Props = {\n    permissions: string[];\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const teams = getMyTeams(state);\n    for (const team of teams) {\n        for (const permission of ownProps.permissions) {\n            if (haveITeamPermission(state, team.id, permission)) {\n                return {hasPermission: true};\n            }\n        }\n    }\n\n    return {hasPermission: false};\n}\n\nexport default connect(mapStateToProps)(AnyTeamPermissionGate);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n\n    /**\n     * Channel to check the permission\n     */\n    channelId?: string;\n\n    /**\n     * Team to check the permission\n     */\n    teamId?: string;\n\n    /**\n     * Permissions enough to pass the gate (binary OR)\n     */\n    permissions: string[];\n\n    /**\n     * Has permission\n     */\n    hasPermission: boolean;\n\n    /**\n     * Invert the permission (used for else)\n     */\n    invert?: boolean;\n\n    /**\n     * Content protected by the permissions gate\n     */\n    children: React.ReactNode;\n}\n\nexport default class ChannelPermissionGate extends React.PureComponent<Props> {\n    render() {\n        const {hasPermission, children, invert = false} = this.props;\n\n        if (hasPermission && !invert) {\n            return children;\n        }\n        if (!hasPermission && invert) {\n            return children;\n        }\n        return null;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport ChannelPermissionGate from './channel_permission_gate';\n\ntype Props = {\n    channelId?: string;\n    teamId?: string;\n    permissions: string[];\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    if (!ownProps.channelId || ownProps.teamId === null || typeof ownProps.teamId === 'undefined') {\n        return {hasPermission: false};\n    }\n\n    for (const permission of ownProps.permissions) {\n        if (haveIChannelPermission(state, ownProps.teamId, ownProps.channelId, permission)) {\n            return {hasPermission: true};\n        }\n    }\n\n    return {hasPermission: false};\n}\n\nexport default connect(mapStateToProps)(ChannelPermissionGate);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n    permissions: string[];\n\n    /**\n     * Has permission\n     * This prop is will always be passed by the mapStateToProps function\n     * it should be required when this component is converted to TS, for now its optional to make the TS compiler quite.\n     * about this prop not being passed from where this component is used\n     */\n    hasPermission: boolean;\n\n    /**\n     * Invert the permission (used for else)\n     */\n    invert: boolean;\n\n    /**\n     * Content protected by the permissions gate\n     */\n    children: React.ReactNode;\n};\n\nexport default class SystemPermissionGate extends React.PureComponent<Props> {\n    public static defaultProps = {\n        invert: false,\n    }\n\n    render() {\n        if (this.props.hasPermission && !this.props.invert) {\n            return this.props.children;\n        }\n        if (!this.props.hasPermission && this.props.invert) {\n            return this.props.children;\n        }\n        return null;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\n\nimport {GlobalState} from 'types/store';\n\nimport SystemPermissionGate from './system_permission_gate';\n\ntype Props = {\n    permissions: string[];\n}\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    for (const permission of ownProps.permissions) {\n        if (haveISystemPermission(state, {permission})) {\n            return {hasPermission: true};\n        }\n    }\n\n    return {hasPermission: false};\n}\n\nexport default connect(mapStateToProps)(SystemPermissionGate);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n\n    /**\n     * Team to check the permission\n     */\n    teamId?: string;\n\n    /**\n     * Permissions enough to pass the gate (binary OR)\n     */\n    permissions: string[];\n\n    /**\n     * Has permission\n     */\n    hasPermission: boolean;\n\n    /**\n     * Invert the permission (used for else)\n     */\n    invert: boolean;\n\n    /**\n     * Content protected by the permissions gate\n     */\n    children: React.ReactNode;\n};\n\nexport default class TeamPermissionGate extends React.PureComponent<Props> {\n    public static defaultProps = {\n        invert: false,\n    }\n\n    render() {\n        if (this.props.hasPermission && !this.props.invert) {\n            return this.props.children;\n        }\n        if (!this.props.hasPermission && this.props.invert) {\n            return this.props.children;\n        }\n        return null;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\n\nimport {GlobalState} from 'types/store';\n\nimport TeamPermissionGate from './team_permission_gate';\n\ntype Props = {\n    teamId: string;\n    permissions: string[];\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    if (!ownProps.teamId) {\n        return {hasPermission: false};\n    }\n\n    for (const permission of ownProps.permissions) {\n        if (haveITeamPermission(state, ownProps.teamId, permission)) {\n            return {hasPermission: true};\n        }\n    }\n\n    return {hasPermission: false};\n}\n\nexport default connect(mapStateToProps)(TeamPermissionGate);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {MarketplaceApp, MarketplacePlugin} from 'mattermost-redux/types/marketplace';\n\n// This file's contents belong to the Apps Framework feature.\n// Apps Framework feature is experimental, and the contents of this file are\n// susceptible to breaking changes without pushing the major version of this package.\nexport function isPlugin(item: MarketplacePlugin | MarketplaceApp): item is MarketplacePlugin {\n    return (item as MarketplacePlugin).manifest.id !== undefined;\n}\n\nexport function getName(item: MarketplacePlugin | MarketplaceApp): string {\n    if (isPlugin(item)) {\n        return item.manifest.name;\n    }\n    return item.manifest.display_name;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createSelector} from 'reselect';\n\nimport {isPlugin} from 'mattermost-redux/utils/marketplace';\nimport type {MarketplaceApp, MarketplacePlugin} from 'mattermost-redux/types/marketplace';\n\nimport {GlobalState} from 'types/store';\n\nexport const getPlugins = (state: GlobalState): MarketplacePlugin[] => state.views.marketplace.plugins;\n\nexport const getApps = (state: GlobalState): MarketplaceApp[] => state.views.marketplace.apps;\n\nexport const getListing = createSelector(\n    'getListing',\n    getPlugins,\n    getApps,\n    (plugins, apps) => {\n        if (plugins) {\n            return (plugins as Array<MarketplacePlugin | MarketplaceApp>).concat(apps);\n        }\n\n        return apps;\n    },\n);\n\nexport const getInstalledListing = createSelector(\n    'getInstalledListing',\n    getListing,\n    (listing) => listing.filter((i) => {\n        if (isPlugin(i)) {\n            return i.installed_version !== '';\n        }\n\n        return i.installed;\n    }),\n);\n\nexport const getPlugin = (state: GlobalState, id: string): MarketplacePlugin | undefined =>\n    getPlugins(state).find(((p) => p.manifest && p.manifest.id === id));\n\nexport const getApp = (state: GlobalState, id: string): MarketplaceApp | undefined =>\n    getApps(state).find(((p) => p.manifest && p.manifest.app_id === id));\n\nexport const getFilter = (state: GlobalState): string => state.views.marketplace.filter;\n\nexport const getInstalling = (state: GlobalState, id: string): boolean => Boolean(state.views.marketplace.installing[id]);\n\nexport const getError = (state: GlobalState, id: string): string => state.views.marketplace.errors[id];\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\n\nimport {ActionFunc, DispatchFunc, GetStateFunc} from 'mattermost-redux/types/actions';\nimport type {MarketplaceApp, MarketplacePlugin} from 'mattermost-redux/types/marketplace';\nimport type {CommandArgs} from 'mattermost-redux/types/integrations';\n\nimport {GlobalState} from 'types/store';\n\nimport {getApp, getFilter, getPlugin} from 'selectors/views/marketplace';\nimport {ActionTypes} from 'utils/constants';\n\nimport {isError} from 'types/actions';\n\nimport {executeCommand} from './command';\n\n// fetchPlugins fetches the latest marketplace plugins and apps, subject to any existing search filter.\nexport function fetchListing(localOnly = false): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState() as GlobalState;\n        const filter = getFilter(state);\n\n        let plugins: MarketplacePlugin[];\n        let apps: MarketplaceApp[] = [];\n\n        try {\n            plugins = await Client4.getMarketplacePlugins(filter, localOnly);\n        } catch (error) {\n            // If the marketplace server is unreachable, try to get the local plugins only.\n            if (error.server_error_id === 'app.plugin.marketplace_client.failed_to_fetch' && !localOnly) {\n                await dispatch(fetchListing(true));\n            }\n            return {error};\n        }\n\n        dispatch({\n            type: ActionTypes.RECEIVED_MARKETPLACE_PLUGINS,\n            plugins,\n        });\n\n        if (appsEnabled(state)) {\n            try {\n                apps = await Client4.getMarketplaceApps(filter);\n            } catch (error) {\n                return {data: plugins};\n            }\n\n            dispatch({\n                type: ActionTypes.RECEIVED_MARKETPLACE_APPS,\n                apps,\n            });\n        }\n\n        if (plugins) {\n            return {data: (plugins as Array<MarketplacePlugin | MarketplaceApp>).concat(apps)};\n        }\n\n        return {data: apps};\n    };\n}\n\n// filterListing sets a search filter for marketplace listing, fetching the latest data.\nexport function filterListing(filter: string): ActionFunc {\n    return async (dispatch: DispatchFunc) => {\n        dispatch({\n            type: ActionTypes.FILTER_MARKETPLACE_LISTING,\n            filter,\n        });\n\n        return dispatch(fetchListing());\n    };\n}\n\n// installPlugin installs the latest version of the given plugin from the marketplace.\n//\n// On success, it also requests the current state of the plugins to reflect the newly installed plugin.\nexport function installPlugin(id: string, version: string) {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc): Promise<void> => {\n        dispatch({\n            type: ActionTypes.INSTALLING_MARKETPLACE_ITEM,\n            id,\n        });\n\n        const state = getState() as GlobalState;\n\n        const marketplacePlugin = getPlugin(state, id);\n        if (!marketplacePlugin) {\n            dispatch({\n                type: ActionTypes.INSTALLING_MARKETPLACE_ITEM_FAILED,\n                id,\n                error: 'Unknown plugin: ' + id,\n            });\n            return;\n        }\n\n        try {\n            await Client4.installMarketplacePlugin(id, version);\n        } catch (error) {\n            dispatch({\n                type: ActionTypes.INSTALLING_MARKETPLACE_ITEM_FAILED,\n                id,\n                error: error.message,\n            });\n            return;\n        }\n\n        await dispatch(fetchListing());\n        dispatch({\n            type: ActionTypes.INSTALLING_MARKETPLACE_ITEM_SUCCEEDED,\n            id,\n        });\n    };\n}\n\n// installApp installed an App using a given URL via the /apps install slash command.\n//\n// On success, it also requests the current state of the plugins to reflect the newly installed plugin.\nexport function installApp(id: string) {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc): Promise<boolean> => {\n        dispatch({\n            type: ActionTypes.INSTALLING_MARKETPLACE_ITEM,\n            id,\n        });\n\n        const state = getState() as GlobalState;\n\n        const channelID = getCurrentChannelId(state);\n        const teamID = getCurrentTeamId(state);\n\n        const app = getApp(state, id);\n        if (!app) {\n            dispatch({\n                type: ActionTypes.INSTALLING_MARKETPLACE_ITEM_FAILED,\n                id,\n                error: 'Unknown app: ' + id,\n            });\n            return false;\n        }\n\n        const args: CommandArgs = {\n            channel_id: channelID,\n            team_id: teamID,\n        };\n\n        const result = await dispatch(executeCommand('/apps install marketplace ' + id, args));\n        if (isError(result)) {\n            dispatch({\n                type: ActionTypes.INSTALLING_MARKETPLACE_ITEM_FAILED,\n                id,\n                error: result.error.message,\n            });\n            return false;\n        }\n\n        dispatch({\n            type: ActionTypes.INSTALLING_MARKETPLACE_ITEM_SUCCEEDED,\n            id,\n        });\n        return true;\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function PluginIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='61px'\n                height='61px'\n                viewBox='0 0 61 61'\n                aria-label={formatMessage({id: 'generic_icons.plugin', defaultMessage: 'Plugin Icon'})}\n            >\n                <g\n                    stroke='none'\n                    strokeWidth='1'\n                    fill='inherit'\n                    fillRule='evenodd'\n                >\n                    <g\n                        transform='translate(-347.000000, -211.000000)'\n                        fill='inherit'\n                    >\n                        <g transform='translate(377.585786, 241.500000) rotate(-315.000000) translate(-377.585786, -241.500000) translate(358.585786, 200.000000)'>\n                            <g transform='translate(0.000000, -0.000000)'>\n                                <path\n                                    d='M3.28846154,6.10822511 L3.05411255,6.10822511 C1.36737277,6.10822511 2.06566048e-16,4.74085234 0,3.05411255 C-2.06566048e-16,1.36737277 1.36737277,-7.78498519e-14 3.05411255,-7.81597009e-14 L34.9458874,-7.81597009e-14 C36.6326272,-8.16905472e-14 38,1.36737277 38,3.05411255 C38,4.74085234 36.6326272,6.10822511 34.9458874,6.10822511 L34.7115385,6.10822511 L34.7115385,14.7316017 C34.7115385,20.9798931 29.0184395,26.1638765 21.5576923,27.1415606 L21.5576923,33.1964286 C21.5576923,34.5081049 20.4943686,35.5714286 19.1826923,35.5714286 C17.871016,35.5714286 16.8076923,34.5081049 16.8076923,33.1964286 L16.8076923,27.1859094 C9.16823824,26.3322077 3.28846154,21.0815081 3.28846154,14.7316017 L3.28846154,6.10822511 Z M19.1431901,14.7316017 C17.8533303,14.7316017 16.8076923,15.7772397 16.8076923,17.0670996 C16.8076923,18.3569594 17.8533303,19.4025974 19.1431901,19.4025974 L19.2221945,19.4025974 C20.5120543,19.4025974 21.5576923,18.3569594 21.5576923,17.0670996 C21.5576923,15.7772397 20.5120543,14.7316017 19.2221945,14.7316017 L19.1431901,14.7316017 Z'\n                                    transform='translate(19.000000, 17.785714) rotate(-180.000000) translate(-19.000000, -17.785714) '\n                                />\n                                <path\n                                    d='M32.1538462,53.5367965 L34.7115385,53.5367965 L34.7115385,62.1601732 C34.7115385,68.4084646 29.0184395,73.592448 21.5576923,74.5701321 L21.5576923,80.625 C21.5576923,81.9366763 20.4943686,83 19.1826923,83 C17.871016,83 16.8076923,81.9366763 16.8076923,80.625 L16.8076923,74.6144809 C9.16823824,73.7607791 3.28846154,68.5100796 3.28846154,62.1601732 L3.28846154,53.5367965 L3.05411255,53.5367965 C1.36737277,53.5367965 2.06566048e-16,52.1694238 0,50.482684 C-2.06566048e-16,48.7959442 1.36737277,47.4285714 3.05411255,47.4285714 L8.40384615,47.4285714 L8.40384615,42.2581169 C8.40384615,40.9464406 9.46716987,39.8831169 10.7788462,39.8831169 C12.0905224,39.8831169 13.1538462,40.9464406 13.1538462,42.2581169 L13.1538462,47.4285714 L24.8461538,47.4285714 L24.8461538,42.2581169 C24.8461538,40.9464406 25.9094776,39.8831169 27.2211538,39.8831169 C28.5328301,39.8831169 29.5961538,40.9464406 29.5961538,42.2581169 L29.5961538,47.4285714 L34.9458874,47.4285714 C36.6326272,47.4285714 38,48.7959442 38,50.482684 C38,52.1694238 36.6326272,53.5367965 34.9458874,53.5367965 L32.1538462,53.5367965 Z M19.1431901,62.1601732 C17.8533303,62.1601732 16.8076923,63.2058112 16.8076923,64.495671 C16.8076923,65.7855308 17.8533303,66.8311688 19.1431901,66.8311688 L19.2221945,66.8311688 C20.5120543,66.8311688 21.5576923,65.7855308 21.5576923,64.495671 C21.5576923,63.2058112 20.5120543,62.1601732 19.2221945,62.1601732 L19.1431901,62.1601732 Z'\n                                    transform='translate(19.000000, 61.441558) rotate(-360.000000) translate(-19.000000, -61.441558) '\n                                />\n                            </g>\n                        </g>\n                    </g>\n                </g>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport classNames from 'classnames';\nimport {Tooltip} from 'react-bootstrap';\n\nimport type {MarketplaceLabel} from 'mattermost-redux/types/marketplace';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport PluginIcon from 'components/widgets/icons/plugin_icon';\n\nimport {Constants} from 'utils/constants';\n\n// Label renders a tag showing a name and a description in a tooltip.\n// If a URL is provided, clicking on the tag will open the URL in a new tab.\nexport const Label = ({name, description, url, color}: MarketplaceLabel): JSX.Element => {\n    const tag = (\n        <span\n            className='tag'\n            style={{backgroundColor: color || ''}}\n        >\n            {name.toUpperCase()}\n        </span>\n    );\n\n    let label;\n    if (description) {\n        label = (\n            <OverlayTrigger\n                delayShow={Constants.OVERLAY_TIME_DELAY}\n                placement='top'\n                overlay={\n                    <Tooltip id={'plugin-marketplace_label_' + name.toLowerCase() + '-tooltip'}>\n                        {description}\n                    </Tooltip>\n                }\n            >\n                {tag}\n            </OverlayTrigger>\n        );\n    } else {\n        label = tag;\n    }\n\n    if (url) {\n        return (\n            <a\n                aria-label={name.toLowerCase()}\n                className='style--none more-modal__row--link'\n                target='_blank'\n                rel='noopener noreferrer'\n                href={url}\n            >\n                {label}\n            </a>\n        );\n    }\n\n    return label;\n};\n\nexport type MarketplaceItemProps = {\n    id: string;\n    name: string;\n    description?: string;\n    iconSource?: string;\n    labels?: MarketplaceLabel[];\n    homepageUrl?: string;\n\n    error?: string;\n\n    button: JSX.Element;\n    updateDetails: JSX.Element | null;\n    versionLabel: JSX.Element| null;\n};\n\nexport default class MarketplaceItem extends React.PureComponent <MarketplaceItemProps> {\n    render(): JSX.Element {\n        let icon;\n        if (this.props.iconSource) {\n            icon = (\n                <div className='icon__plugin icon__plugin--background'>\n                    <img src={this.props.iconSource}/>\n                </div>\n            );\n        } else {\n            icon = <PluginIcon className='icon__plugin icon__plugin--background'/>;\n        }\n\n        let labels;\n        if (this.props.labels && this.props.labels.length !== 0) {\n            labels = this.props.labels.map((label) => (\n                <Label\n                    key={label.name}\n                    name={label.name}\n                    description={label.description}\n                    url={label.url}\n                    color={label.color}\n                />\n            ),\n            );\n        }\n\n        const pluginDetailsInner = (\n            <>\n                {this.props.name}\n                {this.props.versionLabel}\n            </>\n        );\n\n        const description = (\n            <p className={classNames('more-modal__description', {error_text: this.props.error})}>\n                {this.props.error ? this.props.error : this.props.description}\n            </p>\n        );\n\n        let pluginDetails;\n        if (this.props.homepageUrl) {\n            pluginDetails = (\n                <>\n                    <a\n                        aria-label={this.props.name.toLowerCase()}\n                        className='style--none more-modal__row--link'\n                        target='_blank'\n                        rel='noopener noreferrer'\n                        href={this.props.homepageUrl}\n                    >\n                        {pluginDetailsInner}\n                    </a>\n                    {labels}\n                    <a\n                        aria-label=\"Plugin's website\"\n                        className='style--none more-modal__row--link'\n                        target='_blank'\n                        rel='noopener noreferrer'\n                        href={this.props.homepageUrl}\n                    >\n                        {description}\n                    </a>\n                </>\n            );\n        } else {\n            pluginDetails = (\n                <>\n                    <span\n                        aria-label={this.props.name.toLowerCase()}\n                        className='style--none'\n                    >\n                        {pluginDetailsInner}\n                    </span>\n                    {labels}\n                    <span\n                        aria-label=\"Plugin\\'s website\"\n                        className='style--none'\n                    >\n                        {description}\n                    </span>\n                </>\n            );\n        }\n\n        return (\n            <>\n                <div\n                    className={classNames('more-modal__row', 'more-modal__row--link', {item_error: this.props.error})}\n                    key={this.props.id}\n                    id={'marketplace-plugin-' + this.props.id}\n                >\n                    {icon}\n                    <div className='more-modal__details'>\n                        {pluginDetails}\n                        {this.props.updateDetails}\n\n                    </div>\n                    <div className='more-modal__actions'>\n                        {this.props.button}\n                    </div>\n                </div>\n            </>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport classNames from 'classnames';\nimport semver from 'semver';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport {Link} from 'react-router-dom';\n\nimport type {MarketplaceLabel} from 'mattermost-redux/types/marketplace';\n\nimport MarketplaceItem from '../marketplace_item';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport ConfirmModal from 'components/confirm_modal';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\nimport {localizeMessage} from 'utils/utils';\n\ntype UpdateVersionProps = {\n    version: string;\n    releaseNotesUrl?: string;\n};\n\n// UpdateVersion renders the version text in the update details, linking out to release notes if available.\nexport const UpdateVersion = ({version, releaseNotesUrl}: UpdateVersionProps): JSX.Element => {\n    if (!releaseNotesUrl) {\n        return (\n            <span>\n                {version}\n            </span>\n        );\n    }\n\n    return (\n        <a\n            target='_blank'\n            rel='noopener noreferrer'\n            href={releaseNotesUrl}\n        >\n            {version}\n        </a>\n    );\n};\n\nexport type UpdateDetailsProps = {\n    version: string;\n    releaseNotesUrl?: string;\n    installedVersion?: string;\n    isInstalling: boolean;\n    onUpdate: (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => void;\n};\n\n// UpdateDetails renders an inline update prompt for plugins, when available.\nexport const UpdateDetails = ({version, releaseNotesUrl, installedVersion, isInstalling, onUpdate}: UpdateDetailsProps): JSX.Element | null => {\n    if (!installedVersion || isInstalling) {\n        return null;\n    }\n\n    let isUpdate = false;\n    try {\n        isUpdate = semver.gt(version, installedVersion);\n    } catch (e) {\n        // If we fail to parse the version, assume not an update;\n    }\n\n    if (!isUpdate) {\n        return null;\n    }\n\n    return (\n        <div className={classNames('update')}>\n            <FormattedMessage\n                id='marketplace_modal.list.update_available'\n                defaultMessage='Update available:'\n            />\n            {' '}\n            <UpdateVersion\n                version={version}\n                releaseNotesUrl={releaseNotesUrl}\n            />\n            {' - '}\n            <b>\n                <a onClick={onUpdate}>\n                    <FormattedMessage\n                        id='marketplace_modal.list.update'\n                        defaultMessage='Update'\n                    />\n                </a>\n            </b>\n        </div>\n    );\n};\n\nexport type UpdateConfirmationModalProps = {\n    show: boolean;\n    name: string;\n    version: string;\n    releaseNotesUrl?: string;\n    installedVersion?: string;\n    onUpdate: (checked: boolean) => void;\n    onCancel: (checked: boolean) => void;\n};\n\n// UpdateConfirmationModal prompts before allowing upgrade, specially handling major version changes.\nexport const UpdateConfirmationModal = ({show, name, version, installedVersion, releaseNotesUrl, onUpdate, onCancel}: UpdateConfirmationModalProps): JSX.Element | null => {\n    if (!installedVersion) {\n        return null;\n    }\n\n    let isUpdate = false;\n    try {\n        isUpdate = semver.gt(version, installedVersion);\n    } catch (e) {\n        // If we fail to parse the version, assume not an update;\n    }\n\n    if (!isUpdate) {\n        return null;\n    }\n\n    const messages = [(\n        <p key='intro'>\n            <FormattedMessage\n                id='marketplace_modal.list.update_confirmation.message.intro'\n                defaultMessage={`Are you sure you want to update the ${name} plugin to ${version}?`}\n                values={{name, version}}\n            />\n        </p>\n    )];\n\n    if (releaseNotesUrl) {\n        messages.push(\n            <p key='current'>\n                <FormattedMarkdownMessage\n                    id='marketplace_modal.list.update_confirmation.message.current_with_release_notes'\n                    defaultMessage='You currently have {installedVersion} installed. View the [release notes](!{releaseNotesUrl}) to learn about the changes included in this update.'\n                    values={{installedVersion, releaseNotesUrl}}\n                />\n            </p>,\n        );\n    } else {\n        messages.push(\n            <p key='current'>\n                <FormattedMessage\n                    id='marketplace_modal.list.update_confirmation.message.current'\n                    defaultMessage={`You currently have ${installedVersion} installed.`}\n                    values={{installedVersion}}\n                />\n            </p>,\n        );\n    }\n\n    let sameMajorVersion = false;\n    try {\n        sameMajorVersion = semver.major(version) === semver.major(installedVersion);\n    } catch (e) {\n        // If we fail to parse the version, assume a potentially breaking change.\n        // In practice, this won't happen since we already tried to parse the version above.\n    }\n\n    if (!sameMajorVersion) {\n        if (releaseNotesUrl) {\n            messages.push(\n                <p\n                    className='alert alert-warning'\n                    key='warning'\n                >\n                    <FormattedMarkdownMessage\n                        id='marketplace_modal.list.update_confirmation.message.warning_major_version_with_release_notes'\n                        defaultMessage='This update may contain breaking changes. Consult the [release notes](!{releaseNotesUrl}) before upgrading.'\n                        values={{releaseNotesUrl}}\n                    />\n                </p>,\n            );\n        } else {\n            messages.push(\n                <p\n                    className='alert alert-warning'\n                    key='warning'\n                >\n                    <FormattedMessage\n                        id='marketplace_modal.list.update_confirmation.message.warning_major_version'\n                        defaultMessage={'This update may contain breaking changes.'}\n                    />\n                </p>,\n            );\n        }\n    }\n\n    return (\n        <ConfirmModal\n            show={show}\n            title={\n                <FormattedMessage\n                    id='marketplace_modal.list.update_confirmation.title'\n                    defaultMessage={'Confirm Plugin Update'}\n                />\n            }\n            message={messages}\n            confirmButtonText={\n                <FormattedMessage\n                    id='marketplace_modal.list.update_confirmation.confirm_button'\n                    defaultMessage='Update'\n                />\n            }\n            onConfirm={onUpdate}\n            onCancel={onCancel}\n        />\n    );\n};\n\nexport type MarketplaceItemPluginProps = {\n    id: string;\n    name: string;\n    description?: string;\n    version: string;\n    homepageUrl?: string;\n    releaseNotesUrl?: string;\n    labels?: MarketplaceLabel[];\n    iconData?: string;\n    installedVersion?: string;\n    installing: boolean;\n    error?: string;\n    isDefaultMarketplace: boolean;\n    trackEvent: (category: string, event: string, props?: unknown) => void;\n\n    actions: {\n        installPlugin: (category: string, event: string) => void;\n        closeMarketplaceModal: () => void;\n    };\n};\n\ntype MarketplaceItemState = {\n    showUpdateConfirmationModal: boolean;\n};\n\nexport default class MarketplaceItemPlugin extends React.PureComponent <MarketplaceItemPluginProps, MarketplaceItemState> {\n    constructor(props: MarketplaceItemPluginProps) {\n        super(props);\n\n        this.state = {\n            showUpdateConfirmationModal: false,\n        };\n    }\n\n    trackEvent = (eventName: string, allowDetail = true): void => {\n        if (this.props.isDefaultMarketplace && allowDetail) {\n            this.props.trackEvent('plugins', eventName, {\n                plugin_id: this.props.id,\n                version: this.props.version,\n                installed_version: this.props.installedVersion,\n            });\n        } else {\n            this.props.trackEvent('plugins', eventName);\n        }\n    }\n\n    showUpdateConfirmationModal = (): void => {\n        this.setState({showUpdateConfirmationModal: true});\n    }\n\n    hideUpdateConfirmationModal = (): void => {\n        this.setState({showUpdateConfirmationModal: false});\n    }\n\n    onInstall = (): void => {\n        this.trackEvent('ui_marketplace_download');\n        this.props.actions.installPlugin(this.props.id, this.props.version);\n    }\n\n    onConfigure = (): void => {\n        this.trackEvent('ui_marketplace_configure', false);\n\n        this.props.actions.closeMarketplaceModal();\n    }\n\n    onUpdate = (): void => {\n        this.trackEvent('ui_marketplace_download_update');\n\n        this.hideUpdateConfirmationModal();\n        this.props.actions.installPlugin(this.props.id, this.props.version);\n    }\n\n    getItemButton(): JSX.Element {\n        if (this.props.installedVersion !== '' && !this.props.installing && !this.props.error) {\n            return (\n                <Link\n                    to={'/admin_console/plugins/plugin_' + this.props.id}\n                >\n                    <button\n                        onClick={this.onConfigure}\n                        className='btn btn-outline'\n                    >\n                        <FormattedMessage\n                            id='marketplace_modal.list.configure'\n                            defaultMessage='Configure'\n                        />\n                    </button>\n                </Link>\n            );\n        }\n\n        let actionButton: JSX.Element;\n        if (this.props.error) {\n            actionButton = (\n                <FormattedMessage\n                    id='marketplace_modal.list.try_again'\n                    defaultMessage='Try Again'\n                />\n            );\n        } else {\n            actionButton = (\n                <FormattedMessage\n                    id='marketplace_modal.list.install'\n                    defaultMessage='Install'\n                />\n            );\n        }\n\n        return (\n            <button\n                onClick={this.onInstall}\n                className='btn btn-primary'\n                disabled={this.props.installing}\n            >\n                <LoadingWrapper\n                    loading={this.props.installing}\n                    text={localizeMessage('marketplace_modal.installing', 'Installing...')}\n                >\n                    {actionButton}\n                </LoadingWrapper>\n\n            </button>\n        );\n    }\n\n    render(): JSX.Element {\n        let version = `(${this.props.version})`;\n        if (this.props.installedVersion !== '') {\n            version = `(${this.props.installedVersion})`;\n        }\n\n        const versionLabel = <span className='light subtitle'>{version}</span>;\n\n        const updateDetails = (\n            <UpdateDetails\n                version={this.props.version}\n                installedVersion={this.props.installedVersion}\n                releaseNotesUrl={this.props.releaseNotesUrl}\n                isInstalling={this.props.installing}\n                onUpdate={this.showUpdateConfirmationModal}\n            />\n        );\n\n        return (\n            <>\n                <MarketplaceItem\n                    button={this.getItemButton()}\n                    versionLabel={versionLabel}\n                    updateDetails={updateDetails}\n                    iconSource={this.props.iconData}\n                    {...this.props}\n                />\n                <UpdateConfirmationModal\n                    show={this.state.showUpdateConfirmationModal}\n                    name={this.props.name}\n                    version={this.props.version}\n                    installedVersion={this.props.installedVersion}\n                    releaseNotesUrl={this.props.releaseNotesUrl}\n                    onUpdate={this.onUpdate}\n                    onCancel={this.hideUpdateConfirmationModal}\n                />\n            </>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {GlobalState} from 'types/store';\n\nimport {installPlugin} from 'actions/marketplace';\nimport {closeModal} from 'actions/views/modals';\nimport {ModalIdentifiers} from 'utils/constants';\nimport {getInstalling, getError} from 'selectors/views/marketplace';\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport MarketplaceItemPlugin, {MarketplaceItemPluginProps} from './marketplace_item_plugin';\n\ntype Props = {\n    id: string;\n}\n\nfunction mapStateToProps(state: GlobalState, props: Props) {\n    const installing = getInstalling(state, props.id);\n    const error = getError(state, props.id);\n    const isDefaultMarketplace = getConfig(state).IsDefaultMarketplace === 'true';\n\n    return {\n        installing,\n        error,\n        isDefaultMarketplace,\n        trackEvent,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject, MarketplaceItemPluginProps['actions']>({\n            installPlugin,\n            closeMarketplaceModal: () => closeModal(ModalIdentifiers.PLUGIN_MARKETPLACE),\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MarketplaceItemPlugin);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport type {MarketplaceLabel} from 'mattermost-redux/types/marketplace';\n\nimport MarketplaceItem from '../marketplace_item';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\nimport {localizeMessage} from 'utils/utils';\n\nexport type MarketplaceItemAppProps = {\n    id: string;\n    name: string;\n    description?: string;\n    homepageUrl?: string;\n    iconURL?: string;\n\n    installed: boolean;\n    labels?: MarketplaceLabel[];\n\n    installing: boolean;\n    error?: string;\n\n    trackEvent: (category: string, event: string, props?: unknown) => void;\n\n    actions: {\n        installApp: (id: string) => Promise<boolean>;\n        closeMarketplaceModal: () => void;\n    };\n};\n\nexport default class MarketplaceItemApp extends React.PureComponent <MarketplaceItemAppProps> {\n    onInstall = (): void => {\n        this.props.trackEvent('plugins', 'ui_marketplace_install_app', {\n            app_id: this.props.id,\n        });\n\n        this.props.actions.installApp(this.props.id).then((res) => {\n            if (res) {\n                this.props.actions.closeMarketplaceModal();\n            }\n        });\n    }\n\n    getItemButton(): JSX.Element {\n        if (this.props.installed && !this.props.installing && !this.props.error) {\n            return (\n                <button\n                    className='btn btn-outline'\n                    disabled={true}\n                >\n                    <FormattedMessage\n                        id='marketplace_modal.list.installed'\n                        defaultMessage='Installed'\n                    />\n                </button>\n            );\n        }\n\n        let actionButton: JSX.Element;\n        if (this.props.error) {\n            actionButton = (\n                <FormattedMessage\n                    id='marketplace_modal.list.try_again'\n                    defaultMessage='Try Again'\n                />\n            );\n        } else {\n            actionButton = (\n                <FormattedMessage\n                    id='marketplace_modal.list.install'\n                    defaultMessage='Install'\n                />\n            );\n        }\n\n        return (\n            <button\n                onClick={this.onInstall}\n                className='btn btn-primary'\n                disabled={this.props.installing}\n            >\n                <LoadingWrapper\n                    loading={this.props.installing}\n                    text={localizeMessage('marketplace_modal.installing', 'Installing...')}\n                >\n                    {actionButton}\n                </LoadingWrapper>\n\n            </button>\n        );\n    }\n\n    render(): JSX.Element {\n        return (\n            <>\n                <MarketplaceItem\n                    button={this.getItemButton()}\n                    updateDetails={null}\n                    versionLabel={null}\n                    iconSource={this.props.iconURL}\n                    {...this.props}\n                />\n            </>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {GlobalState} from 'types/store';\n\nimport {installApp} from 'actions/marketplace';\nimport {closeModal} from 'actions/views/modals';\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\nimport {getInstalling, getError} from 'selectors/views/marketplace';\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport MarketplaceItemApp, {MarketplaceItemAppProps} from './marketplace_item_app';\n\ntype Props = {\n    id: string;\n}\n\nfunction mapStateToProps(state: GlobalState, props: Props) {\n    const installing = getInstalling(state, props.id);\n    const error = getError(state, props.id);\n\n    return {\n        installing,\n        error,\n        trackEvent,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject, MarketplaceItemAppProps['actions']>({\n            installApp,\n            closeMarketplaceModal: () => closeModal(ModalIdentifiers.PLUGIN_MARKETPLACE),\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MarketplaceItemApp);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\ntype NavigationButtonProps = {\n    onClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n    messageId: string;\n    defaultMessage: string;\n};\n\nexport default class NavigationButton extends React.PureComponent <NavigationButtonProps> {\n    onClick = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {\n        event.preventDefault();\n        this.props.onClick(event);\n    };\n\n    render(): JSX.Element {\n        const {onClick, messageId, defaultMessage} = this.props;\n        return (\n            <button\n                className='btn btn-link'\n                onClick={onClick}\n            >\n                <FormattedMessage\n                    id={messageId}\n                    defaultMessage={defaultMessage}\n                />\n            </button>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {changeOpacity, makeStyleFromTheme} from 'mattermost-redux/utils/theme_utils';\nimport {Theme} from 'mattermost-redux/types/themes';\n\nimport NavigationButton from './navigation_button';\n\nexport type NavigationRowProps = {\n    page: number;\n    total: number;\n    maximumPerPage: number;\n    onNextPageButtonClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n    onPreviousPageButtonClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n    theme: Theme;\n};\n\nexport default class NavigationRow extends React.PureComponent <NavigationRowProps> {\n    canShowNextButton = (): boolean => {\n        const {page, maximumPerPage, total} = this.props;\n        const totalPages = Math.trunc((total - 1) / maximumPerPage);\n\n        return totalPages > page;\n    };\n\n    renderCount = (): JSX.Element => {\n        const {page, total, maximumPerPage} = this.props;\n        const startCount = page * maximumPerPage;\n        const endCount = Math.min(startCount + maximumPerPage, total);\n\n        return (\n            <FormattedMessage\n                id='marketplace_list.count_total_page'\n                defaultMessage='{startCount, number} - {endCount, number} {total, plural, one {plugin} other {plugins}} of {total, number} total'\n                values={{\n                    startCount: startCount + 1,\n                    endCount,\n                    total,\n                }}\n            />\n        );\n    };\n\n    render(): JSX.Element {\n        const style = getStyle(this.props.theme);\n\n        return (\n            <div className='navigation-row'>\n                <div className='col-xs-2'>\n                    {(this.props.page > 0) && (\n                        <NavigationButton\n                            onClick={this.props.onPreviousPageButtonClick}\n                            messageId={'more_channels.prev'}\n                            defaultMessage={'Previous'}\n                        />\n                    )}\n                </div>\n                <div\n                    className='col-xs-8 count'\n                    style={style.count}\n                >\n                    {this.renderCount()}\n                </div>\n                <div className='col-xs-2'>\n                    {this.canShowNextButton() && (\n                        <NavigationButton\n                            onClick={this.props.onNextPageButtonClick}\n                            messageId={'more_channels.next'}\n                            defaultMessage={'Next'}\n                        />\n                    )}\n                </div>\n            </div>\n        );\n    }\n}\n\nconst getStyle = makeStyleFromTheme((theme) => {\n    return {\n        count: {\n            color: changeOpacity(theme.centerChannelColor, 0.6),\n        },\n    };\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport NavigationRow from './navigation_row';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        theme: getTheme(state),\n    };\n}\n\nexport default connect(mapStateToProps)(NavigationRow);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {MarketplaceApp, MarketplacePlugin} from 'mattermost-redux/types/marketplace';\nimport {isPlugin, getName} from 'mattermost-redux/utils/marketplace';\n\nimport MarketplaceItemPlugin from '../marketplace_item/marketplace_item_plugin';\nimport MarketplaceItemApp from '../marketplace_item/marketplace_item_app';\n\nimport NavigationRow from './navigation_row';\n\nconst ITEMS_PER_PAGE = 15;\n\ntype MarketplaceListProps = {\n    listing: Array<MarketplacePlugin | MarketplaceApp>;\n};\n\ntype MarketplaceListState = {\n    page: number;\n};\n\nexport default class MarketplaceList extends React.PureComponent <MarketplaceListProps, MarketplaceListState> {\n    static getDerivedStateFromProps(props: MarketplaceListProps, state: MarketplaceListState): MarketplaceListState | null {\n        if (state.page > 0 && props.listing.length < ITEMS_PER_PAGE) {\n            return {page: 0};\n        }\n\n        return null;\n    }\n\n    constructor(props: MarketplaceListProps) {\n        super(props);\n\n        this.state = {\n            page: 0,\n        };\n    }\n\n    nextPage = (): void => {\n        this.setState((state) => ({\n            page: state.page + 1,\n        }));\n    };\n\n    previousPage = (): void => {\n        this.setState((state) => ({\n            page: state.page - 1,\n        }));\n    };\n\n    render(): JSX.Element {\n        const pageStart = this.state.page * ITEMS_PER_PAGE;\n        const pageEnd = pageStart + ITEMS_PER_PAGE;\n\n        this.props.listing.sort((a, b) => {\n            return getName(a).localeCompare(getName(b));\n        });\n\n        const itemsToDisplay = this.props.listing.slice(pageStart, pageEnd);\n\n        return (\n            <div className='more-modal__list'>\n                {itemsToDisplay.map((i) => {\n                    if (isPlugin(i)) {\n                        return (\n                            <MarketplaceItemPlugin\n                                key={i.manifest.id}\n                                id={i.manifest.id}\n                                name={i.manifest.name}\n                                description={i.manifest.description}\n                                version={i.manifest.version}\n                                homepageUrl={i.homepage_url}\n                                releaseNotesUrl={i.release_notes_url}\n                                labels={i.labels}\n                                iconData={i.icon_data}\n                                installedVersion={i.installed_version}\n                            />\n                        );\n                    }\n\n                    return (\n                        <MarketplaceItemApp\n                            key={i.manifest.app_id}\n                            id={i.manifest.app_id}\n                            name={i.manifest.display_name}\n                            description={i.manifest.description}\n                            homepageUrl={i.manifest.homepage_url}\n                            iconURL={i.icon_url}\n                            installed={i.installed}\n                            labels={i.labels}\n                        />\n                    );\n                })\n                }\n                <NavigationRow\n                    page={this.state.page}\n                    total={this.props.listing.length}\n                    maximumPerPage={ITEMS_PER_PAGE}\n                    onNextPageButtonClick={this.nextPage}\n                    onPreviousPageButtonClick={this.previousPage}\n                />\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport debounce from 'lodash/debounce';\nimport {Tabs, Tab, SelectCallback} from 'react-bootstrap';\n\nimport {PluginStatusRedux} from 'mattermost-redux/types/plugins';\nimport type {MarketplaceApp, MarketplacePlugin} from 'mattermost-redux/types/marketplace';\nimport {Dictionary} from 'mattermost-redux/types/utilities';\n\nimport FullScreenModal from 'components/widgets/modals/full_screen_modal';\nimport RootPortal from 'components/root_portal';\nimport QuickInput from 'components/quick_input';\nimport LocalizedInput from 'components/localized_input/localized_input';\nimport PluginIcon from 'components/widgets/icons/plugin_icon';\nimport LoadingScreen from 'components/loading_screen';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message.jsx';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\nimport {t} from 'utils/i18n';\nimport {localizeMessage} from 'utils/utils';\n\nimport './marketplace_modal.scss';\nimport MarketplaceList from './marketplace_list/marketplace_list';\n\nconst MarketplaceTabs = {\n    ALL_LISTING: 'allListing',\n    INSTALLED_LISTING: 'installed',\n};\n\nconst SEARCH_TIMEOUT_MILLISECONDS = 200;\n\ntype AllListingProps = {\n    listing: Array<MarketplacePlugin | MarketplaceApp>;\n};\n\n// AllListing renders the contents of the all listing tab.\nexport const AllListing = ({listing}: AllListingProps): JSX.Element => {\n    if (listing.length === 0) {\n        return (\n            <div className='no_plugins_div'>\n                <br/>\n                <PluginIcon className='icon__plugin'/>\n                <div className='mt-3 light'>\n                    <FormattedMessage\n                        id='marketplace_modal.no_plugins'\n                        defaultMessage='There are no plugins available at this time.'\n                    />\n                </div>\n            </div>\n        );\n    }\n\n    return <MarketplaceList listing={listing}/>;\n};\n\ntype InstalledListingProps = {\n    installedItems: Array<MarketplacePlugin | MarketplaceApp>;\n    changeTab: SelectCallback;\n};\n\n// InstalledListing renders the contents of the installed listing tab.\nexport const InstalledListing = ({installedItems, changeTab}: InstalledListingProps): JSX.Element => {\n    if (installedItems.length === 0) {\n        return (\n            <div className='no_plugins_div'>\n                <br/>\n                <PluginIcon className='icon__plugin'/>\n                <div className='mt-3 light'>\n                    <FormattedMessage\n                        id='marketplace_modal.no_plugins_installed'\n                        defaultMessage='You do not have any plugins installed.'\n                    />\n                </div>\n                <button\n                    className='mt-5 style--none color--link'\n                    onClick={() => changeTab(MarketplaceTabs.ALL_LISTING)}\n                    data-testid='Install-Plugins-button'\n                >\n                    <FormattedMessage\n                        id='marketplace_modal.install_plugins'\n                        defaultMessage='Install Plugins'\n                    />\n                </button>\n            </div>\n        );\n    }\n\n    return <MarketplaceList listing={installedItems}/>;\n};\n\nexport type MarketplaceModalProps = {\n    show: boolean;\n    listing: Array<MarketplacePlugin | MarketplaceApp>;\n    installedListing: Array<MarketplacePlugin | MarketplaceApp>;\n    siteURL: string;\n    pluginStatuses?: Dictionary<PluginStatusRedux>;\n    firstAdminVisitMarketplaceStatus: boolean;\n    actions: {\n        closeModal: () => void;\n        fetchListing(localOnly?: boolean): Promise<{error?: Error}>;\n        filterListing(filter: string): Promise<{error?: Error}>;\n        setFirstAdminVisitMarketplaceStatus: () => void;\n    };\n};\n\ntype MarketplaceModalState = {\n    tabKey: unknown;\n    loading: boolean;\n    serverError?: Error;\n    filter: string;\n};\n\n// MarketplaceModal is the marketplace modal.\nexport class MarketplaceModal extends React.PureComponent<MarketplaceModalProps, MarketplaceModalState> {\n    private filterRef: React.RefObject<QuickInput>;\n\n    constructor(props: MarketplaceModalProps) {\n        super(props);\n\n        this.state = {\n            tabKey: MarketplaceTabs.ALL_LISTING,\n            loading: true,\n            serverError: undefined,\n            filter: '',\n        };\n\n        this.filterRef = React.createRef();\n    }\n\n    componentDidMount(): void {\n        trackEvent('plugins', 'ui_marketplace_opened');\n\n        this.fetchListing();\n        if (!this.props.firstAdminVisitMarketplaceStatus) {\n            trackEvent('plugins', 'ui_first_admin_visit_marketplace_status');\n\n            this.props.actions.setFirstAdminVisitMarketplaceStatus();\n        }\n\n        this.filterRef.current?.focus();\n    }\n\n    componentDidUpdate(prevProps: MarketplaceModalProps): void {\n        // Automatically refresh the component when a plugin is installed or uninstalled.\n        if (this.props.pluginStatuses !== prevProps.pluginStatuses) {\n            this.fetchListing();\n        }\n    }\n\n    fetchListing = async (): Promise<void> => {\n        const {error} = await this.props.actions.fetchListing();\n        this.setState({loading: false, serverError: error});\n    }\n\n    close = (): void => {\n        trackEvent('plugins', 'ui_marketplace_closed');\n        this.props.actions.closeModal();\n    }\n\n    changeTab: SelectCallback = (tabKey: any): void => {\n        this.setState({tabKey});\n    }\n\n    onInput = (): void => {\n        if (this.filterRef.current) {\n            this.setState({filter: this.filterRef.current.value});\n\n            this.debouncedSearch();\n        }\n    }\n\n    handleClearSearch = (): void => {\n        if (this.filterRef.current) {\n            this.filterRef.current.value = '';\n            this.setState({filter: this.filterRef.current.value}, this.doSearch);\n        }\n    }\n\n    doSearch = async (): Promise<void> => {\n        trackEvent('plugins', 'ui_marketplace_search', {filter: this.state.filter});\n\n        const {error} = await this.props.actions.filterListing(this.state.filter);\n\n        this.setState({serverError: error});\n    }\n\n    debouncedSearch = debounce(this.doSearch, SEARCH_TIMEOUT_MILLISECONDS);\n\n    render(): JSX.Element {\n        const input = (\n            <div className='filter-row filter-row--full'>\n                <div className='col-sm-12'>\n                    <QuickInput\n                        id='searchMarketplaceTextbox'\n                        ref={this.filterRef}\n                        className='form-control filter-textbox search_input'\n                        placeholder={{id: t('marketplace_modal.search'), defaultMessage: 'Search Marketplace'}}\n                        inputComponent={LocalizedInput}\n                        onInput={this.onInput}\n                        value={this.state.filter}\n                        clearable={true}\n                        onClear={this.handleClearSearch}\n                    />\n                </div>\n            </div>\n        );\n\n        let errorBanner = null;\n        if (this.state.serverError) {\n            errorBanner = (\n                <div\n                    className='error-bar'\n                    id='error_bar'\n                >\n                    <div className='error-bar__content'>\n                        <FormattedMarkdownMessage\n                            id='app.plugin.marketplace_plugins.app_error'\n                            defaultMessage='Error connecting to the marketplace server. Please check your settings in the [System Console]({siteURL}/admin_console/plugins/plugin_management).'\n                            values={{siteURL: this.props.siteURL}}\n                        />\n                    </div>\n                </div>\n            );\n        }\n\n        return (\n            <RootPortal>\n                <FullScreenModal\n                    show={this.props.show}\n                    onClose={this.close}\n                    ariaLabel={localizeMessage('marketplace_modal.title', 'Marketplace')}\n                >\n                    {errorBanner}\n                    <div\n                        className='modal-marketplace'\n                        id='modal_marketplace'\n                    >\n                        <h1>\n                            <strong>\n                                <FormattedMessage\n                                    id='marketplace_modal.title'\n                                    defaultMessage='Marketplace'\n                                />\n                            </strong>\n                        </h1>\n                        {input}\n                        <Tabs\n                            id='marketplaceTabs'\n                            className='tabs'\n                            defaultActiveKey={MarketplaceTabs.ALL_LISTING}\n                            activeKey={this.state.tabKey}\n                            onSelect={this.changeTab}\n                            unmountOnExit={true}\n                        >\n                            <Tab\n                                eventKey={MarketplaceTabs.ALL_LISTING}\n                                title={localizeMessage('marketplace_modal.tabs.all_listing', 'All')}\n                            >\n                                {this.state.loading ? <LoadingScreen/> : <AllListing listing={this.props.listing}/>}\n                            </Tab>\n                            <Tab\n                                eventKey={MarketplaceTabs.INSTALLED_LISTING}\n                                title={localizeMessage('marketplace_modal.tabs.installed_listing', 'Installed') + ` (${this.props.installedListing.length})`}\n                            >\n                                <InstalledListing\n                                    installedItems={this.props.installedListing}\n                                    changeTab={this.changeTab}\n                                />\n                            </Tab>\n                        </Tabs>\n                    </div>\n                </FullScreenModal>\n            </RootPortal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport {GenericAction, ActionFunc} from 'mattermost-redux/types/actions';\n\nimport {GlobalState} from 'types/store';\nimport {getListing, getInstalledListing} from 'selectors/views/marketplace';\nimport {setFirstAdminVisitMarketplaceStatus} from 'mattermost-redux/actions/general';\nimport {getFirstAdminVisitMarketplaceStatus} from 'mattermost-redux/selectors/entities/general';\n\nimport {isModalOpen} from 'selectors/views/modals';\nimport {ModalIdentifiers} from 'utils/constants';\nimport {getSiteURL} from 'utils/url';\n\nimport {closeModal} from 'actions/views/modals';\nimport {fetchListing, filterListing} from 'actions/marketplace';\n\nimport {MarketplaceModal} from './marketplace_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        show: isModalOpen(state, ModalIdentifiers.PLUGIN_MARKETPLACE),\n        listing: getListing(state),\n        installedListing: getInstalledListing(state),\n        siteURL: getSiteURL(),\n        pluginStatuses: state.entities.admin.pluginStatuses,\n        firstAdminVisitMarketplaceStatus: getFirstAdminVisitMarketplaceStatus(state),\n    };\n}\n\ntype Actions = {\n    closeModal(): void;\n    fetchListing(localOnly?: boolean): Promise<{error?: Error}>;\n    filterListing(filter: string): Promise<{error?: Error}>;\n    setFirstAdminVisitMarketplaceStatus(): Promise<void>;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc | GenericAction>, Actions>({\n            closeModal: () => closeModal(ModalIdentifiers.PLUGIN_MARKETPLACE),\n            fetchListing,\n            filterListing,\n            setFirstAdminVisitMarketplaceStatus,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MarketplaceModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\ntype Props = {\n    show: boolean;\n    onHide: (event: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport default class PostDeletedModal extends React.Component<Props> {\n    public shouldComponentUpdate(nextProps: Props): boolean {\n        return nextProps.show !== this.props.show;\n    }\n\n    public render(): JSX.Element {\n        return (\n            <Modal\n                dialogClassName='a11y__modal'\n                show={this.props.show}\n                onHide={this.props.onHide}\n                role='dialog'\n                aria-labelledby='postDeletedModalLabel'\n                data-testid='postDeletedModal'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='postDeletedModalLabel'\n                    >\n                        <FormattedMessage\n                            id='post_delete.notPosted'\n                            defaultMessage='Comment could not be posted'\n                        />\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    <p>\n                        <FormattedMessage\n                            id='post_delete.someone'\n                            defaultMessage='Someone deleted the message on which you tried to post a comment.'\n                        />\n                    </p>\n                </Modal.Body>\n                <Modal.Footer>\n                    <button\n                        type='button'\n                        className='btn btn-primary'\n                        autoFocus={true}\n                        onClick={this.props.onHide}\n                        data-testid='postDeletedModalOkButton'\n                    >\n                        <FormattedMessage\n                            id='post_delete.okay'\n                            defaultMessage='Okay'\n                        />\n                    </button>\n                </Modal.Footer>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {injectIntl, IntlShape, MessageDescriptor} from 'react-intl';\n\nimport {Posts} from 'mattermost-redux/constants';\n\nimport {t} from 'utils/i18n';\nimport Markdown from 'components/markdown';\nimport {TextFormattingOptions} from 'utils/text_formatting';\n\nconst typeMessage = {\n    [Posts.POST_TYPES.ADD_TO_CHANNEL]: {\n        id: t('last_users_message.added_to_channel.type'),\n        defaultMessage: 'were **added to the channel** by {actor}.',\n    },\n    [Posts.POST_TYPES.JOIN_CHANNEL]: {\n        id: t('last_users_message.joined_channel.type'),\n        defaultMessage: '**joined the channel**.',\n    },\n    [Posts.POST_TYPES.LEAVE_CHANNEL]: {\n        id: t('last_users_message.left_channel.type'),\n        defaultMessage: '**left the channel**.',\n    },\n    [Posts.POST_TYPES.REMOVE_FROM_CHANNEL]: {\n        id: t('last_users_message.removed_from_channel.type'),\n        defaultMessage: 'were **removed from the channel**.',\n    },\n    [Posts.POST_TYPES.ADD_TO_TEAM]: {\n        id: t('last_users_message.added_to_team.type'),\n        defaultMessage: 'were **added to the team** by {actor}.',\n    },\n    [Posts.POST_TYPES.JOIN_TEAM]: {\n        id: t('last_users_message.joined_team.type'),\n        defaultMessage: '**joined the team**.',\n    },\n    [Posts.POST_TYPES.LEAVE_TEAM]: {\n        id: t('last_users_message.left_team.type'),\n        defaultMessage: '**left the team**.',\n    },\n    [Posts.POST_TYPES.REMOVE_FROM_TEAM]: {\n        id: t('last_users_message.removed_from_team.type'),\n        defaultMessage: 'were **removed from the team**.',\n    },\n};\n\ntype Props = {\n    actor?: string;\n    expandedLocale: MessageDescriptor;\n    formatOptions: Partial<TextFormattingOptions>;\n    intl: IntlShape;\n    postType: string;\n    usernames: string[];\n}\n\ntype State = {\n    expand: boolean;\n}\n\nexport class LastUsers extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            expand: false,\n        };\n    }\n\n    handleOnClick = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>): void => {\n        e.preventDefault();\n\n        this.setState({expand: true});\n    }\n\n    renderMessage = (formattedMessage: string): JSX.Element => {\n        return (\n            <Markdown\n                message={formattedMessage}\n                options={this.props.formatOptions}\n            />\n        );\n    }\n\n    render(): JSX.Element {\n        const {formatMessage} = this.props.intl;\n        const {expand} = this.state;\n        const {\n            actor,\n            expandedLocale,\n            postType,\n            usernames,\n        } = this.props;\n\n        const firstUser = usernames[0];\n        const lastIndex = usernames.length - 1;\n        const lastUser = usernames[lastIndex];\n\n        if (expand) {\n            const formattedMessage = formatMessage(expandedLocale, {\n                users: usernames.slice(0, lastIndex).join(', '),\n                lastUser,\n                actor,\n            });\n\n            return this.renderMessage(formattedMessage);\n        }\n\n        const firstUserMessage = formatMessage(\n            {id: 'last_users_message.first', defaultMessage: '{firstUser} and '},\n            {firstUser},\n        );\n\n        const otherUsersMessage = formatMessage(\n            {id: 'last_users_message.others', defaultMessage: '{numOthers} others '},\n            {numOthers: lastIndex},\n        );\n\n        const actorMessage = formatMessage(\n            {id: typeMessage[postType].id, defaultMessage: typeMessage[postType].defaultMessage},\n            {actor},\n        );\n\n        return (\n            <span>\n                {this.renderMessage(firstUserMessage)}\n                <a onClick={this.handleOnClick}>\n                    {otherUsersMessage}\n                </a>\n                {this.renderMessage(actorMessage)}\n            </span>\n        );\n    }\n}\nexport default injectIntl(LastUsers);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {injectIntl, IntlShape, MessageDescriptor} from 'react-intl';\n\nimport {Posts} from 'mattermost-redux/constants';\n\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport {ActionFunc} from 'mattermost-redux/types/actions';\n\nimport {t} from 'utils/i18n';\nimport Markdown from 'components/markdown';\n\nimport LastUsers from './last_users';\n\nconst {\n    JOIN_CHANNEL, ADD_TO_CHANNEL, REMOVE_FROM_CHANNEL, LEAVE_CHANNEL,\n    JOIN_TEAM, ADD_TO_TEAM, REMOVE_FROM_TEAM, LEAVE_TEAM,\n} = Posts.POST_TYPES;\n\nconst postTypeMessage = {\n    [JOIN_CHANNEL]: {\n        one: {\n            id: t('combined_system_message.joined_channel.one'),\n            defaultMessage: '{firstUser} **joined the channel**.',\n        },\n        one_you: {\n            id: t('combined_system_message.joined_channel.one_you'),\n            defaultMessage: 'You **joined the channel**.',\n        },\n        two: {\n            id: t('combined_system_message.joined_channel.two'),\n            defaultMessage: '{firstUser} and {secondUser} **joined the channel**.',\n        },\n        many_expanded: {\n            id: t('combined_system_message.joined_channel.many_expanded'),\n            defaultMessage: '{users} and {lastUser} **joined the channel**.',\n        },\n    },\n    [ADD_TO_CHANNEL]: {\n        one: {\n            id: t('combined_system_message.added_to_channel.one'),\n            defaultMessage: '{firstUser} **added to the channel** by {actor}.',\n        },\n        one_you: {\n            id: t('combined_system_message.added_to_channel.one_you'),\n            defaultMessage: 'You were **added to the channel** by {actor}.',\n        },\n        two: {\n            id: t('combined_system_message.added_to_channel.two'),\n            defaultMessage: '{firstUser} and {secondUser} **added to the channel** by {actor}.',\n        },\n        many_expanded: {\n            id: t('combined_system_message.added_to_channel.many_expanded'),\n            defaultMessage: '{users} and {lastUser} were **added to the channel** by {actor}.',\n        },\n    },\n    [REMOVE_FROM_CHANNEL]: {\n        one: {\n            id: t('combined_system_message.removed_from_channel.one'),\n            defaultMessage: '{firstUser} was **removed from the channel**.',\n        },\n        one_you: {\n            id: t('combined_system_message.removed_from_channel.one_you'),\n            defaultMessage: 'You were **removed from the channel**.',\n        },\n        two: {\n            id: t('combined_system_message.removed_from_channel.two'),\n            defaultMessage: '{firstUser} and {secondUser} were **removed from the channel**.',\n        },\n        many_expanded: {\n            id: t('combined_system_message.removed_from_channel.many_expanded'),\n            defaultMessage: '{users} and {lastUser} were **removed from the channel**.',\n        },\n    },\n    [LEAVE_CHANNEL]: {\n        one: {\n            id: t('combined_system_message.left_channel.one'),\n            defaultMessage: '{firstUser} **left the channel**.',\n        },\n        one_you: {\n            id: t('combined_system_message.left_channel.one_you'),\n            defaultMessage: 'You **left the channel**.',\n        },\n        two: {\n            id: t('combined_system_message.left_channel.two'),\n            defaultMessage: '{firstUser} and {secondUser} **left the channel**.',\n        },\n        many_expanded: {\n            id: t('combined_system_message.left_channel.many_expanded'),\n            defaultMessage: '{users} and {lastUser} **left the channel**.',\n        },\n    },\n    [JOIN_TEAM]: {\n        one: {\n            id: t('combined_system_message.joined_team.one'),\n            defaultMessage: '{firstUser} **joined the team**.',\n        },\n        one_you: {\n            id: t('combined_system_message.joined_team.one_you'),\n            defaultMessage: 'You **joined the team**.',\n        },\n        two: {\n            id: t('combined_system_message.joined_team.two'),\n            defaultMessage: '{firstUser} and {secondUser} **joined the team**.',\n        },\n        many_expanded: {\n            id: t('combined_system_message.joined_team.many_expanded'),\n            defaultMessage: '{users} and {lastUser} **joined the team**.',\n        },\n    },\n    [ADD_TO_TEAM]: {\n        one: {\n            id: t('combined_system_message.added_to_team.one'),\n            defaultMessage: '{firstUser} **added to the team** by {actor}.',\n        },\n        one_you: {\n            id: t('combined_system_message.added_to_team.one_you'),\n            defaultMessage: 'You were **added to the team** by {actor}.',\n        },\n        two: {\n            id: t('combined_system_message.added_to_team.two'),\n            defaultMessage: '{firstUser} and {secondUser} **added to the team** by {actor}.',\n        },\n        many_expanded: {\n            id: t('combined_system_message.added_to_team.many_expanded'),\n            defaultMessage: '{users} and {lastUser} were **added to the team** by {actor}.',\n        },\n    },\n    [REMOVE_FROM_TEAM]: {\n        one: {\n            id: t('combined_system_message.removed_from_team.one'),\n            defaultMessage: '{firstUser} was **removed from the team**.',\n        },\n        one_you: {\n            id: t('combined_system_message.removed_from_team.one_you'),\n            defaultMessage: 'You were **removed from the team**.',\n        },\n        two: {\n            id: t('combined_system_message.removed_from_team.two'),\n            defaultMessage: '{firstUser} and {secondUser} were **removed from the team**.',\n        },\n        many_expanded: {\n            id: t('combined_system_message.removed_from_team.many_expanded'),\n            defaultMessage: '{users} and {lastUser} were **removed from the team**.',\n        },\n    },\n    [LEAVE_TEAM]: {\n        one: {\n            id: t('combined_system_message.left_team.one'),\n            defaultMessage: '{firstUser} **left the team**.',\n        },\n        one_you: {\n            id: t('combined_system_message.left_team.one_you'),\n            defaultMessage: 'You **left the team**.',\n        },\n        two: {\n            id: t('combined_system_message.left_team.two'),\n            defaultMessage: '{firstUser} and {secondUser} **left the team**.',\n        },\n        many_expanded: {\n            id: t('combined_system_message.left_team.many_expanded'),\n            defaultMessage: '{users} and {lastUser} **left the team**.',\n        },\n    },\n};\n\nexport type Props = {\n    allUserIds: string[];\n    allUsernames: string[];\n    currentUserId: string;\n    currentUsername: string;\n    intl: IntlShape;\n    messageData: Array<{\n        actorId?: string;\n        postType: string;\n        userIds: string[];\n    }>;\n    showJoinLeave: boolean;\n    userProfiles: UserProfile[];\n    actions: {\n        getMissingProfilesByIds: (userIds: string[]) => ActionFunc ;\n        getMissingProfilesByUsernames: (usernames: string[]) => ActionFunc;\n    };\n}\n\nexport class CombinedSystemMessage extends React.PureComponent<Props> {\n    static defaultProps = {\n        allUserIds: [],\n        allUsernames: [],\n    };\n\n    componentDidMount(): void {\n        this.loadUserProfiles(this.props.allUserIds, this.props.allUsernames);\n    }\n\n    componentDidUpdate(prevProps: Props): void {\n        const {allUserIds, allUsernames} = this.props;\n        if (allUserIds !== prevProps.allUserIds || allUsernames !== prevProps.allUsernames) {\n            this.loadUserProfiles(allUserIds, allUsernames);\n        }\n    }\n\n    loadUserProfiles = (allUserIds: string[], allUsernames: string[]): void => {\n        if (allUserIds.length > 0) {\n            this.props.actions.getMissingProfilesByIds(allUserIds);\n        }\n\n        if (allUsernames.length > 0) {\n            this.props.actions.getMissingProfilesByUsernames(allUsernames);\n        }\n    }\n\n    getAllUsernames = (): {[p: string]: string} => {\n        const {\n            allUserIds,\n            allUsernames,\n            currentUserId,\n            currentUsername,\n            userProfiles,\n        } = this.props;\n        const {formatMessage} = this.props.intl;\n        const usernames = userProfiles.reduce((acc: {[key: string]: string}, user: UserProfile) => {\n            acc[user.id] = user.username;\n            acc[user.username] = user.username;\n            return acc;\n        }, {});\n\n        const currentUserDisplayName = formatMessage({id: t('combined_system_message.you'), defaultMessage: 'You'});\n        if (allUserIds.includes(currentUserId)) {\n            usernames[currentUserId] = currentUserDisplayName;\n        } else if (allUsernames.includes(currentUsername)) {\n            usernames[currentUsername] = currentUserDisplayName;\n        }\n\n        return usernames;\n    }\n\n    getUsernamesByIds = (userIds: string[] = []): string[] => {\n        const {currentUserId, currentUsername} = this.props;\n        const allUsernames = this.getAllUsernames();\n\n        const {formatMessage} = this.props.intl;\n        const someone = formatMessage({id: t('channel_loader.someone'), defaultMessage: 'Someone'});\n\n        const usernames = userIds.\n            filter((userId) => {\n                return userId !== currentUserId && userId !== currentUsername;\n            }).\n            map((userId) => {\n                return allUsernames[userId] ? `@${allUsernames[userId]}` : someone;\n            }).filter((username) => {\n                return username && username !== '';\n            });\n\n        if (userIds.includes(currentUserId)) {\n            usernames.unshift(allUsernames[currentUserId]);\n        } else if (userIds.includes(currentUsername)) {\n            usernames.unshift(allUsernames[currentUsername]);\n        }\n\n        return usernames;\n    }\n\n    renderFormattedMessage(postType: string, userIds: string[], actorId?: string): JSX.Element {\n        const {formatMessage} = this.props.intl;\n        const {currentUserId, currentUsername} = this.props;\n        const usernames = this.getUsernamesByIds(userIds);\n        let actor = actorId ? this.getUsernamesByIds([actorId])[0] : '';\n        if (actor && (actorId === currentUserId || actorId === currentUsername)) {\n            actor = actor.toLowerCase();\n        }\n\n        const firstUser = usernames[0];\n        const secondUser = usernames[1];\n        const numOthers = usernames.length - 1;\n\n        const options = {\n            atMentions: true,\n            mentionKeys: [{key: firstUser}, {key: secondUser}, {key: actor}],\n            mentionHighlight: false,\n            singleline: true,\n        };\n\n        if (numOthers > 1) {\n            return (\n                <LastUsers\n                    actor={actor}\n                    expandedLocale={postTypeMessage[postType].many_expanded}\n                    formatOptions={options}\n                    postType={postType}\n                    usernames={usernames}\n                />\n            );\n        }\n\n        let localeHolder: MessageDescriptor = {};\n        if (numOthers === 0) {\n            localeHolder = postTypeMessage[postType].one;\n\n            if (\n                (userIds[0] === this.props.currentUserId || userIds[0] === this.props.currentUsername) &&\n                postTypeMessage[postType].one_you\n            ) {\n                localeHolder = postTypeMessage[postType].one_you;\n            }\n        } else if (numOthers === 1) {\n            localeHolder = postTypeMessage[postType].two;\n        }\n\n        const formattedMessage = formatMessage(localeHolder, {firstUser, secondUser, actor});\n\n        return (\n            <Markdown\n                message={formattedMessage}\n                options={options}\n            />\n        );\n    }\n\n    renderMessage(postType: string, userIds: string[], actorId?: string): JSX.Element {\n        return (\n            <React.Fragment key={postType + actorId}>\n                {this.renderFormattedMessage(postType, userIds, actorId)}\n                <br/>\n            </React.Fragment>\n        );\n    }\n\n    render(): JSX.Element {\n        const {\n            currentUserId,\n            messageData,\n        } = this.props;\n\n        const content = [];\n        const removedUserIds = [];\n        for (const message of messageData) {\n            const {\n                postType,\n                actorId,\n            } = message;\n            let userIds = message.userIds;\n\n            if (!this.props.showJoinLeave && actorId !== currentUserId) {\n                const affectsCurrentUser = userIds.indexOf(currentUserId) !== -1;\n\n                if (affectsCurrentUser) {\n                    // Only show the message that the current user was added, etc\n                    userIds = [currentUserId];\n                } else {\n                    // Not something the current user did or was affected by\n                    continue;\n                }\n            }\n\n            if (postType === REMOVE_FROM_CHANNEL) {\n                removedUserIds.push(...userIds);\n                continue;\n            }\n\n            content.push(this.renderMessage(postType, userIds, actorId));\n        }\n\n        if (removedUserIds.length > 0) {\n            const uniqueRemovedUserIds = removedUserIds.filter((id, index, arr) => arr.indexOf(id) === index);\n            content.push(this.renderMessage(REMOVE_FROM_CHANNEL, uniqueRemovedUserIds, currentUserId));\n        }\n\n        return (\n            <React.Fragment>\n                {content}\n            </React.Fragment>\n        );\n    }\n}\n\nexport default injectIntl(CombinedSystemMessage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {getMissingProfilesByIds, getMissingProfilesByUsernames} from 'mattermost-redux/actions/users';\nimport {Preferences} from 'mattermost-redux/constants';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUser, makeGetProfilesByIdsAndUsernames} from 'mattermost-redux/selectors/entities/users';\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport CombinedSystemMessage from './combined_system_message';\n\ntype OwnProps = {\n    allUserIds: string[];\n    allUsernames: string[];\n}\n\nfunction makeMapStateToProps() {\n    const getProfilesByIdsAndUsernames = makeGetProfilesByIdsAndUsernames();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        const currentUser = getCurrentUser(state);\n        const {allUserIds, allUsernames} = ownProps;\n\n        return {\n            currentUserId: currentUser.id,\n            currentUsername: currentUser.username,\n            showJoinLeave: getBool(state, Preferences.CATEGORY_ADVANCED_SETTINGS, Preferences.ADVANCED_FILTER_JOIN_LEAVE, true),\n            userProfiles: getProfilesByIdsAndUsernames(state, {allUserIds, allUsernames}),\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            getMissingProfilesByIds,\n            getMissingProfilesByUsernames,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(CombinedSystemMessage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Post} from 'mattermost-redux/types/posts';\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport {sendAddToChannelEphemeralPost} from 'actions/global_actions';\nimport {Constants} from 'utils/constants';\nimport {t} from 'utils/i18n';\nimport AtMention from 'components/at_mention';\n\ninterface Actions {\n    addChannelMember: (channelId: string, userId: string) => void;\n    removePost: (post: Post) => void;\n}\n\nexport interface Props {\n    currentUser: UserProfile;\n    channelType: string;\n    postId: string;\n    post: Post;\n    userIds: string[];\n    usernames: string[];\n    noGroupsUsernames: string[];\n    actions: Actions;\n}\n\ninterface State {\n    expanded: boolean;\n}\n\nexport default class PostAddChannelMember extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            expanded: false,\n        };\n    }\n\n    handleAddChannelMember = () => {\n        const {currentUser, post, userIds, usernames} = this.props;\n\n        if (post && post.channel_id) {\n            let createAt = post.create_at;\n            userIds.forEach((userId, index) => {\n                createAt++;\n                this.props.actions.addChannelMember(post.channel_id, userId);\n                sendAddToChannelEphemeralPost(currentUser, usernames[index], userId, post.channel_id, post.root_id, createAt);\n            });\n\n            this.props.actions.removePost(post);\n        }\n    }\n\n    expand = () => {\n        this.setState({expanded: true});\n    }\n\n    generateAtMentions(usernames = [] as string[]) {\n        if (usernames.length === 1) {\n            return (\n                <AtMention\n                    mentionName={usernames[0]}\n                    channelId={this.props.post?.channel_id}\n                />\n            );\n        } else if (usernames.length > 1) {\n            function andSeparator(key: number) {\n                return (\n                    <FormattedMessage\n                        key={key}\n                        id={'post_body.check_for_out_of_channel_mentions.link.and'}\n                        defaultMessage={' and '}\n                    />\n                );\n            }\n\n            function commaSeparator(key: number) {\n                return <span key={key}>{', '}</span>;\n            }\n\n            if (this.state.expanded || usernames.length <= 3) {\n                return (\n                    <span>\n                        {\n                            usernames.map((username) => {\n                                return (\n                                    <AtMention\n                                        key={username}\n                                        mentionName={username}\n                                        channelId={this.props.post?.channel_id}\n                                    />\n                                );\n                            }).reduce((acc, el, idx, arr) => {\n                                if (idx === 0) {\n                                    return [el];\n                                } else if (idx === arr.length - 1) {\n                                    return [...acc, andSeparator(idx), el];\n                                }\n\n                                return [...acc, commaSeparator(idx), el];\n                            }, [] as JSX.Element[])\n                        }\n                    </span>\n                );\n            }\n            const otherUsers = [...usernames];\n            const firstUserName = otherUsers.shift();\n            const lastUserName = otherUsers.pop();\n            return (\n                <span>\n                    <AtMention\n                        key={firstUserName}\n                        mentionName={firstUserName}\n                        channelId={this.props.post?.channel_id}\n                    />\n                    {commaSeparator(1)}\n                    <a\n                        className='PostBody_otherUsersLink'\n                        onClick={this.expand}\n                    >\n                        <FormattedMessage\n                            id={'post_body.check_for_out_of_channel_mentions.others'}\n                            defaultMessage={'{numOthers} others'}\n                            values={{\n                                numOthers: otherUsers.length,\n                            }}\n                        />\n                    </a>\n                    {andSeparator(1)}\n                    <AtMention\n                        key={lastUserName}\n                        mentionName={lastUserName}\n                        channelId={this.props.post?.channel_id}\n                    />\n                </span>\n            );\n        }\n\n        return '';\n    }\n\n    render() {\n        const {channelType, postId, usernames, noGroupsUsernames} = this.props;\n        if (!postId || !channelType) {\n            return null;\n        }\n\n        let linkId;\n        let linkText;\n        if (channelType === Constants.PRIVATE_CHANNEL) {\n            linkId = t('post_body.check_for_out_of_channel_mentions.link.private');\n            linkText = 'add them to this private channel';\n        } else if (channelType === Constants.OPEN_CHANNEL) {\n            linkId = t('post_body.check_for_out_of_channel_mentions.link.public');\n            linkText = 'add them to the channel';\n        }\n\n        let outOfChannelMessageID;\n        let outOfChannelMessageText;\n        const outOfChannelAtMentions = this.generateAtMentions(usernames);\n        if (usernames.length === 1) {\n            outOfChannelMessageID = t('post_body.check_for_out_of_channel_mentions.message.one');\n            outOfChannelMessageText = 'did not get notified by this mention because they are not in the channel. Would you like to ';\n        } else if (usernames.length > 1) {\n            outOfChannelMessageID = t('post_body.check_for_out_of_channel_mentions.message.multiple');\n            outOfChannelMessageText = 'did not get notified by this mention because they are not in the channel. Would you like to ';\n        }\n\n        let outOfGroupsMessageID;\n        let outOfGroupsMessageText;\n        const outOfGroupsAtMentions = this.generateAtMentions(noGroupsUsernames);\n        if (noGroupsUsernames.length) {\n            outOfGroupsMessageID = t('post_body.check_for_out_of_channel_groups_mentions.message');\n            outOfGroupsMessageText = 'did not get notified by this mention because they are not in the channel. They cannot be added to the channel because they are not a member of the linked groups. To add them to this channel, they must be added to the linked groups.';\n        }\n\n        let outOfChannelMessage = null;\n        let outOfGroupsMessage = null;\n\n        if (usernames.length) {\n            outOfChannelMessage = (\n                <p>\n                    {outOfChannelAtMentions}\n                    {' '}\n                    <FormattedMessage\n                        id={outOfChannelMessageID}\n                        defaultMessage={outOfChannelMessageText}\n                    />\n                    <a\n                        className='PostBody_addChannelMemberLink'\n                        onClick={this.handleAddChannelMember}\n                    >\n                        <FormattedMessage\n                            id={linkId}\n                            defaultMessage={linkText}\n                        />\n                    </a>\n                    <FormattedMessage\n                        id={'post_body.check_for_out_of_channel_mentions.message_last'}\n                        defaultMessage={'? They will have access to all message history.'}\n                    />\n                </p>\n            );\n        }\n\n        if (noGroupsUsernames.length) {\n            outOfGroupsMessage = (\n                <p>\n                    {outOfGroupsAtMentions}\n                    {' '}\n                    <FormattedMessage\n                        id={outOfGroupsMessageID}\n                        defaultMessage={outOfGroupsMessageText}\n                    />\n                </p>\n            );\n        }\n\n        return (\n            <>\n                {outOfChannelMessage}\n                {outOfGroupsMessage}\n            </>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {addChannelMember} from 'mattermost-redux/actions/channels';\nimport {removePost} from 'mattermost-redux/actions/posts';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport PostAddChannelMember from './post_add_channel_member';\n\ntype OwnProps = {\n    postId: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const post = getPost(state, ownProps.postId) || {};\n    let channelType = '';\n    if (post && post.channel_id) {\n        const channel = getChannel(state, post.channel_id);\n        if (channel && channel.type) {\n            channelType = channel.type;\n        }\n    }\n\n    return {\n        channelType,\n        currentUser: getCurrentUser(state),\n        post,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            addChannelMember,\n            removePost,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PostAddChannelMember);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ReactNode} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {General, Posts} from 'mattermost-redux/constants';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport * as Utils from 'utils/utils.jsx';\nimport {TextFormattingOptions} from 'utils/text_formatting';\n\nimport Markdown from 'components/markdown';\nimport CombinedSystemMessage from 'components/post_view/combined_system_message';\nimport PostAddChannelMember from 'components/post_view/post_add_channel_member';\n\nfunction renderUsername(value: string): ReactNode {\n    const username = (value[0] === '@') ? value : `@${value}`;\n\n    const options = {\n        markdown: false,\n    };\n\n    return renderFormattedText(username, options);\n}\n\nfunction renderFormattedText(value: string, options?: Partial<TextFormattingOptions>, post?: Post): ReactNode {\n    return (\n        <Markdown\n            message={value}\n            options={options}\n            postId={post && post.id}\n            postType={post && post.type}\n        />\n    );\n}\n\nfunction renderJoinChannelMessage(post: Post): ReactNode {\n    const username = renderUsername(post.props.username);\n\n    return (\n        <FormattedMessage\n            id='api.channel.join_channel.post_and_forget'\n            defaultMessage='{username} joined the channel.'\n            values={{username}}\n        />\n    );\n}\n\nfunction renderGuestJoinChannelMessage(post: Post): ReactNode {\n    const username = renderUsername(post.props.username);\n\n    return (\n        <FormattedMessage\n            id='api.channel.guest_join_channel.post_and_forget'\n            defaultMessage='{username} joined the channel as a guest.'\n            values={{username}}\n        />\n    );\n}\n\nfunction renderLeaveChannelMessage(post: Post): ReactNode {\n    const username = renderUsername(post.props.username);\n\n    return (\n        <FormattedMessage\n            id='api.channel.leave.left'\n            defaultMessage='{username} has left the channel.'\n            values={{username}}\n        />\n    );\n}\n\nfunction renderAddToChannelMessage(post: Post): ReactNode {\n    const username = renderUsername(post.props.username);\n    const addedUsername = renderUsername(post.props.addedUsername);\n\n    return (\n        <FormattedMessage\n            id='api.channel.add_member.added'\n            defaultMessage='{addedUsername} added to the channel by {username}.'\n            values={{\n                username,\n                addedUsername,\n            }}\n        />\n    );\n}\n\nfunction renderAddGuestToChannelMessage(post: Post): ReactNode {\n    const username = renderUsername(post.props.username);\n    const addedUsername = renderUsername(post.props.addedUsername);\n\n    return (\n        <FormattedMessage\n            id='api.channel.add_guest.added'\n            defaultMessage='{addedUsername} added to the channel as a guest by {username}.'\n            values={{\n                username,\n                addedUsername,\n            }}\n        />\n    );\n}\n\nfunction renderRemoveFromChannelMessage(post: Post): ReactNode {\n    const removedUsername = renderUsername(post.props.removedUsername);\n\n    return (\n        <FormattedMessage\n            id='api.channel.remove_member.removed'\n            defaultMessage='{removedUsername} was removed from the channel'\n            values={{\n                removedUsername,\n            }}\n        />\n    );\n}\n\nfunction renderJoinTeamMessage(post: Post): ReactNode {\n    const username = renderUsername(post.props.username);\n\n    return (\n        <FormattedMessage\n            id='api.team.join_team.post_and_forget'\n            defaultMessage='{username} joined the team.'\n            values={{username}}\n        />\n    );\n}\n\nfunction renderLeaveTeamMessage(post: Post): ReactNode {\n    const username = renderUsername(post.props.username);\n\n    return (\n        <FormattedMessage\n            id='api.team.leave.left'\n            defaultMessage='{username} left the team.'\n            values={{username}}\n        />\n    );\n}\n\nfunction renderAddToTeamMessage(post: Post): ReactNode {\n    const username = renderUsername(post.props.username);\n    const addedUsername = renderUsername(post.props.addedUsername);\n\n    return (\n        <FormattedMessage\n            id='api.team.add_member.added'\n            defaultMessage='{addedUsername} added to the team by {username}.'\n            values={{\n                username,\n                addedUsername,\n            }}\n        />\n    );\n}\n\nfunction renderRemoveFromTeamMessage(post: Post): ReactNode {\n    const removedUsername = renderUsername(post.props.username);\n\n    return (\n        <FormattedMessage\n            id='api.team.remove_user_from_team.removed'\n            defaultMessage='{removedUsername} was removed from the team.'\n            values={{\n                removedUsername,\n            }}\n        />\n    );\n}\n\nfunction renderHeaderChangeMessage(post: Post): ReactNode {\n    if (!post.props.username) {\n        return null;\n    }\n\n    const headerOptions = {\n        singleline: true,\n        channelNamesMap: post.props && post.props.channel_mentions,\n        mentionHighlight: true,\n    };\n\n    const username = renderUsername(post.props.username);\n    const oldHeader = post.props.old_header ? renderFormattedText(post.props.old_header, headerOptions, post) : null;\n    const newHeader = post.props.new_header ? renderFormattedText(post.props.new_header, headerOptions, post) : null;\n\n    if (post.props.new_header) {\n        if (post.props.old_header) {\n            return (\n                <FormattedMessage\n                    id='api.channel.post_update_channel_header_message_and_forget.updated_from'\n                    defaultMessage='{username} updated the channel header <br></br><strong>From:</strong> {old} <br></br><strong>To:</strong> {new}'\n                    values={{\n                        username,\n                        old: oldHeader,\n                        new: newHeader,\n                        strong: (chunks: React.ReactNode) => (<strong>{chunks}</strong>),\n                        br: (x: React.ReactNode) => (<><br/>{x}</>),\n                    }}\n                />\n            );\n        }\n\n        return (\n            <FormattedMessage\n                id='api.channel.post_update_channel_header_message_and_forget.updated_to'\n                defaultMessage='{username} updated the channel header to: {new}'\n                values={{\n                    username,\n                    new: newHeader,\n                }}\n            />\n        );\n    } else if (post.props.old_header) {\n        return (\n            <FormattedMessage\n                id='api.channel.post_update_channel_header_message_and_forget.removed'\n                defaultMessage='{username} removed the channel header (was: {old})'\n                values={{\n                    username,\n                    old: oldHeader,\n                }}\n            />\n        );\n    }\n\n    return null;\n}\n\nfunction renderDisplayNameChangeMessage(post: Post): ReactNode {\n    if (!(post.props.username && post.props.old_displayname && post.props.new_displayname)) {\n        return null;\n    }\n\n    const username = renderUsername(post.props.username);\n    const oldDisplayName = post.props.old_displayname;\n    const newDisplayName = post.props.new_displayname;\n\n    return (\n        <FormattedMessage\n            id='api.channel.post_update_channel_displayname_message_and_forget.updated_from'\n            defaultMessage='{username} updated the channel display name from: {old} to: {new}'\n            values={{\n                username,\n                old: oldDisplayName,\n                new: newDisplayName,\n            }}\n        />\n    );\n}\n\nfunction renderConvertChannelToPrivateMessage(post: Post): ReactNode {\n    if (!(post.props.username)) {\n        return null;\n    }\n\n    const username = renderUsername(post.props.username);\n\n    return (\n        <FormattedMessage\n            id='api.channel.post_convert_channel_to_private.updated_from'\n            defaultMessage='{username} converted the channel from public to private'\n            values={{\n                username,\n            }}\n        />\n    );\n}\n\nfunction renderPurposeChangeMessage(post: Post): ReactNode {\n    if (!post.props.username) {\n        return null;\n    }\n\n    const username = renderUsername(post.props.username);\n    const oldPurpose = post.props.old_purpose;\n    const newPurpose = post.props.new_purpose;\n\n    if (post.props.new_purpose) {\n        if (post.props.old_purpose) {\n            return (\n                <FormattedMessage\n                    id='app.channel.post_update_channel_purpose_message.updated_from'\n                    defaultMessage='{username} updated the channel purpose from: {old} to: {new}'\n                    values={{\n                        username,\n                        old: oldPurpose,\n                        new: newPurpose,\n                    }}\n                />\n            );\n        }\n\n        return (\n            <FormattedMessage\n                id='app.channel.post_update_channel_purpose_message.updated_to'\n                defaultMessage='{username} updated the channel purpose to: {new}'\n                values={{\n                    username,\n                    new: newPurpose,\n                }}\n            />\n        );\n    } else if (post.props.old_purpose) {\n        return (\n            <FormattedMessage\n                id='app.channel.post_update_channel_purpose_message.removed'\n                defaultMessage='{username} removed the channel purpose (was: {old})'\n                values={{\n                    username,\n                    old: oldPurpose,\n                }}\n            />\n        );\n    }\n\n    return null;\n}\n\nfunction renderChannelDeletedMessage(post: Post): ReactNode {\n    if (!post.props.username) {\n        return null;\n    }\n\n    const username = renderUsername(post.props.username);\n\n    return (\n        <FormattedMessage\n            id='api.channel.delete_channel.archived'\n            defaultMessage='{username} has archived the channel.'\n            values={{username}}\n        />\n    );\n}\n\nfunction renderChannelUnarchivedMessage(post: Post): ReactNode {\n    if (!post.props.username) {\n        return null;\n    }\n\n    const username = renderUsername(post.props.username);\n\n    return (\n        <FormattedMessage\n            id='api.channel.restore_channel.unarchived'\n            defaultMessage='{username} has unarchived the channel.'\n            values={{username}}\n        />\n    );\n}\n\nfunction renderMeMessage(post: Post): ReactNode {\n    // Trim off the leading and trailing asterisk added to /me messages\n    const message = post.message.replace(/^\\*|\\*$/g, '');\n\n    return renderFormattedText(message);\n}\n\nconst systemMessageRenderers = {\n    [Posts.POST_TYPES.JOIN_CHANNEL]: renderJoinChannelMessage,\n    [Posts.POST_TYPES.GUEST_JOIN_CHANNEL]: renderGuestJoinChannelMessage,\n    [Posts.POST_TYPES.LEAVE_CHANNEL]: renderLeaveChannelMessage,\n    [Posts.POST_TYPES.ADD_TO_CHANNEL]: renderAddToChannelMessage,\n    [Posts.POST_TYPES.ADD_GUEST_TO_CHANNEL]: renderAddGuestToChannelMessage,\n    [Posts.POST_TYPES.REMOVE_FROM_CHANNEL]: renderRemoveFromChannelMessage,\n    [Posts.POST_TYPES.JOIN_TEAM]: renderJoinTeamMessage,\n    [Posts.POST_TYPES.LEAVE_TEAM]: renderLeaveTeamMessage,\n    [Posts.POST_TYPES.ADD_TO_TEAM]: renderAddToTeamMessage,\n    [Posts.POST_TYPES.REMOVE_FROM_TEAM]: renderRemoveFromTeamMessage,\n    [Posts.POST_TYPES.HEADER_CHANGE]: renderHeaderChangeMessage,\n    [Posts.POST_TYPES.DISPLAYNAME_CHANGE]: renderDisplayNameChangeMessage,\n    [Posts.POST_TYPES.CONVERT_CHANNEL]: renderConvertChannelToPrivateMessage,\n    [Posts.POST_TYPES.PURPOSE_CHANGE]: renderPurposeChangeMessage,\n    [Posts.POST_TYPES.CHANNEL_DELETED]: renderChannelDeletedMessage,\n    [Posts.POST_TYPES.CHANNEL_UNARCHIVED]: renderChannelUnarchivedMessage,\n    [Posts.POST_TYPES.ME]: renderMeMessage,\n};\n\nexport function renderSystemMessage(post: Post, channel: Channel, isUserCanManageMembers?: boolean): ReactNode {\n    if (post.props && post.props.add_channel_member) {\n        const isEphemeral = Utils.isPostEphemeral(post);\n\n        if (channel && (channel.type === General.PRIVATE_CHANNEL || channel.type === General.OPEN_CHANNEL) &&\n            isUserCanManageMembers &&\n            isEphemeral\n        ) {\n            const addMemberProps = post.props.add_channel_member;\n            return (\n                <PostAddChannelMember\n                    postId={addMemberProps.post_id}\n                    userIds={addMemberProps.not_in_channel_user_ids}\n                    noGroupsUsernames={addMemberProps.not_in_groups_usernames}\n                    usernames={addMemberProps.not_in_channel_usernames}\n                />\n            );\n        }\n\n        return null;\n    } else if (systemMessageRenderers[post.type]) {\n        return systemMessageRenderers[post.type](post);\n    } else if (post.type === Posts.POST_TYPES.EPHEMERAL_ADD_TO_CHANNEL) {\n        return renderAddToChannelMessage(post);\n    } else if (post.type === Posts.POST_TYPES.COMBINED_USER_ACTIVITY) {\n        const {allUserIds, allUsernames, messageData} = post.props.user_activity;\n\n        return (\n            <CombinedSystemMessage\n                allUserIds={allUserIds}\n                allUsernames={allUsernames}\n                messageData={messageData}\n            />\n        );\n    }\n\n    return null;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport memoize from 'memoize-one';\n\nimport {Post} from 'mattermost-redux/types/posts';\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport Markdown from 'components/markdown';\n\nimport {MentionKey, TextFormattingOptions} from 'utils/text_formatting';\n\nimport {renderSystemMessage} from './system_message_helpers';\n\ntype Props = {\n\n    /*\n     * Any extra props that should be passed into the image component\n     */\n    imageProps?: Record<string, any>;\n\n    /*\n     * Whether or not this text is part of the RHS\n     */\n    isRHS?: boolean;\n\n    /*\n     * The post text to be rendered\n     */\n    message: string;\n\n    /*\n     * The optional post for which this message is being rendered\n     */\n    post?: Post;\n\n    /*\n     * The id of the channel that this post is being rendered in\n     */\n    channelId?: string;\n    channel: Channel;\n    options?: TextFormattingOptions;\n    pluginHooks?: Array<Record<string, any>>;\n\n    /**\n     * Whether or not to place the LinkTooltip component inside links\n     */\n    hasPluginTooltips?: boolean;\n    isUserCanManageMembers?: boolean;\n    mentionKeys: MentionKey[];\n}\n\nexport default class PostMarkdown extends React.PureComponent<Props> {\n    static defaultProps = {\n        isRHS: false,\n        pluginHooks: [],\n        options: {},\n    };\n\n    getOptions = memoize(\n        (options: TextFormattingOptions | undefined, disableGroupHighlight: boolean, mentionHighlight: boolean | undefined) => {\n            return {\n                ...options,\n                disableGroupHighlight,\n                mentionHighlight,\n            };\n        })\n\n    render() {\n        let {message} = this.props;\n        const {post, mentionKeys} = this.props;\n\n        if (post) {\n            const renderedSystemMessage = renderSystemMessage(post, this.props.channel, this.props.isUserCanManageMembers);\n            if (renderedSystemMessage) {\n                return <div>{renderedSystemMessage}</div>;\n            }\n        }\n\n        // Proxy images if we have an image proxy and the server hasn't already rewritten the post's image URLs.\n        const proxyImages = !post || !post.message_source || post.message === post.message_source;\n        const channelNamesMap = post && post.props && post.props.channel_mentions;\n\n        this.props.pluginHooks?.forEach((o) => {\n            if (o && o.hook && post) {\n                message = o.hook(post, message);\n            }\n        });\n\n        let mentionHighlight = this.props.options?.mentionHighlight;\n        if (post && post.props) {\n            mentionHighlight = !post.props.mentionHighlightDisabled;\n        }\n\n        const options = this.getOptions(\n            this.props.options,\n            post?.props?.disable_group_highlight === true, // eslint-disable-line camelcase\n            mentionHighlight,\n        );\n\n        return (\n            <Markdown\n                imageProps={this.props.imageProps}\n                isRHS={this.props.isRHS}\n                message={message}\n                proxyImages={proxyImages}\n                mentionKeys={mentionKeys}\n                options={options}\n                channelNamesMap={channelNamesMap}\n                hasPluginTooltips={this.props.hasPluginTooltips}\n                imagesMetadata={this.props.post && this.props.post.metadata && this.props.post.metadata.images}\n                postId={this.props.post && this.props.post.id}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {connect} from 'react-redux';\n\nimport {createSelector} from 'reselect';\n\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {\n    getMyGroupMentionKeysForChannel,\n    getMyGroupMentionKeys,\n} from 'mattermost-redux/selectors/entities/groups';\nimport {getCurrentUserMentionKeys} from 'mattermost-redux/selectors/entities/users';\nimport {Post} from 'mattermost-redux/types/posts';\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport {GlobalState} from 'types/store';\n\nimport {canManageMembers} from 'utils/channel_utils.jsx';\n\nimport {MentionKey} from 'utils/text_formatting';\n\nimport PostMarkdown from './post_markdown';\n\nexport function makeGetMentionKeysForPost(): (\n    state: GlobalState,\n    post?: Post,\n    channel?: Channel\n) => MentionKey[] {\n    return createSelector(\n        'makeGetMentionKeysForPost',\n        getCurrentUserMentionKeys,\n        (state: GlobalState, post?: Post) => post,\n        (state: GlobalState, post?: Post, channel?: Channel) =>\n            (channel ? getMyGroupMentionKeysForChannel(state, channel.team_id, channel.id) : getMyGroupMentionKeys(state)),\n        (mentionKeysWithoutGroups, post, groupMentionKeys) => {\n            let mentionKeys = mentionKeysWithoutGroups;\n            if (!post?.props?.disable_group_highlight) {\n                // eslint-disable-line camelcase\n                mentionKeys = mentionKeys.concat(groupMentionKeys);\n            }\n\n            if (post?.props?.mentionHighlightDisabled) {\n                mentionKeys = mentionKeys.filter(\n                    (value) => !['@all', '@channel', '@here'].includes(value.key),\n                );\n            }\n\n            return mentionKeys;\n        },\n    );\n}\n\ntype OwnProps = {\n    channelId: string;\n    mentionKeys: MentionKey[];\n    post?: Post;\n};\n\nfunction makeMapStateToProps() {\n    const getMentionKeysForPost = makeGetMentionKeysForPost();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        const channel = getChannel(state, ownProps.channelId);\n\n        return {\n            channel,\n            pluginHooks: state.plugins.components.MessageWillFormat,\n            hasPluginTooltips: Boolean(state.plugins.components.LinkTooltip),\n            isUserCanManageMembers: channel && canManageMembers(state, channel),\n            mentionKeys: getMentionKeysForPost(state, ownProps.post, channel),\n        };\n    };\n}\n\nexport default connect(makeMapStateToProps)(PostMarkdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport ProfilePicture from 'components/profile_picture';\nimport MattermostLogo from 'components/widgets/icons/mattermost_logo';\n\nimport Constants, {UserStatuses} from 'utils/constants';\nimport * as PostUtils from 'utils/post_utils';\nimport * as Utils from 'utils/utils';\n\nimport {Post} from 'mattermost-redux/types/posts';\nimport {UserProfile} from 'mattermost-redux/types/users';\n\ntype Props = {\n    availabilityStatusOnPosts: string;\n    compactDisplay: boolean;\n    enablePostIconOverride: boolean;\n    hasImageProxy: boolean;\n    isBusy?: boolean;\n    isRHS?: boolean;\n    post: Post;\n    status?: string;\n    user: UserProfile;\n    isBot?: boolean;\n    postIconOverrideURL?: string;\n    overwriteIcon?: string;\n}\n\nexport default class PostProfilePicture extends React.PureComponent<Props> {\n    static defaultProps = {\n        status: UserStatuses.OFFLINE,\n    };\n\n    getProfilePictureURL = (): string => {\n        const {post, user} = this.props;\n\n        if (user && user.id === post.user_id) {\n            return Utils.imageURLForUser(user.id, user.last_picture_update);\n        } else if (post.user_id) {\n            return Utils.imageURLForUser(post.user_id);\n        }\n\n        return '';\n    };\n\n    getStatus = (fromAutoResponder: boolean, fromWebhook: boolean, user: UserProfile): string | undefined => {\n        if (fromAutoResponder || fromWebhook || (user && user.is_bot)) {\n            return '';\n        }\n\n        return this.props.status;\n    };\n\n    getPostIconURL = (defaultURL: string, fromAutoResponder: boolean, fromWebhook: boolean): string => {\n        const {enablePostIconOverride, hasImageProxy, post} = this.props;\n        const postProps = post.props;\n        let postIconOverrideURL = '';\n        let useUserIcon = '';\n        if (postProps) {\n            postIconOverrideURL = postProps.override_icon_url;\n            useUserIcon = postProps.use_user_icon;\n        }\n\n        if (this.props.compactDisplay) {\n            return '';\n        }\n\n        if (!fromAutoResponder && fromWebhook && !useUserIcon && enablePostIconOverride) {\n            if (postIconOverrideURL && postIconOverrideURL !== '') {\n                return PostUtils.getImageSrc(postIconOverrideURL, hasImageProxy);\n            }\n\n            return Constants.DEFAULT_WEBHOOK_LOGO;\n        }\n\n        return defaultURL;\n    };\n\n    render() {\n        const {\n            availabilityStatusOnPosts,\n            compactDisplay,\n            isBusy,\n            isRHS,\n            post,\n            user,\n            isBot,\n        } = this.props;\n\n        const isSystemMessage = PostUtils.isSystemMessage(post);\n        const fromWebhook = PostUtils.isFromWebhook(post);\n\n        if (isSystemMessage && !compactDisplay && !fromWebhook && !isBot) {\n            return <MattermostLogo className='icon'/>;\n        }\n        const fromAutoResponder = PostUtils.fromAutoResponder(post);\n\n        const hasMention = !fromAutoResponder && !fromWebhook;\n        const profileSrc = this.getProfilePictureURL();\n        const src = this.getPostIconURL(profileSrc, fromAutoResponder, fromWebhook);\n\n        const overrideIconEmoji = post.props ? post.props.override_icon_emoji : '';\n        const overwriteName = post.props ? post.props.override_username : '';\n        const isEmoji = typeof overrideIconEmoji == 'string' && overrideIconEmoji !== '';\n        const status = this.getStatus(fromAutoResponder, fromWebhook, user);\n\n        return (\n            <ProfilePicture\n                hasMention={hasMention}\n                isBusy={isBusy}\n                isRHS={isRHS}\n                size='md'\n                src={src}\n                profileSrc={profileSrc}\n                isEmoji={isEmoji}\n                status={availabilityStatusOnPosts === 'true' ? status : ''}\n                userId={user?.id}\n                channelId={post.channel_id}\n                username={user?.username}\n                overwriteIcon={this.props.overwriteIcon}\n                overwriteName={overwriteName}\n                isBot={user?.is_bot}\n                fromAutoResponder={fromAutoResponder}\n                fromWebhook={fromWebhook}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getUser, getStatusForUserId} from 'mattermost-redux/selectors/entities/users';\nimport {get} from 'mattermost-redux/selectors/entities/preferences';\nimport {Client4} from 'mattermost-redux/client';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {GlobalState} from '../../types/store';\n\nimport {Preferences} from 'utils/constants';\n\nimport PostProfilePicture from './post_profile_picture';\n\ntype Props = {\n    userId: string;\n    post: Post;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const config = getConfig(state);\n    const user = getUser(state, ownProps.userId);\n    const enablePostIconOverride = config.EnablePostIconOverride === 'true';\n    const availabilityStatusOnPosts = get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.AVAILABILITY_STATUS_ON_POSTS, Preferences.AVAILABILITY_STATUS_ON_POSTS_DEFAULT);\n    const overrideIconUrl = enablePostIconOverride && ownProps.post && ownProps.post.props && ownProps.post.props.override_icon_url;\n    let overwriteIcon;\n    if (overrideIconUrl) {\n        overwriteIcon = Client4.getAbsoluteUrl(overrideIconUrl);\n    }\n\n    return {\n        availabilityStatusOnPosts,\n        enablePostIconOverride: config.EnablePostIconOverride === 'true',\n        overwriteIcon,\n        hasImageProxy: config.HasImageProxy === 'true',\n        status: getStatusForUserId(state, ownProps.userId),\n        isBot: Boolean(user && user.is_bot),\n        user,\n    };\n}\n\nexport default connect(mapStateToProps)(PostProfilePicture);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ReactNode} from 'react';\nimport './separator.scss';\n\ntype Props = {\n    children?: ReactNode;\n};\n\nexport default class BasicSeparator extends React.PureComponent<Props> {\n    public render() {\n        const {children} = this.props;\n        return (\n            <div\n                data-testid='basicSeparator'\n                className='Separator BasicSeparator'\n            >\n                <hr className='separator__hr'/>\n                {children && (\n                    <div className='separator__text'>\n                        {children}\n                    </div>\n                )}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React, {FC, memo} from 'react';\n\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\n\nimport BasicSeparator from 'components/widgets/separator/basic-separator';\n\nconst DATE_RANGES = [\n    RelativeRanges.TODAY_TITLE_CASE,\n    RelativeRanges.YESTERDAY_TITLE_CASE,\n];\n\ntype Props = {\n    date: number | Date;\n}\n\nconst DateSeparator: FC<Props> = ({date}) => {\n    return (\n        <BasicSeparator>\n            <Timestamp\n                value={date}\n                useTime={false}\n                useSemanticOutput={false}\n                ranges={DATE_RANGES}\n            />\n        </BasicSeparator>\n    );\n};\n\nDateSeparator.propTypes = {\n    date: PropTypes.oneOfType([\n        PropTypes.number,\n        PropTypes.instanceOf(Date),\n    ]).isRequired,\n};\n\nexport default memo(DateSeparator);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {MouseEvent} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Post} from 'mattermost-redux/types/posts';\nimport {FileInfo} from 'mattermost-redux/types/files';\nimport {DispatchFunc, GetStateFunc} from 'mattermost-redux/types/actions';\nimport {ExtendedPost} from 'mattermost-redux/actions/posts';\n\ntype CreatePostAction =\n    (post: Post, files?: FileInfo[]) => (dispatch: DispatchFunc) => Promise<{data: boolean}>;\ntype RemovePostAction =\n    (post: ExtendedPost) => (dispatch: DispatchFunc, getState: GetStateFunc) => void;\n\ntype Props = {\n    post: Post;\n    actions: {\n        createPost: CreatePostAction;\n        removePost: RemovePostAction;\n    };\n};\n\nexport default class FailedPostOptions extends React.PureComponent<Props> {\n    retryPost = (e: MouseEvent): void => {\n        e.preventDefault();\n\n        const post = {...this.props.post};\n        Reflect.deleteProperty(post, 'id');\n        this.props.actions.createPost(post);\n    }\n\n    cancelPost = (e: MouseEvent): void => {\n        e.preventDefault();\n\n        this.props.actions.removePost(this.props.post);\n    }\n\n    render(): JSX.Element {\n        return (\n            <span className='pending-post-actions'>\n                <a\n                    className='post-retry'\n                    href='#'\n                    onClick={this.retryPost}\n                >\n                    <FormattedMessage\n                        id='pending_post_actions.retry'\n                        defaultMessage='Retry'\n                    />\n                </a>\n                {' - '}\n                <a\n                    className='post-cancel'\n                    href='#'\n                    onClick={this.cancelPost}\n                >\n                    <FormattedMessage\n                        id='pending_post_actions.cancel'\n                        defaultMessage='Cancel'\n                    />\n                </a>\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {removePost} from 'mattermost-redux/actions/posts';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {createPost} from 'actions/post_actions';\n\nimport FailedPostOptions from './failed_post_options';\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            createPost,\n            removePost,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(FailedPostOptions);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport classNames from 'classnames';\n\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\n\nconst DATE_RANGES = [\n    RelativeRanges.TODAY_TITLE_CASE,\n    RelativeRanges.YESTERDAY_TITLE_CASE,\n];\ntype Props = {\n    isScrolling: boolean;\n    isMobile: boolean;\n    createAt: Date | number;\n    toastPresent: boolean;\n    isRhsPost: boolean;\n}\n\nexport default class FloatingTimestamp extends React.PureComponent<Props> {\n    render() {\n        const {isMobile, createAt, isScrolling, isRhsPost, toastPresent} = this.props;\n\n        if (!isMobile || createAt === 0) {\n            return null;\n        }\n\n        const classes = classNames('post-list__timestamp', {\n            scrolling: isScrolling,\n            rhs: isRhsPost,\n            toastAdjustment: toastPresent,\n        });\n\n        return (\n            <div\n                className={classes}\n                data-testid='floatingTimestamp'\n            >\n                <div>\n                    <span>\n                        <Timestamp\n                            value={createAt}\n                            useTime={false}\n                            ranges={DATE_RANGES}\n                        />\n                    </span>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport * as PostListUtils from 'mattermost-redux/utils/post_list';\n\nimport {getToastStatus} from 'selectors/views/channel';\nimport {GlobalState} from 'types/store';\n\nimport FloatingTimestamp from './floating_timestamp';\n\ntype OwnProps = {\n    postId: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    let postId = ownProps.postId;\n    if (PostListUtils.isCombinedUserActivityPost(postId)) {\n        const combinedIds = PostListUtils.getPostIdsForCombinedUserActivityPost(postId);\n\n        postId = combinedIds[combinedIds.length - 1];\n    }\n\n    const post = getPost(state, postId);\n\n    const toastPresent = getToastStatus(state);\n    return {\n        createAt: post ? post.create_at : 0,\n        toastPresent,\n    };\n}\n\nexport default connect(mapStateToProps)(FloatingTimestamp);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport './separator.scss';\nimport './notification-separator.scss';\n\nexport default class NotificationSeparator extends React.PureComponent<React.PropsWithChildren<any>> {\n    public render() {\n        const {children} = this.props;\n        return (\n            <div\n                className='Separator NotificationSeparator'\n                data-testid='NotificationSeparator'\n            >\n                <hr className='separator__hr'/>\n                {children && (\n                    <div className='separator__text'>\n                        {children}\n                    </div>\n                )}\n            </div>\n        );\n    }\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport NotificationSeparator from 'components/widgets/separator/notification-separator';\n\ntype Props = {\n    separatorId: string;\n    wrapperRef?: React.RefObject<HTMLDivElement>;\n}\n\nexport default class NewMessageSeparator extends React.PureComponent<Props> {\n    render(): JSX.Element {\n        return (\n            <div\n                ref={this.props.wrapperRef}\n                className='new-separator'\n            >\n                <NotificationSeparator id={this.props.separatorId}>\n                    <FormattedMessage\n                        id='posts_view.newMsg'\n                        defaultMessage='New Messages'\n                    />\n\n                </NotificationSeparator>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useRef} from 'react';\nimport {useSelector} from 'react-redux';\nimport {useIntl} from 'react-intl';\n\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {GlobalState} from 'types/store';\n\nimport {makeCreateAriaLabelForPost} from 'utils/post_utils';\n\ntype Props = React.HTMLProps<HTMLDivElement> & {\n    labelPrefix?: string;\n    post: Post;\n}\n\nconst PostAriaLabelDiv = React.forwardRef((props: Props, ref: React.Ref<HTMLDivElement>) => {\n    const {\n        children,\n        labelPrefix,\n        post,\n        ...otherProps\n    } = props;\n\n    const intl = useIntl();\n\n    const createAriaLabelForPost = useRef(makeCreateAriaLabelForPost());\n    let ariaLabel = useSelector<GlobalState, string>((state) => createAriaLabelForPost.current(state, post)(intl));\n    if (labelPrefix) {\n        ariaLabel = labelPrefix + ariaLabel;\n    }\n\n    return (\n        <div\n            ref={ref}\n            aria-label={ariaLabel}\n            {...otherProps}\n        >\n            {children}\n        </div>\n    );\n});\n\nPostAriaLabelDiv.displayName = 'PostAriaLabelDiv';\n\nexport default PostAriaLabelDiv;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getScheme} from 'utils/url';\n\nimport RemoveMarkdown from './remove_markdown';\n\nexport default class LinkOnlyRenderer extends RemoveMarkdown {\n    public link(href: string, title: string, text: string) {\n        let outHref = href;\n\n        if (!getScheme(href)) {\n            outHref = `http://${outHref}`;\n        }\n\n        let output = `<a class=\"theme markdown__link\" href=\"${outHref}\" target=\"_blank\"`;\n\n        if (title) {\n            output += ' title=\"' + title + '\"';\n        }\n\n        output += `>${text}</a>`;\n\n        return output;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {changeOpacity} from 'mattermost-redux/utils/theme_utils';\nimport {Theme} from 'mattermost-redux/types/themes';\nimport {PostAction, PostActionOption} from 'mattermost-redux/types/integration_actions';\nimport {Dictionary} from 'mattermost-redux/types/utilities';\n\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\nimport Markdown from 'components/markdown';\n\ntype Props = {\n    action: PostAction;\n    handleAction: (e: React.MouseEvent, options?: PostActionOption[]) => void;\n    disabled?: boolean;\n    theme: Theme;\n    actionExecuting?: boolean;\n    actionExecutingMessage?: string;\n}\n\nexport default class ActionButton extends React.PureComponent<Props> {\n    getStatusColors(theme: Theme) {\n        return {\n            good: '#00c100',\n            warning: '#dede01',\n            danger: theme.errorTextColor,\n            default: theme.centerChannelColor,\n            primary: theme.buttonBg,\n            success: theme.onlineIndicator,\n        } as Dictionary<string>;\n    }\n\n    render() {\n        const {action, handleAction, disabled, theme} = this.props;\n        let customButtonStyle;\n\n        if (action.style) {\n            const STATUS_COLORS = this.getStatusColors(theme);\n            const hexColor =\n                STATUS_COLORS[action.style] ||\n                theme[action.style] ||\n                (action.style.match('^#(?:[0-9a-fA-F]{3}){1,2}$') && action.style);\n\n            if (hexColor) {\n                customButtonStyle = {\n                    borderColor: changeOpacity(hexColor, 0.25),\n                    color: hexColor,\n                    borderWidth: 2,\n                };\n            }\n        }\n\n        return (\n            <button\n                data-action-id={action.id}\n                data-action-cookie={action.cookie}\n                disabled={disabled}\n                key={action.id}\n                onClick={(e) => handleAction(e, this.props.action.options)}\n                style={customButtonStyle}\n            >\n                <LoadingWrapper\n                    loading={this.props.actionExecuting}\n                    text={this.props.actionExecutingMessage}\n                >\n                    <Markdown\n                        message={action.name}\n                        options={{\n                            mentionHighlight: false,\n                            markdown: false,\n                            autolinkedUrlSchemes: [],\n                        }}\n                    />\n                </LoadingWrapper>\n            </button>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport ActionButton from './action_button';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        theme: getTheme(state),\n    };\n}\n\nexport default connect(mapStateToProps)(ActionButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {ActionResult, DispatchFunc, GetStateFunc} from 'mattermost-redux/types/actions';\nimport {PostAction} from 'mattermost-redux/types/integration_actions';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {ServerError} from 'mattermost-redux/types/errors';\n\nimport MenuActionProvider from 'components/suggestion/menu_action_provider';\nimport GenericUserProvider from 'components/suggestion/generic_user_provider.jsx';\nimport GenericChannelProvider from 'components/suggestion/generic_channel_provider.jsx';\nimport AutocompleteSelector from 'components/autocomplete_selector';\nimport PostContext from 'components/post_view/post_context';\n\ntype Error = ServerError & {id: string};\n\ntype AutocompleteUsersAction =\n    (username: string) => (doDispatch: DispatchFunc) => Promise<UserProfile[]>;\n\ntype AutocompleteChannelsAction = (\n    term: string,\n    success: (channels: Channel[]) => void,\n    error: (error: Error) => void\n) => (dispatch: DispatchFunc, getState: GetStateFunc) => Promise<ActionResult>;\n\ntype SelectAttachmentMenuAction = (\n    postId: string,\n    actionId: string,\n    cookie: string,\n    dataSource: string | undefined,\n    text: string,\n    value: string\n) => (dispatch: DispatchFunc) => Promise<ActionResult>;\n\ntype Option = {\n    text: string;\n    value: string;\n};\n\ntype Provider = GenericUserProvider | GenericChannelProvider | MenuActionProvider;\n\ntype Selected = Option | UserProfile | Channel;\n\nexport type Props = {\n    postId: string;\n    action: PostAction;\n    selected?: Selected;\n    disabled?: boolean;\n    actions: {\n        autocompleteChannels: AutocompleteChannelsAction;\n        selectAttachmentMenuAction: SelectAttachmentMenuAction;\n        autocompleteUsers: AutocompleteUsersAction;\n    };\n};\n\ntype State = {\n    selected?: Selected;\n    value: string;\n};\n\nexport default class ActionMenu extends React.PureComponent<Props, State> {\n    private providers: Provider[];\n\n    constructor(props: Props) {\n        super(props);\n\n        const action = props.action;\n        this.providers = [];\n        if (action) {\n            if (action.data_source === 'users') {\n                this.providers = [new GenericUserProvider(props.actions.autocompleteUsers)];\n            } else if (action.data_source === 'channels') {\n                this.providers = [new GenericChannelProvider(props.actions.autocompleteChannels)];\n            } else if (action.options) {\n                this.providers = [new MenuActionProvider(action.options)];\n            }\n        }\n\n        let selected;\n        let value = '';\n\n        if (action.default_option && action.options) {\n            selected = action.options.find((option) => option.value === action.default_option);\n            value = selected ? selected.text : '';\n        }\n\n        this.state = {\n            selected,\n            value,\n        };\n    }\n\n    static getDerivedStateFromProps(props: Props, state: State) {\n        if (props.selected && props.selected !== state.selected) {\n            const selected = props.selected as Option;\n            return {\n                value: selected.text,\n                selected: props.selected,\n            };\n        }\n\n        return null;\n    }\n\n    handleSelected = (selected: Selected) => {\n        if (!selected) {\n            return;\n        }\n\n        const {action} = this.props;\n\n        let value = '';\n        let text = '';\n        if (action.data_source === 'users') {\n            const user = selected as UserProfile;\n            text = user.username;\n            value = user.id;\n        } else if (action.data_source === 'channels') {\n            const channel = selected as Channel;\n            text = channel.display_name;\n            value = channel.id;\n        } else {\n            const option = selected as Option;\n            text = option.text;\n            value = option.value;\n        }\n\n        this.props.actions.selectAttachmentMenuAction(\n            this.props.postId, this.props.action.id || '', this.props.action.cookie || '', this.props.action?.data_source, text, value);\n\n        this.setState({value: text});\n    }\n\n    render() {\n        const {action, disabled} = this.props;\n\n        return (\n            <PostContext.Consumer>\n                {({handlePopupOpened}) => (\n                    <AutocompleteSelector\n                        providers={this.providers}\n                        onSelected={this.handleSelected}\n                        placeholder={action.name}\n                        inputClassName='post-attachment-dropdown'\n                        value={this.state.value}\n                        toggleFocus={handlePopupOpened}\n                        disabled={disabled}\n                    />\n                )}\n            </PostContext.Consumer>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {PostAction} from 'mattermost-redux/types/integration_actions';\n\nimport {GlobalState} from 'types/store';\nimport {autocompleteChannels} from 'actions/channel_actions';\nimport {autocompleteUsers} from 'actions/user_actions';\nimport {selectAttachmentMenuAction} from 'actions/views/posts';\n\nimport ActionMenu from './action_menu';\n\ntype OwnProps = {\n    postId: string;\n    action: PostAction;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const actions = state.views.posts.menuActions[ownProps.postId];\n    const selected = (ownProps.action && ownProps.action.id) ? actions && actions[ownProps.action && ownProps.action.id] : undefined;\n\n    return {\n        selected,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            selectAttachmentMenuAction,\n            autocompleteChannels,\n            autocompleteUsers,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ActionMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport React, {CSSProperties} from 'react';\nimport truncate from 'lodash/truncate';\n\nimport {ActionResult} from 'mattermost-redux/types/actions';\nimport {PostAction, PostActionOption} from 'mattermost-redux/types/integration_actions';\nimport {MessageAttachment as MessageAttachmentType, MessageAttachmentField} from 'mattermost-redux/types/message_attachments';\nimport {Dictionary} from 'mattermost-redux/types/utilities';\nimport {PostImage} from 'mattermost-redux/types/posts';\n\nimport {isUrlSafe} from 'utils/url';\nimport {Constants} from 'utils/constants';\nimport * as Utils from 'utils/utils';\nimport LinkOnlyRenderer from 'utils/markdown/link_only_renderer';\nimport {TextFormattingOptions} from 'utils/text_formatting';\n\nimport ExternalImage from 'components/external_image';\nimport Markdown from 'components/markdown';\nimport ShowMore from 'components/post_view/show_more';\nimport SizeAwareImage from 'components/size_aware_image';\n\nimport ActionButton from '../action_button';\nimport ActionMenu from '../action_menu';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\ntype Props = {\n\n    /**\n     * The post id\n     */\n    postId: string;\n\n    /**\n     * The attachment to render\n     */\n    attachment: MessageAttachmentType;\n\n    /**\n     * Options specific to text formatting\n     */\n    options?: Partial<TextFormattingOptions>;\n\n    /**\n     * images object for dimensions\n     */\n    imagesMetadata?: Dictionary<PostImage>;\n\n    actions: {\n        doPostActionWithCookie: (postId: string, actionId: string, actionCookie: string, selectedOption?: string) => Promise<ActionResult>;\n    };\n\n    currentRelativeTeamUrl: string;\n}\n\ntype State = {\n    checkOverflow: number;\n    actionExecuting: boolean;\n    actionExecutingMessage: string | null;\n}\n\nexport default class MessageAttachment extends React.PureComponent<Props, State> {\n    private mounted = false;\n    private imageProps = {};\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            checkOverflow: 0,\n            actionExecuting: false,\n            actionExecutingMessage: null,\n        };\n\n        this.imageProps = {\n            onImageLoaded: this.handleHeightReceived,\n            onImageHeightChanged: this.checkPostOverflow,\n        };\n    }\n\n    componentDidMount() {\n        this.mounted = true;\n    }\n\n    componentWillUnmount() {\n        this.mounted = false;\n    }\n\n    handleHeightReceivedForThumbUrl = ({height}: {height: number}) => {\n        const {attachment} = this.props;\n        if (!this.props.imagesMetadata || (this.props.imagesMetadata && !this.props.imagesMetadata[attachment.thumb_url])) {\n            this.handleHeightReceived(height);\n        }\n    }\n\n    handleHeightReceivedForImageUrl = ({height}: {height: number}) => {\n        const {attachment} = this.props;\n        if (!this.props.imagesMetadata || (this.props.imagesMetadata && !this.props.imagesMetadata[attachment.image_url])) {\n            this.handleHeightReceived(height);\n        }\n    }\n\n    handleHeightReceived = (height: number) => {\n        if (!this.mounted) {\n            return;\n        }\n\n        if (height > 0) {\n            this.checkPostOverflow();\n        }\n    };\n\n    checkPostOverflow = () => {\n        // Increment checkOverflow to indicate change in height\n        // and recompute textContainer height at ShowMore component\n        // and see whether overflow text of show more/less is necessary or not.\n        this.setState((prevState) => {\n            return {checkOverflow: prevState.checkOverflow + 1};\n        });\n    }\n\n    renderPostActions = () => {\n        const actions = this.props.attachment.actions;\n        if (!actions || !actions.length) {\n            return '';\n        }\n\n        const content = [] as JSX.Element[];\n\n        actions.forEach((action: PostAction) => {\n            if (!action.id || !action.name) {\n                return;\n            }\n\n            switch (action.type) {\n            case 'select':\n                content.push(\n                    <ActionMenu\n                        key={action.id}\n                        postId={this.props.postId}\n                        action={action}\n                        disabled={action.disabled}\n                    />,\n                );\n                break;\n            case 'button':\n            default:\n                content.push(\n                    <ActionButton\n                        key={action.id}\n                        action={action}\n                        disabled={action.disabled}\n                        handleAction={this.handleAction}\n                        actionExecuting={this.state.actionExecuting}\n                        actionExecutingMessage={this.state.actionExecutingMessage || undefined}\n                    />,\n                );\n                break;\n            }\n        });\n\n        return (\n            <div\n                className='attachment-actions'\n            >\n                {content}\n            </div>\n        );\n    };\n\n    handleAction = (e: React.MouseEvent, actionOptions?: PostActionOption[]) => {\n        e.preventDefault();\n\n        const actionExecutingMessage = this.getActionOption(actionOptions, 'ActionExecutingMessage');\n        if (actionExecutingMessage) {\n            this.setState({actionExecuting: true, actionExecutingMessage: actionExecutingMessage.value});\n        }\n\n        const trackOption = this.getActionOption(actionOptions, 'TrackEventId');\n        if (trackOption) {\n            trackEvent('admin', 'click_warn_metric_bot_id', {metric: trackOption.value});\n        }\n\n        const actionId = e.currentTarget.getAttribute('data-action-id') || '';\n        const actionCookie = e.currentTarget.getAttribute('data-action-cookie') || '';\n\n        this.props.actions.doPostActionWithCookie(this.props.postId, actionId, actionCookie).then(() => {\n            this.handleCustomActions(actionOptions);\n            if (actionExecutingMessage) {\n                this.setState({actionExecuting: false, actionExecutingMessage: null});\n            }\n        });\n    };\n\n    handleCustomActions = (actionOptions?: PostActionOption[]) => {\n        const extUrlOption = this.getActionOption(actionOptions, 'WarnMetricMailtoUrl');\n        if (extUrlOption) {\n            const mailtoPayload = JSON.parse(extUrlOption.value);\n            window.location.href = 'mailto:' + mailtoPayload.mail_recipient + '?cc=' + mailtoPayload.mail_cc + '&subject=' + encodeURIComponent(mailtoPayload.mail_subject) + '&body=' + encodeURIComponent(mailtoPayload.mail_body);\n        }\n    }\n\n    getActionOption = (actionOptions: PostActionOption[] | undefined, optionName: string) => {\n        let opt = null;\n        if (actionOptions) {\n            opt = actionOptions.find((option) => option.text === optionName);\n        }\n        return opt;\n    }\n\n    getFieldsTable = () => {\n        const fields = this.props.attachment.fields;\n        if (!fields || !fields.length) {\n            return '';\n        }\n\n        const fieldTables = [];\n\n        let headerCols = [] as JSX.Element[];\n        let bodyCols = [] as JSX.Element[];\n        let rowPos = 0;\n        let lastWasLong = false;\n        let nrTables = 0;\n        const markdown = {markdown: false, mentionHighlight: false};\n\n        fields.forEach((field: MessageAttachmentField, i: number) => {\n            if (rowPos === 2 || !(field.short === true) || lastWasLong) {\n                fieldTables.push(\n                    <table\n                        className='attachment-fields'\n                        key={'attachment__table__' + nrTables}\n                    >\n                        <thead>\n                            <tr>\n                                {headerCols}\n                            </tr>\n                        </thead>\n                        <tbody>\n                            <tr>\n                                {bodyCols}\n                            </tr>\n                        </tbody>\n                    </table>,\n                );\n                headerCols = [];\n                bodyCols = [];\n                rowPos = 0;\n                nrTables += 1;\n                lastWasLong = false;\n            }\n            headerCols.push(\n                <th\n                    className='attachment-field__caption'\n                    key={'attachment__field-caption-' + i + '__' + nrTables}\n                >\n                    <Markdown\n                        message={field.title}\n                        options={markdown}\n                        postId={this.props.postId}\n                    />\n                </th>,\n            );\n\n            bodyCols.push(\n                <td\n                    className='attachment-field'\n                    key={'attachment__field-' + i + '__' + nrTables}\n                >\n                    <Markdown\n                        message={String(field.value)}\n                        postId={this.props.postId}\n                    />\n                </td>,\n            );\n            rowPos += 1;\n            lastWasLong = !(field.short === true);\n        });\n        if (headerCols.length > 0) { // Flush last fields\n            fieldTables.push(\n                <table\n                    className='attachment-fields'\n                    key={'attachment__table__' + nrTables}\n                >\n                    <thead>\n                        <tr>\n                            {headerCols}\n                        </tr>\n                    </thead>\n                    <tbody>\n                        <tr>\n                            {bodyCols}\n                        </tr>\n                    </tbody>\n                </table>,\n            );\n        }\n        return (\n            <div>\n                {fieldTables}\n            </div>\n        );\n    };\n\n    handleFormattedTextClick = (e: React.MouseEvent) => Utils.handleFormattedTextClick(e, this.props.currentRelativeTeamUrl);\n\n    render() {\n        const {attachment, options} = this.props;\n        let preTextClass = '';\n\n        let preText;\n        if (attachment.pretext) {\n            preTextClass = 'attachment--pretext';\n            preText = (\n                <div className='attachment__thumb-pretext'>\n                    <Markdown\n                        message={attachment.pretext}\n                        postId={this.props.postId}\n                    />\n                </div>\n            );\n        }\n\n        let author = [] as JSX.Element[];\n        if (attachment.author_name || attachment.author_icon) {\n            if (attachment.author_icon) {\n                author.push(\n                    <ExternalImage\n                        key={'attachment__author-icon'}\n                        src={attachment.author_icon}\n                        imageMetadata={this.props.imagesMetadata && this.props.imagesMetadata[attachment.author_icon]}\n                    >\n                        {(iconUrl) => (\n                            <img\n                                alt={'attachment author icon'}\n                                className='attachment__author-icon'\n                                src={iconUrl}\n                                height='14'\n                                width='14'\n                            />\n                        )}\n                    </ExternalImage>,\n                );\n            }\n            if (attachment.author_name) {\n                author.push(\n                    <span\n                        className='attachment__author-name'\n                        key={'attachment__author-name'}\n                    >\n                        {attachment.author_name}\n                    </span>,\n                );\n            }\n        }\n        if (attachment.author_link && isUrlSafe(attachment.author_link)) {\n            author = [(\n                <a\n                    href={attachment.author_link}\n                    target='_blank'\n                    rel='noopener noreferrer'\n                    key={'attachment__author-name'}\n                >\n                    {author}\n                </a>\n            )];\n        }\n\n        let title;\n        if (attachment.title) {\n            if (attachment.title_link && isUrlSafe(attachment.title_link)) {\n                title = (\n                    <h1 className='attachment__title'>\n                        <a\n                            className='attachment__title-link'\n                            href={attachment.title_link}\n                            target='_blank'\n                            rel='noopener noreferrer'\n                        >\n                            {attachment.title}\n                        </a>\n                    </h1>\n                );\n            } else {\n                title = (\n                    <h1 className='attachment__title'>\n                        <Markdown\n                            message={attachment.title}\n                            options={{\n                                mentionHighlight: false,\n                                renderer: new LinkOnlyRenderer(),\n                                autolinkedUrlSchemes: [],\n                            }}\n                            postId={this.props.postId}\n                        />\n                    </h1>\n                );\n            }\n        }\n\n        let attachmentText;\n        if (attachment.text) {\n            attachmentText = (\n                <ShowMore\n                    checkOverflow={this.state.checkOverflow}\n                    isAttachmentText={true}\n                    text={attachment.text}\n                    maxHeight={200}\n                >\n                    <Markdown\n                        message={attachment.text || ''}\n                        options={options}\n                        postId={this.props.postId}\n                        imageProps={this.imageProps}\n                    />\n                </ShowMore>\n            );\n        }\n\n        let image;\n        if (attachment.image_url) {\n            const imageMetadata = this.props.imagesMetadata && this.props.imagesMetadata[attachment.image_url];\n\n            image = (\n                <div className='attachment__image-container'>\n                    <ExternalImage\n                        src={attachment.image_url}\n                        imageMetadata={imageMetadata}\n                    >\n                        {(imageUrl) => (\n                            <SizeAwareImage\n                                className='attachment__image'\n                                onImageLoaded={this.handleHeightReceivedForImageUrl}\n                                src={imageUrl}\n                                dimensions={imageMetadata}\n                            />\n                        )}\n                    </ExternalImage>\n                </div>\n            );\n        }\n\n        let footer;\n        if (attachment.footer) {\n            let footerIcon;\n            if (attachment.footer_icon) {\n                const footerIconMetadata = this.props.imagesMetadata && this.props.imagesMetadata[attachment.footer_icon];\n\n                footerIcon = (\n                    <ExternalImage\n                        src={attachment.footer_icon}\n                        imageMetadata={footerIconMetadata}\n                    >\n                        {(footerIconUrl) => (\n                            <img\n                                alt={'attachment footer icon'}\n                                className='attachment__footer-icon'\n                                src={footerIconUrl}\n                                height='16'\n                                width='16'\n                            />\n                        )}\n                    </ExternalImage>\n                );\n            }\n\n            footer = (\n                <div className='attachment__footer-container'>\n                    {footerIcon}\n                    <span>{truncate(attachment.footer, {length: Constants.MAX_ATTACHMENT_FOOTER_LENGTH, omission: '…'})}</span>\n                </div>\n            );\n        }\n\n        let thumb;\n        if (attachment.thumb_url) {\n            const thumbMetadata = this.props.imagesMetadata && this.props.imagesMetadata[attachment.thumb_url];\n\n            thumb = (\n                <div className='attachment__thumb-container'>\n                    <ExternalImage\n                        src={attachment.thumb_url}\n                        imageMetadata={thumbMetadata}\n                    >\n                        {(thumbUrl) => (\n                            <SizeAwareImage\n                                onImageLoaded={this.handleHeightReceivedForThumbUrl}\n                                src={thumbUrl}\n                                dimensions={thumbMetadata}\n                            />\n                        )}\n                    </ExternalImage>\n                </div>\n            );\n        }\n\n        const fields = this.getFieldsTable();\n        const actions = this.renderPostActions();\n\n        let useBorderStyle;\n        if (attachment.color && attachment.color[0] === '#') {\n            useBorderStyle = {borderLeftColor: attachment.color};\n        }\n\n        return (\n            <div\n                className={'attachment ' + preTextClass}\n                ref='attachment'\n                onClick={this.handleFormattedTextClick}\n            >\n                {preText}\n                <div className='attachment__content'>\n                    <div\n                        className={useBorderStyle ? 'clearfix attachment__container' : 'clearfix attachment__container attachment__container--' + attachment.color}\n                        style={useBorderStyle}\n                    >\n                        {author}\n                        {title}\n                        <div>\n                            <div\n                                className={thumb ? 'attachment__body' : 'attachment__body attachment__body--no_thumb'}\n                            >\n                                {attachmentText}\n                                {image}\n                                {fields}\n                                {footer}\n                                {actions}\n                            </div>\n                            {thumb}\n                            <div style={style.footer}/>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n\nconst style = {\n    footer: {clear: 'both'} as CSSProperties,\n};\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {doPostActionWithCookie} from 'mattermost-redux/actions/posts';\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {ActionFunc, ActionResult, GenericAction} from 'mattermost-redux/types/actions';\n\nimport MessageAttachment from './message_attachment';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        currentRelativeTeamUrl: getCurrentRelativeTeamUrl(state),\n    };\n}\n\ntype Actions = {\n    doPostActionWithCookie: (postId: string, actionId: string, actionCookie: string, selectedOption?: string | undefined) => Promise<ActionResult>;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            doPostActionWithCookie,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MessageAttachment);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\n\nimport {MessageAttachment as MessageAttachmentType} from 'mattermost-redux/types/message_attachments';\nimport {PostImage} from 'mattermost-redux/types/posts';\nimport {Dictionary} from 'mattermost-redux/types/utilities';\n\nimport {TextFormattingOptions} from 'utils/text_formatting';\n\nimport MessageAttachment from './message_attachment';\n\ntype Props = {\n\n    /**\n     * The post id\n     */\n    postId: string;\n\n    /**\n     * Array of attachments to render\n     */\n    attachments: MessageAttachmentType[];\n\n    /**\n     * Options specific to text formatting\n     */\n    options?: Partial<TextFormattingOptions>;\n\n    /**\n     * Images object used for creating placeholders to prevent scroll popup\n     */\n    imagesMetadata?: Dictionary<PostImage>;\n}\n\nexport default class MessageAttachmentList extends React.PureComponent<Props> {\n    static defaultProps = {\n        imagesMetadata: {},\n    }\n\n    render() {\n        const content = [] as JSX.Element[];\n        this.props.attachments.forEach((attachment, i) => {\n            content.push(\n                <MessageAttachment\n                    attachment={attachment}\n                    postId={this.props.postId}\n                    key={'att_' + i}\n                    options={this.props.options}\n                    imagesMetadata={this.props.imagesMetadata}\n                />,\n            );\n        });\n\n        return (\n            <div\n                id={`messageAttachmentList_${this.props.postId}`}\n                className='attachment__list'\n            >\n                {content}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\ntype Point = {\n    height: number;\n    width: number;\n};\n\ntype PartialPoint = Partial<Point>;\n\nfunction isPointDefined(point: PartialPoint): point is Point {\n    return point.height !== undefined && point.width !== undefined;\n}\n\nexport function getDistanceBW2Points(point1: Point, point2: Point) {\n    return Math.sqrt(Math.pow(point1.width - point2.width, 2) + Math.pow(point1.height - point2.height, 2));\n}\n\n/**\n * Funtion to return nearest point of given pivot point.\n * It return two points one nearest and other nearest but having both coorditanes smaller than the given point's coordinates.\n */\nexport function getNearestPoint<T extends PartialPoint>(pivot: Point, points: T[]): T {\n    return points.reduce((nearest, point) => {\n        if (isPointDefined(nearest) && isPointDefined(point) &&\n            getDistanceBW2Points(point, pivot) >= getDistanceBW2Points(nearest, pivot)) {\n            return nearest;\n        }\n        return point;\n    }, {} as T);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {\n    OpenGraphMetadata,\n    OpenGraphMetadataImage,\n    Post,\n    PostImage,\n} from 'mattermost-redux/types/posts';\nimport {Dictionary} from 'mattermost-redux/types/utilities';\n\nimport SizeAwareImage from 'components/size_aware_image';\nimport ExternalImage from 'components/external_image';\nimport {PostTypes} from 'utils/constants';\nimport {isSystemMessage} from 'utils/post_utils';\nimport {useSafeUrl} from 'utils/url';\n\nimport {getNearestPoint} from './get_nearest_point';\n\nconst DIMENSIONS_NEAREST_POINT_IMAGE = {\n    height: 80,\n    width: 80,\n};\n\nexport type Props = {\n    postId: string;\n    link: string;\n    currentUserId?: string;\n    post: Post;\n    openGraphData?: OpenGraphMetadata;\n    enableLinkPreviews?: boolean;\n    previewEnabled?: boolean;\n    isEmbedVisible?: boolean;\n    toggleEmbedVisibility: () => void;\n    actions: {\n        editPost: (post: { id: string; props: Record<string, any> }) => void;\n    };\n};\n\nexport default class PostAttachmentOpenGraph extends React.PureComponent<Props> {\n    getImageMetadata = (imageUrl?: string) => {\n        if (!imageUrl) {\n            return undefined;\n        }\n\n        const imagesMetadata = this.props.post.metadata.images;\n        if (!imagesMetadata) {\n            return undefined;\n        }\n\n        return imagesMetadata[imageUrl];\n    };\n\n    isLargeImage = (dimensions?: PostImage) => {\n        if (!dimensions) {\n            return false;\n        }\n\n        const {height, width} = dimensions;\n\n        const largeImageMinRatio = 16 / 9;\n        const largeImageMinWidth = 150;\n\n        const imageRatio = width / height;\n\n        return width >= largeImageMinWidth && imageRatio >= largeImageMinRatio;\n    };\n\n    renderImageToggle() {\n        return (\n            <button\n                className={'style--none post__embed-visibility color--link'}\n                data-expanded={this.props.isEmbedVisible}\n                aria-label='Toggle Embed Visibility'\n                onClick={this.props.toggleEmbedVisibility}\n            />\n        );\n    }\n\n    renderLargeImage(imageUrl: string, imageMetadata?: PostImage) {\n        if (!this.props.isEmbedVisible) {\n            return undefined;\n        }\n\n        return (\n            <ExternalImage\n                src={imageUrl}\n                imageMetadata={imageMetadata}\n            >\n                {(safeImageUrl: string) => (\n                    <SizeAwareImage\n                        className='attachment__image attachment__image--opengraph large_image'\n                        src={safeImageUrl}\n                        dimensions={imageMetadata}\n                    />\n                )}\n            </ExternalImage>\n        );\n    }\n\n    renderSmallImage(imageUrl: string, imageMetadata?: PostImage) {\n        if (!this.props.isEmbedVisible) {\n            return undefined;\n        }\n\n        return (\n            <div className='attachment__image__container--opengraph'>\n                <ExternalImage\n                    src={imageUrl}\n                    imageMetadata={imageMetadata}\n                >\n                    {(safeImageUrl: string) => (\n                        <SizeAwareImage\n                            className='attachment__image attachment__image--opengraph'\n                            src={safeImageUrl}\n                            dimensions={imageMetadata}\n                        />\n                    )}\n                </ExternalImage>\n            </div>\n        );\n    }\n\n    truncateText(text?: string) {\n        const maxLength = 300;\n        const ellipsis = '...';\n\n        if (text && text.length > maxLength) {\n            return text.substring(0, maxLength - ellipsis.length) + ellipsis;\n        }\n        return text;\n    }\n\n    handleRemovePreview = async () => {\n        const props = Object.assign({}, this.props.post.props);\n        props[PostTypes.REMOVE_LINK_PREVIEW] = 'true';\n\n        const patchedPost = {\n            id: this.props.post.id,\n            props,\n        };\n\n        return this.props.actions.editPost(patchedPost);\n    };\n\n    hasPreviewBeenRemoved() {\n        const {post} = this.props;\n\n        if (!post || !post.props) {\n            return false;\n        }\n\n        return post.props[PostTypes.REMOVE_LINK_PREVIEW] === 'true';\n    }\n\n    render() {\n        if (!this.props.previewEnabled || !this.props.enableLinkPreviews) {\n            return null;\n        }\n\n        if (!this.props.post || isSystemMessage(this.props.post)) {\n            return null;\n        }\n\n        if (this.hasPreviewBeenRemoved()) {\n            return null;\n        }\n\n        const data = this.props.openGraphData;\n        if (!data) {\n            return null;\n        }\n\n        const imageUrl = getBestImageUrl(data, this.props.post.metadata.images);\n        const imageMetadata = this.getImageMetadata(imageUrl);\n        const hasLargeImage = this.isLargeImage(imageMetadata);\n\n        let removePreviewButton;\n        if (this.props.currentUserId === this.props.post.user_id) {\n            removePreviewButton = (\n                <button\n                    type='button'\n                    className='btn-close'\n                    aria-label='Close'\n                    onClick={this.handleRemovePreview}\n                    data-testid='removeLinkPreviewButton'\n                >\n                    <span aria-hidden='true'>{'×'}</span>\n                </button>\n            );\n        }\n\n        let body;\n        if (data.description || imageUrl) {\n            body = (\n                <div className={'attachment__body attachment__body--opengraph'}>\n                    <div>\n                        {this.truncateText(data.description)}\n                        {' '}\n                        {imageUrl && hasLargeImage && this.renderImageToggle()}\n                    </div>\n                    {imageUrl && hasLargeImage && this.renderLargeImage(imageUrl, imageMetadata)}\n                </div>\n            );\n        }\n\n        return (\n            <div className='attachment attachment--opengraph'>\n                <div className='attachment__content'>\n                    <div className={'clearfix attachment__container attachment__container--opengraph'}>\n                        <div className={'attachment__body__wrap attachment__body__wrap--opengraph'}>\n                            <span className='sitename'>\n                                {this.truncateText(data.site_name)}\n                            </span>\n                            {removePreviewButton}\n                            <h1 className={'attachment__title attachment__title--opengraph' + (data.title ? '' : ' is-url')}>\n                                <a\n                                    className='attachment__title-link attachment__title-link--opengraph'\n                                    href={useSafeUrl(data.url || this.props.link)}\n                                    target='_blank'\n                                    rel='noopener noreferrer'\n                                    title={data.title || data.url || this.props.link}\n                                >\n                                    {this.truncateText(data.title || data.url || this.props.link)}\n                                </a>\n                            </h1>\n                            {body}\n                        </div>\n                        {imageUrl && !hasLargeImage && this.renderSmallImage(imageUrl, imageMetadata)}\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport function getBestImageUrl(openGraphData?: OpenGraphMetadata, imagesMetadata?: Dictionary<PostImage>) {\n    if (!openGraphData?.images?.length) {\n        return undefined;\n    }\n\n    // Get the dimensions from the post metadata if they weren't provided by the website as part of the OpenGraph data\n    const images = openGraphData.images.map((image: OpenGraphMetadataImage) => {\n        const imageUrl = image.secure_url || image.url;\n\n        if ((image.width && image.height) || !(imagesMetadata && imagesMetadata[imageUrl])) {\n            // The image already includes dimensions or we don't have the missing dimensions\n            return image;\n        }\n\n        return {\n            ...image,\n            height: image.height || imagesMetadata[imageUrl].height,\n            width: image.width || imagesMetadata[imageUrl].width,\n        };\n    });\n\n    const bestImage = getNearestPoint<OpenGraphMetadataImage>(DIMENSIONS_NEAREST_POINT_IMAGE, images);\n    return bestImage.secure_url || bestImage.url;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getOpenGraphMetadataForUrl} from 'mattermost-redux/selectors/entities/posts';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {editPost} from 'actions/views/posts';\nimport {GlobalState} from 'types/store';\nimport {Preferences} from 'utils/constants';\n\nimport PostAttachmentOpenGraph, {Props} from './post_attachment_opengraph';\n\ntype OwnProps = Pick<Props, 'postId' | 'link'>;\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const config = getConfig(state);\n\n    return {\n        currentUserId: getCurrentUserId(state),\n        enableLinkPreviews: config.EnableLinkPreviews === 'true',\n        openGraphData: getOpenGraphMetadataForUrl(\n            state,\n            ownProps.postId,\n            ownProps.link,\n        ),\n        previewEnabled: getBool(\n            state,\n            Preferences.CATEGORY_DISPLAY_SETTINGS,\n            Preferences.LINK_PREVIEW_DISPLAY,\n            true,\n        ),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({editPost}, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PostAttachmentOpenGraph);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport ExternalImage from 'components/external_image';\nimport SizeAwareImage from 'components/size_aware_image';\nimport FilePreviewModal from 'components/file_preview_modal';\n\nexport default class PostImage extends React.PureComponent {\n    static propTypes = {\n        imageMetadata: PropTypes.object.isRequired,\n        link: PropTypes.string.isRequired,\n        post: PropTypes.object.isRequired,\n    }\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            showModal: false,\n        };\n    }\n\n    showModal = (e) => {\n        e.preventDefault();\n\n        this.setState({showModal: true});\n    }\n\n    hideModal = () => {\n        this.setState({showModal: false});\n    }\n\n    render() {\n        return (\n            <div className='post__embed-container'>\n                <ExternalImage\n                    src={this.props.link}\n                    imageMetadata={this.props.imageMetadata}\n                >\n                    {(safeLink) => (\n                        <React.Fragment>\n                            <SizeAwareImage\n                                className='img-div attachment__image cursor--pointer'\n                                src={safeLink}\n                                dimensions={this.props.imageMetadata}\n                                showLoader={true}\n                                onClick={this.showModal}\n                            />\n                            <FilePreviewModal\n                                show={this.state.showModal}\n                                onModalDismissed={this.hideModal}\n                                post={this.props.post}\n                                startIndex={0}\n                                fileInfos={[{\n                                    has_preview_image: false,\n                                    link: safeLink,\n                                    extension: this.props.imageMetadata.format,\n                                    name: this.props.link,\n                                }]}\n                            />\n                        </React.Fragment>\n                    )}\n                </ExternalImage>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PostImage from './post_image.jsx';\n\nexport default PostImage;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport const ytRegex = /(?:http|https):\\/\\/(?:www\\.|m\\.)?(?:(?:youtube\\.com\\/(?:(?:v\\/)|(?:(?:watch|embed\\/watch)(?:\\/|.*v=))|(?:embed\\/)|(?:user\\/[^/]+\\/u\\/[0-9]\\/)))|(?:youtu\\.be\\/))([^#&?]*)/;\n\nexport function handleYoutubeTime(link) {\n    const timeRegex = /[\\\\?&](t|time|start|time_continue)=([0-9]+h)?([0-9]+m)?([0-9]+s?)/;\n\n    const time = link.match(timeRegex);\n    if (!time?.[0]) {\n        return '';\n    }\n\n    const hours = time[2]?.match(/([0-9]+)h/) ?? null;\n    const minutes = time[3]?.match(/([0-9]+)m/) ?? null;\n    const seconds = time[4]?.match(/([0-9]+)s?/) ?? null;\n\n    let startSeconds = 0;\n\n    if (hours?.[1]) {\n        startSeconds += parseInt(hours[1], 10) * 3600;\n    }\n\n    if (minutes?.[1]) {\n        startSeconds += parseInt(minutes[1], 10) * 60;\n    }\n\n    if (seconds?.[1]) {\n        startSeconds += parseInt(seconds[1], 10);\n    }\n\n    return `&start=${startSeconds}`;\n}\n\nexport function getVideoId(link) {\n    const match = link.trim().match(ytRegex);\n    if (!match || match[1].length !== 11) {\n        return null;\n    }\n\n    return match[1];\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\n\nimport {getVideoId, ytRegex, handleYoutubeTime} from 'utils/youtube';\n\nimport ExternalImage from 'components/external_image';\nimport {OpenGraphMetadata} from 'mattermost-redux/types/posts';\n\ntype Props = {\n    postId: string;\n    link: string;\n    show: boolean;\n    metadata?: OpenGraphMetadata;\n}\n\ntype State = {\n    playing: boolean;\n}\n\nexport default class YoutubeVideo extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            playing: false,\n        };\n    }\n\n    static getDerivedStateFromProps(props: Props, state: State): State | null {\n        if (!props.show && state.playing) {\n            return {playing: false};\n        }\n        return null;\n    }\n\n    play = () => {\n        this.setState({playing: true});\n    }\n\n    stop = () => {\n        this.setState({playing: false});\n    }\n\n    render() {\n        const {metadata, link} = this.props;\n\n        const videoId = getVideoId(link);\n        const time = handleYoutubeTime(link);\n\n        const header = (\n            <h4>\n                <span className='video-type'>{'YouTube - '}</span>\n                <span className='video-title'>\n                    <a\n                        href={this.props.link}\n                        target='blank'\n                        rel='noopener noreferrer'\n                    >\n                        {metadata?.title || 'unknown'}\n                    </a>\n                </span>\n            </h4>\n        );\n\n        let content;\n\n        if (this.state.playing) {\n            content = (\n                <iframe\n                    src={'https://www.youtube.com/embed/' + videoId + '?autoplay=1&autohide=1&border=0&wmode=opaque&fs=1&enablejsapi=1' + time}\n                    width='480px'\n                    height='360px'\n                    frameBorder='0'\n                    allowFullScreen={true}\n                />\n            );\n        } else {\n            const image = metadata?.images[0];\n\n            content = (\n                <div className='embed-responsive video-div__placeholder'>\n                    <div className='video-thumbnail__container'>\n                        <ExternalImage src={image?.secure_url || image?.url || ''}>\n                            {(safeUrl) => (\n                                <img\n                                    src={safeUrl}\n                                    alt='youtube video thumbnail'\n                                    className='video-thumbnail'\n                                />\n                            )}\n                        </ExternalImage>\n                        <div className='block'>\n                            <span className='play-button'><span/></span>\n                        </div>\n                    </div>\n                </div>\n            );\n        }\n\n        return (\n            <div\n                className='post__embed-container'\n            >\n                <div>\n                    {header}\n                    <div\n                        className='video-div embed-responsive-item'\n                        onClick={this.play}\n                    >\n                        {content}\n                    </div>\n                </div>\n            </div>\n        );\n    }\n\n    public static isYoutubeLink(link: string): boolean {\n        return Boolean(link.trim().match(ytRegex));\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getOpenGraphMetadataForUrl} from 'mattermost-redux/selectors/entities/posts';\n\nimport {GlobalState} from 'types/store';\n\nimport YoutubeVideo from './youtube_video';\n\ntype OwnProps = {\n    postId: string;\n    link: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const config = getConfig(state);\n\n    return {\n        currentChannelId: getCurrentChannelId(state),\n        googleDeveloperKey: config.GoogleDeveloperKey,\n        hasImageProxy: config.HasImageProxy === 'true',\n        metadata: getOpenGraphMetadataForUrl(state, ownProps.postId, ownProps.link),\n    };\n}\n\nexport default connect(mapStateToProps)(YoutubeVideo);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {injectIntl, IntlShape} from 'react-intl';\n\nimport {AppBinding} from 'mattermost-redux/types/apps';\nimport {ActionResult} from 'mattermost-redux/types/actions';\nimport {AppBindingLocations, AppCallResponseTypes, AppCallTypes, AppExpandLevels} from 'mattermost-redux/constants/apps';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {DoAppCall, PostEphemeralCallResponseForPost} from 'types/apps';\n\nimport Markdown from 'components/markdown';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\nimport {createCallContext, createCallRequest} from 'utils/apps';\n\ntype Props = {\n    intl: IntlShape;\n    binding: AppBinding;\n    post: Post;\n    actions: {\n        doAppCall: DoAppCall;\n        getChannel: (channelId: string) => Promise<ActionResult>;\n        postEphemeralCallResponseForPost: PostEphemeralCallResponseForPost;\n    };\n}\n\ntype State = {\n    executing: boolean;\n}\n\nexport class ButtonBinding extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            executing: false,\n        };\n    }\n\n    handleClick = async () => {\n        const {binding, post, intl} = this.props;\n        if (!binding.call) {\n            return;\n        }\n\n        let teamID = '';\n        const {data} = await this.props.actions.getChannel(post.channel_id) as {data?: any; error?: any};\n        if (data) {\n            const channel = data as Channel;\n            teamID = channel.team_id;\n        }\n\n        const context = createCallContext(\n            binding.app_id,\n            AppBindingLocations.IN_POST + '/' + binding.location,\n            post.channel_id,\n            teamID,\n            post.id,\n            post.root_id,\n        );\n        const call = createCallRequest(\n            binding.call,\n            context,\n            {post: AppExpandLevels.EXPAND_ALL},\n        );\n        this.setState({executing: true});\n        const res = await this.props.actions.doAppCall(call, AppCallTypes.SUBMIT, intl);\n\n        this.setState({executing: false});\n\n        if (res.error) {\n            const errorResponse = res.error;\n            const errorMessage = errorResponse.error || intl.formatMessage({\n                id: 'apps.error.unknown',\n                defaultMessage: 'Unknown error occurred.',\n            });\n            this.props.actions.postEphemeralCallResponseForPost(errorResponse, errorMessage, post);\n            return;\n        }\n\n        const callResp = res.data!;\n        switch (callResp.type) {\n        case AppCallResponseTypes.OK:\n            if (callResp.markdown) {\n                this.props.actions.postEphemeralCallResponseForPost(callResp, callResp.markdown, post);\n            }\n            break;\n        case AppCallResponseTypes.NAVIGATE:\n        case AppCallResponseTypes.FORM:\n            break;\n        default: {\n            const errorMessage = intl.formatMessage({\n                id: 'apps.error.responses.unknown_type',\n                defaultMessage: 'App response type not supported. Response type: {type}.',\n            }, {\n                type: callResp.type,\n            });\n            this.props.actions.postEphemeralCallResponseForPost(callResp, errorMessage, post);\n        }\n        }\n    }\n\n    render() {\n        const {binding} = this.props;\n        let customButtonStyle;\n\n        if (!binding.call) {\n            return null;\n        }\n\n        const label = binding.label || binding.location;\n        if (!label) {\n            return null;\n        }\n\n        return (\n            <button\n                onClick={this.handleClick}\n                style={customButtonStyle}\n            >\n                <LoadingWrapper\n                    loading={this.state.executing}\n                >\n                    <Markdown\n                        message={label}\n                        options={{\n                            mentionHighlight: false,\n                            markdown: false,\n                            autolinkedUrlSchemes: [],\n                        }}\n                    />\n                </LoadingWrapper>\n            </button>\n        );\n    }\n}\n\nexport default injectIntl(ButtonBinding);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {ActionFunc, ActionResult, GenericAction} from 'mattermost-redux/types/actions';\n\nimport {getChannel} from 'mattermost-redux/actions/channels';\n\nimport {DoAppCall, PostEphemeralCallResponseForPost} from 'types/apps';\n\nimport {doAppCall, postEphemeralCallResponseForPost} from 'actions/apps';\n\nimport ButtonBinding from './button_binding';\n\ntype Actions = {\n    doAppCall: DoAppCall;\n    getChannel: (channelId: string) => Promise<ActionResult>;\n    postEphemeralCallResponseForPost: PostEphemeralCallResponseForPost;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            doAppCall,\n            getChannel,\n            postEphemeralCallResponseForPost,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(ButtonBinding);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {injectIntl, IntlShape} from 'react-intl';\n\nimport {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {AppBinding} from 'mattermost-redux/types/apps';\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport {AppBindingLocations, AppCallResponseTypes, AppCallTypes, AppExpandLevels} from 'mattermost-redux/constants/apps';\n\nimport {DoAppCall, PostEphemeralCallResponseForPost} from 'types/apps';\n\nimport MenuActionProvider from 'components/suggestion/menu_action_provider';\nimport AutocompleteSelector from 'components/autocomplete_selector';\nimport PostContext from 'components/post_view/post_context';\nimport {createCallContext, createCallRequest} from 'utils/apps';\n\ntype Option = {\n    text: string;\n    value: string;\n};\n\ntype Props = {\n    intl: IntlShape;\n    post: Post;\n    binding: AppBinding;\n    actions: {\n        doAppCall: DoAppCall;\n        getChannel: (channelId: string) => Promise<ActionResult>;\n        postEphemeralCallResponseForPost: PostEphemeralCallResponseForPost;\n    };\n};\n\ntype State = {\n    selected?: Option;\n};\n\nexport class SelectBinding extends React.PureComponent<Props, State> {\n    private providers: MenuActionProvider[];\n    private nOptions = 0;\n    constructor(props: Props) {\n        super(props);\n\n        const binding = props.binding;\n        this.providers = [];\n        if (binding.bindings) {\n            const options: Array<{text: string; value: string}> = [];\n            const usedLabels: {[label: string]: boolean} = {};\n            const usedValues: {[label: string]: boolean} = {};\n            binding.bindings.forEach((b) => {\n                const label = b.label || b.location;\n                if (!label) {\n                    return;\n                }\n\n                if (!b.location) {\n                    return;\n                }\n\n                if (usedLabels[label]) {\n                    return;\n                }\n\n                if (usedValues[b.location]) {\n                    return;\n                }\n\n                usedLabels[label] = true;\n                usedValues[b.location] = true;\n\n                options.push({text: label, value: b.location});\n            });\n\n            this.nOptions = options.length;\n            this.providers = [new MenuActionProvider(options)];\n        }\n\n        this.state = {};\n    }\n\n    handleSelected = async (selected: Option) => {\n        if (!selected) {\n            return;\n        }\n\n        this.setState({selected});\n        const binding = this.props.binding.bindings?.find((b) => b.location === selected.value);\n        if (!binding) {\n            console.debug('Trying to select element not present in binding.'); //eslint-disable-line no-console\n            return;\n        }\n\n        if (!binding.call) {\n            return;\n        }\n\n        const {post, intl} = this.props;\n\n        let teamID = '';\n        const {data} = await this.props.actions.getChannel(post.channel_id) as {data?: any; error?: any};\n        if (data) {\n            const channel = data as Channel;\n            teamID = channel.team_id;\n        }\n\n        const context = createCallContext(\n            binding.app_id,\n            AppBindingLocations.IN_POST + '/' + binding.location,\n            post.channel_id,\n            teamID,\n            post.id,\n            post.root_id,\n        );\n        const call = createCallRequest(\n            binding.call,\n            context,\n            {post: AppExpandLevels.EXPAND_ALL},\n        );\n\n        const res = await this.props.actions.doAppCall(call, AppCallTypes.SUBMIT, intl);\n\n        if (res.error) {\n            const errorResponse = res.error;\n            const errorMessage = errorResponse.error || intl.formatMessage({\n                id: 'apps.error.unknown',\n                defaultMessage: 'Unknown error occurred.',\n            });\n            this.props.actions.postEphemeralCallResponseForPost(errorResponse, errorMessage, post);\n            return;\n        }\n\n        const callResp = res.data!;\n        switch (callResp.type) {\n        case AppCallResponseTypes.OK:\n            if (callResp.markdown) {\n                this.props.actions.postEphemeralCallResponseForPost(callResp, callResp.markdown, post);\n            }\n            break;\n        case AppCallResponseTypes.NAVIGATE:\n        case AppCallResponseTypes.FORM:\n            break;\n        default: {\n            const errorMessage = this.props.intl.formatMessage({\n                id: 'apps.error.responses.unknown_type',\n                defaultMessage: 'App response type not supported. Response type: {type}.',\n            }, {\n                type: callResp.type,\n            });\n            this.props.actions.postEphemeralCallResponseForPost(callResp, errorMessage, post);\n        }\n        }\n    }\n\n    render() {\n        if (!this.nOptions) {\n            return null;\n        }\n\n        const {binding} = this.props;\n        const label = binding.label || binding.location;\n        if (!label) {\n            return null;\n        }\n\n        return (\n            <PostContext.Consumer>\n                {({handlePopupOpened}) => (\n                    <AutocompleteSelector\n                        providers={this.providers}\n                        onSelected={this.handleSelected}\n                        placeholder={label}\n                        inputClassName='post-attachment-dropdown'\n                        value={this.state.selected?.text}\n                        toggleFocus={handlePopupOpened}\n                    />\n                )}\n            </PostContext.Consumer>\n        );\n    }\n}\n\nexport default injectIntl(SelectBinding);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {ActionFunc, ActionResult, GenericAction} from 'mattermost-redux/types/actions';\n\nimport {getChannel} from 'mattermost-redux/actions/channels';\n\nimport {DoAppCall, PostEphemeralCallResponseForPost} from 'types/apps';\n\nimport {doAppCall, postEphemeralCallResponseForPost} from 'actions/apps';\n\nimport SelectBinding from './select_binding';\n\ntype Actions = {\n    doAppCall: DoAppCall;\n    getChannel: (channelId: string) => Promise<ActionResult>;\n    postEphemeralCallResponseForPost: PostEphemeralCallResponseForPost;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            doAppCall,\n            getChannel,\n            postEphemeralCallResponseForPost,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(SelectBinding);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport React, {CSSProperties} from 'react';\n\nimport {AppBinding} from 'mattermost-redux/types/apps';\n\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport * as Utils from 'utils/utils';\nimport LinkOnlyRenderer from 'utils/markdown/link_only_renderer';\nimport {TextFormattingOptions} from 'utils/text_formatting';\n\nimport Markdown from 'components/markdown';\nimport ShowMore from 'components/post_view/show_more';\n\nimport ButtonBinding from '../button_binding';\nimport SelectBinding from '../select_binding';\n\nimport {cleanBinding} from 'mattermost-redux/utils/apps';\nimport {AppBindingLocations} from 'mattermost-redux/constants/apps';\n\ntype Props = {\n\n    /**\n     * The post id\n     */\n    post: Post;\n\n    /**\n     * The attachment to render\n     */\n    embed: AppBinding;\n\n    /**\n     * Options specific to text formatting\n     */\n    options?: Partial<TextFormattingOptions>;\n\n    currentRelativeTeamUrl: string;\n}\n\ntype State = {\n    checkOverflow: number;\n}\n\nexport default class EmbeddedBinding extends React.PureComponent<Props, State> {\n    private imageProps: Record<string, any>;\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            checkOverflow: 0,\n        };\n\n        this.imageProps = {\n            onImageLoaded: this.handleHeightReceived,\n            onImageHeightChanged: this.checkPostOverflow,\n        };\n    }\n\n    fillBindings = (binding: AppBinding) => {\n        const copiedBindings = JSON.parse(JSON.stringify(binding)) as AppBinding;\n        cleanBinding(copiedBindings, AppBindingLocations.IN_POST);\n        return copiedBindings.bindings;\n    }\n\n    renderBindings = () => {\n        if (!this.props.embed.app_id) {\n            return null;\n        }\n\n        if (!this.props.embed.bindings) {\n            return null;\n        }\n\n        const bindings = this.fillBindings(this.props.embed);\n        if (!bindings || !bindings.length) {\n            return null;\n        }\n\n        const content = [] as JSX.Element[];\n\n        bindings.forEach((binding: AppBinding) => {\n            if (!binding.call || !binding.location) {\n                return;\n            }\n\n            if (binding.bindings && binding.bindings.length > 0) {\n                content.push(\n                    <SelectBinding\n                        key={binding.location}\n                        post={this.props.post}\n                        binding={binding}\n                    />,\n                );\n            } else {\n                content.push(\n                    <ButtonBinding\n                        key={binding.location}\n                        post={this.props.post}\n                        binding={binding}\n                    />,\n                );\n            }\n        });\n\n        return (\n            <div\n                className='attachment-actions'\n            >\n                {content}\n            </div>\n        );\n    };\n\n    handleFormattedTextClick = (e: React.MouseEvent) => Utils.handleFormattedTextClick(e, this.props.currentRelativeTeamUrl);\n\n    checkPostOverflow = () => {\n        // Increment checkOverflow to indicate change in height\n        // and recompute textContainer height at ShowMore component\n        // and see whether overflow text of show more/less is necessary or not.\n        this.setState((prevState) => {\n            return {checkOverflow: prevState.checkOverflow + 1};\n        });\n    }\n\n    handleHeightReceived = (height: number) => {\n        if (height > 0) {\n            this.checkPostOverflow();\n        }\n    };\n\n    render() {\n        const {embed, options} = this.props;\n\n        let title;\n        if (embed.label) {\n            title = (\n                <h1 className='attachment__title'>\n                    <Markdown\n                        message={embed.label}\n                        options={{\n                            mentionHighlight: false,\n                            renderer: new LinkOnlyRenderer(),\n                            autolinkedUrlSchemes: [],\n                        }}\n                        postId={this.props.post.id}\n                    />\n                </h1>\n            );\n        }\n\n        let attachmentText;\n        if (embed.description) {\n            attachmentText = (\n                <ShowMore\n                    isAttachmentText={true}\n                    text={embed.description}\n                    maxHeight={200}\n                >\n                    <Markdown\n                        message={embed.description}\n                        imageProps={this.imageProps}\n                        options={options}\n                        postId={this.props.post.id}\n                    />\n                </ShowMore>\n            );\n        }\n\n        const bindings = this.renderBindings();\n\n        return (\n            <div\n                className={'attachment'}\n                ref='attachment'\n                onClick={this.handleFormattedTextClick}\n            >\n                <div className='attachment__content'>\n                    <div\n                        className={'clearfix attachment__container attachment__container--'}\n                    >\n                        {title}\n                        <div>\n                            <div\n                                className={'attachment__body attachment__body--no_thumb'}\n                            >\n                                {attachmentText}\n                                {bindings}\n                            </div>\n                            <div style={style.footer}/>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n\nconst style = {\n    footer: {clear: 'both'} as CSSProperties,\n};\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport EmbeddedBinding from './embedded_binding';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        currentRelativeTeamUrl: getCurrentRelativeTeamUrl(state),\n    };\n}\n\nexport default connect(mapStateToProps)(EmbeddedBinding);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\n\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {AppBinding} from 'mattermost-redux/types/apps';\n\nimport {TextFormattingOptions} from 'utils/text_formatting';\n\nimport EmbeddedBinding from './embedded_binding';\n\ntype Props = {\n\n    /**\n     * The post id\n     */\n    post: Post;\n\n    /**\n     * Array of attachments to render\n     */\n    embeds: AppBinding[]; // Type App Embed Wrapper\n\n    /**\n     * Options specific to text formatting\n     */\n    options?: Partial<TextFormattingOptions>;\n\n}\n\nexport default class EmbeddedBindings extends React.PureComponent<Props> {\n    static defaultProps = {\n        imagesMetadata: {},\n    }\n\n    render() {\n        const content = [] as JSX.Element[];\n        this.props.embeds.forEach((embed, i) => {\n            content.push(\n                <EmbeddedBinding\n                    embed={embed}\n                    post={this.props.post}\n                    key={'att_' + i}\n                    options={this.props.options}\n                />,\n            );\n        });\n\n        return (\n            <div\n                id={`messageAttachmentList_${this.props.post.id}`}\n                className='attachment__list'\n            >\n                {content}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {useHistory} from 'react-router-dom';\n\nexport type Props = {\n    className?: string;\n    children?: JSX.Element;\n    link: string;\n};\nconst PostAttachmentContainer = (props: Props) => {\n    const {children, className, link} = props;\n    const history = useHistory();\n    const handleOnClick = useCallback((e) => {\n        const {tagName} = e.target;\n        e.stopPropagation();\n        const elements = ['A', 'IMG', 'BUTTON'];\n        if (!elements.includes(tagName) && (e.target.getAttribute('role') !== 'button' && e.target.className !== `attachment attachment--${className}`)) {\n            history.push(link);\n        }\n    }, [history]);\n    return (\n        <div\n            className={`attachment attachment--${className}`}\n            role={'button'}\n            onClick={handleOnClick}\n        >\n            <div className={`attachment__content attachment__content--${className}`}>\n                <div className={`clearfix attachment__container attachment__container--${className}`}>\n                    <div className={`attachment__body__wrap attachment__body__wrap--${className}`}>\n                        {children}\n                    </div>\n                </div>\n            </div>\n        </div>\n    );\n};\n\nexport default PostAttachmentContainer;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport {Post, PostPreviewMetadata} from 'mattermost-redux/types/posts';\nimport UserProfileComponent from 'components/user_profile';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport Avatar from 'components/widgets/users/avatar';\nimport * as PostUtils from 'utils/post_utils';\nimport * as Utils from 'utils/utils';\nimport PostMessageView from 'components/post_view/post_message_view';\n\nimport Timestamp from 'components/timestamp';\nimport PostAttachmentContainer from '../post_attachment_container/post_attachment_container';\nimport MattermostLogo from 'components/widgets/icons/mattermost_logo';\nimport {Constants} from 'utils/constants';\n\nexport type Props = {\n    user: UserProfile | null;\n    previewPost?: Post;\n    metadata: PostPreviewMetadata;\n    hasImageProxy: boolean;\n    enablePostIconOverride: boolean;\n};\n\nconst PostMessagePreview = (props: Props) => {\n    const {user, metadata, previewPost} = props;\n\n    const getPostIconURL = (defaultURL: string, fromAutoResponder: boolean, fromWebhook: boolean): string => {\n        const {enablePostIconOverride, hasImageProxy, previewPost} = props;\n        const postProps = previewPost?.props;\n        let postIconOverrideURL = '';\n        let useUserIcon = '';\n        if (postProps) {\n            postIconOverrideURL = postProps.override_icon_url;\n            useUserIcon = postProps.use_user_icon;\n        }\n\n        if (!fromAutoResponder && fromWebhook && !useUserIcon && enablePostIconOverride) {\n            if (postIconOverrideURL && postIconOverrideURL !== '') {\n                return PostUtils.getImageSrc(postIconOverrideURL, hasImageProxy);\n            }\n            return Constants.DEFAULT_WEBHOOK_LOGO;\n        }\n\n        return defaultURL;\n    };\n\n    if (!previewPost) {\n        return null;\n    }\n\n    const isBot = Boolean(user && user.is_bot);\n    const isSystemMessage = PostUtils.isSystemMessage(previewPost);\n    const fromWebhook = PostUtils.isFromWebhook(previewPost);\n    const fromAutoResponder = PostUtils.fromAutoResponder(previewPost);\n    const profileSrc = Utils.imageURLForUser(user?.id);\n    const src = getPostIconURL(profileSrc, fromAutoResponder, fromWebhook);\n\n    let avatar = (\n        <Avatar\n            size={'sm'}\n            url={src}\n            className={'avatar-post-preview'}\n        />\n    );\n    if (isSystemMessage && !fromWebhook && !isBot) {\n        avatar = (<MattermostLogo className='icon'/>);\n    } else if (user?.id) {\n        avatar = (\n            <Avatar\n                username={user.username}\n                size={'sm'}\n                url={src}\n                className={'avatar-post-preview'}\n            />\n        );\n    }\n\n    return (\n        <PostAttachmentContainer\n            className='permalink'\n            link={`/${metadata.team_name}/pl/${metadata.post_id}`}\n        >\n            <div className='post-preview'>\n                <div className='post-preview__header'>\n                    <div className='col col__name'>\n                        <div className='post__img'>\n                            <span className='profile-icon'>\n                                {avatar}\n                            </span>\n                        </div>\n                    </div>\n                    <div className='col col__name'>\n                        <UserProfileComponent\n                            userId={user?.id}\n                            hasMention={true}\n                            disablePopover={true}\n                            overwriteName={previewPost.props?.override_username || ''}\n                        />\n                    </div>\n                    <div className='col'>\n                        <Timestamp\n                            value={previewPost.create_at}\n                            units={[\n                                'now',\n                                'minute',\n                                'hour',\n                                'day',\n                            ]}\n                            useTime={false}\n                            day={'numeric'}\n                            className='post-preview__time'\n                        />\n                    </div>\n                </div>\n                <PostMessageView\n                    post={previewPost}\n                    overflowType='ellipsis'\n                    maxHeight={105}\n                />\n                <div className='post__preview-footer'>\n                    <p>\n                        <FormattedMessage\n                            id='post_message_preview.channel'\n                            defaultMessage='Originally posted in ~{channel}'\n                            values={{\n                                channel: metadata.channel_display_name,\n                            }}\n                        />\n                    </p>\n                </div>\n            </div>\n        </PostAttachmentContainer>\n    );\n};\n\nexport default PostMessagePreview;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {GlobalState} from 'types/store';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\nimport {Post, PostPreviewMetadata} from 'mattermost-redux/types/posts';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\n\nimport PostMessagePreview from './post_message_preview';\n\ntype Props = {\n    metadata: PostPreviewMetadata;\n    previewPost?: Post;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const config = getConfig(state);\n    let user = null;\n    let previewPost = ownProps.previewPost;\n    if (!previewPost) {\n        previewPost = getPost(state, ownProps.metadata.post_id);\n    }\n    if (previewPost && previewPost.user_id) {\n        user = getUser(state, previewPost.user_id);\n    }\n\n    return {\n        hasImageProxy: config.HasImageProxy === 'true',\n        enablePostIconOverride: config.EnablePostIconOverride === 'true',\n        previewPost,\n        user,\n    };\n}\n\nexport default connect(mapStateToProps)(PostMessagePreview);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {Post, PostEmbed} from 'mattermost-redux/types/posts';\n\nimport {getEmbedFromMetadata} from 'mattermost-redux/utils/post_utils';\nimport {AppBinding} from 'mattermost-redux/types/apps';\n\nimport MessageAttachmentList from 'components/post_view/message_attachments/message_attachment_list';\nimport PostAttachmentOpenGraph from 'components/post_view/post_attachment_opengraph';\nimport PostImage from 'components/post_view/post_image';\nimport YoutubeVideo from 'components/youtube_video';\n\nimport {PostWillRenderEmbedPluginComponent} from 'types/store/plugins';\nimport EmbeddedBindings from '../embedded_bindings/embedded_bindings';\nimport {TextFormattingOptions} from 'utils/text_formatting';\nimport PostMessagePreview from 'components/post_view/post_message_preview';\n\nexport type Props = {\n    post: Post;\n    pluginPostWillRenderEmbedComponents?: PostWillRenderEmbedPluginComponent[];\n    children?: JSX.Element;\n    isEmbedVisible?: boolean;\n    options?: Partial<TextFormattingOptions>;\n    appsEnabled: boolean;\n    actions: {\n        toggleEmbedVisibility: (id: string) => void;\n    };\n};\n\nexport default class PostBodyAdditionalContent extends React.PureComponent<Props> {\n    toggleEmbedVisibility = () => {\n        this.props.actions.toggleEmbedVisibility(this.props.post.id);\n    }\n\n    getEmbed = () => {\n        const {metadata} = this.props.post;\n        return getEmbedFromMetadata(metadata);\n    }\n\n    isEmbedToggleable = (embed: PostEmbed) => {\n        const postWillRenderEmbedComponents = this.props.pluginPostWillRenderEmbedComponents || [];\n        for (const c of postWillRenderEmbedComponents) {\n            if (c.match(embed)) {\n                return Boolean(c.toggleable);\n            }\n        }\n\n        return embed.type === 'image' || (embed.type === 'opengraph' && YoutubeVideo.isYoutubeLink(embed.url));\n    }\n\n    renderEmbed = (embed: PostEmbed) => {\n        const postWillRenderEmbedComponents = this.props.pluginPostWillRenderEmbedComponents || [];\n        for (const c of postWillRenderEmbedComponents) {\n            if (c.match(embed)) {\n                const Component = c.component;\n                return this.props.isEmbedVisible && <Component embed={embed}/>;\n            }\n        }\n        switch (embed.type) {\n        case 'image':\n            if (!this.props.isEmbedVisible) {\n                return null;\n            }\n\n            return (\n                <PostImage\n                    imageMetadata={this.props.post.metadata.images[embed.url]}\n                    link={embed.url}\n                    post={this.props.post}\n                />\n            );\n\n        case 'message_attachment': {\n            let attachments = [];\n            if (this.props.post.props && this.props.post.props.attachments) {\n                attachments = this.props.post.props.attachments;\n            }\n\n            return (\n                <MessageAttachmentList\n                    attachments={attachments}\n                    postId={this.props.post.id}\n                    options={this.props.options}\n                    imagesMetadata={this.props.post.metadata.images}\n                />\n            );\n        }\n\n        case 'opengraph':\n            if (YoutubeVideo.isYoutubeLink(embed.url)) {\n                if (!this.props.isEmbedVisible) {\n                    return null;\n                }\n\n                return (\n                    <YoutubeVideo\n                        postId={this.props.post.id}\n                        link={embed.url}\n                        show={this.props.isEmbedVisible}\n                    />\n                );\n            }\n\n            return (\n                <PostAttachmentOpenGraph\n                    postId={this.props.post.id}\n                    link={embed.url}\n                    isEmbedVisible={this.props.isEmbedVisible}\n                    post={this.props.post}\n                    toggleEmbedVisibility={this.toggleEmbedVisibility}\n                />\n            );\n        case 'permalink':\n            if (embed.data && 'post_id' in embed.data && embed.data.post_id) {\n                return (\n                    <PostMessagePreview\n                        metadata={embed.data}\n                    />\n                );\n            }\n            return null;\n        default:\n            return null;\n        }\n    }\n\n    renderToggle = (prependToggle: boolean) => {\n        return (\n            <button\n                key='toggle'\n                className={`style--none post__embed-visibility color--link ${prependToggle ? 'pull-left' : ''}`}\n                data-expanded={this.props.isEmbedVisible}\n                aria-label='Toggle Embed Visibility'\n                onClick={this.toggleEmbedVisibility}\n            />\n        );\n    }\n\n    render() {\n        const embed = this.getEmbed();\n\n        if (this.props.appsEnabled) {\n            if (hasValidEmbeddedBinding(this.props.post.props)) {\n                // TODO Put some log / message if the form is not valid?\n                return (\n                    <React.Fragment>\n                        {this.props.children}\n                        <EmbeddedBindings\n                            embeds={this.props.post.props.app_bindings}\n                            post={this.props.post}\n                        />\n                    </React.Fragment>\n                );\n            }\n        }\n\n        if (embed) {\n            const toggleable = this.isEmbedToggleable(embed);\n            const prependToggle = (/^\\s*https?:\\/\\/.*$/).test(this.props.post.message);\n\n            return (\n                <div>\n                    {(toggleable && prependToggle) && this.renderToggle(true)}\n                    {this.props.children}\n                    {(toggleable && !prependToggle) && this.renderToggle(false)}\n                    {this.renderEmbed(embed)}\n                </div>\n            );\n        }\n\n        return this.props.children;\n    }\n}\n\nfunction hasValidEmbeddedBinding(props: Record<string, any>) {\n    if (!props) {\n        return false;\n    }\n\n    if (!props.app_bindings) {\n        return false;\n    }\n\n    const embeds = props.app_bindings as AppBinding[];\n\n    if (!embeds.length) {\n        return false;\n    }\n\n    return true;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\n\nimport {toggleEmbedVisibility} from 'actions/post_actions';\nimport {isEmbedVisible} from 'selectors/posts';\nimport {GlobalState} from 'types/store';\nimport {PostWillRenderEmbedPluginComponent} from 'types/store/plugins';\n\nimport PostBodyAdditionalContent, {\n    Props,\n} from './post_body_additional_content';\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    return {\n        isEmbedVisible: isEmbedVisible(state, ownProps.post.id),\n        pluginPostWillRenderEmbedComponents: state.plugins.components.PostWillRenderEmbedComponent as unknown as PostWillRenderEmbedPluginComponent[],\n        appsEnabled: appsEnabled(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({toggleEmbedVisibility}, dispatch),\n    };\n}\n\nexport default connect(\n    mapStateToProps,\n    mapDispatchToProps,\n)(PostBodyAdditionalContent);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nconst PostContext = React.createContext({\n\n    // Post component event handler that should be\n    // called when any child component opens/closes a\n    // popup type component.\n    handlePopupOpened: null,\n});\n\nexport default PostContext;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\nimport classNames from 'classnames';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport FlagIcon from 'components/widgets/icons/flag_icon';\nimport FlagIconFilled from 'components/widgets/icons/flag_icon_filled';\nimport Constants, {Locations, A11yCustomEventTypes} from 'utils/constants';\nimport {localizeMessage} from 'utils/utils.jsx';\nimport {t} from 'utils/i18n';\n\nexport default class PostFlagIcon extends React.PureComponent {\n    static propTypes = {\n        location: PropTypes.oneOf([Locations.CENTER, Locations.RHS_ROOT, Locations.RHS_COMMENT, Locations.SEARCH]).isRequired,\n        postId: PropTypes.string.isRequired,\n        isFlagged: PropTypes.bool.isRequired,\n        actions: PropTypes.shape({\n            flagPost: PropTypes.func.isRequired,\n            unflagPost: PropTypes.func.isRequired,\n        }).isRequired,\n    };\n\n    static defaultProps = {\n        location: Locations.CENTER,\n    };\n\n    constructor() {\n        super();\n\n        this.buttonRef = React.createRef();\n\n        this.state = {\n            a11yActive: false,\n        };\n    }\n\n    componentDidMount() {\n        if (this.buttonRef.current) {\n            this.buttonRef.current.addEventListener(A11yCustomEventTypes.ACTIVATE, this.handleA11yActivateEvent);\n            this.buttonRef.current.addEventListener(A11yCustomEventTypes.DEACTIVATE, this.handleA11yDeactivateEvent);\n        }\n    }\n    componentWillUnmount() {\n        if (this.buttonRef.current) {\n            this.buttonRef.current.removeEventListener(A11yCustomEventTypes.ACTIVATE, this.handleA11yActivateEvent);\n            this.buttonRef.current.removeEventListener(A11yCustomEventTypes.DEACTIVATE, this.handleA11yDeactivateEvent);\n        }\n    }\n\n    componentDidUpdate() {\n        if (this.state.a11yActive && this.buttonRef.current) {\n            this.buttonRef.current.dispatchEvent(new Event(A11yCustomEventTypes.UPDATE));\n        }\n    }\n\n    handlePress = (e) => {\n        e.preventDefault();\n\n        const {\n            actions,\n            isFlagged,\n            postId,\n        } = this.props;\n\n        if (isFlagged) {\n            actions.unflagPost(postId);\n        } else {\n            actions.flagPost(postId);\n        }\n    }\n\n    handleA11yActivateEvent = () => {\n        this.setState({a11yActive: true});\n    }\n\n    handleA11yDeactivateEvent = () => {\n        this.setState({a11yActive: false});\n    }\n\n    render() {\n        const isFlagged = this.props.isFlagged;\n\n        let flagIcon;\n        if (isFlagged) {\n            flagIcon = <FlagIconFilled className={classNames('icon', 'icon--small', 'icon--small-filled', {'post-menu__item--selected': isFlagged})}/>;\n        } else {\n            flagIcon = <FlagIcon className={classNames('icon', 'icon--small')}/>;\n        }\n\n        return (\n            <OverlayTrigger\n                className='hidden-xs'\n                key={`flagtooltipkey${isFlagged ? 'flagged' : ''}`}\n                delayShow={Constants.OVERLAY_TIME_DELAY}\n                placement='top'\n                overlay={\n                    <Tooltip\n                        id='flagTooltip'\n                        className='hidden-xs'\n                    >\n                        <FormattedMessage\n                            id={isFlagged ? t('flag_post.unflag') : t('flag_post.flag')}\n                            defaultMessage={isFlagged ? 'Remove from Saved' : 'Save'}\n                        />\n                    </Tooltip>\n                }\n            >\n                <button\n                    ref={this.buttonRef}\n                    id={`${this.props.location}_flagIcon_${this.props.postId}`}\n                    aria-label={isFlagged ? localizeMessage('flag_post.unflag', 'Remove from Saved').toLowerCase() : localizeMessage('flag_post.flag', 'Save').toLowerCase()}\n                    className='post-menu__item'\n                    onClick={this.handlePress}\n                >\n                    {flagIcon}\n                </button>\n            </OverlayTrigger>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {flagPost, unflagPost} from 'actions/post_actions.jsx';\n\nimport PostFlagIcon from './post_flag_icon';\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            flagPost,\n            unflagPost,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(PostFlagIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Posts} from 'mattermost-redux/constants';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {Theme} from 'mattermost-redux/types/themes';\n\nimport * as PostUtils from 'utils/post_utils';\nimport * as Utils from 'utils/utils';\n\nimport PostMarkdown from 'components/post_markdown';\nimport Pluggable from 'plugins/pluggable';\nimport ShowMore from 'components/post_view/show_more';\nimport {TextFormattingOptions} from 'utils/text_formatting';\nimport {AttachmentTextOverflowType} from 'components/post_view/show_more/show_more';\n\ntype Props = {\n    post: Post; /* The post to render the message for */\n    enableFormatting?: boolean; /* Set to enable Markdown formatting */\n    options?: TextFormattingOptions; /* Options specific to text formatting */\n    compactDisplay?: boolean; /* Set to render post body compactly */\n    isRHS?: boolean; /* Flags if the post_message_view is for the RHS (Reply). */\n    isRHSOpen?: boolean; /* Whether or not the RHS is visible */\n    isRHSExpanded?: boolean; /* Whether or not the RHS is expanded */\n    theme: Theme; /* Logged in user's theme */\n    pluginPostTypes?: any; /* Post type components from plugins */\n    currentRelativeTeamUrl: string;\n    overflowType?: AttachmentTextOverflowType;\n    maxHeight?: number; /* The max height used by the show more component */\n}\n\ntype State = {\n    collapse: boolean;\n    hasOverflow: boolean;\n    checkOverflow: number;\n}\n\nexport default class PostMessageView extends React.PureComponent<Props, State> {\n    private imageProps: any;\n\n    static defaultProps = {\n        options: {},\n        isRHS: false,\n        pluginPostTypes: {},\n        overflowType: undefined,\n    };\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            collapse: true,\n            hasOverflow: false,\n            checkOverflow: 0,\n        };\n\n        this.imageProps = {\n            onImageLoaded: this.handleHeightReceived,\n            onImageHeightChanged: this.checkPostOverflow,\n        };\n    }\n\n    checkPostOverflow = () => {\n        // Increment checkOverflow to indicate change in height\n        // and recompute textContainer height at ShowMore component\n        // and see whether overflow text of show more/less is necessary or not.\n        this.setState((prevState) => {\n            return {checkOverflow: prevState.checkOverflow + 1};\n        });\n    }\n\n    handleHeightReceived = (height: number) => {\n        if (height > 0) {\n            this.checkPostOverflow();\n        }\n    };\n\n    renderDeletedPost() {\n        return (\n            <p>\n                <FormattedMessage\n                    id='post_body.deleted'\n                    defaultMessage='(message deleted)'\n                />\n            </p>\n        );\n    }\n\n    renderEditedIndicator() {\n        if (!PostUtils.isEdited(this.props.post)) {\n            return null;\n        }\n\n        return (\n            <span\n                id={`postEdited_${this.props.post.id}`}\n                className='post-edited__indicator'\n            >\n                <FormattedMessage\n                    id='post_message_view.edited'\n                    defaultMessage='(edited)'\n                />\n            </span>\n        );\n    }\n\n    handleFormattedTextClick = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) =>\n        Utils.handleFormattedTextClick(e, this.props.currentRelativeTeamUrl);\n\n    render() {\n        const {\n            post,\n            enableFormatting,\n            options,\n            pluginPostTypes,\n            compactDisplay,\n            isRHS,\n            theme,\n            overflowType,\n            maxHeight,\n        } = this.props;\n\n        if (post.state === Posts.POST_DELETED) {\n            return this.renderDeletedPost();\n        }\n\n        if (!enableFormatting) {\n            return <span>{post.message}</span>;\n        }\n\n        const postType = post.props && post.props.type ? post.props.type : post.type;\n\n        if (pluginPostTypes && pluginPostTypes.hasOwnProperty(postType)) {\n            const PluginComponent = pluginPostTypes[postType].component;\n            return (\n                <PluginComponent\n                    post={post}\n                    compactDisplay={compactDisplay}\n                    isRHS={isRHS}\n                    theme={theme}\n                />\n            );\n        }\n\n        let message = post.message;\n        const isEphemeral = Utils.isPostEphemeral(post);\n        if (compactDisplay && isEphemeral) {\n            const visibleMessage = Utils.localizeMessage('post_info.message.visible.compact', ' (Only visible to you)');\n            message = message.concat(visibleMessage);\n        }\n\n        const id = isRHS ? `rhsPostMessageText_${post.id}` : `postMessageText_${post.id}`;\n\n        return (\n            <ShowMore\n                checkOverflow={this.state.checkOverflow}\n                text={message}\n                overflowType={overflowType}\n                maxHeight={maxHeight}\n            >\n                <div\n                    aria-readonly='true'\n                    tabIndex={0}\n                    id={id}\n                    className='post-message__text'\n                    dir='auto'\n                    onClick={this.handleFormattedTextClick}\n                >\n                    <PostMarkdown\n                        message={message}\n                        imageProps={this.imageProps}\n                        isRHS={isRHS}\n                        options={options}\n                        post={post}\n                        channelId={post.channel_id}\n                        mentionKeys={[]}\n                    />\n                </div>\n                {this.renderEditedIndicator()}\n                <Pluggable\n                    pluggableName='PostMessageAttachment'\n                    postId={post.id}\n                    onHeightChange={this.handleHeightReceived}\n                />\n            </ShowMore>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {Preferences} from 'mattermost-redux/constants';\nimport {getTheme, getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\n\nimport {getIsRhsExpanded, getIsRhsOpen} from 'selectors/rhs';\n\nimport {GlobalState} from 'types/store';\n\nimport PostMessageView from './post_message_view';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        enableFormatting: getBool(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'formatting', true),\n        isRHSExpanded: getIsRhsExpanded(state),\n        isRHSOpen: getIsRhsOpen(state),\n        pluginPostTypes: state.plugins.postTypes,\n        theme: getTheme(state),\n        currentRelativeTeamUrl: getCurrentRelativeTeamUrl(state),\n    };\n}\n\nexport default connect(mapStateToProps)(PostMessageView);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, injectIntl, IntlShape} from 'react-intl';\n\nimport {t} from 'utils/i18n';\n\nimport FlagIconFilled from 'components/widgets/icons/flag_icon_filled';\n\nexport type Props = {\n    intl: IntlShape;\n    isFlagged: boolean;\n    isPinned?: boolean;\n    skipPinned?: boolean;\n    skipFlagged?: boolean;\n    channelId: string;\n    actions: {\n        showFlaggedPosts: () => void;\n        showPinnedPosts: (channelId: string) => void;\n    };\n}\n\nexport enum PostPinnedOrFlagged {\n    Flagged,\n    Pinned,\n    PinnedAndFlagged,\n    Neither,\n}\n\nenum MessageInfoKey {\n    Flagged = 'flagged',\n    Pinned = 'pinned',\n    PinnedAndFlagged = 'pinnedAndFlagged',\n}\n\nclass PostPreHeader extends React.PureComponent<Props> {\n    messageInfos = {\n        flagged: {id: t('post_pre_header.flagged'), defaultMessage: 'Saved'},\n        pinned: {id: t('post_pre_header.pinned'), defaultMessage: 'Pinned'},\n    };\n\n    getPostStatus(isFlagged: boolean, isPinned?: boolean): PostPinnedOrFlagged {\n        if (isFlagged) {\n            if (isPinned) {\n                return PostPinnedOrFlagged.PinnedAndFlagged;\n            }\n\n            return PostPinnedOrFlagged.Flagged;\n        }\n\n        if (isPinned) {\n            return PostPinnedOrFlagged.Pinned;\n        }\n\n        return PostPinnedOrFlagged.Neither;\n    }\n\n    getMessageInfo(postStatus: PostPinnedOrFlagged, skipFlagged?: boolean, skipPinned?: boolean): MessageInfoKey | false {\n        if (skipFlagged && skipPinned) {\n            return false;\n        }\n\n        if (postStatus === PostPinnedOrFlagged.PinnedAndFlagged) {\n            if (!skipPinned && !skipFlagged) {\n                return MessageInfoKey.PinnedAndFlagged;\n            }\n\n            if (skipPinned) {\n                return MessageInfoKey.Flagged;\n            }\n\n            if (skipFlagged) {\n                return MessageInfoKey.Pinned;\n            }\n        }\n\n        if (postStatus === PostPinnedOrFlagged.Flagged && !skipFlagged) {\n            return MessageInfoKey.Flagged;\n        }\n\n        if (postStatus === PostPinnedOrFlagged.Pinned && !skipPinned) {\n            return MessageInfoKey.Pinned;\n        }\n\n        return false;\n    }\n\n    handleLinkClick = (messageKey: MessageInfoKey, channelId?: string) => {\n        if (messageKey === MessageInfoKey.Pinned && channelId) {\n            this.props.actions.showPinnedPosts(channelId);\n        } else {\n            this.props.actions.showFlaggedPosts();\n        }\n    }\n\n    render() {\n        const {isFlagged, isPinned, skipPinned, skipFlagged, channelId} = this.props;\n\n        const messageKey = this.getMessageInfo(this.getPostStatus(isFlagged, isPinned), skipFlagged, skipPinned);\n\n        if ((!isFlagged && !isPinned) || !messageKey) {\n            return null;\n        }\n\n        return (\n            <div className='post-pre-header'>\n                <div className='post-pre-header__icons-container'>\n                    {isPinned && !skipPinned && <span className='icon-pin icon icon--post-pre-header'/>}\n                    {isFlagged && !skipFlagged && <FlagIconFilled className='icon icon--post-pre-header'/>}\n                </div>\n                <div className='post-pre-header__text-container'>\n                    {messageKey &&\n                    messageKey !== MessageInfoKey.PinnedAndFlagged && (\n                        <span>\n                            <a onClick={() => this.handleLinkClick(messageKey, channelId)}>\n                                <FormattedMessage\n                                    id={this.messageInfos[messageKey].id}\n                                    defaultMessage={this.messageInfos[messageKey].defaultMessage}\n                                />\n                            </a>\n                        </span>\n                    )}\n                    {messageKey &&\n                    messageKey === MessageInfoKey.PinnedAndFlagged && (\n                        <span>\n                            <a onClick={() => this.handleLinkClick(MessageInfoKey.Pinned, channelId)}>\n                                <FormattedMessage\n                                    id={this.messageInfos[MessageInfoKey.Pinned].id}\n                                    defaultMessage={this.messageInfos[MessageInfoKey.Pinned].defaultMessage}\n                                />\n                            </a>\n                            <span className='post-pre-header__link-separator'>{'\\u2B24'}</span>\n                            <a onClick={() => this.handleLinkClick(MessageInfoKey.Flagged)}>\n                                <FormattedMessage\n                                    id={this.messageInfos[MessageInfoKey.Flagged].id}\n                                    defaultMessage={this.messageInfos[MessageInfoKey.Flagged].defaultMessage}\n                                />\n                            </a>\n                        </span>\n                    )}\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default injectIntl(PostPreHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {showFlaggedPosts, showPinnedPosts} from 'actions/views/rhs';\n\nimport PostPreHeader from './post_pre_header';\n\nconst mapDispatchToProps = (dispatch) => ({\n    actions: bindActionCreators({\n        showFlaggedPosts,\n        showPinnedPosts,\n    }, dispatch),\n});\n\nexport default connect(null, mapDispatchToProps)(PostPreHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport classNames from 'classnames';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Dispatch} from 'redux';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nimport {Emoji} from 'mattermost-redux/types/emojis';\n\nimport {Locations} from 'utils/constants';\nimport {localizeMessage} from 'utils/utils.jsx';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport ChannelPermissionGate from 'components/permissions_gates/channel_permission_gate';\nimport EmojiIcon from 'components/widgets/icons/emoji_icon';\nimport EmojiPickerOverlay from 'components/emoji_picker/emoji_picker_overlay.jsx';\n\nconst TOP_OFFSET = -7;\n\ntype LocationTypes = 'CENTER' | 'RHS_ROOT' | 'RHS_COMMENT';\n\ntype Props = {\n    channelId?: string;\n    postId: string;\n    teamId: string;\n    getDotMenuRef: () => HTMLDivElement;\n    location: LocationTypes;\n    showEmojiPicker: boolean;\n    toggleEmojiPicker: (event?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n    actions: {\n        addReaction: (postId: string, emojiName: string) => (dispatch: Dispatch) => void;\n    };\n}\n\ntype State = {\n    location: LocationTypes;\n    showEmojiPicker: boolean;\n}\n\nexport default class PostReaction extends React.PureComponent<Props, State> {\n    public static defaultProps: Partial<Props> = {\n        location: Locations.CENTER as 'CENTER',\n        showEmojiPicker: false,\n    };\n\n    handleAddEmoji = (emoji: Emoji): void => {\n        this.setState({showEmojiPicker: false});\n        const emojiName = 'short_name' in emoji ? emoji.short_name : emoji.name;\n        this.props.actions.addReaction(this.props.postId, emojiName);\n        this.props.toggleEmojiPicker();\n    };\n\n    render() {\n        const {\n            channelId,\n            location,\n            postId,\n            showEmojiPicker,\n            teamId,\n        } = this.props;\n\n        let spaceRequiredAbove;\n        let spaceRequiredBelow;\n        if (location === Locations.RHS_ROOT || location === Locations.RHS_COMMENT) {\n            spaceRequiredAbove = EmojiPickerOverlay.RHS_SPACE_REQUIRED_ABOVE;\n            spaceRequiredBelow = EmojiPickerOverlay.RHS_SPACE_REQUIRED_BELOW;\n        }\n\n        return (\n            <ChannelPermissionGate\n                channelId={channelId}\n                teamId={teamId}\n                permissions={[Permissions.ADD_REACTION]}\n            >\n                <React.Fragment>\n                    <EmojiPickerOverlay\n                        show={showEmojiPicker}\n                        target={this.props.getDotMenuRef}\n                        onHide={this.props.toggleEmojiPicker}\n                        onEmojiClose={this.props.toggleEmojiPicker}\n                        onEmojiClick={this.handleAddEmoji}\n                        topOffset={TOP_OFFSET}\n                        spaceRequiredAbove={spaceRequiredAbove}\n                        n={true}\n                        spaceRequiredBelow={spaceRequiredBelow}\n                    />\n                    <OverlayTrigger\n                        className='hidden-xs'\n                        delayShow={500}\n                        placement='top'\n                        overlay={\n                            <Tooltip\n                                id='reaction-icon-tooltip'\n                                className='hidden-xs'\n                            >\n                                <FormattedMessage\n                                    id='post_info.tooltip.add_reactions'\n                                    defaultMessage='Add Reaction'\n                                />\n                            </Tooltip>\n                        }\n                    >\n                        <button\n                            data-testid='post-reaction-emoji-icon'\n                            id={`${location}_reaction_${postId}`}\n                            aria-label={localizeMessage('post_info.tooltip.add_reactions', 'Add Reaction').toLowerCase()}\n                            className={classNames('post-menu__item', 'post-menu__item--reactions', {\n                                'post-menu__item--active': showEmojiPicker,\n                            })}\n                            onClick={this.props.toggleEmojiPicker}\n                        >\n                            <EmojiIcon className='icon icon--small'/>\n                        </button>\n                    </OverlayTrigger>\n                </React.Fragment>\n            </ChannelPermissionGate>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {addReaction} from 'actions/post_actions.jsx';\n\nimport PostReaction from './post_reaction';\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            addReaction,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(PostReaction);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ComponentProps} from 'react';\nimport {Link} from 'react-router-dom';\n\nimport {Tooltip} from 'react-bootstrap';\n\nimport * as GlobalActions from 'actions/global_actions';\nimport {isMobile} from 'utils/user_agent';\nimport {Locations} from 'utils/constants';\nimport {isMobile as isMobileView} from 'utils/utils.jsx';\nimport OverlayTrigger from 'components/overlay_trigger';\n\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\n\nconst POST_TOOLTIP_RANGES = [\n    RelativeRanges.TODAY_TITLE_CASE,\n    RelativeRanges.YESTERDAY_TITLE_CASE,\n];\n\ntype Props = {\n\n    /*\n         * If true, time will be rendered as a permalink to the post\n         */\n    isPermalink: boolean;\n\n    /*\n     * The time to display\n     */\n    eventTime: number;\n\n    location: string;\n\n    /*\n     * The post id of posting being rendered\n     */\n    postId: string;\n    teamUrl: string;\n    timestampProps?: ComponentProps<typeof Timestamp>;\n}\n\nexport default class PostTime extends React.PureComponent<Props> {\n    static defaultProps: Partial<Props> = {\n        eventTime: 0,\n        location: Locations.CENTER,\n    };\n\n    handleClick = () => {\n        if (isMobileView()) {\n            GlobalActions.emitCloseRightHandSide();\n        }\n    };\n\n    render() {\n        const {\n            eventTime,\n            isPermalink,\n            location,\n            postId,\n            teamUrl,\n            timestampProps = {},\n        } = this.props;\n\n        const postTime = (\n            <Timestamp\n                value={eventTime}\n                className='post__time'\n                useDate={false}\n                {...timestampProps}\n            />\n        );\n\n        const content = isMobile() || !isPermalink ? (\n            <div\n                role='presentation'\n                className='post__permalink post_permalink_mobile_view'\n            >\n                {postTime}\n            </div>\n        ) : (\n            <Link\n                id={`${location}_time_${postId}`}\n                to={`${teamUrl}/pl/${postId}`}\n                className='post__permalink'\n                onClick={this.handleClick}\n            >\n                {postTime}\n            </Link>\n        );\n\n        return (\n            <OverlayTrigger\n                delayShow={500}\n                placement='top'\n                overlay={\n                    <Tooltip\n                        id={eventTime.toString()}\n                        className='hidden-xs'\n                    >\n                        <Timestamp\n                            value={eventTime}\n                            ranges={POST_TOOLTIP_RANGES}\n                        />\n                    </Tooltip>\n                }\n            >\n                {content}\n            </OverlayTrigger>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\n\nimport {GlobalState} from 'types/store';\n\nimport PostTime from './post_time';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        teamUrl: getCurrentRelativeTeamUrl(state),\n    };\n}\n\nexport default connect(mapStateToProps)(PostTime);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport * as React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Reaction as ReactionType} from 'mattermost-redux/types/reactions';\n\ntype Props = {\n    canAddReaction: boolean;\n    canRemoveReaction: boolean;\n    currentUserReacted: boolean;\n    emojiName: string;\n    reactions: ReactionType[];\n    users: string[];\n};\n\nconst ReactionTooltip: React.FC<Props> = (props: Props) => {\n    const {\n        canAddReaction,\n        canRemoveReaction,\n        currentUserReacted,\n        emojiName,\n        reactions,\n        users,\n    } = props;\n\n    const otherUsersCount = reactions.length - users.length;\n\n    let names: React.ReactNode;\n    if (otherUsersCount > 0) {\n        if (users.length > 0) {\n            names = (\n                <FormattedMessage\n                    id='reaction.usersAndOthersReacted'\n                    defaultMessage='{users} and {otherUsers, number} other {otherUsers, plural, one {user} other {users}}'\n                    values={{\n                        users: users.join(', '),\n                        otherUsers: otherUsersCount,\n                    }}\n                />\n            );\n        } else {\n            names = (\n                <FormattedMessage\n                    id='reaction.othersReacted'\n                    defaultMessage='{otherUsers, number} {otherUsers, plural, one {user} other {users}}'\n                    values={{\n                        otherUsers: otherUsersCount,\n                    }}\n                />\n            );\n        }\n    } else if (users.length > 1) {\n        names = (\n            <FormattedMessage\n                id='reaction.usersReacted'\n                defaultMessage='{users} and {lastUser}'\n                values={{\n                    users: users.slice(0, -1).join(', '),\n                    lastUser: users[users.length - 1],\n                }}\n            />\n        );\n    } else {\n        names = users[0];\n    }\n\n    let reactionVerb: React.ReactNode;\n    if (users.length + otherUsersCount > 1) {\n        if (currentUserReacted) {\n            reactionVerb = (\n                <FormattedMessage\n                    id='reaction.reactionVerb.youAndUsers'\n                    defaultMessage='reacted'\n                />\n            );\n        } else {\n            reactionVerb = (\n                <FormattedMessage\n                    id='reaction.reactionVerb.users'\n                    defaultMessage='reacted'\n                />\n            );\n        }\n    } else if (currentUserReacted) {\n        reactionVerb = (\n            <FormattedMessage\n                id='reaction.reactionVerb.you'\n                defaultMessage='reacted'\n            />\n        );\n    } else {\n        reactionVerb = (\n            <FormattedMessage\n                id='reaction.reactionVerb.user'\n                defaultMessage='reacted'\n            />\n        );\n    }\n\n    const tooltip = (\n        <FormattedMessage\n            id='reaction.reacted'\n            defaultMessage='{users} {reactionVerb} with {emoji}'\n            values={{\n                users: <b>{names}</b>,\n                reactionVerb,\n                emoji: <b>{':' + emojiName + ':'}</b>,\n            }}\n        />\n    );\n\n    let clickTooltip: React.ReactNode;\n    if (currentUserReacted && canRemoveReaction) {\n        clickTooltip = (\n            <FormattedMessage\n                id='reaction.clickToRemove'\n                defaultMessage='(click to remove)'\n            />\n        );\n    } else if (!currentUserReacted && canAddReaction) {\n        clickTooltip = (\n            <FormattedMessage\n                id='reaction.clickToAdd'\n                defaultMessage='(click to add)'\n            />\n        );\n    }\n\n    return (\n        <>\n            {tooltip}\n            <br/>\n            {clickTooltip}\n        </>\n    );\n};\n\nexport default ReactionTooltip;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {createSelector} from 'reselect';\n\nimport {getCurrentUserId, makeGetProfilesForReactions} from 'mattermost-redux/selectors/entities/users';\nimport {getTeammateNameDisplaySetting} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {Reaction as ReactionType} from 'mattermost-redux/types/reactions';\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport {displayUsername} from 'mattermost-redux/utils/user_utils';\n\nimport {GlobalState} from 'types/store';\n\nimport * as Utils from 'utils/utils';\n\nimport ReactionTooltip from './reaction_tooltip';\n\ntype OwnProps = {\n    reactions: ReactionType[];\n};\n\nexport const makeGetNamesOfUsers = () => createSelector(\n    'makeGetNamesOfUsers',\n    (state: GlobalState, reactions: ReactionType[]) => reactions,\n    getCurrentUserId,\n    makeGetProfilesForReactions(),\n    getTeammateNameDisplaySetting,\n    (reactions: ReactionType[], currentUserId: string, profiles: UserProfile[], teammateNameDisplay: string) => {\n        // Sort users by who reacted first with \"you\" being first if the current user reacted\n\n        let currentUserReacted = false;\n        const sortedReactions = reactions.sort((a, b) => a.create_at - b.create_at);\n        const users = sortedReactions.reduce((accumulator, current) => {\n            if (current.user_id === currentUserId) {\n                currentUserReacted = true;\n            } else {\n                const user = profiles.find((u) => u.id === current.user_id);\n                if (user) {\n                    accumulator.push(displayUsername(user, teammateNameDisplay));\n                }\n            }\n            return accumulator;\n        }, [] as string[]);\n\n        if (currentUserReacted) {\n            users.unshift(Utils.localizeMessage('reaction.you', 'You'));\n        }\n\n        return users;\n    },\n);\n\nfunction makeMapStateToProps() {\n    const getNamesOfUsers = makeGetNamesOfUsers();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        return {\n            users: getNamesOfUsers(state, ownProps.reactions),\n        };\n    };\n}\n\nexport default connect(makeMapStateToProps)(ReactionTooltip);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\n\nimport {Post} from 'mattermost-redux/types/posts';\nimport {Reaction as ReactionType} from 'mattermost-redux/types/reactions';\n\nimport OverlayTrigger from 'components/overlay_trigger';\n\nimport * as Utils from 'utils/utils';\n\nimport ReactionTooltip from './reaction_tooltip';\nimport './reaction.scss';\n\ntype State = {\n    displayNumber: number;\n    reactedClass: 'Reaction--reacted' | 'Reaction--reacting' | 'Reaction--unreacted' | 'Reaction--unreacting';\n};\n\ndeclare module 'react-bootstrap/lib/OverlayTrigger' {\n    interface OverlayTriggerProps {\n        shouldUpdatePosition?: boolean;\n    }\n}\n\ntype Props = {\n\n    /*\n     * The post to render the reaction for\n     */\n    post: Post;\n\n    /*\n     * The user id of the logged in user\n     */\n    currentUserId: string;\n\n    /*\n     * The name of the emoji for the reaction\n     */\n    emojiName: string;\n\n    /*\n     * The number of reactions to this post for this emoji\n     */\n    reactionCount: number;\n\n    /*\n     * Array of reactions by user\n     */\n    reactions: ReactionType[];\n\n    /*\n     * True if the user has the permission to add a reaction in this channel\n     */\n    canAddReaction: boolean;\n\n    /*\n     * True if user has the permission to remove his own reactions in this channel\n     */\n    canRemoveReaction: boolean;\n\n    /*\n     * The URL of the emoji image\n     */\n    emojiImageUrl: string;\n\n    /*\n     * Whether or not the current user has used this reaction\n     */\n    currentUserReacted: boolean;\n\n    actions: {\n\n        /*\n         * Function to add a reaction to a post\n         */\n        addReaction: (postId: string, emojiName: string) => void;\n\n        /*\n         * Function to get non-loaded profiles by id\n         */\n        getMissingProfilesByIds: (ids: string[]) => void;\n\n        /*\n         * Function to remove a reaction from a post\n         */\n        removeReaction: (postId: string, emojiName: string) => void;\n    };\n}\n\nexport default class Reaction extends React.PureComponent<Props, State> {\n    private reactionButtonRef = React.createRef<HTMLButtonElement>();\n    private reactionCountRef = React.createRef<HTMLSpanElement>();\n    private animating = false;\n\n    constructor(props: Props) {\n        super(props);\n\n        const {currentUserReacted, reactionCount} = this.props;\n\n        if (currentUserReacted) {\n            this.state = {\n                reactedClass: 'Reaction--reacted',\n                displayNumber: reactionCount,\n            };\n        } else {\n            this.state = {\n                reactedClass: 'Reaction--unreacted',\n                displayNumber: reactionCount,\n            };\n        }\n    }\n\n    componentDidUpdate(prevProps: Props): void {\n        if (prevProps.reactionCount !== this.props.reactionCount) {\n            const {currentUserReacted} = this.props;\n            const reactedClass = currentUserReacted ? 'Reaction--reacted' : 'Reaction--unreacted';\n\n            this.animating = false;\n            /* eslint-disable-next-line react/no-did-update-set-state */\n            this.setState({\n                displayNumber: this.props.reactionCount,\n                reactedClass,\n            });\n        }\n    }\n\n    handleClick = (): void => {\n        // only proceed if user has permission to react\n        // and we are not animating\n        if (\n            !(this.props.canAddReaction && this.props.canRemoveReaction) || this.animating\n        ) {\n            return;\n        }\n\n        const {currentUserReacted} = this.props;\n\n        this.animating = true;\n        this.setState((state) => {\n            if (currentUserReacted) {\n                return {\n                    displayNumber: state.displayNumber - 1,\n                    reactedClass: 'Reaction--unreacting',\n                };\n            }\n\n            return {\n                displayNumber: state.displayNumber + 1,\n                reactedClass: 'Reaction--reacting',\n            };\n        });\n    }\n\n    handleAnimationEnded = (): void => {\n        const {actions, currentUserReacted, post, emojiName} = this.props;\n\n        this.animating = false;\n        this.setState<'reactedClass'>((state) => {\n            if (state.reactedClass === 'Reaction--reacting') {\n                return {\n                    reactedClass: 'Reaction--reacted',\n                };\n            } else if (state.reactedClass === 'Reaction--unreacting') {\n                return {\n                    reactedClass: 'Reaction--unreacted',\n                };\n            }\n            return state;\n        });\n\n        if (currentUserReacted) {\n            actions.removeReaction(post.id, emojiName);\n        } else {\n            actions.addReaction(post.id, emojiName);\n        }\n    }\n\n    loadMissingProfiles = async (): Promise<void> => {\n        const ids = this.props.reactions.map((reaction) => reaction.user_id);\n        this.props.actions.getMissingProfilesByIds(ids);\n    }\n\n    render(): React.ReactNode {\n        if (!this.props.emojiImageUrl) {\n            return null;\n        }\n        const {\n            canAddReaction,\n            canRemoveReaction,\n            currentUserReacted,\n            emojiName,\n            reactionCount,\n            reactions,\n        } = this.props;\n        const {displayNumber} = this.state;\n        const reactedNumber = currentUserReacted ? reactionCount : reactionCount + 1;\n        const unreactedNumber = currentUserReacted ? reactionCount - 1 : reactionCount;\n        const unreacted = (unreactedNumber > 0) ? unreactedNumber : '';\n        const reacted = (reactedNumber > 0) ? reactedNumber : '';\n        const display = (displayNumber > 0) ? displayNumber : '';\n        const readOnlyClass = (canAddReaction && canRemoveReaction) ? '' : 'Reaction--read-only';\n\n        const emojiNameWithSpaces = this.props.emojiName.replace(/_/g, ' ');\n        let ariaLabelEmoji = `${Utils.localizeMessage('reaction.reactWidth.ariaLabel', 'react with')} ${emojiNameWithSpaces}`;\n        if (currentUserReacted && canRemoveReaction) {\n            ariaLabelEmoji = `${Utils.localizeMessage('reaction.removeReact.ariaLabel', 'remove reaction')} ${emojiNameWithSpaces}`;\n        }\n\n        return (\n            <OverlayTrigger\n                delayShow={500}\n                placement='top'\n                shouldUpdatePosition={true}\n                overlay={\n                    <Tooltip id={`${this.props.post.id}-${this.props.emojiName}-reaction`}>\n                        <ReactionTooltip\n                            canAddReaction={canAddReaction}\n                            canRemoveReaction={canRemoveReaction}\n                            currentUserReacted={currentUserReacted}\n                            emojiName={emojiName}\n                            reactions={reactions}\n                        />\n                    </Tooltip>\n                }\n                onEnter={this.loadMissingProfiles}\n            >\n                <button\n                    id={`postReaction-${this.props.post.id}-${this.props.emojiName}`}\n                    aria-label={ariaLabelEmoji}\n                    className={`Reaction ${this.state.reactedClass} ${readOnlyClass}`}\n                    onClick={this.handleClick}\n                    ref={this.reactionButtonRef}\n                >\n                    <span className='d-flex align-items-center'>\n                        <span\n                            className='Reaction__emoji emoticon'\n                            style={{backgroundImage: 'url(' + this.props.emojiImageUrl + ')'}}\n                        />\n                        <span\n                            ref={this.reactionCountRef}\n                            className='Reaction__count'\n                        >\n                            <span className='Reaction__number'>\n                                <span className='Reaction__number--display'>{display}</span>\n                                <span\n                                    className='Reaction__number--unreacted'\n                                    onAnimationEnd={this.handleAnimationEnded}\n                                >\n                                    {unreacted}\n                                </span>\n                                <span className='Reaction__number--reacted'>{reacted}</span>\n                            </span>\n                        </span>\n                    </span>\n                </button>\n            </OverlayTrigger>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {createSelector} from 'reselect';\n\nimport {removeReaction} from 'mattermost-redux/actions/posts';\nimport {getMissingProfilesByIds} from 'mattermost-redux/actions/users';\nimport {getCurrentUserId, getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getCustomEmojisByName} from 'mattermost-redux/selectors/entities/emojis';\nimport {getEmojiImageUrl} from 'mattermost-redux/utils/emoji_utils';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport Constants from 'mattermost-redux/constants/general';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {ClientConfig, ClientLicense} from 'mattermost-redux/types/config';\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {Emoji as EmojiType} from 'mattermost-redux/types/emojis';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {Post} from 'mattermost-redux/types/posts';\nimport {Reaction as ReactionType} from 'mattermost-redux/types/reactions';\n\nimport {addReaction} from 'actions/post_actions.jsx';\n\nimport * as Emoji from 'utils/emoji.jsx';\n\nimport Reaction from './reaction';\n\ntype Props = {\n    emojiName: string;\n    post: Post;\n    reactions: ReactionType[];\n};\n\nfunction makeMapStateToProps() {\n    const didCurrentUserReact = createSelector(\n        'didCurrentUserReact',\n        getCurrentUserId,\n        (state: GlobalState, reactions: ReactionType[]) => reactions,\n        (currentUserId: string, reactions: ReactionType[]) => {\n            return reactions.some((reaction) => reaction.user_id === currentUserId);\n        },\n    );\n\n    return function mapStateToProps(state: GlobalState, ownProps: Props) {\n        const config = getConfig(state);\n        const license = getLicense(state);\n        const currentUser = getCurrentUser(state);\n\n        let emoji;\n        if (Emoji.EmojiIndicesByAlias.has(ownProps.emojiName)) {\n            emoji = Emoji.Emojis[Emoji.EmojiIndicesByAlias.get(ownProps.emojiName) as number];\n        } else {\n            const emojis = getCustomEmojisByName(state);\n            emoji = emojis.get(ownProps.emojiName);\n        }\n\n        let emojiImageUrl = '';\n        if (emoji) {\n            emojiImageUrl = getEmojiImageUrl(emoji as EmojiType);\n        }\n        const channel = getChannel(state, ownProps.post.channel_id) || {};\n        const channelIsArchived = channel.delete_at !== 0;\n        const teamId = channel.team_id;\n        const currentUserId = getCurrentUserId(state);\n        let canAddReaction = false;\n        let canRemoveReaction = false;\n\n        if (!channelIsArchived) {\n            canAddReaction = checkReactionAction(state, teamId, ownProps.post.channel_id, channel.name, config, license, currentUser, Permissions.REMOVE_REACTION);\n            canRemoveReaction = checkReactionAction(state, teamId, ownProps.post.channel_id, channel.name, config, license, currentUser, Permissions.ADD_REACTION);\n        }\n\n        return {\n            currentUserId,\n            reactionCount: ownProps.reactions.length,\n            canAddReaction,\n            canRemoveReaction,\n            emojiImageUrl,\n            currentUserReacted: didCurrentUserReact(state, ownProps.reactions),\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            addReaction,\n            removeReaction,\n            getMissingProfilesByIds,\n        }, dispatch),\n    };\n}\n\nfunction checkReactionAction(\n    state: GlobalState,\n    teamId: string,\n    channelId: string,\n    channelName: string,\n    config: Partial<ClientConfig>,\n    license: ClientLicense,\n    user: UserProfile,\n    permission: string,\n) {\n    if (!haveIChannelPermission(state, teamId, channelId, permission)) {\n        return false;\n    }\n\n    if (channelName === Constants.DEFAULT_CHANNEL && license.IsLicensed === 'true' && !user.roles.includes('system_admin')) {\n        return false;\n    }\n\n    return true;\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(Reaction);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function AddReactionIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='16px'\n                height='16px'\n                viewBox='0 0 16 16'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.add-reaction', defaultMessage: 'Add Reaction Icon'})}\n            >\n                <path d='M10 8.00001C10.32 8.00001 10.5973 7.88267 10.832 7.64801C11.0773 7.40267 11.2 7.12001 11.2 6.80001C11.2 6.48001 11.0773 6.20267 10.832 5.96801C10.5973 5.72267 10.32 5.60001 10 5.60001C9.68 5.60001 9.39733 5.72267 9.152 5.96801C8.91733 6.20267 8.8 6.48001 8.8 6.80001C8.8 7.12001 8.91733 7.40267 9.152 7.64801C9.39733 7.88267 9.68 8.00001 10 8.00001ZM5.2 8.00001C5.52 8.00001 5.79733 7.88267 6.032 7.64801C6.27733 7.40267 6.4 7.12001 6.4 6.80001C6.4 6.48001 6.27733 6.20267 6.032 5.96801C5.79733 5.72267 5.52 5.60001 5.2 5.60001C4.88 5.60001 4.59733 5.72267 4.352 5.96801C4.11733 6.20267 4 6.48001 4 6.80001C4 7.12001 4.11733 7.40267 4.352 7.64801C4.59733 7.88267 4.88 8.00001 5.2 8.00001ZM13.584 7.93601C13.584 7.97867 13.584 8.05334 13.584 8.16001L13.6 8.40001C13.6 9.48801 13.328 10.496 12.784 11.424C12.2507 12.3307 11.5307 13.0507 10.624 13.584C9.696 14.128 8.688 14.4 7.6 14.4C6.512 14.4 5.504 14.128 4.576 13.584C3.66933 13.0507 2.94933 12.3307 2.416 11.424C1.872 10.496 1.6 9.48801 1.6 8.40001C1.6 7.31201 1.872 6.30401 2.416 5.37601C2.94933 4.46934 3.66933 3.74934 4.576 3.21601C5.504 2.67201 6.512 2.40001 7.6 2.40001L8.064 2.41601C8.17067 1.84001 8.352 1.32801 8.608 0.880006C8.23467 0.826673 7.89867 0.800006 7.6 0.800006C6.224 0.800006 4.944 1.14667 3.76 1.84001C2.61867 2.51201 1.712 3.41867 1.04 4.56001C0.346667 5.74401 0 7.02401 0 8.40001C0 9.77601 0.346667 11.056 1.04 12.24C1.712 13.3813 2.61867 14.288 3.76 14.96C4.944 15.6533 6.224 16 7.6 16C8.976 16 10.256 15.6533 11.44 14.96C12.5813 14.288 13.488 13.3813 14.16 12.24C14.8533 11.056 15.2 9.77601 15.2 8.40001C15.2 8.10134 15.1733 7.76534 15.12 7.39201C14.672 7.64801 14.16 7.82934 13.584 7.93601ZM12 5.72205e-06H13.6V2.40001H16V4.00001H13.6V6.40001H12V4.00001H9.6V2.40001H12V5.72205e-06ZM3.504 10C3.83467 10.832 4.36267 11.504 5.088 12.016C5.84533 12.5387 6.68267 12.8 7.6 12.8C8.51733 12.8 9.35467 12.5387 10.112 12.016C10.8373 11.504 11.3653 10.832 11.696 10H3.504Z'/>\n            </svg>\n        </span>\n    );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {Post} from 'mattermost-redux/types/posts';\nimport {Reaction as ReactionType} from 'mattermost-redux/types/reactions';\nimport {Emoji} from 'mattermost-redux/types/emojis';\nimport {isCustomEmoji} from 'mattermost-redux/utils/emoji_utils';\n\nimport Constants from 'utils/constants';\nimport Reaction from 'components/post_view/reaction';\nimport EmojiPickerOverlay from 'components/emoji_picker/emoji_picker_overlay.jsx';\nimport AddReactionIcon from 'components/widgets/icons/add_reaction_icon';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport ChannelPermissionGate from 'components/permissions_gates/channel_permission_gate';\nimport {localizeMessage} from 'utils/utils.jsx';\n\nconst DEFAULT_EMOJI_PICKER_RIGHT_OFFSET = 15;\nconst EMOJI_PICKER_WIDTH_OFFSET = 260;\n\ntype Props = {\n\n    /**\n     * The post to render reactions for\n     */\n    post: Post;\n\n    /*\n     * The id of the team which belongs the post\n     */\n    teamId: string;\n\n    /**\n     * The reactions to render\n     */\n    reactions: { [x: string]: ReactionType } | undefined | null;\n\n    /**\n     * Whether to show the emoji picker.\n     */\n    enableEmojiPicker: boolean;\n\n    actions: {\n\n        /**\n         * Function to add a reaction to the post\n         */\n        addReaction: (postId: string, emojiName: string) => void;\n    };\n};\n\ntype State = {\n    showEmojiPicker: boolean;\n};\n\nexport default class ReactionList extends React.PureComponent<Props, State> {\n    private addReactionButtonRef = React.createRef<HTMLButtonElement>();\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            showEmojiPicker: false,\n        };\n    }\n\n    getTarget = (): HTMLButtonElement | null => {\n        return this.addReactionButtonRef.current;\n    }\n\n    handleEmojiClick = (emoji: Emoji): void => {\n        this.setState({showEmojiPicker: false});\n        const emojiName = isCustomEmoji(emoji) ? emoji.name : emoji.short_names[0];\n        this.props.actions.addReaction(this.props.post.id, emojiName);\n    }\n\n    hideEmojiPicker = (): void => {\n        this.setState({showEmojiPicker: false});\n    }\n\n    toggleEmojiPicker = (): void => {\n        this.setState({showEmojiPicker: !this.state.showEmojiPicker});\n    }\n\n    render(): React.ReactNode {\n        const reactionsByName = new Map();\n        const emojiNames = [];\n\n        if (this.props.reactions) {\n            for (const reaction of Object.values(this.props.reactions)) {\n                const emojiName = reaction.emoji_name;\n\n                if (reactionsByName.has(emojiName)) {\n                    reactionsByName.get(emojiName).push(reaction);\n                } else {\n                    emojiNames.push(emojiName);\n                    reactionsByName.set(emojiName, [reaction]);\n                }\n            }\n        }\n\n        if (reactionsByName.size === 0) {\n            return null;\n        }\n\n        const reactions = emojiNames.map((emojiName) => {\n            return (\n                <Reaction\n                    key={emojiName}\n                    post={this.props.post}\n                    emojiName={emojiName}\n                    reactions={reactionsByName.get(emojiName) || []}\n                />\n            );\n        });\n\n        const addReactionButton = this.getTarget();\n        let rightOffset = DEFAULT_EMOJI_PICKER_RIGHT_OFFSET;\n        if (addReactionButton) {\n            rightOffset = window.innerWidth - addReactionButton.getBoundingClientRect().right - EMOJI_PICKER_WIDTH_OFFSET;\n\n            if (rightOffset < 0) {\n                rightOffset = DEFAULT_EMOJI_PICKER_RIGHT_OFFSET;\n            }\n        }\n\n        let emojiPicker = null;\n        if (this.props.enableEmojiPicker) {\n            const addReactionTooltip = (\n                <Tooltip id='addReactionTooltip'>\n                    <FormattedMessage\n                        id='reaction_list.addReactionTooltip'\n                        defaultMessage='Add a reaction'\n                    />\n                </Tooltip>\n            );\n\n            emojiPicker = (\n                <span className='emoji-picker__container'>\n                    <EmojiPickerOverlay\n                        show={this.state.showEmojiPicker}\n                        target={this.getTarget}\n                        onHide={this.hideEmojiPicker}\n                        onEmojiClose={this.hideEmojiPicker}\n                        onEmojiClick={this.handleEmojiClick}\n                        rightOffset={rightOffset}\n                        topOffset={-5}\n                    />\n                    <ChannelPermissionGate\n                        channelId={this.props.post.channel_id}\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.ADD_REACTION]}\n                    >\n                        <OverlayTrigger\n                            placement='top'\n                            delayShow={Constants.OVERLAY_TIME_DELAY}\n                            overlay={addReactionTooltip}\n                        >\n                            <button\n                                aria-label={localizeMessage('reaction.add.ariaLabel', 'Add a reaction')}\n                                className='Reaction'\n                                onClick={this.toggleEmojiPicker}\n                            >\n                                <span\n                                    id={`addReaction-${this.props.post.id}`}\n                                    className='Reaction__add'\n                                    ref={this.addReactionButtonRef}\n                                >\n                                    <AddReactionIcon/>\n                                </span>\n                            </button>\n                        </OverlayTrigger>\n                    </ChannelPermissionGate>\n                </span>\n            );\n        }\n\n        let addReactionClassName = 'post-add-reaction';\n        if (this.state.showEmojiPicker) {\n            addReactionClassName += ' post-add-reaction-emoji-picker-open';\n        }\n\n        return (\n            <div\n                aria-label={localizeMessage('reaction.container.ariaLabel', 'reactions')}\n                className='post-reaction-list'\n            >\n                {reactions}\n                <div className={addReactionClassName}>\n                    {emojiPicker}\n                </div>\n            </div>\n        );\n    }\n}\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {makeGetReactionsForPost} from 'mattermost-redux/selectors/entities/posts';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {Post} from 'mattermost-redux/types/posts';\nimport {Reaction} from 'mattermost-redux/types/reactions';\n\nimport {addReaction} from 'actions/post_actions.jsx';\n\nimport ReactionList from './reaction_list';\n\ntype Props = {\n    enableEmojiPicker: boolean;\n    isReadOnly: boolean;\n    post: Post;\n    reactions: { [x: string]: Reaction } | undefined | null;\n};\n\nfunction makeMapStateToProps() {\n    const getReactionsForPost = makeGetReactionsForPost();\n\n    return function mapStateToProps(state: GlobalState, ownProps: Props) {\n        const config = getConfig(state);\n        const enableEmojiPicker = config.EnableEmojiPicker === 'true' && !ownProps.isReadOnly;\n\n        const channel = getChannel(state, ownProps.post.channel_id) || {};\n        const teamId = channel.team_id;\n\n        return {\n            teamId,\n            reactions: getReactionsForPost(state, ownProps.post.id),\n            enableEmojiPicker,\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            addReaction,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(ReactionList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport React from 'react';\n\nimport {localizeMessage} from 'utils/utils.jsx';\n\nexport type AttachmentTextOverflowType = 'ellipsis';\n\nconst MAX_POST_HEIGHT = 600;\nconst MARGIN_CHANGE_FOR_COMPACT_POST = 22;\n\ntype Props = {\n    children?: React.ReactNode;\n    checkOverflow?: number;\n    isAttachmentText?: boolean;\n    isRHSExpanded: boolean;\n    isRHSOpen: boolean;\n    text?: string;\n    compactDisplay: boolean;\n    overflowType?: AttachmentTextOverflowType;\n    maxHeight?: number;\n}\n\ntype State = {\n    isCollapsed: boolean;\n    isOverflow: boolean;\n}\n\nexport default class ShowMore extends React.PureComponent<Props, State> {\n    private maxHeight: number;\n    private textContainer: React.RefObject<HTMLDivElement>;\n    private overflowRef?: number;\n\n    constructor(props: Props) {\n        super(props);\n        this.maxHeight = this.props.maxHeight || MAX_POST_HEIGHT;\n        this.textContainer = React.createRef();\n        this.state = {\n            isCollapsed: true,\n            isOverflow: false,\n        };\n    }\n\n    componentDidMount() {\n        this.checkTextOverflow();\n\n        window.addEventListener('resize', this.handleResize);\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (\n            this.props.text !== prevProps.text ||\n            this.props.isRHSExpanded !== prevProps.isRHSExpanded ||\n            this.props.isRHSOpen !== prevProps.isRHSOpen ||\n            this.props.checkOverflow !== prevProps.checkOverflow\n        ) {\n            this.checkTextOverflow();\n        }\n    }\n\n    componentWillUnmount() {\n        window.removeEventListener('resize', this.handleResize);\n        if (this.overflowRef) {\n            window.cancelAnimationFrame(this.overflowRef);\n        }\n    }\n\n    toggleCollapse = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n        e.preventDefault();\n        e.stopPropagation();\n        this.setState((prevState) => {\n            return {\n                isCollapsed: !prevState.isCollapsed,\n            };\n        });\n    };\n\n    checkTextOverflow = () => {\n        if (this.overflowRef) {\n            window.cancelAnimationFrame(this.overflowRef);\n        }\n        this.overflowRef = window.requestAnimationFrame(() => {\n            let isOverflow = false;\n\n            if (this.textContainer.current && this.textContainer.current.scrollHeight > this.maxHeight) {\n                isOverflow = true;\n            }\n\n            if (isOverflow !== this.state.isOverflow) {\n                this.setState({\n                    isOverflow,\n                });\n            }\n        });\n    };\n\n    handleResize = () => {\n        this.checkTextOverflow();\n    };\n\n    render() {\n        const {\n            isCollapsed,\n            isOverflow,\n        } = this.state;\n\n        const {\n            children,\n            isAttachmentText,\n            compactDisplay,\n            overflowType,\n        } = this.props;\n\n        let className = 'post-message';\n        let collapsedMaxHeightStyle: number | undefined;\n        if (isCollapsed) {\n            collapsedMaxHeightStyle = this.maxHeight;\n            className += ' post-message--collapsed';\n        } else {\n            className += ' post-message--expanded';\n        }\n\n        const collapseGradientClass = isAttachmentText ? 'post-attachment-collapse__gradient' : 'post-collapse__gradient';\n        const collapseShowMoreClass = isAttachmentText ? 'post-attachment-collapse__show-more' : 'post-collapse__show-more';\n\n        let attachmentTextOverflow = null;\n        if (isOverflow) {\n            if (!isAttachmentText && isCollapsed && compactDisplay) {\n                if (collapsedMaxHeightStyle) {\n                    collapsedMaxHeightStyle -= MARGIN_CHANGE_FOR_COMPACT_POST;\n                }\n            }\n\n            let showIcon = 'fa fa-angle-up';\n            let showText = localizeMessage('post_info.message.show_less', 'Show less');\n            if (isCollapsed) {\n                showIcon = 'fa fa-angle-down';\n                showText = localizeMessage('post_info.message.show_more', 'Show more');\n            }\n            switch (overflowType) {\n            case 'ellipsis':\n                attachmentTextOverflow = (\n                    <button\n                        id='showMoreButton'\n                        className='post-preview-collapse__show-more-button color--link'\n                        onClick={this.toggleCollapse}\n                    >\n                        {showText}\n                    </button>\n                );\n                className += ' post-message-preview--overflow';\n                break;\n\n            default:\n                attachmentTextOverflow = (\n                    <div className='post-collapse'>\n                        <div\n                            id='collapseGradient'\n                            className={collapseGradientClass}\n                        />\n                        <div className={collapseShowMoreClass}>\n                            <div className='post-collapse__show-more-line'/>\n                            <button\n                                id='showMoreButton'\n                                className='post-collapse__show-more-button'\n                                onClick={this.toggleCollapse}\n                            >\n                                <span className={showIcon}/>\n                                {showText}\n                            </button>\n                            <div className='post-collapse__show-more-line'/>\n                        </div>\n                    </div>\n                );\n                className += ' post-message--overflow';\n                break;\n            }\n        }\n\n        return (\n            <div className={className}>\n                <div\n                    style={{maxHeight: collapsedMaxHeightStyle}}\n                    className='post-message__text-container'\n                    ref={this.textContainer}\n                >\n                    {children}\n                </div>\n                {attachmentTextOverflow}\n            </div>\n        );\n    }\n}\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {get} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {getIsRhsExpanded, getIsRhsOpen} from 'selectors/rhs';\nimport {Preferences} from 'utils/constants';\n\nimport {GlobalState} from 'types/store';\n\nimport ShowMore from './show_more';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        isRHSExpanded: getIsRhsExpanded(state),\n        isRHSOpen: getIsRhsOpen(state),\n        compactDisplay: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.MESSAGE_DISPLAY, Preferences.MESSAGE_DISPLAY_DEFAULT) === Preferences.MESSAGE_DISPLAY_COMPACT,\n    };\n}\n\nexport default connect(mapStateToProps)(ShowMore);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n    className: string;\n    status: string;\n}\n\nexport default class StatusIconNew extends React.PureComponent<Props> {\n    static defaultProps: Props = {\n        className: '',\n        status: '',\n    };\n\n    render() {\n        const {status, className} = this.props;\n\n        if (!status) {\n            return null;\n        }\n\n        let iconName = 'icon-circle-outline';\n        if (status === 'online') {\n            iconName = 'icon-check-circle';\n        } else if (status === 'away') {\n            iconName = 'icon-clock';\n        } else if (status === 'dnd') {\n            iconName = 'icon-minus-circle';\n        }\n\n        return <i className={`${iconName} ${className}`}/>;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ComponentProps} from 'react';\n\nimport OverlayTrigger, {BaseOverlayTrigger} from 'components/overlay_trigger';\nimport ProfilePopover from 'components/profile_popover';\nimport StatusIcon from 'components/status_icon';\nimport StatusIconNew from 'components/status_icon_new';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport './profile_picture.scss';\n\ninterface MMOverlayTrigger extends BaseOverlayTrigger {\n    hide: () => void;\n}\n\ntype Props = {\n    hasMention?: boolean;\n    isBusy?: boolean;\n    isEmoji?: boolean;\n    isRHS?: boolean;\n    profileSrc?: string;\n    size?: ComponentProps<typeof Avatar>['size'];\n    src: string;\n    status?: string;\n    userId?: string;\n    channelId?: string;\n    username?: string;\n    wrapperClass?: string;\n    overwriteIcon?: string;\n    overwriteName?: string;\n    newStatusIcon?: boolean;\n    statusClass?: string;\n    isBot?: boolean;\n    fromWebhook?: boolean;\n    fromAutoResponder?: boolean;\n}\n\nexport default class ProfilePicture extends React.PureComponent<Props> {\n    public static defaultProps = {\n        size: 'md',\n        isRHS: false,\n        isEmoji: false,\n        hasMention: false,\n        wrapperClass: '',\n    };\n\n    overlay = React.createRef<MMOverlayTrigger>();\n\n    public hideProfilePopover = () => {\n        if (this.overlay.current) {\n            this.overlay.current.hide();\n        }\n    }\n\n    public render() {\n        // profileSrc will, if possible, be the original user profile picture even if the icon\n        // for the post is overriden, so that the popup shows the user identity\n        const profileSrc = (typeof this.props.profileSrc === 'string' && this.props.profileSrc !== '') ?\n            this.props.profileSrc :\n            this.props.src;\n\n        const profileIconClass = `profile-icon ${this.props.isEmoji ? 'emoji' : ''}`;\n\n        const hideStatus = this.props.isBot || this.props.fromAutoResponder || this.props.fromWebhook;\n\n        if (this.props.userId) {\n            return (\n                <OverlayTrigger\n                    ref={this.overlay}\n                    trigger='click'\n                    placement='right'\n                    rootClose={true}\n                    overlay={\n                        <ProfilePopover\n                            className='user-profile-popover'\n                            userId={this.props.userId}\n                            src={profileSrc}\n                            isBusy={this.props.isBusy}\n                            hide={this.hideProfilePopover}\n                            isRHS={this.props.isRHS}\n                            channelId={this.props.channelId}\n                            hasMention={this.props.hasMention}\n                            overwriteIcon={this.props.overwriteIcon}\n                            overwriteName={this.props.overwriteName}\n                            hideStatus={hideStatus}\n                        />\n                    }\n                >\n                    <button\n                        className={`status-wrapper style--none ${this.props.wrapperClass}`}\n                        tabIndex={-1}\n                    >\n                        <span className={profileIconClass}>\n                            <Avatar\n                                username={this.props.username}\n                                size={this.props.size}\n                                url={this.props.src}\n                            />\n                        </span>\n                        <StatusIcon status={this.props.status}/>\n                    </button>\n                </OverlayTrigger>\n            );\n        }\n        return (\n            <span className={`status-wrapper style--none ${this.props.wrapperClass}`}>\n                <span className={profileIconClass}>\n                    <Avatar\n                        size={this.props.size}\n                        url={this.props.src}\n                    />\n                </span>\n                {this.props.newStatusIcon ? (\n                    <StatusIconNew\n                        className={this.props.statusClass}\n                        status={this.props.status}\n                    />\n                ) : <StatusIcon status={this.props.status}/>}\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getTeamMember} from 'mattermost-redux/actions/teams';\nimport {getChannelMember} from 'mattermost-redux/actions/channels';\n\nexport function getMembershipForEntities(teamId, userId, channelId) {\n    return async (dispatch) => {\n        return Promise.all([\n            dispatch(getTeamMember(teamId, userId)),\n            channelId && dispatch(getChannelMember(channelId, userId)),\n        ]);\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {\n    getChannelsInCurrentTeam,\n} from 'mattermost-redux/selectors/entities/channels';\nimport {getMyChannelMemberships} from 'mattermost-redux/selectors/entities/common';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserLocale} from 'mattermost-redux/selectors/entities/i18n';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {sortChannelsByTypeAndDisplayName} from 'mattermost-redux/utils/channel_utils';\nimport {logError} from 'mattermost-redux/actions/errors';\n\nimport store from 'stores/redux_store.jsx';\nimport {Constants} from 'utils/constants';\n\nimport Provider from './provider.jsx';\nimport Suggestion from './suggestion.jsx';\n\nclass SearchChannelWithPermissionsSuggestion extends Suggestion {\n    static get propTypes() {\n        return {\n            ...super.propTypes,\n        };\n    }\n\n    render() {\n        const {item, isSelection} = this.props;\n        const channel = item.channel;\n        const channelIsArchived = channel.delete_at && channel.delete_at !== 0;\n\n        let className = 'suggestion-list__item';\n        if (isSelection) {\n            className += ' suggestion--selected';\n        }\n\n        const displayName = channel.display_name;\n        let icon = null;\n        if (channelIsArchived) {\n            icon = (\n                <i className='icon icon--no-spacing icon-archive-outline'/>\n            );\n        } else if (channel.type === Constants.OPEN_CHANNEL) {\n            icon = (\n                <i className='icon icon--no-spacing icon-globe'/>\n            );\n        } else if (channel.type === Constants.PRIVATE_CHANNEL) {\n            icon = (\n                <i className='icon icon--no-spacing icon-lock-outline'/>\n            );\n        }\n\n        return (\n            <div\n                onClick={this.handleClick}\n                className={className}\n                onMouseMove={this.handleMouseMove}\n                ref={(node) => {\n                    this.node = node;\n                }}\n                {...Suggestion.baseProps}\n            >\n                <span className='suggestion-list__icon suggestion-list__icon--large'>{icon}</span>\n                <div className='suggestion-list__ellipsis'>\n                    <span className='suggestion-list__main'>{displayName}</span>\n                </div>\n            </div>\n        );\n    }\n}\n\nlet prefix = '';\n\nfunction channelSearchSorter(wrappedA, wrappedB) {\n    const aIsArchived = wrappedA.channel.delete_at ? wrappedA.channel.delete_at !== 0 : false;\n    const bIsArchived = wrappedB.channel.delete_at ? wrappedB.channel.delete_at !== 0 : false;\n    if (aIsArchived && !bIsArchived) {\n        return 1;\n    } else if (!aIsArchived && bIsArchived) {\n        return -1;\n    }\n\n    const locale = getCurrentUserLocale(store.getState());\n\n    const a = wrappedA.channel;\n    const b = wrappedB.channel;\n\n    const aDisplayName = a.display_name.toLowerCase();\n    const bDisplayName = b.display_name.toLowerCase();\n\n    const aStartsWith = aDisplayName.startsWith(prefix);\n    const bStartsWith = bDisplayName.startsWith(prefix);\n    if (aStartsWith && bStartsWith) {\n        return sortChannelsByTypeAndDisplayName(locale, a, b);\n    } else if (!aStartsWith && !bStartsWith) {\n        return sortChannelsByTypeAndDisplayName(locale, a, b);\n    } else if (aStartsWith) {\n        return -1;\n    }\n\n    return 1;\n}\n\nexport default class SearchChannelWithPermissionsProvider extends Provider {\n    constructor(channelSearchFunc) {\n        super();\n        this.autocompleteChannelsForSearch = channelSearchFunc;\n    }\n\n    makeChannelSearchFilter(channelPrefix) {\n        const channelPrefixLower = channelPrefix.toLowerCase();\n\n        return (channel) => {\n            const state = store.getState();\n            const channelId = channel.id;\n            const teamId = getCurrentTeamId(state);\n\n            const searchString = channel.display_name;\n\n            if (channel.type === Constants.OPEN_CHANNEL &&\n                haveIChannelPermission(state, teamId, channelId, Permissions.MANAGE_PUBLIC_CHANNEL_MEMBERS)) {\n                return searchString.toLowerCase().includes(channelPrefixLower);\n            } else if (channel.type === Constants.PRIVATE_CHANNEL &&\n                haveIChannelPermission(state, teamId, channelId, Permissions.MANAGE_PRIVATE_CHANNEL_MEMBERS)) {\n                return searchString.toLowerCase().includes(channelPrefixLower);\n            }\n\n            return false;\n        };\n    }\n\n    handlePretextChanged(channelPrefix, resultsCallback) {\n        if (channelPrefix) {\n            prefix = channelPrefix;\n            this.startNewRequest(channelPrefix);\n            const state = store.getState();\n\n            // Dispatch suggestions for local data\n            const channels = getChannelsInCurrentTeam(state);\n            this.formatChannelsAndDispatch(channelPrefix, resultsCallback, channels);\n\n            // Fetch data from the server and dispatch\n            this.fetchChannels(channelPrefix, resultsCallback);\n        }\n\n        return true;\n    }\n\n    async fetchChannels(channelPrefix, resultsCallback) {\n        const state = store.getState();\n        const teamId = getCurrentTeamId(state);\n        if (!teamId) {\n            return;\n        }\n\n        const channelsAsync = this.autocompleteChannelsForSearch(teamId, channelPrefix);\n\n        let channelsFromServer = [];\n        try {\n            const {data} = await channelsAsync;\n            channelsFromServer = data;\n        } catch (err) {\n            store.dispatch(logError(err));\n        }\n\n        if (this.shouldCancelDispatch(channelPrefix)) {\n            return;\n        }\n\n        const channels = getChannelsInCurrentTeam(state).concat(channelsFromServer);\n        this.formatChannelsAndDispatch(channelPrefix, resultsCallback, channels);\n    }\n\n    formatChannelsAndDispatch(channelPrefix, resultsCallback, allChannels) {\n        const channels = [];\n\n        const state = store.getState();\n\n        const members = getMyChannelMemberships(state);\n\n        if (this.shouldCancelDispatch(channelPrefix)) {\n            return;\n        }\n\n        const completedChannels = {};\n\n        const channelFilter = this.makeChannelSearchFilter(channelPrefix);\n\n        const config = getConfig(state);\n        const viewArchivedChannels = config.ExperimentalViewArchivedChannels === 'true';\n\n        for (const id of Object.keys(allChannels)) {\n            const channel = allChannels[id];\n            if (!channel) {\n                continue;\n            }\n\n            if (completedChannels[channel.id]) {\n                continue;\n            }\n\n            if (channelFilter(channel)) {\n                const newChannel = Object.assign({}, channel);\n                const channelIsArchived = channel.delete_at !== 0;\n\n                const wrappedChannel = {channel: newChannel, name: newChannel.name, deactivated: false};\n                if (!viewArchivedChannels && channelIsArchived) {\n                    continue;\n                } else if (!members[channel.id]) {\n                    continue;\n                } else if (channel.type === Constants.OPEN_CHANNEL) {\n                    wrappedChannel.type = Constants.OPEN_CHANNEL;\n                } else if (channel.type === Constants.PRIVATE_CHANNEL) {\n                    wrappedChannel.type = Constants.PRIVATE_CHANNEL;\n                } else {\n                    continue;\n                }\n                completedChannels[channel.id] = true;\n                channels.push(wrappedChannel);\n            }\n        }\n\n        const channelNames = channels.\n            sort(channelSearchSorter).\n            map((wrappedChannel) => wrappedChannel.channel.name);\n\n        resultsCallback({\n            matchedPretext: channelPrefix,\n            terms: channelNames,\n            items: channels,\n            component: SearchChannelWithPermissionsSuggestion,\n        });\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {getFullName} from 'mattermost-redux/utils/user_utils';\n\nimport SearchChannelWithPermissionsProvider from 'components/suggestion/search_channel_with_permissions_provider.jsx';\nimport SuggestionBox from 'components/suggestion/suggestion_box.jsx';\nimport ModalSuggestionList from 'components/suggestion/modal_suggestion_list';\n\nimport {placeCaretAtEnd} from 'utils/utils.jsx';\n\nexport default class AddUserToChannelModal extends React.PureComponent {\n    static propTypes = {\n\n        /**\n         * Function that's called when modal is closed\n         */\n        onHide: PropTypes.func.isRequired,\n\n        /**\n         * The user that is being added to a channel\n         */\n        user: PropTypes.object.isRequired,\n\n        /**\n         * Object used to determine if the user\n         * is a member of a given channel\n         */\n        channelMembers: PropTypes.object.isRequired,\n\n        actions: PropTypes.shape({\n\n            /**\n             * Function to add the user to a channel\n             */\n            addChannelMember: PropTypes.func.isRequired,\n\n            /**\n             * Function to fetch the user's channel membership\n             */\n            getChannelMember: PropTypes.func.isRequired,\n\n            /**\n             * Function passed on to the constructor of the\n             * SearchChannelWithPermissionsProvider class to fetch channels\n             * based on a search term\n             */\n            autocompleteChannelsForSearch: PropTypes.func.isRequired,\n        }).isRequired,\n    }\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n\n            /**\n             * Whether or not the modal is visible\n             */\n            show: true,\n\n            /**\n             * Whether or not a request to add the user is in progress\n             */\n            saving: false,\n\n            /**\n             * Whether or not a request to check for the user's channel membership\n             * is in progress\n             */\n            checkingForMembership: false,\n\n            /**\n             * The user input in the channel search box\n             */\n            text: '',\n\n            /**\n             * The id for the channel that is selected\n             */\n            selectedChannelId: null,\n\n            /**\n             * An error to display when the add request fails\n             */\n            submitError: '',\n        };\n        this.suggestionProviders = [new SearchChannelWithPermissionsProvider(props.actions.autocompleteChannelsForSearch)];\n        this.enableChannelProvider();\n    }\n\n    enableChannelProvider = () => {\n        this.suggestionProviders[0].disableDispatches = false;\n    }\n\n    focusTextbox = () => {\n        if (this.channelSearchBox == null) {\n            return;\n        }\n\n        const textbox = this.channelSearchBox.getTextbox();\n        if (document.activeElement !== textbox) {\n            textbox.focus();\n            placeCaretAtEnd(textbox);\n        }\n    }\n\n    onInputChange = (e) => {\n        this.setState({text: e.target.value, selectedChannelId: null});\n    }\n\n    onHide = () => {\n        this.setState({show: false});\n        this.props.onHide();\n    }\n\n    setSearchBoxRef = (input) => {\n        this.channelSearchBox = input;\n        this.focusTextbox();\n    }\n\n    handleSubmitError = (error) => {\n        if (error) {\n            this.setState({submitError: error.message, saving: false});\n        }\n    }\n\n    didSelectChannel = (selection) => {\n        const channel = selection.channel;\n        const userId = this.props.user.id;\n\n        this.setState({\n            text: channel.display_name,\n            selectedChannelId: channel.id,\n            checkingForMembership: true,\n            submitError: '',\n        });\n\n        this.props.actions.getChannelMember(channel.id, userId).then(() => {\n            this.setState({checkingForMembership: false});\n        });\n    }\n\n    handleSubmit = (e) => {\n        if (e && e.preventDefault) {\n            e.preventDefault();\n        }\n\n        const channelId = this.state.selectedChannelId;\n        const user = this.props.user;\n\n        if (!channelId) {\n            return;\n        }\n\n        if (this.isUserMemberOfChannel(channelId) || this.state.saving) {\n            return;\n        }\n\n        this.setState({saving: true});\n\n        this.props.actions.addChannelMember(channelId, user.id).then(({error}) => {\n            if (error) {\n                this.handleSubmitError(error);\n            } else {\n                this.onHide();\n            }\n        });\n    }\n\n    isUserMemberOfChannel = (channelId) => {\n        const user = this.props.user;\n        const memberships = this.props.channelMembers;\n\n        if (!channelId) {\n            return false;\n        }\n\n        if (!memberships[channelId]) {\n            return false;\n        }\n\n        return Boolean(memberships[channelId][user.id]);\n    }\n\n    render() {\n        const user = this.props.user;\n        const channelId = this.state.selectedChannelId;\n        const targetUserIsMemberOfSelectedChannel = this.isUserMemberOfChannel(channelId);\n\n        let name = getFullName(user);\n        if (!name) {\n            name = `@${user.username}`;\n        }\n\n        let errorMsg;\n        if (!this.state.saving) {\n            if (this.state.submitError) {\n                errorMsg = (\n                    <label\n                        id='add-user-to-channel-modal__invite-error'\n                        className='modal__error has-error control-label'\n                    >\n                        {this.state.submitError}\n                    </label>\n                );\n            } else if (targetUserIsMemberOfSelectedChannel) {\n                errorMsg = (\n                    <label\n                        id='add-user-to-channel-modal__user-is-member'\n                        className='modal__error has-error control-label'\n                    >\n                        <FormattedMessage\n                            id='add_user_to_channel_modal.membershipExistsError'\n                            defaultMessage='{name} is already a member of that channel'\n                            values={{\n                                name,\n                            }}\n                        />\n                    </label>\n                );\n            }\n        }\n\n        const help = (\n            <FormattedMessage\n                id='add_user_to_channel_modal.help'\n                defaultMessage='Type to find a channel. Use ↑↓ to browse, ↵ to select, ESC to dismiss.'\n            />\n        );\n\n        const content = (\n            <SuggestionBox\n                ref={this.setSearchBoxRef}\n                className='form-control focused'\n                onChange={this.onInputChange}\n                value={this.state.text}\n                onItemSelected={this.didSelectChannel}\n                listComponent={ModalSuggestionList}\n                maxLength='64'\n                providers={this.suggestionProviders}\n                listPosition='bottom'\n                completeOnTab={false}\n                renderDividers={false}\n                delayInputUpdate={true}\n                openWhenEmpty={false}\n            />\n        );\n\n        const shouldDisableAddButton = targetUserIsMemberOfSelectedChannel ||\n            this.state.checkingForMembership ||\n            Boolean(!this.state.selectedChannelId) ||\n            this.state.saving;\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal modal--overflow'\n                show={this.state.show}\n                onHide={this.onHide}\n                onExited={this.props.onHide}\n                ref='modal'\n                enforceFocus={true}\n                role='dialog'\n                aria-labelledby='addChannelModalLabel'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='addChannelModalLabel'\n                    >\n                        <FormattedMessage\n                            id='add_user_to_channel_modal.title'\n                            defaultMessage='Add {name} to a Channel'\n                            values={{\n                                name,\n                            }}\n                        />\n                    </Modal.Title>\n                </Modal.Header>\n                <form\n                    role='form'\n                    onSubmit={this.handleSubmit}\n                >\n                    <Modal.Body>\n                        <div className='modal__hint'>\n                            {help}\n                        </div>\n                        <div className='pos-relative'>\n                            {content}\n                        </div>\n                        <div>\n                            {errorMsg}\n                            <br/>\n                        </div>\n                    </Modal.Body>\n                    <Modal.Footer>\n                        <button\n                            type='button'\n                            className='btn btn-link'\n                            onClick={this.onHide}\n                        >\n                            <FormattedMessage\n                                id='add_user_to_channel_modal.cancel'\n                                defaultMessage='Cancel'\n                            />\n                        </button>\n                        <button\n                            type='button'\n                            id='add-user-to-channel-modal__add-button'\n                            className='btn btn-primary'\n                            onClick={this.handleSubmit}\n                            disabled={shouldDisableAddButton}\n                        >\n                            <FormattedMessage\n                                id='add_user_to_channel_modal.add'\n                                defaultMessage='Add'\n                            />\n                        </button>\n                    </Modal.Footer>\n                </form>\n            </Modal>\n        );\n    }\n}\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {addChannelMember, getChannelMember, autocompleteChannelsForSearch} from 'mattermost-redux/actions/channels';\nimport {getChannelMembersInChannels} from 'mattermost-redux/selectors/entities/channels';\n\nimport AddUserToChannelModal from './add_user_to_channel_modal.jsx';\n\nfunction mapStateToProps(state) {\n    const channelMembers = getChannelMembersInChannels(state) || {};\n    return {\n        channelMembers,\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            addChannelMember,\n            getChannelMember,\n            autocompleteChannelsForSearch,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddUserToChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage, injectIntl, IntlShape} from 'react-intl';\n\nimport EventEmitter from 'mattermost-redux/utils/event_emitter';\nimport StatusIcon from 'components/status_icon';\nimport Timestamp from 'components/timestamp';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport UserSettingsModal from 'components/user_settings/modal';\nimport {browserHistory} from 'utils/browser_history';\nimport * as GlobalActions from 'actions/global_actions';\nimport Constants, {ModalIdentifiers, UserStatuses} from 'utils/constants';\nimport {t} from 'utils/i18n';\nimport * as Utils from 'utils/utils.jsx';\nimport Pluggable from 'plugins/pluggable';\nimport AddUserToChannelModal from 'components/add_user_to_channel_modal';\nimport LocalizedIcon from 'components/localized_icon';\nimport ToggleModalButtonRedux from 'components/toggle_modal_button_redux';\nimport Avatar from 'components/widgets/users/avatar';\nimport Popover from 'components/widgets/popover';\nimport SharedUserIndicator from 'components/shared_user_indicator';\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\nimport CustomStatusModal from 'components/custom_status/custom_status_modal';\nimport CustomStatusText from 'components/custom_status/custom_status_text';\nimport ExpiryTime from 'components/custom_status/expiry_time';\nimport {UserCustomStatus, UserProfile, UserTimezone, CustomStatusDuration} from 'mattermost-redux/types/users';\nimport {Dictionary} from 'mattermost-redux/types/utilities';\nimport {ServerError} from 'mattermost-redux/types/errors';\n\nimport './profile_popover.scss';\n\ninterface ProfilePopoverProps extends Omit<React.ComponentProps<typeof Popover>, 'id'>{\n\n    /**\n     * Source URL from the image to display in the popover\n     */\n    src: string;\n\n    /**\n     * Source URL from the image that should override default image\n     */\n    overwriteIcon?: string;\n\n    /**\n     * User the popover is being opened for\n     */\n    user?: Partial<UserProfile>;\n    userId: string;\n    channelId?: string;\n\n    /**\n     * Status for the user, either 'offline', 'away', 'dnd' or 'online'\n     */\n    status?: string;\n    hideStatus?: boolean;\n\n    /**\n     * Function to call to hide the popover\n     */\n    hide?: () => void;\n\n    /**\n     * Set to true if the popover was opened from the right-hand\n     * sidebar (comment thread, search results, etc.)\n     */\n    isRHS?: boolean;\n    isBusy?: boolean;\n\n    /**\n     * Returns state of modals in redux for determing which need to be closed\n     */\n    modals?: {\n        [modalId: string]: {\n            open: boolean;\n            dialogProps: Dictionary<any>;\n            dialogType: React.Component;\n        };\n    };\n    currentTeamId: string;\n\n    /**\n     * @internal\n     */\n    currentUserId: string;\n    customStatus?: UserCustomStatus | null;\n    isCustomStatusEnabled: boolean;\n    isCustomStatusExpired: boolean;\n    currentUserTimezone?: string;\n\n    /**\n     * @internal\n     */\n    hasMention?: boolean;\n\n    /**\n     * @internal\n     */\n    isInCurrentTeam: boolean;\n\n    /**\n     * @internal\n     */\n    teamUrl: string;\n\n    /**\n     * @internal\n     */\n    isTeamAdmin: boolean;\n\n    /**\n     * @internal\n     */\n    isChannelAdmin: boolean;\n\n    /**\n     * @internal\n     */\n    canManageAnyChannelMembersInCurrentTeam: boolean;\n\n    /**\n     * The overwritten username that should be shown at the top of the popover\n     */\n    overwriteName?: React.ReactNode;\n\n    /**\n     * @internal\n     */\n    enableTimezone: boolean;\n    actions: {\n        openModal: (modalData: {modalId: string; dialogType: any; dialogProps?: any}) => Promise<{\n            data: boolean;\n        }>;\n        closeModal: (modalId: string) => Promise<{\n            data: boolean;\n        }>;\n        openDirectChannelToUserId: (userId?: string) => Promise<{error: ServerError}>;\n        getMembershipForEntities: (teamId: string, userId: string, channelId?: string) => Promise<void>;\n    };\n    intl: IntlShape;\n}\ntype ProfilePopoverState = {\n    loadingDMChannel?: string;\n};\n\n/**\n * The profile popover, or hovercard, that appears with user information when clicking\n * on the username or profile picture of a user.\n */\nclass ProfilePopover extends React.PureComponent<\nProfilePopoverProps,\nProfilePopoverState\n> {\n    static getComponentName() {\n        return 'ProfilePopover';\n    }\n    static defaultProps = {\n        isRHS: false,\n        hasMention: false,\n        status: UserStatuses.OFFLINE,\n        customStatus: null,\n    };\n    constructor(props: ProfilePopoverProps) {\n        super(props);\n        this.state = {\n            loadingDMChannel: undefined,\n        };\n    }\n    componentDidMount() {\n        const {currentTeamId, userId, channelId} = this.props;\n        if (currentTeamId && userId) {\n            this.props.actions.getMembershipForEntities(\n                currentTeamId,\n                userId,\n                channelId,\n            );\n        }\n    }\n    handleShowDirectChannel = (e: React.MouseEvent<HTMLAnchorElement>) => {\n        const {actions} = this.props;\n        e.preventDefault();\n        if (!this.props.user) {\n            return;\n        }\n        const user = this.props.user;\n        if (this.state.loadingDMChannel !== undefined) {\n            return;\n        }\n        this.setState({loadingDMChannel: user.id});\n        actions.openDirectChannelToUserId(user.id).then((result: {error: ServerError}) => {\n            if (!result.error) {\n                if (Utils.isMobile()) {\n                    GlobalActions.emitCloseRightHandSide();\n                }\n                this.setState({loadingDMChannel: undefined});\n                if (this.props.hide) {\n                    this.props.hide();\n                }\n                browserHistory.push(`${this.props.teamUrl}/messages/@${user.username}`);\n            }\n        });\n        this.handleCloseModals();\n    };\n    handleMentionKeyClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n        e.preventDefault();\n        if (!this.props.user) {\n            return;\n        }\n        if (this.props.hide) {\n            this.props.hide();\n        }\n        EventEmitter.emit(\n            'mention_key_click',\n            this.props.user.username,\n            this.props.isRHS,\n        );\n        this.handleCloseModals();\n    };\n    handleEditAccountSettings = (e: React.MouseEvent<HTMLAnchorElement>) => {\n        e.preventDefault();\n        if (!this.props.user) {\n            return;\n        }\n        if (this.props.hide) {\n            this.props.hide();\n        }\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.USER_SETTINGS,\n            dialogType: UserSettingsModal,\n            dialogProps: {isContentProductSettings: false},\n        });\n        this.handleCloseModals();\n    };\n    showCustomStatusModal = (e: React.MouseEvent<HTMLButtonElement>) => {\n        e.preventDefault();\n        if (this.props.hide) {\n            this.props.hide();\n        }\n        const customStatusInputModalData = {\n            modalId: ModalIdentifiers.CUSTOM_STATUS,\n            dialogType: CustomStatusModal,\n        };\n        this.props.actions.openModal(customStatusInputModalData);\n    };\n    handleAddToChannel = (e: React.MouseEvent<HTMLAnchorElement>) => {\n        e.preventDefault();\n        this.handleCloseModals();\n    };\n    handleCloseModals = () => {\n        const {modals} = this.props;\n        for (const modal in modals) {\n            if (!Object.prototype.hasOwnProperty.call(modals, modal)) {\n                continue;\n            }\n            if (modals[modal].open) {\n                this.props.actions.closeModal(modal);\n            }\n        }\n    };\n    renderCustomStatus() {\n        const {\n            customStatus,\n            isCustomStatusEnabled,\n            user,\n            currentUserId,\n            hideStatus,\n            isCustomStatusExpired,\n        } = this.props;\n        const customStatusSet = (customStatus?.text || customStatus?.emoji) && !isCustomStatusExpired;\n        const canSetCustomStatus = user?.id === currentUserId;\n        const shouldShowCustomStatus =\n      isCustomStatusEnabled &&\n      !hideStatus &&\n      (customStatusSet || canSetCustomStatus);\n        if (!shouldShowCustomStatus) {\n            return null;\n        }\n        let customStatusContent;\n        let expiryContent;\n        if (customStatusSet) {\n            const customStatusEmoji = (\n                <span className='d-flex'>\n                    <CustomStatusEmoji\n                        userID={this.props.user?.id}\n                        showTooltip={false}\n                        emojiStyle={{\n                            marginRight: 4,\n                            marginTop: 1,\n                        }}\n                    />\n                </span>\n            );\n            customStatusContent = (\n                <div className='d-flex'>\n                    {customStatusEmoji}\n                    <CustomStatusText\n                        tooltipDirection='top'\n                        text={customStatus?.text || ''}\n                        className='user-popover__email pb-1'\n                    />\n                </div>\n            );\n\n            expiryContent = customStatusSet && customStatus?.expires_at && customStatus.duration !== CustomStatusDuration.DONT_CLEAR && (\n                <ExpiryTime\n                    time={customStatus.expires_at}\n                    timezone={this.props.currentUserTimezone}\n                    className='ml-1'\n                    withinBrackets={true}\n                />\n            );\n        } else if (canSetCustomStatus) {\n            customStatusContent = (\n                <div>\n                    <button\n                        className='user-popover__set-custom-status-btn'\n                        onClick={this.showCustomStatusModal}\n                    >\n                        <FormattedMessage\n                            id='user_profile.custom_status.set_status'\n                            defaultMessage='Set a status'\n                        />\n                    </button>\n                </div>\n            );\n        }\n\n        return {customStatusContent, expiryContent};\n    }\n    render() {\n        if (!this.props.user) {\n            return null;\n        }\n\n        const keysToBeRemoved: Array<keyof ProfilePopoverProps> = ['user', 'userId', 'channelId', 'src', 'status', 'hideStatus', 'isBusy',\n            'hide', 'isRHS', 'hasMention', 'enableTimezone', 'currentUserId', 'currentTeamId', 'teamUrl', 'actions', 'isTeamAdmin',\n            'isChannelAdmin', 'canManageAnyChannelMembersInCurrentTeam', 'intl'];\n        const popoverProps: React.ComponentProps<typeof Popover> = Utils.deleteKeysFromObject({...this.props},\n            keysToBeRemoved);\n        const {formatMessage} = this.props.intl;\n        const dataContent = [];\n        const urlSrc = this.props.overwriteIcon ? this.props.overwriteIcon : this.props.src;\n        dataContent.push(\n            <div\n                className='user-popover-image'\n                key='user-popover-image'\n            >\n                <Avatar\n                    size='xxl'\n                    username={this.props.user?.username || ''}\n                    url={urlSrc}\n                />\n                <StatusIcon\n                    className='status user-popover-status'\n                    status={this.props.hideStatus ? undefined : this.props.status}\n                    button={true}\n                />\n            </div>,\n        );\n        const fullname = Utils.getFullName(this.props.user);\n        const haveOverrideProp =\n      this.props.overwriteIcon || this.props.overwriteName;\n        if ((fullname || this.props.user.position) && !haveOverrideProp) {\n            dataContent.push(\n                <hr\n                    key='user-popover-hr'\n                    className='divider divider--expanded'\n                />,\n            );\n        }\n        if (fullname && !haveOverrideProp) {\n            let sharedIcon;\n            if (this.props.user.remote_id) {\n                sharedIcon = (\n                    <SharedUserIndicator\n                        className='shared-user-icon'\n                        withTooltip={true}\n                    />\n                );\n            }\n            dataContent.push(\n                <div\n                    data-testId={`popover-fullname-${this.props.user.username}`}\n                    className='overflow--ellipsis text-nowrap'\n                    key='user-popover-fullname'\n                >\n                    <OverlayTrigger\n                        delayShow={Constants.OVERLAY_TIME_DELAY}\n                        placement='top'\n                        overlay={<Tooltip id='fullNameTooltip'>{fullname}</Tooltip>}\n                    >\n                        <span className='user-profile-popover__heading'>{fullname}</span>\n                    </OverlayTrigger>\n                    {sharedIcon}\n                </div>,\n            );\n        }\n        if (this.props.user.is_bot && !haveOverrideProp) {\n            dataContent.push(\n                <div\n                    key='bot-description'\n                    className='overflow--ellipsis text-nowrap'\n                >\n                    {this.props.user.bot_description}\n                </div>,\n            );\n        }\n        if (this.props.user.position && !haveOverrideProp) {\n            const position = (this.props.user?.position || '').substring(\n                0,\n                Constants.MAX_POSITION_LENGTH,\n            );\n            dataContent.push(\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='top'\n                    overlay={<Tooltip id='positionTooltip'>{position}</Tooltip>}\n                    key='user-popover-position'\n                >\n                    <div className='overflow--ellipsis text-nowrap pt-1 pb-1'>\n                        {position}\n                    </div>\n                </OverlayTrigger>,\n            );\n        }\n        const email = this.props.user.email || '';\n        if (email && !this.props.user.is_bot && !haveOverrideProp) {\n            dataContent.push(\n                <hr\n                    key='user-popover-hr2'\n                    className='divider divider--expanded'\n                />,\n            );\n            dataContent.push(\n                <div\n                    data-toggle='tooltip'\n                    title={email}\n                    key='user-popover-email'\n                >\n                    <a\n                        href={'mailto:' + email}\n                        className='text-nowrap text-lowercase user-popover__email pb-1'\n                    >\n                        {email}\n                    </a>\n                </div>,\n            );\n        }\n        dataContent.push(\n            <Pluggable\n                key='profilePopoverPluggable2'\n                pluggableName='PopoverUserAttributes'\n                user={this.props.user}\n                hide={this.props.hide}\n                status={this.props.hideStatus ? null : this.props.status}\n            />,\n        );\n        if (\n            this.props.enableTimezone &&\n      this.props.user.timezone &&\n      !haveOverrideProp\n        ) {\n            dataContent.push(\n                <div\n                    key='user-popover-local-time'\n                    className='pb-1'\n                >\n                    <span className='user-profile-popover__heading'>\n                        <FormattedMessage\n                            id='user_profile.account.localTime'\n                            defaultMessage='Local Time'\n                        />\n                    </span>\n                    <div>\n                        <Timestamp\n                            useRelative={false}\n                            useDate={false}\n                            userTimezone={this.props.user?.timezone as UserTimezone | undefined}\n                            useTime={{\n                                hour: 'numeric',\n                                minute: 'numeric',\n                                timeZoneName: 'short',\n                            }}\n                        />\n                    </div>\n                </div>,\n            );\n        }\n\n        const customStatusAndExpiryContent = !haveOverrideProp && this.renderCustomStatus();\n        if (customStatusAndExpiryContent) {\n            const {customStatusContent, expiryContent} = customStatusAndExpiryContent;\n            dataContent.push(\n                <div\n                    key='user-popover-status'\n                    id='user-popover-status'\n                    className='pb-1'\n                >\n                    <span className='user-profile-popover__heading'>\n                        <FormattedMessage\n                            id='user_profile.custom_status'\n                            defaultMessage='Status'\n                        />\n                        {expiryContent}\n                    </span>\n                    {customStatusContent}\n                </div>,\n            );\n        }\n        if (this.props.user.id === this.props.currentUserId && !haveOverrideProp) {\n            dataContent.push(\n                <div\n                    data-toggle='tooltip'\n                    key='user-popover-settings'\n                    className='popover__row first'\n                >\n                    <a\n                        href='#'\n                        onClick={this.handleEditAccountSettings}\n                    >\n                        <LocalizedIcon\n                            className='fa fa-pencil-square-o'\n                            title={{\n                                id: t('generic_icons.edit'),\n                                defaultMessage: 'Edit Icon',\n                            }}\n                        />\n                        <FormattedMessage\n                            id='user_profile.account.editProfile'\n                            defaultMessage='Edit Profile'\n                        />\n                    </a>\n                </div>,\n            );\n        }\n        if (haveOverrideProp) {\n            dataContent.push(\n                <div\n                    data-toggle='tooltip'\n                    key='user-popover-settings'\n                    className='popover__row first'\n                >\n                    <FormattedMessage\n                        id='user_profile.account.post_was_created'\n                        defaultMessage='This post was created by an integration from'\n                    />\n                    <a\n                        onClick={this.handleMentionKeyClick}\n                    >{` @${this.props.user.username}`}</a>\n                </div>,\n            );\n        }\n        if (this.props.user.id !== this.props.currentUserId && !haveOverrideProp) {\n            dataContent.push(\n                <div\n                    data-toggle='tooltip'\n                    key='user-popover-dm'\n                    className='popover__row first'\n                >\n                    <a\n                        href='#'\n                        className='text-nowrap user-popover__email'\n                        onClick={this.handleShowDirectChannel}\n                    >\n                        <LocalizedIcon\n                            className='fa fa-paper-plane'\n                            title={{\n                                id: t('user_profile.send.dm.icon'),\n                                defaultMessage: 'Send Message Icon',\n                            }}\n                        />\n                        <FormattedMessage\n                            id='user_profile.send.dm'\n                            defaultMessage='Send Message'\n                        />\n                    </a>\n                </div>,\n            );\n            if (\n                this.props.canManageAnyChannelMembersInCurrentTeam &&\n        this.props.isInCurrentTeam\n            ) {\n                const addToChannelMessage = formatMessage({\n                    id: 'user_profile.add_user_to_channel',\n                    defaultMessage: 'Add to a Channel',\n                });\n                dataContent.push(\n                    <div\n                        data-toggle='tooltip'\n                        className='popover__row first'\n                        key='user-popover-add-to-channel'\n                    >\n                        <a\n                            href='#'\n                            className='text-nowrap'\n                            onClick={this.handleAddToChannel}\n                        >\n                            <ToggleModalButtonRedux\n                                ariaLabel={addToChannelMessage}\n                                modalId={ModalIdentifiers.ADD_USER_TO_CHANNEL}\n                                role='menuitem'\n                                dialogType={AddUserToChannelModal}\n                                dialogProps={{user: this.props.user}}\n                                onClick={this.props.hide}\n                            >\n                                <LocalizedIcon\n                                    className='fa fa-user-plus'\n                                    title={{\n                                        id: t('user_profile.add_user_to_channel.icon'),\n                                        defaultMessage: 'Add User to Channel Icon',\n                                    }}\n                                />\n                                {addToChannelMessage}\n                            </ToggleModalButtonRedux>\n                        </a>\n                    </div>,\n                );\n            }\n        }\n        dataContent.push(\n            <Pluggable\n                key='profilePopoverPluggable3'\n                pluggableName='PopoverUserActions'\n                user={this.props.user}\n                hide={this.props.hide}\n                status={this.props.hideStatus ? null : this.props.status}\n            />,\n        );\n        let roleTitle;\n        if (this.props.user.is_bot) {\n            roleTitle = (\n                <span className='user-popover__role'>\n                    {Utils.localizeMessage('bots.is_bot', 'BOT')}\n                </span>\n            );\n        } else if (Utils.isGuest(this.props.user)) {\n            roleTitle = (\n                <span className='user-popover__role'>\n                    {Utils.localizeMessage('post_info.guest', 'GUEST')}\n                </span>\n            );\n        } else if (Utils.isSystemAdmin(this.props.user.roles)) {\n            roleTitle = (\n                <span className='user-popover__role'>\n                    {Utils.localizeMessage(\n                        'admin.permissions.roles.system_admin.name',\n                        'System Admin',\n                    )}\n                </span>\n            );\n        } else if (this.props.isTeamAdmin) {\n            roleTitle = (\n                <span className='user-popover__role'>\n                    {Utils.localizeMessage(\n                        'admin.permissions.roles.team_admin.name',\n                        'Team Admin',\n                    )}\n                </span>\n            );\n        } else if (this.props.isChannelAdmin) {\n            roleTitle = (\n                <span className='user-popover__role'>\n                    {Utils.localizeMessage(\n                        'admin.permissions.roles.channel_admin.name',\n                        'Channel Admin',\n                    )}\n                </span>\n            );\n        }\n        let title: React.ReactNode = `@${this.props.user.username}`;\n        if (this.props.overwriteName) {\n            title = this.props.overwriteName;\n            roleTitle = '';\n        } else if (this.props.hasMention) {\n            title = <a onClick={this.handleMentionKeyClick}>{title}</a>;\n        }\n        title = (\n            <span data-testid={`profilePopoverTitle_${this.props.user.username}`}>\n                <span className='user-popover__username'>{title}</span>\n                {roleTitle}\n            </span>\n        );\n        return (\n            <Popover\n                {...popoverProps}\n                title={title}\n                id='user-profile-popover'\n            >\n                {dataContent}\n            </Popover>\n        );\n    }\n}\n\nexport default injectIntl(ProfilePopover);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {getCurrentUserId, getStatusForUserId, getUser} from 'mattermost-redux/selectors/entities/users';\nimport {\n    getCurrentTeam,\n    getCurrentRelativeTeamUrl,\n    getTeamMember,\n} from 'mattermost-redux/selectors/entities/teams';\nimport {\n    getChannelMembersInChannels,\n    canManageAnyChannelMembersInCurrentTeam,\n    getCurrentChannelId,\n} from 'mattermost-redux/selectors/entities/channels';\n\nimport {openDirectChannelToUserId} from 'actions/channel_actions.jsx';\nimport {getMembershipForEntities} from 'actions/views/profile_popover';\nimport {closeModal, openModal} from 'actions/views/modals';\n\nimport {areTimezonesEnabledAndSupported, getCurrentUserTimezone} from 'selectors/general';\nimport {getRhsState, getSelectedPost} from 'selectors/rhs';\n\nimport {makeGetCustomStatus, isCustomStatusEnabled, isCustomStatusExpired} from 'selectors/views/custom_status';\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\nimport {GlobalState} from '../../types/store';\n\nimport {ServerError} from 'mattermost-redux/types/errors';\n\nimport ProfilePopover from './profile_popover';\n\ntype OwnProps = {\n    userId: string;\n    channelId?: string;\n}\n\nfunction getDefaultChannelId(state: GlobalState) {\n    const selectedPost = getSelectedPost(state);\n    return selectedPost.exists ? selectedPost.channel_id : getCurrentChannelId(state);\n}\n\nfunction makeMapStateToProps() {\n    const getCustomStatus = makeGetCustomStatus();\n\n    return (state: GlobalState, {userId, channelId = getDefaultChannelId(state)}: OwnProps) => {\n        const team = getCurrentTeam(state);\n        const teamMember = getTeamMember(state, team.id, userId);\n\n        const isTeamAdmin = Boolean(teamMember && teamMember.scheme_admin);\n        const channelMember = getChannelMembersInChannels(state)?.[channelId]?.[userId];\n\n        let isChannelAdmin = false;\n        if (getRhsState(state) !== 'search' && channelMember != null && channelMember.scheme_admin) {\n            isChannelAdmin = true;\n        }\n\n        const customStatus = getCustomStatus(state, userId);\n        return {\n            currentTeamId: team.id,\n            currentUserId: getCurrentUserId(state),\n            enableTimezone: areTimezonesEnabledAndSupported(state),\n            isTeamAdmin,\n            isChannelAdmin,\n            isInCurrentTeam: Boolean(teamMember) && teamMember?.delete_at === 0,\n            canManageAnyChannelMembersInCurrentTeam: canManageAnyChannelMembersInCurrentTeam(state),\n            status: getStatusForUserId(state, userId),\n            teamUrl: getCurrentRelativeTeamUrl(state),\n            user: getUser(state, userId),\n            modals: state.views.modals,\n            customStatus,\n            isCustomStatusEnabled: isCustomStatusEnabled(state),\n            isCustomStatusExpired: isCustomStatusExpired(state, customStatus),\n            channelId,\n            currentUserTimezone: getCurrentUserTimezone(state),\n        };\n    };\n}\n\ntype Actions = {\n    openModal: (modalData: {modalId: string; dialogType: any; dialogProps?: any}) => Promise<{\n        data: boolean;\n    }>;\n    closeModal: (modalId: string) => Promise<{\n        data: boolean;\n    }>;\n    openDirectChannelToUserId: (userId?: string) => Promise<{error: ServerError}>;\n    getMembershipForEntities: (teamId: string, userId: string, channelId?: string) => Promise<void>;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            closeModal,\n            openDirectChannelToUserId,\n            openModal,\n            getMembershipForEntities,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(ProfilePopover);\n","export default __webpack_public_path__ + \"files/f32f0094939e8e78a6b887a0f8a886df.svg\";","export default __webpack_public_path__ + \"files/561d2a7b1b180f1bc0585b0eb2fa1d00.svg\";","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ReactNode} from 'react';\n\nimport Badge from 'components/widgets/badges/badge';\n\ntype RadioGroupProps = {\n    id: string;\n    values: Array<{ key: string; value: string}>;\n    value: string;\n    badge?: {matchVal: string; text: ReactNode};\n    sideLegend?: {matchVal: string; text: ReactNode};\n    isDisabled?: (id: string) => boolean | boolean;\n    onChange(e: React.ChangeEvent<HTMLInputElement>): void;\n}\nconst RadioButtonGroup: React.FC<RadioGroupProps> = ({\n    id,\n    onChange,\n    isDisabled,\n    values,\n    value,\n    badge,\n    sideLegend,\n}: RadioGroupProps) => {\n    const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n        onChange(e);\n    };\n\n    const options = [];\n    for (const {value: val, key} of values) {\n        const disabled = isDisabled ? isDisabled(val) : false;\n        options.push(\n            <div\n                className='radio'\n                key={val}\n            >\n                <label className={val === value ? 'selected' : ''}>\n                    <input\n                        type='radio'\n                        value={val}\n                        name={id}\n                        checked={val === value}\n                        onChange={handleChange}\n                        disabled={disabled}\n                    />\n                    {key}\n                    {(sideLegend && val === sideLegend?.matchVal) &&\n                        <span className='side-legend'>\n                            {sideLegend.text}\n                        </span>\n                    }\n                </label>\n                {(badge && val === badge?.matchVal) &&\n                    <Badge className='radio-badge'>\n                        {badge.text}\n                    </Badge>\n                }\n            </div>,\n        );\n    }\n\n    return (\n        <div className='radio-list'>\n            {options}\n        </div>\n    );\n};\n\nexport default RadioButtonGroup;\n","export default __webpack_public_path__ + \"files/14fe300f70a0993958a9522ecd37592d.svg\";","export default __webpack_public_path__ + \"files/7cbbc5e4d6268cc9fc562eb04f9739bc.svg\";","export default __webpack_public_path__ + \"files/a633c8db75b2a15e13d980069d2e3298.svg\";","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Stripe} from '@stripe/stripe-js';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport {BillingDetails} from 'types/cloud/sku';\nimport {pageVisited} from 'actions/telemetry_actions';\nimport {TELEMETRY_CATEGORIES} from 'utils/constants';\n\nimport successSvg from 'images/cloud/payment_success.svg';\nimport failedSvg from 'images/cloud/payment_fail.svg';\nimport {t} from 'utils/i18n';\nimport {getNextBillingDate} from 'utils/utils';\n\nimport processSvg from 'images/cloud/processing_payment.svg';\n\nimport './process_payment.css';\n\nimport {Product} from 'mattermost-redux/types/cloud';\n\nimport IconMessage from './icon_message';\n\ntype Props = {\n    billingDetails: BillingDetails | null;\n    stripe: Promise<Stripe | null>;\n    isDevMode: boolean;\n    contactSupportLink: string;\n    addPaymentMethod: (stripe: Stripe, billingDetails: BillingDetails, isDevMode: boolean) => Promise<boolean | null>;\n    subscribeCloudSubscription: ((productId: string) => Promise<boolean | null>) | null;\n    onBack: () => void;\n    onClose: () => void;\n    selectedProduct?: Product | null | undefined;\n    currentProduct?: Product | null | undefined;\n    isProratedPayment?: boolean;\n}\n\ntype State = {\n    progress: number;\n    error: boolean;\n    state: ProcessState;\n}\n\nenum ProcessState {\n    PROCESSING = 0,\n    SUCCESS,\n    FAILED\n}\n\nconst MIN_PROCESSING_MILLISECONDS = 5000;\nconst MAX_FAKE_PROGRESS = 95;\n\nexport default class ProcessPaymentSetup extends React.PureComponent<Props, State> {\n    intervalId: NodeJS.Timeout;\n\n    public constructor(props: Props) {\n        super(props);\n\n        this.intervalId = {} as NodeJS.Timeout;\n\n        this.state = {\n            progress: 0,\n            error: false,\n            state: ProcessState.PROCESSING,\n        };\n    }\n\n    public componentDidMount() {\n        this.savePaymentMethod();\n\n        this.intervalId = setInterval(this.updateProgress, MIN_PROCESSING_MILLISECONDS / MAX_FAKE_PROGRESS);\n    }\n\n    public componentWillUnmount() {\n        clearInterval(this.intervalId);\n    }\n\n    private updateProgress = () => {\n        let {progress} = this.state;\n\n        if (progress >= MAX_FAKE_PROGRESS) {\n            clearInterval(this.intervalId);\n            return;\n        }\n\n        progress += 1;\n        this.setState({progress: progress > MAX_FAKE_PROGRESS ? MAX_FAKE_PROGRESS : progress});\n    }\n\n    private savePaymentMethod = async () => {\n        const start = new Date();\n        const {\n            stripe,\n            addPaymentMethod,\n            billingDetails,\n            isDevMode,\n            subscribeCloudSubscription,\n        } = this.props;\n        const success = await addPaymentMethod((await stripe)!, billingDetails!, isDevMode);\n\n        if (!success) {\n            this.setState({\n                error: true,\n                state: ProcessState.FAILED});\n            return;\n        }\n\n        if (subscribeCloudSubscription) {\n            const productUpdated = await subscribeCloudSubscription(this.props.selectedProduct?.id as string);\n\n            if (!productUpdated) {\n                this.setState({\n                    error: true,\n                    state: ProcessState.FAILED});\n                return;\n            }\n        }\n\n        const end = new Date();\n        const millisecondsElapsed = end.valueOf() - start.valueOf();\n        if (millisecondsElapsed < MIN_PROCESSING_MILLISECONDS) {\n            setTimeout(this.completePayment, MIN_PROCESSING_MILLISECONDS - millisecondsElapsed);\n            return;\n        }\n\n        this.completePayment();\n    }\n\n    private completePayment = () => {\n        clearInterval(this.intervalId);\n        this.setState({state: ProcessState.SUCCESS, progress: 100});\n    }\n\n    private handleGoBack = () => {\n        clearInterval(this.intervalId);\n        this.setState({\n            progress: 0,\n            error: false,\n            state: ProcessState.PROCESSING,\n        });\n        this.props.onBack();\n    }\n\n    private sucessPage = () => {\n        const {error} = this.state;\n        if (this.props.isProratedPayment) {\n            const formattedButonText = (\n                <FormattedMessage\n                    defaultMessage={'Lets go!'}\n                    id={'admin.billing.subscription.letsGo'}\n                />\n            );\n            const formattedTitle = (\n                <FormattedMessage\n                    defaultMessage={'You are now subscribed to {selectedProductName}'}\n                    id={'admin.billing.subscription.proratedPayment.title'}\n                    values={{selectedProductName: this.props.selectedProduct?.name}}\n                />\n            );\n            const formattedSubtitle = (\n                <FormattedMessage\n                    defaultMessage={'Thank you for upgrading to {selectedProductName}. You will be charged a prorated amount for your {currentProductName} plan and {selectedProductName} plan based on the number of days and number of users.'}\n                    id={'admin.billing.subscription.proratedPayment.substitle'}\n                    values={{selectedProductName: this.props.selectedProduct?.name, currentProductName: this.props.currentProduct?.name}}\n                />\n            );\n            return (\n                <>\n                    <IconMessage\n                        formattedTitle={formattedTitle}\n                        formattedSubtitle={formattedSubtitle}\n                        date={getNextBillingDate()}\n                        error={error}\n                        icon={successSvg}\n                        formattedButonText={formattedButonText}\n                        buttonHandler={this.props.onClose}\n                        className={'success'}\n                    />\n                </>\n            );\n        }\n        return (\n            <IconMessage\n                title={t('admin.billing.subscription.upgradedSuccess')}\n                subtitle={t('admin.billing.subscription.nextBillingDate')}\n                date={getNextBillingDate()}\n                error={error}\n                icon={successSvg}\n                buttonText={t('admin.billing.subscription.letsGo')}\n                buttonHandler={this.props.onClose}\n                className={'success'}\n            />\n        );\n    }\n\n    public render() {\n        const {state, progress, error} = this.state;\n\n        const progressBar: JSX.Element | null = (\n            <div className='ProcessPayment-progress'>\n                <div\n                    className='ProcessPayment-progress-fill'\n                    style={{width: `${progress}%`}}\n                />\n            </div>\n        );\n\n        switch (state) {\n        case ProcessState.PROCESSING:\n            return (\n                <IconMessage\n                    title={t('admin.billing.subscription.verifyPaymentInformation')}\n                    subtitle={''}\n                    icon={processSvg}\n                    footer={progressBar}\n                />\n            );\n        case ProcessState.SUCCESS:\n            pageVisited(\n                TELEMETRY_CATEGORIES.CLOUD_PURCHASING,\n                'pageview_payment_success',\n            );\n            return this.sucessPage();\n        case ProcessState.FAILED:\n            pageVisited(\n                TELEMETRY_CATEGORIES.CLOUD_PURCHASING,\n                'pageview_payment_failed',\n            );\n            return (\n                <IconMessage\n                    title={t('admin.billing.subscription.paymentVerificationFailed')}\n                    subtitle={t('admin.billing.subscription.paymentFailed')}\n                    icon={failedSvg}\n                    error={error}\n                    buttonText={t('admin.billing.subscription.goBackTryAgain')}\n                    buttonHandler={this.handleGoBack}\n                    linkText={t('admin.billing.subscription.privateCloudCard.contactSupport')}\n                    linkURL={this.props.contactSupportLink}\n                />\n            );\n        default:\n            return null;\n        }\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport classNames from 'classnames';\nimport {FormattedMessage} from 'react-intl';\n\nimport './icon_message.scss';\n\ntype Props = {\n    icon: string;\n    title?: string;\n    subtitle?: string;\n    date?: string;\n    error?: boolean;\n    buttonText?: string;\n    formattedButonText?: JSX.Element;\n    formattedTitle?: JSX.Element;\n    formattedSubtitle?: JSX.Element;\n    buttonHandler?: () => void;\n    linkText?: string;\n    linkURL?: string;\n    footer?: JSX.Element;\n    className?: string;\n}\n\nexport default function IconMessage(props: Props) {\n    const {\n        icon,\n        title,\n        subtitle,\n        date,\n        error,\n        buttonText,\n        formattedButonText,\n        formattedTitle,\n        formattedSubtitle,\n        buttonHandler,\n        linkText,\n        linkURL,\n        footer,\n        className,\n    } = props;\n\n    let button = null;\n    if ((buttonText || formattedButonText) && buttonHandler) {\n        button = (\n            <div className={classNames('IconMessage-button', error ? 'error' : '')}>\n                <button\n                    id='login_button'\n                    className='btn btn-primary Form-btn'\n                    onClick={buttonHandler}\n                >\n                    {formattedButonText || <FormattedMessage id={buttonText}/>}\n                </button>\n            </div>\n        );\n    }\n\n    let link = null;\n    if (linkText && linkURL) {\n        link = (\n            <div className='IconMessage-link'>\n                <a\n                    href={linkURL}\n                    target='_blank'\n                    rel='noopener noreferrer'\n                >\n                    <FormattedMessage\n                        id={linkText}\n                    />\n                </a>\n            </div>\n        );\n    }\n    return (\n        <div\n            id='payment_complete_header'\n            className='IconMessage'\n        >\n            <div className={classNames('content', className || '')}>\n                <img\n                    className='IconMessage-img'\n                    src={icon}\n                    alt='Payment icon'\n                />\n                <h3 className='IconMessage-h3'>\n                    {title ? <FormattedMessage id={title}/> : null}\n                    {formattedTitle || null}\n                </h3>\n                <div className={classNames('IconMessage-sub', error || '')}>\n                    {subtitle ? (\n                        <FormattedMessage\n                            id={subtitle}\n                            values={{date}}\n                        />\n                    ) : null}\n                    {formattedSubtitle || null}\n                </div>\n                {button}\n                {link}\n                {footer}\n            </div>\n        </div>\n    );\n}\n\nIconMessage.defaultProps = {\n    error: false,\n    subtitle: '',\n    date: '',\n    className: '',\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {ReactNode} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Stripe, StripeCardElementChangeEvent} from '@stripe/stripe-js';\nimport {loadStripe} from '@stripe/stripe-js/pure'; // https://github.com/stripe/stripe-js#importing-loadstripe-without-side-effects\nimport {Elements} from '@stripe/react-stripe-js';\n\nimport {Tooltip} from 'react-bootstrap';\n\nimport {isEmpty} from 'lodash';\n\nimport {CloudCustomer, Product} from 'mattermost-redux/types/cloud';\n\nimport {Dictionary} from 'mattermost-redux/types/utilities';\n\nimport upgradeImage from 'images/cloud/upgrade.svg';\nimport wavesBackground from 'images/cloud/waves.svg';\nimport blueDots from 'images/cloud/blue.svg';\nimport LowerBlueDots from 'images/cloud/blue-lower.svg';\nimport cloudLogo from 'images/cloud/mattermost-cloud.svg';\nimport {trackEvent, pageVisited} from 'actions/telemetry_actions';\nimport {Constants, TELEMETRY_CATEGORIES, CloudLinks, CloudProducts, BillingSchemes} from 'utils/constants';\n\nimport PaymentDetails from 'components/admin_console/billing/payment_details';\nimport {STRIPE_CSS_SRC, STRIPE_PUBLIC_KEY} from 'components/payment_form/stripe';\nimport RootPortal from 'components/root_portal';\nimport FullScreenModal from 'components/widgets/modals/full_screen_modal';\nimport RadioButtonGroup from 'components/common/radio_group';\nimport Badge from 'components/widgets/badges/badge';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport {areBillingDetailsValid, BillingDetails} from 'types/cloud/sku';\n\nimport {getNextBillingDate} from 'utils/utils';\n\nimport PaymentForm from '../payment_form/payment_form';\n\nimport ProcessPaymentSetup from './process_payment_setup';\n\nimport './purchase.scss';\nimport 'components/payment_form/payment_form.scss';\n\nlet stripePromise: Promise<Stripe | null>;\n\ntype RadioGroupOption = {\n    key: string;\n    value: string;\n    price: number;\n};\n\ntype ProductOptions = RadioGroupOption[];\n\ntype Props = {\n    customer: CloudCustomer | undefined;\n    show: boolean;\n    isDevMode: boolean;\n    products: Dictionary<Product> | undefined;\n    contactSupportLink: string;\n    contactSalesLink: string;\n    isFreeTrial: boolean;\n    productId: string | undefined;\n    actions: {\n        closeModal: () => void;\n        getCloudProducts: () => void;\n        completeStripeAddPaymentMethod: (stripe: Stripe, billingDetails: BillingDetails, isDevMode: boolean) => Promise<boolean | null>;\n        subscribeCloudSubscription: (productId: string) => Promise<boolean | null>;\n        getClientConfig: () => void;\n        getCloudSubscription: () => void;\n    };\n}\n\ntype State = {\n    paymentInfoIsValid: boolean;\n    billingDetails: BillingDetails | null;\n    cardInputComplete: boolean;\n    processing: boolean;\n    editPaymentInfo: boolean;\n    currentProduct: Product | null | undefined;\n    selectedProduct: Product | null | undefined;\n}\n\n/**\n *\n * @param products  Dictionary<Product> | undefined - the list of current cloud products\n * @param productId String - a valid product id used to find a particular product in the dictionary\n * @param productSku String - the sku value of the product of type either cloud-starter | cloud-professional | cloud-enterprise\n * @returns Product\n */\nfunction findProductInDictionary(products: Dictionary<Product> | undefined, productId?: string | null, productSku?: string): Product | null {\n    if (!products) {\n        return null;\n    }\n    const keys = Object.keys(products);\n    if (!keys.length) {\n        return null;\n    }\n    if (!productId && !productSku) {\n        return products[keys[0]];\n    }\n    let currentProduct = products[keys[0]];\n    if (keys.length > 1) {\n        // here find the product by the provided id or name, otherwise return the one with Professional in the name\n        keys.forEach((key) => {\n            if (productId && products[key].id === productId) {\n                currentProduct = products[key];\n            } else if (productSku && products[key].sku === productSku) {\n                currentProduct = products[key];\n            }\n        });\n    }\n\n    return currentProduct;\n}\n\nfunction getSelectedProduct(products: Dictionary<Product> | undefined, productId?: string | null) {\n    const currentProduct = findProductInDictionary(products, productId);\n    let nextSku = CloudProducts.PROFESSIONAL;\n    if (currentProduct?.sku === CloudProducts.PROFESSIONAL) {\n        nextSku = CloudProducts.ENTERPRISE;\n    }\n    return findProductInDictionary(products, null, nextSku);\n}\nexport default class PurchaseModal extends React.PureComponent<Props, State> {\n    modal = React.createRef();\n\n    public constructor(props: Props) {\n        super(props);\n        this.state = {\n            paymentInfoIsValid: false,\n            billingDetails: null,\n            cardInputComplete: false,\n            processing: false,\n            editPaymentInfo: isEmpty(props.customer?.payment_method && props.customer?.billing_address),\n            currentProduct: findProductInDictionary(props.products, props.productId),\n            selectedProduct: getSelectedProduct(props.products, props.productId),\n        };\n    }\n\n    async componentDidMount() {\n        pageVisited(TELEMETRY_CATEGORIES.CLOUD_PURCHASING, 'pageview_purchase');\n        if (isEmpty(this.state.currentProduct || this.state.selectedProduct)) {\n            await this.props.actions.getCloudProducts();\n            // eslint-disable-next-line react/no-did-mount-set-state\n            this.setState({\n                currentProduct: findProductInDictionary(this.props.products, this.props.productId),\n                selectedProduct: getSelectedProduct(this.props.products, this.props.productId),\n            });\n        }\n\n        this.props.actions.getClientConfig();\n    }\n\n    onPaymentInput = (billing: BillingDetails) => {\n        this.setState({\n            paymentInfoIsValid:\n            areBillingDetailsValid(billing) && this.state.cardInputComplete,\n        });\n        this.setState({billingDetails: billing});\n    }\n\n    handleCardInputChange = (event: StripeCardElementChangeEvent) => {\n        this.setState({\n            paymentInfoIsValid:\n            areBillingDetailsValid(this.state.billingDetails) && event.complete,\n        });\n        this.setState({cardInputComplete: event.complete});\n    }\n\n    handleSubmitClick = async () => {\n        this.setState({processing: true, paymentInfoIsValid: false});\n    }\n\n    comparePlan = (\n        <a\n            className='ml-1'\n            href={CloudLinks.COMPARE_PLANS}\n            target='_blank'\n            rel='noreferrer'\n            onMouseDown={(e) => {\n                e.preventDefault();\n\n                // MouseDown to track regular + middle clicks\n                trackEvent(\n                    TELEMETRY_CATEGORIES.CLOUD_PURCHASING,\n                    'click_compare_plans',\n                );\n            }}\n        >\n            <FormattedMessage\n                id='cloud_subscribe.contact_support'\n                defaultMessage='Compare plans'\n            />\n        </a>\n    );\n\n    onPlanSelected = (e: React.ChangeEvent<HTMLInputElement>): void => {\n        const selectedPlan = findProductInDictionary(this.props.products, e.target.value);\n        this.setState({selectedProduct: selectedPlan});\n    }\n\n    listPlans = (): JSX.Element => {\n        const products = this.props.products!;\n        const currentProduct = this.state.currentProduct!;\n\n        if (!products || !currentProduct) {\n            return (\n                <LoadingSpinner/>\n            );\n        }\n\n        let flatFeeProducts: ProductOptions = [];\n        let userBasedProducts: ProductOptions = [];\n        Object.keys(products).forEach((key: string) => {\n            const tempEl: RadioGroupOption = {\n                key: products[key].name,\n                value: products[key].id,\n                price: products[key].price_per_seat,\n            };\n            if (products[key].billing_scheme === BillingSchemes.FLAT_FEE) {\n                flatFeeProducts.push(tempEl);\n            } else {\n                userBasedProducts.push(tempEl);\n            }\n        });\n\n        // if not on trial, only show current plan and those higher than it in terms of price\n        if (!this.props.isFreeTrial) {\n            if (currentProduct.billing_scheme === BillingSchemes.PER_SEAT) {\n                flatFeeProducts = [];\n                userBasedProducts = userBasedProducts.filter((option: RadioGroupOption) => {\n                    return option.price >= currentProduct.price_per_seat;\n                });\n            } else {\n                flatFeeProducts = flatFeeProducts.filter((option: RadioGroupOption) => {\n                    return option.price >= currentProduct.price_per_seat;\n                });\n            }\n        }\n\n        const options = [...flatFeeProducts.sort((a: RadioGroupOption, b: RadioGroupOption) => a.price - b.price), ...userBasedProducts.sort((a: RadioGroupOption, b: RadioGroupOption) => a.price - b.price)];\n\n        const sideLegendTitle = (\n            <FormattedMessage\n                defaultMessage={'(Current Plan)'}\n                id={'admin.billing.subscription.purchaseModal.currentPlan'}\n            />\n        );\n\n        return (\n            <div className='plans-list'>\n                <RadioButtonGroup\n                    id='list-plans-radio-buttons'\n                    values={options!}\n                    value={this.state.selectedProduct?.id as string}\n                    sideLegend={{matchVal: currentProduct.id as string, text: sideLegendTitle}}\n                    onChange={(e: React.ChangeEvent<HTMLInputElement>) => this.onPlanSelected(e)}\n                />\n            </div>\n        );\n    }\n\n    displayDecimals = () => {\n        const price = this.state.selectedProduct?.price_per_seat.toFixed(2);\n        if (!price) {\n            return null;\n        }\n        let decimals = null;\n        const [, decimalPart] = price?.toString().split('.') as string[];\n        if (this.state.selectedProduct?.billing_scheme === BillingSchemes.FLAT_FEE && decimalPart) {\n            decimals = decimalPart;\n        }\n        if (decimals === null) {\n            return null;\n        }\n        return (\n            <span className='price-decimals'>\n                {decimals}\n            </span>\n        );\n    }\n\n    contactSalesLink = (text: ReactNode) => {\n        return (\n            <a\n                className='footer-text'\n                onClick={() => {\n                    trackEvent(\n                        TELEMETRY_CATEGORIES.CLOUD_PURCHASING,\n                        'click_contact_sales',\n                    );\n                }}\n                href={this.props.contactSalesLink}\n                target='_new'\n                rel='noopener noreferrer'\n            >\n                {text}\n            </a>\n        );\n    }\n\n    learnMoreLink = () => {\n        return (\n            <a\n                className='footer-text'\n                onClick={() => {\n                    trackEvent(\n                        TELEMETRY_CATEGORIES.CLOUD_PURCHASING,\n                        'learn_more_prorated_payment',\n                    );\n                }}\n                href={CloudLinks.PRORATED_PAYMENT}\n                target='_new'\n                rel='noopener noreferrer'\n            >\n                <FormattedMessage\n                    defaultMessage={'Learn more'}\n                    id={'admin.billing.subscription.LearnMore'}\n                />\n            </a>\n        );\n    }\n\n    editPaymentInfoHandler = () => {\n        this.setState((prevState: State) => {\n            return {\n                ...prevState,\n                editPaymentInfo: !prevState.editPaymentInfo,\n            };\n        });\n    }\n\n    paymentFooterText = () => {\n        const normalPaymentText = (\n            <FormattedMessage\n                defaultMessage={'Payment begins: {beginDate}'}\n                id={'admin.billing.subscription.paymentBegins'}\n                values={{\n                    beginDate: getNextBillingDate(),\n                }}\n            />\n        );\n\n        let payment = normalPaymentText;\n        if (!this.props.isFreeTrial && this.state.currentProduct?.billing_scheme === BillingSchemes.FLAT_FEE &&\n                this.state.selectedProduct?.billing_scheme === BillingSchemes.PER_SEAT) {\n            const announcementTooltip = (\n                <Tooltip\n                    id='proratedPayment__tooltip'\n                    className='proratedTooltip'\n                >\n                    <div className='tooltipTitle'>\n                        <FormattedMessage\n                            defaultMessage={'Prorated Payments'}\n                            id={'admin.billing.subscription.proratedPayment.tooltipTitle'}\n                        />\n                    </div>\n                    <div className='tooltipText'>\n                        <FormattedMessage\n                            defaultMessage={'If you upgrade to {selectedProductName} from {currentProductName} mid-month, you will be charged a prorated amount for both plans.'}\n                            id={'admin.billing.subscription.proratedPayment.tooltipText'}\n                            values={{\n                                beginDate: getNextBillingDate(),\n                                selectedProductName: this.state.selectedProduct?.name,\n                                currentProductName: this.state.currentProduct?.name,\n                            }}\n                        />\n                    </div>\n                </Tooltip>\n            );\n\n            const announcementIcon = (\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='top'\n                    overlay={announcementTooltip}\n                >\n                    <div className='content__icon'>{'\\uF5D6'}</div>\n                </OverlayTrigger>\n\n            );\n            const prorratedPaymentText = (\n                <div className='prorrated-payment-text'>\n                    {announcementIcon}\n                    <FormattedMessage\n                        defaultMessage={'Prorated payment begins: {beginDate}. '}\n                        id={'admin.billing.subscription.proratedPaymentBegins'}\n                        values={{\n                            beginDate: getNextBillingDate(),\n                        }}\n                    />\n                    {this.learnMoreLink()}\n                </div>\n            );\n            payment = prorratedPaymentText;\n        }\n        return payment;\n    }\n\n    purchaseScreen = () => {\n        let title;\n        let buttonTitle;\n        if (this.props.isFreeTrial) {\n            title = (\n                <FormattedMessage\n                    defaultMessage={'Provide Your Payment Details'}\n                    id={'admin.billing.subscription.providePaymentDetails'}\n                />\n            );\n            buttonTitle = (\n                <FormattedMessage\n                    defaultMessage={'Subscribe'}\n                    id={'admin.billing.subscription.cloudTrial.subscribe'}\n                />\n            );\n        } else {\n            title = (\n                <FormattedMessage\n                    defaultMessage={'Upgrade your Mattermost Cloud Susbcription'}\n                    id={'admin.billing.subscription.upgradeCloudSubscription'}\n                />\n            );\n            buttonTitle = (\n                <FormattedMessage\n                    defaultMessage={'Upgrade'}\n                    id={'admin.billing.subscription.upgrade'}\n                />\n            );\n        }\n\n        const bottomInformationMsg = (\n            <FormattedMessage\n                defaultMessage={\n                    'Your bill is calculated at the end of the billing cycle based on the number of enabled users. '\n                }\n                id={'admin.billing.subscription.freeTrialDisclaimer'}\n            />\n        );\n\n        let initialBillingDetails;\n        let validBillingDetails = false;\n\n        if (this.props.customer?.billing_address && this.props.customer?.payment_method) {\n            initialBillingDetails = {\n                address: this.props.customer?.billing_address.line1,\n                address2: this.props.customer?.billing_address.line2,\n                city: this.props.customer?.billing_address.city,\n                state: this.props.customer?.billing_address.state,\n                country: this.props.customer?.billing_address.country,\n                postalCode: this.props.customer?.billing_address.postal_code,\n                name: this.props.customer?.payment_method.name,\n            } as BillingDetails;\n\n            validBillingDetails = areBillingDetailsValid(initialBillingDetails);\n        }\n\n        return (\n            <div className={this.state.processing ? 'processing' : ''}>\n                <div className='LHS'>\n                    <div className='title'>\n                        {title}\n                    </div>\n                    <img\n                        className='image'\n                        alt='upgrade'\n                        src={upgradeImage}\n                    />\n                    <div className='footer-text'>\n                        <FormattedMessage\n                            defaultMessage={'Questions?'}\n                            id={'admin.billing.subscription.questions'}\n                        />\n                    </div>\n                    <a\n                        className='footer-text'\n                        onClick={() =>\n                            trackEvent(\n                                TELEMETRY_CATEGORIES.CLOUD_PURCHASING,\n                                'click_contact_support',\n                            )\n                        }\n                        href={this.props.contactSupportLink}\n                        rel='noopener noreferrer'\n                        target='_new'\n                    >\n                        <FormattedMessage\n                            defaultMessage={'Contact Support'}\n                            id={\n                                'admin.billing.subscription.privateCloudCard.contactSupport'\n                            }\n                        />\n                    </a>\n                </div>\n                <div className='central-panel'>\n                    {(this.state.editPaymentInfo || !validBillingDetails) ?\n                        <PaymentForm\n                            className='normal-text'\n                            onInputChange={this.onPaymentInput}\n                            onCardInputChange={this.handleCardInputChange}\n                            initialBillingDetails={initialBillingDetails}\n                        /> :\n                        <div className='PaymentDetails'>\n                            <div className='title'>\n                                <FormattedMessage\n                                    defaultMessage='Your saved payment details'\n                                    id='admin.billing.purchaseModal.savedPaymentDetailsTitle'\n                                />\n                            </div>\n                            <PaymentDetails>\n                                <button\n                                    onClick={this.editPaymentInfoHandler}\n                                    className='editPaymentButton'\n                                >\n                                    <FormattedMessage\n                                        defaultMessage='Edit'\n                                        id='admin.billing.purchaseModal.editPaymentInfoButton'\n                                    />\n                                </button>\n                            </PaymentDetails>\n                        </div>\n                    }\n                </div>\n                <div className='RHS'>\n                    <div className='price-container'>\n                        {(this.props.products && Object.keys(this.props.products).length > 1) &&\n                            <div className='select-plan'>\n                                <div className='title'>\n                                    <FormattedMessage\n                                        id='cloud_subscribe.select_plan'\n                                        defaultMessage='Select a plan'\n                                    />\n                                    {this.comparePlan}\n                                </div>\n                                {this.listPlans()}\n                            </div>\n                        }\n                        <div className='bold-text'>\n                            {this.state.selectedProduct?.name || ''}\n                        </div>\n                        {this.state.selectedProduct?.billing_scheme === BillingSchemes.FLAT_FEE &&\n                            <Badge className='unlimited-users-badge'>\n                                <FormattedMessage\n                                    defaultMessage={'Unlimited Users'}\n                                    id={'admin.billing.subscription.unlimitedUsers'}\n                                />\n                            </Badge>\n                        }\n                        <div className='price-text'>\n                            {`$${this.state.selectedProduct?.price_per_seat.toFixed(0) || 0}`}\n                            {this.displayDecimals()}\n                            <span className='monthly-text'>\n                                {this.state.selectedProduct?.billing_scheme === BillingSchemes.FLAT_FEE ?\n                                    <FormattedMessage\n                                        defaultMessage={' /month'}\n                                        id={'admin.billing.subscription.perMonth'}\n                                    /> :\n                                    <FormattedMessage\n                                        defaultMessage={' /user/month'}\n                                        id={'admin.billing.subscription.perUserPerMonth'}\n                                    />\n                                }\n                            </span>\n                        </div>\n                        {this.state.selectedProduct?.billing_scheme === BillingSchemes.FLAT_FEE &&\n                            <div className='payment-note'>\n                                <FormattedMessage\n                                    defaultMessage={'If your Mattermost Cloud trial started on or before September 15, please '}\n                                    id={'admin.billing.subscription.paymentNoteStart'}\n                                />\n                                {this.contactSalesLink(\n                                    <FormattedMessage\n                                        defaultMessage={'contact our Sales team'}\n                                        id={\n                                            'admin.billing.subscription.privateCloudCard.contactOurSalesTeam'\n                                        }\n                                    />,\n                                )}\n                                <FormattedMessage\n                                    defaultMessage={' for assistance'}\n                                    id={'admin.billing.subscription.paymentNoteEnd'}\n                                />\n                            </div>\n                        }\n                        <div className='footer-text'>\n                            {this.paymentFooterText()}\n                        </div>\n                        <button\n                            disabled={!this.state.paymentInfoIsValid}\n                            onClick={this.handleSubmitClick}\n                        >\n                            {buttonTitle}\n                        </button>\n                        <div className='fineprint-text'>\n                            <span>\n                                {bottomInformationMsg}\n                            </span>\n                            {'\\u00A0'}\n                            <a\n                                href={CloudLinks.BILLING_DOCS}\n                                target='_new'\n                                rel='noopener noreferrer'\n                            >\n                                <FormattedMessage\n                                    defaultMessage={'See how billing works.'}\n                                    id={'admin.billing.subscription.howItWorks'}\n                                />\n                            </a>\n                        </div>\n                    </div>\n                    <div className='footer-text'>\n                        <FormattedMessage\n                            defaultMessage={'Need other billing options?'}\n                            id={'admin.billing.subscription.otherBillingOption'}\n                        />\n                    </div>\n                    {this.contactSalesLink(\n                        <FormattedMessage\n                            defaultMessage={'Contact Sales'}\n                            id={\n                                'admin.billing.subscription.privateCloudCard.contactSales'\n                            }\n                        />,\n                    )}\n                    <div className='logo'>\n                        <img src={cloudLogo}/>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n\n    render() {\n        if (!stripePromise) {\n            stripePromise = loadStripe(STRIPE_PUBLIC_KEY);\n        }\n        return (\n            <Elements\n                options={{fonts: [{cssSrc: STRIPE_CSS_SRC}]}}\n                stripe={stripePromise}\n            >\n                <RootPortal>\n                    <FullScreenModal\n                        show={Boolean(this.props.show)}\n                        onClose={() => {\n                            trackEvent(\n                                TELEMETRY_CATEGORIES.CLOUD_PURCHASING,\n                                'click_close_purchasing_screen',\n                            );\n                            this.props.actions.getCloudSubscription();\n                            this.props.actions.closeModal();\n                        }}\n                        ref={this.modal}\n                        ariaLabelledBy='purchase_modal_title'\n                    >\n                        <div className='PurchaseModal'>\n                            {this.state.processing ? (\n                                <div>\n                                    <ProcessPaymentSetup\n                                        stripe={stripePromise}\n                                        billingDetails={this.state.billingDetails}\n                                        addPaymentMethod={\n                                            this.props.actions.completeStripeAddPaymentMethod\n                                        }\n                                        subscribeCloudSubscription={\n                                            this.props.actions.subscribeCloudSubscription\n                                        }\n                                        isDevMode={this.props.isDevMode}\n                                        onClose={() => {\n                                            this.props.actions.getCloudSubscription();\n                                            this.props.actions.closeModal();\n                                        }}\n                                        onBack={() => {\n                                            this.setState({processing: false});\n                                        }}\n                                        contactSupportLink={this.props.contactSalesLink}\n                                        selectedProduct={this.state.selectedProduct}\n                                        currentProduct={this.state.currentProduct}\n                                        isProratedPayment={(!this.props.isFreeTrial && this.state.currentProduct?.billing_scheme === BillingSchemes.FLAT_FEE) &&\n                                        this.state.selectedProduct?.billing_scheme === BillingSchemes.PER_SEAT}\n                                    />\n                                </div>\n                            ) : null}\n                            {this.purchaseScreen()}\n                            <div>\n                                <img\n                                    className='waves'\n                                    src={wavesBackground}\n                                />\n                                <img\n                                    className='blue-dots'\n                                    src={blueDots}\n                                />\n                                <img\n                                    className='lower-blue-dots'\n                                    src={LowerBlueDots}\n                                />\n                            </div>\n                        </div>\n                    </FullScreenModal>\n                </RootPortal>\n            </Elements>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\nimport {Stripe} from '@stripe/stripe-js';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {GenericAction, ActionFunc} from 'mattermost-redux/types/actions';\nimport {getCloudProducts, getCloudSubscription} from 'mattermost-redux/actions/cloud';\nimport {getClientConfig} from 'mattermost-redux/actions/general';\n\nimport {GlobalState} from 'types/store';\nimport {BillingDetails} from 'types/cloud/sku';\n\nimport {isModalOpen} from 'selectors/views/modals';\nimport {getCloudContactUsLink, InquiryType} from 'selectors/cloud';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport {closeModal} from 'actions/views/modals';\nimport {completeStripeAddPaymentMethod, subscribeCloudSubscription} from 'actions/cloud';\n\nimport PurchaseModal from './purchase_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n    const subscription = state.entities.cloud.subscription;\n\n    return {\n        show: isModalOpen(state, ModalIdentifiers.CLOUD_PURCHASE),\n        products: state.entities.cloud!.products,\n        isDevMode: getConfig(state).EnableDeveloper === 'true',\n        contactSupportLink: getCloudContactUsLink(state, InquiryType.Technical),\n        isFreeTrial: subscription?.is_free_trial === 'true',\n        contactSalesLink: getCloudContactUsLink(state, InquiryType.Sales),\n        productId: subscription?.product_id,\n        customer: state.entities.cloud.customer,\n    };\n}\ntype Actions = {\n    closeModal: () => void;\n    getCloudProducts: () => void;\n    completeStripeAddPaymentMethod: (stripe: Stripe, billingDetails: BillingDetails, isDevMode: boolean) => Promise<boolean | null>;\n    subscribeCloudSubscription: (productId: string) => Promise<boolean | null>;\n    getClientConfig: () => void;\n    getCloudSubscription: () => void;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>(\n            {\n                closeModal: () => closeModal(ModalIdentifiers.CLOUD_PURCHASE),\n                getCloudProducts,\n                completeStripeAddPaymentMethod,\n                subscribeCloudSubscription,\n                getClientConfig,\n                getCloudSubscription,\n            },\n            dispatch,\n        ),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PurchaseModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Tooltip} from 'react-bootstrap';\nimport classNames from 'classnames';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport AutosizeTextarea from 'components/autosize_textarea';\nimport Constants from 'utils/constants.jsx';\n\n// A component that can be used to make controlled inputs that function properly in certain\n// environments (ie. IE11) where typing quickly would sometimes miss inputs\nexport default class QuickInput extends React.PureComponent {\n    static propTypes = {\n\n        /**\n         * Whether to delay updating the value of the textbox from props. Should only be used\n         * on textboxes that to properly compose CJK characters as the user types.\n         */\n        delayInputUpdate: PropTypes.bool,\n\n        /**\n         * An optional React component that will be used instead of an HTML input when rendering\n         */\n        inputComponent: PropTypes.elementType,\n\n        /**\n         * The string value displayed in this input\n         */\n        value: PropTypes.string.isRequired,\n\n        /**\n         * When true, and an onClear callback is defined, show an X on the input field that clears\n         * the input when clicked.\n         */\n        clearable: PropTypes.bool,\n\n        /**\n         * The optional tooltip text to display on the X shown when clearable. Pass a components\n         * such as FormattedMessage to localize.\n         */\n        clearableTooltipText: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),\n\n        /**\n         * Callback to clear the input value, and used in tandem with the clearable prop above.\n         */\n        onClear: PropTypes.func,\n\n        /**\n         * ClassName for the clear button container\n         */\n        clearClassName: PropTypes.string,\n\n        /**\n         * Position in which the tooltip will be displayed\n         */\n        tooltipPosition: PropTypes.oneOf(['top', 'bottom']),\n\n        /**\n         * Callback to handle the change event of the input\n         */\n        onChange: PropTypes.func,\n\n        /**\n         * When true, and an onClear callback is defined, show an X on the input field even if\n         * the input is empty.\n         */\n        clearableWithoutValue: PropTypes.bool,\n    };\n\n    static defaultProps = {\n        delayInputUpdate: false,\n        value: '',\n        clearable: false,\n        tooltipPosition: 'bottom',\n    };\n\n    componentDidUpdate(prevProps) {\n        if (prevProps.value !== this.props.value) {\n            if (this.props.delayInputUpdate) {\n                requestAnimationFrame(this.updateInputFromProps);\n            } else {\n                this.updateInputFromProps();\n            }\n        }\n    }\n\n    updateInputFromProps = () => {\n        if (!this.input || this.input.value === this.props.value) {\n            return;\n        }\n\n        this.input.value = this.props.value;\n    }\n\n    get value() {\n        return this.input.value;\n    }\n\n    set value(value) {\n        this.input.value = value;\n    }\n\n    focus() {\n        this.input.focus();\n    }\n\n    blur() {\n        this.input.blur();\n    }\n\n    getInput = () => {\n        return this.input;\n    };\n\n    setInput = (input) => {\n        this.input = input;\n    }\n\n    onClear = (e) => {\n        e.preventDefault();\n        e.stopPropagation();\n        if (this.props.onClear) {\n            this.props.onClear();\n        }\n        this.focus();\n    }\n\n    render() {\n        let clearableTooltipText = this.props.clearableTooltipText;\n        if (!clearableTooltipText) {\n            clearableTooltipText = (\n                <FormattedMessage\n                    id={'input.clear'}\n                    defaultMessage='Clear'\n                />\n            );\n        }\n\n        const clearableTooltip = (\n            <Tooltip id={'InputClearTooltip'}>\n                {clearableTooltipText}\n            </Tooltip>\n        );\n\n        const {value, inputComponent, clearable, clearClassName, tooltipPosition, clearableWithoutValue, ...props} = this.props;\n\n        Reflect.deleteProperty(props, 'delayInputUpdate');\n        Reflect.deleteProperty(props, 'onClear');\n        Reflect.deleteProperty(props, 'clearableTooltipText');\n        Reflect.deleteProperty(props, 'channelId');\n        Reflect.deleteProperty(props, 'clearClassName');\n        Reflect.deleteProperty(props, 'tooltipPosition');\n\n        if (inputComponent !== AutosizeTextarea) {\n            Reflect.deleteProperty(props, 'onHeightChange');\n        }\n\n        const inputElement = React.createElement(\n            inputComponent || 'input',\n            {\n                ...props,\n                ref: this.setInput,\n                defaultValue: value, // Only set the defaultValue since the real one will be updated using componentDidUpdate\n            },\n        );\n\n        const showClearButton = this.props.onClear && (clearableWithoutValue || (clearable && value));\n        return (<div>\n            {inputElement}\n            {showClearButton &&\n                <div\n                    className={classNames(clearClassName, 'input-clear visible')}\n                    onMouseDown={this.onClear}\n                    onTouchEnd={this.onClear}\n                >\n                    <OverlayTrigger\n                        delayShow={Constants.OVERLAY_TIME_DELAY}\n                        placement={tooltipPosition}\n                        overlay={clearableTooltip}\n                    >\n                        <span\n                            className='input-clear-x'\n                            aria-hidden='true'\n                        >\n                            <i className='icon icon-close-circle'/>\n                        </span>\n                    </OverlayTrigger>\n                </div>\n            }\n        </div>);\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {Fragment, FC, InputHTMLAttributes, forwardRef} from 'react';\n\nimport classNames from 'classnames';\n\ninterface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n    className: string;\n    defaultValue?: string;\n    maxLength: number;\n}\n\n// An input component that renders a validation message (-{number of exceeding characters})\n// when the characters length of the value exceeds maxLength prop\n// to be used with QuickInput as an inputComponent\nconst MaxLengthInput: FC<InputProps> = forwardRef<HTMLInputElement, InputProps>(\n    ({className, defaultValue, maxLength, ...props}: InputProps, ref) => {\n        const excess: number = defaultValue ? defaultValue.length - maxLength : 0;\n\n        const classes: string = classNames({\n            MaxLengthInput: true,\n            [className]: Boolean(className),\n            'has-error': excess > 0,\n        });\n\n        return (\n            <Fragment>\n                <input\n                    className={classes}\n                    defaultValue={defaultValue}\n                    ref={ref}\n                    {...props}\n                />\n                {excess > 0 && (\n                    <span className='MaxLengthInput__validation'>\n                        {'-'}\n                        {excess}\n                    </span>\n                )}\n            </Fragment>\n        );\n    },\n);\n\nexport default MaxLengthInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nexport default class UserGuideIcon extends React.PureComponent<React.HTMLAttributes<HTMLSpanElement>> {\n    render() {\n        return (\n            <span {...this.props}>\n                <FormattedMessage\n                    id='generic_icons.userGuide'\n                    defaultMessage='Help'\n                >\n                    {(ariaLabel: string) => (\n                        <svg\n                            width='18px'\n                            height='18px'\n                            viewBox='1 1 22 22'\n                            role='img'\n                            aria-label={ariaLabel}\n                            style={{width: '18px', height: '18px'}}\n                        >\n                            <path d='M11,18H13V16H11V18M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,6A4,4 0 0,0 8,10H10A2,2 0 0,1 12,8A2,2 0 0,1 14,10C14,12 11,11.75 11,15H13C13,12.75 16,12.5 16,10A4,4 0 0,0 12,6Z'/>\n                        </svg>\n                    )}\n                </FormattedMessage>\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage, injectIntl, IntlShape} from 'react-intl';\nimport classNames from 'classnames';\n\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport UserGuideIcon from 'components/widgets/icons/user_guide_icon';\nimport Menu from 'components/widgets/menu/menu';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport {toggleShortcutsModal} from 'actions/global_actions';\nimport {trackEvent} from 'actions/telemetry_actions';\n\nconst askTheCommunityUrl = 'https://mattermost.com/pl/default-ask-mattermost-community/';\n\ntype Props = {\n    intl: IntlShape;\n    helpLink: string;\n    reportAProblemLink: string;\n    enableAskCommunityLink: string;\n};\n\ntype State = {\n    buttonActive: boolean;\n};\n\nclass UserGuideDropdown extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            buttonActive: false,\n        };\n    }\n\n    toggleShortcutsModal = (e: MouseEvent) => {\n        e.preventDefault();\n        toggleShortcutsModal();\n    }\n\n    buttonToggleState = (menuActive: boolean) => {\n        this.setState({\n            buttonActive: menuActive,\n        });\n    }\n\n    askTheCommunityClick = () => {\n        trackEvent('ui', 'help_ask_the_community');\n    }\n\n    renderDropdownItems = (): React.ReactNode => {\n        const {intl} = this.props;\n\n        return (\n            <Menu.Group>\n                {this.props.enableAskCommunityLink === 'true' && (\n                    <Menu.ItemExternalLink\n                        id='askTheCommunityLink'\n                        url={askTheCommunityUrl}\n                        text={intl.formatMessage({id: 'userGuideHelp.askTheCommunity', defaultMessage: 'Ask the community'})}\n                        onClick={this.askTheCommunityClick}\n                    />\n                )}\n                <Menu.ItemExternalLink\n                    id='helpResourcesLink'\n                    url={this.props.helpLink}\n                    text={intl.formatMessage({id: 'userGuideHelp.helpResources', defaultMessage: 'Help resources'})}\n                />\n                <Menu.ItemExternalLink\n                    id='reportAProblemLink'\n                    url={this.props.reportAProblemLink}\n                    text={intl.formatMessage({id: 'userGuideHelp.reportAProblem', defaultMessage: 'Report a problem'})}\n                />\n                <Menu.ItemAction\n                    id='keyboardShortcuts'\n                    onClick={this.toggleShortcutsModal}\n                    text={intl.formatMessage({id: 'userGuideHelp.keyboardShortcuts', defaultMessage: 'Keyboard shortcuts'})}\n                />\n            </Menu.Group>\n        );\n    }\n\n    render() {\n        const {intl} = this.props;\n        const tooltip = (\n            <Tooltip\n                id='userGuideHelpTooltip'\n                className='hidden-xs'\n            >\n                <FormattedMessage\n                    id={'channel_header.userHelpGuide'}\n                    defaultMessage='Help'\n                />\n            </Tooltip>\n        );\n\n        return (\n            <MenuWrapper\n                className='userGuideHelp'\n                onToggle={this.buttonToggleState}\n            >\n                <OverlayTrigger\n                    delayShow={500}\n                    placement='bottom'\n                    overlay={this.state.buttonActive ? <></> : tooltip}\n                >\n                    <button\n                        id='channelHeaderUserGuideButton'\n                        className={classNames('channel-header__icon', {'channel-header__icon--active': this.state.buttonActive})}\n                        type='button'\n                        aria-expanded='true'\n                    >\n                        <UserGuideIcon className='icon'/>\n                    </button>\n                </OverlayTrigger>\n                <Menu\n                    openLeft={true}\n                    openUp={false}\n                    id='AddChannelDropdown'\n                    ariaLabel={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.dropdownAriaLabel', defaultMessage: 'Add Channel Dropdown'})}\n                >\n                    {this.renderDropdownItems()}\n                </Menu>\n            </MenuWrapper>\n        );\n    }\n}\n\nexport default injectIntl(UserGuideDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {GlobalState} from 'types/store';\n\nimport UserGuideDropdown from './user_guide_dropdown';\n\nfunction mapStateToProps(state: GlobalState) {\n    const {HelpLink, ReportAProblemLink, EnableAskCommunityLink} = getConfig(state);\n    return {\n        helpLink: HelpLink!,\n        reportAProblemLink: ReportAProblemLink!,\n        enableAskCommunityLink: EnableAskCommunityLink!,\n    };\n}\n\nexport default connect(mapStateToProps)(UserGuideDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport classNames from 'classnames';\n\nimport Search from 'components/search';\nimport FlagIcon from 'components/widgets/icons/flag_icon';\nimport MentionsIcon from 'components/widgets/icons/mentions_icon';\nimport {\n    Constants,\n    RHSStates,\n} from 'utils/constants';\n\nimport * as Utils from 'utils/utils';\n\nimport HeaderIconWrapper from 'components/channel_header/components/header_icon_wrapper';\n\nimport UserGuideDropdown from './components/user_guide_dropdown';\n\nconst SEARCH_BAR_MINIMUM_WINDOW_SIZE = 1140;\n\ntype Props = {\n    rhsState: typeof RHSStates[keyof typeof RHSStates] | null;\n    rhsOpen: boolean;\n    actions: {\n        showFlaggedPosts: () => void;\n        showMentions: () => void;\n        openRHSSearch: () => void;\n        closeRightHandSide: () => void;\n    };\n};\n\ntype State = {\n    showSearchBar: boolean;\n};\n\nconst HEADER_ICON = 'channel-header__icon';\nconst HEADER_ICON_ACTIVE = 'channel-header__icon--active';\n\nclass RHSSearchNav extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {showSearchBar: RHSSearchNav.getShowSearchBar(props)};\n    }\n\n    componentDidMount() {\n        document.addEventListener('keydown', this.handleShortcut);\n        window.addEventListener('resize', this.handleResize);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleShortcut);\n        window.removeEventListener('resize', this.handleResize);\n    }\n\n    static getDerivedStateFromProps(nextProps: Props) {\n        return {showSearchBar: RHSSearchNav.getShowSearchBar(nextProps)};\n    }\n\n    static getShowSearchBar(props: Props) {\n        return !Utils.isMobile() && (Utils.windowWidth() > SEARCH_BAR_MINIMUM_WINDOW_SIZE || props.rhsOpen);\n    }\n\n    handleResize = () => {\n        this.setState({showSearchBar: RHSSearchNav.getShowSearchBar(this.props)});\n    };\n\n    mentionButtonClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n        e.preventDefault();\n        this.searchMentions();\n    }\n\n    searchMentions = () => {\n        const {rhsState, actions: {closeRightHandSide, showMentions}} = this.props;\n\n        if (rhsState === RHSStates.MENTION) {\n            closeRightHandSide();\n        } else {\n            showMentions();\n        }\n    };\n\n    getFlagged = (e: React.MouseEvent<HTMLButtonElement>) => {\n        e.preventDefault();\n        if (this.props.rhsState === RHSStates.FLAG) {\n            this.props.actions.closeRightHandSide();\n        } else {\n            this.props.actions.showFlaggedPosts();\n        }\n    };\n\n    searchButtonClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n        e.preventDefault();\n\n        this.props.actions.openRHSSearch();\n    };\n\n    handleShortcut = (e: KeyboardEvent) => {\n        if (Utils.cmdOrCtrlPressed(e) && e.shiftKey) {\n            if (Utils.isKeyPressed(e, Constants.KeyCodes.M)) {\n                e.preventDefault();\n                this.searchMentions();\n            }\n        }\n    };\n\n    render() {\n        const {\n            rhsOpen,\n            rhsState,\n        } = this.props;\n\n        return (\n            <>\n                <Search\n                    isFocus={Utils.isMobile() || (rhsOpen && Boolean(rhsState))}\n                    hideSearchBar={!this.state.showSearchBar}\n                    enableFindShortcut={true}\n                />\n                <HeaderIconWrapper\n                    iconComponent={\n                        <MentionsIcon\n                            className='icon icon--standard'\n                            aria-hidden='true'\n                        />\n                    }\n                    ariaLabel={true}\n                    buttonClass={classNames(HEADER_ICON, {[HEADER_ICON_ACTIVE]: rhsState === RHSStates.MENTION})}\n                    buttonId={'channelHeaderMentionButton'}\n                    onClick={this.mentionButtonClick}\n                    tooltipKey={'recentMentions'}\n                />\n                <HeaderIconWrapper\n                    iconComponent={\n                        <FlagIcon className='icon icon__flag'/>\n                    }\n                    ariaLabel={true}\n                    buttonClass={classNames(HEADER_ICON, {[HEADER_ICON_ACTIVE]: rhsState === RHSStates.FLAG})}\n                    buttonId={'channelHeaderFlagButton'}\n                    onClick={this.getFlagged}\n                    tooltipKey={'flaggedPosts'}\n                />\n                <UserGuideDropdown/>\n            </>\n        );\n    }\n}\n\nexport default RHSSearchNav;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ComponentProps} from 'react';\nimport {bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {\n    showFlaggedPosts,\n    showMentions,\n    openRHSSearch,\n    closeRightHandSide,\n} from 'actions/views/rhs';\n\nimport {getIsRhsOpen, getRhsState} from 'selectors/rhs';\nimport {GlobalState} from 'types/store/index';\n\nimport RHSSearchNav from './rhs_search_nav';\n\ntype Props = ComponentProps<typeof RHSSearchNav>;\n\nfunction mapStateToProps(state: GlobalState): Omit<Props, 'actions'> {\n    return {\n        rhsState: getRhsState(state),\n        rhsOpen: getIsRhsOpen(state),\n    };\n}\n\nconst mapDispatchToProps = (dispatch: Dispatch<GenericAction>): Pick<Props, 'actions'> => ({\n    actions: bindActionCreators({\n        showFlaggedPosts,\n        showMentions,\n        openRHSSearch,\n        closeRightHandSide,\n    }, dispatch),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(RHSSearchNav);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n// As per rudder-sdk-js documentation, import this only once and use like a singleton.\n// See https://github.com/rudderlabs/rudder-sdk-js#step-1-install-rudderstack-using-the-code-snippet\nimport * as rudderAnalytics from 'rudder-sdk-js';\nexport {rudderAnalytics};\n\nimport {TelemetryHandler} from './telemetry';\n\nexport class RudderTelemetryHandler implements TelemetryHandler {\n    trackEvent(userId: string, userRoles: string, category: string, event: string, props?: any) {\n        const properties = Object.assign({\n            category,\n            type: event,\n            user_actual_role: userRoles,\n            user_actual_id: userId,\n        }, props);\n        const options = {\n            context: {\n                ip: '0.0.0.0',\n            },\n            page: {\n                path: '',\n                referrer: '',\n                search: '',\n                title: '',\n                url: '',\n            },\n            anonymousId: '00000000000000000000000000',\n        };\n\n        rudderAnalytics.track('event', properties, options);\n    }\n\n    pageVisited(userId: string, userRoles: string, category: string, name: string) {\n        rudderAnalytics.page(\n            category,\n            name,\n            {\n                path: '',\n                referrer: '',\n                search: '',\n                title: '',\n                url: '',\n                user_actual_role: userRoles,\n                user_actual_id: userId,\n            },\n            {\n                context: {\n                    ip: '0.0.0.0',\n                },\n                anonymousId: '00000000000000000000000000',\n            },\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, useEffect} from 'react';\n\nimport ThemeProvider, {lightTheme} from '@mattermost/compass-components/utilities/theme';\n\nimport {Theme} from 'mattermost-redux/types/themes';\n\ntype Props = {\n    theme: Theme;\n    children?: React.ReactNode;\n}\n\nconst CompassThemeProvider = ({theme, children}: Props): JSX.Element | null => {\n    const [compassTheme, setCompassTheme] = useState({\n        ...lightTheme,\n        noStyleReset: true,\n        noDefaultStyle: true,\n    });\n\n    useEffect(() => {\n        setCompassTheme({\n            ...compassTheme,\n            palette: {\n                ...compassTheme.palette,\n                primary: {\n                    ...compassTheme.palette.primary,\n                    main: theme.sidebarHeaderBg,\n                    contrast: theme.sidebarHeaderTextColor,\n                },\n                alert: {\n                    ...compassTheme.palette.alert,\n                    main: theme.dndIndicator,\n                },\n            },\n            action: {\n                ...compassTheme.action,\n                hover: theme.sidebarHeaderTextColor,\n                disabled: theme.sidebarHeaderTextColor,\n            },\n            badges: {\n                ...compassTheme.badges,\n                online: theme.onlineIndicator,\n                away: theme.awayIndicator,\n                dnd: theme.dndIndicator,\n            },\n            text: {\n                ...compassTheme.text,\n                primary: theme.sidebarHeaderTextColor,\n            },\n        });\n    }, [theme]);\n\n    return (\n        <ThemeProvider theme={compassTheme}>\n            {children}\n        </ThemeProvider>\n    );\n};\n\nexport default CompassThemeProvider;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {ActionTypes} from 'utils/constants';\n\nexport function setStatusDropdown(open: boolean) {\n    return {\n        type: ActionTypes.STATUS_DROPDOWN_TOGGLE,\n        open,\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {GlobalState} from 'types/store';\n\nexport function isStatusDropdownOpen(state: GlobalState) {\n    return state.views.statusDropdown.isOpen;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Preferences} from 'mattermost-redux/constants';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport {toTitleCase} from 'utils/utils.jsx';\nimport {UserStatuses} from 'utils/constants';\nimport {t} from 'utils/i18n';\n\nexport default class ResetStatusModal extends React.PureComponent {\n    static propTypes = {\n\n        /*\n         * The user's preference for whether their status is automatically reset\n         */\n        autoResetPref: PropTypes.string,\n\n        /*\n         * Props value is used to update currentUserStatus\n         */\n        currentUserStatus: PropTypes.string,\n\n        /*\n         * Props value is used to reset status from status_dropdown\n         */\n        newStatus: PropTypes.string,\n\n        /**\n         * Function called when modal is dismissed\n         */\n        onHide: PropTypes.func,\n        actions: PropTypes.shape({\n\n            /*\n             * Function to get and then reset the user's status if needed\n             */\n            autoResetStatus: PropTypes.func.isRequired,\n\n            /*\n             * Function to set the status for a user\n             */\n            setStatus: PropTypes.func.isRequired,\n\n            /*\n             * Function to save user preferences\n             */\n            savePreferences: PropTypes.func.isRequired,\n        }).isRequired,\n    };\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            show: false,\n            currentUserStatus: {},\n            newStatus: props.newStatus || 'online',\n        };\n    }\n\n    componentDidMount() {\n        this.props.actions.autoResetStatus().then(\n            (status) => {\n                const statusIsManual = status.manual;\n                const autoResetPrefNotSet = this.props.autoResetPref === '';\n\n                this.setState({\n                    currentUserStatus: status, // Set in state until status refactor where we store 'manual' field in redux\n                    show: Boolean(status.status === UserStatuses.OUT_OF_OFFICE || (statusIsManual && autoResetPrefNotSet)),\n                });\n            },\n        );\n    }\n\n    hideModal = () => {\n        this.setState({show: false});\n    };\n\n    onConfirm = (checked) => {\n        this.hideModal();\n\n        const newStatus = {...this.state.currentUserStatus};\n        newStatus.status = this.state.newStatus;\n        this.props.actions.setStatus(newStatus);\n\n        if (checked) {\n            const pref = {category: Preferences.CATEGORY_AUTO_RESET_MANUAL_STATUS, user_id: newStatus.user_id, name: newStatus.user_id, value: 'true'};\n            this.props.actions.savePreferences(pref.user_id, [pref]);\n        }\n    };\n\n    onCancel = (checked) => {\n        this.hideModal();\n\n        if (checked) {\n            const status = {...this.state.currentUserStatus};\n            const pref = {category: Preferences.CATEGORY_AUTO_RESET_MANUAL_STATUS, user_id: status.user_id, name: status.user_id, value: 'false'};\n            this.props.actions.savePreferences(pref.user_id, [pref]);\n        }\n    };\n\n    renderModalMessage = () => {\n        if (this.props.currentUserStatus === UserStatuses.OUT_OF_OFFICE) {\n            return (\n                <FormattedMessage\n                    id={`modal.manual_status.auto_responder.message_${this.state.newStatus}`}\n                    defaultMessage='Would you like to switch your status to \"{status}\" and disable Automatic Replies?'\n                    values={{\n                        status: toTitleCase(this.state.newStatus),\n                    }}\n                />\n            );\n        }\n\n        return (\n            <FormattedMessage\n                id={`modal.manual_status.message_${this.state.newStatus}`}\n                defaultMessage='Would you like to switch your status to \"{status}\"?'\n                values={{\n                    status: toTitleCase(this.state.newStatus),\n                }}\n            />\n        );\n    };\n\n    render() {\n        const userStatus = this.state.currentUserStatus.status || '';\n        const userStatusId = 'modal.manual_status.title_' + userStatus;\n        const manualStatusTitle = (\n            <FormattedMessage\n                id={userStatusId}\n                defaultMessage='Your Status is Set to \"{status}\"'\n                values={{\n                    status: toTitleCase(userStatus),\n                }}\n            />\n        );\n\n        const manualStatusMessage = this.renderModalMessage();\n\n        const manualStatusButton = (\n            <FormattedMessage\n                id={`modal.manual_status.button_${this.state.newStatus}`}\n                defaultMessage='Yes, set my status to \"{status}\"'\n                values={{\n                    status: toTitleCase(this.state.newStatus),\n                }}\n            />\n        );\n        const manualStatusId = 'modal.manual_status.cancel_' + userStatus;\n        const manualStatusCancel = (\n            <FormattedMessage\n                id={manualStatusId}\n                defaultMessage='No, keep it as \"{status}\"'\n                values={{\n                    status: toTitleCase(userStatus),\n                }}\n            />\n        );\n\n        const manualStatusCheckbox = (\n            <FormattedMessage\n                id='modal.manual_status.ask'\n                defaultMessage='Do not ask me again'\n            />\n        );\n\n        const showCheckbox = this.props.currentUserStatus !== UserStatuses.OUT_OF_OFFICE;\n\n        return (\n            <ConfirmModal\n                show={this.state.show}\n                title={manualStatusTitle}\n                message={manualStatusMessage}\n                confirmButtonText={manualStatusButton}\n                onConfirm={this.onConfirm}\n                cancelButtonText={manualStatusCancel}\n                onCancel={this.onCancel}\n                onExited={this.props.onHide}\n                showCheckbox={showCheckbox}\n                checkboxText={manualStatusCheckbox}\n            />\n        );\n    }\n}\n\nt('modal.manual_status.auto_responder.message_');\nt('modal.manual_status.auto_responder.message_away');\nt('modal.manual_status.auto_responder.message_dnd');\nt('modal.manual_status.auto_responder.message_offline');\nt('modal.manual_status.auto_responder.message_online');\nt('modal.manual_status.button_');\nt('modal.manual_status.button_away');\nt('modal.manual_status.button_dnd');\nt('modal.manual_status.button_offline');\nt('modal.manual_status.button_online');\nt('modal.manual_status.cancel_');\nt('modal.manual_status.cancel_away');\nt('modal.manual_status.cancel_dnd');\nt('modal.manual_status.cancel_offline');\nt('modal.manual_status.cancel_ooo');\nt('modal.manual_status.message_');\nt('modal.manual_status.message_away');\nt('modal.manual_status.message_dnd');\nt('modal.manual_status.message_offline');\nt('modal.manual_status.message_online');\nt('modal.manual_status.title_');\nt('modal.manual_status.title_away');\nt('modal.manual_status.title_dnd');\nt('modal.manual_status.title_offline');\nt('modal.manual_status.title_ooo');\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {setStatus} from 'mattermost-redux/actions/users';\nimport {Preferences} from 'mattermost-redux/constants';\nimport {get} from 'mattermost-redux/selectors/entities/preferences';\nimport {getStatusForUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {autoResetStatus} from 'actions/user_actions.jsx';\n\nimport ResetStatusModal from './reset_status_modal.jsx';\n\nfunction mapStateToProps(state) {\n    const {currentUserId} = state.entities.users;\n    return {\n        autoResetPref: get(state, Preferences.CATEGORY_AUTO_RESET_MANUAL_STATUS, currentUserId, ''),\n        currentUserStatus: getStatusForUserId(state, currentUserId),\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            autoResetStatus,\n            setStatus,\n            savePreferences,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ResetStatusModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\n\nimport './pulsating_dot.scss';\n\ntype Props = {\n    targetRef?: React.RefObject<HTMLImageElement>;\n    className?: string;\n    onClick?: () => void;\n}\n\nexport class PulsatingDot extends React.PureComponent<Props> {\n    public render() {\n        let effectiveClassName = 'pulsating_dot';\n        if (this.props.onClick) {\n            effectiveClassName += ' pulsating_dot-clickable';\n        }\n        if (this.props.className) {\n            effectiveClassName = effectiveClassName + ' ' + this.props.className;\n        }\n\n        return (\n            <span\n                className={effectiveClassName}\n                onClick={this.props.onClick}\n                ref={this.props.targetRef}\n            />\n        );\n    }\n}\n\nexport default PulsatingDot;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport DayPickerInput from 'react-day-picker/DayPickerInput';\n\nimport {ActionFunc} from 'mattermost-redux/types/actions';\nimport {UserStatus} from 'mattermost-redux/types/users';\n\nimport GenericModal from 'components/generic_modal';\n\nimport {UserStatuses} from 'utils/constants';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport './dnd_custom_time_picker_modal.scss';\nimport {toUTCUnix} from 'utils/datetime';\n\ntype Props = {\n    onHide: () => void;\n    userId: string;\n    currentDate: Date;\n    actions: {\n        setStatus: (status: UserStatus) => ActionFunc;\n    };\n};\n\ntype State = {\n    selectedDate: Date;\n    selectedTime: string;\n    timeMenuList: string[];\n    dayPickerStartDate: Date;\n}\n\nexport default class DndCustomTimePicker extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        const {currentDate} = this.props;\n        const selectedDate: Date = new Date(currentDate);\n\n        // if current time is > 23:20 then we will set date to tomorrow and show all times\n        if (currentDate.getHours() === 23 && currentDate.getMinutes() > 20) {\n            selectedDate.setDate(currentDate.getDate() + 1);\n        }\n\n        this.state = {\n            selectedDate,\n            dayPickerStartDate: selectedDate,\n            ...this.makeTimeMenuList(selectedDate),\n        };\n    }\n\n    formatDate = (date: Date): string => {\n        const month = (date.getMonth() + 1).toString().padStart(2, '0');\n        const day = date.getDate().toString().padStart(2, '0');\n        const year = date.getFullYear().toString();\n        return [year, month, day].join('-');\n    }\n\n    getText = () => {\n        const modalHeaderText = (\n            <FormattedMessage\n                id='dnd_custom_time_picker_modal.defaultMsg'\n                defaultMessage='Disable notifications until'\n            />\n        );\n        const confirmButtonText = (\n            <FormattedMessage\n                id='dnd_custom_time_picker_modal.submitButton'\n                defaultMessage='Disable Notifications'\n            />\n        );\n\n        return {\n            modalHeaderText,\n            confirmButtonText,\n        };\n    }\n\n    handleConfirm = (event: any) => {\n        event.preventDefault();\n        const hours = parseInt(this.state.selectedTime.split(':')[0], 10);\n        const minutes = parseInt(this.state.selectedTime.split(':')[1], 10);\n        const endTime = new Date(this.state.selectedDate);\n        endTime.setHours(hours, minutes);\n        if (endTime < new Date()) {\n            return;\n        }\n        this.props.actions.setStatus({\n            user_id: this.props.userId,\n            status: UserStatuses.DND,\n            dnd_end_time: toUTCUnix(endTime),\n            manual: true,\n            last_activity_at: toUTCUnix(this.props.currentDate),\n        });\n        this.props.onHide();\n    }\n\n    handleDaySelection = (day: Date) => {\n        this.setState({\n            selectedDate: day,\n            ...this.makeTimeMenuList(day),\n        });\n    };\n\n    makeTimeMenuList = (date: Date): {timeMenuList: string[]; selectedTime: string} => {\n        const timeMenuItems = [];\n        let h = 0;\n        let m = 0;\n        const curr = this.props.currentDate;\n\n        if (this.formatDate(curr) === this.formatDate(date)) {\n            h = curr.getHours();\n            m = curr.getMinutes();\n            if (m > 20) {\n                h++;\n                m = 0;\n            } else {\n                m = 30;\n            }\n        }\n\n        for (let i = h; i < 24; i++) {\n            for (let j = m / 30; j < 2; j++) {\n                const t = i.toString().padStart(2, '0') + ':' + (j * 30).toString().padStart(2, '0');\n                timeMenuItems.push(\n                    t,\n                );\n            }\n        }\n\n        return {\n            timeMenuList: timeMenuItems,\n            selectedTime: timeMenuItems[0],\n        };\n    }\n\n    render() {\n        const {\n            modalHeaderText,\n            confirmButtonText,\n        } = this.getText();\n\n        const {timeMenuList, selectedTime, selectedDate, dayPickerStartDate} = this.state;\n        const timeMenuItems = timeMenuList.map((time) => {\n            return (\n                <Menu.ItemAction\n                    id={`dndTime_dropdown_${time}`}\n                    key={time}\n                    text={time}\n                    ariaLabel={`${time} hours`}\n                    onClick={() => {\n                        this.setState({\n                            selectedTime: time,\n                        });\n                    }}\n                >\n                    {time}\n                </Menu.ItemAction>\n            );\n        });\n\n        return (\n            <GenericModal\n                onHide={this.props.onHide}\n                modalHeaderText={modalHeaderText}\n                confirmButtonText={confirmButtonText}\n                id='dndCustomTimePickerModal'\n                className={'DndModal modal-overflow'}\n            >\n                <div className='DndModal__content'>\n                    <div>\n                        <div className='DndModal__input DndModal__input--no-border'>\n                            <div className='DndModal__input__label'>\n                                <FormattedMessage\n                                    id='dnd_custom_time_picker_modal.date'\n                                    defaultMessage='Date'\n                                />\n                            </div>\n                            <i className='icon icon--no-spacing icon-calendar-outline icon--xs icon-14'/>\n                            <DayPickerInput\n                                value={this.formatDate(selectedDate)}\n                                onDayChange={this.handleDaySelection}\n                                dayPickerProps={{\n                                    selectedDays: selectedDate,\n                                    disabledDays: {\n                                        before: dayPickerStartDate,\n                                    },\n                                }}\n                            />\n                        </div>\n                    </div>\n                    <MenuWrapper\n                        id='dropdown-no-caret'\n                        stopPropagationOnToggle={true}\n                    >\n                        <button\n                            className='DndModal__input'\n                            type='button'\n                        >\n                            <div className='DndModal__input__label'>\n                                <FormattedMessage\n                                    id='dnd_custom_time_picker_modal.time'\n                                    defaultMessage='Time'\n                                />\n                            </div>\n                            <i className='icon icon--no-spacing icon-clock-outline icon--xs icon-14'/>\n                            <span>{selectedTime}</span>\n                        </button>\n                        <Menu\n                            openLeft={false}\n                            ariaLabel={'Clear custom status after'}\n                        >\n                            {timeMenuItems}\n                        </Menu>\n                    </MenuWrapper>\n                </div>\n                <div className='DndModal__footer'>\n                    <button\n                        type='button'\n                        className='btn btn-primary'\n                        onClick={this.handleConfirm}\n                    >\n                        {confirmButtonText}\n                    </button>\n                </div>\n            </GenericModal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {setStatus} from 'mattermost-redux/actions/users';\n\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {GlobalState} from 'types/store';\n\nimport DndCustomTimePicker from './dnd_custom_time_picker_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n    const userId = getCurrentUserId(state);\n\n    return {\n        userId,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            setStatus,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DndCustomTimePicker);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {TUserStatus} from '@mattermost/compass-components/shared';\nimport React, {ReactNode} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Tooltip} from 'react-bootstrap';\nimport StatusIcon from '@mattermost/compass-components/components/status-icon';\nimport Icon from '@mattermost/compass-components/foundations/icon/Icon';\nimport Text from '@mattermost/compass-components/components/text';\n\nimport classNames from 'classnames';\n\nimport * as GlobalActions from 'actions/global_actions';\nimport Constants, {UserStatuses, ModalIdentifiers} from 'utils/constants';\nimport {localizeMessage} from 'utils/utils.jsx';\nimport ResetStatusModal from 'components/reset_status_modal';\nimport Avatar, {TAvatarSizeToken} from 'components/widgets/users/avatar/avatar';\nimport CustomStatusModal from 'components/custom_status/custom_status_modal';\nimport EmojiIcon from 'components/widgets/icons/emoji_icon';\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport PulsatingDot from 'components/widgets/pulsating_dot';\nimport DndCustomTimePicker from 'components/dnd_custom_time_picker_modal';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport CustomStatusText from 'components/custom_status/custom_status_text';\nimport ExpiryTime from 'components/custom_status/expiry_time';\nimport UserSettingsModal from 'components/user_settings/modal';\n\nimport {ActionFunc} from 'mattermost-redux/types/actions';\n\nimport {UserCustomStatus, UserStatus, CustomStatusDuration, UserProfile} from 'mattermost-redux/types/users';\n\nimport './status_dropdown.scss';\nimport {toUTCUnix} from 'utils/datetime';\nimport {getCurrentDateTimeForTimezone} from 'utils/timezone';\n\ntype Props = {\n    status?: string;\n    userId: string;\n    profilePicture: string;\n    autoResetPref?: string;\n    actions: {\n        openModal: (modalData: {modalId: string; dialogType: any; dialogProps?: any}) => void;\n        setStatus: (status: UserStatus) => ActionFunc;\n        unsetCustomStatus: () => ActionFunc;\n        setStatusDropdown: (open: boolean) => void;\n    };\n    customStatus?: UserCustomStatus;\n    currentUser: UserProfile;\n    isCustomStatusEnabled: boolean;\n    isCustomStatusExpired: boolean;\n    isStatusDropdownOpen: boolean;\n    showCustomStatusPulsatingDot: boolean;\n    isTimedDNDEnabled: boolean;\n    timezone?: string;\n    globalHeader?: boolean;\n}\n\ntype State = {\n    openUp: boolean;\n    width: number;\n    isStatusSet: boolean;\n};\n\nexport default class StatusDropdown extends React.PureComponent <Props, State> {\n    dndTimes = ['30 mins', '1 hour', '2 hours', 'Tomorrow', 'Custom']\n    static defaultProps = {\n        userId: '',\n        profilePicture: '',\n        status: UserStatuses.OFFLINE,\n    }\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            openUp: false,\n            width: 0,\n            isStatusSet: false,\n        };\n    }\n\n    setStatus = (status: string, dndEndTime?: number): void => {\n        this.props.actions.setStatus({\n            user_id: this.props.userId,\n            status,\n            dnd_end_time: dndEndTime,\n        });\n    }\n\n    isUserOutOfOffice = (): boolean => {\n        return this.props.status === UserStatuses.OUT_OF_OFFICE;\n    }\n\n    setOnline = (event: Event): void => {\n        event.preventDefault();\n        this.setStatus(UserStatuses.ONLINE);\n    }\n\n    setOffline = (event: Event): void => {\n        event.preventDefault();\n        this.setStatus(UserStatuses.OFFLINE);\n    }\n\n    setAway = (event: Event): void => {\n        event.preventDefault();\n        this.setStatus(UserStatuses.AWAY);\n    }\n\n    setDndUntimed = (event: Event): void => {\n        event.preventDefault();\n        this.setStatus(UserStatuses.DND);\n    }\n\n    setDnd = (index: number): void => {\n        const currentDate = this.props.timezone ? getCurrentDateTimeForTimezone(this.props.timezone) : new Date();\n        const currentTime = currentDate.getTime();\n        let endTime = new Date(currentTime);\n        switch (index) {\n        case 0:\n            // add 30 minutes in current time\n            endTime = new Date(currentTime + (30 * 60 * 1000));\n            break;\n        case 1:\n            // add 1 hour in current time\n            endTime = new Date(currentTime + (60 * 60 * 1000));\n            break;\n        case 2:\n            // add 2 hours in current time\n            endTime = new Date(currentTime + (2 * 60 * 60 * 1000));\n            break;\n        case 3:\n            // add one day in current date and set hours to last minute of the day\n            endTime = new Date(currentDate);\n            endTime.setDate(currentDate.getDate() + 1);\n            endTime.setHours(23, 59, 59, 999);\n            break;\n        }\n\n        const dndEndTime = toUTCUnix(endTime);\n        this.setStatus(UserStatuses.DND, dndEndTime);\n    }\n\n    setCustomTimedDnd = (): void => {\n        const dndCustomTimePicker = {\n            modalId: ModalIdentifiers.DND_CUSTOM_TIME_PICKER,\n            dialogType: DndCustomTimePicker,\n            dialogProps: {\n                currentDate: this.props.timezone ? getCurrentDateTimeForTimezone(this.props.timezone) : new Date(),\n            },\n        };\n\n        this.props.actions.openModal(dndCustomTimePicker);\n    }\n\n    showStatusChangeConfirmation = (status: string): void => {\n        const resetStatusModalData = {\n            modalId: ModalIdentifiers.RESET_STATUS,\n            dialogType: ResetStatusModal,\n            dialogProps: {newStatus: status},\n        };\n\n        this.props.actions.openModal(resetStatusModalData);\n    };\n\n    renderProfilePicture = (size: TAvatarSizeToken): ReactNode => {\n        if (!this.props.profilePicture) {\n            return null;\n        }\n        return (\n            <Avatar\n                size={size}\n                url={this.props.profilePicture}\n            />\n        );\n    }\n\n    renderDropdownIcon = (): ReactNode => {\n        return (\n            <FormattedMessage\n                id='generic_icons.dropdown'\n                defaultMessage='Dropdown Icon'\n            >\n                { (title: string) => (\n                    <i\n                        className={'fa fa-caret-down'}\n                        aria-label={title}\n                    />)\n                }\n            </FormattedMessage>\n        );\n    }\n    handleClearStatus = (e: React.MouseEvent<HTMLButtonElement>): void => {\n        e.stopPropagation();\n        e.preventDefault();\n        this.props.actions.unsetCustomStatus();\n    };\n\n    handleEmitUserLoggedOutEvent = (): void => {\n        GlobalActions.emitUserLoggedOutEvent();\n    }\n\n    onToggle = (open: boolean): void => {\n        this.props.actions.setStatusDropdown(open);\n    }\n\n    handleCustomStatusEmojiClick = (event: React.MouseEvent): void => {\n        event.stopPropagation();\n        const customStatusInputModalData = {\n            modalId: ModalIdentifiers.CUSTOM_STATUS,\n            dialogType: CustomStatusModal,\n        };\n        this.props.actions.openModal(customStatusInputModalData);\n    }\n\n    renderCustomStatus = (isStatusSet: boolean | undefined): ReactNode => {\n        if (!this.props.isCustomStatusEnabled) {\n            return null;\n        }\n        const {customStatus} = this.props;\n        const customStatusText = isStatusSet ? customStatus?.text : localizeMessage('status_dropdown.set_custom', 'Set a Custom Status');\n        const customStatusEmoji = isStatusSet ? (\n            <span className='d-flex'>\n                <CustomStatusEmoji\n                    showTooltip={false}\n                    emojiStyle={{marginLeft: 0}}\n                />\n            </span>\n        ) : (\n            <EmojiIcon className={'custom-status-emoji'}/>\n        );\n\n        const clearButton = isStatusSet &&\n            (\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='top'\n                    overlay={\n                        <Tooltip id='clear-custom-status'>\n                            <FormattedMessage\n                                id='status_dropdown.custom_status.tooltip_clear'\n                                defaultMessage='Clear'\n                            />\n                        </Tooltip>\n                    }\n                >\n                    <button\n                        className='style--none input-clear-x'\n                        id='custom_status__clear'\n                        onClick={this.handleClearStatus}\n                    >\n                        <i className='icon icon-close-circle'/>\n                    </button>\n                </OverlayTrigger>\n            );\n\n        const pulsatingDot = !isStatusSet && this.props.showCustomStatusPulsatingDot && (\n            <PulsatingDot/>\n        );\n\n        const expiryTime = isStatusSet && customStatus?.expires_at && customStatus.duration !== CustomStatusDuration.DONT_CLEAR &&\n            (\n                <ExpiryTime\n                    time={customStatus.expires_at}\n                    timezone={this.props.timezone}\n                    className={'custom_status__expiry MenuItem__help-text'}\n                    withinBrackets={true}\n                />\n            );\n\n        return (\n            <Menu.Group>\n                <Menu.ItemToggleModalRedux\n                    ariaLabel='Custom Status'\n                    modalId={ModalIdentifiers.CUSTOM_STATUS}\n                    dialogType={CustomStatusModal}\n                    className='MenuItem__primary-text custom_status__row'\n                    id={'status-menu-custom-status'}\n                >\n                    <span className='custom_status__container'>\n                        <span className='custom_status__icon'>\n                            {customStatusEmoji}\n                        </span>\n                        <CustomStatusText\n                            text={customStatusText}\n                            className='custom_status__text'\n                        />\n                        {pulsatingDot}\n                    </span>\n                    {expiryTime}\n                    {clearButton}\n                </Menu.ItemToggleModalRedux>\n            </Menu.Group>\n        );\n    }\n\n    render = (): JSX.Element => {\n        const needsConfirm = this.isUserOutOfOffice() && this.props.autoResetPref === '';\n        const dropdownIcon = this.renderDropdownIcon();\n        const {status, isTimedDNDEnabled, customStatus, isCustomStatusExpired, globalHeader, currentUser} = this.props;\n        const isStatusSet = customStatus && (customStatus.text.length > 0 || customStatus.emoji.length > 0) && !isCustomStatusExpired;\n\n        const setOnline = needsConfirm ? () => this.showStatusChangeConfirmation('online') : this.setOnline;\n        const setDnd = needsConfirm ? () => this.showStatusChangeConfirmation('dnd') : this.setDnd;\n        const setDndUntimed = needsConfirm ? () => this.showStatusChangeConfirmation('dnd') : this.setDndUntimed;\n        const setAway = needsConfirm ? () => this.showStatusChangeConfirmation('away') : this.setAway;\n        const setOffline = needsConfirm ? () => this.showStatusChangeConfirmation('offline') : this.setOffline;\n        const setCustomTimedDnd = needsConfirm ? () => this.showStatusChangeConfirmation('dnd') : this.setCustomTimedDnd;\n\n        const selectedIndicator = (\n            <Icon\n                glyph={'check'}\n                size={16}\n                color={'success'}\n            />\n        );\n\n        const dndSubMenuItems = [{\n            id: 'dndSubMenu-header',\n            direction: 'right',\n            text: localizeMessage('status_dropdown.dnd_sub_menu_header', 'Disable notifications until:'),\n        } as any].concat(\n            this.dndTimes.map((time, index) => {\n                return {\n                    id: `dndTime-${time.split(' ').join('')}`,\n                    direction: 'right',\n                    text: localizeMessage('status_dropdown.dnd_sub_menu_item.time', time),\n                    action: index === 4 ? () => setCustomTimedDnd() : () => setDnd(index),\n                } as any;\n            }));\n\n        const customStatusComponent = this.renderCustomStatus(isStatusSet);\n\n        let timedDND = (\n            <Menu.ItemAction\n                onClick={setDndUntimed}\n                ariaLabel={`${localizeMessage('status_dropdown.set_dnd', 'Do not disturb').toLowerCase()}. ${localizeMessage('status_dropdown.set_dnd.extra', 'Disables desktop, email and push notifications').toLowerCase()}`}\n                text={localizeMessage('status_dropdown.set_dnd', 'Do not disturb')}\n                extraText={localizeMessage('status_dropdown.set_dnd.extra', 'Disables all notifications')}\n                icon={(\n                    <StatusIcon\n                        status={'dnd'}\n                        className={'status-icon'}\n                    />\n                )}\n                rightDecorator={status === 'dnd' && selectedIndicator}\n                id={'status-menu-dnd'}\n            />\n        );\n\n        if (isTimedDNDEnabled) {\n            timedDND = (\n                <Menu.ItemSubMenu\n                    subMenu={dndSubMenuItems}\n                    ariaLabel={`${localizeMessage('status_dropdown.set_dnd', 'Do not disturb').toLowerCase()}. ${localizeMessage('status_dropdown.set_dnd.extra', 'Disables desktop, email and push notifications').toLowerCase()}`}\n                    text={localizeMessage('status_dropdown.set_dnd', 'Do not disturb')}\n                    extraText={localizeMessage('status_dropdown.set_dnd.extra', 'Disables all notifications')}\n                    icon={(\n                        <StatusIcon\n                            status={'dnd'}\n                            className={'status-icon'}\n                        />\n                    )}\n                    selectedValueText={status === 'dnd' && selectedIndicator}\n                    direction={globalHeader ? 'left' : 'right'}\n                    openUp={this.state.openUp}\n                    id={'status-menu-dnd-timed'}\n                />\n            );\n        }\n\n        return (\n            <MenuWrapper\n                onToggle={this.onToggle}\n                open={this.props.isStatusDropdownOpen}\n                className={classNames('status-dropdown-menu', {\n                    'status-dropdown-menu-global-header': globalHeader,\n                    active: this.props.isStatusDropdownOpen || isStatusSet,\n                })}\n            >\n                <div\n                    className={classNames('status-wrapper', {\n                        'status-selector': !globalHeader,\n                    })}\n                >\n                    {globalHeader &&\n                        <CustomStatusEmoji\n                            showTooltip={true}\n                            tooltipDirection={'bottom'}\n                            emojiStyle={{marginRight: '6px'}}\n                            onClick={this.handleCustomStatusEmojiClick as () => void}\n                        />\n                    }\n                    {this.renderProfilePicture(globalHeader ? 'sm' : 'lg')}\n                    <button\n                        className='status style--none'\n                        aria-label={localizeMessage('status_dropdown.menuAriaLabel', 'Set a status')}\n                    >\n                        <StatusIcon\n                            size={'sm'}\n                            status={(this.props.status || 'offline') as TUserStatus}\n                        />\n                    </button>\n                    <span className={'status status-edit edit'}>\n                        {!globalHeader && dropdownIcon}\n                    </span>\n                </div>\n                <Menu\n                    ariaLabel={localizeMessage('status_dropdown.menuAriaLabel', 'Set a status')}\n                    id={isTimedDNDEnabled ? 'statusDropdownMenu-timedDND' : 'statusDropdownMenu'}\n                >\n                    {!this.props.isCustomStatusEnabled && (\n                        <Menu.Header>\n                            <FormattedMessage\n                                id='status_dropdown.set_your_status'\n                                defaultMessage='Status'\n                            />\n                        </Menu.Header>\n                    )}\n                    {globalHeader && currentUser && (\n                        <Menu.Header>\n                            {this.renderProfilePicture('lg')}\n                            <div className={'username-wrapper'}>\n                                <Text margin={'none'}>{`${currentUser.first_name} ${currentUser.last_name}`}</Text>\n                                <Text\n                                    margin={'none'}\n                                    color={'disabled'}\n                                >\n                                    {'@' + currentUser.username}\n                                </Text>\n                            </div>\n                        </Menu.Header>\n                    )}\n                    <Menu.Group>\n                        <Menu.ItemAction\n                            show={this.isUserOutOfOffice()}\n                            onClick={() => null}\n                            ariaLabel={localizeMessage('status_dropdown.set_ooo', 'Out of office').toLowerCase()}\n                            text={localizeMessage('status_dropdown.set_ooo', 'Out of office')}\n                            extraText={localizeMessage('status_dropdown.set_ooo.extra', 'Automatic Replies are enabled')}\n                        />\n                    </Menu.Group>\n                    {customStatusComponent}\n                    <Menu.Group>\n                        <Menu.ItemAction\n                            onClick={setOnline}\n                            ariaLabel={localizeMessage('status_dropdown.set_online', 'Online').toLowerCase()}\n                            text={localizeMessage('status_dropdown.set_online', 'Online')}\n                            icon={(\n                                <StatusIcon\n                                    status={'online'}\n                                    className={'status-icon'}\n                                />\n                            )}\n                            rightDecorator={status === 'online' && selectedIndicator}\n                            id={'status-menu-online'}\n                        />\n                        <Menu.ItemAction\n                            onClick={setAway}\n                            ariaLabel={localizeMessage('status_dropdown.set_away', 'Away').toLowerCase()}\n                            text={localizeMessage('status_dropdown.set_away', 'Away')}\n                            icon={(\n                                <StatusIcon\n                                    status={'away'}\n                                    className={'status-icon'}\n                                />\n                            )}\n                            rightDecorator={status === 'away' && selectedIndicator}\n                            id={'status-menu-away'}\n                        />\n                        {timedDND}\n                        <Menu.ItemAction\n                            onClick={setOffline}\n                            ariaLabel={localizeMessage('status_dropdown.set_offline', 'Offline').toLowerCase()}\n                            text={localizeMessage('status_dropdown.set_offline', 'Offline')}\n                            icon={(\n                                <StatusIcon\n                                    status={'offline'}\n                                    className={'status-icon'}\n                                />\n                            )}\n                            rightDecorator={status === 'offline' && selectedIndicator}\n                            id={'status-menu-offline'}\n                        />\n                    </Menu.Group>\n                    <Menu.Group>\n                        <Menu.ItemToggleModalRedux\n                            id='accountSettings'\n                            ariaLabel='Account Settings'\n                            modalId={ModalIdentifiers.USER_SETTINGS}\n                            dialogType={UserSettingsModal}\n                            dialogProps={{isContentProductSettings: false}}\n                            text={localizeMessage('navbar_dropdown.accountSettings', 'Account Settings')}\n                            icon={globalHeader ? (\n                                <Icon\n                                    size={16}\n                                    glyph={'account-outline'}\n                                />\n                            ) : <i className='fa fa-cog'/>}\n                        />\n                    </Menu.Group>\n                    <Menu.Group>\n                        <Menu.ItemAction\n                            id='logout'\n                            onClick={this.handleEmitUserLoggedOutEvent}\n                            text={localizeMessage('navbar_dropdown.logout', 'Log Out')}\n                            icon={globalHeader ? (\n                                <Icon\n                                    size={16}\n                                    glyph={'exit-to-app'}\n                                />\n                            ) : <i className='fa fa-sign-out'/>}\n                        />\n                    </Menu.Group>\n                </Menu>\n            </MenuWrapper>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {setStatus, unsetCustomStatus} from 'mattermost-redux/actions/users';\nimport {Client4} from 'mattermost-redux/client';\nimport {Preferences} from 'mattermost-redux/constants';\n\nimport {get, isTimedDNDEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUser, getStatusForUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {openModal} from 'actions/views/modals';\nimport {setStatusDropdown} from 'actions/views/status_dropdown';\n\nimport {getCurrentUserTimezone} from 'selectors/general';\nimport {makeGetCustomStatus, isCustomStatusEnabled, showStatusDropdownPulsatingDot, isCustomStatusExpired} from 'selectors/views/custom_status';\nimport {isStatusDropdownOpen} from 'selectors/views/status_dropdown';\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {GlobalState} from 'types/store';\n\nimport StatusDropdown from './status_dropdown';\n\nfunction makeMapStateToProps() {\n    const getCustomStatus = makeGetCustomStatus();\n\n    return function mapStateToProps(state: GlobalState) {\n        const currentUser = getCurrentUser(state);\n\n        const userId = currentUser?.id;\n        const customStatus = getCustomStatus(state, userId);\n        return {\n            userId,\n            profilePicture: Client4.getProfilePictureUrl(userId, currentUser?.last_picture_update),\n            autoResetPref: get(state, Preferences.CATEGORY_AUTO_RESET_MANUAL_STATUS, userId, ''),\n            status: getStatusForUserId(state, userId),\n            customStatus,\n            currentUser,\n            isCustomStatusEnabled: isCustomStatusEnabled(state),\n            isCustomStatusExpired: isCustomStatusExpired(state, customStatus),\n            isStatusDropdownOpen: isStatusDropdownOpen(state),\n            showCustomStatusPulsatingDot: showStatusDropdownPulsatingDot(state),\n            timezone: getCurrentUserTimezone(state),\n            isTimedDNDEnabled: isTimedDNDEnabled(state),\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            openModal,\n            setStatus,\n            unsetCustomStatus,\n            setStatusDropdown,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(StatusDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport Flex from '@mattermost/compass-components/utilities/layout/Flex';\n\nimport {closeRightHandSide, showMentions} from 'actions/views/rhs';\nimport Search from 'components/search';\nimport {getIsRhsOpen, getRhsState} from 'selectors/rhs';\nimport {GlobalState} from 'types/store';\nimport {\n    Constants,\n    RHSStates,\n} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nconst GlobalSearchNav = (): JSX.Element => {\n    const dispatch = useDispatch();\n    const rhsState = useSelector((state: GlobalState) => getRhsState(state));\n    const isRhsOpen = useSelector((state: GlobalState) => getIsRhsOpen(state));\n\n    useEffect(() => {\n        document.addEventListener('keydown', handleShortcut);\n        return () => {\n            document.removeEventListener('keydown', handleShortcut);\n        };\n    }, []);\n\n    const searchMentions = () => {\n        if (rhsState === RHSStates.MENTION) {\n            dispatch(closeRightHandSide());\n        } else {\n            dispatch(showMentions());\n        }\n    };\n\n    const handleShortcut = (e: KeyboardEvent) => {\n        if (Utils.cmdOrCtrlPressed(e) && e.shiftKey) {\n            if (Utils.isKeyPressed(e, Constants.KeyCodes.M)) {\n                e.preventDefault();\n                searchMentions();\n            }\n        }\n    };\n\n    return (\n        <Flex\n            row={true}\n            width={432}\n            flex={1}\n            alignment='center'\n        >\n            <Search\n                isFocus={Utils.isMobile() || (isRhsOpen && Boolean(rhsState))}\n                enableFindShortcut={true}\n            />\n        </Flex>\n    );\n};\n\nexport default GlobalSearchNav;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {MutableRefObject, useEffect, useRef} from 'react';\nimport {useSelector} from 'react-redux';\nimport {useLocation} from 'react-router';\n\nimport {GlobalState} from 'types/store';\nimport {ProductComponent} from 'types/store/plugins';\nimport {getBasePath} from 'utils/url';\nimport {Preferences} from 'utils/constants';\n\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {getCurrentUser, getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getInt} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {isModalOpen} from 'selectors/views/modals';\n\nconst selectProducts = (state: GlobalState) => state.plugins.components.Product;\n\nexport const useProducts = (): ProductComponent[] | undefined => {\n    return useSelector<GlobalState, ProductComponent[]>(selectProducts);\n};\n\n/**\n * Hook that alerts clicks outside of the passed ref.\n */\nexport function useClickOutsideRef(ref: MutableRefObject<HTMLElement | null>, handler: () => void): void {\n    useEffect(() => {\n        function onMouseDown(event: MouseEvent) {\n            const target = event.target as any;\n            if (ref.current && target instanceof Node && !ref.current.contains(target)) {\n                handler();\n            }\n        }\n\n        // Bind the event listener\n        document.addEventListener('mousedown', onMouseDown);\n        return () => {\n            // Unbind the event listener on clean up\n            document.removeEventListener('mousedown', onMouseDown);\n        };\n    }, [ref, handler]);\n}\n\nexport const useCurrentProductId = (products?: ProductComponent[]): string | null => {\n    if (!products) {\n        return null;\n    }\n\n    const location = useLocation();\n    for (let i = 0; i < products.length; i++) {\n        const product = products[i];\n        if (location.pathname.startsWith(getBasePath() + product.baseURL)) {\n            return product.id;\n        }\n    }\n\n    return null;\n};\n\nexport const useShowTutorialStep = (stepToShow: number): boolean => {\n    const currentUserId = useSelector<GlobalState, string>(getCurrentUserId);\n    const boundGetInt = (state: GlobalState) => getInt(state, Preferences.TUTORIAL_STEP, currentUserId, 0);\n    const step = useSelector<GlobalState, number>(boundGetInt);\n\n    return step === stepToShow;\n};\n\nexport const useIsLoggedIn = (): boolean => {\n    return Boolean(useSelector<GlobalState, UserProfile>(getCurrentUser));\n};\n\n/**\n * Hook that returns the current open state of the specified modal\n * - returns both the direct boolean for regular use and a ref that contains the boolean for usage in a callback\n */\nexport const useIsModalOpen = (modalIdentifier: string): [boolean, React.RefObject<boolean>] => {\n    const modalOpenState = useSelector((state: GlobalState) => isModalOpen(state, modalIdentifier));\n    const modalOpenStateRef = useRef(modalOpenState);\n\n    useEffect(() => {\n        modalOpenStateRef.current = modalOpenState;\n    }, [modalOpenState]);\n\n    return [modalOpenState, modalOpenStateRef];\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport styled from 'styled-components';\nimport Icon from '@mattermost/compass-components/foundations/icon';\nimport Heading from '@mattermost/compass-components/components/heading';\n\nimport {useProducts, useCurrentProductId} from '../hooks';\n\nconst ProductBrandingContainer = styled.div`\n    display: flex;\n    align-items: center;\n\n    > * + * {\n        margin-left: 8px;\n    }\n`;\n\nconst ProductBranding: React.FC = (): JSX.Element | null => {\n    const products = useProducts();\n    const currentProductID = useCurrentProductId(products);\n    const currentProduct = products?.find((product) => product.id === currentProductID);\n\n    return (\n        <ProductBrandingContainer>\n            <Icon\n                size={20}\n                glyph={currentProduct && typeof currentProduct.switcherIcon === 'string' ? currentProduct.switcherIcon : 'product-channels'}\n            />\n            <Heading\n                element='h1'\n                size={200}\n                margin='none'\n            >\n                {currentProduct ? currentProduct.switcherText : 'Channels'}\n            </Heading>\n        </ProductBrandingContainer>\n    );\n};\n\nexport default ProductBranding;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport ProductBranding from './product_branding';\n\nexport default ProductBranding;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {injectIntl, IntlShape} from 'react-intl';\n\nimport Icon from '@mattermost/compass-components/foundations/icon';\n\nimport {Permissions} from 'mattermost-redux/constants';\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport * as GlobalActions from 'actions/global_actions';\nimport AboutBuildModal from 'components/about_build_modal';\nimport SystemPermissionGate from 'components/permissions_gates/system_permission_gate';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\nimport MarketplaceModal from 'components/plugin_marketplace';\nimport Menu from 'components/widgets/menu/menu';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {useSafeUrl} from 'utils/url';\nimport * as UserAgent from 'utils/user_agent';\n\ntype Props = {\n    isMobile: boolean;\n    id: string;\n    teamId: string;\n    teamName: string;\n    siteName: string;\n    currentUser: UserProfile;\n    appDownloadLink: string;\n    isMessaging: boolean;\n    enableCommands: boolean;\n    enableIncomingWebhooks: boolean;\n    enableOAuthServiceProvider: boolean;\n    enableOutgoingWebhooks: boolean;\n    canManageSystemBots: boolean;\n    canManageIntegrations: boolean;\n    enablePluginMarketplace: boolean;\n    pluginMenuItems: any;\n    intl: IntlShape;\n    firstAdminVisitMarketplaceStatus: boolean;\n    onClick?: React.MouseEventHandler<HTMLElement>;\n};\n\n// TODO: rewrite this to a functional component\nclass ProductSwitcherMenu extends React.PureComponent<Props> {\n    static defaultProps = {\n        teamType: '',\n        isMobile: false,\n        pluginMenuItems: [],\n    };\n\n    handleEmitUserLoggedOutEvent = () => {\n        GlobalActions.emitUserLoggedOutEvent();\n    }\n\n    render() {\n        const {currentUser, isMessaging, isMobile, onClick} = this.props;\n\n        if (!currentUser) {\n            return null;\n        }\n\n        const someIntegrationEnabled = this.props.enableIncomingWebhooks || this.props.enableOutgoingWebhooks || this.props.enableCommands || this.props.enableOAuthServiceProvider || this.props.canManageSystemBots;\n        const showIntegrations = !isMobile && someIntegrationEnabled && this.props.canManageIntegrations;\n\n        const {formatMessage} = this.props.intl;\n\n        return (\n            <Menu.Group>\n                <div onClick={onClick}>\n                    <SystemPermissionGate\n                        permissions={[Permissions.SYSCONSOLE_WRITE_ABOUT_EDITION_AND_LICENSE]}\n                    >\n                        <Menu.StartTrial\n                            id='startTrial'\n                        />\n                    </SystemPermissionGate>\n                    <SystemPermissionGate permissions={Permissions.SYSCONSOLE_READ_PERMISSIONS}>\n                        <Menu.ItemLink\n                            id='systemConsole'\n                            show={!isMobile}\n                            to='/admin_console'\n                            text={formatMessage({id: 'navbar_dropdown.console', defaultMessage: 'System Console'})}\n                            icon={\n                                <Icon\n                                    size={16}\n                                    glyph={'application-cog'}\n                                />\n                            }\n                        />\n                    </SystemPermissionGate>\n                    <Menu.ItemLink\n                        id='integrations'\n                        show={isMessaging && showIntegrations}\n                        to={'/' + this.props.teamName + '/integrations'}\n                        text={formatMessage({id: 'navbar_dropdown.integrations', defaultMessage: 'Integrations'})}\n                        icon={\n                            <Icon\n                                size={16}\n                                glyph={'webhook-incoming'}\n                            />\n                        }\n                    />\n                    <TeamPermissionGate\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.SYSCONSOLE_WRITE_PLUGINS]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='marketplaceModal'\n                            modalId={ModalIdentifiers.PLUGIN_MARKETPLACE}\n                            show={isMessaging && !isMobile && this.props.enablePluginMarketplace}\n                            dialogType={MarketplaceModal}\n                            text={formatMessage({id: 'navbar_dropdown.marketplace', defaultMessage: 'Marketplace'})}\n                            icon={\n                                <Icon\n                                    size={16}\n                                    glyph={'apps'}\n                                />\n                            }\n                        />\n                    </TeamPermissionGate>\n                    <Menu.ItemExternalLink\n                        id='nativeAppLink'\n                        show={this.props.appDownloadLink && !UserAgent.isMobileApp()}\n                        url={useSafeUrl(this.props.appDownloadLink)}\n                        text={formatMessage({id: 'navbar_dropdown.nativeApps', defaultMessage: 'Download Apps'})}\n                        icon={\n                            <Icon\n                                size={16}\n                                glyph={'download-outline'}\n                            />\n                        }\n                    />\n                    <Menu.ItemToggleModalRedux\n                        id='about'\n                        modalId={ModalIdentifiers.ABOUT}\n                        dialogType={AboutBuildModal}\n                        text={formatMessage({id: 'navbar_dropdown.about', defaultMessage: 'About {appTitle}'}, {appTitle: this.props.siteName})}\n                        icon={\n                            <Icon\n                                size={16}\n                                glyph={'information-outline'}\n                            />\n                        }\n                    />\n                </div>\n            </Menu.Group>\n        );\n    }\n}\n\nexport default injectIntl(ProductSwitcherMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {\n    getConfig,\n    getFirstAdminVisitMarketplaceStatus,\n} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {haveICurrentTeamPermission, haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {GlobalState} from 'types/store/index';\n\nimport ProductSwitcherMenu from './product_switcher_menu';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n    const currentTeam = getCurrentTeam(state) || {};\n    const currentUser = getCurrentUser(state);\n\n    const appDownloadLink = config.AppDownloadLink || '';\n    const enableCommands = config.EnableCommands === 'true';\n    const siteName = config.SiteName || 'Mattermost';\n    const enableIncomingWebhooks = config.EnableIncomingWebhooks === 'true';\n    const enableOAuthServiceProvider = config.EnableOAuthServiceProvider === 'true';\n    const enableOutgoingWebhooks = config.EnableOutgoingWebhooks === 'true';\n    const enablePluginMarketplace = config.PluginsEnabled === 'true' && config.EnableMarketplace === 'true';\n    const canManageTeamIntegrations = (haveICurrentTeamPermission(state, Permissions.MANAGE_SLASH_COMMANDS) || haveICurrentTeamPermission(state, Permissions.MANAGE_OAUTH) || haveICurrentTeamPermission(state, Permissions.MANAGE_INCOMING_WEBHOOKS) || haveICurrentTeamPermission(state, Permissions.MANAGE_OUTGOING_WEBHOOKS));\n    const canManageSystemBots = (haveISystemPermission(state, {permission: Permissions.MANAGE_BOTS}) || haveISystemPermission(state, {permission: Permissions.MANAGE_OTHERS_BOTS}));\n    const canManageIntegrations = canManageTeamIntegrations || canManageSystemBots;\n\n    return {\n        isMobile: state.views.channel.mobileView,\n        appDownloadLink,\n        enableCommands,\n        canManageIntegrations,\n        enableIncomingWebhooks,\n        enableOAuthServiceProvider,\n        enableOutgoingWebhooks,\n        canManageSystemBots,\n        enablePluginMarketplace,\n        pluginMenuItems: state.plugins.components.MainMenu,\n        siteName,\n        teamId: currentTeam.id,\n        teamName: currentTeam.name,\n        currentUser,\n        firstAdminVisitMarketplaceStatus: getFirstAdminVisitMarketplaceStatus(state),\n    };\n}\n\nexport default connect(mapStateToProps)(ProductSwitcherMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Overlay} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\nimport Constants from 'utils/constants';\nimport PulsatingDot from 'components/widgets/pulsating_dot';\n\nconst Preferences = Constants.Preferences;\nconst TutorialSteps = Constants.TutorialSteps;\n\ntype Preference = {\n    user_id: string;\n    category: string;\n    name: string;\n    value: string;\n}\n\ntype Props = {\n    currentUserId: string;\n    step: number;\n    screens: JSX.Element[];\n    placement: string;\n    overlayClass: string;\n    telemetryTag?: string;\n    actions: {\n        closeRhsMenu: () => void;\n        savePreferences: (currentUserId: string, preferences: Preference[]) => void;\n    };\n}\n\ntype State = {\n    currentScreen: number;\n    show: boolean;\n}\n\nexport default class TutorialTip extends React.PureComponent<Props, State> {\n    public targetRef: React.RefObject<HTMLImageElement>;\n\n    public static defaultProps: Partial<Props> = {\n        overlayClass: '',\n    }\n\n    public constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            currentScreen: 0,\n            show: false,\n        };\n\n        this.targetRef = React.createRef();\n    }\n\n    private show = (): void => {\n        this.setState({show: true});\n    }\n\n    private hide = (): void => {\n        this.setState({show: false});\n    }\n\n    public handleNext = (): void => {\n        if (this.state.currentScreen < this.props.screens.length - 1) {\n            this.setState({currentScreen: this.state.currentScreen + 1});\n            return;\n        }\n\n        if (this.props.telemetryTag) {\n            let tag = this.props.telemetryTag;\n\n            if (this.props.screens.length > 1) {\n                tag += '_' + (this.state.currentScreen + 1).toString();\n            }\n\n            if (this.state.currentScreen === this.props.screens.length - 1) {\n                tag += '_okay';\n            } else {\n                tag += '_next';\n            }\n\n            trackEvent('tutorial', tag);\n        }\n\n        const {currentUserId, actions} = this.props;\n        const {closeRhsMenu, savePreferences} = actions;\n\n        const preferences = [{\n            user_id: currentUserId,\n            category: Preferences.TUTORIAL_STEP,\n            name: currentUserId,\n            value: (this.props.step + 1).toString(),\n        }];\n\n        closeRhsMenu();\n        this.hide();\n\n        savePreferences(currentUserId, preferences);\n    }\n\n    public skipTutorial = (e: React.MouseEvent<HTMLAnchorElement>): void => {\n        e.preventDefault();\n\n        if (this.props.telemetryTag) {\n            let tag = this.props.telemetryTag;\n            if (this.props.screens.length > 1) {\n                tag += '_' + this.state.currentScreen;\n            }\n            tag += '_skip';\n            trackEvent('tutorial', tag);\n        }\n\n        const {currentUserId, actions} = this.props;\n        const preferences = [{\n            user_id: currentUserId,\n            category: Preferences.TUTORIAL_STEP,\n            name: currentUserId,\n            value: TutorialSteps.FINISHED.toString(),\n        }];\n\n        actions.savePreferences(currentUserId, preferences);\n    }\n\n    private handleCircleClick = (e: React.MouseEvent<HTMLAnchorElement>, screen: number): void => {\n        e.preventDefault();\n        this.setState({currentScreen: screen});\n    }\n\n    private getTarget = (): HTMLImageElement | null => {\n        return this.targetRef.current;\n    }\n\n    public render(): JSX.Element {\n        const buttonText = (\n            <FormattedMessage\n                id='tutorial_tip.ok'\n                defaultMessage='Got it'\n            />\n        );\n\n        const dots = [];\n        if (this.props.screens.length > 1) {\n            for (let i = 0; i < this.props.screens.length; i++) {\n                let className = 'circle';\n                if (i === this.state.currentScreen) {\n                    className += ' active';\n                }\n\n                dots.push(\n                    <a\n                        href='#'\n                        key={'dotactive' + i}\n                        className={className}\n                        data-screen={i}\n                        onClick={(e) => this.handleCircleClick(e, i)}\n                    />,\n                );\n            }\n        }\n\n        return (\n            <div\n                id='tipButton'\n                className={'tip-div ' + this.props.overlayClass}\n                onClick={this.show}\n            >\n                <PulsatingDot\n                    onClick={this.show}\n                    targetRef={this.targetRef}\n                />\n\n                <Overlay\n                    show={this.state.show}\n                >\n                    <div className='tip-backdrop'/>\n                </Overlay>\n\n                <Overlay\n                    placement={this.props.placement}\n                    show={this.state.show}\n                    rootClose={true}\n                    onHide={this.hide}\n                    target={this.getTarget}\n                >\n                    <div className={'tip-overlay ' + this.props.overlayClass}>\n                        <div className='arrow'/>\n                        {this.props.screens[this.state.currentScreen]}\n                        <div className='tutorial__footer'>\n                            <div className='tutorial__circles'>{dots}</div>\n                            <div className='text-right'>\n                                <button\n                                    id='tipNextButton'\n                                    className='btn btn-primary'\n                                    onClick={this.handleNext}\n                                >\n                                    {buttonText}\n                                </button>\n                                <div className='tip-opt'>\n                                    <FormattedMessage\n                                        id='tutorial_tip.seen'\n                                        defaultMessage='Seen this before? '\n                                    />\n                                    <a\n                                        href='#'\n                                        onClick={this.skipTutorial}\n                                    >\n                                        <FormattedMessage\n                                            id='tutorial_tip.out'\n                                            defaultMessage='Opt out of these tips.'\n                                        />\n                                    </a>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </Overlay>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getInt} from 'mattermost-redux/selectors/entities/preferences';\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {closeMenu as closeRhsMenu} from 'actions/views/rhs';\nimport {Preferences} from 'utils/constants';\nimport {GlobalState} from 'types/store';\n\nimport TutorialTip from './tutorial_tip';\n\nfunction mapStateToProps(state: GlobalState) {\n    const currentUserId = getCurrentUserId(state);\n    return {\n        currentUserId,\n        step: getInt(state, Preferences.TUTORIAL_STEP, currentUserId, 0),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            closeRhsMenu,\n            savePreferences,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TutorialTip);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {ActionResult} from 'mattermost-redux/types/actions';\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\n\nimport {ProductComponent} from 'types/store/plugins';\n\nimport {Preferences, TutorialSteps, TopLevelProducts} from 'utils/constants';\n\nimport TutorialTip from 'components/tutorial/tutorial_tip';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message.jsx';\n\nfunction checkHasPlaybooks(products: ProductComponent[]): boolean {\n    return products.some((x) => x.switcherText === TopLevelProducts.PLAYBOOKS);\n}\n\nfunction checkHasBoards(products: ProductComponent[]): boolean {\n    return products.some((x) => x.switcherText === TopLevelProducts.BOARDS);\n}\n\nexport interface Props {\n    currentUserId: string;\n    products?: ProductComponent[];\n    step: number;\n    actions: {\n        savePreferences: (userId: string, preferences: PreferenceType[]) => Promise<ActionResult>;\n    };\n}\n\n// We track skippedBecauseIrrelevant because we only want to fire the action once\ninterface State {\n    skippedBecauseIrrelevant: boolean;\n}\n\nconst screens = [\n    <div key='first-screen'>\n        <h4>\n            <FormattedMessage\n                id='sidebar.tutorialProductSwitcher.title'\n                defaultMessage='Try Boards and Playbooks'\n            />\n        </h4>\n        <p>\n            <FormattedMarkdownMessage\n                id='sidebar.tutorialProductSwitcher.switchProducts'\n                defaultMessage={'Launch other Mattermost products from here, including **Boards** and **Playbooks**.'}\n            />\n        </p>\n        <p>\n            <FormattedMarkdownMessage\n                id='sidebar.tutorialProductSwitcher.admin'\n                defaultMessage={'System Admins can also configure and customize Mattermost using the **System Console** and install Mattermost Apps from the **Marketplace**.'}\n            />\n        </p>\n    </div>,\n];\n\nexport class ProductSwitcherTip extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            skippedBecauseIrrelevant: false,\n        };\n    }\n\n    // Checking in both componentDidMount and componentDidUpdate protects against changes in data load & component render order.\n    componentDidMount() {\n        this.skipIfIrrelevant();\n    }\n\n    componentDidUpdate() {\n        this.skipIfIrrelevant();\n    }\n\n    checkRelevance() {\n    }\n\n    skipIfIrrelevant() {\n        // We check this at the component level because we want to wait until\n        // global header is visible to the user.\n        // Otherwise, it could happen that a user on a mattermost instance\n        // 1) completes the prior tip\n        // 2) doesn't have both Boards & Playbooks installed & enabled\n        // 3) The tip is skipped\n        // 4) Boards and Playbooks get installed & enabled.\n        // 5) User turns on global header or it gets enabled for all users.\n        // 6. The user misses seeing this tip.\n\n        if (this.state.skippedBecauseIrrelevant || (this.props.step !== TutorialSteps.PRODUCT_SWITCHER)) {\n            return;\n        }\n\n        const userHasProducts = this.props.products && checkHasPlaybooks(this.props.products) && checkHasBoards(this.props.products);\n        if (userHasProducts) {\n            return;\n        }\n\n        // If user does not have access to these products, we do not want to show them the tutorial.\n        this.setState({skippedBecauseIrrelevant: true}, () => {\n            this.props.actions.savePreferences(\n                this.props.currentUserId,\n                [{\n                    user_id: this.props.currentUserId,\n                    category: Preferences.TUTORIAL_STEP,\n                    name: this.props.currentUserId,\n                    value: (TutorialSteps.PRODUCT_SWITCHER + 1).toString(),\n                }],\n            );\n        });\n    }\n\n    render() {\n        const tipIsRelevant = (this.props.step === TutorialSteps.PRODUCT_SWITCHER) && !this.state.skippedBecauseIrrelevant && this.props.products && checkHasPlaybooks(this.props.products) && checkHasBoards(this.props.products);\n        if (!tipIsRelevant) {\n            return null;\n        }\n\n        return (\n            <TutorialTip\n                placement='right'\n                screens={screens}\n                overlayClass='tip-overlay--product-switcher'\n                telemetryTag='tutorial_tip_product_switcher'\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {GlobalState} from 'types/store';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getInt} from 'mattermost-redux/selectors/entities/preferences';\nimport {ActionFunc, ActionResult, GenericAction} from 'mattermost-redux/types/actions';\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\n\nimport {Preferences} from 'utils/constants';\n\nimport {ProductSwitcherTip} from './product_switcher_tip';\n\nfunction mapStateToProps(state: GlobalState) {\n    const currentUserId = getCurrentUserId(state);\n    const step: number = getInt(state, Preferences.TUTORIAL_STEP, currentUserId, 0);\n    const products = state.plugins.components.Product;\n    return {\n        currentUserId,\n        products,\n        step,\n    };\n}\n\ntype Actions = {\n    savePreferences: (userId: string, preferences: PreferenceType[]) => Promise<ActionResult>;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            savePreferences,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ProductSwitcherTip);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {useRef, useState} from 'react';\nimport {Link} from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport IconButton from '@mattermost/compass-components/components/icon-button';\nimport Icon, {TIconGlyph} from '@mattermost/compass-components/foundations/icon';\n\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport {useClickOutsideRef, useCurrentProductId, useProducts} from './hooks';\nimport ProductBranding from './product_branding';\nimport ProductSwitcherMenu from './product_switcher_menu';\nimport ProductSwitcherTip from './product_switcher_tip';\n\ninterface SwitcherNavEntryProps {\n    destination: string;\n    icon: TIconGlyph;\n    text: React.ReactNode;\n    active: boolean;\n    onClick: () => void;\n}\n\nconst ProductSwitcherContainer = styled.nav`\n    display: flex;\n    align-items: center;\n    cursor: pointer;\n\n    > * + * {\n        margin-left: 12px;\n    }\n`;\n\nconst ProductSwitcherButton = styled(IconButton).attrs(() => ({\n    icon: 'products',\n    size: 'sm',\n\n    // we currently need this, since not passing a onClick handler is disabling the IconButton\n    // this is a known issue and is being tracked by UI platform team\n    // TODO@UI: remove the onClick, when it is not a mandatory prop anymore\n    onClick: () => {},\n    inverted: true,\n    compact: true,\n}))`\n    > i::before {\n        font-size: 20px;\n        letter-spacing: 20px;\n    }\n`;\n\nconst MenuItem = styled(Link)`\n    && {\n        text-decoration: none;\n        color: inherit;\n    }\n\n    height: 40px;\n    width: 270px;\n    padding-left: 16px;\n    padding-right: 20px;\n    display: flex;\n    align-items: center;\n    cursor: pointer;\n\n    &:hover {\n        background: rgba(var(--center-channel-color-rgb), 0.08);\n        text-decoration: none;\n        color: inherit;\n    }\n\n    button {\n        padding: 0 6px;\n    }\n`;\n\nconst StyledIcon = styled(Icon)`\n    color: var(--button-bg);\n`;\n\nconst MenuItemTextContainer = styled.div`\n    margin-left: 8px;\n    flex-grow: 1;\n    font-weight: 600;\n    font-size: 14px;\n    line-height: 20px;\n`;\n\nconst SwitcherNavEntry = ({icon, destination, text, active, onClick}: SwitcherNavEntryProps) => {\n    return (\n        <MenuItem\n            to={destination}\n            onClick={onClick}\n        >\n            <StyledIcon\n                size={20}\n                glyph={icon || 'none'}\n            />\n            <MenuItemTextContainer>\n                {text}\n            </MenuItemTextContainer>\n            {active &&\n                <StyledIcon\n                    size={16}\n                    glyph='check'\n                />\n            }\n        </MenuItem>\n    );\n};\n\nconst ProductSwitcher = (): JSX.Element => {\n    const products = useProducts();\n    const [switcherOpen, setSwitcherOpen] = useState(false);\n    const menuRef = useRef<HTMLDivElement>(null);\n\n    const currentProductID = useCurrentProductId(products);\n\n    const handleClick = () => setSwitcherOpen(!switcherOpen);\n\n    useClickOutsideRef(menuRef, () => {\n        setSwitcherOpen(false);\n    });\n\n    const productItems = products?.map((product) => {\n        return (\n            <SwitcherNavEntry\n                key={product.id}\n                destination={product.switcherLinkURL}\n                icon={product.switcherIcon}\n                text={product.switcherText}\n                active={product.id === currentProductID}\n                onClick={handleClick}\n            />\n        );\n    });\n\n    return (\n        <div ref={menuRef}>\n            <MenuWrapper\n                open={switcherOpen}\n            >\n                <ProductSwitcherContainer onClick={handleClick}>\n                    <ProductSwitcherButton\n                        active={switcherOpen}\n                        aria-label='Select to open product switch menu.'\n                    />\n                    <ProductSwitcherTip/>\n                    <ProductBranding/>\n                </ProductSwitcherContainer>\n                <Menu\n                    className={'product-switcher-menu'}\n                    ariaLabel={'switcherOpen'}\n                >\n                    <SwitcherNavEntry\n                        destination={'/'}\n                        icon={'product-channels'}\n                        text={'Channels'}\n                        active={currentProductID === null}\n                        onClick={handleClick}\n                    />\n                    {productItems}\n                    <ProductSwitcherMenu\n                        id='ProductSwitcherMenu'\n                        isMessaging={currentProductID === null}\n                        onClick={handleClick}\n                    />\n                </Menu>\n            </MenuWrapper>\n        </div>\n    );\n};\n\nexport default ProductSwitcher;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport styled from 'styled-components';\nimport IconButton from '@mattermost/compass-components/components/icon-button';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport * as Utils from 'utils/utils';\nimport {browserHistory} from 'utils/browser_history';\n\nconst HistoryButtonsContainer = styled.nav`\n    display: flex;\n    align-items: center;\n\n    > :first-child {\n           margin-right: 1px;\n    }\n`;\n\nconst HistoryButtons = (): JSX.Element => {\n    const goBack = () => {\n        trackEvent('ui', 'ui_history_back');\n        browserHistory.goBack();\n    };\n\n    const goForward = () => {\n        trackEvent('ui', 'ui_history_forward');\n        browserHistory.goForward();\n    };\n\n    return (\n        <HistoryButtonsContainer>\n            <IconButton\n                icon={'arrow-left'}\n                onClick={goBack}\n                size={'sm'}\n                compact={true}\n                inverted={true}\n                aria-label={Utils.localizeMessage('sidebar_left.channel_navigator.goBackLabel', 'Back')}\n            />\n            <IconButton\n                icon={'arrow-right'}\n                onClick={goForward}\n                size={'sm'}\n                compact={true}\n                inverted={true}\n                aria-label={Utils.localizeMessage('sidebar_left.channel_navigator.goForwardLabel', 'Forward')}\n            />\n        </HistoryButtonsContainer>\n    );\n};\n\nexport default HistoryButtons;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport HistoryButtons from './history_buttons';\n\nexport default HistoryButtons;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage, injectIntl, IntlShape} from 'react-intl';\nimport IconButton from '@mattermost/compass-components/components/icon-button';\n\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport Menu from 'components/widgets/menu/menu';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport {toggleShortcutsModal} from 'actions/global_actions';\nimport {trackEvent} from 'actions/telemetry_actions';\nimport * as Utils from 'utils/utils';\n\nconst askTheCommunityUrl = 'https://mattermost.com/pl/default-ask-mattermost-community/';\n\ntype Props = {\n    intl: IntlShape;\n    helpLink: string;\n    reportAProblemLink: string;\n    enableAskCommunityLink: string;\n    showGettingStarted: boolean;\n    showNextStepsTips: boolean;\n    actions: {\n        unhideNextSteps: () => void;\n    };\n};\n\ntype State = {\n    buttonActive: boolean;\n};\n\nclass UserGuideDropdown extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            buttonActive: false,\n        };\n    }\n\n    toggleShortcutsModal = (e: MouseEvent) => {\n        e.preventDefault();\n        toggleShortcutsModal();\n    }\n\n    buttonToggleState = (menuActive: boolean) => {\n        this.setState({\n            buttonActive: menuActive,\n        });\n    }\n\n    askTheCommunityClick = () => {\n        trackEvent('ui', 'help_ask_the_community');\n    }\n\n    renderDropdownItems = (): React.ReactNode => {\n        const {intl, showGettingStarted, showNextStepsTips} = this.props;\n\n        return (\n            <Menu.Group>\n                {this.props.enableAskCommunityLink === 'true' && (\n                    <Menu.ItemExternalLink\n                        id='askTheCommunityLink'\n                        url={askTheCommunityUrl}\n                        text={intl.formatMessage({id: 'userGuideHelp.askTheCommunity', defaultMessage: 'Ask the community'})}\n                        onClick={this.askTheCommunityClick}\n                    />\n                )}\n                <Menu.ItemExternalLink\n                    id='helpResourcesLink'\n                    url={this.props.helpLink}\n                    text={intl.formatMessage({id: 'userGuideHelp.helpResources', defaultMessage: 'Help resources'})}\n                />\n                <Menu.ItemAction\n                    id='gettingStarted'\n                    show={showGettingStarted}\n                    onClick={() => this.props.actions.unhideNextSteps()}\n                    text={intl.formatMessage({id: showNextStepsTips ? 'sidebar_next_steps.tipsAndNextSteps' : 'navbar_dropdown.gettingStarted', defaultMessage: showNextStepsTips ? 'Tips & Next Steps' : 'Getting Started'})}\n                    icon={Utils.isMobile() && <i className={`icon ${showNextStepsTips ? 'icon-lightbulb-outline' : 'icon-play'}`}/>}\n                />\n                <Menu.ItemExternalLink\n                    id='reportAProblemLink'\n                    url={this.props.reportAProblemLink}\n                    text={intl.formatMessage({id: 'userGuideHelp.reportAProblem', defaultMessage: 'Report a problem'})}\n                />\n                <Menu.ItemAction\n                    id='keyboardShortcuts'\n                    onClick={this.toggleShortcutsModal}\n                    text={intl.formatMessage({id: 'userGuideHelp.keyboardShortcuts', defaultMessage: 'Keyboard shortcuts'})}\n                />\n            </Menu.Group>\n        );\n    }\n\n    render() {\n        const {intl} = this.props;\n        const tooltip = (\n            <Tooltip\n                id='userGuideHelpTooltip'\n                className='hidden-xs'\n            >\n                <FormattedMessage\n                    id={'channel_header.userHelpGuide'}\n                    defaultMessage='Help'\n                />\n            </Tooltip>\n        );\n\n        return (\n            <MenuWrapper\n                id='helpMenuPortal'\n                className='userGuideHelp'\n                onToggle={this.buttonToggleState}\n            >\n                <OverlayTrigger\n                    delayShow={500}\n                    placement='bottom'\n                    overlay={this.state.buttonActive ? <></> : tooltip}\n                >\n                    <IconButton\n                        size={'sm'}\n                        icon={'help-circle-outline'}\n                        onClick={() => {}} // icon button currently requires onclick ... needs to revisit\n                        active={this.state.buttonActive}\n                        inverted={true}\n                        compact={true}\n                        aria-label='Select to toggle the help menu.' // proper wording and translation needed\n                    />\n                </OverlayTrigger>\n                <Menu\n                    openLeft={true}\n                    openUp={false}\n                    id='AddChannelDropdown'\n                    ariaLabel={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.dropdownAriaLabel', defaultMessage: 'Add Channel Dropdown'})}\n                >\n                    {this.renderDropdownItems()}\n                </Menu>\n            </MenuWrapper>\n        );\n    }\n}\n\nexport default injectIntl(UserGuideDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {unhideNextSteps} from 'actions/views/next_steps';\nimport {GlobalState} from 'types/store';\n\nimport {\n    showOnboarding,\n    showNextStepsTips,\n    showNextSteps,\n} from 'components/next_steps_view/steps';\n\nimport UserGuideDropdown from './user_guide_dropdown';\n\nfunction mapStateToProps(state: GlobalState) {\n    const {HelpLink, ReportAProblemLink, EnableAskCommunityLink} = getConfig(state);\n    return {\n        helpLink: HelpLink || '',\n        reportAProblemLink: ReportAProblemLink || '',\n        enableAskCommunityLink: EnableAskCommunityLink || '',\n        showGettingStarted: showOnboarding(state),\n        showNextStepsTips: showNextStepsTips(state),\n        showNextSteps: showNextSteps(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            unhideNextSteps,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(UserGuideDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport IconButton from '@mattermost/compass-components/components/icon-button';\n\nimport {closeRightHandSide, showMentions} from 'actions/views/rhs';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport {getIsRhsOpen, getRhsState} from 'selectors/rhs';\nimport {GlobalState} from 'types/store';\nimport Constants, {RHSStates} from 'utils/constants';\n\nconst AtMentionsButton = (): JSX.Element => {\n    const dispatch = useDispatch();\n    const rhsState = useSelector((state: GlobalState) => getRhsState(state));\n    const isRhsOpen = useSelector((state: GlobalState) => getIsRhsOpen(state));\n\n    const mentionButtonClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n        e.preventDefault();\n        if (rhsState === RHSStates.MENTION) {\n            dispatch(closeRightHandSide());\n        } else {\n            dispatch(showMentions());\n        }\n    };\n\n    const tooltip = (\n        <Tooltip id='recentMentions'>\n            <FormattedMessage\n                id='channel_header.recentMentions'\n                defaultMessage='Recent mentions'\n            />\n        </Tooltip>\n    );\n\n    return (\n        <OverlayTrigger\n            trigger={['hover']}\n            delayShow={Constants.OVERLAY_TIME_DELAY}\n            placement='bottom'\n            overlay={isRhsOpen ? <></> : tooltip}\n        >\n            <IconButton\n                size={'sm'}\n                icon={'at'}\n                toggled={rhsState === RHSStates.MENTION}\n                onClick={mentionButtonClick}\n                inverted={true}\n                compact={true}\n                aria-label='Select to toggle a list of recent mentions.' // proper wording and translation needed\n            />\n        </OverlayTrigger>\n    );\n};\n\nexport default AtMentionsButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport IconButton from '@mattermost/compass-components/components/icon-button';\n\nimport {closeRightHandSide, showFlaggedPosts} from 'actions/views/rhs';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport {getIsRhsOpen, getRhsState} from 'selectors/rhs';\nimport {GlobalState} from 'types/store';\nimport Constants, {RHSStates} from 'utils/constants';\n\nconst SavedPostsButton = (): JSX.Element | null => {\n    const dispatch = useDispatch();\n    const rhsState = useSelector((state: GlobalState) => getRhsState(state));\n    const isRhsOpen = useSelector((state: GlobalState) => getIsRhsOpen(state));\n\n    const savedPostsButtonClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n        e.preventDefault();\n        if (rhsState === RHSStates.FLAG) {\n            dispatch(closeRightHandSide());\n        } else {\n            dispatch(showFlaggedPosts());\n        }\n    };\n\n    const tooltip = (\n        <Tooltip id='recentMentions'>\n            <FormattedMessage\n                id='channel_header.flagged'\n                defaultMessage='Saved posts'\n            />\n        </Tooltip>\n    );\n\n    return (\n        <OverlayTrigger\n            trigger={['hover']}\n            delayShow={Constants.OVERLAY_TIME_DELAY}\n            placement='bottom'\n            overlay={isRhsOpen ? <></> : tooltip}\n        >\n            <IconButton\n                size={'sm'}\n                icon={'bookmark-outline'}\n                toggled={rhsState === RHSStates.FLAG}\n                onClick={savedPostsButtonClick}\n                inverted={true}\n                compact={true}\n                aria-label='Select to toggle a list of saved posts.' // proper wording and translation needed\n            />\n        </OverlayTrigger>\n    );\n};\n\nexport default SavedPostsButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport IconButton from '@mattermost/compass-components/components/icon-button';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport UserSettingsModal from 'components/user_settings/modal';\n\ntype Props = {\n    actions: {\n        openModal: (params: {modalId: string; dialogType: any; dialogProps: any}) => void;\n    };\n};\n\nconst SettingsButton = (props: Props): JSX.Element | null => {\n    const tooltip = (\n        <Tooltip id='productSettings'>\n            <FormattedMessage\n                id='global_header.productSettings'\n                defaultMessage='Settings'\n            />\n        </Tooltip>\n    );\n\n    return (\n        <OverlayTrigger\n            trigger={['hover']}\n            delayShow={Constants.OVERLAY_TIME_DELAY}\n            placement='bottom'\n            overlay={tooltip}\n        >\n            <IconButton\n                size={'sm'}\n                icon={'settings-outline'}\n                onClick={(): void => {\n                    props.actions.openModal({modalId: ModalIdentifiers.USER_SETTINGS, dialogType: UserSettingsModal, dialogProps: {isContentProductSettings: true}});\n                }}\n                inverted={true}\n                compact={true}\n                aria-label='Select to open the settings modal.' // proper wording and translation needed\n            />\n        </OverlayTrigger>\n    );\n};\n\nexport default SettingsButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {openModal} from 'actions/views/modals';\n\nimport SettingsButton from './settings_button';\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            openModal,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(SettingsButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport TutorialTip from 'components/tutorial/tutorial_tip';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message.jsx';\n\nexport default function SettingsTip() {\n    const screens = [\n        <div key='first-screen'>\n            <h4>\n                <FormattedMessage\n                    id='sidebar.tutorialSettings.title'\n                    defaultMessage='Customize your experience'\n                />\n            </h4>\n            <p>\n                <FormattedMarkdownMessage\n                    id='sidebar.tutorialSettings.settings'\n                    defaultMessage={'Set your availability, add a custom status, and access **Preferences** and **Account Settings** to configure your experience, including notification preferences and custom theme colors.'}\n                />\n            </p>\n        </div>,\n    ];\n\n    return (\n        <TutorialTip\n            placement='bottom'\n            screens={screens}\n            overlayClass='tip-overlay--settings'\n            telemetryTag='tutorial_tip_settings'\n        />\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport styled from 'styled-components';\n\nimport StatusDropdown from 'components/status_dropdown';\nimport {getGlobalHeaderEnabled} from 'selectors/global_header';\nimport {TutorialSteps} from 'utils/constants';\nimport Pluggable from 'plugins/pluggable';\nimport {isDesktopApp} from 'utils/user_agent';\n\nimport GlobalSearchNav from './global_search_nav/global_search_nav';\nimport ProductSwitcher from './product_switcher';\nimport HistoryButtons from './history_buttons';\nimport UserGuideDropdown from './user_guide_dropdown';\nimport AtMentionsButton from './at_mentions_button/at_mentions_button';\nimport SavedPostsButton from './saved_posts_button/saved_posts_button';\nimport SettingsButton from './settings_button';\nimport SettingsTip from './settings_tip';\n\nimport {useCurrentProductId, useIsLoggedIn, useProducts, useShowTutorialStep} from './hooks';\n\nimport './global_header.scss';\n\nconst GlobalHeaderContainer = styled.header`\n    position: relative;\n    display: flex;\n    flex-shrink: 0;\n    align-items: center;\n    justify-content: space-between;\n    height: 40px;\n    background: var(--global-header-background);\n    border-bottom: solid 1px rgba(var(--center-channel-color-rgb), 0.08);\n    color: rgba(var(--global-header-text-rgb), 0.64);\n    padding: 0 12px;\n\n    > * + * {\n        margin-left: 12px;\n    }\n`;\n\nconst LeftControls = styled.div`\n    display: flex;\n    align-items: center;\n    height: 40px;\n    flex-shrink: 0;\n\n    > * + * {\n        margin-left: 12px;\n    }\n`;\n\nconst CenterControls = styled.div`\n    display: flex;\n    align-items: center;\n    height: 40px;\n    justify-content: center;\n    flex-grow: 1;\n\n    > * + * {\n        margin-left: 8px;\n    }\n`;\n\nconst RightControls = styled.div`\n    display: flex;\n    align-items: center;\n    height: 40px;\n    flex-shrink: 0;\n\n    > * + * {\n        margin-left: 8px;\n    }\n`;\n\nconst GlobalHeader = (): JSX.Element | null => {\n    const enabled = useSelector(getGlobalHeaderEnabled);\n    const isLoggedIn = useIsLoggedIn();\n    const products = useProducts();\n    const currentProductID = useCurrentProductId(products);\n    const showSettingsTip = useShowTutorialStep(TutorialSteps.SETTINGS);\n\n    useEffect(() => {\n        const root = document.querySelector('#root');\n        if (enabled) {\n            root?.classList.add('feature-global-header');\n        } else {\n            root?.classList.remove('feature-global-header');\n        }\n        return () => {\n            root?.classList.remove('feature-global-header');\n        };\n    }, [enabled]);\n\n    if (!enabled || !isLoggedIn) {\n        return null;\n    }\n\n    return (\n        <GlobalHeaderContainer>\n            <LeftControls>\n                <ProductSwitcher/>\n                {isDesktopApp() && <HistoryButtons/>}\n            </LeftControls>\n            <CenterControls>\n                {currentProductID !== null &&\n                    <Pluggable\n                        pluggableName={'Product'}\n                        subComponentName={'headerCentreComponent'}\n                        pluggableId={currentProductID}\n                    />\n                }\n                {currentProductID === null &&\n                    <>\n                        <GlobalSearchNav/>\n                        <UserGuideDropdown/>\n                    </>\n                }\n            </CenterControls>\n            <RightControls>\n                {currentProductID !== null &&\n                    <Pluggable\n                        pluggableName={'Product'}\n                        subComponentName={'headerRightComponent'}\n                        pluggableId={currentProductID}\n                    />\n                }\n                {currentProductID === null &&\n                    <>\n                        <AtMentionsButton/>\n                        <SavedPostsButton/>\n                        <SettingsButton/>\n                        {showSettingsTip && <SettingsTip/>}\n                    </>\n                }\n                <StatusDropdown globalHeader={true}/>\n            </RightControls>\n        </GlobalHeaderContainer>\n    );\n};\n\nexport default GlobalHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Route} from 'react-router-dom';\n\nconst HeaderFooterTemplate = React.lazy(() => import('components/header_footer_template'));\nconst LoggedIn = React.lazy(() => import('components/logged_in'));\n\nexport const HFTRoute = ({component: Component, ...rest}) => (\n    <Route\n        {...rest}\n        render={(props) => (\n            <React.Suspense fallback={null}>\n                <HeaderFooterTemplate {...props}>\n                    <Component {...props}/>\n                </HeaderFooterTemplate>\n            </React.Suspense>\n        )}\n    />\n);\n\nexport const LoggedInHFTRoute = ({component: Component, ...rest}) => (\n    <Route\n        {...rest}\n        render={(props) => (\n            <React.Suspense fallback={null}>\n                <LoggedIn {...props}>\n                    <React.Suspense fallback={null}>\n                        <HeaderFooterTemplate {...props}>\n                            <Component {...props}/>\n                        </HeaderFooterTemplate>\n                    </React.Suspense>\n                </LoggedIn>\n            </React.Suspense>\n        )}\n    />\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {IntlProvider as BaseIntlProvider} from 'react-intl';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {setLocalizeFunction} from 'mattermost-redux/utils/i18n_utils';\n\nimport * as I18n from 'i18n/i18n';\n\nimport {localizeMessage} from 'utils/utils';\n\nexport default class IntlProvider extends React.PureComponent {\n    static propTypes = {\n        children: PropTypes.element.isRequired,\n        locale: PropTypes.string.isRequired,\n        translations: PropTypes.object,\n        actions: PropTypes.shape({\n            loadTranslations: PropTypes.func.isRequired,\n        }).isRequired,\n    };\n\n    componentDidMount() {\n        // Initialize browser's i18n data\n        I18n.doAddLocaleData();\n\n        // Pass localization function back to mattermost-redux\n        setLocalizeFunction(localizeMessage);\n\n        this.handleLocaleChange(this.props.locale);\n    }\n\n    componentDidUpdate(prevProps) {\n        if (prevProps.locale !== this.props.locale) {\n            this.handleLocaleChange(this.props.locale);\n        }\n    }\n\n    handleLocaleChange = (locale) => {\n        Client4.setAcceptLanguage(locale);\n\n        this.loadTranslationsIfNecessary(locale);\n    }\n\n    loadTranslationsIfNecessary = (locale) => {\n        if (this.props.translations) {\n            // Already loaded\n            return;\n        }\n        const localeInfo = I18n.getLanguageInfo(locale);\n\n        if (!localeInfo) {\n            return;\n        }\n\n        this.props.actions.loadTranslations(locale, localeInfo.url);\n    }\n\n    render() {\n        if (!this.props.translations) {\n            return null;\n        }\n\n        return (\n            <BaseIntlProvider\n                key={this.props.locale}\n                locale={this.props.locale}\n                messages={this.props.translations}\n                textComponent='span'\n                wrapRichTextChunksInFragment={false}\n            >\n                {this.props.children}\n            </BaseIntlProvider>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {loadTranslations} from 'actions/views/root';\n\nimport {getCurrentLocale, getTranslations} from 'selectors/i18n';\n\nimport IntlProvider from './intl_provider';\n\nfunction mapStateToProps(state) {\n    const locale = getCurrentLocale(state);\n\n    return {\n        locale,\n        translations: getTranslations(state, locale),\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            loadTranslations,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(IntlProvider);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage, injectIntl, IntlShape} from 'react-intl';\nimport classNames from 'classnames';\n\nimport {Constants, ModalIdentifiers} from 'utils/constants';\nimport {\n    splitMessageBasedOnCaretPosition,\n    postMessageOnKeyPress,\n} from 'utils/post_utils';\nimport * as Utils from 'utils/utils.jsx';\nimport {\n    getTable,\n    formatMarkdownTableMessage,\n    isGitHubCodeBlock,\n    formatGithubCodePaste,\n} from 'utils/paste';\n\nimport DeletePostModal from 'components/delete_post_modal';\nimport EmojiPickerOverlay from 'components/emoji_picker/emoji_picker_overlay.jsx';\nimport EmojiIcon from 'components/widgets/icons/emoji_icon';\nimport Textbox from 'components/textbox';\nimport TextboxClass from 'components/textbox/textbox';\nimport TextboxLinks from 'components/textbox/textbox_links';\nimport {Emoji, SystemEmoji} from 'mattermost-redux/types/emojis';\nimport {Post} from 'mattermost-redux/types/posts';\n\nconst KeyCodes = Constants.KeyCodes;\nconst TOP_OFFSET = 0;\nconst RIGHT_OFFSET = 10;\n\ntype OpenModal = {\n    ModalId: string;\n    dialogType: typeof React.Component;\n    dialogProps: {\n        post: Post;\n        isRHS?: boolean;\n    };\n};\n\nexport type Props = {\n    canEditPost?: boolean;\n    canDeletePost?: boolean;\n    channelId: string;\n    codeBlockOnCtrlEnter: boolean;\n    ctrlSend: boolean;\n    config: {\n        EnableEmojiPicker: string;\n        EnableGifPicker?: string;\n    };\n    intl: IntlShape;\n    maxPostSize: number;\n    shouldShowPreview: boolean;\n    useChannelMentions: boolean;\n    editingPost: {\n        post?: Post;\n        postId?: string;\n        refocusId?: string;\n        show: boolean;\n        title?: string;\n        isRHS?: boolean;\n    };\n    actions: {\n        addMessageIntoHistory: (message: string) => void;\n        editPost: (input: Partial<Post>) => Promise<Post>;\n        hideEditPostModal: () => void;\n        openModal: (input: OpenModal) => void;\n        setShowPreview: (newPreview: boolean) => void;\n    };\n};\n\nexport type State = {\n    editText: string;\n    caretPosition: number;\n    postError: React.ReactNode;\n    errorClass: string | null;\n    showEmojiPicker: boolean;\n    renderScrollbar: boolean;\n    scrollbarWidth: number;\n    prevShowState: boolean;\n};\n\nexport class EditPostModal extends React.PureComponent<Props, State> {\n    private editModalBody: React.RefObject<Modal>;\n    private editbox: TextboxClass | null;\n    private lastChannelSwitchAt: number | undefined;\n    private refocusId: string | null | undefined;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            editText: '',\n            caretPosition: ''.length,\n            postError: null,\n            errorClass: null,\n            showEmojiPicker: false,\n            renderScrollbar: false,\n            scrollbarWidth: 0,\n            prevShowState: props.editingPost.show,\n        };\n\n        this.editModalBody = React.createRef();\n        this.editbox = null;\n    }\n\n    static getDerivedStateFromProps(props: Props, state: State) {\n        if (props.editingPost.show && !state.prevShowState) {\n            return {\n                editText:\n          props.editingPost.post?.message_source ||\n          props.editingPost.post?.message,\n                prevShowState: props.editingPost.show,\n            };\n        }\n\n        return null;\n    }\n\n    componentDidMount() {\n        document.addEventListener('paste', this.handlePaste);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('paste', this.handlePaste);\n    }\n\n    setShowPreview = (newPreviewValue: boolean) => {\n        this.props.actions.setShowPreview(newPreviewValue);\n    };\n\n    getContainer = () => {\n        return this.editModalBody.current;\n    };\n\n    toggleEmojiPicker = () => {\n        this.setState({showEmojiPicker: !this.state.showEmojiPicker});\n        if (!this.state.showEmojiPicker && this.editbox) {\n            this.editbox.focus();\n        }\n    };\n\n    hideEmojiPicker = () => {\n        this.setState({showEmojiPicker: false});\n        if (this.editbox) {\n            this.editbox.focus();\n        }\n    };\n\n    handleEmojiClick = (emoji?: Emoji) => {\n        const emojiAlias =\n      emoji &&\n        (((emoji as SystemEmoji).short_names && (emoji as SystemEmoji).short_names[0]) || emoji.name);\n\n        if (!emojiAlias) {\n            //Oops.. There went something wrong\n            return;\n        }\n\n        if (this.state.editText === '') {\n            this.setState({editText: ':' + emojiAlias + ': '});\n        } else {\n            const {editText} = this.state;\n            const {firstPiece, lastPiece} = splitMessageBasedOnCaretPosition(\n                this.state.caretPosition,\n                editText,\n            );\n\n            // check whether the first piece of the message is empty when cursor\n            // is placed at beginning of message and avoid adding an empty string at the beginning of the message\n            const newMessage = firstPiece === '' ?\n                `:${emojiAlias}: ${lastPiece}` :\n                `${firstPiece} :${emojiAlias}: ${lastPiece}`;\n            const newCaretPosition = firstPiece === '' ?\n                `:${emojiAlias}: `.length :\n                `${firstPiece} :${emojiAlias}: `.length;\n\n            const textbox = this.editbox && this.editbox.getInputBox();\n\n            this.setState(\n                {\n                    editText: newMessage,\n                    caretPosition: newCaretPosition,\n                },\n                () => {\n                    Utils.setCaretPosition(textbox, newCaretPosition);\n                },\n            );\n        }\n\n        this.setState({showEmojiPicker: false});\n\n        this.editbox?.focus();\n    };\n\n    handleGifClick = (gif: string) => {\n        if (this.state.editText === '') {\n            this.setState({editText: gif});\n        } else {\n            const newMessage = (/\\s+$/).test(this.state.editText) ?\n                this.state.editText + gif :\n                this.state.editText + ' ' + gif;\n            this.setState({editText: newMessage});\n        }\n        this.setState({showEmojiPicker: false});\n        this.editbox?.focus();\n    };\n\n    getTarget = () => {\n        return this.refs.editPostEmoji;\n    };\n\n    handlePostError = (postError: React.ReactNode) => {\n        if (this.state.postError !== postError) {\n            this.setState({postError});\n        }\n    };\n\n    handleEdit = async () => {\n        const {actions, editingPost} = this.props;\n        if (this.isSaveDisabled() || !editingPost.post) {\n            return;\n        }\n\n        const updatedPost = {\n            message: this.state.editText,\n            id: editingPost.postId,\n            channel_id: editingPost.post.channel_id,\n        };\n\n        if (this.state.postError) {\n            this.setState({errorClass: 'animation--highlight'});\n            setTimeout(() => {\n                this.setState({errorClass: null});\n            }, Constants.ANIMATION_TIMEOUT);\n            return;\n        }\n\n        if (updatedPost.message === (editingPost.post?.message_source || editingPost.post?.message)) {\n            // no changes so just close the modal\n            this.handleHide();\n            return;\n        }\n\n        const hasAttachment = Boolean(editingPost.post?.file_ids && editingPost.post?.file_ids.length > 0);\n        if (updatedPost.message.trim().length === 0 && !hasAttachment) {\n            this.handleHide(false);\n\n            const deletePostModalData = {\n                ModalId: ModalIdentifiers.DELETE_POST,\n                dialogType: DeletePostModal,\n                dialogProps: {\n                    post: editingPost.post,\n                    isRHS: editingPost.isRHS,\n                },\n            };\n\n            actions.openModal(deletePostModalData);\n            return;\n        }\n\n        actions.addMessageIntoHistory(updatedPost.message);\n\n        const data = await actions.editPost(updatedPost);\n        if (data) {\n            window.scrollTo(0, 0);\n        }\n\n        this.handleHide();\n    };\n\n    handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n        const message = e.target.value;\n        this.setState({\n            editText: message,\n        });\n    };\n\n    handlePaste = (e: ClipboardEvent) => {\n        if (\n            !e.clipboardData ||\n            !e.clipboardData.items ||\n            !this.props.canEditPost ||\n            (e.target as HTMLTextAreaElement).id !== 'edit_textbox'\n        ) {\n            return;\n        }\n        const {clipboardData} = e;\n        const table = getTable(clipboardData);\n        if (!table) {\n            return;\n        }\n\n        e.preventDefault();\n\n        const {editText} = this.state;\n        let message = editText;\n        let newCaretPosition = this.state.caretPosition;\n\n        if (table && isGitHubCodeBlock(table.className)) {\n            const {formattedMessage, formattedCodeBlock} = formatGithubCodePaste(\n                this.state.caretPosition,\n                message,\n                clipboardData,\n            );\n            newCaretPosition = this.state.caretPosition + formattedCodeBlock.length;\n            message = formattedMessage;\n        } else if (table) {\n            message = formatMarkdownTableMessage(\n                table,\n                editText.trim(),\n                newCaretPosition,\n            );\n            newCaretPosition = message.length - (editText.length - newCaretPosition);\n        }\n\n        this.setState(\n            {\n                editText: message,\n                caretPosition: newCaretPosition,\n            },\n            () => {\n                if (this.editbox) {\n                    Utils.setCaretPosition(this.editbox.getInputBox(), newCaretPosition);\n                }\n            },\n        );\n    };\n\n    handleEditKeyPress = (e: React.KeyboardEvent) => {\n        const {ctrlSend, codeBlockOnCtrlEnter} = this.props;\n\n        const {allowSending, ignoreKeyPress} = postMessageOnKeyPress(e, this.state.editText, ctrlSend, codeBlockOnCtrlEnter, Date.now(), this.lastChannelSwitchAt, this.state.caretPosition) as {allowSending: boolean; ignoreKeyPress?: boolean};\n\n        if (ignoreKeyPress) {\n            e.preventDefault();\n            e.stopPropagation();\n            return;\n        }\n\n        if (allowSending && this.editbox) {\n            e.preventDefault();\n            this.editbox.blur();\n            this.handleEdit();\n        }\n    };\n\n    handleMouseUpKeyUp = (e: React.MouseEvent<Element, MouseEvent> | React.KeyboardEvent<Element>) => {\n        const caretPosition = Utils.getCaretPosition(e.target);\n        this.setState({\n            caretPosition,\n        });\n    };\n\n    handleSelect = (\n        e: React.SyntheticEvent<Element, Event> | React.SyntheticEvent<Modal, Event>,\n    ) => {\n        if (this.editbox) {\n            Utils.adjustSelection(this.editbox.getInputBox(), e);\n        }\n    };\n\n    handleKeyDown = (\n        e: React.KeyboardEvent<Element> | React.KeyboardEvent<Modal>,\n    ) => {\n        const {ctrlSend, codeBlockOnCtrlEnter} = this.props;\n\n        const ctrlOrMetaKeyPressed =\n            e.ctrlKey ||\n            e.metaKey;\n        const ctrlKeyCombo =\n            Utils.cmdOrCtrlPressed(e) &&\n            !e.altKey &&\n            !e.shiftKey;\n        const ctrlAltCombo =\n            Utils.cmdOrCtrlPressed(e, true) &&\n            e.altKey;\n        const ctrlEnterKeyCombo =\n            (ctrlSend || codeBlockOnCtrlEnter) &&\n            Utils.isKeyPressed(e, KeyCodes.ENTER) &&\n            ctrlOrMetaKeyPressed;\n        const markdownHotkey =\n            Utils.isKeyPressed(e, KeyCodes.B) ||\n            Utils.isKeyPressed(e, KeyCodes.I);\n        const markdownLinkKey =\n            Utils.isKeyPressed(e, KeyCodes.K);\n\n        // listen for line break key combo and insert new line character\n        if (Utils.isUnhandledLineBreakKeyCombo(e)) {\n            e.stopPropagation(); // perhaps this should happen in all of these cases? or perhaps Modal should not be listening?\n            this.setState({editText: Utils.insertLineBreakFromKeyEvent(e)});\n        } else if (ctrlEnterKeyCombo) {\n            this.handleEdit();\n        } else if (\n            Utils.isKeyPressed(e, KeyCodes.ESCAPE) &&\n            !this.state.showEmojiPicker\n        ) {\n            this.handleHide();\n        } else if (\n            (ctrlKeyCombo && markdownHotkey) ||\n            (ctrlAltCombo && markdownLinkKey)\n        ) {\n            this.applyHotkeyMarkdown(e);\n        }\n    };\n\n    applyHotkeyMarkdown = (\n        e: React.KeyboardEvent<Element> | React.KeyboardEvent<Modal>,\n    ) => {\n        const res = Utils.applyHotkeyMarkdown(e);\n\n        this.setState(\n            {\n                editText: res.message,\n            },\n            () => {\n                if (this.editbox) {\n                    const textbox = this.editbox.getInputBox();\n                    Utils.setSelectionRange(\n                        textbox,\n                        res.selectionStart,\n                        res.selectionEnd,\n                    );\n                }\n            },\n        );\n    };\n\n    handleHide = (doRefocus = true) => {\n        this.refocusId = doRefocus ? this.props.editingPost.refocusId : null;\n        this.setState({editText: this.props.editingPost.post?.message || ''});\n        this.props.actions.hideEditPostModal();\n    };\n\n    handleCheckForChangesHide = () => {\n        if (this.state.editText !== this.props.editingPost.post?.message) {\n            return;\n        }\n\n        this.handleHide();\n    };\n\n    handleEntered = () => {\n        if (this.editbox) {\n            this.editbox.focus();\n            this.editbox.recalculateSize();\n        }\n    };\n\n    handleHeightChange = (height: number, maxHeight: number) => {\n        if (this.editbox) {\n            this.setState({\n                renderScrollbar: height > maxHeight,\n                scrollbarWidth: Utils.scrollbarWidth(this.editbox.getInputBox()),\n            });\n        }\n    };\n\n    handleExit = () => {\n        this.props.actions.setShowPreview(false);\n    };\n\n    handleExited = () => {\n        const refocusId = this.refocusId;\n        if (refocusId) {\n            setTimeout(() => {\n                const element = document.getElementById(refocusId);\n                if (element) {\n                    element.focus();\n                }\n            });\n        }\n\n        this.refocusId = null;\n        this.setState({\n            editText: '',\n            postError: null,\n            errorClass: null,\n            showEmojiPicker: false,\n            prevShowState: false,\n        });\n        this.props.actions.setShowPreview(false);\n    };\n\n    setEditboxRef = (ref: TextboxClass) => {\n        this.editbox = ref;\n\n        if (this.editbox) {\n            this.editbox.focus();\n        }\n    };\n\n    isSaveDisabled = () => {\n        const post = this.props.editingPost.post;\n        const hasAttachments = post && post.file_ids && post.file_ids.length > 0;\n        if (hasAttachments) {\n            return !this.props.canEditPost;\n        }\n\n        if (this.state.editText.trim() !== '') {\n            return !this.props.canEditPost;\n        }\n\n        return !this.props.canDeletePost;\n    };\n\n    render() {\n        const {formatMessage} = this.props.intl;\n        const errorBoxClass = 'edit-post-footer' + (this.state.postError ? ' has-error' : '');\n        let postError = null;\n        if (this.state.postError) {\n            const postErrorClass = 'post-error' + (this.state.errorClass ? ' ' + this.state.errorClass : '');\n            postError = (\n                <label className={postErrorClass}>{this.state.postError}</label>\n            );\n        }\n\n        let emojiPicker = null;\n        const emojiButtonAriaLabel = formatMessage({\n            id: 'emoji_picker.emojiPicker',\n            defaultMessage: 'Emoji Picker',\n        }).toLowerCase();\n        if (\n            this.props.config.EnableEmojiPicker === 'true' &&\n            !this.props.shouldShowPreview\n        ) {\n            emojiPicker = (\n                <div>\n                    <EmojiPickerOverlay\n                        show={this.state.showEmojiPicker}\n                        container={this.getContainer}\n                        target={this.getTarget}\n                        onHide={this.hideEmojiPicker}\n                        onEmojiClick={this.handleEmojiClick}\n                        onGifClick={this.handleGifClick}\n                        enableGifPicker={this.props.config.EnableGifPicker === 'true'}\n                        topOffset={TOP_OFFSET}\n                        rightOffset={RIGHT_OFFSET}\n                    />\n                    <button\n                        aria-label={emojiButtonAriaLabel}\n                        id='editPostEmoji'\n                        ref='editPostEmoji'\n                        className='style--none post-action'\n                        onClick={this.toggleEmojiPicker}\n                    >\n                        <EmojiIcon className='icon icon--emoji'/>\n                    </button>\n                </div>\n            );\n        }\n\n        return (\n            <Modal\n                id='editPostModal'\n                dialogClassName='a11y__modal edit-modal'\n                show={this.props.editingPost.show}\n                onKeyDown={this.handleKeyDown}\n                onSelect={this.handleSelect}\n                onHide={this.handleCheckForChangesHide}\n                onEntered={this.handleEntered}\n                onExit={this.handleExit}\n                onExited={this.handleExited}\n                keyboard={false}\n                role='dialog'\n                aria-labelledby='editPostModalLabel'\n            >\n                <Modal.Header\n                    closeButton={true}\n                    onHide={this.handleHide}\n                >\n                    <Modal.Title\n                        componentClass='h1'\n                        id='editPostModalLabel'\n                    >\n                        <FormattedMessage\n                            id='edit_post.edit'\n                            defaultMessage='Edit {title}'\n                            values={{\n                                title: this.props.editingPost.title,\n                            }}\n                        />\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body\n                    bsClass={classNames('modal-body edit-modal-body', {\n                        'edit-modal-body--add-reaction': this.state.showEmojiPicker,\n                    })}\n                    ref={this.editModalBody}\n                >\n                    <div className='post-create__container'>\n                        <div\n                            className={classNames('textarea-wrapper', {\n                                scroll: this.state.renderScrollbar,\n                            })}\n                            style={\n                                this.state.renderScrollbar && this.state.scrollbarWidth ? ({\n                                    '--detected-scrollbar-width': `${this.state.scrollbarWidth}px`,\n                                } as React.CSSProperties) : undefined\n                            }\n                        >\n                            <Textbox\n                                tabIndex={0}\n                                rootId={this.props.editingPost.post ? Utils.getRootId(this.props.editingPost.post) : ''}\n                                onChange={this.handleChange}\n                                onKeyPress={this.handleEditKeyPress}\n                                onKeyDown={this.handleKeyDown}\n                                onSelect={this.handleSelect}\n                                onMouseUp={this.handleMouseUpKeyUp}\n                                onKeyUp={this.handleMouseUpKeyUp}\n                                onHeightChange={this.handleHeightChange}\n                                handlePostError={this.handlePostError}\n                                value={this.state.editText}\n                                channelId={this.props.channelId}\n                                emojiEnabled={this.props.config.EnableEmojiPicker === 'true'}\n                                createMessage={Utils.localizeMessage(\n                                    'edit_post.editPost',\n                                    'Edit the post...',\n                                )}\n                                supportsCommands={false}\n                                suggestionListPosition='bottom'\n                                id='edit_textbox'\n                                ref={this.setEditboxRef}\n                                characterLimit={this.props.maxPostSize}\n                                preview={this.props.shouldShowPreview}\n                                useChannelMentions={this.props.useChannelMentions}\n                            />\n                            <div className='post-body__actions'>{emojiPicker}</div>\n                        </div>\n                        <div className='post-create-footer'>\n                            <TextboxLinks\n                                characterLimit={this.props.maxPostSize}\n                                showPreview={this.props.shouldShowPreview}\n                                updatePreview={this.setShowPreview}\n                                message={this.state.editText}\n                            />\n                            <div className={errorBoxClass}>{postError}</div>\n                        </div>\n                    </div>\n                </Modal.Body>\n                <Modal.Footer>\n                    <button\n                        type='button'\n                        className='btn btn-link'\n                        onClick={() => this.handleHide()}\n                    >\n                        <FormattedMessage\n                            id='edit_post.cancel'\n                            defaultMessage='Cancel'\n                        />\n                    </button>\n                    <button\n                        id='editButton'\n                        type='button'\n                        className='btn btn-primary'\n                        disabled={this.isSaveDisabled()}\n                        onClick={this.handleEdit}\n                    >\n                        <FormattedMessage\n                            id='edit_post.save'\n                            defaultMessage='Save'\n                        />\n                    </button>\n                </Modal.Footer>\n            </Modal>\n        );\n    }\n}\n\nexport default injectIntl(EditPostModal);\n/* eslint-disable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {addMessageIntoHistory} from 'mattermost-redux/actions/posts';\nimport {Preferences, Permissions} from 'mattermost-redux/constants';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {openModal} from 'actions/views/modals';\nimport {setShowPreviewOnEditPostModal} from 'actions/views/textbox';\nimport {showPreviewOnEditPostModal} from 'selectors/views/textbox';\nimport {hideEditPostModal} from 'actions/post_actions';\nimport {editPost} from 'actions/views/posts';\nimport {getEditingPost} from 'selectors/posts';\nimport Constants from 'utils/constants';\n\nimport EditPostModal from './edit_post_modal';\n\nfunction mapStateToProps(state) {\n    const config = getConfig(state);\n    const editingPost = getEditingPost(state);\n    const currentUserId = getCurrentUserId(state);\n    const channelId = editingPost?.post?.channel_id || getCurrentChannelId(state);\n    const teamId = getCurrentTeamId(state);\n    let canDeletePost = false;\n    let canEditPost = false;\n\n    if (editingPost && editingPost.post && editingPost.post.user_id === currentUserId) {\n        canDeletePost = haveIChannelPermission(state, teamId, channelId, Permissions.DELETE_POST);\n        canEditPost = haveIChannelPermission(state, teamId, channelId, Permissions.EDIT_POST);\n    } else {\n        canDeletePost = haveIChannelPermission(state, teamId, channelId, Permissions.DELETE_OTHERS_POSTS);\n        canEditPost = haveIChannelPermission(state, teamId, channelId, Permissions.EDIT_OTHERS_POSTS);\n    }\n\n    const useChannelMentions = haveIChannelPermission(state, teamId, channelId, Permissions.USE_CHANNEL_MENTIONS);\n\n    return {\n        canEditPost,\n        canDeletePost,\n        codeBlockOnCtrlEnter: getBool(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'code_block_ctrl_enter', true),\n        ctrlSend: getBool(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter'),\n        config,\n        editingPost,\n        channelId,\n        shouldShowPreview: showPreviewOnEditPostModal(state),\n        maxPostSize: parseInt(config.MaxPostSize, 10) || Constants.DEFAULT_CHARACTER_LIMIT,\n        useChannelMentions,\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            addMessageIntoHistory,\n            editPost,\n            hideEditPostModal,\n            openModal,\n            setShowPreview: setShowPreviewOnEditPostModal,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditPostModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport EventEmitter from 'events';\n\nimport Constants from 'utils/constants';\nimport AppDispatcher from '../dispatcher/app_dispatcher.jsx';\n\nconst ActionTypes = Constants.ActionTypes;\n\nclass ModalStoreClass extends EventEmitter {\n    constructor() {\n        super();\n\n        this.dispatchToken = AppDispatcher.register(this.handleEventPayload);\n    }\n\n    addModalListener = (action, callback) => {\n        this.on(action, callback);\n    }\n\n    removeModalListener = (action, callback) => {\n        this.removeListener(action, callback);\n    }\n\n    handleEventPayload = (payload) => {\n        // toggle event handlers should accept a boolean show/hide value and can accept a map of arguments\n        const {type, value, ...args} = payload.action; //eslint-disable-line no-use-before-define\n\n        switch (type) {\n        case ActionTypes.TOGGLE_SHORTCUTS_MODAL:\n        case ActionTypes.TOGGLE_IMPORT_THEME_MODAL:\n        case ActionTypes.TOGGLE_DELETE_POST_MODAL:\n        case ActionTypes.TOGGLE_GET_TEAM_INVITE_LINK_MODAL:\n        case ActionTypes.TOGGLE_GET_PUBLIC_LINK_MODAL:\n        case ActionTypes.TOGGLE_QUICK_SWITCH_MODAL:\n        case ActionTypes.TOGGLE_CHANNEL_PURPOSE_UPDATE_MODAL:\n        case ActionTypes.TOGGLE_CHANNEL_NAME_UPDATE_MODAL:\n        case ActionTypes.TOGGLE_LEAVE_PRIVATE_CHANNEL_MODAL:\n            this.emit(type, value, args);\n            break;\n        }\n    }\n}\n\nconst ModalStore = new ModalStoreClass();\nexport default ModalStore;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport SuccessIcon from 'components/widgets/icons/fa_success_icon';\n\ntype Props = {\n    show: boolean;\n    onHide: () => void;\n    title: string;\n    helpText?: string;\n    link: string;\n}\n\ntype State = {\n    copiedLink: boolean;\n}\n\nexport default class GetLinkModal extends React.PureComponent<Props, State> {\n    private textAreaRef = React.createRef<HTMLTextAreaElement>();\n    public static defaultProps = {\n        helpText: null,\n    };\n\n    public constructor(props: Props) {\n        super(props);\n        this.state = {\n            copiedLink: false,\n        };\n    }\n\n    public onHide = (): void => {\n        this.setState({copiedLink: false});\n        this.props.onHide();\n    }\n\n    public copyLink = (): void => {\n        const textarea = this.textAreaRef.current;\n\n        if (textarea) {\n            textarea.focus();\n            textarea.setSelectionRange(0, this.props.link.length);\n\n            try {\n                this.setState({copiedLink: document.execCommand('copy')});\n            } catch (err) {\n                this.setState({copiedLink: false});\n            }\n        }\n    }\n\n    public render(): JSX.Element {\n        let helpText = null;\n        if (this.props.helpText) {\n            helpText = (\n                <p>\n                    {this.props.helpText}\n                    <br/>\n                    <br/>\n                </p>\n            );\n        }\n\n        let copyLink = null;\n\n        if (document.queryCommandSupported('copy')) {\n            copyLink = (\n                <button\n                    id='linkModalCopyLink'\n                    data-copy-btn='true'\n                    type='button'\n                    className='btn btn-primary pull-left'\n                    onClick={this.copyLink}\n                >\n                    <FormattedMessage\n                        id='get_link.copy'\n                        defaultMessage='Copy Link'\n                    />\n                </button>\n            );\n        }\n\n        const linkText = (\n            <textarea\n                id='linkModalTextArea'\n                className='form-control no-resize min-height'\n                ref={this.textAreaRef}\n                dir='auto'\n                value={this.props.link}\n                onClick={this.copyLink}\n                readOnly={true}\n            />\n        );\n\n        let copyLinkConfirm = null;\n        if (this.state.copiedLink) {\n            copyLinkConfirm = (\n                <p className='alert alert-success alert--confirm'>\n                    <SuccessIcon/>\n                    <FormattedMessage\n                        id='get_link.clipboard'\n                        defaultMessage=' Link copied'\n                    />\n                </p>\n            );\n        }\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal'\n                show={this.props.show}\n                onHide={this.onHide}\n                role='dialog'\n                aria-labelledby='getLinkModalLabel'\n            >\n                <Modal.Header\n                    id='getLinkModalLabel'\n                    closeButton={true}\n                >\n                    <h4 className='modal-title'>{this.props.title}</h4>\n                </Modal.Header>\n                <Modal.Body>\n                    {helpText}\n                    {linkText}\n                </Modal.Body>\n                <Modal.Footer>\n                    <button\n                        id='linkModalCloseButton'\n                        type='button'\n                        className='btn btn-link'\n                        onClick={this.onHide}\n                    >\n                        <FormattedMessage\n                            id='get_link.close'\n                            defaultMessage='Close'\n                        />\n                    </button>\n                    {copyLink}\n                    {copyLinkConfirm}\n                </Modal.Footer>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport ModalStore from 'stores/modal_store.jsx';\nimport Constants from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\nimport GetLinkModal from 'components/get_link_modal';\n\ntype Props = {\n    link: string;\n    actions: {\n        getFilePublicLink: (fileId: string) => void;\n    };\n}\n\ntype State = {\n    show: boolean;\n    fileId: string;\n}\n\nexport default class GetPublicLinkModal extends React.PureComponent<Props, State> {\n    public static defaultProps: Partial<Props> = {\n        link: '',\n    };\n\n    public constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            show: false,\n            fileId: '',\n        };\n    }\n\n    public componentWillUnmount() {\n        ModalStore.removeModalListener(Constants.ActionTypes.TOGGLE_GET_PUBLIC_LINK_MODAL, this.handleToggle);\n    }\n\n    public componentDidMount() {\n        ModalStore.addModalListener(Constants.ActionTypes.TOGGLE_GET_PUBLIC_LINK_MODAL, this.handleToggle);\n    }\n\n    public componentDidUpdate(prevProps: Props, prevState: State) {\n        if (this.state.show && !prevState.show) {\n            this.props.actions.getFilePublicLink(this.state.fileId);\n        }\n    }\n\n    handleToggle = (value: boolean, args: State) => {\n        this.setState({\n            show: value,\n            fileId: args.fileId,\n        });\n    }\n\n    public onHide = () => {\n        this.setState({\n            show: false,\n        });\n    }\n\n    public render() {\n        return (\n            <GetLinkModal\n                show={this.state.show}\n                onHide={this.onHide}\n                title={Utils.localizeMessage('get_public_link_modal.title', 'Copy Public Link')}\n                helpText={Utils.localizeMessage('get_public_link_modal.help', 'The link below allows anyone to see this file without being registered on this server.')}\n                link={this.props.link}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport {getFilePublicLink} from 'mattermost-redux/actions/files';\nimport * as Selectors from 'mattermost-redux/selectors/entities/files';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {GenericAction, ActionFunc} from 'mattermost-redux/types/actions';\n\nimport GetPublicLinkModal from './get_public_link_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n    const filePublicLink: unknown = Selectors.getFilePublicLink(state)?.link;\n    return {\n        link: filePublicLink as string,\n    };\n}\n\ntype Actions = {\n    getFilePublicLink: (code: string) => Promise<{ error: { server_error_id: string; message: string } }>;\n};\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            getFilePublicLink,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(GetPublicLinkModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport ModalStore from 'stores/modal_store.jsx';\nimport Constants from 'utils/constants';\nimport ConfirmModal from 'components/confirm_modal';\n\ntype State = {\n    show: boolean;\n    channel?: Channel;\n};\n\ntype Props = {\n    actions: {\n        leaveChannel: (channelId: any) => any;\n    };\n}\n\nexport default class LeavePrivateChannelModal extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            show: false,\n        };\n    }\n\n    componentDidMount() {\n        ModalStore.addModalListener(Constants.ActionTypes.TOGGLE_LEAVE_PRIVATE_CHANNEL_MODAL, this.handleToggle);\n    }\n\n    componentWillUnmount() {\n        ModalStore.removeModalListener(Constants.ActionTypes.TOGGLE_LEAVE_PRIVATE_CHANNEL_MODAL, this.handleToggle);\n    }\n\n    handleKeyPress = (e: KeyboardEvent) => {\n        if (e.key === 'Enter' && this.state.show) {\n            this.handleSubmit();\n        }\n    };\n\n    handleSubmit = () => {\n        const {actions} = this.props;\n        const {channel} = this.state;\n\n        if (channel) {\n            const channelId = channel.id;\n            actions.leaveChannel(channelId).then((result: {data: boolean}) => {\n                if (result.data) {\n                    this.handleHide();\n                }\n            });\n        }\n    };\n\n    handleToggle = (value: Channel): void => {\n        this.setState({\n            channel: value,\n            show: value !== null,\n        });\n    };\n\n    handleHide = () => {\n        this.setState({\n            show: false,\n        });\n    };\n\n    render() {\n        let title;\n        let message;\n        if (this.state.channel && this.state.channel.display_name) {\n            title = (\n                <FormattedMessage\n                    id='leave_private_channel_modal.title'\n                    defaultMessage='Leave Private Channel {channel}'\n                    values={{\n                        channel: <b>{this.state.channel.display_name}</b>,\n                    }}\n                />\n            );\n\n            message = (\n                <FormattedMessage\n                    id='leave_private_channel_modal.message'\n                    defaultMessage='Are you sure you wish to leave the private channel {channel}? You must be re-invited in order to re-join this channel in the future.'\n                    values={{\n                        channel: <b>{this.state.channel.display_name}</b>,\n                    }}\n                />\n            );\n        }\n\n        const buttonClass = 'btn btn-danger';\n        const button = (\n            <FormattedMessage\n                id='leave_private_channel_modal.leave'\n                defaultMessage='Yes, leave channel'\n            />\n        );\n\n        return (\n            <ConfirmModal\n                show={this.state.show}\n                title={title}\n                message={message}\n                confirmButtonClass={buttonClass}\n                confirmButtonText={button}\n                onConfirm={this.handleSubmit}\n                onCancel={this.handleHide}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {leaveChannel} from 'actions/views/channel';\n\nimport LeavePrivateChannelModal from './leave_private_channel_modal';\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            leaveChannel,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(LeavePrivateChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {defineMessages, injectIntl} from 'react-intl';\n\nimport ModalStore from 'stores/modal_store.jsx';\nimport Constants from 'utils/constants';\nimport {intlShape} from 'utils/react_intl';\nimport {t} from 'utils/i18n';\nimport * as Utils from 'utils/utils';\n\nconst allShortcuts = defineMessages({\n    mainHeader: {\n        default: {\n            id: t('shortcuts.header'),\n            defaultMessage: 'Keyboard Shortcuts\\tCtrl|/',\n        },\n        mac: {\n            id: t('shortcuts.header.mac'),\n            defaultMessage: 'Keyboard Shortcuts\\t⌘|/',\n        },\n    },\n    navHeader: {\n        id: t('shortcuts.nav.header'),\n        defaultMessage: 'Navigation',\n    },\n    navPrev: {\n        default: {\n            id: t('shortcuts.nav.prev'),\n            defaultMessage: 'Previous channel:\\tAlt|Up',\n        },\n        mac: {\n            id: t('shortcuts.nav.prev.mac'),\n            defaultMessage: 'Previous channel:\\t⌥|Up',\n        },\n    },\n    navNext: {\n        default: {\n            id: t('shortcuts.nav.next'),\n            defaultMessage: 'Next channel:\\tAlt|Down',\n        },\n        mac: {\n            id: t('shortcuts.nav.next.mac'),\n            defaultMessage: 'Next channel:\\t⌥|Down',\n        },\n    },\n    navUnreadPrev: {\n        default: {\n            id: t('shortcuts.nav.unread_prev'),\n            defaultMessage: 'Previous unread channel:\\tAlt|Shift|Up',\n        },\n        mac: {\n            id: t('shortcuts.nav.unread_prev.mac'),\n            defaultMessage: 'Previous unread channel:\\t⌥|Shift|Up',\n        },\n    },\n    navUnreadNext: {\n        default: {\n            id: t('shortcuts.nav.unread_next'),\n            defaultMessage: 'Next unread channel:\\tAlt|Shift|Down',\n        },\n        mac: {\n            id: t('shortcuts.nav.unread_next.mac'),\n            defaultMessage: 'Next unread channel:\\t⌥|Shift|Down',\n        },\n    },\n    teamNavPrev: {\n        default: {\n            id: t('shortcuts.team_nav.prev'),\n            defaultMessage: 'Previous team:\\tCtrl|Alt|Up',\n        },\n        mac: {\n            id: t('shortcuts.team_nav.prev.mac'),\n            defaultMessage: 'Previous team:\\t⌘|⌥|Up',\n        },\n    },\n    teamNavNext: {\n        default: {\n            id: t('shortcuts.team_nav.next'),\n            defaultMessage: 'Next team:\\tCtrl|Alt|Down',\n        },\n        mac: {\n            id: t('shortcuts.team_nav.next.mac'),\n            defaultMessage: 'Next team:\\t⌘|⌥|Down',\n        },\n    },\n    teamNavSwitcher: {\n        default: {\n            id: t('shortcuts.team_nav.switcher'),\n            defaultMessage: 'Switch to a specific team:\\tCtrl|Alt|[1-9]',\n        },\n        mac: {\n            id: t('shortcuts.team_nav.switcher.mac'),\n            defaultMessage: 'Switch to a specific team:\\t⌘|⌥|[1-9]',\n        },\n    },\n    navSwitcher: {\n        default: {\n            id: t('shortcuts.nav.switcher'),\n            defaultMessage: 'Quick channel switcher:\\tCtrl|K',\n        },\n        mac: {\n            id: t('shortcuts.nav.switcher.mac'),\n            defaultMessage: 'Quick channel switcher:\\t⌘|K',\n        },\n    },\n    navDMMenu: {\n        default: {\n            id: t('shortcuts.nav.direct_messages_menu'),\n            defaultMessage: 'Direct messages menu:\\tCtrl|Shift|K',\n        },\n        mac: {\n            id: t('shortcuts.nav.direct_messages_menu.mac'),\n            defaultMessage: 'Direct messages menu:\\t⌘|Shift|K',\n        },\n    },\n    navSettings: {\n        default: {\n            id: t('shortcuts.nav.settings'),\n            defaultMessage: 'Account settings:\\tCtrl|Shift|A',\n        },\n        mac: {\n            id: t('shortcuts.nav.settings.mac'),\n            defaultMessage: 'Account settings:\\t⌘|Shift|A',\n        },\n    },\n    navMentions: {\n        default: {\n            id: t('shortcuts.nav.recent_mentions'),\n            defaultMessage: 'Recent mentions:\\tCtrl|Shift|M',\n        },\n        mac: {\n            id: t('shortcuts.nav.recent_mentions.mac'),\n            defaultMessage: 'Recent mentions:\\t⌘|Shift|M',\n        },\n    },\n    navFocusCenter: {\n        default: {\n            id: t('shortcuts.nav.focus_center'),\n            defaultMessage: 'Set focus to input field:\\tCtrl|Shift|L',\n        },\n        mac: {\n            id: t('shortcuts.nav.focus_center.mac'),\n            defaultMessage: 'Set focus to input field:\\t⌘|Shift|L',\n        },\n    },\n    navOpenCloseSidebar: {\n        default: {\n            id: t('shortcuts.nav.open_close_sidebar'),\n            defaultMessage: 'Open or close the right sidebar\\tCtrl|.',\n        },\n        mac: {\n            id: t('shortcuts.nav.open_close_sidebar.mac'),\n            defaultMessage: 'Open or close the right sidebar\\t⌘|.',\n        },\n    },\n    msgHeader: {\n        id: t('shortcuts.msgs.header'),\n        defaultMessage: 'Messages',\n    },\n    msgInputHeader: {\n        id: t('shortcuts.msgs.input.header'),\n        defaultMessage: 'Works inside an empty input field',\n    },\n    msgEdit: {\n        id: t('shortcuts.msgs.edit'),\n        defaultMessage: 'Edit last message in channel:\\tUp',\n    },\n    msgReply: {\n        id: t('shortcuts.msgs.reply'),\n        defaultMessage: 'Reply to last message in channel:\\tShift|Up',\n    },\n    msgReprintPrev: {\n        default: {\n            id: t('shortcuts.msgs.reprint_prev'),\n            defaultMessage: 'Reprint previous message:\\tCtrl|Up',\n        },\n        mac: {\n            id: t('shortcuts.msgs.reprint_prev.mac'),\n            defaultMessage: 'Reprint previous message:\\t⌘|Up',\n        },\n    },\n    msgReprintNext: {\n        default: {\n            id: t('shortcuts.msgs.reprint_next'),\n            defaultMessage: 'Reprint next message:\\tCtrl|Down',\n        },\n        mac: {\n            id: t('shortcuts.msgs.reprint_next.mac'),\n            defaultMessage: 'Reprint next message:\\t⌘|Down',\n        },\n    },\n    msgCompHeader: {\n        id: t('shortcuts.msgs.comp.header'),\n        defaultMessage: 'Autocomplete',\n    },\n    msgCompUsername: {\n        id: t('shortcuts.msgs.comp.username'),\n        defaultMessage: 'Username:\\t@|[a-z]|Tab',\n    },\n    msgCompChannel: {\n        id: t('shortcuts.msgs.comp.channel'),\n        defaultMessage: 'Channel:\\t~|[a-z]|Tab',\n    },\n    msgCompEmoji: {\n        id: t('shortcuts.msgs.comp.emoji'),\n        defaultMessage: 'Emoji:\\t:|[a-z]|Tab',\n    },\n    msgLastReaction: {\n        default: {\n            id: t('shortcuts.msgs.comp.last_reaction'),\n            defaultMessage: 'React to last message:\\tCtrl|Shift|\\u29F5',\n        },\n        mac: {\n            id: t('shortcuts.msgs.comp.last_reaction.mac'),\n            defaultMessage: 'React to last message:\\t⌘|Shift|\\u29F5',\n        },\n    },\n    msgMarkdownHeader: {\n        id: t('shortcuts.msgs.markdown.header'),\n        defaultMessage: 'Formatting',\n    },\n    msgMarkdownBold: {\n        default: {\n            id: t('shortcuts.msgs.markdown.bold'),\n            defaultMessage: 'Bold:\\tCtrl|B',\n        },\n        mac: {\n            id: t('shortcuts.msgs.markdown.bold.mac'),\n            defaultMessage: 'Bold:\\t⌘|B',\n        },\n    },\n    msgMarkdownItalic: {\n        default: {\n            id: t('shortcuts.msgs.markdown.italic'),\n            defaultMessage: 'Italic:\\tCtrl|I',\n        },\n        mac: {\n            id: t('shortcuts.msgs.markdown.italic.mac'),\n            defaultMessage: 'Italic:\\t⌘|I',\n        },\n    },\n    msgMarkdownLink: {\n        default: {\n            id: t('shortcuts.msgs.markdown.link'),\n            defaultMessage: 'Link:\\tCtrl|Alt|K',\n        },\n        mac: {\n            id: t('shortcuts.msgs.markdown.link.mac'),\n            defaultMessage: 'Link:\\t⌘|Alt|K',\n        },\n    },\n    filesHeader: {\n        id: t('shortcuts.files.header'),\n        defaultMessage: 'Files',\n    },\n    filesUpload: {\n        default: {\n            id: t('shortcuts.files.upload'),\n            defaultMessage: 'Upload files:\\tCtrl|U',\n        },\n        mac: {\n            id: t('shortcuts.files.upload.mac'),\n            defaultMessage: 'Upload files:\\t⌘|U',\n        },\n    },\n    browserHeader: {\n        id: t('shortcuts.browser.header'),\n        defaultMessage: 'Built-in Browser Commands',\n    },\n    browserChannelPrev: {\n        default: {\n            id: t('shortcuts.browser.channel_prev'),\n            defaultMessage: 'Back in history:\\tAlt|Left',\n        },\n        mac: {\n            id: t('shortcuts.browser.channel_prev.mac'),\n            defaultMessage: 'Back in history:\\t⌘|[',\n        },\n    },\n    browserChannelNext: {\n        default: {\n            id: t('shortcuts.browser.channel_next'),\n            defaultMessage: 'Forward in history:\\tAlt|Right',\n        },\n        mac: {\n            id: t('shortcuts.browser.channel_next.mac'),\n            defaultMessage: 'Forward in history:\\t⌘|]',\n        },\n    },\n    browserFontIncrease: {\n        default: {\n            id: t('shortcuts.browser.font_increase'),\n            defaultMessage: 'Zoom in:\\tCtrl|+',\n        },\n        mac: {\n            id: t('shortcuts.browser.font_increase.mac'),\n            defaultMessage: 'Zoom in:\\t⌘|+',\n        },\n    },\n    browserFontDecrease: {\n        default: {\n            id: t('shortcuts.browser.font_decrease'),\n            defaultMessage: 'Zoom out:\\tCtrl|-',\n        },\n        mac: {\n            id: t('shortcuts.browser.font_decrease.mac'),\n            defaultMessage: 'Zoom out:\\t⌘|-',\n        },\n    },\n    browserInputHeader: {\n        id: t('shortcuts.browser.input.header'),\n        defaultMessage: 'Works inside an input field',\n    },\n    browserHighlightPrev: {\n        id: t('shortcuts.browser.highlight_prev'),\n        defaultMessage: 'Highlight text to the previous line:\\tShift|Up',\n    },\n    browserHighlightNext: {\n        id: t('shortcuts.browser.highlight_next'),\n        defaultMessage: 'Highlight text to the next line:\\tShift|Down',\n    },\n    browserNewline: {\n        id: t('shortcuts.browser.newline'),\n        defaultMessage: 'Create a new line:\\tShift|Enter',\n    },\n    info: {\n        id: t('shortcuts.info'),\n        defaultMessage: 'Begin a message with / for a list of all the commands at your disposal.',\n    },\n});\n\nclass ShortcutsModal extends React.PureComponent {\n    static propTypes = {\n        intl: intlShape.isRequired,\n        isMac: PropTypes.bool.isRequired,\n    }\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            show: false,\n        };\n    }\n\n    componentDidMount() {\n        ModalStore.addModalListener(Constants.ActionTypes.TOGGLE_SHORTCUTS_MODAL, this.handleToggle);\n    }\n\n    componentWillUnmount() {\n        ModalStore.removeModalListener(Constants.ActionTypes.TOGGLE_SHORTCUTS_MODAL, this.handleToggle);\n    }\n\n    handleToggle = () => {\n        //toggles the state of shortcut dialog\n        this.setState({\n            show: !this.state.show,\n        });\n    }\n\n    handleHide = () => {\n        this.setState({show: false});\n    }\n\n    getShortcuts() {\n        const {isMac} = this.props;\n        const shortcuts = {};\n        Object.keys(allShortcuts).forEach((s) => {\n            if (isMac && allShortcuts[s].mac) {\n                shortcuts[s] = allShortcuts[s].mac;\n            } else if (!isMac && allShortcuts[s].default) {\n                shortcuts[s] = allShortcuts[s].default;\n            } else {\n                shortcuts[s] = allShortcuts[s];\n            }\n        });\n\n        return shortcuts;\n    }\n\n    render() {\n        const shortcuts = this.getShortcuts();\n        const {formatMessage} = this.props.intl;\n\n        const isLinux = Utils.isLinux();\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal shortcuts-modal'\n                show={this.state.show}\n                onHide={this.handleHide}\n                onExited={this.handleHide}\n                role='dialog'\n                aria-labelledby='shortcutsModalLabel'\n            >\n                <div className='shortcuts-content'>\n                    <Modal.Header closeButton={true}>\n                        <Modal.Title\n                            componentClass='h1'\n                            id='shortcutsModalLabel'\n                        >\n                            <strong>{renderShortcut(formatMessage(shortcuts.mainHeader))}</strong>\n                        </Modal.Title>\n                    </Modal.Header>\n                    <Modal.Body>\n                        <div className='row'>\n                            <div className='col-sm-4'>\n                                <div className='section'>\n                                    <div>\n                                        <h3 className='section-title'><strong>{formatMessage(shortcuts.navHeader)}</strong></h3>\n                                        {renderShortcut(formatMessage(shortcuts.navPrev))}\n                                        {renderShortcut(formatMessage(shortcuts.navNext))}\n                                        {renderShortcut(formatMessage(shortcuts.navUnreadPrev))}\n                                        {renderShortcut(formatMessage(shortcuts.navUnreadNext))}\n                                        {!isLinux && renderShortcut(formatMessage(shortcuts.teamNavPrev))}\n                                        {!isLinux && renderShortcut(formatMessage(shortcuts.teamNavNext))}\n                                        {renderShortcut(formatMessage(shortcuts.teamNavSwitcher))}\n                                        {renderShortcut(formatMessage(shortcuts.navSwitcher))}\n                                        {renderShortcut(formatMessage(shortcuts.navDMMenu))}\n                                        {renderShortcut(formatMessage(shortcuts.navSettings))}\n                                        {renderShortcut(formatMessage(shortcuts.navMentions))}\n                                        {renderShortcut(formatMessage(shortcuts.navFocusCenter))}\n                                        {renderShortcut(formatMessage(shortcuts.navOpenCloseSidebar))}\n                                    </div>\n                                </div>\n                            </div>\n                            <div className='col-sm-4'>\n                                <div className='section'>\n                                    <div>\n                                        <h3 className='section-title'><strong>{formatMessage(shortcuts.msgHeader)}</strong></h3>\n                                        <span><strong>{formatMessage(shortcuts.msgInputHeader)}</strong></span>\n                                        <div className='subsection'>\n                                            {renderShortcut(formatMessage(shortcuts.msgEdit))}\n                                            {renderShortcut(formatMessage(shortcuts.msgReply))}\n                                            {renderShortcut(formatMessage(shortcuts.msgLastReaction))}\n                                            {renderShortcut(formatMessage(shortcuts.msgReprintPrev))}\n                                            {renderShortcut(formatMessage(shortcuts.msgReprintNext))}\n                                        </div>\n                                        <span><strong>{formatMessage(shortcuts.msgCompHeader)}</strong></span>\n                                        <div className='subsection'>\n                                            {renderShortcut(formatMessage(shortcuts.msgCompUsername))}\n                                            {renderShortcut(formatMessage(shortcuts.msgCompChannel))}\n                                            {renderShortcut(formatMessage(shortcuts.msgCompEmoji))}\n                                        </div>\n                                        <span><strong>{formatMessage(shortcuts.msgMarkdownHeader)}</strong></span>\n                                        <div className='subsection'>\n                                            {renderShortcut(formatMessage(shortcuts.msgMarkdownBold))}\n                                            {renderShortcut(formatMessage(shortcuts.msgMarkdownItalic))}\n                                            {renderShortcut(formatMessage(shortcuts.msgMarkdownLink))}\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                            <div className='col-sm-4'>\n                                <div className='section'>\n                                    <div>\n                                        <h3 className='section-title'><strong>{formatMessage(shortcuts.filesHeader)}</strong></h3>\n                                        {renderShortcut(formatMessage(shortcuts.filesUpload))}\n                                    </div>\n                                    <div className='section--lower'>\n                                        <h3 className='section-title'><strong>{formatMessage(shortcuts.browserHeader)}</strong></h3>\n                                        {renderShortcut(formatMessage(shortcuts.browserChannelPrev))}\n                                        {renderShortcut(formatMessage(shortcuts.browserChannelNext))}\n                                        {renderShortcut(formatMessage(shortcuts.browserFontIncrease))}\n                                        {renderShortcut(formatMessage(shortcuts.browserFontDecrease))}\n                                        <span><strong>{formatMessage(shortcuts.browserInputHeader)}</strong></span>\n                                        <div className='subsection'>\n                                            {renderShortcut(formatMessage(shortcuts.browserHighlightPrev))}\n                                            {renderShortcut(formatMessage(shortcuts.browserHighlightNext))}\n                                            {renderShortcut(formatMessage(shortcuts.browserNewline))}\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                        <div className='info__label'>{formatMessage(shortcuts.info)}</div>\n                    </Modal.Body>\n                </div>\n            </Modal>\n        );\n    }\n}\n\nfunction renderShortcut(text) {\n    if (!text) {\n        return null;\n    }\n\n    const shortcut = text.split('\\t');\n    const description = <span>{shortcut[0]}</span>;\n\n    let keys = null;\n    if (shortcut.length > 1) {\n        keys = shortcut[1].split('|').map((key) => (\n            <span\n                className='shortcut-key'\n                key={key}\n            >\n                {key}\n            </span>\n        ));\n    }\n\n    return (\n        <div className='shortcut-line'>\n            {description}\n            {keys}\n        </div>\n    );\n}\n\nexport default injectIntl(ShortcutsModal);\n","export default __webpack_public_path__ + \"files/55d77b94009ea98824ee008af39dedb2.png\";","export default __webpack_public_path__ + \"files/7a26b407c4ec2bbbaecd3f0f314de7bd.png\";","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport fileOverlayImage from 'images/filesOverlay.png';\nimport overlayLogoImage from 'images/logoWhite.png';\n\ntype Props = {\n    overlayType: string;\n}\n\nconst FileUploadOverlay: React.FC<Props> = (props: Props) => {\n    let overlayClass = 'file-overlay hidden';\n    if (props.overlayType === 'right') {\n        overlayClass += ' right-file-overlay';\n    } else if (props.overlayType === 'center') {\n        overlayClass += ' center-file-overlay';\n    }\n\n    return (\n        <div className={overlayClass}>\n            <div className='overlay__indent'>\n                <div className='overlay__circle'>\n                    <img\n                        className='overlay__files'\n                        src={fileOverlayImage}\n                        alt='Files'\n                    />\n                    <span>\n                        <FormattedMessage\n                            id='generic_icons.upload'\n                            defaultMessage='Upload Icon'\n                        >\n                            {(title) => (\n                                <i\n                                    className='fa fa-upload'\n                                    title={title as string}\n                                />\n                            )}\n                        </FormattedMessage>\n                        <FormattedMessage\n                            id='upload_overlay.info'\n                            defaultMessage='Drop a file to upload it.'\n                        />\n                    </span>\n                    <img\n                        className='overlay__logo'\n                        src={overlayLogoImage}\n                        width='100'\n                        alt='Logo'\n                    />\n                </div>\n            </div>\n        </div>\n    );\n};\n\nexport default FileUploadOverlay;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport OverlayTrigger from 'components/overlay_trigger';\n\nimport Constants, {RHSStates} from 'utils/constants';\nimport {isMobile} from 'utils/utils.jsx';\nimport {browserHistory} from 'utils/browser_history';\nimport FollowButton from 'components/threading/common/follow_button';\n\ninterface RhsHeaderPostProps {\n    isExpanded: boolean;\n    rootPostId: string;\n    previousRhsState?: string;\n    relativeTeamUrl: string;\n    channel: Channel;\n    isCollapsedThreadsEnabled: boolean;\n    isFollowingThread?: boolean;\n    currentTeamId: string;\n    currentUserId: string;\n    setRhsExpanded: (b: boolean) => void;\n    showMentions: () => void;\n    showSearchResults: () => void;\n    showFlaggedPosts: () => void;\n    showPinnedPosts: () => void;\n    closeRightHandSide: (e?: React.MouseEvent) => void;\n    toggleRhsExpanded: (e: React.MouseEvent) => void;\n    setThreadFollow: (userId: string, teamId: string, threadId: string, newState: boolean) => void;\n}\n\nexport default class RhsHeaderPost extends React.PureComponent<RhsHeaderPostProps> {\n    handleBack = (e: React.MouseEvent) => {\n        e.preventDefault();\n\n        switch (this.props.previousRhsState) {\n        case RHSStates.SEARCH:\n            this.props.showSearchResults();\n            break;\n        case RHSStates.MENTION:\n            this.props.showMentions();\n            break;\n        case RHSStates.FLAG:\n            this.props.showFlaggedPosts();\n            break;\n        case RHSStates.PIN:\n            this.props.showPinnedPosts();\n            break;\n        default:\n            break;\n        }\n    }\n\n    handleJumpClick = () => {\n        if (isMobile()) {\n            this.props.closeRightHandSide();\n        }\n\n        this.props.setRhsExpanded(false);\n        const teamUrl = this.props.relativeTeamUrl;\n        browserHistory.push(`${teamUrl}/pl/${this.props.rootPostId}`);\n    }\n\n    handleFollowChange = () => {\n        const {currentTeamId, currentUserId, rootPostId, isFollowingThread} = this.props;\n        this.props.setThreadFollow(currentUserId, currentTeamId, rootPostId, !isFollowingThread);\n    }\n\n    render() {\n        let back;\n        const closeSidebarTooltip = (\n            <Tooltip id='closeSidebarTooltip'>\n                <FormattedMessage\n                    id='rhs_header.closeSidebarTooltip'\n                    defaultMessage='Close'\n                />\n            </Tooltip>\n        );\n\n        let backToResultsTooltip;\n\n        switch (this.props.previousRhsState) {\n        case RHSStates.SEARCH:\n        case RHSStates.MENTION:\n            backToResultsTooltip = (\n                <Tooltip id='backToResultsTooltip'>\n                    <FormattedMessage\n                        id='rhs_header.backToResultsTooltip'\n                        defaultMessage='Back to search results'\n                    />\n                </Tooltip>\n            );\n            break;\n        case RHSStates.FLAG:\n            backToResultsTooltip = (\n                <Tooltip id='backToResultsTooltip'>\n                    <FormattedMessage\n                        id='rhs_header.backToFlaggedTooltip'\n                        defaultMessage='Back to saved posts'\n                    />\n                </Tooltip>\n            );\n            break;\n        case RHSStates.PIN:\n            backToResultsTooltip = (\n                <Tooltip id='backToResultsTooltip'>\n                    <FormattedMessage\n                        id='rhs_header.backToPinnedTooltip'\n                        defaultMessage='Back to pinned posts'\n                    />\n                </Tooltip>\n            );\n            break;\n        }\n\n        const expandSidebarTooltip = (\n            <Tooltip id='expandSidebarTooltip'>\n                <FormattedMessage\n                    id='rhs_header.expandSidebarTooltip'\n                    defaultMessage='Expand Sidebar'\n                />\n            </Tooltip>\n        );\n\n        const shrinkSidebarTooltip = (\n            <Tooltip id='shrinkSidebarTooltip'>\n                <FormattedMessage\n                    id='rhs_header.collapseSidebarTooltip'\n                    defaultMessage='Collapse Sidebar'\n                />\n            </Tooltip>\n        );\n\n        const channelName = this.props.channel.display_name;\n\n        if (backToResultsTooltip) {\n            back = (\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='top'\n                    overlay={backToResultsTooltip}\n                >\n                    <a\n                        href='#'\n                        onClick={this.handleBack}\n                        className='sidebar--right__back'\n                    >\n                        <FormattedMessage\n                            id='generic_icons.back'\n                            defaultMessage='Back Icon'\n                        >\n                            {(ariaLabel: string) => (\n                                <i\n                                    className='icon icon-arrow-back-ios'\n                                    aria-label={ariaLabel}\n                                />\n                            )}\n                        </FormattedMessage>\n                    </a>\n                </OverlayTrigger>\n            );\n        }\n\n        return (\n            <div className='sidebar--right__header'>\n                <span className='sidebar--right__title'>\n                    {back}\n                    <FormattedMessage\n                        id='rhs_header.details'\n                        defaultMessage='Thread'\n                    />\n                    {channelName &&\n                        <button\n                            onClick={this.handleJumpClick}\n                            className='style--none sidebar--right__title__channel'\n                        >\n                            {channelName}\n                        </button>\n                    }\n                </span>\n                <div className='controls'>\n                    {this.props.isCollapsedThreadsEnabled ? (\n                        <FollowButton\n                            className='sidebar--right__follow__thread'\n                            isFollowing={this.props.isFollowingThread ?? false}\n                            onClick={this.handleFollowChange}\n                        />\n                    ) : null}\n\n                    <OverlayTrigger\n                        delayShow={Constants.OVERLAY_TIME_DELAY}\n                        placement='top'\n                        overlay={this.props.isExpanded ? shrinkSidebarTooltip : expandSidebarTooltip}\n                    >\n                        <button\n                            type='button'\n                            className='sidebar--right__expand btn-icon'\n                            aria-label='Expand'\n                            onClick={this.props.toggleRhsExpanded}\n                        >\n                            <FormattedMessage\n                                id='rhs_header.expandSidebarTooltip.icon'\n                                defaultMessage='Expand Sidebar Icon'\n                            >\n                                {(ariaLabel: string) => (\n                                    <i\n                                        className='icon icon-arrow-expand'\n                                        aria-label={ariaLabel}\n                                    />\n                                )}\n                            </FormattedMessage>\n                            <FormattedMessage\n                                id='rhs_header.collapseSidebarTooltip.icon'\n                                defaultMessage='Collapse Sidebar Icon'\n                            >\n                                {(ariaLabel: string) => (\n                                    <i\n                                        className='icon icon-arrow-collapse'\n                                        aria-label={ariaLabel}\n                                    />\n                                )}\n                            </FormattedMessage>\n                        </button>\n                    </OverlayTrigger>\n\n                    <OverlayTrigger\n                        delayShow={Constants.OVERLAY_TIME_DELAY}\n                        placement='top'\n                        overlay={closeSidebarTooltip}\n                    >\n                        <button\n                            id='rhsCloseButton'\n                            type='button'\n                            className='sidebar--right__close btn-icon'\n                            aria-label='Close'\n                            onClick={this.props.closeRightHandSide}\n                        >\n                            <FormattedMessage\n                                id='rhs_header.closeTooltip.icon'\n                                defaultMessage='Close Sidebar Icon'\n                            >\n                                {(ariaLabel: string) => (\n                                    <i\n                                        className='icon icon-close'\n                                        aria-label={ariaLabel}\n                                    />\n                                )}\n                            </FormattedMessage>\n                        </button>\n                    </OverlayTrigger>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ComponentProps} from 'react';\nimport {connect} from 'react-redux';\n\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {getCurrentTeamId, getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {setThreadFollow} from 'mattermost-redux/actions/threads';\nimport {getThreadOrSynthetic} from 'mattermost-redux/selectors/entities/threads';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\n\nimport {GlobalState} from 'types/store';\n\nimport {\n    setRhsExpanded,\n    showMentions,\n    showSearchResults,\n    showFlaggedPosts,\n    showPinnedPosts,\n    showChannelFiles,\n    closeRightHandSide,\n    toggleRhsExpanded,\n} from 'actions/views/rhs';\nimport {getIsRhsExpanded} from 'selectors/rhs';\n\nimport RhsHeaderPost from './rhs_header_post';\n\ntype OwnProps = Pick<ComponentProps<typeof RhsHeaderPost>, 'rootPostId'>\n\nfunction mapStateToProps(state: GlobalState, {rootPostId}: OwnProps) {\n    const root = getPost(state, rootPostId);\n\n    return {\n        isExpanded: getIsRhsExpanded(state),\n        relativeTeamUrl: getCurrentRelativeTeamUrl(state),\n        currentTeamId: getCurrentTeamId(state),\n        currentUserId: getCurrentUserId(state),\n        isCollapsedThreadsEnabled: isCollapsedThreadsEnabled(state),\n        isFollowingThread: isCollapsedThreadsEnabled(state) && root && getThreadOrSynthetic(state, root).is_following,\n    };\n}\n\nconst actions = {\n    setRhsExpanded,\n    showSearchResults,\n    showMentions,\n    showFlaggedPosts,\n    showPinnedPosts,\n    showChannelFiles,\n    closeRightHandSide,\n    toggleRhsExpanded,\n    setThreadFollow,\n};\n\nexport default connect(mapStateToProps, actions)(RhsHeaderPost);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n/* eslint-disable react/no-string-refs */\n\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {FakePost} from 'types/store/rhs';\n\nimport RhsHeaderPost from 'components/rhs_header_post';\nimport ThreadViewer from 'components/threading/thread_viewer';\n\ntype Props = {\n    posts: Post[];\n    channel: Channel | null;\n    selected: Post | FakePost;\n    previousRhsState?: string;\n}\n\nconst RhsThread = ({\n    selected,\n    posts,\n    channel,\n    previousRhsState,\n}: Props) => {\n    if (posts == null || selected == null || !channel) {\n        return (\n            <div/>\n        );\n    }\n\n    return (\n        <div\n            id='rhsContainer'\n            className='sidebar-right__body'\n        >\n            <RhsHeaderPost\n                rootPostId={selected.id}\n                channel={channel}\n                previousRhsState={previousRhsState}\n            />\n            <ThreadViewer\n                rootPostId={selected.id}\n                useRelativeTimestamp={false}\n            />\n        </div>\n    );\n};\n\nexport default memo(RhsThread);\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {makeGetPostsForThread} from 'mattermost-redux/selectors/entities/posts';\nimport {removePost, getPostThread} from 'mattermost-redux/actions/posts';\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {getSelectedChannel, getSelectedPost} from 'selectors/rhs';\nimport {selectPostCard} from 'actions/views/rhs';\nimport {GlobalState} from 'types/store';\n\nimport RhsThread from './rhs_thread';\n\nfunction makeMapStateToProps() {\n    const getPostsForThread = makeGetPostsForThread();\n\n    return function mapStateToProps(state: GlobalState) {\n        const selected = getSelectedPost(state);\n\n        const channel = getSelectedChannel(state);\n        let posts: Post[] = [];\n        if (selected) {\n            posts = getPostsForThread(state, selected.id);\n        }\n\n        return {\n            selected,\n            channel,\n            posts,\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            removePost,\n            selectPostCard,\n            getPostThread,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(RhsThread);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport OverlayTrigger from 'components/overlay_trigger';\n\nimport Constants, {RHSStates} from 'utils/constants';\nimport {RhsState} from 'types/store/rhs';\n\ntype Props = {\n    previousRhsState: RhsState;\n    isExpanded: boolean;\n    actions: {\n        showMentions: () => void;\n        showSearchResults: () => void;\n        showFlaggedPosts: () => void;\n        showPinnedPosts: () => void;\n        closeRightHandSide: () => void;\n        toggleRhsExpanded: () => void;\n    };\n};\n\nexport default class RhsCardHeader extends React.PureComponent<Props> {\n    handleBack = (e: React.MouseEvent<HTMLAnchorElement>): void => {\n        e.preventDefault();\n\n        switch (this.props.previousRhsState) {\n        case RHSStates.CHANNEL_FILES:\n            this.props.actions.showSearchResults();\n            break;\n        case RHSStates.SEARCH:\n            this.props.actions.showSearchResults();\n            break;\n        case RHSStates.MENTION:\n            this.props.actions.showMentions();\n            break;\n        case RHSStates.FLAG:\n            this.props.actions.showFlaggedPosts();\n            break;\n        case RHSStates.PIN:\n            this.props.actions.showPinnedPosts();\n            break;\n        default:\n            break;\n        }\n    }\n\n    render(): React.ReactNode {\n        let back;\n        let backToResultsTooltip;\n\n        switch (this.props.previousRhsState) {\n        case RHSStates.SEARCH:\n        case RHSStates.MENTION:\n            backToResultsTooltip = (\n                <Tooltip id='backToResultsTooltip'>\n                    <FormattedMessage\n                        id='rhs_header.backToResultsTooltip'\n                        defaultMessage='Back to search results'\n                    />\n                </Tooltip>\n            );\n            break;\n        case RHSStates.FLAG:\n            backToResultsTooltip = (\n                <Tooltip id='backToResultsTooltip'>\n                    <FormattedMessage\n                        id='rhs_header.backToFlaggedTooltip'\n                        defaultMessage='Back to saved posts'\n                    />\n                </Tooltip>\n            );\n            break;\n        case RHSStates.PIN:\n            backToResultsTooltip = (\n                <Tooltip id='backToResultsTooltip'>\n                    <FormattedMessage\n                        id='rhs_header.backToPinnedTooltip'\n                        defaultMessage='Back to pinned posts'\n                    />\n                </Tooltip>\n            );\n            break;\n        }\n\n        const closeSidebarTooltip = (\n            <Tooltip id='closeSidebarTooltip'>\n                <FormattedMessage\n                    id='rhs_header.closeSidebarTooltip'\n                    defaultMessage='Close'\n                />\n            </Tooltip>\n        );\n\n        const expandSidebarTooltip = (\n            <Tooltip id='expandSidebarTooltip'>\n                <FormattedMessage\n                    id='rhs_header.expandSidebarTooltip'\n                    defaultMessage='Expand Sidebar'\n                />\n            </Tooltip>\n        );\n\n        const shrinkSidebarTooltip = (\n            <Tooltip id='shrinkSidebarTooltip'>\n                <FormattedMessage\n                    id='rhs_header.collapseSidebarTooltip'\n                    defaultMessage='Collapse Sidebar'\n                />\n            </Tooltip>\n        );\n\n        if (backToResultsTooltip) {\n            back = (\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='top'\n                    overlay={backToResultsTooltip}\n                >\n                    <a\n                        href='#'\n                        onClick={this.handleBack}\n                        className='sidebar--right__back'\n                    >\n                        <FormattedMessage\n                            id='generic_icons.back'\n                            defaultMessage='Back Icon'\n                        >\n                            {(ariaLabel?: string) => (\n                                <i\n                                    className='icon icon-arrow-back-ios'\n                                    aria-label={ariaLabel}\n                                />\n                            )}\n                        </FormattedMessage>\n                    </a>\n                </OverlayTrigger>\n            );\n        }\n\n        return (\n            <div className='sidebar--right__header'>\n                <span className='sidebar--right__title'>\n                    {back}\n                    <FormattedMessage\n                        id='search_header.title5'\n                        defaultMessage='Extra information'\n                    />\n                </span>\n                <div className='pull-right'>\n                    <OverlayTrigger\n                        delayShow={Constants.OVERLAY_TIME_DELAY}\n                        placement='top'\n                        overlay={this.props.isExpanded ? shrinkSidebarTooltip : expandSidebarTooltip}\n                    >\n                        <button\n                            type='button'\n                            className='sidebar--right__expand btn-icon'\n                            aria-label='Expand'\n                            onClick={this.props.actions.toggleRhsExpanded}\n                        >\n                            <FormattedMessage\n                                id='rhs_header.expandSidebarTooltip.icon'\n                                defaultMessage='Expand Sidebar Icon'\n                            >\n                                {(ariaLabel?: string) => (\n                                    <i\n                                        className='icon icon-arrow-expand'\n                                        aria-label={ariaLabel}\n                                    />\n                                )}\n                            </FormattedMessage>\n                            <FormattedMessage\n                                id='rhs_header.collapseSidebarTooltip.icon'\n                                defaultMessage='Collapse Sidebar Icon'\n                            >\n                                {(ariaLabel?: string) => (\n                                    <i\n                                        className='icon icon-arrow-collapse'\n                                        aria-label={ariaLabel}\n                                    />\n                                )}\n                            </FormattedMessage>\n                        </button>\n                    </OverlayTrigger>\n                    <OverlayTrigger\n                        delayShow={Constants.OVERLAY_TIME_DELAY}\n                        placement='top'\n                        overlay={closeSidebarTooltip}\n                    >\n                        <button\n                            type='button'\n                            className='sidebar--right__close btn-icon'\n                            aria-label='Close'\n                            onClick={this.props.actions.closeRightHandSide}\n                        >\n                            <FormattedMessage\n                                id='rhs_header.closeTooltip.icon'\n                                defaultMessage='Close Sidebar Icon'\n                            >\n                                {(ariaLabel?: string) => (\n                                    <i\n                                        className='icon icon-close'\n                                        aria-label={ariaLabel}\n                                    />\n                                )}\n                            </FormattedMessage>\n                        </button>\n                    </OverlayTrigger>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {AnyAction, bindActionCreators, Dispatch} from 'redux';\n\nimport {GlobalState} from 'types/store';\n\nimport {\n    showMentions,\n    showSearchResults,\n    showFlaggedPosts,\n    showPinnedPosts,\n    closeRightHandSide,\n    toggleRhsExpanded,\n} from 'actions/views/rhs';\nimport {getIsRhsExpanded} from 'selectors/rhs';\n\nimport RhsCardHeader from './rhs_card_header';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        isExpanded: getIsRhsExpanded(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<AnyAction>) {\n    return {\n        actions: bindActionCreators({\n            showMentions,\n            showSearchResults,\n            showFlaggedPosts,\n            showPinnedPosts,\n            closeRightHandSide,\n            toggleRhsExpanded,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(RhsCardHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport Scrollbars from 'react-custom-scrollbars';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport DelayedAction from 'utils/delayed_action';\nimport Constants, {RHSStates} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\nimport RhsCardHeader from 'components/rhs_card_header';\nimport Markdown from 'components/markdown';\nimport UserProfile from 'components/user_profile';\nimport PostProfilePicture from 'components/post_profile_picture';\nimport * as GlobalActions from 'actions/global_actions';\n\nexport function renderView(props) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--view'\n        />);\n}\n\nexport function renderThumbHorizontal(props) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--horizontal'\n        />);\n}\n\nexport function renderThumbVertical(props) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--vertical'\n        />);\n}\n\nexport default class RhsCard extends React.Component {\n    static propTypes = {\n        selected: PropTypes.object,\n        pluginPostCardTypes: PropTypes.object,\n        previousRhsState: PropTypes.oneOf(Object.values(RHSStates)),\n        enablePostUsernameOverride: PropTypes.bool,\n        teamUrl: PropTypes.string,\n    }\n\n    static defaultProps = {\n        pluginPostCardTypes: {},\n    }\n\n    constructor(props) {\n        super(props);\n\n        this.scrollStopAction = new DelayedAction(this.handleScrollStop);\n\n        this.state = {\n            isScrolling: false,\n            topRhsPostCreateAt: 0,\n        };\n    }\n\n    shouldComponentUpdate(nextProps, nextState) {\n        if (!Utils.areObjectsEqual(nextState.selected, this.props.selected)) {\n            return true;\n        }\n        if (nextState.isScrolling !== this.state.isScrolling) {\n            return true;\n        }\n        return false;\n    }\n\n    handleScroll = () => {\n        if (!this.state.isScrolling) {\n            this.setState({\n                isScrolling: true,\n            });\n        }\n\n        this.scrollStopAction.fireAfter(Constants.SCROLL_DELAY);\n    }\n\n    handleScrollStop = () => {\n        this.setState({\n            isScrolling: false,\n        });\n    }\n\n    handleClick = () => {\n        if (Utils.isMobile()) {\n            GlobalActions.emitCloseRightHandSide();\n        }\n    };\n\n    render() {\n        if (this.props.selected == null) {\n            return (<div/>);\n        }\n\n        const {selected, pluginPostCardTypes, teamUrl} = this.props;\n        const postType = selected.type;\n        let content = null;\n        if (pluginPostCardTypes.hasOwnProperty(postType)) {\n            const PluginComponent = pluginPostCardTypes[postType].component;\n            content = <PluginComponent post={selected}/>;\n        }\n\n        if (!content) {\n            content = (\n                <div className='info-card'>\n                    <Markdown message={selected.props && selected.props.card}/>\n                </div>\n            );\n        }\n\n        let user = (\n            <UserProfile\n                userId={selected.user_id}\n                hideStatus={true}\n                disablePopover={true}\n            />\n        );\n        if (selected.props.override_username && this.props.enablePostUsernameOverride) {\n            user = (\n                <UserProfile\n                    userId={selected.user_id}\n                    hideStatus={true}\n                    disablePopover={true}\n                    overwriteName={selected.props.override_username}\n                />\n            );\n        }\n        const avatar = (\n            <PostProfilePicture\n                compactDisplay={false}\n                post={selected}\n                userId={selected.user_id}\n            />\n        );\n\n        return (\n            <div className='sidebar-right__body sidebar-right__card'>\n                <RhsCardHeader previousRhsState={this.props.previousRhsState}/>\n                <Scrollbars\n                    autoHide={true}\n                    autoHideTimeout={500}\n                    autoHideDuration={500}\n                    renderThumbHorizontal={renderThumbHorizontal}\n                    renderThumbVertical={renderThumbVertical}\n                    renderView={renderView}\n                    onScroll={this.handleScroll}\n                >\n                    <div className='post-right__scroll'>\n                        {content}\n                        <div className='d-flex post-card--info'>\n                            <div className='post-card--post-by overflow--ellipsis'>\n                                <FormattedMessage\n                                    id='rhs_card.message_by'\n                                    defaultMessage='Message by {avatar} {user}'\n                                    values={{user, avatar}}\n                                />\n                            </div>\n                            <div className='post-card--view-post'>\n                                <Link\n                                    to={`${teamUrl}/pl/${selected.id}`}\n                                    className='post__permalink'\n                                    onClick={this.handleClick}\n                                >\n                                    <FormattedMessage\n                                        id='rhs_card.jump'\n                                        defaultMessage='Jump'\n                                    />\n                                </Link>\n                            </div>\n                        </div>\n                    </div>\n                </Scrollbars>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {getSelectedPostCard} from 'selectors/rhs';\n\nimport RhsCard from './rhs_card.jsx';\n\nfunction mapStateToProps(state) {\n    const selected = getSelectedPostCard(state);\n    const config = getConfig(state);\n    const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n\n    return {\n        enablePostUsernameOverride,\n        selected,\n        pluginPostCardTypes: state.plugins.postCardTypes,\n        teamUrl: getCurrentRelativeTeamUrl(state),\n    };\n}\n\nexport default connect(mapStateToProps)(RhsCard);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport SearchResultsHeader from 'components/search_results_header';\n\nimport Pluggable from 'plugins/pluggable';\n\nexport default class RhsPlugin extends React.PureComponent {\n    static propTypes = {\n        showPluggable: PropTypes.bool.isRequired,\n        pluggableId: PropTypes.string.isRequired,\n        title: PropTypes.oneOfType([\n            PropTypes.string,\n            PropTypes.object,\n        ]),\n    }\n\n    render() {\n        return (\n            <div\n                id='rhsContainer'\n                className='sidebar-right__body'\n            >\n                <SearchResultsHeader>\n                    {this.props.title}\n                </SearchResultsHeader>\n                {\n                    this.props.showPluggable &&\n                    <Pluggable\n                        pluggableName='RightHandSidebarComponent'\n                        pluggableId={this.props.pluggableId}\n                    />\n                }\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getPluggableId} from 'selectors/rhs';\n\nimport RHSPlugin from './rhs_plugin.jsx';\n\nfunction mapStateToProps(state) {\n    const rhsPlugins = state.plugins.components.RightHandSidebarComponent;\n    const pluggableId = getPluggableId(state);\n\n    const pluginComponent = rhsPlugins.find((element) => element.id === pluggableId);\n    const pluginTitle = pluginComponent ? pluginComponent.title : '';\n\n    return {\n        showPluggable: Boolean(pluginComponent),\n        pluggableId,\n        title: pluginTitle,\n    };\n}\n\nexport default connect(mapStateToProps)(RHSPlugin);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\nimport Constants from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\n\nimport FileUploadOverlay from 'components/file_upload_overlay';\nimport RhsThread from 'components/rhs_thread';\nimport RhsCard from 'components/rhs_card';\nimport Search from 'components/search/index.tsx';\n\nimport RhsPlugin from 'plugins/rhs_plugin';\n\nexport default class SidebarRight extends React.PureComponent {\n    static propTypes = {\n        isExpanded: PropTypes.bool.isRequired,\n        isOpen: PropTypes.bool.isRequired,\n        isSuppressed: PropTypes.bool,\n        channel: PropTypes.object,\n        postRightVisible: PropTypes.bool,\n        postRightSameAsSelectedThread: PropTypes.bool,\n        postCardVisible: PropTypes.bool,\n        searchVisible: PropTypes.bool,\n        isMentionSearch: PropTypes.bool,\n        isFlaggedPosts: PropTypes.bool,\n        isPinnedPosts: PropTypes.bool,\n        isChannelFiles: PropTypes.bool,\n        isPluginView: PropTypes.bool,\n        previousRhsState: PropTypes.string,\n        rhsChannel: PropTypes.object,\n        selectedPostId: PropTypes.string,\n        selectedPostCardId: PropTypes.string,\n        actions: PropTypes.shape({\n            setRhsExpanded: PropTypes.func.isRequired,\n            showPinnedPosts: PropTypes.func.isRequired,\n            openRHSSearch: PropTypes.func.isRequired,\n            closeRightHandSide: PropTypes.func.isRequired,\n            openAtPrevious: PropTypes.func.isRequired,\n            updateSearchTerms: PropTypes.func.isRequired,\n            showChannelFiles: PropTypes.func.isRequired,\n        }),\n    };\n\n    constructor(props) {\n        super(props);\n\n        this.sidebarRight = React.createRef();\n        this.state = {\n            isOpened: false,\n        };\n    }\n\n    setPrevious = () => {\n        if (!this.props.isOpen) {\n            return;\n        }\n\n        this.previous = {\n            searchVisible: this.props.searchVisible,\n            isMentionSearch: this.props.isMentionSearch,\n            isPinnedPosts: this.props.isPinnedPosts,\n            isChannelFiles: this.props.isChannelFiles,\n            isFlaggedPosts: this.props.isFlaggedPosts,\n            selectedPostId: this.props.selectedPostId,\n            selectedPostCardId: this.props.selectedPostCardId,\n            previousRhsState: this.props.previousRhsState,\n        };\n    }\n\n    handleShortcut = (e) => {\n        if (Utils.cmdOrCtrlPressed(e) && Utils.isKeyPressed(e, Constants.KeyCodes.PERIOD)) {\n            e.preventDefault();\n            if (this.props.isOpen) {\n                this.props.actions.closeRightHandSide();\n            } else {\n                this.props.actions.openAtPrevious(this.previous);\n            }\n        }\n    }\n\n    componentDidMount() {\n        window.addEventListener('resize', this.determineTransition);\n        document.addEventListener('keydown', this.handleShortcut);\n        this.determineTransition();\n    }\n\n    componentWillUnmount() {\n        window.removeEventListener('resize', this.determineTransition);\n        document.removeEventListener('keydown', this.handleShortcut);\n        if (this.sidebarRight.current) {\n            this.sidebarRight.current.removeEventListener('transitionend', this.onFinishTransition);\n        }\n    }\n\n    componentDidUpdate(prevProps) {\n        const wasOpen = prevProps.searchVisible || prevProps.postRightVisible;\n        const isOpen = this.props.searchVisible || this.props.postRightVisible;\n\n        if (!wasOpen && isOpen) {\n            this.determineTransition();\n            trackEvent('ui', 'ui_rhs_opened');\n        }\n\n        const {actions, isChannelFiles, isPinnedPosts, rhsChannel, channel} = this.props;\n        if (isPinnedPosts && prevProps.isPinnedPosts === isPinnedPosts && rhsChannel.id !== prevProps.rhsChannel.id) {\n            actions.showPinnedPosts(rhsChannel.id);\n        }\n\n        if (isChannelFiles && prevProps.isChannelFiles === isChannelFiles && rhsChannel.id !== prevProps.rhsChannel.id) {\n            actions.showChannelFiles(rhsChannel.id);\n        }\n\n        // in the case of navigating to another channel\n        // or from global threads to a channel\n        // we shrink the sidebar\n        if (\n            (channel && prevProps.channel && (channel.id !== prevProps.channel.id)) ||\n            (channel && !prevProps.channel)\n        ) {\n            this.props.actions.setRhsExpanded(false);\n        }\n\n        this.setPrevious();\n    }\n\n    determineTransition = () => {\n        let transitionInfo;\n        if (this.sidebarRight.current) {\n            transitionInfo = window.getComputedStyle(this.sidebarRight.current).getPropertyValue('transition');\n        }\n        const hasTransition = Boolean(transitionInfo) && transitionInfo !== 'all 0s ease 0s';\n\n        if (this.sidebarRight.current && hasTransition) {\n            this.setState({isOpened: this.props.isOpen});\n            this.sidebarRight.current.addEventListener('transitionend', this.onFinishTransition);\n        } else {\n            this.setState({isOpened: true});\n            if (this.sidebarRight.current) {\n                this.sidebarRight.current.removeEventListener('transitionend', this.onFinishTransition);\n            }\n        }\n    }\n\n    onFinishTransition = (e) => {\n        if (e.propertyName === 'transform') {\n            this.setState({isOpened: this.props.isOpen});\n        }\n    }\n\n    onShrink = () => {\n        this.props.actions.setRhsExpanded(false);\n    };\n\n    handleUpdateSearchTerms = (term) => {\n        this.props.actions.updateSearchTerms(term);\n        this.focusSearchBar();\n    }\n\n    getSearchBarFocus = (focusSearchBar) => {\n        this.focusSearchBar = focusSearchBar;\n    }\n\n    render() {\n        const {\n            rhsChannel,\n            isFlaggedPosts,\n            isPinnedPosts,\n            isChannelFiles,\n            postRightVisible,\n            postCardVisible,\n            previousRhsState,\n            searchVisible,\n            isPluginView,\n            isOpen,\n            isExpanded,\n            isSuppressed,\n        } = this.props;\n\n        let content = null;\n        const isSidebarRightExpanded = (postRightVisible || postCardVisible || isPluginView || searchVisible) && isExpanded;\n\n        switch (true) {\n        case postRightVisible:\n            content = (\n                <div className='post-right__container'>\n                    <FileUploadOverlay overlayType='right'/>\n                    <RhsThread\n                        previousRhsState={previousRhsState}\n                        toggleSize={this.toggleSize}\n                        shrink={this.onShrink}\n                    />\n                </div>\n            );\n            break;\n        case postCardVisible:\n            content = <RhsCard previousRhsState={previousRhsState}/>;\n            break;\n        case isPluginView:\n            content = <RhsPlugin/>;\n            break;\n        }\n\n        return (\n            <div\n                className={classNames('sidebar--right', {\n                    'sidebar--right--expanded': isSidebarRightExpanded,\n                    'move--left': isOpen,\n                    hidden: !isOpen,\n                })}\n                id='sidebar-right'\n                role='complementary'\n                ref={this.sidebarRight}\n            >\n                <div\n                    onClick={this.onShrink}\n                    className='sidebar--right__bg'\n                />\n                <div className='sidebar-right-container'>\n                    <Search\n                        isFocus={searchVisible && !isFlaggedPosts && !isPinnedPosts && !isChannelFiles && !isSuppressed}\n                        isSideBarRight={true}\n                        isSideBarRightOpen={this.state.isOpened}\n                        getFocus={this.getSearchBarFocus}\n                        channelDisplayName={rhsChannel ? rhsChannel.display_name : ''}\n                    >\n                        {isOpen && content}\n                    </Search>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\n\nimport {setRhsExpanded, showPinnedPosts, showChannelFiles, openRHSSearch, closeRightHandSide, openAtPrevious, updateSearchTerms} from 'actions/views/rhs';\nimport {\n    getIsRhsExpanded,\n    getIsRhsOpen,\n    getIsRhsSuppressed,\n    getRhsState,\n    getSelectedChannel,\n    getSelectedPostId,\n    getSelectedPostCardId,\n    getPreviousRhsState,\n} from 'selectors/rhs';\nimport {RHSStates} from 'utils/constants';\n\nimport SidebarRight from './sidebar_right.jsx';\n\nfunction mapStateToProps(state) {\n    const rhsState = getRhsState(state);\n    const channel = getCurrentChannel(state);\n\n    const selectedPostId = getSelectedPostId(state);\n    const selectedPostCardId = getSelectedPostCardId(state);\n\n    return {\n        isExpanded: getIsRhsExpanded(state),\n        isOpen: getIsRhsOpen(state),\n        isSuppressed: getIsRhsSuppressed(state),\n        channel,\n        postRightVisible: Boolean(selectedPostId),\n        postCardVisible: Boolean(selectedPostCardId),\n        searchVisible: Boolean(rhsState) && rhsState !== RHSStates.PLUGIN,\n        previousRhsState: getPreviousRhsState(state),\n        isMentionSearch: rhsState === RHSStates.MENTION,\n        isFlaggedPosts: rhsState === RHSStates.FLAG,\n        isPinnedPosts: rhsState === RHSStates.PIN,\n        isChannelFiles: rhsState === RHSStates.CHANNEL_FILES,\n        isPluginView: rhsState === RHSStates.PLUGIN,\n        rhsChannel: getSelectedChannel(state),\n        selectedPostId,\n        selectedPostCardId,\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            setRhsExpanded,\n            showPinnedPosts,\n            openRHSSearch,\n            closeRightHandSide,\n            openAtPrevious,\n            updateSearchTerms,\n            showChannelFiles,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SidebarRight);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\n\nimport TutorialTip from './tutorial_tip';\n\ntype Props = {\n    toggleFunc?: React.MouseEventHandler<HTMLDivElement>;\n    onBottom: boolean;\n    inHeading?: boolean;\n}\n\nconst MenuTutorialTip = ({inHeading, toggleFunc, onBottom}: Props) => {\n    const screens = [];\n\n    screens.push(\n        <div>\n            <h4>\n                <FormattedMessage\n                    id='sidebar_header.tutorial.title'\n                    defaultMessage='Invite people'\n                />\n            </h4>\n            <p>\n                <FormattedMarkdownMessage\n                    id='sidebar_header.tutorial.body1'\n                    defaultMessage='Use this menu to **Invite People** to your team and access **Team Settings** if you’re an Admin.'\n                />\n            </p>\n        </div>,\n    );\n\n    let placement = 'right';\n    let arrow = 'left';\n    let headerClass = '';\n\n    if (inHeading && !onBottom) {\n        headerClass = ' tip-overlay--header--heading';\n    }\n\n    if (onBottom) {\n        placement = 'bottom';\n        arrow = 'up';\n    }\n\n    return (\n        <div\n            onClick={toggleFunc}\n        >\n            <TutorialTip\n                placement={placement}\n                screens={screens}\n                overlayClass={'tip-overlay--header--' + arrow + headerClass}\n                telemetryTag='tutorial_tip_3_main_menu'\n            />\n        </div>\n    );\n};\n\nexport default MenuTutorialTip;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function LeaveTeamIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='100%'\n                height='100%'\n                viewBox='0 0 164 164'\n                style={style}\n                role='img'\n                aria-label={formatMessage({id: 'navbar_dropdown.leave.icon', defaultMessage: 'Leave Team Icon'})}\n            >\n                <path d='M26.023,164L26.023,7.035L26.022,0.32L137.658,0.32L137.658,164L124.228,164L124.228, 13.749L39.452,13.749L39.452,164L26.023, 164ZM118.876,164L118.876,18.619L58.137,32.918L58.137,149.701L118.876,164Z'/>\n            </svg>\n        </span>\n    );\n}\n\nconst style: CSSProperties = {\n    fillRule: 'evenodd',\n    clipRule: 'evenodd',\n    strokeLinejoin: 'round',\n    strokeMiterlimit: 1.41421,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {ActionFunc} from 'mattermost-redux/types/actions';\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport * as Utils from 'utils/utils.jsx';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message.jsx';\n\nimport Constants from 'utils/constants';\n\n// import {t} from 'utils/i18n';\nimport {isKeyPressed} from 'utils/utils';\n\ntype Props = {\n    currentUser: UserProfile;\n    currentUserId: string;\n    currentTeamId: string;\n    numOfPublicChannels: number;\n    numOfPrivateChannels: number;\n    onHide: () => void;\n    show: boolean;\n    actions: {\n        leaveTeam: (teamId: string, userId: string) => ActionFunc;\n        toggleSideBarRightMenu: () => void;\n    };\n};\n\nexport default class LeaveTeamModal extends React.PureComponent<Props> {\n    componentDidMount() {\n        if (this.props.show) {\n            document.addEventListener('keypress', this.handleKeyPress);\n        }\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keypress', this.handleKeyPress);\n    }\n\n    handleKeyPress = (e: KeyboardEvent) => {\n        if (isKeyPressed(e, Constants.KeyCodes.ENTER)) {\n            this.handleSubmit();\n        }\n    };\n\n    handleSubmit = () => {\n        this.props.onHide();\n        this.props.actions.leaveTeam(\n            this.props.currentTeamId,\n            this.props.currentUserId,\n        );\n        this.props.actions.toggleSideBarRightMenu();\n    };\n\n    render() {\n        const {\n            currentUser,\n            numOfPrivateChannels,\n            numOfPublicChannels,\n        } = this.props;\n\n        const isGuest = Utils.isGuest(currentUser);\n\n        let modalMessage;\n        if (isGuest) {\n            if (numOfPublicChannels !== 0 && numOfPrivateChannels !== 0) {\n                modalMessage = (\n                    <FormattedMarkdownMessage\n                        id='leave_team_modal_guest.desc'\n                        defaultMessage=\"** You will be removed from {num_of_public_channels} public { num_of_public_channels,plural,one {channel} other {channels}} and {num_of_private_channels} private { num_of_private_channels,plural,one {channel} other {channels}} on this team.** You won't be able to rejoin it without an invitation from another team member. Are you sure?\"\n                        values={{\n                            num_of_public_channels: numOfPublicChannels,\n                            num_of_private_channels: numOfPrivateChannels,\n                        }}\n                    />\n                );\n            } else if (numOfPublicChannels === 0) {\n                modalMessage = (\n                    <FormattedMarkdownMessage\n                        id='leave_team_modal_guest_only_private.desc'\n                        defaultMessage=\"** You will be removed from {num_of_private_channels} private { num_of_private_channels,plural,one {channel} other {channels}} on this team.** You won't be able to rejoin it without an invitation from another team member. Are you sure?\"\n                        values={{\n                            num_of_public_channels: numOfPublicChannels,\n                            num_of_private_channels: numOfPrivateChannels,\n                        }}\n                    />\n                );\n            } else {\n                modalMessage = (\n                    <FormattedMarkdownMessage\n                        id='leave_team_modal_guest_only_public.desc'\n                        defaultMessage=\"** You will be removed from {num_of_public_channels} public { num_of_public_channels,plural,one {channel} other {channels}} on this team.** You won't be able to rejoin it without an invitation from another team member. Are you sure?\"\n                        values={{\n                            num_of_public_channels: numOfPublicChannels,\n                            num_of_private_channels: numOfPrivateChannels,\n                        }}\n                    />);\n            }\n        } else if (numOfPublicChannels !== 0 && numOfPrivateChannels !== 0) {\n            modalMessage = (\n                <FormattedMarkdownMessage\n                    id='leave_team_modal.desc'\n                    defaultMessage=\"**You will be removed from {num_of_public_channels} public { num_of_public_channels,plural,one {channel} other {channels} } and {num_of_private_channels} private {num_of_private_channels,one {channel} other {channels}} on this team.** If the team is private you won't be able to rejoin it without an invitation from another team member. Are you sure?\"\n\n                    values={{\n                        num_of_public_channels: numOfPublicChannels,\n                        num_of_private_channels: numOfPrivateChannels,\n                    }}\n                />);\n        } else if (numOfPublicChannels === 0) {\n            modalMessage = (\n                <FormattedMarkdownMessage\n                    id='leave_team_modal_private.desc'\n                    defaultMessage=\"**You will be removed from {num_of_private_channels} private {num_of_private_channels,one {channel} other {channels}} on this team.** If the team is private you won't be able to rejoin it without an invitation from another team member. Are you sure?\"\n                    values={{\n                        num_of_public_channels: numOfPublicChannels,\n                        num_of_private_channels: numOfPrivateChannels,\n                    }}\n                />);\n        } else {\n            modalMessage = (\n                <FormattedMarkdownMessage\n                    id='leave_team_modal_public.desc'\n                    defaultMessage='**You will be removed from {num_of_public_channels} public { num_of_public_channels,plural,one {channel} other {channels} } on this team.** Are you sure?'\n                    values={{\n                        num_of_public_channels: numOfPublicChannels,\n                        num_of_private_channels: numOfPrivateChannels,\n                    }}\n                />\n            );\n        }\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal'\n                className='modal-confirm'\n                show={this.props.show}\n                onHide={this.props.onHide}\n                id='leaveTeamModal'\n                role='dialog'\n                aria-labelledby='leaveTeamModalLabel'\n            >\n                <Modal.Header closeButton={false}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='leaveTeamModalLabel'\n                    >\n                        <FormattedMessage\n                            id='leave_team_modal.title'\n                            defaultMessage='Leave the team?'\n                        />\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    {modalMessage}\n                </Modal.Body>\n                <Modal.Footer>\n                    <button\n                        type='button'\n                        className='btn btn-link'\n                        onClick={this.props.onHide}\n                        id='leaveTeamNo'\n                    >\n                        <FormattedMessage\n                            id='leave_team_modal.no'\n                            defaultMessage='No'\n                        />\n                    </button>\n                    <button\n                        type='button'\n                        className='btn btn-danger'\n                        onClick={this.handleSubmit}\n                        id='leaveTeamYes'\n                    >\n                        <FormattedMessage\n                            id='leave_team_modal.yes'\n                            defaultMessage='Yes'\n                        />\n                    </button>\n                </Modal.Footer>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {removeUserFromTeam as leaveTeam} from 'mattermost-redux/actions/teams';\n\nimport {getMyChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId, getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {toggleSideBarRightMenuAction} from 'actions/global_actions';\n\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport {GlobalState} from 'types/store';\n\nimport {Constants, ModalIdentifiers} from 'utils/constants';\n\nimport LeaveTeamModal from './leave_team_modal';\n\nfunction getNumOfPrivateChannels(state: GlobalState) {\n    const channels = getMyChannels(state);\n\n    return channels.filter((channel) => channel.type === Constants.PRIVATE_CHANNEL).length;\n}\n\nfunction getNumOfPublicChannels(state: GlobalState) {\n    const channels = getMyChannels(state);\n\n    return channels.filter((channel) => channel.type === Constants.OPEN_CHANNEL).length;\n}\n\nfunction mapStateToProps(state: GlobalState) {\n    const modalId = ModalIdentifiers.LEAVE_TEAM;\n    const currentUserId = getCurrentUserId(state);\n    const currentTeamId = getCurrentTeamId(state);\n    const show = isModalOpen(state, modalId);\n    const currentUser = getCurrentUser(state);\n\n    return {\n        currentUserId,\n        currentTeamId,\n        show,\n        currentUser,\n        numOfPrivateChannels: getNumOfPrivateChannels(state),\n        numOfPublicChannels: getNumOfPublicChannels(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            leaveTeam,\n            toggleSideBarRightMenu: toggleSideBarRightMenuAction,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(LeaveTeamModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport $ from 'jquery';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage, FormattedDate} from 'react-intl';\n\nimport Constants from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\nimport SettingItemMax from 'components/setting_item_max.jsx';\nimport SettingItemMin from 'components/setting_item_min';\nimport SettingPicture from 'components/setting_picture.jsx';\nimport BackIcon from 'components/widgets/icons/fa_back_icon';\nimport LocalizedInput from 'components/localized_input/localized_input';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\n\nimport {t} from 'utils/i18n.jsx';\n\nconst ACCEPTED_TEAM_IMAGE_TYPES = ['image/jpeg', 'image/png', 'image/bmp'];\n\nexport default class GeneralTab extends React.PureComponent {\n    // Removed isRequired from these props: maxFileSize, canInviteTeamMembers,\n    // and actions due to issues with TypeScript migration\n    static propTypes = {\n        updateSection: PropTypes.func.isRequired,\n        team: PropTypes.object.isRequired,\n        activeSection: PropTypes.string.isRequired,\n        closeModal: PropTypes.func.isRequired,\n        collapseModal: PropTypes.func.isRequired,\n        maxFileSize: PropTypes.number,\n        actions: PropTypes.shape({\n            getTeam: PropTypes.func.isRequired,\n            patchTeam: PropTypes.func.isRequired,\n            regenerateTeamInviteId: PropTypes.func.isRequired,\n            removeTeamIcon: PropTypes.func.isRequired,\n            setTeamIcon: PropTypes.func.isRequired,\n        }),\n        canInviteTeamMembers: PropTypes.bool,\n    }\n\n    constructor(props) {\n        super(props);\n        this.state = this.setupInitialState(props);\n    }\n\n    updateSection = (section) => {\n        this.setState(this.setupInitialState(this.props));\n        this.props.updateSection(section);\n    }\n\n    setupInitialState(props) {\n        const team = props.team;\n\n        return {\n            name: team.display_name,\n            invite_id: team.invite_id,\n            allow_open_invite: team.allow_open_invite,\n            description: team.description,\n            allowed_domains: team.allowed_domains,\n            serverError: '',\n            clientError: '',\n            teamIconFile: null,\n            loadingIcon: false,\n            submitActive: false,\n            isInitialState: true,\n        };\n    }\n\n    static getDerivedStateFromProps(nextProps, prevState) {\n        const {team} = nextProps;\n        if (!prevState.isInitialState) {\n            return {\n                name: team.display_name,\n                description: team.description,\n                allowed_domains: team.allowed_domains,\n                invite_id: team.invite_id,\n                allow_open_invite: team.allow_open_invite,\n                isInitialState: false,\n            };\n        }\n        return null;\n    }\n\n    componentDidUpdate(prevProps, prevState) {\n        if (!prevState.shouldFetchTeam && this.state.shouldFetchTeam) {\n            this.fetchTeam();\n        }\n    }\n\n    fetchTeam() {\n        if (this.state.serverError) {\n            return;\n        }\n        this.props.actions.getTeam(this.props.team.id).then(({error}) => {\n            const state = {\n                shouldFetchTeam: false,\n            };\n            if (error) {\n                state.serverError = error.message;\n            }\n            this.setState(state);\n        });\n    }\n\n    handleOpenInviteRadio = (openInvite) => {\n        this.setState({allow_open_invite: openInvite});\n    }\n\n    handleAllowedDomainsSubmit = async () => {\n        var state = {serverError: '', clientError: ''};\n\n        var data = {...this.props.team};\n        data.allowed_domains = this.state.allowed_domains;\n\n        const {error} = await this.props.actions.patchTeam(data);\n\n        if (error) {\n            state.serverError = error.message;\n            this.setState(state);\n        } else {\n            this.updateSection('');\n        }\n    }\n\n    handleOpenInviteSubmit = async () => {\n        var state = {serverError: '', clientError: ''};\n\n        var data = {...this.props.team};\n        data.allow_open_invite = this.state.allow_open_invite;\n\n        const {error} = await this.props.actions.patchTeam(data);\n\n        if (error) {\n            state.serverError = error.message;\n            this.setState(state);\n        } else {\n            this.updateSection('');\n        }\n    }\n\n    handleNameSubmit = async () => {\n        var state = {serverError: '', clientError: ''};\n        let valid = true;\n\n        const name = this.state.name.trim();\n\n        if (!name) {\n            state.clientError = Utils.localizeMessage('general_tab.required', 'This field is required');\n            valid = false;\n        } else if (name.length < Constants.MIN_TEAMNAME_LENGTH) {\n            state.clientError = (\n                <FormattedMessage\n                    id='general_tab.teamNameRestrictions'\n                    defaultMessage='Team Name must be {min} or more characters up to a maximum of {max}. You can add a longer team description.'\n                    values={{\n                        min: Constants.MIN_TEAMNAME_LENGTH,\n                        max: Constants.MAX_TEAMNAME_LENGTH,\n                    }}\n                />\n            );\n\n            valid = false;\n        } else {\n            state.clientError = '';\n        }\n\n        this.setState(state);\n\n        if (!valid) {\n            return;\n        }\n\n        var data = {...this.props.team};\n        data.display_name = this.state.name;\n\n        const {error} = await this.props.actions.patchTeam(data);\n\n        if (error) {\n            state.serverError = error.message;\n            this.setState(state);\n        } else {\n            this.updateSection('');\n        }\n    }\n\n    handleInviteIdSubmit = async () => {\n        const state = {serverError: '', clientError: ''};\n        this.setState(state);\n\n        const {error} = await this.props.actions.regenerateTeamInviteId(this.props.team.id);\n\n        if (error) {\n            state.serverError = error.message;\n            this.setState(state);\n        } else {\n            this.updateSection('');\n        }\n    }\n\n    handleClose = () => {\n        this.updateSection('');\n    }\n\n    handleDescriptionSubmit = async () => {\n        var state = {serverError: '', clientError: ''};\n        let valid = true;\n\n        const description = this.state.description.trim();\n        if (description === this.props.team.description) {\n            state.clientError = Utils.localizeMessage('general_tab.chooseDescription', 'Please choose a new description for your team');\n            valid = false;\n        } else {\n            state.clientError = '';\n        }\n\n        this.setState(state);\n\n        if (!valid) {\n            return;\n        }\n\n        var data = {...this.props.team};\n        data.description = this.state.description;\n\n        const {error} = await this.props.actions.patchTeam(data);\n\n        if (error) {\n            state.serverError = error.message;\n            this.setState(state);\n        } else {\n            this.updateSection('');\n        }\n    }\n\n    handleTeamIconSubmit = async () => {\n        if (!this.state.teamIconFile) {\n            return;\n        }\n\n        if (!this.state.submitActive) {\n            return;\n        }\n\n        this.setState({\n            loadingIcon: true,\n            clientError: '',\n            serverError: '',\n        });\n\n        const {error} = await this.props.actions.setTeamIcon(this.props.team.id, this.state.teamIconFile);\n\n        if (error) {\n            this.setState({\n                loadingIcon: false,\n                serverError: error.message,\n            });\n        } else {\n            this.setState({\n                loadingIcon: false,\n                submitActive: false,\n            });\n            this.updateSection('');\n        }\n    }\n\n    handleTeamIconRemove = async () => {\n        this.setState({\n            loadingIcon: true,\n            clientError: '',\n            serverError: '',\n        });\n\n        const {error} = await this.props.actions.removeTeamIcon(this.props.team.id);\n\n        if (error) {\n            this.setState({\n                loadingIcon: false,\n                serverError: error.message,\n            });\n        } else {\n            this.setState({\n                loadingIcon: false,\n                submitActive: false,\n            });\n            this.updateSection('');\n        }\n    }\n\n    componentDidMount() {\n        $('#team_settings').on('hidden.bs.modal', this.handleClose);\n    }\n\n    componentWillUnmount() {\n        $('#team_settings').off('hidden.bs.modal', this.handleClose);\n    }\n\n    handleUpdateSection = (section) => {\n        if (section === 'invite_id' && this.props.activeSection !== section && !this.props.team.invite_id) {\n            this.setState({shouldFetchTeam: true}, () => {\n                this.updateSection(section);\n            });\n            return;\n        }\n\n        this.updateSection(section);\n    }\n\n    updateName = (e) => {\n        this.setState({name: e.target.value});\n    }\n\n    updateDescription = (e) => {\n        this.setState({description: e.target.value});\n    }\n\n    updateTeamIcon = (e) => {\n        if (e && e.target && e.target.files && e.target.files[0]) {\n            const file = e.target.files[0];\n\n            if (!ACCEPTED_TEAM_IMAGE_TYPES.includes(file.type)) {\n                this.setState({\n                    clientError: Utils.localizeMessage('general_tab.teamIconInvalidFileType', 'Only BMP, JPG or PNG images may be used for team icons'),\n                });\n            } else if (file.size > this.props.maxFileSize) {\n                this.setState({\n                    clientError: Utils.localizeMessage('general_tab.teamIconTooLarge', 'Unable to upload team icon. File is too large.'),\n                });\n            } else {\n                this.setState({\n                    teamIconFile: e.target.files[0],\n                    clientError: '',\n                    submitActive: true,\n                });\n            }\n        } else {\n            this.setState({\n                teamIconFile: null,\n                clientError: Utils.localizeMessage('general_tab.teamIconError', 'An error occurred while selecting the image.'),\n            });\n        }\n    }\n\n    updateAllowedDomains = (e) => {\n        this.setState({allowed_domains: e.target.value});\n    }\n\n    render() {\n        const team = this.props.team;\n\n        let clientError = null;\n        let serverError = null;\n\n        if (this.state.clientError) {\n            clientError = this.state.clientError;\n        }\n        if (this.state.serverError) {\n            serverError = this.state.serverError;\n        }\n\n        let openInviteSection;\n        if (this.props.activeSection === 'open_invite') {\n            let inputs;\n\n            if (team.group_constrained) {\n                inputs = [\n                    <div key='userOpenInviteOptions'>\n                        <div>\n                            <FormattedMarkdownMessage\n                                id='team_settings.openInviteDescription.groupConstrained'\n                                defaultMessage='No, members of this team are added and removed by linked groups. [Learn More](!https://mattermost.com/pl/default-ldap-group-constrained-team-channel.html)'\n                            />\n                        </div>\n                    </div>,\n                ];\n            } else {\n                inputs = [\n                    <fieldset key='userOpenInviteOptions'>\n                        <legend className='form-legend hidden-label'>\n                            <FormattedMessage\n                                id='team_settings.openInviteDescription.ariaLabel'\n                                defaultMessage='Invite Code'\n                            />\n                        </legend>\n                        <div className='radio'>\n                            <label>\n                                <input\n                                    id='teamOpenInvite'\n                                    name='userOpenInviteOptions'\n                                    type='radio'\n                                    defaultChecked={this.state.allow_open_invite}\n                                    onChange={this.handleOpenInviteRadio.bind(this, true)}\n                                />\n                                <FormattedMessage\n                                    id='general_tab.yes'\n                                    defaultMessage='Yes'\n                                />\n                            </label>\n                            <br/>\n                        </div>\n                        <div className='radio'>\n                            <label>\n                                <input\n                                    id='teamOpenInviteNo'\n                                    name='userOpenInviteOptions'\n                                    type='radio'\n                                    defaultChecked={!this.state.allow_open_invite}\n                                    onChange={this.handleOpenInviteRadio.bind(this, false)}\n                                />\n                                <FormattedMessage\n                                    id='general_tab.no'\n                                    defaultMessage='No'\n                                />\n                            </label>\n                            <br/>\n                        </div>\n                        <div className='mt-5'>\n                            <FormattedMessage\n                                id='general_tab.openInviteDesc'\n                                defaultMessage='When allowed, a link to this team will be included on the landing page allowing anyone with an account to join this team. Changing from \"Yes\" to \"No\" will regenerate the  invitation code, create a new invitation link and invalidate the previous link.'\n                            />\n                        </div>\n                    </fieldset>,\n                ];\n            }\n\n            openInviteSection = (\n                <SettingItemMax\n                    title={Utils.localizeMessage('general_tab.openInviteTitle', 'Allow any user with an account on this server to join this team')}\n                    inputs={inputs}\n                    submit={this.handleOpenInviteSubmit}\n                    serverError={serverError}\n                    updateSection={this.handleUpdateSection}\n                />\n            );\n        } else {\n            let describe = '';\n            if (this.state.allow_open_invite === true) {\n                describe = Utils.localizeMessage('general_tab.yes', 'Yes');\n            } else if (team.group_constrained) {\n                describe = Utils.localizeMessage('team_settings.openInviteSetting.groupConstrained', 'No, members of this team are added and removed by linked groups.');\n            } else {\n                describe = Utils.localizeMessage('general_tab.no', 'No');\n            }\n\n            openInviteSection = (\n                <SettingItemMin\n                    title={Utils.localizeMessage('general_tab.openInviteTitle', 'Allow any user with an account on this server to join this team')}\n                    describe={describe}\n                    updateSection={this.handleUpdateSection}\n                    section={'open_invite'}\n                />\n            );\n        }\n\n        let inviteSection;\n\n        if (this.props.activeSection === 'invite_id' && this.props.canInviteTeamMembers) {\n            const inputs = [];\n\n            inputs.push(\n                <div key='teamInviteSetting'>\n                    <div className='row'>\n                        <label className='col-sm-5 control-label visible-xs-block'/>\n                        <div className='col-sm-12'>\n                            <input\n                                id='teamInviteId'\n                                autoFocus={true}\n                                className='form-control'\n                                type='text'\n                                value={this.state.invite_id}\n                                maxLength='32'\n                                onFocus={Utils.moveCursorToEnd}\n                                readOnly={true}\n                            />\n                        </div>\n                    </div>\n                    <div className='setting-list__hint'>\n                        <FormattedMessage\n                            id='general_tab.codeLongDesc'\n                            defaultMessage='The Invite Code is part of the unique team invitation link which is sent to members you’re inviting to this team. Regenerating the code creates a new invitation link and invalidates the previous link.'\n                            values={{\n                                getTeamInviteLink: (\n                                    <strong>\n                                        <FormattedMessage\n                                            id='general_tab.getTeamInviteLink'\n                                            defaultMessage='Get Team Invite Link'\n                                        />\n                                    </strong>\n                                ),\n                            }}\n                        />\n                    </div>\n                </div>,\n            );\n\n            inviteSection = (\n                <SettingItemMax\n                    title={Utils.localizeMessage('general_tab.codeTitle', 'Invite Code')}\n                    inputs={inputs}\n                    submit={this.handleInviteIdSubmit}\n                    serverError={serverError}\n                    clientError={clientError}\n                    updateSection={this.handleUpdateSection}\n                    saveButtonText={Utils.localizeMessage('general_tab.regenerate', 'Regenerate')}\n                />\n            );\n        } else if (this.props.canInviteTeamMembers) {\n            inviteSection = (\n                <SettingItemMin\n                    title={Utils.localizeMessage('general_tab.codeTitle', 'Invite Code')}\n                    describe={Utils.localizeMessage('general_tab.codeDesc', \"Click 'Edit' to regenerate Invite Code.\")}\n                    updateSection={this.handleUpdateSection}\n                    section={'invite_id'}\n                />\n            );\n        }\n\n        let nameSection;\n\n        if (this.props.activeSection === 'name') {\n            const inputs = [];\n\n            let teamNameLabel = (\n                <FormattedMessage\n                    id='general_tab.teamName'\n                    defaultMessage='Team Name'\n                />\n            );\n            if (Utils.isMobile()) {\n                teamNameLabel = '';\n            }\n\n            inputs.push(\n                <div\n                    key='teamNameSetting'\n                    className='form-group'\n                >\n                    <label className='col-sm-5 control-label'>{teamNameLabel}</label>\n                    <div className='col-sm-7'>\n                        <input\n                            id='teamName'\n                            autoFocus={true}\n                            className='form-control'\n                            type='text'\n                            maxLength={Constants.MAX_TEAMNAME_LENGTH.toString()}\n                            onChange={this.updateName}\n                            value={this.state.name}\n                            onFocus={Utils.moveCursorToEnd}\n                        />\n                    </div>\n                </div>,\n            );\n\n            const nameExtraInfo = <span>{Utils.localizeMessage('general_tab.teamNameInfo', 'Set the name of the team as it appears on your sign-in screen and at the top of the left-hand sidebar.')}</span>;\n\n            nameSection = (\n                <SettingItemMax\n                    title={Utils.localizeMessage('general_tab.teamName', 'Team Name')}\n                    inputs={inputs}\n                    submit={this.handleNameSubmit}\n                    serverError={serverError}\n                    clientError={clientError}\n                    updateSection={this.handleUpdateSection}\n                    extraInfo={nameExtraInfo}\n                />\n            );\n        } else {\n            var describe = this.state.name;\n\n            nameSection = (\n                <SettingItemMin\n                    title={Utils.localizeMessage('general_tab.teamName', 'Team Name')}\n                    describe={describe}\n                    updateSection={this.handleUpdateSection}\n                    section={'name'}\n                />\n            );\n        }\n\n        let descriptionSection;\n\n        if (this.props.activeSection === 'description') {\n            const inputs = [];\n\n            let teamDescriptionLabel = (\n                <FormattedMessage\n                    id='general_tab.teamDescription'\n                    defaultMessage='Team Description'\n                />\n            );\n            if (Utils.isMobile()) {\n                teamDescriptionLabel = '';\n            }\n\n            inputs.push(\n                <div\n                    key='teamDescriptionSetting'\n                    className='form-group'\n                >\n                    <label className='col-sm-5 control-label'>{teamDescriptionLabel}</label>\n                    <div className='col-sm-7'>\n                        <input\n                            id='teamDescription'\n                            autoFocus={true}\n                            className='form-control'\n                            type='text'\n                            maxLength={Constants.MAX_TEAMDESCRIPTION_LENGTH.toString()}\n                            onChange={this.updateDescription}\n                            value={this.state.description}\n                            onFocus={Utils.moveCursorToEnd}\n                        />\n                    </div>\n                </div>,\n            );\n\n            const descriptionExtraInfo = <span>{Utils.localizeMessage('general_tab.teamDescriptionInfo', 'Team description provides additional information to help users select the right team. Maximum of 50 characters.')}</span>;\n\n            descriptionSection = (\n                <SettingItemMax\n                    title={Utils.localizeMessage('general_tab.teamDescription', 'Team Description')}\n                    inputs={inputs}\n                    submit={this.handleDescriptionSubmit}\n                    serverError={serverError}\n                    clientError={clientError}\n                    updateSection={this.handleUpdateSection}\n                    extraInfo={descriptionExtraInfo}\n                />\n            );\n        } else {\n            let describemsg = '';\n            if (this.state.description) {\n                describemsg = this.state.description;\n            } else {\n                describemsg = (\n                    <FormattedMessage\n                        id='general_tab.emptyDescription'\n                        defaultMessage=\"Click 'Edit' to add a team description.\"\n                    />\n                );\n            }\n            descriptionSection = (\n                <SettingItemMin\n                    title={Utils.localizeMessage('general_tab.teamDescription', 'Team Description')}\n                    describe={describemsg}\n                    updateSection={this.handleUpdateSection}\n                    section={'description'}\n                />\n            );\n        }\n\n        let teamIconSection;\n        if (this.props.activeSection === 'team_icon') {\n            const helpText = (\n                <FormattedMarkdownMessage\n                    id={'setting_picture.help.team'}\n                    defaultMessage='Upload a team icon in BMP, JPG or PNG format.\\nSquare images with a solid background color are recommended.'\n                />\n            );\n            teamIconSection = (\n                <SettingPicture\n                    imageContext='team'\n                    title={Utils.localizeMessage('general_tab.teamIcon', 'Team Icon')}\n                    src={Utils.imageURLForTeam(team)}\n                    file={this.state.teamIconFile}\n                    serverError={this.state.serverError}\n                    clientError={this.state.clientError}\n                    loadingPicture={this.state.loadingIcon}\n                    submitActive={this.state.submitActive}\n                    updateSection={(e) => {\n                        this.updateSection('');\n                        e.preventDefault();\n                    }}\n                    onFileChange={this.updateTeamIcon}\n                    onSubmit={this.handleTeamIconSubmit}\n                    onRemove={this.handleTeamIconRemove}\n                    helpText={helpText}\n                />\n            );\n        } else {\n            let minMessage;\n\n            if (team.last_team_icon_update) {\n                minMessage = (\n                    <FormattedMessage\n                        id='general_tab.teamIconLastUpdated'\n                        defaultMessage='Image last updated {date}'\n                        values={{\n                            date: (\n                                <FormattedDate\n                                    value={new Date(team.last_team_icon_update)}\n                                    day='2-digit'\n                                    month='short'\n                                    year='numeric'\n                                />\n                            ),\n                        }}\n                    />\n                );\n            } else {\n                minMessage = Utils.isMobile() ? Utils.localizeMessage('general_tab.teamIconEditHintMobile', 'Click to upload an image') : Utils.localizeMessage('general_tab.teamIconEditHint', 'Click \\'Edit\\' to upload an image.');\n            }\n\n            teamIconSection = (\n                <SettingItemMin\n                    title={Utils.localizeMessage('general_tab.teamIcon', 'Team Icon')}\n                    describe={minMessage}\n                    section={'team_icon'}\n                    updateSection={this.handleUpdateSection}\n                />\n            );\n        }\n\n        let allowedDomainsSection;\n\n        if (this.props.activeSection === 'allowed_domains') {\n            const inputs = [];\n\n            inputs.push(\n                <div\n                    key='allowedDomainsSetting'\n                    className='form-group'\n                >\n                    <div className='col-sm-12'>\n                        <LocalizedInput\n                            id='allowedDomains'\n                            autoFocus={true}\n                            className='form-control'\n                            type='text'\n                            onChange={this.updateAllowedDomains}\n                            value={this.state.allowed_domains}\n                            onFocus={Utils.moveCursorToEnd}\n                            placeholder={{id: t('general_tab.AllowedDomainsExample'), defaultMessage: 'corp.mattermost.com, mattermost.org'}}\n                            aria-label={Utils.localizeMessage('general_tab.allowedDomains.ariaLabel', 'Allowed Domains')}\n                        />\n                    </div>\n                </div>,\n            );\n\n            const allowedDomainsInfo = <span>{Utils.localizeMessage('general_tab.AllowedDomainsInfo', 'Users can only join the team if their email matches a specific domain (e.g. \"mattermost.org\") or list of comma-separated domains (e.g. \"corp.mattermost.com, mattermost.org\").')}</span>;\n\n            allowedDomainsSection = (\n                <SettingItemMax\n                    title={Utils.localizeMessage('general_tab.allowedDomains', 'Allow only users with a specific email domain to join this team')}\n                    inputs={inputs}\n                    submit={this.handleAllowedDomainsSubmit}\n                    serverError={serverError}\n                    clientError={clientError}\n                    updateSection={this.handleUpdateSection}\n                    extraInfo={allowedDomainsInfo}\n                />\n            );\n        } else {\n            let describemsg = '';\n            if (this.state.allowed_domains) {\n                describemsg = this.state.allowed_domains;\n            } else {\n                describemsg = (\n                    <FormattedMessage\n                        id='general_tab.allowedDomainsEdit'\n                        defaultMessage=\"Click 'Edit' to add an email domain whitelist.\"\n                    />\n                );\n            }\n            allowedDomainsSection = (\n                <SettingItemMin\n                    title={Utils.localizeMessage('general_tab.allowedDomains', 'allowedDomains')}\n                    describe={describemsg}\n                    updateSection={this.handleUpdateSection}\n                    section={'allowed_domains'}\n                />\n            );\n        }\n\n        return (\n            <div>\n                <div className='modal-header'>\n                    <button\n                        id='closeButton'\n                        type='button'\n                        className='close'\n                        data-dismiss='modal'\n                        aria-label='Close'\n                        onClick={this.props.closeModal}\n                    >\n                        <span aria-hidden='true'>{'×'}</span>\n                    </button>\n                    <h4\n                        className='modal-title'\n                        ref='title'\n                    >\n                        <div className='modal-back'>\n                            <span onClick={this.props.collapseModal}>\n                                <BackIcon/>\n                            </span>\n                        </div>\n                        <FormattedMessage\n                            id='general_tab.title'\n                            defaultMessage='General Settings'\n                        />\n                    </h4>\n                </div>\n                <div\n                    ref='wrapper'\n                    className='user-settings'\n                >\n                    <h3 className='tab-header'>\n                        <FormattedMessage\n                            id='general_tab.title'\n                            defaultMessage='General Settings'\n                        />\n                    </h3>\n                    <div className='divider-dark first'/>\n                    {nameSection}\n                    <div className='divider-light'/>\n                    {descriptionSection}\n                    <div className='divider-light'/>\n                    {teamIconSection}\n                    {!team.group_constrained &&\n                        <>\n                            <div className='divider-light'/>\n                            {allowedDomainsSection}\n                        </>\n                    }\n                    <div className='divider-light'/>\n                    {openInviteSection}\n                    {!team.group_constrained &&\n                        <>\n                            <div className='divider-light'/>\n                            {inviteSection}\n                        </>\n                    }\n                    <div className='divider-dark'/>\n                </div>\n            </div>\n        );\n    }\n}\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getTeam, patchTeam, removeTeamIcon, setTeamIcon, regenerateTeamInviteId} from 'mattermost-redux/actions/teams';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\n\nimport TeamGeneralTab from './team_general_tab.jsx';\n\nfunction mapStateToProps(state, ownProps) {\n    const config = getConfig(state);\n    const maxFileSize = parseInt(config.MaxFileSize, 10);\n\n    const canInviteTeamMembers = haveITeamPermission(state, ownProps.team.id, Permissions.INVITE_USER);\n\n    return {\n        maxFileSize,\n        canInviteTeamMembers,\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            getTeam,\n            patchTeam,\n            regenerateTeamInviteId,\n            removeTeamIcon,\n            setTeamIcon,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamGeneralTab);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport GeneralTab from 'components/team_general_tab';\n\ntype Props = {\n    activeTab: string;\n    activeSection: string;\n    updateSection: (section: string) => void;\n    closeModal: () => void;\n    collapseModal: () => void;\n    team?: Record<string, unknown>;\n};\n\nconst TeamSettings = ({\n    activeTab = '',\n    activeSection = '',\n    updateSection,\n    closeModal,\n    collapseModal,\n    team,\n}: Props): JSX.Element | null => {\n    if (!team) {\n        return null;\n    }\n\n    let result;\n    switch (activeTab) {\n    case 'general':\n        result = (\n            <div>\n                <GeneralTab\n                    team={team}\n                    activeSection={activeSection}\n                    updateSection={updateSection}\n                    closeModal={closeModal}\n                    collapseModal={collapseModal}\n                />\n            </div>\n        );\n        break;\n    default:\n        result = (\n            <div/>\n        );\n        break;\n    }\n\n    return result;\n};\n\nexport default TeamSettings;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport TeamSettings from './team_settings';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        team: getCurrentTeam(state),\n    };\n}\n\nexport default connect(mapStateToProps)(TeamSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport $ from 'jquery';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport * as Utils from 'utils/utils.jsx';\nconst SettingsSidebar = React.lazy(() => import('components/settings_sidebar'));\n\nimport TeamSettings from 'components/team_settings';\n\ntype Props = {\n    onHide: () => void;\n    isCloud?: boolean;\n}\n\nexport type State = {\n    activeTab: string;\n    activeSection: string;\n    show: boolean;\n}\n\nexport default class TeamSettingsModal extends React.PureComponent<Props, State> {\n    modalBodyRef: React.RefObject<Modal>;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            activeTab: 'general',\n            activeSection: '',\n            show: true,\n        };\n\n        this.modalBodyRef = React.createRef();\n    }\n\n    updateTab = (tab: string) => {\n        this.setState({\n            activeTab: tab,\n            activeSection: '',\n        });\n    }\n\n    updateSection = (section: string) => {\n        this.setState({activeSection: section});\n    }\n\n    collapseModal = () => {\n        const el = ReactDOM.findDOMNode(this.modalBodyRef.current) as HTMLDivElement;\n        $(el).closest('.modal-dialog').removeClass('display--content'); // eslint-disable-line jquery/no-closest, jquery/no-class\n\n        this.setState({\n            activeTab: '',\n            activeSection: '',\n        });\n    }\n\n    handleHide = () => {\n        this.setState({show: false});\n    }\n\n    // called after the dialog is fully hidden and faded out\n    handleHidden = () => {\n        this.setState({\n            activeTab: 'general',\n            activeSection: '',\n        });\n        this.props.onHide();\n    }\n\n    render() {\n        const tabs = [];\n        tabs.push({name: 'general', uiName: Utils.localizeMessage('team_settings_modal.generalTab', 'General'), icon: 'icon fa fa-cog', iconTitle: Utils.localizeMessage('generic_icons.settings', 'Settings Icon')});\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal settings-modal settings-modal--action'\n                show={this.state.show}\n                onHide={this.handleHide}\n                onExited={this.handleHidden}\n                role='dialog'\n                aria-labelledby='teamSettingsModalLabel'\n                id='teamSettingsModal'\n            >\n                <Modal.Header\n                    id='teamSettingsModalLabel'\n                    closeButton={true}\n                >\n                    <Modal.Title componentClass='h1'>\n                        <FormattedMessage\n                            id='team_settings_modal.title'\n                            defaultMessage='Team Settings'\n                        />\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body ref={this.modalBodyRef}>\n                    <div className='settings-table'>\n                        <div className='settings-links'>\n                            <React.Suspense fallback={null}>\n                                <SettingsSidebar\n                                    tabs={tabs}\n                                    activeTab={this.state.activeTab}\n                                    updateTab={this.updateTab}\n                                />\n                            </React.Suspense>\n                        </div>\n                        <div className='settings-content minimize-settings'>\n                            <TeamSettings\n                                activeTab={this.state.activeTab}\n                                activeSection={this.state.activeSection}\n                                updateSection={this.updateSection}\n                                closeModal={this.handleHide}\n                                collapseModal={this.collapseModal}\n                            />\n                        </div>\n                    </div>\n                </Modal.Body>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport {GlobalState} from 'types/store';\n\nimport TeamSettingsModal from './team_settings_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n    const modalId = ModalIdentifiers.TEAM_SETTINGS;\n    return {\n        show: isModalOpen(state, modalId),\n        isCloud: getLicense(state).Cloud === 'true',\n    };\n}\n\nexport default connect(mapStateToProps)(TeamSettingsModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport LoadingScreen from 'components/loading_screen';\n\nexport const DEFAULT_NUM_PER_PAGE = 50;\n\nexport default class ListModal extends React.PureComponent {\n    static propTypes = {\n\n        /**\n         * loadItems is a function that receives the params (pageNumber, searchTerm) and should return an object\n         * with the shape {items: [], totalCount: 0}.\n         * items: an array of objects that are passed to each renderRow function.\n         * totalCount: an integer representing the total number of items as displayed in the pagination text.\n         *\n         * Example:\n         *     const loadItems = async (pageNumber, searchTerm) => {\n         *         const {data} = await loadFromServer(searchTerm, pageNumber, PER_PAGE);\n         *         return {\n         *             items: data.users,\n         *             totalCount: data.total,\n         *         };\n         *     };\n         */\n        loadItems: PropTypes.func.isRequired,\n\n        /**\n         * renderRow is a function that receives the params (item, listModal) and should return JSX.\n         * item: an object as returned by each entry in the loadItems function's 'items' array.\n         * listModal: the instance of the ListModal component class.\n         *\n         * Example:\n         *     const renderRow = (item, listModal) => <div>{item.id}</div>;\n         */\n        renderRow: PropTypes.func.isRequired,\n\n        /**\n         * onHide (optional) a function to be invoked when the modal is closed.\n         */\n        onHide: PropTypes.func,\n\n        /**\n         * titleText (optional) a string to show at the top bar of the modal.\n         */\n        titleText: PropTypes.string,\n\n        /**\n         * searchPlaceholderText (optional) a string to show as a placeholder in the search input.\n         */\n        searchPlaceholderText: PropTypes.string,\n\n        /**\n         * titleBarButtonText (optional) a string representing a title bar button text.\n         */\n        titleBarButtonText: PropTypes.string,\n\n        /**\n         * titleBarButtonOnClick (optional) a func to handle title button bar clicks.\n         */\n        titleBarButtonOnClick: PropTypes.func,\n\n        /**\n         * numPerPage (optional) a number setting how many items per page should be displayed. Defaults to\n         * DEFAULT_NUM_PER_PAGE.\n         */\n        numPerPage: PropTypes.number,\n\n        /**\n         * show (optional) a boolean setting to hide the modal via props rather then unmounting it.\n         */\n        show: PropTypes.bool,\n    };\n\n    static defaultProps = {\n        show: true,\n    };\n\n    constructor(props) {\n        super(props);\n\n        this.numPerPage = props.numPerPage || DEFAULT_NUM_PER_PAGE;\n\n        this.state = {\n            show: true,\n            page: 0,\n            items: [],\n            totalCount: 0,\n            loading: true,\n            searchTerm: '',\n        };\n    }\n\n    async componentDidMount() {\n        const {totalCount, items} = await this.props.loadItems(0, '');\n        this.setState({totalCount, items, loading: false}); // eslint-disable-line react/no-did-mount-set-state\n    }\n\n    handleHide = () => {\n        this.setState({show: false});\n    }\n\n    handleExit = () => {\n        if (this.props.onHide) {\n            this.props.onHide();\n        }\n    }\n\n    renderRows() {\n        if (this.state.loading) {\n            return (\n                <div>\n                    <LoadingScreen\n                        position='absolute'\n                        key='loading'\n                    />\n                </div>\n            );\n        }\n        return this.state.items.map((item) => (\n            this.props.renderRow(item, this)\n        ));\n    }\n\n    onNext = () => {\n        const nextPage = this.state.page + 1;\n        this.onPageChange(nextPage);\n    }\n\n    onPrev = () => {\n        const prevPage = this.state.page - 1;\n        this.onPageChange(prevPage);\n    }\n\n    onPageChange = async (page) => {\n        this.setState({loading: true});\n        const result = await this.props.loadItems(page, this.state.searchTerm);\n        this.setState({page, items: result.items, loading: false});\n    }\n\n    onSearchInput = async (event) => {\n        const {target} = event;\n        const searchTerm = target.value;\n        this.setState({loading: true, searchTerm});\n        const result = await this.props.loadItems(0, searchTerm);\n        const {items, totalCount} = result;\n        this.setState({loading: false, items, totalCount});\n    }\n\n    paginationRange() {\n        let startCount = (this.state.page * this.numPerPage) + 1;\n        const endCount = (startCount + this.state.items.length) - 1;\n        if (endCount === 0) {\n            startCount = 0;\n        }\n        return {startCount, endCount};\n    }\n\n    render() {\n        if (!this.props.show) {\n            return null;\n        }\n        const {endCount, startCount} = this.paginationRange();\n        return (\n            <div>\n                <Modal\n                    dialogClassName='a11y__modal more-modal more-modal--action'\n                    show={this.state.show}\n                    onHide={this.handleHide}\n                    onExited={this.handleExit}\n                >\n                    <Modal.Header closeButton={true}>\n                        <Modal.Title componentClass='h1'>\n                            <span className='name'>{this.props.titleText}</span>\n                        </Modal.Title>\n                        {this.props.titleBarButtonText && this.props.titleBarButtonOnClick &&\n                            <a\n                                className='btn btn-md btn-primary'\n                                href='#'\n                                onClick={this.props.titleBarButtonOnClick}\n                            >\n                                {this.props.titleBarButtonText}\n                            </a>}\n                    </Modal.Header>\n                    <Modal.Body>\n                        <div className='filtered-user-list'>\n                            <div className='filter-row'>\n                                <div className='col-xs-12'>\n                                    <label\n                                        className='hidden-label'\n                                        htmlFor='searchUsersInput'\n                                    >\n                                        {this.props.searchPlaceholderText}\n                                    </label>\n                                    <input\n                                        id='searchUsersInput'\n                                        className='form-control filter-textbox'\n                                        placeholder={this.props.searchPlaceholderText}\n                                        onChange={this.onSearchInput}\n                                    />\n                                </div>\n                                <div className='col-sm-12'>\n                                    <span className='member-count pull-left'>\n                                        <FormattedMessage\n                                            id='list_modal.paginatorCount'\n                                            defaultMessage='{startCount, number} - {endCount, number} of {total, number} total'\n                                            values={{\n                                                startCount,\n                                                endCount,\n                                                total: this.state.totalCount,\n                                            }}\n                                        />\n                                    </span>\n                                </div>\n                            </div>\n                            <div className='more-modal__list'>\n                                <div>\n                                    {this.renderRows()}\n                                </div>\n                            </div>\n                            <div className='filter-controls'>\n                                {this.state.page > 0 &&\n                                <button\n                                    onClick={this.onPrev}\n                                    className='btn btn-link filter-control filter-control__prev'\n                                >\n                                    <FormattedMessage\n                                        id='filtered_user_list.prev'\n                                        defaultMessage='Previous'\n                                    />\n                                </button>}\n                                {(this.state.items.length >= this.props.numPerPage) && endCount !== this.state.totalCount &&\n                                <button\n                                    onClick={this.onNext}\n                                    className='btn btn-link filter-control filter-control__next'\n                                >\n                                    <FormattedMessage\n                                        id='filtered_user_list.next'\n                                        defaultMessage='Next'\n                                    />\n                                </button>}\n                            </div>\n                        </div>\n                    </Modal.Body>\n                </Modal>\n            </div >\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage, injectIntl} from 'react-intl';\n\nimport {Groups} from 'mattermost-redux/constants';\n\nimport ConfirmModal from 'components/confirm_modal';\n\nimport AddGroupsToTeamModal from 'components/add_groups_to_team_modal';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {intlShape} from 'utils/react_intl';\n\nimport ListModal, {DEFAULT_NUM_PER_PAGE} from 'components/list_modal.jsx';\n\nimport DropdownIcon from 'components/widgets/icons/fa_dropdown_icon';\n\nimport groupsAvatar from 'images/groups-avatar.png';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport Menu from 'components/widgets/menu/menu';\n\nimport * as Utils from 'utils/utils.jsx';\n\nclass TeamGroupsManageModal extends React.PureComponent {\n    static propTypes = {\n        intl: intlShape.isRequired,\n        team: PropTypes.object.isRequired,\n        actions: PropTypes.shape({\n            getGroupsAssociatedToTeam: PropTypes.func.isRequired,\n            unlinkGroupSyncable: PropTypes.func.isRequired,\n            patchGroupSyncable: PropTypes.func.isRequired,\n            getMyTeamMembers: PropTypes.func.isRequired,\n            closeModal: PropTypes.func.isRequired,\n            openModal: PropTypes.func.isRequired,\n        }).isRequired,\n    };\n\n    state = {\n        showConfirmModal: false,\n        item: {member_count: 0},\n        listModal: null,\n    };\n\n    loadItems = async (pageNumber, searchTerm) => {\n        const {data} = await this.props.actions.getGroupsAssociatedToTeam(this.props.team.id, searchTerm, pageNumber, DEFAULT_NUM_PER_PAGE, true);\n\n        return {\n            items: data.groups,\n            totalCount: data.totalGroupCount,\n        };\n    };\n\n    handleDeleteCanceled = () => {\n        this.setState({showConfirmModal: false});\n    };\n\n    handleDeleteConfirmed = () => {\n        this.setState({showConfirmModal: false});\n        const {item, listModal} = this.state;\n        this.props.actions.unlinkGroupSyncable(item.id, this.props.team.id, Groups.SYNCABLE_TYPE_TEAM).then(async () => {\n            listModal.setState({loading: true});\n            const {items, totalCount} = await listModal.props.loadItems(listModal.setState.page, listModal.state.searchTerm);\n\n            listModal.setState({loading: false, items, totalCount});\n        });\n    };\n\n    onClickRemoveGroup = (item, listModal) => {\n        this.setState({showConfirmModal: true, item, listModal});\n    };\n\n    onClickConfirmRemoveGroup = (item, listModal) => this.props.actions.unlinkGroupSyncable(item.id, this.props.team.id, Groups.SYNCABLE_TYPE_TEAM).then(async () => {\n        listModal.setState({loading: true});\n        const {items, totalCount} = await listModal.props.loadItems(listModal.setState.page, listModal.state.searchTerm);\n        listModal.setState({loading: false, items, totalCount});\n    });\n\n    onHide = () => {\n        this.props.actions.closeModal(ModalIdentifiers.MANAGE_TEAM_GROUPS);\n    };\n\n    titleButtonOnClick = () => {\n        this.onHide();\n        this.props.actions.openModal({modalId: ModalIdentifiers.ADD_GROUPS_TO_TEAM, dialogType: AddGroupsToTeamModal});\n    };\n\n    setTeamMemberStatus = async (item, listModal, isTeamAdmin) => {\n        this.props.actions.patchGroupSyncable(item.id, this.props.team.id, Groups.SYNCABLE_TYPE_TEAM, {scheme_admin: isTeamAdmin}).then(async () => {\n            listModal.setState({loading: true});\n            const {items, totalCount} = await listModal.props.loadItems(listModal.setState.page, listModal.state.searchTerm);\n\n            this.props.actions.getMyTeamMembers();\n\n            listModal.setState({loading: false, items, totalCount});\n        });\n    };\n\n    renderRow = (item, listModal) => {\n        let title;\n        if (item.scheme_admin) {\n            title = Utils.localizeMessage('team_members_dropdown.teamAdmins', 'Team Admins');\n        } else {\n            title = Utils.localizeMessage('team_members_dropdown.teamMembers', 'Team Members');\n        }\n\n        return (\n            <div\n                key={item.id}\n                className='more-modal__row'\n            >\n                <img\n                    className='more-modal__image'\n                    src={groupsAvatar}\n                    alt='group picture'\n                    width='32'\n                    height='32'\n                />\n                <div className='more-modal__details'>\n                    <div className='more-modal__name'>{item.display_name} {'-'} {'&nbsp;'}\n                        <span className='more-modal__name_count'>\n                            <FormattedMessage\n                                id='numMembers'\n                                defaultMessage='{num, number} {num, plural, one {member} other {members}}'\n                                values={{\n                                    num: item.member_count,\n                                }}\n                            />\n                        </span>\n                    </div>\n                </div>\n                <div className='more-modal__actions'>\n                    <MenuWrapper>\n                        <button\n                            id={`teamGroupsDropdown_${item.display_name}`}\n                            className='dropdown-toggle theme color--link style--none'\n                            type='button'\n                            aria-expanded='true'\n                        >\n                            <span>{title} </span>\n                            <DropdownIcon/>\n                        </button>\n                        <Menu\n                            openLeft={true}\n                            ariaLabel={Utils.localizeMessage('team_members_dropdown.menuAriaLabel', 'Change the role of a team member')}\n                        >\n                            <Menu.ItemAction\n                                show={!item.scheme_admin}\n                                onClick={() => this.setTeamMemberStatus(item, listModal, true)}\n                                text={Utils.localizeMessage('team_members_dropdown.makeTeamAdmins', 'Make Team Admins')}\n                            />\n                            <Menu.ItemAction\n                                show={Boolean(item.scheme_admin)}\n                                onClick={() => this.setTeamMemberStatus(item, listModal, false)}\n                                text={Utils.localizeMessage('team_members_dropdown.makeTeamMembers', 'Make Team Members')}\n                            />\n                            <Menu.ItemAction\n                                onClick={() => this.onClickRemoveGroup(item, listModal)}\n                                text={Utils.localizeMessage('group_list_modal.removeGroupButton', 'Remove Group')}\n                            />\n                        </Menu>\n                    </MenuWrapper>\n                </div>\n            </div>\n        );\n    };\n\n    render() {\n        const {formatMessage} = this.props.intl;\n        const memberCount = this.state.item.member_count;\n        return (\n            <>\n                <ListModal\n                    show={!this.state.showConfirmModal}\n                    titleText={formatMessage({id: 'groups', defaultMessage: '{team} Groups'}, {team: this.props.team.display_name})}\n                    searchPlaceholderText={formatMessage({id: 'manage_team_groups_modal.search_placeholder', defaultMessage: 'Search groups'})}\n                    renderRow={this.renderRow}\n                    loadItems={this.loadItems}\n                    onHide={this.onHide}\n                    titleBarButtonText={formatMessage({id: 'group_list_modal.addGroupButton', defaultMessage: 'Add Groups'})}\n                    titleBarButtonOnClick={this.titleButtonOnClick}\n                />\n                <ConfirmModal\n                    show={this.state.showConfirmModal}\n                    title={formatMessage({id: 'remove_group_confirm_title', defaultMessage: 'Remove Group and {memberCount, number} {memberCount, plural, one {Member} other {Members}}'}, {memberCount})}\n                    message={formatMessage({id: 'remove_group_confirm_message', defaultMessage: '{memberCount, number} {memberCount, plural, one {member} other {members}} associated to this group will be removed from the team. Are you sure you wish to remove this group and {memberCount} {memberCount, plural, one {member} other {members}}?'}, {memberCount})}\n                    confirmButtonText={formatMessage({id: 'remove_group_confirm_button', defaultMessage: 'Yes, Remove Group and {memberCount, plural, one {Member} other {Members}}'}, {memberCount})}\n                    onConfirm={this.handleDeleteConfirmed}\n                    onCancel={this.handleDeleteCanceled}\n                />\n            </>\n        );\n    }\n}\n\nexport default injectIntl(TeamGroupsManageModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {getGroupsAssociatedToTeam, unlinkGroupSyncable, patchGroupSyncable} from 'mattermost-redux/actions/groups';\nimport {getMyTeamMembers} from 'mattermost-redux/actions/teams';\n\nimport {closeModal, openModal} from 'actions/views/modals';\n\nimport TeamGroupsManageModal from './team_groups_manage_modal';\n\nconst mapStateToProps = (state, ownProps) => {\n    return {\n        team: state.entities.teams.teams[ownProps.teamID],\n    };\n};\n\nconst mapDispatchToProps = (dispatch) => ({\n    actions: bindActionCreators({\n        getGroupsAssociatedToTeam,\n        closeModal,\n        openModal,\n        unlinkGroupSyncable,\n        patchGroupSyncable,\n        getMyTeamMembers,\n    }, dispatch),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamGroupsManageModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {injectIntl, FormattedMessage} from 'react-intl';\n\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport * as GlobalActions from 'actions/global_actions';\nimport {Constants, ModalIdentifiers} from 'utils/constants';\nimport {intlShape} from 'utils/react_intl';\nimport {cmdOrCtrlPressed, isKeyPressed} from 'utils/utils';\nimport {useSafeUrl} from 'utils/url';\nimport * as UserAgent from 'utils/user_agent';\nimport InvitationModal from 'components/invitation_modal';\n\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\nimport SystemPermissionGate from 'components/permissions_gates/system_permission_gate';\n\nimport LeaveTeamIcon from 'components/widgets/icons/leave_team_icon';\n\nimport LeaveTeamModal from 'components/leave_team_modal';\nimport UserSettingsModal from 'components/user_settings/modal';\nimport TeamMembersModal from 'components/team_members_modal';\nimport TeamSettingsModal from 'components/team_settings_modal';\nimport AboutBuildModal from 'components/about_build_modal';\nimport AddGroupsToTeamModal from 'components/add_groups_to_team_modal';\nimport MarketplaceModal from 'components/plugin_marketplace';\nimport UpgradeLink from 'components/widgets/links/upgrade_link';\n\nimport Menu from 'components/widgets/menu/menu';\nimport TeamGroupsManageModal from 'components/team_groups_manage_modal';\n\nimport withGetCloudSubscription from '../common/hocs/cloud/with_get_cloud_subscription';\n\nclass MainMenu extends React.PureComponent {\n    static propTypes = {\n        mobile: PropTypes.bool.isRequired,\n        id: PropTypes.string,\n        teamId: PropTypes.string,\n        teamName: PropTypes.string,\n        siteName: PropTypes.string,\n        currentUser: PropTypes.object,\n        appDownloadLink: PropTypes.string,\n        enableCommands: PropTypes.bool.isRequired,\n        enableCustomEmoji: PropTypes.bool.isRequired,\n        enableIncomingWebhooks: PropTypes.bool.isRequired,\n        enableOAuthServiceProvider: PropTypes.bool.isRequired,\n        enableOutgoingWebhooks: PropTypes.bool.isRequired,\n        canManageSystemBots: PropTypes.bool.isRequired,\n        canCreateOrDeleteCustomEmoji: PropTypes.bool.isRequired,\n        canManageIntegrations: PropTypes.bool.isRequired,\n        enablePluginMarketplace: PropTypes.bool.isRequired,\n        experimentalPrimaryTeam: PropTypes.string,\n        helpLink: PropTypes.string,\n        reportAProblemLink: PropTypes.string,\n        moreTeamsToJoin: PropTypes.bool.isRequired,\n        pluginMenuItems: PropTypes.arrayOf(PropTypes.object),\n        isMentionSearch: PropTypes.bool,\n        teamIsGroupConstrained: PropTypes.bool.isRequired,\n        isLicensedForLDAPGroups: PropTypes.bool,\n        showGettingStarted: PropTypes.bool.isRequired,\n        intl: intlShape.isRequired,\n        showNextStepsTips: PropTypes.bool,\n        isFreeTrial: PropTypes.bool,\n        daysLeftOnTrial: PropTypes.number,\n        isCloud: PropTypes.bool,\n        subscriptionStats: PropTypes.object,\n        firstAdminVisitMarketplaceStatus: PropTypes.bool,\n        globalHeaderEnabled: PropTypes.bool,\n        actions: PropTypes.shape({\n            openModal: PropTypes.func.isRequred,\n            showMentions: PropTypes.func,\n            showFlaggedPosts: PropTypes.func,\n            closeRightHandSide: PropTypes.func.isRequired,\n            closeRhsMenu: PropTypes.func.isRequired,\n            unhideNextSteps: PropTypes.func.isRequired,\n            getSubscriptionStats: PropTypes.func.isRequired,\n        }).isRequired,\n    };\n\n    static defaultProps = {\n        teamType: '',\n        mobile: false,\n        pluginMenuItems: [],\n    };\n\n    toggleShortcutsModal = (e) => {\n        e.preventDefault();\n        GlobalActions.toggleShortcutsModal();\n    }\n\n    async componentDidMount() {\n        document.addEventListener('keydown', this.handleKeyDown);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleKeyDown);\n    }\n\n    handleKeyDown = (e) => {\n        if (cmdOrCtrlPressed(e) && e.shiftKey && isKeyPressed(e, Constants.KeyCodes.A)) {\n            e.preventDefault();\n            this.props.actions.openModal({ModalId: ModalIdentifiers.USER_SETTINGS, dialogType: UserSettingsModal, dialogProps: {isContentProductSettings: true}});\n        }\n    }\n\n    handleEmitUserLoggedOutEvent = () => {\n        GlobalActions.emitUserLoggedOutEvent();\n    }\n\n    getFlagged = (e) => {\n        e.preventDefault();\n        this.props.actions.showFlaggedPosts();\n        this.props.actions.closeRhsMenu();\n    }\n\n    searchMentions = (e) => {\n        e.preventDefault();\n\n        if (this.props.isMentionSearch) {\n            this.props.actions.closeRightHandSide();\n        } else {\n            this.props.actions.closeRhsMenu();\n            this.props.actions.showMentions();\n        }\n    }\n\n    shouldShowUpgradeModal = () => {\n        const {subscriptionStats, isCloud} = this.props;\n\n        if (subscriptionStats?.is_paid_tier === 'true') { // eslint-disable-line camelcase\n            return false;\n        }\n        return isCloud && subscriptionStats?.remaining_seats <= 0;\n    }\n\n    render() {\n        const {currentUser, teamIsGroupConstrained, isLicensedForLDAPGroups, isFreeTrial, daysLeftOnTrial, isCloud} = this.props;\n\n        if (!currentUser) {\n            return null;\n        }\n\n        const pluginItems = this.props.pluginMenuItems.map((item) => {\n            return (\n                <Menu.ItemAction\n                    id={item.id + '_pluginmenuitem'}\n                    key={item.id + '_pluginmenuitem'}\n                    onClick={() => {\n                        if (item.action) {\n                            item.action();\n                        }\n                    }}\n                    text={item.text}\n                    icon={this.props.mobile && item.mobileIcon}\n                />\n            );\n        });\n\n        const someIntegrationEnabled = this.props.enableIncomingWebhooks || this.props.enableOutgoingWebhooks || this.props.enableCommands || this.props.enableOAuthServiceProvider || this.props.canManageSystemBots;\n        const showIntegrations = !this.props.mobile && someIntegrationEnabled && this.props.canManageIntegrations;\n\n        const {formatMessage} = this.props.intl;\n\n        const invitePeopleModal = (\n            <Menu.ItemToggleModalRedux\n                id='invitePeople'\n                modalId={ModalIdentifiers.INVITATION}\n                dialogType={InvitationModal}\n                text={formatMessage({\n                    id: 'navbar_dropdown.invitePeople',\n                    defaultMessage: 'Invite People',\n                })}\n                extraText={formatMessage({\n                    id: 'navbar_dropdown.invitePeopleExtraText',\n                    defaultMessage: 'Add people to the team',\n                })}\n                icon={this.props.mobile && <i className='fa fa-user-plus'/>}\n            />\n        );\n\n        return (this.props.globalHeaderEnabled && !this.props.mobile) ? (\n            <Menu\n                mobile={this.props.mobile}\n                id={this.props.id}\n                ariaLabel={formatMessage({id: 'navbar_dropdown.menuAriaLabel', defaultMessage: 'main menu'})}\n            >\n                <Menu.Group>\n                    <TeamPermissionGate\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.MANAGE_TEAM]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='addGroupsToTeam'\n                            show={teamIsGroupConstrained && isLicensedForLDAPGroups}\n                            modalId={ModalIdentifiers.ADD_GROUPS_TO_TEAM}\n                            dialogType={AddGroupsToTeamModal}\n                            text={formatMessage({id: 'navbar_dropdown.addGroupsToTeam', defaultMessage: 'Add Groups to Team'})}\n                            icon={this.props.mobile && <i className='fa fa-user-plus'/>}\n                        />\n                    </TeamPermissionGate>\n                    <TeamPermissionGate\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.ADD_USER_TO_TEAM, Permissions.INVITE_GUEST]}\n                    >\n                        {invitePeopleModal}\n                    </TeamPermissionGate>\n                    <TeamPermissionGate\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.MANAGE_TEAM]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='teamSettings'\n                            modalId={ModalIdentifiers.TEAM_SETTINGS}\n                            dialogType={TeamSettingsModal}\n                            text={formatMessage({id: 'navbar_dropdown.teamSettings', defaultMessage: 'Team Settings'})}\n                            icon={this.props.mobile && <i className='fa fa-globe'/>}\n                        />\n                    </TeamPermissionGate>\n                    <TeamPermissionGate\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.MANAGE_TEAM]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='manageGroups'\n                            show={teamIsGroupConstrained && isLicensedForLDAPGroups}\n                            modalId={ModalIdentifiers.MANAGE_TEAM_GROUPS}\n                            dialogProps={{\n                                teamID: this.props.teamId,\n                            }}\n                            dialogType={TeamGroupsManageModal}\n                            text={formatMessage({id: 'navbar_dropdown.manageGroups', defaultMessage: 'Manage Groups'})}\n                            icon={this.props.mobile && <i className='fa fa-user-plus'/>}\n                        />\n                    </TeamPermissionGate>\n                    <TeamPermissionGate\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.REMOVE_USER_FROM_TEAM, Permissions.MANAGE_TEAM_ROLES]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='manageMembers'\n                            modalId={ModalIdentifiers.TEAM_MEMBERS}\n                            dialogType={TeamMembersModal}\n                            text={formatMessage({id: 'navbar_dropdown.manageMembers', defaultMessage: 'Manage Members'})}\n                            icon={this.props.mobile && <i className='fa fa-users'/>}\n                        />\n                    </TeamPermissionGate>\n                    <TeamPermissionGate\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.REMOVE_USER_FROM_TEAM, Permissions.MANAGE_TEAM_ROLES]}\n                        invert={true}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='viewMembers'\n                            modalId={ModalIdentifiers.TEAM_MEMBERS}\n                            dialogType={TeamMembersModal}\n                            text={formatMessage({id: 'navbar_dropdown.viewMembers', defaultMessage: 'View Members'})}\n                            icon={this.props.mobile && <i className='fa fa-users'/>}\n                        />\n                    </TeamPermissionGate>\n                    <Menu.ItemLink\n                        id='joinTeam'\n                        show={!this.props.experimentalPrimaryTeam && this.props.moreTeamsToJoin}\n                        to='/select_team'\n                        text={formatMessage({id: 'navbar_dropdown.join', defaultMessage: 'Join Another Team'})}\n                        icon={this.props.mobile && <i className='fa fa-plus-square'/>}\n                    />\n                    <Menu.ItemToggleModalRedux\n                        id='leaveTeam'\n                        className='destructive'\n                        show={!teamIsGroupConstrained && this.props.experimentalPrimaryTeam !== this.props.teamName}\n                        modalId={ModalIdentifiers.LEAVE_TEAM}\n                        dialogType={LeaveTeamModal}\n                        text={formatMessage({id: 'navbar_dropdown.leave', defaultMessage: 'Leave Team'})}\n                        icon={this.props.mobile && <LeaveTeamIcon/>}\n                    />\n                </Menu.Group>\n                <Menu.Group>\n                    <SystemPermissionGate permissions={[Permissions.CREATE_TEAM]}>\n                        <Menu.ItemLink\n                            id='createTeam'\n                            to='/create_team'\n                            text={formatMessage({id: 'navbar_dropdown.create', defaultMessage: 'Create a Team'})}\n                            icon={this.props.mobile && <i className='fa fa-plus-square'/>}\n                        />\n                    </SystemPermissionGate>\n                </Menu.Group>\n            </Menu>\n        ) : (\n            <Menu\n                mobile={this.props.mobile}\n                id={this.props.id}\n                ariaLabel={formatMessage({id: 'navbar_dropdown.menuAriaLabel', defaultMessage: 'main menu'})}\n            >\n                {isCloud && isFreeTrial &&\n                    <Menu.Group>\n                        <SystemPermissionGate permissions={[Permissions.SYSCONSOLE_WRITE_BILLING]}>\n                            <Menu.TopNotification\n                                show={true}\n                                id='topNotification'\n                            >\n                                <FormattedMessage\n                                    id='admin.billing.subscription.cloudTrial.trialTopMenuNotification'\n                                    defaultMessage='There are {daysLeftOnTrial} days left on your Cloud trial.'\n                                    values={{daysLeftOnTrial}}\n                                />\n                                <UpgradeLink\n                                    buttonText='Subscribe Now'\n                                    styleLink={true}\n                                />\n                            </Menu.TopNotification>\n                        </SystemPermissionGate>\n                    </Menu.Group>\n                }\n                <Menu.Group>\n                    <Menu.ItemAction\n                        id='recentMentions'\n                        show={this.props.mobile}\n                        onClick={this.searchMentions}\n                        icon={this.props.mobile && <i className='mentions'>{'@'}</i>}\n                        text={formatMessage({id: 'sidebar_right_menu.recentMentions', defaultMessage: 'Recent Mentions'})}\n                    />\n                    <Menu.ItemAction\n                        id='flaggedPosts'\n                        show={this.props.mobile}\n                        onClick={this.getFlagged}\n                        icon={this.props.mobile && <i className='fa fa-bookmark'/>}\n                        text={formatMessage({id: 'sidebar_right_menu.flagged', defaultMessage: 'Saved Posts'})}\n                    />\n                </Menu.Group>\n                <Menu.Group>\n                    <SystemPermissionGate\n                        permissions={[Permissions.SYSCONSOLE_WRITE_ABOUT_EDITION_AND_LICENSE]}\n                    >\n                        <Menu.StartTrial\n                            id='startTrial'\n                        />\n                    </SystemPermissionGate>\n                </Menu.Group>\n                <Menu.Group>\n                    <Menu.ItemToggleModalRedux\n                        id='accountSettings'\n                        modalId={ModalIdentifiers.USER_SETTINGS}\n                        dialogType={UserSettingsModal}\n                        dialogProps={{isContentProductSettings: true}}\n                        text={formatMessage({id: 'navbar_dropdown.accountSettings', defaultMessage: 'Account Settings'})}\n                        icon={this.props.mobile && <i className='fa fa-cog'/>}\n                    />\n                </Menu.Group>\n                <Menu.Group>\n                    <TeamPermissionGate\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.MANAGE_TEAM]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='addGroupsToTeam'\n                            show={teamIsGroupConstrained && isLicensedForLDAPGroups}\n                            modalId={ModalIdentifiers.ADD_GROUPS_TO_TEAM}\n                            dialogType={AddGroupsToTeamModal}\n                            text={formatMessage({id: 'navbar_dropdown.addGroupsToTeam', defaultMessage: 'Add Groups to Team'})}\n                            icon={this.props.mobile && <i className='fa fa-user-plus'/>}\n                        />\n                    </TeamPermissionGate>\n                    <TeamPermissionGate\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.ADD_USER_TO_TEAM, Permissions.INVITE_GUEST]}\n                    >\n                        {invitePeopleModal}\n                    </TeamPermissionGate>\n                </Menu.Group>\n                <Menu.Group>\n                    <TeamPermissionGate\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.MANAGE_TEAM]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='teamSettings'\n                            modalId={ModalIdentifiers.TEAM_SETTINGS}\n                            dialogType={TeamSettingsModal}\n                            text={formatMessage({id: 'navbar_dropdown.teamSettings', defaultMessage: 'Team Settings'})}\n                            icon={this.props.mobile && <i className='fa fa-globe'/>}\n                        />\n                    </TeamPermissionGate>\n                    <TeamPermissionGate\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.MANAGE_TEAM]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='manageGroups'\n                            show={teamIsGroupConstrained && isLicensedForLDAPGroups}\n                            modalId={ModalIdentifiers.MANAGE_TEAM_GROUPS}\n                            dialogProps={{\n                                teamID: this.props.teamId,\n                            }}\n                            dialogType={TeamGroupsManageModal}\n                            text={formatMessage({id: 'navbar_dropdown.manageGroups', defaultMessage: 'Manage Groups'})}\n                            icon={this.props.mobile && <i className='fa fa-user-plus'/>}\n                        />\n                    </TeamPermissionGate>\n                    <TeamPermissionGate\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.REMOVE_USER_FROM_TEAM, Permissions.MANAGE_TEAM_ROLES]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='manageMembers'\n                            modalId={ModalIdentifiers.TEAM_MEMBERS}\n                            dialogType={TeamMembersModal}\n                            text={formatMessage({id: 'navbar_dropdown.manageMembers', defaultMessage: 'Manage Members'})}\n                            icon={this.props.mobile && <i className='fa fa-users'/>}\n                        />\n                    </TeamPermissionGate>\n                    <TeamPermissionGate\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.REMOVE_USER_FROM_TEAM, Permissions.MANAGE_TEAM_ROLES]}\n                        invert={true}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='viewMembers'\n                            modalId={ModalIdentifiers.TEAM_MEMBERS}\n                            dialogType={TeamMembersModal}\n                            text={formatMessage({id: 'navbar_dropdown.viewMembers', defaultMessage: 'View Members'})}\n                            icon={this.props.mobile && <i className='fa fa-users'/>}\n                        />\n                    </TeamPermissionGate>\n                </Menu.Group>\n                <Menu.Group>\n                    <SystemPermissionGate permissions={[Permissions.CREATE_TEAM]}>\n                        <Menu.ItemLink\n                            id='createTeam'\n                            to='/create_team'\n                            text={formatMessage({id: 'navbar_dropdown.create', defaultMessage: 'Create a Team'})}\n                            icon={this.props.mobile && <i className='fa fa-plus-square'/>}\n                        />\n                    </SystemPermissionGate>\n                    <Menu.ItemLink\n                        id='joinTeam'\n                        show={!this.props.experimentalPrimaryTeam && this.props.moreTeamsToJoin}\n                        to='/select_team'\n                        text={formatMessage({id: 'navbar_dropdown.join', defaultMessage: 'Join Another Team'})}\n                        icon={this.props.mobile && <i className='fa fa-plus-square'/>}\n                    />\n                    <Menu.ItemToggleModalRedux\n                        id='leaveTeam'\n                        show={!teamIsGroupConstrained && this.props.experimentalPrimaryTeam !== this.props.teamName}\n                        modalId={ModalIdentifiers.LEAVE_TEAM}\n                        dialogType={LeaveTeamModal}\n                        text={formatMessage({id: 'navbar_dropdown.leave', defaultMessage: 'Leave Team'})}\n                        icon={this.props.mobile && <LeaveTeamIcon/>}\n                    />\n                </Menu.Group>\n                <Menu.Group>\n                    {pluginItems}\n                </Menu.Group>\n                <Menu.Group>\n                    <Menu.ItemLink\n                        id='integrations'\n                        show={showIntegrations}\n                        to={'/' + this.props.teamName + '/integrations'}\n                        text={formatMessage({id: 'navbar_dropdown.integrations', defaultMessage: 'Integrations'})}\n                    />\n                    <TeamPermissionGate\n                        teamId={this.props.teamId}\n                        permissions={[Permissions.SYSCONSOLE_WRITE_PLUGINS]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='marketplaceModal'\n                            modalId={ModalIdentifiers.PLUGIN_MARKETPLACE}\n                            show={!this.props.mobile && this.props.enablePluginMarketplace}\n                            dialogType={MarketplaceModal}\n                            text={formatMessage({id: 'navbar_dropdown.marketplace', defaultMessage: 'Marketplace'})}\n                        />\n                    </TeamPermissionGate>\n                    <Menu.ItemLink\n                        id='customEmojis'\n                        show={!this.props.mobile && this.props.enableCustomEmoji && this.props.canCreateOrDeleteCustomEmoji}\n                        to={'/' + this.props.teamName + '/emoji'}\n                        text={formatMessage({id: 'navbar_dropdown.emoji', defaultMessage: 'Custom Emoji'})}\n                    />\n                </Menu.Group>\n                <Menu.Group>\n                    <SystemPermissionGate permissions={Permissions.SYSCONSOLE_READ_PERMISSIONS}>\n                        <Menu.ItemLink\n                            id='systemConsole'\n                            show={!this.props.mobile}\n                            to='/admin_console'\n                            text={formatMessage({id: 'navbar_dropdown.console', defaultMessage: 'System Console'})}\n                            icon={this.props.mobile && <i className='fa fa-wrench'/>}\n                        />\n                    </SystemPermissionGate>\n                </Menu.Group>\n                <Menu.Group>\n                    <Menu.ItemExternalLink\n                        id='helpLink'\n                        show={Boolean(this.props.helpLink)}\n                        url={this.props.helpLink}\n                        text={formatMessage({id: 'navbar_dropdown.help', defaultMessage: 'Help'})}\n                        icon={this.props.mobile && <i className='fa fa-question'/>}\n                    />\n                    <Menu.ItemAction\n                        id='gettingStarted'\n                        show={this.props.showGettingStarted}\n                        onClick={() => this.props.actions.unhideNextSteps()}\n                        text={formatMessage({id: this.props.showNextStepsTips ? 'sidebar_next_steps.tipsAndNextSteps' : 'navbar_dropdown.gettingStarted', defaultMessage: this.props.showNextStepsTips ? 'Tips & Next Steps' : 'Getting Started'})}\n                        icon={this.props.mobile && <i className={`icon ${this.props.showNextStepsTips ? 'icon-lightbulb-outline' : 'icon-play'}`}/>}\n                    />\n                    <Menu.ItemAction\n                        id='keyboardShortcuts'\n                        show={!this.props.mobile}\n                        onClick={this.toggleShortcutsModal}\n                        text={formatMessage({id: 'navbar_dropdown.keyboardShortcuts', defaultMessage: 'Keyboard Shortcuts'})}\n                    />\n                    <Menu.ItemExternalLink\n                        id='reportLink'\n                        show={Boolean(this.props.reportAProblemLink)}\n                        url={this.props.reportAProblemLink}\n                        text={formatMessage({id: 'navbar_dropdown.report', defaultMessage: 'Report a Problem'})}\n                        icon={this.props.mobile && <i className='fa fa-phone'/>}\n                    />\n                    <Menu.ItemExternalLink\n                        id='nativeAppLink'\n                        show={this.props.appDownloadLink && !UserAgent.isMobileApp()}\n                        url={useSafeUrl(this.props.appDownloadLink)}\n                        text={formatMessage({id: 'navbar_dropdown.nativeApps', defaultMessage: 'Download Apps'})}\n                        icon={this.props.mobile && <i className='fa fa-mobile'/>}\n                    />\n                    <Menu.ItemToggleModalRedux\n                        id='about'\n                        modalId={ModalIdentifiers.ABOUT}\n                        dialogType={AboutBuildModal}\n                        text={formatMessage({id: 'navbar_dropdown.about', defaultMessage: 'About {appTitle}'}, {appTitle: this.props.siteName || 'Mattermost'})}\n                        icon={this.props.mobile && <i className='fa fa-info'/>}\n                    />\n                </Menu.Group>\n                <Menu.Group>\n                    <Menu.ItemAction\n                        id='logout'\n                        onClick={this.handleEmitUserLoggedOutEvent}\n                        text={formatMessage({id: 'navbar_dropdown.logout', defaultMessage: 'Log Out'})}\n                        icon={this.props.mobile && <i className='fa fa-sign-out'/>}\n                    />\n                </Menu.Group>\n            </Menu>\n        );\n    }\n}\n\nexport default injectIntl(withGetCloudSubscription((MainMenu)));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {\n    getConfig,\n    getFirstAdminVisitMarketplaceStatus,\n    getLicense,\n    getSubscriptionStats as selectSubscriptionStats,\n} from 'mattermost-redux/selectors/entities/general';\nimport {\n    getMyTeams,\n    getJoinableTeamIds,\n    getCurrentTeam,\n} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {haveITeamPermission, haveICurrentTeamPermission, haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getSubscriptionStats} from 'mattermost-redux/actions/cloud';\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport {RHSStates, TrialPeriodDays} from 'utils/constants';\nimport {getRemainingDaysFromFutureTimestamp} from 'utils/utils.jsx';\n\nimport {unhideNextSteps} from 'actions/views/next_steps';\nimport {showMentions, showFlaggedPosts, closeRightHandSide, closeMenu as closeRhsMenu} from 'actions/views/rhs';\nimport {openModal} from 'actions/views/modals';\nimport {getRhsState} from 'selectors/rhs';\nimport {getGlobalHeaderEnabled} from 'selectors/global_header';\n\nimport {\n    showOnboarding,\n    showNextStepsTips,\n    showNextSteps,\n} from 'components/next_steps_view/steps';\n\nimport MainMenu from './main_menu.jsx';\n\nfunction mapStateToProps(state) {\n    const config = getConfig(state);\n    const currentTeam = getCurrentTeam(state);\n    const currentUser = getCurrentUser(state);\n\n    const appDownloadLink = config.AppDownloadLink;\n    const enableCommands = config.EnableCommands === 'true';\n    const enableCustomEmoji = config.EnableCustomEmoji === 'true';\n    const siteName = config.SiteName;\n    const enableIncomingWebhooks = config.EnableIncomingWebhooks === 'true';\n    const enableOAuthServiceProvider = config.EnableOAuthServiceProvider === 'true';\n    const enableOutgoingWebhooks = config.EnableOutgoingWebhooks === 'true';\n    const enablePluginMarketplace = config.PluginsEnabled === 'true' && config.EnableMarketplace === 'true';\n    const experimentalPrimaryTeam = config.ExperimentalPrimaryTeam;\n    const helpLink = config.HelpLink;\n    const reportAProblemLink = config.ReportAProblemLink;\n\n    let canCreateOrDeleteCustomEmoji = (haveISystemPermission(state, {permission: Permissions.CREATE_EMOJIS}) || haveISystemPermission(state, {permission: Permissions.DELETE_EMOJIS}));\n    if (!canCreateOrDeleteCustomEmoji) {\n        for (const team of getMyTeams(state)) {\n            if (haveITeamPermission(state, team.id, Permissions.CREATE_EMOJIS) || haveITeamPermission(state, team.id, Permissions.DELETE_EMOJIS)) {\n                canCreateOrDeleteCustomEmoji = true;\n\n                break;\n            }\n        }\n    }\n\n    const canManageTeamIntegrations = (haveICurrentTeamPermission(state, Permissions.MANAGE_SLASH_COMMANDS) || haveICurrentTeamPermission(state, Permissions.MANAGE_OAUTH) || haveICurrentTeamPermission(state, Permissions.MANAGE_INCOMING_WEBHOOKS) || haveICurrentTeamPermission(state, Permissions.MANAGE_OUTGOING_WEBHOOKS));\n    const canManageSystemBots = (haveISystemPermission(state, {permission: Permissions.MANAGE_BOTS}) || haveISystemPermission(state, {permission: Permissions.MANAGE_OTHERS_BOTS}));\n    const canManageIntegrations = canManageTeamIntegrations || canManageSystemBots;\n\n    const joinableTeams = getJoinableTeamIds(state);\n    const moreTeamsToJoin = joinableTeams && joinableTeams.length > 0;\n    const rhsState = getRhsState(state);\n    const isCloud = getLicense(state).Cloud === 'true';\n    const subscription = state.entities.cloud.subscription;\n    const isFreeTrial = subscription?.is_free_trial === 'true';\n    let daysLeftOnTrial = getRemainingDaysFromFutureTimestamp(subscription?.trial_end_at);\n    if (daysLeftOnTrial > TrialPeriodDays.TRIAL_MAX_DAYS) {\n        daysLeftOnTrial = TrialPeriodDays.TRIAL_MAX_DAYS;\n    }\n\n    return {\n        appDownloadLink,\n        enableCommands,\n        enableCustomEmoji,\n        canManageIntegrations,\n        enableIncomingWebhooks,\n        enableOAuthServiceProvider,\n        enableOutgoingWebhooks,\n        canManageSystemBots,\n        enablePluginMarketplace,\n        experimentalPrimaryTeam,\n        helpLink,\n        reportAProblemLink,\n        pluginMenuItems: state.plugins.components.MainMenu,\n        canCreateOrDeleteCustomEmoji,\n        moreTeamsToJoin,\n        siteName,\n        teamId: currentTeam.id,\n        teamName: currentTeam.name,\n        currentUser,\n        isMentionSearch: rhsState === RHSStates.MENTION,\n        teamIsGroupConstrained: Boolean(currentTeam.group_constrained),\n        isLicensedForLDAPGroups:\n            state.entities.general.license.LDAPGroups === 'true',\n        showGettingStarted: showOnboarding(state),\n        showNextStepsTips: showNextStepsTips(state),\n        isFreeTrial,\n        daysLeftOnTrial,\n        showNextSteps: showNextSteps(state),\n        isCloud,\n        subscriptionStats: selectSubscriptionStats(state), // subscriptionStats are loaded in actions/views/root\n        firstAdminVisitMarketplaceStatus: getFirstAdminVisitMarketplaceStatus(state),\n        globalHeaderEnabled: getGlobalHeaderEnabled(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            openModal,\n            showMentions,\n            showFlaggedPosts,\n            closeRightHandSide,\n            closeRhsMenu,\n            unhideNextSteps,\n            getSubscriptionStats,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MainMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Link} from 'react-router-dom';\nimport classNames from 'classnames';\nimport {CSSTransition} from 'react-transition-group';\n\nimport * as GlobalActions from 'actions/global_actions';\nimport {Constants} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\nimport MenuTutorialTip from 'components/tutorial/menu_tutorial_tip';\n\nimport MainMenu from 'components/main_menu';\n\ntype Action = {\n    openRhsMenu: () => void;\n}\n\ntype Props = {\n    isOpen: boolean;\n    teamDisplayName?: string;\n    showTutorialTip: boolean;\n    siteName?: string;\n    actions: Action;\n};\n\nconst ANIMATION_DURATION = 500;\n\nexport default class SidebarRightMenu extends React.PureComponent<Props> {\n    handleEmitUserLoggedOutEvent = () => {\n        GlobalActions.emitUserLoggedOutEvent();\n    }\n\n    render() {\n        let siteName = '';\n        if (this.props.siteName != null) {\n            siteName = this.props.siteName;\n        }\n        let teamDisplayName = siteName;\n        if (this.props.teamDisplayName) {\n            teamDisplayName = this.props.teamDisplayName;\n        }\n\n        let tutorialTip = null;\n        if (this.props.showTutorialTip) {\n            tutorialTip = <MenuTutorialTip onBottom={true}/>;\n            this.props.actions.openRhsMenu();\n        }\n\n        return (\n            <div\n                className={classNames('sidebar--menu', {'move--left': this.props.isOpen && Utils.isMobile()})}\n                id='sidebar-menu'\n            >\n                <div className='team__header theme'>\n                    <Link\n                        className='team__name'\n                        to={`/channels/${Constants.DEFAULT_CHANNEL}`}\n                    >\n                        {teamDisplayName}\n                    </Link>\n                </div>\n\n                <div className='nav-pills__container mobile-main-menu'>\n                    {tutorialTip}\n                    <CSSTransition\n                        in={this.props.isOpen && Utils.isMobile()}\n                        classNames='MobileRightSidebarMenu'\n                        enter={true}\n                        exit={true}\n                        mountOnEnter={true}\n                        unmountOnExit={true}\n                        timeout={{\n                            enter: ANIMATION_DURATION,\n                            exit: ANIMATION_DURATION,\n                        }}\n                    >\n                        <MainMenu mobile={true}/>\n                    </CSSTransition>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getInt} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {openMenu as openRhsMenu} from 'actions/views/rhs';\nimport {getIsRhsMenuOpen} from 'selectors/rhs';\nimport {Preferences, TutorialSteps} from 'utils/constants';\nimport {isMobile} from 'utils/utils.jsx';\n\nimport SidebarRightMenu from './sidebar_right_menu';\n\nfunction mapStateToProps(state) {\n    const config = getConfig(state);\n    const currentTeam = getCurrentTeam(state);\n\n    const enableTutorial = config.EnableTutorial === 'true';\n    const tutorialStep = getInt(state, Preferences.TUTORIAL_STEP, getCurrentUserId(state), TutorialSteps.FINISHED);\n\n    const siteName = config.SiteName;\n\n    return {\n        teamDisplayName: currentTeam && currentTeam.display_name,\n        isOpen: getIsRhsMenuOpen(state),\n        showTutorialTip: enableTutorial && isMobile() && tutorialStep === TutorialSteps.MENU_POPOVER,\n        siteName,\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            openRhsMenu,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SidebarRightMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage, WrappedComponentProps, injectIntl} from 'react-intl';\n\nimport {Theme} from 'mattermost-redux/types/themes';\nimport {setThemeDefaults} from 'mattermost-redux/utils/theme_utils';\n\nimport ModalStore from 'stores/modal_store.jsx';\nimport Constants from 'utils/constants';\n\nconst ActionTypes = Constants.ActionTypes;\n\ntype State = {\n    value: string;\n    inputError: React.ReactNode | null;\n    show: boolean;\n    callback: ((args: Theme) => void) | null;\n}\n\nclass ImportThemeModal extends React.PureComponent<WrappedComponentProps, State> {\n    public constructor(props: WrappedComponentProps) {\n        super(props);\n\n        this.state = {\n            value: '',\n            inputError: null,\n            show: false,\n            callback: null,\n        };\n    }\n\n    public componentDidMount() {\n        ModalStore.addModalListener(ActionTypes.TOGGLE_IMPORT_THEME_MODAL, this.updateShow);\n    }\n\n    public componentWillUnmount() {\n        ModalStore.removeModalListener(ActionTypes.TOGGLE_IMPORT_THEME_MODAL, this.updateShow);\n    }\n\n    private updateShow = (show: boolean, args: {callback: null}) => {\n        this.setState({\n            show,\n            callback: args.callback,\n        });\n    }\n\n    private handleSubmit = (e: React.MouseEvent<HTMLElement>) => {\n        e.preventDefault();\n\n        const text = this.state.value;\n\n        if (!ImportThemeModal.isInputValid(text)) {\n            this.setState({\n                inputError: (\n                    <FormattedMessage\n                        id='user.settings.import_theme.submitError'\n                        defaultMessage='Invalid format, please try copying and pasting in again.'\n                    />\n                ),\n            });\n            return;\n        }\n\n        /*\n         * index mapping of slack theme format (index => slack-property name)\n         *\n         * |-------|-------------------------|-------------------------|\n         * | index | Slack theme-property    | MM theme-property       |\n         * |-------|-------------------------|-------------------------|\n         * |   0   | Column BG               | sidebarBg               |\n         * |   1   | ???                     | sidebarHeaderBg         |\n         * |   2   | Active Item BG          | sidebarTextActiveBorder |\n         * |   3   | Active Item Text        | sidebarTextActiveColor  |\n         * |   4   | Hover Item BG           | sidebarTextHoverBg      |\n         * |   5   | Text Color              | sidebarText             |\n         * |   6   | Active Presence         | onlineIndicator         |\n         * |   7   | Mention Badge           | mentionBg               |\n         * |   8   | TOP-NAV BG              | --- (desktop only)      |\n         * |   9   | TOP-NAV Text            | --- (desktop only)      |\n         * |-------|-------------------------|-------------------------|\n         *\n         * values at index 8 + 9 are only for the desktop app\n         */\n\n        const [\n            sidebarBg, // 0\n            sidebarHeaderBg, // 1\n            sidebarTextActiveBorder, // 2\n            sidebarTextActiveColor, // 3\n            sidebarTextHoverBg, // 4\n            sidebarText, // 5\n            onlineIndicator, // 6\n            mentionBg, // 7\n        ] = text.split(',');\n\n        const theme = setThemeDefaults({\n            type: 'custom',\n            sidebarBg,\n            sidebarText,\n            sidebarUnreadText: sidebarText,\n            sidebarTextHoverBg,\n            sidebarTextActiveBorder,\n            sidebarTextActiveColor,\n            sidebarHeaderBg,\n            sidebarHeaderTextColor: sidebarText,\n            onlineIndicator,\n            mentionBg,\n        });\n\n        this.state.callback?.(theme as Theme);\n\n        this.setState({\n            show: false,\n            callback: null,\n        });\n    }\n\n    private static isInputValid(text: string) {\n        if (text.length === 0) {\n            return false;\n        }\n\n        if (text.indexOf(' ') !== -1) {\n            return false;\n        }\n\n        if (text.length > 0 && text.indexOf(',') === -1) {\n            return false;\n        }\n\n        if (text.length > 0) {\n            const colors = text.split(',');\n\n            if (colors.length !== 10) {\n                return false;\n            }\n\n            for (let i = 0; i < colors.length; i++) {\n                if (colors[i].length !== 7 && colors[i].length !== 4) {\n                    return false;\n                }\n\n                if (colors[i].charAt(0) !== '#') {\n                    return false;\n                }\n            }\n        }\n\n        return true;\n    }\n\n    handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n        const value = e.target.value;\n        this.setState({value});\n\n        if (ImportThemeModal.isInputValid(value)) {\n            this.setState({inputError: null});\n        } else {\n            this.setState({\n                inputError: (\n                    <FormattedMessage\n                        id='user.settings.import_theme.submitError'\n                        defaultMessage='Invalid format, please try copying and pasting in again.'\n                    />\n                ),\n            });\n        }\n    }\n\n    handleOnHide = () => {\n        this.setState({show: false});\n    }\n\n    render() {\n        return (\n            <span>\n                <Modal\n                    dialogClassName='a11y__modal'\n                    show={this.state.show}\n                    onHide={this.handleOnHide}\n                    role='dialog'\n                    aria-labelledby='importThemeModalLabel'\n                >\n                    <Modal.Header closeButton={true}>\n                        <Modal.Title\n                            componentClass='h1'\n                            id='importThemeModalLabel'\n                        >\n                            <FormattedMessage\n                                id='user.settings.import_theme.importHeader'\n                                defaultMessage='Import Slack Theme'\n                            />\n                        </Modal.Title>\n                    </Modal.Header>\n                    <form\n                        role='form'\n                        className='form-horizontal'\n                    >\n                        <Modal.Body>\n                            <p>\n                                <FormattedMessage\n                                    id='user.settings.import_theme.importBody'\n                                    defaultMessage='To import a theme, go to a Slack team and look for \"Preferences -> Themes\". Open the custom theme option, copy the theme color values and paste them here:'\n                                />\n                            </p>\n                            <div className='form-group less'>\n                                <div className='col-sm-12'>\n                                    <input\n                                        id='themeVector'\n                                        type='text'\n                                        className='form-control'\n                                        value={this.state.value}\n                                        onChange={this.handleChange}\n                                    />\n                                    <div className='input__help'>\n                                        {this.state.inputError}\n                                    </div>\n                                </div>\n                            </div>\n                        </Modal.Body>\n                        <Modal.Footer>\n                            <button\n                                id='cancelButton'\n                                type='button'\n                                className='btn btn-link'\n                                onClick={this.handleOnHide}\n                            >\n                                <FormattedMessage\n                                    id='user.settings.import_theme.cancel'\n                                    defaultMessage='Cancel'\n                                />\n                            </button>\n                            <button\n                                id='submitButton'\n                                onClick={this.handleSubmit}\n                                type='submit'\n                                className='btn btn-primary'\n                            >\n                                <FormattedMessage\n                                    id='user.settings.import_theme.submit'\n                                    defaultMessage='Submit'\n                                />\n                            </button>\n                        </Modal.Footer>\n                    </form>\n                </Modal>\n            </span>\n        );\n    }\n}\nexport default injectIntl(ImportThemeModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {GlobalState} from 'types/store';\n\nexport function getIsLhsOpen(state: GlobalState): boolean {\n    return state.views.lhs.isOpen;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {ContextMenu, ContextMenuTrigger, MenuItem} from 'react-contextmenu';\nimport {FormattedMessage} from 'react-intl';\n\ntype Props = {\n\n    /**\n     * The child component that will be right-clicked on to show the context menu\n     */\n    children: React.ReactNode;\n\n    /**\n     * The link to copy to the user's clipboard when the 'Copy' option is selected from the context menu\n     */\n    link: string;\n\n    /**\n     * A unique id differentiating this instance of context menu from others on the page\n     */\n    menuId: string;\n\n    siteURL?: string;\n\n    actions: {\n        copyToClipboard: (link: string) => void;\n    };\n}\n\nexport default class CopyUrlContextMenu extends React.PureComponent<Props> {\n    copy = () => {\n        let link = this.props.link;\n\n        // Transform relative links to absolute ones for copy and paste.\n        if (link.indexOf('http://') === -1 && link.indexOf('https://') === -1) {\n            link = this.props.siteURL + link;\n        }\n\n        this.props.actions.copyToClipboard(link);\n    }\n\n    render(): JSX.Element {\n        const contextMenu = (\n            <ContextMenu id={'copy-url-context-menu' + this.props.menuId}>\n                <MenuItem\n                    onClick={this.copy}\n                >\n                    <FormattedMessage\n                        id='copy_url_context_menu.getChannelLink'\n                        defaultMessage='Copy Link'\n                    />\n                </MenuItem>\n            </ContextMenu>\n        );\n\n        const contextMenuTrigger = (\n            <ContextMenuTrigger\n                id={'copy-url-context-menu' + this.props.menuId}\n                holdToDisplay={-1}\n            >\n                {this.props.children}\n            </ContextMenuTrigger>\n        );\n\n        return (\n            <span>\n                {contextMenu}\n                {contextMenuTrigger}\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {GlobalState} from 'types/store/index.js';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {copyToClipboard} from 'utils/utils';\n\nimport CopyUrlContextMenu from './copy_url_context_menu';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n\n    return {\n        siteURL: config.SiteURL,\n    };\n}\n\nfunction mapDispatchToProps() {\n    return {\n        actions: {\n            copyToClipboard,\n        },\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CopyUrlContextMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {injectIntl, IntlShape} from 'react-intl';\nimport {Link} from 'react-router-dom';\nimport {Draggable} from 'react-beautiful-dnd';\nimport classNames from 'classnames';\n\nimport {mark, trackEvent} from 'actions/telemetry_actions.jsx';\nimport Constants from 'utils/constants';\nimport {isDesktopApp} from 'utils/user_agent';\nimport {isMac, localizeMessage} from 'utils/utils.jsx';\nimport CopyUrlContextMenu from 'components/copy_url_context_menu';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport TeamIcon from '../../widgets/team_icon/team_icon';\n\ninterface Props {\n    btnClass?: string;\n    url: string;\n    displayName?: string;\n    content?: React.ReactNode;\n    tip: string | JSX.Element;\n    order?: number;\n    showOrder?: boolean;\n    active?: boolean;\n    disabled?: boolean;\n    unread?: boolean;\n    mentions?: number;\n    placement?: 'left' | 'right' | 'top' | 'bottom';\n    teamIconUrl?: string | null;\n    switchTeam: (url: string) => void;\n    intl: IntlShape;\n    isDraggable?: boolean;\n    teamIndex?: number;\n    teamId?: string;\n}\n\n// eslint-disable-next-line react/require-optimization\nclass TeamButton extends React.PureComponent<Props> {\n    handleSwitch = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n        e.preventDefault();\n        mark('TeamLink#click');\n        trackEvent('ui', 'ui_team_sidebar_switch_team');\n        this.props.switchTeam(this.props.url);\n    }\n\n    handleDisabled = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n        e.preventDefault();\n    }\n\n    render() {\n        const {teamIconUrl, displayName, btnClass, mentions, unread, isDraggable = false, teamIndex, teamId} = this.props;\n        const {formatMessage} = this.props.intl;\n\n        let teamClass: string = this.props.active ? 'active' : '';\n        const disabled: string = this.props.disabled ? 'team-disabled' : '';\n        const isNotCreateTeamButton: boolean = !this.props.url.endsWith('create_team') && !this.props.url.endsWith('select_team');\n        const handleClick = (this.props.active || this.props.disabled) ? this.handleDisabled : this.handleSwitch;\n\n        let badge: JSX.Element | undefined;\n\n        let ariaLabel = formatMessage({\n            id: 'team.button.ariaLabel',\n            defaultMessage: '{teamName} team',\n        },\n        {\n            teamName: displayName,\n        });\n\n        if (!teamClass) {\n            if (unread) {\n                teamClass = 'unread';\n\n                badge = (\n                    <span className={'unread-badge'}/>\n                );\n            } else if (isNotCreateTeamButton) {\n                teamClass = '';\n            } else {\n                teamClass = 'special';\n            }\n            ariaLabel = formatMessage({\n                id: 'team.button.unread.ariaLabel',\n                defaultMessage: '{teamName} team unread',\n            },\n            {\n                teamName: displayName,\n            });\n\n            if (mentions) {\n                ariaLabel = formatMessage({\n                    id: 'team.button.mentions.ariaLabel',\n                    defaultMessage: '{teamName} team, {mentionCount} mentions',\n                },\n                {\n                    teamName: displayName,\n                    mentionCount: mentions,\n                });\n\n                badge = (\n                    <span className={'badge badge-max-number pull-right small'}>{mentions > 99 ? '99+' : mentions}</span>\n                );\n            }\n        }\n\n        ariaLabel = ariaLabel.toLowerCase();\n\n        const content = (\n            <TeamIcon\n                className={teamClass}\n                withHover={true}\n                content={this.props.content || displayName || ''}\n                url={teamIconUrl}\n            />\n        );\n\n        let toolTip = this.props.tip || localizeMessage('team.button.name_undefined', 'This team does not have a name');\n        let orderIndicator: JSX.Element | undefined;\n        if (typeof this.props.order !== 'undefined' && this.props.order < 10) {\n            let toolTipHelp;\n            if (isMac()) {\n                toolTipHelp = formatMessage({\n                    id: 'team.button.tooltip.mac',\n                    defaultMessage: '⌘ ⌥ {order}',\n                },\n                {\n                    order: this.props.order,\n                });\n            } else {\n                toolTipHelp = formatMessage({\n                    id: 'team.button.tooltip',\n                    defaultMessage: 'Ctrl+Alt+{order}',\n                },\n                {\n                    order: this.props.order,\n                });\n            }\n\n            toolTip = (\n                <>\n                    {toolTip}\n                    <div className='tooltip-help'>{toolTipHelp}</div>\n                </>\n            );\n\n            if (this.props.showOrder) {\n                orderIndicator = (\n                    <div className='order-indicator'>\n                        {this.props.order}\n                    </div>\n                );\n            }\n        }\n\n        const btn = (\n            <OverlayTrigger\n                delayShow={Constants.OVERLAY_TIME_DELAY}\n                placement={this.props.placement}\n                overlay={\n                    <Tooltip id={`tooltip-${this.props.url}`}>\n                        {toolTip}\n                    </Tooltip>\n                }\n            >\n                <div className={'team-btn ' + btnClass}>\n                    {badge}\n                    {content}\n                </div>\n            </OverlayTrigger>\n        );\n\n        let teamButton = (\n            <Link\n                id={`${this.props.url.slice(1)}TeamButton`}\n                aria-label={ariaLabel}\n                className={disabled}\n                to={this.props.url}\n                onClick={handleClick}\n            >\n                {btn}\n            </Link>\n        );\n\n        if (isDesktopApp()) {\n            // if this is not a \"special\" team button, give it a context menu\n            if (isNotCreateTeamButton) {\n                teamButton = (\n                    <CopyUrlContextMenu\n                        link={this.props.url}\n                        menuId={this.props.url}\n                    >\n                        {teamButton}\n                    </CopyUrlContextMenu>\n                );\n            }\n        }\n\n        return isDraggable ? (\n            <Draggable\n                draggableId={teamId!}\n                index={teamIndex!}\n            >\n                {(provided, snapshot) => {\n                    return (\n                        <div\n                            className='draggable-team-container'\n                            ref={provided.innerRef}\n                            {...provided.draggableProps}\n                            {...provided.dragHandleProps}\n                        >\n                            <div\n\n                                className={classNames([`team-container ${teamClass}`, {isDragging: snapshot.isDragging}])}\n                            >\n                                {teamButton}\n                                {orderIndicator}\n                            </div>\n                        </div>\n                    );\n                }}\n            </Draggable>\n        ) : (\n            <div className={`team-container ${teamClass}`}>\n                {teamButton}\n                {orderIndicator}\n            </div>\n        );\n    }\n}\n\nexport default injectIntl(TeamButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport Scrollbars from 'react-custom-scrollbars';\nimport {FormattedMessage} from 'react-intl';\n\nimport classNames from 'classnames';\n\nimport {DragDropContext, Droppable, DroppableProvided, DropResult} from 'react-beautiful-dnd';\n\nimport {Dispatch} from 'redux';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nimport {Team, TeamMembership} from 'mattermost-redux/types/teams';\nimport {Dictionary} from 'mattermost-redux/types/utilities';\n\nimport {GenericAction, GetStateFunc} from 'mattermost-redux/types/actions';\n\nimport {Constants} from 'utils/constants.jsx';\nimport {filterAndSortTeamsByDisplayName} from 'utils/team_utils.jsx';\nimport * as Utils from 'utils/utils.jsx';\n\nimport SystemPermissionGate from 'components/permissions_gates/system_permission_gate';\nimport Pluggable from 'plugins/pluggable';\n\nimport {ThreadsState} from 'mattermost-redux/types/threads';\n\nimport TeamButton from './components/team_button';\n\ntype Actions = {\n    getTeams: (page?: number, perPage?: number, includeTotalCount?: boolean) => void;\n    switchTeam: (url: string) => (dispatch: Dispatch<GenericAction>, getState: GetStateFunc) => void;\n    updateTeamsOrderForUser: (teamIds: string[]) => (dispatch: Dispatch<GenericAction>, getState: GetStateFunc) => Promise<void>;\n}\n\ntype State = {\n    showOrder: boolean;\n    teamsOrder: Team[];\n}\n\ninterface Props {\n    myTeams: Team[];\n    collapsedThreads: boolean;\n    currentTeamId: string;\n    match: { url: string };\n    moreTeamsToJoin: boolean;\n    myTeamMembers: Dictionary<TeamMembership>;\n    isOpen: boolean;\n    experimentalPrimaryTeam?: string ;\n    locale: string;\n    actions: Actions;\n    userTeamsOrderPreference: string;\n    threadCounts: ThreadsState['counts'];\n}\n\nexport function renderView(props: Props) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--view'\n        />);\n}\n\nexport function renderThumbHorizontal(props: Props) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--horizontal'\n        />);\n}\n\nexport function renderThumbVertical(props: Props) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--vertical'\n        />);\n}\n\nexport default class TeamSidebar extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            showOrder: false,\n            teamsOrder: [],\n        };\n    }\n\n    switchToPrevOrNextTeam = (e: KeyboardEvent, currentTeamId: string, teams: Team[]) => {\n        if (Utils.isKeyPressed(e, Constants.KeyCodes.UP) || Utils.isKeyPressed(e, Constants.KeyCodes.DOWN)) {\n            e.preventDefault();\n            const delta = Utils.isKeyPressed(e, Constants.KeyCodes.DOWN) ? 1 : -1;\n            const pos = teams.findIndex((team: Team) => team.id === currentTeamId);\n            const newPos = pos + delta;\n\n            let team;\n            if (newPos === -1) {\n                team = teams[teams.length - 1];\n            } else if (newPos === teams.length) {\n                team = teams[0];\n            } else {\n                team = teams[newPos];\n            }\n\n            this.props.actions.switchTeam(`/${team.name}`);\n            return true;\n        }\n        return false;\n    }\n\n    switchToTeamByNumber = (e: KeyboardEvent, currentTeamId: string, teams: Team[]) => {\n        const digits = [\n            Constants.KeyCodes.ONE,\n            Constants.KeyCodes.TWO,\n            Constants.KeyCodes.THREE,\n            Constants.KeyCodes.FOUR,\n            Constants.KeyCodes.FIVE,\n            Constants.KeyCodes.SIX,\n            Constants.KeyCodes.SEVEN,\n            Constants.KeyCodes.EIGHT,\n            Constants.KeyCodes.NINE,\n            Constants.KeyCodes.ZERO,\n        ];\n\n        for (const idx in digits) {\n            if (Utils.isKeyPressed(e, digits[idx]) && parseInt(idx, 10) < teams.length) {\n                e.preventDefault();\n\n                // prevents reloading the current team, while still capturing the keyboard shortcut\n                if (teams[idx].id === currentTeamId) {\n                    return false;\n                }\n                const team = teams[idx];\n                this.props.actions.switchTeam(`/${team.name}`);\n                return true;\n            }\n        }\n        return false;\n    }\n\n    handleKeyDown = (e: KeyboardEvent) => {\n        if ((e.ctrlKey || e.metaKey) && e.altKey) {\n            const {currentTeamId} = this.props;\n            const teams = filterAndSortTeamsByDisplayName(this.props.myTeams, this.props.locale, this.props.userTeamsOrderPreference);\n\n            if (this.switchToPrevOrNextTeam(e, currentTeamId, teams)) {\n                return;\n            }\n\n            if (this.switchToTeamByNumber(e, currentTeamId, teams)) {\n                return;\n            }\n\n            this.setState({showOrder: true});\n        }\n    }\n\n    handleKeyUp = (e: KeyboardEvent) => {\n        if (!((e.ctrlKey || e.metaKey) && e.altKey)) {\n            this.setState({showOrder: false});\n        }\n    }\n\n    componentDidMount() {\n        this.props.actions.getTeams(0, 200);\n        document.addEventListener('keydown', this.handleKeyDown);\n        document.addEventListener('keyup', this.handleKeyUp);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleKeyDown);\n        document.removeEventListener('keyup', this.handleKeyUp);\n    }\n\n    onDragEnd = (result: DropResult) => {\n        const {\n            updateTeamsOrderForUser,\n        } = this.props.actions;\n\n        if (!result.destination) {\n            return;\n        }\n\n        const teams = filterAndSortTeamsByDisplayName(this.props.myTeams, this.props.locale, this.props.userTeamsOrderPreference);\n\n        const sourceIndex = result.source.index;\n        const destinationIndex = result.destination.index;\n\n        // Positioning the dropped Team button\n        const popElement = (list: Team[], idx: number) => {\n            return [...list.slice(0, idx), ...list.slice(idx + 1, list.length)];\n        };\n\n        const pushElement = (list: Team[], idx: number, itemId: string): Team[] => {\n            return [\n                ...list.slice(0, idx),\n                teams.find((team) => team.id === itemId),\n                ...list.slice(idx, list.length),\n            ];\n        };\n\n        const newTeamsOrder = pushElement(\n            popElement(teams, sourceIndex),\n            destinationIndex,\n            result.draggableId,\n        );\n        updateTeamsOrderForUser(newTeamsOrder.map((o: Team) => o.id));\n        this.setState({teamsOrder: newTeamsOrder});\n    }\n\n    render() {\n        const root: Element | null = document.querySelector('#root');\n        if (this.props.myTeams.length <= 1) {\n            root!.classList.remove('multi-teams');\n            return null;\n        }\n        root!.classList.add('multi-teams');\n\n        const plugins = [];\n        const sortedTeams = filterAndSortTeamsByDisplayName(this.props.myTeams, this.props.locale, this.props.userTeamsOrderPreference);\n\n        const teams = sortedTeams.map((team: Team, index: number) => {\n            const member = this.props.myTeamMembers[team.id];\n            return (\n                <TeamButton\n                    key={'switch_team_' + team.name}\n                    url={`/${team.name}`}\n                    tip={team.display_name}\n                    active={team.id === this.props.currentTeamId}\n                    displayName={team.display_name}\n                    unread={this.props.collapsedThreads ? (member.msg_count_root + this.props.threadCounts?.[team.id]?.total_unread_threads) > 0 : member.msg_count > 0}\n                    order={index + 1}\n                    showOrder={this.state.showOrder}\n                    mentions={this.props.collapsedThreads ? (member.mention_count_root + this.props.threadCounts?.[team.id]?.total_unread_mentions) : member.mention_count}\n                    teamIconUrl={Utils.imageURLForTeam(team)}\n                    switchTeam={this.props.actions.switchTeam}\n                    isDraggable={true}\n                    teamId={team.id}\n                    teamIndex={index}\n                />\n            );\n        });\n\n        const joinableTeams = [];\n\n        if (this.props.moreTeamsToJoin && !this.props.experimentalPrimaryTeam) {\n            joinableTeams.push(\n                <TeamButton\n                    btnClass='team-btn__add'\n                    key='more_teams'\n                    url='/select_team'\n                    tip={\n                        <FormattedMessage\n                            id='team_sidebar.join'\n                            defaultMessage='Other teams you can join'\n                        />\n                    }\n                    content={<i className='icon icon-plus'/>}\n                    switchTeam={this.props.actions.switchTeam}\n                />,\n            );\n        } else {\n            joinableTeams.push(\n                <SystemPermissionGate\n                    permissions={[Permissions.CREATE_TEAM]}\n                    key='more_teams'\n                >\n                    <TeamButton\n                        btnClass='team-btn__add'\n                        url='/create_team'\n                        tip={\n                            <FormattedMessage\n                                id='navbar_dropdown.create'\n                                defaultMessage='Create a Team'\n                            />\n                        }\n                        content={<i className='icon icon-plus'/>}\n                        switchTeam={this.props.actions.switchTeam}\n                    />\n                </SystemPermissionGate>,\n            );\n        }\n\n        plugins.push(\n            <div\n                key='team-sidebar-bottom-plugin'\n                className='team-sidebar-bottom-plugin is-empty'\n            >\n                <Pluggable pluggableName='BottomTeamSidebar'/>\n            </div>,\n        );\n\n        return (\n            <div\n                className={classNames('team-sidebar', {'move--right': this.props.isOpen})}\n                role='navigation'\n                aria-labelledby='teamSidebarWrapper'\n            >\n                <div\n                    className='team-wrapper'\n                    id='teamSidebarWrapper'\n                >\n                    <Scrollbars\n                        autoHide={true}\n                        autoHideTimeout={500}\n                        autoHideDuration={500}\n                        renderThumbHorizontal={renderThumbHorizontal}\n                        renderThumbVertical={renderThumbVertical}\n                        renderView={renderView}\n                    >\n                        <DragDropContext\n                            onDragEnd={this.onDragEnd}\n                        >\n                            <Droppable\n                                droppableId='my_teams'\n                                type='TEAM_BUTTON'\n                            >\n                                {(provided: DroppableProvided) => {\n                                    return (\n                                        <div\n                                            ref={provided.innerRef}\n                                            {...provided.droppableProps}\n                                        >\n                                            {teams}\n                                            {provided.placeholder}\n                                        </div>\n                                    );\n                                }}\n                            </Droppable>\n                        </DragDropContext>\n                        {joinableTeams}\n                    </Scrollbars>\n                </div>\n                {plugins}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {withRouter} from 'react-router-dom';\n\nimport {getTeams} from 'mattermost-redux/actions/teams';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {\n    getCurrentTeamId,\n    getJoinableTeamIds,\n    getMyTeams,\n    getTeamMemberships,\n} from 'mattermost-redux/selectors/entities/teams';\nimport {get, isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {ClientConfig} from 'mattermost-redux/types/config';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {getCurrentLocale} from 'selectors/i18n';\nimport {getIsLhsOpen} from 'selectors/lhs';\nimport {switchTeam, updateTeamsOrderForUser} from 'actions/team_actions.jsx';\nimport {Preferences} from 'utils/constants.jsx';\nimport {GlobalState} from 'types/store';\n\nimport {getThreadCounts} from 'mattermost-redux/selectors/entities/threads';\n\nimport TeamSidebar from './team_sidebar';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config: Partial<ClientConfig> = getConfig(state);\n\n    const experimentalPrimaryTeam: string | undefined = config.ExperimentalPrimaryTeam;\n    const joinableTeams: string[] = getJoinableTeamIds(state);\n    const moreTeamsToJoin: boolean = joinableTeams && joinableTeams.length > 0;\n\n    return {\n        currentTeamId: getCurrentTeamId(state),\n        myTeams: getMyTeams(state),\n        myTeamMembers: getTeamMemberships(state),\n        isOpen: getIsLhsOpen(state),\n        collapsedThreads: isCollapsedThreadsEnabled(state),\n        experimentalPrimaryTeam,\n        locale: getCurrentLocale(state),\n        moreTeamsToJoin,\n        userTeamsOrderPreference: get(state, Preferences.TEAMS_ORDER, '', ''),\n        threadCounts: getThreadCounts(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            getTeams,\n            switchTeam,\n            updateTeamsOrderForUser,\n        }, dispatch),\n    };\n}\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(TeamSidebar));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createCategory as createCategoryRedux, moveChannelsToCategory} from 'mattermost-redux/actions/channel_categories';\nimport {General} from 'mattermost-redux/constants';\nimport {CategoryTypes} from 'mattermost-redux/constants/channel_categories';\nimport {getCategory, makeGetChannelIdsForCategory} from 'mattermost-redux/selectors/entities/channel_categories';\nimport {getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels';\nimport {DispatchFunc, GetStateFunc} from 'mattermost-redux/types/actions';\nimport {insertMultipleWithoutDuplicates} from 'mattermost-redux/utils/array_utils';\n\nimport {getCategoriesForCurrentTeam, getChannelsInCategoryOrder, getDisplayedChannels} from 'selectors/views/channel_sidebar';\nimport {DraggingState, GlobalState} from 'types/store';\nimport {ActionTypes} from 'utils/constants';\n\nexport function setUnreadFilterEnabled(enabled: boolean) {\n    return {\n        type: ActionTypes.SET_UNREAD_FILTER_ENABLED,\n        enabled,\n    };\n}\n\nexport function setDraggingState(data: DraggingState) {\n    return {\n        type: ActionTypes.SIDEBAR_DRAGGING_SET_STATE,\n        data,\n    };\n}\n\nexport function stopDragging() {\n    return {type: ActionTypes.SIDEBAR_DRAGGING_STOP};\n}\n\nexport function createCategory(teamId: string, displayName: string, channelIds?: string[]) {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        if (channelIds) {\n            const state = getState() as GlobalState;\n            const multiSelectedChannelIds = state.views.channelSidebar.multiSelectedChannelIds;\n            channelIds.forEach((channelId) => {\n                if (multiSelectedChannelIds.indexOf(channelId) >= 0) {\n                    dispatch(multiSelectChannelAdd(channelId));\n                }\n            });\n        }\n\n        const result: any = await dispatch(createCategoryRedux(teamId, displayName, channelIds));\n        return dispatch({\n            type: ActionTypes.ADD_NEW_CATEGORY_ID,\n            data: result.data.id,\n        });\n    };\n}\n\n// addChannelsInSidebar moves channels to a given category without specifying the order in the sidebar, so the channels\n// will always go to the first position in the category\nexport function addChannelsInSidebar(categoryId: string, channelId: string) {\n    return moveChannelsInSidebar(categoryId, 0, channelId, false);\n}\n\n// moveChannelsInSidebar moves channels to a given category in the sidebar, but it accounts for when the target index\n// may have changed due to archived channels not being shown in the sidebar.\nexport function moveChannelsInSidebar(categoryId: string, targetIndex: number, draggableChannelId: string, setManualSorting = true) {\n    return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState() as GlobalState;\n        const multiSelectedChannelIds = state.views.channelSidebar.multiSelectedChannelIds;\n        let channelIds = [];\n\n        // Multi channel case\n        if (multiSelectedChannelIds.length && multiSelectedChannelIds.indexOf(draggableChannelId) !== -1) {\n            const categories = getCategoriesForCurrentTeam(state);\n            const displayedChannels = getDisplayedChannels(state);\n\n            let channelsToMove = [draggableChannelId];\n\n            // Filter out channels that can't go in the category specified\n            const targetCategory = categories.find((category) => category.id === categoryId);\n            channelsToMove = multiSelectedChannelIds.filter((channelId) => {\n                const selectedChannel = displayedChannels.find((channel) => channelId === channel.id);\n                const isDMGM = selectedChannel?.type === General.DM_CHANNEL || selectedChannel?.type === General.GM_CHANNEL;\n                return targetCategory?.type === CategoryTypes.CUSTOM || targetCategory?.type === CategoryTypes.FAVORITES || (isDMGM && targetCategory?.type === CategoryTypes.DIRECT_MESSAGES) || (!isDMGM && targetCategory?.type !== CategoryTypes.DIRECT_MESSAGES);\n            });\n\n            // Reorder such that the channels move in the order that they appear in the sidebar\n            const displayedChannelIds = displayedChannels.map((channel) => channel.id);\n            channelsToMove.sort((a, b) => displayedChannelIds.indexOf(a) - displayedChannelIds.indexOf(b));\n\n            // Remove selection from channels that were moved\n            channelsToMove.forEach((channelId) => dispatch(multiSelectChannelAdd(channelId)));\n            channelIds = channelsToMove;\n        } else {\n            channelIds = [draggableChannelId];\n        }\n\n        const newIndex = adjustTargetIndexForMove(state, categoryId, channelIds, targetIndex, draggableChannelId);\n        return dispatch(moveChannelsToCategory(categoryId, channelIds, newIndex, setManualSorting));\n    };\n}\n\nexport function adjustTargetIndexForMove(state: GlobalState, categoryId: string, channelIds: string[], targetIndex: number, draggableChannelId: string) {\n    if (targetIndex === 0) {\n        // The channel is being placed first, so there's nothing above that could affect the index\n        return 0;\n    }\n\n    const category = getCategory(state, categoryId);\n    const filteredChannelIds = makeGetChannelIdsForCategory()(state, category);\n\n    // When dragging multiple channels, we don't actually remove all of them from the list as react-beautiful-dnd doesn't support that\n    // Account for channels removed above the insert point, except the one currently being dragged which is already accounted for by react-beautiful-dnd\n    const removedChannelsAboveInsert = filteredChannelIds.filter((channel, index) => channel !== draggableChannelId && channelIds.indexOf(channel) !== -1 && index <= targetIndex);\n    const shiftedIndex = targetIndex - removedChannelsAboveInsert.length;\n\n    if (category.channel_ids.length === filteredChannelIds.length) {\n        // There are no archived channels in the category, so the shiftedIndex will be correct\n        return shiftedIndex;\n    }\n\n    const updatedChannelIds = insertMultipleWithoutDuplicates(filteredChannelIds, channelIds, shiftedIndex);\n\n    // After \"moving\" the channel in the sidebar, find what channel comes above it\n    const previousChannelId = updatedChannelIds[updatedChannelIds.indexOf(channelIds[0]) - 1];\n\n    // We want the channel to still be below that channel, so place the new index below it\n    let newIndex = category.channel_ids.indexOf(previousChannelId) + 1;\n\n    // If the channel is moving downwards, then the target index will need to be reduced by one to account for\n    // the channel being removed. For example, if we're moving channelA from [channelA, channelB, channelC] to\n    // [channelB, channelA, channelC], newIndex would currently be 2 (which comes after channelB), but we need\n    // it to be 1 (which comes after channelB once channelA is removed).\n    const sourceIndex = category.channel_ids.indexOf(channelIds[0]);\n    if (sourceIndex !== -1 && sourceIndex < newIndex) {\n        newIndex -= 1;\n    }\n\n    return Math.max(newIndex - removedChannelsAboveInsert.length, 0);\n}\n\nexport function clearChannelSelection() {\n    return (dispatch: DispatchFunc, getState: () => GlobalState) => {\n        const state = getState();\n\n        if (state.views.channelSidebar.multiSelectedChannelIds.length === 0) {\n            // No selection to clear\n            return Promise.resolve({data: true});\n        }\n\n        return dispatch({\n            type: ActionTypes.MULTISELECT_CHANNEL_CLEAR,\n        });\n    };\n}\n\nexport function multiSelectChannelAdd(channelId: string) {\n    return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState() as GlobalState;\n        const multiSelectedChannelIds = state.views.channelSidebar.multiSelectedChannelIds;\n\n        // Nothing already selected, so we include the active channel\n        if (!multiSelectedChannelIds.length) {\n            const currentChannel = getCurrentChannelId(state);\n            dispatch({\n                type: ActionTypes.MULTISELECT_CHANNEL,\n                data: currentChannel,\n            });\n        }\n\n        return dispatch({\n            type: ActionTypes.MULTISELECT_CHANNEL_ADD,\n            data: channelId,\n        });\n    };\n}\n\n// Much of this logic was pulled from the react-beautiful-dnd sample multiselect implementation\n// Found here: https://github.com/atlassian/react-beautiful-dnd/tree/master/stories/src/multi-drag\nexport function multiSelectChannelTo(channelId: string) {\n    return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState() as GlobalState;\n        const multiSelectedChannelIds = state.views.channelSidebar.multiSelectedChannelIds;\n        let lastSelected = state.views.channelSidebar.lastSelectedChannel;\n\n        // Nothing already selected, so start with the active channel\n        if (!multiSelectedChannelIds.length) {\n            const currentChannel = getCurrentChannelId(state);\n            dispatch({\n                type: ActionTypes.MULTISELECT_CHANNEL,\n                data: currentChannel,\n            });\n            lastSelected = currentChannel;\n        }\n\n        const allChannelsIdsInOrder = getChannelsInCategoryOrder(state).map((channel) => channel.id);\n        const indexOfNew: number = allChannelsIdsInOrder.indexOf(channelId);\n        const indexOfLast: number = allChannelsIdsInOrder.indexOf(lastSelected);\n\n        // multi selecting in the same column\n        // need to select everything between the last index and the current index inclusive\n\n        // nothing to do here\n        if (indexOfNew === indexOfLast) {\n            return null;\n        }\n\n        const start: number = Math.min(indexOfLast, indexOfNew);\n        const end: number = Math.max(indexOfLast, indexOfNew);\n\n        const inBetween = allChannelsIdsInOrder.slice(start, end + 1);\n\n        // everything inbetween needs to have it's selection toggled.\n        // with the exception of the start and end values which will always be selected\n\n        return dispatch({\n            type: ActionTypes.MULTISELECT_CHANNEL_TO,\n            data: inBetween,\n        });\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {ChannelCategory} from 'mattermost-redux/types/channel_categories';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport QuickInput, {MaxLengthInput} from 'components/quick_input';\nimport {localizeMessage} from 'utils/utils';\n\nimport '../category_modal.scss';\nimport GenericModal from 'components/generic_modal';\n\nconst MAX_LENGTH = 22;\n\ntype Props = {\n    onHide: () => void;\n    currentTeamId: string;\n    categoryId?: string;\n    initialCategoryName?: string;\n    channelIdsToAdd?: string[];\n    actions: {\n        createCategory: (teamId: string, displayName: string, channelIds?: string[] | undefined) => {data: ChannelCategory};\n        renameCategory: (categoryId: string, newName: string) => void;\n    };\n};\n\ntype State = {\n    categoryName: string;\n}\n\nexport default class EditCategoryModal extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            categoryName: props.initialCategoryName || '',\n        };\n    }\n\n    handleClear = () => {\n        this.setState({categoryName: ''});\n    }\n\n    handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n        this.setState({categoryName: e.target.value});\n    }\n\n    handleCancel = () => {\n        this.handleClear();\n    }\n\n    handleConfirm = () => {\n        if (this.props.categoryId) {\n            this.props.actions.renameCategory(this.props.categoryId, this.state.categoryName);\n        } else {\n            this.props.actions.createCategory(this.props.currentTeamId, this.state.categoryName, this.props.channelIdsToAdd);\n            trackEvent('ui', 'ui_sidebar_created_category');\n        }\n    }\n\n    isConfirmDisabled = () => {\n        return !this.state.categoryName ||\n            (Boolean(this.props.initialCategoryName) && this.props.initialCategoryName === this.state.categoryName) || this.state.categoryName.length > MAX_LENGTH;\n    }\n\n    getText = () => {\n        let modalHeaderText;\n        let editButtonText;\n        let helpText;\n\n        if (this.props.categoryId) {\n            modalHeaderText = (\n                <FormattedMessage\n                    id='rename_category_modal.renameCategory'\n                    defaultMessage='Rename Category'\n                />\n            );\n            editButtonText = (\n                <FormattedMessage\n                    id='rename_category_modal.rename'\n                    defaultMessage='Rename'\n                />\n            );\n        } else {\n            modalHeaderText = (\n                <FormattedMessage\n                    id='create_category_modal.createCategory'\n                    defaultMessage='Create New Category'\n                />\n            );\n            editButtonText = (\n                <FormattedMessage\n                    id='create_category_modal.create'\n                    defaultMessage='Create'\n                />\n            );\n            helpText = (\n                <FormattedMessage\n                    id='edit_category_modal.helpText'\n                    defaultMessage='Drag channels into this category to organize your sidebar.'\n                />\n            );\n        }\n\n        return {\n            modalHeaderText,\n            editButtonText,\n            helpText,\n        };\n    }\n\n    render() {\n        const {\n            modalHeaderText,\n            editButtonText,\n            helpText,\n        } = this.getText();\n\n        return (\n            <GenericModal\n                onHide={this.props.onHide}\n                modalHeaderText={modalHeaderText}\n                handleConfirm={this.handleConfirm}\n                handleCancel={this.handleCancel}\n                confirmButtonText={editButtonText}\n                isConfirmDisabled={this.isConfirmDisabled()}\n                id='editCategoryModal'\n            >\n                <QuickInput\n                    inputComponent={MaxLengthInput}\n                    autoFocus={true}\n                    className='form-control filter-textbox'\n                    type='text'\n                    value={this.state.categoryName}\n                    placeholder={localizeMessage('edit_category_modal.placeholder', 'Name your category')}\n                    clearable={true}\n                    onClear={this.handleClear}\n                    onChange={this.handleChange}\n                    maxLength={MAX_LENGTH}\n                />\n                {Boolean(helpText) && <span className='edit-category__helpText'>\n                    {helpText}\n                </span>}\n            </GenericModal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport {renameCategory} from 'mattermost-redux/actions/channel_categories';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {ActionFunc} from 'mattermost-redux/types/actions';\nimport {ChannelCategory} from 'mattermost-redux/types/channel_categories';\n\nimport {createCategory} from 'actions/views/channel_sidebar';\nimport {GlobalState} from 'types/store';\n\nimport EditCategoryModal from './edit_category_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n    const currentTeam = getCurrentTeam(state);\n\n    return {\n        currentTeamId: currentTeam.id,\n    };\n}\n\ntype Actions = {\n    createCategory: (teamId: string, displayName: string, channelIds?: string[] | undefined) => {data: ChannelCategory};\n    renameCategory: (categoryId: string, displayName: string) => void;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            createCategory,\n            renameCategory,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditCategoryModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ComponentProps, ReactNode} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\nimport {debounce, partition, differenceBy} from 'lodash';\nimport classNames from 'classnames';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {RelationOneToOne} from 'mattermost-redux/types/utilities';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {browserHistory} from 'utils/browser_history';\nimport Constants from 'utils/constants';\nimport {displayEntireNameForUser, localizeMessage, isGuest, isMobile} from 'utils/utils.jsx';\nimport MultiSelect, {Value} from 'components/multiselect/multiselect';\nimport ProfilePicture from 'components/profile_picture';\nimport AddIcon from 'components/widgets/icons/fa_add_icon';\nimport GuestBadge from 'components/widgets/badges/guest_badge';\nimport BotBadge from 'components/widgets/badges/bot_badge';\nimport Timestamp from 'components/timestamp';\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\n\nconst USERS_PER_PAGE = 50;\nconst MAX_SELECTABLE_VALUES = Constants.MAX_USERS_IN_GM - 1;\n\nexport const TIME_SPEC: ComponentProps<typeof Timestamp> = {\n    useTime: false,\n    style: 'long',\n    ranges: [\n        {within: ['minute', -1], display: ['second', 0]},\n        {within: ['hour', -1], display: ['minute']},\n        {within: ['hour', -24], display: ['hour']},\n        {within: ['day', -30], display: ['day']},\n        {within: ['month', -11], display: ['month']},\n        {within: ['year', -1000], display: ['year']},\n    ],\n};\n\nexport type GroupChannel = Channel & {profiles: UserProfile[]};\n\nfunction isGroupChannel(option: UserProfile | GroupChannel): option is GroupChannel {\n    return (option as GroupChannel)?.type === 'G';\n}\n\nexport type Option = (UserProfile | GroupChannel) & {last_post_at?: number};\nexport type OptionValue = Option & Value;\n\nfunction optionValue(option: Option): OptionValue {\n    return {\n        value: option.id,\n        label: isGroupChannel(option) ? option.display_name : option.username,\n        ...option,\n    };\n}\n\ntype Props = {\n    currentUserId: string;\n    currentTeamId: string;\n    currentTeamName: string;\n    searchTerm: string;\n    users: UserProfile[];\n    groupChannels: GroupChannel[];\n    myDirectChannels: Channel[];\n    recentDMUsers?: Array<UserProfile & {last_post_at: number }>;\n    statuses: RelationOneToOne<UserProfile, string>;\n    totalCount?: number;\n\n    /*\n    * List of current channel members of existing channel\n    */\n    currentChannelMembers: UserProfile[];\n\n    /*\n    * Whether the modal is for existing channel or not\n    */\n    isExistingChannel: boolean;\n\n    /*\n    * The mode by which direct messages are restricted, if at all.\n    */\n    restrictDirectMessage?: string;\n    onModalDismissed: () => void;\n    onHide?: () => void;\n    bodyOnly?: boolean;\n    actions: {\n        getProfiles: (page?: number | undefined, perPage?: number | undefined, options?: any) => Promise<any>;\n        getProfilesInTeam: (teamId: string, page: number, perPage?: number | undefined, sort?: string | undefined, options?: any) => Promise<any>;\n        loadStatusesByIds: (userIds: string[]) => void;\n        getTotalUsersStats: () => void;\n        loadStatusesForProfilesList: (users: any) => {\n            data: boolean;\n        };\n        loadProfilesForGroupChannels: (groupChannels: any) => void;\n        openDirectChannelToUserId: (userId: any) => Promise<any>;\n        openGroupChannelToUserIds: (userIds: any) => Promise<any>;\n        searchProfiles: (term: string, options?: any) => Promise<any>;\n        searchGroupChannels: (term: string) => Promise<any>;\n        setModalSearchTerm: (term: any) => GenericAction;\n    };\n}\n\ntype State = {\n    values: OptionValue[];\n    show: boolean;\n    search: boolean;\n    saving: boolean;\n    loadingUsers: boolean;\n}\n\nexport default class MoreDirectChannels extends React.PureComponent<Props, State> {\n    searchTimeoutId: any;\n    exitToChannel?: string;\n    multiselect: React.RefObject<MultiSelect<OptionValue>>;\n    selectedItemRef: React.RefObject<HTMLDivElement>;\n    constructor(props: Props) {\n        super(props);\n\n        this.searchTimeoutId = 0;\n        this.multiselect = React.createRef();\n        this.selectedItemRef = React.createRef();\n\n        const values: OptionValue[] = [];\n\n        if (props.currentChannelMembers) {\n            for (let i = 0; i < props.currentChannelMembers.length; i++) {\n                const user = Object.assign({}, props.currentChannelMembers[i]);\n\n                if (user.id === props.currentUserId) {\n                    continue;\n                }\n\n                values.push(optionValue(user));\n            }\n        }\n\n        this.state = {\n            values,\n            show: true,\n            search: false,\n            saving: false,\n            loadingUsers: true,\n        };\n    }\n\n    loadModalData = () => {\n        this.getUserProfiles();\n        this.props.actions.getTotalUsersStats();\n        this.loadProfilesMissingStatus(this.props.users, this.props.statuses);\n    }\n\n    updateFromProps(prevProps: Props) {\n        if (prevProps.searchTerm !== this.props.searchTerm) {\n            clearTimeout(this.searchTimeoutId);\n\n            const searchTerm = this.props.searchTerm;\n            if (searchTerm === '') {\n                this.resetPaging();\n            } else {\n                const teamId = this.props.restrictDirectMessage === 'any' ? '' : this.props.currentTeamId;\n\n                this.searchTimeoutId = setTimeout(\n                    async () => {\n                        this.setUsersLoadingState(true);\n                        const [{data: profilesData}, {data: groupChannelsData}] = await Promise.all([\n                            this.props.actions.searchProfiles(searchTerm, {team_id: teamId}),\n                            this.props.actions.searchGroupChannels(searchTerm),\n                        ]);\n                        if (profilesData) {\n                            this.props.actions.loadStatusesForProfilesList(profilesData);\n                        }\n                        if (groupChannelsData) {\n                            this.props.actions.loadProfilesForGroupChannels(groupChannelsData);\n                        }\n                        this.resetPaging();\n                        this.setUsersLoadingState(false);\n                    },\n                    Constants.SEARCH_TIMEOUT_MILLISECONDS,\n                );\n            }\n        }\n\n        if (\n            prevProps.users.length !== this.props.users.length ||\n            Object.keys(prevProps.statuses).length !== Object.keys(this.props.statuses).length\n        ) {\n            this.loadProfilesMissingStatus(this.props.users, this.props.statuses);\n        }\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        this.updateFromProps(prevProps);\n    }\n\n    public loadProfilesMissingStatus = (users: UserProfile[] = [], statuses: RelationOneToOne<UserProfile, string> = {}) => {\n        const missingStatusByIds = users.\n            filter((user) => !statuses[user.id]).\n            map((user) => user.id);\n\n        if (missingStatusByIds.length > 0) {\n            this.props.actions.loadStatusesByIds(missingStatusByIds);\n        }\n    }\n\n    handleHide = () => {\n        this.props.actions.setModalSearchTerm('');\n        this.setState({show: false});\n\n        if (this.props.bodyOnly) {\n            this.handleExit();\n        }\n    }\n\n    setUsersLoadingState = (loadingState: boolean) => {\n        this.setState({\n            loadingUsers: loadingState,\n        });\n    }\n\n    handleExit = () => {\n        if (this.exitToChannel) {\n            browserHistory.push(this.exitToChannel);\n        }\n\n        this.props.onModalDismissed?.();\n        this.props.onHide?.();\n    }\n\n    handleSubmit = (values = this.state.values) => {\n        const {actions} = this.props;\n        if (this.state.saving) {\n            return;\n        }\n\n        const userIds = values.map((v) => v.id);\n        if (userIds.length === 0) {\n            return;\n        }\n\n        this.setState({saving: true});\n\n        const done = (result: any) => {\n            const {data, error} = result;\n            this.setState({saving: false});\n\n            if (!error) {\n                this.exitToChannel = '/' + this.props.currentTeamName + '/channels/' + data.name;\n                this.handleHide();\n            }\n        };\n\n        if (userIds.length === 1) {\n            actions.openDirectChannelToUserId(userIds[0]).then(done);\n        } else {\n            actions.openGroupChannelToUserIds(userIds).then(done);\n        }\n    };\n\n    addValue = (value: OptionValue) => {\n        if (isGroupChannel(value)) {\n            this.addUsers(value.profiles);\n        } else {\n            const values = Object.assign([], this.state.values);\n\n            if (values.indexOf(value) === -1) {\n                values.push(value);\n            }\n\n            this.setState({values});\n        }\n    };\n\n    addUsers = (users: UserProfile[]) => {\n        const values: OptionValue[] = Object.assign([], this.state.values);\n        const existingUserIds = values.map((user) => user.id);\n        for (const user of users) {\n            if (existingUserIds.indexOf(user.id) !== -1) {\n                continue;\n            }\n            values.push(optionValue(user));\n        }\n\n        this.setState({values});\n    };\n\n    getUserProfiles = (page?: number) => {\n        const pageNum = page ? page + 1 : 0;\n        if (this.props.restrictDirectMessage === 'any') {\n            this.props.actions.getProfiles(pageNum, USERS_PER_PAGE * 2).then(() => {\n                this.setUsersLoadingState(false);\n            });\n        } else {\n            this.props.actions.getProfilesInTeam(this.props.currentTeamId, pageNum, USERS_PER_PAGE * 2).then(() => {\n                this.setUsersLoadingState(false);\n            });\n        }\n    }\n\n    handlePageChange = (page: number, prevPage: number) => {\n        if (page > prevPage) {\n            this.setUsersLoadingState(true);\n            this.getUserProfiles(page);\n        }\n    }\n\n    resetPaging = () => {\n        this.multiselect.current?.resetPaging();\n    }\n\n    search = debounce((term: string) => {\n        this.props.actions.setModalSearchTerm(term);\n    }, 250);\n\n    handleDelete = (values: OptionValue[]) => {\n        this.setState({values});\n    }\n\n    renderAriaLabel = (option: OptionValue) => {\n        return (option as UserProfile)?.username ?? '';\n    }\n    optionDisplayParts = (option: OptionValue): ReactNode => {\n        if (isGroupChannel(option)) {\n            return (\n                <>\n                    <div className='more-modal__gm-icon bg-text-200'>\n                        {option.profiles.length}\n                    </div>\n                    <div className='more-modal__details'>\n                        <div className='more-modal__name'>\n                            <span>\n                                {option.profiles.map((profile) => `@${profile.username}`).join(', ')}\n                            </span>\n                        </div>\n                    </div>\n                </>\n            );\n        }\n\n        const {\n            id,\n            delete_at: deleteAt,\n            is_bot: isBot = false,\n            last_picture_update: lastPictureUpdate,\n        } = option;\n\n        const displayName = displayEntireNameForUser(option);\n\n        let modalName: ReactNode = displayName;\n        if (option.id === this.props.currentUserId) {\n            modalName = (\n                <FormattedMessage\n                    id='more_direct_channels.directchannel.you'\n                    defaultMessage='{displayname} (you)'\n                    values={{\n                        displayname: displayName,\n                    }}\n                />\n            );\n        } else if (option.delete_at) {\n            modalName = (\n                <FormattedMessage\n                    id='more_direct_channels.directchannel.deactivated'\n                    defaultMessage='{displayname} - Deactivated'\n                    values={{\n                        displayname: displayName,\n                    }}\n                />\n            );\n        }\n\n        return (\n            <>\n                <ProfilePicture\n                    src={Client4.getProfilePictureUrl(id, lastPictureUpdate)}\n                    status={!deleteAt && !isBot ? this.props.statuses[id] : undefined}\n                    size='md'\n                />\n                <div className='more-modal__details'>\n                    <div className='more-modal__name'>\n                        {modalName}\n                        <BotBadge\n                            show={isBot}\n                            className='badge-popoverlist'\n                        />\n                        <GuestBadge\n                            show={isGuest(option)}\n                            className='badge-popoverlist'\n                        />\n                        <CustomStatusEmoji\n                            userID={option.id}\n                            showTooltip={true}\n                            emojiSize={15}\n                        />\n                    </div>\n                    {!isBot && (\n                        <div className='more-modal__description'>\n                            {option.email}\n                        </div>\n                    )}\n                </div>\n            </>\n        );\n    }\n\n    renderValue(props: {data: OptionValue}) {\n        return (props.data as UserProfile).username;\n    }\n\n    handleSubmitImmediatelyOn = (value: OptionValue) => {\n        return value.id === this.props.currentUserId || Boolean(value.delete_at);\n    }\n\n    note = (): ReactNode => {\n        let note;\n        if (this.props.currentChannelMembers) {\n            if (this.state.values && this.state.values.length >= MAX_SELECTABLE_VALUES) {\n                note = (\n                    <FormattedMessage\n                        id='more_direct_channels.new_convo_note.full'\n                        defaultMessage={'You\\'ve reached the maximum number of people for this conversation. Consider creating a private channel instead.'}\n                    />\n                );\n            } else if (this.props.isExistingChannel) {\n                note = (\n                    <FormattedMessage\n                        id='more_direct_channels.new_convo_note'\n                        defaultMessage={'This will start a new conversation. If you\\'re adding a lot of people, consider creating a private channel instead.'}\n                    />\n                );\n            }\n        }\n        return note;\n    }\n\n    renderOptionValue = (\n        option: OptionValue,\n        isSelected: boolean,\n        add: (value: OptionValue) => void,\n        select: (value: OptionValue) => void,\n    ) => {\n        const {id, last_post_at: lastPostAt} = option;\n\n        return (\n            <div\n                key={id}\n                ref={isSelected ? this.selectedItemRef : option.id}\n                className={classNames('more-modal__row clickable', {'more-modal__row--selected': isSelected})}\n                onClick={() => add(option)}\n                onMouseEnter={() => select(option)}\n            >\n                {this.optionDisplayParts(option)}\n\n                {!isMobile() && Boolean(lastPostAt) &&\n                    <div className='more-modal__lastPostAt'>\n                        <Timestamp\n                            {...TIME_SPEC}\n                            value={lastPostAt}\n                        />\n                    </div>\n                }\n\n                <div className='more-modal__actions'>\n                    <div className='more-modal__actions--round'>\n                        <AddIcon/>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n\n    computeOptions = (): Option[] => {\n        const {\n            currentUserId,\n            searchTerm,\n            myDirectChannels,\n            recentDMUsers = [],\n        } = this.props;\n\n        const {values} = this.state;\n\n        const [activeUsers, inactiveUsers] = partition(this.props.users, ({delete_at: deleteAt}) => deleteAt === 0);\n\n        const groupChannelsWithAvailableProfiles = this.props.groupChannels.filter(({profiles}) => differenceBy(profiles, values, 'id').length);\n        const [recentGroupChannels, groupChannels] = partition(groupChannelsWithAvailableProfiles, 'last_post_at');\n\n        let users = values.length ? activeUsers.filter(({id}) => id !== currentUserId) : activeUsers.concat(inactiveUsers);\n\n        users = users.filter((user) => (\n            (user.delete_at === 0 || myDirectChannels.some(({name}) => name.includes(user.id))) &&\n            !recentDMUsers.some(({id}) => id === user.id)\n        ));\n\n        const recent = [\n            ...values.length ? recentDMUsers.filter(({id}) => id !== currentUserId) : recentDMUsers,\n            ...recentGroupChannels,\n        ].sort((a, b) => b.last_post_at - a.last_post_at);\n\n        if (recent.length && !searchTerm) {\n            return recent.slice(0, 20);\n        }\n\n        return [\n            ...recent,\n            ...users,\n            ...groupChannels,\n        ];\n    }\n\n    render() {\n        const {bodyOnly} = this.props;\n        const {values} = this.state;\n\n        const buttonSubmitText = localizeMessage('multiselect.go', 'Go');\n        const buttonSubmitLoadingText = localizeMessage('multiselect.loading', 'Loading..');\n\n        const numRemainingText = (\n            <FormattedMessage\n                id='multiselect.numPeopleRemaining'\n                defaultMessage='Use ↑↓ to browse, ↵ to select. You can add {num, number} more {num, plural, one {person} other {people}}. '\n                values={{\n                    num: MAX_SELECTABLE_VALUES - values.length,\n                }}\n            />\n        );\n\n        const body = (\n            <MultiSelect<OptionValue>\n                key='moreDirectChannelsList'\n                ref={this.multiselect}\n                options={this.computeOptions().map(optionValue)}\n                optionRenderer={this.renderOptionValue}\n                selectedItemRef={this.selectedItemRef}\n                values={this.state.values}\n                valueRenderer={this.renderValue}\n                ariaLabelRenderer={this.renderAriaLabel}\n                perPage={USERS_PER_PAGE}\n                handlePageChange={this.handlePageChange}\n                handleInput={this.search}\n                handleDelete={this.handleDelete}\n                handleAdd={this.addValue}\n                handleSubmit={this.handleSubmit}\n                noteText={this.note()}\n                maxValues={MAX_SELECTABLE_VALUES}\n                numRemainingText={numRemainingText}\n                buttonSubmitText={buttonSubmitText}\n                buttonSubmitLoadingText={buttonSubmitLoadingText}\n                submitImmediatelyOn={this.handleSubmitImmediatelyOn}\n                saving={this.state.saving}\n                loading={this.state.loadingUsers}\n                users={this.props.users}\n                totalCount={this.props.totalCount}\n                placeholderText={localizeMessage('multiselect.placeholder', 'Search and add members')}\n            />\n        );\n\n        if (bodyOnly) {\n            return body;\n        }\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal more-modal more-direct-channels'\n                show={this.state.show}\n                onHide={this.handleHide}\n                onExited={this.handleExit}\n                onEntered={this.loadModalData}\n                role='dialog'\n                aria-labelledby='moreDmModalLabel'\n                id='moreDmModal'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='moreDmModalLabel'\n                    >\n                        <FormattedMessage\n                            id='more_direct_channels.title'\n                            defaultMessage='Direct Messages'\n                        />\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body\n                    role='application'\n                >\n                    {body}\n                </Modal.Body>\n                <Modal.Footer className='modal-footer--invisible'>\n                    <button\n                        id='closeModalButton'\n                        type='button'\n                        className='btn btn-link'\n                    >\n                        <FormattedMessage\n                            id='general_button.close'\n                            defaultMessage='Close'\n                        />\n                    </button>\n                </Modal.Footer>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ComponentProps} from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators, ActionCreatorsMapObject, Dispatch} from 'redux';\n\nimport {intersectionBy} from 'lodash';\n\nimport {\n    getProfiles,\n    getProfilesInTeam,\n    getTotalUsersStats,\n    searchProfiles,\n} from 'mattermost-redux/actions/users';\nimport {searchGroupChannels} from 'mattermost-redux/actions/channels';\nimport {\n    getCurrentUserId,\n    getProfiles as selectProfiles,\n    getProfilesInCurrentChannel,\n    getProfilesInCurrentTeam,\n    makeSearchProfilesStartingWithTerm,\n    searchProfilesInCurrentTeam,\n    getTotalUsersStats as getTotalUsersStatsSelector,\n    getUser,\n} from 'mattermost-redux/selectors/entities/users';\n\nimport {getChannelsWithUserProfiles, getAllChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getUserIdFromChannelName} from 'mattermost-redux/utils/channel_utils';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {sortByUsername, filterProfilesStartingWithTerm} from 'mattermost-redux/utils/user_utils';\nimport {memoizeResult} from 'mattermost-redux/utils/helpers';\n\nimport {Constants} from 'utils/constants';\nimport {openDirectChannelToUserId, openGroupChannelToUserIds} from 'actions/channel_actions';\nimport {loadStatusesForProfilesList, loadStatusesByIds} from 'actions/status_actions.jsx';\nimport {loadProfilesForGroupChannels} from 'actions/user_actions.jsx';\nimport {setModalSearchTerm} from 'actions/views/search';\n\nimport {GlobalState} from 'types/store';\n\nimport MoreDirectChannels, {GroupChannel} from './more_direct_channels';\n\ntype OwnProps = {\n    isExistingChannel: boolean;\n}\n\ntype Props = ComponentProps<typeof MoreDirectChannels>;\n\nconst makeMapStateToProps = () => {\n    const searchProfilesStartingWithTerm = makeSearchProfilesStartingWithTerm();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        const currentUserId = getCurrentUserId(state);\n        let currentChannelMembers: UserProfile[] = [];\n        if (ownProps.isExistingChannel) {\n            currentChannelMembers = getProfilesInCurrentChannel(state);\n        }\n\n        const config = getConfig(state);\n        const restrictDirectMessage = config.RestrictDirectMessage;\n\n        const searchTerm = state.views.search.modalSearch;\n\n        let users: UserProfile[];\n        if (searchTerm) {\n            if (restrictDirectMessage === 'any') {\n                users = searchProfilesStartingWithTerm(state, searchTerm, false);\n            } else {\n                users = searchProfilesInCurrentTeam(state, searchTerm, false);\n            }\n        } else if (restrictDirectMessage === 'any') {\n            users = selectProfiles(state, {});\n        } else {\n            users = getProfilesInCurrentTeam(state);\n        }\n\n        const filteredGroupChannels = filterGroupChannels(getChannelsWithUserProfiles(state), searchTerm);\n        const myDirectChannels = filterDirectChannels(getAllChannels(state), currentUserId);\n\n        let recentDMUsers = myDirectChannels.reduce((results, channel) => {\n            if (!channel.last_post_at) {\n                return results;\n            }\n\n            const user = getUser(state, getUserIdFromChannelName(currentUserId, channel.name));\n\n            if (user) {\n                results!.push({...user, last_post_at: channel.last_post_at});\n            }\n\n            return results;\n        }, [] as Props['recentDMUsers']);\n\n        if (searchTerm) {\n            recentDMUsers = intersectionBy(recentDMUsers, users, 'id');\n        }\n        const team = getCurrentTeam(state);\n        const stats = getTotalUsersStatsSelector(state) || {total_users_count: 0};\n\n        return {\n            currentTeamId: team.id,\n            currentTeamName: team.name,\n            searchTerm,\n            users: users.sort(sortByUsername),\n            myDirectChannels,\n            groupChannels: filteredGroupChannels,\n            recentDMUsers,\n            statuses: state.entities.users.statuses,\n            currentChannelMembers,\n            currentUserId,\n            restrictDirectMessage,\n            totalCount: stats.total_users_count,\n        };\n    };\n};\n\nconst filterGroupChannels = memoizeResult((channels: GroupChannel[], term: string) => {\n    return channels.filter((channel) => {\n        const matches = filterProfilesStartingWithTerm(channel.profiles, term);\n        return matches.length > 0;\n    });\n});\n\nconst filterDirectChannels = memoizeResult((channels: Record<string, Channel>, userId: string) => {\n    return Object.values(channels).filter((channel) => (\n        channel.type === Constants.DM_CHANNEL &&\n        channel.name.includes(userId)\n    ));\n});\n\ntype Actions = {\n    getProfiles: (page?: number | undefined, perPage?: number | undefined, options?: any) => Promise<any>;\n    getProfilesInTeam: (teamId: string, page: number, perPage?: number | undefined, sort?: string | undefined, options?: any) => Promise<any>;\n    loadStatusesByIds: (userIds: string[]) => ActionFunc;\n    getTotalUsersStats: () => ActionFunc;\n    loadStatusesForProfilesList: (users: any) => {\n        data: boolean;\n    };\n    loadProfilesForGroupChannels: (groupChannels: any) => Promise<any>;\n    openDirectChannelToUserId: (userId: any) => Promise<any>;\n    openGroupChannelToUserIds: (userIds: any) => Promise<any>;\n    searchProfiles: (term: string, options?: any) => Promise<any>;\n    searchGroupChannels: (term: string) => Promise<any>;\n    setModalSearchTerm: (term: any) => GenericAction;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc | GenericAction>, Actions>({\n            getProfiles,\n            getProfilesInTeam,\n            loadStatusesByIds,\n            getTotalUsersStats,\n            loadStatusesForProfilesList,\n            loadProfilesForGroupChannels,\n            openDirectChannelToUserId,\n            openGroupChannelToUserIds,\n            searchProfiles,\n            searchGroupChannels,\n            setModalSearchTerm,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(MoreDirectChannels);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport PQueue from 'p-queue';\n\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {Dictionary} from 'mattermost-redux/types/utilities';\n\nimport {Constants} from 'utils/constants';\nimport {loadProfilesForSidebar} from 'actions/user_actions.jsx';\n\nconst queue = new PQueue({concurrency: 2});\n\ntype Props = {\n    currentChannelId: string;\n    prefetchQueueObj: Record<string, string[]>;\n    prefetchRequestStatus: Dictionary<string>;\n\n    // Whether or not the categories in the sidebar have been loaded for the current team\n    sidebarLoaded: boolean;\n\n    unreadChannels: Channel[];\n    actions: {\n        prefetchChannelPosts: (channelId: string, delay?: number) => Promise<any>;\n    };\n}\n\n/*\n    This component is responsible for prefetching data. As of now component only fetches for channel posts based on the below set of rules.\n    * Priority order:\n        Fetches channel posts 2 at a time, with mentions followed channels with unreads.\n\n    * Conditions for prefetching posts:\n        On load of webapp\n        On socket reconnect or system comes from sleep\n        On new message in a channel where user has not visited in the present session\n        On addition of user to a channel/GM\n        On Team switch\n\n        In order to solve the above conditions the component looks for changes in selector unread channels.\n        if there is a change in unreads selector, then component clears existing queue as it can be obselete\n        i.e there can be new mentions and we need to prioritise instead of unreads so, contructs a new queue\n        with dispacthes of unreads posts for channels which do not have prefetched requests.\n\n    * other changes:\n        Adds current channel posts requests to be dispatched as soon as it is set in redux state instead of dispatching it from actions down the hierarchy. Otherwise couple of prefetching requests are sent before the postlist makes a request for posts.\n        Add a jitter(0-1sec) for delaying post requests in case of a new message in open/private channels. This is to prevent a case when all clients request messages when new post is made in a channel with thousands of users.\n*/\nexport default class DataPrefetch extends React.PureComponent<Props> {\n    private prefetchTimeout?: number;\n\n    async componentDidUpdate(prevProps: Props) {\n        const {currentChannelId, prefetchQueueObj, sidebarLoaded} = this.props;\n        if (currentChannelId && sidebarLoaded && (!prevProps.currentChannelId || !prevProps.sidebarLoaded)) {\n            queue.add(async () => this.prefetchPosts(currentChannelId));\n            await loadProfilesForSidebar();\n            this.prefetchData();\n        } else if (prevProps.prefetchQueueObj !== prefetchQueueObj) {\n            clearTimeout(this.prefetchTimeout);\n            await queue.clear();\n            this.prefetchData();\n        }\n    }\n\n    public prefetchPosts = (channelId: string) => {\n        let delay;\n        const channel = this.props.unreadChannels.find((unreadChannel) => channelId === unreadChannel.id);\n        if (channel && (channel.type === Constants.PRIVATE_CHANNEL || channel.type === Constants.OPEN_CHANNEL)) {\n            const isLatestPostInLastMin = (Date.now() - channel.last_post_at) <= 1000;\n            if (isLatestPostInLastMin) {\n                delay = Math.random() * 1000; // 1ms - 1000ms random wait to not choke server\n            }\n        }\n        return this.props.actions.prefetchChannelPosts(channelId, delay);\n    }\n\n    private prefetchData = () => {\n        const {prefetchRequestStatus, prefetchQueueObj} = this.props;\n        for (const priority in prefetchQueueObj) {\n            if (!prefetchQueueObj.hasOwnProperty(priority)) {\n                continue;\n            }\n\n            const priorityQueue = prefetchQueueObj[priority];\n            for (const channelId of priorityQueue) {\n                if (!prefetchRequestStatus.hasOwnProperty(channelId)) {\n                    queue.add(async () => this.prefetchPosts(channelId));\n                }\n            }\n        }\n    }\n\n    render() {\n        return null;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {getCurrentChannelId, getUnreadChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {memoizeResult} from 'mattermost-redux/utils/helpers';\nimport {getMsgCountInChannel, isChannelMuted} from 'mattermost-redux/utils/channel_utils';\nimport {getMyChannelMemberships} from 'mattermost-redux/selectors/entities/common';\n\nimport {Channel, ChannelMembership} from 'mattermost-redux/types/channels';\nimport {PostList} from 'mattermost-redux/types/posts';\n\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\nimport {RelationOneToOne} from 'mattermost-redux/types/utilities';\n\nimport {prefetchChannelPosts} from 'actions/views/channel';\n\nimport {getCategoriesForCurrentTeam} from 'selectors/views/channel_sidebar';\n\nimport {GlobalState} from 'types/store';\n\nimport {isCollapsedThreadsEnabled} from '../../packages/mattermost-redux/src/selectors/entities/preferences';\n\nimport DataPrefetch from './data_prefetch';\n\ntype Actions = {\n    prefetchChannelPosts: (channelId: string, delay?: number) => Promise<{data: PostList}>;\n};\n\nenum Priority {\n    high = 1,\n    medium,\n    low\n}\n\n// function to return a queue obj with priotiy as key and array of channelIds as values.\n// high priority has channels with mentions\n// medium priority has channels with unreads\nconst prefetchQueue = memoizeResult((channels: Channel[], memberships: RelationOneToOne<Channel, ChannelMembership>, collapsedThreads: boolean) => {\n    return channels.reduce((acc: Record<string, string[]>, channel: Channel) => {\n        const channelId = channel.id;\n        const membership = memberships[channelId];\n        if (membership && !isChannelMuted(membership)) {\n            if (collapsedThreads ? membership.mention_count_root : membership.mention_count) {\n                return {\n                    ...acc,\n                    [Priority.high]: [...acc[Priority.high], channelId],\n                };\n            } else if (\n                membership.notify_props &&\n                membership.notify_props.mark_unread !== 'mention' &&\n                Boolean(getMsgCountInChannel(collapsedThreads, channel, membership))\n            ) {\n                return {\n                    ...acc,\n                    [Priority.medium]: [...acc[Priority.medium], channelId],\n                };\n            }\n        }\n        return acc;\n    }, {\n        [Priority.high]: [], // 1 being high priority requests\n        [Priority.medium]: [],\n        [Priority.low]: [], //TODO: add chanenls such as fav.\n    });\n});\n\nfunction isSidebarLoaded(state: GlobalState) {\n    return getCategoriesForCurrentTeam(state).length > 0;\n}\n\nfunction mapStateToProps(state: GlobalState) {\n    const lastUnreadChannel = state.views.channel.lastUnreadChannel;\n    const memberships = getMyChannelMemberships(state);\n    const unreadChannels = getUnreadChannels(state, lastUnreadChannel);\n    const prefetchQueueObj = prefetchQueue(unreadChannels, memberships, isCollapsedThreadsEnabled(state));\n    const prefetchRequestStatus = state.views.channel.channelPrefetchStatus;\n\n    return {\n        currentChannelId: getCurrentChannelId(state),\n        prefetchQueueObj,\n        prefetchRequestStatus,\n        sidebarLoaded: isSidebarLoaded(state),\n        unreadChannels,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            prefetchChannelPosts,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DataPrefetch);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable max-lines */\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {connect} from 'react-redux';\n\nimport {UserTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\nimport {\n    getChannelsInCurrentTeam,\n    getDirectAndGroupChannels,\n    getGroupChannels,\n    getMyChannelMemberships,\n    getChannelByName,\n    getCurrentChannel,\n    getDirectTeammate,\n} from 'mattermost-redux/selectors/entities/channels';\n\nimport ProfilePicture from '../profile_picture';\n\nimport {getMyPreferences, isGroupChannelManuallyVisible, isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {\n    getCurrentUserId,\n    getUserIdsInChannels,\n    getUser,\n    makeSearchProfilesMatchingWithTerm,\n    getStatusForUserId,\n    getUserByUsername,\n} from 'mattermost-redux/selectors/entities/users';\nimport {getChannels, searchChannels} from 'mattermost-redux/actions/channels';\nimport {logError} from 'mattermost-redux/actions/errors';\nimport {sortChannelsByTypeAndDisplayName} from 'mattermost-redux/utils/channel_utils';\n\nimport SharedChannelIndicator from 'components/shared_channel_indicator';\nimport BotBadge from 'components/widgets/badges/bot_badge';\nimport GuestBadge from 'components/widgets/badges/guest_badge';\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\n\nimport {getPostDraft} from 'selectors/rhs';\nimport store from 'stores/redux_store.jsx';\nimport {Constants, StoragePrefixes} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\n\nimport {Preferences} from 'mattermost-redux/constants';\nimport {getPreferenceKey} from 'mattermost-redux/utils/preference_utils';\n\nimport Provider from './provider.jsx';\nimport Suggestion from './suggestion.jsx';\n\nconst getState = store.getState;\nconst searchProfilesMatchingWithTerm = makeSearchProfilesMatchingWithTerm();\n\nclass SwitchChannelSuggestion extends Suggestion {\n    static get propTypes() {\n        return {\n            ...super.propTypes,\n            channelMember: PropTypes.object,\n            hasDraft: PropTypes.bool,\n            userImageUrl: PropTypes.string,\n            dmChannelTeammate: PropTypes.object,\n            collapsedThreads: PropTypes.bool,\n        };\n    }\n\n    render() {\n        const {item, isSelection, userImageUrl, status, userItem, collapsedThreads} = this.props;\n        const channel = item.channel;\n        const channelIsArchived = channel.delete_at && channel.delete_at !== 0;\n\n        const member = this.props.channelMember;\n        const teammate = this.props.dmChannelTeammate;\n        let badge = null;\n\n        if (member && member.notify_props) {\n            const unreadMentions = collapsedThreads ? member.mention_count_root : member.mention_count;\n            if (unreadMentions > 0) {\n                badge = <span className='badge'>{unreadMentions}</span>;\n            }\n        }\n\n        let className = 'suggestion-list__item';\n        if (isSelection) {\n            className += ' suggestion--selected';\n        }\n\n        let name = channel.display_name;\n        let description = '~' + channel.name;\n        let icon;\n        if (channelIsArchived) {\n            icon = (\n                <span className='suggestion-list__icon suggestion-list__icon--large'>\n                    <i className='icon icon-archive-outline'/>\n                </span>\n            );\n        } else if (this.props.hasDraft) {\n            icon = (\n                <span className='suggestion-list__icon suggestion-list__icon--large'>\n                    <i className='icon icon-pencil-outline'/>\n                </span>\n            );\n        } else if (channel.type === Constants.OPEN_CHANNEL) {\n            icon = (\n                <span className='suggestion-list__icon suggestion-list__icon--large'>\n                    <i className='icon icon-globe'/>\n                </span>\n            );\n        } else if (channel.type === Constants.PRIVATE_CHANNEL) {\n            icon = (\n                <span className='suggestion-list__icon suggestion-list__icon--large'>\n                    <i className='icon icon-lock-outline'/>\n                </span>\n            );\n        } else if (channel.type === Constants.GM_CHANNEL) {\n            icon = (\n                <span className='suggestion-list__icon suggestion-list__icon--large'>\n                    <div className='status status--group'>{'G'}</div>\n                </span>\n            );\n        } else {\n            icon = (\n                <ProfilePicture\n                    src={userImageUrl}\n                    status={teammate && teammate.is_bot ? null : status}\n                    size='sm'\n                />\n            );\n        }\n\n        let tag = null;\n        let customStatus = null;\n        if (channel.type === Constants.DM_CHANNEL) {\n            tag = (\n                <React.Fragment>\n                    <BotBadge\n                        show={Boolean(teammate && teammate.is_bot)}\n                        className='badge-autocomplete'\n                    />\n                    <GuestBadge\n                        show={Boolean(teammate && Utils.isGuest(teammate))}\n                        className='badge-autocomplete'\n                    />\n                </React.Fragment>\n            );\n\n            customStatus = (\n                <CustomStatusEmoji\n                    showTooltip={true}\n                    userID={userItem.id}\n                    emojiStyle={{\n                        marginBottom: 2,\n                        marginLeft: 8,\n                    }}\n                />\n            );\n\n            let deactivated = '';\n            if (userItem.delete_at) {\n                deactivated = (' - ' + Utils.localizeMessage('channel_switch_modal.deactivated', 'Deactivated'));\n            }\n\n            if (channel.display_name && !(teammate && teammate.is_bot)) {\n                description = '@' + userItem.username + deactivated;\n            } else {\n                name = userItem.username;\n                description = deactivated;\n            }\n        } else if (channel.type === Constants.GM_CHANNEL) {\n            // remove the slug from the option\n            name = channel.display_name;\n            description = '';\n        }\n\n        let sharedIcon = null;\n        if (channel.shared) {\n            sharedIcon = (\n                <SharedChannelIndicator\n                    className='shared-channel-icon'\n                    channelType={channel.type}\n                />\n            );\n        }\n\n        return (\n            <div\n                onClick={this.handleClick}\n                onMouseMove={this.handleMouseMove}\n                className={className}\n                role='listitem'\n                ref={(node) => {\n                    this.node = node;\n                }}\n                id={`switchChannel_${channel.name}`}\n                data-testid={channel.name}\n                aria-label={name}\n                {...Suggestion.baseProps}\n            >\n                {icon}\n                <div className='suggestion-list__ellipsis'>\n                    <span className='suggestion-list__main'>\n                        {name}\n                    </span>\n                    <span className='ml-2'>{description}</span>\n                </div>\n                {customStatus}\n                {sharedIcon}\n                {tag}\n                {badge}\n            </div>\n        );\n    }\n}\n\nfunction mapStateToPropsForSwitchChannelSuggestion(state, ownProps) {\n    const channel = ownProps.item && ownProps.item.channel;\n    const channelId = channel ? channel.id : '';\n    const draft = channelId ? getPostDraft(state, StoragePrefixes.DRAFT, channelId) : false;\n    const user = channel && getUser(state, channel.userId);\n    const userImageUrl = user && Utils.imageURLForUser(user.id, user.last_picture_update);\n    let dmChannelTeammate = channel && channel.type === Constants.DM_CHANNEL && getDirectTeammate(state, channel.id);\n    const userItem = getUserByUsername(state, channel.name);\n    const status = getStatusForUserId(state, channel.userId);\n    const collapsedThreads = isCollapsedThreadsEnabled(state);\n\n    if (channel && !dmChannelTeammate) {\n        dmChannelTeammate = getUser(state, channel.userId);\n    }\n\n    return {\n        channelMember: getMyChannelMemberships(state)[channelId],\n        hasDraft: draft && Boolean(draft.message.trim() || draft.fileInfos.length || draft.uploadsInProgress.length),\n        userImageUrl,\n        dmChannelTeammate,\n        status,\n        userItem,\n        collapsedThreads,\n    };\n}\n\nconst ConnectedSwitchChannelSuggestion = connect(mapStateToPropsForSwitchChannelSuggestion, null, null, {forwardRef: true})(SwitchChannelSuggestion);\n\nlet prefix = '';\n\nfunction sortChannelsByRecencyAndTypeAndDisplayName(wrappedA, wrappedB) {\n    if (wrappedA.last_viewed_at && wrappedB.last_viewed_at) {\n        return wrappedB.last_viewed_at - wrappedA.last_viewed_at;\n    } else if (wrappedA.last_viewed_at) {\n        return -1;\n    } else if (wrappedB.last_viewed_at) {\n        return 1;\n    }\n\n    return sortChannelsByTypeAndDisplayName('en', wrappedA.channel, wrappedB.channel);\n}\n\nexport function quickSwitchSorter(wrappedA, wrappedB) {\n    const aIsArchived = wrappedA.channel.delete_at ? wrappedA.channel.delete_at !== 0 : false;\n    const bIsArchived = wrappedB.channel.delete_at ? wrappedB.channel.delete_at !== 0 : false;\n\n    if (aIsArchived && !bIsArchived) {\n        return 1;\n    } else if (!aIsArchived && bIsArchived) {\n        return -1;\n    }\n\n    if (wrappedA.deactivated && !wrappedB.deactivated) {\n        return 1;\n    } else if (wrappedB.deactivated && !wrappedA.deactivated) {\n        return -1;\n    }\n\n    const a = wrappedA.channel;\n    const b = wrappedB.channel;\n\n    let aDisplayName = a.display_name.toLowerCase();\n    let bDisplayName = b.display_name.toLowerCase();\n\n    if (a.type === Constants.DM_CHANNEL && aDisplayName.startsWith('@')) {\n        aDisplayName = aDisplayName.substring(1);\n    }\n\n    if (b.type === Constants.DM_CHANNEL && bDisplayName.startsWith('@')) {\n        bDisplayName = bDisplayName.substring(1);\n    }\n\n    const aStartsWith = aDisplayName.startsWith(prefix);\n    const bStartsWith = bDisplayName.startsWith(prefix);\n\n    // Open channels user havent interacted should be at the  bottom of the list\n    if (a.type === Constants.OPEN_CHANNEL && !wrappedA.last_viewed_at && (b.type !== Constants.OPEN_CHANNEL || wrappedB.last_viewed_at)) {\n        return 1;\n    } else if (b.type === Constants.OPEN_CHANNEL && !wrappedB.last_viewed_at) {\n        return -1;\n    }\n\n    // Sort channels starting with the search term first\n    if (aStartsWith && !bStartsWith) {\n        return -1;\n    } else if (!aStartsWith && bStartsWith) {\n        return 1;\n    }\n\n    // Sort recently viewed channels first\n    if (wrappedA.last_viewed_at && wrappedB.last_viewed_at) {\n        return wrappedB.last_viewed_at - wrappedA.last_viewed_at;\n    } else if (wrappedA.last_viewed_at) {\n        return -1;\n    } else if (wrappedB.last_viewed_at) {\n        return 1;\n    }\n\n    // MM-12677 When this is migrated this needs to be fixed to pull the user's locale\n    return sortChannelsByTypeAndDisplayName('en', a, b);\n}\n\nfunction makeChannelSearchFilter(channelPrefix) {\n    const channelPrefixLower = channelPrefix.toLowerCase();\n    const splitPrefixBySpace = channelPrefixLower.trim().split(/[ ,]+/);\n    const curState = getState();\n    const usersInChannels = getUserIdsInChannels(curState);\n    const userSearchStrings = {};\n\n    return (channel) => {\n        let searchString = `${channel.display_name}${channel.name}`;\n        if (channel.type === Constants.GM_CHANNEL || channel.type === Constants.DM_CHANNEL) {\n            const usersInChannel = usersInChannels[channel.id] || new Set([]);\n\n            // In case the channel is a DM and the profilesInChannel is not populated\n            if (!usersInChannel.size && channel.type === Constants.DM_CHANNEL) {\n                const userId = Utils.getUserIdFromChannelId(channel.name);\n                const user = getUser(curState, userId);\n                if (user) {\n                    usersInChannel.add(userId);\n                }\n            }\n\n            for (const userId of usersInChannel) {\n                let userString = userSearchStrings[userId];\n\n                if (!userString) {\n                    const user = getUser(curState, userId);\n                    if (!user) {\n                        continue;\n                    }\n                    const {nickname, username} = user;\n                    userString = `${nickname}${username}${Utils.getFullName(user)}`;\n                    userSearchStrings[userId] = userString;\n                }\n                searchString += userString;\n            }\n        }\n\n        if (splitPrefixBySpace.length > 1) {\n            const lowerCaseSearch = searchString.toLowerCase();\n            return splitPrefixBySpace.every((searchPrefix) => {\n                return lowerCaseSearch.includes(searchPrefix);\n            });\n        }\n\n        return searchString.toLowerCase().includes(channelPrefixLower);\n    };\n}\n\nexport default class SwitchChannelProvider extends Provider {\n    handlePretextChanged(channelPrefix, resultsCallback) {\n        if (channelPrefix) {\n            prefix = channelPrefix;\n            this.startNewRequest(channelPrefix);\n            if (this.shouldCancelDispatch(channelPrefix)) {\n                return false;\n            }\n\n            // Dispatch suggestions for local data\n            const channels = getChannelsInCurrentTeam(getState()).concat(getDirectAndGroupChannels(getState()));\n            const users = Object.assign([], searchProfilesMatchingWithTerm(getState(), channelPrefix, false));\n            const formattedData = this.formatList(channelPrefix, channels, users);\n            if (formattedData) {\n                resultsCallback(formattedData);\n            }\n\n            // Fetch data from the server and dispatch\n            this.fetchUsersAndChannels(channelPrefix, resultsCallback);\n        } else {\n            this.fetchAndFormatRecentlyViewedChannels(resultsCallback);\n        }\n\n        return true;\n    }\n\n    async fetchUsersAndChannels(channelPrefix, resultsCallback) {\n        const state = getState();\n        const teamId = getCurrentTeamId(state);\n        if (!teamId) {\n            return;\n        }\n\n        const config = getConfig(state);\n        let usersAsync;\n        if (config.RestrictDirectMessage === 'team') {\n            usersAsync = Client4.autocompleteUsers(channelPrefix, teamId, '');\n        } else {\n            usersAsync = Client4.autocompleteUsers(channelPrefix, '', '');\n        }\n\n        const channelsAsync = searchChannels(teamId, channelPrefix)(store.dispatch, store.getState);\n\n        let usersFromServer = [];\n        let channelsFromServer = [];\n\n        try {\n            usersFromServer = await usersAsync;\n            const {data} = await channelsAsync;\n            channelsFromServer = data;\n        } catch (err) {\n            store.dispatch(logError(err));\n        }\n\n        if (this.shouldCancelDispatch(channelPrefix)) {\n            return;\n        }\n\n        const currentUserId = getCurrentUserId(state);\n\n        const localChannelData = getChannelsInCurrentTeam(state).concat(getDirectAndGroupChannels(state)) || [];\n        const localUserData = Object.assign([], searchProfilesMatchingWithTerm(state, channelPrefix, false)) || [];\n        const localFormattedData = this.formatList(channelPrefix, localChannelData, localUserData);\n\n        const remoteChannelData = channelsFromServer.concat(getGroupChannels(state)) || [];\n        const remoteUserData = Object.assign([], usersFromServer.users) || [];\n        const remoteFormattedData = this.formatList(channelPrefix, remoteChannelData, remoteUserData, false);\n\n        store.dispatch({\n            type: UserTypes.RECEIVED_PROFILES_LIST,\n            data: [...localUserData.filter((user) => user.id !== currentUserId), ...remoteUserData.filter((user) => user.id !== currentUserId)],\n        });\n        const combinedTerms = [...localFormattedData.terms, ...remoteFormattedData.terms.filter((term) => !localFormattedData.terms.includes(term))];\n        const combinedItems = [...localFormattedData.items, ...remoteFormattedData.items.filter((item) => !localFormattedData.terms.includes(item.channel.userId || item.channel.id))];\n\n        resultsCallback({\n            ...localFormattedData,\n            ...{\n                items: combinedItems,\n                terms: combinedTerms,\n            },\n        });\n    }\n\n    userWrappedChannel(user, channel) {\n        let displayName = '';\n\n        // The naming format is fullname (nickname)\n        // username is shown seperately\n        if ((user.first_name || user.last_name) && user.nickname) {\n            displayName += `${Utils.getFullName(user)} (${user.nickname})`;\n        } else if (user.nickname && !user.first_name && !user.last_name) {\n            displayName += `${user.nickname}`;\n        } else if (user.first_name || user.last_name) {\n            displayName += `${Utils.getFullName(user)}`;\n        }\n\n        return {\n            channel: {\n                display_name: displayName,\n                name: user.username,\n                id: channel ? channel.id : user.id,\n                userId: user.id,\n                update_at: user.update_at,\n                type: Constants.DM_CHANNEL,\n                last_picture_update: user.last_picture_update || 0,\n            },\n            type: 'search.direct',\n            name: user.username,\n            deactivated: user.delete_at,\n        };\n    }\n\n    formatList(channelPrefix, allChannels, users, skipNotMember = true) {\n        const channels = [];\n\n        const members = getMyChannelMemberships(getState());\n\n        const completedChannels = {};\n\n        const channelFilter = makeChannelSearchFilter(channelPrefix);\n\n        const state = getState();\n        const config = getConfig(state);\n        const viewArchivedChannels = config.ExperimentalViewArchivedChannels === 'true';\n\n        for (const id of Object.keys(allChannels)) {\n            const channel = allChannels[id];\n\n            if (completedChannels[channel.id]) {\n                continue;\n            }\n\n            if (channelFilter(channel)) {\n                const newChannel = Object.assign({}, channel);\n                const channelIsArchived = channel.delete_at !== 0;\n\n                let wrappedChannel = {channel: newChannel, name: newChannel.name, deactivated: false};\n                if (members[channel.id]) {\n                    wrappedChannel.last_viewed_at = members[channel.id].last_viewed_at;\n                } else if (skipNotMember) {\n                    continue;\n                }\n\n                if (!viewArchivedChannels && channelIsArchived) {\n                    continue;\n                } else if (channelIsArchived && members[channel.id]) {\n                    wrappedChannel.type = Constants.ARCHIVED_CHANNEL;\n                } else if (newChannel.type === Constants.OPEN_CHANNEL) {\n                    wrappedChannel.type = Constants.MENTION_PUBLIC_CHANNELS;\n                } else if (newChannel.type === Constants.PRIVATE_CHANNEL) {\n                    wrappedChannel.type = Constants.MENTION_PRIVATE_CHANNELS;\n                } else if (channelIsArchived && !members[channel.id]) {\n                    continue;\n                } else if (newChannel.type === Constants.GM_CHANNEL) {\n                    newChannel.name = newChannel.display_name;\n                    wrappedChannel.name = newChannel.name;\n                    wrappedChannel.type = Constants.MENTION_GROUPS;\n                    const isGMVisible = isGroupChannelManuallyVisible(state, channel.id);\n                    if (!isGMVisible && skipNotMember) {\n                        continue;\n                    }\n                } else if (newChannel.type === Constants.DM_CHANNEL) {\n                    const userId = Utils.getUserIdFromChannelId(newChannel.name);\n                    const user = users.find((u) => u.id === userId);\n\n                    if (user) {\n                        completedChannels[user.id] = true;\n                        wrappedChannel = this.userWrappedChannel(\n                            user,\n                            newChannel,\n                        );\n                        if (members[channel.id]) {\n                            wrappedChannel.last_viewed_at = members[channel.id].last_viewed_at;\n                        }\n                    } else {\n                        continue;\n                    }\n                }\n\n                completedChannels[channel.id] = true;\n                channels.push(wrappedChannel);\n            }\n        }\n\n        for (let i = 0; i < users.length; i++) {\n            const user = users[i];\n\n            if (completedChannels[user.id]) {\n                continue;\n            }\n\n            const wrappedChannel = this.userWrappedChannel(user);\n\n            const currentUserId = getCurrentUserId(getState());\n\n            const channelName = Utils.getDirectChannelName(currentUserId, user.id);\n            const channel = getChannelByName(getState(), channelName);\n\n            if (channel && members[channel.id]) {\n                wrappedChannel.last_viewed_at = members[channel.id].last_viewed_at;\n            } else if (skipNotMember) {\n                continue;\n            }\n\n            completedChannels[user.id] = true;\n            channels.push(wrappedChannel);\n        }\n\n        const channelNames = channels.\n            sort(quickSwitchSorter).\n            map((wrappedChannel) => wrappedChannel.channel.userId || wrappedChannel.channel.id);\n\n        return {\n            matchedPretext: channelPrefix,\n            terms: channelNames,\n            items: channels,\n            component: ConnectedSwitchChannelSuggestion,\n        };\n    }\n\n    fetchAndFormatRecentlyViewedChannels(resultsCallback) {\n        const state = getState();\n        const recentChannels = getChannelsInCurrentTeam(state).concat(getDirectAndGroupChannels(state));\n        const channels = this.wrapChannels(recentChannels, Constants.MENTION_RECENT_CHANNELS);\n        if (channels.length === 0) {\n            prefix = '';\n            this.startNewRequest('');\n            this.fetchChannels(resultsCallback);\n        }\n        const sortedChannels = channels.sort(sortChannelsByRecencyAndTypeAndDisplayName).slice(0, 20);\n        const channelNames = sortedChannels.map((wrappedChannel) => wrappedChannel.channel.id);\n        resultsCallback({\n            matchedPretext: '',\n            terms: channelNames,\n            items: sortedChannels,\n            component: ConnectedSwitchChannelSuggestion,\n        });\n    }\n    getTimestampFromPrefs(myPreferences, category, name) {\n        const pref = myPreferences[getPreferenceKey(category, name)];\n        const prefValue = pref ? pref.value : '0';\n        return parseInt(prefValue, 10);\n    }\n    getLastViewedAt(myMembers, myPreferences, channel) {\n        // The server only ever sets the last_viewed_at to the time of the last post in channel,\n        // So thought of using preferences but it seems that also not keeping track.\n        // TODO Update and remove comment once solution is finalized\n        return Math.max(\n            myMembers[channel.id]?.last_viewed_at,\n            this.getTimestampFromPrefs(myPreferences, Preferences.CATEGORY_CHANNEL_APPROXIMATE_VIEW_TIME, channel.id),\n            this.getTimestampFromPrefs(myPreferences, Preferences.CATEGORY_CHANNEL_OPEN_TIME, channel.id),\n        );\n    }\n\n    wrapChannels(channels, channelType) {\n        const state = getState();\n        const currentChannel = getCurrentChannel(state);\n        const myMembers = getMyChannelMemberships(state);\n        const myPreferences = getMyPreferences(state);\n\n        const channelList = [];\n        for (let i = 0; i < channels.length; i++) {\n            const channel = channels[i];\n            if (channel.id === currentChannel?.id) {\n                continue;\n            }\n            let wrappedChannel = {channel, name: channel.name, deactivated: false};\n            if (myMembers[channel.id]) {\n                wrappedChannel.last_viewed_at = this.getLastViewedAt(myMembers, myPreferences, channel);\n            }\n            if (channel.type === Constants.GM_CHANNEL) {\n                wrappedChannel.name = channel.display_name;\n            } else if (channel.type === Constants.DM_CHANNEL) {\n                const user = getUser(getState(), Utils.getUserIdFromChannelId(channel.name));\n\n                if (!user) {\n                    continue;\n                }\n                const userWrappedChannel = this.userWrappedChannel(\n                    user,\n                    channel,\n                );\n                wrappedChannel = {...wrappedChannel, ...userWrappedChannel};\n            }\n            wrappedChannel.type = channelType;\n            channelList.push(wrappedChannel);\n        }\n        return channelList;\n    }\n\n    async fetchChannels(resultsCallback, size = 20) {\n        const state = getState();\n        const teamId = getCurrentTeamId(state);\n        if (!teamId) {\n            return;\n        }\n        const channelsAsync = getChannels(teamId, 0, size)(store.dispatch, store.getState);\n        let channels;\n\n        try {\n            const {data} = await channelsAsync;\n            channels = data;\n        } catch (err) {\n            store.dispatch(logError(err));\n        }\n\n        if (this.latestPrefix !== '') {\n            return;\n        }\n        const sortedChannels = this.wrapChannels(channels, Constants.MENTION_PUBLIC_CHANNELS).slice(0, 20);\n        const channelNames = sortedChannels.map((wrappedChannel) => wrappedChannel.channel.id);\n\n        resultsCallback({\n            matchedPretext: '',\n            terms: channelNames,\n            items: sortedChannels,\n            component: ConnectedSwitchChannelSuggestion,\n        });\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {ActionResult} from 'mattermost-redux/types/actions';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport {browserHistory} from 'utils/browser_history';\nimport Constants from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\nimport * as UserAgent from 'utils/user_agent';\nimport SuggestionBox from 'components/suggestion/suggestion_box.jsx';\nimport SuggestionList from 'components/suggestion/suggestion_list.jsx';\nimport SwitchChannelProvider from 'components/suggestion/switch_channel_provider.jsx';\nimport NoResultsIndicator from 'components/no_results_indicator/no_results_indicator';\n\nimport {NoResultsVariant} from 'components/no_results_indicator/types';\n\nconst CHANNEL_MODE = 'channel';\n\ntype ProviderSuggestions = {\n    matchedPretext: any;\n    terms: string[];\n    items: any[];\n    component: React.ReactNode;\n}\n\nexport type Props = {\n\n    /**\n     * The function called to hide the modal\n     */\n    onHide: () => void;\n\n    actions: {\n        joinChannelById: (channelId: string) => Promise<ActionResult>;\n        switchToChannel: (channel: Channel) => Promise<ActionResult>;\n    };\n}\n\ntype State = {\n    text: string;\n    mode: string|null;\n    hasSuggestions: boolean;\n    shouldShowLoadingSpinner: boolean;\n    pretext: string;\n}\n\nexport default class QuickSwitchModal extends React.PureComponent<Props, State> {\n    private channelProviders: SwitchChannelProvider[];\n    private switchBox: SuggestionBox|null;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.channelProviders = [new SwitchChannelProvider()];\n\n        this.switchBox = null;\n\n        this.state = {\n            text: '',\n            mode: CHANNEL_MODE,\n            hasSuggestions: true,\n            shouldShowLoadingSpinner: true,\n            pretext: '',\n        };\n    }\n\n    private focusTextbox = (): void => {\n        if (this.switchBox === null) {\n            return;\n        }\n\n        const textbox = this.switchBox.getTextbox();\n        if (document.activeElement !== textbox) {\n            textbox.focus();\n            Utils.placeCaretAtEnd(textbox);\n        }\n    };\n\n    private setSwitchBoxRef = (input: SuggestionBox): void => {\n        this.switchBox = input;\n        this.focusTextbox();\n    };\n\n    private onHide = (): void => {\n        this.focusPostTextbox();\n        this.setState({\n            text: '',\n        });\n        this.props.onHide();\n    };\n\n    private focusPostTextbox = (): void => {\n        if (!UserAgent.isMobile()) {\n            setTimeout(() => {\n                const textbox = document.querySelector('#post_textbox') as HTMLElement;\n                if (textbox) {\n                    textbox.focus();\n                }\n            });\n        }\n    };\n\n    private onChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n        this.setState({text: e.target.value, shouldShowLoadingSpinner: true});\n    };\n\n    public handleSubmit = async (selected?: any): Promise<void> => {\n        if (!selected) {\n            return;\n        }\n\n        if (this.state.mode === CHANNEL_MODE) {\n            const {joinChannelById, switchToChannel} = this.props.actions;\n            const selectedChannel = selected.channel;\n\n            if (selected.type === Constants.MENTION_MORE_CHANNELS && selectedChannel.type === Constants.OPEN_CHANNEL) {\n                await joinChannelById(selectedChannel.id);\n            }\n            switchToChannel(selectedChannel).then((result: ActionResult) => {\n                if ('data' in result) {\n                    this.onHide();\n                }\n            });\n        } else {\n            browserHistory.push('/' + selected.name);\n            this.onHide();\n        }\n    };\n\n    private handleSuggestionsReceived = (suggestions: ProviderSuggestions): void => {\n        const loadingPropPresent = suggestions.items.some((item: any) => item.loading);\n        this.setState({\n            shouldShowLoadingSpinner: loadingPropPresent,\n            pretext: suggestions.matchedPretext,\n            hasSuggestions: suggestions.items.length > 0,\n        });\n    }\n\n    public render = (): JSX.Element => {\n        const providers: SwitchChannelProvider[] = this.channelProviders;\n\n        const header = (\n            <h1>\n                <FormattedMessage\n                    id='quick_switch_modal.switchChannels'\n                    defaultMessage='Switch Channels'\n                />\n            </h1>\n        );\n\n        let help;\n        if (Utils.isMobile()) {\n            help = (\n                <FormattedMarkdownMessage\n                    id='quick_switch_modal.help_mobile'\n                    defaultMessage='Type to find a channel.'\n                />\n            );\n        } else {\n            help = (\n                <FormattedMarkdownMessage\n                    id='quick_switch_modal.help_no_team'\n                    defaultMessage='Type to find a channel. Use **UP/DOWN** to browse, **ENTER** to select, **ESC** to dismiss.'\n                />\n            );\n        }\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal channel-switcher'\n                ref='modal'\n                show={true}\n                onHide={this.onHide}\n                enforceFocus={false}\n                restoreFocus={false}\n                role='dialog'\n                aria-labelledby='quickSwitchModalLabel'\n                aria-describedby='quickSwitchHint'\n                animation={false}\n            >\n                <Modal.Header\n                    id='quickSwitchModalLabel'\n                    closeButton={true}\n                />\n                <Modal.Body>\n                    <div className='channel-switcher__header'>\n                        {header}\n                        <div\n                            className='channel-switcher__hint'\n                            id='quickSwitchHint'\n                        >\n                            {help}\n                        </div>\n                    </div>\n                    <div className='channel-switcher__suggestion-box'>\n                        <i className='icon icon-magnify icon-16'/>\n                        <SuggestionBox\n                            id='quickSwitchInput'\n                            aria-label={Utils.localizeMessage('quick_switch_modal.input', 'quick switch input')}\n                            ref={this.setSwitchBoxRef}\n                            className='form-control focused'\n                            onChange={this.onChange}\n                            value={this.state.text}\n                            onItemSelected={this.handleSubmit}\n                            listComponent={SuggestionList}\n                            listPosition='bottom'\n                            maxLength='64'\n                            providers={providers}\n                            completeOnTab={false}\n                            spellCheck='false'\n                            delayInputUpdate={true}\n                            openWhenEmpty={true}\n                            onSuggestionsReceived={this.handleSuggestionsReceived}\n                            forceSuggestionsWhenBlur={true}\n                            renderDividers={true}\n                        />\n                        {!this.state.shouldShowLoadingSpinner && !this.state.hasSuggestions && this.state.text &&\n                        <NoResultsIndicator\n                            variant={NoResultsVariant.ChannelSearch}\n                            titleValues={{channelName: `\"${this.state.pretext}\"`}}\n                        />\n                        }\n                    </div>\n                </Modal.Body>\n            </Modal>\n        );\n    }\n}\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {ActionFunc} from 'mattermost-redux/types/actions';\n\nimport {joinChannelById, switchToChannel} from 'actions/views/channel';\n\nimport QuickSwitchModal, {Props} from './quick_switch_modal';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Props['actions']>({\n            joinChannelById,\n            switchToChannel,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(QuickSwitchModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nexport enum CollapsedThreads {\n    DISABLED = 'disabled',\n    DEFAULT_ON = 'default_on',\n    DEFAULT_OFF = 'default_off',\n}\n\nexport enum AddChannelButtonTreatments {\n    NONE = 'none',\n    BY_TEAM_NAME = 'by_team_name',\n    INVERTED_SIDEBAR_BG_COLOR = 'inverted_sidebar_bg_color',\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport TutorialTip from 'components/tutorial/tutorial_tip';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message.jsx';\nimport {Constants} from 'utils/constants';\n\ntype Props = {\n    townSquareDisplayName?: string;\n    offTopicDisplayName?: string;\n}\n\nexport default class ChannelTutorialTip extends React.PureComponent<Props> {\n    render = () => {\n        let townSquareDisplayName = Constants.DEFAULT_CHANNEL_UI_NAME;\n        if (this.props.townSquareDisplayName) {\n            townSquareDisplayName = this.props.townSquareDisplayName;\n        }\n\n        let offTopicDisplayName = Constants.OFFTOPIC_CHANNEL_UI_NAME;\n        if (this.props.offTopicDisplayName) {\n            offTopicDisplayName = this.props.offTopicDisplayName;\n        }\n\n        const screens = [\n            <div key='first-screen'>\n                <h4>\n                    <FormattedMessage\n                        id='sidebar.tutorialAddChannel.title'\n                        defaultMessage='Create and join channels'\n                    />\n                </h4>\n                <p>\n                    <FormattedMarkdownMessage\n                        id='sidebar.tutorialAddChannel.channelDiscovery'\n                        defaultMessage={'Using the **+** button at the top of your sidebar, **create new channels** or **browse channels** to see what your team is already discussing. Organize your channels into custom, collapsible channel **categories**. Learn more about channel organization in our [documentation](!https://docs.mattermost.com/messaging/organizing-your-sidebar.html).'}\n                    />\n                </p>\n                <p>\n                    <FormattedMarkdownMessage\n                        id='sidebar.tutorialAddChannel.preAdds'\n                        defaultMessage={'We’ve added you to two channels:'}\n                    />\n                </p>\n                <p>\n                    <FormattedMarkdownMessage\n                        id='sidebar.tutorialAddChannel.preAdd.townSquare'\n                        defaultMessage={'**{townsquare}** can be used for team-wide communication and includes everyone in your team.'}\n                        values={{\n                            townsquare: townSquareDisplayName,\n                        }}\n                    />\n                </p>\n                <p>\n                    <FormattedMarkdownMessage\n                        id='sidebar.tutorialAddChannel.preAdd.offTopic'\n                        defaultMessage={'**{offtopic}** can be used for fun and humor outside of work-related conversations.'}\n                        values={{\n                            offtopic: offTopicDisplayName,\n                        }}\n                    />\n                </p>\n            </div>,\n        ];\n\n        return (\n            <TutorialTip\n                placement='right'\n                screens={screens}\n                overlayClass='tip-overlay--add-channels'\n                telemetryTag='tutorial_tip_add_channels'\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage, IntlShape, injectIntl} from 'react-intl';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport Menu from 'components/widgets/menu/menu';\nimport OverlayTrigger from 'components/overlay_trigger';\n\nimport {AddChannelButtonTreatments} from 'mattermost-redux/constants/config';\n\nimport AddChannelTutorialTip from './add_channel_tutorial_tip';\n\ntype Props = {\n    intl: IntlShape;\n    canCreateChannel: boolean;\n    canJoinPublicChannel: boolean;\n    showMoreChannelsModal: () => void;\n    invitePeopleModal: () => void;\n    showNewChannelModal: () => void;\n    showCreateCategoryModal: () => void;\n    handleOpenDirectMessagesModal: (e: Event) => void;\n    unreadFilterEnabled: boolean;\n    townSquareDisplayName: string;\n    offTopicDisplayName: string;\n    showTutorialTip: boolean;\n    addChannelButton?: AddChannelButtonTreatments;\n};\n\ntype State = {\n\n};\n\nclass AddChannelDropdown extends React.PureComponent<Props, State> {\n    getClassModifierForAbTest(): string {\n        let modifier = '';\n        if (!this.props.addChannelButton) {\n            return '';\n        }\n        switch (this.props.addChannelButton) {\n        case AddChannelButtonTreatments.NONE:\n            modifier = '';\n            break;\n        case AddChannelButtonTreatments.BY_TEAM_NAME:\n            modifier = 'by-team-name';\n            break;\n        case AddChannelButtonTreatments.INVERTED_SIDEBAR_BG_COLOR:\n            modifier = 'inverted-sidebar-bg-color';\n            break;\n        default:\n            modifier = '';\n        }\n\n        return modifier ? ` AddChannelDropdown_dropdownButton--${modifier}` : modifier;\n    }\n\n    renderDropdownItems = () => {\n        const {intl, canCreateChannel, canJoinPublicChannel} = this.props;\n\n        const invitePeople = (\n            <Menu.Group>\n                <Menu.ItemAction\n                    id='invitePeople'\n                    onClick={this.props.invitePeopleModal}\n                    icon={<i className='icon-account-plus-outline'/>}\n                    text={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.invitePeople', defaultMessage: 'Invite People'})}\n                    extraText={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.invitePeopleExtraText', defaultMessage: 'Add people to the team'})}\n                />\n            </Menu.Group>\n        );\n\n        let joinPublicChannel;\n        if (canJoinPublicChannel) {\n            joinPublicChannel = (\n                <Menu.ItemAction\n                    id='showMoreChannels'\n                    onClick={this.props.showMoreChannelsModal}\n                    icon={<i className='icon-globe'/>}\n                    text={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.browseChannels', defaultMessage: 'Browse Channels'})}\n                />\n            );\n        }\n\n        let createChannel;\n        if (canCreateChannel) {\n            createChannel = (\n                <Menu.ItemAction\n                    id='showNewChannel'\n                    onClick={this.props.showNewChannelModal}\n                    icon={<i className='icon-plus'/>}\n                    text={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.createNewChannel', defaultMessage: 'Create New Channel'})}\n                />\n            );\n        }\n\n        let createCategory;\n        if (!this.props.unreadFilterEnabled) {\n            createCategory = (\n                <Menu.Group>\n                    <Menu.ItemAction\n                        id='createCategory'\n                        onClick={this.props.showCreateCategoryModal}\n                        icon={<i className='icon-folder-plus-outline'/>}\n                        text={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.createCategory', defaultMessage: 'Create New Category'})}\n                    />\n                </Menu.Group>);\n        }\n\n        const createDirectMessage = (\n            <Menu.ItemAction\n                id={'browseDirectMessages'}\n                onClick={this.props.handleOpenDirectMessagesModal}\n                icon={<i className='icon-account-outline'/>}\n                text={intl.formatMessage({id: 'sidebar.openDirectMessage', defaultMessage: 'Open a direct message'})}\n            />\n        );\n\n        return (\n            <>\n                <Menu.Group>\n                    {joinPublicChannel}\n                    {createChannel}\n                    {createDirectMessage}\n                </Menu.Group>\n                {createCategory}\n                {invitePeople}\n            </>\n        );\n    }\n\n    trackOpen(opened: boolean) {\n        if (opened) {\n            trackEvent('ui', 'ui_add_channel_dropdown_opened');\n        }\n    }\n\n    render() {\n        const {intl, canCreateChannel, canJoinPublicChannel} = this.props;\n\n        if (!(canCreateChannel || canJoinPublicChannel)) {\n            return null;\n        }\n\n        const tooltip = (\n            <Tooltip\n                id='new-group-tooltip'\n                className='hidden-xs'\n            >\n                <FormattedMessage\n                    id={'sidebar_left.add_channel_dropdown.browseOrCreateChannels'}\n                    defaultMessage='Browse or create channels'\n                />\n            </Tooltip>\n        );\n\n        let tutorialTip = null;\n        if (this.props.showTutorialTip) {\n            tutorialTip = (\n                <AddChannelTutorialTip\n                    townSquareDisplayName={this.props.townSquareDisplayName}\n                    offTopicDisplayName={this.props.offTopicDisplayName}\n                />\n            );\n        }\n\n        return (\n            <MenuWrapper\n                className='AddChannelDropdown'\n                onToggle={this.trackOpen}\n            >\n                <OverlayTrigger\n                    delayShow={500}\n                    placement='top'\n                    overlay={tooltip}\n                >\n                    <>\n                        <button\n                            className={'AddChannelDropdown_dropdownButton' + this.getClassModifierForAbTest()}\n                            aria-label={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.dropdownAriaLabel', defaultMessage: 'Add Channel Dropdown'})}\n                        >\n                            <i className='icon-plus'/>\n                        </button>\n                        {tutorialTip}\n                    </>\n                </OverlayTrigger>\n                <Menu\n                    id='AddChannelDropdown'\n                    ariaLabel={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.dropdownAriaLabel', defaultMessage: 'Add Channel Dropdown'})}\n                >\n                    {this.renderDropdownItems()}\n                </Menu>\n            </MenuWrapper>\n        );\n    }\n}\n\nexport default injectIntl(AddChannelDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport classNames from 'classnames';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport {localizeMessage} from 'utils/utils';\n\ntype Props = {\n    hasMultipleTeams: boolean;\n    unreadFilterEnabled: boolean;\n    actions: {\n        setUnreadFilterEnabled: (enabled: boolean) => void;\n    };\n};\n\ntype State = {\n\n};\n\nexport default class ChannelFilter extends React.PureComponent<Props, State> {\n    toggleUnreadFilter = () => {\n        const {unreadFilterEnabled} = this.props;\n\n        if (unreadFilterEnabled) {\n            trackEvent('ui', 'ui_sidebar_unread_filter_disabled');\n        } else {\n            trackEvent('ui', 'ui_sidebar_unread_filter_enabled');\n        }\n\n        this.props.actions.setUnreadFilterEnabled(!unreadFilterEnabled);\n    }\n\n    render() {\n        const {unreadFilterEnabled, hasMultipleTeams} = this.props;\n\n        let tooltipMessage = localizeMessage('sidebar_left.channel_filter.filterByUnread', 'Filter by unread');\n\n        if (unreadFilterEnabled) {\n            tooltipMessage = localizeMessage('sidebar_left.channel_filter.showAllChannels', 'Show all channels');\n        }\n\n        const tooltip = (\n            <Tooltip\n                id='new-group-tooltip'\n                className='hidden-xs'\n            >\n                {tooltipMessage}\n            </Tooltip>\n        );\n\n        return (\n            <div className='SidebarFilters'>\n                <OverlayTrigger\n                    delayShow={500}\n                    placement={hasMultipleTeams ? 'top' : 'right'}\n                    overlay={tooltip}\n                >\n                    <a\n                        href='#'\n                        className={classNames('SidebarFilters_filterButton', {\n                            active: unreadFilterEnabled,\n                        })}\n                        onClick={this.toggleUnreadFilter}\n                        aria-label={tooltipMessage}\n                    >\n                        <i className='icon icon-filter-variant'/>\n                    </a>\n                </OverlayTrigger>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {getMyTeams} from 'mattermost-redux/selectors/entities/teams';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {setUnreadFilterEnabled} from 'actions/views/channel_sidebar';\nimport {isUnreadFilterEnabled} from 'selectors/views/channel_sidebar';\nimport {GlobalState} from 'types/store';\n\nimport ChannelFilter from './channel_filter';\n\nfunction mapStateToProps(state: GlobalState) {\n    const teams = getMyTeams(state);\n\n    return {\n        hasMultipleTeams: teams && teams.length > 1,\n        unreadFilterEnabled: isUnreadFilterEnabled(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            setUnreadFilterEnabled,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelFilter);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport classNames from 'classnames';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport Constants, {ModalIdentifiers} from 'utils/constants';\nimport QuickSwitchModal from 'components/quick_switch_modal';\nimport * as Utils from 'utils/utils';\nimport {isDesktopApp} from 'utils/user_agent';\nimport AddChannelDropdown from '../add_channel_dropdown';\nimport ChannelFilter from '../channel_filter';\nimport {AddChannelButtonTreatments} from 'mattermost-redux/constants/config';\n\nexport type Props = {\n    addChannelButton?: AddChannelButtonTreatments;\n    canGoForward: boolean;\n    canGoBack: boolean;\n    canJoinPublicChannel: boolean;\n    showMoreChannelsModal: () => void;\n    invitePeopleModal: () => void;\n    showNewChannelModal: () => void;\n    showCreateCategoryModal: () => void;\n    handleOpenDirectMessagesModal: (e: Event) => void;\n    unreadFilterEnabled: boolean;\n    canCreateChannel: boolean;\n    showUnreadsCategory: boolean;\n    townSquareDisplayName: string;\n    offTopicDisplayName: string;\n    showTutorialTip: boolean;\n    globalHeaderEnabled: boolean;\n    isQuickSwitcherOpen: boolean;\n    actions: {\n        openModal: (modalData: any) => Promise<{data: boolean}>;\n        closeModal: (modalId: string) => void;\n        goBack: () => void;\n        goForward: () => void;\n    };\n};\n\nexport default class ChannelNavigator extends React.PureComponent<Props> {\n    componentDidMount() {\n        document.addEventListener('keydown', this.handleShortcut);\n        document.addEventListener('keydown', this.handleQuickSwitchKeyPress);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleShortcut);\n        document.removeEventListener('keydown', this.handleQuickSwitchKeyPress);\n    }\n\n    openQuickSwitcher = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n        e.preventDefault();\n\n        trackEvent('ui', 'ui_sidebar_open_channel_switcher_v2');\n\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.QUICK_SWITCH,\n            dialogType: QuickSwitchModal,\n        });\n    }\n\n    handleShortcut = (e: KeyboardEvent) => {\n        const {actions: {closeModal}} = this.props;\n\n        if (Utils.cmdOrCtrlPressed(e) && e.shiftKey) {\n            if (Utils.isKeyPressed(e, Constants.KeyCodes.M)) {\n                e.preventDefault();\n                closeModal(ModalIdentifiers.QUICK_SWITCH);\n            }\n            if (Utils.isKeyPressed(e, Constants.KeyCodes.L)) {\n                // just close the modal if it's open, but let someone else handle the shortcut\n                closeModal(ModalIdentifiers.QUICK_SWITCH);\n            }\n        }\n    };\n\n    handleQuickSwitchKeyPress = (e: KeyboardEvent) => {\n        if (Utils.cmdOrCtrlPressed(e) && !e.shiftKey && Utils.isKeyPressed(e, Constants.KeyCodes.K)) {\n            if (!e.altKey) {\n                e.preventDefault();\n                this.toggleQuickSwitchModal();\n            }\n        }\n    }\n\n    toggleQuickSwitchModal = () => {\n        const {isQuickSwitcherOpen, actions: {openModal, closeModal}} = this.props;\n\n        if (isQuickSwitcherOpen) {\n            closeModal(ModalIdentifiers.QUICK_SWITCH);\n        } else {\n            openModal({\n                modalId: ModalIdentifiers.QUICK_SWITCH,\n                dialogType: QuickSwitchModal,\n            });\n        }\n    }\n\n    goBack = () => {\n        trackEvent('ui', 'ui_history_back');\n        this.props.actions.goBack();\n    }\n\n    goForward = () => {\n        trackEvent('ui', 'ui_history_forward');\n        this.props.actions.goForward();\n    }\n\n    render() {\n        const jumpToButton = (\n            <button\n                className={'SidebarChannelNavigator_jumpToButton'}\n                onClick={this.openQuickSwitcher}\n                aria-label={Utils.localizeMessage('sidebar_left.channel_navigator.channelSwitcherLabel', 'Channel Switcher')}\n            >\n                <i className='icon icon-magnify'/>\n                <FormattedMessage\n                    id='sidebar_left.channel_navigator.jumpTo'\n                    defaultMessage='Find channel'\n                />\n                <div className={'SidebarChannelNavigator_shortcutText'}>\n                    {`${Utils.isMac() ? '⌘' : 'Ctrl+'}K`}\n                </div>\n            </button>\n        );\n\n        let addChannelDropdown = null;\n        if (!this.props.addChannelButton || this.props.addChannelButton === AddChannelButtonTreatments.NONE) {\n            addChannelDropdown = (\n                <AddChannelDropdown\n                    showNewChannelModal={this.props.showNewChannelModal}\n                    showMoreChannelsModal={this.props.showMoreChannelsModal}\n                    invitePeopleModal={this.props.invitePeopleModal}\n                    showCreateCategoryModal={this.props.showCreateCategoryModal}\n                    canCreateChannel={this.props.canCreateChannel}\n                    canJoinPublicChannel={this.props.canJoinPublicChannel}\n                    handleOpenDirectMessagesModal={this.props.handleOpenDirectMessagesModal}\n                    unreadFilterEnabled={this.props.unreadFilterEnabled}\n                    townSquareDisplayName={this.props.townSquareDisplayName}\n                    offTopicDisplayName={this.props.offTopicDisplayName}\n                    showTutorialTip={this.props.showTutorialTip}\n                    addChannelButton={this.props.addChannelButton}\n                />\n            );\n        }\n\n        let layout;\n        if (isDesktopApp() && !this.props.globalHeaderEnabled) {\n            const historyArrows = (\n                <>\n                    <button\n                        className={classNames('SidebarChannelNavigator_backButton', {disabled: !this.props.canGoBack})}\n                        disabled={!this.props.canGoBack}\n                        onClick={this.goBack}\n                        aria-label={Utils.localizeMessage('sidebar_left.channel_navigator.goBackLabel', 'Back')}\n                    >\n                        <i className='icon icon-arrow-left'/>\n                    </button>\n                    <button\n                        className={classNames('SidebarChannelNavigator_forwardButton', {disabled: !this.props.canGoForward})}\n                        disabled={!this.props.canGoForward}\n                        onClick={this.goForward}\n                        aria-label={Utils.localizeMessage('sidebar_left.channel_navigator.goForwardLabel', 'Forward')}\n                    >\n                        <i className='icon icon-arrow-right'/>\n                    </button>\n                </>\n            );\n\n            layout = (\n                <div className={'SidebarChannelNavigator desktop'}>\n                    {jumpToButton}\n                    <div className='SidebarContainer_filterAddChannel desktop'>\n                        <div className='SidebarContainer_rightContainer'>\n                            {!this.props.showUnreadsCategory && <ChannelFilter/>}\n                            {!this.props.showUnreadsCategory && <div className='SidebarChannelNavigator_divider'/>}\n                            {!this.props.globalHeaderEnabled && historyArrows}\n                        </div>\n                        {addChannelDropdown}\n                    </div>\n                </div>\n            );\n        } else {\n            layout = (\n                <div className={'SidebarChannelNavigator webapp'}>\n                    {!this.props.showUnreadsCategory && <ChannelFilter/>}\n                    {jumpToButton}\n                    {addChannelDropdown}\n                </div>\n            );\n        }\n\n        return layout;\n    }\n\n    // TODO: the render function in place can be replaced with this one, once we successfully release v6.0\n    // render() {\n    //     let addChannelDropdown = null;\n    //     if (!this.props.addChannelButton || this.props.addChannelButton === AddChannelButtonTreatments.NONE) (\n    //         <AddChannelDropdown\n    //             showNewChannelModal={this.props.showNewChannelModal}\n    //             showMoreChannelsModal={this.props.showMoreChannelsModal}\n    //             invitePeopleModal={this.props.invitePeopleModal}\n    //             showCreateCategoryModal={this.props.showCreateCategoryModal}\n    //             canCreateChannel={this.props.canCreateChannel}\n    //             canJoinPublicChannel={this.props.canJoinPublicChannel}\n    //             handleOpenDirectMessagesModal={this.props.handleOpenDirectMessagesModal}\n    //             unreadFilterEnabled={this.props.unreadFilterEnabled}\n    //             townSquareDisplayName={this.props.townSquareDisplayName}\n    //             offTopicDisplayName={this.props.offTopicDisplayName}\n    //             showTutorialTip={this.props.showTutorialTip}\n    //             addChannelButton={this.props.addChannelButton}\n    //         />\n    //     );\n    //\n    //     return (\n    //         <div className={'SidebarChannelNavigator webapp'}>\n    //             {!this.props.showUnreadsCategory && <ChannelFilter/>}\n    //             <button\n    //                 className={'SidebarChannelNavigator_jumpToButton'}\n    //                 onClick={this.openQuickSwitcher}\n    //                 aria-label={Utils.localizeMessage('sidebar_left.channel_navigator.channelSwitcherLabel', 'Channel Switcher')}\n    //             >\n    //                 <i className='icon icon-magnify'/>\n    //                 <FormattedMessage\n    //                     id='sidebar_left.channel_navigator.jumpTo'\n    //                     defaultMessage='Find channel'\n    //                 />\n    //                 <div className={'SidebarChannelNavigator_shortcutText'}>\n    //                     {`${Utils.isMac() ? '⌘' : 'Ctrl+'}K`}\n    //                 </div>\n    //             </button>\n    //             {addChannelDropdown}\n    //         </div>\n    //     );\n    // }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport {ActionFunc} from 'mattermost-redux/types/actions';\nimport {getChannelsNameMapInCurrentTeam} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getInt, shouldShowUnreadsCategory, getAddChannelButtonTreatment} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {openModal, closeModal} from 'actions/views/modals';\nimport {browserHistory} from 'utils/browser_history';\nimport {Constants, ModalIdentifiers, Preferences, TutorialSteps} from 'utils/constants';\nimport {getGlobalHeaderEnabled} from 'selectors/global_header';\nimport {isModalOpen} from 'selectors/views/modals';\nimport {GlobalState} from 'types/store';\n\nimport ChannelNavigator from './channel_navigator';\n\n// TODO: For Phase 1. Will revisit history in Phase 2\nfunction goBack() {\n    return () => {\n        browserHistory.goBack();\n        return {data: null};\n    };\n}\n\nfunction goForward() {\n    return () => {\n        browserHistory.goForward();\n        return {data: null};\n    };\n}\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n    const channelsByName = getChannelsNameMapInCurrentTeam(state);\n    const enableTutorial = config.EnableTutorial === 'true';\n    const tutorialStep = getInt(state, Preferences.TUTORIAL_STEP, getCurrentUserId(state), TutorialSteps.FINISHED);\n\n    return {\n        townSquareDisplayName: channelsByName[Constants.DEFAULT_CHANNEL]?.display_name || '',\n        offTopicDisplayName: channelsByName[Constants.OFFTOPIC_CHANNEL]?.display_name || '',\n        showTutorialTip: enableTutorial && tutorialStep === TutorialSteps.ADD_CHANNEL_POPOVER,\n        canGoBack: true, // TODO: Phase 1 only\n        canGoForward: true,\n        showUnreadsCategory: shouldShowUnreadsCategory(state),\n        globalHeaderEnabled: getGlobalHeaderEnabled(state),\n        addChannelButton: getAddChannelButtonTreatment(state),\n        isQuickSwitcherOpen: isModalOpen(state, ModalIdentifiers.QUICK_SWITCH),\n    };\n}\n\ntype Actions = {\n    openModal: (modalData: any) => Promise<{data: boolean}>;\n    closeModal: (modalId: string) => void;\n    goBack: () => void;\n    goForward: () => void;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            openModal,\n            closeModal,\n            goBack,\n            goForward,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelNavigator);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n    unreadMentions: number;\n};\n\ntype State = {\n\n};\n\nexport default class ChannelMentionBadge extends React.PureComponent<Props, State> {\n    render() {\n        if (this.props.unreadMentions > 0) {\n            return (\n                <span\n                    id='unreadMentions'\n                    className='badge'\n                >\n                    {this.props.unreadMentions}\n                </span>\n            );\n        }\n\n        return null;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\ntype Props = {\n    icon: JSX.Element | null;\n    channel: Channel;\n    hasDraft: boolean;\n};\n\nexport default class SidebarChannelIcon extends React.PureComponent<Props> {\n    render() {\n        if (this.props.channel.delete_at !== 0) {\n            return (\n                <i className='icon icon-archive-outline'/>\n            );\n        } else if (this.props.hasDraft) {\n            return (\n                <i\n                    data-testid='draftIcon'\n                    className='icon icon-pencil-outline'\n                />\n            );\n        }\n\n        return this.props.icon;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels';\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport {getPostDraft} from 'selectors/rhs';\nimport {StoragePrefixes} from 'utils/constants';\nimport {GlobalState} from 'types/store';\n\nimport SidebarChannelIcon from './sidebar_channel_icon';\n\ntype OwnProps = {\n    channel?: Channel;\n}\n\nfunction hasDraft(draft: any, currentChannelId?: string, channel?: Channel) {\n    return draft && Boolean(draft.message.trim() || draft.fileInfos.length || draft.uploadsInProgress.length) && currentChannelId !== channel?.id;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const currentChannelId = getCurrentChannelId(state);\n    const draft = ownProps.channel?.id ? getPostDraft(state, StoragePrefixes.DRAFT, ownProps.channel.id) : false;\n\n    return {\n        hasDraft: hasDraft(draft, currentChannelId, ownProps.channel),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SidebarChannelIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport classNames from 'classnames';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport Menu from 'components/widgets/menu/menu';\nimport {DraggingState} from 'types/store';\nimport {DraggingStates} from 'utils/constants';\n\nconst MENU_BOTTOM_MARGIN = 80;\n\ntype Props = {\n    id: string;\n    children?: React.ReactNode;\n    tooltipText: string;\n    buttonAriaLabel: string;\n    ariaLabel: string;\n    refCallback?: (ref: SidebarMenu) => void;\n    isMenuOpen: boolean;\n    onToggleMenu: (open: boolean) => void;\n    draggingState: DraggingState;\n    tabIndex?: number;\n    additionalClass?: string;\n};\n\ntype State = {\n    openUp: boolean;\n    width: number;\n};\n\nexport default class SidebarMenu extends React.PureComponent<Props, State> {\n    menuWrapperRef: React.RefObject<MenuWrapper>;\n    menuRef?: Menu;\n    menuButtonRef: React.RefObject<HTMLButtonElement>;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            openUp: false,\n            width: 0,\n        };\n\n        this.menuWrapperRef = React.createRef();\n        this.menuButtonRef = React.createRef();\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (prevProps.draggingState.state !== this.props.draggingState.state && this.props.draggingState.state === DraggingStates.CAPTURE) {\n            this.closeMenu();\n        }\n\n        if (this.props.isMenuOpen && !prevProps.isMenuOpen) {\n            this.setMenuPosition();\n            this.disableScrollbar();\n        }\n    }\n\n    closeMenu = () => {\n        if (this.menuWrapperRef.current) {\n            this.menuWrapperRef.current.close();\n        }\n\n        this.props.onToggleMenu(false);\n    }\n\n    // Set the z-index on the sidebar scrollbar while a menu is open so that it doesn't float on top of menus\n    disableScrollbar = () => {\n        const scrollbars: NodeListOf<HTMLElement> = document.querySelectorAll('#SidebarContainer .SidebarNavContainer .scrollbar--view');\n        if (scrollbars && scrollbars[0]) {\n            scrollbars[0].style.zIndex = this.props.isMenuOpen ? '3' : 'unset';\n        }\n    }\n\n    refCallback = (ref: Menu) => {\n        if (ref) {\n            this.menuRef = ref;\n\n            const rect = ref.rect();\n            const buttonRect = this.menuButtonRef.current?.getBoundingClientRect();\n            const y = typeof buttonRect?.y === 'undefined' ? buttonRect?.top : buttonRect.y;\n            const windowHeight = window.innerHeight;\n\n            const totalSpace = windowHeight - MENU_BOTTOM_MARGIN;\n            const spaceOnTop = y || 0;\n            const spaceOnBottom = totalSpace - spaceOnTop;\n\n            this.setState({\n                openUp: (spaceOnTop > spaceOnBottom),\n                width: rect?.width || 0,\n            }, () => {\n                if (this.props.refCallback) {\n                    this.props.refCallback(this);\n                }\n            });\n        }\n    }\n\n    setMenuPosition = () => {\n        if (this.menuButtonRef.current && this.menuRef) {\n            const menuRef = this.menuRef.node.current?.parentElement as HTMLDivElement;\n            const openUpOffset = this.state.openUp ? -this.menuButtonRef.current.getBoundingClientRect().height : 0;\n            menuRef.style.top = `${window.scrollY + this.menuButtonRef.current.getBoundingClientRect().top + this.menuButtonRef.current.clientHeight + openUpOffset}px`;\n        }\n    }\n\n    render() {\n        const {\n            ariaLabel,\n            buttonAriaLabel,\n            children,\n            isMenuOpen,\n            tooltipText,\n            id,\n            additionalClass,\n        } = this.props;\n\n        const tooltip = (\n            <Tooltip\n                id='new-group-tooltip'\n                className='hidden-xs'\n            >\n                {tooltipText}\n            </Tooltip>\n        );\n\n        return (\n            <MenuWrapper\n                ref={this.menuWrapperRef}\n                className={classNames('SidebarMenu', {\n                    menuOpen: isMenuOpen,\n                })}\n                onToggle={this.props.onToggleMenu}\n                stopPropagationOnToggle={true}\n            >\n                <OverlayTrigger\n                    delayShow={500}\n                    placement='top'\n                    overlay={tooltip}\n                    disabled={isMenuOpen}\n                >\n                    <button\n                        ref={this.menuButtonRef}\n                        className={classNames(['SidebarMenu_menuButton', {additionalClass}])}\n                        aria-label={buttonAriaLabel}\n                        tabIndex={this.props.tabIndex}\n                    >\n                        <i className='icon-dots-vertical'/>\n                    </button>\n                </OverlayTrigger>\n                <Menu\n                    ref={this.refCallback}\n                    openUp={this.state.openUp}\n                    id={`SidebarMenu-${id}`}\n                    ariaLabel={ariaLabel}\n                >\n                    {children}\n                </Menu>\n            </MenuWrapper>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getDraggingState} from 'selectors/views/channel_sidebar';\nimport {GlobalState} from 'types/store';\n\nimport SidebarMenu from './sidebar_menu';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        draggingState: getDraggingState(state),\n    };\n}\n\nexport default connect(mapStateToProps)(SidebarMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {IntlShape, injectIntl} from 'react-intl';\n\nimport {CategoryTypes} from 'mattermost-redux/constants/channel_categories';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {ChannelCategory} from 'mattermost-redux/types/channel_categories';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport ChannelInviteModal from 'components/channel_invite_modal';\nimport EditCategoryModal from 'components/edit_category_modal';\nimport SidebarMenu from 'components/sidebar/sidebar_menu';\nimport SidebarMenuType from 'components/sidebar/sidebar_menu/sidebar_menu';\nimport Menu from 'components/widgets/menu/menu';\nimport Constants, {ModalIdentifiers} from 'utils/constants';\nimport {copyToClipboard} from 'utils/utils';\n\ntype Props = {\n    channel: Channel;\n    channelLink: string;\n    categories?: ChannelCategory[];\n    currentCategory?: ChannelCategory;\n    currentUserId: string;\n    currentTeamId: string;\n    isUnread: boolean;\n    isFavorite: boolean;\n    isMuted: boolean;\n    intl: IntlShape;\n    managePublicChannelMembers: boolean;\n    managePrivateChannelMembers: boolean;\n    closeHandler?: (callback: () => void) => void;\n    isCollapsed: boolean;\n    isMenuOpen: boolean;\n    onToggleMenu: (isMenuOpen: boolean) => void;\n    multiSelectedChannelIds: string[];\n    displayedChannels: Channel[];\n    actions: {\n        markChannelAsRead: (channelId: string) => void;\n        favoriteChannel: (channelId: string) => void;\n        unfavoriteChannel: (channelId: string) => void;\n        muteChannel: (userId: string, channelId: string) => void;\n        unmuteChannel: (userId: string, channelId: string) => void;\n        openModal: (modalData: any) => void;\n        addChannelsInSidebar: (categoryId: string, channelId: string) => void;\n    };\n};\n\ntype State = {\n    openUp: boolean;\n};\n\nexport class SidebarChannelMenu extends React.PureComponent<Props, State> {\n    isLeaving: boolean;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            openUp: false,\n        };\n\n        this.isLeaving = false;\n    }\n\n    markAsRead = () => {\n        this.props.actions.markChannelAsRead(this.props.channel.id);\n        trackEvent('ui', 'ui_sidebar_channel_menu_markAsRead');\n    }\n\n    favoriteChannel = () => {\n        this.props.actions.favoriteChannel(this.props.channel.id);\n        trackEvent('ui', 'ui_sidebar_channel_menu_favorite');\n    }\n\n    unfavoriteChannel = () => {\n        this.props.actions.unfavoriteChannel(this.props.channel.id);\n        trackEvent('ui', 'ui_sidebar_channel_menu_unfavorite');\n    }\n\n    unmuteChannel = () => {\n        this.props.actions.unmuteChannel(this.props.currentUserId, this.props.channel.id);\n    }\n\n    muteChannel = () => {\n        this.props.actions.muteChannel(this.props.currentUserId, this.props.channel.id);\n    }\n\n    moveToCategory = (categoryId: string) => {\n        return () => {\n            this.props.actions.addChannelsInSidebar(categoryId, this.props.channel.id);\n            trackEvent('ui', 'ui_sidebar_channel_menu_moveToExistingCategory');\n        };\n    }\n\n    moveToNewCategory = () => {\n        const {actions, multiSelectedChannelIds, channel} = this.props;\n\n        actions.openModal({\n            modalId: ModalIdentifiers.EDIT_CATEGORY,\n            dialogType: EditCategoryModal,\n            dialogProps: {\n                channelIdsToAdd: multiSelectedChannelIds.indexOf(channel.id) === -1 ? [channel.id] : multiSelectedChannelIds,\n            },\n        });\n        trackEvent('ui', 'ui_sidebar_channel_menu_createCategory');\n    }\n\n    copyLink = () => {\n        copyToClipboard(this.props.channelLink);\n    }\n\n    handleLeaveChannel = (e: React.MouseEvent<HTMLSpanElement, MouseEvent>) => {\n        e.preventDefault();\n        e.stopPropagation();\n        if (this.isLeaving || !this.props.closeHandler) {\n            return;\n        }\n\n        this.isLeaving = true;\n        trackEvent('ui', 'ui_sidebar_channel_menu_leave');\n\n        this.props.closeHandler(() => {\n            this.isLeaving = false;\n        });\n    }\n\n    addMembers = () => {\n        const {channel, actions} = this.props;\n\n        actions.openModal({\n            modalId: ModalIdentifiers.CHANNEL_INVITE,\n            dialogType: ChannelInviteModal,\n            dialogProps: {channel},\n        });\n        trackEvent('ui', 'ui_sidebar_channel_menu_addMembers');\n    }\n\n    renderDropdownItems = () => {\n        const {intl, isUnread, isFavorite, isMuted, channel, categories, displayedChannels, multiSelectedChannelIds} = this.props;\n\n        if (!categories) {\n            return null;\n        }\n\n        let markAsRead;\n        if (isUnread) {\n            markAsRead = (\n                <Menu.ItemAction\n                    id={`markAsRead-${channel.id}`}\n                    onClick={this.markAsRead}\n                    icon={<i className='icon-mark-as-unread'/>}\n                    text={intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.markAsRead', defaultMessage: 'Mark as Read'})}\n                />\n            );\n        }\n\n        let favorite;\n        if (isFavorite) {\n            favorite = (\n                <Menu.ItemAction\n                    id={`unfavorite-${channel.id}`}\n                    onClick={this.unfavoriteChannel}\n                    icon={<i className='icon-star'/>}\n                    text={intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.unfavoriteChannel', defaultMessage: 'Unfavorite'})}\n                />\n            );\n        } else {\n            favorite = (\n                <Menu.ItemAction\n                    id={`favorite-${channel.id}`}\n                    onClick={this.favoriteChannel}\n                    icon={<i className='icon-star-outline'/>}\n                    text={intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.favoriteChannel', defaultMessage: 'Favorite'})}\n                />\n            );\n        }\n\n        let muteChannel;\n        if (isMuted) {\n            let muteChannelText = intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.unmuteChannel', defaultMessage: 'Unmute Channel'});\n            if (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL) {\n                muteChannelText = intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.unmuteConversation', defaultMessage: 'Unmute Conversation'});\n            }\n            muteChannel = (\n                <Menu.ItemAction\n                    id={`unmute-${channel.id}`}\n                    onClick={this.unmuteChannel}\n                    icon={<i className='icon-bell-off-outline'/>}\n                    text={muteChannelText}\n                />\n            );\n        } else {\n            let muteChannelText = intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.muteChannel', defaultMessage: 'Mute Channel'});\n            if (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL) {\n                muteChannelText = intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.muteConversation', defaultMessage: 'Mute Conversation'});\n            }\n            muteChannel = (\n                <Menu.ItemAction\n                    id={`mute-${channel.id}`}\n                    onClick={this.muteChannel}\n                    icon={<i className='icon-bell-outline'/>}\n                    text={muteChannelText}\n                />\n            );\n        }\n\n        const selectedChannels = multiSelectedChannelIds.indexOf(channel.id) === -1 ? [channel] : displayedChannels.filter((c) => multiSelectedChannelIds.indexOf(c.id) !== -1);\n        const allChannelsAreDMs = selectedChannels.every((selectedChannel) => selectedChannel.type === Constants.DM_CHANNEL || selectedChannel.type === Constants.GM_CHANNEL);\n        const allChannelsAreNotDMs = selectedChannels.every((selectedChannel) => selectedChannel.type !== Constants.DM_CHANNEL && selectedChannel.type !== Constants.GM_CHANNEL);\n\n        const categoryMenuItems = categories.filter((category) => {\n            if (category.id === this.props.currentCategory?.id) {\n                return false;\n            }\n\n            if (allChannelsAreDMs) {\n                return category.type !== CategoryTypes.CHANNELS;\n            } else if (allChannelsAreNotDMs) {\n                return category.type !== CategoryTypes.DIRECT_MESSAGES;\n            }\n\n            return true;\n        }).map((category) => {\n            return {\n                id: `moveToCategory-${channel.id}-${category.id}`,\n                icon: category.type === CategoryTypes.FAVORITES ? (<i className='icon-star-outline'/>) : (<i className='icon-folder-outline'/>),\n                direction: 'right' as any,\n                text: category.display_name,\n                action: this.moveToCategory(category.id),\n            } as any;\n        });\n\n        categoryMenuItems.push(\n            {\n                id: 'SidebarChannelMenu-moveToDivider',\n                text: (<li className='MenuGroup menu-divider'/>),\n            },\n            {\n                id: `moveToNewCategory-${channel.id}`,\n                icon: (<i className='icon-folder-move-outline'/>),\n                direction: 'right' as any,\n                text: intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.moveToNewCategory', defaultMessage: 'New Category'}),\n                action: this.moveToNewCategory,\n            },\n        );\n\n        let copyLink;\n        if (channel.type === Constants.OPEN_CHANNEL || channel.type === Constants.PRIVATE_CHANNEL) {\n            copyLink = (\n                <Menu.ItemAction\n                    id={`copyLink-${channel.id}`}\n                    onClick={this.copyLink}\n                    icon={<i className='icon-link-variant'/>}\n                    text={intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.copyLink', defaultMessage: 'Copy Link'})}\n                />\n            );\n        }\n\n        let addMembers;\n        if ((channel.type === Constants.PRIVATE_CHANNEL && this.props.managePrivateChannelMembers) || (channel.type === Constants.OPEN_CHANNEL && this.props.managePublicChannelMembers)) {\n            addMembers = (\n                <Menu.ItemAction\n                    id={`addMembers-${channel.id}`}\n                    onClick={this.addMembers}\n                    icon={<i className='icon-account-outline'/>}\n                    text={intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.addMembers', defaultMessage: 'Add Members'})}\n                />\n            );\n        }\n\n        let leaveChannelText = intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.leaveChannel', defaultMessage: 'Leave Channel'});\n        if (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL) {\n            leaveChannelText = intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.leaveConversation', defaultMessage: 'Close Conversation'});\n        }\n\n        let leaveChannel;\n        if (channel.name !== Constants.DEFAULT_CHANNEL) {\n            leaveChannel = (\n                <Menu.Group>\n                    <Menu.ItemAction\n                        id={`leave-${channel.id}`}\n                        onClick={this.handleLeaveChannel}\n                        icon={<i className='icon-close'/>}\n                        text={leaveChannelText}\n                    />\n                </Menu.Group>\n            );\n        }\n\n        return (\n            <React.Fragment>\n                <Menu.Group>\n                    {markAsRead}\n                    {favorite}\n                    {muteChannel}\n                </Menu.Group>\n                <Menu.Group>\n                    <Menu.ItemSubMenu\n                        id={`moveTo-${channel.id}`}\n                        subMenu={categoryMenuItems}\n                        text={intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.moveTo', defaultMessage: 'Move to'})}\n                        icon={<i className='icon-folder-move-outline'/>}\n                        direction={'right' as any}\n                        openUp={this.state.openUp}\n                    />\n                </Menu.Group>\n                <Menu.Group>\n                    {copyLink}\n                    {addMembers}\n                </Menu.Group>\n                {leaveChannel}\n            </React.Fragment>\n        );\n    }\n\n    refCallback = (ref: SidebarMenuType) => {\n        if (ref) {\n            this.setState({\n                openUp: ref.state.openUp,\n            });\n        }\n    }\n\n    onToggleMenu = (open: boolean) => {\n        this.props.onToggleMenu(open);\n\n        if (open) {\n            trackEvent('ui', 'ui_sidebar_channel_menu_opened');\n        }\n    }\n\n    render() {\n        const {\n            channel,\n            intl,\n            isCollapsed,\n            isMenuOpen,\n        } = this.props;\n\n        return (\n            <SidebarMenu\n                refCallback={this.refCallback}\n                id={`SidebarChannelMenu-${channel.id}`}\n                ariaLabel={intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.dropdownAriaLabel', defaultMessage: 'Channel Menu'})}\n                buttonAriaLabel={intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.dropdownAriaLabel', defaultMessage: 'Channel Menu'})}\n                isMenuOpen={isMenuOpen}\n                onToggleMenu={this.onToggleMenu}\n                tooltipText={intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.editChannel', defaultMessage: 'Channel options'})}\n                tabIndex={isCollapsed ? -1 : 0}\n            >\n                {isMenuOpen && this.renderDropdownItems()}\n            </SidebarMenu>\n        );\n    }\n}\n\nexport default injectIntl(SidebarChannelMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {Dispatch, bindActionCreators, ActionCreatorsMapObject} from 'redux';\n\nimport {favoriteChannel, unfavoriteChannel, markChannelAsRead} from 'mattermost-redux/actions/channels';\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {isFavoriteChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getMyChannelMemberships, getCurrentUserId} from 'mattermost-redux/selectors/entities/common';\nimport {getCategoryInTeamWithChannel} from 'mattermost-redux/selectors/entities/channel_categories';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {Action} from 'mattermost-redux/types/actions';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {isChannelMuted} from 'mattermost-redux/utils/channel_utils';\n\nimport {unmuteChannel, muteChannel} from 'actions/channel_actions';\nimport {addChannelsInSidebar} from 'actions/views/channel_sidebar';\nimport {openModal} from 'actions/views/modals';\n\nimport {getCategoriesForCurrentTeam, getDisplayedChannels} from 'selectors/views/channel_sidebar';\n\nimport {GlobalState} from 'types/store';\n\nimport {getSiteURL} from 'utils/url';\n\nimport SidebarChannelMenu from './sidebar_channel_menu';\n\ntype OwnProps = {\n    channel: Channel;\n    channelLink: string;\n    isUnread: boolean;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const member = getMyChannelMemberships(state)[ownProps.channel.id];\n    const currentTeam = getCurrentTeam(state);\n\n    let managePublicChannelMembers = false;\n    let managePrivateChannelMembers = false;\n    let categories;\n    let currentCategory;\n\n    if (currentTeam) {\n        managePublicChannelMembers = haveIChannelPermission(state, currentTeam.id, ownProps.channel.id, Permissions.MANAGE_PUBLIC_CHANNEL_MEMBERS);\n        managePrivateChannelMembers = haveIChannelPermission(state, currentTeam.id, ownProps.channel.id, Permissions.MANAGE_PRIVATE_CHANNEL_MEMBERS);\n        categories = getCategoriesForCurrentTeam(state);\n        currentCategory = getCategoryInTeamWithChannel(state, currentTeam.id, ownProps.channel.id);\n    }\n\n    return {\n        currentTeamId: currentTeam.id,\n        currentUserId: getCurrentUserId(state),\n        categories,\n        currentCategory,\n        isFavorite: isFavoriteChannel(state, ownProps.channel.id),\n        isMuted: isChannelMuted(member),\n        channelLink: `${getSiteURL()}${ownProps.channelLink}`,\n        managePublicChannelMembers,\n        managePrivateChannelMembers,\n        displayedChannels: getDisplayedChannels(state),\n        multiSelectedChannelIds: state.views.channelSidebar.multiSelectedChannelIds,\n    };\n}\n\ntype Actions = {\n    markChannelAsRead: (channelId: string) => void;\n    favoriteChannel: (channelId: string) => void;\n    unfavoriteChannel: (channelId: string) => void;\n    muteChannel: (userId: string, channelId: string) => void;\n    unmuteChannel: (userId: string, channelId: string) => void;\n    openModal: (modalData: any) => void;\n    addChannelsInSidebar: (categoryId: string, channelId: string) => void;\n};\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<Action>, Actions>({\n            markChannelAsRead,\n            favoriteChannel,\n            unfavoriteChannel,\n            muteChannel,\n            unmuteChannel,\n            openModal,\n            addChannelsInSidebar,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SidebarChannelMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport TutorialTip from 'components/tutorial/tutorial_tip';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message.jsx';\n\ntype Props = {\n    townSquareDisplayName?: string;\n    offTopicDisplayName?: string;\n    openLhs: () => void;\n}\n\nexport default class ChannelTutorialTip extends React.PureComponent<Props> {\n    componentDidMount() {\n        if (this.props.townSquareDisplayName || this.props.offTopicDisplayName) {\n            this.props.openLhs();\n        }\n    }\n\n    render = () => {\n        const screens = [\n            <div key='first-screen'>\n                <h4>\n                    <FormattedMessage\n                        id='sidebar.tutorialChannelTypes.title'\n                        defaultMessage='Organize conversations in channels'\n                    />\n                </h4>\n                <p>\n                    <FormattedMarkdownMessage\n                        id='sidebar.tutorialChannelTypes.channels'\n                        defaultMessage={'Channels organize conversations across different topics.'}\n                    />\n                </p>\n                <p>\n                    <FormattedMarkdownMessage\n                        id='sidebar.tutorialChannelTypes.public'\n                        defaultMessage={'**Public channels** are open to everyone on your team.'}\n                    />\n                </p>\n                <p>\n                    <FormattedMarkdownMessage\n                        id='sidebar.tutorialChannelTypes.private'\n                        defaultMessage={'**Private channels** are for sensitive conversations between invited members.'}\n                    />\n                </p>\n                <p>\n                    <FormattedMarkdownMessage\n                        id='sidebar.tutorialChannelTypes.direct'\n                        defaultMessage={'**Direct messages** are for private conversations between individuals or small groups.'}\n                    />\n                </p>\n            </div>,\n        ];\n\n        return (\n            <TutorialTip\n                placement='right'\n                screens={screens}\n                overlayClass='tip-overlay--sidebar'\n                telemetryTag='tutorial_tip_2_channels'\n            />\n        );\n    }\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {Link} from 'react-router-dom';\nimport classNames from 'classnames';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport {mark, trackEvent} from 'actions/telemetry_actions';\n\nimport CopyUrlContextMenu from 'components/copy_url_context_menu';\nimport OverlayTrigger from 'components/overlay_trigger';\n\nimport Constants from 'utils/constants';\nimport {wrapEmojis} from 'utils/emoji_utils';\nimport {isDesktopApp} from 'utils/user_agent';\nimport {cmdOrCtrlPressed, localizeMessage} from 'utils/utils';\n\nimport ChannelMentionBadge from '../channel_mention_badge';\nimport SidebarChannelIcon from '../sidebar_channel_icon';\nimport SidebarChannelMenu from '../sidebar_channel_menu';\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\nimport ChannelTutorialTip from 'components/sidebar/channel_tutorial_tip';\n\ntype Props = {\n    channel: Channel;\n    link: string;\n    label: string;\n    ariaLabelPrefix?: string;\n    closeHandler?: (callback: () => void) => void;\n    icon: JSX.Element | null;\n\n    /**\n     * Number of unread mentions in this channel\n     */\n    unreadMentions: number;\n\n    /**\n     * Number of unread messages in this channel\n     */\n    unreadMsgs: number;\n\n    /**\n     * User preference of whether the channel can be marked unread\n     */\n    showUnreadForMsgs: boolean;\n\n    /**\n     * Checks if the current channel is muted\n     */\n    isMuted: boolean;\n\n    /**\n     * Checks if channel is collapsed\n     */\n    isCollapsed: boolean;\n\n    isChannelSelected: boolean;\n\n    teammateId?: string;\n\n    showTutorialTip: boolean;\n\n    townSquareDisplayName: string;\n\n    offTopicDisplayName: string;\n\n    actions: {\n        clearChannelSelection: () => void;\n        multiSelectChannelTo: (channelId: string) => void;\n        multiSelectChannelAdd: (channelId: string) => void;\n        openLhs: () => void;\n    };\n};\n\ntype State = {\n    isMenuOpen: boolean;\n    showTooltip: boolean;\n};\n\nexport default class SidebarChannelLink extends React.PureComponent<Props, State> {\n    labelRef: React.RefObject<HTMLDivElement>;\n    gmItemRef: React.RefObject<HTMLDivElement>;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.labelRef = React.createRef();\n        this.gmItemRef = React.createRef();\n\n        this.state = {\n            isMenuOpen: false,\n            showTooltip: false,\n        };\n    }\n\n    componentDidMount(): void {\n        this.enableToolTipIfNeeded();\n    }\n\n    componentDidUpdate(prevProps: Props): void {\n        if (prevProps.label !== this.props.label) {\n            this.enableToolTipIfNeeded();\n        }\n    }\n\n    enableToolTipIfNeeded = (): void => {\n        const element = this.gmItemRef.current || this.labelRef.current;\n        const showTooltip = element && element.offsetWidth < element.scrollWidth;\n        this.setState({showTooltip: Boolean(showTooltip)});\n    }\n\n    getAriaLabel = (): string => {\n        const {label, ariaLabelPrefix, unreadMentions} = this.props;\n\n        let ariaLabel = label;\n\n        if (ariaLabelPrefix) {\n            ariaLabel += ` ${ariaLabelPrefix}`;\n        }\n\n        if (unreadMentions === 1) {\n            ariaLabel += ` ${unreadMentions} ${localizeMessage('accessibility.sidebar.types.mention', 'mention')}`;\n        } else if (unreadMentions > 1) {\n            ariaLabel += ` ${unreadMentions} ${localizeMessage('accessibility.sidebar.types.mentions', 'mentions')}`;\n        }\n\n        if (this.showChannelAsUnread() && unreadMentions === 0) {\n            ariaLabel += ` ${localizeMessage('accessibility.sidebar.types.unread', 'unread')}`;\n        }\n\n        return ariaLabel.toLowerCase();\n    }\n\n    // Bootstrap adds the attr dynamically, removing it to prevent a11y readout\n    removeTooltipLink = (): void => this.gmItemRef.current?.removeAttribute?.('aria-describedby');\n\n    handleChannelClick = (event: React.MouseEvent<HTMLAnchorElement>): void => {\n        mark('SidebarLink#click');\n        trackEvent('ui', 'ui_channel_selected_v2');\n\n        this.handleSelectChannel(event);\n    }\n\n    handleSelectChannel = (event: React.MouseEvent<HTMLAnchorElement>): void => {\n        if (event.defaultPrevented || event.button !== 0) {\n            return;\n        }\n\n        if (cmdOrCtrlPressed(event)) {\n            event.preventDefault();\n            this.props.actions.multiSelectChannelAdd(this.props.channel.id);\n        } else if (event.shiftKey) {\n            event.preventDefault();\n            this.props.actions.multiSelectChannelTo(this.props.channel.id);\n        } else {\n            this.props.actions.clearChannelSelection();\n        }\n    }\n\n    handleMenuToggle = (isMenuOpen: boolean): void => this.setState({isMenuOpen});\n\n    /**\n     * Show as unread if you have unread mentions\n     * OR if you have unread messages and the channel can be marked unread by preferences\n     */\n    showChannelAsUnread = (): boolean => this.props.unreadMentions > 0 || (this.props.unreadMsgs > 0 && this.props.showUnreadForMsgs);\n\n    render(): JSX.Element {\n        const {link, label, channel, unreadMentions, icon, isMuted, isChannelSelected, showTutorialTip, actions} = this.props;\n\n        let tutorialTip: JSX.Element | null = null;\n        if (showTutorialTip && channel.name === Constants.DEFAULT_CHANNEL) {\n            tutorialTip = (\n                <ChannelTutorialTip\n                    townSquareDisplayName={this.props.townSquareDisplayName}\n                    offTopicDisplayName={this.props.offTopicDisplayName}\n                    openLhs={actions.openLhs}\n                />\n\n            );\n        }\n\n        let labelElement: JSX.Element = (\n            <span\n                className={classNames(\n                    'SidebarChannelLinkLabel',\n                    {\n                        truncated: this.state.showTooltip,\n                    },\n                )}\n            >\n                {wrapEmojis(label)}\n            </span>\n        );\n        if (this.state.showTooltip) {\n            const displayNameToolTip = (\n                <Tooltip id='channel-displayname__tooltip'>\n                    {label}\n                </Tooltip>\n            );\n            labelElement = (\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='top'\n                    overlay={displayNameToolTip}\n                    onEntering={this.removeTooltipLink}\n                >\n                    <div ref={this.gmItemRef}>\n                        {labelElement}\n                    </div>\n                </OverlayTrigger>\n            );\n        }\n\n        const customStatus = this.props.teammateId ? (\n            <CustomStatusEmoji\n                userID={this.props.teammateId}\n                showTooltip={true}\n                spanStyle={{\n                    height: 18,\n                }}\n                emojiStyle={{\n                    marginTop: -4,\n                    marginLeft: 6,\n                    marginBottom: 0,\n                    opacity: 0.8,\n                }}\n            />\n        ) : null;\n\n        const content = (\n            <>\n                <SidebarChannelIcon\n                    channel={channel}\n                    icon={icon}\n                />\n                <div\n                    className='SidebarChannelLinkLabel_wrapper'\n                    ref={this.labelRef}\n                >\n                    {labelElement}\n                    {customStatus}\n                </div>\n                <ChannelMentionBadge\n                    unreadMentions={unreadMentions}\n                />\n                <SidebarChannelMenu\n                    channel={channel}\n                    isUnread={this.showChannelAsUnread()}\n                    isCollapsed={this.props.isCollapsed}\n                    closeHandler={this.props.closeHandler}\n                    channelLink={link}\n                    isMenuOpen={this.state.isMenuOpen}\n                    onToggleMenu={this.handleMenuToggle}\n                />\n            </>\n        );\n\n        // NOTE: class added to temporarily support the desktop app's at-mention DOM scraping of the old sidebar\n        const className = classNames([\n            'SidebarLink',\n            {\n                menuOpen: this.state.isMenuOpen,\n                muted: isMuted,\n                'unread-title': this.showChannelAsUnread(),\n                selected: isChannelSelected,\n            },\n        ]);\n        let element = (\n            <Link\n                className={className}\n                id={`sidebarItem_${channel.name}`}\n                aria-label={this.getAriaLabel()}\n                to={link}\n                onClick={this.handleChannelClick}\n                tabIndex={this.props.isCollapsed ? -1 : 0}\n            >\n                {content}\n                {tutorialTip}\n            </Link>\n        );\n\n        if (isDesktopApp()) {\n            element = (\n                <CopyUrlContextMenu\n                    link={this.props.link}\n                    menuId={channel.id}\n                >\n                    {element}\n                </CopyUrlContextMenu>\n            );\n        }\n\n        return element;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {getCurrentUserId, getMyChannelMemberships} from 'mattermost-redux/selectors/entities/common';\nimport {getInt, isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {getMsgCountInChannel, isChannelMuted} from 'mattermost-redux/utils/channel_utils';\nimport {getChannelsNameMapInCurrentTeam} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {open as openLhs} from 'actions/views/lhs.js';\nimport {clearChannelSelection, multiSelectChannelAdd, multiSelectChannelTo} from 'actions/views/channel_sidebar';\nimport {isChannelSelected} from 'selectors/views/channel_sidebar';\nimport {GlobalState} from 'types/store';\nimport Constants, {NotificationLevels} from 'utils/constants';\n\nimport SidebarChannelLink from './sidebar_channel_link';\n\ntype OwnProps = {\n    channel: Channel;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const member = getMyChannelMemberships(state)[ownProps.channel.id];\n\n    // Unread counts\n    let unreadMentions = 0;\n    let unreadMsgs = 0;\n    let showUnreadForMsgs = true;\n    const collapsed = isCollapsedThreadsEnabled(state);\n    if (member) {\n        unreadMentions = collapsed ? member.mention_count_root : member.mention_count;\n\n        if (ownProps.channel) {\n            unreadMsgs = getMsgCountInChannel(collapsed, ownProps.channel, member);\n        }\n\n        if (member.notify_props) {\n            showUnreadForMsgs = member.notify_props.mark_unread !== NotificationLevels.MENTION;\n        }\n    }\n\n    const channelsByName = getChannelsNameMapInCurrentTeam(state);\n    const config = getConfig(state);\n    const enableTutorial = config.EnableTutorial === 'true';\n    const currentUserId = getCurrentUserId(state);\n    const tutorialStep = getInt(state, Constants.Preferences.TUTORIAL_STEP, currentUserId, Constants.TutorialSteps.FINISHED);\n\n    return {\n        unreadMentions,\n        unreadMsgs,\n        showUnreadForMsgs,\n        isMuted: isChannelMuted(member),\n        isChannelSelected: isChannelSelected(state, ownProps.channel.id),\n        showTutorialTip: enableTutorial && tutorialStep === Constants.TutorialSteps.CHANNEL_POPOVER,\n        townSquareDisplayName: channelsByName[Constants.DEFAULT_CHANNEL]?.display_name || '',\n        offTopicDisplayName: channelsByName[Constants.OFFTOPIC_CHANNEL]?.display_name || '',\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            clearChannelSelection,\n            multiSelectChannelTo,\n            multiSelectChannelAdd,\n            openLhs,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SidebarChannelLink);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport * as GlobalActions from 'actions/global_actions';\n\nimport SidebarChannelLink from 'components/sidebar/sidebar_channel/sidebar_channel_link';\nimport SharedChannelIndicator from 'components/shared_channel_indicator';\nimport {localizeMessage} from 'utils/utils';\nimport Constants from 'utils/constants';\n\ntype Props = {\n    channel: Channel;\n    currentTeamName: string;\n    isCollapsed: boolean;\n    actions: {\n        leaveChannel: (channelId: any) => void;\n    };\n};\n\ntype State = {\n\n};\n\nexport default class SidebarBaseChannel extends React.PureComponent<Props, State> {\n    handleLeavePublicChannel = () => {\n        this.props.actions.leaveChannel(this.props.channel.id);\n        trackEvent('ui', 'ui_public_channel_x_button_clicked');\n    }\n\n    handleLeavePrivateChannel = () => {\n        GlobalActions.showLeavePrivateChannelModal({id: this.props.channel.id, display_name: this.props.channel.display_name} as Channel);\n        trackEvent('ui', 'ui_private_channel_x_button_clicked');\n    }\n\n    getCloseHandler = () => {\n        const {channel} = this.props;\n\n        if (channel.type === Constants.OPEN_CHANNEL && channel.name !== Constants.DEFAULT_CHANNEL) {\n            return this.handleLeavePublicChannel;\n        } else if (channel.type === Constants.PRIVATE_CHANNEL) {\n            return this.handleLeavePrivateChannel;\n        }\n\n        return null;\n    }\n\n    getIcon = () => {\n        const {channel} = this.props;\n\n        if (channel.shared) {\n            return (\n                <SharedChannelIndicator\n                    className='icon'\n                    channelType={channel.type}\n                    withTooltip={true}\n                />\n            );\n        } else if (channel.type === Constants.OPEN_CHANNEL) {\n            return (\n                <i className='icon icon-globe'/>\n            );\n        } else if (channel.type === Constants.PRIVATE_CHANNEL) {\n            return (\n                <i className='icon icon-lock-outline'/>\n            );\n        }\n\n        return null;\n    }\n\n    render() {\n        const {channel, currentTeamName} = this.props;\n\n        let ariaLabelPrefix;\n        if (channel.type === Constants.OPEN_CHANNEL) {\n            ariaLabelPrefix = localizeMessage('accessibility.sidebar.types.public', 'public channel');\n        } else if (channel.type === Constants.PRIVATE_CHANNEL) {\n            ariaLabelPrefix = localizeMessage('accessibility.sidebar.types.private', 'private channel');\n        }\n\n        return (\n            <SidebarChannelLink\n                channel={channel}\n                link={`/${currentTeamName}/channels/${channel.name}`}\n                label={channel.display_name}\n                ariaLabelPrefix={ariaLabelPrefix}\n                closeHandler={this.getCloseHandler()!}\n                icon={this.getIcon()!}\n                isCollapsed={this.props.isCollapsed}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport {ActionFunc} from 'mattermost-redux/types/actions';\n\nimport {leaveChannel} from 'actions/views/channel';\n\nimport SidebarBaseChannel from './sidebar_base_channel';\n\ntype Actions = {\n    leaveChannel: (channelId: any) => Promise<{\n        error: any;\n        data?: undefined;\n    } | {\n        data: boolean;\n        error?: undefined;\n    }>;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            leaveChannel,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(SidebarBaseChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {IntlShape, injectIntl} from 'react-intl';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport ProfilePicture from 'components/profile_picture';\nimport {browserHistory} from 'utils/browser_history';\nimport {Constants} from 'utils/constants';\n\nimport SidebarChannelLink from '../sidebar_channel_link';\n\ntype Props = {\n    intl: IntlShape;\n    channel: Channel;\n    teammate?: UserProfile;\n    currentTeamName: string;\n    currentUserId: string;\n    redirectChannel: string;\n    active: boolean;\n    isCollapsed: boolean;\n    actions: {\n        savePreferences: (userId: string, preferences: PreferenceType[]) => Promise<{data: boolean}>;\n        leaveDirectChannel: (channelId: string) => Promise<{data: boolean}>;\n    };\n};\n\nclass SidebarDirectChannel extends React.PureComponent<Props> {\n    handleLeaveChannel = (callback: () => void) => {\n        const id = this.props.channel.teammate_id;\n        const category = Constants.Preferences.CATEGORY_DIRECT_CHANNEL_SHOW;\n\n        const currentUserId = this.props.currentUserId;\n        this.props.actions.savePreferences(currentUserId, [{user_id: currentUserId, category, name: id!, value: 'false'}]).then(callback);\n        this.props.actions.leaveDirectChannel(this.props.channel.name);\n\n        trackEvent('ui', 'ui_direct_channel_x_button_clicked');\n\n        if (this.props.active) {\n            browserHistory.push(`/${this.props.currentTeamName}/channels/${this.props.redirectChannel}`);\n        }\n    }\n\n    getIcon = () => {\n        const {channel, teammate} = this.props;\n\n        if (!teammate) {\n            return null;\n        }\n\n        if (teammate.id && teammate.delete_at) {\n            return (\n                <i className='icon icon-archive-outline'/>\n            );\n        }\n\n        let className = '';\n        if (channel.status === 'online') {\n            className = 'status-online';\n        } else if (channel.status === 'away') {\n            className = 'status-away';\n        } else if (channel.status === 'dnd') {\n            className = 'status-dnd';\n        }\n\n        return (\n            <ProfilePicture\n                src={Client4.getProfilePictureUrl(teammate.id, teammate.last_picture_update)}\n                size={'xs'}\n                status={teammate.is_bot ? '' : channel.status}\n                wrapperClass='DirectChannel__profile-picture'\n                newStatusIcon={true}\n                statusClass={`DirectChannel__status-icon ${className}`}\n            />\n        );\n    }\n\n    render() {\n        const {channel, teammate, currentTeamName} = this.props;\n\n        if (!teammate) {\n            return null;\n        }\n\n        let displayName = channel.display_name;\n        if (this.props.currentUserId === teammate.id) {\n            displayName = this.props.intl.formatMessage({\n                id: 'sidebar.directchannel.you',\n                defaultMessage: '{displayname} (you)',\n            }, {\n                displayname: channel.display_name,\n            });\n        }\n\n        return (\n            <SidebarChannelLink\n                teammateId={teammate.id}\n                channel={channel}\n                link={`/${currentTeamName}/messages/@${teammate.username}`}\n                label={displayName}\n                closeHandler={this.handleLeaveChannel}\n                icon={this.getIcon()}\n                isCollapsed={this.props.isCollapsed}\n            />\n        );\n    }\n}\n\nexport default injectIntl(SidebarDirectChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {ActionFunc} from 'mattermost-redux/types/actions';\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {getCurrentChannelId, getRedirectChannelNameForTeam} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser, getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {leaveDirectChannel} from 'actions/views/channel';\n\nimport SidebarDirectChannel from './sidebar_direct_channel';\n\ntype OwnProps = {\n    channel: Channel;\n    currentTeamName: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const teammate = getUser(state, ownProps.channel.teammate_id!);\n    const currentUser = getCurrentUser(state);\n    const currentTeam = getCurrentTeam(state);\n    const redirectChannel = getRedirectChannelNameForTeam(state, currentTeam.id);\n    const currentChannelId = getCurrentChannelId(state);\n    const active = ownProps.channel.id === currentChannelId;\n\n    return {\n        teammate,\n        currentUserId: currentUser.id,\n        redirectChannel,\n        active,\n    };\n}\n\ntype Actions = {\n    savePreferences: (userId: string, preferences: PreferenceType[]) => Promise<{\n        data: boolean;\n    }>;\n    leaveDirectChannel: (channelId: string) => Promise<{data: boolean}>;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            savePreferences,\n            leaveDirectChannel,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SidebarDirectChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {browserHistory} from 'utils/browser_history';\nimport Constants from 'utils/constants';\n\nimport SidebarChannelLink from 'components/sidebar/sidebar_channel/sidebar_channel_link';\n\ntype Props = {\n    channel: Channel;\n    currentTeamName: string;\n    currentUserId: string;\n    redirectChannel: string;\n    active: boolean;\n    membersCount: number;\n    isCollapsed: boolean;\n    actions: {\n        savePreferences: (userId: string, preferences: PreferenceType[]) => Promise<{data: boolean}>;\n    };\n};\n\ntype State = {\n\n};\n\nexport default class SidebarGroupChannel extends React.PureComponent<Props, State> {\n    handleLeaveChannel = (callback: () => void) => {\n        const id = this.props.channel.id;\n        const category = Constants.Preferences.CATEGORY_GROUP_CHANNEL_SHOW;\n\n        const currentUserId = this.props.currentUserId;\n        this.props.actions.savePreferences(currentUserId, [{user_id: currentUserId, category, name: id, value: 'false'}]).then(callback);\n\n        trackEvent('ui', 'ui_direct_channel_x_button_clicked');\n\n        if (this.props.active) {\n            browserHistory.push(`/${this.props.currentTeamName}/channels/${this.props.redirectChannel}`);\n        }\n    }\n\n    getIcon = () => {\n        return (\n            <div className='status status--group'>{this.props.membersCount}</div>\n        );\n    }\n\n    render() {\n        const {channel, currentTeamName} = this.props;\n\n        return (\n            <SidebarChannelLink\n                channel={channel}\n                link={`/${currentTeamName}/messages/${channel.name}`}\n                label={channel.display_name}\n                closeHandler={this.handleLeaveChannel}\n                icon={this.getIcon()}\n                isCollapsed={this.props.isCollapsed}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {ActionFunc} from 'mattermost-redux/types/actions';\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {getCurrentChannelId, getRedirectChannelNameForTeam} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getUserIdsInChannels, getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport SidebarGroupChannel from './sidebar_group_channel';\n\ntype OwnProps = {\n    channel: Channel;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const currentUser = getCurrentUser(state);\n    const currentTeam = getCurrentTeam(state);\n    const redirectChannel = getRedirectChannelNameForTeam(state, currentTeam.id);\n    const currentChannelId = getCurrentChannelId(state);\n    const active = ownProps.channel.id === currentChannelId;\n\n    const memberIds = getUserIdsInChannels(state);\n\n    let membersCount = 0;\n    if (memberIds && memberIds[ownProps.channel.id]) {\n        const groupMemberIds: Set<string> = memberIds[ownProps.channel.id] as unknown as Set<string>;\n        membersCount = groupMemberIds.size;\n        if (groupMemberIds.has(currentUser.id)) {\n            membersCount--;\n        }\n    }\n\n    return {\n        currentUserId: currentUser.id,\n        redirectChannel,\n        active,\n        membersCount,\n    };\n}\n\ntype Actions = {\n    savePreferences: (userId: string, preferences: PreferenceType[]) => Promise<{\n        data: boolean;\n    }>;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            savePreferences,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SidebarGroupChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Draggable} from 'react-beautiful-dnd';\nimport classNames from 'classnames';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport {DraggingState} from 'types/store';\nimport Constants, {DraggingStates} from 'utils/constants';\n\nimport SidebarBaseChannel from './sidebar_base_channel';\nimport SidebarDirectChannel from './sidebar_direct_channel';\nimport SidebarGroupChannel from './sidebar_group_channel';\n\ntype Props = {\n\n    /**\n     * The channel object for this channel list item\n     */\n    channel: Channel;\n\n    channelIndex: number;\n\n    /**\n     * If in a DM, the name of the user your DM is with\n     */\n    teammateUsername?: string;\n\n    /**\n     * The current team you are on\n     */\n    currentTeamName: string;\n\n    /**\n     * Number of unread mentions in this channel\n     */\n    unreadMentions: number;\n\n    /**\n     * Number of unread messages in this channel\n     */\n    unreadMsgs: number;\n\n    /**\n     * User preference of whether the channel can be marked unread\n     */\n    showUnreadForMsgs: boolean;\n\n    /**\n     * Gets the ref for a given channel id\n     */\n    getChannelRef: (channelId: string) => HTMLLIElement | undefined;\n\n    /**\n     * Sets the ref for the sidebar channel div element, so that it can be used by parent components\n     */\n    setChannelRef: (channelId: string, ref: HTMLLIElement) => void;\n\n    /**\n     * If category is collapsed\n     */\n    isCategoryCollapsed: boolean;\n\n    /**\n     * Is the channel the currently focused channel\n     */\n    isCurrentChannel: boolean;\n\n    isAutoSortedCategory: boolean;\n\n    isDraggable: boolean;\n\n    draggingState: DraggingState;\n\n    isCategoryDragged: boolean;\n\n    isDropDisabled: boolean;\n\n    isChannelSelected: boolean;\n\n    multiSelectedChannelIds: string[];\n\n    autoSortedCategoryIds: Set<string>;\n};\n\ntype State = {\n\n};\n\nexport default class SidebarChannel extends React.PureComponent<Props, State> {\n    static defaultProps = {\n        isDraggable: true,\n    }\n\n    isUnread = () => {\n        return this.props.unreadMentions > 0 || (this.props.unreadMsgs > 0 && this.props.showUnreadForMsgs);\n    }\n\n    isCollapsed = (props: Props) => {\n        return props.isCategoryDragged || (props.isCategoryCollapsed && !this.isUnread() && !props.isCurrentChannel);\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (this.isCollapsed(this.props) !== this.isCollapsed(prevProps) && (this.props.draggingState.state !== DraggingStates.CAPTURE && this.props.draggingState.state !== DraggingStates.BEFORE)) {\n            const channelElement = this.getRef();\n            if (channelElement) {\n                channelElement.classList.add('animating');\n            }\n        }\n    }\n\n    removeAnimation = () => {\n        const channelElement = this.getRef();\n        if (channelElement) {\n            channelElement.classList.remove('animating');\n        }\n    }\n\n    getRef = () => {\n        return this.props.getChannelRef(this.props.channel.id);\n    }\n\n    setRef = (refMethod?: (element: HTMLLIElement) => any) => {\n        return (ref: HTMLLIElement) => {\n            this.props.setChannelRef(this.props.channel.id, ref);\n            refMethod?.(ref);\n        };\n    }\n\n    render() {\n        const {\n            channel,\n            channelIndex,\n            currentTeamName,\n            isCurrentChannel,\n            isDraggable,\n            isAutoSortedCategory,\n            isChannelSelected,\n            draggingState,\n            multiSelectedChannelIds,\n            autoSortedCategoryIds,\n        } = this.props;\n\n        let ChannelComponent: React.ComponentType<{channel: Channel; currentTeamName: string; isCollapsed: boolean}> = SidebarBaseChannel;\n        if (channel.type === Constants.DM_CHANNEL) {\n            ChannelComponent = SidebarDirectChannel;\n        } else if (channel.type === Constants.GM_CHANNEL) {\n            ChannelComponent = SidebarGroupChannel;\n        }\n\n        const component = (\n            <ChannelComponent\n                isCollapsed={this.isCollapsed(this.props)}\n                channel={channel}\n                currentTeamName={currentTeamName}\n            />\n        );\n\n        let wrappedComponent: React.ReactNode;\n\n        if (isDraggable) {\n            let selectedCount: React.ReactNode;\n            if (isChannelSelected && draggingState.state && draggingState.id === channel.id && multiSelectedChannelIds.length > 1) {\n                selectedCount = (\n                    <div className='SidebarChannel__selectedCount'>\n                        <FormattedMarkdownMessage\n                            id='sidebar_left.sidebar_channel.selectedCount'\n                            defaultMessage='{count} selected'\n                            values={{count: multiSelectedChannelIds.length}}\n                        />\n                    </div>\n                );\n            }\n\n            wrappedComponent = (\n                <Draggable\n                    draggableId={channel.id}\n                    index={channelIndex}\n                >\n                    {(provided, snapshot) => {\n                        return (\n                            <li\n                                draggable='false'\n                                ref={this.setRef(provided.innerRef)}\n                                className={classNames('SidebarChannel', {\n                                    collapsed: this.isCollapsed(this.props),\n                                    unread: this.isUnread(),\n                                    active: isCurrentChannel,\n                                    dragging: snapshot.isDragging,\n                                    selectedDragging: isChannelSelected && draggingState.state && draggingState.id !== channel.id,\n                                    fadeOnDrop: snapshot.isDropAnimating && snapshot.draggingOver && autoSortedCategoryIds.has(snapshot.draggingOver),\n                                    noFloat: isAutoSortedCategory && !snapshot.isDragging,\n                                })}\n                                onTransitionEnd={this.removeAnimation}\n                                {...provided.draggableProps}\n                                {...provided.dragHandleProps}\n                                role='listitem'\n                                tabIndex={-1}\n                            >\n                                {component}\n                                {selectedCount}\n                            </li>\n                        );\n                    }}\n                </Draggable>\n            );\n        } else {\n            wrappedComponent = (\n                <li\n                    ref={this.setRef()}\n                    className={classNames('SidebarChannel', {\n                        collapsed: this.isCollapsed(this.props),\n                        unread: this.isUnread(),\n                        active: isCurrentChannel,\n                    })}\n                    role='listitem'\n                >\n                    {component}\n                </li>\n            );\n        }\n\n        return wrappedComponent;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getMyChannelMemberships} from 'mattermost-redux/selectors/entities/common';\nimport {getCurrentChannelId, makeGetChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {getAutoSortedCategoryIds, getDraggingState, isChannelSelected} from 'selectors/views/channel_sidebar';\nimport {GlobalState} from 'types/store';\nimport {NotificationLevels} from 'utils/constants';\n\nimport {getMsgCountInChannel} from 'mattermost-redux/utils/channel_utils';\n\nimport SidebarChannel from './sidebar_channel';\n\ntype OwnProps = {\n    channelId: string;\n}\n\nfunction makeMapStateToProps() {\n    const getChannel = makeGetChannel();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        const channel = getChannel(state, {id: ownProps.channelId});\n        const currentTeam = getCurrentTeam(state);\n\n        const member = getMyChannelMemberships(state)[ownProps.channelId];\n        const currentChannelId = getCurrentChannelId(state);\n        const collapsed = isCollapsedThreadsEnabled(state);\n\n        // Unread counts\n        let unreadMentions = 0;\n        let unreadMsgs = 0;\n        let showUnreadForMsgs = true;\n        if (member) {\n            unreadMentions = collapsed ? member.mention_count_root : member.mention_count;\n\n            if (channel) {\n                unreadMsgs = getMsgCountInChannel(collapsed, channel, member);\n            }\n\n            if (member.notify_props) {\n                showUnreadForMsgs = member.notify_props.mark_unread !== NotificationLevels.MENTION;\n            }\n        }\n\n        return {\n            channel,\n            isCurrentChannel: channel.id === currentChannelId,\n            currentTeamName: currentTeam.name,\n            unreadMentions,\n            unreadMsgs,\n            showUnreadForMsgs,\n            draggingState: getDraggingState(state),\n            isChannelSelected: isChannelSelected(state, ownProps.channelId),\n            multiSelectedChannelIds: state.views.channelSidebar.multiSelectedChannelIds,\n            autoSortedCategoryIds: getAutoSortedCategoryIds(state),\n        };\n    };\n}\n\nexport default connect(makeMapStateToProps)(SidebarChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {DraggableProvidedDragHandleProps} from 'react-beautiful-dnd';\n\nimport {wrapEmojis} from 'utils/emoji_utils';\n\ntype StaticProps = {\n    children?: React.ReactNode;\n    displayName: string;\n}\n\nexport const SidebarCategoryHeaderStatic = React.forwardRef((props: StaticProps, ref?: React.Ref<HTMLDivElement>) => {\n    return (\n        <div className='SidebarChannelGroupHeader SidebarChannelGroupHeader--static'>\n            <div\n                ref={ref}\n                className='SidebarChannelGroupHeader_groupButton'\n            >\n                <div className='SidebarChannelGroupHeader_text'>\n                    {wrapEmojis(props.displayName)}\n                </div>\n                {props.children}\n            </div>\n        </div>\n    );\n});\nSidebarCategoryHeaderStatic.displayName = 'SidebarCategoryHeaderStatic';\n\ntype Props = StaticProps & {\n    dragHandleProps?: DraggableProvidedDragHandleProps;\n    isCollapsed: boolean;\n    isCollapsible: boolean;\n    isDragging?: boolean;\n    isDraggingOver?: boolean;\n    muted: boolean;\n    onClick: (event: React.MouseEvent<HTMLElement>) => void;\n}\n\nexport const SidebarCategoryHeader = React.forwardRef((props: Props, ref?: React.Ref<HTMLButtonElement>) => {\n    return (\n        <div\n            className={classNames('SidebarChannelGroupHeader', {\n                muted: props.muted,\n                dragging: props.isDragging,\n            })}\n        >\n            <button\n                ref={ref}\n                className={classNames('SidebarChannelGroupHeader_groupButton')}\n                aria-label={props.displayName}\n                onClick={props.onClick}\n            >\n                <i\n                    className={classNames('icon icon-chevron-down', {\n                        'icon-rotate-minus-90': props.isCollapsed,\n                        'hide-arrow': !props.isCollapsible,\n                    })}\n                />\n                <div\n                    className='SidebarChannelGroupHeader_text'\n                    {...props.dragHandleProps}\n                >\n                    {wrapEmojis(props.displayName)}\n                </div>\n            </button>\n            {props.children}\n        </div>\n    );\n});\nSidebarCategoryHeader.defaultProps = {\n    isCollapsible: true,\n    isDragging: false,\n    isDraggingOver: false,\n};\nSidebarCategoryHeader.displayName = 'SidebarCategoryHeader';\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {useIntl, FormattedMessage} from 'react-intl';\n\nimport {useSelector} from 'react-redux';\n\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\nimport ToggleModalButtonRedux from 'components/toggle_modal_button_redux';\nimport InvitationModal from 'components/invitation_modal';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\ntype Props = {\n    touchedInviteMembersButton: boolean;\n    className?: string;\n    onClick: () => void;\n}\n\nconst InviteMembersButton: React.FC<Props> = (props: Props): JSX.Element => {\n    const intl = useIntl();\n\n    const currentTeamId = useSelector(getCurrentTeamId);\n    let buttonClass = 'SidebarChannelNavigator_inviteMembersLhsButton';\n\n    if (!props.touchedInviteMembersButton) {\n        buttonClass += ' SidebarChannelNavigator_inviteMembersLhsButton--untouched';\n    }\n\n    return (\n        <TeamPermissionGate\n            teamId={currentTeamId}\n            permissions={[Permissions.ADD_USER_TO_TEAM, Permissions.INVITE_GUEST]}\n        >\n            <ToggleModalButtonRedux\n                ariaLabel={intl.formatMessage({id: 'sidebar_left.inviteUsers', defaultMessage: 'Invite Users'})}\n                id='introTextInvite'\n                className={`intro-links color--link cursor--pointer${props.className ? ` ${props.className}` : ''}`}\n                modalId={ModalIdentifiers.INVITATION}\n                dialogType={InvitationModal}\n                onClick={props.onClick}\n            >\n                <li\n                    className={buttonClass}\n                    aria-label={intl.formatMessage({id: 'sidebar_left.sidebar_channel_navigator.inviteUsers', defaultMessage: 'Invite Members'})}\n                >\n                    <i className='icon-plus-box'/>\n                    <FormattedMessage\n                        id={'sidebar_left.inviteMembers'}\n                        defaultMessage='Invite Members'\n                    />\n                </li>\n            </ToggleModalButtonRedux>\n        </TeamPermissionGate>\n    );\n};\n\nexport default InviteMembersButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {injectIntl, IntlShape} from 'react-intl';\n\nimport {Preferences} from 'mattermost-redux/constants';\nimport {ChannelCategory, CategorySorting} from 'mattermost-redux/types/channel_categories';\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\n\nimport Constants from 'utils/constants';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport SidebarMenu from 'components/sidebar/sidebar_menu';\nimport SidebarMenuType from 'components/sidebar/sidebar_menu/sidebar_menu';\nimport Menu from 'components/widgets/menu/menu';\nimport {Props as SubmenuItemProps} from 'components/widgets/menu/menu_items/submenu_item';\n\ntype Props = {\n    category: ChannelCategory;\n    handleOpenDirectMessagesModal: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n    intl: IntlShape;\n    isCollapsed: boolean;\n    isMenuOpen: boolean;\n    onToggleMenu: (isMenuOpen: boolean) => void;\n    currentUserId: string;\n    selectedDmNumber: number;\n    actions: {\n        setCategorySorting: (categoryId: string, sorting: CategorySorting) => void;\n        savePreferences: (userId: string, preferences: PreferenceType[]) => void;\n    };\n};\n\ntype State = {\n    openUp: boolean;\n};\n\nexport class SidebarCategorySortingMenu extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            openUp: false,\n        };\n    }\n\n    handleSortDirectMessages = (sorting: CategorySorting) => {\n        const {category} = this.props;\n\n        this.props.actions.setCategorySorting(category.id, sorting);\n        trackEvent('ui', `ui_sidebar_sort_dm_${sorting}`);\n    }\n\n    handlelimitVisibleDMsGMs = (number: number) => {\n        const {currentUserId} = this.props;\n        this.props.actions.savePreferences(currentUserId, [{\n            user_id: currentUserId,\n            category: Constants.Preferences.CATEGORY_SIDEBAR_SETTINGS,\n            name: Preferences.LIMIT_VISIBLE_DMS_GMS,\n            value: number.toString(),\n        }]);\n    }\n\n    renderDropdownItems = () => {\n        const {intl, category} = this.props;\n\n        const sortMenuItems: SubmenuItemProps[] = [{\n            id: 'sortAlphabetical',\n            direction: 'right' as any,\n            text: intl.formatMessage({id: 'user.settings.sidebar.sortAlpha', defaultMessage: 'Alphabetically'}),\n            action: () => this.handleSortDirectMessages(CategorySorting.Alphabetical),\n        },\n        {\n            id: 'sortByMostRecent',\n            direction: 'right' as any,\n            text: intl.formatMessage({id: 'sidebar.sortedByRecencyLabel', defaultMessage: 'Recent Activity'}),\n            action: () => this.handleSortDirectMessages(CategorySorting.Recency),\n        }];\n\n        const dmLimitOptions = [10, 15, 20, 40];\n\n        const selectedDmCount = dmLimitOptions.map((number) => {\n            return {\n                id: `SidebarCategorySortingMenu-dmCount-${number}`,\n                direction: 'right' as any,\n                text: number,\n                action: () => this.handlelimitVisibleDMsGMs(number),\n            } as SubmenuItemProps;\n        });\n\n        const categoryMenuItems: SubmenuItemProps[] = [];\n        categoryMenuItems.push(\n            {\n                id: 'showAllDms',\n                direction: 'right' as any,\n                text: intl.formatMessage({id: 'sidebar.allDirectMessages', defaultMessage: 'All direct messages'}),\n                action: () => this.handlelimitVisibleDMsGMs(10000),\n            },\n            {\n                id: 'SidebarChannelMenu-moveToDivider',\n                text: (<li className='MenuGroup menu-divider'/>),\n            },\n            ...selectedDmCount,\n        );\n\n        const browseDirectMessages = (\n            <Menu.Group>\n                <Menu.ItemAction\n                    id={'browseDirectMessages'}\n                    onClick={this.props.handleOpenDirectMessagesModal}\n                    icon={<i className='icon-account-plus-outline'/>}\n                    text={intl.formatMessage({id: 'sidebar.openDirectMessage', defaultMessage: 'Open a direct message'})}\n                />\n            </Menu.Group>\n        );\n\n        return (\n            <React.Fragment>\n                <Menu.Group>\n                    <Menu.ItemSubMenu\n                        id={'sortDirectMessages'}\n                        subMenu={sortMenuItems}\n                        text={intl.formatMessage({id: 'sidebar.sort', defaultMessage: 'Sort'})}\n                        selectedValueText={category.sorting === CategorySorting.Alphabetical ? intl.formatMessage({id: 'user.settings.sidebar.sortAlpha', defaultMessage: 'Alphabetically'}) : intl.formatMessage({id: 'user.settings.sidebar.recent', defaultMessage: 'Recent Activity'})}\n                        icon={category.sorting === CategorySorting.Alphabetical ? <i className='icon-sort-alphabetical-ascending'/> : <i className='icon-clock-outline'/>}\n                        direction={'right' as any}\n                        openUp={this.state.openUp}\n                        styleSelectableItem={true}\n                    />\n                    <Menu.ItemSubMenu\n                        id={'showMessageCount'}\n                        subMenu={categoryMenuItems}\n                        text={intl.formatMessage({id: 'sidebar.show', defaultMessage: 'Show'})}\n                        selectedValueText={this.props.selectedDmNumber === 10000 ? intl.formatMessage({id: 'channel_notifications.levels.all', defaultMessage: 'All'}) : this.props.selectedDmNumber}\n                        icon={<i className='icon-account-multiple-outline'/>}\n                        direction={'right' as any}\n                        openUp={this.state.openUp}\n                        styleSelectableItem={true}\n                    />\n                </Menu.Group>\n                {browseDirectMessages}\n            </React.Fragment>\n        );\n    }\n\n    refCallback = (ref: SidebarMenuType) => {\n        if (ref) {\n            this.setState({\n                openUp: ref.state.openUp,\n            });\n        }\n    }\n\n    onToggleMenu = (open: boolean) => {\n        this.props.onToggleMenu(open);\n\n        if (open) {\n            trackEvent('ui', 'ui_sidebar_channel_menu_opened');\n        }\n    }\n\n    render() {\n        const {\n            intl,\n            isCollapsed,\n            isMenuOpen,\n        } = this.props;\n\n        return (\n            <SidebarMenu\n                refCallback={this.refCallback}\n                id={'SidebarCategorySortingMenu'}\n                ariaLabel={intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.dropdownAriaLabel', defaultMessage: 'Channel Menu'})}\n                buttonAriaLabel={intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.dropdownAriaLabel', defaultMessage: 'Channel Menu'})}\n                isMenuOpen={isMenuOpen}\n                onToggleMenu={this.onToggleMenu}\n                tooltipText={intl.formatMessage({id: 'sidebar_left.sidebar_channel_menu.editChannel', defaultMessage: 'Channel options'})}\n                tabIndex={isCollapsed ? -1 : 0}\n                additionalClass='additionalClass'\n            >\n                {this.renderDropdownItems()}\n            </SidebarMenu>\n        );\n    }\n}\n\nexport default injectIntl(SidebarCategorySortingMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {setCategorySorting} from 'mattermost-redux/actions/channel_categories';\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getInt} from 'mattermost-redux/selectors/entities/preferences';\nimport {Preferences} from 'mattermost-redux/constants';\n\nimport {GlobalState} from 'types/store';\n\nimport SidebarCategorySortingMenu from './sidebar_category_sorting_menu';\n\nfunction mapStateToProps() {\n    return (state: GlobalState) => {\n        const selectedDmNumber = getInt(state, Preferences.CATEGORY_SIDEBAR_SETTINGS, Preferences.LIMIT_VISIBLE_DMS_GMS, 20);\n\n        return {\n            selectedDmNumber,\n            currentUserId: getCurrentUserId(state),\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            setCategorySorting,\n            savePreferences,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SidebarCategorySortingMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {ChannelCategory} from 'mattermost-redux/types/channel_categories';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\n\nimport '../category_modal.scss';\nimport GenericModal from 'components/generic_modal';\n\ntype Props = {\n    category: ChannelCategory;\n    onHide: () => void;\n    actions: {\n        deleteCategory: (categoryId: string) => void;\n    };\n};\n\ntype State = {\n    show: boolean;\n}\n\nexport default class DeleteCategoryModal extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            show: true,\n        };\n    }\n\n    handleConfirm = () => {\n        this.props.actions.deleteCategory(this.props.category.id);\n    }\n\n    render() {\n        return (\n            <GenericModal\n                onHide={this.props.onHide}\n                modalHeaderText={(\n                    <FormattedMessage\n                        id='delete_category_modal.deleteCategory'\n                        defaultMessage='Delete this category?'\n                    />\n                )}\n                handleConfirm={this.handleConfirm}\n                confirmButtonText={(\n                    <FormattedMessage\n                        id='delete_category_modal.delete'\n                        defaultMessage='Delete'\n                    />\n                )}\n                confirmButtonClassName={'delete'}\n            >\n                <span className='delete-category__helpText'>\n                    <FormattedMarkdownMessage\n                        id='delete_category_modal.helpText'\n                        defaultMessage=\"Channels in **{category_name}** will move back to the Channels and Direct messages categories. You're not removed from any channels.\"\n                        values={{\n                            category_name: this.props.category.display_name,\n                        }}\n                    />\n                </span>\n            </GenericModal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {deleteCategory} from 'mattermost-redux/actions/channel_categories';\n\nimport DeleteCategoryModal from './delete_category_modal';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            deleteCategory,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(DeleteCategoryModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {IntlShape, injectIntl} from 'react-intl';\n\nimport {CategoryTypes} from 'mattermost-redux/constants/channel_categories';\nimport {ChannelCategory, CategorySorting} from 'mattermost-redux/types/channel_categories';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport DeleteCategoryModal from 'components/delete_category_modal';\nimport EditCategoryModal from 'components/edit_category_modal';\nimport SidebarMenu from 'components/sidebar/sidebar_menu';\nimport SidebarMenuType from 'components/sidebar/sidebar_menu/sidebar_menu';\nimport Menu from 'components/widgets/menu/menu';\nimport {ModalIdentifiers} from 'utils/constants';\nimport {Props as SubmenuItemProps} from 'components/widgets/menu/menu_items/submenu_item';\n\ntype Props = {\n    currentTeamId: string;\n    category: ChannelCategory;\n    isMenuOpen: boolean;\n    onToggleMenu: (open: boolean) => void;\n    intl: IntlShape;\n    actions: {\n        openModal: (modalData: {modalId: string; dialogType: any; dialogProps?: any}) => Promise<{\n            data: boolean;\n        }>;\n        setCategoryMuted: (categoryId: string, muted: boolean) => Promise<void>;\n        setCategorySorting: (categoryId: string, sorting: CategorySorting) => void;\n    };\n};\n\ntype State = {\n    showDeleteCategoryModal: boolean;\n    openUp: boolean;\n}\n\nclass SidebarCategoryMenu extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            showDeleteCategoryModal: false,\n            openUp: false,\n        };\n    }\n\n    toggleCategoryMute = () => {\n        this.props.actions.setCategoryMuted(this.props.category.id, !this.props.category.muted);\n    }\n\n    deleteCategory = () => {\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.DELETE_CATEGORY,\n            dialogType: DeleteCategoryModal,\n            dialogProps: {\n                category: this.props.category,\n            },\n        });\n    }\n\n    renameCategory = () => {\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.EDIT_CATEGORY,\n            dialogType: EditCategoryModal,\n            dialogProps: {\n                categoryId: this.props.category.id,\n                initialCategoryName: this.props.category.display_name,\n            },\n        });\n    }\n\n    createCategory = () => {\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.EDIT_CATEGORY,\n            dialogType: EditCategoryModal,\n        });\n        trackEvent('ui', 'ui_sidebar_category_menu_createCategory');\n    }\n\n    handleSortChannels = (sorting: CategorySorting) => {\n        const {category} = this.props;\n\n        this.props.actions.setCategorySorting(category.id, sorting);\n        trackEvent('ui', `ui_sidebar_sort_dm_${sorting}`);\n    }\n\n    onToggleMenu = (open: boolean) => {\n        this.props.onToggleMenu(open);\n\n        if (open) {\n            trackEvent('ui', 'ui_sidebar_category_menu_opened');\n        }\n    }\n\n    renderDropdownItems = () => {\n        const {intl, category} = this.props;\n\n        let muteUnmuteCategory;\n        if (category.type !== CategoryTypes.DIRECT_MESSAGES) {\n            let text;\n            if (category.muted) {\n                text = intl.formatMessage({id: 'sidebar_left.sidebar_category_menu.unmuteCategory', defaultMessage: 'Unmute Category'});\n            } else {\n                text = intl.formatMessage({id: 'sidebar_left.sidebar_category_menu.muteCategory', defaultMessage: 'Mute Category'});\n            }\n\n            muteUnmuteCategory = (\n                <Menu.ItemAction\n                    id={`mute-${category.id}`}\n                    onClick={this.toggleCategoryMute}\n                    icon={<i className='icon-bell-outline'/>}\n                    text={text}\n                />\n            );\n        }\n\n        const sortMenuItems: SubmenuItemProps[] = [{\n            id: 'sortAlphabetical',\n            direction: 'right' as any,\n            text: intl.formatMessage({id: 'user.settings.sidebar.sortAlpha', defaultMessage: 'Alphabetically'}),\n            action: () => this.handleSortChannels(CategorySorting.Alphabetical),\n        },\n        {\n            id: 'sortByMostRecent',\n            direction: 'right' as any,\n            text: intl.formatMessage({id: 'sidebar.sortedByRecencyLabel', defaultMessage: 'Recent Activity'}),\n            action: () => this.handleSortChannels(CategorySorting.Recency),\n        },\n        {\n            id: 'sortManual',\n            direction: 'right' as any,\n            text: intl.formatMessage({id: 'sidebar.sortedManually', defaultMessage: 'Manually'}),\n            action: () => this.handleSortChannels(CategorySorting.Manual),\n        }];\n\n        let deleteCategory;\n        let renameCategory;\n        if (category.type === CategoryTypes.CUSTOM) {\n            deleteCategory = (\n                <Menu.ItemAction\n                    isDangerous={true}\n                    id={`delete-${category.id}`}\n                    onClick={this.deleteCategory}\n                    icon={<i className='icon-trash-can-outline'/>}\n                    text={intl.formatMessage({id: 'sidebar_left.sidebar_category_menu.deleteCategory', defaultMessage: 'Delete Category'})}\n                />\n            );\n\n            renameCategory = (\n                <Menu.ItemAction\n                    id={`rename-${category.id}`}\n                    onClick={this.renameCategory}\n                    icon={<i className='icon-pencil-outline'/>}\n                    text={intl.formatMessage({id: 'sidebar_left.sidebar_category_menu.renameCategory', defaultMessage: 'Rename Category'})}\n                />\n            );\n        }\n\n        let selectedValueText;\n\n        switch (category.sorting) {\n        case CategorySorting.Alphabetical:\n            selectedValueText = intl.formatMessage({id: 'user.settings.sidebar.sortAlpha', defaultMessage: 'Alphabetically'});\n            break;\n        case CategorySorting.Recency:\n            selectedValueText = intl.formatMessage({id: 'user.settings.sidebar.recent', defaultMessage: 'Recent Activity'});\n            break;\n        default:\n            selectedValueText = intl.formatMessage({id: 'sidebar.sortedManually', defaultMessage: 'Manually'});\n        }\n\n        let icon;\n\n        switch (category.sorting) {\n        case CategorySorting.Alphabetical:\n            icon = <i className='icon-sort-alphabetical-ascending'/>;\n            break;\n        case CategorySorting.Recency:\n            icon = <i className='icon-clock-outline'/>;\n            break;\n        default:\n            icon = <i className='icon-format-list-bulleted'/>;\n        }\n\n        return (\n            <React.Fragment>\n                <Menu.Group>\n                    {muteUnmuteCategory}\n                    {renameCategory}\n                    {deleteCategory}\n                </Menu.Group>\n                <Menu.Group>\n                    <Menu.ItemSubMenu\n                        id={'sortChannels'}\n                        subMenu={sortMenuItems}\n                        text={intl.formatMessage({id: 'sidebar.sort', defaultMessage: 'Sort'})}\n                        selectedValueText={selectedValueText}\n                        icon={icon}\n                        direction={'right' as any}\n                        openUp={this.state.openUp}\n                        styleSelectableItem={true}\n                    />\n                </Menu.Group>\n                <Menu.Group>\n                    <Menu.ItemAction\n                        id={`create-${category.id}`}\n                        onClick={this.createCategory}\n                        icon={<i className='icon-folder-plus-outline'/>}\n                        text={intl.formatMessage({id: 'sidebar_left.sidebar_category_menu.createCategory', defaultMessage: 'Create New Category'})}\n                    />\n                </Menu.Group>\n            </React.Fragment>\n        );\n    }\n\n    refCallback = (ref: SidebarMenuType) => {\n        if (ref) {\n            this.setState({\n                openUp: ref.state.openUp,\n            });\n        }\n    }\n\n    render() {\n        const {intl, category} = this.props;\n\n        return (\n            <React.Fragment>\n                <SidebarMenu\n                    refCallback={this.refCallback}\n                    id={`SidebarCategoryMenu-${category.id}`}\n                    ariaLabel={intl.formatMessage({id: 'sidebar_left.sidebar_category_menu.dropdownAriaLabel', defaultMessage: 'Category Menu'})}\n                    buttonAriaLabel={intl.formatMessage({id: 'sidebar_left.sidebar_category_menu.dropdownAriaLabel', defaultMessage: 'Category Menu'})}\n                    isMenuOpen={this.props.isMenuOpen}\n                    onToggleMenu={this.onToggleMenu}\n                    tooltipText={intl.formatMessage({id: 'sidebar_left.sidebar_category_menu.editCategory', defaultMessage: 'Category options'})}\n                >\n                    {this.renderDropdownItems()}\n                </SidebarMenu>\n            </React.Fragment>\n        );\n    }\n}\n\nexport default injectIntl(SidebarCategoryMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {Dispatch, bindActionCreators, ActionCreatorsMapObject} from 'redux';\n\nimport {setCategoryMuted, setCategorySorting} from 'mattermost-redux/actions/channel_categories';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {ActionFunc} from 'mattermost-redux/types/actions';\nimport {CategorySorting} from 'mattermost-redux/types/channel_categories';\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport {openModal} from 'actions/views/modals';\n\nimport SidebarCategoryMenu from './sidebar_category_menu';\n\nfunction makeMapStateToProps() {\n    return (state: GlobalState) => {\n        const currentTeam = getCurrentTeam(state);\n\n        return {\n            currentTeamId: currentTeam.id,\n        };\n    };\n}\n\ntype Actions = {\n    openModal: (modalData: {modalId: string; dialogType: React.Component; dialogProps?: any}) => Promise<{\n        data: boolean;\n    }>;\n    setCategoryMuted: (categoryId: string, muted: boolean) => Promise<void>;\n    setCategorySorting: (categoryId: string, sorting: CategorySorting) => void;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            openModal,\n            setCategoryMuted,\n            setCategorySorting,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(SidebarCategoryMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\nimport {Draggable, Droppable} from 'react-beautiful-dnd';\nimport classNames from 'classnames';\n\nimport {CategoryTypes} from 'mattermost-redux/constants/channel_categories';\nimport {ChannelCategory, CategorySorting} from 'mattermost-redux/types/channel_categories';\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\nimport {localizeMessage} from 'mattermost-redux/utils/i18n_utils';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport OverlayTrigger from 'components/overlay_trigger';\n\nimport {DraggingState} from 'types/store';\n\nimport Constants, {A11yCustomEventTypes, DraggingStateTypes, DraggingStates, Preferences, Touched} from 'utils/constants';\n\nimport {t} from 'utils/i18n';\nimport {isKeyPressed} from 'utils/utils';\n\nimport SidebarChannel from '../sidebar_channel';\nimport {SidebarCategoryHeader} from '../sidebar_category_header';\nimport InviteMembersButton from '../invite_members_button';\n\nimport SidebarCategorySortingMenu from './sidebar_category_sorting_menu';\n\nimport SidebarCategoryMenu from './sidebar_category_menu';\n\ntype Props = {\n    category: ChannelCategory;\n    categoryIndex: number;\n    channelIds: string[];\n    setChannelRef: (channelId: string, ref: HTMLLIElement) => void;\n    handleOpenMoreDirectChannelsModal: (e: Event) => void;\n    getChannelRef: (channelId: string) => HTMLLIElement | undefined;\n    isNewCategory: boolean;\n    draggingState: DraggingState;\n    currentUserId: string;\n    touchedInviteMembersButton: boolean;\n    actions: {\n        setCategoryCollapsed: (categoryId: string, collapsed: boolean) => void;\n        setCategorySorting: (categoryId: string, sorting: CategorySorting) => void;\n        savePreferences: (userId: string, preferences: PreferenceType[]) => void;\n    };\n};\n\ntype State = {\n    isMenuOpen: boolean;\n}\n\nexport default class SidebarCategory extends React.PureComponent<Props, State> {\n    categoryTitleRef: React.RefObject<HTMLButtonElement>;\n    newDropBoxRef: React.RefObject<HTMLDivElement>;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.categoryTitleRef = React.createRef();\n        this.newDropBoxRef = React.createRef();\n\n        this.state = {\n            isMenuOpen: false,\n        };\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (this.props.category.collapsed !== prevProps.category.collapsed && this.newDropBoxRef.current) {\n            this.newDropBoxRef.current.classList.add('animating');\n        }\n    }\n\n    componentDidMount() {\n        // Refs can be null when this component is shallowly rendered for testing\n        if (this.categoryTitleRef.current) {\n            this.categoryTitleRef.current.addEventListener(A11yCustomEventTypes.ACTIVATE, this.handleA11yActivateEvent);\n            this.categoryTitleRef.current.addEventListener(A11yCustomEventTypes.DEACTIVATE, this.handleA11yDeactivateEvent);\n        }\n    }\n\n    componentWillUnmount() {\n        if (this.categoryTitleRef.current) {\n            this.categoryTitleRef.current.removeEventListener(A11yCustomEventTypes.ACTIVATE, this.handleA11yActivateEvent);\n            this.categoryTitleRef.current.removeEventListener(A11yCustomEventTypes.DEACTIVATE, this.handleA11yDeactivateEvent);\n        }\n    }\n\n    handleA11yActivateEvent = () => {\n        if (this.categoryTitleRef.current) {\n            this.categoryTitleRef.current.addEventListener('keydown', this.handleA11yKeyDown);\n        }\n    }\n\n    handleA11yDeactivateEvent = () => {\n        if (this.categoryTitleRef.current) {\n            this.categoryTitleRef.current.removeEventListener('keydown', this.handleA11yKeyDown);\n        }\n    }\n\n    handleA11yKeyDown = (e: KeyboardEvent) => {\n        if (isKeyPressed(e, Constants.KeyCodes.ENTER)) {\n            this.handleCollapse();\n        }\n    }\n\n    renderChannel = (channelId: string, index: number) => {\n        const {setChannelRef, getChannelRef, category, draggingState} = this.props;\n        return (\n            <SidebarChannel\n                key={channelId}\n                channelIndex={index}\n                channelId={channelId}\n                setChannelRef={setChannelRef}\n                getChannelRef={getChannelRef}\n                isCategoryCollapsed={category.collapsed}\n                isCategoryDragged={draggingState.type === DraggingStateTypes.CATEGORY && draggingState.id === category.id}\n                isDropDisabled={this.isDropDisabled()}\n                isAutoSortedCategory={category.sorting === CategorySorting.Alphabetical || category.sorting === CategorySorting.Recency}\n            />\n        );\n    }\n\n    handleCollapse = () => {\n        const {category} = this.props;\n\n        if (category.collapsed) {\n            trackEvent('ui', 'ui_sidebar_expand_category');\n        } else {\n            trackEvent('ui', 'ui_sidebar_collapse_category');\n        }\n\n        this.props.actions.setCategoryCollapsed(category.id, !category.collapsed);\n    }\n\n    handleSortDirectMessages = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n        const {category} = this.props;\n        e.stopPropagation();\n\n        const newSorting = category.sorting === CategorySorting.Recency ? CategorySorting.Alphabetical : CategorySorting.Recency;\n        this.props.actions.setCategorySorting(category.id, newSorting);\n        trackEvent('ui', `ui_sidebar_sort_dm_${newSorting}`);\n    }\n    removeAnimation = () => {\n        if (this.newDropBoxRef.current) {\n            this.newDropBoxRef.current.classList.remove('animating');\n        }\n    }\n\n    handleOpenDirectMessagesModal = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n        e.stopPropagation();\n        this.props.handleOpenMoreDirectChannelsModal(e.nativeEvent);\n        trackEvent('ui', 'ui_sidebar_create_direct_message');\n    }\n\n    handleMenuToggle = (open: boolean) => {\n        this.setState({isMenuOpen: open});\n    }\n\n    isDropDisabled = () => {\n        const {draggingState, category} = this.props;\n\n        if (category.type === CategoryTypes.DIRECT_MESSAGES) {\n            return draggingState.type === DraggingStateTypes.CHANNEL;\n        } else if (category.type === CategoryTypes.CHANNELS) {\n            return draggingState.type === DraggingStateTypes.DM;\n        }\n\n        return false;\n    }\n\n    renderNewDropBox = (isDraggingOver: boolean) => {\n        const {draggingState, category, isNewCategory, channelIds} = this.props;\n\n        if (!isNewCategory || channelIds?.length) {\n            return null;\n        }\n\n        return (\n            <React.Fragment>\n                <Draggable\n                    draggableId={`NEW_CHANNEL_SPACER__${category.id}`}\n                    isDragDisabled={true}\n                    index={0}\n                >\n                    {(provided) => {\n                        // NEW_CHANNEL_SPACER here is used as a spacer to ensure react-beautiful-dnd will not try and place the first channel\n                        // on the header. This acts as a space filler for the header so that the first channel dragged in will float below it.\n                        return (\n                            <li\n                                ref={provided.innerRef}\n                                draggable='false'\n                                className={'SidebarChannel noFloat newChannelSpacer'}\n                                {...provided.draggableProps}\n                                role='listitem'\n                                tabIndex={-1}\n                            />\n                        );\n                    }}\n                </Draggable>\n                <div className='SidebarCategory_newDropBox'>\n                    <div\n                        ref={this.newDropBoxRef}\n                        className={classNames('SidebarCategory_newDropBox-content', {\n                            collapsed: category.collapsed || (draggingState.type === DraggingStateTypes.CATEGORY && draggingState.id === category.id),\n                            isDraggingOver,\n                        })}\n                        onTransitionEnd={this.removeAnimation}\n                    >\n                        <i className='icon-hand-right'/>\n                        <span className='SidebarCategory_newDropBox-label'>\n                            <FormattedMessage\n                                id='sidebar_left.sidebar_category.newDropBoxLabel'\n                                defaultMessage='Drag channels here...'\n                            />\n                        </span>\n                    </div>\n                </div>\n            </React.Fragment>\n        );\n    }\n\n    showPlaceholder = () => {\n        const {channelIds, draggingState, category, isNewCategory} = this.props;\n\n        if (category.sorting === CategorySorting.Alphabetical ||\n            category.sorting === CategorySorting.Recency ||\n            isNewCategory) {\n            // Always show the placeholder if the channel being dragged is from the current category\n            if (channelIds.find((id) => id === draggingState.id)) {\n                return true;\n            }\n\n            return false;\n        }\n\n        return true;\n    }\n\n    render() {\n        const {\n            category,\n            categoryIndex,\n            channelIds,\n            isNewCategory,\n        } = this.props;\n\n        if (!category) {\n            return null;\n        }\n\n        if (category.type === CategoryTypes.FAVORITES && !channelIds?.length) {\n            return null;\n        }\n\n        const renderedChannels = channelIds.map(this.renderChannel);\n\n        let categoryMenu: JSX.Element;\n        let newLabel: JSX.Element;\n        let directMessagesModalButton: JSX.Element;\n        let isCollapsible = true;\n        if (isNewCategory) {\n            newLabel = (\n                <div className='SidebarCategory_newLabel'>\n                    <FormattedMessage\n                        id='sidebar_left.sidebar_category.newLabel'\n                        defaultMessage='new'\n                    />\n                </div>\n            );\n\n            categoryMenu = (\n                <SidebarCategoryMenu\n                    category={category}\n                    isMenuOpen={this.state.isMenuOpen}\n                    onToggleMenu={this.handleMenuToggle}\n                />\n            );\n        } else if (category.type === CategoryTypes.DIRECT_MESSAGES) {\n            const addHelpLabel = localizeMessage('sidebar.createDirectMessage', 'Create new direct message');\n\n            const addTooltip = (\n                <Tooltip\n                    id='new-group-tooltip'\n                    className='hidden-xs'\n                >\n                    {addHelpLabel}\n                </Tooltip>\n            );\n\n            categoryMenu = (\n                <React.Fragment>\n                    <SidebarCategorySortingMenu\n                        category={category}\n                        handleOpenDirectMessagesModal={this.handleOpenDirectMessagesModal}\n                        isCollapsed={category.collapsed}\n                        isMenuOpen={this.state.isMenuOpen}\n                        onToggleMenu={this.handleMenuToggle}\n                    />\n                    <OverlayTrigger\n                        delayShow={500}\n                        placement='top'\n                        overlay={addTooltip}\n                    >\n                        <button\n                            className='SidebarChannelGroupHeader_addButton'\n                            onClick={this.handleOpenDirectMessagesModal}\n                            aria-label={addHelpLabel}\n                        >\n                            <i className='icon-plus'/>\n                        </button>\n                    </OverlayTrigger>\n                </React.Fragment>\n            );\n\n            if (!channelIds || !channelIds.length) {\n                isCollapsible = false;\n            }\n        } else {\n            categoryMenu = (\n                <SidebarCategoryMenu\n                    category={category}\n                    isMenuOpen={this.state.isMenuOpen}\n                    onToggleMenu={this.handleMenuToggle}\n                />\n            );\n        }\n\n        let displayName = category.display_name;\n        if (category.type !== CategoryTypes.CUSTOM) {\n            displayName = localizeMessage(`sidebar.types.${category.type}`, category.display_name);\n        }\n\n        return (\n            <Draggable\n                draggableId={category.id}\n                index={categoryIndex}\n                disableInteractiveElementBlocking={true}\n            >\n                {(provided, snapshot) => {\n                    let inviteMembersButton = null;\n                    if (category.type === 'direct_messages') {\n                        inviteMembersButton = (\n                            <InviteMembersButton\n                                className='followingSibling'\n                                touchedInviteMembersButton={this.props.touchedInviteMembersButton}\n                                onClick={() => {\n                                    if (!this.props.touchedInviteMembersButton) {\n                                        this.props.actions.savePreferences(\n                                            this.props.currentUserId,\n                                            [{\n                                                category: Preferences.TOUCHED,\n                                                user_id: this.props.currentUserId,\n                                                name: Touched.INVITE_MEMBERS,\n                                                value: 'true',\n                                            }],\n                                        );\n                                    }\n                                }}\n                            />\n                        );\n                    }\n\n                    return (\n                        <div\n                            className={classNames('SidebarChannelGroup a11y__section', {\n                                dropDisabled: this.isDropDisabled(),\n                                menuIsOpen: this.state.isMenuOpen,\n                                capture: this.props.draggingState.state === DraggingStates.CAPTURE,\n                                isCollapsed: category.collapsed,\n                            })}\n                            ref={provided.innerRef}\n                            {...provided.draggableProps}\n                        >\n                            <Droppable\n                                droppableId={category.id}\n                                type='SIDEBAR_CHANNEL'\n                                isDropDisabled={this.isDropDisabled()}\n                            >\n                                {(droppableProvided, droppableSnapshot) => {\n                                    return (\n                                        <div\n                                            {...droppableProvided.droppableProps}\n                                            ref={droppableProvided.innerRef}\n                                            className={classNames({\n                                                draggingOver: droppableSnapshot.isDraggingOver,\n                                            })}\n                                        >\n                                            <SidebarCategoryHeader\n                                                ref={this.categoryTitleRef}\n                                                displayName={displayName}\n                                                dragHandleProps={provided.dragHandleProps}\n                                                isCollapsed={category.collapsed}\n                                                isCollapsible={isCollapsible}\n                                                isDragging={snapshot.isDragging}\n                                                isDraggingOver={droppableSnapshot.isDraggingOver}\n                                                muted={category.muted}\n                                                onClick={this.handleCollapse}\n                                            >\n                                                {newLabel}\n                                                {directMessagesModalButton}\n                                                {categoryMenu}\n                                            </SidebarCategoryHeader>\n                                            <div\n                                                className={classNames('SidebarChannelGroup_content', {\n                                                    hasFollowingSibling: category.type === CategoryTypes.DIRECT_MESSAGES,\n                                                })}\n                                            >\n                                                <ul\n                                                    role='list'\n                                                    className='NavGroupContent'\n                                                >\n                                                    {this.renderNewDropBox(droppableSnapshot.isDraggingOver)}\n                                                    {renderedChannels}\n                                                    {this.showPlaceholder() ? droppableProvided.placeholder : null}\n                                                </ul>\n                                            </div>\n                                        </div>\n                                    );\n                                }}\n                            </Droppable>\n                            {inviteMembersButton}\n                        </div>\n                    );\n                }}\n            </Draggable>\n        );\n    }\n}\n\n// Adding references to translations for i18n-extract\nt('sidebar.types.channels');\nt('sidebar.types.direct_messages');\nt('sidebar.types.favorites');\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {setCategoryCollapsed, setCategorySorting} from 'mattermost-redux/actions/channel_categories';\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {ChannelCategory} from 'mattermost-redux/types/channel_categories';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {Preferences, Touched} from 'utils/constants';\n\nimport {getDraggingState, makeGetFilteredChannelIdsForCategory} from 'selectors/views/channel_sidebar';\nimport {GlobalState} from 'types/store';\n\nimport SidebarCategory from './sidebar_category';\n\ntype OwnProps = {\n    category: ChannelCategory;\n}\n\nfunction makeMapStateToProps() {\n    const getChannelIdsForCategory = makeGetFilteredChannelIdsForCategory();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        return {\n            channelIds: getChannelIdsForCategory(state, ownProps.category),\n            draggingState: getDraggingState(state),\n            touchedInviteMembersButton: getBool(state, Preferences.TOUCHED, Touched.INVITE_MEMBERS),\n            currentUserId: getCurrentUserId(state),\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            setCategoryCollapsed,\n            setCategorySorting,\n            savePreferences,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(SidebarCategory);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function UnreadBelowIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                xmlns='http://www.w3.org/2000/svg'\n                width='16'\n                height='16'\n                viewBox='0 0 16 16'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.arrow.down', defaultMessage: 'Down Arrow Icon'})}\n            >\n                <path d='M8.696 2H7.184V11L3.062 6.878L2 7.94L7.94 13.88L13.88 7.94L12.818 6.878L8.696 11V2Z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport UnreadBelowIcon from 'components/widgets/icons/unread_below_icon';\n\nimport './unread_channel_indicator.scss';\n\ntype Props = {\n\n    /**\n     * Function to call when the indicator is clicked\n     */\n    onClick: (event: React.MouseEvent<HTMLDivElement>) => void;\n\n    /**\n     * Set whether to show the indicator or not\n     */\n    show?: boolean;\n\n    /**\n     * The additional CSS class for the indicator\n     */\n    extraClass?: string;\n\n    /**\n     * The content of the indicator\n     */\n    content?: React.ReactNode;\n\n    /**\n     * The name of the indicator\n     */\n    name?: string;\n}\n\nfunction UnreadChannelIndicator(props: Props) {\n    return (\n        <div\n            id={'unreadIndicator' + props.name}\n            className={classNames('nav-pills__unread-indicator', {\n                'nav-pills__unread-indicator--visible': props.show,\n            }, props.extraClass)}\n            onClick={props.onClick}\n        >\n            <UnreadBelowIcon className='icon icon__unread'/>\n            {props.content}\n        </div>\n    );\n}\n\nUnreadChannelIndicator.defaultProps = {\n    show: false,\n    extraClass: '',\n    content: '',\n};\n\nexport default UnreadChannelIndicator;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport UnreadChannelIndicator from './unread_channel_indicator';\n\nexport default UnreadChannelIndicator;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport {SidebarCategoryHeaderStatic} from '../sidebar_category_header';\nimport SidebarChannel from '../sidebar_channel';\n\ntype Props = {\n    getChannelRef: (channelId: string) => HTMLLIElement | undefined;\n    setChannelRef: (channelId: string, ref: HTMLLIElement) => void;\n    unreadChannels: Channel[];\n};\n\nexport default function UnreadChannels(props: Props) {\n    const intl = useIntl();\n\n    if (props.unreadChannels.length === 0) {\n        return null;\n    }\n\n    return (\n        <div className='SidebarChannelGroup dropDisabled a11y__section'>\n            <SidebarCategoryHeaderStatic displayName={intl.formatMessage({id: 'sidebar.types.unreads', defaultMessage: 'UNREADS'})}/>\n            <div className='SidebarChannelGroup_content'>\n                <ul\n                    role='list'\n                    className='NavGroupContent'\n                >\n                    {props.unreadChannels.map((channel, index) => {\n                        return (\n                            <SidebarChannel\n                                key={channel.id}\n                                channelIndex={index}\n                                channelId={channel.id}\n                                setChannelRef={props.setChannelRef}\n                                getChannelRef={props.getChannelRef}\n                                isCategoryCollapsed={false}\n                                isCategoryDragged={false}\n                                isDraggable={false}\n                                isDropDisabled={true}\n                                isAutoSortedCategory={true}\n                            />\n                        );\n                    })}\n                </ul>\n            </div>\n        </div>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getUnreadChannels} from 'selectors/views/channel_sidebar';\n\nimport {GlobalState} from 'types/store';\n\nimport UnreadChannels from './unread_channels';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        unreadChannels: getUnreadChannels(state),\n    };\n}\n\nexport default connect(mapStateToProps)(UnreadChannels);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {HTMLAttributes} from 'react';\n\nconst ThreadsIcon = (attrs: HTMLAttributes<SVGElement>) => {\n    return (\n        <svg\n            width='14'\n            height='13'\n            viewBox='0 0 14 13'\n            fill='none'\n            xmlns='http://www.w3.org/2000/svg'\n            {...attrs}\n        >\n            <path\n                d='M11.7952 0.00524884C12.1312 0.00524884 12.4144 0.125249 12.6448 0.365248C12.8848 0.595648 13.0048 0.878848 13.0048 1.21485V8.41485C13.0048 8.75085 12.8848 9.03405 12.6448 9.26445C12.4144 9.49485 12.1312 9.61005 11.7952 9.61005H3.4L0.9952 12.0148V1.21485C0.9952 0.878848 1.1104 0.595648 1.3408 0.365248C1.5808 0.125249 1.8688 0.00524884 2.2048 0.00524884H11.7952ZM2.2048 1.21485V9.10605L2.896 8.41485H11.7952V1.21485H2.2048ZM3.4 3.01485H10.6V4.21005H3.4V3.01485ZM3.4 5.40525H8.8V6.61485H3.4V5.40525Z'\n            />\n        </svg>\n    );\n};\n\nexport default ThreadsIcon;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {Link, useRouteMatch, useLocation, matchPath} from 'react-router-dom';\nimport classNames from 'classnames';\nimport {useIntl} from 'react-intl';\nimport {useSelector, useDispatch} from 'react-redux';\n\nimport {getThreadCountsInCurrentTeam} from 'mattermost-redux/selectors/entities/threads';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getThreads} from 'mattermost-redux/actions/threads';\n\nimport {t} from 'utils/i18n';\n\nimport {isUnreadFilterEnabled} from 'selectors/views/channel_sidebar';\nimport {useThreadRouting} from '../hooks';\n\nimport ChannelMentionBadge from 'components/sidebar/sidebar_channel/channel_mention_badge';\n\nimport ThreadsIcon from './threads_icon';\n\nimport './global_threads_link.scss';\n\nconst GlobalThreadsLink = () => {\n    const {formatMessage} = useIntl();\n    const dispatch = useDispatch();\n    const isFeatureEnabled = useSelector(isCollapsedThreadsEnabled);\n\n    const {url} = useRouteMatch();\n    const {pathname} = useLocation();\n    const inGlobalThreads = matchPath(pathname, {path: '/:team/threads/:threadIdentifier?'}) != null;\n    const {currentTeamId, currentUserId} = useThreadRouting();\n\n    const counts = useSelector(getThreadCountsInCurrentTeam);\n    const unreadsOnly = useSelector(isUnreadFilterEnabled);\n    const someUnreadThreads = counts?.total_unread_threads;\n\n    useEffect(() => {\n        // load counts if necessary\n        if (isFeatureEnabled) {\n            dispatch(getThreads(currentUserId, currentTeamId, {perPage: 5}));\n        }\n    }, [currentTeamId, isFeatureEnabled]);\n\n    if (!isFeatureEnabled || (unreadsOnly && !inGlobalThreads && !someUnreadThreads)) {\n        // hide link if feature disabled or filtering unreads and there are no unread threads\n        return null;\n    }\n\n    return (\n        <ul className='SidebarGlobalThreads NavGroupContent nav nav-pills__container'>\n            <li\n                className={classNames('SidebarChannel', {\n                    active: inGlobalThreads,\n                    unread: someUnreadThreads,\n                })}\n                tabIndex={-1}\n            >\n                <Link\n                    to={`${url}/threads`}\n                    id='sidebarItem_threads'\n                    draggable='false'\n                    className={classNames('SidebarLink sidebar-item', {\n                        'unread-title': Boolean(someUnreadThreads),\n                    })}\n                    role='listitem'\n                    tabIndex={0}\n                >\n                    <span className='icon'>\n                        <ThreadsIcon/>\n                    </span>\n                    <div className='SidebarChannelLinkLabel_wrapper'>\n                        <span className='SidebarChannelLinkLabel sidebar-item__name'>\n                            {formatMessage({id: t('globalThreads.sidebarLink'), defaultMessage: 'Threads'})}\n                        </span>\n                    </div>\n                    {counts?.total_unread_mentions > 0 && (\n                        <ChannelMentionBadge unreadMentions={counts.total_unread_mentions}/>\n                    )}\n                </Link>\n            </li>\n        </ul>\n    );\n};\n\nexport default GlobalThreadsLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport Scrollbars from 'react-custom-scrollbars';\nimport {DragDropContext, Droppable, DropResult, DragStart, BeforeCapture} from 'react-beautiful-dnd';\nimport {Spring, SpringSystem} from 'rebound';\nimport classNames from 'classnames';\n\nimport debounce from 'lodash/debounce';\n\nimport {General} from 'mattermost-redux/constants';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {ChannelCategory} from 'mattermost-redux/types/channel_categories';\nimport {Team} from 'mattermost-redux/types/teams';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {DraggingState} from 'types/store';\nimport {Constants, DraggingStates, DraggingStateTypes} from 'utils/constants';\nimport * as Utils from 'utils/utils';\nimport * as ChannelUtils from 'utils/channel_utils.jsx';\n\nimport SidebarCategory from '../sidebar_category';\nimport UnreadChannelIndicator from '../unread_channel_indicator';\nimport UnreadChannels from '../unread_channels';\n\nimport GlobalThreadsLink from 'components/threading/global_threads_link';\n\nexport function renderView(props: any) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--view'\n        />);\n}\n\nexport function renderThumbHorizontal(props: any) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--horizontal'\n        />);\n}\n\nexport function renderTrackVertical(props: any) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--verticalTrack'\n        />);\n}\n\nexport function renderThumbVertical(props: any) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--vertical'\n        />);\n}\n\ntype Props = {\n    currentTeam: Team;\n    currentChannelId: string;\n    categories: ChannelCategory[];\n    unreadChannelIds: string[];\n    isUnreadFilterEnabled: boolean;\n    displayedChannels: Channel[];\n    newCategoryIds: string[];\n    draggingState: DraggingState;\n    multiSelectedChannelIds: string[];\n    showUnreadsCategory: boolean;\n    collapsedThreads: boolean;\n    hasUnreadThreads: boolean;\n\n    handleOpenMoreDirectChannelsModal: (e: Event) => void;\n    onDragStart: (initial: DragStart) => void;\n    onDragEnd: (result: DropResult) => void;\n\n    actions: {\n        moveChannelsInSidebar: (categoryId: string, targetIndex: number, draggableChannelId: string) => void;\n        moveCategory: (teamId: string, categoryId: string, newIndex: number) => void;\n        switchToChannelById: (channelId: string) => void;\n        switchToGlobalThreads: () => void;\n        close: () => void;\n        setDraggingState: (data: DraggingState) => void;\n        stopDragging: () => void;\n        clearChannelSelection: () => void;\n        multiSelectChannelAdd: (channelId: string) => void;\n    };\n};\n\ntype State = {\n    showTopUnread: boolean;\n    showBottomUnread: boolean;\n};\n\n// scrollMargin is the margin at the edge of the channel list that we leave when scrolling to a channel.\nconst scrollMargin = 10;\n\n// categoryHeaderHeight is the height of the category header\nconst categoryHeaderHeight = 32;\n\n// scrollMarginWithUnread is the margin that we leave at the edge of the channel list when scrolling to a channel so\n// that the channel is not under the unread indicator.\nconst scrollMarginWithUnread = 55;\n\nexport default class SidebarChannelList extends React.PureComponent<Props, State> {\n    channelRefs: Map<string, HTMLLIElement>;\n    scrollbar: React.RefObject<Scrollbars>;\n    animate: SpringSystem;\n    scrollAnimation: Spring;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.channelRefs = new Map();\n        this.state = {\n            showTopUnread: false,\n            showBottomUnread: false,\n        };\n        this.scrollbar = React.createRef();\n\n        this.animate = new SpringSystem();\n        this.scrollAnimation = this.animate.createSpring();\n        this.scrollAnimation.setOvershootClampingEnabled(true); // disables the spring action at the end of animation\n        this.scrollAnimation.addListener({onSpringUpdate: this.handleScrollAnimationUpdate});\n    }\n\n    componentDidMount() {\n        document.addEventListener('keydown', this.navigateChannelShortcut);\n        document.addEventListener('keydown', this.navigateUnreadChannelShortcut);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.navigateChannelShortcut);\n        document.removeEventListener('keydown', this.navigateUnreadChannelShortcut);\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (!this.props.currentChannelId || !prevProps.currentChannelId) {\n            return;\n        }\n\n        // reset the scrollbar upon switching teams\n        if (this.props.currentTeam !== prevProps.currentTeam) {\n            this.scrollbar.current!.scrollToTop();\n        }\n\n        // Scroll to selected channel so it's in view\n        if (this.props.currentChannelId !== prevProps.currentChannelId) {\n            // This will be re-enabled when we can avoid animating the scroll on first load and team switch\n            // this.scrollToChannel(this.props.currentChannelId);\n        }\n\n        // TODO: Copying over so it doesn't get lost, but we don't have a design for the sidebar on mobile yet\n        // close the LHS on mobile when you change channels\n        if (this.props.currentChannelId !== prevProps.currentChannelId) {\n            this.props.actions.close();\n        }\n\n        this.updateUnreadIndicators();\n    }\n\n    getDisplayedChannelIds = () => {\n        return this.props.displayedChannels.map((channel) => channel.id);\n    }\n\n    getChannelRef = (channelId: string) => {\n        return this.channelRefs.get(channelId);\n    }\n\n    setChannelRef = (channelId: string, ref: HTMLLIElement) => {\n        if (ref) {\n            this.channelRefs.set(channelId, ref);\n        } else {\n            this.channelRefs.delete(channelId);\n        }\n    }\n\n    getFirstUnreadChannelFromChannelIdArray = (channelIds: string[]) => {\n        return channelIds.find((channelId) => {\n            return channelId !== this.props.currentChannelId && this.props.unreadChannelIds.includes(channelId);\n        });\n    }\n\n    handleScrollAnimationUpdate = (spring: Spring) => {\n        const val = spring.getCurrentValue();\n        this.scrollbar.current!.scrollTop(val);\n    }\n\n    scrollToFirstUnreadChannel = () => {\n        this.scrollToChannel(this.getFirstUnreadChannel(), true);\n    }\n\n    scrollToLastUnreadChannel = () => {\n        this.scrollToChannel(this.getLastUnreadChannel(), true);\n    }\n\n    scrollToChannel = (channelId: string | null | undefined, scrollingToUnread = false) => {\n        if (!channelId) {\n            return;\n        }\n\n        const element = this.channelRefs.get(channelId);\n        if (!element) {\n            return;\n        }\n\n        const top = element.offsetTop;\n        const bottom = top + element.offsetHeight;\n\n        const scrollTop = this.scrollbar.current!.getScrollTop();\n        const scrollHeight = this.scrollbar.current!.getClientHeight();\n\n        if (top < (scrollTop + categoryHeaderHeight)) {\n            // Scroll up to the item\n            const margin = (scrollingToUnread || !this.state.showTopUnread) ? scrollMargin : scrollMarginWithUnread;\n\n            let scrollEnd;\n            const displayedChannels = this.getDisplayedChannelIds();\n            if (displayedChannels.length > 0 && displayedChannels[0] === channelId) {\n                // This is the first channel, so scroll right to the top\n                scrollEnd = 0;\n            } else {\n                scrollEnd = top - margin - categoryHeaderHeight;\n            }\n\n            this.scrollToPosition(scrollEnd);\n        } else if (bottom > scrollTop + scrollHeight) {\n            // Scroll down to the item\n            const margin = (scrollingToUnread || !this.state.showBottomUnread) ? scrollMargin : scrollMarginWithUnread;\n            const scrollEnd = (bottom - scrollHeight) + margin;\n\n            this.scrollToPosition(scrollEnd);\n        }\n    }\n\n    scrollToPosition = (scrollEnd: number) => {\n        // Stop the current animation before scrolling\n        this.scrollAnimation.setCurrentValue(this.scrollbar.current!.getScrollTop()).setAtRest();\n\n        this.scrollAnimation.setEndValue(scrollEnd);\n    }\n\n    updateUnreadIndicators = () => {\n        if (this.props.draggingState.state) {\n            this.setState({\n                showTopUnread: false,\n                showBottomUnread: false,\n            });\n            return;\n        }\n\n        let showTopUnread = false;\n        let showBottomUnread = false;\n\n        // Consider partially obscured channels as above/below\n        const firstUnreadChannel = this.getFirstUnreadChannel();\n        const lastUnreadChannel = this.getLastUnreadChannel();\n\n        if (firstUnreadChannel) {\n            const firstUnreadElement = this.channelRefs.get(firstUnreadChannel);\n\n            if (firstUnreadElement && ((firstUnreadElement.offsetTop + firstUnreadElement.offsetHeight) - scrollMargin - categoryHeaderHeight) < this.scrollbar.current!.getScrollTop()) {\n                showTopUnread = true;\n            }\n        }\n\n        if (lastUnreadChannel) {\n            const lastUnreadElement = this.channelRefs.get(lastUnreadChannel);\n\n            if (lastUnreadElement && (lastUnreadElement.offsetTop + scrollMargin) > (this.scrollbar.current!.getScrollTop() + this.scrollbar.current!.getClientHeight())) {\n                showBottomUnread = true;\n            }\n        }\n\n        if (showTopUnread !== this.state.showTopUnread || showBottomUnread !== this.state.showBottomUnread) {\n            this.setState({\n                showTopUnread,\n                showBottomUnread,\n            });\n        }\n    }\n\n    getFirstUnreadChannel = () => {\n        return this.getFirstUnreadChannelFromChannelIdArray(this.getDisplayedChannelIds());\n    }\n\n    getLastUnreadChannel = () => {\n        return this.getFirstUnreadChannelFromChannelIdArray(this.getDisplayedChannelIds().reverse());\n    }\n\n    navigateByChannelId = (id: string) => {\n        if (this.props.collapsedThreads && id === '') {\n            this.props.actions.switchToGlobalThreads();\n        } else {\n            this.props.actions.switchToChannelById(id);\n        }\n    }\n\n    navigateChannelShortcut = (e: KeyboardEvent) => {\n        if (e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey && (Utils.isKeyPressed(e, Constants.KeyCodes.UP) || Utils.isKeyPressed(e, Constants.KeyCodes.DOWN))) {\n            e.preventDefault();\n\n            const allChannelIds = this.getDisplayedChannelIds();\n            const curChannelId = this.props.currentChannelId;\n\n            if (this.props.collapsedThreads) {\n                // threads set channel id to ''\n                // add it to allChannelIds\n                allChannelIds.unshift('');\n            }\n\n            let curIndex = -1;\n            for (let i = 0; i < allChannelIds.length; i++) {\n                if (allChannelIds[i] === curChannelId) {\n                    curIndex = i;\n                }\n            }\n            let nextIndex = curIndex;\n            if (Utils.isKeyPressed(e, Constants.KeyCodes.DOWN)) {\n                nextIndex = curIndex + 1;\n            } else {\n                nextIndex = curIndex - 1;\n            }\n            const nextChannelId = allChannelIds[Utils.mod(nextIndex, allChannelIds.length)];\n            this.navigateByChannelId(nextChannelId);\n            this.scrollToChannel(nextChannelId);\n        } else if (Utils.cmdOrCtrlPressed(e) && e.shiftKey && Utils.isKeyPressed(e, Constants.KeyCodes.K)) {\n            this.props.handleOpenMoreDirectChannelsModal(e);\n        }\n    };\n\n    navigateUnreadChannelShortcut = (e: KeyboardEvent) => {\n        if (e.altKey && e.shiftKey && !e.ctrlKey && !e.metaKey && (Utils.isKeyPressed(e, Constants.KeyCodes.UP) || Utils.isKeyPressed(e, Constants.KeyCodes.DOWN))) {\n            e.preventDefault();\n\n            const allChannelIds = this.getDisplayedChannelIds();\n            const unreadChannelIds = [...this.props.unreadChannelIds];\n\n            if (this.props.collapsedThreads) {\n                allChannelIds.unshift('');\n\n                if (this.props.hasUnreadThreads) {\n                    unreadChannelIds.unshift('');\n                }\n            }\n\n            let direction = 0;\n            if (Utils.isKeyPressed(e, Constants.KeyCodes.UP)) {\n                direction = -1;\n            } else {\n                direction = 1;\n            }\n\n            const nextIndex = ChannelUtils.findNextUnreadChannelId(\n                this.props.currentChannelId,\n                allChannelIds,\n                unreadChannelIds,\n                direction,\n            );\n\n            if (nextIndex !== -1) {\n                const nextChannelId = allChannelIds[nextIndex];\n                this.navigateByChannelId(nextChannelId);\n                this.scrollToChannel(nextChannelId);\n            }\n        }\n    };\n\n    renderCategory = (category: ChannelCategory, index: number) => {\n        return (\n            <SidebarCategory\n                key={category.id}\n                category={category}\n                categoryIndex={index}\n                setChannelRef={this.setChannelRef}\n                handleOpenMoreDirectChannelsModal={this.props.handleOpenMoreDirectChannelsModal}\n                getChannelRef={this.getChannelRef}\n                isNewCategory={this.props.newCategoryIds.includes(category.id)}\n            />\n        );\n    }\n\n    onScroll = debounce(() => {\n        this.updateUnreadIndicators();\n    }, 100);\n\n    onTransitionEnd = debounce(() => {\n        this.updateUnreadIndicators();\n    }, 100);\n\n    onBeforeCapture = (before: BeforeCapture) => {\n        // // Ensure no channels are animating\n        this.channelRefs.forEach((ref) => ref.classList.remove('animating'));\n\n        // Turn off scrolling temporarily so that dimensions can be captured\n        const droppable = [...document.querySelectorAll<HTMLDivElement>('[data-rbd-droppable-id*=\"droppable-categories\"]')];\n        droppable[0].style.height = `${droppable[0].scrollHeight}px`;\n\n        if (!this.props.multiSelectedChannelIds.find((id) => before.draggableId === id)) {\n            this.props.actions.clearChannelSelection();\n        }\n\n        const draggingState: DraggingState = {\n            state: DraggingStates.CAPTURE,\n            id: before.draggableId,\n        };\n\n        if (this.props.categories.some((category) => category.id === before.draggableId)) {\n            draggingState.type = DraggingStateTypes.CATEGORY;\n        } else {\n            const draggingChannels = this.props.displayedChannels.filter((channel) => this.props.multiSelectedChannelIds.indexOf(channel.id) !== -1 || channel.id === before.draggableId);\n            if (draggingChannels.every((channel) => channel.type === General.DM_CHANNEL || channel.type === General.GM_CHANNEL)) {\n                draggingState.type = DraggingStateTypes.DM;\n            } else if (draggingChannels.every((channel) => channel.type !== General.DM_CHANNEL && channel.type !== General.GM_CHANNEL)) {\n                draggingState.type = DraggingStateTypes.CHANNEL;\n            } else {\n                draggingState.type = DraggingStateTypes.MIXED_CHANNELS;\n            }\n        }\n\n        this.props.actions.setDraggingState(draggingState);\n    }\n\n    onBeforeDragStart = () => {\n        this.props.actions.setDraggingState({state: DraggingStates.BEFORE});\n    }\n\n    onDragStart = (initial: DragStart) => {\n        this.props.onDragStart(initial);\n\n        this.props.actions.setDraggingState({state: DraggingStates.DURING});\n\n        // Re-enable scroll box resizing\n        const droppable = [...document.querySelectorAll<HTMLDivElement>('[data-rbd-droppable-id*=\"droppable-categories\"]')];\n        droppable[0].style.height = '';\n    }\n\n    onDragEnd = (result: DropResult) => {\n        this.props.onDragEnd(result);\n\n        if (result.reason === 'DROP' && result.destination) {\n            if (result.type === 'SIDEBAR_CHANNEL') {\n                this.props.actions.moveChannelsInSidebar(result.destination.droppableId, result.destination.index, result.draggableId);\n                trackEvent('ui', 'ui_sidebar_dragdrop_dropped_channel');\n            } else if (result.type === 'SIDEBAR_CATEGORY') {\n                this.props.actions.moveCategory(this.props.currentTeam.id, result.draggableId, result.destination.index);\n                trackEvent('ui', 'ui_sidebar_dragdrop_dropped_category');\n            }\n        }\n\n        this.props.actions.stopDragging();\n    }\n\n    render() {\n        const {categories} = this.props;\n\n        let channelList: React.ReactNode;\n        if (this.props.isUnreadFilterEnabled) {\n            channelList = (\n                <UnreadChannels\n                    getChannelRef={this.getChannelRef}\n                    setChannelRef={this.setChannelRef}\n                />\n            );\n        } else {\n            let unreadsCategory;\n            if (this.props.showUnreadsCategory) {\n                unreadsCategory = (\n                    <UnreadChannels\n                        getChannelRef={this.getChannelRef}\n                        setChannelRef={this.setChannelRef}\n                    />\n                );\n            }\n\n            const renderedCategories = categories.map(this.renderCategory);\n\n            channelList = (\n                <>\n                    {unreadsCategory}\n                    <DragDropContext\n                        onDragEnd={this.onDragEnd}\n                        onBeforeDragStart={this.onBeforeDragStart}\n                        onBeforeCapture={this.onBeforeCapture}\n                        onDragStart={this.onDragStart}\n                    >\n                        <Droppable\n                            droppableId='droppable-categories'\n                            type='SIDEBAR_CATEGORY'\n                        >\n                            {(provided) => {\n                                return (\n                                    <div\n                                        ref={provided.innerRef}\n                                        {...provided.droppableProps}\n                                    >\n                                        {renderedCategories}\n                                        {provided.placeholder}\n                                    </div>\n                                );\n                            }}\n                        </Droppable>\n                    </DragDropContext>\n                </>\n            );\n        }\n\n        const above = (\n            <FormattedMessage\n                id='sidebar.unreads'\n                defaultMessage='More unreads'\n            />\n        );\n\n        const below = (\n            <FormattedMessage\n                id='sidebar.unreads'\n                defaultMessage='More unreads'\n            />\n        );\n\n        const ariaLabel = Utils.localizeMessage('accessibility.sections.lhsList', 'channel sidebar region');\n\n        return (\n\n            // NOTE: id attribute added to temporarily support the desktop app's at-mention DOM scraping of the old sidebar\n            <>\n                <GlobalThreadsLink/>\n                <div\n                    id='sidebar-left'\n                    role='application'\n                    aria-label={ariaLabel}\n                    className={classNames('SidebarNavContainer a11y__region', {\n                        disabled: this.props.isUnreadFilterEnabled,\n                    })}\n                    data-a11y-disable-nav={Boolean(this.props.draggingState.type)}\n                    data-a11y-sort-order='7'\n                    onTransitionEnd={this.onTransitionEnd}\n                >\n                    <UnreadChannelIndicator\n                        name='Top'\n                        show={this.state.showTopUnread}\n                        onClick={this.scrollToFirstUnreadChannel}\n                        extraClass='nav-pills__unread-indicator-top'\n                        content={above}\n                    />\n                    <UnreadChannelIndicator\n                        name='Bottom'\n                        show={this.state.showBottomUnread}\n                        onClick={this.scrollToLastUnreadChannel}\n                        extraClass='nav-pills__unread-indicator-bottom'\n                        content={below}\n                    />\n                    <Scrollbars\n                        ref={this.scrollbar}\n                        autoHide={true}\n                        autoHideTimeout={500}\n                        autoHideDuration={500}\n                        renderThumbHorizontal={renderThumbHorizontal}\n                        renderThumbVertical={renderThumbVertical}\n                        renderTrackVertical={renderTrackVertical}\n                        renderView={renderView}\n                        onScroll={this.onScroll}\n                        style={{position: 'absolute'}}\n                    >\n                        {channelList}\n                    </Scrollbars>\n                </div>\n            </>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {moveCategory} from 'mattermost-redux/actions/channel_categories';\nimport {getCurrentChannelId, getUnreadChannelIds} from 'mattermost-redux/selectors/entities/channels';\nimport {shouldShowUnreadsCategory, isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getThreadCountsInCurrentTeam} from 'mattermost-redux/selectors/entities/threads';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {switchToChannelById} from 'actions/views/channel';\nimport {switchToGlobalThreads} from 'actions/views/threads';\nimport {\n    moveChannelsInSidebar,\n    setDraggingState,\n    stopDragging,\n    clearChannelSelection,\n    multiSelectChannelAdd,\n} from 'actions/views/channel_sidebar';\nimport {close} from 'actions/views/lhs';\nimport {\n    getDisplayedChannels,\n    getDraggingState,\n    getCategoriesForCurrentTeam,\n    isUnreadFilterEnabled,\n} from 'selectors/views/channel_sidebar';\nimport {GlobalState} from 'types/store';\n\nimport SidebarChannelList from './sidebar_channel_list';\n\nfunction mapStateToProps(state: GlobalState) {\n    const currentTeam = getCurrentTeam(state);\n    const collapsedThreads = isCollapsedThreadsEnabled(state);\n\n    let hasUnreadThreads = false;\n    if (collapsedThreads) {\n        hasUnreadThreads = Boolean(getThreadCountsInCurrentTeam(state)?.total_unread_threads);\n    }\n\n    return {\n        currentTeam,\n        currentChannelId: getCurrentChannelId(state),\n        categories: getCategoriesForCurrentTeam(state),\n        isUnreadFilterEnabled: isUnreadFilterEnabled(state),\n        unreadChannelIds: getUnreadChannelIds(state),\n        displayedChannels: getDisplayedChannels(state),\n        draggingState: getDraggingState(state),\n        newCategoryIds: state.views.channelSidebar.newCategoryIds,\n        multiSelectedChannelIds: state.views.channelSidebar.multiSelectedChannelIds,\n        showUnreadsCategory: shouldShowUnreadsCategory(state),\n        collapsedThreads,\n        hasUnreadThreads,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            close,\n            switchToChannelById,\n            switchToGlobalThreads,\n            moveChannelsInSidebar,\n            moveCategory,\n            setDraggingState,\n            stopDragging,\n            clearChannelSelection,\n            multiSelectChannelAdd,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SidebarChannelList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {useSelector} from 'react-redux';\nimport styled from 'styled-components';\nimport {Tooltip} from 'react-bootstrap';\n\nimport Flex from '@mattermost/compass-components/utilities/layout/Flex';\nimport Heading from '@mattermost/compass-components/components/heading';\nimport IconButton from '@mattermost/compass-components/components/icon-button';\n\nimport {AddChannelButtonTreatments} from 'mattermost-redux/constants/config';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {getInt, getAddChannelButtonTreatment} from 'mattermost-redux/selectors/entities/preferences';\nimport {getChannelsNameMapInCurrentTeam} from 'mattermost-redux/selectors/entities/channels';\n\nimport {GlobalState} from 'types/store';\nimport Constants, {Preferences, TutorialSteps} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport MainMenu from 'components/main_menu';\nimport MenuTutorialTip from 'components/tutorial/menu_tutorial_tip';\nimport AddChannelDropdown from 'components/sidebar/add_channel_dropdown';\n\ntype SidebarHeaderContainerProps = {\n    menuInHeading: boolean;\n}\n\ntype SidebarHeaderProps = {\n    menuInHeading?: boolean;\n}\n\nconst SidebarHeaderContainer = styled(Flex).attrs(() => ({\n    element: 'header',\n    row: true,\n    justify: 'space-between',\n    alignment: 'center',\n}))<SidebarHeaderContainerProps>`\n    height: 52px;\n    padding: 0 16px;\n\n    .dropdown-menu {\n        position: absolute;\n        transform: translate(${(p) => (p.menuInHeading ? '0' : '-100%')}, 0);\n        margin-left: ${(p) => (p.menuInHeading ? '0' : '100')}%;\n        min-width: 210px;\n        max-width: 210px;\n    }\n\n    #SidebarContainer & .AddChannelDropdown_dropdownButton {\n        border-radius: 16px;\n        font-size: 18px;\n    }\n`;\n\nconst HEADING_WIDTH = 200;\nconst CHEVRON_WIDTH = 26;\nconst ADD_CHANNEL_DROPDOWN_WIDTH = 28;\nconst TREATMENT_WIDTH = (HEADING_WIDTH - CHEVRON_WIDTH - ADD_CHANNEL_DROPDOWN_WIDTH).toString();\n\nconst SidebarHeading = styled(Heading).attrs(() => ({\n    element: 'h1',\n    margin: 'none',\n    size: 200,\n}))<SidebarHeaderProps>`\n    color: var(--sidebar-header-text-color);\n    ${(p) => (p.menuInHeading ? 'cursor: pointer;' : '')}\n    ${(p) => (p.menuInHeading ? 'display: flex;' : '')}\n    ${(p) => (p.menuInHeading ? '' : `\n              overflow: hidden;\n              text-overflow: ellipsis;\n              white-space: nowrap;\n              `)}\n\n    .title {\n        max-width: ${(p) => (p.menuInHeading ? TREATMENT_WIDTH : '200')}px;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        display: inline-block;\n    }\n\n    .icon-chevron-down {\n        margin-left: -3px;\n        margin-right: -1px;\n    }\n\n    #SidebarContainer & {\n        font-family: Metropolis, sans-serif;\n    }\n`;\n\nexport type Props = {\n    showNewChannelModal: () => void;\n    showMoreChannelsModal: () => void;\n    invitePeopleModal: () => void;\n    showCreateCategoryModal: () => void;\n    canCreateChannel: boolean;\n    canJoinPublicChannel: boolean;\n    handleOpenDirectMessagesModal: (e: Event) => void;\n    unreadFilterEnabled: boolean;\n}\n\nconst noop = () => {};\n\nconst SidebarHeader: React.FC<Props> = (props: Props): JSX.Element => {\n    const currentTeam = useSelector((state: GlobalState) => getCurrentTeam(state));\n    const currentUser = useSelector((state: GlobalState) => getCurrentUser(state));\n    const tipStep = useSelector((state: GlobalState) => getInt(state, Preferences.TUTORIAL_STEP, currentUser.id));\n    const isMobile = Utils.isMobile();\n\n    const showMenuTip = tipStep === TutorialSteps.MENU_POPOVER && !isMobile;\n    const showAddChannelTip = tipStep === TutorialSteps.ADD_CHANNEL_POPOVER && !isMobile;\n    const addChannelButton = useSelector((state: GlobalState) => getAddChannelButtonTreatment(state));\n    const hasAddChannelTreatment = Boolean(addChannelButton) && addChannelButton !== AddChannelButtonTreatments.NONE;\n    const channelsByName = useSelector((state: GlobalState) => getChannelsNameMapInCurrentTeam(state));\n    const townSquareDisplayName = channelsByName[Constants.DEFAULT_CHANNEL]?.display_name || '';\n    const offTopicDisplayName = channelsByName[Constants.OFFTOPIC_CHANNEL]?.display_name || '';\n\n    const [menuToggled, setMenuToggled] = useState(false);\n\n    const handleMenuToggle = () => {\n        setMenuToggled(!menuToggled);\n    };\n\n    let menu = (\n        <MenuWrapper onToggle={handleMenuToggle}>\n            <IconButton\n                icon='dots-vertical'\n                size='sm'\n                compact={true}\n                inverted={true}\n                active={menuToggled}\n                onClick={noop}\n            />\n            <MainMenu id='sidebarDropdownMenu'/>\n        </MenuWrapper>\n    );\n\n    if (hasAddChannelTreatment) {\n        menu = (\n            <AddChannelDropdown\n                showNewChannelModal={props.showNewChannelModal}\n                showMoreChannelsModal={props.showMoreChannelsModal}\n                invitePeopleModal={props.invitePeopleModal}\n                showCreateCategoryModal={props.showCreateCategoryModal}\n                canCreateChannel={props.canCreateChannel}\n                canJoinPublicChannel={props.canJoinPublicChannel}\n                handleOpenDirectMessagesModal={props.handleOpenDirectMessagesModal}\n                unreadFilterEnabled={props.unreadFilterEnabled}\n                townSquareDisplayName={townSquareDisplayName}\n                offTopicDisplayName={offTopicDisplayName}\n                showTutorialTip={showAddChannelTip}\n                addChannelButton={addChannelButton}\n            />\n        );\n    }\n\n    let sidebarHeadingContent: JSX.Element = (\n        <SidebarHeading>\n            {currentTeam.display_name}\n        </SidebarHeading>\n    );\n\n    if (hasAddChannelTreatment) {\n        sidebarHeadingContent = (\n            <>\n                <MenuWrapper\n                    onToggle={handleMenuToggle}\n                    className='SidebarHeaderMenuWrapper'\n                >\n                    <SidebarHeading menuInHeading={true}>\n                        <span className='title'>{currentTeam.display_name}</span>\n                        <i className='icon icon-chevron-down'/>\n                    </SidebarHeading>\n                    <MainMenu id='sidebarDropdownMenu'/>\n                </MenuWrapper>\n                {showMenuTip && (\n                    <MenuTutorialTip\n                        onBottom={false}\n                        inHeading={true}\n                    />\n                )}\n            </>\n        );\n    }\n\n    const sidebarHeader = (\n        <>\n            {(showMenuTip && !hasAddChannelTreatment) ? <MenuTutorialTip onBottom={false}/> : null}\n            <SidebarHeaderContainer menuInHeading={hasAddChannelTreatment}>\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='bottom'\n                    overlay={currentTeam.description?.length ? <Tooltip id='team-name__tooltip'>{currentTeam.description}</Tooltip> : <></>}\n                >\n                    {sidebarHeadingContent}\n                </OverlayTrigger>\n                {menu}\n            </SidebarHeaderContainer>\n        </>\n    );\n\n    return sidebarHeader;\n};\n\nexport default SidebarHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport SidebarHeader from './sidebar_header';\nexport default SidebarHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport styled from 'styled-components';\n\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport {localizeMessage} from 'utils/utils.jsx';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport MenuIcon from 'components/widgets/icons/menu_icon';\nimport Constants, {ModalIdentifiers} from 'utils/constants';\n\nimport MenuTutorialTip from 'components/tutorial/menu_tutorial_tip';\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\nimport CustomStatusModal from 'components/custom_status/custom_status_modal';\n\nconst HeaderLine = styled.div`\n    display: flex;\n    padding: 2px 16px 0 0;\n    flex-grow: 1;\n    user-select: none;\n    color: var(--sidebar-header-text-color);\n`;\n\nconst VerticalStack = styled.div`\n    display: flex;\n    flex-direction: column;\n    flex-grow: 1;\n`;\n\ntype Props = {\n    showTutorialTip: boolean;\n    teamDescription: string;\n    teamId: string;\n    currentUser: UserProfile;\n    teamDisplayName: string;\n    openModal: (modalData: any) => void;\n};\n\nexport default class SidebarHeaderDropdownButton extends React.PureComponent<Props> {\n    handleCustomStatusEmojiClick = (event: React.MouseEvent) => {\n        event.stopPropagation();\n        const customStatusInputModalData = {\n            modalId: ModalIdentifiers.CUSTOM_STATUS,\n            dialogType: CustomStatusModal,\n        };\n        this.props.openModal(customStatusInputModalData);\n    }\n\n    render() {\n        let tutorialTip = null;\n\n        if (this.props.showTutorialTip) {\n            tutorialTip = (\n                <MenuTutorialTip onBottom={false}/>\n            );\n        }\n\n        let teamNameWithToolTip = (\n            <h1\n                id='headerTeamName'\n                className='team__name'\n                data-teamid={this.props.teamId}\n            >\n                {this.props.teamDisplayName}\n            </h1>\n        );\n\n        if (this.props.teamDescription) {\n            teamNameWithToolTip = (\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='bottom'\n                    overlay={<Tooltip id='team-name__tooltip'>{this.props.teamDescription}</Tooltip>}\n                >\n                    {teamNameWithToolTip}\n                </OverlayTrigger>\n            );\n        }\n\n        return (\n            <div\n                className='SidebarHeaderDropdownButton'\n                id='sidebarHeaderDropdownButton'\n            >\n                {tutorialTip}\n                <HeaderLine\n                    id='headerInfo'\n                    className='header__info'\n                >\n                    <VerticalStack>\n                        {teamNameWithToolTip}\n                        <div\n                            id='headerInfoContent'\n                            className='header__info__content'\n                        >\n                            <div\n                                id='headerUsername'\n                                className='user__name'\n                            >\n                                {'@' + this.props.currentUser.username}\n                            </div>\n                            <CustomStatusEmoji\n                                showTooltip={true}\n                                tooltipDirection='bottom'\n                                emojiStyle={{\n                                    verticalAlign: 'top',\n                                    marginLeft: 2,\n                                }}\n                                onClick={this.handleCustomStatusEmojiClick as unknown as () => void}\n                            />\n                        </div>\n                    </VerticalStack>\n                    <button\n                        className='style--none sidebar-header-dropdown__icon'\n                        aria-label={localizeMessage('navbar_dropdown.menuAriaLabel', 'main menu')}\n                    >\n                        <MenuIcon/>\n                    </button>\n                </HeaderLine>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport * as GlobalActions from 'actions/global_actions';\nimport {Constants, ModalIdentifiers} from 'utils/constants';\nimport {cmdOrCtrlPressed, isKeyPressed} from 'utils/utils';\n\nimport UserSettingsModal from 'components/user_settings/modal';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport MainMenu from 'components/main_menu';\n\nimport SidebarHeaderDropdownButton from './sidebar_header_dropdown_button';\n\ntype Actions = {\n    openModal: (openModalData: any) => void;\n}\n\ntype Props = {\n    teamDescription: string;\n    teamDisplayName: string;\n    teamId: string;\n    currentUser: UserProfile;\n    showTutorialTip: boolean;\n    actions: Actions;\n}\n\nexport default class SidebarHeaderDropdown extends React.PureComponent<Props> {\n    toggleShortcutsModal = (e: React.MouseEvent) => {\n        e.preventDefault();\n        GlobalActions.toggleShortcutsModal();\n    }\n\n    componentDidMount() {\n        document.addEventListener('keydown', this.handleKeyDown);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleKeyDown);\n    }\n\n    handleKeyDown = (e: KeyboardEvent) => {\n        if (cmdOrCtrlPressed(e) && e.shiftKey && isKeyPressed(e, Constants.KeyCodes.A)) {\n            e.preventDefault();\n            this.props.actions.openModal({modalId: ModalIdentifiers.USER_SETTINGS, dialogType: UserSettingsModal, dialogProps: {isContentProductSettings: true}});\n        }\n    }\n\n    handleEmitUserLoggedOutEvent = () => {\n        GlobalActions.emitUserLoggedOutEvent();\n    }\n\n    render() {\n        const currentUser = this.props.currentUser;\n\n        if (!currentUser) {\n            return null;\n        }\n\n        return (\n            <MenuWrapper\n                className='main-menu'\n            >\n                <SidebarHeaderDropdownButton\n                    showTutorialTip={this.props.showTutorialTip}\n                    teamDescription={this.props.teamDescription}\n                    currentUser={this.props.currentUser}\n                    teamDisplayName={this.props.teamDisplayName}\n                    teamId={this.props.teamId}\n                    openModal={this.props.actions.openModal}\n                />\n                <MainMenu id='sidebarDropdownMenu'/>\n            </MenuWrapper>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {GlobalState} from 'types/store';\n\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {getInt} from 'mattermost-redux/selectors/entities/preferences';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {openModal} from 'actions/views/modals';\n\nimport {Preferences, TutorialSteps} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\n\nimport SidebarHeaderDropdown from './sidebar_header_dropdown';\n\nfunction mapStateToProps(state: GlobalState) {\n    const currentTeam = getCurrentTeam(state);\n    const currentUser = getCurrentUser(state);\n    const showTutorialTip = getInt(state, Preferences.TUTORIAL_STEP, currentUser.id) === TutorialSteps.MENU_POPOVER && !Utils.isMobile();\n\n    return {\n        currentUser,\n        teamDescription: currentTeam.description,\n        teamDisplayName: currentTeam.display_name,\n        teamId: currentTeam.id,\n        showTutorialTip,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            openModal,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SidebarHeaderDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport * as Utils from 'utils/utils.jsx';\nimport StatusDropdown from 'components/status_dropdown';\n\nimport SidebarHeaderDropdown from './dropdown';\n\ntype Actions = {\n    openModal: (openModalData: any) => void;\n}\n\ntype Props = {\n    teamDescription: string;\n    teamDisplayName: string;\n    teamId: string;\n    actions: Actions;\n}\n\ntype State = {\n    isMobile: boolean;\n}\n\nexport default class LegacySidebarHeader extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            isMobile: Utils.isMobile(),\n        };\n    }\n\n    componentDidMount() {\n        window.addEventListener('resize', this.handleResize);\n    }\n\n    componentWillUnmount() {\n        window.removeEventListener('resize', this.handleResize);\n    }\n\n    handleResize = () => {\n        const isMobile = Utils.isMobile();\n        this.setState({isMobile});\n    }\n\n    render() {\n        const ariaLabel = Utils.localizeMessage('accessibility.sections.lhsHeader', 'team menu region');\n\n        return (\n            <div\n                id='lhsHeader'\n                aria-label={ariaLabel}\n                tabIndex={-1}\n                role='application'\n                className='SidebarHeader team__header theme a11y__region'\n                data-a11y-sort-order='5'\n            >\n                <div\n                    className='d-flex'\n                >\n                    {!this.state.isMobile && <StatusDropdown/>}\n                    <SidebarHeaderDropdown/>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {getInt} from 'mattermost-redux/selectors/entities/preferences';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {GlobalState} from 'types/store';\nimport {Preferences, TutorialSteps} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\n\nimport {openModal} from 'actions/views/modals';\n\nimport LegacySidebarHeader from './legacy_sidebar_header';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n    const currentTeam = getCurrentTeam(state);\n    const currentUser = getCurrentUser(state);\n\n    const enableTutorial = config.EnableTutorial === 'true';\n\n    const showTutorialTip = getInt(state, Preferences.TUTORIAL_STEP, currentUser.id) === TutorialSteps.MENU_POPOVER && !Utils.isMobile();\n\n    return {\n        enableTutorial,\n        showTutorialTip,\n        teamDescription: currentTeam.description,\n        teamDisplayName: currentTeam.display_name,\n        teamId: currentTeam.id,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            openModal,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(LegacySidebarHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport './progress_bar.scss';\n\ntype Props = {\n    total: number;\n    current: number;\n    basePercentage?: number;\n};\n\nconst ProgressBar: React.FC<Props> = (props: Props) => {\n    return (\n        <div className='ProgressBar'>\n            <div\n                className='ProgressBar__progress'\n                style={{\n                    flexBasis: props.basePercentage ? `${props.basePercentage}%` : '',\n                    flexGrow: props.current / props.total,\n                }}\n            />\n        </div>\n    );\n};\n\nexport default ProgressBar;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport classNames from 'classnames';\n\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message.jsx';\nimport {StepType} from 'components/next_steps_view/steps';\nimport {getAnalyticsCategory} from 'components/next_steps_view/step_helpers';\nimport ProgressBar from 'components/progress_bar';\nimport {ModalIdentifiers, RecommendedNextSteps, Preferences} from 'utils/constants';\nimport {localizeMessage} from 'utils/utils';\n\nimport './sidebar_next_steps.scss';\n\nimport RemoveNextStepsModal from './remove_next_steps_modal';\n\ntype Props = {\n    active: boolean;\n    showNextSteps: boolean;\n    currentUserId: string;\n    preferences: PreferenceType[];\n    steps: StepType[];\n    isAdmin: boolean;\n    enableOnboardingFlow: boolean;\n    globalHeaderEnabled: boolean;\n    actions: {\n        savePreferences: (userId: string, preferences: PreferenceType[]) => void;\n        openModal: (modalData: {modalId: string; dialogType: any; dialogProps?: any}) => void;\n        closeModal: (modalId: string) => void;\n        setShowNextStepsView: (show: boolean) => void;\n    };\n};\n\ntype State = {\n    complete: number;\n};\n\nexport default class SidebarNextSteps extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            complete: 0,\n        };\n    }\n\n    closeNextSteps = (event: React.SyntheticEvent): void => {\n        const {globalHeaderEnabled, showNextSteps, isAdmin} = this.props;\n        event.stopPropagation();\n        if (showNextSteps) {\n            trackEvent(getAnalyticsCategory(isAdmin), 'click_skip_getting_started', {channel_sidebar: true});\n        } else {\n            trackEvent(getAnalyticsCategory(isAdmin), 'click_skip_tips');\n        }\n\n        const screenTitle = showNextSteps ? localizeMessage('sidebar_next_steps.gettingStarted', 'Getting Started') : localizeMessage('sidebar_next_steps.tipsAndNextSteps', 'Tips & Next Steps');\n\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.REMOVE_NEXT_STEPS_MODAL,\n            dialogType: RemoveNextStepsModal,\n            dialogProps: {\n                screenTitle,\n                globalHeaderEnabled,\n                onConfirm: this.onConfirmModal,\n                onCancel: this.onCloseModal,\n            },\n        });\n    }\n\n    showNextSteps = () => {\n        if (this.props.showNextSteps) {\n            trackEvent(getAnalyticsCategory(this.props.isAdmin), 'click_getting_started');\n        } else {\n            trackEvent(getAnalyticsCategory(this.props.isAdmin), 'click_tips');\n        }\n\n        this.props.actions.setShowNextStepsView(true);\n    }\n\n    onCloseModal = () => {\n        this.props.actions.closeModal(ModalIdentifiers.REMOVE_NEXT_STEPS_MODAL);\n    }\n\n    onConfirmModal = () => {\n        this.props.actions.savePreferences(this.props.currentUserId, [{\n            user_id: this.props.currentUserId,\n            category: Preferences.RECOMMENDED_NEXT_STEPS,\n            name: RecommendedNextSteps.HIDE,\n            value: 'true',\n        }]);\n\n        if (!this.props.showNextSteps) {\n            trackEvent(getAnalyticsCategory(this.props.isAdmin), 'click_confirm_remove_tips');\n        }\n\n        this.props.actions.setShowNextStepsView(false);\n\n        this.onCloseModal();\n    }\n\n    render() {\n        if (!this.props.enableOnboardingFlow) {\n            return null;\n        }\n\n        if (this.props.preferences.length === 0) {\n            return null;\n        }\n\n        if (this.props.preferences.some((pref) => pref.name === RecommendedNextSteps.HIDE && pref.value === 'true')) {\n            return null;\n        }\n\n        const total = this.props.steps.length;\n        const complete = this.props.preferences.filter((pref) => pref.name !== RecommendedNextSteps.HIDE && pref.value === 'true').length;\n\n        let header = (\n            <FormattedMessage\n                id='sidebar_next_steps.gettingStarted'\n                defaultMessage='Getting Started'\n            />\n        );\n        if (!this.props.showNextSteps) {\n            header = (\n                <FormattedMessage\n                    id='sidebar_next_steps.tipsAndNextSteps'\n                    defaultMessage='Tips & Next Steps'\n                />\n            );\n        }\n\n        let middleSection = (\n            <FormattedMarkdownMessage\n                id='sidebar_next_steps.stepsComplete'\n                defaultMessage='{complete} / {total} steps complete'\n                values={{\n                    complete,\n                    total,\n                }}\n            />\n        );\n        if (!this.props.showNextSteps) {\n            middleSection = (\n                <FormattedMessage\n                    id='sidebar_next_steps.otherAreasToExplore'\n                    defaultMessage='A few other areas to explore'\n                />\n            );\n        }\n        return (\n            <div\n                className={classNames('SidebarNextSteps', {\n                    active: this.props.active,\n                    tips: !this.props.showNextSteps,\n                })}\n                onClick={this.showNextSteps}\n            >\n                <div className='SidebarNextSteps__top'>\n                    <span>{header}</span>\n                    <button\n                        className='SidebarNextSteps__close'\n                        onClick={this.closeNextSteps}\n                    >\n                        <i className='icon icon-close'/>\n                    </button>\n                </div>\n                <div className='SidebarNextSteps__middle'>\n                    <span>{middleSection}</span>\n                </div>\n                {this.props.showNextSteps && (\n                    <div className='SidebarNextSteps__progressBar'>\n                        <ProgressBar\n                            current={complete}\n                            total={total}\n                            basePercentage={4}\n                        />\n                    </div>\n                )}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {Dispatch, bindActionCreators} from 'redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {makeGetCategory} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId, getCurrentUser, isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {getSteps} from '../../next_steps_view/steps';\n\nimport {openModal, closeModal} from 'actions/views/modals';\nimport {setShowNextStepsView} from 'actions/views/next_steps';\nimport {showNextSteps, showNextStepsTips} from 'components/next_steps_view/steps';\nimport {getGlobalHeaderEnabled} from 'selectors/global_header';\nimport {GlobalState} from 'types/store';\nimport {Preferences} from 'utils/constants';\n\nimport SidebarNextSteps from './sidebar_next_steps';\n\nfunction makeMapStateToProps() {\n    const getCategory = makeGetCategory();\n\n    return (state: GlobalState) => ({\n        active: state.views.nextSteps.show,\n        steps: getSteps(state),\n        showNextSteps: showNextSteps(state),\n        showNextStepsTips: showNextStepsTips(state),\n        currentUser: getCurrentUser(state),\n        currentUserId: getCurrentUserId(state),\n        preferences: getCategory(state, Preferences.RECOMMENDED_NEXT_STEPS),\n        isAdmin: isCurrentUserSystemAdmin(state),\n        enableOnboardingFlow: getConfig(state).EnableOnboardingFlow === 'true',\n        globalHeaderEnabled: getGlobalHeaderEnabled(state),\n    });\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            savePreferences,\n            openModal,\n            closeModal,\n            setShowNextStepsView,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(SidebarNextSteps);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport classNames from 'classnames';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport EditCategoryModal from 'components/edit_category_modal';\nimport MoreDirectChannels from 'components/more_direct_channels';\nimport DataPrefetch from 'components/data_prefetch';\nimport MoreChannels from 'components/more_channels';\nimport NewChannelFlow from 'components/new_channel_flow';\nimport InvitationModal from 'components/invitation_modal';\n\nimport Pluggable from 'plugins/pluggable';\nimport Constants, {ModalIdentifiers} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport ChannelNavigator from './channel_navigator';\nimport SidebarChannelList from './sidebar_channel_list';\nimport SidebarHeader from './sidebar_header';\nimport LegacySidebarHeader from './legacy_sidebar_header';\nimport SidebarNextSteps from './sidebar_next_steps';\n\ntype Props = {\n    teamId: string;\n    canCreatePublicChannel: boolean;\n    canCreatePrivateChannel: boolean;\n    canJoinPublicChannel: boolean;\n    isOpen: boolean;\n    hasSeenModal: boolean;\n    actions: {\n        fetchMyCategories: (teamId: string) => {data: boolean};\n        createCategory: (teamId: string, categoryName: string) => {data: string};\n        openModal: (modalData: {modalId: string; dialogType: any; dialogProps?: any}) => Promise<{\n            data: boolean;\n        }>;\n        clearChannelSelection: () => void;\n    };\n    isCloud: boolean;\n    unreadFilterEnabled: boolean;\n    globalHeaderEnabled: boolean;\n};\n\ntype State = {\n    showDirectChannelsModal: boolean;\n    isDragging: boolean;\n    isMobile: boolean;\n};\n\nexport default class Sidebar extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            showDirectChannelsModal: false,\n            isDragging: false,\n            isMobile: Utils.isMobile(),\n        };\n    }\n\n    handleResize = () => {\n        const isMobile = Utils.isMobile();\n        this.setState({isMobile});\n    }\n\n    componentDidMount() {\n        if (this.props.teamId) {\n            this.props.actions.fetchMyCategories(this.props.teamId);\n        }\n\n        window.addEventListener('click', this.handleClickClearChannelSelection);\n        window.addEventListener('keydown', this.handleKeyDownClearChannelSelection);\n        window.addEventListener('resize', this.handleResize);\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (this.props.teamId && prevProps.teamId !== this.props.teamId) {\n            this.props.actions.fetchMyCategories(this.props.teamId);\n        }\n    }\n\n    componentWillUnmount() {\n        window.removeEventListener('click', this.handleClickClearChannelSelection);\n        window.removeEventListener('keydown', this.handleKeyDownClearChannelSelection);\n        window.removeEventListener('resize', this.handleResize);\n    }\n\n    handleClickClearChannelSelection = (event: MouseEvent) => {\n        if (event.defaultPrevented) {\n            return;\n        }\n\n        this.props.actions.clearChannelSelection();\n    }\n\n    handleKeyDownClearChannelSelection = (event: KeyboardEvent) => {\n        if (Utils.isKeyPressed(event, Constants.KeyCodes.ESCAPE)) {\n            this.props.actions.clearChannelSelection();\n        }\n    }\n\n    showMoreDirectChannelsModal = () => {\n        this.setState({showDirectChannelsModal: true});\n        trackEvent('ui', 'ui_channels_more_direct_v2');\n    }\n\n    hideMoreDirectChannelsModal = () => {\n        this.setState({showDirectChannelsModal: false});\n    }\n\n    showCreateCategoryModal = () => {\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.EDIT_CATEGORY,\n            dialogType: EditCategoryModal,\n        });\n        trackEvent('ui', 'ui_sidebar_menu_createCategory');\n    }\n\n    handleCreateCategory = (categoryName: string) => {\n        this.props.actions.createCategory(this.props.teamId, categoryName);\n    }\n\n    showMoreChannelsModal = () => {\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.MORE_CHANNELS,\n            dialogType: MoreChannels,\n            dialogProps: {morePublicChannelsModalType: 'public'},\n        });\n        trackEvent('ui', 'ui_channels_more_public_v2');\n    }\n\n    invitePeopleModal = () => {\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.INVITATION,\n            dialogType: InvitationModal,\n        });\n        trackEvent('ui', 'ui_channels_dropdown_invite_people');\n    }\n\n    showNewChannelModal = () => {\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.NEW_CHANNEL_FLOW,\n            dialogType: NewChannelFlow,\n        });\n        trackEvent('ui', 'ui_channels_create_channel_v2');\n    }\n\n    handleOpenMoreDirectChannelsModal = (e: Event) => {\n        e.preventDefault();\n        if (this.state.showDirectChannelsModal) {\n            this.hideMoreDirectChannelsModal();\n        } else {\n            this.showMoreDirectChannelsModal();\n        }\n    }\n\n    onDragStart = () => {\n        this.setState({isDragging: true});\n    }\n\n    onDragEnd = () => {\n        this.setState({isDragging: false});\n    }\n\n    renderModals = () => {\n        let moreDirectChannelsModal;\n        if (this.state.showDirectChannelsModal) {\n            moreDirectChannelsModal = (\n                <MoreDirectChannels\n                    onModalDismissed={this.hideMoreDirectChannelsModal}\n                    isExistingChannel={false}\n                />\n            );\n        }\n\n        return (\n            <React.Fragment>\n                {moreDirectChannelsModal}\n            </React.Fragment>\n        );\n    }\n\n    render() {\n        if (!this.props.teamId) {\n            return (<div/>);\n        }\n\n        const ariaLabel = Utils.localizeMessage('accessibility.sections.lhsNavigator', 'channel navigator region');\n\n        return (\n            <div\n                id='SidebarContainer'\n                className={classNames({\n                    'move--right': this.props.isOpen && Utils.isMobile(),\n                    dragging: this.state.isDragging,\n                })}\n            >\n                {\n                    this.props.globalHeaderEnabled && !this.state.isMobile ? (\n                        <SidebarHeader\n                            showNewChannelModal={this.showNewChannelModal}\n                            showMoreChannelsModal={this.showMoreChannelsModal}\n                            invitePeopleModal={this.invitePeopleModal}\n                            showCreateCategoryModal={this.showCreateCategoryModal}\n                            canCreateChannel={this.props.canCreatePrivateChannel || this.props.canCreatePublicChannel}\n                            canJoinPublicChannel={this.props.canJoinPublicChannel}\n                            handleOpenDirectMessagesModal={this.handleOpenMoreDirectChannelsModal}\n                            unreadFilterEnabled={this.props.unreadFilterEnabled}\n                        />\n                    ) : <LegacySidebarHeader/>\n                }\n                <div\n                    id='lhsNavigator'\n                    role='application'\n                    aria-label={ariaLabel}\n                    className='a11y__region'\n                    data-a11y-sort-order='6'\n                >\n                    <ChannelNavigator\n                        showNewChannelModal={this.showNewChannelModal}\n                        showMoreChannelsModal={this.showMoreChannelsModal}\n                        invitePeopleModal={this.invitePeopleModal}\n                        showCreateCategoryModal={this.showCreateCategoryModal}\n                        canCreateChannel={this.props.canCreatePrivateChannel || this.props.canCreatePublicChannel}\n                        canJoinPublicChannel={this.props.canJoinPublicChannel}\n                        handleOpenDirectMessagesModal={this.handleOpenMoreDirectChannelsModal}\n                        unreadFilterEnabled={this.props.unreadFilterEnabled}\n                    />\n                </div>\n                <div className='sidebar--left__icons'>\n                    <Pluggable pluggableName='LeftSidebarHeader'/>\n                </div>\n                <SidebarChannelList\n                    handleOpenMoreDirectChannelsModal={this.handleOpenMoreDirectChannelsModal}\n                    onDragStart={this.onDragStart}\n                    onDragEnd={this.onDragEnd}\n                />\n                <DataPrefetch/>\n                <SidebarNextSteps/>\n                {this.renderModals()}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport {fetchMyCategories} from 'mattermost-redux/actions/channel_categories';\nimport {Preferences} from 'mattermost-redux/constants';\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {haveICurrentChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {createCategory, clearChannelSelection} from 'actions/views/channel_sidebar';\nimport {isUnreadFilterEnabled} from 'selectors/views/channel_sidebar';\nimport {openModal} from 'actions/views/modals';\nimport {GlobalState} from 'types/store';\nimport {getIsLhsOpen} from 'selectors/lhs';\nimport {getGlobalHeaderEnabled} from 'selectors/global_header';\n\nimport Sidebar from './sidebar';\n\nfunction mapStateToProps(state: GlobalState) {\n    const currentTeam = getCurrentTeam(state);\n    const unreadFilterEnabled = isUnreadFilterEnabled(state);\n\n    let canCreatePublicChannel = false;\n    let canCreatePrivateChannel = false;\n    let canJoinPublicChannel = false;\n\n    if (currentTeam) {\n        canCreatePublicChannel = haveICurrentChannelPermission(state, Permissions.CREATE_PUBLIC_CHANNEL);\n        canCreatePrivateChannel = haveICurrentChannelPermission(state, Permissions.CREATE_PRIVATE_CHANNEL);\n        canJoinPublicChannel = haveICurrentChannelPermission(state, Permissions.JOIN_PUBLIC_CHANNELS);\n    }\n    return {\n        teamId: currentTeam ? currentTeam.id : '',\n        canCreatePrivateChannel,\n        canCreatePublicChannel,\n        canJoinPublicChannel,\n        isOpen: getIsLhsOpen(state),\n        hasSeenModal: getBool(\n            state,\n            Preferences.CATEGORY_WHATS_NEW_MODAL,\n            Preferences.HAS_SEEN_SIDEBAR_WHATS_NEW_MODAL,\n            false,\n        ),\n        isCloud: getLicense(state).Cloud === 'true',\n        unreadFilterEnabled,\n        globalHeaderEnabled: getGlobalHeaderEnabled(state),\n    };\n}\n\ntype Actions = {\n    fetchMyCategories: (teamId: string) => {data: boolean};\n    createCategory: (teamId: string, categoryName: string) => {data: string};\n    openModal: (modalData: {modalId: string; dialogType: React.Component; dialogProps?: any}) => Promise<{\n        data: boolean;\n    }>;\n    clearChannelSelection: () => void;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject, Actions>({\n            clearChannelSelection,\n            createCategory,\n            fetchMyCategories,\n            openModal,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Sidebar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getChannel, getChannelMember, selectChannel, joinChannel, getChannelStats} from 'mattermost-redux/actions/channels';\nimport {getPostThread} from 'mattermost-redux/actions/posts';\nimport {getMissingProfilesByIds} from 'mattermost-redux/actions/users';\nimport {getCurrentTeam, getTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getUserIdFromChannelName} from 'mattermost-redux/utils/channel_utils';\n\nimport {loadChannelsForCurrentUser} from 'actions/channel_actions.jsx';\nimport {loadNewDMIfNeeded, loadNewGMIfNeeded} from 'actions/user_actions.jsx';\nimport {selectPostAndHighlight} from 'actions/views/rhs';\n\nimport {browserHistory} from 'utils/browser_history';\nimport {joinPrivateChannelPrompt} from 'utils/channel_utils';\nimport {ActionTypes, Constants, ErrorPageTypes} from 'utils/constants';\nimport {isSystemAdmin} from 'utils/utils';\nimport {isComment, getPostURL} from 'utils/post_utils';\n\nlet privateChannelJoinPromptVisible = false;\n\nfunction focusRootPost(post, channel) {\n    return async (dispatch, getState) => {\n        const postURL = getPostURL(getState(), post);\n\n        dispatch(selectChannel(channel.id));\n        dispatch({\n            type: ActionTypes.RECEIVED_FOCUSED_POST,\n            data: post.id,\n            channelId: channel.id,\n        });\n\n        browserHistory.replace(postURL);\n    };\n}\n\nfunction focusReplyPost(post, channel, teamId, returnTo) {\n    return async (dispatch, getState) => {\n        await dispatch(getPostThread(post.root_id));\n        const state = getState();\n\n        const team = getTeam(state, channel.team_id || teamId);\n        const currentChannel = getCurrentChannel(state);\n        const sameTeam = currentChannel && currentChannel.team_id === team.id;\n\n        if (!sameTeam) {\n            dispatch(selectChannel(channel.id));\n        }\n\n        if (sameTeam && returnTo) {\n            browserHistory.replace(returnTo);\n        } else {\n            const postURL = getPostURL(state, post);\n            browserHistory.replace(postURL);\n        }\n\n        dispatch(selectPostAndHighlight(post));\n    };\n}\n\nexport function focusPost(postId, returnTo = '', currentUserId) {\n    return async (dispatch, getState) => {\n        // Ignore if prompt is still visible\n        if (privateChannelJoinPromptVisible) {\n            return;\n        }\n        const {data} = await dispatch(getPostThread(postId));\n\n        if (!data) {\n            browserHistory.replace(`/error?type=${ErrorPageTypes.PERMALINK_NOT_FOUND}&returnTo=${returnTo}`);\n            return;\n        }\n\n        const state = getState();\n        const isCollapsed = isCollapsedThreadsEnabled(state);\n\n        const channelId = data.posts[data.order[0]].channel_id;\n        let channel = state.entities.channels.channels[channelId];\n        const currentTeam = getCurrentTeam(state);\n        const teamId = currentTeam.id;\n\n        if (!channel) {\n            const {data: channelData} = await dispatch(getChannel(channelId));\n\n            if (!channelData) {\n                browserHistory.replace(`/error?type=${ErrorPageTypes.PERMALINK_NOT_FOUND}&returnTo=${returnTo}`);\n                return;\n            }\n\n            channel = channelData;\n        }\n\n        let myMember = state.entities.channels.myMembers[channelId];\n\n        if (!myMember) {\n            // If it's a DM or GM channel and we don't have a channel member for it already, user is not a member\n            if (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL) {\n                browserHistory.replace(`/error?type=${ErrorPageTypes.PERMALINK_NOT_FOUND}&returnTo=${returnTo}`);\n                return;\n            }\n\n            const membership = await dispatch(getChannelMember(channel.id, currentUserId));\n            if ('data' in membership) {\n                myMember = membership.data;\n            }\n\n            if (!myMember) {\n                // Prompt system admin before joining the private channel\n                const user = getCurrentUser(state);\n                if (channel.type === Constants.PRIVATE_CHANNEL && isSystemAdmin(user.roles)) {\n                    privateChannelJoinPromptVisible = true;\n                    const joinPromptResult = await dispatch(joinPrivateChannelPrompt(currentTeam, channel));\n                    privateChannelJoinPromptVisible = false;\n                    if ('data' in joinPromptResult && !joinPromptResult.data.join) {\n                        return;\n                    }\n                }\n                await dispatch(joinChannel(currentUserId, null, channelId));\n            }\n        }\n\n        if (channel.team_id && channel.team_id !== teamId) {\n            browserHistory.replace(`/error?type=${ErrorPageTypes.PERMALINK_NOT_FOUND}&returnTo=${returnTo}`);\n            return;\n        }\n\n        if (channel && channel.type === Constants.DM_CHANNEL) {\n            const userId = getUserIdFromChannelName(currentUserId, channel.name);\n            await dispatch(getMissingProfilesByIds([userId]));\n            dispatch(loadNewDMIfNeeded(channel.id));\n        } else if (channel && channel.type === Constants.GM_CHANNEL) {\n            dispatch(loadNewGMIfNeeded(channel.id));\n        }\n\n        const post = data.posts[postId];\n\n        if (isCollapsed && isComment(post)) {\n            dispatch(focusReplyPost(post, channel, teamId, returnTo));\n        } else {\n            dispatch(focusRootPost(post, channel));\n        }\n\n        dispatch(loadChannelsForCurrentUser());\n        dispatch(getChannelStats(channelId));\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Constants from 'utils/constants.jsx';\nimport * as Utils from 'utils/utils.jsx';\n\nexport default class PermalinkView extends React.PureComponent {\n    static propTypes = {\n        channelId: PropTypes.string,\n\n        /*\n         * Object from react-router\n         */\n        match: PropTypes.shape({\n            params: PropTypes.shape({\n                postid: PropTypes.string.isRequired,\n            }).isRequired,\n        }).isRequired,\n        returnTo: PropTypes.string.isRequired,\n        teamName: PropTypes.string,\n        actions: PropTypes.shape({\n            focusPost: PropTypes.func.isRequired,\n        }).isRequired,\n        currentUserId: PropTypes.string.isRequired,\n    };\n\n    constructor(props) {\n        super(props);\n        this.state = {valid: false};\n    }\n\n    componentDidMount() {\n        this.mounted = true;\n        this.doPermalinkEvent(this.props);\n        document.body.classList.add('app__body');\n    }\n\n    componentDidUpdate(prevProps) {\n        const prevPostid = prevProps.match.params.postid;\n        const currPostid = this.props.match.params.postid;\n        if (prevPostid !== currPostid) {\n            this.doPermalinkEvent(this.props);\n        }\n    }\n\n    componentWillUnmount() {\n        this.mounted = false;\n    }\n\n    doPermalinkEvent = async (props) => {\n        const postId = props.match.params.postid;\n        await this.props.actions.focusPost(postId, this.props.returnTo, this.props.currentUserId);\n        if (this.mounted) {\n            this.setState({valid: true});\n        }\n    }\n\n    isStateValid = () => {\n        return this.state.valid && this.props.channelId && this.props.teamName;\n    }\n\n    onShortcutKeyDown = (e) => {\n        if (e.shiftKey && Utils.cmdOrCtrlPressed(e) && Utils.isKeyPressed(e, Constants.KeyCodes.L) && this.permalink.current) {\n            this.permalink.current.focus();\n        }\n    }\n\n    render() {\n        if (!this.isStateValid()) {\n            return (\n                <div\n                    id='app-content'\n                    className='app__content'\n                />\n            );\n        }\n\n        return null;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {focusPost} from './actions';\nimport PermalinkView from './permalink_view.jsx';\n\nfunction mapStateToProps(state) {\n    const team = getCurrentTeam(state);\n    const channel = getCurrentChannel(state);\n    const currentUserId = getCurrentUserId(state);\n    const channelId = channel ? channel.id : '';\n    const teamName = team ? team.name : '';\n\n    return {\n        channelId,\n        teamName,\n        currentUserId,\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            focusPost,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PermalinkView);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {localizeMessage} from 'utils/utils';\nimport {ChannelHeaderDropdownItems} from 'components/channel_header_dropdown';\nimport Menu from 'components/widgets/menu/menu';\n\nexport default class ChannelHeaderDropdown extends React.PureComponent {\n    render() {\n        return (\n            <Menu\n                id='channelHeaderDropdownMenu'\n                ariaLabel={localizeMessage('channel_header.menuAriaLabel', 'Channel Menu').toLowerCase()}\n            >\n                <ChannelHeaderDropdownItems isMobile={false}/>\n            </Menu>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {injectIntl, IntlShape} from 'react-intl';\n\nimport {sendEphemeralPost} from 'actions/global_actions';\nimport {AppCallResponseTypes, AppCallTypes} from 'mattermost-redux/constants/apps';\nimport {ActionResult} from 'mattermost-redux/types/actions';\nimport {AppBinding, AppCallRequest, AppCallResponse, AppCallType} from 'mattermost-redux/types/apps';\nimport {Channel, ChannelMembership} from 'mattermost-redux/types/channels';\nimport {Theme} from 'mattermost-redux/types/themes';\n\nimport {PluginComponent} from 'types/store/plugins';\nimport {createCallContext, createCallRequest} from 'utils/apps';\n\ntype Props = {\n\n    /*\n     * Components or actions to add as channel header buttons\n     */\n    components?: PluginComponent[];\n\n    /*\n     * Set to true if the plug is in the dropdown\n     */\n    isDropdown: boolean;\n    channel: Channel;\n    channelMember?: ChannelMembership;\n\n    /*\n     * Logged in user's theme\n     */\n    theme: Theme;\n    appBindings: AppBinding[];\n    appsEnabled: boolean;\n    intl: IntlShape;\n    actions: {\n        doAppCall: (call: AppCallRequest, type: AppCallType, intl: IntlShape) => Promise<ActionResult>;\n    };\n}\n\nclass MobileChannelHeaderPlug extends React.PureComponent<Props> {\n    createAppButton = (binding: AppBinding) => {\n        const onClick = () => this.fireAppAction(binding);\n\n        if (this.props.isDropdown) {\n            return (\n                <li\n                    key={'mobileChannelHeaderItem' + binding.app_id + binding.location}\n                    role='presentation'\n                    className='MenuItem'\n                >\n                    <a\n                        role='menuitem'\n                        href='#'\n                        onClick={onClick}\n                    >\n                        {binding.label}\n                    </a>\n                </li>\n            );\n        }\n\n        return (\n            <li className='flex-parent--center'>\n                <button\n                    className='navbar-toggle navbar-right__icon'\n                    onClick={onClick}\n                >\n                    <span className='icon navbar-plugin-button'>\n                        <img\n                            src={binding.icon}\n                            width='16'\n                            height='16'\n                        />\n                    </span>\n                </button>\n            </li>\n        );\n    }\n    createButton = (plug: PluginComponent) => {\n        const onClick = () => this.fireAction(plug);\n\n        if (this.props.isDropdown) {\n            return (\n                <li\n                    key={'mobileChannelHeaderItem' + plug.id}\n                    role='presentation'\n                    className='MenuItem'\n                >\n                    <a\n                        role='menuitem'\n                        href='#'\n                        onClick={onClick}\n                    >\n                        {plug.dropdownText}\n                    </a>\n                </li>\n            );\n        }\n\n        return (\n            <li className='flex-parent--center'>\n                <button\n                    className='navbar-toggle navbar-right__icon'\n                    onClick={onClick}\n                >\n                    <span className='icon navbar-plugin-button'>\n                        {plug.icon}\n                    </span>\n                </button>\n            </li>\n        );\n    }\n\n    createList(plugs: PluginComponent[]) {\n        return plugs.map(this.createButton);\n    }\n\n    createAppList(bindings: AppBinding[]) {\n        return bindings.map(this.createAppButton);\n    }\n\n    fireAction(plug: PluginComponent) {\n        return plug.action?.(this.props.channel, this.props.channelMember);\n    }\n\n    fireAppAction = async (binding: AppBinding) => {\n        if (!binding.call) {\n            return;\n        }\n\n        const context = createCallContext(\n            binding.app_id,\n            binding.location,\n            this.props.channel.id,\n            this.props.channel.team_id,\n        );\n        const call = createCallRequest(binding.call, context);\n        const res = await this.props.actions.doAppCall(call, AppCallTypes.SUBMIT, this.props.intl);\n\n        const callResp = (res as {data: AppCallResponse}).data;\n        const ephemeral = (message: string) => sendEphemeralPost(message, this.props.channel.id, '', callResp.app_metadata?.bot_user_id);\n        switch (callResp.type) {\n        case AppCallResponseTypes.OK:\n            if (callResp.markdown) {\n                ephemeral(callResp.markdown);\n            }\n            break;\n        case AppCallResponseTypes.ERROR: {\n            const errorMessage = callResp.error || this.props.intl.formatMessage({id: 'apps.error.unknown', defaultMessage: 'Unknown error happened'});\n            ephemeral(errorMessage);\n            break;\n        }\n        case AppCallResponseTypes.NAVIGATE:\n        case AppCallResponseTypes.FORM:\n            break;\n        default: {\n            const errorMessage = this.props.intl.formatMessage(\n                {id: 'apps.error.responses.unknown_type', defaultMessage: 'App response type not supported. Response type: {type}.'},\n                {type: callResp.type},\n            );\n            ephemeral(errorMessage);\n        }\n        }\n    }\n\n    render() {\n        const components = this.props.components || [];\n        const bindings = this.props.appBindings || [];\n\n        if (components.length === 0 && bindings.length === 0) {\n            return null;\n        } else if (components.length === 1 && bindings.length === 0) {\n            return this.createButton(components[0]);\n        } else if (components.length === 0 && bindings.length === 1) {\n            return this.createAppButton(bindings[0]);\n        }\n\n        if (!this.props.isDropdown) {\n            return null;\n        }\n\n        const plugItems = this.createList(components);\n        const appItems = this.createAppList(bindings);\n        return (<>\n            {plugItems}\n            {appItems}\n        </>);\n    }\n}\n\nexport default injectIntl(MobileChannelHeaderPlug);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\nimport {getMyCurrentChannelMembership} from 'mattermost-redux/selectors/entities/channels';\n\nimport {appsEnabled, makeAppBindingsSelector} from 'mattermost-redux/selectors/entities/apps';\nimport {AppBindingLocations} from 'mattermost-redux/constants/apps';\nimport {GlobalState} from 'types/store';\nimport {AppCallRequest, AppCallType} from 'mattermost-redux/types/apps';\nimport {ActionFunc, ActionResult, GenericAction} from 'mattermost-redux/types/actions';\nimport {doAppCall} from 'actions/apps';\n\nimport MobileChannelHeaderPlug from './mobile_channel_header_plug';\n\nconst getChannelHeaderBindings = makeAppBindingsSelector(AppBindingLocations.CHANNEL_HEADER_ICON);\n\nfunction mapStateToProps(state: GlobalState) {\n    const apps = appsEnabled(state);\n    return {\n        appBindings: getChannelHeaderBindings(state),\n        appsEnabled: apps,\n        channelMember: getMyCurrentChannelMembership(state),\n        components: state.plugins.components.MobileChannelHeaderButton,\n        theme: getTheme(state),\n    };\n}\n\ntype Actions = {\n    doAppCall: (call: AppCallRequest, type: AppCallType) => Promise<ActionResult>;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            doAppCall,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MobileChannelHeaderPlug);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {IgnoreChannelMentions, NotificationLevels, NotificationSections} from 'utils/constants';\nimport {t} from 'utils/i18n';\n\nexport default function Describe({section, isCollapsed, memberNotifyLevel, globalNotifyLevel, ignoreChannelMentions}) {\n    if (memberNotifyLevel === NotificationLevels.DEFAULT && globalNotifyLevel) {\n        t('channel_notifications.levels.default');\n        t('channel_notifications.levels.all');\n        t('channel_notifications.levels.mention');\n        t('channel_notifications.levels.none');\n        const levelsFormattedMessageId = 'channel_notifications.levels.' + globalNotifyLevel;\n        const notifyLevel = (\n            <FormattedMessage\n                id={levelsFormattedMessageId}\n                defaultMessage={globalNotifyLevel}\n            />\n        );\n        return (\n            <FormattedMessage\n                id='channel_notifications.globalDefault'\n                defaultMessage='Global default ({notifyLevel})'\n                values={{notifyLevel}}\n            />\n        );\n    } else if (memberNotifyLevel === NotificationLevels.MENTION && section === NotificationSections.MARK_UNREAD) {\n        if (isCollapsed) {\n            return (\n                <FormattedMessage\n                    id='channel_notifications.muteChannel.on.title.collapse'\n                    defaultMessage='Mute is enabled. Desktop, email and push notifications will not be sent for this channel.'\n                />\n            );\n        }\n        return (\n            <FormattedMessage\n                id='channel_notifications.muteChannel.on.title'\n                defaultMessage='On'\n            />\n        );\n    } else if (\n        section === NotificationSections.IGNORE_CHANNEL_MENTIONS &&\n        ignoreChannelMentions === IgnoreChannelMentions.ON\n    ) {\n        return (\n            <FormattedMessage\n                id='channel_notifications.ignoreChannelMentions.on.title'\n                defaultMessage='On'\n            />\n        );\n    } else if (\n        section === NotificationSections.IGNORE_CHANNEL_MENTIONS &&\n        ignoreChannelMentions === IgnoreChannelMentions.OFF\n    ) {\n        return (\n            <FormattedMessage\n                id='channel_notifications.ignoreChannelMentions.off.title'\n                defaultMessage='Off'\n            />\n        );\n    } else if (memberNotifyLevel === NotificationLevels.MENTION) {\n        return (\n            <FormattedMessage\n                id='channel_notifications.onlyMentions'\n                defaultMessage='Only for mentions'\n            />\n        );\n    } else if (\n        (section === NotificationSections.DESKTOP || section === NotificationSections.PUSH) &&\n        memberNotifyLevel === NotificationLevels.ALL\n    ) {\n        return (\n            <FormattedMessage\n                id='channel_notifications.allActivity'\n                defaultMessage='For all activity'\n            />\n        );\n    } else if (\n        section === NotificationSections.MARK_UNREAD &&\n        memberNotifyLevel === NotificationLevels.ALL\n    ) {\n        return (\n            <FormattedMessage\n                id='channel_notifications.muteChannel.off.title'\n                defaultMessage='Off'\n            />\n        );\n    }\n\n    return (\n        <FormattedMessage\n            id='channel_notifications.never'\n            defaultMessage='Never'\n        />\n    );\n}\n\nDescribe.propTypes = {\n    globalNotifyLevel: PropTypes.string,\n    ignoreChannelMentions: PropTypes.string,\n    memberNotifyLevel: PropTypes.string.isRequired,\n    section: PropTypes.string.isRequired,\n    isCollapsed: PropTypes.bool,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {NotificationSections} from 'utils/constants';\n\nexport default function SectionTitle({section}) {\n    if (section === NotificationSections.DESKTOP) {\n        return (\n            <FormattedMessage\n                id='channel_notifications.sendDesktop'\n                defaultMessage='Send desktop notifications'\n            />\n        );\n    } else if (section === NotificationSections.PUSH) {\n        return (\n            <FormattedMessage\n                id='channel_notifications.push'\n                defaultMessage='Send mobile push notifications'\n            />\n        );\n    } else if (section === NotificationSections.MARK_UNREAD) {\n        return (\n            <FormattedMessage\n                id='channel_notifications.muteChannel.settings'\n                defaultMessage='Mute Channel'\n            />\n        );\n    } else if (section === NotificationSections.IGNORE_CHANNEL_MENTIONS) {\n        return (\n            <FormattedMessage\n                id='channel_notifications.ignoreChannelMentions'\n                defaultMessage='Ignore mentions for @channel, @here and @all'\n            />\n        );\n    }\n\n    return null;\n}\n\nSectionTitle.propTypes = {\n    section: PropTypes.string.isRequired,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport SettingItemMin from 'components/setting_item_min';\n\nimport Describe from './describe.jsx';\nimport SectionTitle from './section_title.jsx';\n\nexport default function CollapseView({onExpandSection, globalNotifyLevel, memberNotifyLevel, section, ignoreChannelMentions}) {\n    return (\n        <SettingItemMin\n            title={<SectionTitle section={section}/>}\n            describe={\n                <Describe\n                    section={section}\n                    ignoreChannelMentions={ignoreChannelMentions}\n                    memberNotifyLevel={memberNotifyLevel}\n                    globalNotifyLevel={globalNotifyLevel}\n                    isCollapsed={true}\n                />\n            }\n            updateSection={onExpandSection}\n            section={section}\n        />\n    );\n}\n\nCollapseView.propTypes = {\n    ignoreChannelMentions: PropTypes.string,\n    onExpandSection: PropTypes.func.isRequired,\n    globalNotifyLevel: PropTypes.string,\n    memberNotifyLevel: PropTypes.string.isRequired,\n    section: PropTypes.string.isRequired,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {NotificationSections} from 'utils/constants';\n\nexport default function ExtraInfo({section}) {\n    switch (section) {\n    case NotificationSections.DESKTOP:\n        return (\n            <span>\n                <FormattedMessage\n                    id='channel_notifications.override'\n                    defaultMessage='Selecting an option other than \"Default\" will override the global notification settings. Desktop notifications are available on Firefox, Safari, and Chrome.'\n                />\n            </span>\n        );\n    case NotificationSections.PUSH:\n        return (\n            <span>\n                <FormattedMessage\n                    id='channel_notifications.overridePush'\n                    defaultMessage='Selecting an option other than \"Global default\" will override the global notification settings for mobile push notifications in account settings. Push notifications must be enabled by the System Admin.'\n                />\n            </span>\n        );\n    case NotificationSections.MARK_UNREAD:\n        return (\n            <span>\n                <FormattedMessage\n                    id='channel_notifications.muteChannel.help'\n                    defaultMessage='Muting turns off desktop, email and push notifications for this channel. The channel will not be marked as unread unless you are mentioned.'\n                />\n            </span>\n        );\n    case NotificationSections.IGNORE_CHANNEL_MENTIONS:\n        return (\n            <span>\n                <FormattedMessage\n                    id='channel_notifications.ignoreChannelMentions.help'\n                    defaultMessage='When enabled, @channel, @here and @all will not trigger mentions or mention notifications in this channel.'\n                />\n            </span>\n        );\n    default:\n        return null;\n    }\n}\n\nExtraInfo.propTypes = {\n    section: PropTypes.string.isRequired,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport {IgnoreChannelMentions, NotificationLevels, NotificationSections} from 'utils/constants';\n\nimport SettingItemMax from 'components/setting_item_max.jsx';\n\nimport Describe from './describe.jsx';\nimport ExtraInfo from './extra_info.jsx';\nimport SectionTitle from './section_title.jsx';\n\nexport default function ExpandView({\n    section,\n    memberNotifyLevel,\n    globalNotifyLevel,\n    onChange,\n    onSubmit,\n    serverError,\n    onCollapseSection,\n    ignoreChannelMentions,\n}) {\n    const inputs = [(\n        <div key='channel-notification-level-radio'>\n            {(section === NotificationSections.DESKTOP || section === NotificationSections.PUSH) &&\n            <fieldset>\n                <div className='radio'>\n                    <label className=''>\n                        <input\n                            id='channelNotificationGlobalDefault'\n                            name='channelDesktopNotifications'\n                            type='radio'\n                            value={NotificationLevels.DEFAULT}\n                            checked={memberNotifyLevel === NotificationLevels.DEFAULT}\n                            onChange={onChange}\n                        />\n                        <Describe\n                            section={section}\n                            memberNotifyLevel={NotificationLevels.DEFAULT}\n                            globalNotifyLevel={globalNotifyLevel}\n                        />\n                    </label>\n                </div>\n                <div className='radio'>\n                    <label className=''>\n                        <input\n                            id='channelNotificationAllActivity'\n                            name='channelDesktopNotifications'\n                            type='radio'\n                            value={NotificationLevels.ALL}\n                            checked={memberNotifyLevel === NotificationLevels.ALL}\n                            onChange={onChange}\n                        />\n                        <Describe\n                            section={section}\n                            memberNotifyLevel={NotificationLevels.ALL}\n                        />\n                    </label>\n                </div>\n                <div className='radio'>\n                    <label className=''>\n                        <input\n                            id='channelNotificationMentions'\n                            name='channelDesktopNotifications'\n                            type='radio'\n                            value={NotificationLevels.MENTION}\n                            checked={memberNotifyLevel === NotificationLevels.MENTION}\n                            onChange={onChange}\n                        />\n                        <Describe\n                            section={section}\n                            memberNotifyLevel={NotificationLevels.MENTION}\n                        />\n                    </label>\n                </div>\n                <div className='radio'>\n                    <label>\n                        <input\n                            id='channelNotificationNever'\n                            name='channelDesktopNotifications'\n                            type='radio'\n                            value={NotificationLevels.NONE}\n                            checked={memberNotifyLevel === NotificationLevels.NONE}\n                            onChange={onChange}\n                        />\n                        <Describe\n                            section={section}\n                            memberNotifyLevel={NotificationLevels.NONE}\n                        />\n                    </label>\n                </div>\n            </fieldset>\n            }\n            {section === NotificationSections.IGNORE_CHANNEL_MENTIONS &&\n                <fieldset>\n                    <div className='radio'>\n                        <label>\n                            <input\n                                id='ignoreChannelMentionsOn'\n                                name='ignoreChannelMentions'\n                                type='radio'\n                                value={IgnoreChannelMentions.ON}\n                                checked={ignoreChannelMentions === IgnoreChannelMentions.ON}\n                                onChange={onChange}\n                            />\n                            <Describe\n                                section={section}\n                                ignoreChannelMentions={IgnoreChannelMentions.ON}\n                                memberNotifyLevel={memberNotifyLevel}\n                                globalNotifyLevel={globalNotifyLevel}\n                            />\n                        </label>\n                    </div>\n                    <div className='radio'>\n                        <label>\n                            <input\n                                id='ignoreChannelMentionsOff'\n                                name='ignoreChannelMentions'\n                                type='radio'\n                                value={IgnoreChannelMentions.OFF}\n                                checked={ignoreChannelMentions === IgnoreChannelMentions.OFF}\n                                onChange={onChange}\n                            />\n                            <Describe\n                                section={section}\n                                ignoreChannelMentions={IgnoreChannelMentions.OFF}\n                                memberNotifyLevel={memberNotifyLevel}\n                                globalNotifyLevel={globalNotifyLevel}\n                            />\n                        </label>\n                    </div>\n                </fieldset>\n            }\n            {section === NotificationSections.MARK_UNREAD &&\n            <fieldset>\n                <div className='radio'>\n                    <label className=''>\n                        <input\n                            id='channelNotificationUnmute'\n                            name='channelNotificationMute'\n                            type='radio'\n                            value={NotificationLevels.MENTION}\n                            checked={memberNotifyLevel === NotificationLevels.MENTION}\n                            onChange={onChange}\n                        />\n                        <Describe\n                            section={section}\n                            memberNotifyLevel={NotificationLevels.MENTION}\n                        />\n                    </label>\n                </div>\n                <div className='radio'>\n                    <label className=''>\n                        <input\n                            id='channelNotificationMute'\n                            name='channelNotificationMute'\n                            type='radio'\n                            value={NotificationLevels.ALL}\n                            checked={memberNotifyLevel === NotificationLevels.ALL}\n                            onChange={onChange}\n                        />\n                        <Describe\n                            section={section}\n                            memberNotifyLevel={NotificationLevels.ALL}\n                        />\n                    </label>\n                </div>\n            </fieldset>\n            }\n        </div>\n    )];\n\n    return (\n        <SettingItemMax\n            title={<SectionTitle section={section}/>}\n            inputs={inputs}\n            submit={onSubmit}\n            server_error={serverError}\n            updateSection={onCollapseSection}\n            extraInfo={<ExtraInfo section={section}/>}\n        />\n    );\n}\n\nExpandView.propTypes = {\n    ignoreChannelMentions: PropTypes.string,\n    onChange: PropTypes.func.isRequired,\n    onCollapseSection: PropTypes.func.isRequired,\n    onSubmit: PropTypes.func.isRequired,\n    globalNotifyLevel: PropTypes.string,\n    memberNotifyLevel: PropTypes.string.isRequired,\n    section: PropTypes.string.isRequired,\n    serverError: PropTypes.string,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport {NotificationSections} from 'utils/constants';\n\nimport CollapseView from './collapse_view.jsx';\nimport ExpandView from './expand_view.jsx';\n\nexport default class NotificationSection extends React.PureComponent {\n    static propTypes = {\n\n        /**\n         * Notification section\n         */\n        section: PropTypes.string.isRequired,\n\n        /**\n         * Expand if true, else collapse the section\n         */\n        expand: PropTypes.bool.isRequired,\n\n        /**\n         * Member's desktop notification level\n         */\n        memberNotificationLevel: PropTypes.string.isRequired,\n\n        /**\n         * Ignore channel-wide mentions @channel, @here and @all\n         */\n        ignoreChannelMentions: PropTypes.string,\n\n        /**\n         * User's global notification level\n         */\n        globalNotificationLevel: PropTypes.string,\n\n        /**\n         * onChange handles update of desktop notification level\n         */\n        onChange: PropTypes.func.isRequired,\n\n        /**\n         * Submit function to save notification level\n         */\n        onSubmit: PropTypes.func.isRequired,\n\n        /**\n         * Update function to to expand or collapse a section\n         */\n        onUpdateSection: PropTypes.func.isRequired,\n\n        /**\n         * Error string from the server\n         */\n        serverError: PropTypes.string,\n    }\n\n    handleOnChange = (e) => {\n        this.props.onChange(e.target.value);\n    }\n\n    handleExpandSection = () => {\n        this.props.onUpdateSection(this.props.section);\n    }\n\n    handleCollapseSection = () => {\n        this.props.onUpdateSection(NotificationSections.NONE);\n    }\n\n    render() {\n        const {\n            expand,\n            globalNotificationLevel,\n            memberNotificationLevel,\n            ignoreChannelMentions,\n            onSubmit,\n            section,\n            serverError,\n        } = this.props;\n\n        if (expand) {\n            return (\n                <ExpandView\n                    section={section}\n                    memberNotifyLevel={memberNotificationLevel}\n                    globalNotifyLevel={globalNotificationLevel}\n                    ignoreChannelMentions={ignoreChannelMentions}\n                    onChange={this.handleOnChange}\n                    onSubmit={onSubmit}\n                    serverError={serverError}\n                    onCollapseSection={this.handleCollapseSection}\n                />\n            );\n        }\n\n        return (\n            <CollapseView\n                section={section}\n                onExpandSection={this.handleExpandSection}\n                memberNotifyLevel={memberNotificationLevel}\n                globalNotifyLevel={globalNotificationLevel}\n                ignoreChannelMentions={ignoreChannelMentions}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {isChannelMuted} from 'mattermost-redux/utils/channel_utils';\n\nimport {IgnoreChannelMentions, NotificationLevels, NotificationSections} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\n\nimport NotificationSection from 'components/channel_notifications_modal/components/notification_section.jsx';\n\nexport default class ChannelNotificationsModal extends React.PureComponent {\n    static propTypes = {\n\n        /**\n         * Function that is called when modal is hidden\n         */\n        onHide: PropTypes.func.isRequired,\n\n        /**\n         * Object with info about current channel\n         */\n        channel: PropTypes.object.isRequired,\n\n        /**\n         * Object with info about current channel membership\n         */\n        channelMember: PropTypes.object.isRequired,\n\n        /**\n         * Object with info about current user\n         */\n        currentUser: PropTypes.object.isRequired,\n\n        /**\n         * Boolean whether server sends push notifications\n         */\n        sendPushNotifications: PropTypes.bool.isRequired,\n\n        /*\n         * Object with redux action creators\n         */\n        actions: PropTypes.shape({\n\n            /*\n             * Action creator to update channel notify props\n             */\n            updateChannelNotifyProps: PropTypes.func.isRequired,\n        }),\n    };\n\n    constructor(props) {\n        super(props);\n\n        const channelNotifyProps = props.channelMember && props.channelMember.notify_props;\n\n        this.state = {\n            show: true,\n            activeSection: NotificationSections.NONE,\n            serverError: null,\n            ...this.getStateFromNotifyProps(channelNotifyProps, props.currentUser.notify_props),\n        };\n    }\n\n    componentDidUpdate(prevProps) {\n        const prevChannelNotifyProps = prevProps.channelMember && prevProps.channelMember.notify_props;\n        const channelNotifyProps = this.props.channelMember && this.props.channelMember.notify_props;\n\n        if (!Utils.areObjectsEqual(channelNotifyProps, prevChannelNotifyProps)) {\n            this.resetStateFromNotifyProps(channelNotifyProps, this.props.currentUser.notify_props);\n        }\n    }\n\n    resetStateFromNotifyProps(channelMemberNotifyProps, currentUserNotifyProps) {\n        this.setState(this.getStateFromNotifyProps(channelMemberNotifyProps, currentUserNotifyProps));\n    }\n\n    getStateFromNotifyProps(channelMemberNotifyProps, currentUserNotifyProps) {\n        let ignoreChannelMentionsDefault = IgnoreChannelMentions.OFF;\n\n        if (channelMemberNotifyProps.mark_unread === NotificationLevels.MENTION || (currentUserNotifyProps.channel && currentUserNotifyProps.channel === 'false')) {\n            ignoreChannelMentionsDefault = IgnoreChannelMentions.ON;\n        }\n\n        let ignoreChannelMentions = channelMemberNotifyProps.ignore_channel_mentions;\n        if (!ignoreChannelMentions || ignoreChannelMentions === IgnoreChannelMentions.DEFAULT) {\n            ignoreChannelMentions = ignoreChannelMentionsDefault;\n        }\n\n        return {\n            desktopNotifyLevel: channelMemberNotifyProps.desktop || NotificationLevels.DEFAULT,\n            markUnreadNotifyLevel: channelMemberNotifyProps.mark_unread || NotificationLevels.ALL,\n            pushNotifyLevel: channelMemberNotifyProps.push || NotificationLevels.DEFAULT,\n            ignoreChannelMentions,\n        };\n    }\n\n    handleHide = () => {\n        this.setState({\n            show: false,\n        });\n    }\n\n    handleExit = () => {\n        this.updateSection(NotificationSections.NONE);\n        this.props.onHide();\n    }\n\n    updateSection = (section = NotificationSections.NONE) => {\n        this.setState({activeSection: section});\n\n        if (section === NotificationSections.NONE) {\n            const channelNotifyProps = this.props.channelMember && this.props.channelMember.notify_props;\n            this.resetStateFromNotifyProps(channelNotifyProps, this.props.currentUser.notify_props);\n        }\n    }\n\n    handleUpdateChannelNotifyProps = async (props) => {\n        const {\n            actions,\n            channel,\n            currentUser,\n        } = this.props;\n\n        const {error} = await actions.updateChannelNotifyProps(currentUser.id, channel.id, props);\n        if (error) {\n            this.setState({serverError: error.message});\n        } else {\n            this.updateSection(NotificationSections.NONE);\n        }\n    }\n\n    handleSubmitDesktopNotifyLevel = () => {\n        const channelNotifyProps = this.props.channelMember && this.props.channelMember.notify_props;\n        const {desktopNotifyLevel} = this.state;\n\n        if (channelNotifyProps.desktop === desktopNotifyLevel) {\n            this.updateSection(NotificationSections.NONE);\n            return;\n        }\n\n        const props = {desktop: desktopNotifyLevel};\n        this.handleUpdateChannelNotifyProps(props);\n    }\n\n    handleUpdateDesktopNotifyLevel = (desktopNotifyLevel) => {\n        this.setState({desktopNotifyLevel});\n    }\n\n    handleSubmitMarkUnreadLevel = () => {\n        const channelNotifyProps = this.props.channelMember && this.props.channelMember.notify_props;\n        const {markUnreadNotifyLevel} = this.state;\n\n        if (channelNotifyProps.mark_unread === markUnreadNotifyLevel) {\n            this.updateSection(NotificationSections.NONE);\n            return;\n        }\n\n        const props = {mark_unread: markUnreadNotifyLevel};\n        this.handleUpdateChannelNotifyProps(props);\n    }\n\n    handleUpdateMarkUnreadLevel = (markUnreadNotifyLevel) => {\n        this.setState({markUnreadNotifyLevel});\n    }\n\n    handleSubmitPushNotificationLevel = () => {\n        const channelNotifyProps = this.props.channelMember && this.props.channelMember.notify_props;\n        const {pushNotifyLevel} = this.state;\n\n        if (channelNotifyProps.push === pushNotifyLevel) {\n            this.updateSection(NotificationSections.NONE);\n            return;\n        }\n\n        const props = {push: pushNotifyLevel};\n        this.handleUpdateChannelNotifyProps(props);\n    }\n\n    handleUpdatePushNotificationLevel = (pushNotifyLevel) => {\n        this.setState({pushNotifyLevel});\n    }\n\n    handleUpdateIgnoreChannelMentions = (ignoreChannelMentions) => {\n        this.setState({ignoreChannelMentions});\n    }\n\n    handleSubmitIgnoreChannelMentions = () => {\n        const channelNotifyProps = this.props.channelMember && this.props.channelMember.notify_props;\n        const {ignoreChannelMentions} = this.state;\n\n        if (channelNotifyProps.ignore_channel_mentions === ignoreChannelMentions) {\n            this.updateSection('');\n            return;\n        }\n\n        const props = {ignore_channel_mentions: ignoreChannelMentions};\n        this.handleUpdateChannelNotifyProps(props);\n    }\n\n    render() {\n        const {\n            activeSection,\n            desktopNotifyLevel,\n            markUnreadNotifyLevel,\n            pushNotifyLevel,\n            ignoreChannelMentions,\n            serverError,\n        } = this.state;\n\n        const {\n            channel,\n            channelMember,\n            currentUser,\n            sendPushNotifications,\n        } = this.props;\n\n        let serverErrorTag = null;\n        if (serverError) {\n            serverErrorTag = <div className='form-group has-error'><label className='control-label'>{serverError}</label></div>;\n        }\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal settings-modal settings-modal--tabless'\n                show={this.state.show}\n                onHide={this.handleHide}\n                onExited={this.handleExit}\n                role='dialog'\n                aria-labelledby='channelNotificationModalLabel'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='channelNotificationModalLabel'\n                    >\n                        <FormattedMessage\n                            id='channel_notifications.preferences'\n                            defaultMessage='Notification Preferences for '\n                        />\n                        <span className='name'>{channel.display_name}</span>\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    <div className='settings-table'>\n                        <div className='settings-content'>\n                            <div\n                                ref='wrapper'\n                                className='user-settings'\n                            >\n                                <br/>\n                                <div className='divider-dark first'/>\n                                <NotificationSection\n                                    section={NotificationSections.MARK_UNREAD}\n                                    expand={activeSection === NotificationSections.MARK_UNREAD}\n                                    memberNotificationLevel={markUnreadNotifyLevel}\n                                    onChange={this.handleUpdateMarkUnreadLevel}\n                                    onSubmit={this.handleSubmitMarkUnreadLevel}\n                                    onUpdateSection={this.updateSection}\n                                    serverError={serverError}\n                                />\n                                <div className='divider-light'/>\n                                <NotificationSection\n                                    section={NotificationSections.IGNORE_CHANNEL_MENTIONS}\n                                    expand={activeSection === NotificationSections.IGNORE_CHANNEL_MENTIONS}\n                                    memberNotificationLevel={markUnreadNotifyLevel}\n                                    ignoreChannelMentions={ignoreChannelMentions}\n                                    onChange={this.handleUpdateIgnoreChannelMentions}\n                                    onSubmit={this.handleSubmitIgnoreChannelMentions}\n                                    onUpdateSection={this.updateSection}\n                                    serverError={serverError}\n                                />\n                                {!isChannelMuted(channelMember) &&\n                                <div>\n                                    <div className='divider-light'/>\n                                    <NotificationSection\n                                        section={NotificationSections.DESKTOP}\n                                        expand={activeSection === NotificationSections.DESKTOP}\n                                        memberNotificationLevel={desktopNotifyLevel}\n                                        globalNotificationLevel={currentUser.notify_props ? currentUser.notify_props.desktop : NotificationLevels.ALL}\n                                        onChange={this.handleUpdateDesktopNotifyLevel}\n                                        onSubmit={this.handleSubmitDesktopNotifyLevel}\n                                        onUpdateSection={this.updateSection}\n                                        serverError={serverError}\n                                    />\n                                    <div className='divider-light'/>\n                                    {sendPushNotifications &&\n                                    <NotificationSection\n                                        section={NotificationSections.PUSH}\n                                        expand={activeSection === NotificationSections.PUSH}\n                                        memberNotificationLevel={pushNotifyLevel}\n                                        globalNotificationLevel={currentUser.notify_props ? currentUser.notify_props.push : NotificationLevels.ALL}\n                                        onChange={this.handleUpdatePushNotificationLevel}\n                                        onSubmit={this.handleSubmitPushNotificationLevel}\n                                        onUpdateSection={this.updateSection}\n                                        serverError={serverError}\n                                    />\n                                    }\n                                </div>\n                                }\n                                <div className='divider-dark'/>\n                            </div>\n                        </div>\n                    </div>\n                    {serverErrorTag}\n                </Modal.Body>\n            </Modal>\n        );\n    }\n}\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {updateChannelNotifyProps} from 'mattermost-redux/actions/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getMyCurrentChannelMembership} from 'mattermost-redux/selectors/entities/channels';\n\nimport ChannelNotificationsModal from './channel_notifications_modal.jsx';\n\nconst mapStateToProps = (state) => ({\n    channelMember: getMyCurrentChannelMembership(state),\n    sendPushNotifications: getConfig(state).SendPushNotifications === 'true',\n});\n\nconst mapDispatchToProps = (dispatch) => ({\n    actions: bindActionCreators({\n        updateChannelNotifyProps,\n    }, dispatch),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelNotificationsModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Tooltip} from 'react-bootstrap';\n\nimport {Constants} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\n\nimport DropdownIcon from 'components/widgets/icons/fa_dropdown_icon';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport OverlayTrigger from 'components/overlay_trigger';\n\nconst ROWS_FROM_BOTTOM_TO_OPEN_UP = 3;\n\nexport default class ChannelMembersDropdown extends React.PureComponent {\n    static propTypes = {\n        channel: PropTypes.object.isRequired,\n        user: PropTypes.object.isRequired,\n        currentUserId: PropTypes.string.isRequired,\n        channelMember: PropTypes.object.isRequired,\n        isLicensed: PropTypes.bool.isRequired,\n        canChangeMemberRoles: PropTypes.bool.isRequired,\n        canRemoveMember: PropTypes.bool.isRequired,\n        index: PropTypes.number.isRequired,\n        totalUsers: PropTypes.number.isRequired,\n        actions: PropTypes.shape({\n            getChannelStats: PropTypes.func.isRequired,\n            updateChannelMemberSchemeRoles: PropTypes.func.isRequired,\n            removeChannelMember: PropTypes.func.isRequired,\n            getChannelMember: PropTypes.func.isRequired,\n        }).isRequired,\n    };\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            serverError: null,\n            removing: false,\n        };\n    }\n\n    handleRemoveFromChannel = () => {\n        if (this.state.removing) {\n            return;\n        }\n\n        const {actions, channel, user} = this.props;\n        this.setState({removing: true});\n\n        actions.removeChannelMember(channel.id, user.id).then((result) => {\n            if (result.error) {\n                this.setState({\n                    serverError: result.error.message,\n                    removing: false,\n                });\n                return;\n            }\n\n            this.setState({removing: false});\n            actions.getChannelStats(channel.id);\n        });\n    };\n\n    handleMakeChannelMember = async () => {\n        const {error} = await this.props.actions.updateChannelMemberSchemeRoles(this.props.channel.id, this.props.user.id, true, false);\n        if (error) {\n            this.setState({serverError: error.message});\n        } else {\n            this.props.actions.getChannelStats(this.props.channel.id);\n            this.props.actions.getChannelMember(this.props.channel.id, this.props.user.id);\n        }\n    };\n\n    handleMakeChannelAdmin = async () => {\n        const {error} = await this.props.actions.updateChannelMemberSchemeRoles(this.props.channel.id, this.props.user.id, true, true);\n        if (error) {\n            this.setState({serverError: error.message});\n        } else {\n            this.props.actions.getChannelStats(this.props.channel.id);\n            this.props.actions.getChannelMember(this.props.channel.id, this.props.user.id);\n        }\n    };\n\n    renderRole(isChannelAdmin, isGuest) {\n        if (isChannelAdmin) {\n            return (\n                <FormattedMessage\n                    id='channel_members_dropdown.channel_admin'\n                    defaultMessage='Channel Admin'\n                />\n            );\n        } else if (isGuest) {\n            return (\n                <FormattedMessage\n                    id='channel_members_dropdown.channel_guest'\n                    defaultMessage='Channel Guest'\n                />\n            );\n        }\n        return (\n            <FormattedMessage\n                id='channel_members_dropdown.channel_member'\n                defaultMessage='Channel Member'\n            />\n        );\n    }\n\n    render() {\n        const {index, totalUsers, isLicensed, channelMember, user, channel, currentUserId, canChangeMemberRoles, canRemoveMember} = this.props;\n        const {serverError} = this.state;\n\n        const isChannelAdmin = Utils.isChannelAdmin(isLicensed, channelMember.roles, channelMember.scheme_admin);\n        const isGuest = Utils.isGuest(user);\n        const isMember = !isChannelAdmin && !isGuest;\n        const isDefaultChannel = channel.name === Constants.DEFAULT_CHANNEL;\n        const currentRole = this.renderRole(isChannelAdmin, isGuest);\n\n        if (user.id === currentUserId) {\n            return null;\n        }\n\n        if (user.remote_id) {\n            const sharedTooltip = (\n                <Tooltip id='sharedTooltip'>\n                    <FormattedMessage\n                        id='shared_user_indicator.tooltip'\n                        defaultMessage='From trusted organizations'\n                    />\n                </Tooltip>\n            );\n\n            return (\n                <div className='more-modal__shared-actions'>\n                    <OverlayTrigger\n                        delayShow={Constants.OVERLAY_TIME_DELAY}\n                        placement='bottom'\n                        overlay={sharedTooltip}\n                    >\n                        <span>\n                            <FormattedMessage\n                                id='channel_members_dropdown.shared_member'\n                                defaultMessage='Shared Member'\n                            />\n                            <i className='shared-user-icon icon-circle-multiple-outline'/>\n                        </span>\n                    </OverlayTrigger>\n                </div>\n            );\n        }\n\n        const canMakeUserChannelMember = canChangeMemberRoles && isChannelAdmin;\n        const canMakeUserChannelAdmin = canChangeMemberRoles && isLicensed && isMember;\n        const canRemoveUserFromChannel = canRemoveMember && (!channel.group_constrained || user.is_bot) && (!isDefaultChannel || isGuest);\n\n        if (canMakeUserChannelMember || canMakeUserChannelAdmin || canRemoveUserFromChannel) {\n            const removeMenu = (\n                <Menu.ItemAction\n                    show={canRemoveUserFromChannel}\n                    onClick={this.handleRemoveFromChannel}\n                    text={Utils.localizeMessage('channel_members_dropdown.remove_from_channel', 'Remove from Channel')}\n                />\n            );\n            const makeAdminMenu = (\n                <Menu.ItemAction\n                    id={`${user.username}-make-channel-admin`}\n                    show={canMakeUserChannelAdmin}\n                    onClick={this.handleMakeChannelAdmin}\n                    text={Utils.localizeMessage('channel_members_dropdown.make_channel_admin', 'Make Channel Admin')}\n                />\n            );\n            const makeMemberMenu = (\n                <Menu.ItemAction\n                    id={`${user.username}-make-channel-member`}\n                    show={canMakeUserChannelMember}\n                    onClick={this.handleMakeChannelMember}\n                    text={Utils.localizeMessage('channel_members_dropdown.make_channel_member', 'Make Channel Member')}\n                />\n            );\n            return (\n                <MenuWrapper>\n                    <button\n                        className='dropdown-toggle theme color--link style--none'\n                        type='button'\n                    >\n                        <span className='sr-only'>{user.username}</span>\n                        <span>{currentRole} </span>\n                        <DropdownIcon/>\n                    </button>\n                    <Menu\n                        openLeft={true}\n                        openUp={totalUsers > ROWS_FROM_BOTTOM_TO_OPEN_UP && totalUsers - index <= ROWS_FROM_BOTTOM_TO_OPEN_UP}\n                        ariaLabel={Utils.localizeMessage('channel_members_dropdown.menuAriaLabel', 'Change the role of channel member')}\n                    >\n                        {canMakeUserChannelMember ? makeMemberMenu : null}\n                        {canMakeUserChannelAdmin ? makeAdminMenu : null}\n                        {canRemoveUserFromChannel ? removeMenu : null}\n                        {serverError && (\n                            <div className='has-error'>\n                                <label className='has-error control-label'>{serverError}</label>\n                            </div>\n                        )}\n                    </Menu>\n                </MenuWrapper>\n            );\n        }\n\n        if (isDefaultChannel) {\n            return (\n                <div/>\n            );\n        }\n\n        return (\n            <div>\n                {currentRole}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {getChannelStats, updateChannelMemberSchemeRoles, removeChannelMember, getChannelMember} from 'mattermost-redux/actions/channels';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {canManageMembers} from 'utils/channel_utils.jsx';\n\nimport ChannelMembersDropdown from './channel_members_dropdown.jsx';\n\nfunction mapStateToProps(state, ownProps) {\n    const {channel} = ownProps;\n    const canChangeMemberRoles = haveIChannelPermission(\n        state,\n        channel.team_id,\n        channel.id,\n        Permissions.MANAGE_CHANNEL_ROLES,\n    ) && canManageMembers(state, channel);\n    const license = getLicense(state);\n    const isLicensed = license.IsLicensed === 'true';\n    const canRemoveMember = canManageMembers(state, channel);\n\n    return {\n        currentUserId: getCurrentUserId(state),\n        isLicensed,\n        canChangeMemberRoles,\n        canRemoveMember,\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            getChannelMember,\n            getChannelStats,\n            updateChannelMemberSchemeRoles,\n            removeChannelMember,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelMembersDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {Channel, ChannelStats, ChannelMembership} from 'mattermost-redux/types/channels';\n\nimport Constants from 'utils/constants';\nimport * as UserAgent from 'utils/user_agent';\n\nimport ChannelMembersDropdown from 'components/channel_members_dropdown';\nimport SearchableUserList from 'components/searchable_user_list/searchable_user_list_container.jsx';\nimport LoadingScreen from 'components/loading_screen';\n\nconst USERS_PER_PAGE = 50;\n\nexport type Props = {\n    currentTeamId: string;\n    currentChannelId: string;\n    searchTerm: string;\n    usersToDisplay: UserProfile[];\n    actionUserProps: {\n        [userId: string]: {\n            channel: Channel;\n            teamMember: any;\n            channelMember: ChannelMembership;\n        };\n    };\n    totalChannelMembers: number;\n    channel: Channel;\n    actions: {\n        searchProfiles: (term: string, options?: Record<string, unknown>) => Promise<{data: UserProfile[]}>;\n        getChannelMembers: (channelId: string) => Promise<{data: ChannelMembership[]}>;\n        getChannelStats: (channelId: string) => Promise<{data: ChannelStats}>;\n        setModalSearchTerm: (term: string) => Promise<{data: boolean}>;\n        loadProfilesAndTeamMembersAndChannelMembers: (\n            page: number,\n            perPage: number,\n            teamId?: string,\n            channelId?: string,\n            options?: any\n        ) => Promise<{\n            data: boolean;\n        }>;\n        loadStatusesForProfilesList: (users: UserProfile[]) => Promise<{data: boolean}>;\n        loadTeamMembersAndChannelMembersForProfilesList: (\n            profiles: any,\n            teamId: string,\n            channelId: string\n        ) => Promise<{\n            data: boolean;\n        }>;\n    };\n}\n\ntype State = {\n    loading: boolean;\n}\n\nexport default class MemberListChannel extends React.PureComponent<Props, State> {\n    private searchTimeoutId: number;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.searchTimeoutId = 0;\n\n        this.state = {\n            loading: true,\n        };\n    }\n\n    async componentDidMount() {\n        const {\n            actions,\n            currentChannelId,\n            currentTeamId,\n        } = this.props;\n\n        await Promise.all([\n            actions.loadProfilesAndTeamMembersAndChannelMembers(0, Constants.PROFILE_CHUNK_SIZE, currentTeamId, currentChannelId, {active: true}),\n            actions.getChannelMembers(currentChannelId),\n            actions.getChannelStats(currentChannelId),\n        ]);\n        this.loadComplete();\n    }\n\n    componentWillUnmount() {\n        this.props.actions.setModalSearchTerm('');\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (prevProps.searchTerm !== this.props.searchTerm) {\n            clearTimeout(this.searchTimeoutId);\n            const searchTerm = this.props.searchTerm;\n\n            if (searchTerm === '') {\n                this.loadComplete();\n                this.searchTimeoutId = 0;\n                return;\n            }\n\n            const searchTimeoutId = window.setTimeout(\n                async () => {\n                    const {data} = await prevProps.actions.searchProfiles(searchTerm, {team_id: this.props.currentTeamId, in_channel_id: this.props.currentChannelId});\n\n                    if (searchTimeoutId !== this.searchTimeoutId) {\n                        return;\n                    }\n\n                    this.props.actions.loadStatusesForProfilesList(data);\n                    this.props.actions.loadTeamMembersAndChannelMembersForProfilesList(data, this.props.currentTeamId, this.props.currentChannelId).then(({data: membersLoaded}) => {\n                        if (membersLoaded) {\n                            this.loadComplete();\n                        }\n                    });\n                },\n                Constants.SEARCH_TIMEOUT_MILLISECONDS,\n            );\n\n            this.searchTimeoutId = searchTimeoutId;\n        }\n    }\n\n    loadComplete = () => {\n        this.setState({loading: false});\n    }\n\n    nextPage = (page: number) => {\n        this.props.actions.loadProfilesAndTeamMembersAndChannelMembers(page + 1, USERS_PER_PAGE, undefined, undefined, {active: true});\n    }\n\n    handleSearch = (term: string) => {\n        this.props.actions.setModalSearchTerm(term);\n    }\n\n    render() {\n        if (this.state.loading) {\n            return (<LoadingScreen/>);\n        }\n        const channelIsArchived = this.props.channel.delete_at !== 0;\n        return (\n            <SearchableUserList\n                users={this.props.usersToDisplay}\n                usersPerPage={USERS_PER_PAGE}\n                total={this.props.totalChannelMembers}\n                nextPage={this.nextPage}\n                search={this.handleSearch}\n                actions={channelIsArchived ? [] : [ChannelMembersDropdown]}\n                actionUserProps={this.props.actionUserProps}\n                focusOnMount={!UserAgent.isMobile()}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport {createSelector} from 'reselect';\n\nimport {searchProfilesInCurrentChannel, getProfilesInCurrentChannel} from 'mattermost-redux/selectors/entities/users';\nimport {getMembersInCurrentChannel, getCurrentChannelStats, getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getMembersInCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getChannelStats, getChannelMembers} from 'mattermost-redux/actions/channels';\nimport {searchProfiles} from 'mattermost-redux/actions/users';\nimport {sortByUsername} from 'mattermost-redux/utils/user_utils';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {Channel, ChannelMembership} from 'mattermost-redux/types/channels';\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\n\nimport {\n    loadProfilesAndTeamMembersAndChannelMembers,\n    loadTeamMembersAndChannelMembersForProfilesList,\n} from 'actions/user_actions.jsx';\nimport {loadStatusesForProfilesList} from 'actions/status_actions.jsx';\nimport {setModalSearchTerm} from 'actions/views/search';\n\nimport {GlobalState} from 'types/store';\n\nimport MemberListChannel, {Props} from './member_list_channel';\n\nconst getUsersAndActionsToDisplay = createSelector(\n    'getUsersAndActionsToDisplay',\n    (state: GlobalState, users: UserProfile[]) => users,\n    getMembersInCurrentTeam,\n    getMembersInCurrentChannel,\n    getCurrentChannel,\n    (users = [], teamMembers = {}, channelMembers = {}, channel) => {\n        const actionUserProps: {\n            [userId: string]: {\n                channel: Channel;\n                teamMember: any;\n                channelMember: ChannelMembership;\n            };\n        } = {};\n        const usersToDisplay = [];\n\n        for (let i = 0; i < users.length; i++) {\n            const user = users[i];\n\n            if (teamMembers[user.id] && channelMembers[user.id] && user.delete_at === 0) {\n                usersToDisplay.push(user);\n\n                actionUserProps[user.id] = {\n                    channel,\n                    teamMember: teamMembers[user.id],\n                    channelMember: channelMembers[user.id],\n                };\n            }\n        }\n\n        return {\n            usersToDisplay: usersToDisplay.sort(sortByUsername),\n            actionUserProps,\n        };\n    },\n);\n\nfunction mapStateToProps(state: GlobalState) {\n    const searchTerm = state.views.search.modalSearch;\n\n    let users;\n    if (searchTerm) {\n        users = searchProfilesInCurrentChannel(state, searchTerm);\n    } else {\n        users = getProfilesInCurrentChannel(state);\n    }\n\n    const stats = getCurrentChannelStats(state) || {member_count: 0};\n\n    return {\n        ...getUsersAndActionsToDisplay(state, users),\n        currentTeamId: state.entities.teams.currentTeamId,\n        currentChannelId: state.entities.channels.currentChannelId,\n        searchTerm,\n        totalChannelMembers: stats.member_count,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc | GenericAction>, Props['actions']>({\n            getChannelMembers,\n            searchProfiles,\n            getChannelStats,\n            setModalSearchTerm,\n            loadProfilesAndTeamMembersAndChannelMembers,\n            loadStatusesForProfilesList,\n            loadTeamMembersAndChannelMembersForProfilesList,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MemberListChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport MemberListChannel from 'components/member_list_channel';\nimport ChannelInviteModal from 'components/channel_invite_modal';\nimport {ModalIdentifiers} from 'utils/constants';\n\ntype Props = {\n\n    /**\n     * Bool whether user has permission to manage current channel\n     */\n    canManageChannelMembers: boolean;\n\n    /**\n     * Object with info about current channel\n     */\n    channel: Channel;\n\n    /**\n     * Function that is called when modal is hidden\n     */\n    onHide: () => void;\n\n    actions: {\n        openModal: (modalData: {\n            modalId: string;\n            dialogProps: {[key: string]: any};\n            dialogType: (props: any) => React.ReactElement | null;\n        }) => Promise<{data: boolean}>;\n    };\n}\n\ntype State = {\n    show: boolean;\n}\n\nexport default class ChannelMembersModal extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            show: true,\n        };\n    }\n\n    handleHide = () => {\n        this.setState({show: false});\n    }\n\n    handleExit = () => {\n        this.props.onHide();\n    }\n\n    onAddNewMembersButton = () => {\n        const {channel, actions} = this.props;\n\n        actions.openModal({\n            modalId: ModalIdentifiers.CHANNEL_INVITE,\n            dialogType: ChannelInviteModal,\n            dialogProps: {channel},\n        });\n\n        this.handleExit();\n    }\n\n    render() {\n        const channelIsArchived = this.props.channel.delete_at !== 0;\n        return (\n            <div>\n                <Modal\n                    dialogClassName='a11y__modal more-modal more-modal--action'\n                    show={this.state.show}\n                    onHide={this.handleHide}\n                    onExited={this.handleExit}\n                    role='dialog'\n                    aria-labelledby='channelMembersModalLabel'\n                    id='channelMembersModal'\n                >\n                    <Modal.Header closeButton={true}>\n                        <Modal.Title\n                            componentClass='h1'\n                            id='channelMembersModalLabel'\n                        >\n                            <span className='name'>{this.props.channel.display_name}</span>\n                            <FormattedMessage\n                                id='channel_members_modal.members'\n                                defaultMessage=' Members'\n                            />\n                        </Modal.Title>\n                        {this.props.canManageChannelMembers && !channelIsArchived &&\n                            <a\n                                id='showInviteModal'\n                                className='btn btn-md btn-primary'\n                                href='#'\n                                onClick={this.onAddNewMembersButton}\n                            >\n                                <FormattedMessage\n                                    id='channel_members_modal.addNew'\n                                    defaultMessage=' Add Members'\n                                />\n                            </a>\n                        }\n                    </Modal.Header>\n                    <Modal.Body>\n                        <MemberListChannel\n                            channel={this.props.channel}\n                        />\n                    </Modal.Body>\n                </Modal>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {canManageChannelMembers} from 'mattermost-redux/selectors/entities/channels';\nimport {ActionFunc} from 'mattermost-redux/types/actions';\n\nimport {openModal} from 'actions/views/modals';\n\nimport {GlobalState} from 'types/store';\n\nimport ChannelMembersModal from './channel_members_modal';\n\nconst mapStateToProps = (state: GlobalState) => ({\n    canManageChannelMembers: canManageChannelMembers(state),\n});\n\ntype Actions = {\n    openModal: (modalData: {\n        modalId: string;\n        dialogProps: {[key: string]: any};\n        dialogType: (props: {[key: string]: any}) => React.ReactElement | null;\n    }) => Promise<{data: boolean}>;\n}\n\nconst mapDispatchToProps = (dispatch: Dispatch) => ({\n    actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({openModal}, dispatch),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelMembersModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {memoizeResult} from 'mattermost-redux/utils/helpers';\nimport {Team} from 'mattermost-redux/types/teams';\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport Markdown from 'components/markdown';\nimport GlobeIcon from 'components/widgets/icons/globe_icon';\nimport LockIcon from 'components/widgets/icons/lock_icon';\nimport ArchiveIcon from 'components/widgets/icons/archive_icon';\nimport SharedChannelIndicator from 'components/shared_channel_indicator';\n\nimport {ChannelNamesMap} from 'utils/text_formatting';\nimport Constants from 'utils/constants.jsx';\nimport {getSiteURL} from 'utils/url';\nimport * as Utils from 'utils/utils.jsx';\n\nconst headerMarkdownOptions = {singleline: false, mentionHighlight: false};\n\ntype Props = {\n    onHide: () => void;\n    channel: Channel;\n    currentChannel: Channel;\n    currentTeam: Team;\n    isRHSOpen?: boolean;\n    currentRelativeTeamUrl?: string;\n};\n\ntype State = {\n    show: boolean;\n};\n\nexport default class ChannelInfoModal extends React.PureComponent<Props, State> {\n    static propTypes = {\n\n        /**\n         * Function that is called when modal is hidden\n         */\n        onHide: PropTypes.func.isRequired,\n\n        /**\n         * Channel object\n         */\n        channel: PropTypes.object.isRequired,\n\n        /**\n         * Current channel object, used to determine if the current channel is different from the one this modal was instantiated with\n         */\n        currentChannel: PropTypes.object.isRequired,\n\n        /**\n         * Current team object\n         */\n        currentTeam: PropTypes.object.isRequired,\n\n        /**\n         * Boolean whether the RHS is open, used to check if we need to hide the channel info modal\n         */\n        isRHSOpen: PropTypes.bool,\n\n        /**\n         * Relative url for the team, used to redirect to another channel within the team from the modal\n         */\n        currentRelativeTeamUrl: PropTypes.string,\n    };\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {show: true};\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        const RHSChanged = !prevProps.isRHSOpen && this.props.isRHSOpen;\n        const channelChanged = prevProps.channel?.id !== this.props.currentChannel?.id;\n        if (RHSChanged || channelChanged) {\n            this.onHide();\n        }\n    }\n\n    onHide = () => {\n        this.setState({show: false});\n    }\n\n    handleFormattedTextClick = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => Utils.handleFormattedTextClick(e, this.props.currentRelativeTeamUrl);\n\n    getHeaderMarkdownOptions = memoizeResult((channelNamesMap: ChannelNamesMap) => ({...headerMarkdownOptions, channelNamesMap}));\n\n    render() {\n        let channel = this.props.channel;\n        const channelIsArchived = channel.delete_at !== 0;\n        let channelIcon;\n\n        if (!channel) {\n            const notFound = Utils.localizeMessage('channel_info.notFound', 'No Channel Found');\n\n            channel = {\n                display_name: notFound,\n                name: notFound,\n                purpose: notFound,\n                header: notFound,\n                id: notFound,\n                team_id: notFound,\n                type: notFound,\n                delete_at: 0,\n                create_at: 0,\n                update_at: 0,\n                last_post_at: 0,\n                total_msg_count: 0,\n                total_msg_count_root: 0,\n                extra_update_at: 0,\n                creator_id: notFound,\n                scheme_id: notFound,\n                group_constrained: false,\n            };\n        }\n\n        const channelNamesMap = this.props.channel.props && this.props.channel.props.channel_mentions;\n\n        if (channelIsArchived) {\n            channelIcon = (\n                <ArchiveIcon className='icon icon__archive svg-text-color'/>\n            );\n        } else if (channel.shared) {\n            channelIcon = (\n                <SharedChannelIndicator\n                    className='shared-channel-icon'\n                    channelType={channel.type}\n                    withTooltip={true}\n                />\n            );\n        } else if (channel.type === 'O') {\n            channelIcon = (\n                <GlobeIcon className='icon icon__globe icon--body'/>\n            );\n        } else if (channel.type === 'P') {\n            channelIcon = (\n                <LockIcon className='icon icon__globe icon--body'/>\n            );\n        }\n\n        const channelURL = getSiteURL() + '/' + this.props.currentTeam.name + '/channels/' + channel.name;\n\n        let channelPurpose;\n        if (channel.purpose) {\n            channelPurpose = channel.purpose;\n        } else if (channel.name === Constants.DEFAULT_CHANNEL) {\n            channelPurpose = (\n                <FormattedMessage\n                    id='default_channel.purpose'\n                    defaultMessage='Post messages here that you want everyone to see. Everyone automatically becomes a permanent member of this channel when they join the team.'\n                />\n            );\n        }\n\n        let channelPurposeElement;\n        if (channelPurpose) {\n            channelPurposeElement = (\n                <div className='form-group'>\n                    <div className='info__label'>\n                        <FormattedMessage\n                            id='channel_info.purpose'\n                            defaultMessage='Purpose:'\n                        />\n                    </div>\n                    <div className='info__value'>{channelPurpose}</div>\n                </div>\n            );\n        }\n\n        let channelHeader = null;\n        if (channel.header) {\n            channelHeader = (\n                <div className='form-group'>\n                    <div className='info__label'>\n                        <FormattedMessage\n                            id='channel_info.header'\n                            defaultMessage='Header:'\n                        />\n                    </div>\n                    <div\n                        onClick={this.handleFormattedTextClick}\n                        className='info__value'\n                    >\n                        <Markdown\n                            message={channel.header}\n                            options={this.getHeaderMarkdownOptions(channelNamesMap)}\n                        />\n                    </div>\n                </div>\n            );\n        }\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal about-modal'\n                show={this.state.show}\n                onHide={this.onHide}\n                onExited={this.props.onHide}\n                role='dialog'\n                aria-labelledby='channelInfoModalLabel'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='channelInfoModalLabel'\n                    >\n                        <FormattedMessage\n                            id='channel_info.about'\n                            defaultMessage='About'\n                        />\n                        <strong>{channelIcon}{channel.display_name}</strong>\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    {channelPurposeElement}\n                    {channelHeader}\n                    <div className='form-group'>\n                        <div className='info__label'>\n                            <FormattedMessage\n                                id='channel_info.url'\n                                defaultMessage='URL:'\n                            />\n                        </div>\n                        <div className='info__value'>{channelURL}</div>\n                    </div>\n                    <div className='about-modal__hash form-group pt-3'>\n                        <p>\n                            <FormattedMessage\n                                id='channel_info.id'\n                                defaultMessage='ID: '\n                            />\n                            {channel.id}\n                        </p>\n                    </div>\n                </Modal.Body>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentRelativeTeamUrl, getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {getIsRhsOpen} from 'selectors/rhs';\n\nimport ChannelInfoModal from './channel_info_modal';\n\nfunction mapStateToProps(state) {\n    return {\n        isRHSOpen: getIsRhsOpen(state),\n        currentRelativeTeamUrl: getCurrentRelativeTeamUrl(state),\n        currentChannel: getCurrentChannel(state),\n        currentTeam: getCurrentTeam(state),\n    };\n}\n\nexport default connect(mapStateToProps)(ChannelInfoModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport Textbox from 'components/textbox';\nimport TextboxLinks from 'components/textbox/textbox_links';\nimport Constants, {ModalIdentifiers} from 'utils/constants';\nimport {isMobile} from 'utils/user_agent';\nimport {insertLineBreakFromKeyEvent, isKeyPressed, isUnhandledLineBreakKeyCombo, localizeMessage} from 'utils/utils.jsx';\n\nconst KeyCodes = Constants.KeyCodes;\n\nconst headerMaxLength = 1024;\n\nexport default class EditChannelHeaderModal extends React.PureComponent {\n    static propTypes = {\n\n        /*\n         * Object with info about current channel ,\n         */\n        channel: PropTypes.object.isRequired,\n\n        /**\n         * Set whether to show the modal or not\n         */\n        show: PropTypes.bool.isRequired,\n\n        /*\n         * boolean should be `ctrl` button pressed to send\n         */\n        ctrlSend: PropTypes.bool.isRequired,\n\n        /*\n         * Should preview be showed\n         */\n        shouldShowPreview: PropTypes.bool.isRequired,\n\n        /*\n         * Collection of redux actions\n         */\n        actions: PropTypes.shape({\n\n            closeModal: PropTypes.func.isRequired,\n\n            /*\n             * patch channel redux-action\n             */\n            patchChannel: PropTypes.func.isRequired,\n\n            /**\n             * Set show preview for textbox\n             */\n            setShowPreview: PropTypes.func.isRequired,\n\n        }).isRequired,\n    }\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            header: props.channel.header,\n            saving: false,\n        };\n        this.editChannelHeaderTextboxRef = React.createRef();\n    }\n\n    handleModalKeyDown = (e) => {\n        if (isKeyPressed(e, KeyCodes.ESCAPE)) {\n            this.hideModal();\n        }\n    }\n\n    setShowPreview = (newState) => {\n        this.props.actions.setShowPreview(newState);\n    }\n\n    handleChange = (e) => {\n        this.setState({\n            header: e.target.value,\n        });\n    }\n\n    handleSave = async () => {\n        const {header} = this.state;\n        if (header === this.props.channel.header) {\n            this.hideModal();\n            return;\n        }\n\n        this.setState({saving: true});\n\n        const {channel, actions} = this.props;\n        const {error} = await actions.patchChannel(channel.id, {header});\n        if (error) {\n            this.setState({serverError: error, saving: false});\n        } else {\n            this.hideModal();\n        }\n    }\n\n    hideModal = () => {\n        this.props.actions.closeModal(ModalIdentifiers.EDIT_CHANNEL_HEADER);\n    }\n\n    focusTextbox = () => {\n        if (this.editChannelHeaderTextboxRef.current) {\n            this.editChannelHeaderTextboxRef.current.focus();\n        }\n    }\n\n    blurTextbox = () => {\n        if (this.editChannelHeaderTextboxRef.current) {\n            this.editChannelHeaderTextboxRef.current.blur();\n        }\n    }\n\n    handleEntering = () => {\n        this.focusTextbox();\n    }\n\n    handleKeyDown = (e) => {\n        const {ctrlSend} = this.props;\n\n        // listen for line break key combo and insert new line character\n        if (isUnhandledLineBreakKeyCombo(e)) {\n            this.setState({header: insertLineBreakFromKeyEvent(e)});\n        } else if (ctrlSend && isKeyPressed(e, KeyCodes.ENTER) && e.ctrlKey === true) {\n            this.handleKeyPress(e);\n        }\n    }\n\n    handleKeyPress = (e) => {\n        const {ctrlSend} = this.props;\n        if (!isMobile() && ((ctrlSend && e.ctrlKey) || !ctrlSend)) {\n            if (isKeyPressed(e, KeyCodes.ENTER) && !e.shiftKey && !e.altKey) {\n                e.preventDefault();\n                this.blurTextbox();\n                this.handleSave(e);\n            }\n        }\n    }\n\n    renderError = () => {\n        const {serverError} = this.state;\n        if (!serverError) {\n            return null;\n        }\n\n        let errorMsg;\n        if (serverError.server_error_id === 'model.channel.is_valid.header.app_error') {\n            errorMsg = (\n                <FormattedMessage\n                    id='edit_channel_header_modal.error'\n                    defaultMessage='The text entered exceeds the character limit. The channel header is limited to {maxLength} characters.'\n                    values={{\n                        maxLength: headerMaxLength,\n                    }}\n                />\n            );\n        } else {\n            errorMsg = serverError.message;\n        }\n\n        return (\n            <div className='form-group has-error'>\n                <br/>\n                <label className='control-label'>\n                    {errorMsg}\n                </label>\n            </div>\n        );\n    }\n\n    render() {\n        let headerTitle = null;\n        if (this.props.channel.type === Constants.DM_CHANNEL) {\n            headerTitle = (\n                <FormattedMessage\n                    id='edit_channel_header_modal.title_dm'\n                    defaultMessage='Edit Header'\n                />\n            );\n        } else {\n            headerTitle = (\n                <FormattedMessage\n                    id='edit_channel_header_modal.title'\n                    defaultMessage='Edit Header for {channel}'\n                    values={{\n                        channel: this.props.channel.display_name,\n                    }}\n                />\n            );\n        }\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal'\n                show={this.props.show}\n                keyboard={false}\n                onKeyDown={this.handleModalKeyDown}\n                onHide={this.hideModal}\n                onEntering={this.handleEntering}\n                onExited={this.hideModal}\n                role='dialog'\n                aria-labelledby='editChannelHeaderModalLabel'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='editChannelHeaderModalLabel'\n                    >\n                        {headerTitle}\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body bsClass='modal-body edit-modal-body'>\n                    <div>\n                        <p>\n                            <FormattedMessage\n                                id='edit_channel_header_modal.description'\n                                defaultMessage='Edit the text appearing next to the channel name in the channel header.'\n                            />\n                        </p>\n                        <div className='textarea-wrapper'>\n                            <Textbox\n                                value={this.state.header}\n                                onChange={this.handleChange}\n                                onKeyPress={this.handleKeyPress}\n                                onKeyDown={this.handleKeyDown}\n                                supportsCommands={false}\n                                suggestionListPosition='bottom'\n                                createMessage={localizeMessage('edit_channel_header.editHeader', 'Edit the Channel Header...')}\n                                previewMessageLink={localizeMessage('edit_channel_header.previewHeader', 'Edit Header')}\n                                handlePostError={this.handlePostError}\n                                channelId={this.props.channel.id}\n                                id='edit_textbox'\n                                ref={this.editChannelHeaderTextboxRef}\n                                characterLimit={1024}\n                                preview={this.props.shouldShowPreview}\n                            />\n                        </div>\n                        <div className='post-create-footer'>\n                            <TextboxLinks\n                                characterLimit={1024}\n                                showPreview={this.props.shouldShowPreview}\n                                ref={this.setTextboxLinksRef}\n                                updatePreview={this.setShowPreview}\n                                message={this.state.header}\n                            />\n                        </div>\n                        <br/>\n                        {this.renderError()}\n                    </div>\n                </Modal.Body>\n                <Modal.Footer>\n                    <button\n                        type='button'\n                        className='btn btn-link cancel-button'\n                        onClick={this.hideModal}\n                    >\n                        <FormattedMessage\n                            id='edit_channel_header_modal.cancel'\n                            defaultMessage='Cancel'\n                        />\n                    </button>\n                    <button\n                        disabled={this.state.saving}\n                        type='button'\n                        className='btn btn-primary save-button'\n                        onClick={this.handleSave}\n                    >\n                        <FormattedMessage\n                            id='edit_channel_header_modal.save'\n                            defaultMessage='Save'\n                        />\n                    </button>\n                </Modal.Footer>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {bindActionCreators} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {patchChannel} from 'mattermost-redux/actions/channels';\nimport {Preferences} from 'mattermost-redux/constants';\n\nimport {closeModal} from 'actions/views/modals';\nimport {setShowPreviewOnEditChannelHeaderModal} from 'actions/views/textbox';\nimport {showPreviewOnEditChannelHeaderModal} from 'selectors/views/textbox';\n\nimport {isModalOpen} from '../../selectors/views/modals';\nimport {ModalIdentifiers} from '../../utils/constants';\n\nimport EditChannelHeaderModal from './edit_channel_header_modal.jsx';\n\nfunction mapStateToProps(state) {\n    return {\n        shouldShowPreview: showPreviewOnEditChannelHeaderModal(state),\n        show: isModalOpen(state, ModalIdentifiers.EDIT_CHANNEL_HEADER),\n        ctrlSend: getBool(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter'),\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            closeModal,\n            patchChannel,\n            setShowPreview: setShowPreviewOnEditChannelHeaderModal,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditChannelHeaderModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ChangeEvent, KeyboardEvent} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage, injectIntl, IntlShape} from 'react-intl';\n\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {ActionResult} from 'mattermost-redux/types/actions';\n\nimport Constants from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\n\ntype Actions = {\n    patchChannel: (channelId: string, patch: Partial<Channel>) => Promise<ActionResult>;\n}\ntype ServerError = {\n    message: string;\n}\nconst purposeMaxLength = 250;\n\ntype Props = {\n    onHide: () => void;\n    channel?: Channel;\n    ctrlSend: boolean;\n    actions: Actions;\n    intl: IntlShape;\n}\n\ntype State = {\n    purpose: string;\n    serverError: ServerError | null;\n    show: boolean;\n    submitted: boolean;\n    requestStarted: boolean;\n}\n\nexport class EditChannelPurposeModal extends React.PureComponent<Props, State> {\n    private purpose: React.RefObject<HTMLTextAreaElement>;\n\n    constructor(props: Props) {\n        super(props);\n        this.purpose = React.createRef();\n\n        this.state = {\n            purpose: props.channel?.purpose || '',\n            serverError: null,\n            show: true,\n            submitted: false,\n            requestStarted: false,\n        };\n    }\n\n    handleEntering = () => {\n        Utils.placeCaretAtEnd(this.purpose.current);\n    }\n\n    onHide = () => {\n        this.setState({show: false});\n    }\n\n    handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n        const {ctrlSend} = this.props;\n\n        // listen for line break key combo and insert new line character\n        if (Utils.isUnhandledLineBreakKeyCombo(e)) {\n            e.preventDefault();\n            this.setState({purpose: Utils.insertLineBreakFromKeyEvent(e)});\n        } else if (ctrlSend && Utils.isKeyPressed(e, Constants.KeyCodes.ENTER) && e.ctrlKey) {\n            e.preventDefault();\n            this.handleSave();\n        } else if (!ctrlSend && Utils.isKeyPressed(e, Constants.KeyCodes.ENTER) && !e.shiftKey && !e.altKey) {\n            e.preventDefault();\n            this.handleSave();\n        }\n    }\n\n    handleSave = async () => {\n        const {channel, actions: {patchChannel}} = this.props;\n        const {purpose} = this.state;\n        if (!channel) {\n            return;\n        }\n\n        this.setState({requestStarted: true});\n\n        const {data, error} = await patchChannel(channel.id, {purpose});\n\n        this.setState({\n            serverError: error,\n            requestStarted: false,\n        });\n\n        if (data) {\n            this.onHide();\n        }\n    }\n\n    handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n        e.preventDefault();\n        this.setState({purpose: e.target.value});\n    }\n\n    render() {\n        let serverError = null;\n        const {formatMessage} = this.props.intl;\n\n        if (this.state.serverError) {\n            serverError = (\n                <div className='form-group has-error'>\n                    <br/>\n                    <label className='control-label'>{this.state.serverError.message}</label>\n                </div>\n            );\n        }\n\n        let title = (\n            <span>\n                <FormattedMessage\n                    id='edit_channel_purpose_modal.title1'\n                    defaultMessage='Edit Purpose'\n                />\n            </span>\n        );\n        if (this.props.channel?.display_name) {\n            title = (\n                <span>\n                    <FormattedMessage\n                        id='edit_channel_purpose_modal.title2'\n                        defaultMessage='Edit Purpose for '\n                    />\n                    <span className='name'>{this.props.channel.display_name}</span>\n                </span>\n            );\n        }\n\n        let channelPurposeModal = (\n            <FormattedMessage\n                id='edit_channel_purpose_modal.body'\n                defaultMessage='Describe how this channel should be used. This text appears in the channel list in the \"More...\" menu and helps others decide whether to join.'\n            />\n        );\n        if (this.props.channel?.type === 'P') {\n            channelPurposeModal = (\n                <FormattedMessage\n                    id='edit_channel_private_purpose_modal.body'\n                    defaultMessage='This text appears in the \\\"View Info\\\" modal of the private channel.'\n                />\n            );\n        }\n\n        const ariaLabelForTitle = formatMessage({id: 'edit_channel_purpose_modal.title1', defaultMessage: 'Edit Purpose'}).toLowerCase();\n        return (\n            <Modal\n                dialogClassName='a11y__modal'\n                show={this.state.show}\n                onHide={this.onHide}\n                onEntering={this.handleEntering}\n                onExited={this.props.onHide}\n                role='dialog'\n                aria-labelledby='editChannelPurposeModalLabel'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='editChannelPurposeModalLabel'\n                    >\n                        {title}\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    <p>\n                        {channelPurposeModal}\n                    </p>\n                    <textarea\n                        ref={this.purpose}\n                        className='form-control no-resize'\n                        rows={6}\n                        maxLength={purposeMaxLength}\n                        value={this.state.purpose}\n                        onKeyDown={this.handleKeyDown}\n                        onChange={this.handleChange}\n                        aria-label={ariaLabelForTitle}\n                    />\n                    {serverError}\n                </Modal.Body>\n                <Modal.Footer>\n                    <button\n                        type='button'\n                        className='btn btn-link cancel-button'\n                        onClick={this.onHide}\n                    >\n                        <FormattedMessage\n                            id='edit_channel_purpose_modal.cancel'\n                            defaultMessage='Cancel'\n                        />\n                    </button>\n                    <button\n                        type='button'\n                        className='btn btn-primary save-button'\n                        disabled={this.state.requestStarted}\n                        onClick={this.handleSave}\n                    >\n                        <FormattedMessage\n                            id='edit_channel_purpose_modal.save'\n                            defaultMessage='Save'\n                        />\n                    </button>\n                </Modal.Footer>\n            </Modal>\n        );\n    }\n}\n\nexport default injectIntl(EditChannelPurposeModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {patchChannel} from 'mattermost-redux/actions/channels';\nimport {ActionFunc, GenericAction, ActionResult} from 'mattermost-redux/types/actions';\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport {GlobalState} from 'types/store';\n\nimport Constants from 'utils/constants';\n\nimport EditChannelPurposeModal from './edit_channel_purpose_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        ctrlSend: getBool(state, Constants.Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter'),\n    };\n}\n\ntype Actions = {\n    patchChannel: (channelId: string, patch: Partial<Channel>) => Promise<ActionResult>;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            patchChannel,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditChannelPurposeModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ChangeEvent, MouseEvent} from 'react';\nimport {Modal, Tooltip} from 'react-bootstrap';\nimport {defineMessages, FormattedMessage, injectIntl, IntlShape} from 'react-intl';\n\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {Team} from 'mattermost-redux/types/teams';\nimport {ServerError} from 'mattermost-redux/types/errors';\n\nimport LocalizedInput from 'components/localized_input/localized_input';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport {browserHistory} from 'utils/browser_history';\nimport Constants from 'utils/constants.jsx';\nimport {t} from 'utils/i18n';\nimport {getShortenedURL, validateChannelUrl} from 'utils/url';\nimport * as Utils from 'utils/utils.jsx';\n\nconst holders = defineMessages({\n    maxLength: {\n        id: t('rename_channel.maxLength'),\n        defaultMessage: 'This field must be less than {maxLength, number} characters',\n    },\n    url: {\n        id: t('rename_channel.url'),\n        defaultMessage: 'URL',\n    },\n    defaultError: {\n        id: t('rename_channel.defaultError'),\n        defaultMessage: ' - Cannot be changed for the default channel',\n    },\n    displayNameHolder: {\n        id: t('rename_channel.displayNameHolder'),\n        defaultMessage: 'Enter display name',\n    },\n});\n\ntype Props = {\n\n    /**\n     * react-intl helper object\n     */\n    intl: IntlShape;\n\n    /**\n     * Function that is called when modal is hidden\n     */\n    onHide: () => void;\n\n    /**\n     * Object with info about current channel\n     */\n    channel: Channel;\n\n    /**\n     * Object with info about current team\n     */\n    team: Team;\n\n    /**\n     * String with the current team URL\n     */\n    currentTeamUrl: string;\n\n    /*\n    * Object with redux action creators\n    */\n    actions: {\n\n        /*\n        * Action creator to patch current channel\n        */\n        patchChannel: (channelId: string, patch: Channel) => Promise<{ data: Channel; error: Error }>;\n    };\n}\n\ntype State = {\n    displayName: string;\n    channelName: string;\n    serverError?: string;\n    urlErrors: React.ReactNode[];\n    displayNameError: React.ReactNode;\n    invalid: boolean;\n    show: boolean;\n};\n\nexport class RenameChannelModal extends React.PureComponent<Props, State> {\n    private textbox?: HTMLInputElement;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            displayName: props.channel.display_name,\n            channelName: props.channel.name,\n            serverError: '',\n            urlErrors: [],\n            displayNameError: '',\n            invalid: false,\n            show: true,\n        };\n    }\n\n    setError = (err: ServerError) => {\n        this.setState({serverError: err.message});\n    }\n\n    unsetError = () => {\n        this.setState({serverError: ''});\n    }\n\n    handleEntering = () => {\n        Utils.placeCaretAtEnd(this.textbox);\n    }\n\n    handleHide = (e?: MouseEvent) => {\n        if (e) {\n            e.preventDefault();\n        }\n\n        this.setState({\n            serverError: '',\n            urlErrors: [],\n            displayNameError: '',\n            invalid: false,\n            show: false,\n        });\n    }\n\n    handleSubmit = async (e?: MouseEvent<HTMLButtonElement>): Promise<void> => {\n        if (e) {\n            e.preventDefault();\n        }\n\n        const channel = Object.assign({}, this.props.channel);\n        const oldName = channel.name;\n        const oldDisplayName = channel.display_name;\n        const state = {...this.state, serverError: ''};\n        const {formatMessage} = this.props.intl;\n        const {actions: {patchChannel}} = this.props;\n\n        channel.display_name = this.state.displayName.trim();\n        if (!channel.display_name || channel.display_name.length < Constants.MIN_CHANNELNAME_LENGTH) {\n            state.displayNameError = (\n                <FormattedMessage\n                    id='rename_channel.minLength'\n                    defaultMessage='Display name must have at least {minLength, number} characters.'\n                    values={{\n                        minLength: Constants.MIN_CHANNELNAME_LENGTH,\n                    }}\n                />\n            );\n            state.invalid = true;\n        } else if (channel.display_name.length > Constants.MAX_CHANNELNAME_LENGTH) {\n            state.displayNameError = formatMessage(holders.maxLength, {maxLength: Constants.MAX_CHANNELNAME_LENGTH});\n            state.invalid = true;\n        } else {\n            state.displayNameError = '';\n        }\n\n        channel.name = this.state.channelName.trim();\n        const urlErrors = validateChannelUrl(channel.name);\n        if (urlErrors.length > 0) {\n            state.invalid = true;\n        }\n        state.urlErrors = urlErrors;\n\n        this.setState(state);\n\n        if (state.invalid) {\n            return;\n        }\n        if (oldName === channel.name && oldDisplayName === channel.display_name) {\n            this.onSaveSuccess();\n            return;\n        }\n\n        const {data, error} = await patchChannel(channel.id, channel);\n\n        if (data) {\n            this.onSaveSuccess();\n        } else if (error) {\n            this.setError(error);\n        }\n    }\n\n    onSaveSuccess = () => {\n        this.handleHide();\n        this.unsetError();\n        browserHistory.push('/' + this.props.team.name + '/channels/' + this.state.channelName);\n    }\n\n    handleCancel = (e?: MouseEvent) => {\n        this.setState({\n            displayName: this.props.channel.display_name,\n            channelName: this.props.channel.name,\n        });\n\n        this.handleHide(e);\n    }\n\n    onNameChange = (e: ChangeEvent<HTMLInputElement> | {target: {value: string}}) => {\n        const name = e.target.value.trim().replace(/[^A-Za-z0-9-_]/g, '').toLowerCase();\n        this.setState({channelName: name});\n    }\n\n    onDisplayNameChange = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({displayName: e.target.value});\n    }\n\n    getTextbox = (node: HTMLInputElement) => {\n        this.textbox = node;\n    }\n\n    render(): JSX.Element {\n        let displayNameError = null;\n        if (this.state.displayNameError) {\n            displayNameError = <p className='input__help error'>{this.state.displayNameError}</p>;\n        }\n\n        let urlErrors = null;\n        let urlHelpText = null;\n        let urlInputClass = 'input-group input-group--limit';\n        if (this.state.urlErrors.length > 0) {\n            urlErrors = <p className='input__help error'>{this.state.urlErrors}</p>;\n            urlInputClass += ' has-error';\n        } else {\n            urlHelpText = (\n                <p className='input__help'>\n                    <FormattedMessage\n                        id='change_url.helpText'\n                        defaultMessage='You can use lowercase letters, numbers, dashes, and underscores.'\n                    />\n                </p>\n            );\n        }\n\n        let serverError = null;\n        if (this.state.serverError) {\n            serverError = <div className='form-group has-error'><label className='control-label'>{this.state.serverError}</label></div>;\n        }\n\n        const {formatMessage} = this.props.intl;\n\n        let urlInputLabel = formatMessage(holders.url);\n        let readOnlyHandleInput = false;\n        if (this.props.channel.name === Constants.DEFAULT_CHANNEL) {\n            urlInputLabel += formatMessage(holders.defaultError);\n            readOnlyHandleInput = true;\n        }\n\n        const fullUrl = this.props.currentTeamUrl + '/channels';\n        const shortUrl = getShortenedURL(fullUrl, 35);\n        const urlTooltip = (\n            <Tooltip id='urlTooltip'>{fullUrl}</Tooltip>\n        );\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal'\n                show={this.state.show}\n                onHide={this.handleCancel}\n                onEntering={this.handleEntering}\n                onExited={this.props.onHide}\n                role='dialog'\n                aria-labelledby='renameChannelModalLabel'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='renameChannelModalLabel'\n                    >\n                        <FormattedMessage\n                            id='rename_channel.title'\n                            defaultMessage='Rename Channel'\n                        />\n                    </Modal.Title>\n                </Modal.Header>\n                <form role='form'>\n                    <Modal.Body>\n                        <div className='form-group'>\n                            <label className='control-label'>\n                                <FormattedMessage\n                                    id='rename_channel.displayName'\n                                    defaultMessage='Display Name'\n                                />\n                            </label>\n                            <LocalizedInput\n                                onChange={this.onDisplayNameChange}\n                                type='text'\n                                ref={this.getTextbox}\n                                id='display_name'\n                                className='form-control'\n                                placeholder={holders.displayNameHolder}\n                                value={this.state.displayName}\n                                maxLength={Constants.MAX_CHANNELNAME_LENGTH}\n                                aria-label={formatMessage({id: 'rename_channel.displayName', defaultMessage: 'Display Name'}).toLowerCase()}\n                            />\n                            {displayNameError}\n                        </div>\n                        <div className='form-group'>\n                            <label className='control-label'>{urlInputLabel}</label>\n\n                            <div className={urlInputClass}>\n                                <OverlayTrigger\n                                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                                    placement='top'\n                                    overlay={urlTooltip}\n                                >\n                                    <span className='input-group-addon'>{shortUrl}</span>\n                                </OverlayTrigger>\n                                <input\n                                    onChange={this.onNameChange}\n                                    type='text'\n                                    className='form-control'\n                                    id='channel_name'\n                                    value={this.state.channelName}\n                                    maxLength={Constants.MAX_CHANNELNAME_LENGTH}\n                                    readOnly={readOnlyHandleInput}\n                                    aria-label={formatMessage({id: 'rename_channel.title', defaultMessage: 'Rename Channel'}).toLowerCase()}\n                                />\n                            </div>\n                            {urlHelpText}\n                            {urlErrors}\n                        </div>\n                        {serverError}\n                    </Modal.Body>\n                    <Modal.Footer>\n                        <button\n                            type='button'\n                            className='btn btn-link'\n                            onClick={this.handleCancel}\n                        >\n                            <FormattedMessage\n                                id='rename_channel.cancel'\n                                defaultMessage='Cancel'\n                            />\n                        </button>\n                        <button\n                            onClick={this.handleSubmit}\n                            type='submit'\n                            id='save-button'\n                            className='btn btn-primary'\n                        >\n                            <FormattedMessage\n                                id='rename_channel.save'\n                                defaultMessage='Save'\n                            />\n                        </button>\n                    </Modal.Footer>\n                </form>\n            </Modal>\n        );\n    }\n}\n\nexport default injectIntl(RenameChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {createSelector} from 'reselect';\n\nimport {patchChannel} from 'mattermost-redux/actions/channels';\nimport {getTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport {getSiteURL} from 'utils/url';\n\nimport RenameChannelModal from './rename_channel_modal';\n\ntype Actions = {\n    patchChannel(channelId: string, patch: Channel): Promise<{ data: Channel; error: Error }>;\n};\n\nconst mapStateToPropsRenameChannel = createSelector(\n    'mapStateToPropsRenameChannel',\n    (state: GlobalState) => {\n        const currentTeamId = state.entities.teams.currentTeamId;\n        const team = getTeam(state, currentTeamId);\n        const currentTeamUrl = `${getSiteURL()}/${team.name}`;\n        return {\n            currentTeamUrl,\n            team,\n        };\n    },\n    (teamInfo) => ({...teamInfo}),\n);\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            patchChannel,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToPropsRenameChannel, mapDispatchToProps)(RenameChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\nimport Constants from 'utils/constants';\nimport {General} from 'mattermost-redux/constants';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message.jsx';\n\nexport default class ConvertChannelModal extends React.PureComponent {\n    static propTypes = {\n\n        /**\n        * Function called when modal is dismissed\n        */\n        onHide: PropTypes.func.isRequired,\n        channelId: PropTypes.string.isRequired,\n        channelDisplayName: PropTypes.string.isRequired,\n\n        actions: PropTypes.shape({\n\n            /**\n            * Function called for converting channel to private,\n            */\n            updateChannelPrivacy: PropTypes.func.isRequired,\n        }),\n    }\n\n    constructor(props) {\n        super(props);\n\n        this.state = {show: true};\n    }\n\n    handleConvert = () => {\n        const {actions, channelId} = this.props;\n        if (channelId.length !== Constants.CHANNEL_ID_LENGTH) {\n            return;\n        }\n\n        actions.updateChannelPrivacy(channelId, General.PRIVATE_CHANNEL);\n        trackEvent('actions', 'convert_to_private_channel', {channel_id: channelId});\n        this.onHide();\n    }\n\n    onHide = () => {\n        this.setState({show: false});\n    }\n\n    render() {\n        const {\n            channelDisplayName,\n            onHide,\n        } = this.props;\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal'\n                show={this.state.show}\n                onHide={this.onHide}\n                onExited={onHide}\n                role='dialog'\n                aria-labelledby='convertChannelModalLabel'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='convertChannelModalLabel'\n                    >\n                        <FormattedMessage\n                            id='convert_channel.title'\n                            defaultMessage='Convert {display_name} to a Private Channel?'\n                            values={{\n                                display_name: channelDisplayName,\n                            }}\n                        />\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    <p>\n                        <FormattedMarkdownMessage\n                            id='convert_channel.question1'\n                            defaultMessage='When you convert **{display_name}** to a private channel, history and membership are preserved. Publicly shared files remain accessible to anyone with the link. Membership in a private channel is by invitation only.'\n                            values={{\n                                display_name: channelDisplayName,\n                            }}\n                        />\n                    </p>\n                    <p>\n                        <FormattedMessage\n                            id='convert_channel.question2'\n                            defaultMessage='The change is permanent and cannot be undone.'\n                        />\n                    </p>\n                    <p>\n                        <FormattedMarkdownMessage\n                            id='convert_channel.question3'\n                            defaultMessage='Are you sure you want to convert **{display_name}** to a private channel?'\n                            values={{\n                                display_name: channelDisplayName,\n                            }}\n                        />\n                    </p>\n                </Modal.Body>\n                <Modal.Footer>\n                    <button\n                        type='button'\n                        className='btn btn-link'\n                        onClick={this.onHide}\n                    >\n                        <FormattedMessage\n                            id='convert_channel.cancel'\n                            defaultMessage='No, cancel'\n                        />\n                    </button>\n                    <button\n                        type='button'\n                        className='btn btn-primary'\n                        data-dismiss='modal'\n                        onClick={this.handleConvert}\n                        autoFocus={true}\n                        data-testid='convertChannelConfirm'\n                    >\n                        <FormattedMessage\n                            id='convert_channel.confirm'\n                            defaultMessage='Yes, convert to private channel'\n                        />\n                    </button>\n                </Modal.Footer>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {updateChannelPrivacy} from 'mattermost-redux/actions/channels';\n\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport ConvertChannelModal from './convert_channel_modal.jsx';\n\nfunction mapStateToProps(state) {\n    return {\n        currentTeamDetails: getCurrentTeam(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            updateChannelPrivacy,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ConvertChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport {browserHistory} from 'utils/browser_history';\nimport Constants from 'utils/constants';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\n\nexport type Props = {\n    onHide: () => void;\n    channel: Channel;\n    currentTeamDetails: {name: string};\n    canViewArchivedChannels?: boolean;\n    penultimateViewedChannelName: string;\n    actions: {\n        deleteChannel: (channelId: string) => {data: boolean};\n    };\n}\n\ntype State = {\n    show: boolean;\n}\n\nexport default class DeleteChannelModal extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        this.state = {show: true};\n    }\n\n    handleDelete = () => {\n        if (this.props.channel.id.length !== Constants.CHANNEL_ID_LENGTH) {\n            return;\n        }\n        if (!this.props.canViewArchivedChannels) {\n            const {penultimateViewedChannelName} = this.props;\n            browserHistory.push('/' + this.props.currentTeamDetails.name + '/channels/' + penultimateViewedChannelName);\n        }\n        this.props.actions.deleteChannel(this.props.channel.id);\n        this.onHide();\n    }\n\n    onHide = () => {\n        this.setState({show: false});\n    }\n\n    render() {\n        const {canViewArchivedChannels} = this.props;\n        return (\n            <Modal\n                dialogClassName='a11y__modal'\n                show={this.state.show}\n                onHide={this.onHide}\n                onExited={this.props.onHide}\n                role='dialog'\n                aria-labelledby='deleteChannelModalLabel'\n                id='deleteChannelModal'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='deleteChannelModalLabel'\n                    >\n                        <FormattedMessage\n                            id='delete_channel.confirm'\n                            defaultMessage='Confirm ARCHIVE Channel'\n                        />\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    <div className='alert alert-danger'>\n                        {!canViewArchivedChannels &&\n                            <FormattedMarkdownMessage\n                                id='delete_channel.question'\n                                defaultMessage='This will archive the channel from the team and remove it from the user interface. Archived channels can be unarchived if needed again. \\n \\nAre you sure you wish to archive the {display_name} channel?'\n                                values={{\n                                    display_name: this.props.channel.display_name,\n                                }}\n                            />}\n                        {canViewArchivedChannels &&\n                            <FormattedMarkdownMessage\n                                id='delete_channel.viewArchived.question'\n                                defaultMessage={'This will archive the channel from the team. Channel contents will still be accessible by channel members.\\n \\nAre you sure you wish to archive the **{display_name}** channel?'}\n                                values={{\n                                    display_name: this.props.channel.display_name,\n                                }}\n                            />}\n                    </div>\n                </Modal.Body>\n                <Modal.Footer>\n                    <button\n                        type='button'\n                        className='btn btn-link'\n                        onClick={this.onHide}\n                    >\n                        <FormattedMessage\n                            id='delete_channel.cancel'\n                            defaultMessage='Cancel'\n                        />\n                    </button>\n                    <button\n                        type='button'\n                        className='btn btn-danger'\n                        data-dismiss='modal'\n                        onClick={this.handleDelete}\n                        autoFocus={true}\n                        id='deleteChannelModalDeleteButton'\n                    >\n                        <FormattedMessage\n                            id='delete_channel.del'\n                            defaultMessage='Archive'\n                        />\n                    </button>\n                </Modal.Footer>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {deleteChannel} from 'mattermost-redux/actions/channels';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {ActionFunc} from 'mattermost-redux/types/actions';\n\nimport DeleteChannelModal from './delete_channel_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n\n    return {\n        canViewArchivedChannels: config.ExperimentalViewArchivedChannels === 'true',\n        currentTeamDetails: getCurrentTeam(state),\n    };\n}\n\ntype Actions = {\n    deleteChannel: (channelId: string) => {data: true};\n};\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>(\n            {\n                deleteChannel,\n            },\n            dispatch,\n        ),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DeleteChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {ActionResult} from 'mattermost-redux/types/actions';\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport Constants from 'utils/constants';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\n\ntype Props = {\n    onHide: () => void;\n    channel: Channel;\n    actions: ChannelDetailsActions;\n}\n\ntype State = {\n    show: boolean;\n}\n\nexport type ChannelDetailsActions = {\n    unarchiveChannel: (channelId: string) => Promise<ActionResult>;\n};\n\nexport default class UnarchiveChannelModal extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {show: true};\n    }\n\n    handleUnarchive = (): void => {\n        if (this.props.channel.id.length !== Constants.CHANNEL_ID_LENGTH) {\n            return;\n        }\n        this.props.actions.unarchiveChannel(this.props.channel.id);\n        this.onHide();\n    }\n\n    onHide = (): void => {\n        this.setState({show: false});\n    }\n\n    render(): JSX.Element {\n        return (\n            <Modal\n                dialogClassName='a11y__modal'\n                show={this.state.show}\n                onHide={this.onHide}\n                onExited={this.props.onHide}\n                role='dialog'\n                aria-labelledby='unarchiveChannelModalLabel'\n                id='unarchiveChannelModal'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='unarchiveChannelModalLabel'\n                    >\n                        <FormattedMessage\n                            id='unarchive_channel.confirm'\n                            defaultMessage='Confirm UNARCHIVE Channel'\n                        />\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    <div className='alert alert-danger'>\n                        <FormattedMarkdownMessage\n                            id='unarchive_channel.viewArchived.question'\n                            defaultMessage={'Are you sure you wish to unarchive the **{display_name}** channel?'}\n                            values={{\n                                display_name: this.props.channel.display_name,\n                            }}\n                        />\n                    </div>\n                </Modal.Body>\n                <Modal.Footer>\n                    <button\n                        type='button'\n                        className='btn btn-link'\n                        onClick={this.onHide}\n                    >\n                        <FormattedMessage\n                            id='unarchive_channel.cancel'\n                            defaultMessage='Cancel'\n                        />\n                    </button>\n                    <button\n                        type='button'\n                        className='btn btn-danger'\n                        data-dismiss='modal'\n                        onClick={this.handleUnarchive}\n                        autoFocus={true}\n                        id='unarchiveChannelModalDeleteButton'\n                    >\n                        <FormattedMessage\n                            id='unarchive_channel.del'\n                            defaultMessage='Unarchive'\n                        />\n                    </button>\n                </Modal.Footer>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\n\nimport {unarchiveChannel} from 'mattermost-redux/actions/channels';\n\nimport UnarchiveChannelModal, {ChannelDetailsActions} from './unarchive_channel_modal';\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, ChannelDetailsActions>({\n            unarchiveChannel,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(UnarchiveChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, injectIntl, IntlShape} from 'react-intl';\n\nimport Groups from 'mattermost-redux/constants/groups';\n\nimport {Group} from 'mattermost-redux/types/groups';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport AddGroupsToChannelModal from 'components/add_groups_to_channel_modal';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport ListModal, {DEFAULT_NUM_PER_PAGE} from 'components/list_modal.jsx';\n\nimport DropdownIcon from 'components/widgets/icons/fa_dropdown_icon';\n\nimport groupsAvatar from 'images/groups-avatar.png';\n\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport Menu from 'components/widgets/menu/menu';\n\nimport * as Utils from 'utils/utils.jsx';\n\ntype Props = {\n    channel: Channel;\n    intl: IntlShape;\n    actions: {\n        getGroupsAssociatedToChannel: (channelId: string, searchTerm: string, pageNumber: number, perPage: number) => any;\n        unlinkGroupSyncable: (itemId: string, channelId: string, groupsSyncableTypeChannel: string) => any;\n        patchGroupSyncable: (itemId: string, channelId: string, groupsSyncableTypeChannel: string, params: {scheme_admin: boolean}) => any;\n        getMyChannelMember: (channelId: string) => any;\n        closeModal: (modalIdentifiersManageChannelGroups: string) => any;\n        openModal: (params: {modalId: string; dialogType: any}) => any;\n    };\n};\n\nclass ChannelGroupsManageModal extends React.PureComponent<Props> {\n    public loadItems = async (pageNumber: number, searchTerm: string) => {\n        const {data} = await this.props.actions.getGroupsAssociatedToChannel(this.props.channel.id, searchTerm, pageNumber, DEFAULT_NUM_PER_PAGE);\n        return {\n            items: data.groups,\n            totalCount: data.totalGroupCount,\n        };\n    };\n\n    public onClickRemoveGroup = (item: Group, listModal: any) => this.props.actions.unlinkGroupSyncable(item.id, this.props.channel.id, Groups.SYNCABLE_TYPE_CHANNEL).then(async () => {\n        listModal.setState({loading: true});\n        const {items, totalCount} = await listModal.props.loadItems(listModal.setState.page, listModal.state.searchTerm);\n        listModal.setState({loading: false, items, totalCount});\n    });\n\n    public onHide = () => {\n        this.props.actions.closeModal(ModalIdentifiers.MANAGE_CHANNEL_GROUPS);\n    };\n\n    public titleButtonOnClick = () => {\n        this.onHide();\n        this.props.actions.openModal({modalId: ModalIdentifiers.ADD_GROUPS_TO_TEAM, dialogType: AddGroupsToChannelModal});\n    };\n\n    public setChannelMemberStatus = async (item: Group, listModal: any, isChannelAdmin: boolean) => {\n        this.props.actions.patchGroupSyncable(item.id, this.props.channel.id, Groups.SYNCABLE_TYPE_CHANNEL, {scheme_admin: isChannelAdmin}).then(async () => {\n            listModal.setState({loading: true});\n            const {items, totalCount} = await listModal.props.loadItems(listModal.setState.page, listModal.state.searchTerm);\n            await this.props.actions.getMyChannelMember(this.props.channel.id);\n\n            listModal.setState({loading: false, items, totalCount});\n        });\n    };\n\n    public renderRow = (item: Group, listModal: any) => {\n        let title;\n        if (item.scheme_admin) {\n            title = Utils.localizeMessage('channel_members_dropdown.channel_admins', 'Channel Admins');\n        } else {\n            title = Utils.localizeMessage('channel_members_dropdown.channel_members', 'Channel Members');\n        }\n\n        return (\n            <div\n                key={item.id}\n                className='more-modal__row'\n            >\n                <img\n                    className='more-modal__image'\n                    src={groupsAvatar}\n                    alt='group picture'\n                    width='32'\n                    height='32'\n                />\n                <div className='more-modal__details'>\n                    <div className='more-modal__name'>{item.display_name} {'-'}{' '}\n                        <span className='more-modal__name_count'>\n                            <FormattedMessage\n                                id='numMembers'\n                                defaultMessage='{num, number} {num, plural, one {member} other {members}}'\n                                values={{\n                                    num: item.member_count,\n                                }}\n                            />\n                        </span>\n                    </div>\n                </div>\n                <div className='more-modal__actions'>\n                    <MenuWrapper>\n                        <button\n                            id={`teamGroupsDropdown_${item.display_name}`}\n                            className='dropdown-toggle theme color--link style--none'\n                            type='button'\n                            aria-expanded='true'\n                        >\n                            <span>{title} </span>\n                            <DropdownIcon/>\n                        </button>\n                        <Menu\n                            openLeft={true}\n                            ariaLabel={Utils.localizeMessage('channel_members_dropdown.menuAriaLabel', 'Change the role of channel member')}\n                        >\n                            <Menu.ItemAction\n                                show={!item.scheme_admin}\n                                onClick={() => this.setChannelMemberStatus(item, listModal, true)}\n                                text={Utils.localizeMessage('channel_members_dropdown.make_channel_admins', 'Make Channel Admins')}\n                            />\n                            <Menu.ItemAction\n                                show={Boolean(item.scheme_admin)}\n                                onClick={() => this.setChannelMemberStatus(item, listModal, false)}\n                                text={Utils.localizeMessage('channel_members_dropdown.make_channel_members', 'Make Channel Members')}\n                            />\n                            <Menu.ItemAction\n                                onClick={() => this.onClickRemoveGroup(item, listModal)}\n                                text={Utils.localizeMessage('group_list_modal.removeGroupButton', 'Remove Group')}\n                            />\n                        </Menu>\n                    </MenuWrapper>\n                </div>\n            </div>\n        );\n    };\n\n    render() {\n        const {formatMessage} = this.props.intl;\n        return (\n            <ListModal\n                titleText={formatMessage({id: 'groups', defaultMessage: '{channel} Groups'}, {channel: this.props.channel.display_name})}\n                searchPlaceholderText={formatMessage({id: 'manage_channel_groups_modal.search_placeholder', defaultMessage: 'Search groups'})}\n                renderRow={this.renderRow}\n                loadItems={this.loadItems}\n                onHide={this.onHide}\n                titleBarButtonText={formatMessage({id: 'group_list_modal.addGroupButton', defaultMessage: 'Add Groups'})}\n                titleBarButtonOnClick={this.titleButtonOnClick}\n            />\n        );\n    }\n}\n\nexport default injectIntl(ChannelGroupsManageModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {getGroupsAssociatedToChannel, unlinkGroupSyncable, patchGroupSyncable} from 'mattermost-redux/actions/groups';\nimport {getMyChannelMember} from 'mattermost-redux/actions/channels';\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {ActionFunc} from 'mattermost-redux/types/actions';\n\nimport {closeModal, openModal} from 'actions/views/modals';\n\nimport ChannelGroupsManageModal from './channel_groups_manage_modal';\n\nconst mapStateToProps = (state: GlobalState, ownProps: any) => {\n    return {\n        channel: state.entities.channels.channels[ownProps.channelID],\n    };\n};\n\ntype Actions = {\n    getGroupsAssociatedToChannel: (channelId: string, searchTerm: string, pageNumber: number, DEFAULT_NUM_PER_PAGE: number) => Promise<{\n        data: boolean;\n    }>;\n    unlinkGroupSyncable: (itemId: string, channelId: string, type: string) => Promise<{\n        data: boolean;\n    }>;\n    patchGroupSyncable: (itemId: string, channelId: string, groupsSyncableTypeChannel: string, params: {scheme_admin: boolean}) => Promise<{\n        data: boolean;\n    }>;\n    getMyChannelMember: (channelId: string) => Promise<{\n        data: boolean;\n    }>;\n    closeModal: (modalIdentifiersManageChannelGroups: any) => Promise<{\n        data: boolean;\n    }>;\n    openModal: (params: {modalId: any; dialogType: any}) => Promise<{\n        data: boolean;\n    }>;\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch) => ({\n    actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>(\n        {\n            getGroupsAssociatedToChannel,\n            closeModal,\n            openModal,\n            unlinkGroupSyncable,\n            patchGroupSyncable,\n            getMyChannelMember,\n        },\n        dispatch,\n    ),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelGroupsManageModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport {showLeavePrivateChannelModal} from 'actions/global_actions';\nimport {Constants} from 'utils/constants';\nimport {localizeMessage} from 'utils/utils';\n\nimport Menu from 'components/widgets/menu/menu';\n\ntype Props = {\n\n    /**\n     * Object with info about user\n     */\n    channel: Channel;\n\n    /**\n     * Boolean whether the channel is default\n     */\n    isDefault: boolean;\n\n    /**\n     * Boolean whether the user is a guest or no\n     */\n    isGuestUser: boolean;\n\n    /**\n     * Use for test selector\n     */\n    id?: string;\n\n    /**\n     * Object with action creators\n     */\n    actions: {\n\n        /**\n         * Action creator to leave channel\n         */\n        leaveChannel: (channelId: string) => void;\n    };\n};\n\ntype State = {\n};\n\nexport default class LeaveChannel extends React.PureComponent<Props, State> {\n    static defaultProps = {\n        isDefault: true,\n        isGuestUser: false,\n    }\n\n    handleLeave = (e: Event) => {\n        e.preventDefault();\n\n        const {\n            channel,\n            actions: {\n                leaveChannel,\n            },\n        } = this.props;\n\n        if (channel.type === Constants.PRIVATE_CHANNEL) {\n            showLeavePrivateChannelModal(channel);\n        } else {\n            leaveChannel(channel.id);\n        }\n    }\n\n    render() {\n        const {channel, isDefault, isGuestUser, id} = this.props;\n\n        return (\n            <Menu.ItemAction\n                id={id}\n                show={(!isDefault || isGuestUser) && channel.type !== Constants.DM_CHANNEL && channel.type !== Constants.GM_CHANNEL}\n                onClick={this.handleLeave}\n                text={localizeMessage('channel_header.leave', 'Leave Channel')}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {leaveChannel} from 'actions/views/channel';\n\nimport LeaveChannel from './leave_channel';\n\nconst mapDispatchToProps = (dispatch: Dispatch<GenericAction>) => ({\n    actions: bindActionCreators({leaveChannel}, dispatch),\n});\n\nexport default connect(null, mapDispatchToProps)(LeaveChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {localizeMessage} from 'utils/utils';\n\nimport Menu from 'components/widgets/menu/menu';\n\ntype Props = {\n    isArchived: boolean;\n    actions: {\n        goToLastViewedChannel: () => void;\n    };\n}\n\nexport default class CloseChannel extends React.PureComponent<Props> {\n    private handleClose = () => {\n        this.props.actions.goToLastViewedChannel();\n    }\n\n    render() {\n        return (\n            <Menu.ItemAction\n                show={this.props.isArchived}\n                onClick={this.handleClose}\n                text={localizeMessage('center_panel.archived.closeChannel', 'Close Channel')}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {goToLastViewedChannel} from 'actions/views/channel';\n\nimport CloseChannel from './close_channel';\n\nconst mapDispatchToProps = (dispatch: Dispatch<GenericAction>) => ({\n    actions: bindActionCreators({\n        goToLastViewedChannel,\n    }, dispatch),\n});\n\nexport default connect(null, mapDispatchToProps)(CloseChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {Team} from 'mattermost-redux/types/teams';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\n\nimport {localizeMessage} from 'utils/utils';\nimport {Constants} from 'utils/constants';\nimport {browserHistory} from 'utils/browser_history';\nimport Menu from 'components/widgets/menu/menu';\n\ntype Props = {\n\n    /**\n     * Object with info about currentUser\n     */\n    currentUser: UserProfile;\n\n    /**\n     * Object with info about currentTeam\n     */\n    currentTeam: Team;\n\n    /**\n     * String with info about redirect\n     */\n    redirectChannel: string;\n\n    /**\n     * Object with info about channel\n     */\n    channel: Channel;\n\n    /**\n     * Use for test selector\n     */\n    id?: string;\n\n    /**\n     * Object with action creators\n     */\n    actions: {\n\n        /**\n         * Action creator to update user preferences\n         */\n        savePreferences: (userId: string, preferences: PreferenceType[]) => void;\n\n        /**\n         * Action creator to leave DM/GM\n         */\n        leaveDirectChannel: (channelName: string) => void;\n    };\n};\n\nexport default class CloseMessage extends React.PureComponent<Props> {\n    handleClose = (e: React.MouseEvent): void => {\n        e.preventDefault();\n\n        const {\n            channel,\n            currentUser,\n            currentTeam,\n            redirectChannel,\n            actions: {\n                savePreferences,\n                leaveDirectChannel,\n            },\n        } = this.props;\n\n        let name: string;\n        let category;\n        if (channel.type === Constants.DM_CHANNEL) {\n            category = Constants.Preferences.CATEGORY_DIRECT_CHANNEL_SHOW;\n            name = channel.teammate_id!;\n        } else {\n            category = Constants.Preferences.CATEGORY_GROUP_CHANNEL_SHOW;\n            name = channel.id;\n        }\n\n        leaveDirectChannel(channel.name);\n        savePreferences(currentUser.id, [{user_id: currentUser.id, category, name, value: 'false'}]);\n\n        browserHistory.push(`/${currentTeam.name}/channels/${redirectChannel}`);\n    }\n\n    render(): React.ReactNode {\n        const {id, channel} = this.props;\n\n        let text;\n        if (channel.type === Constants.DM_CHANNEL) {\n            text = localizeMessage('center_panel.direct.closeDirectMessage', 'Close Direct Message');\n        } else if (channel.type === Constants.GM_CHANNEL) {\n            text = localizeMessage('center_panel.direct.closeGroupMessage', 'Close Group Message');\n        }\n\n        return (\n            <Menu.ItemAction\n                id={id}\n                show={channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL}\n                onClick={this.handleClose}\n                text={text}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getCurrentTeam, getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getRedirectChannelNameForTeam} from 'mattermost-redux/selectors/entities/channels';\n\nimport {leaveDirectChannel} from 'actions/views/channel';\nimport {GlobalState} from 'types/store';\n\nimport CloseMessage from './close_message';\n\nconst mapStateToProps = (state: GlobalState) => {\n    return {\n        currentTeam: getCurrentTeam(state),\n        redirectChannel: getRedirectChannelNameForTeam(state, getCurrentTeamId(state)),\n    };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch) => ({\n    actions: bindActionCreators({savePreferences, leaveDirectChannel}, dispatch),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CloseMessage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {Channel, ChannelNotifyProps} from 'mattermost-redux/types/channels';\nimport {ActionFunc} from 'mattermost-redux/types/actions';\n\nimport {Constants, NotificationLevels} from 'utils/constants';\nimport {localizeMessage} from 'utils/utils';\n\nimport Menu from 'components/widgets/menu/menu';\n\nexport type Actions = {\n    updateChannelNotifyProps(userId: string, channelId: string, props: Partial<ChannelNotifyProps>): ActionFunc;\n};\n\ntype Props = {\n\n    /**\n     * Object with info about the current user\n     */\n    user: UserProfile;\n\n    /**\n     * Object with info about the current channel\n     */\n    channel: Channel;\n\n    /**\n     * Boolean whether the current channel is muted\n     */\n    isMuted: boolean;\n\n    /**\n     * Use for test selector\n     */\n    id?: string;\n\n    /**\n     * Object with action creators\n     */\n    actions: Actions;\n};\n\nexport default class MenuItemToggleMuteChannel extends React.PureComponent<Props> {\n    handleClick = () => {\n        const {\n            user,\n            channel,\n            isMuted,\n            actions: {\n                updateChannelNotifyProps,\n            },\n        } = this.props;\n\n        updateChannelNotifyProps(user.id, channel.id, {\n            mark_unread: (isMuted ? NotificationLevels.ALL : NotificationLevels.MENTION) as 'all' | 'mention',\n        });\n    }\n\n    render() {\n        const {\n            id,\n            isMuted,\n            channel,\n        } = this.props;\n\n        let text;\n        if (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL) {\n            text = isMuted ? localizeMessage('channel_header.unmuteConversation', 'Unmute Conversation') :\n                localizeMessage('channel_header.muteConversation', 'Mute Conversation');\n        } else {\n            text = isMuted ? localizeMessage('channel_header.unmute', 'Unmute Channel') :\n                localizeMessage('channel_header.mute', 'Mute Channel');\n        }\n\n        return (\n            <Menu.ItemAction\n                id={id}\n                onClick={this.handleClick}\n                text={text}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {updateChannelNotifyProps} from 'mattermost-redux/actions/channels';\nimport {ActionFunc} from 'mattermost-redux/types/actions';\n\nimport MenuItemToggleMuteChannel, {Actions} from './toggle_mute_channel';\n\nconst mapDispatchToProps = (dispatch: Dispatch) => ({\n    actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n        updateChannelNotifyProps,\n    }, dispatch),\n});\n\nexport default connect(null, mapDispatchToProps)(MenuItemToggleMuteChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport {localizeMessage} from 'utils/utils';\n\nimport Menu from 'components/widgets/menu/menu';\n\ntype Action = {\n    favoriteChannel: (channelId: string) => void;\n    unfavoriteChannel: (channelId: string) => void;\n};\n\ntype Props = {\n    show: boolean;\n    channel: Channel;\n    isFavorite: boolean;\n    actions: Action;\n};\n\nexport default class ToggleFavoriteChannel extends React.PureComponent<Props> {\n    static defaultProps = {\n        show: true,\n    }\n\n    toggleFavoriteChannel = (channelId: string) => {\n        const {\n            isFavorite,\n            actions: {\n                favoriteChannel,\n                unfavoriteChannel,\n            },\n        } = this.props;\n\n        return isFavorite ? unfavoriteChannel(channelId) : favoriteChannel(channelId);\n    };\n\n    handleClick = (e: React.MouseEvent<HTMLButtonElement>): void => {\n        e.preventDefault();\n        this.toggleFavoriteChannel(this.props.channel.id);\n    }\n\n    render() {\n        let text;\n        if (this.props.isFavorite) {\n            text = localizeMessage('channelHeader.removeFromFavorites', 'Remove from Favorites');\n        } else {\n            text = localizeMessage('channelHeader.addToFavorites', 'Add to Favorites');\n        }\n        return (\n            <Menu.ItemAction\n                show={this.props.show}\n                onClick={this.handleClick}\n                text={text}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {favoriteChannel, unfavoriteChannel} from 'mattermost-redux/actions/channels';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport ToggleFavoriteChannel from './toggle_favorite_channel';\n\nconst mapDispatchToProps = (dispatch: Dispatch<GenericAction>) => ({\n    actions: bindActionCreators({\n        favoriteChannel,\n        unfavoriteChannel,\n    }, dispatch),\n});\n\nexport default connect(null, mapDispatchToProps)(ToggleFavoriteChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {localizeMessage} from 'utils/utils';\n\nimport Menu from 'components/widgets/menu/menu';\n\ntype Props = {\n    show?: boolean;\n    channel: any;\n    hasPinnedPosts: boolean;\n    actions: {\n        closeRightHandSide: () => (dispatch: any) => void;\n        showPinnedPosts: (id: any) => void;\n    };\n}\n\nexport default class ViewPinnedPosts extends React.PureComponent<Props> {\n    private handleClick = (e: React.MouseEvent) => {\n        e.preventDefault();\n\n        const {\n            channel,\n            hasPinnedPosts,\n            actions: {\n                closeRightHandSide,\n                showPinnedPosts,\n            },\n        } = this.props;\n\n        if (hasPinnedPosts) {\n            closeRightHandSide();\n        } else {\n            showPinnedPosts(channel.id);\n        }\n    }\n\n    render() {\n        return (\n            <Menu.ItemAction\n                show={this.props.show}\n                onClick={this.handleClick}\n                text={localizeMessage('navbar.viewPinnedPosts', 'View Pinned Posts')}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {GlobalState} from 'types/store';\n\nimport {closeRightHandSide, showPinnedPosts} from 'actions/views/rhs';\nimport {getRhsState} from 'selectors/rhs';\nimport {RHSStates} from 'utils/constants';\n\nimport ViewPinnedPosts from './view_pinned_posts';\n\nconst mapStateToProps = (state: GlobalState) => ({\n    hasPinnedPosts: getRhsState(state) === RHSStates.PIN,\n});\n\nconst mapDispatchToProps = (dispatch: Dispatch<GenericAction>) => ({\n    actions: bindActionCreators({\n        closeRightHandSide,\n        showPinnedPosts,\n    }, dispatch),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ViewPinnedPosts);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport {Constants, ModalIdentifiers} from 'utils/constants';\nimport {localizeMessage, isGuest} from 'utils/utils';\n\nimport MobileChannelHeaderPlug from 'plugins/mobile_channel_header_plug';\n\nimport ChannelNotificationsModal from 'components/channel_notifications_modal';\nimport ChannelInviteModal from 'components/channel_invite_modal';\nimport ChannelMembersModal from 'components/channel_members_modal';\nimport ChannelInfoModal from 'components/channel_info_modal';\nimport EditChannelHeaderModal from 'components/edit_channel_header_modal';\nimport EditChannelPurposeModal from 'components/edit_channel_purpose_modal';\nimport RenameChannelModal from 'components/rename_channel_modal';\nimport ConvertChannelModal from 'components/convert_channel_modal';\nimport DeleteChannelModal from 'components/delete_channel_modal';\nimport UnarchiveChannelModal from 'components/unarchive_channel_modal';\nimport MoreDirectChannels from 'components/more_direct_channels';\nimport AddGroupsToChannelModal from 'components/add_groups_to_channel_modal';\nimport ChannelGroupsManageModal from 'components/channel_groups_manage_modal';\n\nimport ChannelPermissionGate from 'components/permissions_gates/channel_permission_gate';\n\nimport Menu from 'components/widgets/menu/menu';\n\nimport MenuItemLeaveChannel from './menu_items/leave_channel';\nimport MenuItemCloseChannel from './menu_items/close_channel';\nimport MenuItemCloseMessage from './menu_items/close_message';\nimport MenuItemToggleMuteChannel from './menu_items/toggle_mute_channel';\nimport MenuItemToggleFavoriteChannel from './menu_items/toggle_favorite_channel';\nimport MenuItemViewPinnedPosts from './menu_items/view_pinned_posts';\n\nexport default class ChannelHeaderDropdown extends React.PureComponent {\n    static propTypes = {\n        user: PropTypes.object.isRequired,\n        channel: PropTypes.object.isRequired,\n        isDefault: PropTypes.bool.isRequired,\n        isFavorite: PropTypes.bool.isRequired,\n        isReadonly: PropTypes.bool.isRequired,\n        isMuted: PropTypes.bool.isRequired,\n        isArchived: PropTypes.bool.isRequired,\n        isMobile: PropTypes.bool.isRequired,\n        penultimateViewedChannelName: PropTypes.string.isRequired,\n        pluginMenuItems: PropTypes.arrayOf(PropTypes.object),\n        isLicensedForLDAPGroups: PropTypes.bool,\n    }\n\n    render() {\n        const {\n            user,\n            channel,\n            isDefault,\n            isFavorite,\n            isMuted,\n            isReadonly,\n            isArchived,\n            isMobile,\n            penultimateViewedChannelName,\n            isLicensedForLDAPGroups,\n        } = this.props;\n\n        const isPrivate = channel.type === Constants.PRIVATE_CHANNEL;\n        const isGroupConstrained = channel.group_constrained === true;\n        const channelMembersPermission = isPrivate ? Permissions.MANAGE_PRIVATE_CHANNEL_MEMBERS : Permissions.MANAGE_PUBLIC_CHANNEL_MEMBERS;\n        const channelPropertiesPermission = isPrivate ? Permissions.MANAGE_PRIVATE_CHANNEL_PROPERTIES : Permissions.MANAGE_PUBLIC_CHANNEL_PROPERTIES;\n        const channelDeletePermission = isPrivate ? Permissions.DELETE_PRIVATE_CHANNEL : Permissions.DELETE_PUBLIC_CHANNEL;\n        const channelUnarchivePermission = Permissions.MANAGE_TEAM;\n\n        let divider;\n        if (isMobile) {\n            divider = (\n                <li className='MenuGroup mobile-menu-divider'>\n                    <hr/>\n                </li>\n            );\n        }\n\n        const pluginItems = this.props.pluginMenuItems.map((item) => {\n            return (\n                <Menu.ItemAction\n                    id={item.id + '_pluginmenuitem'}\n                    key={item.id + '_pluginmenuitem'}\n                    onClick={() => {\n                        if (item.action) {\n                            item.action(this.props.channel.id);\n                        }\n                    }}\n                    text={item.text}\n                />\n            );\n        });\n\n        return (\n            <React.Fragment>\n                <Menu.Group divider={divider}>\n                    <Menu.ItemToggleModalRedux\n                        id='channelViewInfo'\n                        show={channel.type !== Constants.DM_CHANNEL && channel.type !== Constants.GM_CHANNEL}\n                        modalId={ModalIdentifiers.CHANNEL_INFO}\n                        dialogType={ChannelInfoModal}\n                        dialogProps={{channel}}\n                        text={localizeMessage('navbar.viewInfo', 'View Info')}\n                    />\n                    <MenuItemToggleFavoriteChannel\n                        id='channelToggleFavorite'\n                        show={isMobile}\n                        channel={channel}\n                        isFavorite={isFavorite}\n                    />\n                    <MenuItemViewPinnedPosts\n                        id='channelViewPinnedPosts'\n                        show={isMobile}\n                        channel={channel}\n                    />\n                    <Menu.ItemToggleModalRedux\n                        id='channelNotificationPreferences'\n                        show={channel.type !== Constants.DM_CHANNEL && !isArchived}\n                        modalId={ModalIdentifiers.CHANNEL_NOTIFICATIONS}\n                        dialogType={ChannelNotificationsModal}\n                        dialogProps={{\n                            channel,\n                            currentUser: user,\n                        }}\n                        text={localizeMessage('navbar.preferences', 'Notification Preferences')}\n                    />\n                    <MenuItemToggleMuteChannel\n                        id='channelToggleMuteChannel'\n                        user={user}\n                        channel={channel}\n                        isMuted={isMuted}\n                        isArchived={isArchived}\n                    />\n                </Menu.Group>\n\n                <Menu.Group divider={divider}>\n                    <ChannelPermissionGate\n                        channelId={channel.id}\n                        teamId={channel.team_id}\n                        permissions={[channelMembersPermission]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='channelAddMembers'\n                            show={channel.type !== Constants.DM_CHANNEL && channel.type !== Constants.GM_CHANNEL && !isArchived && !isDefault && !isGroupConstrained}\n                            modalId={ModalIdentifiers.CHANNEL_INVITE}\n                            dialogType={ChannelInviteModal}\n                            dialogProps={{channel}}\n                            text={localizeMessage('navbar.addMembers', 'Add Members')}\n                        />\n                        <Menu.ItemToggleModalRedux\n                            id='channelAddMembers'\n                            show={channel.type === Constants.GM_CHANNEL && !isArchived && !isGroupConstrained}\n                            modalId={ModalIdentifiers.CREATE_DM_CHANNEL}\n                            dialogType={MoreDirectChannels}\n                            dialogProps={{isExistingChannel: true}}\n                            text={localizeMessage('navbar.addMembers', 'Add Members')}\n                        />\n                    </ChannelPermissionGate>\n                    <Menu.ItemToggleModalRedux\n                        id='channelViewMembers'\n                        show={channel.type !== Constants.DM_CHANNEL && channel.type !== Constants.GM_CHANNEL && (isArchived || isDefault)}\n                        modalId={ModalIdentifiers.CHANNEL_MEMBERS}\n                        dialogType={ChannelMembersModal}\n                        dialogProps={{channel}}\n                        text={localizeMessage('channel_header.viewMembers', 'View Members')}\n                    />\n                    <ChannelPermissionGate\n                        channelId={channel.id}\n                        teamId={channel.team_id}\n                        permissions={[channelMembersPermission]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='channelAddGroups'\n                            show={channel.type !== Constants.DM_CHANNEL && channel.type !== Constants.GM_CHANNEL && !isArchived && !isDefault && isGroupConstrained && isLicensedForLDAPGroups}\n                            modalId={ModalIdentifiers.ADD_GROUPS_TO_CHANNEL}\n                            dialogType={AddGroupsToChannelModal}\n                            text={localizeMessage('navbar.addGroups', 'Add Groups')}\n                        />\n                        <Menu.ItemToggleModalRedux\n                            id='channelManageGroups'\n                            show={channel.type !== Constants.DM_CHANNEL && channel.type !== Constants.GM_CHANNEL && !isArchived && !isDefault && isGroupConstrained && isLicensedForLDAPGroups}\n                            modalId={ModalIdentifiers.MANAGE_CHANNEL_GROUPS}\n                            dialogType={ChannelGroupsManageModal}\n                            dialogProps={{channelID: channel.id}}\n                            text={localizeMessage('navbar_dropdown.manageGroups', 'Manage Groups')}\n                        />\n                        <Menu.ItemToggleModalRedux\n                            id='channelManageMembers'\n                            show={channel.type !== Constants.DM_CHANNEL && channel.type !== Constants.GM_CHANNEL && !isArchived && !isDefault}\n                            modalId={ModalIdentifiers.CHANNEL_MEMBERS}\n                            dialogType={ChannelMembersModal}\n                            dialogProps={{channel}}\n                            text={localizeMessage('channel_header.manageMembers', 'Manage Members')}\n                        />\n                    </ChannelPermissionGate>\n                    <ChannelPermissionGate\n                        channelId={channel.id}\n                        teamId={channel.team_id}\n                        permissions={[channelMembersPermission]}\n                        invert={true}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='channelViewMembers'\n                            show={channel.type !== Constants.DM_CHANNEL && channel.type !== Constants.GM_CHANNEL && !isArchived && !isDefault}\n                            modalId={ModalIdentifiers.CHANNEL_MEMBERS}\n                            dialogType={ChannelMembersModal}\n                            dialogProps={{channel}}\n                            text={localizeMessage('channel_header.viewMembers', 'View Members')}\n                        />\n                    </ChannelPermissionGate>\n                </Menu.Group>\n\n                <Menu.Group divider={divider}>\n                    <Menu.ItemToggleModalRedux\n                        id='channelEditHeader'\n                        show={(channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL) && !isArchived && !isReadonly}\n                        modalId={ModalIdentifiers.EDIT_CHANNEL_HEADER}\n                        dialogType={EditChannelHeaderModal}\n                        dialogProps={{channel}}\n                        text={localizeMessage('channel_header.setConversationHeader', 'Edit Conversation Header')}\n                    />\n                    <ChannelPermissionGate\n                        channelId={channel.id}\n                        teamId={channel.team_id}\n                        permissions={[channelPropertiesPermission]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='channelEditHeader'\n                            show={channel.type !== Constants.DM_CHANNEL && channel.type !== Constants.GM_CHANNEL && !isArchived && !isReadonly}\n                            modalId={ModalIdentifiers.EDIT_CHANNEL_HEADER}\n                            dialogType={EditChannelHeaderModal}\n                            dialogProps={{channel}}\n                            text={localizeMessage('channel_header.setHeader', 'Edit Channel Header')}\n                        />\n                        <Menu.ItemToggleModalRedux\n                            id='channelEditPurpose'\n                            show={!isArchived && !isReadonly && channel.type !== Constants.DM_CHANNEL && channel.type !== Constants.GM_CHANNEL}\n                            modalId={ModalIdentifiers.EDIT_CHANNEL_PURPOSE}\n                            dialogType={EditChannelPurposeModal}\n                            dialogProps={{channel}}\n                            text={localizeMessage('channel_header.setPurpose', 'Edit Channel Purpose')}\n                        />\n                        <Menu.ItemToggleModalRedux\n                            id='channelRename'\n                            show={!isArchived && channel.type !== Constants.DM_CHANNEL && channel.type !== Constants.GM_CHANNEL}\n                            modalId={ModalIdentifiers.RENAME_CHANNEL}\n                            dialogType={RenameChannelModal}\n                            dialogProps={{channel}}\n                            text={localizeMessage('channel_header.rename', 'Rename Channel')}\n                        />\n                    </ChannelPermissionGate>\n                    <ChannelPermissionGate\n                        channelId={channel.id}\n                        teamId={channel.team_id}\n                        permissions={[Permissions.CONVERT_PUBLIC_CHANNEL_TO_PRIVATE]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='channelConvertToPrivate'\n                            show={!isArchived && !isDefault && channel.type === Constants.OPEN_CHANNEL}\n                            modalId={ModalIdentifiers.CONVERT_CHANNEL}\n                            dialogType={ConvertChannelModal}\n                            dialogProps={{\n                                channelId: channel.id,\n                                channelDisplayName: channel.display_name,\n                            }}\n                            text={localizeMessage('channel_header.convert', 'Convert to Private Channel')}\n                        />\n                    </ChannelPermissionGate>\n                    <ChannelPermissionGate\n                        channelId={channel.id}\n                        teamId={channel.team_id}\n                        permissions={[channelDeletePermission]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='channelArchiveChannel'\n                            show={!isArchived && !isDefault && channel.type !== Constants.DM_CHANNEL && channel.type !== Constants.GM_CHANNEL}\n                            modalId={ModalIdentifiers.DELETE_CHANNEL}\n                            dialogType={DeleteChannelModal}\n                            dialogProps={{\n                                channel,\n                                penultimateViewedChannelName,\n                            }}\n                            text={localizeMessage('channel_header.delete', 'Archive Channel')}\n                        />\n                    </ChannelPermissionGate>\n                </Menu.Group>\n                <Menu.Group>\n                    {pluginItems}\n                </Menu.Group>\n                <Menu.Group divider={divider}>\n                    {isMobile &&\n                        <MobileChannelHeaderPlug\n                            channel={channel}\n                            isDropdown={true}\n                        />}\n                    <MenuItemLeaveChannel\n                        id='channelLeaveChannel'\n                        channel={channel}\n                        isDefault={isDefault}\n                        isGuestUser={isGuest(user)}\n                    />\n                    <MenuItemCloseMessage\n                        id='channelCloseMessage'\n                        channel={channel}\n                        currentUser={user}\n                    />\n                    <MenuItemCloseChannel\n                        id='channelCloseChannel'\n                        isArchived={isArchived}\n                    />\n                </Menu.Group>\n\n                <Menu.Group divider={divider}>\n                    <ChannelPermissionGate\n                        channelId={channel.id}\n                        teamId={channel.team_id}\n                        permissions={[channelUnarchivePermission]}\n                    >\n                        <Menu.ItemToggleModalRedux\n                            id='channelUnarchiveChannel'\n                            show={isArchived && !isDefault && channel.type !== Constants.DM_CHANNEL && channel.type !== Constants.GM_CHANNEL}\n                            modalId={ModalIdentifiers.UNARCHIVE_CHANNEL}\n                            dialogType={UnarchiveChannelModal}\n                            dialogProps={{\n                                channel,\n                            }}\n                            text={localizeMessage('channel_header.unarchive', 'Unarchive Channel')}\n                        />\n                    </ChannelPermissionGate>\n                </Menu.Group>\n            </React.Fragment>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {CSSTransition} from 'react-transition-group';\n\nconst ANIMATION_DURATION = 350;\n\nexport default class MobileChannelHeaderDropdownAnimation extends React.PureComponent {\n    static propTypes = {\n        children: PropTypes.node,\n        show: PropTypes.bool.isRequired,\n    };\n\n    render() {\n        return (\n            <CSSTransition\n                in={this.props.show}\n                classNames='mobile-channel-header-dropdown'\n                enter={true}\n                exit={true}\n                mountOnEnter={true}\n                unmountOnExit={true}\n                timeout={{\n                    enter: ANIMATION_DURATION,\n                    exit: ANIMATION_DURATION,\n                }}\n            >\n                {this.props.children}\n            </CSSTransition>\n        );\n    }\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {FormattedMessage} from 'react-intl';\n\nimport StatusIcon from 'components/status_icon';\n\nimport {Constants} from 'utils/constants';\n\nimport {ChannelHeaderDropdownItems} from 'components/channel_header_dropdown';\n\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport MobileChannelHeaderDropdownAnimation from './mobile_channel_header_dropdown_animation.jsx';\n\nexport default class MobileChannelHeaderDropdown extends React.PureComponent {\n    static propTypes = {\n        user: PropTypes.object.isRequired,\n        channel: PropTypes.object.isRequired,\n        teammateId: PropTypes.string,\n        teammateIsBot: PropTypes.bool,\n        teammateStatus: PropTypes.string,\n        displayName: PropTypes.string.isRequired,\n    }\n\n    getChannelTitle = () => {\n        const {user, channel, teammateId, displayName} = this.props;\n\n        if (channel.type === Constants.DM_CHANNEL) {\n            if (user.id === teammateId) {\n                return (\n                    <FormattedMessage\n                        id='channel_header.directchannel.you'\n                        defaultMessage='{displayname} (you)'\n                        values={{displayname: displayName}}\n                    />\n                );\n            }\n            return displayName;\n        }\n        return channel.display_name;\n    }\n\n    render() {\n        const {teammateIsBot, teammateStatus} = this.props;\n        let dmHeaderIconStatus;\n\n        if (!teammateIsBot) {\n            dmHeaderIconStatus = (\n                <StatusIcon status={teammateStatus}/>\n            );\n        }\n\n        return (\n            <MenuWrapper animationComponent={MobileChannelHeaderDropdownAnimation}>\n                <a>\n                    <span className='heading'>\n                        {dmHeaderIconStatus}\n                        {this.getChannelTitle()}\n                    </span>\n                    <FormattedMessage\n                        id='generic_icons.dropdown'\n                        defaultMessage='Dropdown Icon'\n                    >\n                        {(title) => (\n                            <span\n                                className='fa fa-angle-down header-dropdown__icon'\n                                title={title}\n                            />\n                        )}\n                    </FormattedMessage>\n                </a>\n\n                <FormattedMessage\n                    id='channel_header.menuAriaLabel'\n                    defaultMessage='Channel Menu'\n                >\n                    {(ariaLabel) => (\n                        <Menu ariaLabel={ariaLabel}>\n                            <ChannelHeaderDropdownItems isMobile={true}/>\n                            <div className='Menu__close visible-xs-block'>\n                                {'×'}\n                            </div>\n                        </Menu>\n                    )}\n                </FormattedMessage>\n            </MenuWrapper>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {createSelector} from 'reselect';\n\nimport {\n    getUser,\n    getCurrentUser,\n    getUserStatuses,\n    getCurrentUserId,\n} from 'mattermost-redux/selectors/entities/users';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {\n    getCurrentChannel,\n    isCurrentChannelDefault,\n    isCurrentChannelFavorite,\n    isCurrentChannelMuted,\n    isCurrentChannelArchived,\n    getRedirectChannelNameForTeam,\n} from 'mattermost-redux/selectors/entities/channels';\n\nimport {getPenultimateViewedChannelName} from 'selectors/local_storage';\n\nimport {Constants} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport Desktop from './channel_header_dropdown';\nimport Items from './channel_header_dropdown_items';\nimport Mobile from './mobile_channel_header_dropdown';\n\nconst getTeammateId = createSelector(\n    'getTeammateId',\n    getCurrentChannel,\n    getCurrentUserId,\n    (channel, currentUserId) => {\n        if (channel.type !== Constants.DM_CHANNEL) {\n            return null;\n        }\n\n        return Utils.getUserIdFromChannelId(channel.name, currentUserId);\n    },\n);\n\nconst getTeammateStatus = createSelector(\n    'getTeammateStatus',\n    getUserStatuses,\n    getTeammateId,\n    (userStatuses, teammateId) => {\n        if (!teammateId) {\n            return null;\n        }\n\n        return userStatuses[teammateId];\n    },\n);\n\nconst mapStateToProps = (state) => ({\n    user: getCurrentUser(state),\n    channel: getCurrentChannel(state),\n    isDefault: isCurrentChannelDefault(state),\n    isFavorite: isCurrentChannelFavorite(state),\n    isMuted: isCurrentChannelMuted(state),\n    isReadonly: false,\n    isArchived: isCurrentChannelArchived(state),\n    penultimateViewedChannelName: getPenultimateViewedChannelName(state) || getRedirectChannelNameForTeam(state, getCurrentTeamId(state)),\n    pluginMenuItems: state.plugins.components.ChannelHeader || [],\n    isLicensedForLDAPGroups: state.entities.general.license.LDAPGroups === 'true',\n});\n\nconst mobileMapStateToProps = (state) => {\n    const user = getCurrentUser(state);\n    const channel = getCurrentChannel(state);\n    const teammateId = getTeammateId(state);\n\n    let teammateIsBot = false;\n    let displayName = '';\n    if (teammateId) {\n        const teammate = getUser(state, teammateId);\n        teammateIsBot = teammate && teammate.is_bot;\n        displayName = Utils.getDisplayNameByUser(state, teammate);\n    }\n\n    return {\n        user,\n        channel,\n        teammateId,\n        teammateIsBot,\n        teammateStatus: getTeammateStatus(state),\n        displayName,\n    };\n};\n\nexport const ChannelHeaderDropdown = Desktop;\nexport const ChannelHeaderDropdownItems = connect(mapStateToProps)(Items);\nexport const MobileChannelHeaderDropdown = connect(mobileMapStateToProps)(Mobile);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {BasicUnreadMeta} from 'mattermost-redux/selectors/entities/channels';\ntype Props = BasicUnreadMeta;\n\nexport default class NotifyCounts extends React.PureComponent<Props> {\n    render() {\n        if (this.props.unreadMentionCount) {\n            return <span className='badge badge-notify'>{this.props.unreadMentionCount}</span>;\n        } else if (this.props.isUnread) {\n            return <span className='badge badge-notify'>{'•'}</span>;\n        }\n        return null;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getUnreadStatusInCurrentTeam, basicUnreadMeta} from 'mattermost-redux/selectors/entities/channels';\n\nimport {GlobalState} from 'types/store';\n\nimport NotifyCounts from './notify_counts';\n\nfunction mapStateToProps(state: GlobalState) {\n    return basicUnreadMeta(getUnreadStatusInCurrentTeam(state));\n}\n\nexport default connect(mapStateToProps)(NotifyCounts);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport NotifyCounts from 'components/notify_counts';\nimport MenuIcon from 'components/widgets/icons/menu_icon';\n\ntype Props = {\n    actions: {\n        toggleLhs: (e?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n    };\n}\n\nconst CollapseLhsButton: React.FunctionComponent<Props> = (props: Props) => (\n    <button\n        key='navbar-toggle-sidebar'\n        type='button'\n        className='navbar-toggle'\n        data-toggle='collapse'\n        data-target='#sidebar-nav'\n        onClick={props.actions.toggleLhs}\n    >\n        <span className='sr-only'>\n            <FormattedMessage\n                id='navbar.toggle2'\n                defaultMessage='Toggle sidebar'\n            />\n        </span>\n        <MenuIcon className='style--none icon icon__menu icon--sidebarHeaderTextColor'/>\n        <NotifyCounts/>\n    </button>\n);\n\nexport default CollapseLhsButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {toggle as toggleLhs} from 'actions/views/lhs';\n\nimport CollapseLhsButton from './collapse_lhs_button';\n\nconst mapDispatchToProps = (dispatch: Dispatch<GenericAction>) => ({\n    actions: bindActionCreators({\n        toggleLhs,\n    }, dispatch),\n});\n\nexport default connect(null, mapDispatchToProps)(CollapseLhsButton);\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport MenuIcon from 'components/widgets/icons/menu_icon';\n\ntype Actions = {\n    toggleRhsMenu: (e?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n}\n\ntype Props = {\n    actions: Actions;\n}\n\nconst CollapseRhsButton: React.FunctionComponent<Props> = (props: Props) => (\n    <button\n        key='navbar-toggle-menu'\n        type='button'\n        className='navbar-toggle navbar-right__icon menu-toggle pull-right'\n        data-toggle='collapse'\n        data-target='#sidebar-nav'\n        onClick={props.actions.toggleRhsMenu}\n    >\n        <MenuIcon/>\n    </button>\n);\n\nexport default CollapseRhsButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {toggleMenu as toggleRhsMenu} from 'actions/views/rhs';\n\nimport CollapseRhsButton from './collapse_rhs_button';\n\nconst mapDispatchToProps = (dispatch: Dispatch<GenericAction>) => ({\n    actions: bindActionCreators({\n        toggleRhsMenu,\n    }, dispatch),\n});\n\nexport default connect(null, mapDispatchToProps)(CollapseRhsButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function InfoIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='18px'\n                height='18px'\n                viewBox='0 0 22 22'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.info', defaultMessage: 'Info Icon'})}\n            >\n                <g\n                    stroke='none'\n                    strokeWidth='1'\n                    fill='inherit'\n                    fillRule='evenodd'\n                >\n                    <g\n                        transform='translate(-388.000000, -18.000000)'\n                        fill='inherit'\n                    >\n                        <g>\n                            <g transform='translate(381.000000, 11.000000)'>\n                                <g transform='translate(7.000000, 7.000000)'>\n                                    <path d='M11,22 C4.92486775,22 0,17.0751322 0,11 C0,4.92486775 4.92486775,0 11,0 C17.0751322,0 22,4.92486775 22,11 C22,17.0751322 17.0751322,22 11,22 Z M11,20.7924685 C16.408231,20.7924685 20.7924685,16.408231 20.7924685,11 C20.7924685,5.59176898 16.408231,1.20753149 11,1.20753149 C5.59176898,1.20753149 1.20753149,5.59176898 1.20753149,11 C1.20753149,16.408231 5.59176898,20.7924685 11,20.7924685 Z M10.1572266,16.0625 L10.1572266,8.69335938 L11.3466797,8.69335938 L11.3466797,16.0625 L10.1572266,16.0625 Z M10.7519531,7.50390625 C10.3417969,7.50390625 10,7.16210938 10,6.75195312 C10,6.33496094 10.3417969,6 10.7519531,6 C11.1689453,6 11.5039062,6.33496094 11.5039062,6.75195312 C11.5039062,7.16210938 11.1689453,7.50390625 10.7519531,7.50390625 Z'/>\n                                </g>\n                            </g>\n                        </g>\n                    </g>\n                </g>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport EditChannelHeaderModal from 'components/edit_channel_header_modal';\nimport Markdown from 'components/markdown';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport InfoIcon from 'components/widgets/icons/info_icon';\nimport Popover from 'components/widgets/popover';\nconst headerMarkdownOptions = {mentionHighlight: false};\n\nexport default class NavbarInfoButton extends React.PureComponent {\n    static propTypes = {\n        channel: PropTypes.object.isRequired,\n        isReadOnly: PropTypes.bool.isRequired,\n        isRHSOpen: PropTypes.bool,\n        currentRelativeTeamUrl: PropTypes.string,\n        actions: PropTypes.shape({\n            openModal: PropTypes.func.isRequired,\n        }).isRequired,\n    };\n\n    headerOverlayRef = React.createRef();\n\n    componentDidUpdate(prevProps) {\n        const RHSChanged = !prevProps.isRHSOpen && this.props.isRHSOpen;\n        const channelChanged = prevProps.channel?.id !== this.props.channel?.id;\n        if (RHSChanged || channelChanged) {\n            this.hide();\n        }\n    }\n\n    showEditChannelHeaderModal = () => {\n        this.hide();\n\n        const {actions, channel} = this.props;\n        const modalData = {\n            modalId: ModalIdentifiers.EDIT_CHANNEL_HEADER,\n            dialogType: EditChannelHeaderModal,\n            dialogProps: {channel},\n        };\n\n        actions.openModal(modalData);\n    }\n\n    hide = () => {\n        if (this.headerOverlayRef.current) {\n            this.headerOverlayRef.current.hide();\n        }\n    }\n\n    handleFormattedTextClick = (e) => Utils.handleFormattedTextClick(e, this.props.currentRelativeTeamUrl);\n\n    render() {\n        const {channel, isReadOnly} = this.props;\n\n        let popoverContent = null;\n        if (channel.header) {\n            popoverContent = (\n                <Markdown\n                    message={channel.header}\n                    options={headerMarkdownOptions}\n                />\n            );\n        } else {\n            let addOne;\n            if (!isReadOnly) {\n                const link = (\n                    <a\n                        href='#'\n                        onClick={this.showEditChannelHeaderModal}\n                    >\n                        <FormattedMessage\n                            id='navbar.click'\n                            defaultMessage='Click here'\n                        />\n                    </a>\n                );\n                addOne = (\n                    <React.Fragment>\n                        <br/>\n                        <FormattedMessage\n                            id='navbar.clickToAddHeader'\n                            defaultMessage='{clickHere} to add one.'\n                            values={{clickHere: link}}\n                        />\n                    </React.Fragment>\n                );\n            }\n\n            popoverContent = (\n                <div>\n                    <FormattedMessage\n                        id='navbar.noHeader'\n                        defaultMessage='No channel header yet.'\n                    />\n                    {addOne}\n                </div>\n            );\n        }\n\n        const popover = (\n            <Popover\n                popoverStyle='info'\n                placement='bottom'\n                className='navbar__popover'\n                id='header-popover'\n            >\n                <span\n                    onClick={this.handleFormattedTextClick}\n                >\n                    {popoverContent}\n                </span>\n\n                <div\n                    className='close visible-xs-block'\n                    onClick={this.hide}\n                >\n                    {'×'}\n                </div>\n            </Popover>\n        );\n\n        return (\n            <OverlayTrigger\n                ref={this.headerOverlayRef}\n                trigger='click'\n                placement='bottom'\n                overlay={popover}\n                className='description'\n                rootClose={true}\n            >\n                <button\n                    className='navbar-toggle navbar-right__icon navbar-info-button pull-right'\n                    aria-label={Utils.localizeMessage('accessibility.button.Info', 'Info')}\n                >\n                    <InfoIcon\n                        className='icon icon__info'\n                        aria-hidden='true'\n                    />\n                </button>\n            </OverlayTrigger>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {openModal} from 'actions/views/modals';\n\nimport ChannelInfoButton from './channel_info_button';\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            openModal,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(ChannelInfoButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {localizeMessage} from 'utils/utils.jsx';\n\nimport SearchIcon from 'components/widgets/icons/search_icon';\n\ntype Actions = {\n    openRHSSearch: () => void;\n}\n\ntype Props = {\n    actions: Actions;\n}\n\nexport default class ShowSearchButton extends React.PureComponent<Props> {\n    handleClick = () => {\n        this.props.actions.openRHSSearch();\n    }\n\n    render() {\n        return (\n            <button\n                type='button'\n                className='navbar-toggle navbar-right__icon navbar-search pull-right'\n                onClick={this.handleClick}\n                aria-label={localizeMessage('accessibility.button.Search', 'Search')}\n            >\n                <SearchIcon\n                    className='icon icon__search'\n                    aria-hidden='true'\n                />\n            </button>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {openRHSSearch} from 'actions/views/rhs';\n\nimport ShowSearchButton from './show_search_button';\n\nconst mapDispatchToProps = (dispatch: Dispatch<GenericAction>) => ({\n    actions: bindActionCreators({\n        openRHSSearch,\n    }, dispatch),\n});\n\nexport default connect(null, mapDispatchToProps)(ShowSearchButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {ChannelNotifyProps} from 'mattermost-redux/types/channels';\n\nimport {NotificationLevels} from 'utils/constants';\n\ntype Actions = {\n    updateChannelNotifyProps: (userId: string, channelId: string, props: ChannelNotifyProps) => void;\n}\n\ntype Props = {\n    user: { id: string };\n    channel: { id: string };\n    actions: Actions;\n}\n\nexport default class UnmuteChannelButton extends React.PureComponent<Props> {\n    handleClick = (): void => {\n        const {\n            user,\n            channel,\n            actions: {\n                updateChannelNotifyProps,\n            },\n        } = this.props;\n\n        updateChannelNotifyProps(user.id, channel.id, {mark_unread: NotificationLevels.ALL} as ChannelNotifyProps);\n    }\n\n    render(): JSX.Element {\n        return (\n            <button\n                type='button'\n                className='navbar-toggle icon icon__mute'\n                onClick={this.handleClick}\n            >\n                <span className='fa fa-bell-slash-o icon'/>\n            </button>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {updateChannelNotifyProps} from 'mattermost-redux/actions/channels';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport UnmuteChannelButton from './unmute_channel_button';\n\nconst mapDispatchToProps = (dispatch: Dispatch<GenericAction>) => ({\n    actions: bindActionCreators({\n        updateChannelNotifyProps,\n    }, dispatch),\n});\n\nexport default connect(null, mapDispatchToProps)(UnmuteChannelButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport classNames from 'classnames';\n\nimport {MobileChannelHeaderDropdown} from 'components/channel_header_dropdown';\nimport MobileChannelHeaderPlug from 'plugins/mobile_channel_header_plug';\n\nimport * as Utils from 'utils/utils';\n\nimport CollapseLhsButton from './collapse_lhs_button';\nimport CollapseRhsButton from './collapse_rhs_button';\nimport ChannelInfoButton from './channel_info_button';\nimport ShowSearchButton from './show_search_button';\nimport UnmuteChannelButton from './unmute_channel_button';\n\nexport default class ChannelHeaderMobile extends React.PureComponent {\n    static propTypes = {\n\n        /**\n         *\n         */\n        user: PropTypes.object.isRequired,\n\n        /**\n         * Object with info about current channel\n         */\n        channel: PropTypes.object,\n\n        /**\n         * Bool whether the current channel is read only\n         */\n        isReadOnly: PropTypes.bool,\n\n        /**\n         * Bool whether the current channel is muted\n         */\n        isMuted: PropTypes.bool,\n\n        /**\n         * Bool whether the right hand side is open\n         */\n        isRHSOpen: PropTypes.bool,\n\n        /**\n         * Relative url for the team, used to redirect if a link in the channel header is clicked\n         */\n        currentRelativeTeamUrl: PropTypes.string,\n\n        inGlobalThreads: PropTypes.bool,\n\n        /**\n         * Object with action creators\n         */\n        actions: PropTypes.shape({\n            closeLhs: PropTypes.func.isRequired,\n            closeRhs: PropTypes.func.isRequired,\n            closeRhsMenu: PropTypes.func.isRequired,\n        }).isRequired,\n\n    };\n\n    componentDidMount() {\n        document.querySelector('.inner-wrap').addEventListener('click', this.hideSidebars);\n    }\n\n    componentWillUnmount() {\n        document.querySelector('.inner-wrap').removeEventListener('click', this.hideSidebars);\n    }\n\n    hideSidebars = (e) => {\n        if (Utils.isMobile()) {\n            this.props.actions.closeRhs();\n\n            if (e.target.className !== 'navbar-toggle' && e.target.className !== 'icon-bar') {\n                this.props.actions.closeLhs();\n                this.props.actions.closeRhsMenu();\n            }\n        }\n    }\n\n    render() {\n        const {user, channel, isMuted, isReadOnly, isRHSOpen, currentRelativeTeamUrl, inGlobalThreads} = this.props;\n\n        let heading;\n        if (inGlobalThreads) {\n            heading = (\n                <FormattedMessage\n                    id='globalThreads.heading'\n                    defaultMessage='Followed threads'\n                />\n            );\n        } else if (channel) {\n            heading = (\n                <>\n                    <MobileChannelHeaderDropdown/>\n                    {isMuted && (\n                        <UnmuteChannelButton\n                            user={user}\n                            channel={channel}\n                        />\n                    )}\n                </>\n            );\n        }\n\n        return (\n            <nav\n                id='navbar'\n                className='navbar navbar-default navbar-fixed-top'\n                role='navigation'\n            >\n                <div className='container-fluid theme'>\n                    <div className='navbar-header'>\n                        <CollapseLhsButton/>\n                        <div className={classNames('navbar-brand', {GlobalThreads___title: inGlobalThreads})}>\n                            {heading}\n                        </div>\n                        <div className='spacer'/>\n                        {channel && (\n                            <ChannelInfoButton\n                                channel={channel}\n                                isReadOnly={isReadOnly}\n                                isRHSOpen={isRHSOpen}\n                                currentRelativeTeamUrl={currentRelativeTeamUrl}\n                            />\n                        )}\n                        <ShowSearchButton/>\n                        {channel && (\n                            <MobileChannelHeaderPlug\n                                channel={channel}\n                                isDropdown={false}\n                            />\n                        )}\n                        <CollapseRhsButton/>\n                    </div>\n                </div>\n            </nav>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport {withRouter, matchPath} from 'react-router-dom';\n\nimport {createSelector} from 'reselect';\n\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {\n    getCurrentChannel,\n    getMyCurrentChannelMembership,\n} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\nimport {isChannelMuted} from 'mattermost-redux/utils/channel_utils';\n\nimport {\n    closeRightHandSide as closeRhs,\n    closeMenu as closeRhsMenu,\n} from 'actions/views/rhs';\nimport {close as closeLhs} from 'actions/views/lhs';\n\nimport {getIsRhsOpen} from 'selectors/rhs';\n\nimport ChannelHeaderMobile from './channel_header_mobile';\n\nconst isCurrentChannelMuted = createSelector(\n    'isCurrentChannelMuted',\n    getMyCurrentChannelMembership,\n    (membership) => isChannelMuted(membership),\n);\n\nconst mapStateToProps = (state, {location: {pathname}}) => ({\n    user: getCurrentUser(state),\n    channel: getCurrentChannel(state),\n    isMuted: isCurrentChannelMuted(state),\n    isReadOnly: false,\n    isRHSOpen: getIsRhsOpen(state),\n    currentRelativeTeamUrl: getCurrentRelativeTeamUrl(state),\n    inGlobalThreads: Boolean(matchPath(pathname, {path: '/:team/threads/:threadIdentifier?'})),\n});\n\nconst mapDispatchToProps = (dispatch) => ({\n    actions: bindActionCreators({\n        closeLhs,\n        closeRhs,\n        closeRhsMenu,\n    }, dispatch),\n});\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(ChannelHeaderMobile));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {History} from 'history';\n\nimport {joinChannel, getChannelByNameAndTeamName, getChannelMember, markGroupChannelOpen, fetchMyChannelsAndMembers} from 'mattermost-redux/actions/channels';\nimport {getUser, getUserByUsername, getUserByEmail} from 'mattermost-redux/actions/users';\nimport {getTeamByName} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser, getCurrentUserId, getUserByUsername as selectUserByUsername, getUser as selectUser, getUserByEmail as selectUserByEmail} from 'mattermost-redux/selectors/entities/users';\nimport {getChannelByName, getOtherChannels, getChannel, getChannelsNameMapInTeam, getRedirectChannelNameForTeam} from 'mattermost-redux/selectors/entities/channels';\nimport {GetStateFunc, DispatchFunc, ActionFunc} from 'mattermost-redux/types/actions';\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport {openDirectChannelToUserId} from 'actions/channel_actions';\nimport * as GlobalActions from 'actions/global_actions';\nimport {joinPrivateChannelPrompt} from 'utils/channel_utils';\nimport {Constants} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\n\nimport {Match, MatchAndHistory} from './channel_identifier_router';\n\nconst LENGTH_OF_ID = 26;\nconst LENGTH_OF_GROUP_ID = 40;\nconst LENGTH_OF_USER_ID_PAIR = 54;\nconst USER_ID_PAIR_REGEXP = new RegExp(`^[a-zA-Z0-9]{${LENGTH_OF_ID}}__[a-zA-Z0-9]{${LENGTH_OF_ID}}$`);\n\nexport function onChannelByIdentifierEnter({match, history}: MatchAndHistory): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState();\n        const {path, identifier, team} = match.params;\n\n        if (!identifier) {\n            return {data: undefined};\n        }\n\n        const teamObj = getTeamByName(state, team);\n        if (!teamObj) {\n            return {data: undefined};\n        }\n\n        const channelPath = getPathFromIdentifier(state, path, identifier);\n\n        switch (channelPath) {\n        case 'channel_name':\n            dispatch(goToChannelByChannelName(match, history));\n            break;\n        case 'channel_id':\n            dispatch(goToChannelByChannelId(match, history));\n            break;\n        case 'group_channel_group_id':\n            dispatch(goToGroupChannelByGroupId(match, history));\n            break;\n        case 'direct_channel_username':\n            dispatch(goToDirectChannelByUsername(match, history));\n            break;\n        case 'direct_channel_email':\n            dispatch(goToDirectChannelByEmail(match, history));\n            break;\n        case 'direct_channel_user_ids':\n            dispatch(goToDirectChannelByUserIds(match, history));\n            break;\n        case 'direct_channel_user_id':\n            dispatch(goToDirectChannelByUserId(match, history, identifier));\n            break;\n        case 'error':\n            await dispatch(fetchMyChannelsAndMembers(teamObj!.id));\n            handleError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n            break;\n        }\n        return {data: undefined};\n    };\n}\n\nexport function getPathFromIdentifier(state: GlobalState, path: string, identifier: string) {\n    if (path === 'channels') {\n        // It's hard to tell an ID apart from a channel name of the same length, so check first if\n        // the identifier matches a channel that we have\n        const channelsByName = getChannelByName(state, identifier);\n        const moreChannelsByName = getOtherChannels(state).find((chan) => chan.name === identifier);\n\n        if (identifier.length === LENGTH_OF_ID) {\n            return channelsByName || moreChannelsByName ? 'channel_name' : 'channel_id';\n        } else if (\n            (!channelsByName && !moreChannelsByName && identifier.length === LENGTH_OF_GROUP_ID) ||\n            (\n                (channelsByName && channelsByName.type === Constants.GM_CHANNEL) ||\n                (moreChannelsByName && moreChannelsByName.type === Constants.GM_CHANNEL)\n            )\n        ) {\n            return 'group_channel_group_id';\n        } else if (isDirectChannelIdentifier(identifier)) {\n            return 'direct_channel_user_ids';\n        }\n        return 'channel_name';\n    } else if (path === 'messages') {\n        if (identifier.indexOf('@') === 0) {\n            return 'direct_channel_username';\n        } else if (identifier.indexOf('@') > 0) {\n            return 'direct_channel_email';\n        } else if (identifier.length === LENGTH_OF_ID) {\n            return 'direct_channel_user_id';\n        } else if (identifier.length === LENGTH_OF_GROUP_ID) {\n            return 'group_channel_group_id';\n        }\n        return 'error';\n    }\n\n    return 'error';\n}\n\nexport function goToChannelByChannelId(match: Match, history: History): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState();\n        const {team, identifier} = match.params;\n        const channelId = identifier.toLowerCase();\n\n        let channel = getChannel(state, channelId);\n        const member = state.entities.channels.myMembers[channelId];\n        const teamObj = getTeamByName(state, team);\n        if (!channel || !member) {\n            const dispatchResult = await dispatch(joinChannel(getCurrentUserId(state), teamObj!.id, channelId, ''));\n            if ('error' in dispatchResult) {\n                await dispatch(fetchMyChannelsAndMembers(teamObj!.id));\n                handleChannelJoinError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n                return {data: undefined};\n            }\n            channel = dispatchResult.data.channel;\n        }\n\n        if (channel.type === Constants.DM_CHANNEL) {\n            dispatch(goToDirectChannelByUserId(match, history, Utils.getUserIdFromChannelId(channel.name, getCurrentUserId(state))));\n        } else if (channel.type === Constants.GM_CHANNEL) {\n            history.replace(`/${team}/messages/${channel.name}`);\n        } else {\n            history.replace(`/${team}/channels/${channel.name}`);\n        }\n        return {data: undefined};\n    };\n}\n\nexport function goToChannelByChannelName(match: Match, history: History): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState();\n        const {team, identifier} = match.params;\n        const channelName = identifier.toLowerCase();\n\n        const teamObj = getTeamByName(state, team);\n        if (!teamObj) {\n            return {data: undefined};\n        }\n\n        let channel = getChannelsNameMapInTeam(state, teamObj!.id)[channelName];\n        if (!channel) {\n            const getChannelDispatchResult = await dispatch(getChannelByNameAndTeamName(team, channelName, true));\n            if ('data' in getChannelDispatchResult) {\n                channel = getChannelDispatchResult.data;\n            }\n        }\n\n        let member;\n        if (channel) {\n            member = state.entities.channels.myMembers[channel.id];\n            if (!member) {\n                const membership = await dispatch(getChannelMember(channel.id, getCurrentUserId(state)));\n                if ('data' in membership) {\n                    member = membership.data;\n                }\n            }\n        }\n\n        if (!channel || !member) {\n            // Prompt system admin before joining the private channel\n            const user = getCurrentUser(getState());\n            const isSystemAdmin = Utils.isSystemAdmin(user?.roles);\n            if (isSystemAdmin) {\n                if (channel?.type === Constants.PRIVATE_CHANNEL) {\n                    const joinPromptResult = await dispatch(joinPrivateChannelPrompt(teamObj, channel));\n                    if ('data' in joinPromptResult && !joinPromptResult.data.join) {\n                        return {data: undefined};\n                    }\n                }\n            }\n\n            const joinChannelDispatchResult = await dispatch(joinChannel(getCurrentUserId(state), teamObj!.id, '', channelName));\n            if ('error' in joinChannelDispatchResult) {\n                if (!channel) {\n                    const getChannelDispatchResult = await dispatch(getChannelByNameAndTeamName(team, channelName, true));\n                    if ('error' in getChannelDispatchResult || getChannelDispatchResult.data.delete_at === 0) {\n                        await dispatch(fetchMyChannelsAndMembers(teamObj!.id));\n                        handleChannelJoinError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n                        return {data: undefined};\n                    }\n                    channel = getChannelDispatchResult.data;\n                }\n            } else {\n                channel = joinChannelDispatchResult.data.channel;\n            }\n        }\n\n        if (channel.type === Constants.DM_CHANNEL) {\n            dispatch(goToDirectChannelByUserIds(match, history));\n        } else if (channel.type === Constants.GM_CHANNEL) {\n            history.replace(`/${team}/messages/${channel.name}`);\n        } else {\n            doChannelChange(channel);\n        }\n        return {data: undefined};\n    };\n}\n\nfunction goToDirectChannelByUsername(match: Match, history: History): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState();\n        const {team, identifier} = match.params;\n        const username = identifier.slice(1, identifier.length).toLowerCase();\n        const teamObj = getTeamByName(state, team);\n\n        let user = selectUserByUsername(state, username);\n        if (!user) {\n            const dispatchResult = await dispatch(getUserByUsername(username));\n            if ('error' in dispatchResult) {\n                await dispatch(fetchMyChannelsAndMembers(teamObj!.id));\n                handleError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n                return {data: undefined};\n            }\n            user = dispatchResult.data;\n        }\n\n        const directChannelDispatchRes = await dispatch(openDirectChannelToUserId(user.id));\n        if ('error' in directChannelDispatchRes) {\n            await dispatch(fetchMyChannelsAndMembers(teamObj!.id));\n            handleError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n            return {data: undefined};\n        }\n\n        doChannelChange(directChannelDispatchRes.data);\n        return {data: undefined};\n    };\n}\n\nexport function goToDirectChannelByUserId(match: Match, history: History, userId: string): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState();\n        const {team} = match.params;\n        const teamObj = getTeamByName(state, team);\n\n        let user = selectUser(state, userId);\n        if (!user) {\n            const dispatchResult = await dispatch(getUser(userId));\n            if ('error' in dispatchResult) {\n                await dispatch(fetchMyChannelsAndMembers(teamObj!.id));\n                handleError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n                return {data: undefined};\n            }\n            user = dispatchResult.data;\n        }\n\n        history.replace(`/${team}/messages/@${user.username}`);\n        return {data: undefined};\n    };\n}\n\nexport function goToDirectChannelByUserIds(match: Match, history: History): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState();\n        const {team, identifier} = match.params;\n        const userId = Utils.getUserIdFromChannelId(identifier.toLowerCase(), getCurrentUserId(getState()));\n        const teamObj = getTeamByName(state, team);\n\n        let user = selectUser(state, userId);\n        if (!user) {\n            const dispatchResult = await dispatch(getUser(userId));\n            if ('error' in dispatchResult) {\n                await dispatch(fetchMyChannelsAndMembers(teamObj!.id));\n                handleError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n                return {data: undefined};\n            }\n            user = dispatchResult.data;\n        }\n\n        history.replace(`/${team}/messages/@${user.username}`);\n        return {data: undefined};\n    };\n}\n\nexport function goToDirectChannelByEmail(match: Match, history: History): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState();\n        const {team, identifier} = match.params;\n        const email = identifier.toLowerCase();\n        const teamObj = getTeamByName(state, team);\n\n        let user = selectUserByEmail(state, email);\n        if (!user) {\n            const dispatchResult = await dispatch(getUserByEmail(email));\n            if ('error' in dispatchResult) {\n                await dispatch(fetchMyChannelsAndMembers(teamObj!.id));\n                handleError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n                return {data: undefined};\n            }\n            user = dispatchResult.data;\n        }\n\n        history.replace(`/${team}/messages/@${user.username}`);\n        return {data: undefined};\n    };\n}\n\nfunction goToGroupChannelByGroupId(match: Match, history: History): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState();\n        const {identifier, team} = match.params;\n        const groupId = identifier.toLowerCase();\n\n        history.replace(match.url.replace('/channels/', '/messages/'));\n\n        let channel = getChannelByName(state, groupId);\n        const teamObj = getTeamByName(state, team);\n        if (!channel) {\n            const dispatchResult = await dispatch(joinChannel(getCurrentUserId(state), teamObj!.id, '', groupId));\n            if ('error' in dispatchResult) {\n                await dispatch(fetchMyChannelsAndMembers(teamObj!.id));\n                handleError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n                return {data: undefined};\n            }\n            channel = dispatchResult.data.channel;\n        }\n\n        dispatch(markGroupChannelOpen(channel!.id));\n\n        doChannelChange(channel!);\n        return {data: undefined};\n    };\n}\n\nfunction doChannelChange(channel: Channel) {\n    GlobalActions.emitChannelClickEvent(channel);\n}\n\nfunction handleError(match: Match, history: History, defaultChannel: string) {\n    const {team} = match.params;\n    history.push(team ? `/${team}/channels/${defaultChannel}` : '/');\n}\n\nfunction isDirectChannelIdentifier(identifier: string) {\n    return identifier.length === LENGTH_OF_USER_ID_PAIR && USER_ID_PAIR_REGEXP.test(identifier);\n}\n\nasync function handleChannelJoinError(match: Match, history: History, defaultChannel: string) {\n    const {team} = match.params;\n    history.push(team ? `/error?type=channel_not_found&returnTo=/${team}/channels/${defaultChannel}` : '/');\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function MessageIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <button\n            {...props}\n            aria-label={formatMessage({id: 'members_popover.button.message', defaultMessage: 'message'})}\n            className='style--none icon icon__message'\n            tabIndex={-1}\n        >\n            <svg\n                width='18px'\n                height='16px'\n                viewBox='0 0 18 16'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.message', defaultMessage: 'Message Icon'})}\n            >\n                <g\n                    stroke='none'\n                    strokeWidth='1'\n                    fill='inherit'\n                    fillRule='evenodd'\n                >\n                    <g\n                        transform='translate(-200.000000, -174.000000)'\n                        fill='inherit'\n                    >\n                        <g transform='translate(200.000000, 174.000000)'>\n                            <path d='M7.2546625,1.42801356 C10.458475,1.42801356 12.999475,3.24528136 12.999475,5.52023729 C12.9895,8.04188475 10.6062625,9.89326102 7.40245,9.89326102 C7.40245,9.89326102 6.9134125,9.91229831 6.4115125,9.83747119 L5.82535,9.79622373 L5.15335,10.3586169 C4.997425,10.5397356 4.3199125,11.1095322 3.736375,11.4794373 C4.0915375,10.4598847 4.07605,10.1370441 4.07605,10.1370441 L4.1251375,9.49004068 L3.55315,9.19549153 C2.0986375,8.44616271 1.4444875,6.88616271 1.4444875,5.52023729 C1.4444875,3.24528136 4.05085,1.42801356 7.2546625,1.42801356 M7.2546625,0.370386441 C3.465475,0.370386441 0.3944875,2.65829831 0.3944875,5.52023729 C0.3944875,7.3028678 1.2623125,9.20342373 3.0751375,10.1370441 C3.0751375,10.1478847 3.07225,10.1560814 3.07225,10.1679797 C3.07225,10.9426915 2.43175,12.0048136 2.1794875,12.4429356 L2.1805375,12.4429356 C2.1605875,12.4902644 2.148775,12.5420881 2.148775,12.5973492 C2.148775,12.8141627 2.322025,12.9881424 2.5375375,12.9881424 C2.5693,12.9881424 2.6210125,12.9815322 2.6393875,12.9815322 C2.6446375,12.9815322 2.6467375,12.9815322 2.6462125,12.9831186 C3.986275,12.762339 5.9642125,11.2435864 6.2576875,10.8837288 C6.5585125,10.928678 6.761425,10.9358169 7.0136875,10.9358169 C7.120525,10.9358169 7.2347125,10.9342305 7.3696375,10.9342305 C11.1583,10.9342305 14.094625,8.75446102 14.049475,5.52023729 C14.049475,2.65829831 11.0435875,0.370386441 7.2546625,0.370386441'/>\n                            <path d='M17.2055125,9.79172881 C17.2055125,8.35811525 16.6498,7.26532203 15.2624875,6.4451322 C15.228625,6.82614237 15.120475,7.23517966 15.0031375,7.59477288 C15.8998375,8.21903729 16.1555125,8.85995932 16.1555125,9.79172881 C16.1555125,10.9323797 15.62815,11.7597085 14.40175,12.3919051 L13.879375,12.653139 C13.879375,12.653139 13.9337125,14.0082237 14.0140375,14.3511593 C12.9895,13.5946915 12.6374875,12.9630237 12.6374875,12.9630237 L12.08545,13.0486915 C11.86705,13.0809492 11.276425,13.0812136 11.276425,13.0812136 C9.85,13.0812136 8.7929125,12.7388068 7.8909625,12.0278169 C8.135875,12.0124814 6.42805,12.0132746 6.3899875,12.0468542 C7.4326375,13.3297559 9.1373125,14.1388407 11.276425,14.1388407 C11.3927125,14.1388407 11.49115,14.1398983 11.58355,14.1398983 C11.801425,14.1398983 11.9773,14.1338169 12.237175,14.095478 C12.491275,14.4058915 13.914025,15.7728746 15.0724375,15.9629831 C15.0719125,15.9619254 15.073225,15.9619254 15.078475,15.9619254 C15.0939625,15.9619254 15.13885,15.967478 15.16615,15.967478 C15.3522625,15.967478 15.5024125,15.8167661 15.5024125,15.6293017 C15.5024125,15.5817085 15.49165,15.5367593 15.47485,15.4960407 L15.4759,15.4960407 C15.258025,15.117939 14.9159875,14.0129831 14.9159875,13.3435051 C14.9159875,13.3331932 14.9128375,13.3260542 14.9128375,13.3168 C16.4797,12.5095661 17.2055125,11.3321627 17.2055125,9.79172881'/>\n                        </g>\n                    </g>\n                </g>\n            </svg>\n        </button>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport ProfilePicture from 'components/profile_picture';\nimport MessageIcon from 'components/widgets/icons/message_icon';\nimport {UserStatuses} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\nimport BotBadge from 'components/widgets/badges/bot_badge';\nimport GuestBadge from 'components/widgets/badges/guest_badge';\nimport SharedUserIndicator from 'components/shared_user_indicator';\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\n\nexport default class PopoverListMembersItem extends React.PureComponent {\n    static propTypes = {\n        showMessageIcon: PropTypes.bool.isRequired,\n        onItemClick: PropTypes.func.isRequired,\n        status: PropTypes.string.isRequired,\n        user: PropTypes.object.isRequired,\n        displayName: PropTypes.string.isRequired,\n    };\n\n    static defaultProps = {\n        status: UserStatuses.OFFLINE,\n    };\n\n    handleClick = () => {\n        this.props.onItemClick(this.props.user);\n    };\n\n    render() {\n        if (!this.props.user) {\n            return null;\n        }\n\n        if (!this.props.displayName) {\n            return null;\n        }\n\n        let messageIcon;\n        if (this.props.showMessageIcon) {\n            messageIcon = (\n                <MessageIcon aria-hidden='true'/>\n            );\n        }\n\n        let sharedIcon;\n        if (this.props.user.remote_id) {\n            sharedIcon = (\n                <SharedUserIndicator\n                    className='shared-user-icon'\n                    withTooltip={true}\n                />\n            );\n        }\n\n        const botClass = this.props.user.is_bot ? ' more-modal__row--bot' : '';\n\n        const status = this.props.user.is_bot ? null : this.props.status;\n\n        return (\n            <div\n                data-testid='popoverListMembersItem'\n                tabIndex='0'\n                aria-label={this.props.displayName.toLowerCase()}\n                className={'more-modal__row' + botClass}\n                onClick={this.handleClick}\n            >\n                <ProfilePicture\n                    src={Client4.getProfilePictureUrl(this.props.user.id, this.props.user.last_picture_update)}\n                    status={status}\n                    size='md'\n                />\n                <div className='more-modal__details d-flex whitespace--nowrap'>\n                    <div className='more-modal__name'>\n                        <span>\n                            {this.props.displayName}\n                        </span>\n                        <BotBadge\n                            show={Boolean(this.props.user.is_bot)}\n                            className='badge-popoverlist'\n                        />\n                        <GuestBadge\n                            show={Utils.isGuest(this.props.user)}\n                            className='badge-popoverlist'\n                        />\n                    </div>\n                    <CustomStatusEmoji\n                        userID={this.props.user.id}\n                        showTooltip={true}\n                        emojiSize={15}\n                        emojiStyle={{\n                            marginBottom: -3,\n                            marginLeft: 4,\n                        }}\n                    />\n                    {sharedIcon}\n                </div>\n                <div className='more-modal__actions'>\n                    {messageIcon}\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {connect} from 'react-redux';\n\nimport {getDisplayNameByUser} from 'utils/utils.jsx';\n\nimport PopoverListMembersItem from './popover_list_members_item.jsx';\n\nfunction mapStateToProps(state, ownProps) {\n    return {\n        displayName: getDisplayNameByUser(state, ownProps.user),\n    };\n}\n\nexport default connect(mapStateToProps)(PopoverListMembersItem);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {Overlay, Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {browserHistory} from 'utils/browser_history';\nimport {Constants, ModalIdentifiers} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\nimport ChannelMembersModal from 'components/channel_members_modal';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport Popover from 'components/widgets/popover';\n\nimport PopoverListMembersItem from 'components/popover_list_members/popover_list_members_item';\n\nexport default class PopoverListMembers extends React.PureComponent {\n    static propTypes = {\n        channel: PropTypes.object.isRequired,\n        statuses: PropTypes.object.isRequired,\n        users: PropTypes.array.isRequired,\n        memberCount: PropTypes.number,\n        currentUserId: PropTypes.string.isRequired,\n        teamUrl: PropTypes.string,\n        manageMembers: PropTypes.bool.isRequired,\n        actions: PropTypes.shape({\n            openModal: PropTypes.func.isRequired,\n            loadProfilesAndStatusesInChannel: PropTypes.func.isRequired,\n            openDirectChannelToUserId: PropTypes.func.isRequired,\n        }).isRequired,\n        sortedUsers: PropTypes.array,\n    };\n\n    constructor(props) {\n        super(props);\n        this.membersList = React.createRef();\n\n        this.state = {\n            showPopover: false,\n            users: props.users,\n            statuses: props.statuses,\n        };\n    }\n\n    static getDerivedStateFromProps(nextProps, prevState) {\n        if (nextProps.users !== prevState.users || nextProps.statuses !== prevState.statuses) {\n            return {\n                users: nextProps.users,\n                statuses: nextProps.statuses,\n            };\n        }\n        return null;\n    }\n\n    handleShowDirectChannel = (user) => {\n        const {actions} = this.props;\n        const teammateId = user.id;\n\n        if (teammateId) {\n            actions.openDirectChannelToUserId(teammateId).then(({data}) => {\n                if (data) {\n                    browserHistory.push(this.props.teamUrl + '/channels/' + data.name);\n                }\n                this.closePopover();\n            });\n        }\n    };\n\n    closePopover = () => {\n        this.setState({showPopover: false});\n    };\n\n    showMembersModal = (e) => {\n        e.preventDefault();\n\n        this.closePopover();\n\n        const modalData = {\n            modalId: ModalIdentifiers.CHANNEL_MEMBERS,\n            dialogProps: this.props,\n            dialogType: ChannelMembersModal,\n        };\n\n        this.props.actions.openModal(modalData);\n    };\n\n    handleGetProfilesInChannel = () => {\n        this.setState({showPopover: !this.state.showPopover});\n        this.props.actions.loadProfilesAndStatusesInChannel(this.props.channel.id, 0, undefined, 'status', {active: true});\n    };\n\n    getTargetPopover = () => {\n        this.membersList.current.focus();\n        return this.refs.member_popover_target;\n    };\n\n    render() {\n        const isDirectChannel = this.props.channel.type === Constants.DM_CHANNEL;\n\n        const items = this.props.sortedUsers.map((user) => (\n            <PopoverListMembersItem\n                key={user.id}\n                onItemClick={this.handleShowDirectChannel}\n                showMessageIcon={this.props.currentUserId !== user.id && !isDirectChannel}\n                status={this.props.statuses[user.id]}\n                user={user}\n            />\n        ));\n\n        const channelIsArchived = this.props.channel.delete_at !== 0;\n        let popoverButton;\n        if (this.props.channel.type !== Constants.GM_CHANNEL && !channelIsArchived) {\n            let membersName = (\n                <FormattedMessage\n                    id='members_popover.manageMembers'\n                    defaultMessage='Manage Members'\n                />\n            );\n\n            const isDefaultChannel = this.props.channel.name === Constants.DEFAULT_CHANNEL;\n\n            if (isDefaultChannel || !this.props.manageMembers) {\n                membersName = (\n                    <FormattedMessage\n                        id='members_popover.viewMembers'\n                        defaultMessage='View Members'\n                    />\n                );\n            }\n\n            popoverButton = (\n                <div\n                    className='more-modal__button'\n                    key={'popover-member-more'}\n                >\n                    <button\n                        className='btn btn-link'\n                        data-testid='membersModal'\n                        onClick={this.showMembersModal}\n                    >\n                        {membersName}\n                    </button>\n                </div>\n            );\n        }\n\n        const count = this.props.memberCount;\n        let countText = '-';\n        if (count > 0) {\n            countText = count.toString();\n        }\n\n        const title = (\n            <FormattedMessage\n                id='members_popover.title'\n                defaultMessage='Channel Members'\n            />\n        );\n\n        const channelMembersTooltip = (\n            <Tooltip id='channelMembersTooltip'>\n                <FormattedMessage\n                    id='channel_header.channelMembers'\n                    defaultMessage='Members'\n                />\n            </Tooltip>\n        );\n\n        const ariaLabel = `${Utils.localizeMessage('channel_header.channelMembers', 'Members')}`.toLowerCase();\n\n        return (\n            <div id='channelMember'>\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='bottom'\n                    disabled={this.state.showPopover}\n                    overlay={channelMembersTooltip}\n                >\n                    <button\n                        id='member_popover'\n                        aria-label={ariaLabel}\n                        className={'member-popover__trigger channel-header__icon channel-header__icon--left channel-header__icon--wide ' + (this.state.showPopover ? 'channel-header__icon--active' : '')}\n                        ref='member_popover_target'\n                        onClick={this.handleGetProfilesInChannel}\n                    >\n                        <div className='d-flex align-items-center'>\n                            <i\n                                aria-hidden='true'\n                                className='icon icon-account-outline channel-header__members'\n                            />\n                            <span\n                                id='channelMemberCountText'\n                                className='icon__text'\n                            >\n                                {countText}\n                            </span>\n                        </div>\n                    </button>\n                </OverlayTrigger>\n                <Overlay\n                    rootClose={true}\n                    onHide={this.closePopover}\n                    show={this.state.showPopover}\n                    target={this.getTargetPopover}\n                    placement='bottom'\n                >\n                    <Popover\n                        id='member-list-popover'\n                        className='a11y__popup member-list__popover'\n                    >\n                        <div\n                            className='more-modal__header'\n                        >\n                            {title}\n                            {this.props.channel.group_constrained && <div className='subhead'>\n                                <FormattedMessage\n                                    id='channel_header.groupConstrained'\n                                    defaultMessage='Members managed by linked groups.'\n                                />\n                            </div>}\n                        </div>\n                        <div className='more-modal__body'>\n                            <div\n                                tabIndex='-1'\n                                role='presentation'\n                                ref={this.membersList}\n                                className='more-modal__list'\n                            >\n                                {items}\n                            </div>\n                        </div>\n                        {popoverButton}\n                    </Popover>\n                </Overlay>\n            </div>\n        );\n    }\n}\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {createSelector} from 'reselect';\n\nimport {getAllChannelStats} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId, getUserStatuses, makeGetProfilesInChannel} from 'mattermost-redux/selectors/entities/users';\nimport {getTeammateNameDisplaySetting} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {openDirectChannelToUserId} from 'actions/channel_actions.jsx';\nimport {loadProfilesAndStatusesInChannel} from 'actions/user_actions.jsx';\nimport {openModal} from 'actions/views/modals';\nimport {canManageMembers} from 'utils/channel_utils.jsx';\nimport {sortUsersByStatusAndDisplayName} from 'utils/utils.jsx';\n\nimport PopoverListMembers from './popover_list_members.jsx';\n\nconst makeSortUsersByStatusAndDisplayName = (doGetProfilesInChannel) => {\n    return createSelector(\n        'makeSortUsersByStatusAndDisplayName',\n        (state, channelId) => doGetProfilesInChannel(state, channelId, true),\n        getUserStatuses,\n        getTeammateNameDisplaySetting,\n        (users, statuses, teammateNameDisplay) => sortUsersByStatusAndDisplayName(users, statuses, teammateNameDisplay),\n    );\n};\n\nfunction makeMapStateToProps() {\n    const doGetProfilesInChannel = makeGetProfilesInChannel();\n    const doSortUsersByStatusAndDisplayName = makeSortUsersByStatusAndDisplayName(doGetProfilesInChannel);\n\n    return function mapStateToProps(state, ownProps) {\n        const stats = getAllChannelStats(state)[ownProps.channel.id] || {};\n        const users = doGetProfilesInChannel(state, ownProps.channel.id, true);\n        const statuses = getUserStatuses(state);\n\n        return {\n            currentUserId: getCurrentUserId(state),\n            memberCount: stats.member_count,\n            users,\n            statuses,\n            teamUrl: getCurrentRelativeTeamUrl(state),\n            manageMembers: canManageMembers(state, ownProps.channel),\n            sortedUsers: doSortUsersByStatusAndDisplayName(state, ownProps.channel.id),\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            openModal,\n            loadProfilesAndStatusesInChannel,\n            openDirectChannelToUserId,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(PopoverListMembers);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function PluginChannelHeaderIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='16px'\n                height='16px'\n                viewBox='0 0 18 18'\n                version='1.1'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.plugins', defaultMessage: 'Plugins'})}\n            >\n                <path d='M14.58 9.14399L17.136 6.60599C17.304 6.42599 17.388 6.20999 17.388 5.95799C17.388 5.70599 17.298 5.49599 17.118 5.32799C16.95 5.14799 16.74 5.05799 16.488 5.05799C16.236 5.05799 16.026 5.14799 15.858 5.32799L13.302 7.86599L10.134 4.69799L12.672 2.14199C12.852 1.97399 12.942 1.76399 12.942 1.51199C12.942 1.25999 12.852 1.04999 12.672 0.881987C12.504 0.701987 12.294 0.611987 12.042 0.611987C11.79 0.611987 11.574 0.695987 11.394 0.863987L8.856 3.41999L6.318 0.863987C6.138 0.695987 5.922 0.611987 5.67 0.611987C5.418 0.611987 5.208 0.695987 5.04 0.863987V0.881987C4.86 1.04999 4.77 1.25999 4.77 1.51199C4.77 1.76399 4.86 1.97399 5.04 2.14199L5.67 2.78999L2.808 5.65199C2.016 6.44399 1.458 7.36799 1.134 8.42399C0.81 9.45599 0.744 10.512 0.936 11.592C1.128 12.66 1.56 13.632 2.232 14.508L0.27 16.47C0.09 16.638 0 16.848 0 17.1C0 17.352 0.09 17.562 0.27 17.73C0.45 17.898 0.66 17.982 0.9 17.982C1.152 17.994 1.362 17.91 1.53 17.73L3.492 15.768C4.368 16.44 5.34 16.872 6.408 17.064C7.488 17.256 8.544 17.19 9.576 16.866C10.632 16.542 11.556 15.984 12.348 15.192L15.21 12.33L15.858 12.96C16.026 13.14 16.236 13.23 16.488 13.23C16.74 13.23 16.95 13.14 17.118 12.96H17.136C17.304 12.792 17.388 12.582 17.388 12.33C17.388 12.078 17.304 11.862 17.136 11.682L14.58 9.14399ZM11.088 13.914C10.452 14.55 9.702 14.976 8.838 15.192C8.01 15.408 7.176 15.408 6.336 15.192C5.472 14.976 4.722 14.55 4.086 13.914C3.45 13.278 3.024 12.528 2.808 11.664C2.592 10.824 2.592 9.98999 2.808 9.16199C3.024 8.29799 3.45 7.54799 4.086 6.91199L6.948 4.04999L13.95 11.052L11.088 13.914Z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/* eslint-disable react/no-multi-comp */\n\nimport React from 'react';\nimport {Dropdown, Tooltip} from 'react-bootstrap';\nimport {RootCloseWrapper} from 'react-overlays';\nimport {FormattedMessage, injectIntl, IntlShape} from 'react-intl';\n\nimport {Channel, ChannelMembership} from 'mattermost-redux/types/channels';\nimport {Theme} from 'mattermost-redux/types/themes';\nimport {AppBinding} from 'mattermost-redux/types/apps';\nimport {AppCallResponseTypes, AppCallTypes} from 'mattermost-redux/constants/apps';\n\nimport {DoAppCall, PostEphemeralCallResponseForChannel} from 'types/apps';\n\nimport HeaderIconWrapper from 'components/channel_header/components/header_icon_wrapper';\nimport PluginChannelHeaderIcon from 'components/widgets/icons/plugin_channel_header_icon';\nimport {Constants} from 'utils/constants';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport {PluginComponent} from 'types/store/plugins';\nimport {createCallContext, createCallRequest} from 'utils/apps';\n\ntype CustomMenuProps = {\n    open?: boolean;\n    children?: React.ReactNode;\n    onClose: () => void;\n    rootCloseEvent?: 'click' | 'mousedown';\n    bsRole: string;\n}\n\nclass CustomMenu extends React.PureComponent<CustomMenuProps> {\n    handleRootClose = () => {\n        this.props.onClose();\n    }\n\n    render() {\n        const {\n            open,\n            rootCloseEvent,\n            children,\n        } = this.props;\n\n        return (\n            <RootCloseWrapper\n                disabled={!open}\n                onRootClose={this.handleRootClose}\n                event={rootCloseEvent}\n            >\n                <ul\n                    role='menu'\n                    className='dropdown-menu channel-header_plugin-dropdown'\n                >\n                    {children}\n                </ul>\n            </RootCloseWrapper>\n        );\n    }\n}\n\ntype CustomToggleProps = {\n    children?: React.ReactNode;\n    dropdownOpen?: boolean;\n    onClick?: (e: React.MouseEvent) => void;\n    bsRole: string;\n}\n\nclass CustomToggle extends React.PureComponent<CustomToggleProps> {\n    handleClick = (e: React.MouseEvent) => {\n        if (this.props.onClick) {\n            this.props.onClick(e);\n        }\n    }\n\n    render() {\n        const {children} = this.props;\n\n        let activeClass = '';\n        if (this.props.dropdownOpen) {\n            activeClass = ' channel-header__icon--active';\n        }\n\n        return (\n            <button\n                id='pluginChannelHeaderButtonDropdown'\n                className={'channel-header__icon channel-header__icon--wide ' + activeClass}\n                type='button'\n                onClick={this.handleClick}\n            >\n                {children}\n            </button>\n        );\n    }\n}\n\ntype ChannelHeaderPlugProps = {\n    intl: IntlShape;\n    components: PluginComponent[];\n    appBindings?: AppBinding[];\n    appsEnabled: boolean;\n    channel: Channel;\n    channelMember: ChannelMembership;\n    theme: Theme;\n    actions: {\n        doAppCall: DoAppCall;\n        postEphemeralCallResponseForChannel: PostEphemeralCallResponseForChannel;\n    };\n}\n\ntype ChannelHeaderPlugState = {\n    dropdownOpen: boolean;\n}\n\nclass ChannelHeaderPlug extends React.PureComponent<ChannelHeaderPlugProps, ChannelHeaderPlugState> {\n    public static defaultProps: Partial<ChannelHeaderPlugProps> = {\n        components: [],\n        appBindings: [],\n    }\n\n    constructor(props: ChannelHeaderPlugProps) {\n        super(props);\n        this.state = {\n            dropdownOpen: false,\n        };\n    }\n\n    toggleDropdown = (dropdownOpen: boolean) => {\n        this.setState({dropdownOpen});\n    }\n\n    onClose = () => {\n        this.toggleDropdown(false);\n    }\n\n    fireActionAndClose = (action: (channel: Channel, channelMember: ChannelMembership) => void) => {\n        action(this.props.channel, this.props.channelMember);\n        this.onClose();\n    }\n\n    createComponentButton = (plug: PluginComponent) => {\n        return (\n            <HeaderIconWrapper\n                key={'channelHeaderButton' + plug.id}\n                buttonClass='channel-header__icon'\n                iconComponent={plug.icon!}\n                onClick={() => plug.action!(this.props.channel, this.props.channelMember)}\n                buttonId={plug.id}\n                tooltipKey={'plugin'}\n                tooltipText={plug.tooltipText ? plug.tooltipText : plug.dropdownText}\n            />\n        );\n    }\n\n    onBindingClick = async (binding: AppBinding) => {\n        const {channel, intl} = this.props;\n\n        if (!binding.call) {\n            return;\n        }\n\n        const context = createCallContext(\n            binding.app_id,\n            binding.location,\n            this.props.channel.id,\n            this.props.channel.team_id,\n        );\n        const call = createCallRequest(binding.call, context);\n        const res = await this.props.actions.doAppCall(call, AppCallTypes.SUBMIT, intl);\n\n        if (res.error) {\n            const errorResponse = res.error;\n            const errorMessage = errorResponse.error || intl.formatMessage({\n                id: 'apps.error.unknown',\n                defaultMessage: 'Unknown error occurred.',\n            });\n            this.props.actions.postEphemeralCallResponseForChannel(errorResponse, errorMessage, channel.id);\n            return;\n        }\n\n        const callResp = res.data!;\n        switch (callResp.type) {\n        case AppCallResponseTypes.OK:\n            if (callResp.markdown) {\n                this.props.actions.postEphemeralCallResponseForChannel(callResp, callResp.markdown, channel.id);\n            }\n            break;\n        case AppCallResponseTypes.NAVIGATE:\n        case AppCallResponseTypes.FORM:\n            break;\n        default: {\n            const errorMessage = this.props.intl.formatMessage({\n                id: 'apps.error.responses.unknown_type',\n                defaultMessage: 'App response type not supported. Response type: {type}.',\n            }, {\n                type: callResp.type,\n            });\n            this.props.actions.postEphemeralCallResponseForChannel(callResp, errorMessage, channel.id);\n        }\n        }\n    }\n\n    createAppBindingButton = (binding: AppBinding) => {\n        return (\n            <HeaderIconWrapper\n                key={`channelHeaderButton_${binding.app_id}_${binding.location}`}\n                buttonClass='channel-header__icon style--none'\n                iconComponent={(\n                    <img\n                        src={binding.icon}\n                        width='24'\n                        height='24'\n                    />\n                )}\n                onClick={() => this.onBindingClick(binding)}\n                buttonId={binding.location || ''}\n                tooltipKey={'plugin'}\n                tooltipText={binding.label}\n            />\n        );\n    }\n\n    createDropdown = (plugs: PluginComponent[], appBindings: AppBinding[]) => {\n        const componentItems = plugs.filter((plug) => plug.action).map((plug) => {\n            return (\n                <li\n                    key={'channelHeaderPlug' + plug.id}\n                >\n                    <a\n                        href='#'\n                        className='d-flex align-items-center'\n                        onClick={() => this.fireActionAndClose(plug.action!)}\n                    >\n                        <span className='d-flex align-items-center overflow--ellipsis'>{plug.icon}</span>\n                        <span>{plug.dropdownText}</span>\n                    </a>\n                </li>\n            );\n        });\n\n        let items = componentItems;\n        if (this.props.appsEnabled) {\n            items = componentItems.concat(appBindings.filter((binding) => binding.call).map((binding) => {\n                return (\n                    <li\n                        key={'channelHeaderPlug' + binding.app_id + binding.location}\n                    >\n                        <a\n                            href='#'\n                            className='d-flex align-items-center'\n                            onClick={() => this.fireActionAndClose(() => this.onBindingClick(binding))}\n                        >\n                            <span className='d-flex align-items-center overflow--ellipsis icon'>{(<img src={binding.icon}/>)}</span>\n                            <span>{binding.label}</span>\n                        </a>\n                    </li>\n                );\n            }));\n        }\n\n        return (\n            <div className='flex-child'>\n                <Dropdown\n                    id='channelHeaderPlugDropdown'\n                    onToggle={this.toggleDropdown}\n                    open={this.state.dropdownOpen}\n                >\n                    <CustomToggle\n                        bsRole='toggle'\n                        dropdownOpen={this.state.dropdownOpen}\n                    >\n                        <OverlayTrigger\n                            delayShow={Constants.OVERLAY_TIME_DELAY}\n                            placement='bottom'\n                            overlay={this.state.dropdownOpen ? <></> : (\n                                <Tooltip id='removeIcon'>\n                                    <div aria-hidden={true}>\n                                        <FormattedMessage\n                                            id='generic_icons.plugins'\n                                            defaultMessage='Plugins'\n                                        />\n                                    </div>\n                                </Tooltip>\n                            )}\n                        >\n                            <React.Fragment>\n                                <PluginChannelHeaderIcon\n                                    id='pluginChannelHeaderIcon'\n                                    className='icon icon--standard icon__pluginChannelHeader'\n                                    aria-hidden='true'\n                                />\n                                <span\n                                    id='pluginCount'\n                                    className='icon__text'\n                                >\n                                    {items.length}\n                                </span>\n                            </React.Fragment>\n                        </OverlayTrigger>\n                    </CustomToggle>\n                    <CustomMenu\n                        bsRole='menu'\n                        open={this.state.dropdownOpen}\n                        onClose={this.onClose}\n                    >\n                        {items}\n                    </CustomMenu>\n                </Dropdown>\n            </div>\n        );\n    }\n\n    render() {\n        const components = this.props.components || [];\n        const appBindings = this.props.appsEnabled ? this.props.appBindings || [] : [];\n        if (components.length === 0 && appBindings.length === 0) {\n            return null;\n        } else if ((components.length + appBindings.length) <= 15) {\n            let componentButtons = components.filter((plug) => plug.icon && plug.action).map(this.createComponentButton);\n            if (this.props.appsEnabled) {\n                componentButtons = componentButtons.concat(appBindings.map(this.createAppBindingButton));\n            }\n            return componentButtons;\n        }\n\n        return this.createDropdown(components, appBindings);\n    }\n}\n\nexport default injectIntl(ChannelHeaderPlug);\n/* eslint-enable react/no-multi-comp */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\nimport {appsEnabled, makeAppBindingsSelector} from 'mattermost-redux/selectors/entities/apps';\nimport {AppBindingLocations} from 'mattermost-redux/constants/apps';\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\n\nimport {DoAppCall, PostEphemeralCallResponseForChannel} from 'types/apps';\n\nimport {doAppCall, postEphemeralCallResponseForChannel} from 'actions/apps';\nimport {GlobalState} from 'types/store';\n\nimport ChannelHeaderPlug from './channel_header_plug';\n\nconst getChannelHeaderBindings = makeAppBindingsSelector(AppBindingLocations.CHANNEL_HEADER_ICON);\n\nfunction mapStateToProps(state: GlobalState) {\n    const apps = appsEnabled(state);\n    return {\n        components: state.plugins.components.ChannelHeaderButton,\n        appBindings: getChannelHeaderBindings(state),\n        appsEnabled: apps,\n        theme: getTheme(state),\n    };\n}\n\ntype Actions = {\n    doAppCall: DoAppCall;\n    postEphemeralCallResponseForChannel: PostEphemeralCallResponseForChannel;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            doAppCall,\n            postEphemeralCallResponseForChannel,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelHeaderPlug);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {Tooltip, Overlay} from 'react-bootstrap';\nimport {FormattedMessage, injectIntl} from 'react-intl';\nimport classNames from 'classnames';\n\nimport {Permissions} from 'mattermost-redux/constants';\nimport {memoizeResult} from 'mattermost-redux/utils/helpers';\nimport {displayUsername} from 'mattermost-redux/utils/user_utils';\n\nimport 'bootstrap';\n\nimport EditChannelHeaderModal from 'components/edit_channel_header_modal';\nimport Markdown from 'components/markdown';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport PopoverListMembers from 'components/popover_list_members';\nimport StatusIcon from 'components/status_icon';\nimport ArchiveIcon from 'components/widgets/icons/archive_icon';\nimport SharedChannelIndicator from 'components/shared_channel_indicator';\nimport ChannelPermissionGate from 'components/permissions_gates/channel_permission_gate';\nimport {ChannelHeaderDropdown} from 'components/channel_header_dropdown';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport GuestBadge from 'components/widgets/badges/guest_badge';\nimport BotBadge from 'components/widgets/badges/bot_badge';\nimport Popover from 'components/widgets/popover';\nimport RHSSearchNav from 'components/rhs_search_nav';\n\nimport {\n    Constants,\n    ModalIdentifiers,\n    NotificationLevels,\n    RHSStates,\n} from 'utils/constants';\nimport {intlShape} from 'utils/react_intl';\nimport * as Utils from 'utils/utils';\n\nimport ChannelHeaderPlug from 'plugins/channel_header_plug';\n\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\nimport CustomStatusText from 'components/custom_status/custom_status_text';\n\nimport HeaderIconWrapper from './components/header_icon_wrapper';\n\nconst headerMarkdownOptions = {singleline: true, mentionHighlight: false, atMentions: true};\nconst popoverMarkdownOptions = {singleline: false, mentionHighlight: false, atMentions: true};\n\nclass ChannelHeader extends React.PureComponent {\n    static propTypes = {\n        teamId: PropTypes.string.isRequired,\n        currentUser: PropTypes.object.isRequired,\n        channel: PropTypes.object,\n        channelMember: PropTypes.object,\n        dmUser: PropTypes.object,\n        gmMembers: PropTypes.array,\n        isFavorite: PropTypes.bool,\n        isReadOnly: PropTypes.bool,\n        isMuted: PropTypes.bool,\n        hasGuests: PropTypes.bool,\n        rhsState: PropTypes.oneOf(\n            Object.values(RHSStates),\n        ),\n        rhsOpen: PropTypes.bool,\n        isQuickSwitcherOpen: PropTypes.bool,\n        intl: intlShape.isRequired,\n        pinnedPostsCount: PropTypes.number,\n        hasMoreThanOneTeam: PropTypes.bool,\n        globalHeaderEnabled: PropTypes.bool,\n        actions: PropTypes.shape({\n            favoriteChannel: PropTypes.func.isRequired,\n            unfavoriteChannel: PropTypes.func.isRequired,\n            showFlaggedPosts: PropTypes.func.isRequired,\n            showPinnedPosts: PropTypes.func.isRequired,\n            showChannelFiles: PropTypes.func.isRequired,\n            showMentions: PropTypes.func.isRequired,\n            closeRightHandSide: PropTypes.func.isRequired,\n            getCustomEmojisInText: PropTypes.func.isRequired,\n            updateChannelNotifyProps: PropTypes.func.isRequired,\n            goToLastViewedChannel: PropTypes.func.isRequired,\n            openModal: PropTypes.func.isRequired,\n            closeModal: PropTypes.func.isRequired,\n        }).isRequired,\n        teammateNameDisplaySetting: PropTypes.string.isRequired,\n        currentRelativeTeamUrl: PropTypes.string.isRequired,\n        announcementBarCount: PropTypes.number,\n        customStatus: PropTypes.object,\n        isCustomStatusEnabled: PropTypes.bool.isRequired,\n        isCustomStatusExpired: PropTypes.bool.isRequired,\n    };\n\n    constructor(props) {\n        super(props);\n        this.toggleFavoriteRef = React.createRef();\n        this.headerDescriptionRef = React.createRef();\n        this.headerPopoverTextMeasurerRef = React.createRef();\n        this.headerOverlayRef = React.createRef();\n\n        this.state = {\n            popoverOverlayWidth: 0,\n            showChannelHeaderPopover: false,\n            leftOffset: 0,\n            topOffset: 0,\n            titleMenuOpen: false,\n        };\n\n        this.getHeaderMarkdownOptions = memoizeResult((channelNamesMap) => (\n            {...headerMarkdownOptions, channelNamesMap}\n        ));\n        this.getPopoverMarkdownOptions = memoizeResult((channelNamesMap) => (\n            {...popoverMarkdownOptions, channelNamesMap}\n        ));\n    }\n\n    componentDidMount() {\n        this.props.actions.getCustomEmojisInText(this.props.channel ? this.props.channel.header : '');\n    }\n\n    componentDidUpdate(prevProps) {\n        const header = this.props.channel ? this.props.channel.header : '';\n        const prevHeader = prevProps.channel ? prevProps.channel.header : '';\n        if (header !== prevHeader) {\n            this.props.actions.getCustomEmojisInText(header);\n        }\n    }\n\n    handleClose = () => {\n        this.props.actions.goToLastViewedChannel();\n    };\n\n    toggleFavorite = (e) => {\n        e.stopPropagation();\n        if (this.props.isFavorite) {\n            this.props.actions.unfavoriteChannel(this.props.channel.id);\n        } else {\n            this.props.actions.favoriteChannel(this.props.channel.id);\n        }\n    };\n\n    unmute = () => {\n        const {actions, channel, channelMember, currentUser} = this.props;\n\n        if (!channelMember || !currentUser || !channel) {\n            return;\n        }\n\n        const options = {mark_unread: NotificationLevels.ALL};\n        actions.updateChannelNotifyProps(currentUser.id, channel.id, options);\n    };\n\n    mute = () => {\n        const {actions, channel, channelMember, currentUser} = this.props;\n\n        if (!channelMember || !currentUser || !channel) {\n            return;\n        }\n\n        const options = {mark_unread: NotificationLevels.MENTION};\n        actions.updateChannelNotifyProps(currentUser.id, channel.id, options);\n    };\n\n    showPinnedPosts = (e) => {\n        e.preventDefault();\n        if (this.props.rhsState === RHSStates.PIN) {\n            this.props.actions.closeRightHandSide();\n        } else {\n            this.props.actions.showPinnedPosts();\n        }\n    };\n\n    showChannelFiles = () => {\n        if (this.props.rhsState === RHSStates.CHANNEL_FILES) {\n            this.props.actions.closeRightHandSide();\n        } else {\n            this.props.actions.showChannelFiles(this.props.channel.id);\n        }\n    };\n\n    removeTooltipLink = () => {\n        // Bootstrap adds the attr dynamically, removing it to prevent a11y readout\n        this.toggleFavoriteRef.current.removeAttribute('aria-describedby');\n    }\n\n    setTitleMenuOpen = (open) => {\n        this.setState({titleMenuOpen: open});\n    }\n\n    showEditChannelHeaderModal = () => {\n        if (this.headerOverlayRef.current) {\n            this.headerOverlayRef.current.hide();\n        }\n\n        const {actions, channel} = this.props;\n        const modalData = {\n            modalId: ModalIdentifiers.EDIT_CHANNEL_HEADER,\n            dialogType: EditChannelHeaderModal,\n            dialogProps: {channel},\n        };\n\n        actions.openModal(modalData);\n    }\n\n    showChannelHeaderPopover = (headerText) => {\n        const headerDescriptionRect = this.headerDescriptionRef.current.getBoundingClientRect();\n        const headerPopoverTextMeasurerRect = this.headerPopoverTextMeasurerRef.current.getBoundingClientRect();\n        const announcementBarSize = 40;\n        if (headerPopoverTextMeasurerRect.width > headerDescriptionRect.width || headerText.match(/\\n{2,}/g)) {\n            this.setState({showChannelHeaderPopover: true, leftOffset: this.headerDescriptionRef.current.offsetLeft});\n        }\n\n        const globalHeaderOffset = this.props.globalHeaderEnabled ? 40 : 0;\n        const topOffset = (announcementBarSize * this.props.announcementBarCount) + globalHeaderOffset;\n\n        this.setState({topOffset});\n    }\n\n    setPopoverOverlayWidth = () => {\n        const headerDescriptionRect = this.headerDescriptionRef.current.getBoundingClientRect();\n        const ellipsisWidthAdjustment = 10;\n        this.setState({popoverOverlayWidth: headerDescriptionRect.width + ellipsisWidthAdjustment});\n    }\n\n    handleFormattedTextClick = (e) => Utils.handleFormattedTextClick(e, this.props.currentRelativeTeamUrl);\n\n    renderCustomStatus = () => {\n        const {customStatus, isCustomStatusEnabled, isCustomStatusExpired} = this.props;\n        const isStatusSet = !isCustomStatusExpired && (customStatus?.text || customStatus?.emoji);\n        if (!(isCustomStatusEnabled && isStatusSet)) {\n            return null;\n        }\n\n        return (\n            <>\n                <CustomStatusEmoji\n                    userID={this.props.dmUser.id}\n                    showTooltip={true}\n                    tooltipDirection='bottom'\n                    emojiStyle={{\n                        verticalAlign: 'top',\n                        margin: '0 4px 1px',\n                    }}\n                />\n                <CustomStatusText\n                    text={customStatus.text}\n                />\n            </>\n        );\n    }\n\n    render() {\n        const {\n            teamId,\n            currentUser,\n            gmMembers,\n            channel,\n            channelMember,\n            isMuted: channelMuted,\n            isReadOnly,\n            isFavorite,\n            dmUser,\n            rhsState,\n            hasGuests,\n            teammateNameDisplaySetting,\n            globalHeaderEnabled,\n        } = this.props;\n        const {formatMessage} = this.props.intl;\n        const ariaLabelChannelHeader = Utils.localizeMessage('accessibility.sections.channelHeader', 'channel header region');\n\n        let hasGuestsText = '';\n        if (hasGuests) {\n            hasGuestsText = (\n                <span className='has-guest-header'>\n                    <FormattedMessage\n                        id='channel_header.channelHasGuests'\n                        defaultMessage='This channel has guests'\n                    />\n                </span>\n            );\n        }\n\n        const channelIsArchived = channel.delete_at !== 0;\n        if (Utils.isEmptyObject(channel) ||\n            Utils.isEmptyObject(channelMember) ||\n            Utils.isEmptyObject(currentUser) ||\n            (!dmUser && channel.type === Constants.DM_CHANNEL)\n        ) {\n            // Use an empty div to make sure the header's height stays constant\n            return (\n                <div className='channel-header'/>\n            );\n        }\n\n        const channelNamesMap = channel.props && channel.props.channel_mentions;\n\n        let channelTitle = channel.display_name;\n        let archivedIcon = null;\n        if (channelIsArchived) {\n            archivedIcon = (<ArchiveIcon className='icon icon__archive icon channel-header-archived-icon svg-text-color'/>);\n        }\n        let sharedIcon = null;\n        if (channel.shared) {\n            sharedIcon = (\n                <SharedChannelIndicator\n                    className='shared-channel-icon'\n                    channelType={channel.type}\n                    withTooltip={true}\n                />\n            );\n        }\n        const isDirect = (channel.type === Constants.DM_CHANNEL);\n        const isGroup = (channel.type === Constants.GM_CHANNEL);\n        const isPrivate = (channel.type === Constants.PRIVATE_CHANNEL);\n\n        if (isDirect) {\n            const teammateId = dmUser.id;\n            if (currentUser.id === teammateId) {\n                channelTitle = (\n                    <FormattedMessage\n                        id='channel_header.directchannel.you'\n                        defaultMessage='{displayname} (you) '\n                        values={{\n                            displayname: displayUsername(dmUser, teammateNameDisplaySetting),\n                        }}\n                    />\n                );\n            } else {\n                channelTitle = displayUsername(dmUser, teammateNameDisplaySetting) + ' ';\n            }\n            channelTitle = (\n                <React.Fragment>\n                    {channelTitle}\n                    <GuestBadge show={Utils.isGuest(dmUser)}/>\n                </React.Fragment>\n            );\n        }\n\n        if (isGroup) {\n            // map the displayname to the gm member users\n            const membersMap = {};\n            for (const user of gmMembers) {\n                if (user.id === currentUser.id) {\n                    continue;\n                }\n                const userDisplayName = displayUsername(user, this.props.teammateNameDisplaySetting);\n\n                if (!membersMap[userDisplayName]) {\n                    membersMap[userDisplayName] = []; //Create an array for cases with same display name\n                }\n\n                membersMap[userDisplayName].push(user);\n            }\n\n            const displayNames = channel.display_name.split(', ');\n\n            channelTitle = displayNames.map((displayName, index) => {\n                if (!membersMap[displayName]) {\n                    return displayName;\n                }\n\n                const user = membersMap[displayName].shift();\n\n                return (\n                    <React.Fragment key={user.id}>\n                        {index > 0 && ', '}\n                        {displayName}\n                        <GuestBadge show={Utils.isGuest(user)}/>\n                    </React.Fragment>\n                );\n            });\n\n            if (hasGuests) {\n                hasGuestsText = (\n                    <span className='has-guest-header'>\n                        <FormattedMessage\n                            id='channel_header.groupMessageHasGuests'\n                            defaultMessage='This group message has guests'\n                        />\n                    </span>\n                );\n            }\n        }\n\n        let popoverListMembers;\n        if (!isDirect) {\n            popoverListMembers = (\n                <PopoverListMembers\n                    channel={channel}\n                />\n            );\n        }\n\n        let dmHeaderIconStatus;\n        let dmHeaderTextStatus;\n        if (isDirect && !dmUser.delete_at && !dmUser.is_bot) {\n            dmHeaderIconStatus = (\n                <StatusIcon\n                    status={channel.status}\n                />\n            );\n\n            dmHeaderTextStatus = (\n                <span className='header-status__text'>\n                    <FormattedMessage\n                        id={`status_dropdown.set_${channel.status}`}\n                        defaultMessage={Utils.toTitleCase(channel.status)}\n                    />\n                    {this.renderCustomStatus()}\n                </span>\n            );\n        }\n\n        let channelFilesIconClass = 'channel-header__icon channel-header__icon--wide channel-header__icon--left';\n        if (rhsState === RHSStates.CHANNEL_FILES) {\n            channelFilesIconClass += ' channel-header__icon--active';\n        }\n        const channelFilesIcon = <i className='icon icon-file-text-outline'/>;\n\n        let pinnedIconClass = 'channel-header__icon channel-header__icon--wide channel-header__icon--left';\n        if (rhsState === RHSStates.PIN) {\n            pinnedIconClass += ' channel-header__icon--active';\n        }\n        const pinnedIcon = this.props.pinnedPostsCount ? (\n            <>\n                <i\n                    aria-hidden='true'\n                    className='icon icon-pin-outline channel-header__pin'\n                />\n                <span\n                    id='channelPinnedPostCountText'\n                    className='icon__text'\n                >\n                    {this.props.pinnedPostsCount}\n                </span>\n            </>\n        ) : (\n            <i\n                aria-hidden='true'\n                className='icon icon-pin-outline channel-header__pin'\n            />\n        );\n\n        let headerTextContainer;\n        const headerText = (isDirect && dmUser.is_bot) ? dmUser.bot_description : channel.header;\n        if (headerText) {\n            const popoverContent = (\n                <Popover\n                    id='header-popover'\n                    popoverStyle='info'\n                    popoverSize='lg'\n                    style={{maxWidth: `${this.state.popoverOverlayWidth}px`, transform: `translate(${this.state.leftOffset}px, ${this.state.topOffset}px)`}}\n                    placement='bottom'\n                    className={classNames('channel-header__popover', {'chanel-header__popover--lhs_offset': this.props.hasMoreThanOneTeam})}\n                >\n                    <span\n                        onClick={this.handleFormattedTextClick}\n                    >\n                        <Markdown\n                            message={headerText}\n                            options={this.getPopoverMarkdownOptions(channelNamesMap)}\n                        />\n                    </span>\n                </Popover>\n            );\n\n            headerTextContainer = (\n                <div\n                    id='channelHeaderDescription'\n                    className='channel-header__description'\n                    dir='auto'\n                >\n                    {dmHeaderIconStatus}\n                    {dmHeaderTextStatus}\n                    {popoverListMembers}\n                    <HeaderIconWrapper\n                        iconComponent={pinnedIcon}\n                        ariaLabel={true}\n                        buttonClass={pinnedIconClass}\n                        buttonId={'channelHeaderPinButton'}\n                        onClick={this.showPinnedPosts}\n                        tooltipKey={'pinnedPosts'}\n                    />\n                    <HeaderIconWrapper\n                        iconComponent={channelFilesIcon}\n                        ariaLabel={true}\n                        buttonClass={channelFilesIconClass}\n                        buttonId={'channelHeaderFilesButton'}\n                        onClick={this.showChannelFiles}\n                        tooltipKey={'channelFiles'}\n                    />\n                    {hasGuestsText}\n                    <div\n                        className='header-popover-text-measurer'\n                        ref={this.headerPopoverTextMeasurerRef}\n                    >\n                        <Markdown\n                            message={headerText.replace(/\\n+/g, ' ')}\n                            options={this.getHeaderMarkdownOptions(channelNamesMap)}\n                        /></div>\n                    <span\n                        className='header-description__text'\n                        onClick={this.handleFormattedTextClick}\n                        onMouseOver={() => this.showChannelHeaderPopover(headerText)}\n                        onMouseOut={() => this.setState({showChannelHeaderPopover: false})}\n                        ref={this.headerDescriptionRef}\n                    >\n\n                        <Overlay\n                            show={this.state.showChannelHeaderPopover}\n                            placement='bottom'\n                            rootClose={true}\n                            target={this.headerDescriptionRef.current}\n                            ref={this.headerOverlayRef}\n                            onEnter={this.setPopoverOverlayWidth}\n                            onHide={() => this.setState({showChannelHeaderPopover: false})}\n                        >{popoverContent}</Overlay>\n\n                        <Markdown\n                            message={headerText}\n                            options={this.getHeaderMarkdownOptions(channelNamesMap)}\n                        />\n                    </span>\n                </div>\n            );\n        } else {\n            let editMessage;\n            if (!isReadOnly && !channelIsArchived) {\n                if (isDirect || isGroup) {\n                    if (!isDirect || !dmUser.is_bot) {\n                        editMessage = (\n                            <button\n                                className='header-placeholder style--none'\n                                onClick={this.showEditChannelHeaderModal}\n                            >\n                                <FormattedMessage\n                                    id='channel_header.addChannelHeader'\n                                    defaultMessage='Add a channel description'\n                                />\n                                <FormattedMessage\n                                    id='channel_header.editLink'\n                                    defaultMessage='Edit'\n                                >\n                                    {(message) => (\n                                        <i\n                                            aria-label={message}\n                                            className='icon icon-pencil-outline edit-icon'\n                                        />\n                                    )}\n                                </FormattedMessage>\n                            </button>\n                        );\n                    }\n                } else {\n                    editMessage = (\n                        <ChannelPermissionGate\n                            channelId={channel.id}\n                            teamId={teamId}\n                            permissions={[isPrivate ? Permissions.MANAGE_PRIVATE_CHANNEL_PROPERTIES : Permissions.MANAGE_PUBLIC_CHANNEL_PROPERTIES]}\n                        >\n                            <button\n                                className='header-placeholder style--none'\n                                onClick={this.showEditChannelHeaderModal}\n                            >\n                                <FormattedMessage\n                                    id='channel_header.addChannelHeader'\n                                    defaultMessage='Add a channel description'\n                                />\n                                <FormattedMessage\n                                    id='channel_header.editLink'\n                                    defaultMessage='Edit'\n                                >\n                                    {(message) => (\n                                        <i\n                                            aria-label={message}\n                                            className='icon icon-pencil-outline edit-icon'\n                                        />\n                                    )}\n                                </FormattedMessage>\n                            </button>\n                        </ChannelPermissionGate>\n                    );\n                }\n            }\n            headerTextContainer = (\n                <div\n                    id='channelHeaderDescription'\n                    className='channel-header__description light'\n                >\n                    {dmHeaderIconStatus}\n                    {dmHeaderTextStatus}\n                    {popoverListMembers}\n                    <HeaderIconWrapper\n                        iconComponent={pinnedIcon}\n                        ariaLabel={true}\n                        buttonClass={pinnedIconClass}\n                        buttonId={'channelHeaderPinButton'}\n                        onClick={this.showPinnedPosts}\n                        tooltipKey={'pinnedPosts'}\n                    />\n                    <HeaderIconWrapper\n                        iconComponent={channelFilesIcon}\n                        ariaLabel={true}\n                        buttonClass={channelFilesIconClass}\n                        buttonId={'channelHeaderFilesButton'}\n                        onClick={this.showChannelFiles}\n                        tooltipKey={'channelFiles'}\n                    />\n                    {hasGuestsText}\n                    {editMessage}\n                </div>\n            );\n        }\n\n        let toggleFavoriteTooltip;\n        let toggleFavorite = null;\n        let ariaLabel = '';\n\n        if (!channelIsArchived) {\n            const formattedMessage = isFavorite ? {\n                id: 'channelHeader.removeFromFavorites',\n                defaultMessage: 'Remove from Favorites',\n            } : {\n                id: 'channelHeader.addToFavorites',\n                defaultMessage: 'Add to Favorites',\n            };\n\n            ariaLabel = formatMessage(formattedMessage).toLowerCase();\n            toggleFavoriteTooltip = (\n                <Tooltip id='favoriteTooltip' >\n                    <FormattedMessage\n                        {...formattedMessage}\n                    />\n                </Tooltip>\n            );\n\n            toggleFavorite = (\n                <OverlayTrigger\n                    key={`isFavorite-${isFavorite}`}\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='bottom'\n                    overlay={toggleFavoriteTooltip}\n                    onEntering={this.removeTooltipLink}\n                >\n                    <button\n                        id='toggleFavorite'\n                        ref={this.toggleFavoriteRef}\n                        onClick={this.toggleFavorite}\n                        className={'style--none color--link channel-header__favorites ' + (this.props.isFavorite ? 'active' : 'inactive')}\n                        aria-label={ariaLabel}\n                    >\n                        <i className={'icon ' + (this.props.isFavorite ? 'icon-star' : 'icon-star-outline')}/>\n                    </button>\n                </OverlayTrigger>\n            );\n        }\n\n        const channelMutedTooltip = (\n            <Tooltip id='channelMutedTooltip'>\n                <FormattedMessage\n                    id='channelHeader.unmute'\n                    defaultMessage='Unmute'\n                />\n            </Tooltip>\n        );\n\n        let muteTrigger;\n        if (channelMuted) {\n            muteTrigger = (\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='bottom'\n                    overlay={channelMutedTooltip}\n                >\n                    <button\n                        id='toggleMute'\n                        onClick={this.unmute}\n                        className={'style--none color--link channel-header__mute inactive'}\n                        aria-label={formatMessage({id: 'generic_icons.muted', defaultMessage: 'Muted Icon'})}\n                    >\n                        <i className={'icon icon-bell-off-outline'}/>\n                    </button>\n                </OverlayTrigger>\n            );\n        }\n\n        let title = (\n            <React.Fragment>\n                <MenuWrapper onToggle={this.setTitleMenuOpen}>\n                    <div\n                        id='channelHeaderDropdownButton'\n                        className='channel-header__top'\n                    >\n                        <button\n                            className={`channel-header__trigger style--none ${this.state.titleMenuOpen ? 'active' : ''}`}\n                            aria-label={formatMessage({id: 'channel_header.menuAriaLabel', defaultMessage: 'Channel Menu'}).toLowerCase()}\n                        >\n                            <strong\n                                role='heading'\n                                aria-level='2'\n                                id='channelHeaderTitle'\n                                className='heading'\n                            >\n                                <span>\n                                    {archivedIcon}\n                                    {channelTitle}\n                                    {sharedIcon}\n                                </span>\n                            </strong>\n                            <span\n                                id='channelHeaderDropdownIcon'\n                                className='icon icon-chevron-down header-dropdown-chevron-icon'\n                                aria-label={formatMessage({id: 'generic_icons.dropdown', defaultMessage: 'Dropdown Icon'}).toLowerCase()}\n                            />\n                        </button>\n                    </div>\n                    <ChannelHeaderDropdown/>\n                </MenuWrapper>\n                {toggleFavorite}\n            </React.Fragment>\n        );\n        if (isDirect && dmUser.is_bot) {\n            title = (\n                <div\n                    id='channelHeaderDropdownButton'\n                    className='channel-header__top channel-header__bot'\n                >\n                    <strong\n                        role='heading'\n                        aria-level='2'\n                        id='channelHeaderTitle'\n                        className='heading'\n                    >\n                        <span>\n                            {archivedIcon}\n                            {channelTitle}\n                        </span>\n                    </strong>\n                    <BotBadge className='badge-popoverlist'/>\n                    {toggleFavorite}\n                </div>\n            );\n        }\n\n        return (\n            <div\n                id='channel-header'\n                aria-label={ariaLabelChannelHeader}\n                role='banner'\n                tabIndex='-1'\n                data-channelid={`${channel.id}`}\n                className='channel-header alt a11y__region'\n                data-a11y-sort-order='8'\n            >\n                <div className='flex-parent'>\n                    <div className='flex-child'>\n                        <div\n                            id='channelHeaderInfo'\n                            className='channel-header__info'\n                        >\n                            <div\n                                className='channel-header__title dropdown'\n                            >\n                                <div>\n                                    {title}\n                                </div>\n                                {muteTrigger}\n                            </div>\n                            {headerTextContainer}\n                        </div>\n                    </div>\n                    <ChannelHeaderPlug\n                        channel={channel}\n                        channelMember={channelMember}\n                    />\n                    {!globalHeaderEnabled && <RHSSearchNav/>}\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default injectIntl(ChannelHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators} from 'redux';\nimport {connect} from 'react-redux';\nimport {withRouter} from 'react-router-dom';\n\nimport {\n    favoriteChannel,\n    unfavoriteChannel,\n    updateChannelNotifyProps,\n} from 'mattermost-redux/actions/channels';\nimport {getCustomEmojisInText} from 'mattermost-redux/actions/emojis';\nimport {General} from 'mattermost-redux/constants';\nimport {\n    getCurrentChannel,\n    getMyCurrentChannelMembership,\n    isCurrentChannelFavorite,\n    isCurrentChannelMuted,\n    getCurrentChannelStats,\n} from 'mattermost-redux/selectors/entities/channels';\nimport {getTeammateNameDisplaySetting} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentRelativeTeamUrl, getCurrentTeamId, getMyTeams} from 'mattermost-redux/selectors/entities/teams';\nimport {\n    getCurrentUser,\n    getUser,\n    makeGetProfilesInChannel,\n} from 'mattermost-redux/selectors/entities/users';\nimport {getUserIdFromChannelName} from 'mattermost-redux/utils/channel_utils';\n\nimport {goToLastViewedChannel} from 'actions/views/channel';\nimport {openModal, closeModal} from 'actions/views/modals';\nimport {\n    showFlaggedPosts,\n    showPinnedPosts,\n    showChannelFiles,\n    showMentions,\n    closeRightHandSide,\n} from 'actions/views/rhs';\nimport {getGlobalHeaderEnabled} from 'selectors/global_header';\nimport {makeGetCustomStatus, isCustomStatusEnabled, isCustomStatusExpired} from 'selectors/views/custom_status';\nimport {getIsRhsOpen, getRhsState} from 'selectors/rhs';\nimport {isModalOpen} from 'selectors/views/modals';\nimport {getAnnouncementBarCount} from 'selectors/views/announcement_bar';\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport ChannelHeader from './channel_header';\n\nfunction makeMapStateToProps() {\n    const doGetProfilesInChannel = makeGetProfilesInChannel();\n    const getCustomStatus = makeGetCustomStatus();\n\n    return function mapStateToProps(state) {\n        const channel = getCurrentChannel(state) || {};\n        const user = getCurrentUser(state);\n        const teams = getMyTeams(state);\n        const hasMoreThanOneTeam = teams.length > 1;\n\n        let dmUser;\n        let gmMembers;\n        let customStatus;\n        if (channel && channel.type === General.DM_CHANNEL) {\n            const dmUserId = getUserIdFromChannelName(user.id, channel.name);\n            dmUser = getUser(state, dmUserId);\n            customStatus = dmUser && getCustomStatus(state, dmUser.id);\n        } else if (channel && channel.type === General.GM_CHANNEL) {\n            gmMembers = doGetProfilesInChannel(state, channel.id, false);\n        }\n        const stats = getCurrentChannelStats(state) || {member_count: 0, guest_count: 0, pinnedpost_count: 0};\n\n        return {\n            teamId: getCurrentTeamId(state),\n            channel,\n            channelMember: getMyCurrentChannelMembership(state),\n            currentUser: user,\n            dmUser,\n            gmMembers,\n            rhsState: getRhsState(state),\n            rhsOpen: getIsRhsOpen(state),\n            isFavorite: isCurrentChannelFavorite(state),\n            isReadOnly: false,\n            isMuted: isCurrentChannelMuted(state),\n            isQuickSwitcherOpen: isModalOpen(state, ModalIdentifiers.QUICK_SWITCH),\n            hasGuests: stats.guest_count > 0,\n            pinnedPostsCount: stats.pinnedpost_count,\n            hasMoreThanOneTeam,\n            teammateNameDisplaySetting: getTeammateNameDisplaySetting(state),\n            currentRelativeTeamUrl: getCurrentRelativeTeamUrl(state),\n            announcementBarCount: getAnnouncementBarCount(state),\n            customStatus,\n            isCustomStatusEnabled: isCustomStatusEnabled(state),\n            isCustomStatusExpired: isCustomStatusExpired(state, customStatus),\n            globalHeaderEnabled: getGlobalHeaderEnabled(state),\n        };\n    };\n}\n\nconst mapDispatchToProps = (dispatch) => ({\n    actions: bindActionCreators({\n        favoriteChannel,\n        unfavoriteChannel,\n        showFlaggedPosts,\n        showPinnedPosts,\n        showChannelFiles,\n        showMentions,\n        closeRightHandSide,\n        getCustomEmojisInText,\n        updateChannelNotifyProps,\n        goToLastViewedChannel,\n        openModal,\n        closeModal,\n    }, dispatch),\n});\n\nexport default withRouter(connect(makeMapStateToProps, mapDispatchToProps)(ChannelHeader));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function CameraIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const intl = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='14px'\n                height='10px'\n                viewBox='0 0 16 12'\n                role='img'\n                aria-label={intl.formatMessage({id: 'generic_icons.camera', defaultMessage: 'Camera Icon'})}\n            >\n                <g\n                    stroke='none'\n                    strokeWidth='1'\n                    fill='inherit'\n                    fillRule='evenodd'\n                >\n                    <g\n                        transform='translate(-696.000000, -34.000000)'\n                        fillRule='nonzero'\n                        fill='inherit'\n                    >\n                        <g transform='translate(-1.000000, 0.000000)'>\n                            <g transform='translate(687.000000, 22.000000)'>\n                                <g transform='translate(10.000000, 12.000000)'>\n                                    <path d='M15.105,1.447 L12,3 L12,1 C12,0.447 11.553,0 11,0 L1,0 C0.447,0 0,0.447 0,1 L0,11 C0,11.553 0.447,12 1,12 L11,12 C11.553,12 12,11.553 12,11 L12,9 L15.105,10.553 C15.6,10.8 16,10.553 16,10 L16,2 C16,1.447 15.6,1.2 15.105,1.447 Z M12.895,7.211 C12.612,7.07 12.306,7 12,7 L10.5,7 C10.224,7 10,7.224 10,7.5 L10,10 L2,10 L2,2 L10,2 L10,4.5 C10,4.776 10.224,5 10.5,5 L12,5 C12.306,5 12.612,4.93 12.895,4.789 L14,4.236 L14,7.763 L12.895,7.211 Z'/>\n                                </g>\n                            </g>\n                        </g>\n                    </g>\n                </g>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {injectIntl, IntlShape} from 'react-intl';\n\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport Menu from 'components/widgets/menu/menu';\nimport CameraIcon from 'components/widgets/icons/camera_icon';\n\nimport {Channel, ChannelMembership} from 'mattermost-redux/types/channels';\nimport {PluginComponent} from 'types/store/plugins';\n\nconst customStyles: React.CSSProperties = {\n    left: 'inherit',\n    right: 0,\n    bottom: '100%',\n    top: 'auto',\n};\n\ntype Props = {\n    currentChannel: Channel;\n    channelMember?: ChannelMembership;\n    intl: IntlShape;\n    locale: string;\n    pluginCallMethods: PluginComponent[];\n}\n\nfunction CallButton(props: Props) {\n    const {formatMessage} = props.intl;\n\n    let bodyAction;\n\n    if (props.pluginCallMethods.length === 0) {\n        bodyAction = null;\n    } else if (props.pluginCallMethods.length === 1) {\n        const item = props.pluginCallMethods[0];\n        bodyAction = (\n            <button\n                type='button'\n                className='style--none post-action icon icon--attachment'\n                onClick={() => {\n                    if (item.action) {\n                        item.action(props.currentChannel, props.channelMember);\n                    }\n                }}\n                onTouchEnd={() => {\n                    if (item.action) {\n                        item.action(props.currentChannel, props.channelMember);\n                    }\n                }}\n            >\n                {item.icon}\n            </button>\n        );\n    } else {\n        const pluginCallMethods = props.pluginCallMethods.map((item) => {\n            return (\n                <li\n                    key={item.id}\n                    onClick={(e) => {\n                        e.preventDefault();\n                        if (item.action) {\n                            item.action(props.currentChannel, props.channelMember);\n                        }\n                    }}\n                >\n                    <a href='#'>\n                        <span className='call-plugin-icon'>\n                            {item.icon}\n                        </span>\n                        {item.dropdownText}\n                    </a>\n                </li>\n            );\n        });\n        bodyAction = (\n            <MenuWrapper>\n                <button\n                    type='button'\n                    className='style--none post-action'\n                >\n                    <div\n                        className='icon icon--attachment'\n                    >\n                        <CameraIcon className='d-flex'/>\n                    </div>\n                </button>\n                <Menu\n                    id='callOptions'\n                    openLeft={true}\n                    openUp={true}\n                    ariaLabel={formatMessage({id: 'call_button.menuAriaLabel', defaultMessage: 'Call type selector'})}\n                    customStyles={customStyles}\n                >\n                    {pluginCallMethods}\n                </Menu>\n            </MenuWrapper>\n        );\n    }\n\n    return bodyAction;\n}\n\nCallButton.defaultProps = {\n    pluginCallMethods: [],\n};\n\nconst wrappedComponent = injectIntl(CallButton);\nwrappedComponent.displayName = 'injectIntl(CallButton)';\nexport default wrappedComponent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentChannel, getMyCurrentChannelMembership} from 'mattermost-redux/selectors/entities/channels';\n\nimport {getCurrentLocale} from 'selectors/i18n';\nimport {GlobalState} from 'types/store/index';\n\nimport CallButton from './call_button';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        currentChannel: getCurrentChannel(state),\n        locale: getCurrentLocale(state),\n        pluginCallMethods: state.plugins.components.CallButton,\n        channelMember: getMyCurrentChannelMembership(state),\n    };\n}\n\nexport default connect(mapStateToProps)(CallButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/* eslint-disable max-lines */\n\nimport React from 'react';\nimport classNames from 'classnames';\nimport {FormattedMessage, injectIntl, IntlShape} from 'react-intl';\n\nimport {Posts} from 'mattermost-redux/constants';\nimport {sortFileInfos} from 'mattermost-redux/utils/file_utils';\n\nimport * as GlobalActions from 'actions/global_actions';\nimport Constants, {StoragePrefixes, ModalIdentifiers, Locations, A11yClassNames} from 'utils/constants';\nimport {t} from 'utils/i18n';\nimport {\n    containsAtChannel,\n    postMessageOnKeyPress,\n    shouldFocusMainTextbox,\n    isErrorInvalidSlashCommand,\n    splitMessageBasedOnCaretPosition,\n    groupsMentionedInText,\n} from 'utils/post_utils';\nimport {getTable, formatMarkdownTableMessage, formatGithubCodePaste, isGitHubCodeBlock} from 'utils/paste';\nimport * as UserAgent from 'utils/user_agent';\nimport * as Utils from 'utils/utils.jsx';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport EditChannelHeaderModal from 'components/edit_channel_header_modal';\nimport EditChannelPurposeModal from 'components/edit_channel_purpose_modal';\nimport EmojiPickerOverlay from 'components/emoji_picker/emoji_picker_overlay.jsx';\nimport FilePreview from 'components/file_preview';\nimport FileUpload from 'components/file_upload';\nimport {FileUpload as FileUploadClass} from 'components/file_upload/file_upload';\nimport CallButton from 'components/call_button';\nimport LocalizedIcon from 'components/localized_icon';\nimport MsgTyping from 'components/msg_typing';\nimport PostDeletedModal from 'components/post_deleted_modal';\nimport ResetStatusModal from 'components/reset_status_modal';\nimport EmojiIcon from 'components/widgets/icons/emoji_icon';\nimport Textbox from 'components/textbox';\nimport TextboxClass from 'components/textbox/textbox';\nimport TextboxLinks from 'components/textbox/textbox_links';\nimport TutorialTip from 'components/tutorial/tutorial_tip';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message.jsx';\nimport MessageSubmitError from 'components/message_submit_error';\nimport {Channel, ChannelMemberCountsByGroup} from 'mattermost-redux/types/channels';\nimport {PostDraft} from 'types/store/rhs';\nimport {Post, PostMetadata} from 'mattermost-redux/types/posts';\nimport EmojiMap from 'utils/emoji_map';\nimport {ActionResult} from 'mattermost-redux/types/actions';\nimport {ServerError} from 'mattermost-redux/types/errors';\nimport {CommandArgs} from 'mattermost-redux/types/integrations';\nimport {Group} from 'mattermost-redux/types/groups';\nimport {ModalData} from 'types/actions';\nimport {FileInfo} from 'mattermost-redux/types/files';\nimport {Emoji} from 'mattermost-redux/types/emojis';\nimport {FilePreviewInfo} from 'components/file_preview/file_preview';\n\nconst KeyCodes = Constants.KeyCodes;\n\nconst CreatePostDraftTimeoutMilliseconds = 500;\n\n// Temporary fix for IE-11, see MM-13423\nfunction trimRight(str: string) {\n    if (String.prototype.trimRight as any) {\n        return str.trimRight();\n    }\n\n    return str.replace(/\\s*$/, '');\n}\n\ntype Props = {\n\n    /**\n         *  ref passed from channelView for EmojiPickerOverlay\n         */\n    getChannelView?: () => void;\n\n    /**\n  *  Data used in notifying user for @all and @channel\n  */\n    currentChannelMembersCount: number;\n\n    /**\n  *  Data used in multiple places of the component\n  */\n    currentChannel: Channel;\n\n    /**\n  *  Data used in executing commands for channel actions passed down to client4 function\n  */\n    currentTeamId: string;\n\n    /**\n  *  Data used for posting message\n  */\n    currentUserId: string;\n\n    /**\n  * Force message submission on CTRL/CMD + ENTER\n  */\n    codeBlockOnCtrlEnter?: boolean;\n\n    /**\n  *  Flag used for handling submit\n  */\n    ctrlSend?: boolean;\n\n    /**\n  *  Flag used for adding a class center to Postbox based on user pref\n  */\n    fullWidthTextBox?: boolean;\n\n    /**\n  *  Data used for deciding if tutorial tip is to be shown\n  */\n    showTutorialTip: boolean;\n\n    /**\n  *  Data used populating message state when triggered by shortcuts\n  */\n    messageInHistoryItem?: string;\n\n    /**\n  *  Data used for populating message state from previous draft\n  */\n    draft: PostDraft;\n\n    /**\n  *  Data used dispatching handleViewAction ex: edit post\n  */\n    latestReplyablePostId?: string;\n    locale: string;\n\n    /**\n  *  Data used for calling edit of post\n  */\n    currentUsersLatestPost?: Post | null;\n\n    /**\n  * Whether or not file upload is allowed.\n  */\n    canUploadFiles: boolean;\n\n    /**\n  * Whether to show the emoji picker.\n  */\n    enableEmojiPicker: boolean;\n\n    /**\n  * Whether to show the gif picker.\n  */\n    enableGifPicker: boolean;\n\n    /**\n  * Whether to check with the user before notifying the whole channel.\n  */\n    enableConfirmNotificationsToChannel: boolean;\n\n    /**\n  * The maximum length of a post\n  */\n    maxPostSize: number;\n    emojiMap: EmojiMap;\n\n    /**\n  * If our connection is bad\n  */\n    badConnection: boolean;\n\n    /**\n  * Whether to display a confirmation modal to reset status.\n  */\n    userIsOutOfOffice: boolean;\n    rhsExpanded: boolean;\n\n    /**\n  * To check if the timezones are enable on the server.\n  */\n    isTimezoneEnabled: boolean;\n\n    canPost: boolean;\n\n    /**\n  * To determine if the current user can send special channel mentions\n  */\n    useChannelMentions: boolean;\n\n    intl: IntlShape;\n\n    /**\n  * Should preview be showed\n  */\n    shouldShowPreview: boolean;\n\n    actions: {\n\n        /**\n      * Set show preview for textbox\n      */\n        setShowPreview: (showPreview: boolean) => void;\n\n        /**\n      *  func called after message submit.\n      */\n        addMessageIntoHistory: (message: string) => void;\n\n        /**\n      *  func called for navigation through messages by Up arrow\n      */\n        moveHistoryIndexBack: (index: string) => Promise<void>;\n\n        /**\n      *  func called for navigation through messages by Down arrow\n      */\n        moveHistoryIndexForward: (index: string) => Promise<void>;\n\n        /**\n      *  func called for adding a reaction\n      */\n        addReaction: (postId: string, emojiName: string) => void;\n\n        /**\n      *  func called for posting message\n      */\n        onSubmitPost: (post: Post, fileInfos: FileInfo[]) => void;\n\n        /**\n      *  func called for removing a reaction\n      */\n        removeReaction: (postId: string, emojiName: string) => void;\n\n        /**\n      *  func called on load of component to clear drafts\n      */\n        clearDraftUploads: (prefix: string, action: (key: string, value?: PostDraft) => PostDraft | undefined) => void;\n\n        /**\n      * hooks called before a message is sent to the server\n      */\n        runMessageWillBePostedHooks: (originalPost: Post) => ActionResult;\n\n        /**\n      * hooks called before a slash command is sent to the server\n      */\n        runSlashCommandWillBePostedHooks: (originalMessage: string, originalArgs: CommandArgs) => ActionResult;\n\n        /**\n      *  func called for setting drafts\n      */\n        setDraft: (name: string, value: PostDraft | null) => void;\n\n        /**\n      *  func called for editing posts\n      */\n        setEditingPost: (postId?: string, refocusId?: string, title?: string, isRHS?: boolean) => void;\n\n        /**\n      *  func called for opening the last replayable post in the RHS\n      */\n        selectPostFromRightHandSideSearchByPostId: (postId: string) => void;\n\n        /**\n      * Function to open a modal\n      */\n        openModal: (modalData: ModalData) => void;\n\n        executeCommand: (message: string, args: CommandArgs) => ActionResult;\n\n        /**\n      * Function to get the users timezones in the channel\n      */\n        getChannelTimezones: (channelId: string) => ActionResult;\n        scrollPostListToBottom: () => void;\n\n        /**\n      * Function to set or unset emoji picker for last message\n      */\n        emitShortcutReactToLastPostFrom: (emittedFrom: string) => void;\n\n        getChannelMemberCountsByGroup: (channelId: string, includeTimezones: boolean) => void;\n    };\n\n    groupsWithAllowReference: Map<string, Group> | null;\n    channelMemberCountsByGroup: ChannelMemberCountsByGroup;\n    useGroupMentions: boolean;\n}\n\ntype State = {\n    message: string;\n    caretPosition: number;\n    submitting: boolean;\n    showPostDeletedModal: boolean;\n    showEmojiPicker: boolean;\n    showConfirmModal: boolean;\n    channelTimezoneCount: number;\n    uploadsProgressPercent: {[clientID: string]: FilePreviewInfo};\n    renderScrollbar: boolean;\n    scrollbarWidth: number;\n    currentChannel: Channel;\n    mentions: string[];\n    memberNotifyCount: number;\n    errorClass: string | null;\n    serverError: (ServerError & {submittedMessage?: string}) | null;\n    postError?: React.ReactNode;\n}\n\nclass CreatePost extends React.PureComponent<Props, State> {\n    static defaultProps = {\n        latestReplyablePostId: '',\n    }\n\n    private lastBlurAt = 0;\n    private lastChannelSwitchAt = 0;\n    private draftsForChannel: {[channelID: string]: PostDraft | null} = {}\n    private lastOrientation?: string;\n    private saveDraftFrame?: number | null;\n\n    private topDiv: React.RefObject<HTMLFormElement>;\n    private textboxRef: React.RefObject<TextboxClass>;\n    private fileUploadRef: React.RefObject<FileUploadClass>;\n    private createPostControlsRef: React.RefObject<HTMLSpanElement>;\n\n    static getDerivedStateFromProps(props: Props, state: State): Partial<State> {\n        let updatedState: Partial<State> = {currentChannel: props.currentChannel};\n        if (props.currentChannel.id !== state.currentChannel.id) {\n            updatedState = {\n                ...updatedState,\n                message: props.draft.message,\n                submitting: false,\n                serverError: null,\n            };\n        }\n        return updatedState;\n    }\n\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            message: this.props.draft.message,\n            caretPosition: this.props.draft.message.length,\n            submitting: false,\n            showPostDeletedModal: false,\n            showEmojiPicker: false,\n            showConfirmModal: false,\n            channelTimezoneCount: 0,\n            uploadsProgressPercent: {},\n            renderScrollbar: false,\n            scrollbarWidth: 0,\n            currentChannel: props.currentChannel,\n            mentions: [],\n            memberNotifyCount: 0,\n            errorClass: null,\n            serverError: null,\n        };\n\n        this.topDiv = React.createRef<HTMLFormElement>();\n        this.textboxRef = React.createRef<TextboxClass>();\n        this.fileUploadRef = React.createRef<FileUploadClass>();\n        this.createPostControlsRef = React.createRef<HTMLSpanElement>();\n    }\n\n    componentDidMount() {\n        const {useGroupMentions, currentChannel, isTimezoneEnabled, actions} = this.props;\n        this.onOrientationChange();\n        actions.setShowPreview(false);\n        actions.clearDraftUploads(StoragePrefixes.DRAFT, (key, value) => {\n            if (value) {\n                return {...value, uploadsInProgress: []};\n            }\n            return value;\n        });\n        this.focusTextbox();\n        document.addEventListener('paste', this.pasteHandler);\n        document.addEventListener('keydown', this.documentKeyHandler);\n        window.addEventListener('beforeunload', this.unloadHandler);\n        this.setOrientationListeners();\n\n        if (useGroupMentions) {\n            actions.getChannelMemberCountsByGroup(currentChannel.id, isTimezoneEnabled);\n        }\n    }\n\n    componentDidUpdate(prevProps: Props, prevState: State) {\n        const {useGroupMentions, currentChannel, isTimezoneEnabled, actions} = this.props;\n        if (prevProps.currentChannel.id !== currentChannel.id) {\n            this.lastChannelSwitchAt = Date.now();\n            this.focusTextbox();\n            this.saveDraft(prevProps);\n            if (useGroupMentions) {\n                actions.getChannelMemberCountsByGroup(currentChannel.id, isTimezoneEnabled);\n            }\n        }\n\n        if (currentChannel.id !== prevProps.currentChannel.id) {\n            actions.setShowPreview(false);\n        }\n\n        // Focus on textbox when emoji picker is closed\n        if (prevState.showEmojiPicker && !this.state.showEmojiPicker) {\n            this.focusTextbox();\n        }\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('paste', this.pasteHandler);\n        document.removeEventListener('keydown', this.documentKeyHandler);\n        window.addEventListener('beforeunload', this.unloadHandler);\n        this.removeOrientationListeners();\n        this.saveDraft();\n    }\n\n    unloadHandler = () => {\n        this.saveDraft();\n    }\n\n    saveDraft = (props = this.props) => {\n        if (this.saveDraftFrame && props.currentChannel) {\n            const channelId = props.currentChannel.id;\n            props.actions.setDraft(StoragePrefixes.DRAFT + channelId, this.draftsForChannel[channelId]);\n            clearTimeout(this.saveDraftFrame);\n            this.saveDraftFrame = null;\n        }\n    }\n\n    setShowPreview = (newPreviewValue: boolean) => {\n        this.props.actions.setShowPreview(newPreviewValue);\n    }\n\n    setOrientationListeners = () => {\n        if ((window.screen.orientation) && ('onchange' in window.screen.orientation)) {\n            window.screen.orientation.addEventListener('change', this.onOrientationChange);\n        } else if ('onorientationchange' in window) {\n            window.addEventListener('orientationchange', this.onOrientationChange);\n        }\n    };\n\n    removeOrientationListeners = () => {\n        if ((window.screen.orientation) && ('onchange' in window.screen.orientation)) {\n            window.screen.orientation.removeEventListener('change', this.onOrientationChange);\n        } else if ('onorientationchange' in window) {\n            window.removeEventListener('orientationchange', this.onOrientationChange);\n        }\n    };\n\n    onOrientationChange = () => {\n        if (!UserAgent.isIosWeb()) {\n            return;\n        }\n\n        const LANDSCAPE_ANGLE = 90;\n        let orientation = 'portrait';\n        if (window.orientation) {\n            orientation = Math.abs(window.orientation as number) === LANDSCAPE_ANGLE ? 'landscape' : 'portrait';\n        }\n\n        if (window.screen.orientation) {\n            orientation = window.screen.orientation.type.split('-')[0];\n        }\n\n        if (this.lastOrientation && orientation !== this.lastOrientation && (document.activeElement || {}).id === 'post_textbox') {\n            this.textboxRef.current?.blur();\n        }\n\n        this.lastOrientation = orientation;\n    }\n\n    handlePostError = (postError: React.ReactNode) => {\n        this.setState({postError});\n    }\n\n    toggleEmojiPicker = () => {\n        this.setState({showEmojiPicker: !this.state.showEmojiPicker});\n    }\n\n    hideEmojiPicker = () => {\n        this.handleEmojiClose();\n    }\n\n    doSubmit = async (e?: React.FormEvent) => {\n        const channelId = this.props.currentChannel.id;\n        if (e) {\n            e.preventDefault();\n        }\n\n        if (this.props.draft.uploadsInProgress.length > 0 || this.state.submitting) {\n            return;\n        }\n\n        let message = this.state.message;\n        let ignoreSlash = false;\n        const serverError = this.state.serverError;\n\n        if (serverError && isErrorInvalidSlashCommand(serverError) && serverError.submittedMessage === message) {\n            message = serverError.submittedMessage;\n            ignoreSlash = true;\n        }\n\n        const post = {} as Post;\n        post.file_ids = [];\n        post.message = message;\n\n        if (post.message.trim().length === 0 && this.props.draft.fileInfos.length === 0) {\n            return;\n        }\n\n        if (this.state.postError) {\n            this.setState({errorClass: 'animation--highlight'});\n            setTimeout(() => {\n                this.setState({errorClass: null});\n            }, Constants.ANIMATION_TIMEOUT);\n            return;\n        }\n\n        this.props.actions.addMessageIntoHistory(this.state.message);\n\n        this.setState({submitting: true, serverError: null});\n\n        const fasterThanHumanWillClick = 150;\n        const forceFocus = (Date.now() - this.lastBlurAt < fasterThanHumanWillClick);\n        this.focusTextbox(forceFocus);\n\n        const isReaction = Utils.REACTION_PATTERN.exec(post.message);\n        if (post.message.indexOf('/') === 0 && !ignoreSlash) {\n            this.setState({message: '', postError: null});\n            let args: CommandArgs = {\n                channel_id: channelId,\n                team_id: this.props.currentTeamId,\n            };\n\n            const hookResult = await this.props.actions.runSlashCommandWillBePostedHooks(post.message, args);\n\n            if (hookResult.error) {\n                this.setState({\n                    serverError: {\n                        ...hookResult.error,\n                        submittedMessage: post.message,\n                    },\n                    message: post.message,\n                });\n            } else if (!hookResult.data.message && !hookResult.data.args) {\n                // do nothing with an empty return from a hook\n            } else {\n                post.message = hookResult.data.message;\n                args = hookResult.data.args;\n\n                const {error} = await this.props.actions.executeCommand(post.message, args);\n\n                if (error) {\n                    if (error.sendMessage) {\n                        await this.sendMessage(post);\n                    } else {\n                        this.setState({\n                            serverError: {\n                                ...error,\n                                submittedMessage: post.message,\n                            },\n                            message: post.message,\n                        });\n                    }\n                }\n            }\n        } else if (isReaction && this.props.emojiMap.has(isReaction[2])) {\n            this.sendReaction(isReaction);\n\n            this.setState({message: ''});\n        } else {\n            const {error} = await this.sendMessage(post);\n\n            if (!error) {\n                this.setState({message: ''});\n            }\n        }\n\n        this.setState({\n            submitting: false,\n            postError: null,\n        });\n\n        if (this.saveDraftFrame) {\n            clearTimeout(this.saveDraftFrame);\n        }\n\n        this.props.actions.setDraft(StoragePrefixes.DRAFT + channelId, null);\n        this.draftsForChannel[channelId] = null;\n    }\n\n    handleNotifyAllConfirmation = () => {\n        this.hideNotifyAllModal();\n        this.doSubmit();\n    }\n\n    hideNotifyAllModal = () => {\n        this.setState({showConfirmModal: false});\n    }\n\n    showNotifyAllModal = () => {\n        this.setState({showConfirmModal: true});\n    }\n\n    getStatusFromSlashCommand = () => {\n        const {message} = this.state;\n        const tokens = message.split(' ');\n\n        if (tokens.length > 0) {\n            return tokens[0].substring(1);\n        }\n        return '';\n    };\n\n    isStatusSlashCommand = (command: string) => {\n        return command === 'online' || command === 'away' ||\n            command === 'dnd' || command === 'offline';\n    };\n\n    handleSubmit = async (e: React.FormEvent) => {\n        const {\n            currentChannel: updateChannel,\n            userIsOutOfOffice,\n            groupsWithAllowReference,\n            channelMemberCountsByGroup,\n            currentChannelMembersCount,\n            useGroupMentions,\n        } = this.props;\n\n        const notificationsToChannel = this.props.enableConfirmNotificationsToChannel && this.props.useChannelMentions;\n        let memberNotifyCount = 0;\n        let channelTimezoneCount = 0;\n        let mentions: string[] = [];\n        const notContainsAtChannel = !containsAtChannel(this.state.message);\n        if (this.props.enableConfirmNotificationsToChannel && notContainsAtChannel && useGroupMentions) {\n            // Groups mentioned in users text\n            const mentionGroups = groupsMentionedInText(this.state.message, groupsWithAllowReference);\n            if (mentionGroups.length > 0) {\n                mentions = mentionGroups.\n                    map((group) => {\n                        const mappedValue = channelMemberCountsByGroup[group.id];\n                        if (mappedValue && mappedValue.channel_member_count > Constants.NOTIFY_ALL_MEMBERS && mappedValue.channel_member_count > memberNotifyCount) {\n                            memberNotifyCount = mappedValue.channel_member_count;\n                            channelTimezoneCount = mappedValue.channel_member_timezones_count;\n                        }\n                        return `@${group.name}`;\n                    });\n                mentions = [...new Set(mentions)];\n            }\n        }\n\n        if (notificationsToChannel &&\n            currentChannelMembersCount > Constants.NOTIFY_ALL_MEMBERS &&\n            !notContainsAtChannel) {\n            memberNotifyCount = currentChannelMembersCount - 1;\n            mentions = ['@all', '@channel'];\n            if (this.props.isTimezoneEnabled) {\n                const {data} = await this.props.actions.getChannelTimezones(this.props.currentChannel.id);\n                channelTimezoneCount = data ? data.length : 0;\n            }\n        }\n\n        if (memberNotifyCount > 0) {\n            this.setState({\n                channelTimezoneCount,\n                memberNotifyCount,\n                mentions,\n            });\n            this.showNotifyAllModal();\n            return;\n        }\n\n        const status = this.getStatusFromSlashCommand();\n        if (userIsOutOfOffice && this.isStatusSlashCommand(status)) {\n            const resetStatusModalData = {\n                modalId: ModalIdentifiers.RESET_STATUS,\n                dialogType: ResetStatusModal as any,\n                dialogProps: {newStatus: status},\n            };\n\n            this.props.actions.openModal(resetStatusModalData);\n\n            this.setState({message: ''});\n            return;\n        }\n\n        if (trimRight(this.state.message) === '/header') {\n            const editChannelHeaderModalData = {\n                modalId: ModalIdentifiers.EDIT_CHANNEL_HEADER,\n                dialogType: EditChannelHeaderModal as any,\n                dialogProps: {channel: updateChannel},\n            };\n\n            this.props.actions.openModal(editChannelHeaderModalData);\n\n            this.setState({message: ''});\n            return;\n        }\n\n        const isDirectOrGroup = ((updateChannel.type === Constants.DM_CHANNEL) || (updateChannel.type === Constants.GM_CHANNEL));\n        if (!isDirectOrGroup && trimRight(this.state.message) === '/purpose') {\n            const editChannelPurposeModalData = {\n                modalId: ModalIdentifiers.EDIT_CHANNEL_PURPOSE,\n                dialogType: EditChannelPurposeModal as any,\n                dialogProps: {channel: updateChannel},\n            };\n\n            this.props.actions.openModal(editChannelPurposeModalData);\n\n            this.setState({message: ''});\n            return;\n        }\n\n        if (!isDirectOrGroup && trimRight(this.state.message) === '/rename') {\n            GlobalActions.showChannelNameUpdateModal(updateChannel);\n            this.setState({message: ''});\n            return;\n        }\n\n        await this.doSubmit(e);\n    }\n\n    sendMessage = async (originalPost: Post) => {\n        const {\n            actions,\n            currentChannel,\n            currentUserId,\n            draft,\n            useGroupMentions,\n            useChannelMentions,\n            groupsWithAllowReference,\n        } = this.props;\n\n        let post = originalPost;\n\n        post.channel_id = currentChannel.id;\n\n        const time = Utils.getTimestamp();\n        const userId = currentUserId;\n        post.pending_post_id = `${userId}:${time}`;\n        post.user_id = userId;\n        post.create_at = time;\n        post.metadata = {} as PostMetadata;\n        post.props = {};\n        if (!useChannelMentions && containsAtChannel(post.message, {checkAllMentions: true})) {\n            post.props.mentionHighlightDisabled = true;\n        }\n        if (!useGroupMentions && groupsMentionedInText(post.message, groupsWithAllowReference)) {\n            post.props.disable_group_highlight = true;\n        }\n\n        const hookResult = await actions.runMessageWillBePostedHooks(post);\n\n        if (hookResult.error) {\n            this.setState({\n                serverError: hookResult.error,\n                submitting: false,\n            });\n\n            return hookResult;\n        }\n\n        post = hookResult.data;\n\n        actions.onSubmitPost(post, draft.fileInfos);\n        actions.scrollPostListToBottom();\n\n        this.setState({\n            submitting: false,\n        });\n\n        return {data: true};\n    }\n\n    sendReaction(isReaction: RegExpExecArray) {\n        const channelId = this.props.currentChannel.id;\n        const action = isReaction[1];\n        const emojiName = isReaction[2];\n        const postId = this.props.latestReplyablePostId;\n\n        if (postId && action === '+') {\n            this.props.actions.addReaction(postId, emojiName);\n        } else if (postId && action === '-') {\n            this.props.actions.removeReaction(postId, emojiName);\n        }\n\n        this.props.actions.setDraft(StoragePrefixes.DRAFT + channelId, null);\n        this.draftsForChannel[channelId] = null;\n    }\n\n    focusTextbox = (keepFocus = false) => {\n        const postTextboxDisabled = !this.props.canPost;\n        if (this.textboxRef.current && postTextboxDisabled) {\n            this.textboxRef.current.blur(); // Fixes Firefox bug which causes keyboard shortcuts to be ignored (MM-22482)\n            return;\n        }\n        if (this.textboxRef.current && (keepFocus || !UserAgent.isMobile())) {\n            this.textboxRef.current.focus();\n        }\n    }\n\n    postMsgKeyPress = (e: React.KeyboardEvent<Element>) => {\n        const {ctrlSend, codeBlockOnCtrlEnter} = this.props;\n\n        const {\n            allowSending,\n            withClosedCodeBlock,\n            ignoreKeyPress,\n            message,\n        } = postMessageOnKeyPress(\n            e,\n            this.state.message,\n            Boolean(ctrlSend),\n            Boolean(codeBlockOnCtrlEnter),\n            Date.now(),\n            this.lastChannelSwitchAt,\n            this.state.caretPosition,\n        ) as {\n            allowSending: boolean;\n            withClosedCodeBlock?: boolean;\n            ignoreKeyPress?: boolean;\n            message?: string;\n        };\n\n        if (ignoreKeyPress) {\n            e.preventDefault();\n            e.stopPropagation();\n            return;\n        }\n\n        if (allowSending) {\n            if (e.persist) {\n                e.persist();\n            }\n            if (this.textboxRef.current) {\n                this.textboxRef.current.blur();\n            }\n\n            if (withClosedCodeBlock && message) {\n                this.setState({message}, () => this.handleSubmit(e));\n            } else {\n                this.handleSubmit(e);\n            }\n\n            this.setShowPreview(false);\n        }\n\n        this.emitTypingEvent();\n    }\n\n    emitTypingEvent = () => {\n        const channelId = this.props.currentChannel.id;\n        GlobalActions.emitLocalUserTypingEvent(channelId, '');\n    }\n\n    handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n        const message = e.target.value;\n        const channelId = this.props.currentChannel.id;\n\n        let serverError = this.state.serverError;\n        if (isErrorInvalidSlashCommand(serverError)) {\n            serverError = null;\n        }\n\n        this.setState({\n            message,\n            serverError,\n        });\n\n        const draft = {\n            ...this.props.draft,\n            message,\n        };\n        if (this.saveDraftFrame) {\n            clearTimeout(this.saveDraftFrame);\n        }\n\n        this.saveDraftFrame = window.setTimeout(() => {\n            this.props.actions.setDraft(StoragePrefixes.DRAFT + channelId, draft);\n        }, CreatePostDraftTimeoutMilliseconds);\n        this.draftsForChannel[channelId] = draft;\n    }\n\n    pasteHandler = (e: ClipboardEvent) => {\n        if (!e.clipboardData || !e.clipboardData.items || (e.target && (e.target as any).id !== 'post_textbox')) {\n            return;\n        }\n\n        const {clipboardData} = e;\n        let table = getTable(clipboardData);\n        if (!table) {\n            return;\n        }\n        table = table as HTMLTableElement;\n\n        e.preventDefault();\n\n        let message = this.state.message;\n        if (isGitHubCodeBlock(table.className)) {\n            const {formattedMessage, formattedCodeBlock} = formatGithubCodePaste(this.state.caretPosition, message, clipboardData);\n            const newCaretPosition = this.state.caretPosition + formattedCodeBlock.length;\n            this.setMessageAndCaretPostion(formattedMessage, newCaretPosition);\n            return;\n        }\n\n        const originalSize = message.length;\n        message = formatMarkdownTableMessage(table, message.trim(), this.state.caretPosition);\n        const newCaretPosition = message.length - (originalSize - this.state.caretPosition);\n        this.setMessageAndCaretPostion(message, newCaretPosition);\n    }\n\n    handleFileUploadChange = () => {\n        this.focusTextbox();\n    }\n\n    handleUploadStart = (clientIds: string[], channelId: string) => {\n        const uploadsInProgress = [\n            ...this.props.draft.uploadsInProgress,\n            ...clientIds,\n        ];\n\n        const draft = {\n            ...this.props.draft,\n            uploadsInProgress,\n        };\n\n        this.props.actions.setDraft(StoragePrefixes.DRAFT + channelId, draft);\n        this.draftsForChannel[channelId] = draft;\n\n        // this is a bit redundant with the code that sets focus when the file input is clicked,\n        // but this also resets the focus after a drag and drop\n        this.focusTextbox();\n    }\n\n    handleUploadProgress = (filePreviewInfo: FilePreviewInfo) => {\n        const uploadsProgressPercent = {...this.state.uploadsProgressPercent, [filePreviewInfo.clientId]: filePreviewInfo};\n        this.setState({uploadsProgressPercent});\n    }\n\n    handleFileUploadComplete = (fileInfos: FileInfo[], clientIds: string[], channelId: string) => {\n        const draft = {...this.draftsForChannel[channelId]!};\n\n        // remove each finished file from uploads\n        for (let i = 0; i < clientIds.length; i++) {\n            if (draft.uploadsInProgress) {\n                const index = draft.uploadsInProgress.indexOf(clientIds[i]);\n\n                if (index !== -1) {\n                    draft.uploadsInProgress = draft.uploadsInProgress.filter((item, itemIndex) => index !== itemIndex);\n                }\n            }\n        }\n\n        if (draft.fileInfos) {\n            draft.fileInfos = sortFileInfos(draft.fileInfos.concat(fileInfos), this.props.locale);\n        }\n\n        this.draftsForChannel[channelId] = draft;\n        this.props.actions.setDraft(StoragePrefixes.DRAFT + channelId, draft);\n    }\n\n    handleUploadError = (err: string | ServerError, clientId: string, channelId: string) => {\n        const draft = {...this.draftsForChannel[channelId]!};\n\n        let serverError = err;\n        if (typeof serverError === 'string') {\n            serverError = new Error(serverError);\n        }\n\n        if (draft.uploadsInProgress) {\n            const index = draft.uploadsInProgress.indexOf(clientId);\n\n            if (index !== -1) {\n                const uploadsInProgress = draft.uploadsInProgress.filter((item, itemIndex) => index !== itemIndex);\n                const modifiedDraft = {\n                    ...draft,\n                    uploadsInProgress,\n                };\n                this.props.actions.setDraft(StoragePrefixes.DRAFT + channelId, modifiedDraft);\n                this.draftsForChannel[channelId] = modifiedDraft;\n            }\n        }\n\n        this.setState({serverError});\n    }\n\n    removePreview = (id: string) => {\n        let modifiedDraft = {} as PostDraft;\n        const draft = {...this.props.draft};\n        const channelId = this.props.currentChannel.id;\n\n        // Clear previous errors\n        this.setState({serverError: null});\n\n        // id can either be the id of an uploaded file or the client id of an in progress upload\n        let index = draft.fileInfos.findIndex((info) => info.id === id);\n        if (index === -1) {\n            index = draft.uploadsInProgress.indexOf(id);\n\n            if (index !== -1) {\n                const uploadsInProgress = draft.uploadsInProgress.filter((item, itemIndex) => index !== itemIndex);\n\n                modifiedDraft = {\n                    ...draft,\n                    uploadsInProgress,\n                };\n\n                if (this.fileUploadRef.current && this.fileUploadRef.current) {\n                    this.fileUploadRef.current.cancelUpload(id);\n                }\n            }\n        } else {\n            const fileInfos = draft.fileInfos.filter((item, itemIndex) => index !== itemIndex);\n\n            modifiedDraft = {\n                ...draft,\n                fileInfos,\n            };\n        }\n\n        this.props.actions.setDraft(StoragePrefixes.DRAFT + channelId, modifiedDraft);\n        this.draftsForChannel[channelId] = modifiedDraft;\n\n        this.handleFileUploadChange();\n    }\n\n    focusTextboxIfNecessary = (e: KeyboardEvent) => {\n        // Focus should go to the RHS when it is expanded\n        if (this.props.rhsExpanded) {\n            return;\n        }\n\n        // Bit of a hack to not steal focus from the channel switch modal if it's open\n        // This is a special case as the channel switch modal does not enforce focus like\n        // most modals do\n        if (document.getElementsByClassName('channel-switch-modal').length) {\n            return;\n        }\n\n        if (shouldFocusMainTextbox(e, document.activeElement)) {\n            this.focusTextbox();\n        }\n    }\n\n    documentKeyHandler = (e: KeyboardEvent) => {\n        const ctrlOrMetaKeyPressed = e.ctrlKey || e.metaKey;\n        const shortcutModalKeyCombo = ctrlOrMetaKeyPressed && Utils.isKeyPressed(e, KeyCodes.FORWARD_SLASH);\n        const lastMessageReactionKeyCombo = ctrlOrMetaKeyPressed && e.shiftKey && Utils.isKeyPressed(e, KeyCodes.BACK_SLASH);\n\n        if (shortcutModalKeyCombo) {\n            e.preventDefault();\n\n            GlobalActions.toggleShortcutsModal();\n            return;\n        } else if (lastMessageReactionKeyCombo) {\n            this.reactToLastMessage(e);\n            return;\n        }\n\n        this.focusTextboxIfNecessary(e);\n    }\n\n    getFileCount = () => {\n        const draft = this.props.draft;\n        return draft.fileInfos.length + draft.uploadsInProgress.length;\n    }\n\n    getFileUploadTarget = () => {\n        if (this.textboxRef.current) {\n            return this.textboxRef.current;\n        }\n\n        return null;\n    }\n\n    getCreatePostControls = () => {\n        return this.createPostControlsRef.current;\n    }\n\n    fillMessageFromHistory() {\n        const lastMessage = this.props.messageInHistoryItem;\n        if (lastMessage) {\n            this.setState({\n                message: lastMessage,\n            });\n        }\n    }\n\n    handleMouseUpKeyUp = (e: React.MouseEvent | React.KeyboardEvent) => {\n        const caretPosition = Utils.getCaretPosition(e.target);\n        this.setState({\n            caretPosition,\n        });\n    }\n\n    handleSelect = (e: React.SyntheticEvent) => {\n        Utils.adjustSelection(this.textboxRef.current?.getInputBox(), e);\n    }\n\n    handleKeyDown = (e: React.KeyboardEvent) => {\n        const ctrlOrMetaKeyPressed = e.ctrlKey || e.metaKey;\n        const messageIsEmpty = this.state.message.length === 0;\n        const draftMessageIsEmpty = this.props.draft.message.length === 0;\n        const ctrlEnterKeyCombo = (this.props.ctrlSend || this.props.codeBlockOnCtrlEnter) && Utils.isKeyPressed(e, KeyCodes.ENTER) && ctrlOrMetaKeyPressed;\n        const upKeyOnly = !ctrlOrMetaKeyPressed && !e.altKey && !e.shiftKey && Utils.isKeyPressed(e, KeyCodes.UP);\n        const shiftUpKeyCombo = !ctrlOrMetaKeyPressed && !e.altKey && e.shiftKey && Utils.isKeyPressed(e, KeyCodes.UP);\n        const ctrlKeyCombo = Utils.cmdOrCtrlPressed(e) && !e.altKey && !e.shiftKey;\n        const markdownHotkey = Utils.isKeyPressed(e, KeyCodes.B) || Utils.isKeyPressed(e, KeyCodes.I);\n        const ctrlAltCombo = Utils.cmdOrCtrlPressed(e, true) && e.altKey;\n        const markdownLinkKey = Utils.isKeyPressed(e, KeyCodes.K);\n\n        // listen for line break key combo and insert new line character\n        if (Utils.isUnhandledLineBreakKeyCombo(e)) {\n            this.setState({message: Utils.insertLineBreakFromKeyEvent(e)});\n        } else if (ctrlEnterKeyCombo) {\n            this.postMsgKeyPress(e);\n        } else if (upKeyOnly && messageIsEmpty) {\n            this.editLastPost(e);\n        } else if (shiftUpKeyCombo && messageIsEmpty) {\n            this.replyToLastPost(e);\n        } else if (ctrlKeyCombo && draftMessageIsEmpty && Utils.isKeyPressed(e, KeyCodes.UP)) {\n            this.loadPrevMessage(e);\n        } else if (ctrlKeyCombo && draftMessageIsEmpty && Utils.isKeyPressed(e, KeyCodes.DOWN)) {\n            this.loadNextMessage(e);\n        } else if ((ctrlKeyCombo && markdownHotkey) || (ctrlAltCombo && markdownLinkKey)) {\n            this.applyHotkeyMarkdown(e);\n        }\n    }\n\n    editLastPost = (e: React.KeyboardEvent) => {\n        e.preventDefault();\n\n        const lastPost = this.props.currentUsersLatestPost;\n        if (!lastPost) {\n            return;\n        }\n\n        let type;\n        if (lastPost.root_id && lastPost.root_id.length > 0) {\n            type = Utils.localizeMessage('create_post.comment', Posts.MESSAGE_TYPES.COMMENT);\n        } else {\n            type = Utils.localizeMessage('create_post.post', Posts.MESSAGE_TYPES.POST);\n        }\n        if (this.textboxRef.current) {\n            this.textboxRef.current.blur();\n        }\n        this.props.actions.setEditingPost(lastPost.id, 'post_textbox', type);\n    }\n\n    replyToLastPost = (e: React.KeyboardEvent) => {\n        e.preventDefault();\n        const latestReplyablePostId = this.props.latestReplyablePostId;\n        const replyBox = document.getElementById('reply_textbox');\n        if (replyBox) {\n            replyBox.focus();\n        }\n        if (latestReplyablePostId) {\n            this.props.actions.selectPostFromRightHandSideSearchByPostId(latestReplyablePostId);\n        }\n    }\n\n    loadPrevMessage = (e: React.KeyboardEvent) => {\n        e.preventDefault();\n        this.props.actions.moveHistoryIndexBack(Posts.MESSAGE_TYPES.POST).then(() => this.fillMessageFromHistory());\n    }\n\n    loadNextMessage = (e: React.KeyboardEvent) => {\n        e.preventDefault();\n        this.props.actions.moveHistoryIndexForward(Posts.MESSAGE_TYPES.POST).then(() => this.fillMessageFromHistory());\n    }\n\n    applyHotkeyMarkdown = (e: React.KeyboardEvent) => {\n        const res = Utils.applyHotkeyMarkdown(e);\n\n        this.setState({\n            message: res.message,\n        }, () => {\n            const textbox = this.textboxRef.current?.getInputBox();\n            Utils.setSelectionRange(textbox, res.selectionStart, res.selectionEnd);\n        });\n    }\n\n    reactToLastMessage = (e: KeyboardEvent) => {\n        e.preventDefault();\n\n        const {rhsExpanded, actions: {emitShortcutReactToLastPostFrom}} = this.props;\n        const noModalsAreOpen = document.getElementsByClassName(A11yClassNames.MODAL).length === 0;\n        const noPopupsDropdownsAreOpen = document.getElementsByClassName(A11yClassNames.POPUP).length === 0;\n\n        // Block keyboard shortcut react to last message when :\n        // - RHS is completely expanded\n        // - Any dropdown/popups are open\n        // - Any modals are open\n        if (!rhsExpanded && noModalsAreOpen && noPopupsDropdownsAreOpen) {\n            emitShortcutReactToLastPostFrom(Locations.CENTER);\n        }\n    }\n\n    handleBlur = () => {\n        this.lastBlurAt = Date.now();\n    }\n\n    showPostDeletedModal = () => {\n        this.setState({\n            showPostDeletedModal: true,\n        });\n    }\n\n    hidePostDeletedModal = () => {\n        this.setState({\n            showPostDeletedModal: false,\n        });\n    }\n\n    handleEmojiClose = () => {\n        this.setState({showEmojiPicker: false});\n    }\n\n    setMessageAndCaretPostion = (newMessage: string, newCaretPosition: number) => {\n        const textbox = this.textboxRef.current?.getInputBox();\n\n        this.setState({\n            message: newMessage,\n            caretPosition: newCaretPosition,\n        }, () => {\n            Utils.setCaretPosition(textbox, newCaretPosition);\n        });\n    }\n\n    handleEmojiClick = (emoji: Emoji) => {\n        const emojiAlias = ('short_names' in emoji && emoji.short_names && emoji.short_names[0]) || emoji.name;\n\n        if (!emojiAlias) {\n            //Oops.. There went something wrong\n            return;\n        }\n\n        if (this.state.message === '') {\n            this.setState({message: ':' + emojiAlias + ': '});\n        } else {\n            const {message} = this.state;\n            const {firstPiece, lastPiece} = splitMessageBasedOnCaretPosition(this.state.caretPosition, message);\n\n            // check whether the first piece of the message is empty when cursor is placed at beginning of message and avoid adding an empty string at the beginning of the message\n            const newMessage = firstPiece === '' ? `:${emojiAlias}: ${lastPiece}` : `${firstPiece} :${emojiAlias}: ${lastPiece}`;\n\n            const newCaretPosition = firstPiece === '' ? `:${emojiAlias}: `.length : `${firstPiece} :${emojiAlias}: `.length;\n            this.setMessageAndCaretPostion(newMessage, newCaretPosition);\n        }\n\n        this.handleEmojiClose();\n    }\n\n    handleGifClick = (gif: string) => {\n        if (this.state.message === '') {\n            this.setState({message: gif});\n        } else {\n            const newMessage = ((/\\s+$/).test(this.state.message)) ? this.state.message + gif : this.state.message + ' ' + gif;\n            this.setState({message: newMessage});\n        }\n        this.handleEmojiClose();\n    }\n\n    createTutorialTip() {\n        const screens = [];\n\n        screens.push(\n            <div>\n                <h4>\n                    <FormattedMessage\n                        id='create_post.tutorialTip.title'\n                        defaultMessage='Send a message'\n                    />\n                </h4>\n                <p>\n                    <FormattedMarkdownMessage\n                        id='create_post.tutorialTip1'\n                        defaultMessage='Type your first message and select **Enter** to send it.'\n                    />\n                </p>\n                <p>\n                    <FormattedMarkdownMessage\n                        id='create_post.tutorialTip2'\n                        defaultMessage='Use the **Attachments** and **Emoji** buttons to add files and emojis to your messages.'\n                    />\n                </p>\n            </div>,\n        );\n\n        return (\n            <TutorialTip\n                placement='top'\n                screens={screens}\n                overlayClass='tip-overlay--chat'\n                telemetryTag='tutorial_tip_1_sending_messages'\n            />\n        );\n    }\n\n    shouldEnableSendButton() {\n        return this.state.message.trim().length !== 0 || this.props.draft.fileInfos.length !== 0;\n    }\n\n    handleHeightChange = (height: number, maxHeight: number) => {\n        this.setState({\n            renderScrollbar: height > maxHeight,\n        });\n\n        window.requestAnimationFrame(() => {\n            if (this.textboxRef.current) {\n                this.setState({scrollbarWidth: Utils.scrollbarWidth(this.textboxRef.current.getInputBox())});\n            }\n        });\n    }\n\n    render() {\n        const {\n            currentChannel,\n            draft,\n            fullWidthTextBox,\n            showTutorialTip,\n            canPost,\n        } = this.props;\n        const readOnlyChannel = !canPost;\n        const {formatMessage} = this.props.intl;\n        const {renderScrollbar, channelTimezoneCount, mentions, memberNotifyCount} = this.state;\n        const ariaLabelMessageInput = Utils.localizeMessage('accessibility.sections.centerFooter', 'message input complimentary region');\n        let notifyAllMessage: React.ReactNode = '';\n        let notifyAllTitle: React.ReactNode = '';\n        if (mentions.includes('@all') || mentions.includes('@channel')) {\n            notifyAllTitle = (\n                <FormattedMessage\n                    id='notify_all.title.confirm'\n                    defaultMessage='Confirm sending notifications to entire channel'\n                />\n            );\n            if (channelTimezoneCount > 0) {\n                notifyAllMessage = (\n                    <FormattedMarkdownMessage\n                        id='notify_all.question_timezone'\n                        defaultMessage='By using **@all** or **@channel** you are about to send notifications to **{totalMembers} people** in **{timezones, number} {timezones, plural, one {timezone} other {timezones}}**. Are you sure you want to do this?'\n                        values={{\n                            totalMembers: memberNotifyCount,\n                            timezones: channelTimezoneCount,\n                        }}\n                    />\n                );\n            } else {\n                notifyAllMessage = (\n                    <FormattedMarkdownMessage\n                        id='notify_all.question'\n                        defaultMessage='By using **@all** or **@channel** you are about to send notifications to **{totalMembers} people**. Are you sure you want to do this?'\n                        values={{\n                            totalMembers: memberNotifyCount,\n                        }}\n                    />\n                );\n            }\n        } else if (mentions.length > 0) {\n            notifyAllTitle = (\n                <FormattedMessage\n                    id='notify_all.title.confirm_groups'\n                    defaultMessage='Confirm sending notifications to groups'\n                />\n            );\n\n            if (mentions.length === 1) {\n                if (channelTimezoneCount > 0) {\n                    notifyAllMessage = (\n                        <FormattedMarkdownMessage\n                            id='notify_all.question_timezone_one_group'\n                            defaultMessage='By using **{mention}** you are about to send notifications to **{totalMembers} people** in **{timezones, number} {timezones, plural, one {timezone} other {timezones}}**. Are you sure you want to do this?'\n                            values={{\n                                mention: mentions[0],\n                                totalMembers: memberNotifyCount,\n                                timezones: channelTimezoneCount,\n                            }}\n                        />\n                    );\n                } else {\n                    notifyAllMessage = (\n                        <FormattedMarkdownMessage\n                            id='notify_all.question_one_group'\n                            defaultMessage='By using **{mention}** you are about to send notifications to **{totalMembers} people**. Are you sure you want to do this?'\n                            values={{\n                                mention: mentions[0],\n                                totalMembers: memberNotifyCount,\n                            }}\n                        />\n                    );\n                }\n            } else if (channelTimezoneCount > 0) {\n                notifyAllMessage = (\n                    <FormattedMarkdownMessage\n                        id='notify_all.question_timezone_groups'\n                        defaultMessage='By using **{mentions}** and **{finalMention}** you are about to send notifications to at least **{totalMembers} people** in **{timezones, number} {timezones, plural, one {timezone} other {timezones}}**. Are you sure you want to do this?'\n                        values={{\n                            mentions: mentions.slice(0, -1).join(', '),\n                            finalMention: mentions[mentions.length - 1],\n                            totalMembers: memberNotifyCount,\n                            timezones: channelTimezoneCount,\n                        }}\n                    />\n                );\n            } else {\n                notifyAllMessage = (\n                    <FormattedMarkdownMessage\n                        id='notify_all.question_groups'\n                        defaultMessage='By using **{mentions}** and **{finalMention}** you are about to send notifications to at least **{totalMembers} people**. Are you sure you want to do this?'\n                        values={{\n                            mentions: mentions.slice(0, -1).join(', '),\n                            finalMention: mentions[mentions.length - 1],\n                            totalMembers: memberNotifyCount,\n                        }}\n                    />\n                );\n            }\n        }\n\n        const notifyAllConfirm = (\n            <FormattedMessage\n                id='notify_all.confirm'\n                defaultMessage='Confirm'\n            />\n        );\n\n        let serverError = null;\n        if (this.state.serverError) {\n            serverError = (\n                <MessageSubmitError\n                    error={this.state.serverError}\n                    submittedMessage={this.state.serverError.submittedMessage}\n                    handleSubmit={this.handleSubmit}\n                />\n            );\n        }\n\n        let postError = null;\n        if (this.state.postError) {\n            const postErrorClass = 'post-error' + (this.state.errorClass ? (' ' + this.state.errorClass) : '');\n            postError = <label className={postErrorClass}>{this.state.postError}</label>;\n        }\n\n        let preview = null;\n        if (!readOnlyChannel && (draft.fileInfos.length > 0 || draft.uploadsInProgress.length > 0)) {\n            preview = (\n                <FilePreview\n                    fileInfos={draft.fileInfos}\n                    onRemove={this.removePreview}\n                    uploadsInProgress={draft.uploadsInProgress}\n                    uploadsProgressPercent={this.state.uploadsProgressPercent}\n                />\n            );\n        }\n\n        let postFooterClassName = 'post-create-footer';\n        if (postError) {\n            postFooterClassName += ' has-error';\n        }\n\n        let tutorialTip = null;\n        if (showTutorialTip) {\n            tutorialTip = this.createTutorialTip();\n        }\n\n        let centerClass = '';\n        if (!fullWidthTextBox) {\n            centerClass = 'center';\n        }\n\n        let sendButtonClass = 'send-button theme';\n        if (!this.shouldEnableSendButton()) {\n            sendButtonClass += ' disabled';\n        }\n\n        let attachmentsDisabled = '';\n        if (!this.props.canUploadFiles) {\n            attachmentsDisabled = ' post-create--attachment-disabled';\n        }\n\n        let callButton;\n        if (!readOnlyChannel && !this.props.shouldShowPreview) {\n            callButton = (\n                <CallButton/>\n            );\n        }\n\n        let fileUpload;\n        if (!readOnlyChannel && !this.props.shouldShowPreview) {\n            fileUpload = (\n                <FileUpload\n                    ref={this.fileUploadRef}\n                    fileCount={this.getFileCount()}\n                    getTarget={this.getFileUploadTarget}\n                    onFileUploadChange={this.handleFileUploadChange}\n                    onUploadStart={this.handleUploadStart}\n                    onFileUpload={this.handleFileUploadComplete}\n                    onUploadError={this.handleUploadError}\n                    onUploadProgress={this.handleUploadProgress}\n                    postType='post'\n                    channelId={currentChannel.id}\n                />\n            );\n        }\n\n        let emojiPicker = null;\n        const emojiButtonAriaLabel = formatMessage({id: 'emoji_picker.emojiPicker', defaultMessage: 'Emoji Picker'}).toLowerCase();\n\n        if (this.props.enableEmojiPicker && !readOnlyChannel && !this.props.shouldShowPreview) {\n            emojiPicker = (\n                <div>\n                    <EmojiPickerOverlay\n                        show={this.state.showEmojiPicker}\n                        target={this.getCreatePostControls}\n                        onHide={this.hideEmojiPicker}\n                        onEmojiClose={this.handleEmojiClose}\n                        onEmojiClick={this.handleEmojiClick}\n                        onGifClick={this.handleGifClick}\n                        enableGifPicker={this.props.enableGifPicker}\n                        topOffset={-7}\n                    />\n                    <button\n                        type='button'\n                        aria-label={emojiButtonAriaLabel}\n                        onClick={this.toggleEmojiPicker}\n                        className={classNames('emoji-picker__container', 'post-action', {\n                            'post-action--active': this.state.showEmojiPicker,\n                        })}\n                    >\n                        <EmojiIcon\n                            id='emojiPickerButton'\n                            className={'icon icon--emoji '}\n                        />\n                    </button>\n                </div>\n            );\n        }\n\n        let createMessage;\n        if (readOnlyChannel) {\n            createMessage = Utils.localizeMessage('create_post.read_only', 'This channel is read-only. Only members with permission can post here.');\n        } else {\n            createMessage = formatMessage(\n                {id: 'create_post.write', defaultMessage: 'Write to {channelDisplayName}'},\n                {channelDisplayName: currentChannel.display_name},\n            );\n        }\n\n        let scrollbarClass = '';\n        if (renderScrollbar) {\n            scrollbarClass = ' scroll';\n        }\n\n        return (\n            <form\n                id='create_post'\n                ref={this.topDiv}\n                className={centerClass}\n                onSubmit={this.handleSubmit}\n            >\n                <div\n                    className={'post-create' + attachmentsDisabled + scrollbarClass}\n                    style={this.state.renderScrollbar && this.state.scrollbarWidth ? {'--detected-scrollbar-width': `${this.state.scrollbarWidth}px`} as any : undefined}\n                >\n                    <div className='post-create-body'>\n                        <div\n                            role='application'\n                            id='centerChannelFooter'\n                            aria-label={ariaLabelMessageInput}\n                            tabIndex={-1}\n                            className='post-body__cell a11y__region'\n                            data-a11y-sort-order='2'\n                        >\n                            <Textbox\n                                onChange={this.handleChange}\n                                onKeyPress={this.postMsgKeyPress}\n                                onKeyDown={this.handleKeyDown}\n                                onSelect={this.handleSelect}\n                                onMouseUp={this.handleMouseUpKeyUp}\n                                onKeyUp={this.handleMouseUpKeyUp}\n                                onComposition={this.emitTypingEvent}\n                                onHeightChange={this.handleHeightChange}\n                                handlePostError={this.handlePostError}\n                                value={readOnlyChannel ? '' : this.state.message}\n                                onBlur={this.handleBlur}\n                                emojiEnabled={this.props.enableEmojiPicker}\n                                createMessage={createMessage}\n                                channelId={currentChannel.id}\n                                id='post_textbox'\n                                ref={this.textboxRef}\n                                disabled={readOnlyChannel}\n                                characterLimit={this.props.maxPostSize}\n                                preview={this.props.shouldShowPreview}\n                                badConnection={this.props.badConnection}\n                                listenForMentionKeyClick={true}\n                                useChannelMentions={this.props.useChannelMentions}\n                            />\n                            <span\n                                ref={this.createPostControlsRef}\n                                className='post-body__actions'\n                            >\n                                {callButton}\n                                {fileUpload}\n                                {emojiPicker}\n                                <a\n                                    role='button'\n                                    tabIndex={0}\n                                    aria-label={formatMessage({\n                                        id: 'create_post.send_message',\n                                        defaultMessage: 'Send a message',\n                                    })}\n                                    className={sendButtonClass}\n                                    onClick={this.handleSubmit}\n                                >\n                                    <LocalizedIcon\n                                        className='fa fa-paper-plane'\n                                        title={{\n                                            id: t('create_post.icon'),\n                                            defaultMessage: 'Create a post',\n                                        }}\n                                    />\n                                </a>\n                            </span>\n                        </div>\n                        {tutorialTip}\n                    </div>\n                    <div\n                        id='postCreateFooter'\n                        role='form'\n                        className={postFooterClassName}\n                    >\n                        <div className='d-flex justify-content-between'>\n                            <MsgTyping\n                                channelId={currentChannel.id}\n                                postId=''\n                            />\n                            <TextboxLinks\n                                characterLimit={this.props.maxPostSize}\n                                showPreview={this.props.shouldShowPreview}\n                                updatePreview={this.setShowPreview}\n                                message={readOnlyChannel ? '' : this.state.message}\n                            />\n                        </div>\n                        <div>\n                            {postError}\n                            {preview}\n                            {serverError}\n                        </div>\n                    </div>\n                </div>\n                <PostDeletedModal\n                    show={this.state.showPostDeletedModal}\n                    onHide={this.hidePostDeletedModal}\n                />\n                <ConfirmModal\n                    title={notifyAllTitle}\n                    message={notifyAllMessage}\n                    confirmButtonText={notifyAllConfirm}\n                    show={this.state.showConfirmModal}\n                    onConfirm={this.handleNotifyAllConfirmation}\n                    onCancel={this.hideNotifyAllModal}\n                />\n            </form>\n        );\n    }\n}\n\nexport default injectIntl(CreatePost);\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {GlobalState} from 'types/store/index.js';\n\nimport {Post} from 'mattermost-redux/types/posts.js';\n\nimport {FileInfo} from 'mattermost-redux/types/files.js';\n\nimport {ActionResult, GenericAction} from 'mattermost-redux/types/actions.js';\n\nimport {CommandArgs} from 'mattermost-redux/types/integrations.js';\n\nimport {PostDraft} from 'types/store/rhs.js';\n\nimport {ModalData} from 'types/actions.js';\n\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\nimport {getCurrentChannel, getCurrentChannelStats, getChannelMemberCountsByGroup as selectChannelMemberCountsByGroup} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUserId, getStatusForUserId} from 'mattermost-redux/selectors/entities/users';\nimport {haveICurrentChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getChannelTimezones, getChannelMemberCountsByGroup} from 'mattermost-redux/actions/channels';\nimport {get, getInt, getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {\n    getCurrentUsersLatestPost,\n    getLatestReplyablePostId,\n    makeGetMessageInHistoryItem,\n} from 'mattermost-redux/selectors/entities/posts';\nimport {getAssociatedGroupsForReferenceByMention} from 'mattermost-redux/selectors/entities/groups';\nimport {\n    addMessageIntoHistory,\n    moveHistoryIndexBack,\n    moveHistoryIndexForward,\n    removeReaction,\n} from 'mattermost-redux/actions/posts';\nimport {Permissions, Posts, Preferences as PreferencesRedux} from 'mattermost-redux/constants';\n\nimport {connectionErrorCount} from 'selectors/views/system';\n\nimport {addReaction, createPost, setEditingPost, emitShortcutReactToLastPostFrom} from 'actions/post_actions.jsx';\nimport {scrollPostListToBottom} from 'actions/views/channel';\nimport {selectPostFromRightHandSideSearchByPostId} from 'actions/views/rhs';\nimport {setShowPreviewOnCreatePost} from 'actions/views/textbox';\nimport {executeCommand} from 'actions/command';\nimport {runMessageWillBePostedHooks, runSlashCommandWillBePostedHooks} from 'actions/hooks';\nimport {getPostDraft, getIsRhsExpanded} from 'selectors/rhs';\nimport {showPreviewOnCreatePost} from 'selectors/views/textbox';\nimport {getCurrentLocale} from 'selectors/i18n';\nimport {getEmojiMap, getShortcutReactToLastPostEmittedFrom} from 'selectors/emojis';\nimport {setGlobalItem, actionOnGlobalItemsWithPrefix} from 'actions/storage';\nimport {openModal} from 'actions/views/modals';\nimport {Constants, Preferences, StoragePrefixes, TutorialSteps, UserStatuses} from 'utils/constants';\nimport {canUploadFiles} from 'utils/file_utils';\n\nimport CreatePost from './create_post';\n\nfunction makeMapStateToProps() {\n    const getMessageInHistoryItem = makeGetMessageInHistoryItem(Posts.MESSAGE_TYPES.POST as any);\n\n    return (state: GlobalState) => {\n        const config = getConfig(state);\n        const license = getLicense(state);\n        const currentChannel = getCurrentChannel(state) || {};\n        const draft = getPostDraft(state, StoragePrefixes.DRAFT, currentChannel.id);\n        const latestReplyablePostId = getLatestReplyablePostId(state);\n        const currentChannelMembersCount = getCurrentChannelStats(state) ? getCurrentChannelStats(state).member_count : 1;\n        const enableTutorial = config.EnableTutorial === 'true';\n        const tutorialStep = getInt(state, Preferences.TUTORIAL_STEP, getCurrentUserId(state), TutorialSteps.FINISHED);\n        const enableEmojiPicker = config.EnableEmojiPicker === 'true';\n        const enableGifPicker = config.EnableGifPicker === 'true';\n        const enableConfirmNotificationsToChannel = config.EnableConfirmNotificationsToChannel === 'true';\n        const currentUserId = getCurrentUserId(state);\n        const userIsOutOfOffice = getStatusForUserId(state, currentUserId) === UserStatuses.OUT_OF_OFFICE;\n        const badConnection = connectionErrorCount(state) > 1;\n        const isTimezoneEnabled = config.ExperimentalTimezone === 'true';\n        const shortcutReactToLastPostEmittedFrom = getShortcutReactToLastPostEmittedFrom(state);\n        const canPost = haveICurrentChannelPermission(state, Permissions.CREATE_POST);\n        const useChannelMentions = haveICurrentChannelPermission(state, Permissions.USE_CHANNEL_MENTIONS);\n        const isLDAPEnabled = license?.IsLicensed === 'true' && license?.LDAPGroups === 'true';\n        const useGroupMentions = isLDAPEnabled && haveICurrentChannelPermission(state, Permissions.USE_GROUP_MENTIONS);\n        const channelMemberCountsByGroup = selectChannelMemberCountsByGroup(state, currentChannel.id);\n        const currentTeamId = getCurrentTeamId(state);\n        const groupsWithAllowReference = useGroupMentions ? getAssociatedGroupsForReferenceByMention(state, currentTeamId, currentChannel.id) : null;\n\n        return {\n            currentTeamId,\n            currentChannel,\n            currentChannelMembersCount,\n            currentUserId,\n            codeBlockOnCtrlEnter: getBool(state, PreferencesRedux.CATEGORY_ADVANCED_SETTINGS, 'code_block_ctrl_enter', true),\n            ctrlSend: getBool(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter'),\n            fullWidthTextBox: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CHANNEL_DISPLAY_MODE, Preferences.CHANNEL_DISPLAY_MODE_DEFAULT) === Preferences.CHANNEL_DISPLAY_MODE_FULL_SCREEN,\n            showTutorialTip: enableTutorial && tutorialStep === TutorialSteps.POST_POPOVER,\n            messageInHistoryItem: getMessageInHistoryItem(state),\n            draft,\n            latestReplyablePostId,\n            locale: getCurrentLocale(state),\n            currentUsersLatestPost: getCurrentUsersLatestPost(state, ''),\n            canUploadFiles: canUploadFiles(config),\n            enableEmojiPicker,\n            enableGifPicker,\n            enableConfirmNotificationsToChannel,\n            maxPostSize: parseInt(config.MaxPostSize || '', 10) || Constants.DEFAULT_CHARACTER_LIMIT,\n            userIsOutOfOffice,\n            rhsExpanded: getIsRhsExpanded(state),\n            emojiMap: getEmojiMap(state),\n            badConnection,\n            isTimezoneEnabled,\n            shortcutReactToLastPostEmittedFrom,\n            canPost,\n            useChannelMentions,\n            shouldShowPreview: showPreviewOnCreatePost(state),\n            groupsWithAllowReference,\n            useGroupMentions,\n            channelMemberCountsByGroup,\n            isLDAPEnabled,\n        };\n    };\n}\n\nfunction onSubmitPost(post: Post, fileInfos: FileInfo[]) {\n    return (dispatch: Dispatch<GenericAction>) => {\n        dispatch(createPost(post, fileInfos) as any);\n    };\n}\n\ntype Actions = {\n    setShowPreview: (showPreview: boolean) => void;\n    addMessageIntoHistory: (message: string) => void;\n    moveHistoryIndexBack: (index: string) => Promise<void>;\n    moveHistoryIndexForward: (index: string) => Promise<void>;\n    addReaction: (postId: string, emojiName: string) => void;\n    onSubmitPost: (post: Post, fileInfos: FileInfo[]) => void;\n    removeReaction: (postId: string, emojiName: string) => void;\n    clearDraftUploads: (prefix: string, action: (key: string, value?: PostDraft) => PostDraft | undefined) => void;\n    runMessageWillBePostedHooks: (originalPost: Post) => ActionResult;\n    runSlashCommandWillBePostedHooks: (originalMessage: string, originalArgs: CommandArgs) => ActionResult;\n    setDraft: (name: string, value: PostDraft | null) => void;\n    setEditingPost: (postId?: string, refocusId?: string, title?: string, isRHS?: boolean) => void;\n    selectPostFromRightHandSideSearchByPostId: (postId: string) => void;\n    openModal: (modalData: ModalData) => void;\n    executeCommand: (message: string, args: CommandArgs) => ActionResult;\n    getChannelTimezones: (channelId: string) => ActionResult;\n    scrollPostListToBottom: () => void;\n    emitShortcutReactToLastPostFrom: (emittedFrom: string) => void;\n    getChannelMemberCountsByGroup: (channelId: string, includeTimezones: boolean) => void;\n}\n\n// Temporarily store draft manually in localStorage since the current version of redux-persist\n// we're on will not save the draft quickly enough on page unload.\nfunction setDraft(key: string, value: PostDraft) {\n    if (value) {\n        localStorage.setItem(key, JSON.stringify(value));\n    } else {\n        localStorage.removeItem(key);\n    }\n    return setGlobalItem(key, value);\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<any>, Actions>({\n            addMessageIntoHistory,\n            onSubmitPost,\n            moveHistoryIndexBack,\n            moveHistoryIndexForward,\n            addReaction,\n            removeReaction,\n            setDraft,\n            clearDraftUploads: actionOnGlobalItemsWithPrefix,\n            selectPostFromRightHandSideSearchByPostId,\n            setEditingPost,\n            emitShortcutReactToLastPostFrom,\n            openModal,\n            executeCommand,\n            getChannelTimezones,\n            runMessageWillBePostedHooks,\n            runSlashCommandWillBePostedHooks,\n            scrollPostListToBottom,\n            setShowPreview: setShowPreviewOnCreatePost,\n            getChannelMemberCountsByGroup,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(CreatePost);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nexport default class CommentedOnFilesMessage extends React.PureComponent {\n    static propTypes = {\n\n        /*\n         * The id of the post that was commented on\n         */\n        parentPostId: PropTypes.string.isRequired,\n\n        /*\n         * An array of file metadata for the parent post\n         */\n        fileInfos: PropTypes.arrayOf(PropTypes.object),\n    }\n\n    render() {\n        if (!this.props.fileInfos || this.props.fileInfos.length === 0) {\n            return null;\n        }\n\n        let plusMore = null;\n        if (this.props.fileInfos.length > 1) {\n            plusMore = (\n                <FormattedMessage\n                    id='post_body.plusMore'\n                    defaultMessage=' plus {count, number} other {count, plural, one {file} other {files}}'\n                    values={{\n                        count: this.props.fileInfos.length - 1,\n                    }}\n                />\n            );\n        }\n\n        return (\n            <span>\n                {this.props.fileInfos[0].name}\n                {plusMore}\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {makeGetFilesForPost} from 'mattermost-redux/selectors/entities/files';\n\nimport CommentedOnFilesMessage from './commented_on_files_message.jsx';\n\nfunction makeMapStateToProps() {\n    const selectFileInfosForPost = makeGetFilesForPost();\n\n    return function mapStateToProps(state, ownProps) {\n        let fileInfos;\n        if (ownProps.parentPostId) {\n            fileInfos = selectFileInfosForPost(state, ownProps.parentPostId);\n        }\n\n        return {\n            fileInfos,\n        };\n    };\n}\n\nexport default connect(makeMapStateToProps)(CommentedOnFilesMessage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {UserProfile as UserProfileType} from 'mattermost-redux/types/users';\n\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport * as Utils from 'utils/utils.jsx';\nimport {stripMarkdown} from 'utils/markdown';\n\nimport CommentedOnFilesMessage from 'components/post_view/commented_on_files_message';\nimport UserProfile from '../../user_profile/user_profile';\n\ntype Props = {\n    displayName?: string;\n    enablePostUsernameOverride?: boolean;\n    parentPostUser?: UserProfileType;\n    onCommentClick?: React.EventHandler<React.MouseEvent>;\n    post: Post;\n}\n\nexport default class CommentedOn extends PureComponent<Props> {\n    makeUsername = () => {\n        const postProps = this.props.post.props;\n        let username = this.props.displayName;\n        if (this.props.enablePostUsernameOverride && postProps && postProps.from_webhook === 'true' && postProps.override_username) {\n            username = postProps.override_username;\n        }\n        return username;\n    }\n\n    makeCommentedOnMessage = () => {\n        const {post} = this.props;\n        let message: React.ReactNode = '';\n        if (post.message) {\n            message = Utils.replaceHtmlEntities(post.message);\n        } else if (post.file_ids && post.file_ids.length > 0) {\n            message = (\n                <CommentedOnFilesMessage parentPostId={post.id}/>\n            );\n        } else if (post.props && post.props.attachments && post.props.attachments.length > 0) {\n            const attachment = post.props.attachments[0];\n            const webhookMessage = attachment.pretext || attachment.title || attachment.text || attachment.fallback || '';\n            message = Utils.replaceHtmlEntities(webhookMessage);\n        }\n\n        return message;\n    }\n\n    render() {\n        const username = this.makeUsername();\n        const message = this.makeCommentedOnMessage();\n        const parentPostUser = this.props.parentPostUser;\n        const parentPostUserId = (parentPostUser && parentPostUser.id) || '';\n\n        const parentUserProfile = (\n            <UserProfile\n                user={parentPostUser}\n                userId={parentPostUserId}\n                displayName={username}\n                hasMention={true}\n                disablePopover={false}\n            />\n        );\n\n        return (\n            <div\n                data-testid='post-link'\n                className='post__link'\n            >\n                <span>\n                    <FormattedMessage\n                        id='post_body.commentedOn'\n                        defaultMessage=\"Commented on {name}'s message: \"\n                        values={{\n                            name: <a className='theme user_name'>{parentUserProfile}</a>,\n                        }}\n                    />\n                    <a\n                        className='theme'\n                        onClick={this.props.onCommentClick}\n                    >\n                        {typeof message === 'string' ? stripMarkdown(message) : message}\n                    </a>\n                </span>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {getDisplayNameByUser} from 'utils/utils.jsx';\n\nimport CommentedOn from './commented_on';\n\ntype Props = {\n    post: Post;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    let displayName = '';\n    if (ownProps.post) {\n        const user = getUser(state, ownProps.post.user_id);\n        displayName = getDisplayNameByUser(state, user);\n    }\n\n    const config = getConfig(state);\n    const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n\n    return {\n        displayName,\n        enablePostUsernameOverride,\n    };\n}\n\nexport default connect(mapStateToProps)(CommentedOn);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport {Posts} from 'mattermost-redux/constants';\n\nimport * as PostUtils from 'utils/post_utils';\nimport * as Utils from 'utils/utils.jsx';\nimport DelayedAction from 'utils/delayed_action';\nimport Constants from 'utils/constants.jsx';\n\nimport CommentedOn from 'components/post_view/commented_on';\nimport FileAttachmentListContainer from 'components/file_attachment_list';\nimport FailedPostOptions from 'components/post_view/failed_post_options';\nimport PostBodyAdditionalContent from 'components/post_view/post_body_additional_content';\nimport PostMessageView from 'components/post_view/post_message_view';\nimport ReactionList from 'components/post_view/reaction_list';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nconst SENDING_ANIMATION_DELAY = 3000;\n\nexport default class PostBody extends React.PureComponent {\n    static propTypes = {\n\n        /**\n         * The post to render the body of\n         */\n        post: PropTypes.object.isRequired,\n\n        /**\n         * The parent post of the thread this post is in\n         */\n        parentPost: PropTypes.object,\n\n        /**\n         * The poster of the parent post, if exists\n         */\n        parentPostUser: PropTypes.object,\n\n        /**\n         * Callback func for file menu open\n         */\n        handleFileDropdownOpened: PropTypes.func,\n\n        /**\n         * The function called when the comment icon is clicked\n         */\n        handleCommentClick: PropTypes.func.isRequired,\n\n        /**\n         * Set to render post body compactly\n         */\n        compactDisplay: PropTypes.bool,\n\n        /**\n         * Set to highlight comment as a mention\n         */\n        isCommentMention: PropTypes.bool,\n\n        /**\n         * Set to render a preview of the parent post above this reply\n         */\n        isFirstReply: PropTypes.bool,\n\n        /*\n         * Post type components from plugins\n         */\n        pluginPostTypes: PropTypes.object,\n\n        /**\n         * Flag passed down to PostBodyAdditionalContent for determining if post embed is visible\n         */\n        isEmbedVisible: PropTypes.bool,\n\n        /**\n         * Whether or not the post username can be overridden.\n         */\n        enablePostUsernameOverride: PropTypes.bool.isRequired,\n\n        /**\n         * Set not to allow edits on post\n         */\n        isReadOnly: PropTypes.bool,\n    }\n\n    static defaultProps = {\n        isReadOnly: false,\n    }\n\n    constructor(props) {\n        super(props);\n\n        this.sendingAction = new DelayedAction(\n            () => {\n                const post = this.props.post;\n                if (post && post.id === post.pending_post_id) {\n                    this.setState({sending: true});\n                }\n            },\n        );\n\n        this.state = {sending: false};\n    }\n\n    static getDerivedStateFromProps(props, state) {\n        if (state.sending && props.post && (props.post.id !== props.post.pending_post_id)) {\n            return {\n                sending: false,\n            };\n        }\n\n        return null;\n    }\n\n    componentDidUpdate() {\n        if (this.state.sending === false) {\n            this.sendingAction.cancel();\n        }\n    }\n\n    componentDidMount() {\n        const post = this.props.post;\n        if (post && post.id === post.pending_post_id) {\n            this.sendingAction.fireAfter(SENDING_ANIMATION_DELAY);\n        }\n    }\n\n    componentWillUnmount() {\n        this.sendingAction.cancel();\n    }\n\n    render() {\n        const post = this.props.post;\n        const parentPost = this.props.parentPost;\n        const parentPostUser = this.props.parentPostUser;\n\n        let comment;\n        let postClass = '';\n        const isEphemeral = Utils.isPostEphemeral(post);\n\n        //We want to show the commented on component even if the post was deleted\n        if (this.props.isFirstReply && parentPost && post.type !== Constants.PostTypes.EPHEMERAL) {\n            comment = (\n                <CommentedOn\n                    post={parentPost}\n                    parentPostUser={parentPostUser}\n                    onCommentClick={this.props.handleCommentClick}\n                />\n            );\n        }\n\n        let failedOptions;\n        if (this.props.post.failed) {\n            postClass += ' post--fail';\n            failedOptions = <FailedPostOptions post={this.props.post}/>;\n        }\n\n        if (PostUtils.isEdited(this.props.post)) {\n            postClass += ' post--edited';\n        }\n\n        let fileAttachmentHolder = null;\n        if (((post.file_ids && post.file_ids.length > 0) || (post.filenames && post.filenames.length > 0)) && this.props.post.state !== Posts.POST_DELETED) {\n            fileAttachmentHolder = (\n                <FileAttachmentListContainer\n                    post={post}\n                    compactDisplay={this.props.compactDisplay}\n                    handleFileDropdownOpened={this.props.handleFileDropdownOpened}\n                />\n            );\n        }\n\n        if (this.state.sending) {\n            postClass += ' post-waiting';\n        }\n\n        const messageWrapper = (\n            <React.Fragment>\n                {failedOptions}\n                {this.state.sending && <LoadingSpinner/>}\n                <PostMessageView\n                    post={this.props.post}\n                    compactDisplay={this.props.compactDisplay}\n                    hasMention={true}\n                />\n            </React.Fragment>\n        );\n\n        const hasPlugin = (post.type && this.props.pluginPostTypes.hasOwnProperty(post.type)) ||\n            (post.props && post.props.type && this.props.pluginPostTypes.hasOwnProperty(post.props.type));\n\n        let messageWithAdditionalContent;\n        if (this.props.post.state === Posts.POST_DELETED || hasPlugin) {\n            messageWithAdditionalContent = messageWrapper;\n        } else {\n            messageWithAdditionalContent = (\n                <PostBodyAdditionalContent\n                    post={this.props.post}\n                    isEmbedVisible={this.props.isEmbedVisible}\n                >\n                    {messageWrapper}\n                </PostBodyAdditionalContent>\n            );\n        }\n\n        let mentionHighlightClass = '';\n        if (this.props.isCommentMention) {\n            mentionHighlightClass = 'mention-comment';\n        }\n\n        let ephemeralPostClass = '';\n        if (isEphemeral) {\n            ephemeralPostClass = 'post--ephemeral';\n        }\n\n        return (\n            <div>\n                {comment}\n                <div\n                    id={`${post.id}_message`}\n                    className={`post__body ${mentionHighlightClass} ${ephemeralPostClass} ${postClass}`}\n                >\n                    {messageWithAdditionalContent}\n                    {fileAttachmentHolder}\n                    <ReactionList\n                        post={post}\n                        isReadOnly={this.props.isReadOnly}\n                    />\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport PostBody from './post_body.jsx';\n\nfunction mapStateToProps(state, ownProps) {\n    let parentPost;\n    let parentPostUser;\n    if (ownProps.post.root_id) {\n        parentPost = getPost(state, ownProps.post.root_id);\n        parentPostUser = parentPost ? getUser(state, parentPost.user_id) : null;\n    }\n\n    const config = getConfig(state);\n    const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n\n    const currentChannel = getCurrentChannel(state) || {};\n    const channelIsArchived = currentChannel.delete_at !== 0;\n\n    return {\n        parentPost,\n        parentPostUser,\n        pluginPostTypes: state.plugins.postTypes,\n        enablePostUsernameOverride,\n        isReadOnly: channelIsArchived,\n    };\n}\n\nexport default connect(mapStateToProps)(PostBody);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getPost, makeGetCommentCountForPost} from 'mattermost-redux/selectors/entities/posts';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {GlobalState} from 'types/store';\n\nimport CommentIcon from 'components/common/comment_icon';\n\ntype OwnProps = {\n    postId: string;\n}\n\nfunction makeMapStateToProps() {\n    const getReplyCount = makeGetCommentCountForPost();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        const post = getPost(state, ownProps.postId);\n\n        const collapsedThreadsEnabled = isCollapsedThreadsEnabled(state);\n\n        return {\n            commentCount: collapsedThreadsEnabled ? 0 : getReplyCount(state, post),\n        };\n    };\n}\n\nexport default connect(makeMapStateToProps)(CommentIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Tooltip} from 'react-bootstrap';\n\nimport {Posts} from 'mattermost-redux/constants';\nimport * as ReduxPostUtils from 'mattermost-redux/utils/post_utils';\n\nimport {Post} from 'mattermost-redux/types/posts';\nimport {ExtendedPost} from 'mattermost-redux/actions/posts';\n\nimport * as PostUtils from 'utils/post_utils';\nimport * as Utils from 'utils/utils.jsx';\nimport Constants, {Locations} from 'utils/constants';\nimport CommentIcon from 'components/post_view/comment_icon';\nimport DotMenu from 'components/dot_menu';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport PostFlagIcon from 'components/post_view/post_flag_icon';\nimport PostReaction from 'components/post_view/post_reaction';\nimport PostTime from 'components/post_view/post_time';\nimport InfoSmallIcon from 'components/widgets/icons/info_small_icon';\n\ntype Props = {\n\n    /**\n     * The post to render the info for\n     */\n    post: Post;\n\n    /**\n     * The id of the team which belongs the post\n     */\n    teamId?: string;\n\n    /**\n     * Function called when the comment icon is clicked\n     */\n    handleCommentClick: React.EventHandler<React.MouseEvent>;\n\n    /**\n     * Function called when the card icon is clicked\n     */\n    handleCardClick: (post: Post) => void;\n\n    /**\n     * Function called when the post options dropdown is opened\n     */\n    handleDropdownOpened: (e: boolean) => void;\n\n    /**\n     * Set to mark the post as flagged\n     */\n    isFlagged?: boolean;\n\n    /**\n     * Set to mark the post as open the extra info in the rhs\n     */\n    isCardOpen?: boolean;\n\n    /**\n     * Set to indicate that this is previous post was not a reply to the same thread\n     */\n    isFirstReply?: boolean;\n\n    /**\n     * Set to indicate that this is post has replies\n     */\n    hasReplies?: boolean;\n\n    /**\n     * Set to render in mobile view\n     */\n    isMobile?: boolean;\n\n    /**\n     * Set to render in compact view\n     */\n    compactDisplay?: boolean;\n\n    /**\n     * Set to mark post as being hovered over\n     */\n    hover: boolean;\n\n    /**\n     * Set to render the post time when not hovering\n     */\n    showTimeWithoutHover: boolean;\n\n    /**\n     * Whether to show the emoji picker.\n     */\n    enableEmojiPicker?: boolean;\n\n    /**\n     * Set not to allow edits on post\n     */\n    isReadOnly: boolean | null;\n\n    /**\n     * To check if the state of emoji for last message and from where it was emitted\n     */\n    shortcutReactToLastPostEmittedFrom?: string;\n\n    /**\n     * To Check if the current post is last in the list\n     */\n    isLastPost?: boolean;\n\n    actions: {\n\n        /**\n         * Function to remove the post\n         */\n        removePost: (post: ExtendedPost) => void;\n\n        /**\n         * Function to set or unset emoji picker for last message\n         */\n        emitShortcutReactToLastPostFrom?: (emittedFrom: string) => void;\n    };\n\n    shouldShowDotMenu: boolean;\n\n    collapsedThreadsEnabled: boolean;\n};\n\ntype State = {\n    showEmojiPicker: boolean;\n    showDotMenu: boolean;\n    showOptionsMenuWithoutHover: boolean;\n};\n\nexport default class PostInfo extends React.PureComponent<Props, State> {\n    private postHeaderRef: React.RefObject<HTMLDivElement>;\n    private dotMenuRef: React.RefObject<HTMLDivElement>;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            showEmojiPicker: false,\n            showOptionsMenuWithoutHover: false,\n            showDotMenu: false,\n        };\n\n        this.postHeaderRef = React.createRef();\n        this.dotMenuRef = React.createRef();\n    }\n\n    toggleEmojiPicker = (e?: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {\n        if (e) {\n            e.stopPropagation();\n        }\n        const showEmojiPicker = !this.state.showEmojiPicker;\n\n        this.setState({\n            showEmojiPicker,\n            showOptionsMenuWithoutHover: false,\n        });\n        this.props.handleDropdownOpened(showEmojiPicker || this.state.showDotMenu);\n    };\n\n    removePost = () => {\n        this.props.actions.removePost(this.props.post);\n    };\n\n    createRemovePostButton = () => {\n        return (\n            <button\n                className='post__remove theme color--link style--none'\n                type='button'\n                onClick={this.removePost}\n            >\n                {'×'}\n            </button>\n        );\n    };\n\n    handleDotMenuOpened = (open: boolean) => {\n        this.setState({showDotMenu: open});\n        this.props.handleDropdownOpened(open || this.state.showEmojiPicker);\n    };\n\n    getDotMenu = (): HTMLDivElement => {\n        return this.dotMenuRef.current as HTMLDivElement;\n    };\n\n    buildOptions = (post: Post, isSystemMessage: boolean, fromAutoResponder: boolean) => {\n        if (!this.props.shouldShowDotMenu) {\n            return null;\n        }\n\n        const {isMobile, isReadOnly, collapsedThreadsEnabled} = this.props;\n        const hover = this.props.hover || this.state.showEmojiPicker || this.state.showDotMenu || this.state.showOptionsMenuWithoutHover;\n\n        const showCommentIcon = fromAutoResponder ||\n        (!isSystemMessage && (isMobile || hover || (!post.root_id && Boolean(this.props.hasReplies)) || this.props.isFirstReply));\n        const commentIconExtraClass = isMobile ? '' : 'pull-right';\n        let commentIcon;\n        if (showCommentIcon) {\n            commentIcon = (\n                <CommentIcon\n                    handleCommentClick={this.props.handleCommentClick}\n                    postId={post.id}\n                    extraClass={commentIconExtraClass}\n                />\n            );\n        }\n\n        const showReactionIcon = !isSystemMessage && hover && !isReadOnly && this.props.enableEmojiPicker;\n        let postReaction;\n        if (showReactionIcon) {\n            postReaction = (\n                <PostReaction\n                    channelId={post.channel_id}\n                    postId={post.id}\n                    teamId={this.props.teamId}\n                    getDotMenuRef={this.getDotMenu}\n                    showEmojiPicker={this.state.showEmojiPicker}\n                    toggleEmojiPicker={this.toggleEmojiPicker}\n                />\n            );\n        }\n\n        const showDotMenuIcon = isMobile || hover;\n        let dotMenu;\n        if (showDotMenuIcon) {\n            dotMenu = (\n                <DotMenu\n                    post={post}\n                    isFlagged={this.props.isFlagged}\n                    handleCommentClick={this.props.handleCommentClick}\n                    handleDropdownOpened={this.handleDotMenuOpened}\n                    handleAddReactionClick={this.toggleEmojiPicker}\n                    isMenuOpen={this.state.showDotMenu}\n                    isReadOnly={isReadOnly}\n                    enableEmojiPicker={this.props.enableEmojiPicker}\n                />\n            );\n        }\n\n        const showFlagIcon = !isSystemMessage && !isMobile && (hover || this.props.isFlagged);\n        let postFlagIcon;\n        if (showFlagIcon) {\n            postFlagIcon = (\n                <PostFlagIcon\n                    postId={post.id}\n                    isFlagged={this.props.isFlagged}\n                />\n            );\n        }\n\n        return (\n            <div\n                ref={this.dotMenuRef}\n                data-testid={`post-menu-${post.id}`}\n                className={'col post-menu'}\n            >\n                {!collapsedThreadsEnabled && dotMenu}\n                {postReaction}\n                {postFlagIcon}\n                {commentIcon}\n                {collapsedThreadsEnabled && dotMenu}\n            </div>\n        );\n    };\n\n    handleShortcutReactToLastPost = (isLastPost: boolean) => {\n        if (isLastPost) {\n            const {post, isReadOnly, enableEmojiPicker, isMobile, actions} = this.props;\n\n            // Setting the last message emoji action to empty to clean up the redux state\n            actions.emitShortcutReactToLastPostFrom?.(Locations.NO_WHERE);\n\n            // Following are the types of posts on which adding reaction is not possible\n            const isDeletedPost = post && post.state === Posts.POST_DELETED;\n            const isEphemeralPost = post && Utils.isPostEphemeral(post);\n            const isSystemMessage = post && PostUtils.isSystemMessage(post);\n            const isAutoRespondersPost = post && PostUtils.fromAutoResponder(post);\n            const isFailedPost = post && post.failed;\n\n            // Checking if post is at scroll view of the user\n            const boundingRectOfPostInfo: DOMRect | undefined = this.postHeaderRef?.current?.getBoundingClientRect();\n            if (boundingRectOfPostInfo) {\n                const isPostHeaderVisibleToUser = (boundingRectOfPostInfo.top - 65) > 0 &&\n                    boundingRectOfPostInfo.bottom < (window.innerHeight - 85);\n\n                if (isPostHeaderVisibleToUser && !isEphemeralPost && !isSystemMessage && !isAutoRespondersPost &&\n                        !isFailedPost && !isDeletedPost && !isReadOnly && !isMobile && enableEmojiPicker) {\n                    this.setState({\n                        showOptionsMenuWithoutHover: true,\n                    }, () => {\n                        this.toggleEmojiPicker();\n                    });\n                }\n            }\n        }\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        const {shortcutReactToLastPostEmittedFrom, isLastPost} = this.props;\n\n        const shortcutReactToLastPostEmittedFromCenter = prevProps.shortcutReactToLastPostEmittedFrom !== shortcutReactToLastPostEmittedFrom &&\n        shortcutReactToLastPostEmittedFrom === Locations.CENTER;\n        if (shortcutReactToLastPostEmittedFromCenter && isLastPost !== undefined) {\n            this.handleShortcutReactToLastPost(isLastPost);\n        }\n    }\n\n    render() {\n        const post = this.props.post;\n\n        const isEphemeral = Utils.isPostEphemeral(post);\n        const isSystemMessage = PostUtils.isSystemMessage(post);\n        const fromAutoResponder = PostUtils.fromAutoResponder(post);\n\n        let postInfoIcon;\n        if (post.props && post.props.card) {\n            postInfoIcon = (\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='top'\n                    overlay={\n                        <Tooltip id={`viewAdditionalInfo-${post.id}`}>\n                            <FormattedMessage\n                                id='post_info.info.view_additional_info'\n                                defaultMessage='View additional info'\n                            />\n                        </Tooltip>\n                    }\n                >\n                    <button\n                        className={'card-icon__container icon--show style--none ' + (this.props.isCardOpen ? 'active' : '')}\n                        onClick={(e) => {\n                            e.preventDefault();\n                            this.props.handleCardClick(this.props.post);\n                        }}\n                    >\n                        <InfoSmallIcon\n                            className='icon icon__info'\n                            aria-hidden='true'\n                        />\n                    </button>\n                </OverlayTrigger>\n            );\n        }\n\n        let options;\n        if (isEphemeral) {\n            options = (\n                <div className='col col__remove'>\n                    {this.createRemovePostButton()}\n                </div>\n            );\n        } else if (!post.failed) {\n            options = this.buildOptions(post, isSystemMessage, fromAutoResponder);\n        }\n\n        let visibleMessage;\n        if (isEphemeral && !this.props.compactDisplay && post.state !== Posts.POST_DELETED) {\n            visibleMessage = (\n                <span className='post__visibility'>\n                    <FormattedMessage\n                        id='post_info.message.visible'\n                        defaultMessage='(Only visible to you)'\n                    />\n                </span>\n            );\n        }\n\n        const showPostTime = this.props.hover || this.props.showTimeWithoutHover;\n        let postTime;\n        if (showPostTime) {\n            // timestamp should not be a permalink if the post has been deleted, is ephemeral message, is pending, or is combined activity\n            const isPermalink = !(isEphemeral || Posts.POST_DELETED === post.state || ReduxPostUtils.isPostPendingOrFailed(post) || post.type === Posts.POST_TYPES.COMBINED_USER_ACTIVITY);\n\n            postTime = (\n                <PostTime\n                    isPermalink={isPermalink}\n                    eventTime={post.create_at}\n                    postId={post.id}\n                />\n            );\n        }\n\n        return (\n            <div\n                className='post__header--info'\n                ref={this.postHeaderRef}\n            >\n                <div className='col'>\n                    {postTime}\n                    {postInfoIcon}\n                    {visibleMessage}\n                </div>\n                {options}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {AnyAction, bindActionCreators, Dispatch} from 'redux';\n\nimport {removePost} from 'mattermost-redux/actions/posts';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {makeGetCommentCountForPost} from 'mattermost-redux/selectors/entities/posts';\nimport {get, isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {GlobalState} from 'types/store';\n\nimport {emitShortcutReactToLastPostFrom} from 'actions/post_actions.jsx';\nimport {Preferences} from 'utils/constants';\nimport {shouldShowDotMenu} from 'utils/post_utils';\nimport {getSelectedPostCard} from 'selectors/rhs';\nimport {getShortcutReactToLastPostEmittedFrom} from 'selectors/emojis';\n\nimport PostInfo from './post_info';\n\ntype OwnProps = {\n    post: Post;\n}\n\nfunction makeMapStateToProps() {\n    const getReplyCount = makeGetCommentCountForPost();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        const selectedCard = getSelectedPostCard(state);\n        const config = getConfig(state);\n        const channel = state.entities.channels.channels[ownProps.post.channel_id];\n        const channelIsArchived = channel ? channel.delete_at !== 0 : null;\n        const enableEmojiPicker = config.EnableEmojiPicker === 'true' && !channelIsArchived;\n        const teamId = getCurrentTeamId(state);\n        const shortcutReactToLastPostEmittedFrom = getShortcutReactToLastPostEmittedFrom(state);\n\n        return {\n            teamId,\n            isFlagged: get(state, Preferences.CATEGORY_FLAGGED_POST, ownProps.post.id, null) != null,\n            isMobile: state.views.channel.mobileView,\n            isCardOpen: selectedCard && selectedCard.id === ownProps.post.id,\n            enableEmojiPicker,\n            isReadOnly: channelIsArchived,\n            shouldShowDotMenu: shouldShowDotMenu(state, ownProps.post, channel),\n            shortcutReactToLastPostEmittedFrom,\n            collapsedThreadsEnabled: isCollapsedThreadsEnabled(state),\n            hasReplies: getReplyCount(state, ownProps.post) > 0,\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<AnyAction>) {\n    return {\n        actions: bindActionCreators({\n            removePost,\n            emitShortcutReactToLastPostFrom,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(PostInfo);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {useMemo} from 'react';\n\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport {setStatusDropdown} from 'actions/views/status_dropdown';\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\nimport {makeGetCustomStatus, showPostHeaderUpdateStatusButton, isCustomStatusEnabled} from 'selectors/views/custom_status';\nimport {GlobalState} from 'types/store';\nimport EmojiIcon from 'components/widgets/icons/emoji_icon';\n\ninterface ComponentProps {\n    userId: string;\n    isSystemMessage: boolean;\n    isBot: boolean;\n}\n\nconst PostHeaderCustomStatus = (props: ComponentProps) => {\n    const getCustomStatus = useMemo(makeGetCustomStatus, []);\n    const {userId, isSystemMessage, isBot} = props;\n    const dispatch = useDispatch();\n    const userCustomStatus = useSelector((state: GlobalState) => getCustomStatus(state, userId));\n    const showUpdateStatusButton = useSelector(showPostHeaderUpdateStatusButton);\n    const customStatusEnabled = useSelector(isCustomStatusEnabled);\n\n    const isCustomStatusSet = userCustomStatus && userCustomStatus.emoji;\n    if (!customStatusEnabled || isSystemMessage || isBot) {\n        return null;\n    }\n\n    if (isCustomStatusSet) {\n        return (\n            <CustomStatusEmoji\n                userID={userId}\n                showTooltip={true}\n                emojiStyle={{\n                    marginLeft: 4,\n                    marginTop: 2,\n                }}\n            />\n        );\n    }\n\n    // This must be checked after checking that custom status is not null\n    if (!showUpdateStatusButton) {\n        return null;\n    }\n\n    const updateStatus = (event: React.MouseEvent) => {\n        event.preventDefault();\n        dispatch(setStatusDropdown(true));\n    };\n\n    return (\n        <button\n            onClick={updateStatus}\n            className='post__header-set-custom-status cursor--pointer style--none'\n        >\n            <EmojiIcon className='post__header-set-custom-status-icon'/>\n            <span className='post__header-set-custom-status-text'>\n                <FormattedMessage\n                    id='post_header.update_status'\n                    defaultMessage='Update your status'\n                />\n            </span>\n        </button>\n    );\n};\n\nexport default PostHeaderCustomStatus;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {EventHandler, MouseEvent} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport Constants from 'utils/constants';\nimport * as PostUtils from 'utils/post_utils';\nimport PostInfo from 'components/post_view/post_info';\nimport UserProfile from 'components/user_profile';\nimport BotBadge from 'components/widgets/badges/bot_badge';\nimport Badge from 'components/widgets/badges/badge';\n\nimport PostHeaderCustomStatus from './post_header_custom_status';\n\nimport './post_header.scss';\n\nexport type Props = {\n\n    /*\n     * The post to render the header for\n     */\n    post: Post;\n\n    /*\n     * Function called when the comment icon is clicked\n     */\n    handleCommentClick: EventHandler<MouseEvent>;\n\n    /*\n     * Function called when the card icon is clicked\n     */\n    handleCardClick: (post: Post) => void;\n\n    /*\n     * Function called when the post options dropdown is opened\n     */\n    handleDropdownOpened: (opened: boolean) => void;\n\n    /*\n     * Set to render compactly\n     */\n    compactDisplay?: boolean;\n\n    /**\n     * Set to indicate that this is previous post was not a reply to the same thread\n     */\n    isFirstReply?: boolean;\n\n    /**\n     * Set to mark post as being hovered over\n     */\n    hover: boolean;\n\n    /*\n     * Set to render the post time when not hovering\n     */\n    showTimeWithoutHover: boolean;\n\n    /**\n     * Whether or not the post username can be overridden.\n     */\n    enablePostUsernameOverride: boolean;\n\n    /**\n     * If the user that made the post is a bot.\n     */\n    isBot: boolean;\n\n    /**\n     * If the user that made the post is a guest.\n     */\n    isGuest: boolean;\n\n    /**\n     * To Check if the current post is last in the list\n     */\n    isLastPost?: boolean;\n\n    /**\n     * Source of image that should be override current user profile.\n     */\n    overwriteIcon?: string;\n};\n\nexport default class PostHeader extends React.PureComponent<Props> {\n    render(): JSX.Element {\n        const {post} = this.props;\n        const isSystemMessage = PostUtils.isSystemMessage(post);\n        const fromAutoResponder = PostUtils.fromAutoResponder(post);\n        const fromWebhook = post?.props?.from_webhook === 'true';\n\n        let userProfile = (\n            <UserProfile\n                userId={post.user_id}\n                hasMention={true}\n            />\n        );\n        let indicator;\n        let colon;\n\n        if (fromWebhook) {\n            if (post.props.override_username && this.props.enablePostUsernameOverride) {\n                userProfile = (\n                    <UserProfile\n                        userId={post.user_id}\n                        hideStatus={true}\n                        overwriteName={post.props.override_username}\n                        overwriteIcon={this.props.overwriteIcon}\n                    />\n                );\n            } else {\n                userProfile = (\n                    <UserProfile\n                        userId={post.user_id}\n                        hideStatus={true}\n                    />\n                );\n            }\n\n            if (!this.props.isBot) {\n                indicator = (<BotBadge/>);\n            }\n        } else if (fromAutoResponder) {\n            userProfile = (\n                <UserProfile\n                    userId={post.user_id}\n                    hideStatus={true}\n                    hasMention={true}\n                />\n            );\n\n            indicator = (\n                <Badge>\n                    <FormattedMessage\n                        id='post_info.auto_responder'\n                        defaultMessage='AUTOMATIC REPLY'\n                    />\n                </Badge>\n            );\n        } else if (isSystemMessage && this.props.isBot) {\n            userProfile = (\n                <UserProfile\n                    userId={post.user_id}\n                    hideStatus={true}\n                />\n            );\n        } else if (isSystemMessage) {\n            userProfile = (\n                <UserProfile\n                    userId=''\n                    overwriteName={\n                        <FormattedMessage\n                            id='post_info.system'\n                            defaultMessage='System'\n                        />\n                    }\n                    overwriteImage={Constants.SYSTEM_MESSAGE_PROFILE_IMAGE}\n                    disablePopover={true}\n                />\n            );\n        }\n\n        if (this.props.compactDisplay) {\n            colon = (<strong className='colon'>{':'}</strong>);\n        }\n\n        const customStatus = (\n            <PostHeaderCustomStatus\n                userId={this.props.post.user_id}\n                isBot={this.props.isBot || fromWebhook}\n                isSystemMessage={isSystemMessage}\n            />\n        );\n\n        return (\n            <div className='post__header'>\n                <div className='col col__name'>\n                    {userProfile}\n                    {colon}\n                    {indicator}\n                    {customStatus}\n                </div>\n                <div className='col'>\n                    <PostInfo\n                        post={post}\n                        handleCommentClick={this.props.handleCommentClick}\n                        handleCardClick={this.props.handleCardClick}\n                        handleDropdownOpened={this.props.handleDropdownOpened}\n                        compactDisplay={this.props.compactDisplay}\n                        isFirstReply={this.props.isFirstReply}\n                        showTimeWithoutHover={this.props.showTimeWithoutHover}\n                        hover={this.props.hover}\n                        isLastPost={this.props.isLastPost}\n                    />\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport {GlobalState} from 'types/store';\nimport {isGuest} from 'utils/utils.jsx';\n\nimport PostHeader, {Props} from './post_header';\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const config = getConfig(state);\n    const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n    const enablePostIconOverride = config.EnablePostIconOverride === 'true';\n\n    const overrideIconUrl = enablePostIconOverride && ownProps.post?.props?.override_icon_url;\n    let overwriteIcon;\n    if (overrideIconUrl) {\n        overwriteIcon = Client4.getAbsoluteUrl(overrideIconUrl);\n    }\n\n    const user = getUser(state, ownProps.post.user_id);\n    const isBot = Boolean(user && user.is_bot);\n\n    return {\n        enablePostUsernameOverride,\n        isBot,\n        overwriteIcon,\n        isGuest: Boolean(user && isGuest(user)),\n    };\n}\n\nexport default connect(mapStateToProps)(PostHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback, useEffect, useMemo} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport './thread_footer.scss';\n\nimport {GlobalState} from 'types/store';\n\nimport {$ID} from 'mattermost-redux/types/utilities';\nimport {Post} from 'mattermost-redux/types/posts';\nimport {threadIsSynthetic, UserThread} from 'mattermost-redux/types/threads';\n\nimport {setThreadFollow, getThread as fetchThread} from 'mattermost-redux/actions/threads';\nimport {selectPost} from 'actions/views/rhs';\n\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getThreadOrSynthetic} from 'mattermost-redux/selectors/entities/threads';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\n\nimport Avatars from 'components/widgets/users/avatars';\nimport Timestamp from 'components/timestamp';\nimport SimpleTooltip from 'components/widgets/simple_tooltip';\nimport Button from 'components/threading/common/button';\nimport FollowButton from 'components/threading/common/follow_button';\n\nimport {THREADING_TIME} from 'components/threading/common/options';\ntype Props = {\n    threadId: $ID<UserThread>;\n};\n\nfunction ThreadFooter({\n    threadId,\n}: Props) {\n    const dispatch = useDispatch();\n    const currentTeamId = useSelector(getCurrentTeamId);\n    const currentUserId = useSelector(getCurrentUserId);\n    const post = useSelector((state: GlobalState) => getPost(state, threadId));\n    const thread = useSelector((state: GlobalState) => getThreadOrSynthetic(state, post));\n\n    useEffect(() => {\n        if (threadIsSynthetic(thread) && thread.is_following && thread.reply_count > 0) {\n            dispatch(fetchThread(currentUserId, currentTeamId, threadId));\n        }\n    }, []);\n\n    const {\n        participants,\n        reply_count: totalReplies = 0,\n        last_reply_at: lastReplyAt,\n        is_following: isFollowing = false,\n        post: {\n            channel_id: channelId,\n        },\n    } = thread;\n    const participantIds = useMemo(() => participants?.map(({id}) => id).reverse(), [participants]);\n\n    const handleReply = useCallback((e) => {\n        e.stopPropagation();\n        dispatch(selectPost({id: threadId, channel_id: channelId} as Post));\n    }, [threadId, channelId]);\n\n    const handleFollowing = useCallback((e) => {\n        e.stopPropagation();\n        dispatch(setThreadFollow(currentUserId, currentTeamId, threadId, !isFollowing));\n    }, [isFollowing]);\n\n    return (\n        <div className='ThreadFooter'>\n            {!isFollowing || threadIsSynthetic(thread) || !thread.unread_replies ? (\n                <div className='indicator'/>\n            ) : (\n                <SimpleTooltip\n                    id='threadFooterIndicator'\n                    content={\n                        <FormattedMessage\n                            id='threading.numNewMessages'\n                            defaultMessage='{newReplies, plural, =0 {no unread messages} =1 {one unread message} other {# unread messages}}'\n                            values={{newReplies: thread.unread_replies}}\n                        />\n                    }\n                >\n                    <div\n                        className='indicator'\n                        tabIndex={0}\n                    >\n                        <div className='dot-unreads'/>\n                    </div>\n                </SimpleTooltip>\n            )}\n\n            {participantIds ? (\n                <Avatars\n                    userIds={participantIds}\n                    size='sm'\n                />\n            ) : null}\n\n            {thread.reply_count > 0 && (\n                <Button\n                    onClick={handleReply}\n                    className='ReplyButton separated'\n                    prepend={\n                        <span className='icon'>\n                            <i className='icon-reply-outline'/>\n                        </span>\n                    }\n                >\n                    <FormattedMessage\n                        id='threading.numReplies'\n                        defaultMessage='{totalReplies, plural, =0 {Reply} =1 {# reply} other {# replies}}'\n                        values={{totalReplies}}\n                    />\n                </Button>\n            )}\n\n            <FollowButton\n                isFollowing={isFollowing}\n                className='separated'\n                onClick={handleFollowing}\n            />\n\n            {Boolean(lastReplyAt) && (\n                <Timestamp\n                    value={lastReplyAt}\n                    {...THREADING_TIME}\n                >\n                    {({formatted}) => (\n                        <span className='Timestamp separated alt-visible'>\n                            <FormattedMessage\n                                id='threading.footer.lastReplyAt'\n                                defaultMessage='Last reply {formatted}'\n                                values={{formatted}}\n                            />\n                        </span>\n                    )}\n                </Timestamp>\n            )}\n        </div>\n    );\n}\n\nexport default memo(ThreadFooter);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport {Posts} from 'mattermost-redux/constants';\nimport {isMeMessage as checkIsMeMessage} from 'mattermost-redux/utils/post_utils';\n\nimport {makeIsEligibleForClick} from 'utils/utils';\nimport * as PostUtils from 'utils/post_utils';\nimport Constants, {A11yCustomEventTypes} from 'utils/constants';\n\nimport PostProfilePicture from 'components/post_profile_picture';\nimport PostAriaLabelDiv from 'components/post_view/post_aria_label_div';\nimport PostBody from 'components/post_view/post_body';\nimport PostHeader from 'components/post_view/post_header';\nimport PostContext from 'components/post_view/post_context';\nimport PostPreHeader from 'components/post_view/post_pre_header';\nimport ThreadFooter from 'components/threading/channel_threads/thread_footer';\n\n// When adding clickable targets within a root post to exclude from post's on click to open thread,\n// please add to/maintain the selector below\nconst isEligibleForClick = makeIsEligibleForClick('.post-image__column, .embed-responsive-item, .attachment, .hljs, code');\n\nexport default class Post extends React.PureComponent {\n    static propTypes = {\n\n        /**\n         * The post to render\n         */\n        post: PropTypes.object.isRequired,\n\n        /**\n         * The logged in user ID\n         */\n        currentUserId: PropTypes.string.isRequired,\n\n        /**\n         * Set to center the post\n         */\n        center: PropTypes.bool,\n\n        /**\n         * Set to render post compactly\n         */\n        compactDisplay: PropTypes.bool,\n\n        /**\n         * Set to render a preview of the parent post above this reply\n         */\n        isFirstReply: PropTypes.bool,\n\n        /**\n         * Set to highlight the background of the post\n         */\n        shouldHighlight: PropTypes.bool,\n\n        /**\n         * Set to render this post as if it was attached to the previous post\n         */\n        consecutivePostByUser: PropTypes.bool,\n\n        /**\n         * Set if the previous post is a comment\n         */\n        previousPostIsComment: PropTypes.bool,\n\n        /*\n         * Function called when the post options dropdown is opened\n         */\n        togglePostMenu: PropTypes.func,\n\n        /**\n         * Set to render this comment as a mention\n         */\n        isCommentMention: PropTypes.bool,\n\n        /**\n         * If the post has replies\n         */\n        hasReplies: PropTypes.bool,\n\n        /**\n         * To Check if the current post is last in the list\n         */\n        isLastPost: PropTypes.bool,\n\n        /**\n         * Whether or not the channel that contains this post is archived\n         */\n        channelIsArchived: PropTypes.bool.isRequired,\n\n        actions: PropTypes.shape({\n            selectPost: PropTypes.func.isRequired,\n            selectPostCard: PropTypes.func.isRequired,\n            markPostAsUnread: PropTypes.func.isRequired,\n        }).isRequired,\n\n        /*\n         * Set to mark the post as flagged\n         */\n        isFlagged: PropTypes.bool.isRequired,\n\n        isCollapsedThreadsEnabled: PropTypes.bool,\n    }\n\n    static defaultProps = {\n        post: {},\n    };\n\n    constructor(props) {\n        super(props);\n\n        this.postRef = React.createRef();\n\n        this.state = {\n            dropdownOpened: false,\n            fileDropdownOpened: false,\n            hover: false,\n            alt: false,\n            a11yActive: false,\n            ariaHidden: true,\n            fadeOutHighlight: false,\n        };\n    }\n\n    componentDidMount() {\n        document.addEventListener('keydown', this.handleAlt);\n        document.addEventListener('keyup', this.handleAlt);\n\n        // Refs can be null when this component is shallowly rendered for testing\n        if (this.postRef.current) {\n            this.postRef.current.addEventListener(A11yCustomEventTypes.ACTIVATE, this.handleA11yActivateEvent);\n            this.postRef.current.addEventListener(A11yCustomEventTypes.DEACTIVATE, this.handleA11yDeactivateEvent);\n        }\n\n        if (this.props.shouldHighlight) {\n            this.highlightTimeout = setTimeout(() => {\n                this.setState({fadeOutHighlight: true});\n            }, Constants.PERMALINK_FADEOUT);\n        }\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleAlt);\n        document.removeEventListener('keyup', this.handleAlt);\n\n        if (this.postRef.current) {\n            this.postRef.current.removeEventListener(A11yCustomEventTypes.ACTIVATE, this.handleA11yActivateEvent);\n            this.postRef.current.removeEventListener(A11yCustomEventTypes.DEACTIVATE, this.handleA11yDeactivateEvent);\n        }\n\n        clearTimeout(this.highlightTimeout);\n    }\n\n    componentDidUpdate() {\n        if (this.state.a11yActive) {\n            this.postRef.current.dispatchEvent(new Event(A11yCustomEventTypes.UPDATE));\n        }\n    }\n\n    handleCommentClick = (e) => {\n        e.preventDefault();\n\n        const post = this.props.post;\n        if (!post) {\n            return;\n        }\n        this.props.actions.selectPost(post);\n    }\n\n    handleCardClick = (post) => {\n        if (!post) {\n            return;\n        }\n        this.props.actions.selectPostCard(post);\n    }\n\n    handlePostClick = (e) => {\n        const {post, isCollapsedThreadsEnabled} = this.props;\n\n        if (!post) {\n            return;\n        }\n\n        const isSystemMessage = PostUtils.isSystemMessage(post);\n        const fromAutoResponder = PostUtils.fromAutoResponder(post);\n\n        if (\n            !e.altKey &&\n            isCollapsedThreadsEnabled &&\n            (fromAutoResponder || !isSystemMessage) &&\n            isEligibleForClick(e)\n        ) {\n            this.props.actions.selectPost(post);\n        }\n\n        if (this.props.channelIsArchived || post.system_post_ids) {\n            return;\n        }\n\n        if (e.altKey) {\n            this.props.actions.markPostAsUnread(post, 'CENTER');\n        }\n    }\n\n    handleDropdownOpened = (opened) => {\n        if (this.props.togglePostMenu) {\n            this.props.togglePostMenu(opened);\n        }\n\n        this.setState({\n            dropdownOpened: opened,\n        });\n    }\n\n    handleFileDropdownOpened = (opened) => {\n        this.setState({\n            fileDropdownOpened: opened,\n        });\n    }\n\n    hasSameRoot = (props) => {\n        const post = props.post;\n\n        if (props.isFirstReply) {\n            return false;\n        } else if (!post.root_id && !props.previousPostIsComment && props.consecutivePostByUser) {\n            return true;\n        } else if (post.root_id) {\n            return true;\n        }\n\n        return false;\n    }\n\n    getClassName = (post, isSystemMessage, isMeMessage, fromWebhook, fromAutoResponder, fromBot) => {\n        let className = 'post';\n\n        if (post.failed || post.state === Posts.POST_DELETED) {\n            className += ' post--hide-controls';\n        }\n\n        if (!this.state.fadeOutHighlight && this.props.shouldHighlight) {\n            className += ' post--highlight';\n            if (post.is_pinned || this.props.isFlagged) {\n                className += ' post--pinned-or-flagged-highlight';\n            }\n        }\n\n        let rootUser = '';\n        if (this.hasSameRoot(this.props)) {\n            rootUser = 'same--root';\n        } else {\n            rootUser = 'other--root';\n        }\n\n        if (fromBot) {\n            className += ' post--bot';\n        }\n\n        let currentUserCss = '';\n        if (this.props.currentUserId === post.user_id && !fromWebhook && !isSystemMessage) {\n            currentUserCss = 'current--user';\n        }\n\n        let sameUserClass = '';\n        if (this.props.consecutivePostByUser) {\n            sameUserClass = 'same--user';\n        }\n\n        let postType = '';\n        if (post.root_id && post.root_id.length > 0) {\n            postType = 'post--comment';\n        } else if (this.props.hasReplies) {\n            postType = 'post--root';\n            sameUserClass = '';\n            rootUser = '';\n        }\n\n        if (isSystemMessage || isMeMessage) {\n            className += ' post--system';\n            if (isSystemMessage) {\n                currentUserCss = '';\n                postType = '';\n                rootUser = '';\n            }\n        }\n\n        if (fromAutoResponder) {\n            postType = 'post--comment same--root';\n        }\n\n        if (this.props.compactDisplay) {\n            className += ' post--compact';\n        }\n\n        if (this.state.dropdownOpened || this.state.fileDropdownOpened || this.state.a11yActive) {\n            className += ' post--hovered';\n        }\n\n        if (post.is_pinned || this.props.isFlagged) {\n            className += ' post--pinned-or-flagged';\n        }\n\n        if (\n            (this.state.alt && !(this.props.channelIsArchived || post.system_post_ids)) ||\n            (this.props.isCollapsedThreadsEnabled && (fromAutoResponder || !isSystemMessage))\n        ) {\n            className += ' cursor--pointer';\n        }\n\n        return className + ' ' + sameUserClass + ' ' + rootUser + ' ' + postType + ' ' + currentUserCss;\n    }\n\n    setHover = () => {\n        this.setState({hover: true});\n    }\n\n    unsetHover = () => {\n        this.setState({hover: false});\n    }\n\n    handleAlt = (e) => {\n        if (this.state.alt !== e.altKey) {\n            this.setState({alt: e.altKey});\n        }\n    }\n\n    handleA11yActivateEvent = () => {\n        this.setState({\n            a11yActive: true,\n            ariaHidden: false,\n        });\n    }\n\n    handleA11yDeactivateEvent = () => {\n        this.setState({\n            a11yActive: false,\n            ariaHidden: true,\n        });\n    }\n\n    render() {\n        const {\n            post,\n            hasReplies,\n            isCollapsedThreadsEnabled,\n        } = this.props;\n        if (!post.id) {\n            return null;\n        }\n\n        const isSystemMessage = PostUtils.isSystemMessage(post);\n        const isMeMessage = checkIsMeMessage(post);\n        const fromAutoResponder = PostUtils.fromAutoResponder(post);\n        const fromWebhook = post && post.props && post.props.from_webhook === 'true';\n        const fromBot = post && post.props && post.props.from_bot === 'true';\n\n        let profilePic;\n        const hideProfilePicture = this.hasSameRoot(this.props) && this.props.consecutivePostByUser && (!post.root_id && !hasReplies) && !fromBot;\n        if (!hideProfilePicture) {\n            profilePic = (\n                <PostProfilePicture\n                    compactDisplay={this.props.compactDisplay}\n                    post={post}\n                    userId={post.user_id}\n                />\n            );\n\n            if (fromAutoResponder) {\n                profilePic = (\n                    <span className='auto-responder'>\n                        {profilePic}\n                    </span>\n                );\n            }\n        }\n\n        let centerClass = '';\n        if (this.props.center) {\n            centerClass = 'center';\n        }\n\n        return (\n            <PostContext.Provider value={{handlePopupOpened: this.handleDropdownOpened}}>\n                <PostAriaLabelDiv\n                    ref={this.postRef}\n                    id={'post_' + post.id}\n                    data-testid='postView'\n                    role='listitem'\n                    className={`a11y__section ${this.getClassName(post, isSystemMessage, isMeMessage, fromWebhook, fromAutoResponder, fromBot)}`}\n                    tabIndex='0'\n                    onMouseOver={this.setHover}\n                    onMouseLeave={this.unsetHover}\n                    onTouchStart={this.setHover}\n                    onClick={this.handlePostClick}\n                    aria-atomic={true}\n                    post={post}\n                >\n                    <PostPreHeader\n                        isFlagged={this.props.isFlagged}\n                        isPinned={post.is_pinned}\n                        channelId={post.channel_id}\n                    />\n                    <div\n                        role='application'\n                        data-testid='postContent'\n                        className={'post__content ' + centerClass}\n                        aria-hidden={this.state.ariaHidden}\n                    >\n                        <div className='post__img'>\n                            {profilePic}\n                        </div>\n                        <div>\n                            <PostHeader\n                                post={post}\n                                handleCommentClick={this.handleCommentClick}\n                                handleCardClick={this.handleCardClick}\n                                handleDropdownOpened={this.handleDropdownOpened}\n                                compactDisplay={this.props.compactDisplay}\n                                isFirstReply={this.props.isFirstReply}\n                                showTimeWithoutHover={!hideProfilePicture}\n                                hover={this.state.hover || this.state.a11yActive || this.state.fileDropdownOpened}\n                                isLastPost={this.props.isLastPost}\n                            />\n                            <PostBody\n                                post={post}\n                                handleCommentClick={this.handleCommentClick}\n                                compactDisplay={this.props.compactDisplay}\n                                isCommentMention={this.props.isCommentMention}\n                                isFirstReply={this.props.isFirstReply}\n                                handleFileDropdownOpened={this.handleFileDropdownOpened}\n                            />\n                            {isCollapsedThreadsEnabled && !post.root_id && (hasReplies || post.is_following) ? (\n                                <ThreadFooter threadId={post.id}/>\n                            ) : null}\n\n                        </div>\n                    </div>\n                </PostAriaLabelDiv>\n            </PostContext.Provider>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getPost, makeIsPostCommentMention, makeGetCommentCountForPost} from 'mattermost-redux/selectors/entities/posts';\nimport {get, isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {markPostAsUnread} from 'actions/post_actions';\nimport {selectPost, selectPostCard} from 'actions/views/rhs';\n\nimport {GlobalState} from 'types/store';\n\nimport {isArchivedChannel} from 'utils/channel_utils';\nimport {Preferences} from 'utils/constants';\nimport {areConsecutivePostsBySameUser} from 'utils/post_utils';\n\nimport PostComponent from './post';\n\ninterface OwnProps {\n    post?: Post;\n    postId: string;\n    previousPostId?: string;\n}\n\n// isFirstReply returns true when the given post a comment that isn't part of the same thread as the previous post.\nexport function isFirstReply(post: Post, previousPost: Post): boolean {\n    if (post.root_id) {\n        if (previousPost) {\n            // Returns true as long as the previous post is part of a different thread\n            return post.root_id !== previousPost.id && post.root_id !== previousPost.root_id;\n        }\n\n        // The previous post is not a real post\n        return true;\n    }\n\n    // This post is not a reply\n    return false;\n}\n\nfunction makeMapStateToProps() {\n    const getReplyCount = makeGetCommentCountForPost();\n    const isPostCommentMention = makeIsPostCommentMention();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        const post = ownProps.post || getPost(state, ownProps.postId);\n        const channel = getChannel(state, post.channel_id);\n\n        let previousPost = null;\n        if (ownProps.previousPostId) {\n            previousPost = getPost(state, ownProps.previousPostId);\n        }\n\n        let consecutivePostByUser = false;\n        let previousPostIsComment = false;\n\n        if (previousPost) {\n            consecutivePostByUser = areConsecutivePostsBySameUser(post, previousPost);\n            previousPostIsComment = Boolean(previousPost.root_id);\n        }\n\n        return {\n            post,\n            currentUserId: getCurrentUserId(state),\n            isFirstReply: previousPost ? isFirstReply(post, previousPost) : false,\n            consecutivePostByUser,\n            previousPostIsComment,\n            hasReplies: getReplyCount(state, post) > 0,\n            isCommentMention: isPostCommentMention(state, post.id),\n            center: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CHANNEL_DISPLAY_MODE, Preferences.CHANNEL_DISPLAY_MODE_DEFAULT) === Preferences.CHANNEL_DISPLAY_MODE_CENTERED,\n            compactDisplay: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.MESSAGE_DISPLAY, Preferences.MESSAGE_DISPLAY_DEFAULT) === Preferences.MESSAGE_DISPLAY_COMPACT,\n            channelIsArchived: isArchivedChannel(channel),\n            isFlagged: get(state, Preferences.CATEGORY_FLAGGED_POST, post.id, null) != null,\n            isCollapsedThreadsEnabled: isCollapsedThreadsEnabled(state),\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            selectPost,\n            selectPostCard,\n            markPostAsUnread,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(PostComponent);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {makeGenerateCombinedPost} from 'mattermost-redux/utils/post_list';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport Post from 'components/post_view/post';\n\ntype Props = {\n    combinedId: string;\n}\n\nfunction makeMapStateToProps() {\n    const generateCombinedPost = makeGenerateCombinedPost();\n\n    return (state: GlobalState, ownProps: Props) => {\n        return {\n            post: generateCombinedPost(state, ownProps.combinedId),\n            postId: ownProps.combinedId,\n        };\n    };\n}\n\n// Note that this also passes through Post's mapStateToProps\nexport default connect(makeMapStateToProps)(Post);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n    width: number;\n    height: number;\n}\n\nconst EmptyStateThemeableSvg = (props: SvgProps) => (\n    <svg\n        width={props.width ? props.width.toString() : '406'}\n        height={props.height ? props.height.toString() : '312'}\n        viewBox='0 0 406 312'\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n        xmlnsXlink='http://www.w3.org/1999/xlink'\n    >\n        <g clipPath='url(#clip0)'>\n            <path\n                d='M224.13 279.63C291.724 279.63 346.52 224.834 346.52 157.24C346.52 89.6455 291.724 34.8496 224.13 34.8496C156.536 34.8496 101.74 89.6455 101.74 157.24C101.74 224.834 156.536 279.63 224.13 279.63Z'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.04'\n            />\n            <path\n                d='M248.69 85.2799C253.27 84.2799 261.45 83.4898 267.32 87.1198C271.14 89.4898 273.32 93.6898 276.03 97.2598C279.09 101.31 282.96 104.69 286.2 108.61C291.093 114.667 294.407 121.844 295.843 129.497C297.28 137.15 296.794 145.041 294.43 152.46C292.88 157.13 290.59 161.56 289.36 166.33C287.8 172.33 288 178.7 287.53 184.92C286.22 202.19 279.74 218.59 273.33 234.69C271.41 239.52 269.41 244.47 265.85 248.26C262.896 251.288 259.107 253.368 254.967 254.235C250.826 255.102 246.521 254.717 242.6 253.13C236.97 250.73 232.49 245.88 226.6 244.28C223.78 243.51 220.82 243.54 217.92 243.28C210.492 242.615 203.362 240.039 197.223 235.804C191.085 231.568 186.147 225.817 182.888 219.108C179.63 212.399 178.163 204.962 178.63 197.519C179.096 190.075 181.48 182.879 185.55 176.63C188.361 172.564 191.52 168.75 194.99 165.23L212.06 146.85C216.38 142.19 220.85 137.29 222.59 131.18C223.87 126.69 223.59 121.92 223.94 117.27C224.67 108.51 228.07 99.7999 234.36 93.6599C240.65 87.5199 244.62 86.1499 248.69 85.2799Z'\n                fill='#66320A'\n            />\n            <mask\n                id='mask0'\n                mask-type='alpha'\n                maskUnits='userSpaceOnUse'\n                x='178'\n                y='84'\n                width='119'\n                height='171'\n            >\n                <path\n                    d='M248.69 85.2799C253.27 84.2799 261.45 83.4898 267.32 87.1198C271.14 89.4898 273.32 93.6898 276.03 97.2598C279.09 101.31 282.96 104.69 286.2 108.61C291.093 114.667 294.407 121.844 295.843 129.497C297.28 137.15 296.794 145.041 294.43 152.46C292.88 157.13 290.59 161.56 289.36 166.33C287.8 172.33 288 178.7 287.53 184.92C286.22 202.19 279.74 218.59 273.33 234.69C271.41 239.52 269.41 244.47 265.85 248.26C262.896 251.288 259.107 253.368 254.967 254.235C250.826 255.102 246.521 254.717 242.6 253.13C236.97 250.73 232.49 245.88 226.6 244.28C223.78 243.51 220.82 243.54 217.92 243.28C210.492 242.615 203.362 240.039 197.223 235.804C191.085 231.568 186.147 225.817 182.888 219.108C179.63 212.399 178.163 204.962 178.63 197.519C179.096 190.075 181.48 182.879 185.55 176.63C188.361 172.564 191.52 168.75 194.99 165.23L212.06 146.85C216.38 142.19 220.85 137.29 222.59 131.18C223.87 126.69 223.59 121.92 223.94 117.27C224.67 108.51 228.07 99.7999 234.36 93.6599C240.65 87.5199 244.62 86.1499 248.69 85.2799Z'\n                    fill='#66320A'\n                />\n            </mask>\n            <g mask='url(#mask0)'>\n                <rect\n                    x='178'\n                    y='84'\n                    width='97'\n                    height='171'\n                    fill='url(#pattern0)'\n                />\n            </g>\n            <mask\n                id='mask1'\n                mask-type='alpha'\n                maskUnits='userSpaceOnUse'\n                x='101'\n                y='34'\n                width='246'\n                height='246'\n            >\n                <path\n                    d='M224.13 279.63C291.724 279.63 346.52 224.834 346.52 157.24C346.52 89.6455 291.724 34.8496 224.13 34.8496C156.536 34.8496 101.74 89.6455 101.74 157.24C101.74 224.834 156.536 279.63 224.13 279.63Z'\n                    fill='#F4F4F6'\n                />\n            </mask>\n            <g mask='url(#mask1)'>\n                <path\n                    d='M250.36 173.06L233.82 208.56C233.4 209.56 233.82 211.69 234.73 212.13C250.06 219.13 256.57 226.62 259.13 229.39C270.623 241.824 281.777 254.554 292.59 267.58C300.97 263.42 319.08 249.37 328.94 235.92C367.64 183.15 348.19 137.8 343.29 139.53C321.29 147.27 311.83 152.59 293.08 166.43C287.951 169.92 282.463 172.85 276.71 175.17C268.71 178.32 257.6 173.68 253.26 171.58C252.28 171.15 250.74 172.04 250.36 173.06Z'\n                    fill='var(--center-channel-bg)'\n                />\n                <mask\n                    id='mask2'\n                    mask-type='alpha'\n                    maskUnits='userSpaceOnUse'\n                    x='233'\n                    y='139'\n                    width='120'\n                    height='129'\n                >\n                    <path\n                        d='M250.36 173.06L233.82 208.56C233.4 209.56 233.82 211.69 234.73 212.13C250.06 219.13 256.57 226.62 259.13 229.39C270.623 241.824 281.777 254.554 292.59 267.58C300.97 263.42 319.08 249.37 328.94 235.92C367.64 183.15 348.19 137.8 343.29 139.53C321.29 147.27 311.83 152.59 293.08 166.43C287.951 169.92 282.463 172.85 276.71 175.17C268.71 178.32 257.6 173.68 253.26 171.58C252.28 171.15 250.74 172.04 250.36 173.06Z'\n                        fill='var(--center-channel-bg)'\n                    />\n                </mask>\n                <g mask='url(#mask2)'>\n                    <rect\n                        x='233'\n                        y='139'\n                        width='120'\n                        height='129'\n                        fill='url(#pattern1)'\n                    />\n                </g>\n            </g>\n            <path\n                d='M121.47 43.4204C121.7 47.0904 121.38 59.9904 121.47 61.2104C122.47 77.2704 158.14 122.29 161.61 125.68C169.96 133.87 187.85 144.42 197.92 150.34C218.92 162.66 227.69 163.75 250.38 173.06L233.84 208.56C199.49 196.21 184.48 187.1 166.54 175C160.21 170.73 147.47 161.76 142.33 156.62C121.26 135.55 112.06 96.1003 103.33 77.2703C99.0699 68.0803 96.67 67.6104 93.91 63.8204C90.33 58.8804 90.1001 57.3204 87.1901 53.0604C82.4301 46.0604 73.1301 40.6304 70.1901 34.5804C70.1345 34.4406 70.121 34.2875 70.1514 34.1402C70.1818 33.9929 70.2547 33.8578 70.3611 33.7514C70.4674 33.6451 70.6026 33.5721 70.7499 33.5417C70.8972 33.5113 71.0503 33.5248 71.1901 33.5804C76.7801 36.3104 80.92 39.1803 86.98 42.0903C87.98 39.4603 84.73 34.4704 81.6 29.5404C78.66 24.9204 72.85 9.14034 75.09 6.90034C76.2 5.79034 79.56 10.5903 81.15 13.4003C86.98 23.7103 89.89 26.6303 89.89 26.6303C89.89 26.6303 77.89 5.50032 78.68 3.76032C80.47 -0.239676 88.5099 11.3303 94.8199 20.7603C98.4099 26.1403 100.65 27.4803 100.65 27.4803C100.65 27.4803 98.65 11.1203 97.29 3.48029C96.29 -2.10971 99.65 -0.749705 101.99 5.48029C103.34 9.07029 103.99 11.8504 105.99 18.0404C107.009 21.1082 108.208 24.1134 109.58 27.0404C111 30.1217 112.725 33.0531 114.73 35.7904C115.21 31.3904 115.4 29.7303 117.42 25.4803C119.56 20.9703 124.59 15.1603 122.35 24.1303C120.73 30.6803 121.25 40.0004 121.47 43.4204Z'\n                fill='#FFBC1F'\n            />\n            <path\n                d='M272.45 156.15C270.52 155.15 268.14 153.99 266.18 153.01C262.1 151.01 258.58 149.12 255.59 145.68C249.175 138.302 243.697 130.161 239.28 121.44C237.214 117.702 235.784 113.647 235.05 109.44C234.47 105.22 235.18 100.68 237.75 97.2796C242.25 91.3296 252.68 89.5996 257.66 91.1396C263.2 92.8596 270.47 100.14 275.14 106.38C281.239 114.334 286.497 122.9 290.83 131.94C291.27 132.81 293.1 141.02 293.32 141.42C298.9 151.66 306.08 155.25 306.08 155.25L310.67 153.47C312.759 152.651 315.039 152.452 317.238 152.896C319.437 153.339 321.461 154.406 323.07 155.97C324.05 156.875 324.895 157.915 325.58 159.06C330.96 169.37 331 181.01 323.79 188.2C316.58 195.39 309.39 198.2 299.35 196.5C293.746 195.396 288.374 193.336 283.47 190.41C276.47 186.41 276.01 177.14 282.15 171.94C282.13 171.91 277.61 158.9 272.45 156.15Z'\n                fill='#FFBC1F'\n            />\n            <path\n                opacity='0.5'\n                d='M277.65 162.15C287.78 157.46 290.42 151.49 291.04 149.68C291.089 149.528 291.094 149.365 291.053 149.211C291.012 149.057 290.928 148.918 290.81 148.81L290.69 148.72C290.52 148.609 290.315 148.567 290.115 148.6C289.915 148.633 289.735 148.74 289.61 148.9C288.348 150.408 286.857 151.707 285.19 152.75C282.291 154.836 278.821 155.981 275.25 156.03C273.934 156.03 272.622 155.879 271.34 155.58C271.73 155.78 272.12 155.98 272.48 156.18C274.33 157.15 276.13 159.5 277.65 162.15Z'\n                fill='#CC8F00'\n            />\n            <path\n                d='M268.63 137.64C271.752 136.617 274.352 134.418 275.88 131.51C276.28 130.75 275.12 130.07 274.72 130.84C273.37 133.445 271.055 135.419 268.27 136.34C267.46 136.61 267.81 137.91 268.63 137.64Z'\n                fill='#66320A'\n            />\n            <path\n                d='M251.67 100.91C249.31 110.09 248.9 119.62 239.93 125C233.6 120.32 230.71 105.38 235.02 97.6099C237.52 93.0999 245.68 87.87 252.02 85.88C254.08 85.23 262.94 90.09 262.85 90.88C262.19 96.88 255.63 102.66 252.54 107.88L251.67 100.91Z'\n                fill='#66320A'\n            />\n            <path\n                d='M283.24 120.21C282.85 118.14 284.82 116.32 284.99 114.21C285.21 111.49 282.52 109.54 280.15 108.21C279.861 107.998 279.508 107.892 279.15 107.91C278.55 108.01 278.29 108.7 278.15 109.29C277.685 112.018 278.275 114.821 279.8 117.13L283.24 120.21Z'\n                fill='#FFBC1F'\n            />\n            <path\n                d='M281.6 113.49C281.468 113.218 281.437 112.908 281.512 112.615C281.588 112.322 281.764 112.066 282.01 111.89C282.73 111.41 282.01 110.25 281.33 110.73C280.785 111.095 280.394 111.647 280.23 112.281C280.066 112.915 280.141 113.588 280.44 114.17C280.83 114.94 281.99 114.26 281.6 113.49Z'\n                fill='#66320A'\n            />\n            <path\n                d='M113.61 34.8394C110.27 38.2494 108.61 43.2795 107.96 47.9295C107.49 51.5095 108.96 56.4195 112.17 58.3995C112.324 58.4897 112.507 58.5151 112.68 58.4701C112.852 58.425 113 58.3133 113.09 58.1595C113.18 58.0057 113.205 57.8223 113.16 57.6497C113.115 57.4772 113.004 57.3296 112.85 57.2395C109.56 55.2395 108.85 50.3395 109.48 46.8995C110.22 42.8995 111.68 38.7295 114.56 35.7895C115.16 35.1695 114.21 34.2195 113.56 34.7895L113.61 34.8394Z'\n                fill='#66320A'\n            />\n            <path\n                d='M97.49 70.1498C100.57 72.3298 105.66 72.7098 108.54 69.8898C109.16 69.2898 108.21 68.3398 107.54 68.8898C105.06 71.3198 100.71 70.7698 98.12 68.8898C97.41 68.3898 96.7401 69.5598 97.4401 70.0498L97.49 70.1498Z'\n                fill='#66320A'\n            />\n            <path\n                d='M261.02 122.54C261.927 124.071 262.601 125.73 263.02 127.46C263.25 128.39 263.25 129.37 263.46 130.3C263.473 130.619 263.562 130.932 263.72 131.21C264.88 132.69 267.14 130.81 267.88 129.8C268.39 129.11 267.23 128.43 266.72 129.13C266.41 129.54 265.61 130.5 265.06 130.27C264.68 130.11 264.78 129.91 264.72 129.39C264.625 128.516 264.464 127.65 264.24 126.8C263.774 125.065 263.071 123.402 262.15 121.86C262.06 121.706 261.912 121.594 261.74 121.549C261.567 121.504 261.384 121.529 261.23 121.62C261.076 121.71 260.964 121.857 260.919 122.03C260.874 122.202 260.9 122.386 260.99 122.54H261.02Z'\n                fill='#66320A'\n            />\n            <path\n                d='M265.28 111.62C264.864 111.62 264.464 111.786 264.17 112.08C263.875 112.374 263.71 112.774 263.71 113.19C263.71 113.607 263.875 114.006 264.17 114.3C264.464 114.595 264.864 114.76 265.28 114.76C265.696 114.76 266.096 114.595 266.39 114.3C266.685 114.006 266.85 113.607 266.85 113.19C266.85 112.774 266.685 112.374 266.39 112.08C266.096 111.786 265.696 111.62 265.28 111.62Z'\n                fill='#66320A'\n            />\n            <path\n                d='M252.39 120.479C251.997 120.511 251.629 120.69 251.362 120.98C251.094 121.27 250.945 121.65 250.945 122.045C250.945 122.439 251.094 122.819 251.362 123.109C251.629 123.4 251.997 123.578 252.39 123.609C252.783 123.578 253.151 123.4 253.418 123.109C253.686 122.819 253.835 122.439 253.835 122.045C253.835 121.65 253.686 121.27 253.418 120.98C253.151 120.69 252.783 120.511 252.39 120.479Z'\n                fill='#66320A'\n            />\n            <path\n                d='M233.82 208.56L247.56 179.08'\n                stroke='#5E4200'\n                strokeWidth='1.34'\n                strokeMiterlimit='10'\n                strokeLinecap='round'\n            />\n        </g>\n        <defs>\n            <pattern\n                id='pattern0'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    xlinkHref='#image0'\n                    transform='scale(0.0103093 0.00584795)'\n                />\n            </pattern>\n            <pattern\n                id='pattern1'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    xlinkHref='#image1'\n                    transform='scale(0.00833333 0.00775194)'\n                />\n            </pattern>\n            <clipPath id='clip0'>\n                <rect\n                    width='346'\n                    height='312'\n                    fill='var(--center-channel-bg)'\n                    transform='translate(48)'\n                />\n            </clipPath>\n            <image\n                id='image0'\n                width='97'\n                height='171'\n                xlinkHref='data:image/png;base64,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'\n            />\n            <image\n                id='image1'\n                width='120'\n                height='129'\n                xlinkHref='data:image/png;base64,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'\n            />\n        </defs>\n    </svg>\n\n);\n\nexport default EmptyStateThemeableSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\n\nimport {useSelector} from 'react-redux';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport ToggleModalButtonRedux from 'components/toggle_modal_button_redux';\nimport ToggleModalButton from 'components/toggle_modal_button.jsx';\nimport InvitationModal from 'components/invitation_modal';\nimport ChannelInviteModal from 'components/channel_invite_modal';\nimport AddGroupsToChannelModal from 'components/add_groups_to_channel_modal';\nimport ChannelPermissionGate from 'components/permissions_gates/channel_permission_gate';\nimport EmptyStateThemeableSvg from 'components/common/svg_images_components/empty_state_themeable.svg';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\n\nimport {Constants, ModalIdentifiers} from 'utils/constants';\nimport {localizeMessage} from 'utils/utils';\n\nimport './add_members_button.scss';\n\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nexport interface AddMembersButtonProps {\n    totalUsers?: number;\n    usersLimit: number;\n    channel: Channel;\n    setHeader: React.ReactNode;\n}\n\nconst AddMembersButton: React.FC<AddMembersButtonProps> = ({totalUsers, usersLimit, channel, setHeader}: AddMembersButtonProps) => {\n    if (!totalUsers) {\n        return (<LoadingSpinner/>);\n    }\n\n    const isPrivate = channel.type === Constants.PRIVATE_CHANNEL;\n    const inviteUsers = totalUsers < usersLimit;\n    const currentTeamId = useSelector(getCurrentTeamId);\n\n    return (\n        <TeamPermissionGate\n            teamId={currentTeamId}\n            permissions={[Permissions.ADD_USER_TO_TEAM, Permissions.INVITE_GUEST]}\n        >\n            {inviteUsers && !isPrivate ? lessThanMaxFreeUsers(setHeader) : moreThanMaxFreeUsers(channel, setHeader)}\n        </TeamPermissionGate>\n    );\n};\n\nconst lessThanMaxFreeUsers = (setHeader: React.ReactNode) => {\n    return (\n        <>\n            {setHeader}\n            <div className='LessThanMaxFreeUsers'>\n                <EmptyStateThemeableSvg\n                    width={128}\n                    height={113}\n                />\n                <div className='titleAndButton'>\n                    <FormattedMessage\n                        id='intro_messages.inviteOthersToWorkspace.title'\n                        defaultMessage='Let’s add some people to the workspace!'\n                    />\n                    <ToggleModalButtonRedux\n                        ariaLabel={localizeMessage('intro_messages.inviteOthers', 'Invite others to the workspace')}\n                        id='introTextInvite'\n                        className='intro-links color--link cursor--pointer'\n                        modalId={ModalIdentifiers.INVITATION}\n                        dialogType={InvitationModal}\n                    >\n                        <FormattedMessage\n                            id='generic_icons.add'\n                            defaultMessage='Add Icon'\n                        >\n                            {(title: string) => (\n                                <i\n                                    className='icon-email-plus-outline'\n                                    title={title}\n                                />\n                            )}\n                        </FormattedMessage>\n                        <FormattedMessage\n                            id='intro_messages.inviteOthersToWorkspace.button'\n                            defaultMessage='Invite others to the workspace'\n                        />\n                    </ToggleModalButtonRedux>\n                </div>\n            </div>\n        </>\n    );\n};\n\nconst moreThanMaxFreeUsers = (channel: Channel, setHeader: React.ReactNode) => {\n    const modal = channel.group_constrained ? AddGroupsToChannelModal : ChannelInviteModal;\n    const channelIsArchived = channel.delete_at !== 0;\n    if (channelIsArchived) {\n        return null;\n    }\n    const isPrivate = channel.type === Constants.PRIVATE_CHANNEL;\n    return (\n        <div className='MoreThanMaxFreeUsersWrapper'>\n            <div className='MoreThanMaxFreeUsers'>\n                <ChannelPermissionGate\n                    channelId={channel.id}\n                    teamId={channel.team_id}\n                    permissions={[isPrivate ? Permissions.MANAGE_PRIVATE_CHANNEL_MEMBERS : Permissions.MANAGE_PUBLIC_CHANNEL_MEMBERS]}\n                >\n                    <ToggleModalButton\n                        className='intro-links color--link'\n                        dialogType={modal}\n                        dialogProps={{channel}}\n                    >\n                        <FormattedMessage\n                            id='generic_icons.add'\n                            defaultMessage='Add Icon'\n                        >\n                            {(title: string) => (\n                                <i\n                                    className='icon-account-plus-outline'\n                                    title={title}\n                                />\n                            )}\n                        </FormattedMessage>\n                        {isPrivate && channel.group_constrained &&\n                            <FormattedMessage\n                                id='intro_messages.inviteGropusToChannel.button'\n                                defaultMessage='Add groups to this private channel'\n                            />}\n                        {isPrivate && !channel.group_constrained &&\n                            <FormattedMessage\n                                id='intro_messages.inviteMembersToPrivateChannel.button'\n                                defaultMessage='Add members to this private channel'\n                            />}\n                        {!isPrivate &&\n                            <FormattedMessage\n                                id='intro_messages.inviteMembersToChannel.button'\n                                defaultMessage='Add members to this channel'\n                            />}\n                    </ToggleModalButton>\n                </ChannelPermissionGate>\n            </div>\n            {setHeader}\n        </div>\n    );\n};\n\nexport default React.memo(AddMembersButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {FormattedDate, FormattedMessage} from 'react-intl';\n\nimport React from 'react';\n\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport {UserProfile as UserProfileRedux} from 'mattermost-redux/types/users';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport {Constants, ModalIdentifiers} from 'utils/constants';\nimport EditChannelHeaderModal from 'components/edit_channel_header_modal';\nimport ProfilePicture from 'components/profile_picture';\nimport ToggleModalButtonRedux from 'components/toggle_modal_button_redux';\nimport ToggleModalButton from 'components/toggle_modal_button.jsx';\nimport UserProfile from 'components/user_profile';\nimport ChannelPermissionGate from 'components/permissions_gates/channel_permission_gate';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport EditIcon from 'components/widgets/icons/fa_edit_icon';\nimport AddGroupsToTeamModal from 'components/add_groups_to_team_modal';\n\nimport {getMonthLong} from 'utils/i18n.jsx';\nimport * as Utils from 'utils/utils.jsx';\n\nimport AddMembersButton from './add_members_button';\n\ntype Props = {\n    currentUserId: string;\n    channel: Channel;\n    fullWidth: boolean;\n    locale: string;\n    channelProfiles: UserProfileRedux[];\n    enableUserCreation?: boolean;\n    isReadOnly?: boolean;\n    teamIsGroupConstrained?: boolean;\n    creatorName: string;\n    teammate?: UserProfileRedux;\n    teammateName?: string;\n    stats: any;\n    usersLimit: number;\n    actions: {\n        getTotalUsersStats: () => any;\n    };\n}\n\nexport default class ChannelIntroMessage extends React.PureComponent<Props> {\n    componentDidMount() {\n        if (!this.props.stats?.total_users_count) {\n            this.props.actions.getTotalUsersStats();\n        }\n    }\n    render() {\n        const {\n            currentUserId,\n            channel,\n            creatorName,\n            fullWidth,\n            locale,\n            enableUserCreation,\n            isReadOnly,\n            channelProfiles,\n            teamIsGroupConstrained,\n            teammate,\n            teammateName,\n            stats,\n            usersLimit,\n        } = this.props;\n\n        let centeredIntro = '';\n        if (!fullWidth) {\n            centeredIntro = 'channel-intro--centered';\n        }\n\n        if (channel.type === Constants.DM_CHANNEL) {\n            return createDMIntroMessage(channel, centeredIntro, teammate, teammateName);\n        } else if (channel.type === Constants.GM_CHANNEL) {\n            return createGMIntroMessage(channel, centeredIntro, channelProfiles, currentUserId);\n        } else if (channel.name === Constants.DEFAULT_CHANNEL) {\n            return createDefaultIntroMessage(channel, centeredIntro, stats, usersLimit, enableUserCreation, isReadOnly, teamIsGroupConstrained);\n        } else if (channel.name === Constants.OFFTOPIC_CHANNEL) {\n            return createOffTopicIntroMessage(channel, centeredIntro, stats, usersLimit);\n        } else if (channel.type === Constants.OPEN_CHANNEL || channel.type === Constants.PRIVATE_CHANNEL) {\n            return createStandardIntroMessage(channel, centeredIntro, stats, usersLimit, locale, creatorName);\n        }\n        return null;\n    }\n}\n\nfunction createGMIntroMessage(channel: Channel, centeredIntro: string, profiles: UserProfileRedux[], currentUserId: string) {\n    const channelIntroId = 'channelIntro';\n\n    if (profiles.length > 0) {\n        const pictures = profiles.\n            filter((profile) => profile.id !== currentUserId).\n            map((profile) => (\n                <ProfilePicture\n                    key={'introprofilepicture' + profile.id}\n                    src={Utils.imageURLForUser(profile.id, profile.last_picture_update)}\n                    size='xl'\n                    userId={profile.id}\n                    username={profile.username}\n                />\n            ));\n\n        return (\n            <div\n                id={channelIntroId}\n                className={'channel-intro ' + centeredIntro}\n            >\n                <div className='post-profile-img__container channel-intro-img'>\n                    {pictures}\n                </div>\n                <p className='channel-intro-text'>\n                    <FormattedMarkdownMessage\n                        id='intro_messages.GM'\n                        defaultMessage='This is the start of your group message history with {names}.\\nMessages and files shared here are not shown to people outside this area.'\n                        values={{\n                            names: channel.display_name,\n                        }}\n                    />\n                </p>\n                {createSetHeaderButton(channel)}\n            </div>\n        );\n    }\n\n    return (\n        <div\n            id={channelIntroId}\n            className={'channel-intro ' + centeredIntro}\n        >\n            <p className='channel-intro-text'>\n                <FormattedMessage\n                    id='intro_messages.group_message'\n                    defaultMessage='This is the start of your group message history with these teammates. Messages and files shared here are not shown to people outside this area.'\n                />\n            </p>\n        </div>\n    );\n}\n\nfunction createDMIntroMessage(channel: Channel, centeredIntro: string, teammate?: UserProfileRedux, teammateName?: string) {\n    const channelIntroId = 'channelIntro';\n    if (teammate) {\n        const src = teammate ? Utils.imageURLForUser(teammate.id, teammate.last_picture_update) : '';\n\n        return (\n            <div\n                id={channelIntroId}\n                className={'channel-intro ' + centeredIntro}\n            >\n                <div className='post-profile-img__container channel-intro-img'>\n                    <ProfilePicture\n                        src={src}\n                        size='xl'\n                        userId={teammate?.id}\n                        username={teammate?.username}\n                        hasMention={true}\n                    />\n                </div>\n                <div className='channel-intro-profile d-flex'>\n                    <UserProfile\n                        userId={teammate?.id}\n                        disablePopover={false}\n                        hasMention={true}\n                    />\n                </div>\n                <p className='channel-intro-text'>\n                    <FormattedMarkdownMessage\n                        id='intro_messages.DM'\n                        defaultMessage='This is the start of your direct message history with {teammate}.\\nDirect messages and files shared here are not shown to people outside this area.'\n                        values={{\n                            teammate: teammateName,\n                        }}\n                    />\n                </p>\n                {teammate?.is_bot ? null : createSetHeaderButton(channel)}\n            </div>\n        );\n    }\n\n    return (\n        <div\n            id={channelIntroId}\n            className={'channel-intro ' + centeredIntro}\n        >\n            <p className='channel-intro-text'>\n                <FormattedMessage\n                    id='intro_messages.teammate'\n                    defaultMessage='This is the start of your direct message history with this teammate. Direct messages and files shared here are not shown to people outside this area.'\n                />\n            </p>\n        </div>\n    );\n}\n\nfunction createOffTopicIntroMessage(channel: Channel, centeredIntro: string, stats: any, usersLimit: number) {\n    const isPrivate = channel.type === Constants.PRIVATE_CHANNEL;\n    const children = createSetHeaderButton(channel);\n    const totalUsers = stats.total_users_count;\n\n    let setHeaderButton = null;\n    if (children) {\n        setHeaderButton = (\n            <ChannelPermissionGate\n                teamId={channel.team_id}\n                channelId={channel.id}\n                permissions={[isPrivate ? Permissions.MANAGE_PRIVATE_CHANNEL_PROPERTIES : Permissions.MANAGE_PUBLIC_CHANNEL_PROPERTIES]}\n            >\n                {children}\n            </ChannelPermissionGate>\n        );\n    }\n\n    const channelInviteButton = (\n        <AddMembersButton\n            setHeader={setHeaderButton}\n            totalUsers={totalUsers}\n            usersLimit={usersLimit}\n            channel={channel}\n        />\n    );\n\n    return (\n        <div\n            id='channelIntro'\n            className={'channel-intro ' + centeredIntro}\n        >\n            <h2 className='channel-intro__title'>\n                <FormattedMessage\n                    id='intro_messages.beginning'\n                    defaultMessage='Beginning of {name}'\n                    values={{\n                        name: channel.display_name,\n                    }}\n                />\n            </h2>\n            <p className='channel-intro__content'>\n                <FormattedMessage\n                    id='intro_messages.offTopic'\n                    defaultMessage='This is the start of {display_name}, a channel for non-work-related conversations.'\n                    values={{\n                        display_name: channel.display_name,\n                    }}\n                />\n            </p>\n            {channelInviteButton}\n        </div>\n    );\n}\n\nexport function createDefaultIntroMessage(\n    channel: Channel,\n    centeredIntro: string,\n    stats: any,\n    usersLimit: number,\n    enableUserCreation?: boolean,\n    isReadOnly?: boolean,\n    teamIsGroupConstrained?: boolean,\n) {\n    let teamInviteLink = null;\n    const totalUsers = stats.total_users_count;\n    const isPrivate = channel.type === Constants.PRIVATE_CHANNEL;\n\n    let setHeaderButton = null;\n    if (!isReadOnly) {\n        const children = createSetHeaderButton(channel);\n        if (children) {\n            setHeaderButton = (\n                <ChannelPermissionGate\n                    teamId={channel.team_id}\n                    channelId={channel.id}\n                    permissions={[isPrivate ? Permissions.MANAGE_PRIVATE_CHANNEL_PROPERTIES : Permissions.MANAGE_PUBLIC_CHANNEL_PROPERTIES]}\n                >\n                    {children}\n                </ChannelPermissionGate>\n            );\n        }\n    }\n\n    if (!isReadOnly && enableUserCreation) {\n        teamInviteLink = (\n            <TeamPermissionGate\n                teamId={channel.team_id}\n                permissions={[Permissions.INVITE_USER]}\n            >\n                <TeamPermissionGate\n                    teamId={channel.team_id}\n                    permissions={[Permissions.ADD_USER_TO_TEAM]}\n                >\n                    {!teamIsGroupConstrained &&\n                        <AddMembersButton\n                            setHeader={setHeaderButton}\n                            totalUsers={totalUsers}\n                            usersLimit={usersLimit}\n                            channel={channel}\n                        />\n                    }\n                    {teamIsGroupConstrained &&\n                    <ToggleModalButton\n                        className='intro-links color--link'\n                        dialogType={AddGroupsToTeamModal}\n                        dialogProps={{channel}}\n                    >\n                        <FormattedMessage\n                            id='generic_icons.add'\n                            defaultMessage='Add Icon'\n                        >\n                            {(title: string) => (\n                                <i\n                                    className='fa fa-user-plus'\n                                    title={title}\n                                />\n                            )}\n                        </FormattedMessage>\n                        <FormattedMessage\n                            id='intro_messages.addGroupsToTeam'\n                            defaultMessage='Add other groups to this team'\n                        />\n                    </ToggleModalButton>\n                    }\n                </TeamPermissionGate>\n            </TeamPermissionGate>\n        );\n    }\n\n    return (\n        <div\n            id='channelIntro'\n            className={'channel-intro ' + centeredIntro}\n        >\n            <h2 className='channel-intro__title'>\n                <FormattedMessage\n                    id='intro_messages.beginning'\n                    defaultMessage='Beginning of {name}'\n                    values={{\n                        name: channel.display_name,\n                    }}\n                />\n            </h2>\n            <p className='channel-intro__content'>\n                {!isReadOnly &&\n                    <FormattedMarkdownMessage\n                        id='intro_messages.default'\n                        defaultMessage='**Welcome to {display_name}!**\\n \\nPost messages here that you want everyone to see. Everyone automatically becomes a permanent member of this channel when they join the team.'\n                        values={{\n                            display_name: channel.display_name,\n                        }}\n                    />\n                }\n                {isReadOnly &&\n                    <FormattedMarkdownMessage\n                        id='intro_messages.readonly.default'\n                        defaultMessage='**Welcome to {display_name}!**\\n \\nMessages can only be posted by system admins. Everyone automatically becomes a permanent member of this channel when they join the team.'\n                        values={{\n                            display_name: channel.display_name,\n                        }}\n                    />\n                }\n            </p>\n            {teamInviteLink}\n            {teamIsGroupConstrained && setHeaderButton}\n            <br/>\n        </div>\n    );\n}\n\nfunction createStandardIntroMessage(channel: Channel, centeredIntro: string, stats: any, usersLimit: number, locale: string, creatorName: string) {\n    const uiName = channel.display_name;\n    let memberMessage;\n    const channelIsArchived = channel.delete_at !== 0;\n    const totalUsers = stats.total_users_count;\n\n    if (channelIsArchived) {\n        memberMessage = '';\n    } else if (channel.type === Constants.PRIVATE_CHANNEL) {\n        memberMessage = (\n            <FormattedMessage\n                id='intro_messages.onlyInvited'\n                defaultMessage=' Only invited members can see this private channel.'\n            />\n        );\n    } else {\n        memberMessage = (\n            <FormattedMessage\n                id='intro_messages.anyMember'\n                defaultMessage=' Any member can join and read this channel.'\n            />\n        );\n    }\n\n    const date = (\n        <FormattedDate\n            value={channel.create_at}\n            month={getMonthLong(locale)}\n            day='2-digit'\n            year='numeric'\n        />\n    );\n\n    let createMessage;\n    if (creatorName === '') {\n        if (channel.type === Constants.PRIVATE_CHANNEL) {\n            createMessage = (\n                <FormattedMessage\n                    id='intro_messages.noCreatorPrivate'\n                    defaultMessage='This is the start of the {name} private channel, created on {date}.'\n                    values={{name: (uiName), date}}\n                />\n            );\n        } else if (channel.type === Constants.OPEN_CHANNEL) {\n            createMessage = (\n                <FormattedMessage\n                    id='intro_messages.noCreator'\n                    defaultMessage='This is the start of the {name} channel, created on {date}.'\n                    values={{name: (uiName), date}}\n                />\n            );\n        }\n    } else if (channel.type === Constants.PRIVATE_CHANNEL) {\n        createMessage = (\n            <span>\n                <FormattedMessage\n                    id='intro_messages.creatorPrivate'\n                    defaultMessage='This is the start of the {name} private channel, created by {creator} on {date}.'\n                    values={{\n                        name: (uiName),\n                        creator: (creatorName),\n                        date,\n                    }}\n                />\n            </span>\n        );\n    } else if (channel.type === Constants.OPEN_CHANNEL) {\n        createMessage = (\n            <span>\n                <FormattedMessage\n                    id='intro_messages.creator'\n                    defaultMessage='This is the start of the {name} channel, created by {creator} on {date}.'\n                    values={{\n                        name: (uiName),\n                        creator: (creatorName),\n                        date,\n                    }}\n                />\n            </span>\n        );\n    }\n\n    let purposeMessage;\n    if (channel.purpose && channel.purpose !== '') {\n        if (channel.type === Constants.PRIVATE_CHANNEL) {\n            purposeMessage = (\n                <span>\n                    <FormattedMessage\n                        id='intro_messages.purposePrivate'\n                        defaultMessage=\" This private channel's purpose is: {purpose}\"\n                        values={{purpose: channel.purpose}}\n                    />\n                </span>\n            );\n        } else if (channel.type === Constants.OPEN_CHANNEL) {\n            purposeMessage = (\n                <span>\n                    <FormattedMessage\n                        id='intro_messages.purpose'\n                        defaultMessage=\" This channel's purpose is: {purpose}\"\n                        values={{purpose: channel.purpose}}\n                    />\n                </span>\n            );\n        }\n    }\n\n    const isPrivate = channel.type === Constants.PRIVATE_CHANNEL;\n    let setHeaderButton = null;\n    const children = createSetHeaderButton(channel);\n    if (children) {\n        setHeaderButton = (\n            <ChannelPermissionGate\n                teamId={channel.team_id}\n                channelId={channel.id}\n                permissions={[isPrivate ? Permissions.MANAGE_PRIVATE_CHANNEL_PROPERTIES : Permissions.MANAGE_PUBLIC_CHANNEL_PROPERTIES]}\n            >\n                {children}\n            </ChannelPermissionGate>\n        );\n    }\n\n    const channelInviteButton = (\n        <AddMembersButton\n            totalUsers={totalUsers}\n            usersLimit={usersLimit}\n            channel={channel}\n            setHeader={setHeaderButton}\n        />\n    );\n\n    return (\n        <div\n            id='channelIntro'\n            className={'channel-intro ' + centeredIntro}\n        >\n            <h2 className='channel-intro__title'>\n                <FormattedMessage\n                    id='intro_messages.beginning'\n                    defaultMessage='Beginning of {name}'\n                    values={{\n                        name: (uiName),\n                    }}\n                />\n            </h2>\n            <p className='channel-intro__content'>\n                {createMessage}\n                {memberMessage}\n                {purposeMessage}\n                <br/>\n            </p>\n            {channelInviteButton}\n        </div>\n    );\n}\n\nfunction createSetHeaderButton(channel: Channel) {\n    const channelIsArchived = channel.delete_at !== 0;\n    if (channelIsArchived) {\n        return null;\n    }\n\n    return (\n        <ToggleModalButtonRedux\n            modalId={ModalIdentifiers.EDIT_CHANNEL_HEADER}\n            ariaLabel={Utils.localizeMessage('intro_messages.setHeader', 'Set a Header')}\n            className={'intro-links color--link setHeaderButton'}\n            dialogType={EditChannelHeaderModal}\n            dialogProps={{channel}}\n        >\n            <EditIcon/>\n            <FormattedMessage\n                id='intro_messages.setHeader'\n                defaultMessage='Set a Header'\n            />\n        </ToggleModalButtonRedux>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentChannel, getDirectTeammate} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getProfilesInCurrentChannel, getCurrentUserId, getUser, getTotalUsersStats as getTotalUsersStatsSelector} from 'mattermost-redux/selectors/entities/users';\nimport {get} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {getTotalUsersStats} from 'mattermost-redux/actions/users';\n\nimport {Preferences} from 'utils/constants';\nimport {getDisplayNameByUser} from 'utils/utils.jsx';\nimport {getCurrentLocale} from 'selectors/i18n';\n\nimport {GlobalState} from 'types/store';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport ChannelIntroMessage from './channel_intro_message';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n    const enableUserCreation = config.EnableUserCreation === 'true';\n    const isReadOnly = false;\n    const team = getCurrentTeam(state);\n    const channel = getCurrentChannel(state) || {};\n    const teammate = getDirectTeammate(state, channel.id);\n    const creator = getUser(state, channel.creator_id);\n\n    let usersLimit = parseInt(getConfig(state).ExperimentalCloudUserLimit! || '10', 10);\n    if (usersLimit === 0) {\n        usersLimit = 10;\n    }\n\n    const stats = getTotalUsersStatsSelector(state) || {total_users_count: 0};\n\n    return {\n        currentUserId: getCurrentUserId(state),\n        channel,\n        fullWidth: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CHANNEL_DISPLAY_MODE, Preferences.CHANNEL_DISPLAY_MODE_DEFAULT) === Preferences.CHANNEL_DISPLAY_MODE_FULL_SCREEN,\n        locale: getCurrentLocale(state),\n        channelProfiles: getProfilesInCurrentChannel(state),\n        enableUserCreation,\n        isReadOnly,\n        teamIsGroupConstrained: Boolean(team.group_constrained),\n        creatorName: getDisplayNameByUser(state, creator),\n        teammate,\n        teammateName: getDisplayNameByUser(state, teammate),\n        stats,\n        usersLimit,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            getTotalUsersStats,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelIntroMessage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport classNames from 'classnames';\n\nimport * as PostListUtils from 'mattermost-redux/utils/post_list';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport CombinedUserActivityPost from 'components/post_view/combined_user_activity_post';\nimport Post from 'components/post_view/post';\nimport DateSeparator from 'components/post_view/date_separator';\nimport NewMessageSeparator from 'components/post_view/new_message_separator/new_message_separator';\nimport ChannelIntroMessage from 'components/post_view/channel_intro_message/';\nimport {isIdNotPost} from 'utils/post_utils';\nimport {PostListRowListIds, Locations} from 'utils/constants';\n\nexport type PostListRowProps = {\n    channel?: Channel;\n    listId: string;\n    previousListId?: string;\n    fullWidth?: boolean;\n    shouldHighlight?: boolean;\n    loadOlderPosts: () => void;\n    loadNewerPosts: () => void;\n    togglePostMenu: () => void;\n\n    /**\n     * To Check if the current post is last in the list\n     */\n    isLastPost: boolean;\n\n    /**\n     * To check if the state of emoji for last message and from where it was emitted\n     */\n    shortcutReactToLastPostEmittedFrom: string;\n\n    /**\n     * is used for hiding animation of loader\n     */\n    loadingNewerPosts: boolean;\n    loadingOlderPosts: boolean;\n\n    actions: {\n\n        /**\n          * Function to set or unset emoji picker for last message\n          */\n        emitShortcutReactToLastPostFrom: (location: string) => void;\n    };\n}\n\nexport default class PostListRow extends React.PureComponent<PostListRowProps> {\n    blockShortcutReactToLastPostForNonMessages(listId: string) {\n        const {actions: {emitShortcutReactToLastPostFrom}} = this.props;\n\n        if (isIdNotPost(listId)) {\n            // This is a good escape hatch as any of the above conditions don't return <Post/> component, Emoji picker is only at Post component\n            emitShortcutReactToLastPostFrom(Locations.NO_WHERE);\n        }\n    }\n\n    componentDidUpdate(prevProps: PostListRowProps) {\n        const {listId, isLastPost, shortcutReactToLastPostEmittedFrom} = this.props;\n\n        const shortcutReactToLastPostEmittedFromCenter = prevProps.shortcutReactToLastPostEmittedFrom !== shortcutReactToLastPostEmittedFrom &&\n            shortcutReactToLastPostEmittedFrom === Locations.CENTER;\n\n        // If last post is not a message then we block the shortcut to react to last message, early on\n        if (isLastPost && shortcutReactToLastPostEmittedFromCenter) {\n            this.blockShortcutReactToLastPostForNonMessages(listId);\n        }\n    }\n\n    render() {\n        const {listId, previousListId, loadingOlderPosts, loadingNewerPosts} = this.props;\n        const {\n            OLDER_MESSAGES_LOADER,\n            NEWER_MESSAGES_LOADER,\n            CHANNEL_INTRO_MESSAGE,\n            LOAD_OLDER_MESSAGES_TRIGGER,\n            LOAD_NEWER_MESSAGES_TRIGGER,\n        } = PostListRowListIds;\n\n        if (PostListUtils.isDateLine(listId)) {\n            const date = PostListUtils.getDateForDateLine(listId);\n\n            return (\n                <DateSeparator\n                    key={date}\n                    date={date}\n                />\n            );\n        }\n\n        if (PostListUtils.isStartOfNewMessages(listId)) {\n            return (\n                <NewMessageSeparator separatorId={listId}/>\n            );\n        }\n\n        if (listId === CHANNEL_INTRO_MESSAGE) {\n            return (\n                <ChannelIntroMessage/>\n            );\n        }\n\n        if (listId === LOAD_OLDER_MESSAGES_TRIGGER || listId === LOAD_NEWER_MESSAGES_TRIGGER) {\n            return (\n                <button\n                    className='more-messages-text theme style--none color--link'\n                    onClick={listId === LOAD_OLDER_MESSAGES_TRIGGER ? this.props.loadOlderPosts : this.props.loadNewerPosts}\n                >\n                    <FormattedMessage\n                        id='posts_view.loadMore'\n                        defaultMessage='Load More Messages'\n                    />\n                </button>\n            );\n        }\n\n        const isOlderMessagesLoader = listId === OLDER_MESSAGES_LOADER;\n        const isNewerMessagesLoader = listId === NEWER_MESSAGES_LOADER;\n        if (isOlderMessagesLoader || isNewerMessagesLoader) {\n            const shouldHideAnimation = !loadingOlderPosts && !loadingNewerPosts;\n\n            return (\n                <div\n                    className='loading-screen'\n                >\n                    <div className={classNames('loading__content', {hideAnimation: shouldHideAnimation})}>\n                        <div className='round round-1'/>\n                        <div className='round round-2'/>\n                        <div className='round round-3'/>\n                    </div>\n                </div>\n            );\n        }\n\n        const postProps = {\n            previousPostId: previousListId,\n            shouldHighlight: this.props.shouldHighlight,\n            togglePostMenu: this.props.togglePostMenu,\n            isLastPost: this.props.isLastPost,\n        };\n\n        if (PostListUtils.isCombinedUserActivityPost(listId)) {\n            return (\n                <CombinedUserActivityPost\n                    combinedId={listId}\n                    {...postProps}\n                />\n            );\n        }\n\n        return (\n            <Post\n                postId={listId}\n                {...postProps}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {getShortcutReactToLastPostEmittedFrom} from 'selectors/emojis';\nimport {emitShortcutReactToLastPostFrom} from 'actions/post_actions.jsx';\n\nimport {GlobalState} from 'types/store';\n\nimport PostListRow from './post_list_row';\n\ntype Props = {\n    post: Post;\n    channel: Channel;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const shortcutReactToLastPostEmittedFrom = getShortcutReactToLastPostEmittedFrom(state);\n\n    return {\n        post: ownProps.post,\n        channel: ownProps.channel,\n        shortcutReactToLastPostEmittedFrom,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            emitShortcutReactToLastPostFrom,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PostListRow);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function ScrollToBottomIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                x='0px'\n                y='0px'\n                viewBox='-239 239 21 23'\n                enableBackground='new -239 239 21 23'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.arrow.down', defaultMessage: 'Down Arrow Icon'})}\n            >\n                <path d='M-239,241.4l2.4-2.4l8.1,8.2l8.1-8.2l2.4,2.4l-10.5,10.6L-239,241.4z M-228.5,257.2l8.1-8.2l2.4,2.4l-10.5,10.6l-10.5-10.6 l2.4-2.4L-228.5,257.2z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport $ from 'jquery';\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport ScrollToBottomIcon from 'components/widgets/icons/scroll_to_bottom_icon';\n\nexport default class ScrollToBottomArrows extends React.PureComponent {\n    static propTypes = {\n        isScrolling: PropTypes.bool.isRequired,\n        atBottom: PropTypes.bool,\n        onClick: PropTypes.func.isRequired,\n    };\n\n    render() {\n        // only show on mobile\n        if ($(window).width() > 768) {\n            return null;\n        }\n\n        let className = 'post-list__arrows';\n        if (this.props.isScrolling && this.props.atBottom === false) {\n            className += ' scrolling';\n        }\n\n        return (\n            <div\n                className={className}\n                onClick={this.props.onClick}\n            >\n                <ScrollToBottomIcon/>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ReactNode, MouseEventHandler} from 'react';\n\nimport {FormattedMessage} from 'react-intl';\nimport {Tooltip} from 'react-bootstrap';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport UnreadBelowIcon from 'components/widgets/icons/unread_below_icon';\nimport CloseIcon from 'components/widgets/icons/close_icon';\nimport Constants from 'utils/constants';\n\nimport './toast.scss';\n\nexport type Props = {\n    onClick?: MouseEventHandler<HTMLDivElement>;\n    onClickMessage?: string;\n    onDismiss?: () => void;\n    children?: ReactNode;\n    show: boolean;\n    showActions?: boolean; //used for showing jump actions\n    width: number;\n    extraClasses?: string;\n}\n\nexport default class Toast extends React.PureComponent<Props> {\n    private mounted!: boolean;\n\n    componentDidMount() {\n        this.mounted = true;\n    }\n\n    componentWillUnmount() {\n        this.mounted = false;\n    }\n\n    handleDismiss = () => {\n        if (typeof this.props.onDismiss == 'function') {\n            this.props.onDismiss();\n        }\n    }\n\n    render() {\n        let toastClass = 'toast';\n        const {show, extraClasses, showActions, width} = this.props;\n        if (extraClasses) {\n            toastClass += ` ${extraClasses}`;\n        }\n\n        if (show) {\n            toastClass += ' toast__visible';\n        }\n\n        let toastActionClass = 'toast__message';\n        if (showActions) {\n            toastActionClass += ' toast__pointer';\n        }\n\n        const jumpSection = () => {\n            return (\n                <div\n                    className='toast__jump'\n                >\n                    <UnreadBelowIcon/>\n                    {width > Constants.MOBILE_SCREEN_WIDTH && this.props.onClickMessage}\n                </div>\n            );\n        };\n\n        let closeTooltip = (<div/>);\n        if (showActions && show) {\n            closeTooltip = (\n                <Tooltip id='toast-close__tooltip'>\n                    <FormattedMessage\n                        id='general_button.close'\n                        defaultMessage='Close'\n                    />\n                    <div className='tooltip__shortcut--txt'>\n                        <FormattedMessage\n                            id='general_button.esc'\n                            defaultMessage='esc'\n                        />\n                    </div>\n                </Tooltip>\n            );\n        }\n\n        return (\n            <div className={toastClass}>\n                <div\n                    className={toastActionClass}\n                    onClick={showActions ? this.props.onClick : undefined}\n                >\n                    {showActions && jumpSection()}\n                    {this.props.children}\n                </div>\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='bottom'\n                    overlay={closeTooltip}\n                >\n                    <div\n                        className='toast__dismiss'\n                        onClick={this.handleDismiss}\n                        data-testid={extraClasses ? `dismissToast-${extraClasses}` : 'dismissToast'}\n                    >\n                        <CloseIcon\n                            className='close-btn'\n                            id='dismissToast'\n                        />\n                    </div>\n                </OverlayTrigger>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\n\nimport './shortcut_key.scss';\n\nexport enum ShortcutKetVariant {\n    Contrast = 'contrast',\n}\n\nexport type ShortcutKeyProps = {\n    variant?: ShortcutKetVariant;\n    children: React.ReactNode;\n}\n\nexport const ShortcutKey = ({children, variant}: ShortcutKeyProps) => {\n    let className = 'shortcut-key';\n    if (variant === ShortcutKetVariant.Contrast) {\n        className += ' shortcut-key--contrast';\n    }\n\n    return (\n        <mark className={className}>\n            {children}\n        </mark>\n    );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\n\nimport {ShortcutKey, ShortcutKetVariant} from 'components/shortcut_key';\n\nimport {isMac} from 'utils/utils.jsx';\nimport {isDesktopApp} from 'utils/user_agent';\nimport './search_shortcut.scss';\n\nexport const SearchShortcut = () => {\n    const controlKey = isMac() ? '⌘' : 'Ctrl';\n\n    return (\n        <span className='search-shortcut'>\n            <ShortcutKey variant={ShortcutKetVariant.Contrast}>{controlKey}</ShortcutKey>\n            {!isDesktopApp() && <ShortcutKey variant={ShortcutKetVariant.Contrast}>{'Shift'}</ShortcutKey>}\n            <ShortcutKey variant={ShortcutKetVariant.Contrast}>{'F'}</ShortcutKey>\n        </span>\n    );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\n\nimport CloseIcon from 'components/widgets/icons/close_icon';\n\nimport './hint_toast.scss';\n\ntype Props = {\n    children: React.ReactNode;\n    onDismiss: () => void;\n}\n\nexport const HintToast: React.FC<Props> = ({children, onDismiss}: Props) => {\n    const handleDismiss = () => {\n        if (typeof onDismiss === 'function') {\n            onDismiss();\n        }\n    };\n\n    return (\n        <div className='hint-toast__wrapper'>\n            <div className='hint-toast'>\n                <div\n                    className='hint-toast__message'\n                >\n                    {children}\n                </div>\n                <div\n                    className='hint-toast__dismiss'\n                    onClick={handleDismiss}\n                    data-testid='dismissHintToast'\n                >\n                    <CloseIcon\n                        className='close-btn'\n                        id='dismissHintToast'\n                    />\n                </div>\n            </div>\n        </div>\n    );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {FormattedMessage, injectIntl} from 'react-intl';\n\nimport Toast from 'components/toast/toast';\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\nimport {isIdNotPost, getNewMessageIndex} from 'utils/post_utils';\nimport * as Utils from 'utils/utils.jsx';\nimport {isToday} from 'utils/datetime';\nimport Constants from 'utils/constants';\nimport {browserHistory} from 'utils/browser_history';\nimport {SearchShortcut} from 'components/search_shortcut/search_shortcut';\nimport {HintToast} from 'components/hint-toast/hint_toast';\n\nconst TOAST_TEXT_COLLAPSE_WIDTH = 500;\n\nconst TOAST_REL_RANGES = [\n    RelativeRanges.TODAY_YESTERDAY,\n];\n\nclass ToastWrapper extends React.PureComponent {\n    static propTypes = {\n        unreadCountInChannel: PropTypes.number,\n        newRecentMessagesCount: PropTypes.number,\n        channelMarkedAsUnread: PropTypes.bool,\n        isCollapsedThreadsEnabled: PropTypes.bool,\n        rootPosts: PropTypes.object,\n        atLatestPost: PropTypes.bool,\n        postListIds: PropTypes.array,\n        latestPostTimeStamp: PropTypes.number,\n        atBottom: PropTypes.bool,\n        lastViewedBottom: PropTypes.number,\n        width: PropTypes.number,\n        lastViewedAt: PropTypes.number,\n        focusedPostId: PropTypes.string,\n        initScrollOffsetFromBottom: PropTypes.number,\n        updateNewMessagesAtInChannel: PropTypes.func,\n        scrollToNewMessage: PropTypes.func,\n        scrollToLatestMessages: PropTypes.func,\n        updateLastViewedBottomAt: PropTypes.func,\n        showSearchHintToast: PropTypes.bool,\n        onSearchHintDismiss: PropTypes.func,\n\n        /*\n         * Object from react-router\n         */\n        match: PropTypes.shape({\n            params: PropTypes.shape({\n                team: PropTypes.string,\n            }).isRequired,\n        }).isRequired,\n\n        actions: PropTypes.shape({\n\n            /**\n             * Action creator to update toast status\n             */\n            updateToastStatus: PropTypes.func.isRequired,\n        }).isRequired,\n    };\n\n    static defaultProps = {\n        focusedPostId: '',\n    };\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            unreadCountInChannel: props.unreadCountInChannel,\n        };\n    }\n\n    static countNewMessages = (postListIds, rootPosts, isCollapsedThreadsEnabled) => {\n        const mark = getNewMessageIndex(postListIds);\n        if (mark <= 0) {\n            return 0;\n        }\n        let newMessages = postListIds.slice(0, mark).filter((id) => !isIdNotPost(id));\n        if (isCollapsedThreadsEnabled) { // in collapsed mode we only count root posts\n            newMessages = newMessages.filter((id) => rootPosts[id]);\n        }\n        return newMessages.length;\n    }\n\n    static getDerivedStateFromProps(props, prevState) {\n        let {showUnreadToast, showNewMessagesToast, showMessageHistoryToast} = prevState;\n        let unreadCount;\n        if (props.atLatestPost) {\n            unreadCount = ToastWrapper.countNewMessages(props.postListIds, props.rootPosts, props.isCollapsedThreadsEnabled);\n        } else if (props.channelMarkedAsUnread) {\n            unreadCount = prevState.unreadCountInChannel;\n        } else {\n            unreadCount = prevState.unreadCountInChannel + props.newRecentMessagesCount;\n        }\n\n        // show unread toast on mount when channel is not at bottom and unread count greater than 0\n        if (typeof showUnreadToast === 'undefined' && props.atBottom !== null) {\n            showUnreadToast = unreadCount > 0 && !props.atBottom;\n        }\n\n        if (typeof showMessageHistoryToast === 'undefined' && props.focusedPostId !== '' && props.atBottom !== null) {\n            showMessageHistoryToast = props.initScrollOffsetFromBottom > 1000 || !props.atLatestPost;\n        }\n\n        // show unread toast when a channel is marked as unread\n        if (props.channelMarkedAsUnread && !props.atBottom && !prevState.channelMarkedAsUnread && !prevState.showUnreadToast) {\n            showUnreadToast = true;\n        }\n\n        // show unread toast when a channel is remarked as unread using the change in lastViewedAt\n        // lastViewedAt changes only if a channel is remarked as unread in channelMarkedAsUnread state\n        if (props.channelMarkedAsUnread && props.lastViewedAt !== prevState.lastViewedAt && !props.atBottom) {\n            showUnreadToast = true;\n        }\n\n        if (!showUnreadToast && unreadCount > 0 && !props.atBottom && (props.lastViewedBottom < props.latestPostTimeStamp)) {\n            showNewMessagesToast = true;\n        }\n\n        if (!unreadCount) {\n            showNewMessagesToast = false;\n            showUnreadToast = false;\n        }\n\n        return {\n            unreadCount,\n            showUnreadToast,\n            showNewMessagesToast,\n            lastViewedAt: props.lastViewedAt,\n            channelMarkedAsUnread: props.channelMarkedAsUnread,\n            showMessageHistoryToast,\n        };\n    }\n\n    componentDidMount() {\n        this.mounted = true;\n        const {showUnreadToast, showNewMessagesToast, showMessageHistoryToast} = this.state;\n        const toastPresent = Boolean(showUnreadToast || showNewMessagesToast || showMessageHistoryToast);\n        document.addEventListener('keydown', this.handleShortcut);\n        this.props.actions.updateToastStatus(toastPresent);\n    }\n\n    componentDidUpdate(prevProps, prevState) {\n        const {showUnreadToast, showNewMessagesToast, showMessageHistoryToast} = this.state;\n        const {\n            atBottom,\n            atLatestPost,\n            postListIds,\n            lastViewedBottom,\n            updateNewMessagesAtInChannel,\n            actions,\n        } = this.props;\n\n        if (!prevProps.atBottom && atBottom && atLatestPost) {\n            this.hideNewMessagesToast(false);\n            this.hideUnreadToast();\n            this.hideArchiveToast();\n        }\n\n        const prevPostsCount = prevProps.postListIds.length;\n        const presentPostsCount = postListIds.length;\n        const postsAddedAtBottom = presentPostsCount !== prevPostsCount && postListIds[0] !== prevProps.postListIds[0];\n        const notBottomWithLatestPosts = atBottom === false && atLatestPost && presentPostsCount > 0;\n\n        //Marking existing messages as read based on last time user reached to the bottom\n        //This moves the new message indicator to the latest posts and keeping in sync with the toast count\n        if (postsAddedAtBottom && notBottomWithLatestPosts && !showUnreadToast) {\n            updateNewMessagesAtInChannel(lastViewedBottom);\n        }\n\n        const toastStateChanged = prevState.showUnreadToast !== showUnreadToast ||\n                                  prevState.showNewMessagesToast !== showNewMessagesToast ||\n                                  prevState.showMessageHistoryToast !== showMessageHistoryToast;\n\n        if (toastStateChanged) {\n            const toastPresent = Boolean(showUnreadToast || showNewMessagesToast || showMessageHistoryToast);\n            actions.updateToastStatus(toastPresent);\n        }\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleShortcut);\n    }\n\n    handleShortcut = (e) => {\n        if (Utils.isKeyPressed(e, Constants.KeyCodes.ESCAPE)) {\n            if (this.state.showUnreadToast) {\n                this.hideUnreadToast();\n            } else if (this.state.showNewMessagesToast) {\n                this.hideNewMessagesToast();\n            } else {\n                this.hideArchiveToast();\n            }\n        }\n    };\n\n    hideUnreadToast = () => {\n        if (this.state.showUnreadToast) {\n            this.setState({\n                showUnreadToast: false,\n            });\n        }\n    }\n\n    hideArchiveToast = () => {\n        if (this.state.showMessageHistoryToast) {\n            this.setState({\n                showMessageHistoryToast: false,\n            });\n        }\n    }\n\n    hideNewMessagesToast = (updateLastViewedBottomAt = true) => {\n        if (this.state.showNewMessagesToast) {\n            this.setState({\n                showNewMessagesToast: false,\n            });\n            if (updateLastViewedBottomAt) {\n                this.props.updateLastViewedBottomAt();\n            }\n        }\n    }\n\n    hideSearchHintToast = () => {\n        if (this.props.onSearchHintDismiss) {\n            this.props.onSearchHintDismiss();\n        }\n    }\n\n    newMessagesToastText = (count, since) => {\n        if (this.props.width > TOAST_TEXT_COLLAPSE_WIDTH && typeof since !== 'undefined') {\n            return (\n                <FormattedMessage\n                    id='postlist.toast.newMessagesSince'\n                    defaultMessage='{count, number} new {count, plural, one {message} other {messages}} {isToday, select, true {} other {since}} {date}'\n                    values={{\n                        count,\n                        isToday: isToday(new Date(since)).toString(),\n                        date: (\n                            <Timestamp\n                                value={since}\n                                useTime={false}\n                                ranges={TOAST_REL_RANGES}\n                            />\n                        ),\n                    }}\n                />\n            );\n        }\n        return (\n            <FormattedMessage\n                id='postlist.toast.newMessages'\n                defaultMessage={'{count, number} new {count, plural, one {message} other {messages}}'}\n                values={{count}}\n            />\n        );\n    }\n\n    archiveToastText = () => {\n        return (\n            <FormattedMessage\n                id='postlist.toast.history'\n                defaultMessage='Viewing message history'\n            />\n        );\n    }\n\n    getSearchHintToastText = () => {\n        return (\n            <FormattedMessage\n                id='postlist.toast.searchHint'\n                defaultMessage='Tip: Try {searchShortcut} to search this channel'\n                values={{\n                    searchShortcut: <SearchShortcut/>,\n                }}\n            />\n        );\n    }\n\n    changeUrlToRemountChannelView = () => {\n        const {match} = this.props;\n\n        // Inorder of mount the channel view we are redirecting to /team url to load the channel again\n        // Todo: Can be changed to dispatch if we put focussedPostId in redux state.\n        browserHistory.replace(`/${match.params.team}`);\n    }\n\n    scrollToNewMessage = () => {\n        const {focusedPostId, atLatestPost, scrollToNewMessage, updateLastViewedBottomAt} = this.props;\n\n        // if latest set of posts are not loaded in the view then we cannot scroll to the message\n        // We will be chaging the url to remount the channel view so we can remove the focussedPostId react state\n        // if we don't remove the focussedPostId state then scroll tries to correct to that instead of new message line\n        if (focusedPostId && !atLatestPost) {\n            this.changeUrlToRemountChannelView();\n            return;\n        }\n\n        scrollToNewMessage();\n        updateLastViewedBottomAt();\n        this.hideNewMessagesToast();\n    }\n\n    scrollToLatestMessages = () => {\n        const {focusedPostId, atLatestPost, scrollToLatestMessages} = this.props;\n\n        if (focusedPostId) {\n            if (!atLatestPost) {\n                this.changeUrlToRemountChannelView();\n                return;\n            }\n            this.hideArchiveToast();\n        }\n\n        scrollToLatestMessages();\n        this.hideUnreadToast();\n    }\n\n    getToastToRender() {\n        const {atLatestPost, atBottom, width, lastViewedAt, showSearchHintToast} = this.props;\n        const {showUnreadToast, showNewMessagesToast, showMessageHistoryToast, unreadCount} = this.state;\n\n        const unreadToastProps = {\n            show: true,\n            width,\n            onDismiss: this.hideUnreadToast,\n            onClick: this.scrollToLatestMessages,\n            onClickMessage: Utils.localizeMessage('postlist.toast.scrollToBottom', 'Jump to recents'),\n            showActions: !atLatestPost || (atLatestPost && !atBottom),\n        };\n\n        if (showUnreadToast && unreadCount > 0) {\n            return (\n                <Toast {...unreadToastProps}>\n                    {this.newMessagesToastText(unreadCount, lastViewedAt)}\n                </Toast>\n            );\n        }\n\n        if (showNewMessagesToast) {\n            const showNewMessagesToastOverrides = {\n                onDismiss: this.hideNewMessagesToast,\n                onClick: this.scrollToNewMessage,\n                onClickMessage: Utils.localizeMessage('postlist.toast.scrollToLatest', 'Jump to new messages'),\n            };\n\n            return (\n                <Toast\n                    {...unreadToastProps}\n                    {...showNewMessagesToastOverrides}\n                >\n                    {this.newMessagesToastText(unreadCount, lastViewedAt)}\n                </Toast>\n            );\n        }\n\n        if (showMessageHistoryToast) {\n            const archiveToastProps = {\n                show: true,\n                width,\n                onDismiss: this.hideArchiveToast,\n                onClick: this.scrollToLatestMessages,\n                onClickMessage: Utils.localizeMessage('postlist.toast.scrollToBottom', 'Jump to recents'),\n                showActions: true,\n                extraClasses: 'toast__history',\n            };\n\n            return (\n                <Toast {...archiveToastProps}>\n                    {this.archiveToastText()}\n                </Toast>\n            );\n        }\n\n        if (showSearchHintToast) {\n            return (\n                <HintToast\n                    onDismiss={this.hideSearchHintToast}\n                >\n                    {this.getSearchHintToastText()}\n                </HintToast>\n            );\n        }\n\n        return null;\n    }\n\n    render() {\n        const toastToRender = this.getToastToRender();\n\n        return (\n            <React.Fragment>\n                {toastToRender}\n            </React.Fragment>\n        );\n    }\n}\n\nexport default injectIntl(ToastWrapper);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport {withRouter} from 'react-router-dom';\n\nimport {createSelector} from 'reselect';\n\nimport {Posts} from 'mattermost-redux/constants';\nimport {getAllPosts, getPostIdsInChannel} from 'mattermost-redux/selectors/entities/posts';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {makePreparePostIdsForPostList} from 'mattermost-redux/utils/post_list';\nimport {getCurrentChannel, countCurrentChannelUnreadMessages, isManuallyUnread} from 'mattermost-redux/selectors/entities/channels';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {updateToastStatus} from 'actions/views/channel';\n\nimport ToastWrapper from './toast_wrapper.jsx';\nexport function makeGetRootPosts() {\n    return createSelector(\n        'makeGetRootPosts',\n        getAllPosts,\n        getCurrentUserId,\n        getCurrentChannel,\n        (allPosts, currentUserId, channel) => {\n            // Count the number of new posts that haven't been deleted and are root posts\n            return Object.values(allPosts).filter((post) => {\n                return (\n                    post.root_id === '' &&\n                    post.channel_id === channel.id &&\n                    post.state !== Posts.POST_DELETED\n                );\n            }).reduce((map, obj) => {\n                map[obj.id] = true;\n                return map;\n            }, {});\n        },\n    );\n}\n\nexport function makeCountUnreadsBelow() {\n    return createSelector(\n        'makeCountUnreadsBelow',\n        getAllPosts,\n        getCurrentUserId,\n        (state, postIds) => postIds,\n        (state, postIds, lastViewedBottom) => lastViewedBottom,\n        isCollapsedThreadsEnabled,\n        (allPosts, currentUserId, postIds, lastViewedBottom, isCollapsed) => {\n            if (!postIds) {\n                return 0;\n            }\n\n            // Count the number of new posts made by other users that haven't been deleted\n            return postIds.map((id) => allPosts[id]).filter((post) => {\n                return post &&\n                    post.user_id !== currentUserId &&\n                    post.state !== Posts.POST_DELETED &&\n                    post.create_at > lastViewedBottom &&\n                    (isCollapsed ? post.root_id === '' : true); // in collapsed threads mode, only count root posts\n            }).length;\n        },\n    );\n}\n\n/* This connected component is written mainly for maintaining the unread count to be passed to the toast\n   Unread count logic:\n   * If channel is at the latest set of posts:\n      Unread count is the Number of posts below new message line\n   * if channel is not at the latest set of posts:\n      1. UnreadCount + any recent messages in the latest chunk.\n      2. If channel was marked as unread.\n        * Unread count of channel alone.\n*/\n\nfunction makeMapStateToProps() {\n    const countUnreadsBelow = makeCountUnreadsBelow();\n    const getRootPosts = makeGetRootPosts();\n    const preparePostIdsForPostList = makePreparePostIdsForPostList();\n    return function mapStateToProps(state, ownProps) {\n        let newRecentMessagesCount = 0;\n        const channelMarkedAsUnread = isManuallyUnread(state, ownProps.channelId);\n        const lastViewedAt = state.views.channel.lastChannelViewTime[ownProps.channelId];\n        if (!ownProps.atLatestPost) {\n            let postIds = getPostIdsInChannel(state, ownProps.channelId);\n            if (postIds) {\n                postIds = preparePostIdsForPostList(state, {postIds, lastViewedAt, channelId: ownProps.channelId});\n            }\n            newRecentMessagesCount = countUnreadsBelow(state, postIds, lastViewedAt);\n        }\n        return {\n            rootPosts: getRootPosts(state),\n            lastViewedAt,\n            newRecentMessagesCount,\n            isCollapsedThreadsEnabled: isCollapsedThreadsEnabled(state),\n            unreadCountInChannel: countCurrentChannelUnreadMessages(state),\n            channelMarkedAsUnread,\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            updateToastStatus,\n        }, dispatch),\n    };\n}\n\nexport default withRouter(connect(makeMapStateToProps, mapDispatchToProps)(ToastWrapper));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useMemo, useRef} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\n\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {GlobalState} from 'types/store';\n\nimport {getLatestPostId, makeCreateAriaLabelForPost} from 'utils/post_utils';\n\ninterface Props {\n    postIds: string[];\n}\n\nconst LatestPostReader = (props: Props): JSX.Element => {\n    const intl = useIntl();\n\n    const {postIds} = props;\n    const latestPostId = useMemo(() => getLatestPostId(postIds), [postIds]);\n    const latestPost = useSelector<GlobalState, Post>((state) => getPost(state, latestPostId));\n\n    const createAriaLabelForPost = useRef(makeCreateAriaLabelForPost());\n    const ariaLabel = useSelector<GlobalState, string>((state) => {\n        if (!latestPost) {\n            return '';\n        }\n\n        return createAriaLabelForPost.current(state, latestPost)(intl);\n    });\n\n    return (\n        <span\n            className='sr-only'\n            aria-live='polite'\n        >\n            {ariaLabel}\n        </span>\n    );\n};\n\nexport default LatestPostReader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport {DynamicSizeList} from 'dynamic-virtualized-list';\n\nimport {isDateLine, isStartOfNewMessages} from 'mattermost-redux/utils/post_list';\n\nimport EventEmitter from 'mattermost-redux/utils/event_emitter';\n\nimport Constants, {PostListRowListIds, EventTypes, PostRequestTypes} from 'utils/constants';\nimport DelayedAction from 'utils/delayed_action';\nimport {getPreviousPostId, getLatestPostId, getNewMessageIndex} from 'utils/post_utils';\nimport * as Utils from 'utils/utils.jsx';\n\nimport FloatingTimestamp from 'components/post_view/floating_timestamp';\nimport PostListRow from 'components/post_view/post_list_row';\nimport ScrollToBottomArrows from 'components/post_view/scroll_to_bottom_arrows';\nimport ToastWrapper from 'components/toast_wrapper';\n\nimport LatestPostReader from './latest_post_reader';\n\nconst OVERSCAN_COUNT_BACKWARD = 80;\nconst OVERSCAN_COUNT_FORWARD = 80;\nconst HEIGHT_TRIGGER_FOR_MORE_POSTS = 1000;\nconst BUFFER_TO_BE_CONSIDERED_BOTTOM = 10;\n\nconst MAXIMUM_POSTS_FOR_SLICING = {\n    channel: 50,\n    permalink: 100,\n};\n\nconst postListStyle = {\n    padding: '14px 0px 7px',\n};\n\nconst virtListStyles = {\n    position: 'absolute',\n    bottom: '0',\n    maxHeight: '100%',\n};\n\nconst OFFSET_TO_SHOW_TOAST = -50;\n\nexport default class PostList extends React.PureComponent {\n    static propTypes = {\n\n        /**\n         * Array of Ids in the channel including date separators, new message indicator, more messages loader,\n         * manual load messages trigger and postId in the order of newest to oldest for populating virtual list rows\n         */\n        postListIds: PropTypes.array.isRequired,\n\n        /**\n         * Set to focus this post\n         */\n        focusedPostId: PropTypes.string,\n\n        /**\n         * The current channel id\n         */\n        channelId: PropTypes.string.isRequired,\n\n        /**\n         * Used for disabling auto retry of posts and enabling manual link for loading posts\n         */\n        autoRetryEnable: PropTypes.bool,\n\n        /**\n         * used for populating header, scroll correction and disabling triggering loadOlderPosts\n         */\n        atOldestPost: PropTypes.bool,\n\n        /**\n         * used for disabling triggering loadNewerPosts\n         */\n        atLatestPost: PropTypes.bool,\n\n        /**\n         * used in passing to post row for enabling animation when loading posts\n         */\n        loadingNewerPosts: PropTypes.bool,\n        loadingOlderPosts: PropTypes.bool,\n\n        latestPostTimeStamp: PropTypes.number,\n\n        lastViewedAt: PropTypes.string,\n\n        actions: PropTypes.shape({\n\n            /**\n             * Function to get older posts in the channel\n             */\n            loadOlderPosts: PropTypes.func.isRequired,\n\n            /**\n             * Function to get newer posts in the channel\n             */\n            loadNewerPosts: PropTypes.func.isRequired,\n\n            /**\n             * Function used for autoLoad of posts incase screen is not filled with posts\n             */\n            canLoadMorePosts: PropTypes.func.isRequired,\n\n            /**\n             * Function to check and set if app is in mobile view\n             */\n            checkAndSetMobileView: PropTypes.func.isRequired,\n\n            /**\n             * Function to change the post selected for postList\n             */\n            changeUnreadChunkTimeStamp: PropTypes.func.isRequired,\n\n            updateNewMessagesAtInChannel: PropTypes.func.isRequired,\n        }).isRequired,\n    }\n\n    constructor(props) {\n        super(props);\n\n        const channelIntroMessage = PostListRowListIds.CHANNEL_INTRO_MESSAGE;\n        const isMobile = Utils.isMobile();\n        this.state = {\n            isScrolling: false,\n            isMobile,\n\n            /* Intentionally setting null so that toast can determine when the first time this state is defined */\n            atBottom: null,\n            lastViewedBottom: Date.now(),\n            postListIds: [channelIntroMessage],\n            topPostId: '',\n            postMenuOpened: false,\n            dynamicListStyle: {\n                willChange: 'transform',\n            },\n            initScrollCompleted: false,\n            initScrollOffsetFromBottom: 0,\n\n            showSearchHint: false,\n            isSearchHintDismissed: false,\n        };\n\n        this.listRef = React.createRef();\n        this.postListRef = React.createRef();\n        if (isMobile) {\n            this.scrollStopAction = new DelayedAction(this.handleScrollStop);\n        }\n\n        this.initRangeToRender = this.props.focusedPostId ? [0, MAXIMUM_POSTS_FOR_SLICING.permalink] : [0, MAXIMUM_POSTS_FOR_SLICING.channel];\n\n        let postIndex = 0;\n        if (props.focusedPostId) {\n            postIndex = this.props.postListIds.findIndex((postId) => postId === this.props.focusedPostId);\n        } else {\n            postIndex = this.getNewMessagesSeparatorIndex(props.postListIds);\n        }\n\n        const maxPostsForSlicing = props.focusedPostId ? MAXIMUM_POSTS_FOR_SLICING.permalink : MAXIMUM_POSTS_FOR_SLICING.channel;\n        this.initRangeToRender = [\n            Math.max(postIndex - 30, 0),\n            Math.max(postIndex + 30, Math.min(props.postListIds.length - 1, maxPostsForSlicing)),\n        ];\n\n        this.showSearchHintThreshold = this.getShowSearchHintThreshold();\n    }\n\n    componentDidMount() {\n        this.mounted = true;\n        this.props.actions.checkAndSetMobileView();\n\n        window.addEventListener('resize', this.handleWindowResize);\n        EventEmitter.addListener(EventTypes.POST_LIST_SCROLL_TO_BOTTOM, this.scrollToLatestMessages);\n    }\n\n    getSnapshotBeforeUpdate(prevProps) {\n        if (this.postListRef && this.postListRef.current) {\n            const postsAddedAtTop = this.props.postListIds && this.props.postListIds.length !== prevProps.postListIds.length && this.props.postListIds[0] === prevProps.postListIds[0];\n            const channelHeaderAdded = this.props.atOldestPost !== prevProps.atOldestPost;\n            if ((postsAddedAtTop || channelHeaderAdded) && this.state.atBottom === false) {\n                const postListNode = this.postListRef.current;\n                const previousScrollTop = postListNode.parentElement.scrollTop;\n                const previousScrollHeight = postListNode.scrollHeight;\n\n                return {\n                    previousScrollTop,\n                    previousScrollHeight,\n                };\n            }\n        }\n        return null;\n    }\n\n    componentDidUpdate(prevProps, prevState, snapshot) {\n        if (!this.postListRef.current) {\n            return;\n        }\n        const prevPostsCount = prevProps.postListIds.length;\n        const presentPostsCount = this.props.postListIds.length;\n\n        if (snapshot) {\n            const postlistScrollHeight = this.postListRef.current.scrollHeight;\n            const postsAddedAtTop = presentPostsCount !== prevPostsCount && this.props.postListIds[0] === prevProps.postListIds[0];\n            const channelHeaderAdded = this.props.atOldestPost !== prevProps.atOldestPost;\n            if ((postsAddedAtTop || channelHeaderAdded) && !this.state.atBottom && snapshot) {\n                const scrollValue = snapshot.previousScrollTop + (postlistScrollHeight - snapshot.previousScrollHeight);\n                if (scrollValue !== 0 && (scrollValue - snapshot.previousScrollTop) !== 0) {\n                    //true as third param so chrome can use animationFrame when correcting scroll\n                    this.listRef.current.scrollTo(scrollValue, scrollValue - snapshot.previousScrollTop, true);\n                }\n            }\n        }\n    }\n\n    componentWillUnmount() {\n        this.mounted = false;\n        window.removeEventListener('resize', this.handleWindowResize);\n        EventEmitter.removeListener(EventTypes.POST_LIST_SCROLL_TO_BOTTOM, this.scrollToLatestMessages);\n    }\n\n    static getDerivedStateFromProps(props) {\n        const postListIds = props.postListIds;\n        let newPostListIds;\n\n        if (props.atOldestPost) {\n            newPostListIds = [...postListIds, PostListRowListIds.CHANNEL_INTRO_MESSAGE];\n        } else if (props.autoRetryEnable) {\n            newPostListIds = [...postListIds, PostListRowListIds.OLDER_MESSAGES_LOADER];\n        } else {\n            newPostListIds = [...postListIds, PostListRowListIds.LOAD_OLDER_MESSAGES_TRIGGER];\n        }\n\n        if (!props.atLatestPost) {\n            if (props.autoRetryEnable) {\n                newPostListIds = [PostListRowListIds.NEWER_MESSAGES_LOADER, ...newPostListIds];\n            } else {\n                newPostListIds = [PostListRowListIds.LOAD_NEWER_MESSAGES_TRIGGER, ...newPostListIds];\n            }\n        }\n\n        return {\n            postListIds: newPostListIds,\n        };\n    }\n\n    getNewMessagesSeparatorIndex = (postListIds) => {\n        return postListIds.findIndex(\n            (item) => item.indexOf(PostListRowListIds.START_OF_NEW_MESSAGES) === 0,\n        );\n    }\n\n    handleWindowResize = () => {\n        this.props.actions.checkAndSetMobileView();\n        const isMobile = Utils.isMobile();\n        if (isMobile !== this.state.isMobile) {\n            const dynamicListStyle = this.state.dynamicListStyle;\n            if (this.state.postMenuOpened) {\n                if (!isMobile && dynamicListStyle.willChange === 'unset') {\n                    dynamicListStyle.willChange = 'transform';\n                } else if (isMobile && dynamicListStyle.willChange === 'transform') {\n                    dynamicListStyle.willChange = 'unset';\n                }\n            }\n\n            this.setState({\n                isMobile,\n                dynamicListStyle,\n            });\n            this.scrollStopAction = new DelayedAction(this.handleScrollStop);\n        }\n\n        this.showSearchHintThreshold = this.getShowSearchHintThreshold();\n    }\n\n    togglePostMenu = (opened) => {\n        const dynamicListStyle = this.state.dynamicListStyle;\n        if (this.state.isMobile) {\n            dynamicListStyle.willChange = opened ? 'unset' : 'transform';\n        }\n\n        this.setState({\n            postMenuOpened: opened,\n            dynamicListStyle,\n        });\n    };\n\n    renderRow = ({data, itemId, style}) => {\n        const index = data.indexOf(itemId);\n        let className = '';\n        const basePaddingClass = 'post-row__padding';\n        const previousItemId = (index !== -1 && index < data.length - 1) ? data[index + 1] : '';\n        const nextItemId = (index > 0 && index < data.length) ? data[index - 1] : '';\n\n        if (isDateLine(nextItemId) || isStartOfNewMessages(nextItemId)) {\n            className += basePaddingClass + ' bottom';\n        }\n\n        if (isDateLine(previousItemId) || isStartOfNewMessages(previousItemId)) {\n            if (className.includes(basePaddingClass)) {\n                className += ' top';\n            } else {\n                className += basePaddingClass + ' top';\n            }\n        }\n\n        // Since the first in the list is the latest message\n        const isLastPost = itemId === this.state.postListIds[0];\n\n        return (\n            <div\n                style={style}\n                className={className}\n            >\n                <PostListRow\n                    listId={itemId}\n                    previousListId={getPreviousPostId(data, index)}\n                    shouldHighlight={itemId === this.props.focusedPostId}\n                    loadOlderPosts={this.props.actions.loadOlderPosts}\n                    loadNewerPosts={this.props.actions.loadNewerPosts}\n                    togglePostMenu={this.togglePostMenu}\n                    isLastPost={isLastPost}\n                    loadingNewerPosts={this.props.loadingNewerPosts}\n                    loadingOlderPosts={this.props.loadingOlderPosts}\n                />\n            </div>\n        );\n    };\n\n    scrollToFailed = (index) => {\n        if (index === 0) {\n            this.props.actions.changeUnreadChunkTimeStamp('');\n        } else {\n            this.props.actions.changeUnreadChunkTimeStamp(this.props.lastViewedAt);\n        }\n    }\n\n    onScroll = ({scrollDirection, scrollOffset, scrollUpdateWasRequested, clientHeight, scrollHeight}) => {\n        if (scrollHeight <= 0) {\n            return;\n        }\n\n        const didUserScrollBackwards = scrollDirection === 'backward' && !scrollUpdateWasRequested;\n        const didUserScrollForwards = scrollDirection === 'forward' && !scrollUpdateWasRequested;\n        const isOffsetWithInRange = scrollOffset < HEIGHT_TRIGGER_FOR_MORE_POSTS;\n        const offsetFromBottom = (scrollHeight - clientHeight) - scrollOffset;\n        const shouldLoadNewPosts = offsetFromBottom < HEIGHT_TRIGGER_FOR_MORE_POSTS;\n\n        if (didUserScrollBackwards && isOffsetWithInRange && !this.props.atOldestPost) {\n            this.props.actions.loadOlderPosts();\n        } else if (didUserScrollForwards && shouldLoadNewPosts && !this.props.atLatestPost) {\n            this.props.actions.loadNewerPosts();\n        }\n\n        if (this.state.isMobile) {\n            if (!this.state.isScrolling) {\n                this.setState({\n                    isScrolling: true,\n                });\n            }\n\n            if (this.scrollStopAction) {\n                this.scrollStopAction.fireAfter(Constants.SCROLL_DELAY);\n            }\n        }\n\n        this.checkBottom(scrollOffset, scrollHeight, clientHeight);\n\n        if (scrollUpdateWasRequested) { //if scroll change is programatically requested i.e by calling scrollTo\n            //This is a private method on virtlist\n            const postsRenderedRange = this.listRef.current._getRangeToRender(); //eslint-disable-line no-underscore-dangle\n\n            // postsRenderedRange[3] is the visibleStopIndex which is post at the bottom of the screen\n            if (postsRenderedRange[3] <= 1 && !this.props.atLatestPost) {\n                this.props.actions.canLoadMorePosts(PostRequestTypes.AFTER_ID);\n            }\n\n            if (!this.state.atBottom && scrollHeight) {\n                this.setState({\n                    initScrollOffsetFromBottom: offsetFromBottom,\n                });\n            }\n        }\n\n        if (this.state.isMobile && this.state.showSearchHint) {\n            this.setState({\n                showSearchHint: false,\n            });\n        }\n\n        if (!this.state.isMobile && !this.state.isSearchHintDismissed) {\n            this.setState({\n                showSearchHint: offsetFromBottom > this.showSearchHintThreshold,\n            });\n        }\n    }\n\n    getShowSearchHintThreshold = () => {\n        return window.screen.height * 3;\n    }\n\n    checkBottom = (scrollOffset, scrollHeight, clientHeight) => {\n        this.updateAtBottom(this.isAtBottom(scrollOffset, scrollHeight, clientHeight));\n    }\n\n    isAtBottom = (scrollOffset, scrollHeight, clientHeight) => {\n        // Calculate how far the post list is from being scrolled to the bottom\n        const offsetFromBottom = scrollHeight - clientHeight - scrollOffset;\n\n        return offsetFromBottom <= BUFFER_TO_BE_CONSIDERED_BOTTOM && scrollHeight > 0;\n    }\n\n    updateAtBottom = (atBottom) => {\n        if (atBottom !== this.state.atBottom) {\n            // Update lastViewedBottom when the list reaches or leaves the bottom\n            let lastViewedBottom = Date.now();\n            if (this.props.latestPostTimeStamp > lastViewedBottom) {\n                lastViewedBottom = this.props.latestPostTimeStamp;\n            }\n\n            // if we hit the bottom, we haven't just landed on the unread channel\n            this.setState({\n                atBottom,\n                lastViewedBottom,\n            });\n        }\n    }\n\n    updateLastViewedBottomAt = (lastViewedBottom = Date.now()) => {\n        this.setState({\n            lastViewedBottom,\n        });\n    }\n\n    handleScrollStop = () => {\n        if (this.mounted) {\n            this.setState({\n                isScrolling: false,\n            });\n        }\n    }\n\n    handleSearchHintDismiss = () => {\n        this.setState({\n            showSearchHint: false,\n            isSearchHintDismissed: true,\n        });\n    }\n\n    updateFloatingTimestamp = (visibleTopItem) => {\n        if (!this.state.isMobile) {\n            return;\n        }\n\n        if (!this.props.postListIds) {\n            return;\n        }\n\n        this.setState({\n            topPostId: getLatestPostId(this.props.postListIds.slice(visibleTopItem)),\n        });\n    }\n\n    onItemsRendered = ({visibleStartIndex}) => {\n        this.updateFloatingTimestamp(visibleStartIndex);\n    }\n\n    initScrollToIndex = () => {\n        if (this.props.focusedPostId) {\n            const index = this.state.postListIds.findIndex(\n                (item) => item === this.props.focusedPostId,\n            );\n            return {\n                index,\n                position: 'center',\n            };\n        }\n\n        const newMessagesSeparatorIndex = getNewMessageIndex(this.state.postListIds);\n\n        if (newMessagesSeparatorIndex > 0) {\n            // if there is a dateLine above START_OF_NEW_MESSAGES then scroll to date line\n            if (isDateLine(this.state.postListIds[newMessagesSeparatorIndex + 1])) {\n                return {\n                    index: newMessagesSeparatorIndex + 1,\n                    position: 'start',\n                    offset: OFFSET_TO_SHOW_TOAST,\n                };\n            }\n            return {\n                index: newMessagesSeparatorIndex,\n                position: 'start',\n                offset: OFFSET_TO_SHOW_TOAST,\n            };\n        }\n\n        return {\n            index: 0,\n            position: 'end',\n        };\n    }\n\n    scrollToLatestMessages = () => {\n        if (this.props.atLatestPost) {\n            this.scrollToBottom();\n        } else {\n            this.updateNewMessagesAtInChannel();\n            this.props.actions.changeUnreadChunkTimeStamp('');\n        }\n    }\n\n    scrollToBottom = () => {\n        this.listRef.current.scrollToItem(0, 'end');\n    }\n\n    scrollToNewMessage = () => {\n        this.listRef.current.scrollToItem(getNewMessageIndex(this.state.postListIds), 'start', OFFSET_TO_SHOW_TOAST);\n    }\n\n    updateNewMessagesAtInChannel = (lastViewedAt = Date.now()) => {\n        this.props.actions.updateNewMessagesAtInChannel(this.props.channelId, lastViewedAt);\n    }\n\n    renderToasts = (width) => {\n        return (\n            <ToastWrapper\n                atLatestPost={this.props.atLatestPost}\n                postListIds={this.state.postListIds}\n                atBottom={this.state.atBottom}\n                width={width}\n                lastViewedBottom={this.state.lastViewedBottom}\n                latestPostTimeStamp={this.props.latestPostTimeStamp}\n                scrollToNewMessage={this.scrollToNewMessage}\n                scrollToLatestMessages={this.scrollToLatestMessages}\n                updateNewMessagesAtInChannel={this.updateNewMessagesAtInChannel}\n                updateLastViewedBottomAt={this.updateLastViewedBottomAt}\n                channelId={this.props.channelId}\n                focusedPostId={this.props.focusedPostId}\n                initScrollOffsetFromBottom={this.state.initScrollOffsetFromBottom}\n                onSearchHintDismiss={this.handleSearchHintDismiss}\n                showSearchHintToast={this.state.showSearchHint}\n            />\n        );\n    }\n\n    render() {\n        const {channelId} = this.props;\n        const {dynamicListStyle} = this.state;\n\n        return (\n            <div\n                role='list'\n                className='a11y__region'\n                data-a11y-sort-order='1'\n                data-a11y-focus-child={true}\n                data-a11y-order-reversed={true}\n                data-a11y-loop-navigation={false}\n                aria-label={Utils.localizeMessage('accessibility.sections.centerContent', 'message list main region')}\n            >\n                {this.state.isMobile && (\n                    <React.Fragment>\n                        <FloatingTimestamp\n                            isScrolling={this.state.isScrolling}\n                            isMobile={true}\n                            postId={this.state.topPostId}\n                        />\n                        <ScrollToBottomArrows\n                            isScrolling={this.state.isScrolling}\n                            atBottom={this.state.atBottom}\n                            onClick={this.scrollToBottom}\n                        />\n                    </React.Fragment>\n                )}\n                <div\n                    role='presentation'\n                    className='post-list-holder-by-time'\n                    key={'postlist-' + channelId}\n                >\n                    <div\n                        role='presentation'\n                        className='post-list__table'\n                    >\n                        <div\n                            id='postListContent'\n                            className='post-list__content'\n                        >\n                            <LatestPostReader postIds={this.props.postListIds}/>\n                            <AutoSizer>\n                                {({height, width}) => (\n                                    <React.Fragment>\n                                        <div>{this.renderToasts(width)}</div>\n\n                                        <DynamicSizeList\n                                            ref={this.listRef}\n                                            height={height}\n                                            width={width}\n                                            className='post-list__dynamic'\n                                            itemData={this.state.postListIds}\n                                            overscanCountForward={OVERSCAN_COUNT_FORWARD}\n                                            overscanCountBackward={OVERSCAN_COUNT_BACKWARD}\n                                            onScroll={this.onScroll}\n                                            initScrollToIndex={this.initScrollToIndex}\n                                            canLoadMorePosts={this.props.actions.canLoadMorePosts}\n                                            innerRef={this.postListRef}\n                                            style={{...virtListStyles, ...dynamicListStyle}}\n                                            innerListStyle={postListStyle}\n                                            initRangeToRender={this.initRangeToRender}\n                                            loaderId={PostListRowListIds.OLDER_MESSAGES_LOADER}\n                                            correctScrollToBottom={this.props.atLatestPost}\n                                            onItemsRendered={this.onItemsRendered}\n                                            scrollToFailed={this.scrollToFailed}\n                                        >\n                                            {this.renderRow}\n                                        </DynamicSizeList>\n                                    </React.Fragment>\n                                )}\n                            </AutoSizer>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nimport LoadingScreen from 'components/loading_screen';\nimport {PostRequestTypes} from 'utils/constants';\n\nimport {getOldestPostId, getLatestPostId} from 'utils/post_utils';\n\nimport VirtPostList from 'components/post_view/post_list_virtualized/post_list_virtualized';\n\nconst MAX_NUMBER_OF_AUTO_RETRIES = 3;\nexport const MAX_EXTRA_PAGES_LOADED = 10;\n\nexport default class PostList extends React.PureComponent {\n    static propTypes = {\n\n        /**\n         *  Array of formatted post ids in the channel\n         *  This will be different from postListIds because of grouping and filtering of posts\n         *  This array should be used for making Before and After API calls\n         */\n        formattedPostIds: PropTypes.array,\n\n        /**\n         *  Array of post ids in the channel, ordered from newest to oldest\n         */\n        postListIds: PropTypes.array,\n\n        /**\n         * The channel the posts are in\n         */\n        channelId: PropTypes.string,\n\n        /*\n         * To get posts for perma view\n         */\n        focusedPostId: PropTypes.string,\n\n        /*\n         * Used for determining if we are not at the recent most chunk in channel\n         */\n        atLatestPost: PropTypes.bool,\n\n        /*\n         * Used for determining if we are at the channels oldest post\n         */\n        atOldestPost: PropTypes.bool,\n\n        /*\n         * Used for loading posts using unread API\n         */\n        isFirstLoad: PropTypes.bool,\n\n        /*\n         * Used for syncing posts and is also passed down to virt list for newMessages indicator\n         */\n        latestPostTimeStamp: PropTypes.number,\n\n        /*\n         * Used for handling the read logic when unmounting the component\n         */\n        channelManuallyUnread: PropTypes.bool.isRequired,\n\n        /**\n         * Lastest post id of the current post list, this doesnt include timestamps etc, just actual posts\n         */\n        latestPostId: PropTypes.string,\n\n        /*\n         * Used for passing down to virt list so it can change the chunk of posts selected\n         */\n        changeUnreadChunkTimeStamp: PropTypes.func.isRequired,\n\n        /*\n         * Used for skipping the call on load\n         */\n        isPrefetchingInProcess: PropTypes.bool.isRequired,\n\n        actions: PropTypes.shape({\n\n            /*\n             * Used for getting permalink view posts\n             */\n            loadPostsAround: PropTypes.func.isRequired,\n\n            /*\n             * Used for geting unreads posts\n             */\n            loadUnreads: PropTypes.func.isRequired,\n\n            /*\n             * Used for getting posts using BEFORE_ID and AFTER_ID\n             */\n            loadPosts: PropTypes.func.isRequired,\n\n            /*\n             * Used to set mobile view on resize\n             */\n            checkAndSetMobileView: PropTypes.func.isRequired,\n\n            /*\n             * Used to loading posts since a timestamp to sync the posts\n             */\n            syncPostsInChannel: PropTypes.func.isRequired,\n\n            /*\n             * Used to loading posts if it not first visit, permalink or there exists any postListIds\n             * This happens when previous channel visit has a chunk which is not the latest set of posts\n             */\n            loadLatestPosts: PropTypes.func.isRequired,\n\n            markChannelAsViewed: PropTypes.func.isRequired,\n\n            markChannelAsRead: PropTypes.func.isRequired,\n            updateNewMessagesAtInChannel: PropTypes.func.isRequired,\n\n        }).isRequired,\n    }\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            loadingNewerPosts: false,\n            loadingOlderPosts: false,\n            autoRetryEnable: true,\n        };\n\n        this.autoRetriesCount = 0;\n        this.loadingMorePosts = null;\n        this.actionsForPostList = {\n            loadOlderPosts: this.getPostsBefore,\n            loadNewerPosts: this.getPostsAfter,\n            checkAndSetMobileView: props.actions.checkAndSetMobileView,\n            canLoadMorePosts: this.canLoadMorePosts,\n            changeUnreadChunkTimeStamp: props.changeUnreadChunkTimeStamp,\n            updateNewMessagesAtInChannel: this.props.actions.updateNewMessagesAtInChannel,\n        };\n    }\n\n    componentDidMount() {\n        this.mounted = true;\n        if (this.props.channelId) {\n            this.postsOnLoad(this.props.channelId);\n        }\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.channelId !== prevProps.channelId) {\n            this.postsOnLoad(this.props.channelId);\n        }\n    }\n\n    componentWillUnmount() {\n        if (!this.props.channelManuallyUnread) {\n            this.markChannelAsReadAndViewed(this.props.channelId);\n        }\n\n        this.mounted = false;\n    }\n\n    postsOnLoad = async (channelId) => {\n        const {focusedPostId, isFirstLoad, latestPostTimeStamp, isPrefetchingInProcess, actions} = this.props;\n        if (focusedPostId) {\n            await actions.loadPostsAround(channelId, this.props.focusedPostId);\n        } else if (isFirstLoad) {\n            if (!isPrefetchingInProcess) {\n                await actions.loadUnreads(channelId);\n            }\n        } else if (latestPostTimeStamp) {\n            await actions.syncPostsInChannel(channelId, this.props.latestPostTimeStamp, false);\n        } else {\n            await actions.loadLatestPosts(channelId);\n        }\n\n        if (!focusedPostId) {\n            this.markChannelAsReadAndViewed(channelId);\n        }\n\n        if (this.mounted) {\n            this.setState({\n                loadingOlderPosts: false,\n                loadingNewerPosts: false,\n            });\n        }\n    }\n\n    callLoadPosts = async (channelId, postId, type) => {\n        const {error} = await this.props.actions.loadPosts({\n            channelId,\n            postId,\n            type,\n        });\n\n        if (type === PostRequestTypes.BEFORE_ID) {\n            this.setState({loadingOlderPosts: false});\n        } else {\n            this.setState({loadingNewerPosts: false});\n        }\n\n        if (error) {\n            if (this.autoRetriesCount < MAX_NUMBER_OF_AUTO_RETRIES) {\n                this.autoRetriesCount++;\n                await this.callLoadPosts(channelId, postId, type);\n            } else if (this.mounted) {\n                this.setState({autoRetryEnable: false});\n            }\n        } else {\n            if (this.mounted) {\n                this.setState({autoRetryEnable: true});\n            }\n\n            if (!this.state.autoRetryEnable) {\n                this.autoRetriesCount = 0;\n            }\n        }\n\n        return {error};\n    }\n\n    markChannelAsReadAndViewed = (channelId) => {\n        // Posts are marked as read from here to not cause a race when loading posts\n        // marking channel as read and viewed after calling for posts in channel\n        this.props.actions.markChannelAsViewed(channelId);\n        this.props.actions.markChannelAsRead(channelId);\n    }\n\n    getOldestVisiblePostId = () => {\n        return getOldestPostId(this.props.postListIds);\n    }\n\n    getLatestVisiblePostId = () => {\n        return getLatestPostId(this.props.postListIds);\n    }\n\n    canLoadMorePosts = async (type = PostRequestTypes.BEFORE_ID) => {\n        if (!this.props.postListIds) {\n            return;\n        }\n\n        if (this.state.loadingOlderPosts || this.state.loadingNewerPosts) {\n            return;\n        }\n\n        if (this.extraPagesLoaded > MAX_EXTRA_PAGES_LOADED) {\n            // Prevent this from loading a lot of pages in a channel with only hidden messages\n            // Enable load more messages manual link\n            if (this.state.autoRetryEnable) {\n                this.setState({autoRetryEnable: false});\n            }\n            return;\n        }\n\n        if (!this.props.atOldestPost && type === PostRequestTypes.BEFORE_ID) {\n            const oldestPostId = this.getOldestVisiblePostId();\n            await this.getPostsBefore(oldestPostId);\n        } else if (!this.props.atLatestPost) {\n            // if all olderPosts are loaded load new ones\n            const latestPostId = this.getLatestVisiblePostId();\n            await this.getPostsAfter(latestPostId);\n        }\n\n        this.extraPagesLoaded += 1;\n    }\n\n    getPostsBefore = async () => {\n        if (this.state.loadingOlderPosts) {\n            return;\n        }\n        const oldestPostId = this.getOldestVisiblePostId();\n        this.setState({loadingOlderPosts: true});\n        await this.callLoadPosts(this.props.channelId, oldestPostId, PostRequestTypes.BEFORE_ID);\n    }\n\n    getPostsAfter = async () => {\n        if (this.state.loadingNewerPosts) {\n            return;\n        }\n        const latestPostId = this.getLatestVisiblePostId();\n        this.setState({loadingNewerPosts: true});\n        await this.callLoadPosts(this.props.channelId, latestPostId, PostRequestTypes.AFTER_ID);\n    }\n\n    render() {\n        if (!this.props.postListIds) {\n            return (\n                <LoadingScreen\n                    position='absolute'\n                    key='loading'\n                />\n            );\n        }\n\n        return (\n            <div\n                className='post-list-holder-by-time'\n                key={'postlist-' + this.props.channelId}\n            >\n                <div className='post-list__table'>\n                    <div\n                        id='virtualizedPostListContent'\n                        className='post-list__content'\n                    >\n                        <VirtPostList\n                            loadingNewerPosts={this.state.loadingNewerPosts}\n                            loadingOlderPosts={this.state.loadingOlderPosts}\n                            atOldestPost={this.props.atOldestPost}\n                            atLatestPost={this.props.atLatestPost}\n                            focusedPostId={this.props.focusedPostId}\n                            channelId={this.props.channelId}\n                            autoRetryEnable={this.state.autoRetryEnable}\n                            actions={this.actionsForPostList}\n                            postListIds={this.props.formattedPostIds}\n                            latestPostTimeStamp={this.props.latestPostTimeStamp}\n                            latestPostId={this.props.latestPostId}\n                        />\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport {withRouter} from 'react-router-dom';\n\nimport {getRecentPostsChunkInChannel, makeGetPostsChunkAroundPost, getUnreadPostsChunk, getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {isManuallyUnread} from 'mattermost-redux/selectors/entities/channels';\nimport {memoizeResult} from 'mattermost-redux/utils/helpers';\nimport {markChannelAsRead, markChannelAsViewed} from 'mattermost-redux/actions/channels';\nimport {makePreparePostIdsForPostList} from 'mattermost-redux/utils/post_list';\nimport {RequestStatus} from 'mattermost-redux/constants';\n\nimport {updateNewMessagesAtInChannel} from 'actions/global_actions';\nimport {getLatestPostId} from 'utils/post_utils';\nimport {\n    checkAndSetMobileView,\n    loadPosts,\n    loadUnreads,\n    loadPostsAround,\n    syncPostsInChannel,\n    loadLatestPosts,\n} from 'actions/views/channel';\n\nimport PostList from './post_list.jsx';\n\nconst isFirstLoad = (state, channelId) => !state.entities.posts.postsInChannel[channelId];\nconst memoizedGetLatestPostId = memoizeResult((postIds) => getLatestPostId(postIds));\n\n// This function is added as a fail safe for the channel sync issue we have.\n// When the user switches to a team for the first time we show the channel of previous team and then settle for the right channel after that\n// This causes the scroll correction etc an issue because post_list is not mounted for new channel instead it is updated\n\nfunction makeMapStateToProps() {\n    const getPostsChunkAroundPost = makeGetPostsChunkAroundPost();\n    const preparePostIdsForPostList = makePreparePostIdsForPostList();\n\n    return function mapStateToProps(state, ownProps) {\n        let latestPostTimeStamp = 0;\n        let postIds;\n        let chunk;\n        let atLatestPost = false;\n        let atOldestPost = false;\n        let formattedPostIds;\n        const {focusedPostId, unreadChunkTimeStamp, channelId} = ownProps;\n        const channelViewState = state.views.channel;\n        const lastViewedAt = channelViewState.lastChannelViewTime[channelId];\n        const isPrefetchingInProcess = channelViewState.channelPrefetchStatus[channelId] === RequestStatus.STARTED;\n        const channelManuallyUnread = isManuallyUnread(state, channelId);\n\n        if (focusedPostId && unreadChunkTimeStamp !== '') {\n            chunk = getPostsChunkAroundPost(state, focusedPostId, channelId);\n        } else if (unreadChunkTimeStamp) {\n            chunk = getUnreadPostsChunk(state, channelId, unreadChunkTimeStamp);\n        } else {\n            chunk = getRecentPostsChunkInChannel(state, channelId);\n        }\n\n        if (chunk) {\n            postIds = chunk.order;\n            atLatestPost = chunk.recent;\n            atOldestPost = chunk.oldest;\n        }\n\n        if (postIds) {\n            formattedPostIds = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages: true, channelId});\n            if (postIds.length) {\n                const latestPostId = memoizedGetLatestPostId(postIds);\n                const latestPost = getPost(state, latestPostId);\n                latestPostTimeStamp = latestPost.create_at;\n            }\n        }\n\n        return {\n            lastViewedAt,\n            isFirstLoad: isFirstLoad(state, channelId),\n            formattedPostIds,\n            atLatestPost,\n            atOldestPost,\n            latestPostTimeStamp,\n            postListIds: postIds,\n            isPrefetchingInProcess,\n            channelManuallyUnread,\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            loadUnreads,\n            loadPosts,\n            loadLatestPosts,\n            loadPostsAround,\n            checkAndSetMobileView,\n            syncPostsInChannel,\n            markChannelAsViewed,\n            markChannelAsRead,\n            updateNewMessagesAtInChannel,\n        }, dispatch),\n    };\n}\n\nexport default withRouter(connect(makeMapStateToProps, mapDispatchToProps)(PostList));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport LoadingScreen from 'components/loading_screen';\n\nimport PostList from './post_list';\n\nexport default class PostView extends React.PureComponent {\n    static propTypes = {\n        lastViewedAt: PropTypes.number,\n        channelLoading: PropTypes.bool,\n        channelId: PropTypes.string,\n        focusedPostId: PropTypes.string,\n    }\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            unreadChunkTimeStamp: props.lastViewedAt,\n            loaderForChangeOfPostsChunk: false,\n            channelLoading: props.channelLoading,\n        };\n    }\n\n    static getDerivedStateFromProps(props, state) {\n        if (state.unreadChunkTimeStamp === null && props.lastViewedAt) {\n            return {\n                unreadChunkTimeStamp: props.lastViewedAt,\n            };\n        }\n        if (props.channelLoading !== state.channelLoading) {\n            return {\n                unreadChunkTimeStamp: props.lastViewedAt,\n                channelLoading: props.channelLoading,\n            };\n        }\n\n        return null;\n    }\n\n    changeUnreadChunkTimeStamp = (unreadChunkTimeStamp) => {\n        this.setState({\n            unreadChunkTimeStamp,\n            loaderForChangeOfPostsChunk: true,\n        }, () => {\n            window.requestAnimationFrame(() => {\n                this.setState({\n                    loaderForChangeOfPostsChunk: false,\n                });\n            });\n        });\n    }\n\n    render() {\n        if (this.props.channelLoading || this.state.loaderForChangeOfPostsChunk) {\n            return (\n                <div id='post-list'>\n                    <LoadingScreen\n                        position='absolute'\n                        key='loading'\n                    />\n                </div>\n            );\n        }\n\n        return (\n            <div\n                id='post-list'\n                role='main'\n            >\n                <PostList\n                    unreadChunkTimeStamp={this.state.unreadChunkTimeStamp}\n                    channelId={this.props.channelId}\n                    changeUnreadChunkTimeStamp={this.changeUnreadChunkTimeStamp}\n                    focusedPostId={this.props.focusedPostId}\n                />\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {withRouter} from 'react-router-dom';\n\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\nimport {getTeamByName, getTeamMemberships} from 'mattermost-redux/selectors/entities/teams';\n\nimport {Constants} from 'utils/constants';\n\nimport PostView from './post_view.jsx';\n\nexport const isChannelLoading = (params, channel, team, teammate, teamMemberships) => {\n    if (params.postid) {\n        return false;\n    }\n\n    if (channel && team) {\n        if (channel.type !== Constants.DM_CHANNEL && channel.name !== params.identifier) {\n            return true;\n        } else if (channel.type === Constants.DM_CHANNEL && teammate && params.identifier !== `@${teammate.username}`) {\n            return true;\n        }\n\n        const teamId = team.id;\n        if ((channel.team_id && channel.team_id !== teamId) || (teamMemberships && !teamMemberships[teamId])) {\n            return true;\n        }\n\n        return false;\n    }\n\n    return true;\n};\n\nfunction makeMapStateToProps() {\n    return function mapStateToProps(state, ownProps) {\n        const team = getTeamByName(state, ownProps.match.params.team);\n        let teammate;\n\n        const channel = getChannel(state, ownProps.channelId);\n        let lastViewedAt = state.views.channel.lastChannelViewTime[ownProps.channelId];\n        if (channel) {\n            if (channel.type === Constants.DM_CHANNEL && channel.teammate_id) {\n                teammate = getUser(state, channel.teammate_id);\n            }\n            lastViewedAt = channel.last_post_at ? lastViewedAt : channel.last_post_at;\n        }\n\n        const teamMemberships = getTeamMemberships(state);\n        const channelLoading = isChannelLoading(ownProps.match.params, channel, team, teammate, teamMemberships);\n        return {\n            lastViewedAt,\n            channelLoading,\n        };\n    };\n}\n\nexport default withRouter(connect(makeMapStateToProps)(PostView));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport deferComponentRender from 'components/deferComponentRender';\nimport ChannelHeader from 'components/channel_header';\nimport CreatePost from 'components/create_post';\nimport FileUploadOverlay from 'components/file_upload_overlay';\nimport NextStepsView from 'components/next_steps_view';\nimport PostView from 'components/post_view';\nimport {clearMarks, mark, measure, trackEvent} from 'actions/telemetry_actions.jsx';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\n\ntype Props = {\n    channelId: string;\n    deactivatedChannel: boolean;\n    channelRolesLoading: boolean;\n    match: {\n        url: string;\n        params: {\n            postid?: string;\n        };\n    };\n    showNextStepsEphemeral: boolean;\n    channelIsArchived: boolean;\n    viewArchivedChannels: boolean;\n    isCloud: boolean;\n    actions: {\n        goToLastViewedChannel: () => Promise<{data: boolean}>;\n    };\n};\n\ntype State = {\n    channelId: string;\n    url: string;\n    focusedPostId?: string;\n    deferredPostView: any;\n};\n\nexport default class ChannelView extends React.PureComponent<Props, State> {\n    public static createDeferredPostView = () => {\n        return deferComponentRender(\n            PostView,\n            <div\n                id='post-list'\n                className='a11y__region'\n                data-a11y-sort-order='1'\n                data-a11y-focus-child={true}\n                data-a11y-order-reversed={true}\n            />,\n        );\n    }\n\n    static getDerivedStateFromProps(props: Props, state: State) {\n        let updatedState = {};\n        const focusedPostId = props.match.params.postid;\n\n        if (props.match.url !== state.url && props.channelId !== state.channelId) {\n            updatedState = {deferredPostView: ChannelView.createDeferredPostView(), url: props.match.url, focusedPostId};\n        }\n\n        if (props.channelId !== state.channelId) {\n            updatedState = {...updatedState, channelId: props.channelId, focusedPostId};\n        }\n\n        if (focusedPostId && focusedPostId !== state.focusedPostId) {\n            updatedState = {...updatedState, focusedPostId};\n        }\n\n        if (Object.keys(updatedState).length) {\n            return updatedState;\n        }\n\n        return null;\n    }\n    channelViewRef: React.RefObject<HTMLDivElement>;\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            url: props.match.url,\n            channelId: props.channelId,\n            focusedPostId: props.match.params.postid,\n            deferredPostView: ChannelView.createDeferredPostView(),\n        };\n\n        this.channelViewRef = React.createRef();\n    }\n\n    getChannelView = () => {\n        return this.channelViewRef.current;\n    }\n\n    onClickCloseChannel = () => {\n        this.props.actions.goToLastViewedChannel();\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (prevProps.channelId !== this.props.channelId || prevProps.channelIsArchived !== this.props.channelIsArchived) {\n            mark('ChannelView#componentDidUpdate');\n\n            const [dur1] = measure('SidebarChannelLink#click', 'ChannelView#componentDidUpdate');\n            const [dur2] = measure('TeamLink#click', 'ChannelView#componentDidUpdate');\n\n            clearMarks([\n                'SidebarChannelLink#click',\n                'ChannelView#componentDidUpdate',\n                'TeamLink#click',\n            ]);\n\n            if (dur1 !== -1) {\n                trackEvent('performance', 'channel_switch', {duration: Math.round(dur1)});\n            }\n            if (dur2 !== -1) {\n                trackEvent('performance', 'team_switch', {duration: Math.round(dur2)});\n            }\n            if (this.props.channelIsArchived && !this.props.viewArchivedChannels) {\n                this.props.actions.goToLastViewedChannel();\n            }\n        }\n    }\n\n    render() {\n        const {channelIsArchived} = this.props;\n\n        if (this.props.showNextStepsEphemeral) {\n            return (\n                <NextStepsView/>\n            );\n        }\n\n        let createPost;\n        if (this.props.deactivatedChannel) {\n            createPost = (\n                <div\n                    className='post-create__container'\n                    id='post-create'\n                >\n                    <div\n                        className='channel-archived__message'\n                    >\n                        <FormattedMarkdownMessage\n                            id='create_post.deactivated'\n                            defaultMessage='You are viewing an archived channel with a **deactivated user**. New messages cannot be posted.'\n                        />\n                        <button\n                            className='btn btn-primary channel-archived__close-btn'\n                            onClick={this.onClickCloseChannel}\n                        >\n                            <FormattedMessage\n                                id='center_panel.archived.closeChannel'\n                                defaultMessage='Close Channel'\n                            />\n                        </button>\n                    </div>\n                </div>\n            );\n        } else if (channelIsArchived) {\n            createPost = (\n                <div\n                    className='post-create__container'\n                    id='post-create'\n                >\n                    <div\n                        id='channelArchivedMessage'\n                        className='channel-archived__message'\n                    >\n                        <FormattedMarkdownMessage\n                            id='archivedChannelMessage'\n                            defaultMessage='You are viewing an **archived channel**. New messages cannot be posted.'\n                        />\n                        <button\n                            className='btn btn-primary channel-archived__close-btn'\n                            onClick={this.onClickCloseChannel}\n                        >\n                            <FormattedMessage\n                                id='center_panel.archived.closeChannel'\n                                defaultMessage='Close Channel'\n                            />\n                        </button>\n                    </div>\n                </div>\n            );\n        } else if (!this.props.channelRolesLoading) {\n            createPost = (\n                <div\n                    className='post-create__container'\n                    id='post-create'\n                >\n                    <CreatePost\n                        getChannelView={this.getChannelView}\n                    />\n                </div>\n            );\n        }\n\n        const DeferredPostView = this.state.deferredPostView;\n\n        return (\n            <div\n                ref={this.channelViewRef}\n                id='app-content'\n                className='app__content'\n            >\n                <FileUploadOverlay overlayType='center'/>\n                <ChannelHeader\n                    {...this.props}\n                />\n                <DeferredPostView\n                    channelId={this.props.channelId}\n                    focusedPostId={this.state.focusedPostId}\n                />\n                {createPost}\n            </div>\n        );\n    }\n}\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\nimport {withRouter} from 'react-router-dom';\n\nimport {getCurrentChannel, getDirectTeammate} from 'mattermost-redux/selectors/entities/channels';\nimport {getMyChannelRoles} from 'mattermost-redux/selectors/entities/roles';\nimport {getRoles} from 'mattermost-redux/selectors/entities/roles_helpers';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\n\nimport {goToLastViewedChannel} from 'actions/views/channel';\n\nimport {GlobalState} from 'types/store';\n\nimport ChannelView from './channel_view';\n\ntype Actions = {\n    goToLastViewedChannel: () => Promise<{data: boolean}>;\n}\n\nfunction isDeactivatedChannel(state: GlobalState, channelId: string) {\n    const teammate = getDirectTeammate(state, channelId);\n\n    return Boolean(teammate && teammate.delete_at);\n}\n\nfunction mapStateToProps(state: GlobalState) {\n    const channel = getCurrentChannel(state);\n\n    const config = getConfig(state);\n\n    const viewArchivedChannels = config.ExperimentalViewArchivedChannels === 'true';\n    const enableOnboardingFlow = config.EnableOnboardingFlow === 'true';\n\n    let channelRolesLoading = true;\n    if (channel && channel.id) {\n        const roles = getRoles(state);\n        const myChannelRoles = getMyChannelRoles(state);\n        if (myChannelRoles[channel.id]) {\n            const channelRoles = myChannelRoles[channel.id].values();\n            for (const roleName of channelRoles) {\n                if (roles[roleName]) {\n                    channelRolesLoading = false;\n                }\n                break;\n            }\n        }\n    }\n\n    return {\n        channelId: channel ? channel.id : '',\n        channelRolesLoading,\n        deactivatedChannel: channel ? isDeactivatedChannel(state, channel.id) : false,\n        focusedPostId: state.views.channel.focusedPostId,\n        showNextStepsEphemeral: state.views.nextSteps.show && enableOnboardingFlow,\n        channelIsArchived: channel ? channel.delete_at !== 0 : false,\n        viewArchivedChannels,\n        isCloud: getLicense(state).Cloud === 'true',\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc|GenericAction>, Actions>({\n            goToLastViewedChannel,\n        }, dispatch),\n    };\n}\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(ChannelView));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport ChannelView from 'components/channel_view/index';\nimport {browserHistory} from 'utils/browser_history';\nimport Constants from 'utils/constants.jsx';\n\nexport interface Match {\n    params: {\n        identifier: string;\n        team: string;\n        postid?: string;\n        path: string;\n    };\n    url: string;\n}\n\nexport type MatchAndHistory = Pick<Props, 'match' | 'history'>\n\ninterface Props {\n    match: Match;\n    actions: {\n        onChannelByIdentifierEnter: (props: MatchAndHistory) => any;\n    };\n    history: any;\n}\n\nexport default class ChannelIdentifierRouter extends React.PureComponent<Props> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            prevProps: props,\n        };\n    }\n\n    private replaceUrlTimeout!: NodeJS.Timeout;\n\n    componentDidUpdate(prevProps: Props) {\n        if (this.props.match.params.team !== prevProps.match.params.team ||\n            this.props.match.params.identifier !== prevProps.match.params.identifier) {\n            clearTimeout(this.replaceUrlTimeout);\n            this.props.actions.onChannelByIdentifierEnter(this.props);\n            this.replaceUrlIfPermalink();\n        }\n    }\n    componentDidMount() {\n        this.props.actions.onChannelByIdentifierEnter(this.props);\n        this.replaceUrlIfPermalink();\n    }\n\n    componentWillUnmount() {\n        clearTimeout(this.replaceUrlTimeout);\n    }\n\n    replaceUrlIfPermalink = () => {\n        if (this.props.match.params.postid) {\n            this.replaceUrlTimeout = setTimeout(() => {\n                const channelUrl = this.props.match.url.split('/').slice(0, -1).join('/');\n                browserHistory.replace(channelUrl);\n            }, Constants.PERMALINK_FADEOUT);\n        }\n    }\n\n    render() {\n        return <ChannelView/>;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\nimport {withRouter} from 'react-router-dom';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {onChannelByIdentifierEnter} from './actions';\nimport ChannelIdentifierRouter from './channel_identifier_router';\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            onChannelByIdentifierEnter,\n        }, dispatch),\n    };\n}\n\nexport default withRouter(connect(null, mapDispatchToProps)(ChannelIdentifierRouter));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useEffect} from 'react';\nimport {AnyAction, Dispatch} from 'redux';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {useRouteMatch} from 'react-router-dom';\n\nimport {getChannelByName} from 'mattermost-redux/selectors/entities/channels';\nimport {Client4} from 'mattermost-redux/client';\nimport {IntegrationTypes} from 'mattermost-redux/action_types';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {getTeamByName} from 'mattermost-redux/selectors/entities/teams';\nimport {generateId} from 'mattermost-redux/utils/helpers';\n\nimport {switchToChannel} from 'actions/views/channel';\nimport {getLastViewedChannelNameByTeamName} from 'selectors/local_storage';\nimport {GlobalState} from 'types/store';\n\ninterface MatchParams {\n    team: string;\n    playbookId: string;\n}\n\nconst PlaybookRunner = () => {\n    const match = useRouteMatch<MatchParams>();\n    const dispatch = useDispatch();\n\n    const teamName = match.params.team;\n    const playbookId = match.params.playbookId;\n\n    const team = useSelector((state: GlobalState) => getTeamByName(state, teamName));\n\n    const lastViewedChannelName = useSelector((state: GlobalState) => getLastViewedChannelNameByTeamName(state, teamName));\n    const lastViewedChannel = useSelector((state: GlobalState) => getChannelByName(state, lastViewedChannelName));\n\n    useEffect(() => {\n        const switchToChannelAndStartRun = async () => {\n            const channelToSwitchTo = lastViewedChannel ?? await Client4.getChannelByName(team?.id || '', 'town-square');\n\n            dispatch(switchToChannel(channelToSwitchTo));\n            dispatch(startPlaybookRunById(channelToSwitchTo, team?.id || '', playbookId));\n        };\n\n        switchToChannelAndStartRun();\n    }, []);\n\n    return null;\n};\n\nfunction startPlaybookRunById(currentChannel: Channel, teamId: string, playbookId: string) {\n    return async (dispatch: Dispatch<AnyAction>) => {\n        // Generate a unique id for the command and send it to Playbooks\n        const clientId = generateId();\n        dispatch({type: 'playbooks_set_client_id', clientId});\n\n        const command = `/playbook run-playbook ${playbookId} ${clientId}`;\n\n        const args = {\n            channel_id: currentChannel.id,\n            team_id: teamId,\n        };\n\n        try {\n            const data = await Client4.executeCommand(command, args);\n            dispatch({type: IntegrationTypes.RECEIVED_DIALOG_TRIGGER_ID, data: data?.trigger_id});\n        } catch (error) {\n            console.error(error); //eslint-disable-line no-console\n        }\n    };\n}\n\nexport default PlaybookRunner;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Route, Switch, Redirect} from 'react-router-dom';\nimport classNames from 'classnames';\n\nimport {Action, ActionFunc} from 'mattermost-redux/types/actions';\n\nimport LoadingScreen from 'components/loading_screen';\nimport PermalinkView from 'components/permalink_view';\nimport ChannelHeaderMobile from 'components/channel_header_mobile';\nimport ChannelIdentifierRouter from 'components/channel_layout/channel_identifier_router';\nimport PlaybookRunner from 'components/channel_layout/playbook_runner';\nimport {makeAsyncComponent} from 'components/async_load';\nconst LazyGlobalThreads = makeAsyncComponent(\n    React.lazy(() => import('components/threading/global_threads')),\n    (\n        <div className='app__content'>\n            <LoadingScreen/>\n        </div>\n    ),\n);\n\ntype Props = {\n    match: {\n        url: string;\n    };\n    location: {\n        pathname: string;\n    };\n    lastChannelPath: string;\n    lhsOpen: boolean;\n    rhsOpen: boolean;\n    rhsMenuOpen: boolean;\n    isCollapsedThreadsEnabled: boolean;\n    currentUserId: string;\n    showNextSteps: boolean;\n    showNextStepsTips: boolean;\n    isOnboardingHidden: boolean;\n    showNextStepsEphemeral: boolean;\n    actions: {\n        setShowNextStepsView: (show: boolean) => Action;\n        getProfiles: (page?: number, perPage?: number, options?: Record<string, string | boolean>) => ActionFunc;\n    };\n};\n\ntype State = {\n    returnTo: string;\n    lastReturnTo: string;\n};\n\nexport default class CenterChannel extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            returnTo: '',\n            lastReturnTo: '',\n        };\n    }\n\n    static getDerivedStateFromProps(nextProps: Props, prevState: State) {\n        if (prevState.lastReturnTo !== nextProps.location.pathname && nextProps.location.pathname.includes('/pl/')) {\n            return {\n                lastReturnTo: nextProps.location.pathname,\n                returnTo: prevState.lastReturnTo,\n            };\n        }\n        return {lastReturnTo: nextProps.location.pathname};\n    }\n\n    async componentDidMount() {\n        const {actions, showNextSteps, showNextStepsTips, isOnboardingHidden} = this.props;\n        await actions.getProfiles();\n        if ((showNextSteps || showNextStepsTips) && !isOnboardingHidden) {\n            actions.setShowNextStepsView(true);\n        }\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        const {location, showNextStepsEphemeral, actions} = this.props;\n        if (location.pathname !== prevProps.location.pathname && showNextStepsEphemeral) {\n            actions.setShowNextStepsView(false);\n        }\n    }\n\n    render() {\n        const {lastChannelPath, isCollapsedThreadsEnabled} = this.props;\n        const url = this.props.match.url;\n        return (\n            <div\n                key='inner-wrap'\n                className={classNames('inner-wrap', 'channel__wrap', {\n                    'move--right': this.props.lhsOpen,\n                    'move--left': this.props.rhsOpen,\n                    'move--left-small': this.props.rhsMenuOpen,\n                })}\n            >\n                <div className='row header'>\n                    <div id='navbar_wrapper'>\n                        <ChannelHeaderMobile/>\n                    </div>\n                </div>\n                <div className='row main'>\n                    <Switch>\n                        <Route\n                            path={`${url}/pl/:postid`}\n                            render={(props) => (\n                                <PermalinkView\n                                    {...props}\n                                    returnTo={this.state.returnTo}\n                                />\n                            )}\n                        />\n                        <Route\n                            path='/:team/:path(channels|messages)/:identifier/:postid?'\n                            component={ChannelIdentifierRouter}\n                        />\n                        <Route\n                            path='/:team/_playbooks/:playbookId/run'\n                        >\n                            <PlaybookRunner/>\n                        </Route>\n                        {isCollapsedThreadsEnabled ? (\n                            <Route\n                                path='/:team/threads/:threadIdentifier?'\n                                component={LazyGlobalThreads}\n                            />\n                        ) : null}\n                        <Redirect to={lastChannelPath}/>\n                    </Switch>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {getProfiles} from 'mattermost-redux/actions/users';\nimport {Action, ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\nimport {getTeamByName} from 'mattermost-redux/selectors/entities/teams';\nimport {getRedirectChannelNameForTeam} from 'mattermost-redux/selectors/entities/channels';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {setShowNextStepsView} from 'actions/views/next_steps';\nimport {getIsRhsOpen, getIsRhsMenuOpen} from 'selectors/rhs';\nimport {getIsLhsOpen} from 'selectors/lhs';\nimport {getLastViewedChannelNameByTeamName} from 'selectors/local_storage';\n\nimport {isOnboardingHidden, showNextSteps, showNextStepsTips} from 'components/next_steps_view/steps';\n\nimport {GlobalState} from 'types/store';\n\nimport CenterChannel from './center_channel';\n\ntype Props = {\n    match: {\n        url: string;\n        params: {\n            team: string;\n        };\n    };\n};\n\nconst mapStateToProps = (state: GlobalState, ownProps: Props) => {\n    let channelName = getLastViewedChannelNameByTeamName(state, ownProps.match.params.team);\n    if (!channelName) {\n        const team = getTeamByName(state, ownProps.match.params.team);\n        channelName = getRedirectChannelNameForTeam(state, team!.id);\n    }\n    const lastChannelPath = `${ownProps.match.url}/channels/${channelName}`;\n    return {\n        lastChannelPath,\n        lhsOpen: getIsLhsOpen(state),\n        rhsOpen: getIsRhsOpen(state),\n        rhsMenuOpen: getIsRhsMenuOpen(state),\n        isCollapsedThreadsEnabled: isCollapsedThreadsEnabled(state),\n        currentUserId: getCurrentUserId(state),\n        showNextSteps: showNextSteps(state),\n        showNextStepsTips: showNextStepsTips(state),\n        isOnboardingHidden: isOnboardingHidden(state),\n        showNextStepsEphemeral: state.views.nextSteps.show,\n    };\n};\n\ntype Actions = {\n    setShowNextStepsView: (show: boolean) => Action;\n    getProfiles: (page?: number, perPage?: number, options?: Record<string, string | boolean>) => ActionFunc;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc|GenericAction>, Actions>({\n            setShowNextStepsView,\n            getProfiles,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CenterChannel);\n\n","export default __webpack_public_path__ + \"files/600f704b31e55e8c66ff56dcd23524be.png\";","export default __webpack_public_path__ + \"files/04989761139ad02dd01ddb15ad96cfcf.png\";","export default __webpack_public_path__ + \"files/bbeff8de2a87751f77c52bfb91f34d3f.png\";","export default __webpack_public_path__ + \"files/12739c3d754c4cbf8e4515eda6f061f1.png\";","export default __webpack_public_path__ + \"files/a5626ec56ca0d523c7617fb8ce4f930c.png\";","export default __webpack_public_path__ + \"files/73b01856d8468720a45e0dfa09c4c863.png\";","export default __webpack_public_path__ + \"files/6228bd2fb253f0498621abac69b1aa5a.png\";","export default __webpack_public_path__ + \"files/23b05bf1c50f0f943f48acdfdc0330c2.png\";","export default __webpack_public_path__ + \"files/17c75366f3002db8e492b9c9e603dd13.png\";","export default __webpack_public_path__ + \"files/3f567904257fbe3c94487f0db0302579.png\";","export default __webpack_public_path__ + \"files/279e0896835a77a517f38d5c01f3228d.png\";","export default __webpack_public_path__ + \"files/f4c0425d456ce2d3d2d7da98d1cd90c2.png\";","export default __webpack_public_path__ + \"files/a47f71cbbf3c29367e0ac083e5d4e013.png\";","export default __webpack_public_path__ + \"files/e24161d2e5ad9b90c415a0c953088f98.png\";","export default __webpack_public_path__ + \"files/1aa85291f08d74c7dc9fd8490cc4645e.png\";","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {injectIntl, IntlShape} from 'react-intl';\n\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {Team} from 'mattermost-redux/types/teams';\n\nimport * as UserAgent from 'utils/user_agent';\nimport {Constants} from 'utils/constants';\n\nimport {basicUnreadMeta, BasicUnreadStatus} from 'mattermost-redux/selectors/entities/channels';\n\n// default favicons\nimport faviconDefault16x16 from 'images/favicon/favicon-default-16x16.png';\nimport faviconDefault24x24 from 'images/favicon/favicon-default-24x24.png';\nimport faviconDefault32x32 from 'images/favicon/favicon-default-32x32.png';\nimport faviconDefault64x64 from 'images/favicon/favicon-default-64x64.png';\nimport faviconDefault96x96 from 'images/favicon/favicon-default-96x96.png';\n\n// mention favicons\nimport faviconMention16x16 from 'images/favicon/favicon-mentions-16x16.png';\nimport faviconMention24x24 from 'images/favicon/favicon-mentions-24x24.png';\nimport faviconMention32x32 from 'images/favicon/favicon-mentions-32x32.png';\nimport faviconMention64x64 from 'images/favicon/favicon-mentions-64x64.png';\nimport faviconMention96x96 from 'images/favicon/favicon-mentions-96x96.png';\n\n// unread favicons\nimport faviconUnread16x16 from 'images/favicon/favicon-unread-16x16.png';\nimport faviconUnread24x24 from 'images/favicon/favicon-unread-24x24.png';\nimport faviconUnread32x32 from 'images/favicon/favicon-unread-32x32.png';\nimport faviconUnread64x64 from 'images/favicon/favicon-unread-64x64.png';\nimport faviconUnread96x96 from 'images/favicon/favicon-unread-96x96.png';\n\nenum BadgeStatus {\n    Mention = 'Mention',\n    Unread = 'Unread',\n    None = 'None'\n}\n\ntype Props = {\n    intl: IntlShape;\n    unreadStatus: BasicUnreadStatus;\n    siteName?: string;\n    currentChannel?: Channel;\n    currentTeam: Team;\n    currentTeammate: Channel | null;\n    inGlobalThreads: boolean;\n};\n\nexport class FaviconTitleHandlerClass extends React.PureComponent<Props> {\n    componentDidUpdate(prevProps: Props) {\n        this.updateTitle();\n        const oldBadgeStatus = this.getBadgeStatus(prevProps.unreadStatus);\n        const newBadgeStatus = this.getBadgeStatus(this.props.unreadStatus);\n\n        if (oldBadgeStatus !== newBadgeStatus) {\n            this.updateFavicon(newBadgeStatus);\n        }\n    }\n\n    get isDynamicFaviconSupported() {\n        return UserAgent.isChrome() || UserAgent.isFirefox();\n    }\n\n    getBadgeStatus(unreadStatus: BasicUnreadStatus) {\n        if (typeof unreadStatus === 'number') {\n            return BadgeStatus.Mention;\n        } else if (unreadStatus) {\n            return BadgeStatus.Unread;\n        }\n        return BadgeStatus.None;\n    }\n\n    updateTitle = () => {\n        const {\n            siteName,\n            currentChannel,\n            currentTeam,\n            currentTeammate,\n            unreadStatus,\n            inGlobalThreads,\n        } = this.props;\n        const {formatMessage} = this.props.intl;\n\n        const currentSiteName = siteName || '';\n\n        const {isUnread, unreadMentionCount} = basicUnreadMeta(unreadStatus);\n\n        const mentionTitle = unreadMentionCount > 0 ? `(${unreadMentionCount}) ` : '';\n        const unreadTitle = !this.isDynamicFaviconSupported && isUnread ? '* ' : '';\n\n        if (currentChannel && currentTeam && currentChannel.id) {\n            let currentChannelName = currentChannel.display_name;\n            if (currentChannel.type === Constants.DM_CHANNEL) {\n                if (currentTeammate != null) {\n                    currentChannelName = currentTeammate.display_name;\n                }\n            }\n            document.title = `${mentionTitle}${unreadTitle}${currentChannelName} - ${currentTeam.display_name} ${currentSiteName}`;\n        } else if (currentTeam && inGlobalThreads) {\n            document.title = formatMessage({\n                id: 'globalThreads.title',\n                defaultMessage: '{prefix}Threads - {displayName} {siteName}',\n            }, {\n                prefix: `${mentionTitle}${unreadTitle}`,\n                displayName: currentTeam.display_name,\n                siteName: currentSiteName,\n            });\n        } else {\n            document.title = formatMessage({id: 'sidebar.team_select', defaultMessage: '{siteName} - Join a team'}, {siteName: currentSiteName || 'Mattermost'});\n        }\n    }\n\n    updateFavicon = (badgeStatus: BadgeStatus) => {\n        if (!(UserAgent.isFirefox() || UserAgent.isChrome())) {\n            return;\n        }\n\n        const link = document.querySelector('link[rel=\"icon\"]');\n\n        if (!link) {\n            return;\n        }\n        const link16x16 = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"][sizes=\"16x16\"]');\n        const link24x24 = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"][sizes=\"24x24\"]');\n        const link32x32 = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"][sizes=\"32x32\"]');\n        const link64x64 = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"][sizes=\"64x64\"]');\n        const link96x96 = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"][sizes=\"96x96\"]');\n\n        const getFavicon = (url: string): string => (typeof url === 'string' ? url : '');\n\n        switch (badgeStatus) {\n        case BadgeStatus.Mention: {\n            link16x16!.href = getFavicon(faviconMention16x16);\n            link24x24!.href = getFavicon(faviconMention24x24);\n            link32x32!.href = getFavicon(faviconMention32x32);\n            link64x64!.href = getFavicon(faviconMention64x64);\n            link96x96!.href = getFavicon(faviconMention96x96);\n            break;\n        }\n        case BadgeStatus.Unread: {\n            link16x16!.href = getFavicon(faviconUnread16x16);\n            link24x24!.href = getFavicon(faviconUnread24x24);\n            link32x32!.href = getFavicon(faviconUnread32x32);\n            link64x64!.href = getFavicon(faviconUnread64x64);\n            link96x96!.href = getFavicon(faviconUnread96x96);\n            break;\n        }\n        default: {\n            link16x16!.href = getFavicon(faviconDefault16x16);\n            link24x24!.href = getFavicon(faviconDefault24x24);\n            link32x32!.href = getFavicon(faviconDefault32x32);\n            link64x64!.href = getFavicon(faviconDefault64x64);\n            link96x96!.href = getFavicon(faviconDefault96x96);\n        }\n        }\n    }\n\n    render() {\n        return null;\n    }\n}\n\nexport default injectIntl(FaviconTitleHandlerClass);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ComponentProps} from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\nimport {withRouter, RouteChildrenProps, matchPath} from 'react-router-dom';\n\nimport {getCurrentChannel, getUnreadStatus} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport FaviconTitleHandler from './favicon_title_handler';\n\ntype Props = RouteChildrenProps;\n\nfunction mapStateToProps(state: GlobalState, {location: {pathname}}: Props): ComponentProps<typeof FaviconTitleHandler> {\n    const config = getConfig(state);\n    const currentChannel = getCurrentChannel(state);\n    const currentTeammate = (currentChannel && currentChannel.teammate_id) ? currentChannel : null;\n    const currentTeam = getCurrentTeam(state);\n\n    return {\n        currentChannel,\n        currentTeam,\n        currentTeammate,\n        siteName: config.SiteName,\n        unreadStatus: getUnreadStatus(state),\n        inGlobalThreads: matchPath(pathname, {path: '/:team/threads/:threadIdentifier?'}) != null,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n        }, dispatch),\n    };\n}\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(FaviconTitleHandler));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nexport default class AdminEyeIcon extends React.PureComponent<React.HTMLAttributes<HTMLSpanElement>> {\n    render() {\n        return (\n            <span {...this.props}>\n                <FormattedMessage\n                    id='generic_icons.adminOnlyIcon'\n                    defaultMessage='Admin View Only Icon'\n                >\n                    {(ariaLabel: string) => (\n                        <svg\n                            width='14'\n                            height='10'\n                            viewBox='0 0 14 10'\n                            fill='none'\n                            role='img'\n                            aria-label={ariaLabel}\n                        >\n                            <path\n                                d='M7 3.21005C7.3264 3.21005 7.624 3.29165 7.8928 3.45485C8.1712 3.61805 8.392 3.83885 8.5552 4.11725C8.7184 4.38605 8.8 4.68365 8.8 5.01005C8.8 5.33645 8.7184 5.63885 8.5552 5.91725C8.392 6.18605 8.1712 6.40205 7.8928 6.56525C7.624 6.72845 7.3264 6.81005 7 6.81005C6.6736 6.81005 6.3712 6.72845 6.0928 6.56525C5.824 6.40205 5.608 6.18605 5.4448 5.91725C5.2816 5.63885 5.2 5.33645 5.2 5.01005C5.2 4.68365 5.2816 4.38605 5.4448 4.11725C5.608 3.83885 5.824 3.61805 6.0928 3.45485C6.3712 3.29165 6.6736 3.21005 7 3.21005ZM7 0.502848C7.9792 0.502848 8.9152 0.694848 9.808 1.07885C10.672 1.46285 11.4304 1.99565 12.0832 2.67725C12.7456 3.35885 13.2496 4.13645 13.5952 5.01005C13.2496 5.88365 12.7456 6.66125 12.0832 7.34285C11.4304 8.02445 10.672 8.55245 9.808 8.92685C8.9152 9.31085 7.9792 9.50285 7 9.50285C6.0208 9.50285 5.0848 9.31085 4.192 8.92685C3.328 8.55245 2.5648 8.02445 1.9024 7.34285C1.2496 6.66125 0.7504 5.88365 0.4048 5.01005C0.7504 4.13645 1.2496 3.35885 1.9024 2.67725C2.5648 1.99565 3.328 1.46285 4.192 1.07885C5.0848 0.694848 6.0208 0.502848 7 0.502848ZM1.7152 5.01005C2.0416 5.67245 2.4736 6.25325 3.0112 6.75245C3.5488 7.25165 4.1584 7.63565 4.84 7.90445C5.5312 8.17325 6.2512 8.30765 7 8.30765C8.1328 8.30765 9.1744 8.01005 10.1248 7.41485C11.0752 6.81965 11.8 6.01805 12.2992 5.01005C11.8 4.00205 11.0752 3.20045 10.1248 2.60525C9.1744 2.01005 8.1328 1.71245 7 1.71245C6.2512 1.71245 5.5312 1.84685 4.84 2.11565C4.1584 2.38445 3.5488 2.76845 3.0112 3.26765C2.4736 3.76685 2.0416 4.34765 1.7152 5.01005Z'\n                                fill='rgba(var(--center-channel-color-rgb), 0.72)'\n                                fillOpacity='0.48'\n                            />\n                        </svg>\n                    )}\n                </FormattedMessage>\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {ProductNotices, ProductNotice} from 'mattermost-redux/types/product_notices';\nimport {WebsocketStatus} from 'mattermost-redux/types/websocket';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport Markdown from 'components/markdown';\nimport GenericModal from 'components/generic_modal';\nimport NextIcon from 'components/widgets/icons/fa_next_icon';\nimport PreviousIcon from 'components/widgets/icons/fa_previous_icon';\nimport AdminEyeIcon from 'components/widgets/icons/admin_eye_icon';\n\nimport {isDesktopApp, getDesktopVersion} from 'utils/user_agent';\n\nimport './product_notices_modal.scss';\n\ntype Props = {\n    version: string;\n    currentTeamId: string;\n    socketStatus: WebsocketStatus;\n    actions: {\n        getInProductNotices: (teamId: string, client: string, clientVersion: string) => Promise<{\n            data: ProductNotices;\n        }>;\n        updateNoticesAsViewed: (noticeIds: string[]) => Promise<Record<string, unknown>>;\n    };\n}\n\ntype State = {\n    presentNoticeIndex: number;\n    noticesData: ProductNotices;\n}\n\nexport default class ProductNoticesModal extends React.PureComponent<Props, State> {\n    clearDataTimer?: number;\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            presentNoticeIndex: 0,\n            noticesData: [],\n        };\n        this.clearDataTimer = undefined;\n    }\n\n    public componentDidMount() {\n        this.fetchNoticesData();\n    }\n\n    public componentDidUpdate(prevProps: Props) {\n        const presentSocketState = this.props.socketStatus;\n        const prevSocketState = prevProps.socketStatus;\n        if (presentSocketState.connected && !prevSocketState.connected && prevSocketState.lastConnectAt) {\n            const presentTime = Date.now();\n            const previousSocketConnectDate = new Date(prevSocketState.lastConnectAt).getDate();\n            const presentDate = new Date(presentTime).getDate();\n            if (presentDate !== previousSocketConnectDate && presentTime > prevSocketState.lastConnectAt) {\n                this.fetchNoticesData();\n            }\n        }\n    }\n\n    public componentWillUnmount() {\n        clearTimeout(this.clearDataTimer);\n    }\n\n    private async fetchNoticesData() {\n        const {version, currentTeamId} = this.props;\n        let client = 'web';\n        let clientVersion = version;\n        if (isDesktopApp()) {\n            client = 'desktop';\n            clientVersion = getDesktopVersion();\n        }\n\n        const {data} = await this.props.actions.getInProductNotices(currentTeamId, client, clientVersion);\n        if (data) {\n            this.setState({\n                noticesData: data,\n            });\n            if (data.length) {\n                const presentNoticeInfo = this.state.noticesData[this.state.presentNoticeIndex];\n                this.props.actions.updateNoticesAsViewed([presentNoticeInfo.id]);\n            }\n        }\n    }\n\n    private confirmButtonText(presentNoticeInfo: ProductNotice) {\n        const noOfNotices = this.state.noticesData.length;\n\n        if (noOfNotices === 1 && presentNoticeInfo.actionText) {\n            return (\n                <span>\n                    {presentNoticeInfo.actionText}\n                </span>\n            );\n        } else if (noOfNotices === this.state.presentNoticeIndex + 1) {\n            return (\n                <FormattedMessage\n                    id={'generic.done'}\n                    defaultMessage='Done'\n                />\n            );\n        }\n        return (\n            <>\n                <FormattedMessage\n                    id={'generic.next'}\n                    defaultMessage='Next'\n                />\n                <NextIcon/>\n            </>\n        );\n    }\n\n    private cancelButtonText() {\n        if (this.state.presentNoticeIndex !== 0) {\n            return (\n                <>\n                    <PreviousIcon/>\n                    <FormattedMessage\n                        id={'generic.previous'}\n                        defaultMessage='Previous'\n                    />\n                </>\n            );\n        }\n        return null;\n    }\n\n    private renderCicrleIndicators() {\n        const noOfNotices = this.state.noticesData.length;\n        if (noOfNotices === 1) {\n            return null;\n        }\n\n        const indicators = [];\n        for (let i = 0; i < noOfNotices; i++) {\n            let className = 'circle';\n            if (i === this.state.presentNoticeIndex) {\n                className += ' active';\n            }\n\n            indicators.push(\n                <span\n                    id={'tutorialIntroCircle' + i}\n                    key={'circle' + i}\n                    className={className}\n                    data-screen={i}\n                />,\n            );\n        }\n        return (\n            <span className='tutorial__circles'>\n                {indicators}\n            </span>\n        );\n    }\n\n    private renderAdminOnlyText() {\n        if (this.state.noticesData[this.state.presentNoticeIndex].sysAdminOnly) {\n            return (\n                <>\n                    <AdminEyeIcon/>\n                    <FormattedMessage\n                        id={'inProduct_notices.adminOnlyMessage'}\n                        defaultMessage='Visible to Admins only'\n                    />\n                </>\n            );\n        }\n        return null;\n    }\n\n    private renderImage(image: string | undefined) {\n        if (image) {\n            return (\n                <img\n                    className='productNotices__img'\n                    src={image}\n                />\n            );\n        }\n        return null;\n    }\n\n    private trackClickEvent = () => {\n        const presentNoticeInfo = this.state.noticesData[this.state.presentNoticeIndex];\n        trackEvent('ui', `notice_click_${presentNoticeInfo.id}`);\n    }\n\n    private renderActionButton(presentNoticeInfo: ProductNotice) {\n        const noOfNotices = this.state.noticesData.length;\n\n        if (noOfNotices !== 1 && presentNoticeInfo.actionText) {\n            return (\n                <a\n                    target='_blank'\n                    id='actionButton'\n                    rel='noopener noreferrer'\n                    className='GenericModal__button actionButton'\n                    href={presentNoticeInfo.actionParam}\n                    onClick={this.trackClickEvent}\n                >\n                    {presentNoticeInfo.actionText}\n                </a>\n            );\n        }\n        return null;\n    }\n\n    private handleNextButton = () => {\n        const presentNoticeInfo = this.state.noticesData[this.state.presentNoticeIndex];\n        const noOfNotices = this.state.noticesData.length;\n        if (noOfNotices === 1 && presentNoticeInfo.actionText) {\n            this.trackClickEvent();\n            window.open(presentNoticeInfo.actionParam, '_blank');\n        } else if (this.state.presentNoticeIndex + 1 < noOfNotices) {\n            const nextNoticeInfo = this.state.noticesData[this.state.presentNoticeIndex + 1];\n\n            this.props.actions.updateNoticesAsViewed([nextNoticeInfo.id]);\n\n            this.setState({\n                presentNoticeIndex: this.state.presentNoticeIndex + 1,\n            });\n        }\n    }\n\n    private handlePreviousButton = () => {\n        if (this.state.presentNoticeIndex !== 0) {\n            this.setState({\n                presentNoticeIndex: this.state.presentNoticeIndex - 1,\n            });\n        }\n    }\n\n    onModalDismiss = () => {\n        this.clearDataTimer = window.setTimeout(() => {\n            this.setState({\n                noticesData: [],\n                presentNoticeIndex: 0,\n            });\n        }, 3000);\n    }\n\n    render() {\n        if (!this.state.noticesData.length) {\n            return null;\n        }\n\n        const presentNoticeInfo = this.state.noticesData[this.state.presentNoticeIndex];\n        const handlePreviousButton = this.state.presentNoticeIndex === 0 ? undefined : this.handlePreviousButton;\n        const autoCloseOnConfirmButton = this.state.presentNoticeIndex === this.state.noticesData.length - 1;\n\n        return (\n            <GenericModal\n                show={true}\n                onHide={this.onModalDismiss}\n                handleConfirm={this.handleNextButton}\n                handleCancel={handlePreviousButton}\n                modalHeaderText={(\n                    <span>\n                        {presentNoticeInfo.title}\n                    </span>\n                )}\n                confirmButtonText={this.confirmButtonText(presentNoticeInfo)}\n                cancelButtonText={this.cancelButtonText()}\n                className='productNotices'\n                autoCloseOnConfirmButton={autoCloseOnConfirmButton}\n                autoCloseOnCancelButton={false}\n            >\n                <span className='productNotices__helpText'>\n                    <Markdown\n                        message={presentNoticeInfo.description}\n                    />\n                </span>\n                {this.renderActionButton(presentNoticeInfo)}\n                <div className='productNotices__imageDiv'>\n                    {this.renderImage(presentNoticeInfo.image)}\n                </div>\n                <div className='productNotices__info'>\n                    {this.renderCicrleIndicators()}\n                    {this.renderAdminOnlyText()}\n                </div>\n            </GenericModal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport {ActionFunc} from 'mattermost-redux/types/actions';\nimport {ProductNotices} from 'mattermost-redux/types/product_notices';\nimport {WebsocketStatus} from 'mattermost-redux/types/websocket';\nimport {getInProductNotices, updateNoticesAsViewed} from 'mattermost-redux/actions/teams';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {ClientConfig} from 'mattermost-redux/types/config';\n\nimport {getSocketStatus} from 'selectors/views/websocket';\nimport {GlobalState} from 'types/store';\n\nimport ProductNoticesModal from './product_notices_modal';\n\ntype Actions = {\n    getInProductNotices: (teamId: string, client: string, clientVersion: string) => Promise<{\n        data: ProductNotices;\n    }>;\n    updateNoticesAsViewed: (noticeIds: string[]) => Promise<Record<string, unknown>>;\n}\n\nfunction mapStateToProps(state: GlobalState) {\n    const config: Partial<ClientConfig> = getConfig(state);\n    const version: string = config.Version || ''; //this should always exist but TS throws error\n    const socketStatus: WebsocketStatus = getSocketStatus(state);\n\n    return {\n        currentTeamId: getCurrentTeamId(state),\n        version,\n        socketStatus,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            getInProductNotices,\n            updateNoticesAsViewed,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ProductNoticesModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {Route} from 'react-router-dom';\n\nimport AnnouncementBarController from 'components/announcement_bar';\n\nimport Pluggable from 'plugins/pluggable';\nimport SystemNotice from 'components/system_notice';\nimport EditPostModal from 'components/edit_post_modal';\n\nimport GetPublicLinkModal from 'components/get_public_link_modal';\nimport LeavePrivateChannelModal from 'components/leave_private_channel_modal';\nimport ResetStatusModal from 'components/reset_status_modal';\nimport ShortcutsModal from 'components/shortcuts_modal.jsx';\nimport SidebarRight from 'components/sidebar_right';\nimport SidebarRightMenu from 'components/sidebar_right_menu';\nimport ImportThemeModal from 'components/user_settings/import_theme_modal';\nimport TeamSidebar from 'components/team_sidebar';\nimport Sidebar from 'components/sidebar';\nimport * as Utils from 'utils/utils';\nimport * as UserAgent from 'utils/user_agent';\nimport CenterChannel from 'components/channel_layout/center_channel';\nimport LoadingScreen from 'components/loading_screen';\nimport FaviconTitleHandler from 'components/favicon_title_handler';\nimport ProductNoticesModal from 'components/product_notices_modal';\n\nexport default class ChannelController extends React.PureComponent {\n    static propTypes = {\n        fetchingChannels: PropTypes.bool.isRequired,\n    };\n\n    componentDidMount() {\n        const platform = window.navigator.platform;\n\n        document.body.classList.add('app__body', 'channel-view');\n\n        // IE Detection\n        if (UserAgent.isInternetExplorer() || UserAgent.isEdge()) {\n            document.body.classList.add('browser--ie');\n        }\n\n        // OS Detection\n        if (platform === 'Win32' || platform === 'Win64') {\n            document.body.classList.add('os--windows');\n        } else if (platform === 'MacIntel' || platform === 'MacPPC') {\n            document.body.classList.add('os--mac');\n        }\n    }\n\n    componentWillUnmount() {\n        document.body.classList.remove('app__body', 'channel-view');\n    }\n\n    render() {\n        return (\n            <div\n                id='channel_view'\n                className='channel-view'\n            >\n                <AnnouncementBarController/>\n                <SystemNotice/>\n                <FaviconTitleHandler/>\n                <ProductNoticesModal/>\n                <div className='container-fluid'>\n                    <SidebarRight/>\n                    <SidebarRightMenu/>\n                    <TeamSidebar/>\n                    <Sidebar/>\n                    {!this.props.fetchingChannels && <Route component={CenterChannel}/>}\n                    {this.props.fetchingChannels && <LoadingScreen/>}\n                    <Pluggable pluggableName='Root'/>\n                    <GetPublicLinkModal/>\n                    <ImportThemeModal/>\n                    <EditPostModal/>\n                    <ResetStatusModal/>\n                    <LeavePrivateChannelModal/>\n                    <ShortcutsModal isMac={Utils.isMac()}/>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Route, Switch} from 'react-router-dom';\nimport iNoBounce from 'inobounce';\n\nimport {Channel, ChannelMembership} from 'mattermost-redux/types/channels';\nimport {Team, TeamMembership} from 'mattermost-redux/types/teams';\nimport {Group} from 'mattermost-redux/types/groups';\nimport {UserStatus} from 'mattermost-redux/types/users';\n\nimport {startPeriodicStatusUpdates, stopPeriodicStatusUpdates} from 'actions/status_actions.jsx';\nimport {startPeriodicSync, stopPeriodicSync, reconnect} from 'actions/websocket_actions.jsx';\nimport * as GlobalActions from 'actions/global_actions';\n\nimport Constants from 'utils/constants';\nimport * as UserAgent from 'utils/user_agent';\nimport * as Utils from 'utils/utils.jsx';\n\nimport {makeAsyncComponent} from 'components/async_load';\nconst LazyBackstageController = React.lazy(() => import('components/backstage'));\nimport ChannelController from 'components/channel_layout/channel_controller';\nimport Pluggable from 'plugins/pluggable';\n\nimport LocalStorageStore from 'stores/local_storage_store';\nimport type {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nconst BackstageController = makeAsyncComponent(LazyBackstageController);\n\nlet wakeUpInterval: number;\nlet lastTime = Date.now();\nconst WAKEUP_CHECK_INTERVAL = 30000; // 30 seconds\nconst WAKEUP_THRESHOLD = 60000; // 60 seconds\nconst UNREAD_CHECK_TIME_MILLISECONDS = 10000;\n\ndeclare global {\n    interface Window {\n        isActive: boolean;\n    }\n}\n\ntype Props = {\n    license: Record<string, any>;\n    currentUser?: {\n        id: string;\n    };\n    currentChannelId?: string;\n    currentTeamId?: string;\n    actions: {\n        fetchMyChannelsAndMembers: (teamId: string) => Promise<{ data: { channels: Channel[]; members: ChannelMembership[] } }>;\n        getMyTeamUnreads: (collapsedThreads: boolean) => Promise<{data: any; error?: any}>;\n        viewChannel: (channelId: string, prevChannelId?: string | undefined) => Promise<{data: boolean}>;\n        markChannelAsReadOnFocus: (channelId: string) => Promise<{data: any; error?: any}>;\n        getTeamByName: (teamName: string) => Promise<{data: Team}>;\n        addUserToTeam: (teamId: string, userId?: string) => Promise<{data: TeamMembership; error?: any}>;\n        selectTeam: (team: Team) => Promise<{data: boolean}>;\n        setPreviousTeamId: (teamId: string) => Promise<{data: boolean}>;\n        loadStatusesForChannelAndSidebar: () => Promise<{data: UserStatus[]}>;\n        getAllGroupsAssociatedToChannelsInTeam: (teamId: string, filterAllowReference: boolean) => Promise<{data: Group[]}>;\n        getAllGroupsAssociatedToTeam: (teamId: string, filterAllowReference: boolean) => Promise<{data: Group[]}>;\n        getGroupsByUserId: (userID: string) => Promise<{data: Group[]}>;\n        getGroups: (filterAllowReference: boolean, page: number, perPage: number) => Promise<{data: Group[]}>;\n    };\n    mfaRequired: boolean;\n    match: {\n        params: {\n            team: string;\n        };\n    };\n    previousTeamId?: string;\n    history: {\n        push(path: string): void;\n    };\n    teamsList: Team[];\n    collapsedThreads: ReturnType<typeof isCollapsedThreadsEnabled>;\n    plugins?: any;\n    selectedThreadId: string | null;\n}\n\ntype State = {\n    team: Team | null;\n    finishedFetchingChannels: boolean;\n    prevTeam: string;\n    teamsList: Team[];\n}\n\nexport default class NeedsTeam extends React.PureComponent<Props, State> {\n    public blurTime: number;\n    constructor(props: Props) {\n        super(props);\n        this.blurTime = new Date().getTime();\n\n        if (this.props.mfaRequired) {\n            this.props.history.push('/mfa/setup');\n            return;\n        }\n\n        clearInterval(wakeUpInterval);\n\n        wakeUpInterval = window.setInterval(() => {\n            const currentTime = (new Date()).getTime();\n            if (currentTime > (lastTime + WAKEUP_THRESHOLD)) { // ignore small delays\n                console.log('computer woke up - fetching latest'); //eslint-disable-line no-console\n                reconnect(false);\n            }\n            lastTime = currentTime;\n        }, WAKEUP_CHECK_INTERVAL);\n\n        const team = this.updateCurrentTeam(this.props);\n\n        this.state = {\n            team,\n            finishedFetchingChannels: false,\n            prevTeam: this.props.match.params.team,\n            teamsList: this.props.teamsList,\n        };\n\n        LocalStorageStore.setTeamIdJoinedOnLoad(null);\n\n        if (!team) {\n            this.joinTeam(this.props, true);\n        }\n    }\n\n    static getDerivedStateFromProps(nextProps: Props, state: State) {\n        if (state.prevTeam !== nextProps.match.params.team) {\n            const team = nextProps.teamsList ? nextProps.teamsList.find((teamObj: Team) =>\n                teamObj.name === nextProps.match.params.team) : null;\n            return {\n                prevTeam: nextProps.match.params.team,\n                team: (team || null),\n            };\n        }\n        return {prevTeam: nextProps.match.params.team};\n    }\n\n    public componentDidMount() {\n        startPeriodicStatusUpdates();\n        startPeriodicSync();\n\n        // Set up tracking for whether the window is active\n        window.isActive = true;\n\n        if (UserAgent.isIosSafari()) {\n            // Use iNoBounce to prevent scrolling past the boundaries of the page\n            iNoBounce.enable();\n        }\n\n        window.addEventListener('focus', this.handleFocus);\n        window.addEventListener('blur', this.handleBlur);\n        window.addEventListener('keydown', this.onShortcutKeyDown);\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (this.props.match.params.team !== prevProps.match.params.team) {\n            if (this.state.team) {\n                this.initTeam(this.state.team);\n            }\n            if (!this.state.team) {\n                this.joinTeam(this.props);\n            }\n        }\n    }\n\n    componentWillUnmount() {\n        window.isActive = false;\n        stopPeriodicStatusUpdates();\n        stopPeriodicSync();\n        if (UserAgent.isIosSafari()) {\n            iNoBounce.disable();\n        }\n\n        clearInterval(wakeUpInterval);\n        window.removeEventListener('focus', this.handleFocus);\n        window.removeEventListener('blur', this.handleBlur);\n        window.removeEventListener('keydown', this.onShortcutKeyDown);\n    }\n\n    handleBlur = () => {\n        window.isActive = false;\n        this.blurTime = new Date().getTime();\n        if (this.props.currentUser) {\n            this.props.actions.viewChannel('');\n        }\n    }\n\n    handleFocus = () => {\n        if (this.props.selectedThreadId) {\n            window.isActive = true;\n        }\n        if (this.props.currentChannelId) {\n            this.props.actions.markChannelAsReadOnFocus(this.props.currentChannelId);\n            window.isActive = true;\n        }\n        if (Date.now() - this.blurTime > UNREAD_CHECK_TIME_MILLISECONDS && this.props.currentTeamId) {\n            this.props.actions.fetchMyChannelsAndMembers(this.props.currentTeamId);\n        }\n    }\n\n    joinTeam = async (props: Props, firstLoad = false) => {\n        // skip reserved teams\n        if (Constants.RESERVED_TEAM_NAMES.includes(props.match.params.team)) {\n            return;\n        }\n\n        const {data: team} = await this.props.actions.getTeamByName(props.match.params.team);\n        if (team && team.delete_at === 0) {\n            const {error} = await props.actions.addUserToTeam(team.id, props.currentUser && props.currentUser.id);\n            if (error) {\n                props.history.push('/error?type=team_not_found');\n            } else {\n                if (firstLoad) {\n                    LocalStorageStore.setTeamIdJoinedOnLoad(team.id);\n                }\n                this.setState({team});\n                this.initTeam(team);\n            }\n        } else {\n            props.history.push('/error?type=team_not_found');\n        }\n    }\n\n    initTeam = (team: Team) => {\n        if (team.id !== this.props.previousTeamId) {\n            GlobalActions.emitCloseRightHandSide();\n        }\n\n        // If current team is set, then this is not first load\n        // The first load action pulls team unreads\n        this.props.actions.getMyTeamUnreads(this.props.collapsedThreads);\n        this.props.actions.selectTeam(team);\n        this.props.actions.setPreviousTeamId(team.id);\n\n        if (Utils.isGuest(this.props.currentUser)) {\n            this.setState({finishedFetchingChannels: false});\n        }\n        this.props.actions.fetchMyChannelsAndMembers(team.id).then(\n            () => {\n                this.setState({\n                    finishedFetchingChannels: true,\n                });\n            },\n        );\n        this.props.actions.loadStatusesForChannelAndSidebar();\n\n        if (this.props.license &&\n            this.props.license.IsLicensed === 'true' &&\n            this.props.license.LDAPGroups === 'true') {\n            if (this.props.currentUser) {\n                this.props.actions.getGroupsByUserId(this.props.currentUser.id);\n            }\n\n            this.props.actions.getAllGroupsAssociatedToChannelsInTeam(team.id, true);\n            if (team.group_constrained) {\n                this.props.actions.getAllGroupsAssociatedToTeam(team.id, true);\n            } else {\n                this.props.actions.getGroups(true, 0, 0);\n            }\n        }\n\n        return team;\n    }\n\n    updateCurrentTeam = (props: Props) => {\n        // First check to make sure you're in the current team\n        // for the current url.\n        const team = props.teamsList ? props.teamsList.find((teamObj) => teamObj.name === props.match.params.team) : null;\n        if (team) {\n            this.initTeam(team);\n            return team;\n        }\n        return null;\n    }\n\n    onShortcutKeyDown = (e: KeyboardEvent) => {\n        if (e.shiftKey && Utils.cmdOrCtrlPressed(e) && Utils.isKeyPressed(e, Constants.KeyCodes.L)) {\n            const sidebar = document.getElementById('sidebar-right');\n            if (sidebar) {\n                if (sidebar.className.match('sidebar--right sidebar--right--expanded move--left')) {\n                    const replyTextbox = document.getElementById('reply_textbox');\n                    if (replyTextbox) {\n                        replyTextbox.focus();\n                    }\n                } else {\n                    const postTextbox = document.getElementById('post_textbox');\n                    if (postTextbox) {\n                        postTextbox.focus();\n                    }\n                }\n            }\n        }\n    }\n\n    render() {\n        if (this.state.team === null) {\n            return <div/>;\n        }\n\n        return (\n            <Switch>\n                <Route\n                    path={'/:team/integrations'}\n                    component={BackstageController}\n                />\n                <Route\n                    path={'/:team/emoji'}\n                    component={BackstageController}\n                />\n                {this.props.plugins?.map((plugin: any) => (\n                    <Route\n                        key={plugin.id}\n                        path={'/:team/' + plugin.route}\n                        render={() => (\n                            <Pluggable\n                                pluggableName={'NeedsTeamComponent'}\n                                pluggableId={plugin.id}\n                            />\n                        )}\n                    />\n                ))}\n                <Route\n                    render={() => (\n                        <ChannelController\n                            fetchingChannels={!this.state.finishedFetchingChannels}\n                        />\n                    )}\n                />\n            </Switch>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\nimport {withRouter} from 'react-router-dom';\n\nimport {fetchMyChannelsAndMembers, viewChannel} from 'mattermost-redux/actions/channels';\nimport {getMyTeamUnreads, getTeamByName, selectTeam} from 'mattermost-redux/actions/teams';\nimport {getGroups, getAllGroupsAssociatedToChannelsInTeam, getAllGroupsAssociatedToTeam, getGroupsByUserId} from 'mattermost-redux/actions/groups';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getLicense, getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {getCurrentTeamId, getMyTeams} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels';\nimport {Action} from 'mattermost-redux/types/actions';\n\nimport {GlobalState} from 'types/store';\n\nimport {setPreviousTeamId} from 'actions/local_storage';\nimport {getPreviousTeamId} from 'selectors/local_storage';\nimport {loadStatusesForChannelAndSidebar} from 'actions/status_actions';\nimport {addUserToTeam} from 'actions/team_actions';\nimport {markChannelAsReadOnFocus} from 'actions/views/channel';\nimport {getSelectedThreadIdInCurrentTeam} from 'selectors/views/threads';\nimport {checkIfMFARequired} from 'utils/route';\n\nimport NeedsTeam from './needs_team';\n\ntype OwnProps = {\n    match: {\n        url: string;\n    };\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const license = getLicense(state);\n    const config = getConfig(state);\n    const currentUser = getCurrentUser(state);\n    const plugins = state.plugins.components.NeedsTeamComponent;\n\n    return {\n        license,\n        collapsedThreads: isCollapsedThreadsEnabled(state),\n        mfaRequired: checkIfMFARequired(currentUser, license, config, ownProps.match.url),\n        currentUser,\n        currentTeamId: getCurrentTeamId(state),\n        previousTeamId: getPreviousTeamId(state) as string,\n        teamsList: getMyTeams(state),\n        currentChannelId: getCurrentChannelId(state),\n        plugins,\n        selectedThreadId: getSelectedThreadIdInCurrentTeam(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<Action>, any>({\n            fetchMyChannelsAndMembers,\n            getMyTeamUnreads,\n            viewChannel,\n            markChannelAsReadOnFocus,\n            getTeamByName,\n            addUserToTeam,\n            setPreviousTeamId,\n            selectTeam,\n            loadStatusesForChannelAndSidebar,\n            getAllGroupsAssociatedToChannelsInTeam,\n            getAllGroupsAssociatedToTeam,\n            getGroupsByUserId,\n            getGroups,\n        }, dispatch),\n    };\n}\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(NeedsTeam));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport Textbox from 'components/textbox';\nimport BaseTextbox from 'components/textbox/textbox';\n\ntype Props = Omit<React.ComponentPropsWithRef<typeof Textbox>, 'suggestionListPosition'> & {\n    suggestionListStyle?: React.ComponentPropsWithRef<typeof Textbox>['suggestionListPosition'];\n}\n\nconst PluginTextbox = React.forwardRef((props: Props, ref?: React.Ref<BaseTextbox>) => {\n    const {\n        suggestionListStyle,\n        ...otherProps\n    } = props;\n\n    return (\n        <Textbox\n            ref={ref}\n            suggestionListPosition={suggestionListStyle}\n            {...otherProps}\n        />\n    );\n});\n\nexport default PluginTextbox;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {\n    IntegrationTypes,\n} from 'mattermost-redux/action_types';\n\nimport {openModal} from 'actions/views/modals';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport InteractiveDialog from 'components/interactive_dialog';\nimport store from '../stores/redux_store';\n\nexport function openInteractiveDialog(dialog) {\n    store.dispatch({type: IntegrationTypes.RECEIVED_DIALOG, data: dialog});\n\n    store.dispatch(openModal({modalId: ModalIdentifiers.INTERACTIVE_DIALOG, dialogType: InteractiveDialog}));\n}\n\n// This code is problematic for a couple of different reasons:\n// * it monitors the store to modify the store: this is perhaps better handled by a saga\n// * it makes importing this file impure by triggering a side-effect which may not be obvious\n// * it's not really located in the \"right place\": dialogs are applicable to non-plugins too\n// * it's nigh impossible to test as written\n//\n// It's worth fixing all of this, but I think this requires some refactoring.\nlet previousTriggerId = '';\nstore.subscribe(() => {\n    const state = store.getState();\n    const currentTriggerId = state.entities.integrations.dialogTriggerId;\n\n    if (currentTriggerId === previousTriggerId) {\n        return;\n    }\n\n    previousTriggerId = currentTriggerId;\n\n    const dialog = state.entities.integrations.dialog || {};\n    if (dialog.trigger_id !== currentTriggerId) {\n        return;\n    }\n\n    store.dispatch(openModal({modalId: ModalIdentifiers.INTERACTIVE_DIALOG, dialogType: InteractiveDialog}));\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport messageHtmlToComponent from 'utils/message_html_to_component';\nimport {formatText} from 'utils/text_formatting';\nimport {browserHistory} from 'utils/browser_history';\n\nimport {openModal} from 'actions/views/modals';\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport ChannelInviteModal from 'components/channel_invite_modal';\nimport ChannelMembersModal from 'components/channel_members_modal';\nimport PurchaseModal from 'components/purchase_modal';\nimport Timestamp from 'components/timestamp';\n\nimport Textbox from './textbox';\n\n// The following import has intentional side effects. Do not remove without research.\nimport {openInteractiveDialog} from './interactive_dialog';\n\n// Common libraries exposed on window for plugins to use as Webpack externals.\nwindow.React = require('react');\nwindow.ReactDOM = require('react-dom');\nwindow.ReactIntl = require('react-intl');\nwindow.Redux = require('redux');\nwindow.ReactRedux = require('react-redux');\nwindow.ReactBootstrap = require('react-bootstrap');\nwindow.ReactRouterDom = require('react-router-dom');\nwindow.PropTypes = require('prop-types');\nwindow.PDFJS = require('pdfjs-dist');\n\n// Functions exposed on window for plugins to use.\nwindow.PostUtils = {formatText, messageHtmlToComponent};\nwindow.openInteractiveDialog = openInteractiveDialog;\nwindow.WebappUtils = {\n    browserHistory,\n    modals: {openModal, ModalIdentifiers},\n};\n\n// Components exposed on window FOR INTERNAL PLUGIN USE ONLY. These components may have breaking changes in the future\n// outside of major releases. They will be replaced by common components once that project is more mature and able to\n// guarantee better compatibility.\nwindow.Components = {\n    Textbox,\n    PurchaseModal,\n    Timestamp,\n    ChannelInviteModal,\n    ChannelMembersModal,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport Constants, {EventTypes, A11yClassNames, A11yAttributeNames, A11yCustomEventTypes} from 'utils/constants';\nimport {isKeyPressed, cmdOrCtrlPressed, isMac} from 'utils/utils';\nimport {isDesktopApp} from 'utils/user_agent';\n\nconst listenerOptions = {\n    capture: true,\n};\n\nexport default class A11yController {\n    constructor() {\n        this.regionHTMLCollection = this.getAllRegions();\n        this.sectionHTMLCollection = null; // populated when region changes\n        this.modalHTMLCollection = this.getAllModals();\n        this.popupHTMLCollection = this.getAllPopups();\n\n        this.activeRegion = null;\n        this.activeSection = null;\n        this.activeElement = null;\n\n        this.mouseIsPressed = false;\n\n        this.lastInputEventIsKeyboard = false;\n\n        this.enterKeyIsPressed = false;\n        this.f6KeyIsPressed = false;\n        this.upArrowKeyIsPressed = false;\n        this.downArrowKeyIsPressed = false;\n        this.tabKeyIsPressed = false;\n        this.tildeKeyIsPressed = false;\n        this.lKeyIsPressed = false;\n        this.windowIsFocused = true;\n\n        // used to reset navigation whenever navigation within a region occurs (section or element)\n        this.resetNavigation = false;\n\n        document.addEventListener(EventTypes.KEY_DOWN, this.handleKeyDown, listenerOptions);\n        document.addEventListener(EventTypes.KEY_UP, this.handleKeyUp, listenerOptions);\n        document.addEventListener(EventTypes.CLICK, this.handleMouseClick, listenerOptions);\n        document.addEventListener(EventTypes.MOUSE_DOWN, this.handleMouseDown, listenerOptions);\n        document.addEventListener(EventTypes.MOUSE_UP, this.handleMouseUp, listenerOptions);\n        document.addEventListener(EventTypes.FOCUS, this.handleFocus, listenerOptions);\n        window.addEventListener(EventTypes.BLUR, this.handleWindowBlur, listenerOptions);\n    }\n\n    destroy() {\n        this.clearActiveRegion();\n        this.clearCurrentFocus();\n\n        document.removeEventListener(EventTypes.KEY_DOWN, this.handleKeyDown, listenerOptions);\n        document.removeEventListener(EventTypes.KEY_UP, this.handleKeyUp, listenerOptions);\n        document.removeEventListener(EventTypes.CLICK, this.handleMouseClick, listenerOptions);\n        document.removeEventListener(EventTypes.MOUSE_DOWN, this.handleMouseDown, listenerOptions);\n        document.removeEventListener(EventTypes.MOUSE_UP, this.handleMouseUp, listenerOptions);\n        document.removeEventListener(EventTypes.FOCUS, this.handleFocus, listenerOptions);\n        window.removeEventListener(EventTypes.BLUR, this.handleWindowBlur, listenerOptions);\n    }\n\n    // convenience getter/setters\n\n    /**\n     * Determines if keyboard navigation is currently in progress based on several criteria as follows:\n     * 1. There must be defined regions and a single region must be active\n     * 2. The last input event detected must be a keyboard event\n     * 3. There must be no open modals and/or popups\n     * 4. There must be an active element and it must support classList\n     */\n    get navigationInProgress() {\n        if (!this.regions || !this.regions.length || !this.isElementValid(this.activeRegion)) {\n            return false;\n        }\n        if (!this.lastInputEventIsKeyboard) {\n            return false;\n        }\n        if (this.modalIsOpen || this.popupIsOpen) {\n            return false;\n        }\n        if (!this.isElementValid(this.activeElement)) {\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * Returns an array of available regions sorted by A11yAttributeNames.SORT_ORDER\n     */\n    get regions() {\n        let domElements = this.sortElementsByAttributeOrder(this.regionHTMLCollection);\n        domElements = domElements.filter((element) => {\n            return this.elementIsVisible(element);\n        });\n        return domElements;\n    }\n\n    /**\n     * Returns an array of available sections sorted by A11yAttributeNames.SORT_ORDER and optionally reversed\n     */\n    get sections() {\n        let domElements = this.sortElementsByAttributeOrder(this.sectionHTMLCollection);\n        domElements = domElements.filter((element) => {\n            return this.elementIsVisible(element);\n        });\n        if (this.shouldReverseSections) {\n            domElements.reverse();\n        }\n        return domElements;\n    }\n\n    /**\n     * Returns the index of the active region\n     */\n    get activeRegionIndex() {\n        if (!this.activeRegion) {\n            return null;\n        }\n        return this.regions.indexOf(this.activeRegion);\n    }\n\n    /**\n     * Returns the index of the active section\n     */\n    get activeSectionIndex() {\n        if (!this.activeSection) {\n            return null;\n        }\n        return this.sections.indexOf(this.activeSection);\n    }\n\n    /**\n     * Returns whether the regions requires reverse section navigation\n     */\n    get shouldReverseSections() {\n        if (!this.activeRegion) {\n            return false;\n        }\n        return this.getOrderReverseAttribute(this.activeRegion);\n    }\n\n    /**\n     * Returns the element that should currently have focus\n     */\n    get focusedElement() {\n        let focusedElement;\n        if (this.activeElement) {\n            focusedElement = this.activeElement;\n        } else if (this.activeSection) {\n            focusedElement = this.activeSection;\n        } else if (this.activeRegion) {\n            focusedElement = this.activeRegion;\n        }\n        return focusedElement;\n    }\n\n    /**\n     * Returnes whether an a11y-specific key is currently pressed\n     */\n    get a11yKeyIsPressed() {\n        return this.f6KeyIsPressed ||\n               this.upArrowKeyIsPressed ||\n               this.downArrowKeyIsPressed ||\n               this.tabKeyIsPressed ||\n               this.tildeKeyIsPressed ||\n               this.lKeyIsPressed;\n    }\n\n    /**\n     * Indicates if a modal window is currently open\n     * - modals must have A11yClassNames.MODAL to be considered\n     */\n    get modalIsOpen() {\n        return this.modalHTMLCollection.length > 0;\n    }\n\n    /**\n     * Indicates if a popup/dropdown element is currently open\n     * - popups/dropdowns must have A11yClassNames.POPUP to be considered\n     */\n    get popupIsOpen() {\n        return this.popupHTMLCollection.length > 0;\n    }\n\n    /**\n     * Indicates if the region should disallow the change of active sections and regions\n     * This stops sections and regions from changing in the controller while this class is applied, such that another package can\n     * utilize the a11y_controller to stop other keyboard events for accessibility reasons in favour of its own\n     */\n    get disableNavigation() {\n        return this.activeRegion && this.activeRegion.getAttribute(A11yAttributeNames.DISABLE_NAVIGATION) === 'true';\n    }\n\n    // public methods\n\n    /**\n     * Determines the next region, sets it as active and updates the current focus\n     */\n    nextRegion() {\n        const regions = this.regions;\n        if (\n            !regions ||\n            !regions.length ||\n            this.modalIsOpen ||\n            this.popupIsOpen\n        ) {\n            return;\n        }\n        if (!this.disableNavigation) {\n            let newRegion;\n            if (\n                !this.activeRegion ||\n                this.activeRegionIndex === regions.length - 1 ||\n                this.resetNavigation\n            ) {\n                newRegion = regions[0];\n            } else {\n                newRegion = regions[this.activeRegionIndex + 1];\n            }\n            this.setActiveRegion(newRegion);\n        }\n        this.setCurrentFocus();\n        this.resetNavigation = false;\n    }\n\n    /**\n     * Determines the previous region, sets it as active and updates the current focus\n     */\n    previousRegion() {\n        const regions = this.regions;\n        if (\n            !regions ||\n            !regions.length ||\n            this.modalIsOpen ||\n            this.popupIsOpen\n        ) {\n            return;\n        }\n        if (!this.disableNavigation) {\n            let newRegion;\n            if (!this.activeRegion || (this.activeRegionIndex !== 0 && this.resetNavigation)) {\n                newRegion = regions[0];\n            } else if (this.activeRegionIndex === 0) {\n                newRegion = regions[regions.length - 1];\n            } else {\n                newRegion = regions[this.activeRegionIndex - 1];\n            }\n            this.setActiveRegion(newRegion);\n        }\n        this.setCurrentFocus();\n        this.resetNavigation = false;\n    }\n\n    /**\n     * Determines the next section, sets it as active and updates the current focus\n     */\n    nextSection() {\n        const sections = this.sections;\n        const shouldLoopNavigation = this.getLoopNavigationAttribute(this.activeRegion);\n        if (\n            this.modalIsOpen ||\n            this.popupIsOpen ||\n            !sections ||\n            !sections.length ||\n            (!shouldLoopNavigation && this.activeSectionIndex === sections.length - 1)\n        ) {\n            return;\n        }\n        if (!this.disableNavigation) {\n            let newSection;\n            if (this.activeSection && this.activeSectionIndex < sections.length - 1) {\n                newSection = sections[this.activeSectionIndex + 1];\n            } else {\n                newSection = sections[0];\n            }\n            this.setActiveSection(newSection);\n        }\n        this.setCurrentFocus();\n        this.resetNavigation = true;\n    }\n\n    /**\n     * Determines the previous section, sets it as active and updates the current focus\n     */\n    previousSection() {\n        const sections = this.sections;\n        const shouldLoopNavigation = this.getLoopNavigationAttribute(this.activeRegion);\n        if (\n            this.modalIsOpen ||\n            this.popupIsOpen ||\n            !sections ||\n            !sections.length ||\n            (!shouldLoopNavigation && this.activeSectionIndex === 0)\n        ) {\n            return;\n        }\n        if (!this.disableNavigation) {\n            let newSection;\n            if (this.activeSection && this.activeSectionIndex > 0) {\n                newSection = sections[this.activeSectionIndex - 1];\n            } else if (this.activeSection && this.activeSectionIndex === 0) {\n                newSection = sections[sections.length - 1];\n            } else {\n                newSection = sections[0];\n            }\n            this.setActiveSection(newSection);\n        }\n        this.setCurrentFocus();\n        this.resetNavigation = true;\n    }\n\n    /**\n     * Takes the provided dom element, finds it's parent section and region (if available),\n     * sets them as active and updates the current focus\n     * @param {HTMLElement} element - the DOM element to set as the active element\n     * @param {array or boolean} elementPath - array of element's dom branch or boolean to find section/region of element\n     */\n    nextElement(element, elementPath = false) {\n        let region;\n        let section;\n        if (elementPath && elementPath.length) {\n            // is the current element in an active region?\n            if (elementPath.indexOf(this.activeRegion) < 0) {\n                region = elementPath.find((pathElement) => {\n                    if (!pathElement.classList) {\n                        return false;\n                    }\n                    return pathElement.classList.contains(A11yClassNames.REGION);\n                });\n            }\n\n            // is the current element in an active section?\n            if (elementPath.indexOf(this.activeSection) < 0) {\n                section = elementPath.find((pathElement) => {\n                    if (!pathElement.classList) {\n                        return false;\n                    }\n                    return pathElement.classList.contains(A11yClassNames.SECTION);\n                });\n            }\n        } else if (elementPath && typeof element.closest === 'function') {\n            region = element.closest(`.${A11yClassNames.REGION}`);\n            section = element.closest(`.${A11yClassNames.SECTION}`);\n        }\n        if (region && this.activeRegion !== region) {\n            this.setActiveRegion(region, false);\n        }\n        if (section && this.activeSection !== section) {\n            this.setActiveSection(section);\n        }\n        this.setActiveElement(element);\n        this.setCurrentFocus();\n        this.resetNavigation = true;\n    }\n\n    /**\n     * Resets the a11y navigation controller, active region/section/element, clears focus and resets user interraction states\n     */\n    cancelNavigation() {\n        this.clearActiveRegion();\n        this.setCurrentFocus();\n        this.resetInterractionStates();\n    }\n\n    // private methods\n\n    /**\n     * Sets the currently active region and stores a list of the regions sections\n     * @param {HTMLElement} element - DOM element to set as the active region\n     * @param {boolean} canFocusChild - whether to focus child section instead of provide region\n     * @emits {A11yCustomEventTypes.ACTIVATE} - emitted on the provided DOM element once set to active\n     */\n    setActiveRegion(element, canFocusChild = true) {\n        if (!this.isElementValid(element, [this.activeRegion]) && !this.resetNavigation) {\n            return;\n        }\n\n        // clear previous active region\n        this.clearActiveRegion();\n\n        // setup new active region\n        this.activeRegion = element;\n        this.activeRegion.addEventListener(A11yCustomEventTypes.UPDATE, this.handleActiveRegionUpdate);\n        this.activeRegion.dispatchEvent(new Event(A11yCustomEventTypes.ACTIVATE));\n\n        // apply visual updates to active region\n        this.updateActiveRegion();\n\n        // retrieve all sections for the new active region\n        this.sectionHTMLCollection = this.getAllSectionsForRegion(this.activeRegion);\n\n        // should the visual focus start on a child section\n        if (canFocusChild && this.getFocusChildAttribute(this.activeRegion) && this.sections && this.sections.length) {\n            this.setActiveSection(this.sections[0]);\n        }\n    }\n\n    /**\n     * Sets the currently active section\n     * @param {HTMLElement} element - DOM element to set as the active section\n     * @emits {A11yCustomEventTypes.ACTIVATE} - emitted on the provided DOM element once set to active\n     */\n    setActiveSection(element) {\n        if (!this.isElementValid(element, [this.activeSection])) {\n            return;\n        }\n\n        // clear previous active section\n        this.clearActiveSection();\n\n        // setup new active section\n        this.activeSection = element;\n        this.activeSection.addEventListener(A11yCustomEventTypes.UPDATE, this.handleActiveSectionUpdate);\n        this.activeSection.dispatchEvent(new Event(A11yCustomEventTypes.ACTIVATE));\n\n        // apply visual updates to active section\n        this.updateActiveSection();\n    }\n\n    /**\n     * Sets the currently active element\n     * @param {HTMLElement} element - DOM element to set as the active element\n     * @emits {A11yCustomEventTypes.ACTIVATE} - emitted on the provided DOM element once set to active\n     */\n    setActiveElement(element) {\n        if (!this.isElementValid(element, [this.activeElement])) {\n            return;\n        }\n\n        // clear previous active element\n        this.clearActiveElement();\n\n        // setup new active element\n        this.activeElement = element;\n        this.activeElement.addEventListener(A11yCustomEventTypes.UPDATE, this.handleActiveElementUpdate);\n        if (this.activeElement !== this.activeRegion && this.activeElement !== this.activeSection) {\n            this.activeElement.dispatchEvent(new Event(A11yCustomEventTypes.ACTIVATE));\n        }\n\n        // apply visual updates to active element\n        this.updateActiveElement();\n    }\n\n    /**\n     * Updates the focus status of the element that should now have focus\n     */\n    setCurrentFocus() {\n        this.clearCurrentFocus();\n        if (!this.focusedElement) {\n            return;\n        }\n\n        // set focus on the element that should have focus if needed\n        if (document.activeElement !== this.focusedElement) {\n            this.focusedElement.focus();\n        }\n\n        // apply visual updates to focused element\n        this.udpateCurrentFocus();\n    }\n\n    /**\n     * Updates the visual state of the active region and makes sure it is focusable\n     */\n    updateActiveRegion() {\n        if (!this.activeRegion) {\n            return;\n        }\n        this.activeRegion.classList.add(A11yClassNames.ACTIVE);\n\n        // ensure active region element is focusable\n        if (!this.activeRegion.getAttribute('tabindex')) {\n            this.activeRegion.setAttribute('tabindex', -1);\n        }\n    }\n\n    /**\n     * Updates the visual state of the active section and makes sure it is focusable\n     */\n    updateActiveSection() {\n        if (!this.activeSection) {\n            return;\n        }\n        this.activeSection.classList.add(A11yClassNames.ACTIVE);\n\n        // ensure active section element is focusable\n        if (!this.activeSection.getAttribute('tabindex')) {\n            this.activeSection.setAttribute('tabindex', -1);\n        }\n    }\n\n    /**\n     * Updates the visual state of the active element\n     */\n    updateActiveElement() {\n        if (!this.activeElement) {\n            return;\n        }\n        this.activeElement.classList.add(A11yClassNames.ACTIVE);\n    }\n\n    /**\n     * Updates the visual state of the currently focused element\n     */\n    udpateCurrentFocus(forceUpdate = false) {\n        if ((!this.focusedElement || !this.a11yKeyIsPressed) && !forceUpdate) {\n            return;\n        }\n        this.focusedElement.classList.add(A11yClassNames.FOCUSED);\n    }\n\n    /**\n     * Clears all a11y-applied classes, events and the active region DOM element reference\n     */\n    clearActiveRegion() {\n        if (this.activeRegion) {\n            this.activeRegion.classList.remove(A11yClassNames.ACTIVE);\n            this.activeRegion.dispatchEvent(new Event(A11yCustomEventTypes.DEACTIVATE));\n            this.activeRegion.removeEventListener(A11yCustomEventTypes.UPDATE, this.handleActiveRegionUpdate);\n            this.activeRegion = null;\n        }\n        this.clearActiveSection();\n    }\n\n    /**\n     * Clears all a11y-applied classes, events and the active section DOM element reference\n     */\n    clearActiveSection() {\n        if (this.activeSection) {\n            this.activeSection.classList.remove(A11yClassNames.ACTIVE);\n            this.activeSection.dispatchEvent(new Event(A11yCustomEventTypes.DEACTIVATE));\n            this.activeSection.removeEventListener(A11yCustomEventTypes.UPDATE, this.handleActiveSectionUpdate);\n            this.activeSection = null;\n        }\n        this.clearActiveElement();\n    }\n\n    /**\n     * Clears all a11y-applied classes, events and the active DOM element reference\n     */\n    clearActiveElement() {\n        if (this.activeElement) {\n            if (this.activeElement !== this.activeRegion && this.activeElement !== this.activeSection) {\n                this.activeElement.classList.remove(A11yClassNames.ACTIVE);\n                this.activeElement.dispatchEvent(new Event(A11yCustomEventTypes.DEACTIVATE));\n            }\n            this.activeElement.removeEventListener(A11yCustomEventTypes.UPDATE, this.handleActiveElementUpdate);\n            this.activeElement = null;\n        }\n    }\n\n    /**\n     * Clears all focused element classes and blurs the active element if requested\n     */\n    clearCurrentFocus(blurActiveElement = false) {\n        Array.from(document.getElementsByClassName(A11yClassNames.FOCUSED)).forEach((element) => {\n            element.classList.remove(A11yClassNames.FOCUSED);\n        });\n        if (blurActiveElement) {\n            document.activeElement.blur();\n        }\n    }\n\n    /**\n     * Resets the state of all a11y-defined interraction methods\n     */\n    resetInterractionStates() {\n        this.mouseIsPressed = false;\n        this.f6KeyIsPressed = false;\n        this.upArrowKeyIsPressed = false;\n        this.downArrowKeyIsPressed = false;\n        this.tabKeyIsPressed = false;\n        this.tildeKeyIsPressed = false;\n        this.enterKeyIsPressed = false;\n        this.lKeyIsPressed = false;\n        this.lastInputEventIsKeyboard = false;\n    }\n\n    // helper methods\n\n    /**\n     * Returns an HTMLCollection object of all defined regions\n     * - use of HTMLCollection is intentional as this object auto updates to reflect DOM changes\n     */\n    getAllRegions() {\n        return document.getElementsByClassName(A11yClassNames.REGION);\n    }\n\n    /**\n     * Returns an HTMLCollection object of all defined sections for the currently active region\n     * - use of HTMLCollection is intentional as this object auto updates to reflect DOM changes\n     */\n    getAllSectionsForRegion(region) {\n        if (!region) {\n            return null;\n        }\n        return region.getElementsByClassName(A11yClassNames.SECTION);\n    }\n\n    /**\n     * Sort a list of DOM elements by defined A11yAttributeNames.SORT_ORDER attribute\n     * @param {HTMLCollection} elements - list of elements to be sorted\n     */\n    sortElementsByAttributeOrder(elements) {\n        if (!elements || !elements.length) {\n            return [];\n        }\n        return Array.from(elements).sort((elementA, elementB) => {\n            const elementAOrder = parseInt(elementA.getAttribute(A11yAttributeNames.SORT_ORDER), 10);\n            const elementBOrder = parseInt(elementB.getAttribute(A11yAttributeNames.SORT_ORDER), 10);\n\n            if (isNaN(elementAOrder) && isNaN(elementBOrder)) {\n                return 0;\n            }\n            if (isNaN(elementBOrder)) {\n                return -1;\n            }\n            if (isNaN(elementAOrder)) {\n                return 1;\n            }\n\n            return elementAOrder - elementBOrder;\n        });\n    }\n\n    /**\n     * Returns whether a DOM element is currently visible or not\n     * @param {HTMLElement} element - the DOM element to check\n     */\n    elementIsVisible(element) {\n        return element && element.offsetParent;\n    }\n\n    /**\n     * Retuns an HTMLCollection of all DOM elements that have the A11yClassNames.MODAL class\n     */\n    getAllModals() {\n        return document.getElementsByClassName(A11yClassNames.MODAL);\n    }\n\n    /**\n     * Retuns an HTMLCollection of all DOM elements that have the A11yClassNames.POPUP class\n     */\n    getAllPopups() {\n        return document.getElementsByClassName(A11yClassNames.POPUP);\n    }\n\n    /**\n     * Helper to retrieve the value of the A11yAttributeNames.LOOP_NAVIGATION attribute for the provided DOM element\n     * @param {HTMLElement} element - the element to retrive the A11yAttributeNames.LOOP_NAVIGATION value from\n     */\n    getLoopNavigationAttribute(element) {\n        const attributeValue = element.getAttribute(A11yAttributeNames.LOOP_NAVIGATION);\n        if (attributeValue && attributeValue.toLowerCase() === 'false') {\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * Helper to retrieve the value of the A11yAttributeNames.ORDER_REVERSE attribute for the provided DOM element\n     * @param {HTMLElement} element - the element to retrive the A11yAttributeNames.ORDER_REVERSE value from\n     */\n    getOrderReverseAttribute(element) {\n        const attributeValue = element.getAttribute(A11yAttributeNames.ORDER_REVERSE);\n        if (attributeValue && attributeValue.toLowerCase() === 'true') {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Helper to retrieve the value of the A11yAttributeNames.FOCUS_CHILD attribute for the provided DOM element\n     * @param {HTMLElement} element - the element to retrive the A11yAttributeNames.FOCUS_CHILD value from\n     */\n    getFocusChildAttribute(element) {\n        const attributeValue = element.getAttribute(A11yAttributeNames.FOCUS_CHILD);\n        if (attributeValue && attributeValue.toLowerCase() === 'true') {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Helper method to verify if a provided DOM element is a valid element for a11y navigation\n     * @param {HTMLElement} element - the DOM element to check\n     * @param {arry of HTMLElements} invalidElements - a list of invalid DOM elements to check against\n     */\n    isElementValid(element, invalidElements = []) {\n        if (\n            element &&\n            element.classList &&\n            !invalidElements.includes(element)\n        ) {\n            return true;\n        }\n        return false;\n    }\n\n    // event handling methods\n\n    handleKeyDown = (event) => {\n        const modifierKeys = {\n            ctrlIsPressed: event.ctrlKey,\n            altIsPressed: event.altKey,\n            shiftIsPressed: event.shiftKey,\n        };\n        switch (true) {\n        case isKeyPressed(event, Constants.KeyCodes.TAB):\n            this.lastInputEventIsKeyboard = true;\n            if ((!isMac() && modifierKeys.altIsPressed) || cmdOrCtrlPressed(event)) {\n                return;\n            }\n            this.tabKeyIsPressed = true;\n            break;\n        case isKeyPressed(event, Constants.KeyCodes.TILDE):\n            this.lastInputEventIsKeyboard = true;\n            if (!this.regions || !this.regions.length) {\n                return;\n            }\n\n            // Check to make sure both aren't pressed because some older webkit browsers set CTRL and ALT when AltGr is pressed\n            if (modifierKeys.ctrlIsPressed && !modifierKeys.altIsPressed) {\n                this.tildeKeyIsPressed = true;\n                event.preventDefault();\n                if (modifierKeys.shiftIsPressed) {\n                    this.previousRegion();\n                } else {\n                    this.nextRegion();\n                }\n            }\n            break;\n        case isKeyPressed(event, Constants.KeyCodes.F6):\n            this.lastInputEventIsKeyboard = true;\n            if (!isDesktopApp() && !cmdOrCtrlPressed(event)) {\n                return;\n            }\n            this.f6KeyIsPressed = true;\n            event.preventDefault();\n            if (modifierKeys.shiftIsPressed) {\n                this.previousRegion();\n            } else {\n                this.nextRegion();\n            }\n            break;\n        case isKeyPressed(event, Constants.KeyCodes.UP):\n            this.lastInputEventIsKeyboard = true;\n            if (!this.navigationInProgress || !this.sections || !this.sections.length) {\n                return;\n            }\n            this.upArrowKeyIsPressed = true;\n            event.preventDefault();\n            if (this.shouldReverseSections) {\n                this.nextSection();\n            } else {\n                this.previousSection();\n            }\n            break;\n        case isKeyPressed(event, Constants.KeyCodes.DOWN):\n            this.lastInputEventIsKeyboard = true;\n            if (!this.navigationInProgress || !this.sections || !this.sections.length) {\n                return;\n            }\n            this.downArrowKeyIsPressed = true;\n            event.preventDefault();\n            if (this.shouldReverseSections) {\n                this.previousSection();\n            } else {\n                this.nextSection();\n            }\n            break;\n        case isKeyPressed(event, Constants.KeyCodes.ESCAPE):\n            if (!this.navigationInProgress) {\n                return;\n            }\n            event.preventDefault();\n            this.cancelNavigation();\n            break;\n        case isKeyPressed(event, Constants.KeyCodes.ENTER):\n            this.enterKeyIsPressed = true;\n            break;\n        case isKeyPressed(event, Constants.KeyCodes.SPACE):\n            if (event.target.nodeName === 'BUTTON') {\n                event.preventDefault();\n                event.stopPropagation();\n                event.target.click();\n            }\n            break;\n        case isKeyPressed(event, Constants.KeyCodes.L):\n            // For the Ctrl+Shift+L keyboard shortcut\n            this.lastInputEventIsKeyboard = true;\n            this.lKeyIsPressed = true;\n            break;\n        }\n    }\n\n    handleKeyUp = () => {\n        this.resetInterractionStates();\n    }\n\n    handleMouseClick = (event) => {\n        // hitting enter on a <button> triggers a click event\n        if (!this.enterKeyIsPressed) {\n            this.lastInputEventIsKeyboard = false;\n        }\n        if (event.target === this.activeElement) {\n            return;\n        }\n        this.cancelNavigation();\n    }\n\n    handleMouseDown = () => {\n        this.mouseIsPressed = true;\n    }\n\n    handleMouseUp = () => {\n        this.mouseIsPressed = false;\n    }\n\n    handleFocus = (event) => {\n        if (this.lastInputEventIsKeyboard && this.windowIsFocused) {\n            this.nextElement(event.target, event.path || true);\n        }\n\n        // focus just came back to the app\n        if (!this.windowIsFocused) {\n            this.windowIsFocused = true;\n        }\n    }\n\n    handleWindowBlur = (event) => {\n        if (event.target === window) {\n            this.windowIsFocused = false;\n        }\n    }\n\n    handleActiveRegionUpdate = () => {\n        if (this.navigationInProgress) {\n            this.updateActiveRegion();\n            if (this.focusedElement === this.activeRegion) {\n                this.udpateCurrentFocus(true);\n            }\n        }\n    }\n\n    handleActiveSectionUpdate = () => {\n        if (this.navigationInProgress) {\n            this.updateActiveSection();\n            if (this.focusedElement === this.activeSection) {\n                this.udpateCurrentFocus(true);\n            }\n        }\n    }\n\n    handleActiveElementUpdate = () => {\n        if (this.navigationInProgress) {\n            this.updateActiveElement();\n            if (this.focusedElement === this.activeElement) {\n                this.udpateCurrentFocus(true);\n            }\n        }\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {Redirect} from 'react-router-dom';\n\nimport * as GlobalActions from 'actions/global_actions';\n\ntype Props = {\n    currentUserId: string;\n    location: Location;\n}\n\nexport default function RootRedirect(props: Props) {\n    useEffect(() => {\n        if (props.currentUserId) {\n            GlobalActions.redirectUserToDefaultTeam();\n        }\n    }, [props.currentUserId]);\n\n    if (props.currentUserId) {\n        // Ideally, this would be a Redirect like below, but since we need to call an action, this redirect is done above\n        return null;\n    }\n\n    return (\n        <Redirect\n            to={{\n                ...props.location,\n                pathname: '/login',\n            }}\n        />\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {GlobalState} from 'types/store';\n\nimport RootRedirect from './root_redirect';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        currentUserId: getCurrentUserId(state),\n    };\n}\n\nexport default connect(mapStateToProps)(RootRedirect);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport FastClick from 'fastclick';\nimport {Route, Switch, Redirect} from 'react-router-dom';\n\nimport {rudderAnalytics, RudderTelemetryHandler} from 'mattermost-redux/client/rudder';\nimport {Client4} from 'mattermost-redux/client';\nimport {setUrl} from 'mattermost-redux/actions/general';\nimport {setSystemEmojis} from 'mattermost-redux/actions/emojis';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {loadRecentlyUsedCustomEmojis} from 'actions/emoji_actions';\nimport * as GlobalActions from 'actions/global_actions';\nimport {trackLoadTime} from 'actions/telemetry_actions.jsx';\n\nimport {makeAsyncComponent} from 'components/async_load';\nimport CompassThemeProvider from 'components/compass_theme_provider/compass_theme_provider';\nimport GlobalHeader from 'components/global/global_header';\nimport ModalController from 'components/modal_controller';\nimport {HFTRoute, LoggedInHFTRoute} from 'components/header_footer_template_route';\nimport IntlProvider from 'components/intl_provider';\nimport NeedsTeam from 'components/needs_team';\n\nimport {initializePlugins} from 'plugins';\nimport 'plugins/export.js';\nimport Pluggable from 'plugins/pluggable';\nimport BrowserStore from 'stores/browser_store';\nimport Constants, {StoragePrefixes} from 'utils/constants';\nimport {EmojiIndicesByAlias} from 'utils/emoji.jsx';\nimport * as UserAgent from 'utils/user_agent';\nimport * as Utils from 'utils/utils.jsx';\nimport webSocketClient from 'client/web_websocket_client.jsx';\n\nconst LazyErrorPage = React.lazy(() => import('components/error_page'));\nconst LazyLoginController = React.lazy(() => import('components/login/login_controller'));\nconst LazyAdminConsole = React.lazy(() => import('components/admin_console'));\nconst LazyLoggedIn = React.lazy(() => import('components/logged_in'));\nconst LazyPasswordResetSendLink = React.lazy(() => import('components/password_reset_send_link'));\nconst LazyPasswordResetForm = React.lazy(() => import('components/password_reset_form'));\nconst LazySignupController = React.lazy(() => import('components/signup/signup_controller'));\nconst LazySignupEmail = React.lazy(() => import('components/signup/signup_email'));\nconst LazyTermsOfService = React.lazy(() => import('components/terms_of_service'));\nconst LazyShouldVerifyEmail = React.lazy(() => import('components/should_verify_email'));\nconst LazyDoVerifyEmail = React.lazy(() => import('components/do_verify_email'));\nconst LazyClaimController = React.lazy(() => import('components/claim'));\nconst LazyHelpController = React.lazy(() => import('components/help/help_controller'));\nconst LazyLinkingLandingPage = React.lazy(() => import('components/linking_landing_page'));\nconst LazySelectTeam = React.lazy(() => import('components/select_team'));\nconst LazyAuthorize = React.lazy(() => import('components/authorize'));\nconst LazyCreateTeam = React.lazy(() => import('components/create_team'));\nconst LazyMfa = React.lazy(() => import('components/mfa/mfa_controller'));\n\nimport store from 'stores/redux_store.jsx';\nimport {getSiteURL} from 'utils/url';\nimport {enableDevModeFeatures, isDevMode} from 'utils/utils';\n\nimport A11yController from 'utils/a11y_controller';\n\nimport RootRedirect from './root_redirect';\n\nconst CreateTeam = makeAsyncComponent(LazyCreateTeam);\nconst ErrorPage = makeAsyncComponent(LazyErrorPage);\nconst TermsOfService = makeAsyncComponent(LazyTermsOfService);\nconst LoginController = makeAsyncComponent(LazyLoginController);\nconst AdminConsole = makeAsyncComponent(LazyAdminConsole);\nconst LoggedIn = makeAsyncComponent(LazyLoggedIn);\nconst PasswordResetSendLink = makeAsyncComponent(LazyPasswordResetSendLink);\nconst PasswordResetForm = makeAsyncComponent(LazyPasswordResetForm);\nconst SignupController = makeAsyncComponent(LazySignupController);\nconst SignupEmail = makeAsyncComponent(LazySignupEmail);\nconst ShouldVerifyEmail = makeAsyncComponent(LazyShouldVerifyEmail);\nconst DoVerifyEmail = makeAsyncComponent(LazyDoVerifyEmail);\nconst ClaimController = makeAsyncComponent(LazyClaimController);\nconst HelpController = makeAsyncComponent(LazyHelpController);\nconst LinkingLandingPage = makeAsyncComponent(LazyLinkingLandingPage);\nconst SelectTeam = makeAsyncComponent(LazySelectTeam);\nconst Authorize = makeAsyncComponent(LazyAuthorize);\nconst Mfa = makeAsyncComponent(LazyMfa);\n\nconst LoggedInRoute = ({component: Component, ...rest}) => (\n    <Route\n        {...rest}\n        render={(props) => (\n            <LoggedIn {...props}>\n                <Component {...props}/>\n            </LoggedIn>\n        )}\n    />\n);\n\nexport default class Root extends React.PureComponent {\n    static propTypes = {\n        theme: PropTypes.object,\n        telemetryEnabled: PropTypes.bool,\n        telemetryId: PropTypes.string,\n        noAccounts: PropTypes.bool,\n        showTermsOfService: PropTypes.bool,\n        permalinkRedirectTeamName: PropTypes.string,\n        actions: PropTypes.shape({\n            loadMeAndConfig: PropTypes.func.isRequired,\n        }).isRequired,\n        plugins: PropTypes.array,\n        products: PropTypes.array,\n    }\n\n    constructor(props) {\n        super(props);\n        this.currentCategoryFocus = 0;\n        this.currentSidebarFocus = 0;\n        this.mounted = false;\n\n        // Redux\n        setUrl(getSiteURL());\n\n        setSystemEmojis(EmojiIndicesByAlias);\n\n        // Force logout of all tabs if one tab is logged out\n        window.addEventListener('storage', this.handleLogoutLoginSignal);\n\n        // Prevent drag and drop files from navigating away from the app\n        document.addEventListener('drop', (e) => {\n            if (e.dataTransfer.items.length > 0 && e.dataTransfer.items[0].kind === 'file') {\n                e.preventDefault();\n                e.stopPropagation();\n            }\n        });\n\n        document.addEventListener('dragover', (e) => {\n            e.preventDefault();\n            e.stopPropagation();\n        });\n\n        // Fastclick\n        FastClick.attach(document.body);\n\n        this.state = {\n            configLoaded: false,\n        };\n\n        // Keyboard navigation for accessibility\n        if (!UserAgent.isInternetExplorer()) {\n            this.a11yController = new A11yController();\n        }\n    }\n\n    onConfigLoaded = () => {\n        if (isDevMode()) {\n            enableDevModeFeatures();\n        }\n\n        const telemetryId = this.props.telemetryId;\n\n        let rudderKey = Constants.TELEMETRY_RUDDER_KEY;\n        let rudderUrl = Constants.TELEMETRY_RUDDER_DATAPLANE_URL;\n\n        if (rudderKey.startsWith('placeholder') && rudderUrl.startsWith('placeholder')) {\n            rudderKey = process.env.RUDDER_KEY; //eslint-disable-line no-process-env\n            rudderUrl = process.env.RUDDER_DATAPLANE_URL; //eslint-disable-line no-process-env\n        }\n\n        if (rudderKey != null && rudderKey !== '' && this.props.telemetryEnabled) {\n            Client4.setTelemetryHandler(new RudderTelemetryHandler());\n\n            rudderAnalytics.load(rudderKey, rudderUrl);\n\n            rudderAnalytics.identify(telemetryId, {}, {\n                context: {\n                    ip: '0.0.0.0',\n                },\n                page: {\n                    path: '',\n                    referrer: '',\n                    search: '',\n                    title: '',\n                    url: '',\n                },\n                anonymousId: '00000000000000000000000000',\n            });\n\n            rudderAnalytics.page('ApplicationLoaded', {\n                path: '',\n                referrer: '',\n                search: '',\n                title: '',\n                url: '',\n            },\n            {\n                context: {\n                    ip: '0.0.0.0',\n                },\n                anonymousId: '00000000000000000000000000',\n            });\n        }\n\n        if (this.props.location.pathname === '/' && this.props.noAccounts) {\n            this.props.history.push('/signup_user_complete');\n        }\n\n        initializePlugins().then(() => {\n            if (this.mounted) {\n                // supports enzyme tests, set state if and only if\n                // the component is still mounted on screen\n                this.setState({configLoaded: true});\n            }\n        });\n\n        loadRecentlyUsedCustomEmojis()(store.dispatch, store.getState);\n\n        const iosDownloadLink = getConfig(store.getState()).IosAppDownloadLink;\n        const androidDownloadLink = getConfig(store.getState()).AndroidAppDownloadLink;\n\n        const toResetPasswordScreen = this.props.location.pathname === '/reset_password_complete';\n\n        // redirect to the mobile landing page if the user hasn't seen it before\n        let mobileLanding;\n        if (UserAgent.isAndroidWeb()) {\n            mobileLanding = androidDownloadLink;\n        } else if (UserAgent.isIosWeb()) {\n            mobileLanding = iosDownloadLink;\n        }\n\n        if (mobileLanding && !BrowserStore.hasSeenLandingPage() && !toResetPasswordScreen && !this.props.location.pathname.includes('/landing')) {\n            this.props.history.push('/landing#' + this.props.location.pathname + this.props.location.search);\n            BrowserStore.setLandingPageSeen(true);\n        }\n\n        Utils.applyTheme(this.props.theme);\n    }\n\n    componentDidUpdate(prevProps) {\n        if (!Utils.areObjectsEqual(prevProps.theme, this.props.theme)) {\n            Utils.applyTheme(this.props.theme);\n        }\n        if (this.props.location.pathname === '/') {\n            if (this.props.noAccounts) {\n                prevProps.history.push('/signup_user_complete');\n            } else if (this.props.showTermsOfService) {\n                prevProps.history.push('/terms_of_service');\n            }\n        }\n    }\n\n    componentDidMount() {\n        this.mounted = true;\n        this.props.actions.loadMeAndConfig().then((response) => {\n            if (this.props.location.pathname === '/' && response[2] && response[2].data) {\n                GlobalActions.redirectUserToDefaultTeam();\n            }\n            this.onConfigLoaded();\n        });\n        trackLoadTime();\n    }\n\n    componentWillUnmount() {\n        this.mounted = false;\n        window.removeEventListener('storage', this.handleLogoutLoginSignal);\n    }\n\n    handleLogoutLoginSignal = (e) => {\n        // when one tab on a browser logs out, it sets __logout__ in localStorage to trigger other tabs to log out\n        const isNewLocalStorageEvent = (event) => event.storageArea === localStorage && event.newValue;\n\n        if (e.key === StoragePrefixes.LOGOUT && isNewLocalStorageEvent(e)) {\n            console.log('detected logout from a different tab'); //eslint-disable-line no-console\n            GlobalActions.emitUserLoggedOutEvent('/', false, false);\n        }\n        if (e.key === StoragePrefixes.LOGIN && isNewLocalStorageEvent(e)) {\n            const isLoggedIn = getCurrentUser(store.getState());\n\n            // make sure this is not the same tab which sent login signal\n            // because another tabs will also send login signal after reloading\n            if (isLoggedIn) {\n                return;\n            }\n\n            // detected login from a different tab\n            function onVisibilityChange() {\n                location.reload();\n            }\n            document.addEventListener('visibilitychange', onVisibilityChange, false);\n        }\n    }\n\n    render() {\n        if (!this.state.configLoaded) {\n            return <div/>;\n        }\n\n        return (\n            <IntlProvider>\n                <Switch>\n                    <Route\n                        path={'/error'}\n                        component={ErrorPage}\n                    />\n                    <HFTRoute\n                        path={'/login'}\n                        component={LoginController}\n                    />\n                    <HFTRoute\n                        path={'/reset_password'}\n                        component={PasswordResetSendLink}\n                    />\n                    <HFTRoute\n                        path={'/reset_password_complete'}\n                        component={PasswordResetForm}\n                    />\n                    <HFTRoute\n                        path={'/signup_user_complete'}\n                        component={SignupController}\n                    />\n                    <HFTRoute\n                        path={'/signup_email'}\n                        component={SignupEmail}\n                    />\n                    <HFTRoute\n                        path={'/should_verify_email'}\n                        component={ShouldVerifyEmail}\n                    />\n                    <HFTRoute\n                        path={'/do_verify_email'}\n                        component={DoVerifyEmail}\n                    />\n                    <HFTRoute\n                        path={'/claim'}\n                        component={ClaimController}\n                    />\n                    <HFTRoute\n                        path={'/help'}\n                        component={HelpController}\n                    />\n                    <LoggedInRoute\n                        path={'/terms_of_service'}\n                        component={TermsOfService}\n                    />\n                    <Route\n                        path={'/landing'}\n                        component={LinkingLandingPage}\n                    />\n                    <LoggedInRoute\n                        path={'/admin_console'}\n                        component={AdminConsole}\n                    />\n                    <LoggedInHFTRoute\n                        path={'/select_team'}\n                        component={SelectTeam}\n                    />\n                    <LoggedInHFTRoute\n                        path={'/oauth/authorize'}\n                        component={Authorize}\n                    />\n                    <LoggedInHFTRoute\n                        path={'/create_team'}\n                        component={CreateTeam}\n                    />\n                    <LoggedInRoute\n                        path={'/mfa'}\n                        component={Mfa}\n                    />\n                    <Redirect\n                        from={'/_redirect/integrations/:subpath*'}\n                        to={`/${this.props.permalinkRedirectTeamName}/integrations/:subpath*`}\n                    />\n                    <Redirect\n                        from={'/_redirect/pl/:postid'}\n                        to={`/${this.props.permalinkRedirectTeamName}/pl/:postid`}\n                    />\n                    <CompassThemeProvider theme={this.props.theme}>\n                        <ModalController/>\n                        <GlobalHeader/>\n                        <Switch>\n                            {this.props.products?.map((product) => (\n                                <Route\n                                    key={product.id}\n                                    path={product.baseURL}\n                                    render={(props) => (\n                                        <LoggedIn {...props}>\n                                            <Pluggable\n                                                pluggableName={'Product'}\n                                                subComponentName={'mainComponent'}\n                                                pluggableId={product.id}\n                                                webSocketClient={webSocketClient}\n                                            />\n                                        </LoggedIn>\n                                    )}\n                                />\n                            ))}\n                            {this.props.plugins?.map((plugin) => (\n                                <Route\n                                    key={plugin.id}\n                                    path={'/plug/' + plugin.route}\n                                    render={() => (\n                                        <Pluggable\n                                            pluggableName={'CustomRouteComponent'}\n                                            pluggableId={plugin.id}\n                                        />\n                                    )}\n                                />\n                            ))}\n                            <LoggedInRoute\n                                path={'/:team'}\n                                component={NeedsTeam}\n                            />\n                            <RootRedirect/>\n                        </Switch>\n                    </CompassThemeProvider>\n                </Switch>\n            </IntlProvider>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {shouldShowTermsOfService, getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {loadMeAndConfig} from 'actions/views/root';\nimport LocalStorageStore from 'stores/local_storage_store';\n\nimport Root from './root.jsx';\n\nfunction mapStateToProps(state) {\n    const config = getConfig(state);\n    const showTermsOfService = shouldShowTermsOfService(state);\n    const plugins = state.plugins.components.CustomRouteComponent;\n    const products = state.plugins.components.Product;\n\n    const teamId = LocalStorageStore.getPreviousTeamId(getCurrentUserId(state));\n    const permalinkRedirectTeam = getTeam(state, teamId);\n\n    return {\n        theme: getTheme(state),\n        telemetryEnabled: config.DiagnosticsEnabled === 'true',\n        noAccounts: config.NoAccounts === 'true',\n        telemetryId: config.DiagnosticId,\n        permalinkRedirectTeamName: permalinkRedirectTeam ? permalinkRedirectTeam.name : '',\n        showTermsOfService,\n        plugins,\n        products,\n    };\n}\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            loadMeAndConfig,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Root);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\n\nexport default class RootPortal extends React.PureComponent {\n    static propTypes = {\n        children: PropTypes.node,\n    }\n\n    constructor(props) {\n        super(props);\n        this.el = document.createElement('div');\n    }\n\n    componentDidMount() {\n        const rootPortal = document.getElementById('root-portal');\n        if (rootPortal) {\n            rootPortal.appendChild(this.el);\n        }\n    }\n\n    componentWillUnmount() {\n        const rootPortal = document.getElementById('root-portal');\n        if (rootPortal) {\n            rootPortal.removeChild(this.el);\n        }\n    }\n\n    render() {\n        return ReactDOM.createPortal(\n            this.props.children,\n            this.el,\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\ntype Props = {\n    saving: boolean;\n    disabled?: boolean;\n    id?: string;\n    onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n    savingMessage?: React.ReactNode;\n    defaultMessage?: React.ReactNode;\n    btnClass?: string;\n    extraClasses?: string;\n}\n\nexport default class SaveButton extends React.PureComponent<Props> {\n    public static defaultProps: Partial<Props> = {\n        btnClass: 'btn-primary',\n        defaultMessage: (\n            <FormattedMessage\n                id='save_button.save'\n                defaultMessage='Save'\n            />\n        ),\n        disabled: false,\n        extraClasses: '',\n        savingMessage: (\n            <FormattedMessage\n                id='save_button.saving'\n                defaultMessage='Saving'\n            />\n        ),\n    }\n\n    public render() {\n        const {\n            saving,\n            disabled,\n            savingMessage,\n            defaultMessage,\n            btnClass,\n            extraClasses,\n            ...props\n        } = this.props;\n\n        let className = 'save-button btn';\n        if (!disabled || saving) {\n            className += ' ' + btnClass;\n        }\n\n        if (extraClasses) {\n            className += ' ' + extraClasses;\n        }\n\n        return (\n            <button\n                type='submit'\n                data-testid='saveSetting'\n                id='saveSetting'\n                className={className}\n                disabled={disabled}\n                {...props}\n            >\n                <LoadingWrapper\n                    loading={saving}\n                    text={savingMessage}\n                >\n                    <span>{defaultMessage}</span>\n                </LoadingWrapper>\n            </button>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, MessageDescriptor} from 'react-intl';\nimport classNames from 'classnames';\n\ninterface SearchTerm {\n    searchTerm: string;\n    message: MessageDescriptor;\n    additionalDisplay?: string;\n}\n\ntype Props = {\n    withTitle?: boolean;\n    onOptionSelected: (term: string) => void;\n    onMouseDown?: () => void | undefined;\n    options: SearchTerm[];\n    highlightedIndex?: number;\n    onOptionHover?: (index: number) => void;\n    onSearchTypeSelected?: (searchType: 'files' | 'messages') => void;\n    searchType?: 'files' | 'messages' | '';\n}\n\nconst SearchHint = (props: Props): JSX.Element => {\n    const handleOnOptionHover = (optionIndex: number) => {\n        if (props.onOptionHover) {\n            props.onOptionHover(optionIndex);\n        }\n    };\n\n    if (props.onSearchTypeSelected) {\n        if (!props.searchType) {\n            return (\n                <div\n                    className='search-hint__search-type-selector'\n                    onMouseDown={props.onMouseDown}\n                >\n                    <div>\n                        <FormattedMessage\n                            id='search_bar.usage.search_type_question'\n                            defaultMessage='What are you searching for?'\n                        />\n                    </div>\n                    <div className='button-container'>\n                        <button\n                            className={classNames({highlighted: props.highlightedIndex === 0})}\n                            onClick={() => props.onSearchTypeSelected && props.onSearchTypeSelected('messages')}\n                        >\n                            <i className='icon icon-message-text-outline'/>\n                            <FormattedMessage\n                                id='search_bar.usage.search_type_messages'\n                                defaultMessage='Messages'\n                            />\n                        </button>\n                        <button\n                            className={classNames({highlighted: props.highlightedIndex === 1})}\n                            onClick={() => props.onSearchTypeSelected && props.onSearchTypeSelected('files')}\n                        >\n                            <i className='icon icon-file-text-outline'/>\n                            <FormattedMessage\n                                id='search_bar.usage.search_type_files'\n                                defaultMessage='Files'\n                            />\n                        </button>\n                    </div>\n                </div>\n            );\n        }\n    }\n\n    return (\n        <React.Fragment>\n            {props.withTitle && (!props.searchType) &&\n                <h4 className='search-hint__title'>\n                    <FormattedMessage\n                        id='search_bar.usage.title'\n                        defaultMessage='Search options'\n                    />\n                </h4>\n            }\n            {props.withTitle && props.searchType === 'files' &&\n                <h4 className='search-hint__title'>\n                    <FormattedMessage\n                        id='search_bar.usage.title_files'\n                        defaultMessage='File search options'\n                    />\n                </h4>\n            }\n            {props.withTitle && props.searchType === 'messages' &&\n                <h4 className='search-hint__title'>\n                    <FormattedMessage\n                        id='search_bar.usage.title_messages'\n                        defaultMessage='Message search options'\n                    />\n                </h4>\n            }\n            <ul\n                role='list'\n                className='search-hint__suggestions-list'\n                onMouseDown={props.onMouseDown}\n                onTouchEnd={props.onMouseDown}\n            >\n                {props.options.map((option, optionIndex) => (\n                    <li\n                        className={classNames('search-hint__suggestions-list__option', {highlighted: optionIndex === props.highlightedIndex})}\n                        key={option.searchTerm}\n                        onMouseDown={() => props.onOptionSelected(option.searchTerm)}\n                        onTouchEnd={() => props.onOptionSelected(option.searchTerm)}\n                        onMouseOver={() => handleOnOptionHover(optionIndex)}\n                    >\n                        <div className='search-hint__suggestion-list__flex-wrap'>\n                            <span className='search-hint__suggestion-list__label'>{option.additionalDisplay ? option.additionalDisplay : option.searchTerm}</span>\n                        </div>\n                        <div className='search-hint__suggestion-list__value'>\n                            <FormattedMessage\n                                id={option.message.id}\n                                defaultMessage={option.message.defaultMessage}\n                            />\n                        </div>\n                    </li>))}\n            </ul>\n        </React.Fragment>\n    );\n};\n\nexport default SearchHint;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport Constants from 'utils/constants';\n\nimport Popover from 'components/widgets/popover';\n\nimport SuggestionList from './suggestion_list.jsx';\n\nexport default class SearchSuggestionList extends SuggestionList {\n    static propTypes = {\n        ...SuggestionList.propTypes,\n    };\n\n    constructor(props) {\n        super(props);\n\n        this.itemRefs = new Map();\n        this.popoverRef = React.createRef();\n        this.itemsContainerRef = React.createRef();\n        this.suggestionReadOut = React.createRef();\n    }\n\n    generateLabel(item) {\n        if (item.username) {\n            this.currentLabel = item.username;\n            if ((item.first_name || item.last_name) && item.nickname) {\n                this.currentLabel += ` ${item.first_name} ${item.last_name} ${item.nickname}`;\n            } else if (item.nickname) {\n                this.currentLabel += ` ${item.nickname}`;\n            } else if (item.first_name || item.last_name) {\n                this.currentLabel += ` ${item.first_name} ${item.last_name}`;\n            }\n        } else if (item.type === Constants.DM_CHANNEL || item.type === Constants.GM_CHANNEL) {\n            this.currentLabel = item.display_name;\n        } else {\n            this.currentLabel = item.name;\n        }\n\n        if (this.currentLabel) {\n            this.currentLabel = this.currentLabel.toLowerCase();\n        }\n\n        this.announceLabel();\n    }\n\n    getContent = () => {\n        return this.itemsContainerRef.current?.parentNode;\n    }\n\n    renderChannelDivider(type) {\n        let text;\n        if (type === Constants.OPEN_CHANNEL) {\n            text = (\n                <FormattedMessage\n                    id='suggestion.search.public'\n                    defaultMessage='Public Channels'\n                />\n            );\n        } else if (type === Constants.PRIVATE_CHANNEL) {\n            text = (\n                <FormattedMessage\n                    id='suggestion.search.private'\n                    defaultMessage='Private Channels'\n                />\n            );\n        } else {\n            text = (\n                <FormattedMessage\n                    id='suggestion.search.direct'\n                    defaultMessage='Direct Messages'\n                />\n            );\n        }\n\n        return (\n            <div\n                key={type + '-divider'}\n                className='search-autocomplete__divider'\n            >\n                <span>{text}</span>\n            </div>\n        );\n    }\n\n    render() {\n        if (this.props.items.length === 0) {\n            return null;\n        }\n\n        const items = [];\n        let haveDMDivider = false;\n        for (let i = 0; i < this.props.items.length; i++) {\n            const item = this.props.items[i];\n            const term = this.props.terms[i];\n            const isSelection = term === this.props.selection;\n\n            // ReactComponent names need to be upper case when used in JSX\n            const Component = this.props.components[i];\n\n            // temporary hack to add dividers between public and private channels in the search suggestion list\n            if (this.props.renderDividers) {\n                if (i === 0 || item.type !== this.props.items[i - 1].type) {\n                    if (item.type === Constants.DM_CHANNEL || item.type === Constants.GM_CHANNEL) {\n                        if (!haveDMDivider) {\n                            items.push(this.renderChannelDivider(Constants.DM_CHANNEL));\n                        }\n                        haveDMDivider = true;\n                    } else if (item.type === Constants.PRIVATE_CHANNEL) {\n                        items.push(this.renderChannelDivider(Constants.PRIVATE_CHANNEL));\n                    } else if (item.type === Constants.OPEN_CHANNEL) {\n                        items.push(this.renderChannelDivider(Constants.OPEN_CHANNEL));\n                    }\n                }\n            }\n\n            if (isSelection) {\n                this.currentItem = item;\n            }\n\n            items.push(\n                <Component\n                    key={term}\n                    ref={(ref) => this.itemRefs.set(term, ref)}\n                    item={item}\n                    term={term}\n                    matchedPretext={this.props.matchedPretext[i]}\n                    isSelection={isSelection}\n                    onClick={this.props.onCompleteWord}\n                    onMouseMove={this.props.onItemHover}\n                />,\n            );\n        }\n\n        return (\n            <Popover\n                ref={this.popoverRef}\n                id='search-autocomplete__popover'\n                className='search-help-popover autocomplete visible'\n                placement='bottom'\n            >\n                <div\n                    ref={this.suggestionReadOut}\n                    aria-live='polite'\n                    className='hidden-label'\n                />\n                <div ref={this.itemsContainerRef}>\n                    {items}\n                </div>\n            </Popover>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport Popover from 'components/widgets/popover';\n\nexport default class SuggestionDate extends React.PureComponent {\n    static propTypes = {\n        onCompleteWord: PropTypes.func.isRequired,\n        items: PropTypes.array.isRequired,\n        terms: PropTypes.array.isRequired,\n        components: PropTypes.array.isRequired,\n        matchedPretext: PropTypes.array.isRequired,\n    };\n\n    render() {\n        if (this.props.items.length === 0) {\n            return null;\n        }\n\n        const item = this.props.items[0];\n        const term = this.props.terms[0];\n\n        // ReactComponent names need to be upper case when used in JSX\n        const Component = this.props.components[0];\n\n        const itemComponent = (\n            <Component\n                key={term}\n                ref={term}\n                item={item}\n                term={term}\n                matchedPretext={this.props.matchedPretext[0]}\n                isSelection={false}\n                onClick={this.props.onCompleteWord}\n            />\n        );\n\n        return (\n            <Popover\n                id='search-autocomplete__popover'\n                className='search-help-popover autocomplete visible'\n                placement='bottom'\n            >\n                {itemComponent}\n            </Popover>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ChangeEvent, CSSProperties, FormEvent, useEffect, useRef} from 'react';\nimport classNames from 'classnames';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport Constants from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\nimport SearchSuggestionList from 'components/suggestion/search_suggestion_list.jsx';\nimport SuggestionDate from 'components/suggestion/suggestion_date.jsx';\nimport SuggestionBox from 'components/suggestion/suggestion_box.jsx';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\nimport Provider from 'components/suggestion/provider';\n\nconst {KeyCodes} = Constants;\n\nconst style: Record<string, CSSProperties> = {\n    searchForm: {overflow: 'visible'},\n};\n\ntype Props = {\n    searchTerms: string;\n    updateHighlightedSearchHint: (indexDelta: number, changedViaKeyPress?: boolean) => void;\n    handleChange: (e: ChangeEvent<HTMLInputElement>) => void;\n    handleSubmit: (e: FormEvent<HTMLFormElement>) => void;\n    handleEnterKey: (e: ChangeEvent<HTMLInputElement>) => void;\n    handleClear: () => void;\n    handleFocus: () => void;\n    handleBlur: () => void;\n    keepFocused: boolean;\n    setKeepFocused: (value: boolean) => void;\n    isFocused: boolean;\n    suggestionProviders: Provider[];\n    isSearchingTerm: boolean;\n    isFocus: boolean;\n    isSideBarRight?: boolean;\n    searchType: string;\n    clearSearchType?: () => void;\n    getFocus?: (searchBarFocus: () => void) => void;\n    children?: React.ReactNode;\n    globalHeaderEnabled?: boolean;\n}\n\nconst defaultProps: Partial<Props> = {\n    isSideBarRight: false,\n    getFocus: (): void => {},\n    children: null,\n};\n\nconst SearchBar: React.FunctionComponent<Props> = (props: Props): JSX.Element => {\n    const {isFocused, keepFocused, searchTerms, suggestionProviders} = props;\n\n    const searchRef = useRef<SuggestionBox>();\n    const intl = useIntl();\n\n    useEffect((): void => {\n        const shouldFocus = isFocused || keepFocused;\n        if (shouldFocus) {\n            // let redux handle changes before focussing the input\n            setTimeout(() => searchRef.current?.focus(), 0);\n        } else {\n            setTimeout(() => searchRef.current?.blur(), 0);\n        }\n    }, [isFocused, keepFocused]);\n\n    useEffect((): void => {\n        if (isFocused && !keepFocused && searchTerms.endsWith('\"\"')) {\n            setTimeout(() => searchRef.current?.focus(), 0);\n        }\n    }, [searchTerms]);\n\n    const handleKeyDown = (e: ChangeEvent<HTMLInputElement>): void => {\n        if (Utils.isKeyPressed(e, KeyCodes.ESCAPE)) {\n            searchRef.current?.blur();\n            e.stopPropagation();\n            e.preventDefault();\n        }\n\n        if (Utils.isKeyPressed(e, KeyCodes.DOWN)) {\n            e.preventDefault();\n            props.updateHighlightedSearchHint(1, true);\n        }\n\n        if (Utils.isKeyPressed(e, KeyCodes.UP)) {\n            e.preventDefault();\n            props.updateHighlightedSearchHint(-1, true);\n        }\n\n        if (Utils.isKeyPressed(e, KeyCodes.ENTER)) {\n            props.handleEnterKey(e);\n        }\n\n        if (Utils.isKeyPressed(e, KeyCodes.BACKSPACE) && !searchTerms) {\n            if (props.clearSearchType) {\n                props.clearSearchType();\n            }\n        }\n    };\n\n    const getSearch = (node: SuggestionBox): void => {\n        searchRef.current = node;\n        if (props.getFocus) {\n            props.getFocus(props.handleFocus);\n        }\n    };\n\n    return (\n        <div\n            id={props.isSideBarRight ? 'sbrSearchFormContainer' : 'searchFormContainer'}\n            className='search-form__container'\n        >\n            <form\n                role='application'\n                className={classNames(['search__form', {'search__form--focused': isFocused, 'search__form--global': props.globalHeaderEnabled}])}\n                onSubmit={props.handleSubmit}\n                style={style.searchForm}\n                autoComplete='off'\n                aria-labelledby='searchBox'\n            >\n                <div className='search__font-icon'>\n                    <i className='icon icon-magnify icon-16'/>\n                </div>\n\n                {props.searchType !== '' &&\n                    <div\n                        className='searchTypeBadge'\n                        onMouseDown={props.handleFocus}\n                    >\n                        {props.searchType === 'messages' &&\n                            <FormattedMessage\n                                id='search_bar.search_types.messages'\n                                defaultMessage='MESSAGES'\n                            />}\n                        {props.searchType === 'files' &&\n                            <FormattedMessage\n                                id='search_bar.search_types.files'\n                                defaultMessage='FILES'\n                            />}\n                        <i\n                            className='icon icon-close icon-12'\n                            onMouseDown={() => {\n                                props.setKeepFocused(true);\n                            }}\n                            onClick={() => props.clearSearchType && props.clearSearchType()}\n                        />\n                    </div>}\n                <SuggestionBox\n                    ref={getSearch}\n                    id={props.isSideBarRight ? 'sbrSearchBox' : 'searchBox'}\n                    tabIndex='0'\n                    className={classNames('search-bar form-control a11y__region', {'Global__search-bar': props.globalHeaderEnabled})}\n                    containerClass='w-full'\n                    data-a11y-sort-order='9'\n                    aria-describedby={props.isSideBarRight ? 'sbr-searchbar-help-popup' : 'searchbar-help-popup'}\n                    aria-label={intl.formatMessage({id: 'search_bar.search', defaultMessage: 'Search'})}\n                    placeholder={intl.formatMessage({id: 'search_bar.search', defaultMessage: 'Search'})}\n                    value={props.searchTerms}\n                    onFocus={props.handleFocus}\n                    onBlur={props.handleBlur}\n                    onChange={props.handleChange}\n                    onKeyDown={handleKeyDown}\n                    listComponent={SearchSuggestionList}\n                    dateComponent={SuggestionDate}\n                    providers={suggestionProviders}\n                    type='search'\n                    autoFocus={props.isFocus && searchTerms === ''}\n                    delayInputUpdate={true}\n                    renderDividers={true}\n                    clearable={true}\n                    onClear={props.handleClear}\n                />\n                {props.isSearchingTerm && <LoadingSpinner/>}\n                {props.children}\n            </form>\n        </div>\n    );\n};\n\nSearchBar.defaultProps = defaultProps;\n\nexport default SearchBar;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Tooltip} from 'react-bootstrap';\n\nimport {Posts} from 'mattermost-redux/constants/index';\nimport * as ReduxPostUtils from 'mattermost-redux/utils/post_utils';\n\nimport PostMessageContainer from 'components/post_view/post_message_view';\nimport FileAttachmentListContainer from 'components/file_attachment_list';\nimport CommentIcon from 'components/common/comment_icon';\nimport DotMenu from 'components/dot_menu';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport PostProfilePicture from 'components/post_profile_picture';\nimport UserProfile from 'components/user_profile';\nimport DateSeparator from 'components/post_view/date_separator';\nimport PostAriaLabelDiv from 'components/post_view/post_aria_label_div';\nimport PostBodyAdditionalContent from 'components/post_view/post_body_additional_content';\nimport PostFlagIcon from 'components/post_view/post_flag_icon';\nimport ArchiveIcon from 'components/widgets/icons/archive_icon';\nimport PostTime from 'components/post_view/post_time';\nimport {browserHistory} from 'utils/browser_history';\nimport BotBadge from 'components/widgets/badges/bot_badge';\nimport InfoSmallIcon from 'components/widgets/icons/info_small_icon';\nimport PostPreHeader from 'components/post_view/post_pre_header';\n\nimport Constants, {Locations} from 'utils/constants';\nimport * as PostUtils from 'utils/post_utils';\nimport * as Utils from 'utils/utils.jsx';\n\nexport default class SearchResultsItem extends React.PureComponent {\n    static propTypes = {\n\n        /**\n        *  Data used for rendering post\n        */\n        post: PropTypes.object,\n\n        /**\n        * An array of strings in this post that were matched by the search\n        */\n        matches: PropTypes.array,\n\n        channelName: PropTypes.string,\n        channelType: PropTypes.string,\n        channelIsArchived: PropTypes.bool,\n\n        /**\n        *  Flag for determining result display setting\n        */\n        compactDisplay: PropTypes.bool,\n\n        /**\n        *  Flag for highlighting mentions\n        */\n        isMentionSearch: PropTypes.bool,\n\n        /**\n        *  Flag for highlighting search term\n        */\n        term: PropTypes.string,\n\n        /**\n        *  Flag for determining result flag state\n        */\n        isFlagged: PropTypes.bool.isRequired,\n\n        /**\n        *  Data used creating URl for jump to post\n        */\n        currentTeamName: PropTypes.string,\n\n        /**\n         * Whether post username overrides are to be respected.\n         */\n        enablePostUsernameOverride: PropTypes.bool.isRequired,\n\n        /**\n         * Is the search results item from a bot.\n         */\n        isBot: PropTypes.bool.isRequired,\n\n        a11yIndex: PropTypes.number,\n\n        /**\n        *  Function used for closing LHS\n        */\n        actions: PropTypes.shape({\n            closeRightHandSide: PropTypes.func.isRequired,\n            selectPost: PropTypes.func.isRequired,\n            selectPostCard: PropTypes.func.isRequired,\n            setRhsExpanded: PropTypes.func.isRequired,\n        }).isRequired,\n\n        displayName: PropTypes.string.isRequired,\n\n        /**\n         * The number of replies in the same thread as this post\n         */\n        replyCount: PropTypes.number,\n\n        /**\n         * Is the search results item from the flagged posts list.\n         */\n        isFlaggedPosts: PropTypes.bool,\n\n        /**\n         * Is the search results item from the pinned posts list.\n         */\n        isPinnedPosts: PropTypes.bool,\n    };\n\n    static defaultProps = {\n        isBot: false,\n        channelIsArchived: false,\n    };\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            dropdownOpened: false,\n            fileDropdownOpened: false,\n            showPreview: false,\n        };\n    }\n\n    handleFocusRHSClick = (e) => {\n        e.preventDefault();\n        this.props.actions.selectPost(this.props.post);\n    };\n\n    handleJumpClick = (e) => {\n        e.preventDefault();\n        if (Utils.isMobile()) {\n            this.props.actions.closeRightHandSide();\n        }\n\n        this.props.actions.setRhsExpanded(false);\n        browserHistory.push(`/${this.props.currentTeamName}/pl/${this.props.post.id}`);\n    };\n\n    handleCardClick = (post) => {\n        if (!post) {\n            return;\n        }\n\n        this.props.actions.selectPostCard(post);\n    }\n\n    handleDropdownOpened = (isOpened) => {\n        this.setState({\n            dropdownOpened: isOpened,\n        });\n    };\n\n    handleFileDropdownOpened = (isOpened) => {\n        this.setState({\n            fileDropdownOpened: isOpened,\n        });\n    };\n\n    renderPostTime = () => {\n        const post = this.props.post;\n\n        const isPermalink = !(Posts.POST_DELETED === post.state ||\n            ReduxPostUtils.isPostPendingOrFailed(post));\n\n        return (\n            <PostTime\n                isPermalink={isPermalink}\n                eventTime={post.create_at}\n                postId={post.id}\n                location={Locations.SEARCH}\n            />\n        );\n    };\n\n    getClassName = () => {\n        let className = 'post post--thread';\n\n        if (this.props.compactDisplay) {\n            className += ' post--compact';\n        }\n\n        if (this.state.dropdownOpened || this.state.fileDropdownOpened) {\n            className += ' post--hovered';\n        }\n\n        return className;\n    };\n\n    getChannelName = () => {\n        const {channelType} = this.props;\n        let {channelName} = this.props;\n\n        if (channelType === Constants.DM_CHANNEL) {\n            channelName = (\n                <FormattedMessage\n                    id='search_item.direct'\n                    defaultMessage='Direct Message (with {username})'\n                    values={{\n                        username: this.props.displayName,\n                    }}\n                />\n            );\n        }\n\n        return channelName;\n    }\n\n    render() {\n        const {post, channelIsArchived} = this.props;\n        const channelName = this.getChannelName();\n\n        let overrideUsername;\n        let disableProfilePopover = false;\n        if (post.props &&\n            post.props.from_webhook &&\n            post.props.override_username &&\n            this.props.enablePostUsernameOverride) {\n            overrideUsername = post.props.override_username;\n            disableProfilePopover = true;\n        }\n\n        const profilePic = (\n            <PostProfilePicture\n                compactDisplay={this.props.compactDisplay}\n                post={post}\n                userId={post.user_id}\n            />\n        );\n\n        const profilePicContainer = (<div className='post__img'>{profilePic}</div>);\n\n        let postClass = '';\n        if (PostUtils.isEdited(this.props.post)) {\n            postClass += ' post--edited';\n        }\n\n        let fileAttachment = null;\n        if (post.file_ids && post.file_ids.length > 0) {\n            fileAttachment = (\n                <FileAttachmentListContainer\n                    post={post}\n                    compactDisplay={this.props.compactDisplay}\n                    handleFileDropdownOpened={this.handleFileDropdownOpened}\n                />\n            );\n        }\n\n        let message;\n        let flagContent;\n        let postInfoIcon;\n        let rhsControls;\n        if (post.state === Constants.POST_DELETED || post.state === Posts.POST_DELETED) {\n            message = (\n                <p>\n                    <FormattedMessage\n                        id='post_body.deleted'\n                        defaultMessage='(message deleted)'\n                    />\n                </p>\n            );\n        } else {\n            if (!Utils.isMobile()) {\n                flagContent = (\n                    <PostFlagIcon\n                        location={Locations.SEARCH}\n                        postId={post.id}\n                        isFlagged={this.props.isFlagged}\n                    />\n                );\n            }\n\n            if (post.props && post.props.card) {\n                postInfoIcon = (\n                    <OverlayTrigger\n                        delayShow={Constants.OVERLAY_TIME_DELAY}\n                        placement='top'\n                        overlay={\n                            <Tooltip>\n                                <FormattedMessage\n                                    id='post_info.info.view_additional_info'\n                                    defaultMessage='View additional info'\n                                />\n                            </Tooltip>\n                        }\n                    >\n                        <button\n                            className='card-icon__container icon--show style--none'\n                            onClick={(e) => {\n                                e.preventDefault();\n                                this.handleCardClick(this.props.post);\n                            }}\n                        >\n                            <InfoSmallIcon\n                                className='icon icon__info'\n                                aria-hidden='true'\n                            />\n                        </button>\n                    </OverlayTrigger>\n                );\n            }\n\n            rhsControls = (\n                <div className='col__controls post-menu'>\n                    <DotMenu\n                        post={post}\n                        location={Locations.SEARCH}\n                        isFlagged={this.props.isFlagged}\n                        handleDropdownOpened={this.handleDropdownOpened}\n                        isMenuOpen={this.state.dropdownOpened}\n                        isReadOnly={channelIsArchived || null}\n                    />\n                    {flagContent}\n                    <CommentIcon\n                        location={Locations.SEARCH}\n                        handleCommentClick={this.handleFocusRHSClick}\n                        commentCount={this.props.replyCount}\n                        postId={post.id}\n                        searchStyle={'search-item__comment'}\n                        extraClass={this.props.replyCount ? 'icon--visible' : ''}\n                    />\n                    <a\n                        href='#'\n                        onClick={this.handleJumpClick}\n                        className='search-item__jump'\n                    >\n                        <FormattedMessage\n                            id='search_item.jump'\n                            defaultMessage='Jump'\n                        />\n                    </a>\n                </div>\n            );\n\n            message = (\n                <PostBodyAdditionalContent\n                    post={post}\n                    options={{\n                        searchTerm: this.props.term,\n                        searchMatches: this.props.matches,\n                    }}\n                >\n                    <PostMessageContainer\n                        post={post}\n                        options={{\n                            searchTerm: this.props.term,\n                            searchMatches: this.props.matches,\n                            mentionHighlight: this.props.isMentionSearch,\n                        }}\n                        isRHS={true}\n                    />\n                </PostBodyAdditionalContent>\n            );\n        }\n\n        const currentPostDay = Utils.getDateForUnixTicks(post.create_at);\n\n        return (\n            <div\n                data-testid='search-item-container'\n                className='search-item__container'\n            >\n                <DateSeparator date={currentPostDay}/>\n                <PostAriaLabelDiv\n                    className={`a11y__section ${this.getClassName()}`}\n                    id={'searchResult_' + post.id}\n                    post={post}\n                    data-a11y-sort-order={this.props.a11yIndex}\n                >\n                    <div\n                        className='search-channel__name'\n                        aria-hidden='true'\n                    >\n                        {channelName}\n                        {channelIsArchived &&\n                            <span className='search-channel__archived'>\n                                <ArchiveIcon className='icon icon__archive channel-header-archived-icon svg-text-color'/>\n                                <FormattedMessage\n                                    id='search_item.channelArchived'\n                                    defaultMessage='Archived'\n                                />\n                            </span>\n                        }\n                    </div>\n                    <PostPreHeader\n                        isFlagged={this.props.isFlagged}\n                        isPinned={post.is_pinned}\n                        skipPinned={this.props.isPinnedPosts}\n                        skipFlagged={this.props.isFlaggedPosts}\n                        channelId={post.channel_id}\n                    />\n                    <div\n                        role='application'\n                        className='post__content'\n                    >\n                        {profilePicContainer}\n                        <div>\n                            <div className='post__header'>\n                                <div className='col col__name'>\n                                    <UserProfile\n                                        userId={post.user_id}\n                                        overwriteName={overrideUsername}\n                                        disablePopover={disableProfilePopover}\n                                        isRHS={true}\n                                    />\n                                    <BotBadge show={Boolean(post.props && post.props.from_webhook && !this.props.isBot)}/>\n                                </div>\n                                <div className='col'>\n                                    {this.renderPostTime()}\n                                    {postInfoIcon}\n                                </div>\n                                {rhsControls}\n                            </div>\n                            <div className='search-item-snippet post__body'>\n                                <div className={postClass}>\n                                    {message}\n                                    {fileAttachment}\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </PostAriaLabelDiv>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {getChannel, getDirectTeammate} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {makeGetCommentCountForPost} from 'mattermost-redux/selectors/entities/posts';\nimport {getMyPreferences} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {isPostFlagged} from 'mattermost-redux/utils/post_utils';\n\nimport {\n    closeRightHandSide,\n    selectPostFromRightHandSideSearch,\n    selectPostCardFromRightHandSideSearch,\n    setRhsExpanded,\n} from 'actions/views/rhs';\n\nimport {GlobalState} from 'types/store';\n\nimport {getDisplayNameByUser} from 'utils/utils.jsx';\n\nimport SearchResultsItem from './search_results_item.jsx';\n\ninterface OwnProps {\n    post: Post;\n}\n\nfunction mapStateToProps() {\n    const getReplyCount = makeGetCommentCountForPost();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        const {post} = ownProps;\n        const config = getConfig(state);\n        const preferences = getMyPreferences(state);\n        const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n        const user = getUser(state, post.user_id);\n        const channel = getChannel(state, post.channel_id) || {delete_at: 0};\n        const directTeammate = getDirectTeammate(state, channel.id);\n\n        return {\n            currentTeamName: getCurrentTeam(state).name,\n            channelId: channel.id,\n            channelName: channel.display_name,\n            channelType: channel.type,\n            channelIsArchived: channel.delete_at !== 0,\n            enablePostUsernameOverride,\n            isFlagged: isPostFlagged(post.id, preferences),\n            isBot: user ? user.is_bot : false,\n            displayName: getDisplayNameByUser(state, directTeammate),\n            replyCount: getReplyCount(state, post),\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            closeRightHandSide,\n            selectPost: selectPostFromRightHandSideSearch,\n            selectPostCard: selectPostCardFromRightHandSideSearch,\n            setRhsExpanded,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SearchResultsItem);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {FileInfo} from 'mattermost-redux/types/files';\n\nimport {FileDropdownPluginComponent} from 'types/store/plugins';\n\nimport {fileSizeToString, copyToClipboard, localizeMessage} from 'utils/utils';\nimport {browserHistory} from 'utils/browser_history';\nimport {getSiteURL} from 'utils/url';\nimport Constants from 'utils/constants';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport Menu from 'components/widgets/menu/menu';\nimport Badge from 'components/widgets/badges/badge';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport FileThumbnail from 'components/file_attachment/file_thumbnail';\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\n\nimport './file_search_result_item.scss';\nimport FilePreviewModal from 'components/file_preview_modal';\n\ntype Props = {\n    fileInfo: FileInfo;\n    channelDisplayName: string;\n    channelType: string;\n    teamName: string;\n    pluginMenuItems?: FileDropdownPluginComponent[];\n};\n\ntype State = {\n    keepOpen: boolean;\n    showPreview: boolean;\n}\n\nconst FILE_TOOLTIP_RANGES = [\n    RelativeRanges.TODAY_TITLE_CASE,\n    RelativeRanges.YESTERDAY_TITLE_CASE,\n];\n\nexport default class FileSearchResultItem extends React.PureComponent<Props, State> {\n    public constructor(props: Props) {\n        super(props);\n        this.state = {keepOpen: false, showPreview: false};\n    }\n\n    private jumpToConv = (e: MouseEvent) => {\n        e.stopPropagation();\n        browserHistory.push(`/${this.props.teamName}/pl/${this.props.fileInfo.post_id}`);\n    }\n\n    private copyLink = () => {\n        copyToClipboard(`${getSiteURL()}/${this.props.teamName}/pl/${this.props.fileInfo.post_id}`);\n    }\n\n    private stopPropagation = (e: React.MouseEvent<HTMLElement, MouseEvent>) => {\n        e.stopPropagation();\n    }\n\n    private keepOpen = (open: boolean) => {\n        this.setState({keepOpen: open});\n    }\n\n    private renderPluginItems = () => {\n        const {fileInfo} = this.props;\n        const pluginItems = this.props.pluginMenuItems?.filter((item) => item?.match(fileInfo)).map((item) => {\n            return (\n                <Menu.ItemAction\n                    id={item.id + '_pluginmenuitem'}\n                    key={item.id + '_pluginmenuitem'}\n                    onClick={() => item.action?.(fileInfo)}\n                    text={item.text}\n                />\n            );\n        });\n\n        if (!pluginItems?.length) {\n            return null;\n        }\n\n        return (\n            <>\n                <li\n                    id={`divider_file_${this.props.fileInfo.id}_plugins`}\n                    className='MenuItem__divider'\n                    role='menuitem'\n                />\n                {pluginItems}\n            </>\n        );\n    }\n\n    public render(): React.ReactNode {\n        const {fileInfo, channelDisplayName, channelType} = this.props;\n        let channelName: React.ReactNode = channelDisplayName;\n        if (channelType === Constants.DM_CHANNEL) {\n            channelName = (\n                <FormattedMessage\n                    id='search_item.file_badge.direct_message'\n                    defaultMessage='Direct Message'\n                />\n            );\n        } else if (channelType === Constants.GM_CHANNEL) {\n            channelName = (\n                <FormattedMessage\n                    id='search_item.file_badge.group_message'\n                    defaultMessage='Group Message'\n                />\n            );\n        }\n\n        return (\n            <div\n                data-testid='search-item-container'\n                className='search-item__container'\n            >\n                <button\n                    className={'FileSearchResultItem' + (this.state.keepOpen ? ' keep-open' : '')}\n                    onClick={() => this.setState({showPreview: true})}\n                >\n                    <FileThumbnail fileInfo={fileInfo}/>\n                    <div className='fileData'>\n                        <div className='fileDataName'>{fileInfo.name}</div>\n                        <div className='fileMetadata'>\n                            {channelName && <Badge className='file-search-channel-name'>{channelName}</Badge>}\n                            <span>{fileSizeToString(fileInfo.size)}</span>\n                            <span>{' • '}</span>\n                            <Timestamp\n                                value={fileInfo.create_at}\n                                ranges={FILE_TOOLTIP_RANGES}\n                            />\n                        </div>\n                    </div>\n                    <OverlayTrigger\n                        delayShow={1000}\n                        placement='top'\n                        overlay={\n                            <Tooltip id='file-name__tooltip'>\n                                {localizeMessage('file_search_result_item.more_actions', 'More Actions')}\n                            </Tooltip>\n                        }\n                    >\n                        <MenuWrapper\n                            onToggle={this.keepOpen}\n                            stopPropagationOnToggle={true}\n                        >\n                            <a\n                                href='#'\n                                className='action-icon dots-icon'\n                            >\n                                <i className='icon icon-dots-vertical'/>\n                            </a>\n                            <Menu\n                                ariaLabel={'file menu'}\n                                openLeft={true}\n                            >\n                                <Menu.ItemAction\n                                    onClick={this.jumpToConv}\n                                    ariaLabel={localizeMessage('file_search_result_item.open_in_channel', 'Open in channel')}\n                                    text={localizeMessage('file_search_result_item.open_in_channel', 'Open in channel')}\n                                />\n                                <Menu.ItemAction\n                                    onClick={this.copyLink}\n                                    ariaLabel={localizeMessage('file_search_result_item.copy_link', 'Copy link')}\n                                    text={localizeMessage('file_search_result_item.copy_link', 'Copy link')}\n                                />\n                                {this.renderPluginItems()}\n                            </Menu>\n                        </MenuWrapper>\n                    </OverlayTrigger>\n                    <OverlayTrigger\n                        delayShow={1000}\n                        placement='top'\n                        overlay={\n                            <Tooltip id='file-name__tooltip'>\n                                {localizeMessage('file_search_result_item.download', 'Download')}\n                            </Tooltip>\n                        }\n                    >\n                        <a\n                            className='action-icon download-icon'\n                            href={`/api/v4/files/${fileInfo.id}?download=1`}\n                            onClick={this.stopPropagation}\n                        >\n                            <i className='icon icon-download-outline'/>\n                        </a>\n                    </OverlayTrigger>\n                </button>\n                <FilePreviewModal\n                    show={this.state.showPreview}\n                    onModalDismissed={() => this.setState({showPreview: false})}\n                    startIndex={0}\n                    fileInfos={[this.props.fileInfo]}\n                    postId={this.props.fileInfo.post_id}\n                />\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\n\nimport {GlobalState} from 'types/store';\n\nimport FileSearchResultItem from './file_search_result_item';\n\ntype OwnProps = {\n    channelId: string;\n};\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const channel = getChannel(state, ownProps.channelId);\n\n    return {\n        channelDisplayName: '',\n        channelType: channel.type,\n    };\n}\n\nexport default connect(mapStateToProps)(FileSearchResultItem);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport {SearchFilterType} from '../search/types';\n\nimport './files_filter_menu.scss';\n\ntype Props = {\n    selectedFilter: string;\n    onFilter: (filter: SearchFilterType) => void;\n};\n\nexport default function FilesFilterMenu(props: Props): JSX.Element {\n    return (\n        <div className='FilesFilterMenu'>\n            <MenuWrapper>\n                <span className='action-icon dots-icon'>\n                    {props.selectedFilter !== 'all' && <i className='icon-dot'/>}\n                    <i className='icon icon-filter-variant'/>\n                </span>\n                <Menu\n                    ariaLabel={'file menu'}\n                    openLeft={true}\n                >\n                    <Menu.ItemAction\n                        ariaLabel={'All file types'}\n                        text={'All file types'}\n                        onClick={() => props.onFilter('all')}\n                        icon={props.selectedFilter === 'all' ? <i className='icon icon-check'/> : null}\n                    />\n                    <Menu.ItemAction\n                        ariaLabel={'Documents'}\n                        text={'Documents'}\n                        onClick={() => props.onFilter('documents')}\n                        icon={props.selectedFilter === 'documents' ? <i className='icon icon-check'/> : null}\n                    />\n                    <Menu.ItemAction\n                        ariaLabel={'Spreadsheets'}\n                        text={'Spreadsheets'}\n                        onClick={() => props.onFilter('spreadsheets')}\n                        icon={props.selectedFilter === 'spreadsheets' ? <i className='icon icon-check'/> : null}\n                    />\n                    <Menu.ItemAction\n                        ariaLabel={'Presentations'}\n                        text={'Presentations'}\n                        onClick={() => props.onFilter('presentations')}\n                        icon={props.selectedFilter === 'presentations' ? <i className='icon icon-check'/> : null}\n                    />\n                    <Menu.ItemAction\n                        ariaLabel={'Code'}\n                        text={'Code'}\n                        onClick={() => props.onFilter('code')}\n                        icon={props.selectedFilter === 'code' ? <i className='icon icon-check'/> : null}\n                    />\n                    <Menu.ItemAction\n                        ariaLabel={'Images'}\n                        text={'Images'}\n                        onClick={() => props.onFilter('images')}\n                        icon={props.selectedFilter === 'images' ? <i className='icon icon-check'/> : null}\n                    />\n                    <Menu.ItemAction\n                        ariaLabel={'Audio'}\n                        text={'Audio'}\n                        onClick={() => props.onFilter('audio')}\n                        icon={props.selectedFilter === 'audio' ? <i className='icon icon-check'/> : null}\n                    />\n                    <Menu.ItemAction\n                        ariaLabel={'Videos'}\n                        text={'Videos'}\n                        onClick={() => props.onFilter('video')}\n                        icon={props.selectedFilter === 'video' ? <i className='icon icon-check'/> : null}\n                    />\n                </Menu>\n            </MenuWrapper>\n        </div>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {SearchFilterType} from '../search/types';\nimport {SearchType} from 'types/store/rhs';\n\nimport * as Utils from 'utils/utils.jsx';\nimport Constants from 'utils/constants';\n\nimport FilesFilterMenu from './files_filter_menu';\n\nconst {KeyCodes} = Constants;\n\nimport './messages_or_files_selector.scss';\n\ntype Props = {\n    selected: string;\n    selectedFilter: SearchFilterType;\n    messagesCounter: string;\n    filesCounter: string;\n    onChange: (value: SearchType) => void;\n    onFilter: (filter: SearchFilterType) => void;\n};\n\nexport default function MessagesOrFilesSelector(props: Props): JSX.Element {\n    return (\n        <div className='MessagesOrFilesSelector'>\n            <div className='buttons-container'>\n                <button\n                    onClick={() => props.onChange('messages')}\n                    onKeyDown={(e: React.KeyboardEvent<HTMLSpanElement>) => Utils.isKeyPressed(e, KeyCodes.ENTER) && props.onChange('messages')}\n                    className={props.selected === 'messages' ? 'active tab messages-tab' : 'tab messages-tab'}\n                >\n                    <FormattedMessage\n                        id='search_bar.messages_tab'\n                        defaultMessage='Messages'\n                    />\n                    <span className='counter'>{props.messagesCounter}</span>\n                </button>\n                <button\n                    onClick={() => props.onChange('files')}\n                    onKeyDown={(e: React.KeyboardEvent<HTMLSpanElement>) => Utils.isKeyPressed(e, KeyCodes.ENTER) && props.onChange('files')}\n                    className={props.selected === 'files' ? 'active tab files-tab' : 'tab files-tab'}\n                >\n                    <FormattedMessage\n                        id='search_bar.files_tab'\n                        defaultMessage='Files'\n                    />\n                    <span className='counter'>{props.filesCounter}</span>\n                </button>\n            </div>\n            {props.selected === 'files' &&\n                <FilesFilterMenu\n                    selectedFilter={props.selectedFilter}\n                    onFilter={props.onFilter}\n                />}\n        </div>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport React, {useEffect, useRef, useState} from 'react';\nimport {MessageDescriptor, useIntl, FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\nimport Scrollbars from 'react-custom-scrollbars';\n\nimport classNames from 'classnames';\n\nimport {debounce} from 'mattermost-redux/actions/helpers';\nimport {FileSearchResultItem as FileSearchResultItemType} from 'mattermost-redux/types/files';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {getFilesDropdownPluginMenuItems} from 'selectors/plugins';\n\nimport * as Utils from 'utils/utils.jsx';\nimport {searchHintOptions} from 'utils/constants';\n\nimport SearchResultsHeader from 'components/search_results_header';\nimport SearchResultsItem from 'components/search_results_item';\nimport SearchHint from 'components/search_hint/search_hint';\nimport LoadingSpinner from 'components/widgets/loading/loading_wrapper';\nimport NoResultsIndicator from 'components/no_results_indicator/no_results_indicator';\nimport FlagIcon from 'components/widgets/icons/flag_icon';\nimport FileSearchResultItem from 'components/file_search_results';\n\nimport {NoResultsVariant} from 'components/no_results_indicator/types';\n\nimport MessageOrFileSelector from './messages_or_files_selector';\nimport FilesFilterMenu from './files_filter_menu';\n\nimport './search_results.scss';\n\nimport type {Props} from './types';\n\nconst GET_MORE_BUFFER = 30;\nconst FILES_SEARCH_TYPE = 'files';\nconst MESSAGES_SEARCH_TYPE = 'messages';\n\nconst renderView = (props: Record<string, unknown>): JSX.Element => (\n    <div\n        {...props}\n        className='scrollbar--view'\n    />\n);\n\nconst renderThumbHorizontal = (props: Record<string, unknown>): JSX.Element => (\n    <div\n        {...props}\n        className='scrollbar--horizontal'\n    />\n);\n\nconst renderThumbVertical = (props: Record<string, unknown>): JSX.Element => (\n    <div\n        {...props}\n        className='scrollbar--vertical'\n    />\n);\n\ninterface NoResultsProps {\n    variant: NoResultsVariant;\n    titleValues?: Record<string, React.ReactNode>;\n    subtitleValues?: Record<string, React.ReactNode>;\n}\n\nconst defaultProps: Partial<Props> = {\n    isCard: false,\n    isOpened: false,\n    channelDisplayName: '',\n    children: null,\n};\n\nconst SearchResults: React.FC<Props> = (props: Props): JSX.Element => {\n    const scrollbars = useRef<Scrollbars|null>(null);\n    const [searchType, setSearchType] = useState<string>(props.searchType);\n    const filesDropdownPluginMenuItems = useSelector(getFilesDropdownPluginMenuItems);\n    const intl = useIntl();\n\n    useEffect(() => {\n        if (props.searchFilterType !== 'all') {\n            props.setSearchFilterType('all');\n        }\n        setSearchType(props.searchType);\n        scrollbars.current?.scrollToTop();\n    }, [props.searchTerms]);\n\n    useEffect(() => {\n        // after the first page of search results, there is no way to\n        // know if the search has more results to return, so we search\n        // for the second page and stop if it yields no results\n        if (props.searchPage === 0 && !props.isChannelFiles) {\n            setTimeout(() => {\n                props.getMorePostsForSearch();\n                props.getMoreFilesForSearch();\n            }, 100);\n        }\n    }, [props.searchPage, props.searchTerms]);\n\n    const handleScroll = (): void => {\n        if (!props.isFlaggedPosts && !props.isPinnedPosts && !props.isSearchingTerm && !props.isSearchGettingMore && !props.isChannelFiles) {\n            const scrollHeight = scrollbars.current?.getScrollHeight() || 0;\n            const scrollTop = scrollbars.current?.getScrollTop() || 0;\n            const clientHeight = scrollbars.current?.getClientHeight() || 0;\n            if ((scrollTop + clientHeight + GET_MORE_BUFFER) >= scrollHeight) {\n                if (searchType === FILES_SEARCH_TYPE) {\n                    loadMoreFiles();\n                } else {\n                    loadMorePosts();\n                }\n            }\n        }\n    };\n\n    const loadMorePosts = debounce(\n        () => {\n            props.getMorePostsForSearch();\n        },\n        100,\n        false,\n        (): void => {},\n    );\n\n    const loadMoreFiles = debounce(\n        () => {\n            props.getMoreFilesForSearch();\n        },\n        100,\n        false,\n        (): void => {},\n    );\n\n    const {\n        results,\n        fileResults,\n        searchTerms,\n        isCard,\n        isSearchAtEnd,\n        isSearchFilesAtEnd,\n        isSearchingTerm,\n        isFlaggedPosts,\n        isSearchingFlaggedPost,\n        isPinnedPosts,\n        isChannelFiles,\n        isSearchingPinnedPost,\n        isSideBarExpanded,\n        isMentionSearch,\n        isOpened,\n        updateSearchTerms,\n        handleSearchHintSelection,\n        searchFilterType,\n        setSearchFilterType,\n    } = props;\n\n    const noResults = (!results || !Array.isArray(results) || results.length === 0);\n    const noFileResults = (!fileResults || !Array.isArray(fileResults) || fileResults.length === 0);\n    const isLoading = isSearchingTerm || isSearchingFlaggedPost || isSearchingPinnedPost || !isOpened;\n    const isAtEnd = (searchType === MESSAGES_SEARCH_TYPE && isSearchAtEnd) || (searchType === FILES_SEARCH_TYPE && isSearchFilesAtEnd);\n    const showLoadMore = !isAtEnd && !isChannelFiles && !isFlaggedPosts && !isPinnedPosts;\n    const isMessagesSearch = (!isFlaggedPosts && !isMentionSearch && !isCard && !isPinnedPosts && !isChannelFiles);\n\n    let contentItems;\n    let loadingMorePostsComponent;\n\n    let sortedResults: any = results;\n\n    const titleDescriptor: MessageDescriptor = {};\n    const noResultsProps: NoResultsProps = {\n        variant: NoResultsVariant.ChannelSearch,\n    };\n\n    if (isMentionSearch) {\n        noResultsProps.variant = NoResultsVariant.Mentions;\n\n        titleDescriptor.id = 'search_header.title2';\n        titleDescriptor.defaultMessage = 'Recent Mentions';\n    } else if (isFlaggedPosts) {\n        noResultsProps.variant = NoResultsVariant.FlaggedPosts;\n        noResultsProps.subtitleValues = {icon: <FlagIcon className='icon  no-results__mini_icon'/>};\n\n        titleDescriptor.id = 'search_header.title3';\n        titleDescriptor.defaultMessage = 'Saved Posts';\n    } else if (isPinnedPosts) {\n        noResultsProps.variant = NoResultsVariant.PinnedPosts;\n        noResultsProps.subtitleValues = {text: <strong>{'Pin to Channel'}</strong>};\n\n        sortedResults = [...results];\n        sortedResults.sort((postA: Post|FileSearchResultItemType, postB: Post|FileSearchResultItemType) => postB.create_at - postA.create_at);\n\n        titleDescriptor.id = 'search_header.pinnedPosts';\n        titleDescriptor.defaultMessage = 'Pinned Posts';\n    } else if (isChannelFiles) {\n        if (searchFilterType === 'all') {\n            noResultsProps.variant = NoResultsVariant.ChannelFiles;\n        } else {\n            noResultsProps.variant = NoResultsVariant.ChannelFilesFiltered;\n        }\n\n        titleDescriptor.id = 'search_header.channelFiles';\n        titleDescriptor.defaultMessage = 'Files';\n    } else if (isCard) {\n        titleDescriptor.id = 'search_header.title5';\n        titleDescriptor.defaultMessage = 'Extra information';\n    } else if (!searchTerms && noResults && noFileResults) {\n        titleDescriptor.id = 'search_header.search';\n        titleDescriptor.defaultMessage = 'Search';\n    } else {\n        noResultsProps.titleValues = {channelName: `\"${searchTerms}\"`};\n\n        titleDescriptor.id = 'search_header.results';\n        titleDescriptor.defaultMessage = 'Search Results';\n    }\n\n    const formattedTitle = intl.formatMessage(titleDescriptor);\n\n    const handleOptionSelection = (term: string): void => {\n        handleSearchHintSelection();\n        updateSearchTerms(term);\n    };\n\n    switch (true) {\n    case isLoading:\n        contentItems = (\n            <div className='sidebar--right__subheader a11y__section'>\n                <div className='sidebar--right__loading'>\n                    <LoadingSpinner text={Utils.localizeMessage('search_header.loading', 'Searching')}/>\n                </div>\n            </div>\n        );\n        break;\n    case (noResults && !searchTerms && !isMentionSearch && !isPinnedPosts && !isFlaggedPosts && !isChannelFiles):\n        contentItems = (\n            <div className='sidebar--right__subheader search__hints a11y__section'>\n                <SearchHint\n                    onOptionSelected={handleOptionSelection}\n                    options={searchHintOptions}\n                />\n            </div>\n        );\n        break;\n    case noResults && (searchType === MESSAGES_SEARCH_TYPE && !isChannelFiles):\n        contentItems = (\n            <div\n                className={classNames([\n                    'sidebar--right__subheader a11y__section',\n                    {'sidebar-expanded': isSideBarExpanded},\n                ])}\n            >\n                <NoResultsIndicator {...noResultsProps}/>\n            </div>\n        );\n        break;\n    case noFileResults && (searchType === FILES_SEARCH_TYPE || isChannelFiles):\n        contentItems = (\n            <div\n                className={classNames([\n                    'sidebar--right__subheader a11y__section',\n                    {'sidebar-expanded': isSideBarExpanded},\n                ])}\n            >\n                <NoResultsIndicator {...noResultsProps}/>\n            </div>\n        );\n        break;\n    default:\n        if (searchType === FILES_SEARCH_TYPE || isChannelFiles) {\n            sortedResults = fileResults;\n        }\n\n        contentItems = sortedResults.map((item: Post|FileSearchResultItemType, index: number) => {\n            if (searchType === MESSAGES_SEARCH_TYPE && !props.isChannelFiles) {\n                return (\n                    <SearchResultsItem\n                        key={item.id}\n                        compactDisplay={props.compactDisplay}\n                        post={item as Post}\n                        matches={props.matches[item.id]}\n                        term={(!props.isFlaggedPosts && !props.isPinnedPosts && !props.isMentionSearch) ? searchTerms : ''}\n                        isMentionSearch={props.isMentionSearch}\n                        a11yIndex={index}\n                        isFlaggedPosts={props.isFlaggedPosts}\n                        isPinnedPosts={props.isPinnedPosts}\n                    />\n                );\n            }\n            return (\n                <FileSearchResultItem\n                    key={item.id}\n                    channelId={item.channel_id}\n                    fileInfo={item as FileSearchResultItemType}\n                    teamName={props.currentTeamName}\n                    pluginMenuItems={filesDropdownPluginMenuItems}\n                />\n            );\n        });\n\n        loadingMorePostsComponent = (showLoadMore) ? (\n            <div className='loading-screen'>\n                <div className='loading__content'>\n                    <div className='round round-1'/>\n                    <div className='round round-2'/>\n                    <div className='round round-3'/>\n                </div>\n            </div>\n        ) : null;\n    }\n\n    return (\n        <div\n            id='searchContainer'\n            className='SearchResults sidebar-right__body'\n        >\n            <SearchResultsHeader>\n                {formattedTitle}\n                {props.channelDisplayName && <div className='sidebar--right__title__channel'>{props.channelDisplayName}</div>}\n            </SearchResultsHeader>\n            {isMessagesSearch &&\n                <MessageOrFileSelector\n                    selected={searchType}\n                    selectedFilter={searchFilterType}\n                    messagesCounter={isSearchAtEnd || props.searchPage === 0 ? `${results.length}` : `${results.length}+`}\n                    filesCounter={isSearchFilesAtEnd || props.searchPage === 0 ? `${fileResults.length}` : `${fileResults.length}+`}\n                    onChange={setSearchType}\n                    onFilter={setSearchFilterType}\n                />}\n            {isChannelFiles &&\n                <div className='channel-files__header'>\n                    <div className='channel-files__title'>\n                        <FormattedMessage\n                            id='search_results.channel-files-header'\n                            defaultMessage='Recent files'\n                        />\n                    </div>\n                    <FilesFilterMenu\n                        selectedFilter={searchFilterType}\n                        onFilter={setSearchFilterType}\n                    />\n                </div>\n            }\n            <Scrollbars\n                ref={scrollbars}\n                autoHide={true}\n                autoHideTimeout={500}\n                autoHideDuration={500}\n                renderThumbHorizontal={renderThumbHorizontal}\n                renderThumbVertical={renderThumbVertical}\n                renderView={renderView}\n                onScroll={handleScroll}\n            >\n                <div\n                    id='search-items-container'\n                    role='application'\n                    className={classNames([\n                        'search-items-container post-list__table a11y__region',\n                        {\n                            'no-results': (noResults && searchType === MESSAGES_SEARCH_TYPE) || (noFileResults && (searchType === FILES_SEARCH_TYPE || isChannelFiles)),\n                            'channel-files-container': isChannelFiles,\n                        },\n                    ])}\n                    data-a11y-sort-order='3'\n                    data-a11y-focus-child={true}\n                    data-a11y-loop-navigation={false}\n                    aria-label={intl.formatMessage({\n                        id: 'accessibility.sections.rhs',\n                        defaultMessage: '{regionTitle} complimentary region',\n                    }, {\n                        regionTitle: formattedTitle,\n                    })}\n                >\n                    {contentItems}\n                    {loadingMorePostsComponent}\n                </div>\n            </Scrollbars>\n        </div>\n    );\n};\n\nSearchResults.defaultProps = defaultProps;\n\nexport const arePropsEqual = (props: Props, nextProps: Props): boolean => {\n    // Shallow compare for all props except 'results' and 'fileResults'\n    for (const key in nextProps) {\n        if (!Object.prototype.hasOwnProperty.call(nextProps, key) || key === 'results') {\n            continue;\n        }\n\n        if (!Object.prototype.hasOwnProperty.call(nextProps, key) || key === 'fileResults') {\n            continue;\n        }\n\n        if (nextProps[key] !== props[key]) {\n            return false;\n        }\n    }\n\n    // Here we do a slightly deeper compare on 'results' because it is frequently a new\n    // array but without any actual changes\n    const {results} = props;\n    const {results: nextResults} = nextProps;\n\n    if (results.length !== nextResults.length) {\n        return false;\n    }\n\n    for (let i = 0; i < results.length; i++) {\n        // Only need a shallow compare on each post\n        if (results[i] !== nextResults[i]) {\n            return false;\n        }\n    }\n\n    // Here we do a slightly deeper compare on 'fileResults' because it is frequently a new\n    // array but without any actual changes\n    const {fileResults} = props;\n    const {fileResults: nextFileResults} = nextProps;\n\n    if (fileResults.length !== nextFileResults.length) {\n        return false;\n    }\n\n    for (let i = 0; i < fileResults.length; i++) {\n        // Only need a shallow compare on each file\n        if (fileResults[i] !== nextFileResults[i]) {\n            return false;\n        }\n    }\n\n    return true;\n};\n\nexport default React.memo(SearchResults, arePropsEqual);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getSearchMatches, getSearchResults} from 'mattermost-redux/selectors/entities/posts';\nimport {getSearchFilesResults} from 'mattermost-redux/selectors/entities/files';\nimport * as PreferenceSelectors from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentSearchForCurrentTeam} from 'mattermost-redux/selectors/entities/search';\nimport {Post} from 'mattermost-redux/types/posts';\nimport {FileSearchResultItem} from 'mattermost-redux/types/files';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {\n    getSearchResultsTerms,\n    getIsSearchingTerm,\n    getIsSearchingFlaggedPost,\n    getIsSearchingPinnedPost,\n    getIsSearchGettingMore,\n} from 'selectors/rhs';\nimport {GlobalState} from 'types/store';\nimport {Preferences} from 'utils/constants.jsx';\n\nimport SearchResults from './search_results';\nimport {StateProps, OwnProps} from './types';\n\nfunction makeMapStateToProps() {\n    let results: Post[];\n    let fileResults: FileSearchResultItem[];\n    let files: FileSearchResultItem[] = [];\n    let posts: Post[];\n\n    return function mapStateToProps(state: GlobalState) {\n        const config = getConfig(state);\n\n        const viewArchivedChannels = config.ExperimentalViewArchivedChannels === 'true';\n\n        const newResults = getSearchResults(state);\n\n        // Cache posts and channels\n        if (newResults && newResults !== results) {\n            results = newResults;\n\n            posts = [];\n            results.forEach((post) => {\n                if (!post) {\n                    return;\n                }\n\n                posts.push(post);\n            });\n        }\n\n        const newFilesResults = getSearchFilesResults(state);\n\n        // Cache files and channels\n        if (newFilesResults && newFilesResults !== fileResults) {\n            fileResults = newFilesResults;\n\n            files = [];\n            fileResults.forEach((file) => {\n                if (!file) {\n                    return;\n                }\n\n                const channel = getChannel(state, file.channel_id);\n                if (channel && channel.delete_at !== 0 && !viewArchivedChannels) {\n                    return;\n                }\n\n                files.push(file);\n            });\n        }\n\n        // this is basically a hack to make ts compiler happy\n        // add correct type when it is known what exactly is returned from the function\n        const currentSearch = getCurrentSearchForCurrentTeam(state) as unknown as Record<string, any> || {};\n\n        return {\n            results: posts,\n            fileResults: files,\n            matches: getSearchMatches(state),\n            searchTerms: getSearchResultsTerms(state),\n            isSearchingTerm: getIsSearchingTerm(state),\n            isSearchingFlaggedPost: getIsSearchingFlaggedPost(state),\n            isSearchingPinnedPost: getIsSearchingPinnedPost(state),\n            isSearchGettingMore: getIsSearchGettingMore(state),\n            isSearchAtEnd: currentSearch.isEnd,\n            isSearchFilesAtEnd: currentSearch.isFilesEnd,\n            searchPage: currentSearch.params?.page,\n            compactDisplay: PreferenceSelectors.get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.MESSAGE_DISPLAY, Preferences.MESSAGE_DISPLAY_DEFAULT) === Preferences.MESSAGE_DISPLAY_COMPACT,\n            currentTeamName: getCurrentTeam(state).name,\n        };\n    };\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport default connect<StateProps, {}, OwnProps, GlobalState>(makeMapStateToProps)(SearchResults);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport DayPicker from 'react-day-picker';\n\nimport MomentLocaleUtils from 'react-day-picker/moment';\n\nimport Suggestion from '../suggestion.jsx';\n\nimport 'react-day-picker/lib/style.css';\n\nimport 'moment';\n\nconst loadedLocales: Record<string, moment.Locale> = {};\n\ntype Props = {\n    locale: string;\n}\n\nexport default class SearchDateSuggestion extends Suggestion {\n    handleDayClick = (day: Date) => {\n        const dayString = day.toISOString().split('T')[0];\n        this.props.onClick(dayString, this.props.matchedPretext);\n    }\n\n    componentDidMount() {\n        //the naming scheme of momentjs packages are all lowercases\n        const locale = this.props.locale.toLowerCase();\n\n        // Momentjs use en as defualt, no need to import en\n        if (locale && locale !== 'en' && !loadedLocales[locale]) {\n            /* eslint-disable global-require */\n            loadedLocales[locale] = require(`moment/locale/${locale}`);\n            /* eslint-disable global-require */\n        }\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        const locale = this.props.locale.toLowerCase();\n\n        if (locale && locale !== 'en' && locale !== prevProps.locale && !loadedLocales[locale]) {\n            /* eslint-disable global-require */\n            loadedLocales[locale] = require(`moment/locale/${locale}`);\n            /* eslint-disable global-require */\n        }\n    }\n\n    render() {\n        let modifiers;\n        if (this.props.currentDate) {\n            modifiers = {\n                today: this.props.currentDate,\n            };\n        }\n\n        const locale = this.props.locale.toLowerCase();\n\n        return (\n            <DayPicker\n                onDayClick={this.handleDayClick}\n                showOutsideDays={true}\n                modifiers={modifiers}\n                localeUtils={MomentLocaleUtils}\n                locale={locale}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getUserTimezone} from 'mattermost-redux/selectors/entities/timezone';\n\nimport {getCurrentDateForTimezone} from 'utils/timezone';\nimport {areTimezonesEnabledAndSupported} from 'selectors/general';\nimport {getCurrentLocale} from 'selectors/i18n';\n\nimport {GlobalState} from 'types/store';\n\nimport SearchDateSuggestion from './search_date_suggestion';\n\nfunction mapStateToProps(state: GlobalState) {\n    const currentUserId = getCurrentUserId(state);\n    const userTimezone = getUserTimezone(state, currentUserId);\n    const locale = getCurrentLocale(state);\n\n    const enableTimezone = areTimezonesEnabledAndSupported(state);\n\n    let currentDate;\n    if (enableTimezone) {\n        if (userTimezone.useAutomaticTimezone) {\n            currentDate = getCurrentDateForTimezone(userTimezone.automaticTimezone);\n        } else {\n            currentDate = getCurrentDateForTimezone(userTimezone.manualTimezone);\n        }\n    }\n\n    return {\n        currentDate,\n        locale,\n    };\n}\n\nexport default connect(mapStateToProps)(SearchDateSuggestion);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport Provider from './provider.jsx';\nimport SearchDateSuggestion from './search_date_suggestion';\n\nexport default class SearchDateProvider extends Provider {\n    handlePretextChanged(pretext, resultsCallback) {\n        const captured = (/\\b(?:on|before|after):\\s*(\\S*)$/i).exec(pretext.toLowerCase());\n        if (captured) {\n            const datePrefix = captured[1];\n\n            this.startNewRequest(datePrefix);\n\n            const dates = Object.assign([], [{label: 'Selected Date', date: datePrefix}]);\n            const terms = dates.map((date) => date.date);\n\n            resultsCallback({\n                matchedPretext: datePrefix,\n                terms,\n                items: dates,\n                component: SearchDateSuggestion,\n            });\n        }\n\n        return Boolean(captured);\n    }\n\n    allowDividers() {\n        return false;\n    }\n\n    presentationType() {\n        return 'date';\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\n\nimport {getUserIdFromChannelName} from 'mattermost-redux/utils/channel_utils';\nimport {imageURLForUser} from 'utils/utils.jsx';\nimport Constants from 'utils/constants';\nimport Avatar from 'components/widgets/users/avatar';\nimport BotBadge from 'components/widgets/badges/bot_badge';\nimport Suggestion from '../suggestion';\n\nimport {Channel} from 'mattermost-redux/types/channels';\n\nfunction itemToName(item: Channel, currentUser: string): {icon: React.ReactElement; name: string; description: string} | null {\n    if (item.type === Constants.DM_CHANNEL) {\n        const profilePicture = (\n            <Avatar\n                url={imageURLForUser(getUserIdFromChannelName(currentUser, item.name))}\n                size='sm'\n            />\n        );\n\n        return {\n            icon: profilePicture,\n            name: '@' + item.display_name,\n            description: '',\n        };\n    }\n\n    if (item.type === Constants.GM_CHANNEL) {\n        return {\n            icon: (\n                <span className='suggestion-list__icon suggestion-list__icon--large'>\n                    <div className='status status--group'>{'G'}</div>\n                </span>\n            ),\n            name: '@' + item.display_name.replace(/ /g, ''),\n            description: '',\n        };\n    }\n\n    if (item.type === Constants.OPEN_CHANNEL) {\n        return {\n            icon: (\n                <span className='suggestion-list__icon suggestion-list__icon--large'>\n                    <i className='icon icon--standard icon--no-spacing icon-globe'/>\n                </span>\n            ),\n            name: item.display_name,\n            description: '~' + item.name,\n        };\n    }\n\n    if (item.type === Constants.PRIVATE_CHANNEL) {\n        return {\n            icon: (\n                <span className='suggestion-list__icon suggestion-list__icon--large'>\n                    <i className='icon icon--standard icon--no-spacing icon-lock-outline'/>\n                </span>\n            ),\n            name: item.display_name,\n            description: '~' + item.name,\n        };\n    }\n\n    return null;\n}\n\nexport default class SearchChannelSuggestion extends Suggestion {\n    render(): JSX.Element {\n        const {item, isSelection, teammate, currentUser} = this.props;\n\n        let className = 'suggestion-list__item';\n        if (isSelection) {\n            className += ' suggestion--selected';\n        }\n\n        const nameObject = itemToName(item, currentUser);\n        if (!nameObject) {\n            return (<></>);\n        }\n\n        const {icon, name, description} = nameObject;\n\n        let tag = null;\n        if (item.type === Constants.DM_CHANNEL) {\n            tag = (\n                <BotBadge\n                    show={Boolean(teammate && teammate.is_bot)}\n                    className='badge-popoverlist'\n                />\n            );\n        }\n\n        return (\n            <div\n                onClick={this.handleClick}\n                onMouseMove={this.handleMouseMove}\n                className={className}\n                {...Suggestion.baseProps}\n            >\n                {icon}\n                <div className={'suggestion-list__ellipsis'}>\n                    <span className='suggestion-list__main'>\n                        {name}\n                    </span>\n                    <span className='ml-2'>\n                        {description}\n                    </span>\n                </div>\n                {tag}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {connect} from 'react-redux';\n\nimport {getDirectTeammate} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport {GlobalState} from 'types/store';\n\nimport SearchChannelSuggestion from './search_channel_suggestion';\n\ntype OwnProps = {\n    item: Channel;\n}\n\nconst mapStateToProps = (state: GlobalState, ownProps: OwnProps) => {\n    return {\n        teammate: getDirectTeammate(state, ownProps.item.id),\n        currentUser: getCurrentUserId(state),\n    };\n};\n\nexport default connect(mapStateToProps, null, null, {forwardRef: true})(SearchChannelSuggestion);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {isDirectChannel, isGroupChannel, sortChannelsByTypeListAndDisplayName} from 'mattermost-redux/utils/channel_utils';\n\nimport store from 'stores/redux_store.jsx';\n\nimport Constants from 'utils/constants';\nimport {getCurrentLocale} from 'selectors/i18n';\n\nimport Provider from './provider.jsx';\nimport SearchChannelSuggestion from './search_channel_suggestion';\n\nconst getState = store.getState;\n\nfunction itemToTerm(isAtSearch, item) {\n    const prefix = isAtSearch ? '' : '@';\n    if (item.type === Constants.DM_CHANNEL) {\n        return prefix + item.display_name;\n    }\n    if (item.type === Constants.GM_CHANNEL) {\n        return prefix + item.display_name.replace(/ /g, '');\n    }\n    if (item.type === Constants.OPEN_CHANNEL || item.type === Constants.PRIVATE_CHANNEL) {\n        return item.name;\n    }\n    return item.name;\n}\n\nexport default class SearchChannelProvider extends Provider {\n    constructor(channelSearchFunc) {\n        super();\n        this.autocompleteChannelsForSearch = channelSearchFunc;\n    }\n\n    handlePretextChanged(pretext, resultsCallback) {\n        const captured = (/\\b(?:in|channel):\\s*(\\S*)$/i).exec(pretext.toLowerCase());\n        if (captured) {\n            let channelPrefix = captured[1];\n            const isAtSearch = channelPrefix.startsWith('@');\n            if (isAtSearch) {\n                channelPrefix = channelPrefix.replace(/^@/, '');\n            }\n\n            this.startNewRequest(channelPrefix);\n\n            this.autocompleteChannelsForSearch(\n                channelPrefix,\n                (data) => {\n                    if (this.shouldCancelDispatch(channelPrefix)) {\n                        return;\n                    }\n\n                    let channels = data;\n                    if (isAtSearch) {\n                        channels = channels.filter((ch) => isDirectChannel(ch) || isGroupChannel(ch));\n                    }\n\n                    const locale = getCurrentLocale(getState());\n\n                    channels = channels.sort(sortChannelsByTypeListAndDisplayName.bind(null, locale, [Constants.OPEN_CHANNEL, Constants.PRIVATE_CHANNEL, Constants.DM_CHANNEL, Constants.GM_CHANNEL]));\n                    const channelNames = channels.map(itemToTerm.bind(null, isAtSearch));\n\n                    resultsCallback({\n                        matchedPretext: channelPrefix,\n                        terms: channelNames,\n                        items: channels,\n                        component: SearchChannelSuggestion,\n                    });\n                },\n            );\n        }\n\n        return Boolean(captured);\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport * as Utils from 'utils/utils.jsx';\nimport BotBadge from 'components/widgets/badges/bot_badge';\nimport Avatar from 'components/widgets/users/avatar';\nimport SharedUserIndicator from 'components/shared_user_indicator';\n\nimport Provider from './provider.jsx';\nimport Suggestion from './suggestion.jsx';\n\nclass SearchUserSuggestion extends Suggestion {\n    render() {\n        const {item, isSelection} = this.props;\n\n        let className = 'suggestion-list__item';\n        if (isSelection) {\n            className += ' suggestion--selected';\n        }\n\n        const username = item.username;\n        let description = '';\n\n        if ((item.first_name || item.last_name) && item.nickname) {\n            description = `${Utils.getFullName(item)} (${item.nickname})`;\n        } else if (item.nickname) {\n            description = `(${item.nickname})`;\n        } else if (item.first_name || item.last_name) {\n            description = `${Utils.getFullName(item)}`;\n        }\n\n        let sharedIcon;\n        if (item.remote_id) {\n            sharedIcon = (\n                <SharedUserIndicator\n                    className='mention__shared-user-icon'\n                    withTooltip={true}\n                />\n            );\n        }\n\n        return (\n            <div\n                className={className}\n                ref={(node) => {\n                    this.node = node;\n                }}\n                onClick={this.handleClick}\n                onMouseMove={this.handleMouseMove}\n                {...Suggestion.baseProps}\n            >\n                <Avatar\n                    size='sm'\n                    username={username}\n                    url={Utils.imageURLForUser(item.id, item.last_picture_update)}\n                />\n                <div className='suggestion-list__ellipsis'>\n                    <span className='suggestion-list__main'>\n                        {'@'}{username}\n                    </span>\n                    <BotBadge\n                        show={Boolean(item.is_bot)}\n                        className='badge-autocomplete'\n                    />\n                    <span className='ml-2'>\n                        {description}\n                    </span>\n                </div>\n                {sharedIcon}\n            </div>\n        );\n    }\n}\n\nexport default class SearchUserProvider extends Provider {\n    constructor(userSearchFunc) {\n        super();\n        this.autocompleteUsersInTeam = userSearchFunc;\n    }\n\n    handlePretextChanged(pretext, resultsCallback) {\n        const captured = (/\\bfrom:\\s*(\\S*)$/i).exec(pretext.toLowerCase());\n\n        this.doAutocomplete(captured, resultsCallback);\n\n        return Boolean(captured);\n    }\n\n    async doAutocomplete(captured, resultsCallback) {\n        if (!captured) {\n            return;\n        }\n\n        const usernamePrefix = captured[1];\n\n        this.startNewRequest(usernamePrefix);\n\n        const data = await this.autocompleteUsersInTeam(usernamePrefix);\n\n        if (this.shouldCancelDispatch(usernamePrefix)) {\n            return;\n        }\n\n        const users = Object.assign([], data.users);\n        const mentions = users.map((user) => user.username);\n\n        resultsCallback({\n            matchedPretext: usernamePrefix,\n            terms: mentions,\n            items: users,\n            component: SearchUserSuggestion,\n        });\n    }\n\n    allowDividers() {\n        return true;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ChangeEvent, MouseEvent, FormEvent, useEffect, useState, useRef} from 'react';\nimport {useIntl} from 'react-intl';\nimport classNames from 'classnames';\n\nimport {isServerVersionGreaterThanOrEqualTo} from 'utils/server_version';\nimport {isDesktopApp, getDesktopVersion, isMacApp} from 'utils/user_agent';\nimport Constants, {searchHintOptions, RHSStates, searchFilesHintOptions} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\n\nimport HeaderIconWrapper from 'components/channel_header/components/header_icon_wrapper';\nimport SearchHint from 'components/search_hint/search_hint';\nimport FlagIcon from 'components/widgets/icons/flag_icon';\nimport MentionsIcon from 'components/widgets/icons/mentions_icon';\nimport SearchIcon from 'components/widgets/icons/search_icon';\nimport Popover from 'components/widgets/popover';\nimport UserGuideDropdown from 'components/rhs_search_nav/components/user_guide_dropdown';\n\nimport SearchBar from 'components/search_bar/search_bar';\nimport SearchResults from 'components/search_results';\nimport Provider from 'components/suggestion/provider';\nimport SearchDateProvider from 'components/suggestion/search_date_provider';\nimport SearchChannelProvider from 'components/suggestion/search_channel_provider';\nimport SearchUserProvider from 'components/suggestion/search_user_provider';\nimport type {SearchType} from 'types/store/rhs';\n\nimport type {Props, SearchFilterType} from './types';\n\ninterface SearchHintOption {\n    searchTerm: string;\n    message: {\n        id: string;\n        defaultMessage: string;\n    };\n}\n\nconst determineVisibleSearchHintOptions = (searchTerms: string, searchType: SearchType): SearchHintOption[] => {\n    let newVisibleSearchHintOptions: SearchHintOption[] = [];\n    let options = searchHintOptions;\n    if (searchType === 'files') {\n        options = searchFilesHintOptions;\n    }\n\n    if (searchTerms.trim() === '') {\n        return options;\n    }\n\n    const pretextArray = searchTerms.split(/\\s+/g);\n    const pretext = pretextArray[pretextArray.length - 1];\n    const penultimatePretext = pretextArray[pretextArray.length - 2];\n\n    const shouldShowHintOptions = penultimatePretext ? !options.some(({searchTerm}) => penultimatePretext.toLowerCase().endsWith(searchTerm.toLowerCase())) : !options.some(({searchTerm}) => searchTerms.toLowerCase().endsWith(searchTerm.toLowerCase()));\n\n    if (shouldShowHintOptions) {\n        try {\n            newVisibleSearchHintOptions = options.filter((option) => {\n                return new RegExp(pretext, 'ig').\n                    test(option.searchTerm) && option.searchTerm.toLowerCase() !== pretext.toLowerCase();\n            });\n        } catch {\n            newVisibleSearchHintOptions = [];\n        }\n    }\n\n    return newVisibleSearchHintOptions;\n};\n\nconst Search: React.FC<Props> = (props: Props): JSX.Element => {\n    const {actions, searchTerms, searchType, currentChannel, hideSearchBar, enableFindShortcut, globalHeaderEnabled} = props;\n\n    const intl = useIntl();\n\n    // generate intial component state and setters\n    const [focused, setFocused] = useState<boolean>(false);\n    const [keepInputFocused, setKeepInputFocused] = useState<boolean>(false);\n    const [indexChangedViaKeyPress, setIndexChangedViaKeyPress] = useState<boolean>(false);\n    const [highlightedSearchHintIndex, setHighlightedSearchHintIndex] = useState<number>(-1);\n    const [visibleSearchHintOptions, setVisibleSearchHintOptions] = useState<SearchHintOption[]>(\n        determineVisibleSearchHintOptions(searchTerms, searchType),\n    );\n    const [searchFilterType, setSearchFilterType] = useState<SearchFilterType>('all');\n\n    const suggestionProviders = useRef<Provider[]>([\n        new SearchDateProvider(),\n        new SearchChannelProvider(actions.autocompleteChannelsForSearch),\n        new SearchUserProvider(actions.autocompleteUsersInTeam),\n    ]);\n\n    const isDesktop = isDesktopApp() && isServerVersionGreaterThanOrEqualTo(getDesktopVersion(), '4.7.0');\n    useEffect(() => {\n        if (!enableFindShortcut) {\n            return undefined;\n        }\n\n        const handleKeyDown = (e: KeyboardEvent) => {\n            if (Utils.cmdOrCtrlPressed(e) && Utils.isKeyPressed(e, Constants.KeyCodes.F)) {\n                if (!isDesktop && !e.shiftKey) {\n                    return;\n                }\n\n                // Special case for Mac Desktop xApp where Ctrl+Cmd+F triggers full screen view\n                if (isMacApp() && e.ctrlKey) {\n                    return;\n                }\n\n                e.preventDefault();\n                if (hideSearchBar) {\n                    actions.openRHSSearch();\n                    setKeepInputFocused(true);\n                }\n                actions.updateSearchTermsForShortcut();\n                handleFocus();\n            }\n        };\n\n        document.addEventListener('keydown', handleKeyDown);\n        return () => {\n            document.removeEventListener('keydown', handleKeyDown);\n        };\n    }, [hideSearchBar]);\n\n    useEffect((): void => {\n        if (!Utils.isMobile()) {\n            setVisibleSearchHintOptions(determineVisibleSearchHintOptions(searchTerms, searchType));\n        }\n    }, [searchTerms, searchType]);\n\n    useEffect((): void => {\n        if (!Utils.isMobile() && focused && keepInputFocused) {\n            handleBlur();\n        }\n    }, [searchTerms]);\n\n    useEffect((): void => {\n        if (props.isFocus && !props.isRhsOpen) {\n            handleFocus();\n        } else {\n            handleBlur();\n        }\n    }, [props.isRhsOpen]);\n\n    // handle cloding of rhs-flyout\n    const handleClose = (): void => actions.closeRightHandSide();\n\n    // focus the search input\n    const handleFocus = (): void => setFocused(true);\n\n    // release focus from the search input or unset `keepInputFocused` value\n    // `keepInputFocused` is used to keep the search input focused when a\n    // user selects a suggestion from `SearchHint` with a click\n    const handleBlur = (): void => {\n        // add time out so that the pinned and member buttons are clickable\n        // when focus is released from the search box.\n        setTimeout((): void => {\n            if (keepInputFocused) {\n                setKeepInputFocused(false);\n            } else {\n                setFocused(false);\n            }\n        }, 0);\n\n        updateHighlightedSearchHint();\n    };\n\n    const handleSearchHintSelection = (): void => {\n        if (focused) {\n            setKeepInputFocused(true);\n        } else {\n            setFocused(true);\n        }\n    };\n\n    const handleAddSearchTerm = (term: string): void => {\n        const pretextArray = searchTerms?.split(' ') || [];\n        pretextArray.pop();\n        pretextArray.push(term.toLowerCase());\n        handleUpdateSearchTerms(pretextArray.join(' '));\n    };\n\n    const handleUpdateSearchTerms = (terms: string): void => {\n        actions.updateSearchTerms(terms);\n        updateHighlightedSearchHint();\n    };\n\n    const handleChange = (e: ChangeEvent<HTMLInputElement>): void => {\n        const term = e.target.value;\n        actions.updateSearchTerms(term);\n    };\n\n    // call this function without parameters to reset `SearchHint`\n    const updateHighlightedSearchHint = (indexDelta = 0, changedViaKeyPress = false): void => {\n        if (Math.abs(indexDelta) > 1) {\n            return;\n        }\n\n        let newIndex = highlightedSearchHintIndex + indexDelta;\n\n        switch (indexDelta) {\n        case 1:\n            // KEY.DOWN\n            // is it at the end of the list?\n            newIndex = newIndex === visibleSearchHintOptions.length ? 0 : newIndex;\n            break;\n        case -1:\n            // KEY.UP\n            // is it at the start of the list (or initial value)?\n            newIndex = newIndex < 0 ? visibleSearchHintOptions.length - 1 : newIndex;\n            break;\n        case 0:\n        default:\n            // reset the index (e.g. on blur)\n            newIndex = -1;\n        }\n\n        setHighlightedSearchHintIndex(newIndex);\n        setIndexChangedViaKeyPress(changedViaKeyPress);\n    };\n\n    const handleEnterKey = (e: ChangeEvent<HTMLInputElement>): void => {\n        // only prevent default-behaviour, when one of the conditions is true\n        // when both are false just submit the form (default behaviour) with\n        // `handleSubmit` function called from the `form`\n        if (indexChangedViaKeyPress && !searchType && !searchTerms) {\n            e.preventDefault();\n            setKeepInputFocused(true);\n            actions.updateSearchType(highlightedSearchHintIndex === 0 ? 'messages' : 'files');\n            setHighlightedSearchHintIndex(-1);\n        } else if (indexChangedViaKeyPress) {\n            e.preventDefault();\n            setKeepInputFocused(true);\n            handleAddSearchTerm(visibleSearchHintOptions[highlightedSearchHintIndex].searchTerm);\n        }\n\n        if (props.isMentionSearch) {\n            e.preventDefault();\n            actions.updateRhsState(RHSStates.SEARCH);\n        }\n    };\n\n    const handleSubmit = (e: FormEvent<HTMLFormElement>): void => {\n        e.preventDefault();\n\n        handleSearch().then(() => {\n            setKeepInputFocused(false);\n            setFocused(false);\n        });\n    };\n\n    const handleSearch = async (): Promise<void> => {\n        const terms = searchTerms.trim();\n\n        if (terms.length === 0) {\n            return;\n        }\n\n        const {error} = await actions.showSearchResults(Boolean(props.isMentionSearch));\n\n        if (!error) {\n            handleSearchOnSuccess();\n        }\n    };\n\n    const handleSearchOnSuccess = (): void => {\n        if (Utils.isMobile()) {\n            handleClear();\n        }\n    };\n\n    const handleClear = (): void => {\n        if (props.isMentionSearch) {\n            setFocused(false);\n            actions.updateRhsState(RHSStates.SEARCH);\n        }\n        actions.updateSearchTerms('');\n        actions.updateSearchType('');\n    };\n\n    const handleShrink = (): void => {\n        props.actions.setRhsExpanded(false);\n    };\n\n    const handleSetSearchFilter = (filterType: SearchFilterType): void => {\n        switch (filterType) {\n        case 'documents':\n            props.actions.filterFilesSearchByExt(['doc', 'pdf', 'docx', 'odt', 'rtf', 'txt']);\n            break;\n        case 'spreadsheets':\n            props.actions.filterFilesSearchByExt(['xls', 'xlsx', 'ods']);\n            break;\n        case 'presentations':\n            props.actions.filterFilesSearchByExt(['ppt', 'pptx', 'odp']);\n            break;\n        case 'code':\n            props.actions.filterFilesSearchByExt(['py', 'go', 'java', 'kt', 'c', 'cpp', 'h', 'html', 'js', 'ts', 'cs', 'vb', 'php', 'pl', 'r', 'rb', 'sql', 'swift', 'json']);\n            break;\n        case 'images':\n            props.actions.filterFilesSearchByExt(['png', 'jpg', 'jpeg', 'bmp', 'tiff', 'svg', 'psd', 'xcf']);\n            break;\n        case 'audio':\n            props.actions.filterFilesSearchByExt(['ogg', 'mp3', 'wav', 'flac']);\n            break;\n        case 'video':\n            props.actions.filterFilesSearchByExt(['ogm', 'mp4', 'avi', 'webm', 'mov', 'mkv', 'mpeg', 'mpg']);\n            break;\n        default:\n            props.actions.filterFilesSearchByExt([]);\n        }\n        setSearchFilterType(filterType);\n        if (props.isChannelFiles && currentChannel) {\n            props.actions.showChannelFiles(currentChannel.id);\n        } else {\n            props.actions.showSearchResults(false);\n        }\n    };\n\n    const setHoverHintIndex = (_highlightedSearchHintIndex: number): void => {\n        setHighlightedSearchHintIndex(_highlightedSearchHintIndex);\n        setIndexChangedViaKeyPress(false);\n    };\n\n    const searchMentions = (e: MouseEvent<HTMLButtonElement>): void => {\n        e.preventDefault();\n        if (props.isMentionSearch) {\n            actions.closeRightHandSide();\n            return;\n        }\n        actions.showMentions();\n    };\n\n    const getFlagged = (e: MouseEvent<HTMLButtonElement>): void => {\n        e.preventDefault();\n        if (props.isFlaggedPosts) {\n            actions.closeRightHandSide();\n            return;\n        }\n        actions.showFlaggedPosts();\n    };\n\n    const searchButtonClick = (e: React.MouseEvent) => {\n        e.preventDefault();\n\n        actions.openRHSSearch();\n    };\n\n    const renderMentionButton = (): JSX.Element => (\n        <HeaderIconWrapper\n            iconComponent={\n                <MentionsIcon\n                    className='icon icon--standard'\n                    aria-hidden='true'\n                />\n            }\n            ariaLabel={true}\n            buttonClass={classNames(\n                'channel-header__icon',\n                {'channel-header__icon--active': props.isMentionSearch},\n            )}\n            buttonId={props.isSideBarRight ? 'sbrChannelHeaderMentionButton' : 'channelHeaderMentionButton'}\n            onClick={searchMentions}\n            tooltipKey={'recentMentions'}\n            isRhsOpen={props.isRhsOpen}\n        />\n    );\n\n    const renderFlagBtn = (): JSX.Element => (\n        <HeaderIconWrapper\n            iconComponent={\n                <FlagIcon className='icon icon--standard'/>\n            }\n            ariaLabel={true}\n            buttonClass={classNames(\n                'channel-header__icon ',\n                {'channel-header__icon--active': props.isFlaggedPosts},\n            )}\n            buttonId={props.isSideBarRight ? 'sbrChannelHeaderFlagButton' : 'channelHeaderFlagButton'}\n            onClick={getFlagged}\n            tooltipKey={'flaggedPosts'}\n            isRhsOpen={props.isRhsOpen}\n        />\n    );\n\n    const renderHintPopover = (): JSX.Element => {\n        let termsUsed = 0;\n\n        searchTerms?.split(/[: ]/g).forEach((word: string): void => {\n            let options = searchHintOptions;\n            if (searchType === 'files') {\n                options = searchFilesHintOptions;\n            }\n            if (options.some(({searchTerm}) => searchTerm.toLowerCase() === word.toLowerCase())) {\n                termsUsed++;\n            }\n        });\n\n        if (visibleSearchHintOptions.length === 0 || props.isMentionSearch) {\n            return <></>;\n        }\n\n        const helpClass = `search-help-popover${(focused && termsUsed <= 2) ? ' visible' : ''}`;\n\n        return (\n            <Popover\n                id={`${props.isSideBarRight ? 'sbr-' : ''}searchbar-help-popup`}\n                placement='bottom'\n                className={helpClass}\n            >\n                <SearchHint\n                    options={visibleSearchHintOptions}\n                    withTitle={true}\n                    onOptionSelected={handleAddSearchTerm}\n                    onMouseDown={handleSearchHintSelection}\n                    highlightedIndex={highlightedSearchHintIndex}\n                    onOptionHover={setHoverHintIndex}\n                    onSearchTypeSelected={(searchType || searchTerms) ? undefined : (value: SearchType) => actions.updateSearchType(value)}\n                    searchType={searchType}\n                />\n            </Popover>\n        );\n    };\n\n    const renderSearchBar = (): JSX.Element => (\n        <>\n            <div className='sidebar-collapse__container'>\n                <div\n                    id={props.isSideBarRight ? 'sbrSidebarCollapse' : 'sidebarCollapse'}\n                    className='sidebar-collapse'\n                    onClick={handleClose}\n                >\n                    <span\n                        className='fa fa-2x fa-angle-left'\n                        title={intl.formatMessage({id: 'generic_icons.back', defaultMessage: 'Back Icon'})}\n                    />\n                </div>\n            </div>\n            <SearchBar\n                updateHighlightedSearchHint={updateHighlightedSearchHint}\n                handleEnterKey={handleEnterKey}\n                handleClear={handleClear}\n                handleChange={handleChange}\n                handleSubmit={handleSubmit}\n                handleFocus={handleFocus}\n                handleBlur={handleBlur}\n                keepFocused={keepInputFocused}\n                setKeepFocused={setKeepInputFocused}\n                isFocused={focused}\n                suggestionProviders={suggestionProviders.current}\n                isSideBarRight={props.isSideBarRight}\n                isSearchingTerm={props.isSearchingTerm}\n                isFocus={props.isFocus}\n                getFocus={props.getFocus}\n                searchTerms={searchTerms}\n                searchType={searchType}\n                globalHeaderEnabled={globalHeaderEnabled}\n                clearSearchType={() => actions.updateSearchType('')}\n            >\n                {!Utils.isMobile() && renderHintPopover()}\n            </SearchBar>\n        </>\n    );\n\n    // when inserted in RHSSearchNav component, just return SearchBar\n    if (!props.isSideBarRight) {\n        if (hideSearchBar) {\n            return (\n                <HeaderIconWrapper\n                    iconComponent={\n                        <SearchIcon\n                            className='icon icon--standard'\n                            aria-hidden='true'\n                        />\n                    }\n                    ariaLabel={true}\n                    buttonId={'channelHeaderSearchButton'}\n                    onClick={searchButtonClick}\n                    tooltipKey={'search'}\n                />\n            );\n        }\n\n        return (\n            <div\n                id='searchbarContainer'\n                className={globalHeaderEnabled ? 'search-bar-container--global' : 'search-bar__container flex-child'}\n            >\n                <div className='sidebar-right__table'>\n                    {renderSearchBar()}\n                </div>\n            </div>\n        );\n    }\n\n    return (\n        <div className='sidebar--right__content'>\n            <div className='search-bar__container channel-header alt'>\n                <div className='sidebar-right__table'>\n                    {renderSearchBar()}\n                    {renderMentionButton()}\n                    {renderFlagBtn()}\n                    <UserGuideDropdown/>\n                </div>\n            </div>\n            {props.searchVisible ? (\n                <SearchResults\n                    isMentionSearch={props.isMentionSearch}\n                    isFlaggedPosts={props.isFlaggedPosts}\n                    isPinnedPosts={props.isPinnedPosts}\n                    isChannelFiles={props.isChannelFiles}\n                    shrink={handleShrink}\n                    channelDisplayName={props.channelDisplayName}\n                    isOpened={props.isSideBarRightOpen}\n                    updateSearchTerms={handleAddSearchTerm}\n                    handleSearchHintSelection={handleSearchHintSelection}\n                    isSideBarExpanded={props.isRhsExpanded}\n                    getMorePostsForSearch={props.actions.getMorePostsForSearch}\n                    getMoreFilesForSearch={props.actions.getMoreFilesForSearch}\n                    setSearchFilterType={handleSetSearchFilter}\n                    searchFilterType={searchFilterType}\n                    setSearchType={(value: SearchType) => actions.updateSearchType(value)}\n                    searchType={searchType || 'messages'}\n                />\n            ) : props.children}\n        </div>\n    );\n};\n\nconst defaultProps: Partial<Props> = {\n    searchTerms: '',\n    channelDisplayName: '',\n    isFocus: false,\n    isSideBarRight: false,\n    getFocus: () => {},\n};\n\nSearch.defaultProps = defaultProps;\n\nexport default React.memo(Search);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {AnyAction, bindActionCreators, Dispatch} from 'redux';\n\nimport {getMorePostsForSearch, getMoreFilesForSearch} from 'mattermost-redux/actions/search';\nimport {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\n\nimport {\n    updateSearchTerms,\n    updateSearchTermsForShortcut,\n    showSearchResults,\n    showChannelFiles,\n    showMentions,\n    showFlaggedPosts,\n    closeRightHandSide,\n    updateRhsState,\n    setRhsExpanded,\n    openRHSSearch,\n    filterFilesSearchByExt,\n    updateSearchType,\n} from 'actions/views/rhs';\nimport {autocompleteChannelsForSearch} from 'actions/channel_actions';\nimport {autocompleteUsersInTeam} from 'actions/user_actions';\nimport {getRhsState, getSearchTerms, getSearchType, getIsSearchingTerm, getIsRhsOpen, getIsRhsExpanded} from 'selectors/rhs';\nimport {RHSStates} from 'utils/constants';\nimport {GlobalState} from 'types/store';\nimport {getGlobalHeaderEnabled} from 'selectors/global_header';\n\nimport Search from './search';\nimport type {StateProps, DispatchProps, OwnProps} from './types';\n\nfunction mapStateToProps(state: GlobalState) {\n    const rhsState = getRhsState(state);\n    const currentChannel = getCurrentChannel(state);\n\n    return {\n        currentChannel,\n        isRhsExpanded: getIsRhsExpanded(state),\n        isRhsOpen: getIsRhsOpen(state),\n        isSearchingTerm: getIsSearchingTerm(state),\n        searchTerms: getSearchTerms(state),\n        searchType: getSearchType(state),\n        searchVisible: Boolean(rhsState) && rhsState !== RHSStates.PLUGIN,\n        isMentionSearch: rhsState === RHSStates.MENTION,\n        isFlaggedPosts: rhsState === RHSStates.FLAG,\n        isPinnedPosts: rhsState === RHSStates.PIN,\n        isChannelFiles: rhsState === RHSStates.CHANNEL_FILES,\n        globalHeaderEnabled: getGlobalHeaderEnabled(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<AnyAction>) {\n    return {\n        actions: bindActionCreators({\n            updateSearchTerms,\n            updateSearchTermsForShortcut,\n            updateSearchType,\n            showSearchResults,\n            showChannelFiles,\n            showMentions,\n            showFlaggedPosts,\n            setRhsExpanded,\n            closeRightHandSide,\n            autocompleteChannelsForSearch,\n            autocompleteUsersInTeam,\n            updateRhsState,\n            getMorePostsForSearch,\n            openRHSSearch,\n            getMoreFilesForSearch,\n            filterFilesSearchByExt,\n        }, dispatch),\n    };\n}\n\nexport default connect<StateProps, DispatchProps, OwnProps, GlobalState>(mapStateToProps, mapDispatchToProps)(Search);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport Constants from 'utils/constants';\n\ntype Props = {\n    isExpanded: boolean;\n    children?: React.ReactNode;\n    actions: {\n        closeRightHandSide: () => void;\n        toggleRhsExpanded: () => void;\n    };\n};\n\nexport default class SearchResultsHeader extends React.PureComponent<Props> {\n    render(): React.ReactNode {\n        const closeSidebarTooltip = (\n            <Tooltip id='closeSidebarTooltip'>\n                <FormattedMessage\n                    id='rhs_header.closeSidebarTooltip'\n                    defaultMessage='Close'\n                />\n            </Tooltip>\n        );\n\n        const expandSidebarTooltip = (\n            <Tooltip id='expandSidebarTooltip'>\n                <FormattedMessage\n                    id='rhs_header.expandSidebarTooltip'\n                    defaultMessage='Expand Sidebar'\n                />\n            </Tooltip>\n        );\n\n        const shrinkSidebarTooltip = (\n            <Tooltip id='shrinkSidebarTooltip'>\n                <FormattedMessage\n                    id='rhs_header.collapseSidebarTooltip'\n                    defaultMessage='Collapse Sidebar'\n                />\n            </Tooltip>\n        );\n\n        return (\n            <div className='sidebar--right__header'>\n                <span className='sidebar--right__title'>{this.props.children}</span>\n                <div className='pull-right'>\n                    <OverlayTrigger\n                        delayShow={Constants.OVERLAY_TIME_DELAY}\n                        placement='top'\n                        overlay={this.props.isExpanded ? shrinkSidebarTooltip : expandSidebarTooltip}\n                    >\n                        <button\n                            type='button'\n                            className='sidebar--right__expand btn-icon'\n                            onClick={this.props.actions.toggleRhsExpanded}\n                        >\n                            <FormattedMessage\n                                id='rhs_header.expandSidebarTooltip.icon'\n                                defaultMessage='Expand Sidebar Icon'\n                            >\n                                {(ariaLabel?: string) => (\n                                    <i\n                                        className='icon icon-arrow-expand'\n                                        aria-label={ariaLabel}\n                                    />\n                                )}\n                            </FormattedMessage>\n                            <FormattedMessage\n                                id='rhs_header.collapseSidebarTooltip.icon'\n                                defaultMessage='Collapse Sidebar Icon'\n                            >\n                                {(ariaLabel?: string) => (\n                                    <i\n                                        className='icon icon-arrow-collapse'\n                                        aria-label={ariaLabel}\n                                    />\n                                )}\n                            </FormattedMessage>\n                        </button>\n                    </OverlayTrigger>\n                    <OverlayTrigger\n                        delayShow={Constants.OVERLAY_TIME_DELAY}\n                        placement='top'\n                        overlay={closeSidebarTooltip}\n                    >\n                        <button\n                            id='searchResultsCloseButton'\n                            type='button'\n                            className='sidebar--right__close btn-icon'\n                            aria-label='Close'\n                            onClick={this.props.actions.closeRightHandSide}\n                        >\n                            <FormattedMessage\n                                id='rhs_header.closeTooltip.icon'\n                                defaultMessage='Close Sidebar Icon'\n                            >\n                                {(ariaLabel?: string) => (\n                                    <i\n                                        className='icon icon-close'\n                                        aria-label={ariaLabel}\n                                    />\n                                )}\n                            </FormattedMessage>\n                        </button>\n                    </OverlayTrigger>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {AnyAction, bindActionCreators, Dispatch} from 'redux';\n\nimport {GlobalState} from 'types/store/index.js';\n\nimport {\n    closeRightHandSide,\n    toggleRhsExpanded,\n} from 'actions/views/rhs';\nimport {getIsRhsExpanded} from 'selectors/rhs';\n\nimport SearchResultsHeader from './search_results_header';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        isExpanded: getIsRhsExpanded(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<AnyAction>) {\n    return {\n        actions: bindActionCreators({\n            closeRightHandSide,\n            toggleRhsExpanded,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SearchResultsHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport * as Utils from 'utils/utils.jsx';\nimport ProfilePicture from 'components/profile_picture';\nimport UserProfile from 'components/user_profile';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport Nbsp from 'components/html_entities/nbsp';\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\n\nexport default class UserListRow extends React.PureComponent {\n    static propTypes = {\n        user: PropTypes.object.isRequired,\n        status: PropTypes.string,\n        extraInfo: PropTypes.arrayOf(PropTypes.object),\n        actions: PropTypes.arrayOf(PropTypes.func),\n        actionProps: PropTypes.object,\n        actionUserProps: PropTypes.object,\n        index: PropTypes.number,\n        totalUsers: PropTypes.number,\n        userCount: PropTypes.number,\n    };\n\n    static defaultProps = {\n        extraInfo: [],\n        actions: [],\n        actionProps: {},\n        actionUserProps: {},\n    };\n\n    render() {\n        let buttons = null;\n        if (this.props.actions) {\n            buttons = this.props.actions.map((Action, index) => {\n                return (\n                    <Action\n                        key={index.toString()}\n                        user={this.props.user}\n                        index={this.props.index}\n                        totalUsers={this.props.totalUsers}\n                        {...this.props.actionProps}\n                        {...this.props.actionUserProps}\n                    />\n                );\n            });\n        }\n\n        // QUICK HACK, NEEDS A PROP FOR TOGGLING STATUS\n        let email = this.props.user.email;\n        let emailStyle = 'more-modal__description';\n        let status;\n        if (this.props.extraInfo && this.props.extraInfo.length > 0) {\n            email = (\n                <FormattedMarkdownMessage\n                    id='admin.user_item.emailTitle'\n                    defaultMessage='**Email:** {email}'\n                    values={{\n                        email: this.props.user.email,\n                    }}\n                />\n            );\n            emailStyle = '';\n        } else if (this.props.user.status) {\n            status = this.props.user.status;\n        } else {\n            status = this.props.status;\n        }\n\n        if (this.props.user.is_bot) {\n            status = null;\n            email = null;\n        }\n\n        let userCountID = null;\n        let userCountEmail = null;\n        if (this.props.userCount >= 0) {\n            userCountID = Utils.createSafeId('userListRowName' + this.props.userCount);\n            userCountEmail = Utils.createSafeId('userListRowEmail' + this.props.userCount);\n        }\n\n        return (\n            <div\n                key={this.props.user.id}\n                className='more-modal__row'\n            >\n                <ProfilePicture\n                    src={Client4.getProfilePictureUrl(this.props.user.id, this.props.user.last_picture_update)}\n                    status={status}\n                    size='md'\n                    userId={this.props.user.id}\n                    hasMention={true}\n                    username={this.props.user.username}\n                />\n                <div\n                    className='more-modal__details'\n                    data-testid='userListItemDetails'\n                >\n                    <div className='d-flex whitespace--nowrap'>\n                        <div\n                            id={userCountID}\n                            className='more-modal__name'\n                        >\n                            <UserProfile\n                                userId={this.props.user.id}\n                                hasMention={true}\n                                displayUsername={true}\n                            />\n                            <Nbsp/>\n                            {\n                                this.props.user.first_name || this.props.user.last_name || this.props.user.nickname ?\n                                    '-' : null\n                            }\n                            <Nbsp/>\n                            {Utils.displayFullAndNicknameForUser(this.props.user)}\n                        </div>\n                        <CustomStatusEmoji\n                            userID={this.props.user.id}\n                            emojiSize={15}\n                            showTooltip={true}\n                            emojiStyle={{\n                                marginLeft: 0,\n                                marginBottom: -3,\n                            }}\n                        />\n                    </div>\n                    <div\n                        id={userCountEmail}\n                        className={emailStyle}\n                    >\n                        {email}\n                    </div>\n                    {this.props.extraInfo}\n                </div>\n                <div\n                    data-testid='userListItemActions'\n                    className='more-modal__actions'\n                >\n                    {buttons}\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getStatusForUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport UserListRow from './user_list_row.jsx';\n\nfunction mapStateToProps(state, ownProps) {\n    const user = ownProps.user || {};\n    return {\n        status: getStatusForUserId(state, user.id),\n    };\n}\n\nexport default connect(mapStateToProps)(UserListRow);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport Constants from 'utils/constants';\nimport LoadingScreen from 'components/loading_screen';\n\nimport UserListRow from './user_list_row';\n\nexport default class UserList extends React.PureComponent {\n    static propTypes = {\n        users: PropTypes.arrayOf(PropTypes.object),\n        extraInfo: PropTypes.object,\n        actions: PropTypes.arrayOf(PropTypes.node),\n        actionProps: PropTypes.object,\n        actionUserProps: PropTypes.object,\n        isDisabled: PropTypes.bool,\n\n        // the type of user list row to render\n        rowComponentType: PropTypes.object,\n    }\n\n    static defaultProps = {\n        users: [],\n        extraInfo: {},\n        actions: [],\n        actionProps: {},\n        rowComponentType: UserListRow,\n    }\n\n    constructor(props) {\n        super(props);\n        this.containerRef = React.createRef();\n    }\n\n    scrollToTop = () => {\n        if (this.containerRef.current) {\n            this.containerRef.current.scrollTop = 0;\n        }\n    }\n\n    render() {\n        const users = this.props.users;\n        const RowComponentType = this.props.rowComponentType;\n\n        let content;\n        if (users == null) {\n            return <LoadingScreen/>;\n        } else if (users.length > 0) {\n            content = users.map((user, index) => {\n                return (\n                    <RowComponentType\n                        key={user.id}\n                        user={user}\n                        extraInfo={this.props.extraInfo[user.id]}\n                        actions={this.props.actions}\n                        actionProps={this.props.actionProps}\n                        actionUserProps={this.props.actionUserProps[user.id]}\n                        index={index}\n                        totalUsers={users.length}\n                        userCount={(index >= 0 && index < Constants.TEST_ID_COUNT) ? index : -1}\n                        isDisabled={this.props.isDisabled}\n                    />\n                );\n            });\n        } else {\n            content = (\n                <div\n                    key='no-users-found'\n                    className='more-modal__placeholder-row'\n                    data-testid='noUsersFound'\n                >\n                    <p>\n                        <FormattedMessage\n                            id='user_list.notFound'\n                            defaultMessage='No users found'\n                        />\n                    </p>\n                </div>\n            );\n        }\n\n        return (\n            <div ref={this.containerRef}>\n                {content}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport $ from 'jquery';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport {FormattedMessage, injectIntl} from 'react-intl';\n\nimport QuickInput from 'components/quick_input';\nimport UserList from 'components/user_list.jsx';\nimport LocalizedInput from 'components/localized_input/localized_input';\n\nimport {t} from 'utils/i18n';\n\nconst NEXT_BUTTON_TIMEOUT = 500;\n\nclass SearchableUserList extends React.PureComponent {\n    static propTypes = {\n        users: PropTypes.arrayOf(PropTypes.object),\n        usersPerPage: PropTypes.number,\n        total: PropTypes.number,\n        extraInfo: PropTypes.object,\n        nextPage: PropTypes.func.isRequired,\n        previousPage: PropTypes.func.isRequired,\n        search: PropTypes.func.isRequired,\n        actions: PropTypes.arrayOf(PropTypes.func),\n        actionProps: PropTypes.object,\n        actionUserProps: PropTypes.object,\n        focusOnMount: PropTypes.bool,\n        renderCount: PropTypes.func,\n        filter: PropTypes.string,\n        renderFilterRow: PropTypes.func,\n        page: PropTypes.number.isRequired,\n        term: PropTypes.string.isRequired,\n        onTermChange: PropTypes.func.isRequired,\n        intl: PropTypes.any,\n        isDisabled: PropTypes.bool,\n\n        // the type of user list row to render\n        rowComponentType: PropTypes.func,\n    };\n\n    static defaultProps = {\n        users: [],\n        usersPerPage: 50,\n        extraInfo: {},\n        actions: [],\n        actionProps: {},\n        actionUserProps: {},\n        showTeamToggle: false,\n        focusOnMount: false,\n    };\n\n    constructor(props) {\n        super(props);\n\n        this.nextTimeoutId = 0;\n\n        this.state = {\n            nextDisabled: false,\n        };\n    }\n\n    componentDidMount() {\n        this.focusSearchBar();\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.page !== prevProps.page || this.props.term !== prevProps.term) {\n            this.refs.userList.scrollToTop();\n        }\n    }\n\n    componentWillUnmount() {\n        clearTimeout(this.nextTimeoutId);\n    }\n\n    nextPage = (e) => {\n        e.preventDefault();\n\n        this.setState({nextDisabled: true});\n        this.nextTimeoutId = setTimeout(() => this.setState({nextDisabled: false}), NEXT_BUTTON_TIMEOUT);\n\n        this.props.nextPage();\n        $(ReactDOM.findDOMNode(this.refs.channelListScroll)).scrollTop(0);\n    }\n\n    previousPage = (e) => {\n        e.preventDefault();\n\n        this.props.previousPage();\n        $(ReactDOM.findDOMNode(this.refs.channelListScroll)).scrollTop(0);\n    }\n\n    focusSearchBar = () => {\n        if (this.props.focusOnMount) {\n            this.refs.filter.focus();\n        }\n    }\n\n    handleInput = (e) => {\n        this.props.onTermChange(e.target.value);\n        this.props.search(e.target.value);\n    }\n\n    renderCount = (users) => {\n        if (!users) {\n            return null;\n        }\n\n        if (this.props.filter) {\n            return null;\n        }\n\n        const count = users.length;\n        const total = this.props.total;\n        const isSearch = Boolean(this.props.term);\n\n        let startCount;\n        let endCount;\n        if (isSearch) {\n            startCount = -1;\n            endCount = -1;\n        } else {\n            startCount = this.props.page * this.props.usersPerPage;\n            endCount = Math.min(startCount + this.props.usersPerPage, total);\n            if (this.props.users.length < endCount) {\n                endCount = this.props.users.length;\n            }\n        }\n\n        if (this.props.renderCount) {\n            return this.props.renderCount(count, this.props.total, startCount, endCount, isSearch);\n        }\n\n        if (this.props.total) {\n            if (isSearch) {\n                return (\n                    <FormattedMessage\n                        id='filtered_user_list.countTotal'\n                        defaultMessage='{count, number} {count, plural, one {member} other {members}} of {total, number} total'\n                        values={{\n                            count,\n                            total,\n                        }}\n                    />\n                );\n            }\n\n            return (\n                <FormattedMessage\n                    id='filtered_user_list.countTotalPage'\n                    defaultMessage='{startCount, number} - {endCount, number} {count, plural, one {member} other {members}} of {total, number} total'\n                    values={{\n                        count,\n                        startCount: startCount + 1,\n                        endCount,\n                        total,\n                    }}\n                />\n            );\n        }\n\n        return null;\n    }\n\n    render() {\n        let nextButton;\n        let previousButton;\n        let usersToDisplay;\n        const {formatMessage} = this.props.intl;\n\n        if (this.props.term || !this.props.users) {\n            usersToDisplay = this.props.users;\n        } else if (!this.props.term) {\n            const pageStart = this.props.page * this.props.usersPerPage;\n            let pageEnd = pageStart + this.props.usersPerPage;\n            if (this.props.users.length < pageEnd) {\n                pageEnd = this.props.users.length;\n            }\n\n            usersToDisplay = this.props.users.slice(pageStart, pageEnd);\n\n            if (pageEnd < this.props.total) {\n                nextButton = (\n                    <button\n                        id='searchableUserListNextBtn'\n                        className='btn btn-link filter-control filter-control__next'\n                        onClick={this.nextPage}\n                        disabled={this.state.nextDisabled}\n                    >\n                        <FormattedMessage\n                            id='filtered_user_list.next'\n                            defaultMessage='Next'\n                        />\n                    </button>\n                );\n            }\n\n            if (this.props.page > 0) {\n                previousButton = (\n                    <button\n                        id='searchableUserListPrevBtn'\n                        className='btn btn-link filter-control filter-control__prev'\n                        onClick={this.previousPage}\n                    >\n                        <FormattedMessage\n                            id='filtered_user_list.prev'\n                            defaultMessage='Previous'\n                        />\n                    </button>\n                );\n            }\n        }\n\n        let filterRow;\n        if (this.props.renderFilterRow) {\n            filterRow = this.props.renderFilterRow(this.handleInput);\n        } else {\n            const searchUsersPlaceholder = {id: t('filtered_user_list.search'), defaultMessage: 'Search users'};\n            filterRow = (\n                <div className='col-xs-12'>\n                    <label\n                        className='hidden-label'\n                        htmlFor='searchUsersInput'\n                    >\n                        <FormattedMessage\n                            id='filtered_user_list.search'\n                            defaultMessage='Search users'\n                        />\n                    </label>\n                    <QuickInput\n                        id='searchUsersInput'\n                        ref='filter'\n                        className='form-control filter-textbox'\n                        placeholder={searchUsersPlaceholder}\n                        inputComponent={LocalizedInput}\n                        value={this.props.term}\n                        onInput={this.handleInput}\n                        aria-label={formatMessage(searchUsersPlaceholder).toLowerCase()}\n                    />\n                </div>\n            );\n        }\n\n        return (\n            <div className='filtered-user-list'>\n                <div className='filter-row'>\n                    {filterRow}\n                    <div className='col-sm-12'>\n                        <span\n                            id='searchableUserListTotal'\n                            className='member-count pull-left'\n                            aria-live='polite'\n                        >\n                            {this.renderCount(usersToDisplay)}\n                        </span>\n                    </div>\n                </div>\n                <div className='more-modal__list'>\n                    <UserList\n                        ref='userList'\n                        users={usersToDisplay}\n                        extraInfo={this.props.extraInfo}\n                        actions={this.props.actions}\n                        actionProps={this.props.actionProps}\n                        actionUserProps={this.props.actionUserProps}\n                        rowComponentType={this.props.rowComponentType}\n                        isDisabled={this.props.isDisabled}\n                    />\n                </div>\n                <div className='filter-controls'>\n                    {previousButton}\n                    {nextButton}\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default injectIntl(SearchableUserList);\n/* eslint-enable react/no-string-refs */\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport SearchableUserList from './searchable_user_list.jsx';\n\nexport default class SearchableUserListContainer extends React.PureComponent {\n    static propTypes = {\n        users: PropTypes.arrayOf(PropTypes.object),\n        usersPerPage: PropTypes.number,\n        total: PropTypes.number,\n        extraInfo: PropTypes.object,\n        nextPage: PropTypes.func.isRequired,\n        search: PropTypes.func.isRequired,\n        actions: PropTypes.arrayOf(PropTypes.func),\n        actionProps: PropTypes.object,\n        actionUserProps: PropTypes.object,\n        focusOnMount: PropTypes.bool,\n    };\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            term: '',\n            page: 0,\n        };\n    }\n\n    handleTermChange = (term) => {\n        this.setState({term});\n    }\n\n    nextPage = () => {\n        this.setState({page: this.state.page + 1});\n\n        this.props.nextPage(this.state.page + 1);\n    }\n\n    previousPage = () => {\n        this.setState({page: this.state.page - 1});\n    }\n\n    search = (term) => {\n        this.props.search(term);\n\n        if (term !== '') {\n            this.setState({page: 0});\n        }\n    }\n\n    render() {\n        return (\n            <SearchableUserList\n                {...this.props}\n                nextPage={this.nextPage}\n                previousPage={this.previousPage}\n                search={this.search}\n                page={this.state.page}\n                term={this.state.term}\n                onTermChange={this.handleTermChange}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport SaveButton from 'components/save_button';\nimport Constants from 'utils/constants';\nimport {isKeyPressed} from 'utils/utils.jsx';\n\nexport default class SettingItemMax extends React.PureComponent {\n    static defaultProps = {\n        infoPosition: 'bottom',\n        saving: false,\n        section: '',\n        containerStyle: '',\n    };\n\n    static propTypes = {\n\n        /**\n         * Array of inputs selection\n         */\n        inputs: PropTypes.node,\n\n        /**\n         * Styles for main component\n         */\n        containerStyle: PropTypes.string,\n\n        /**\n         * Client error\n         */\n        clientError: PropTypes.oneOfType([\n            PropTypes.string,\n            PropTypes.object,\n        ]),\n\n        /**\n         * Server error\n         */\n        serverError: PropTypes.string,\n\n        /**\n         * Settings extra information\n         */\n        extraInfo: PropTypes.element,\n\n        /**\n         * Info position\n         */\n        infoPosition: PropTypes.string,\n\n        /**\n         * Settings or tab section\n         */\n        section: PropTypes.string,\n\n        /**\n         * Function to update section\n         */\n        updateSection: PropTypes.func,\n\n        /**\n         * setting to submit\n         */\n        setting: PropTypes.string,\n\n        /**\n         * Function to submit setting\n         */\n        submit: PropTypes.func,\n\n        /**\n         * Disable submit by enter key\n         */\n        disableEnterSubmit: PropTypes.bool,\n\n        /**\n         * Extra information on submit\n         */\n        submitExtra: PropTypes.node,\n\n        /**\n         * Indicates whether setting is on saving\n         */\n        saving: PropTypes.bool,\n\n        /**\n         * Settings title\n         */\n        title: PropTypes.node,\n\n        /**\n         * Settings width\n         */\n        width: PropTypes.string,\n\n        /**\n         * Text of cancel button\n         */\n        cancelButtonText: PropTypes.node,\n\n        /**\n         * Avoid submitting when using SHIFT + ENTER\n         */\n        shiftEnter: PropTypes.bool,\n\n        /**\n         * Text of save button\n         */\n        saveButtonText: PropTypes.string,\n    }\n\n    constructor(props) {\n        super(props);\n        this.settingList = React.createRef();\n    }\n\n    componentDidMount() {\n        if (this.settingList.current) {\n            const focusableElements = this.settingList.current.querySelectorAll('.btn:not(.save-button):not(.btn-cancel), input.form-control, select, textarea, [tabindex]:not([tabindex=\"-1\"])');\n            if (focusableElements.length > 0) {\n                focusableElements[0].focus();\n            } else {\n                this.settingList.current.focus();\n            }\n        }\n\n        document.addEventListener('keydown', this.onKeyDown);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.onKeyDown);\n    }\n\n    onKeyDown = (e) => {\n        if (this.props.shiftEnter && e.keyCode === Constants.KeyCodes.ENTER && e.shiftKey) {\n            return;\n        }\n        if (this.props.disableEnterSubmit !== true && isKeyPressed(e, Constants.KeyCodes.ENTER) && this.props.submit && e.target.tagName !== 'SELECT' && e.target.parentElement && e.target.parentElement.className !== 'react-select__input' && !e.target.classList.contains('btn-cancel') && this.settingList.current && this.settingList.current.contains(e.target)) {\n            this.handleSubmit(e);\n        }\n    }\n\n    handleSubmit = (e) => {\n        e.preventDefault();\n\n        if (this.props.setting) {\n            this.props.submit(this.props.setting);\n        } else {\n            this.props.submit();\n        }\n    }\n\n    handleUpdateSection = (e) => {\n        this.props.updateSection(this.props.section);\n        e.preventDefault();\n    }\n\n    render() {\n        let clientError = null;\n        if (this.props.clientError) {\n            clientError = (\n                <div className='form-group'>\n                    <label\n                        id='clientError'\n                        className='col-sm-12 has-error'\n                    >\n                        {this.props.clientError}\n                    </label>\n                </div>\n            );\n        }\n\n        let serverError = null;\n        if (this.props.serverError) {\n            serverError = (\n                <div className='form-group'>\n                    <label\n                        id='serverError'\n                        className='col-sm-12 has-error'\n                    >\n                        {this.props.serverError}\n                    </label>\n                </div>\n            );\n        }\n\n        let extraInfo = null;\n        let hintClass = 'setting-list__hint';\n        if (this.props.infoPosition === 'top') {\n            hintClass = 'pb-3';\n        }\n\n        if (this.props.extraInfo) {\n            extraInfo = (\n                <div\n                    id='extraInfo'\n                    className={hintClass}\n                >\n                    {this.props.extraInfo}\n                </div>\n            );\n        }\n\n        let submit = '';\n        if (this.props.submit) {\n            submit = (\n                <SaveButton\n                    defaultMessage={this.props.saveButtonText}\n                    saving={this.props.saving}\n                    disabled={this.props.saving}\n                    onClick={this.handleSubmit}\n                />\n            );\n        }\n\n        const inputs = this.props.inputs;\n        let widthClass;\n        if (this.props.width === 'full') {\n            widthClass = 'col-sm-12';\n        } else if (this.props.width === 'medium') {\n            widthClass = 'col-sm-10 col-sm-offset-2';\n        } else {\n            widthClass = 'col-sm-9 col-sm-offset-3';\n        }\n\n        let title;\n        if (this.props.title) {\n            title = (\n                <h4\n                    id='settingTitle'\n                    className='col-sm-12 section-title'\n                >\n                    {this.props.title}\n                </h4>\n            );\n        }\n\n        let listContent = (\n            <div className='setting-list-item'>\n                {inputs}\n                {extraInfo}\n            </div>\n        );\n\n        if (this.props.infoPosition === 'top') {\n            listContent = (\n                <div>\n                    {extraInfo}\n                    {inputs}\n                </div>\n            );\n        }\n\n        let cancelButtonText;\n        if (this.props.cancelButtonText) {\n            cancelButtonText = this.props.cancelButtonText;\n        } else {\n            cancelButtonText = (\n                <FormattedMessage\n                    id='setting_item_max.cancel'\n                    defaultMessage='Cancel'\n                />\n            );\n        }\n\n        return (\n            <section\n                className={`section-max form-horizontal ${this.props.containerStyle}`}\n            >\n                {title}\n                <div className={widthClass}>\n                    <div\n                        tabIndex='-1'\n                        ref={this.settingList}\n                        className='setting-list'\n                    >\n                        {listContent}\n                        <div className='setting-list-item'>\n                            <hr/>\n                            {this.props.submitExtra}\n                            {serverError}\n                            {clientError}\n                            {submit}\n                            <button\n                                id={'cancelSetting'}\n                                className='btn btn-sm btn-cancel cursor--pointer style--none'\n                                onClick={this.handleUpdateSection}\n                            >\n                                {cancelButtonText}\n                            </button>\n                        </div>\n                    </div>\n                </div>\n            </section>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {isMobile} from 'utils/utils.jsx';\nimport EditIcon from 'components/widgets/icons/fa_edit_icon';\n\ninterface Props {\n\n    /**\n     * Settings title\n     */\n    title: JSX.Element | string;\n\n    /**\n     * Option to disable opening the setting\n     */\n    disableOpen?: boolean;\n\n    /**\n     * Settings or tab section\n     */\n    section: string;\n\n    /**\n     * Function to update section\n     */\n    updateSection: (section: string) => void;\n\n    /**\n     * Settings description\n     */\n    describe?: JSX.Element | JSX.Element[] | string;\n\n}\n\nexport default class SettingItemMin extends React.PureComponent<Props> {\n    private edit: HTMLButtonElement | null = null;\n\n    componentDidMount() {\n        if (this.edit) {\n            this.edit.focus();\n        }\n    }\n\n    private getEdit = (node: HTMLButtonElement) => {\n        this.edit = node;\n    }\n\n    handleUpdateSection = (e: React.MouseEvent<HTMLElement>) => {\n        e.preventDefault();\n        this.props.updateSection(this.props.section);\n    }\n\n    render(): JSX.Element {\n        let editButton = null;\n        let describeSection = null;\n\n        if (!this.props.disableOpen && isMobile()) {\n            editButton = (\n                <div className='section-min__edit'>\n                    <button\n                        id={this.props.section + 'Edit'}\n                        className='color--link cursor--pointer style--none'\n                        onClick={this.handleUpdateSection}\n                        ref={this.getEdit}\n                        aria-labelledby={this.props.section + 'Title ' + this.props.section + 'Edit'}\n                    >\n                        <EditIcon/>\n                        {this.props.describe}\n                    </button>\n                </div>\n            );\n        } else if (!this.props.disableOpen) {\n            editButton = (\n                <div className='section-min__edit'>\n                    <button\n                        id={this.props.section + 'Edit'}\n                        className='color--link cursor--pointer style--none text-left'\n                        onClick={this.handleUpdateSection}\n                        ref={this.getEdit}\n                        aria-labelledby={this.props.section + 'Title ' + this.props.section + 'Edit'}\n                    >\n                        <EditIcon/>\n                        <FormattedMessage\n                            id='setting_item_min.edit'\n                            defaultMessage='Edit'\n                        />\n                    </button>\n                </div>\n            );\n\n            describeSection = (\n                <div\n                    id={this.props.section + 'Desc'}\n                    className='section-min__describe'\n                >\n                    {this.props.describe}\n                </div>\n            );\n        }\n\n        return (\n            <div\n                className='section-min'\n                onClick={this.handleUpdateSection}\n            >\n                <div className='d-flex'>\n                    <h4\n                        id={this.props.section + 'Title'}\n                        className='section-min__title'\n                    >\n                        {this.props.title}\n                    </h4>\n                    {editButton}\n                </div>\n                {describeSection}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport SettingItemMin from './setting_item_min';\n\nexport default SettingItemMin;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React, {Component} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Tooltip} from 'react-bootstrap';\n\nimport {Constants} from 'utils/constants';\nimport {localizeMessage} from 'utils/utils.jsx';\nimport * as FileUtils from 'utils/file_utils.jsx';\n\nimport FormError from 'components/form_error';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\nexport default class SettingPicture extends Component {\n    static defaultProps = {\n        imageContext: 'profile',\n    };\n    static propTypes = {\n        clientError: PropTypes.string,\n        serverError: PropTypes.string,\n        src: PropTypes.string,\n        defaultImageSrc: PropTypes.string,\n        file: PropTypes.object,\n        loadingPicture: PropTypes.bool,\n        submitActive: PropTypes.bool,\n        onRemove: PropTypes.func,\n        onSetDefault: PropTypes.func,\n        onSubmit: PropTypes.func,\n        title: PropTypes.string,\n        onFileChange: PropTypes.func,\n        updateSection: PropTypes.func,\n        imageContext: PropTypes.string,\n        maxFileSize: PropTypes.number,\n        helpText: PropTypes.object,\n    };\n\n    constructor(props) {\n        super(props);\n\n        this.settingList = React.createRef();\n        this.selectInput = React.createRef();\n        this.confirmButton = React.createRef();\n\n        this.state = {\n            image: null,\n            removeSrc: false,\n            setDefaultSrc: false,\n        };\n    }\n\n    focusFirstElement() {\n        if (this.settingList.current) {\n            this.settingList.current.focus();\n        }\n    }\n\n    componentDidMount() {\n        this.focusFirstElement();\n\n        if (this.selectInput.current) {\n            this.selectInput.current.addEventListener('input', this.handleFileSelected);\n        }\n    }\n\n    componentDidUpdate(prevProps) {\n        if (prevProps.file !== this.props.file) {\n            this.setPicture(this.props.file);\n        }\n    }\n\n    componentWillUnmount() {\n        if (this.previewBlob) {\n            URL.revokeObjectURL(this.previewBlob);\n        }\n\n        if (this.selectInput.current) {\n            this.selectInput.current.removeEventListener('input', this.handleFileSelected);\n        }\n    }\n\n    handleCancel = (e) => {\n        this.setState({removeSrc: false, setDefaultSrc: false});\n        this.props.updateSection(e);\n    }\n\n    handleFileSelected = () => {\n        if (this.confirmButton.current) {\n            this.confirmButton.current.focus();\n        }\n    }\n\n    handleSave = (e) => {\n        e.preventDefault();\n        if (this.props.loadingPicture) {\n            return;\n        }\n        if (this.state.removeSrc) {\n            this.props.onRemove();\n        } else if (this.state.setDefaultSrc) {\n            this.props.onSetDefault();\n        } else {\n            this.props.onSubmit();\n        }\n    }\n\n    handleRemoveSrc = (e) => {\n        e.preventDefault();\n        this.setState({removeSrc: true});\n        this.focusFirstElement();\n    }\n\n    handleSetDefaultSrc = (e) => {\n        e.preventDefault();\n        this.setState({setDefaultSrc: true});\n        this.focusFirstElement();\n    }\n\n    handleFileChange = (e) => {\n        this.setState({removeSrc: false, setDefaultSrc: false});\n        this.props.onFileChange(e);\n    }\n\n    handleInputFile = () => {\n        this.selectInput.current.value = '';\n        this.selectInput.current.click();\n    }\n\n    setPicture = (file) => {\n        if (file) {\n            this.previewBlob = URL.createObjectURL(file);\n\n            var reader = new FileReader();\n            reader.onload = (e) => {\n                const orientation = FileUtils.getExifOrientation(e.target.result);\n                const orientationStyles = FileUtils.getOrientationStyles(orientation);\n\n                this.setState({\n                    image: this.previewBlob,\n                    orientationStyles,\n                });\n            };\n            reader.readAsArrayBuffer(file);\n        }\n    }\n\n    renderImg = () => {\n        const imageContext = this.props.imageContext;\n\n        if (this.props.file) {\n            const imageStyles = {\n                backgroundImage: 'url(' + this.state.image + ')',\n                ...this.state.orientationStyles,\n            };\n\n            return (\n                <div className={`${imageContext}-img-preview`}>\n                    <div className='img-preview__image'>\n                        <div\n                            alt={`${imageContext} image preview`}\n                            style={imageStyles}\n                            className={`${imageContext}-img-preview`}\n                        />\n                    </div>\n                </div>\n            );\n        }\n\n        if (this.state.setDefaultSrc) {\n            return (\n                <img\n                    className={`${imageContext}-img`}\n                    alt={`${imageContext} image`}\n                    src={this.props.defaultImageSrc}\n                />\n            );\n        }\n\n        if (this.props.src && !this.state.removeSrc) {\n            const imageElement = (\n                <img\n                    className={`${imageContext}-img`}\n                    alt={`${imageContext} image`}\n                    src={this.props.src}\n                />\n            );\n            if (!this.props.onRemove && !this.props.onSetDefault) {\n                return imageElement;\n            }\n\n            let title;\n            let handler;\n            if (this.props.onRemove) {\n                title = (\n                    <FormattedMessage\n                        id='setting_picture.remove'\n                        defaultMessage='Remove This Icon'\n                    />\n                );\n                handler = this.handleRemoveSrc;\n            } else if (this.props.onSetDefault) {\n                title = (\n                    <FormattedMessage\n                        id='setting_picture.remove_profile_picture'\n                        defaultMessage='Remove Profile Picture'\n                    />\n                );\n                handler = this.handleSetDefaultSrc;\n            }\n\n            return (\n                <div className={`${imageContext}-img__container`}>\n                    <div\n                        className='img-preview__image'\n                        aria-hidden={true}\n                    >\n                        {imageElement}\n                    </div>\n                    <OverlayTrigger\n                        delayShow={Constants.OVERLAY_TIME_DELAY}\n                        placement='right'\n                        overlay={(\n                            <Tooltip id='removeIcon'>\n                                <div aria-hidden={true}>\n                                    {title}\n                                </div>\n                            </Tooltip>\n                        )}\n                    >\n                        <button\n                            data-testid='removeSettingPicture'\n                            className={`${imageContext}-img__remove`}\n                            onClick={handler}\n                        >\n                            <span aria-hidden={true}>{'×'}</span>\n                            <span className='sr-only'>{title}</span>\n                        </button>\n                    </OverlayTrigger>\n                </div>\n            );\n        }\n        return null;\n    }\n\n    render() {\n        const img = this.renderImg();\n\n        let confirmButtonClass = 'btn btn-sm';\n        let disableSaveButtonFocus = false;\n        if (this.props.submitActive || this.state.removeSrc || this.state.setDefaultSrc) {\n            confirmButtonClass += ' btn-primary';\n        } else {\n            confirmButtonClass += ' btn-inactive disabled';\n            disableSaveButtonFocus = true;\n        }\n\n        let imgRender;\n        if (img) {\n            imgRender = (\n                <li\n                    className='setting-list-item'\n                    role='presentation'\n                >\n                    {img}\n                </li>\n            );\n        }\n\n        let buttonRender;\n        if (this.props.onSubmit) {\n            buttonRender = (\n                <span>\n                    <input\n                        data-testid='uploadPicture'\n                        ref={this.selectInput}\n                        className='hidden'\n                        accept={Constants.ACCEPT_STATIC_IMAGE}\n                        type='file'\n                        onChange={this.handleFileChange}\n                        disabled={this.props.loadingPicture}\n                        aria-hidden={true}\n                        tabIndex='-1'\n                    />\n                    <button\n                        data-testid='inputSettingPictureButton'\n                        className='btn btn-sm btn-primary btn-file sel-btn'\n                        disabled={this.props.loadingPicture}\n                        onClick={this.handleInputFile}\n                        aria-label={localizeMessage('setting_picture.select', 'Select')}\n                    >\n                        <FormattedMessage\n                            id='setting_picture.select'\n                            defaultMessage='Select'\n                        />\n                    </button>\n                    <button\n                        tabIndex={disableSaveButtonFocus ? '-1' : '0'}\n                        data-testid='saveSettingPicture'\n                        disabled={disableSaveButtonFocus}\n                        ref={this.confirmButton}\n                        className={confirmButtonClass}\n                        onClick={this.handleSave}\n                        aria-label={this.props.loadingPicture ? localizeMessage('setting_picture.uploading', 'Uploading...') : localizeMessage('setting_picture.save', 'Save')}\n                    >\n                        <LoadingWrapper\n                            loading={this.props.loadingPicture}\n                            text={localizeMessage('setting_picture.uploading', 'Uploading...')}\n                        >\n                            <FormattedMessage\n                                id='setting_picture.save'\n                                defaultMessage='Save'\n                            />\n                        </LoadingWrapper>\n                    </button>\n                </span>\n            );\n        }\n        return (\n            <section className='section-max form-horizontal'>\n                <h4 className='col-xs-12 section-title'>\n                    {this.props.title}\n                </h4>\n                <div className='col-xs-offset-3 col-xs-8'>\n                    <div\n                        className='setting-list'\n                        ref={this.settingList}\n                        tabIndex='-1'\n                        aria-label={this.props.title}\n                        aria-describedby='setting-picture__helptext'\n                    >\n                        {imgRender}\n                        <div\n                            id='setting-picture__helptext'\n                            className='setting-list-item pt-3'\n                        >\n                            {this.props.helpText}\n                        </div>\n                        <div\n                            className='setting-list-item'\n                        >\n                            <hr/>\n                            <FormError\n                                errors={[this.props.clientError, this.props.serverError]}\n                                type={'modal'}\n                            />\n                            {buttonRender}\n                            <button\n                                data-testid='cancelSettingPicture'\n                                className='btn btn-link btn-sm theme'\n                                href='#'\n                                onClick={this.handleCancel}\n                                aria-label={localizeMessage('setting_picture.cancel', 'Cancel')}\n                            >\n                                <FormattedMessage\n                                    id='setting_picture.cancel'\n                                    defaultMessage='Cancel'\n                                />\n                            </button>\n                        </div>\n                    </div>\n                </div>\n            </section>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {ChannelType} from 'mattermost-redux/types/channels';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport {Constants} from 'utils/constants';\n\ntype Props = {\n    className?: string;\n    channelType: ChannelType;\n    withTooltip?: boolean;\n};\n\nconst SharedChannelIndicator: React.FC<Props> = (props: Props): JSX.Element => {\n    let sharedIcon;\n    if (props.channelType === Constants.PRIVATE_CHANNEL) {\n        sharedIcon = (<i className={`${props.className || ''} icon-circle-multiple-outline-lock`}/>);\n    } else {\n        sharedIcon = (<i className={`${props.className || ''} icon-circle-multiple-outline`}/>);\n    }\n\n    if (!props.withTooltip) {\n        return sharedIcon;\n    }\n\n    const sharedTooltip = (\n        <Tooltip id='sharedTooltip'>\n            <FormattedMessage\n                id='shared_channel_indicator.tooltip'\n                defaultMessage='Shared with trusted organizations'\n            />\n        </Tooltip>\n    );\n\n    return (\n        <OverlayTrigger\n            delayShow={Constants.OVERLAY_TIME_DELAY}\n            placement='bottom'\n            overlay={sharedTooltip}\n        >\n            {sharedIcon}\n        </OverlayTrigger>\n    );\n};\n\nexport default SharedChannelIndicator;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Tooltip} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport OverlayTrigger from 'components/overlay_trigger';\nimport {Constants} from 'utils/constants';\n\ntype Props = {\n    className?: string;\n    withTooltip?: boolean;\n};\n\nconst SharedUserIndicator: React.FC<Props> = (props: Props): JSX.Element => {\n    const sharedIcon = (<i className={`${props.className || ''} icon-circle-multiple-outline`}/>);\n\n    if (!props.withTooltip) {\n        return sharedIcon;\n    }\n\n    const sharedTooltip = (\n        <Tooltip id='sharedTooltip'>\n            <FormattedMessage\n                id='shared_user_indicator.tooltip'\n                defaultMessage='From trusted organizations'\n            />\n        </Tooltip>\n    );\n\n    return (\n        <OverlayTrigger\n            delayShow={Constants.OVERLAY_TIME_DELAY}\n            placement='bottom'\n            overlay={sharedTooltip}\n        >\n            {sharedIcon}\n        </OverlayTrigger>\n    );\n};\n\nexport default SharedUserIndicator;\n","export default __webpack_public_path__ + \"files/4e8057cd6539f1927c7c20b9c160037a.svg\";","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport classNames from 'classnames';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport {FormattedMessage} from 'react-intl';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message.jsx';\nimport GenericModal from 'components/generic_modal';\nimport closeNextStepsArrow from 'images/close_next_steps_arrow.svg';\nimport * as Utils from 'utils/utils.jsx';\n\nimport './remove_next_steps_modal.scss';\n\ntype Props = {\n    screenTitle: string;\n    globalHeaderEnabled: boolean;\n    onConfirm: () => void;\n    onCancel: () => void;\n}\n\nexport default function RemoveNextStepsModal(props: Props) {\n    const {onConfirm, onCancel, screenTitle, globalHeaderEnabled} = props;\n    const renderGlobalHeaderChanges = globalHeaderEnabled && !Utils.isMobile();\n    const portalRoot = renderGlobalHeaderChanges ? document.getElementById('helpMenuPortal') : document.body;\n    const modalRoot = renderGlobalHeaderChanges ? document.getElementById('channel_view') : document.body;\n\n    return (\n        <>\n            {ReactDOM.createPortal(\n                <div\n                    className={classNames(['RemoveNextStepsModal__helpBox', {'global-header': renderGlobalHeaderChanges, 'mobile-helpbox': Utils.isMobile()}])}\n                >\n                    <img\n                        className='RemoveNextStepsModal__arrow'\n                        src={closeNextStepsArrow}\n                    />\n                    <span className='RemoveNextStepsModal__helpText'>\n                        <FormattedMarkdownMessage\n                            id='remove_next_steps_modal.helpText'\n                            defaultMessage={'Access {title} any time through the {menu} Menu'}\n                            values={{\n                                title: screenTitle,\n                                menu: renderGlobalHeaderChanges ? 'Help' : 'Main',\n                            }}\n                        />\n                    </span>\n                </div>,\n                portalRoot as HTMLElement,\n            )}\n            <GenericModal\n                className='RemoveNextStepsModal'\n                show={true}\n                onHide={onCancel}\n                handleConfirm={onConfirm}\n                handleCancel={onCancel}\n                container={modalRoot}\n                modalHeaderText={(\n                    <FormattedMarkdownMessage\n                        id={'remove_next_steps_modal.header'}\n                        defaultMessage={'Remove {title}?'}\n                        values={{\n                            title: screenTitle,\n                        }}\n                    />\n                )}\n                confirmButtonText={(\n                    <FormattedMessage\n                        id={'remove_next_steps_modal.confirm'}\n                        defaultMessage='Remove'\n                    />\n                )}\n            >\n                <FormattedMessage\n                    id={'remove_next_steps_modal.mainText'}\n                    defaultMessage='This will remove this section from your sidebar, but you can access it later in the {title} section of the {menu} Menu.'\n                    values={{\n                        title: screenTitle,\n                        menu: renderGlobalHeaderChanges ? 'Help' : 'Main',\n                    }}\n                />\n            </GenericModal>\n        </>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport {localizeMessage} from 'utils/utils.jsx';\nimport LoadingImagePreview from 'components/loading_image_preview';\n\nconst MIN_IMAGE_SIZE = 48;\n\n// SizeAwareImage is a component used for rendering images where the dimensions of the image are important for\n// ensuring that the page is laid out correctly.\nexport default class SizeAwareImage extends React.PureComponent {\n    static propTypes = {\n\n        /*\n         * The source URL of the image\n         */\n        src: PropTypes.string.isRequired,\n\n        /*\n         * dimensions object to create empty space required to prevent scroll pop\n         */\n        dimensions: PropTypes.object,\n        fileInfo: PropTypes.object,\n\n        /*\n         * Boolean value to pass for showing a loader when image is being loaded\n         */\n        showLoader: PropTypes.bool,\n\n        /*\n         * A callback that is called as soon as the image component has a height value\n         */\n        onImageLoaded: PropTypes.func,\n\n        /*\n         * A callback that is called when image load fails\n         */\n        onImageLoadFail: PropTypes.func,\n\n        /*\n         * Fetch the onClick function\n         */\n        onClick: PropTypes.func,\n\n        /*\n         * css classes that can added to the img as well as parent div on svg for placeholder\n         */\n        className: PropTypes.string,\n\n        /*\n         * Enables the logic of surrounding small images with a bigger container div for better click/tap targeting\n         */\n        handleSmallImageContainer: PropTypes.bool,\n    }\n\n    constructor(props) {\n        super(props);\n        const {dimensions} = props;\n\n        this.state = {\n            loaded: false,\n            isSmallImage: this.dimensionsAvailable(dimensions) ? this.isSmallImage(\n                dimensions.width, dimensions.height) : false,\n        };\n\n        this.heightTimeout = 0;\n    }\n\n    componentDidMount() {\n        this.mounted = true;\n    }\n\n    componentWillUnmount() {\n        this.mounted = false;\n    }\n\n    dimensionsAvailable = (dimensions) => {\n        return dimensions && dimensions.width && dimensions.height;\n    }\n\n    isSmallImage = (width, height) => {\n        return width < MIN_IMAGE_SIZE || height < MIN_IMAGE_SIZE;\n    }\n\n    handleLoad = (event) => {\n        if (this.mounted) {\n            const image = event.target;\n            const isSmallImage = this.isSmallImage(image.naturalWidth, image.naturalHeight);\n            this.setState({\n                loaded: true,\n                error: false,\n                isSmallImage,\n                imageWidth: image.naturalWidth,\n            }, () => { // Call onImageLoaded prop only after state has already been set\n                if (this.props.onImageLoaded && image.naturalHeight) {\n                    this.props.onImageLoaded({height: image.naturalHeight, width: image.naturalWidth});\n                }\n            });\n        }\n    };\n\n    handleError = () => {\n        if (this.mounted) {\n            if (this.props.onImageLoadFail) {\n                this.props.onImageLoadFail();\n            }\n            this.setState({error: true});\n        }\n    };\n\n    onEnterKeyDown = (e) => {\n        if (e.key === 'Enter') {\n            this.props.onClick(e);\n        }\n    }\n\n    renderImageLoaderIfNeeded = () => {\n        if (!this.state.loaded && this.props.showLoader && !this.state.error) {\n            return (\n                <div style={{position: 'absolute', top: '50%', transform: 'translate(-50%, -50%)', left: '50%'}}>\n                    <LoadingImagePreview\n                        containerClass={'file__image-loading'}\n                    />\n                </div>\n            );\n        }\n        return null;\n    }\n\n    renderImageWithContainerIfNeeded = () => {\n        const {\n            fileInfo,\n            src,\n            ...props\n        } = this.props;\n\n        Reflect.deleteProperty(props, 'showLoader');\n        Reflect.deleteProperty(props, 'onImageLoaded');\n        Reflect.deleteProperty(props, 'onImageLoadFail');\n        Reflect.deleteProperty(props, 'dimensions');\n        Reflect.deleteProperty(props, 'handleSmallImageContainer');\n\n        let ariaLabelImage = localizeMessage('file_attachment.thumbnail', 'file thumbnail');\n        if (fileInfo) {\n            ariaLabelImage += ` ${fileInfo.name}`.toLowerCase();\n        }\n\n        const image = (\n            <img\n                {...props}\n                aria-label={ariaLabelImage}\n                tabIndex='0'\n                onKeyDown={this.onEnterKeyDown}\n                className={\n                    this.props.className +\n                    (this.props.handleSmallImageContainer &&\n                        this.state.isSmallImage ? ' small-image--inside-container' : '')}\n                src={src}\n                onError={this.handleError}\n                onLoad={this.handleLoad}\n            />\n        );\n\n        if (this.props.handleSmallImageContainer && this.state.isSmallImage) {\n            let className = 'small-image__container cursor--pointer a11y--active';\n            if (this.state.imageWidth < MIN_IMAGE_SIZE) {\n                className += ' small-image__container--min-width';\n            }\n\n            return (\n                <div\n                    onClick={this.props.onClick}\n                    className={className}\n                    style={this.state.imageWidth > MIN_IMAGE_SIZE ? {\n                        width: this.state.imageWidth + 2, // 2px to account for the border\n                    } : {}}\n                >\n                    {image}\n                </div>\n            );\n        }\n\n        return image;\n    }\n\n    renderImageOrPlaceholder = () => {\n        const {\n            dimensions,\n        } = this.props;\n\n        let placeHolder;\n\n        if (this.dimensionsAvailable(dimensions) && !this.state.loaded) {\n            placeHolder = (\n                <div\n                    className={`image-loading__container ${this.props.className}`}\n                    style={{maxWidth: dimensions.width}}\n                >\n                    {this.renderImageLoaderIfNeeded()}\n                    <svg\n                        xmlns='http://www.w3.org/2000/svg'\n                        viewBox={`0 0 ${dimensions.width} ${dimensions.height}`}\n                        style={{maxHeight: dimensions.height, maxWidth: dimensions.width, verticalAlign: 'middle'}}\n                    />\n                </div>\n            );\n        }\n\n        const shouldShowImg = !this.dimensionsAvailable(dimensions) || this.state.loaded;\n\n        return (\n            <React.Fragment>\n                {placeHolder}\n                <div\n                    className='file-preview__button'\n                    style={{display: shouldShowImg ? 'initial' : 'none'}}\n                >\n                    {this.renderImageWithContainerIfNeeded()}\n                </div>\n            </React.Fragment>\n        );\n    }\n\n    render() {\n        return (\n            this.renderImageOrPlaceholder()\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent, ReactNode} from 'react';\n\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\ntype Props = {\n    children?: ReactNode;\n    spinning: boolean;\n    spinningText: ReactNode;\n    onClick?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n}\n\nexport default class SpinnerButton extends PureComponent<Props & React.ButtonHTMLAttributes<HTMLButtonElement>> {\n    public static defaultProps: Partial<Props> = {\n        spinning: false,\n    }\n\n    public render(): JSX.Element {\n        const {spinning, spinningText, children, ...props} = this.props; // eslint-disable-line no-use-before-define\n\n        return (\n            <button\n                disabled={spinning}\n                {...props}\n            >\n                <LoadingWrapper\n                    loading={spinning}\n                    text={spinningText}\n                >\n                    {children}\n                </LoadingWrapper>\n            </button>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusAwayAvatarIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='13px'\n                height='13px'\n                viewBox='0 0 12 12'\n                style={style}\n                role='img'\n                aria-label={formatMessage({id: 'mobile.set_status.away.icon', defaultMessage: 'Away Icon'})}\n            >\n                <path\n                    className='away--icon'\n                    d='M9.081,5.712C9.267,5.712 9.417,5.863 9.417,6.048L9.417,9.086L11.864,10.499C12.025,10.592 12.08,10.797 11.987,10.958L11.482,11.832C11.39,11.993 11.184,12.048 11.023,11.955L7.904,10.154C7.788,10.087 7.727,9.961 7.737,9.836C7.736,9.827 7.736,9.818 7.736,9.809L7.736,6.048C7.736,5.863 7.886,5.712 8.072,5.712L9.081,5.712ZM4.812,11.513L4.605,11.513C2.325,11.41 0.253,10.374 0.046,9.027C-0.058,8.923 0.046,8.509 0.046,8.405C0.15,7.576 0.357,6.437 0.771,5.815C0.978,5.401 2.015,5.297 2.015,5.297C2.015,5.297 2.015,7.369 4.605,7.369L5.019,7.369C4.915,7.784 4.812,8.198 4.812,8.612C4.812,9.648 5.226,10.581 5.848,11.41C5.537,11.513 5.123,11.513 4.812,11.513ZM4.605,0.117C6.034,0.117 7.195,1.277 7.195,2.707C7.195,4.136 6.034,5.297 4.605,5.297C3.175,5.297 2.015,4.136 2.015,2.707C2.015,1.277 3.175,0.117 4.605,0.117Z'\n                />\n            </svg>\n        </span>\n    );\n}\n\nconst style: CSSProperties = {\n    fillRule: 'evenodd',\n    clipRule: 'evenodd',\n    strokeLinejoin: 'round',\n    strokeMiterlimit: 1.41421,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusAwayIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='100%'\n                height='100%'\n                viewBox='0 0 20 20'\n                style={style}\n                role='img'\n                aria-label={formatMessage({id: 'mobile.set_status.away.icon', defaultMessage: 'Away Icon'})}\n            >\n                <path\n                    className='away--icon'\n                    d='M10,0C15.519,0 20,4.481 20,10C20,15.519 15.519,20 10,20C4.481,20 0,15.519 0,10C0,4.481 4.481,0 10,0ZM10.27,3C10.949,3 11.5,3.586 11.5,4.307L11.5,9.379L15.002,12.881C15.492,13.37 15.499,14.158 15.019,14.638L14.638,15.019C14.158,15.499 13.37,15.492 12.881,15.002L8.887,11.008C8.739,10.861 8.636,10.686 8.576,10.501C8.528,10.402 8.5,10.299 8.5,10.193L8.5,4.307C8.5,3.586 9.051,3 9.73,3L10.27,3Z'\n                />\n            </svg>\n        </span>\n    );\n}\n\nconst style: CSSProperties = {\n    fillRule: 'evenodd',\n    clipRule: 'evenodd',\n    strokeLinejoin: 'round',\n    strokeMiterlimit: 1.41421,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusDndAvatarIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                x='0px'\n                y='0px'\n                width='13px'\n                height='13px'\n                viewBox='-299 391 12 12'\n                enableBackground='new -299 391 12 12'\n                role='img'\n                aria-label={formatMessage({id: 'mobile.set_status.dnd.icon', defaultMessage: 'Do Not Disturb Icon'})}\n            >\n                <g>\n                    <ellipse\n                        className='dnd--icon'\n                        cx='-294.6'\n                        cy='394'\n                        rx='2.5'\n                        ry='2.5'\n                    />\n                    <path\n                        className='dnd--icon'\n                        d='M-293.8,399.4c0-0.4,0.1-0.7,0.2-1c-0.3,0.1-0.6,0.2-1,0.2c-2.5,0-2.5-2-2.5-2s-1,0.1-1.2,0.5c-0.4,0.6-0.6,1.7-0.7,2.5 c0,0.1-0.1,0.5,0,0.6c0.2,1.3,2.2,2.3,4.4,2.4c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0c0.7,0,1.4-0.1,2-0.3 C-293.3,401.5-293.8,400.5-293.8,399.4z'\n                    />\n                </g>\n                <path\n                    className='dnd--icon'\n                    d='M-287,400c0,0.1-0.1,0.1-0.1,0.1l-4.9,0c-0.1,0-0.1-0.1-0.1-0.1v-1.6c0-0.1,0.1-0.1,0.1-0.1l4.9,0c0.1,0,0.1,0.1,0.1,0.1 V400z'\n                />\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusDndIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='100%'\n                height='100%'\n                viewBox='0 0 20 20'\n                style={style}\n                role='img'\n                aria-label={formatMessage({id: 'mobile.set_status.dnd.icon', defaultMessage: 'Do Not Disturb Icon'})}\n            >\n                <path\n                    className='dnd--icon'\n                    d='M10,0c5.519,0 10,4.481 10,10c0,5.519 -4.481,10 -10,10c-5.519,0 -10,-4.481 -10,-10c0,-5.519 4.481,-10 10,-10Zm5.25,8.5l-10.5,0c-0.414,0 -0.75,0.336 -0.75,0.75l0,1.5c0,0.414 0.336,0.75 0.75,0.75l10.5,0c0.414,0 0.75,-0.336 0.75,-0.75l0,-1.5c0,-0.414 -0.336,-0.75 -0.75,-0.75Z'\n                />\n            </svg>\n        </span>\n    );\n}\n\nconst style: CSSProperties = {\n    fillRule: 'evenodd',\n    clipRule: 'evenodd',\n    strokeLinejoin: 'round',\n    strokeMiterlimit: 1.41421,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusDndAvatarIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                x='0px'\n                y='0px'\n                width='13px'\n                height='13px'\n                viewBox='-299 391 12 12'\n                enableBackground='new -299 391 12 12'\n                role='img'\n                aria-label={formatMessage({id: 'mobile.set_status.offline.icon', defaultMessage: 'Offline Icon'})}\n            >\n                <g>\n                    <g>\n                        <ellipse\n                            className='offline--icon'\n                            cx='-294.5'\n                            cy='394'\n                            rx='2.5'\n                            ry='2.5'\n                        />\n                        <path\n                            className='offline--icon'\n                            d='M-294.3,399.7c0-0.4,0.1-0.8,0.2-1.2c-0.1,0-0.2,0-0.4,0c-2.5,0-2.5-2-2.5-2s-1,0.1-1.2,0.5c-0.4,0.6-0.6,1.7-0.7,2.5 c0,0.1-0.1,0.5,0,0.6c0.2,1.3,2.2,2.3,4.4,2.4h0.1h0.1c0.3,0,0.7,0,1-0.1C-293.9,401.6-294.3,400.7-294.3,399.7z'\n                        />\n                    </g>\n                </g>\n                <g>\n                    <path\n                        className='offline--icon'\n                        d='M-288.9,399.4l1.8-1.8c0.1-0.1,0.1-0.3,0-0.3l-0.7-0.7c-0.1-0.1-0.3-0.1-0.3,0l-1.8,1.8l-1.8-1.8c-0.1-0.1-0.3-0.1-0.3,0 l-0.7,0.7c-0.1,0.1-0.1,0.3,0,0.3l1.8,1.8l-1.8,1.8c-0.1,0.1-0.1,0.3,0,0.3l0.7,0.7c0.1,0.1,0.3,0.1,0.3,0l1.8-1.8l1.8,1.8 c0.1,0.1,0.3,0.1,0.3,0l0.7-0.7c0.1-0.1,0.1-0.3,0-0.3L-288.9,399.4z'\n                    />\n                </g>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusOfflineIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='100%'\n                height='100%'\n                className='offline--icon'\n                viewBox='0 0 20 20'\n                style={style}\n                role='img'\n                aria-label={formatMessage({id: 'mobile.set_status.offline.icon', defaultMessage: 'Offline Icon'})}\n            >\n                <path d='M10,0c5.519,0 10,4.481 10,10c0,5.519 -4.481,10 -10,10c-5.519,0 -10,-4.481 -10,-10c0,-5.519 4.481,-10 10,-10Zm0,2c4.415,0 8,3.585 8,8c0,4.415 -3.585,8 -8,8c-4.415,0 -8,-3.585 -8,-8c0,-4.415 3.585,-8 8,-8Z'/>\n            </svg>\n        </span>\n    );\n}\n\nconst style: CSSProperties = {\n    fillRule: 'evenodd',\n    clipRule: 'evenodd',\n    strokeLinejoin: 'round',\n    strokeMiterlimit: 1.41421,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusOnlineAvatarIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                x='0px'\n                y='0px'\n                width='13px'\n                height='13px'\n                viewBox='-243 245 12 12'\n                enableBackground='new -243 245 12 12'\n                role='img'\n                aria-label={formatMessage({id: 'mobile.set_status.online.icon', defaultMessage: 'Online Icon'})}\n            >\n                <g>\n                    <path\n                        className='online--icon'\n                        d='M-236,250.5C-236,250.5-236,250.5-236,250.5C-236,250.5-236,250.5-236,250.5C-236,250.5-236,250.5-236,250.5z'\n                    />\n                    <ellipse\n                        className='online--icon'\n                        cx='-238.5'\n                        cy='248'\n                        rx='2.5'\n                        ry='2.5'\n                    />\n                </g>\n                <path\n                    className='online--icon'\n                    d='M-238.9,253.8c0-0.4,0.1-0.9,0.2-1.3c-2.2-0.2-2.2-2-2.2-2s-1,0.1-1.2,0.5c-0.4,0.6-0.6,1.7-0.7,2.5c0,0.1-0.1,0.5,0,0.6 c0.2,1.3,2.2,2.3,4.4,2.4c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0C-238.7,255.7-238.9,254.8-238.9,253.8z'\n                />\n                <g>\n                    <g>\n                        <path\n                            className='online--icon'\n                            d='M-232.3,250.1l1.3,1.3c0,0,0,0.1,0,0.1l-4.1,4.1c0,0,0,0-0.1,0c0,0,0,0,0,0l-2.7-2.7c0,0,0-0.1,0-0.1l1.2-1.2 c0,0,0.1,0,0.1,0l1.4,1.4l2.9-2.9C-232.4,250.1-232.3,250.1-232.3,250.1z'\n                        />\n                    </g>\n                </g>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusOnlineIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='100%'\n                height='100%'\n                viewBox='0 0 20 20'\n                style={style}\n                role='img'\n                aria-label={formatMessage({id: 'mobile.set_status.online.icon', defaultMessage: 'Online Icon'})}\n            >\n                <path\n                    className='online--icon'\n                    d='M10,0c5.519,0 10,4.481 10,10c0,5.519 -4.481,10 -10,10c-5.519,0 -10,-4.481 -10,-10c0,-5.519 4.481,-10 10,-10Zm6.19,7.18c0,0.208 -0.075,0.384 -0.224,0.53l-5.782,5.64l-1.087,1.059c-0.149,0.146 -0.33,0.218 -0.543,0.218c-0.213,0 -0.394,-0.072 -0.543,-0.218l-1.086,-1.059l-2.891,-2.82c-0.149,-0.146 -0.224,-0.322 -0.224,-0.53c0,-0.208 0.075,-0.384 0.224,-0.53l1.086,-1.059c0.149,-0.146 0.33,-0.218 0.543,-0.218c0.213,0 0.394,0.072 0.543,0.218l2.348,2.298l5.24,-5.118c0.149,-0.146 0.33,-0.218 0.543,-0.218c0.213,0 0.394,0.072 0.543,0.218l1.086,1.059c0.149,0.146 0.224,0.322 0.224,0.53Z'\n                />\n            </svg>\n        </span>\n    );\n}\n\nconst style: CSSProperties = {\n    fillRule: 'evenodd',\n    clipRule: 'evenodd',\n    strokeLinejoin: 'round',\n    strokeMiterlimit: 1.41421,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport StatusAwayAvatarIcon from 'components/widgets/icons/status_away_avatar_icon';\nimport StatusAwayIcon from 'components/widgets/icons/status_away_icon';\nimport StatusDndAvatarIcon from 'components/widgets/icons/status_dnd_avatar_icon';\nimport StatusDndIcon from 'components/widgets/icons/status_dnd_icon';\nimport StatusOfflineAvatarIcon from 'components/widgets/icons/status_offline_avatar_icon';\nimport StatusOfflineIcon from 'components/widgets/icons/status_offline_icon';\nimport StatusOnlineAvatarIcon from 'components/widgets/icons/status_online_avatar_icon';\nimport StatusOnlineIcon from 'components/widgets/icons/status_online_icon';\n\ntype Props = {\n    button?: boolean;\n    status?: string;\n    className?: string;\n    type?: string;\n}\n\nexport default class StatusIcon extends React.PureComponent<Props> {\n    static defaultProps = {\n        className: '',\n        button: false,\n    };\n\n    render() {\n        const {button, status, type} = this.props;\n\n        if (!status) {\n            return null;\n        }\n\n        let className = 'status ' + this.props.className;\n\n        if (button) {\n            className = this.props.className || '';\n        }\n\n        let IconComponent: React.ComponentType<{className?: string}> | string;\n        const iconComponentProps = {className};\n        if (type === 'avatar') {\n            if (status === 'online') {\n                IconComponent = StatusOnlineAvatarIcon;\n            } else if (status === 'away') {\n                IconComponent = StatusAwayAvatarIcon;\n            } else if (status === 'dnd') {\n                IconComponent = StatusDndAvatarIcon;\n            } else {\n                IconComponent = StatusOfflineAvatarIcon;\n            }\n        } else if (status === 'online') {\n            IconComponent = StatusOnlineIcon;\n        } else if (status === 'away') {\n            IconComponent = StatusAwayIcon;\n        } else if (status === 'dnd') {\n            IconComponent = StatusDndIcon;\n        } else {\n            IconComponent = StatusOfflineIcon;\n        }\n\n        return <IconComponent {...iconComponentProps}/>;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {\n    autocompleteChannels,\n    AutocompleteSuggestion,\n    autocompleteUsersInChannel,\n    Channel,\n    COMMAND_SUGGESTION_CHANNEL,\n    COMMAND_SUGGESTION_USER,\n    DispatchFunc,\n    GlobalState,\n    UserAutocomplete,\n    UserProfile,\n} from '../app_command_parser/app_command_parser_dependencies';\n\ninterface Store {\n    dispatch: DispatchFunc;\n    getState: () => GlobalState;\n}\n\nexport async function inTextMentionSuggestions(pretext: string, store: Store, channelID: string, teamID: string, delimiter = ''): Promise<AutocompleteSuggestion[] | null> {\n    const separatedWords = pretext.split(' ');\n    const incompleteLessLastWord = separatedWords.slice(0, -1).join(' ');\n    const lastWord = separatedWords[separatedWords.length - 1];\n    if (lastWord.startsWith('@')) {\n        const {data} = await store.dispatch(autocompleteUsersInChannel(lastWord.substring(1), channelID));\n        const users = await getUserSuggestions(data);\n        users.forEach((u) => {\n            let complete = incompleteLessLastWord ? incompleteLessLastWord + ' ' + u.Complete : u.Complete;\n            if (delimiter) {\n                complete = delimiter + complete;\n            }\n            u.Complete = complete;\n        });\n        return users;\n    }\n\n    if (lastWord.startsWith('~') && !lastWord.startsWith('~~')) {\n        const {data} = await store.dispatch(autocompleteChannels(teamID, lastWord.substring(1)));\n        const channels = await getChannelSuggestions(data);\n        channels.forEach((c) => {\n            let complete = incompleteLessLastWord ? incompleteLessLastWord + ' ' + c.Complete : c.Complete;\n            if (delimiter) {\n                complete = delimiter + complete;\n            }\n            c.Complete = complete;\n        });\n        return channels;\n    }\n\n    return null;\n}\n\nexport async function getUserSuggestions(usersAutocomplete?: UserAutocomplete): Promise<AutocompleteSuggestion[]> {\n    const notFoundSuggestions = [{\n        Complete: '',\n        Suggestion: '',\n        Description: 'No user found',\n        Hint: '',\n        IconData: '',\n    }];\n    if (!usersAutocomplete) {\n        return notFoundSuggestions;\n    }\n\n    if (!usersAutocomplete.users.length && !usersAutocomplete.out_of_channel?.length) {\n        return notFoundSuggestions;\n    }\n\n    const items: AutocompleteSuggestion[] = [];\n    usersAutocomplete.users.forEach((u) => {\n        items.push(getUserSuggestion(u));\n    });\n    usersAutocomplete.out_of_channel?.forEach((u) => {\n        items.push(getUserSuggestion(u));\n    });\n\n    return items;\n}\n\nexport async function getChannelSuggestions(channels?: Channel[]): Promise<AutocompleteSuggestion[]> {\n    const notFoundSuggestion = [{\n        Complete: '',\n        Suggestion: '',\n        Description: 'No channel found',\n        Hint: '',\n        IconData: '',\n    }];\n    if (!channels) {\n        return notFoundSuggestion;\n    }\n    if (!channels.length) {\n        return notFoundSuggestion;\n    }\n\n    const items = channels.map((c) => {\n        return {\n            Complete: '~' + c.name,\n            Suggestion: c.name,\n            Description: '',\n            Hint: '',\n            IconData: '',\n            type: COMMAND_SUGGESTION_CHANNEL,\n            item: c,\n        };\n    });\n\n    return items;\n}\n\nfunction getUserSuggestion(u: UserProfile) {\n    return {\n        Complete: '@' + u.username,\n        Suggestion: u.username,\n        Description: '',\n        Hint: '',\n        IconData: '',\n        type: COMMAND_SUGGESTION_USER,\n        item: u,\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/* eslint-disable max-lines */\n\nimport {getChannelSuggestions, getUserSuggestions, inTextMentionSuggestions} from '../mentions';\n\nimport {\n    AppCallRequest,\n    AppBinding,\n    AppField,\n    DoAppCallResult,\n    AppLookupResponse,\n    AppContext,\n    AppForm,\n    AppCallValues,\n    AppSelectOption,\n    AutocompleteSuggestion,\n    AutocompleteStaticSelect,\n    Channel,\n    DispatchFunc,\n    GlobalState,\n\n    AppBindingLocations,\n    AppCallResponseTypes,\n    AppCallTypes,\n    AppFieldTypes,\n    makeAppBindingsSelector,\n    selectChannel,\n    getChannel,\n    getCurrentTeamId,\n    doAppCall,\n    getStore,\n    EXECUTE_CURRENT_COMMAND_ITEM_ID,\n    COMMAND_SUGGESTION_ERROR,\n    getExecuteSuggestion,\n    displayError,\n    createCallRequest,\n    selectUserByUsername,\n    getUserByUsername,\n    selectUser,\n    getUser,\n    getChannelByNameAndTeamName,\n    getCurrentTeam,\n    selectChannelByName,\n    errorMessage as parserErrorMessage,\n    filterEmptyOptions,\n    autocompleteUsersInChannel,\n    autocompleteChannels,\n    UserProfile,\n} from './app_command_parser_dependencies';\n\nexport interface Store {\n    dispatch: DispatchFunc;\n    getState: () => GlobalState;\n}\n\nexport enum ParseState {\n    Start = 'Start',\n    Command = 'Command',\n    EndCommand = 'EndCommand',\n    CommandSeparator = 'CommandSeparator',\n    StartParameter = 'StartParameter',\n    ParameterSeparator = 'ParameterSeparator',\n    Flag1 = 'Flag1',\n    Flag = 'Flag',\n    FlagValueSeparator = 'FlagValueSeparator',\n    StartValue = 'StartValue',\n    NonspaceValue = 'NonspaceValue',\n    QuotedValue = 'QuotedValue',\n    TickValue = 'TickValue',\n    EndValue = 'EndValue',\n    EndQuotedValue = 'EndQuotedValue',\n    EndTickedValue = 'EndTickedValue',\n    Error = 'Error',\n    Rest = 'Rest',\n}\n\ninterface FormsCache {\n    getForm: (location: string, binding: AppBinding) => Promise<{form?: AppForm; error?: string} | undefined>;\n}\n\ninterface Intl {\n    formatMessage(config: {id: string; defaultMessage: string}, values?: {[name: string]: any}): string;\n}\n\ntype ExtendedAutocompleteSuggestion = AutocompleteSuggestion & {\n    type?: string;\n    item?: UserProfile | Channel;\n}\n\nconst getCommandBindings = makeAppBindingsSelector(AppBindingLocations.COMMAND);\n\nexport class ParsedCommand {\n    state = ParseState.Start;\n    command: string;\n    i = 0;\n    incomplete = '';\n    incompleteStart = 0;\n    binding: AppBinding | undefined;\n    form: AppForm | undefined;\n    formsCache: FormsCache;\n    field: AppField | undefined;\n    position = 0;\n    values: {[name: string]: string} = {};\n    location = '';\n    error = '';\n    intl: Intl;\n\n    constructor(command: string, formsCache: FormsCache, intl: any) {\n        this.command = command;\n        this.formsCache = formsCache || [];\n        this.intl = intl;\n    }\n\n    private asError = (message: string): ParsedCommand => {\n        this.state = ParseState.Error;\n        this.error = message;\n        return this;\n    };\n\n    // matchBinding finds the closest matching command binding.\n    public matchBinding = async (commandBindings: AppBinding[], autocompleteMode = false): Promise<ParsedCommand> => {\n        if (commandBindings.length === 0) {\n            return this.asError(this.intl.formatMessage({\n                id: 'apps.error.parser.no_bindings',\n                defaultMessage: 'No command bindings.',\n            }));\n        }\n        let bindings = commandBindings;\n\n        let done = false;\n        while (!done) {\n            let c = '';\n            if (this.i < this.command.length) {\n                c = this.command[this.i];\n            }\n\n            switch (this.state) {\n            case ParseState.Start: {\n                if (c !== '/') {\n                    return this.asError(this.intl.formatMessage({\n                        id: 'apps.error.parser.no_slash_start',\n                        defaultMessage: 'Command must start with a `/`.',\n                    }));\n                }\n                this.i++;\n                this.incomplete = '';\n                this.incompleteStart = this.i;\n                this.state = ParseState.Command;\n                break;\n            }\n\n            case ParseState.Command: {\n                switch (c) {\n                case '': {\n                    if (autocompleteMode) {\n                        // Finish in the Command state, 'incomplete' will have the query string\n                        done = true;\n                    } else {\n                        this.state = ParseState.EndCommand;\n                    }\n                    break;\n                }\n                case ' ':\n                case '\\t': {\n                    this.state = ParseState.EndCommand;\n                    break;\n                }\n                default:\n                    this.incomplete += c;\n                    this.i++;\n                    break;\n                }\n                break;\n            }\n\n            case ParseState.EndCommand: {\n                const binding = bindings.find((b: AppBinding) => b.label.toLowerCase() === this.incomplete.toLowerCase());\n                if (!binding) {\n                    // gone as far as we could, this token doesn't match a sub-command.\n                    // return the state from the last matching binding\n                    done = true;\n                    break;\n                }\n                this.binding = binding;\n                this.location += '/' + binding.label;\n                bindings = binding.bindings || [];\n                this.state = ParseState.CommandSeparator;\n                break;\n            }\n\n            case ParseState.CommandSeparator: {\n                if (c === '') {\n                    done = true;\n                }\n\n                switch (c) {\n                case ' ':\n                case '\\t': {\n                    this.i++;\n                    break;\n                }\n                default: {\n                    this.incomplete = '';\n                    this.incompleteStart = this.i;\n                    this.state = ParseState.Command;\n                    break;\n                }\n                }\n                break;\n            }\n\n            default: {\n                return this.asError(this.intl.formatMessage({\n                    id: 'apps.error.parser.unexpected_state',\n                    defaultMessage: 'Unreachable: Unexpected state in matchBinding: `{state}`.',\n                }, {\n                    state: this.state,\n                }));\n            }\n            }\n        }\n\n        if (!this.binding) {\n            if (autocompleteMode) {\n                return this;\n            }\n\n            return this.asError(this.intl.formatMessage({\n                id: 'apps.error.parser.no_match',\n                defaultMessage: '`{command}`: No matching command found in this workspace.',\n            }, {\n                command: this.command,\n            }));\n        }\n\n        if (!autocompleteMode && this.binding.bindings?.length) {\n            return this.asError(this.intl.formatMessage({\n                id: 'apps.error.parser.execute_non_leaf',\n                defaultMessage: 'You must select a subcommand.',\n            }));\n        }\n\n        if (!this.binding.bindings?.length) {\n            this.form = this.binding?.form;\n            if (!this.form) {\n                const fetched = await this.formsCache.getForm(this.location, this.binding);\n                if (fetched?.error) {\n                    return this.asError(fetched.error);\n                }\n                this.form = fetched?.form;\n            }\n        }\n\n        return this;\n    }\n\n    // parseForm parses the rest of the command using the previously matched form.\n    public parseForm = (autocompleteMode = false): ParsedCommand => {\n        if (this.state === ParseState.Error || !this.form) {\n            return this;\n        }\n\n        let fields: AppField[] = [];\n        if (this.form.fields) {\n            fields = this.form.fields;\n        }\n\n        fields = fields.filter((f) => f.type !== AppFieldTypes.MARKDOWN && !f.readonly);\n        this.state = ParseState.StartParameter;\n        this.i = this.incompleteStart || 0;\n        let flagEqualsUsed = false;\n        let escaped = false;\n\n        // eslint-disable-next-line no-constant-condition\n        while (true) {\n            let c = '';\n            if (this.i < this.command.length) {\n                c = this.command[this.i];\n            }\n\n            switch (this.state) {\n            case ParseState.StartParameter: {\n                switch (c) {\n                case '':\n                    return this;\n                case '-': {\n                    // Named parameter (aka Flag). Flag1 consumes the optional second '-'.\n                    this.state = ParseState.Flag1;\n                    this.i++;\n                    break;\n                }\n                default: {\n                    // Positional parameter.\n                    this.position++;\n                    // eslint-disable-next-line no-loop-func\n                    let field = fields.find((f: AppField) => f.position === this.position);\n                    if (!field) {\n                        field = fields.find((f) => f.position === -1 && f.type === AppFieldTypes.TEXT);\n                        if (!field || this.values[field.name]) {\n                            return this.asError(this.intl.formatMessage({\n                                id: 'apps.error.parser.no_argument_pos_x',\n                                defaultMessage: 'Unable to identify argument.',\n                            }));\n                        }\n                        this.incompleteStart = this.i;\n                        this.incomplete = '';\n                        this.field = field;\n                        this.state = ParseState.Rest;\n                        break;\n                    }\n                    this.field = field;\n                    this.state = ParseState.StartValue;\n                    break;\n                }\n                }\n                break;\n            }\n\n            case ParseState.Rest: {\n                if (!this.field) {\n                    return this.asError(this.intl.formatMessage({\n                        id: 'apps.error.parser.missing_field_value',\n                        defaultMessage: 'Field value is missing.',\n                    }));\n                }\n\n                if (autocompleteMode && c === '') {\n                    return this;\n                }\n\n                if (c === '') {\n                    this.values[this.field.name] = this.incomplete;\n                    return this;\n                }\n\n                this.i++;\n                this.incomplete += c;\n                break;\n            }\n\n            case ParseState.ParameterSeparator: {\n                this.incompleteStart = this.i;\n                switch (c) {\n                case '':\n                    this.state = ParseState.StartParameter;\n                    return this;\n                case ' ':\n                case '\\t': {\n                    this.i++;\n                    break;\n                }\n                default:\n                    this.state = ParseState.StartParameter;\n                    break;\n                }\n                break;\n            }\n\n            case ParseState.Flag1: {\n                // consume the optional second '-'\n                if (c === '-') {\n                    this.i++;\n                }\n                this.state = ParseState.Flag;\n                this.incomplete = '';\n                this.incompleteStart = this.i;\n                flagEqualsUsed = false;\n                break;\n            }\n\n            case ParseState.Flag: {\n                if (c === '' && autocompleteMode) {\n                    return this;\n                }\n\n                switch (c) {\n                case '':\n                case ' ':\n                case '\\t':\n                case '=': {\n                    const field = fields.find((f) => f.label?.toLowerCase() === this.incomplete.toLowerCase());\n                    if (!field) {\n                        return this.asError(this.intl.formatMessage({\n                            id: 'apps.error.parser.unexpected_flag',\n                            defaultMessage: 'Command does not accept flag `{flagName}`.',\n                        }, {\n                            flagName: this.incomplete,\n                        }));\n                    }\n                    this.state = ParseState.FlagValueSeparator;\n                    this.field = field;\n                    this.incomplete = '';\n                    break;\n                }\n                default: {\n                    this.incomplete += c;\n                    this.i++;\n                    break;\n                }\n                }\n                break;\n            }\n\n            case ParseState.FlagValueSeparator: {\n                this.incompleteStart = this.i;\n                switch (c) {\n                case '': {\n                    if (autocompleteMode) {\n                        return this;\n                    }\n                    this.state = ParseState.StartValue;\n                    break;\n                }\n                case ' ':\n                case '\\t': {\n                    this.i++;\n                    break;\n                }\n                case '=': {\n                    if (flagEqualsUsed) {\n                        return this.asError(this.intl.formatMessage({\n                            id: 'apps.error.parser.multiple_equal',\n                            defaultMessage: 'Multiple `=` signs are not allowed.',\n                        }));\n                    }\n                    flagEqualsUsed = true;\n                    this.i++;\n                    break;\n                }\n                default: {\n                    this.state = ParseState.StartValue;\n                }\n                }\n                break;\n            }\n\n            case ParseState.StartValue: {\n                this.incomplete = '';\n                this.incompleteStart = this.i;\n                switch (c) {\n                case '\"': {\n                    this.state = ParseState.QuotedValue;\n                    this.i++;\n                    break;\n                }\n                case '`': {\n                    this.state = ParseState.TickValue;\n                    this.i++;\n                    break;\n                }\n                case ' ':\n                case '\\t':\n                    return this.asError(this.intl.formatMessage({\n                        id: 'apps.error.parser.unexpected_whitespace',\n                        defaultMessage: 'Unreachable: Unexpected whitespace.',\n                    }));\n                default: {\n                    this.state = ParseState.NonspaceValue;\n                    break;\n                }\n                }\n                break;\n            }\n\n            case ParseState.NonspaceValue: {\n                switch (c) {\n                case '':\n                case ' ':\n                case '\\t': {\n                    this.state = ParseState.EndValue;\n                    break;\n                }\n                default: {\n                    this.incomplete += c;\n                    this.i++;\n                    break;\n                }\n                }\n                break;\n            }\n\n            case ParseState.QuotedValue: {\n                switch (c) {\n                case '': {\n                    if (!autocompleteMode) {\n                        return this.asError(this.intl.formatMessage({\n                            id: 'apps.error.parser.missing_quote',\n                            defaultMessage: 'Matching double quote expected before end of input.',\n                        }));\n                    }\n                    return this;\n                }\n                case '\"': {\n                    if (this.incompleteStart === this.i - 1) {\n                        return this.asError(this.intl.formatMessage({\n                            id: 'apps.error.parser.empty_value',\n                            defaultMessage: 'Empty values are not allowed.',\n                        }));\n                    }\n                    this.i++;\n                    this.state = ParseState.EndQuotedValue;\n                    break;\n                }\n                case '\\\\': {\n                    escaped = true;\n                    this.i++;\n                    break;\n                }\n                default: {\n                    this.incomplete += c;\n                    this.i++;\n                    if (escaped) {\n                        //TODO: handle \\n, \\t, other escaped chars\n                        escaped = false;\n                    }\n                    break;\n                }\n                }\n                break;\n            }\n\n            case ParseState.TickValue: {\n                switch (c) {\n                case '': {\n                    if (!autocompleteMode) {\n                        return this.asError(this.intl.formatMessage({\n                            id: 'apps.error.parser.missing_tick',\n                            defaultMessage: 'Matching tick quote expected before end of input.',\n                        }));\n                    }\n                    return this;\n                }\n                case '`': {\n                    if (this.incompleteStart === this.i - 1) {\n                        return this.asError(this.intl.formatMessage({\n                            id: 'apps.error.parser.empty_value',\n                            defaultMessage: 'Empty values are not allowed.',\n                        }));\n                    }\n                    this.i++;\n                    this.state = ParseState.EndTickedValue;\n                    break;\n                }\n                default: {\n                    this.incomplete += c;\n                    this.i++;\n                    break;\n                }\n                }\n                break;\n            }\n\n            case ParseState.EndTickedValue:\n            case ParseState.EndQuotedValue:\n            case ParseState.EndValue: {\n                if (!this.field) {\n                    return this.asError(this.intl.formatMessage({\n                        id: 'apps.error.parser.missing_field_value',\n                        defaultMessage: 'Field value is missing.',\n                    }));\n                }\n\n                // special handling for optional BOOL values ('--boolflag true'\n                // vs '--boolflag next-positional' vs '--boolflag\n                // --next-flag...')\n                if (this.field.type === AppFieldTypes.BOOL &&\n                    ((autocompleteMode && !'true'.startsWith(this.incomplete) && !'false'.startsWith(this.incomplete)) ||\n                    (!autocompleteMode && this.incomplete !== 'true' && this.incomplete !== 'false'))) {\n                    // reset back where the value started, and treat as a new parameter\n                    this.i = this.incompleteStart;\n                    this.values[this.field.name] = 'true';\n                    this.state = ParseState.StartParameter;\n                } else {\n                    if (autocompleteMode && c === '') {\n                        return this;\n                    }\n                    this.values[this.field.name] = this.incomplete;\n                    this.incomplete = '';\n                    this.incompleteStart = this.i;\n                    if (c === '') {\n                        return this;\n                    }\n                    this.state = ParseState.ParameterSeparator;\n                }\n                break;\n            }\n            }\n        }\n    }\n}\n\nexport class AppCommandParser {\n    private store: Store;\n    private channelID: string;\n    private teamID: string;\n    private rootPostID?: string;\n    private intl: Intl;\n\n    forms: {[location: string]: AppForm} = {};\n\n    constructor(store: Store|null, intl: Intl, channelID: string, teamID = '', rootPostID = '') {\n        this.store = store || getStore();\n        this.channelID = channelID;\n        this.rootPostID = rootPostID;\n        this.teamID = teamID;\n        this.intl = intl;\n    }\n\n    // composeCallFromCommand creates the form submission call\n    public composeCallFromCommand = async (command: string): Promise<{call: AppCallRequest | null; errorMessage?: string}> => {\n        let parsed = new ParsedCommand(command, this, this.intl);\n\n        const commandBindings = this.getCommandBindings();\n        if (!commandBindings) {\n            return {call: null,\n                errorMessage: this.intl.formatMessage({\n                    id: 'apps.error.parser.no_bindings',\n                    defaultMessage: 'No command bindings.',\n                })};\n        }\n\n        parsed = await parsed.matchBinding(commandBindings, false);\n        parsed = parsed.parseForm(false);\n        if (parsed.state === ParseState.Error) {\n            return {call: null, errorMessage: parserErrorMessage(this.intl, parsed.error, parsed.command, parsed.i)};\n        }\n\n        await this.addDefaultAndReadOnlyValues(parsed);\n\n        const missing = this.getMissingFields(parsed);\n        if (missing.length > 0) {\n            const missingStr = missing.map((f) => f.label).join(', ');\n            return {call: null,\n                errorMessage: this.intl.formatMessage({\n                    id: 'apps.error.command.field_missing',\n                    defaultMessage: 'Required fields missing: `{fieldName}`.',\n                }, {\n                    fieldName: missingStr,\n                })};\n        }\n\n        return this.composeCallFromParsed(parsed);\n    }\n\n    private async addDefaultAndReadOnlyValues(parsed: ParsedCommand) {\n        if (!parsed.form?.fields) {\n            return;\n        }\n\n        await Promise.all(parsed.form?.fields.map(async (f) => {\n            if (!f.value) {\n                return;\n            }\n\n            if (f.readonly || !(f.name in parsed.values)) {\n                switch (f.type) {\n                case AppFieldTypes.TEXT:\n                    parsed.values[f.name] = f.value as string;\n                    break;\n                case AppFieldTypes.BOOL:\n                    parsed.values[f.name] = 'true';\n                    break;\n                case AppFieldTypes.USER: {\n                    const userID = (f.value as AppSelectOption).value;\n                    let user = selectUser(this.store.getState(), userID);\n                    if (!user) {\n                        const dispatchResult = await this.store.dispatch(getUser(userID));\n                        if ('error' in dispatchResult) {\n                            // Silently fail on default value\n                            break;\n                        }\n                        user = dispatchResult.data;\n                    }\n                    parsed.values[f.name] = user.username;\n                    break;\n                }\n                case AppFieldTypes.CHANNEL: {\n                    const channelID = (f.value as AppSelectOption).label;\n                    let channel = selectChannel(this.store.getState(), channelID);\n                    if (!channel) {\n                        const dispatchResult = await this.store.dispatch(getChannel(channelID));\n                        if ('error' in dispatchResult) {\n                            // Silently fail on default value\n                            break;\n                        }\n                        channel = dispatchResult.data;\n                    }\n                    parsed.values[f.name] = channel.name;\n                    break;\n                }\n                case AppFieldTypes.STATIC_SELECT:\n                case AppFieldTypes.DYNAMIC_SELECT:\n                    parsed.values[f.name] = (f.value as AppSelectOption).value;\n                    break;\n                case AppFieldTypes.MARKDOWN:\n\n                    // Do nothing\n                }\n            }\n        }) || []);\n    }\n\n    // getSuggestionsBase is a synchronous function that returns results for base commands\n    public getSuggestionsBase = (pretext: string): AutocompleteSuggestion[] => {\n        const command = pretext.toLowerCase();\n        const result: AutocompleteSuggestion[] = [];\n\n        const bindings = this.getCommandBindings();\n\n        for (const binding of bindings) {\n            let base = binding.label;\n            if (!base) {\n                continue;\n            }\n\n            if (base[0] !== '/') {\n                base = '/' + base;\n            }\n\n            if (base.startsWith(command)) {\n                result.push({\n                    Complete: binding.label,\n                    Suggestion: base,\n                    Description: binding.description || '',\n                    Hint: binding.hint || '',\n                    IconData: binding.icon || '',\n                });\n            }\n        }\n\n        return result;\n    }\n\n    // getSuggestions returns suggestions for subcommands and/or form arguments\n    public getSuggestions = async (pretext: string): Promise<ExtendedAutocompleteSuggestion[]> => {\n        let parsed = new ParsedCommand(pretext, this, this.intl);\n        let suggestions: ExtendedAutocompleteSuggestion[] = [];\n\n        const commandBindings = this.getCommandBindings();\n        if (!commandBindings) {\n            return [];\n        }\n\n        parsed = await parsed.matchBinding(commandBindings, true);\n        if (parsed.state === ParseState.Error) {\n            suggestions = this.getErrorSuggestion(parsed);\n        }\n\n        if (parsed.state === ParseState.Command) {\n            suggestions = this.getCommandSuggestions(parsed);\n        }\n\n        if (parsed.form || parsed.incomplete) {\n            parsed = parsed.parseForm(true);\n            if (parsed.state === ParseState.Error) {\n                suggestions = this.getErrorSuggestion(parsed);\n            }\n            const argSuggestions = await this.getParameterSuggestions(parsed);\n            suggestions = suggestions.concat(argSuggestions);\n        }\n\n        // Add \"Execute Current Command\" suggestion\n        // TODO get full text from SuggestionBox\n        const executableStates: string[] = [\n            ParseState.EndCommand,\n            ParseState.CommandSeparator,\n            ParseState.StartParameter,\n            ParseState.ParameterSeparator,\n            ParseState.EndValue,\n        ];\n        const call = parsed.form?.call || parsed.binding?.call || parsed.binding?.form?.call;\n        const hasRequired = this.getMissingFields(parsed).length === 0;\n        const hasValue = (parsed.state !== ParseState.EndValue || (parsed.field && parsed.values[parsed.field.name] !== undefined));\n\n        if (executableStates.includes(parsed.state) && call && hasRequired && hasValue) {\n            const execute = getExecuteSuggestion(parsed);\n            if (execute) {\n                suggestions = [execute, ...suggestions];\n            }\n        } else if (suggestions.length === 0 && (parsed.field?.type !== AppFieldTypes.USER && parsed.field?.type !== AppFieldTypes.CHANNEL)) {\n            suggestions = this.getNoMatchingSuggestion();\n        }\n        return suggestions.map((suggestion) => this.decorateSuggestionComplete(parsed, suggestion));\n    }\n\n    getNoMatchingSuggestion = () => {\n        return [{\n            Complete: '',\n            Suggestion: '',\n            Hint: this.intl.formatMessage({\n                id: 'apps.suggestion.no_suggestion',\n                defaultMessage: 'No matching suggestions.',\n            }),\n            IconData: COMMAND_SUGGESTION_ERROR,\n            Description: '',\n        }];\n    }\n\n    getErrorSuggestion = (parsed: ParsedCommand) => {\n        return [{\n            Complete: '',\n            Suggestion: '',\n            Hint: this.intl.formatMessage({\n                id: 'apps.suggestion.errors.parser_error',\n                defaultMessage: 'Parsing error',\n            }),\n            IconData: COMMAND_SUGGESTION_ERROR,\n            Description: parsed.error,\n        }];\n    }\n\n    // composeCallFromParsed creates the form submission call\n    private composeCallFromParsed = async (parsed: ParsedCommand): Promise<{call: AppCallRequest | null; errorMessage?: string}> => {\n        if (!parsed.binding) {\n            return {call: null,\n                errorMessage: this.intl.formatMessage({\n                    id: 'apps.error.parser.missing_binding',\n                    defaultMessage: 'Missing command bindings.',\n                })};\n        }\n\n        const call = parsed.form?.call || parsed.binding.call;\n        if (!call) {\n            return {call: null,\n                errorMessage: this.intl.formatMessage({\n                    id: 'apps.error.parser.missing_call',\n                    defaultMessage: 'Missing binding call.',\n                })};\n        }\n\n        const values: AppCallValues = parsed.values;\n        const {errorMessage} = await this.expandOptions(parsed, values);\n\n        if (errorMessage) {\n            return {call: null, errorMessage};\n        }\n\n        const context = this.getAppContext(parsed.binding);\n        return {call: createCallRequest(call, context, {}, values, parsed.command)};\n    }\n\n    private expandOptions = async (parsed: ParsedCommand, values: AppCallValues): Promise<{errorMessage?: string}> => {\n        if (!parsed.form?.fields) {\n            return {};\n        }\n\n        const errors: {[key: string]: string} = {};\n        await Promise.all(parsed.form.fields.map(async (f) => {\n            if (!values[f.name]) {\n                return;\n            }\n            switch (f.type) {\n            case AppFieldTypes.DYNAMIC_SELECT:\n                values[f.name] = {label: '', value: values[f.name]};\n                break;\n            case AppFieldTypes.STATIC_SELECT: {\n                const option = f.options?.find((o) => (o.value === values[f.name]));\n                if (!option) {\n                    errors[f.name] = this.intl.formatMessage({\n                        id: 'apps.error.command.unknown_option',\n                        defaultMessage: 'Unknown option for field `{fieldName}`: `{option}`.',\n                    }, {\n                        fieldName: f.name,\n                        option: values[f.name],\n                    });\n                    return;\n                }\n                values[f.name] = option;\n                break;\n            }\n            case AppFieldTypes.USER: {\n                let userName = values[f.name] as string;\n                if (userName[0] === '@') {\n                    userName = userName.substr(1);\n                }\n                let user = selectUserByUsername(this.store.getState(), userName);\n                if (!user) {\n                    const dispatchResult = await this.store.dispatch(getUserByUsername(userName) as any);\n                    if ('error' in dispatchResult) {\n                        errors[f.name] = this.intl.formatMessage({\n                            id: 'apps.error.command.unknown_user',\n                            defaultMessage: 'Unknown user for field `{fieldName}`: `{option}`.',\n                        }, {\n                            fieldName: f.name,\n                            option: values[f.name],\n                        });\n                        return;\n                    }\n                    user = dispatchResult.data;\n                }\n                values[f.name] = {label: user.username, value: user.id};\n                break;\n            }\n            case AppFieldTypes.CHANNEL: {\n                let channelName = values[f.name] as string;\n                if (channelName[0] === '~') {\n                    channelName = channelName.substr(1);\n                }\n                let channel = selectChannelByName(this.store.getState(), channelName);\n                if (!channel) {\n                    const dispatchResult = await this.store.dispatch(getChannelByNameAndTeamName(getCurrentTeam(this.store.getState()).name, channelName) as any);\n                    if ('error' in dispatchResult) {\n                        errors[f.name] = this.intl.formatMessage({\n                            id: 'apps.error.command.unknown_channel',\n                            defaultMessage: 'Unknown channel for field `{fieldName}`: `{option}`.',\n                        }, {\n                            fieldName: f.name,\n                            option: values[f.name],\n                        });\n                        return;\n                    }\n                    channel = dispatchResult.data;\n                }\n                values[f.name] = {label: channel?.display_name, value: channel?.id};\n                break;\n            }\n            }\n        }));\n\n        if (Object.keys(errors).length === 0) {\n            return {};\n        }\n\n        let errorMessage = '';\n        Object.keys(errors).forEach((v) => {\n            errorMessage = errorMessage + errors[v] + '\\n';\n        });\n        return {errorMessage};\n    }\n\n    // decorateSuggestionComplete applies the necessary modifications for a suggestion to be processed\n    private decorateSuggestionComplete = (parsed: ParsedCommand, choice: AutocompleteSuggestion): AutocompleteSuggestion => {\n        if (choice.Complete && choice.Complete.endsWith(EXECUTE_CURRENT_COMMAND_ITEM_ID)) {\n            return choice as AutocompleteSuggestion;\n        }\n\n        let goBackSpace = 0;\n        if (choice.Complete === '') {\n            goBackSpace = 1;\n        }\n        let complete = parsed.command.substring(0, parsed.incompleteStart - goBackSpace);\n        complete += choice.Complete === undefined ? choice.Suggestion : choice.Complete;\n        choice.Hint = choice.Hint || '';\n        complete = complete.substring(1);\n\n        return {\n            ...choice,\n            Complete: complete,\n        };\n    }\n\n    // getCommandBindings returns the commands in the redux store.\n    // They are grouped by app id since each app has one base command\n    private getCommandBindings = (): AppBinding[] => {\n        const bindings = getCommandBindings(this.store.getState());\n        return bindings;\n    }\n\n    // getChannel gets the channel in which the user is typing the command\n    private getChannel = (): Channel | null => {\n        const state = this.store.getState();\n        return selectChannel(state, this.channelID);\n    }\n\n    public setChannelContext = (channelID: string, teamID = '', rootPostID?: string) => {\n        if (this.channelID !== channelID || this.rootPostID !== rootPostID || this.teamID !== teamID) {\n            this.forms = {};\n        }\n        this.channelID = channelID;\n        this.rootPostID = rootPostID;\n        this.teamID = teamID;\n    }\n\n    // isAppCommand determines if subcommand/form suggestions need to be returned.\n    // When this returns true, the caller knows that the parser should handle all suggestions for the current command string.\n    // When it returns false, the caller should call getSuggestionsBase() to check if there are any base commands that match the command string.\n    public isAppCommand = (pretext: string): boolean => {\n        const command = pretext.toLowerCase();\n        for (const binding of this.getCommandBindings()) {\n            let base = binding.label;\n            if (!base) {\n                continue;\n            }\n\n            if (base[0] !== '/') {\n                base = '/' + base;\n            }\n\n            if (command.startsWith(base + ' ')) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    // getAppContext collects post/channel/team info for performing calls\n    private getAppContext = (binding: AppBinding): AppContext => {\n        const context: AppContext = {\n            app_id: binding.app_id,\n            location: binding.location,\n            root_id: this.rootPostID,\n        };\n\n        const channel = this.getChannel();\n        if (!channel) {\n            return context;\n        }\n\n        context.channel_id = channel.id;\n        context.team_id = channel.team_id || getCurrentTeamId(this.store.getState());\n\n        return context;\n    }\n\n    // fetchForm unconditionaly retrieves the form for the given binding (subcommand)\n    private fetchForm = async (binding: AppBinding): Promise<{form?: AppForm; error?: string} | undefined> => {\n        if (!binding.call) {\n            return {error: this.intl.formatMessage({\n                id: 'apps.error.parser.missing_call',\n                defaultMessage: 'Missing binding call.',\n            })};\n        }\n\n        const payload = createCallRequest(\n            binding.call,\n            this.getAppContext(binding),\n        );\n\n        const res = await this.store.dispatch(doAppCall(payload, AppCallTypes.FORM, this.intl)) as DoAppCallResult;\n        if (res.error) {\n            const errorResponse = res.error;\n            return {error: errorResponse.error || this.intl.formatMessage({\n                id: 'apps.error.unknown',\n                defaultMessage: 'Unknown error.',\n            })};\n        }\n\n        const callResponse = res.data!;\n        switch (callResponse.type) {\n        case AppCallResponseTypes.FORM:\n            break;\n        case AppCallResponseTypes.NAVIGATE:\n        case AppCallResponseTypes.OK:\n            return {error: this.intl.formatMessage({\n                id: 'apps.error.responses.unexpected_type',\n                defaultMessage: 'App response type was not expected. Response type: {type}',\n            }, {\n                type: callResponse.type,\n            })};\n        default:\n            return {error: this.intl.formatMessage({\n                id: 'apps.error.responses.unknown_type',\n                defaultMessage: 'App response type not supported. Response type: {type}.',\n            }, {\n                type: callResponse.type,\n            })};\n        }\n\n        return {form: callResponse.form};\n    }\n\n    public getForm = async (location: string, binding: AppBinding): Promise<{form?: AppForm; error?: string} | undefined> => {\n        const rootID = this.rootPostID || '';\n        const key = `${this.channelID}-${rootID}-${location}`;\n        const form = this.forms[key];\n        if (form) {\n            return {form};\n        }\n\n        this.forms = {};\n        const fetched = await this.fetchForm(binding);\n        if (fetched?.form) {\n            this.forms[key] = fetched.form;\n        }\n        return fetched;\n    }\n\n    // displayError shows an error that was caught by the parser\n    private displayError = (err: any): void => {\n        let errStr = err as string;\n        if (err.message) {\n            errStr = err.message;\n        }\n        displayError(errStr, this.channelID, this.rootPostID);\n    }\n\n    // getSuggestionsForSubCommands returns suggestions for a subcommand's name\n    private getCommandSuggestions = (parsed: ParsedCommand): AutocompleteSuggestion[] => {\n        if (!parsed.binding?.bindings?.length) {\n            return [];\n        }\n        const bindings = parsed.binding.bindings;\n        const result: AutocompleteSuggestion[] = [];\n\n        bindings.forEach((b) => {\n            if (b.label.toLowerCase().startsWith(parsed.incomplete.toLowerCase())) {\n                result.push({\n                    Complete: b.label,\n                    Suggestion: b.label,\n                    Description: b.description || '',\n                    Hint: b.hint || '',\n                    IconData: b.icon || '',\n                });\n            }\n        });\n\n        return result;\n    }\n\n    // getParameterSuggestions computes suggestions for positional argument values, flag names, and flag argument values\n    private getParameterSuggestions = async (parsed: ParsedCommand): Promise<ExtendedAutocompleteSuggestion[]> => {\n        switch (parsed.state) {\n        case ParseState.StartParameter: {\n            // see if there's a matching positional field\n            const positional = parsed.form?.fields?.find((f: AppField) => f.position === parsed.position + 1);\n            if (positional) {\n                parsed.field = positional;\n                return this.getValueSuggestions(parsed);\n            }\n            return this.getFlagNameSuggestions(parsed);\n        }\n\n        case ParseState.Flag:\n            return this.getFlagNameSuggestions(parsed);\n\n        case ParseState.EndValue:\n        case ParseState.FlagValueSeparator:\n        case ParseState.NonspaceValue:\n            return this.getValueSuggestions(parsed);\n        case ParseState.EndQuotedValue:\n        case ParseState.QuotedValue:\n            return this.getValueSuggestions(parsed, '\"');\n        case ParseState.EndTickedValue:\n        case ParseState.TickValue:\n            return this.getValueSuggestions(parsed, '`');\n        case ParseState.Rest: {\n            const execute = getExecuteSuggestion(parsed);\n            const value = await this.getValueSuggestions(parsed);\n            if (execute) {\n                return [execute, ...value];\n            }\n            return value;\n        }\n        }\n        return [];\n    }\n\n    // getMissingFields collects the required fields that were not supplied in a submission\n    private getMissingFields = (parsed: ParsedCommand): AppField[] => {\n        const form = parsed.form;\n        if (!form) {\n            return [];\n        }\n\n        const missing: AppField[] = [];\n\n        const values = parsed.values || [];\n        const fields = form.fields || [];\n        for (const field of fields) {\n            if (field.is_required && !values[field.name]) {\n                missing.push(field);\n            }\n        }\n\n        return missing;\n    }\n\n    // getFlagNameSuggestions returns suggestions for flag names\n    private getFlagNameSuggestions = (parsed: ParsedCommand): AutocompleteSuggestion[] => {\n        if (!parsed.form || !parsed.form.fields || !parsed.form.fields.length) {\n            return [];\n        }\n\n        // There have been 0 to 2 dashes in the command prior to this call, adjust.\n        let prefix = '--';\n        for (let i = parsed.incompleteStart - 1; i > 0 && i >= parsed.incompleteStart - 2 && parsed.command[i] === '-'; i--) {\n            prefix = prefix.substring(1);\n        }\n\n        const applicable = parsed.form.fields.filter((field) => field.label && field.label.toLowerCase().startsWith(parsed.incomplete.toLowerCase()) && !parsed.values[field.name]);\n        if (applicable) {\n            return applicable.map((f) => {\n                return {\n                    Complete: prefix + (f.label || f.name),\n                    Suggestion: '--' + (f.label || f.name),\n                    Description: f.description || '',\n                    Hint: f.hint || '',\n                    IconData: parsed.binding?.icon || '',\n                };\n            });\n        }\n\n        return [];\n    }\n\n    // getSuggestionsForField gets suggestions for a positional or flag field value\n    private getValueSuggestions = async (parsed: ParsedCommand, delimiter?: string): Promise<ExtendedAutocompleteSuggestion[]> => {\n        if (!parsed || !parsed.field) {\n            return [];\n        }\n        const f = parsed.field;\n\n        switch (f.type) {\n        case AppFieldTypes.USER:\n            return this.getUserFieldSuggestions(parsed);\n        case AppFieldTypes.CHANNEL:\n            return this.getChannelFieldSuggestions(parsed);\n        case AppFieldTypes.BOOL:\n            return this.getBooleanSuggestions(parsed);\n        case AppFieldTypes.DYNAMIC_SELECT:\n            return this.getDynamicSelectSuggestions(parsed, delimiter);\n        case AppFieldTypes.STATIC_SELECT:\n            return this.getStaticSelectSuggestions(parsed, delimiter);\n        }\n\n        const mentionSuggestions = await inTextMentionSuggestions(parsed.incomplete, this.store, this.channelID, this.teamID, delimiter);\n        if (mentionSuggestions) {\n            return mentionSuggestions;\n        }\n\n        // Handle text values\n        let complete = parsed.incomplete;\n        if (complete && delimiter) {\n            complete = delimiter + complete + delimiter;\n        }\n\n        const fieldName = parsed.field.modal_label || parsed.field.label || parsed.field.name;\n        return [{\n            Complete: complete,\n            Suggestion: `${fieldName}: ${delimiter || '\"'}${parsed.incomplete}${delimiter || '\"'}`,\n            Description: f.description || '',\n            Hint: '',\n            IconData: parsed.binding?.icon || '',\n        }];\n    }\n\n    // getStaticSelectSuggestions returns suggestions specified in the field's options property\n    private getStaticSelectSuggestions = (parsed: ParsedCommand, delimiter?: string): AutocompleteSuggestion[] => {\n        const f = parsed.field as AutocompleteStaticSelect;\n        const opts = f.options?.filter((opt) => opt.label.toLowerCase().startsWith(parsed.incomplete.toLowerCase()));\n        if (!opts?.length) {\n            return [{\n                Complete: '',\n                Suggestion: '',\n                Hint: this.intl.formatMessage({\n                    id: 'apps.suggestion.no_static',\n                    defaultMessage: 'No matching options.',\n                }),\n                Description: '',\n                IconData: COMMAND_SUGGESTION_ERROR,\n            }];\n        }\n        return opts.map((opt) => {\n            let complete = opt.value;\n            if (delimiter) {\n                complete = delimiter + complete + delimiter;\n            } else if (isMultiword(opt.value)) {\n                complete = '`' + complete + '`';\n            }\n            return {\n                Complete: complete,\n                Suggestion: opt.label,\n                Hint: f.hint || '',\n                Description: f.description || '',\n                IconData: opt.icon_data || parsed.binding?.icon || '',\n            };\n        });\n    }\n\n    // getDynamicSelectSuggestions fetches and returns suggestions from the server\n    private getDynamicSelectSuggestions = async (parsed: ParsedCommand, delimiter?: string): Promise<AutocompleteSuggestion[]> => {\n        const f = parsed.field;\n        if (!f) {\n            // Should never happen\n            return this.makeDynamicSelectSuggestionError(this.intl.formatMessage({\n                id: 'apps.error.parser.unexpected_error',\n                defaultMessage: 'Unexpected error.',\n            }));\n        }\n\n        const {call, errorMessage} = await this.composeCallFromParsed(parsed);\n        if (!call) {\n            return this.makeDynamicSelectSuggestionError(this.intl.formatMessage({\n                id: 'apps.error.lookup.error_preparing_request',\n                defaultMessage: 'Error preparing lookup request: {errorMessage}',\n            }, {\n                errorMessage,\n            }));\n        }\n        call.selected_field = f.name;\n        call.query = parsed.incomplete;\n\n        const res = await this.store.dispatch(doAppCall(call, AppCallTypes.LOOKUP, this.intl)) as DoAppCallResult<AppLookupResponse>;\n\n        if (res.error) {\n            const errorResponse = res.error;\n            return this.makeDynamicSelectSuggestionError(errorResponse.error || this.intl.formatMessage({\n                id: 'apps.error.unknown',\n                defaultMessage: 'Unknown error.',\n            }));\n        }\n\n        const callResponse = res.data!;\n        switch (callResponse.type) {\n        case AppCallResponseTypes.OK:\n            break;\n        case AppCallResponseTypes.NAVIGATE:\n        case AppCallResponseTypes.FORM:\n            return this.makeDynamicSelectSuggestionError(this.intl.formatMessage({\n                id: 'apps.error.responses.unexpected_type',\n                defaultMessage: 'App response type was not expected. Response type: {type}',\n            }, {\n                type: callResponse.type,\n            }));\n        default:\n            return this.makeDynamicSelectSuggestionError(this.intl.formatMessage({\n                id: 'apps.error.responses.unknown_type',\n                defaultMessage: 'App response type not supported. Response type: {type}.',\n            }, {\n                type: callResponse.type,\n            }));\n        }\n\n        let items = callResponse?.data?.items;\n        items = items?.filter(filterEmptyOptions);\n        if (!items?.length) {\n            return [{\n                Complete: '',\n                Suggestion: '',\n                Hint: this.intl.formatMessage({\n                    id: 'apps.suggestion.no_static',\n                    defaultMessage: 'No matching options.',\n                }),\n                IconData: '',\n                Description: this.intl.formatMessage({\n                    id: 'apps.suggestion.no_dynamic',\n                    defaultMessage: 'No data was returned for dynamic suggestions',\n                }),\n            }];\n        }\n\n        return items.map((s): AutocompleteSuggestion => {\n            let complete = s.value;\n            if (delimiter) {\n                complete = delimiter + complete + delimiter;\n            } else if (isMultiword(s.value)) {\n                complete = '`' + complete + '`';\n            }\n            return ({\n                Complete: complete,\n                Description: s.label || s.value,\n                Suggestion: s.value,\n                Hint: '',\n                IconData: s.icon_data || parsed.binding?.icon || '',\n            });\n        });\n    }\n\n    private makeDynamicSelectSuggestionError = (message: string): AutocompleteSuggestion[] => {\n        const errMsg = this.intl.formatMessage({\n            id: 'apps.error',\n            defaultMessage: 'Error: {error}',\n        }, {\n            error: message,\n        });\n        return [{\n            Complete: '',\n            Suggestion: '',\n            Hint: this.intl.formatMessage({\n                id: 'apps.suggestion.dynamic.error',\n                defaultMessage: 'Dynamic select error',\n            }),\n            IconData: COMMAND_SUGGESTION_ERROR,\n            Description: errMsg,\n        }];\n    }\n\n    private getUserFieldSuggestions = async (parsed: ParsedCommand): Promise<AutocompleteSuggestion[]> => {\n        let input = parsed.incomplete.trim();\n        if (input[0] === '@') {\n            input = input.substring(1);\n        }\n        const {data} = await this.store.dispatch(autocompleteUsersInChannel(input, this.channelID));\n        return getUserSuggestions(data);\n    }\n\n    private getChannelFieldSuggestions = async (parsed: ParsedCommand): Promise<AutocompleteSuggestion[]> => {\n        let input = parsed.incomplete.trim();\n        if (input[0] === '~') {\n            input = input.substring(1);\n        }\n        const {data} = await this.store.dispatch(autocompleteChannels(this.teamID, input));\n        return getChannelSuggestions(data);\n    }\n\n    // getBooleanSuggestions returns true/false suggestions\n    private getBooleanSuggestions = (parsed: ParsedCommand): AutocompleteSuggestion[] => {\n        const suggestions: AutocompleteSuggestion[] = [];\n\n        if ('true'.startsWith(parsed.incomplete)) {\n            suggestions.push({\n                Complete: 'true',\n                Suggestion: 'true',\n                Description: parsed.field?.description || '',\n                Hint: parsed.field?.hint || '',\n                IconData: parsed.binding?.icon || '',\n            });\n        }\n        if ('false'.startsWith(parsed.incomplete)) {\n            suggestions.push({\n                Complete: 'false',\n                Suggestion: 'false',\n                Description: parsed.field?.description || '',\n                Hint: parsed.field?.hint || '',\n                IconData: parsed.binding?.icon || '',\n            });\n        }\n        return suggestions;\n    }\n}\n\nfunction isMultiword(value: string) {\n    if (value.indexOf(' ') !== -1) {\n        return true;\n    }\n\n    if (value.indexOf('\\t') !== -1) {\n        return true;\n    }\n\n    return false;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport type {\n    AppCallRequest,\n    AppCallValues,\n    AppBinding,\n    AppField,\n    AppContext,\n    AppForm,\n    AutocompleteElement,\n    AutocompleteDynamicSelect,\n    AutocompleteStaticSelect,\n    AutocompleteUserSelect,\n    AutocompleteChannelSelect,\n    AppLookupResponse,\n    AppSelectOption,\n} from 'mattermost-redux/types/apps';\n\nexport type {\n    DoAppCallResult,\n} from 'types/apps';\n\nimport type {\n    AutocompleteSuggestion,\n} from 'mattermost-redux/types/integrations';\nexport type {AutocompleteSuggestion};\n\nexport type {\n    Channel,\n} from 'mattermost-redux/types/channels';\n\nexport {\n    GlobalState,\n} from 'types/store';\n\nexport type {\n    DispatchFunc,\n} from 'mattermost-redux/types/actions';\n\nexport type {\n    UserAutocomplete,\n} from 'mattermost-redux/types/autocomplete';\n\nexport type {\n    UserProfile,\n} from 'mattermost-redux/types/users';\n\nexport {\n    AppBindingLocations,\n    AppCallTypes,\n    AppFieldTypes,\n    AppCallResponseTypes,\n} from 'mattermost-redux/constants/apps';\n\nexport {autocompleteUsersInChannel} from 'actions/views/channel';\n\nexport {makeAppBindingsSelector} from 'mattermost-redux/selectors/entities/apps';\n\nexport {getPost} from 'mattermost-redux/selectors/entities/posts';\nexport {getChannel as selectChannel, getCurrentChannel, getChannelByName as selectChannelByName} from 'mattermost-redux/selectors/entities/channels';\nexport {getCurrentTeamId, getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nexport {getUserByUsername as selectUserByUsername, getUser as selectUser} from 'mattermost-redux/selectors/entities/users';\n\nexport {getUserByUsername, getUser} from 'mattermost-redux/actions/users';\nexport {getChannelByNameAndTeamName, getChannel, autocompleteChannels} from 'mattermost-redux/actions/channels';\n\nexport {doAppCall} from 'actions/apps';\nimport {sendEphemeralPost} from 'actions/global_actions';\n\nexport {\n    createCallRequest,\n    filterEmptyOptions,\n} from 'utils/apps';\n\nimport {\n    isMac,\n    localizeAndFormatMessage,\n} from 'utils/utils';\n\nimport Store from 'stores/redux_store';\nexport const getStore = () => Store;\n\nimport {Constants} from 'utils/constants';\nexport const EXECUTE_CURRENT_COMMAND_ITEM_ID = Constants.Integrations.EXECUTE_CURRENT_COMMAND_ITEM_ID;\nexport const COMMAND_SUGGESTION_ERROR = Constants.Integrations.COMMAND_SUGGESTION_ERROR;\nexport const COMMAND_SUGGESTION_CHANNEL = Constants.Integrations.COMMAND_SUGGESTION_CHANNEL;\nexport const COMMAND_SUGGESTION_USER = Constants.Integrations.COMMAND_SUGGESTION_USER;\n\nimport type {ParsedCommand} from './app_command_parser';\n\nexport const getExecuteSuggestion = (parsed: ParsedCommand): AutocompleteSuggestion | null => {\n    let key = 'Ctrl';\n    if (isMac()) {\n        key = '⌘';\n    }\n\n    return {\n        Complete: parsed.command.substring(1) + EXECUTE_CURRENT_COMMAND_ITEM_ID,\n        Suggestion: 'Execute Current Command',\n        Hint: '',\n        Description: 'Select this option or use ' + key + '+Enter to execute the current command.',\n        IconData: EXECUTE_CURRENT_COMMAND_ITEM_ID,\n    };\n};\n\nexport const displayError = (err: string, channelID: string, rootID?: string) => {\n    Store.dispatch(sendEphemeralPost(err, channelID, rootID));\n};\n\n// Shim of mobile-version intl\nexport const intlShim = {\n    formatMessage: (config: {id: string; defaultMessage: string}, values?: {[name: string]: any}) => {\n        return localizeAndFormatMessage(config.id, config.defaultMessage, values);\n    },\n};\n\nexport const errorMessage = (intl: typeof intlShim, error: string, _command: string, _position: number): string => { // eslint-disable-line @typescript-eslint/no-unused-vars\n    return intl.formatMessage({\n        id: 'apps.error.parser',\n        defaultMessage: 'Parsing error: {error}',\n    }, {\n        error,\n    });\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport Provider from './provider.jsx';\nimport Suggestion from './suggestion.jsx';\n\nclass ChannelSuggestion extends Suggestion {\n    render() {\n        const isSelection = this.props.isSelection;\n        const item = this.props.item;\n\n        const channelName = item.display_name;\n        const purpose = item.purpose;\n\n        const icon = (\n            <span className='suggestion-list__icon suggestion-list__icon--large'>\n                <i className='icon icon--standard icon--no-spacing icon-globe'/>\n            </span>\n        );\n        let className = 'suggestion-list__item';\n        if (isSelection) {\n            className += ' suggestion--selected';\n        }\n\n        const description = '(~' + item.name + ')';\n\n        return (\n            <div\n                className={className}\n                onClick={this.handleClick}\n                onMouseMove={this.handleMouseMove}\n                {...Suggestion.baseProps}\n            >\n                {icon}\n                <div className='suggestion-list__ellipsis'>\n                    <span className='suggestion-list__main'>\n                        {channelName}\n                    </span>\n                    <span className='ml-2'>\n                        {' '}\n                        {description}\n                    </span>\n                    <span className='ml-2'>\n                        {' '}\n                        {purpose}\n                    </span>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default class ChannelProvider extends Provider {\n    constructor(channelSearchFunc) {\n        super();\n\n        this.autocompleteChannels = channelSearchFunc;\n    }\n\n    handlePretextChanged(pretext, resultsCallback) {\n        const normalizedPretext = pretext.toLowerCase();\n        this.startNewRequest(normalizedPretext);\n\n        this.autocompleteChannels(\n            normalizedPretext,\n            (data) => {\n                if (this.shouldCancelDispatch(normalizedPretext)) {\n                    return;\n                }\n\n                const channels = Object.assign([], data);\n\n                resultsCallback({\n                    matchedPretext: normalizedPretext,\n                    terms: channels.map((channel) => channel.display_name),\n                    items: channels,\n                    component: ChannelSuggestion,\n                });\n            },\n        );\n\n        return true;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport * as Utils from 'utils/utils.jsx';\n\nimport GuestBadge from 'components/widgets/badges/guest_badge';\nimport BotBadge from 'components/widgets/badges/bot_badge';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport Provider from './provider.jsx';\nimport Suggestion from './suggestion.jsx';\n\nclass UserSuggestion extends Suggestion {\n    render() {\n        const {item, isSelection} = this.props;\n\n        let className = 'suggestion-list__item';\n        if (isSelection) {\n            className += ' suggestion--selected';\n        }\n\n        const username = item.username;\n        let description = '';\n\n        if ((item.first_name || item.last_name) && item.nickname) {\n            description = `- ${Utils.getFullName(item)} (${item.nickname})`;\n        } else if (item.nickname) {\n            description = `- (${item.nickname})`;\n        } else if (item.first_name || item.last_name) {\n            description = `- ${Utils.getFullName(item)}`;\n        }\n\n        return (\n            <div\n                className={className}\n                onClick={this.handleClick}\n                onMouseMove={this.handleMouseMove}\n                {...Suggestion.baseProps}\n            >\n                <Avatar\n                    size='xxs'\n                    username={username}\n                    url={Client4.getUsersRoute() + '/' + item.id + '/image?_=' + (item.last_picture_update || 0)}\n                />\n                <div className='suggestion-list__ellipsis'>\n                    <span className='suggestion-list__main'>\n                        {'@' + username}\n                    </span>\n                    <span>\n                        {' '}\n                        {description}\n                    </span>\n                </div>\n                <BotBadge show={Boolean(item.is_bot)}/>\n                <GuestBadge show={Utils.isGuest(item)}/>\n            </div>\n        );\n    }\n}\n\nexport default class UserProvider extends Provider {\n    constructor(searchUsersFunc) {\n        super();\n        this.autocompleteUsers = searchUsersFunc;\n    }\n    async handlePretextChanged(pretext, resultsCallback) {\n        const normalizedPretext = pretext.toLowerCase();\n        this.startNewRequest(normalizedPretext);\n\n        const data = await this.autocompleteUsers(normalizedPretext);\n\n        if (this.shouldCancelDispatch(normalizedPretext)) {\n            return false;\n        }\n\n        const users = Object.assign([], data.users);\n\n        resultsCallback({\n            matchedPretext: normalizedPretext,\n            terms: users.map((user) => user.username),\n            items: users,\n            component: UserSuggestion,\n        });\n\n        return true;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport Provider from './provider.jsx';\nimport Suggestion from './suggestion.jsx';\n\nclass MenuActionSuggestion extends Suggestion {\n    render() {\n        const {item, isSelection} = this.props;\n\n        let className = 'suggestion-list__item';\n        if (isSelection) {\n            className += ' suggestion--selected';\n        }\n\n        return (\n            <div\n                className={className}\n                onClick={this.handleClick}\n                onMouseMove={this.handleMouseMove}\n                {...Suggestion.baseProps}\n            >\n                {item.text}\n            </div>\n        );\n    }\n}\n\nexport default class MenuActionProvider extends Provider {\n    constructor(options) {\n        super();\n        this.options = options;\n    }\n\n    handlePretextChanged(prefix, resultsCallback) {\n        if (prefix.length === 0) {\n            this.displayAllOptions(resultsCallback);\n            return true;\n        }\n\n        if (prefix) {\n            this.filterOptions(prefix, resultsCallback);\n            return true;\n        }\n\n        return false;\n    }\n\n    async displayAllOptions(resultsCallback) {\n        const terms = this.options.map((option) => option.text);\n\n        resultsCallback({\n            matchedPretext: '',\n            terms,\n            items: this.options,\n            component: MenuActionSuggestion,\n        });\n    }\n\n    async filterOptions(prefix, resultsCallback) {\n        const filteredOptions = this.options.filter((option) => option.text.toLowerCase().indexOf(prefix.toLowerCase()) >= 0);\n        const terms = filteredOptions.map((option) => option.text);\n\n        resultsCallback({\n            matchedPretext: prefix,\n            terms,\n            items: filteredOptions,\n            component: MenuActionSuggestion,\n        });\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport SuggestionList from 'components/suggestion/suggestion_list.jsx';\nimport {getClosestParent} from 'utils/utils.jsx';\n\nexport default class ModalSuggestionList extends React.PureComponent {\n    static propTypes = {\n        position: PropTypes.string.isRequired,\n        open: PropTypes.bool.isRequired,\n        cleared: PropTypes.bool.isRequired,\n        inputRef: PropTypes.object.isRequired,\n        onLoseVisibility: PropTypes.func.isRequired,\n    }\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            scroll: 0,\n            modalBounds: {top: 0, bottom: 0},\n            inputBounds: {top: 0, bottom: 0, width: 0},\n            position: props.position,\n        };\n\n        this.container = React.createRef();\n        this.suggestionList = React.createRef();\n        this.latestHeight = 0;\n    }\n\n    calculateInputRect = () => {\n        if (this.props.inputRef.current) {\n            const rect = this.props.inputRef.current.getInput().getBoundingClientRect();\n            return {top: rect.top, bottom: rect.bottom, width: rect.width};\n        }\n        return {top: 0, bottom: 0, width: 0};\n    }\n\n    onModalScroll = (e) => {\n        if (this.state.scroll !== e.target.scrollTop &&\n            this.latestHeight !== 0) {\n            this.setState({scroll: e.target.scrollTop});\n        }\n    }\n\n    componentDidMount() {\n        if (this.container.current) {\n            const modalBodyContainer = getClosestParent(this.container.current, '.modal-body');\n            modalBodyContainer.addEventListener('scroll', this.onModalScroll);\n        }\n        window.addEventListener('resize', this.updateModalBounds);\n    }\n\n    componentWillUnmount() {\n        if (this.container.current) {\n            const modalBodyContainer = getClosestParent(this.container.current, '.modal-body');\n            modalBodyContainer.removeEventListener('scroll', this.onModalScroll);\n        }\n        window.removeEventListener('resize', this.updateModalBounds);\n    }\n\n    componentDidUpdate(prevProps, prevState) {\n        if (!this.props.open || this.props.cleared) {\n            return;\n        }\n\n        if (prevProps.open !== this.state.open ||\n            prevProps.cleared !== this.state.cleared ||\n            prevState.scroll !== this.state.scroll ||\n            prevState.modalBounds.top !== this.state.modalBounds.top ||\n            prevState.modalBounds.bottom !== this.state.modalBounds.bottom) {\n            const newInputBounds = this.updateInputBounds();\n            this.updatePosition(newInputBounds);\n\n            if (this.container.current) {\n                const modalBodyRect = getClosestParent(this.container.current, '.modal-body').getBoundingClientRect();\n                if ((newInputBounds.bottom < modalBodyRect.top) || (newInputBounds.top > modalBodyRect.bottom)) {\n                    this.props.onLoseVisibility();\n                    return;\n                }\n            }\n\n            this.updateModalBounds();\n        }\n    }\n\n    getChildHeight = () => {\n        if (!this.container.current) {\n            return 0;\n        }\n\n        const listElement = this.suggestionList.current?.getContent()?.[0];\n        if (!listElement) {\n            return 0;\n        }\n\n        return listElement.getBoundingClientRect().height;\n    }\n\n    updateInputBounds = () => {\n        const inputBounds = this.calculateInputRect();\n        if (inputBounds.top !== this.state.inputBounds.top ||\n            inputBounds.bottom !== this.state.inputBounds.bottom ||\n            inputBounds.width !== this.state.inputBounds.width) {\n            this.setState({inputBounds});\n        }\n        return inputBounds;\n    }\n\n    updatePosition = (newInputBounds) => {\n        let inputBounds = newInputBounds;\n        if (!newInputBounds) {\n            inputBounds = this.state.inputBounds;\n        }\n\n        if (!this.container.current) {\n            return;\n        }\n\n        this.latestHeight = this.getChildHeight();\n\n        let newPosition = this.props.position;\n        if (window.innerHeight < inputBounds.bottom + this.latestHeight) {\n            newPosition = 'top';\n        }\n        if (inputBounds.top - this.latestHeight < 0) {\n            newPosition = 'bottom';\n        }\n\n        if (this.state.position !== newPosition) {\n            this.setState({position: newPosition});\n        }\n    }\n\n    updateModalBounds = () => {\n        if (!this.container.current) {\n            return;\n        }\n\n        const modalContainer = getClosestParent(this.container.current, '.modal-content');\n        const modalBounds = modalContainer.getBoundingClientRect();\n\n        if (this.state.modalBounds.top !== modalBounds.top || this.state.modalBounds.bottom !== modalBounds.bottom) {\n            this.setState({modalBounds: {top: modalBounds.top, bottom: modalBounds.bottom}});\n        }\n    }\n\n    render() {\n        const {\n            ...props\n        } = this.props;\n\n        Reflect.deleteProperty(props, 'onLoseVisibility');\n\n        let position = {};\n        if (this.state.position === 'top') {\n            position = {bottom: this.state.modalBounds.bottom - this.state.inputBounds.top};\n        } else {\n            position = {top: this.state.inputBounds.bottom - this.state.modalBounds.top};\n        }\n\n        return (\n            <div\n                style={{position: 'fixed', zIndex: 101, width: this.state.inputBounds.width, ...position}}\n                ref={this.container}\n            >\n                <SuggestionList\n                    {...props}\n                    position={this.state.position}\n                    ref={this.suggestionList}\n                />\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport default class Provider {\n    constructor() {\n        this.latestPrefix = '';\n        this.latestComplete = true;\n        this.disableDispatches = false;\n        this.requestStarted = false;\n    }\n\n    handlePretextChanged(pretext, callback) { // eslint-disable-line no-unused-vars\n        // NO-OP for inherited classes to override\n    }\n\n    resetRequest() {\n        this.requestStarted = false;\n    }\n\n    startNewRequest(prefix) {\n        this.latestPrefix = prefix;\n        this.latestComplete = false;\n        this.requestStarted = true;\n    }\n\n    shouldCancelDispatch(prefix) {\n        if (this.disableDispatches) {\n            return true;\n        }\n\n        if (!this.requestStarted) {\n            return true;\n        }\n\n        if (prefix === this.latestPrefix) {\n            this.latestComplete = true;\n        } else if (this.latestComplete) {\n            return true;\n        }\n\n        return false;\n    }\n\n    allowDividers() {\n        return true;\n    }\n\n    presentationType() {\n        return 'text';\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nexport default class Suggestion extends React.PureComponent {\n    static get propTypes() {\n        return {\n            item: PropTypes.oneOfType([\n                PropTypes.object,\n                PropTypes.string,\n            ]).isRequired,\n            term: PropTypes.string.isRequired,\n            matchedPretext: PropTypes.string.isRequired,\n            isSelection: PropTypes.bool,\n            onClick: PropTypes.func,\n            onMouseMove: PropTypes.func,\n        };\n    }\n\n    static baseProps = {\n        role: 'button',\n        tabIndex: -1,\n    };\n\n    handleClick = (e) => {\n        e.preventDefault();\n\n        this.props.onClick(this.props.term, this.props.matchedPretext);\n    }\n\n    handleMouseMove = (e) => {\n        e.preventDefault();\n\n        this.props.onMouseMove(this.props.term);\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport EventEmitter from 'mattermost-redux/utils/event_emitter';\n\nimport QuickInput from 'components/quick_input';\nimport Constants from 'utils/constants';\nimport * as UserAgent from 'utils/user_agent';\nimport * as Utils from 'utils/utils.jsx';\n\nconst EXECUTE_CURRENT_COMMAND_ITEM_ID = Constants.Integrations.EXECUTE_CURRENT_COMMAND_ITEM_ID;\nconst KeyCodes = Constants.KeyCodes;\n\nexport default class SuggestionBox extends React.PureComponent {\n    static propTypes = {\n\n        /**\n         * The list component to render, usually SuggestionList\n         */\n        listComponent: PropTypes.func.isRequired,\n\n        /**\n         * Where the list will be displayed relative to the input box, defaults to 'top'\n         */\n        listPosition: PropTypes.oneOf(['top', 'bottom']),\n\n        /**\n         * The input component to render (it is passed through props to the QuickInput)\n         */\n        inputComponent: PropTypes.elementType,\n\n        /**\n         * The date component to render\n         */\n        dateComponent: PropTypes.func,\n\n        /**\n         * The value of in the input\n         */\n        value: PropTypes.string.isRequired,\n\n        /**\n         * Array of suggestion providers\n         */\n        providers: PropTypes.arrayOf(PropTypes.object).isRequired,\n\n        /**\n         * CSS class for the div parent of the input box\n         */\n        containerClass: PropTypes.string,\n\n        /**\n         * Set to true to draw dividers between types of list items, defaults to false\n         */\n        renderDividers: PropTypes.bool,\n\n        /**\n         * Set to true to render a message when there were no results found, defaults to false\n         */\n        renderNoResults: PropTypes.bool,\n\n        /**\n         * Set to allow TAB to select an item in the list, defaults to true\n         */\n        completeOnTab: PropTypes.bool,\n\n        /**\n         * Function called when input box gains focus\n         */\n        onFocus: PropTypes.func,\n\n        /**\n         * Function called when input box loses focus\n         */\n        onBlur: PropTypes.func,\n\n        /**\n         * Function called when input box value changes\n         */\n        onChange: PropTypes.func,\n\n        /**\n         * Function called when a key is pressed and the input box is in focus\n         */\n        onKeyDown: PropTypes.func,\n        onKeyPress: PropTypes.func,\n        onComposition: PropTypes.func,\n\n        onSelect: PropTypes.func,\n        onSearchTypeSelected: PropTypes.func,\n\n        /**\n         * Function called when an item is selected\n         */\n        onItemSelected: PropTypes.func,\n\n        /**\n         * Flags if the suggestion_box is for the RHS (Reply).\n         */\n        isRHS: PropTypes.bool,\n\n        /**\n         * The number of characters required to show the suggestion list, defaults to 1\n         */\n        requiredCharacters: PropTypes.number,\n\n        /**\n         * If true, the suggestion box is opened on focus, default to false\n         */\n        openOnFocus: PropTypes.bool,\n\n        /**\n         * If true, the suggestion box is disabled\n         */\n        disabled: PropTypes.bool,\n\n        /**\n         * If true, it displays allow to display a default list when empty\n         */\n        openWhenEmpty: PropTypes.bool,\n\n        /**\n         * If true, replace all input in the suggestion box with the selected option after a select, defaults to false\n         */\n        replaceAllInputOnSelect: PropTypes.bool,\n\n        /**\n         * An optional, opaque identifier that distinguishes the context in which the suggestion\n         * box is rendered. This allows the reused component to otherwise respond to changes.\n         */\n        contextId: PropTypes.string,\n\n        /**\n         * If true, listen for clicks on a mention and populate the input with said mention, defaults to false\n         */\n        listenForMentionKeyClick: PropTypes.bool,\n\n        /**\n         * Passes the wrapper reference for height calculation\n         */\n        wrapperHeight: PropTypes.number,\n\n        /**\n         * Allows parent to access received suggestions\n         */\n        onSuggestionsReceived: PropTypes.func,\n\n        /**\n         * To show suggestions even when focus is lost\n         */\n        forceSuggestionsWhenBlur: PropTypes.bool,\n    }\n\n    static defaultProps = {\n        listPosition: 'top',\n        containerClass: '',\n        renderDividers: false,\n        renderNoResults: false,\n        completeOnTab: true,\n        isRHS: false,\n        requiredCharacters: 1,\n        openOnFocus: false,\n        openWhenEmpty: false,\n        replaceAllInputOnSelect: false,\n        listenForMentionKeyClick: false,\n        forceSuggestionsWhenBlur: false,\n    }\n\n    constructor(props) {\n        super(props);\n        this.suggestionReadOut = React.createRef();\n\n        // Keep track of whether we're composing a CJK character so we can make suggestions for partial characters\n        this.composing = false;\n\n        this.pretext = '';\n\n        // Used for debouncing pretext changes\n        this.timeoutId = '';\n\n        // Used for preventing suggestion list to close when scrollbar is clicked\n        this.preventSuggestionListCloseFlag = false;\n\n        // pretext: the text before the cursor\n        // matchedPretext: a list of the text before the cursor that will be replaced if the corresponding autocomplete term is selected\n        // terms: a list of strings which the previously typed text may be replaced by\n        // items: a list of objects backing the terms which may be used in rendering\n        // components: a list of react components that can be used to render their corresponding item\n        // selection: the term currently selected by the keyboard\n        this.state = {\n            focused: false,\n            cleared: true,\n            matchedPretext: [],\n            items: [],\n            terms: [],\n            components: [],\n            selection: '',\n            allowDividers: true,\n            presentationType: 'text',\n            suggestionBoxAlgn: undefined,\n        };\n\n        this.inputRef = React.createRef();\n    }\n\n    componentDidMount() {\n        if (this.props.listenForMentionKeyClick) {\n            EventEmitter.addListener('mention_key_click', this.handleMentionKeyClick);\n        }\n        this.handlePretextChanged(this.pretext);\n    }\n\n    componentWillUnmount() {\n        EventEmitter.removeListener('mention_key_click', this.handleMentionKeyClick);\n    }\n\n    componentDidUpdate(prevProps) {\n        const {value} = this.props;\n\n        // Post was just submitted, update pretext property.\n        if (value === '' && this.pretext !== value) {\n            this.handlePretextChanged(value);\n            return;\n        }\n\n        if (prevProps.contextId !== this.props.contextId) {\n            const textbox = this.getTextbox();\n            const pretext = textbox.value.substring(0, textbox.selectionEnd).toLowerCase();\n\n            this.handlePretextChanged(pretext);\n        }\n    }\n\n    handleMentionKeyClick = (mentionKey, isRHS) => {\n        if (this.props.isRHS !== isRHS) {\n            return;\n        }\n\n        let insertText = '@' + mentionKey;\n\n        // if the current text does not end with a whitespace, then insert a space\n        if (this.props.value && (/[^\\s]$/).test(this.props.value)) {\n            insertText = ' ' + insertText;\n        }\n\n        this.addTextAtCaret(insertText, '');\n    }\n\n    getTextbox = () => {\n        if (!this.inputRef.current) {\n            return null;\n        }\n\n        const input = this.inputRef.current.getInput();\n\n        if (input.getDOMNode) {\n            return input.getDOMNode();\n        }\n\n        return input;\n    }\n\n    recalculateSize = () => {\n        // Pretty hacky way to force an AutosizeTextarea to recalculate its height if that's what\n        // we're rendering as the input\n        const input = this.inputRef.current.getInput();\n\n        if (input.recalculateSize) {\n            input.recalculateSize();\n        }\n    }\n\n    handleEmitClearSuggestions = (delay = 0) => {\n        setTimeout(() => {\n            this.clear();\n        }, delay);\n    }\n\n    preventSuggestionListClose = () => {\n        this.preventSuggestionListCloseFlag = true;\n    }\n\n    handleFocusOut = (e) => {\n        if (this.preventSuggestionListCloseFlag) {\n            this.preventSuggestionListCloseFlag = false;\n            return;\n        }\n\n        // Focus is switching TO e.relatedTarget, so only treat this as a blur event if we're not switching\n        // between children (like from the textbox to the suggestion list)\n        if (this.container.contains(e.relatedTarget)) {\n            return;\n        }\n\n        if (UserAgent.isIos() && !e.relatedTarget) {\n            // On Safari and iOS classic app, the autocomplete stays open\n            // when you tap outside of the post textbox or search box.\n            return;\n        }\n\n        if (!this.props.forceSuggestionsWhenBlur) {\n            this.handleEmitClearSuggestions();\n        }\n\n        this.setState({focused: false});\n\n        if (this.props.onBlur) {\n            this.props.onBlur();\n        }\n    };\n\n    handleFocusIn = (e) => {\n        // Focus is switching FROM e.relatedTarget, so only treat this as a focus event if we're not switching\n        // between children (like from the textbox to the suggestion list). PreventSuggestionListCloseFlag is\n        // checked because if true, it means that the focusIn comes from a click in the suggestion box, an\n        // option choice, so we don't want the focus event to be triggered\n        if (this.container.contains(e.relatedTarget) || this.preventSuggestionListCloseFlag) {\n            return;\n        }\n\n        this.setState({focused: true});\n\n        if (this.props.openOnFocus || this.props.openWhenEmpty) {\n            setTimeout(() => {\n                const textbox = this.getTextbox();\n                if (textbox) {\n                    const pretext = textbox.value.substring(0, textbox.selectionEnd);\n                    if (this.props.openWhenEmpty || pretext.length >= this.props.requiredCharacters) {\n                        if (this.pretext !== pretext) {\n                            this.handlePretextChanged(pretext);\n                        }\n                    }\n                }\n            });\n        }\n\n        if (this.props.onFocus) {\n            this.props.onFocus();\n        }\n    };\n\n    handleChange = (e) => {\n        const textbox = this.getTextbox();\n        const pretext = textbox.value.substring(0, textbox.selectionEnd);\n\n        if (!this.composing && this.pretext !== pretext) {\n            this.handlePretextChanged(pretext);\n        }\n\n        if (this.props.onChange) {\n            this.props.onChange(e);\n        }\n    }\n\n    handleCompositionStart = () => {\n        this.composing = true;\n        if (this.props.onComposition) {\n            this.props.onComposition();\n        }\n    }\n\n    handleCompositionUpdate = (e) => {\n        if (!e.data) {\n            return;\n        }\n\n        // The caret appears before the CJK character currently being composed, so re-add it to the pretext\n        const textbox = this.getTextbox();\n        const pretext = textbox.value.substring(0, textbox.selectionStart) + e.data;\n\n        this.handlePretextChanged(pretext);\n        if (this.props.onComposition) {\n            this.props.onComposition();\n        }\n    }\n\n    handleCompositionEnd = () => {\n        this.composing = false;\n        if (this.props.onComposition) {\n            this.props.onComposition();\n        }\n    }\n\n    addTextAtCaret = (term, matchedPretext) => {\n        const textbox = this.getTextbox();\n        const caret = textbox.selectionEnd;\n        const text = this.props.value;\n        const pretext = textbox.value.substring(0, textbox.selectionEnd);\n\n        let prefix;\n        let keepPretext = false;\n        if (pretext.toLowerCase().endsWith(matchedPretext.toLowerCase())) {\n            prefix = pretext.substring(0, pretext.length - matchedPretext.length);\n        } else {\n            // the pretext has changed since we got a term to complete so see if the term still fits the pretext\n            const termWithoutMatched = term.substring(matchedPretext.length);\n            const overlap = SuggestionBox.findOverlap(pretext, termWithoutMatched);\n\n            keepPretext = overlap.length === 0;\n            prefix = pretext.substring(0, pretext.length - overlap.length - matchedPretext.length);\n        }\n\n        const suffix = text.substring(caret);\n\n        let newValue;\n        if (keepPretext) {\n            newValue = pretext;\n        } else {\n            newValue = prefix + term + ' ' + suffix;\n        }\n\n        textbox.value = newValue;\n\n        if (this.props.onChange) {\n            // fake an input event to send back to parent components\n            const e = {\n                target: textbox,\n            };\n\n            // don't call handleChange or we'll get into an event loop\n            this.props.onChange(e);\n        }\n\n        // set the caret position after the next rendering\n        window.requestAnimationFrame(() => {\n            if (textbox.value === newValue) {\n                Utils.setCaretPosition(textbox, prefix.length + term.length + 1);\n            }\n        });\n    }\n\n    replaceText = (term) => {\n        const textbox = this.getTextbox();\n        textbox.value = term;\n\n        if (this.props.onChange) {\n            // fake an input event to send back to parent components\n            const e = {\n                target: textbox,\n            };\n\n            // don't call handleChange or we'll get into an event loop\n            this.props.onChange(e);\n        }\n    }\n\n    handleCompleteWord = (term, matchedPretext, e) => {\n        let fixedTerm = term;\n        let finish = false;\n        if (term.endsWith(EXECUTE_CURRENT_COMMAND_ITEM_ID)) {\n            fixedTerm = term.substring(0, term.length - EXECUTE_CURRENT_COMMAND_ITEM_ID.length);\n            finish = true;\n        }\n\n        if (!finish) {\n            if (this.props.replaceAllInputOnSelect) {\n                this.replaceText(fixedTerm);\n            } else {\n                this.addTextAtCaret(fixedTerm, matchedPretext);\n            }\n        }\n\n        if (this.props.onItemSelected) {\n            const items = this.state.items;\n            const terms = this.state.terms;\n            for (let i = 0; i < terms.length; i++) {\n                if (terms[i] === fixedTerm) {\n                    this.props.onItemSelected(items[i]);\n                    break;\n                }\n            }\n        }\n\n        this.clear();\n\n        this.inputRef.current.focus();\n\n        if (finish && this.props.onKeyPress) {\n            let ke = e;\n            if (!e || Utils.isKeyPressed(e, Constants.KeyCodes.TAB)) {\n                ke = new KeyboardEvent('keydown', {\n                    bubbles: true, cancelable: true, keyCode: 13,\n                });\n                if (e) {\n                    e.preventDefault();\n                }\n            }\n            this.props.onKeyPress(ke);\n            return true;\n        }\n\n        if (!finish) {\n            for (const provider of this.props.providers) {\n                if (provider.handleCompleteWord) {\n                    provider.handleCompleteWord(fixedTerm, matchedPretext, this.handlePretextChanged);\n                }\n            }\n        }\n        return false;\n    }\n\n    selectNext = () => {\n        this.setSelectionByDelta(1);\n    }\n\n    selectPrevious = () => {\n        this.setSelectionByDelta(-1);\n    }\n\n    setSelectionByDelta = (delta) => {\n        let selectionIndex = this.state.terms.indexOf(this.state.selection);\n\n        if (selectionIndex === -1) {\n            this.setState({\n                selection: '',\n            });\n            return;\n        }\n\n        selectionIndex += delta;\n\n        if (selectionIndex < 0) {\n            selectionIndex = 0;\n        } else if (selectionIndex > this.state.terms.length - 1) {\n            selectionIndex = this.state.terms.length - 1;\n        }\n\n        this.setState({\n            selection: this.state.terms[selectionIndex],\n        });\n    }\n\n    setSelection = (term) => {\n        this.setState({\n            selection: term,\n        });\n    }\n\n    clear = () => {\n        if (!this.state.cleared) {\n            this.setState({\n                cleared: true,\n                matchedPretext: [],\n                terms: [],\n                items: [],\n                components: [],\n                selection: '',\n                suggestionBoxAlgn: undefined,\n            });\n            this.handlePretextChanged('');\n        }\n    }\n\n    hasSuggestions = () => {\n        return this.state.items.some((item) => !item.loading);\n    }\n\n    handleKeyDown = (e) => {\n        if ((this.props.openWhenEmpty || this.props.value) && this.hasSuggestions()) {\n            const ctrlOrMetaKeyPressed = e.ctrlKey || e.metaKey;\n            if (Utils.isKeyPressed(e, KeyCodes.UP)) {\n                this.selectPrevious();\n                e.preventDefault();\n            } else if (Utils.isKeyPressed(e, KeyCodes.DOWN)) {\n                this.selectNext();\n                e.preventDefault();\n            } else if ((Utils.isKeyPressed(e, KeyCodes.ENTER) && !ctrlOrMetaKeyPressed) || (this.props.completeOnTab && Utils.isKeyPressed(e, KeyCodes.TAB))) {\n                let matchedPretext = '';\n                for (let i = 0; i < this.state.terms.length; i++) {\n                    if (this.state.terms[i] === this.state.selection) {\n                        matchedPretext = this.state.matchedPretext[i];\n                    }\n                }\n\n                // If these don't match, the user typed quickly and pressed enter before we could\n                // update the pretext, so update the pretext before completing\n                if (this.pretext.toLowerCase().endsWith(matchedPretext.toLowerCase())) {\n                    if (this.handleCompleteWord(this.state.selection, matchedPretext, e)) {\n                        return;\n                    }\n                } else {\n                    clearTimeout(this.timeoutId);\n                    this.nonDebouncedPretextChanged(this.pretext, true);\n                }\n\n                if (this.props.onKeyDown) {\n                    this.props.onKeyDown(e);\n                }\n                e.preventDefault();\n            } else if (Utils.isKeyPressed(e, KeyCodes.ESCAPE)) {\n                this.clear();\n                this.setState({presentationType: 'text'});\n                e.preventDefault();\n                e.stopPropagation();\n            } else if (this.props.onKeyDown) {\n                this.props.onKeyDown(e);\n            }\n        } else if (this.props.onKeyDown) {\n            this.props.onKeyDown(e);\n        }\n    }\n\n    handleSelect = (e) => {\n        if (this.props.onSelect) {\n            this.props.onSelect(e);\n        }\n    }\n\n    handleReceivedSuggestions = (suggestions) => {\n        const newComponents = [];\n        const newPretext = [];\n        if (this.props.onSuggestionsReceived) {\n            this.props.onSuggestionsReceived(suggestions);\n        }\n\n        for (let i = 0; i < suggestions.terms.length; i++) {\n            newComponents.push(suggestions.component);\n            newPretext.push(suggestions.matchedPretext);\n        }\n        const terms = suggestions.terms;\n        const items = suggestions.items;\n        let selection = this.state.selection;\n        if (terms.length > 0) {\n            selection = terms[0];\n        } else if (this.state.selection) {\n            selection = '';\n        }\n\n        this.setState({\n            cleared: false,\n            selection,\n            terms,\n            items,\n            components: newComponents,\n            matchedPretext: newPretext,\n        });\n\n        return {selection, matchedPretext: suggestions.matchedPretext};\n    }\n\n    handleReceivedSuggestionsAndComplete = (suggestions) => {\n        const {selection, matchedPretext} = this.handleReceivedSuggestions(suggestions);\n        if (selection) {\n            this.handleCompleteWord(selection, matchedPretext);\n        }\n    }\n\n    nonDebouncedPretextChanged = (pretext, complete = false) => {\n        this.pretext = pretext;\n        let handled = false;\n        let callback = this.handleReceivedSuggestions;\n        if (complete) {\n            callback = this.handleReceivedSuggestionsAndComplete;\n        }\n        for (const provider of this.props.providers) {\n            handled = provider.handlePretextChanged(pretext, callback) || handled;\n\n            if (handled) {\n                if (!this.state.suggestionBoxAlgn && ['@', ':', '~', '/'].includes(provider.triggerCharacter)) {\n                    const char = provider.triggerCharacter;\n                    const pxToSubstract = Utils.getPxToSubstract(char);\n\n                    // get the alignment for the box and set it in the component state\n                    const suggestionBoxAlgn = Utils.getSuggestionBoxAlgn(this.getTextbox(), pxToSubstract);\n                    this.setState({\n                        suggestionBoxAlgn,\n                    });\n                }\n\n                this.setState({\n                    presentationType: provider.presentationType(),\n                    allowDividers: provider.allowDividers(),\n                });\n\n                break;\n            }\n        }\n        if (!handled) {\n            this.clear();\n        }\n    }\n\n    debouncedPretextChanged = (pretext) => {\n        clearTimeout(this.timeoutId);\n        this.timeoutId = setTimeout(() => this.nonDebouncedPretextChanged(pretext), Constants.SEARCH_TIMEOUT_MILLISECONDS);\n    };\n\n    handlePretextChanged = (pretext) => {\n        this.pretext = pretext;\n        this.debouncedPretextChanged(pretext);\n    }\n\n    blur = () => {\n        this.inputRef.current.blur();\n    }\n\n    focus = () => {\n        const input = this.inputRef.current.input;\n        if (input.value === '\"\"' || input.value.endsWith('\"\"')) {\n            input.selectionStart = input.value.length - 1;\n            input.selectionEnd = input.value.length - 1;\n        } else {\n            input.selectionStart = input.value.length;\n        }\n        input.focus();\n\n        this.handleChange({target: this.inputRef.current});\n    }\n\n    setContainerRef = (container) => {\n        // Attach/detach event listeners that aren't supported by React\n        if (this.container) {\n            this.container.removeEventListener('focusin', this.handleFocusIn);\n            this.container.removeEventListener('focusout', this.handleFocusOut);\n        }\n\n        if (container) {\n            container.addEventListener('focusin', this.handleFocusIn);\n            container.addEventListener('focusout', this.handleFocusOut);\n        }\n\n        // Save ref\n        this.container = container;\n    };\n\n    render() {\n        const {\n            dateComponent,\n            listComponent,\n            listPosition,\n            renderNoResults,\n            ...props\n        } = this.props;\n\n        const renderDividers = this.props.renderDividers && this.state.allowDividers;\n\n        // Don't pass props used by SuggestionBox\n        Reflect.deleteProperty(props, 'providers');\n        Reflect.deleteProperty(props, 'onChange'); // We use onInput instead of onChange on the actual input\n        Reflect.deleteProperty(props, 'onComposition');\n        Reflect.deleteProperty(props, 'onItemSelected');\n        Reflect.deleteProperty(props, 'completeOnTab');\n        Reflect.deleteProperty(props, 'isRHS');\n        Reflect.deleteProperty(props, 'requiredCharacters');\n        Reflect.deleteProperty(props, 'openOnFocus');\n        Reflect.deleteProperty(props, 'openWhenEmpty');\n        Reflect.deleteProperty(props, 'onFocus');\n        Reflect.deleteProperty(props, 'onBlur');\n        Reflect.deleteProperty(props, 'containerClass');\n        Reflect.deleteProperty(props, 'replaceAllInputOnSelect');\n        Reflect.deleteProperty(props, 'renderDividers');\n        Reflect.deleteProperty(props, 'contextId');\n        Reflect.deleteProperty(props, 'listenForMentionKeyClick');\n        Reflect.deleteProperty(props, 'wrapperHeight');\n        Reflect.deleteProperty(props, 'forceSuggestionsWhenBlur');\n        Reflect.deleteProperty(props, 'onSuggestionsReceived');\n\n        // This needs to be upper case so React doesn't think it's an html tag\n        const SuggestionListComponent = listComponent;\n        const SuggestionDateComponent = dateComponent;\n\n        return (\n            <div\n                ref={this.setContainerRef}\n                className={this.props.containerClass}\n            >\n                <div\n                    ref={this.suggestionReadOut}\n                    aria-live='polite'\n                    role='alert'\n                    className='sr-only'\n                />\n                <QuickInput\n                    ref={this.inputRef}\n                    autoComplete='off'\n                    {...props}\n                    onInput={this.handleChange}\n                    onCompositionStart={this.handleCompositionStart}\n                    onCompositionUpdate={this.handleCompositionUpdate}\n                    onCompositionEnd={this.handleCompositionEnd}\n                    onKeyDown={this.handleKeyDown}\n                    onSelect={this.handleSelect}\n                />\n                {(this.props.openWhenEmpty || this.props.value.length >= this.props.requiredCharacters) && this.state.presentationType === 'text' &&\n                    <div style={{width: this.state.width}}>\n                        <SuggestionListComponent\n                            target={this.inputRef}\n                            ariaLiveRef={this.suggestionReadOut}\n                            open={this.state.focused || this.props.forceSuggestionsWhenBlur}\n                            pretext={this.pretext}\n                            position={listPosition}\n                            renderDividers={renderDividers}\n                            renderNoResults={renderNoResults}\n                            onCompleteWord={this.handleCompleteWord}\n                            preventClose={this.preventSuggestionListClose}\n                            onItemHover={this.setSelection}\n                            cleared={this.state.cleared}\n                            matchedPretext={this.state.matchedPretext}\n                            items={this.state.items}\n                            terms={this.state.terms}\n                            suggestionBoxAlgn={this.state.suggestionBoxAlgn}\n                            selection={this.state.selection}\n                            components={this.state.components}\n                            wrapperHeight={this.props.wrapperHeight}\n                            inputRef={this.inputRef}\n                            onLoseVisibility={this.blur}\n                        />\n                    </div>\n                }\n                {(this.props.openWhenEmpty || this.props.value.length >= this.props.requiredCharacters) && this.state.presentationType === 'date' &&\n                    <SuggestionDateComponent\n                        items={this.state.items}\n                        terms={this.state.terms}\n                        components={this.state.components}\n                        matchedPretext={this.state.matchedPretext}\n                        onCompleteWord={this.handleCompleteWord}\n                    />\n                }\n            </div>\n        );\n    }\n\n    // Finds the longest substring that's at both the end of b and the start of a. For example,\n    // if a = \"firepit\" and b = \"pitbull\", findOverlap would return \"pit\".\n    static findOverlap(a, b) {\n        const aLower = a.toLowerCase();\n        const bLower = b.toLowerCase();\n\n        for (let i = bLower.length; i > 0; i--) {\n            const substring = bLower.substring(0, i);\n\n            if (aLower.endsWith(substring)) {\n                return substring;\n            }\n        }\n\n        return '';\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport {FormattedMessage} from 'react-intl';\nimport {cloneDeep} from 'lodash';\n\nimport {isEmptyObject, windowHeight} from 'utils/utils.jsx';\nimport {Constants} from 'utils/constants.jsx';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\n// When this file is migrated to TypeScript, type definitions for its props already exist in ./suggestion_list.d.ts.\n\nexport default class SuggestionList extends React.PureComponent {\n    static propTypes = {\n        ariaLiveRef: PropTypes.object,\n        open: PropTypes.bool.isRequired,\n        position: PropTypes.oneOf(['top', 'bottom']),\n        renderDividers: PropTypes.bool,\n        renderNoResults: PropTypes.bool,\n        onCompleteWord: PropTypes.func.isRequired,\n        preventClose: PropTypes.func,\n        onItemHover: PropTypes.func.isRequired,\n        pretext: PropTypes.string.isRequired,\n        cleared: PropTypes.bool.isRequired,\n        matchedPretext: PropTypes.array.isRequired,\n        items: PropTypes.array.isRequired,\n        terms: PropTypes.array.isRequired,\n        selection: PropTypes.string.isRequired,\n        components: PropTypes.array.isRequired,\n        wrapperHeight: PropTypes.number,\n        suggestionBoxAlgn: PropTypes.object,\n    };\n\n    static defaultProps = {\n        renderDividers: false,\n        renderNoResults: false,\n    };\n\n    constructor(props) {\n        super(props);\n\n        this.contentRef = React.createRef();\n        this.itemRefs = new Map();\n        this.suggestionReadOut = React.createRef();\n        this.currentLabel = '';\n        this.currentItem = {};\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.selection !== prevProps.selection && this.props.selection) {\n            this.scrollToItem(this.props.selection);\n        }\n\n        if (!isEmptyObject(this.currentItem)) {\n            this.generateLabel(this.currentItem);\n        }\n    }\n\n    componentWillUnmount() {\n        this.removeLabel();\n    }\n\n    announceLabel() {\n        const suggestionReadOut = this.props.ariaLiveRef.current;\n        if (suggestionReadOut) {\n            suggestionReadOut.innerHTML = this.currentLabel;\n        }\n    }\n\n    removeLabel() {\n        const suggestionReadOut = this.props.ariaLiveRef.current;\n        if (suggestionReadOut) {\n            suggestionReadOut.innerHTML = '';\n        }\n    }\n\n    generateLabel(item) {\n        if (item.username) {\n            this.currentLabel = item.username;\n            if ((item.first_name || item.last_name) && item.nickname) {\n                this.currentLabel += ` ${item.first_name} ${item.last_name} ${item.nickname}`;\n            } else if (item.nickname) {\n                this.currentLabel += ` ${item.nickname}`;\n            } else if (item.first_name || item.last_name) {\n                this.currentLabel += ` ${item.first_name} ${item.last_name}`;\n            }\n        } else if (item.type === 'mention.channels') {\n            this.currentLabel = item.channel.display_name;\n        }\n\n        if (this.currentLabel) {\n            this.currentLabel = this.currentLabel.toLowerCase();\n        }\n        this.announceLabel();\n    }\n\n    getContent = () => {\n        return this.contentRef.current;\n    }\n\n    scrollToItem = (term) => {\n        const content = this.getContent();\n        if (!content) {\n            return;\n        }\n\n        const visibleContentHeight = content.clientHeight;\n        const actualContentHeight = content.scrollHeight;\n\n        if (visibleContentHeight < actualContentHeight) {\n            const contentTop = content.scrollTop;\n            const contentTopPadding = this.getComputedCssProperty(content, 'paddingTop');\n            const contentBottomPadding = this.getComputedCssProperty(content, 'paddingTop');\n\n            const item = ReactDOM.findDOMNode(this.itemRefs.get(term));\n            if (!item) {\n                return;\n            }\n\n            const itemTop = item.offsetTop - this.getComputedCssProperty(item, 'marginTop');\n            const itemBottomMargin = this.getComputedCssProperty(item, 'marginBottom') + this.getComputedCssProperty(item, 'paddingBottom');\n            const itemBottom = item.offsetTop + this.getComputedCssProperty(item, 'height') + itemBottomMargin;\n\n            if (itemTop - contentTopPadding < contentTop) {\n                // the item is off the top of the visible space\n                content.scrollTop = itemTop - contentTopPadding;\n            } else if (itemBottom + contentTopPadding + contentBottomPadding > contentTop + visibleContentHeight) {\n                // the item has gone off the bottom of the visible space\n                content.scrollTop = (itemBottom - visibleContentHeight) + contentTopPadding + contentBottomPadding;\n            }\n        }\n    }\n\n    getComputedCssProperty(element, property) {\n        return parseInt(getComputedStyle(element)[property], 10);\n    }\n\n    getTransform() {\n        if (!this.props.suggestionBoxAlgn) {\n            return {};\n        }\n\n        const {lineHeight, pixelsToMoveX} = this.props.suggestionBoxAlgn;\n        let pixelsToMoveY = this.props.suggestionBoxAlgn.pixelsToMoveY;\n\n        if (this.props.position === 'bottom') {\n            // Add the line height and 4 extra px so it looks less tight\n            pixelsToMoveY += this.props.suggestionBoxAlgn.lineHeight + 4;\n        }\n\n        // If the suggestion box was invoked from the first line in the post box, stick to the top of the post box\n        pixelsToMoveY = pixelsToMoveY > lineHeight ? pixelsToMoveY : 0;\n\n        return {\n            transform: `translate(${pixelsToMoveX}px, ${pixelsToMoveY}px)`,\n        };\n    }\n\n    renderDivider(type) {\n        return (\n            <div\n                key={type + '-divider'}\n                className='suggestion-list__divider'\n            >\n                <span>\n                    <FormattedMessage id={'suggestion.' + type}/>\n                </span>\n            </div>\n        );\n    }\n\n    renderNoResults() {\n        return (\n            <div\n                key='list-no-results'\n                className='suggestion-list__no-results'\n                ref={this.contentRef}\n            >\n                <FormattedMarkdownMessage\n                    id='suggestion_list.no_matches'\n                    defaultMessage='No items match __{value}__'\n                    values={{\n                        value: this.props.pretext || '\"\"',\n                    }}\n                />\n            </div>\n        );\n    }\n\n    render() {\n        if (!this.props.open || this.props.cleared) {\n            return null;\n        }\n\n        const clonedItems = cloneDeep(this.props.items);\n\n        const items = [];\n        if (clonedItems.length === 0) {\n            if (!this.props.renderNoResults) {\n                return null;\n            }\n            items.push(this.renderNoResults());\n        }\n\n        let dividerRendered = false;\n        for (let i = 0; i < this.props.items.length; i++) {\n            const item = this.props.items[i];\n            const term = this.props.terms[i];\n            const isSelection = term === this.props.selection;\n\n            // ReactComponent names need to be upper case when used in JSX\n            const Component = this.props.components[i];\n\n            if (!dividerRendered && item.type === 'mention.recent.channels') {\n                items.push(this.renderDivider(item.type));\n                dividerRendered = true;\n            }\n\n            if (item.loading) {\n                items.push(<LoadingSpinner key={item.type}/>);\n                continue;\n            }\n\n            if (isSelection) {\n                this.currentItem = item;\n            }\n\n            items.push(\n                <Component\n                    key={term}\n                    ref={(ref) => this.itemRefs.set(term, ref)}\n                    item={this.props.items[i]}\n                    term={term}\n                    matchedPretext={this.props.matchedPretext[i]}\n                    isSelection={isSelection}\n                    onClick={this.props.onCompleteWord}\n                    onMouseMove={this.props.onItemHover}\n                />,\n            );\n        }\n        const mainClass = 'suggestion-list suggestion-list--' + this.props.position;\n        const contentClass = 'suggestion-list__content suggestion-list__content--' + this.props.position;\n        let maxHeight = Constants.SUGGESTION_LIST_MAXHEIGHT;\n        if (this.props.wrapperHeight) {\n            maxHeight = Math.min(\n                windowHeight() - (this.props.wrapperHeight + Constants.POST_MODAL_PADDING),\n                Constants.SUGGESTION_LIST_MAXHEIGHT,\n            );\n        }\n\n        return (\n            <div className={mainClass}>\n                <div\n                    id='suggestionList'\n                    role='list'\n                    ref={this.contentRef}\n                    style={{\n                        maxHeight,\n                        ...this.getTransform(),\n                    }}\n                    className={contentClass}\n                    onMouseDown={this.props.preventClose}\n                >\n                    {items}\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\n\nimport * as ServerVersion from 'utils/server_version';\nimport * as UserAgent from 'utils/user_agent';\n\nimport mattermostIcon from 'images/icon50x50.png';\nimport {Notice} from 'components/system_notice/types';\n\n// Notices are objects with the following fields:\n//  - name - string identifier\n//  - adminOnly - set to true if only system admins should see this message\n//  - icon - the image to display for the notice icon\n//  - title - JSX node to display for the notice title\n//  - body - JSX node to display for the notice body\n//  - allowForget - boolean to allow forget the notice\n//  - show - function that check if we need to show the notice\n//\n// Order is important! The notices at the top are shown first.\n\nconst notices: Notice[] = [\n    {\n        name: 'apiv3_deprecation',\n        adminOnly: true,\n        title: (\n            <FormattedMarkdownMessage\n                id='system_notice.title'\n                defaultMessage='**Notice**\\nfrom Mattermost'\n            />\n        ),\n        icon: mattermostIcon,\n        body: (\n            <FormattedMarkdownMessage\n                id='system_notice.body.api3'\n                defaultMessage='If you’ve created or installed integrations in the last two years, find out how [recent changes](!https://about.mattermost.com/default-apiv3-deprecation-guide) may have affected them.'\n            />\n        ),\n        allowForget: true,\n        show: (serverVersion, config) => {\n            if (config.InstallationDate >= new Date(2018, 5, 16, 0, 0, 0, 0).getTime()) {\n                return false;\n            }\n            return true;\n        },\n    },\n    {\n        name: 'advanced_permissions',\n        adminOnly: true,\n        title: (\n            <FormattedMarkdownMessage\n                id='system_notice.title'\n                defaultMessage='**Notice**\\nfrom Mattermost'\n            />\n        ),\n        icon: mattermostIcon,\n        body: (\n            <FormattedMarkdownMessage\n                id='system_notice.body.permissions'\n                defaultMessage='Some policy and permission System Console settings have moved with the release of [advanced permissions](!https://about.mattermost.com/default-advanced-permissions) into Mattermost Starter and Professional.'\n            />\n        ),\n        allowForget: true,\n        show: (serverVersion, config, license) => {\n            if (license.IsLicensed === 'false') {\n                return false;\n            }\n            if (config.InstallationDate > new Date(2018, 5, 16, 0, 0, 0, 0).getTime()) {\n                return false;\n            }\n            if (license.IsLicensed === 'true' && license.IssuedAt > new Date(2018, 5, 16, 0, 0, 0, 0).getTime()) {\n                return false;\n            }\n            return true;\n        },\n    },\n    {\n        name: 'ee_upgrade_advice',\n        adminOnly: true,\n        title: (\n            <FormattedMarkdownMessage\n                id='system_notice.title'\n                defaultMessage='**Notice**\\nfrom Mattermost'\n            />\n        ),\n        icon: mattermostIcon,\n        body: (\n            <FormattedMarkdownMessage\n                id='system_notice.body.ee_upgrade_advice'\n                defaultMessage='Enterprise Edition is recommended to ensure optimal operation and reliability. [Learn more](!https://mattermost.com/performance).'\n            />\n        ),\n        allowForget: false,\n        show: (serverVersion, config, license, analytics) => {\n            const USERS_THRESHOLD = 10000;\n\n            // If we don't have the analytics yet, don't show\n            if (!analytics?.hasOwnProperty('TOTAL_USERS')) {\n                return false;\n            }\n\n            if (analytics.TOTAL_USERS < USERS_THRESHOLD) {\n                return false;\n            }\n\n            if (license.IsLicensed === 'true' && license.Cluster === 'true') {\n                return false;\n            }\n\n            return true;\n        },\n    },\n    {\n        name: 'ie11_deprecation',\n        title: (\n            <FormattedMarkdownMessage\n                id='system_notice.title'\n                defaultMessage='**Notice**\\nfrom Mattermost'\n            />\n        ),\n        icon: mattermostIcon,\n        allowForget: false,\n        body: (\n            <FormattedMarkdownMessage\n                id='system_notice.body.ie11_deprecation'\n                defaultMessage='Your browser, IE11, will no longer be supported in an upcoming release. [Find out how to move to another browser in one simple step](!https://forum.mattermost.org/t/mattermost-is-dropping-support-for-internet-explorer-ie11-in-v5-16/7575).'\n            />\n        ),\n        show: (serverVersion) => {\n            // Don't show the notice after v5.16, show a different notice\n            if (ServerVersion.isServerVersionGreaterThanOrEqualTo(serverVersion, '5.16.0')) {\n                return false;\n            }\n\n            // Only show if they're using IE\n            if (!UserAgent.isInternetExplorer()) {\n                return false;\n            }\n\n            return true;\n        },\n    },\n];\n\nexport default notices;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {ClientConfig, ClientLicense} from 'mattermost-redux/types/config';\n\nimport {Dictionary} from 'mattermost-redux/types/utilities';\n\nimport {AnalyticsRow} from 'mattermost-redux/types/admin';\n\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\n\nimport {Preferences} from 'utils/constants';\nimport {t} from 'utils/i18n';\nimport LocalizedIcon from 'components/localized_icon';\nimport MattermostLogo from 'components/widgets/icons/mattermost_logo';\nimport {Notice} from 'components/system_notice/types';\n\ntype Props = {\n    currentUserId: string;\n    notices: Notice[];\n    preferences: {[key: string]: any};\n    dismissedNotices: any;\n    isSystemAdmin?: boolean;\n    serverVersion: string;\n    config: Partial<ClientConfig>;\n    license: ClientLicense;\n    analytics?: Dictionary<number | AnalyticsRow[]>;\n    actions: {\n        savePreferences(userId: string, preferences: PreferenceType[]): void;\n        dismissNotice(type: string): void;\n        getStandardAnalytics(teamId?: string): void;\n    };\n}\nexport default class SystemNotice extends React.PureComponent<Props> {\n    componentDidMount() {\n        if (this.props.isSystemAdmin) {\n            this.props.actions.getStandardAnalytics();\n        }\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (prevProps.isSystemAdmin !== this.props.isSystemAdmin && this.props.isSystemAdmin) {\n            this.props.actions.getStandardAnalytics();\n        }\n    }\n\n    getCurrentNotice = () => {\n        for (const notice of this.props.notices) {\n            // Skip if dismissed previously this session\n            if (this.props.dismissedNotices[notice.name]) {\n                continue;\n            }\n\n            // Skip if dismissed forever\n            if (this.props.preferences[notice.name]) {\n                continue;\n            }\n\n            if (notice.adminOnly && !this.props.isSystemAdmin) {\n                continue;\n            }\n\n            if (!notice.show?.(this.props.serverVersion, this.props.config, this.props.license, this.props.analytics)) {\n                continue;\n            }\n\n            return notice;\n        }\n        return null;\n    }\n\n    hide = (remind = false) => {\n        const notice = this.getCurrentNotice();\n        if (!notice) {\n            return;\n        }\n\n        if (!remind) {\n            this.props.actions.savePreferences(this.props.currentUserId, [{\n                user_id: this.props.currentUserId,\n                category: Preferences.CATEGORY_SYSTEM_NOTICE,\n                name: notice.name,\n                value: 'dismissed',\n            }]);\n        }\n\n        this.props.actions.dismissNotice(notice.name);\n    }\n\n    hideAndRemind = () => {\n        this.hide(true);\n    }\n\n    hideAndForget = () => {\n        this.hide(false);\n    }\n\n    render() {\n        const notice = this.getCurrentNotice();\n\n        if (notice == null) {\n            return null;\n        }\n\n        let visibleMessage;\n        if (notice.adminOnly) {\n            visibleMessage = (\n                <div className='system-notice__info'>\n                    <LocalizedIcon\n                        className='fa fa-eye'\n                        title={{id: t('system_notice.adminVisible.icon'), defaultMessage: 'Only visible to System Admins Icon'}}\n                    />\n                    <FormattedMessage\n                        id='system_notice.adminVisible'\n                        defaultMessage='Only visible to System Admins'\n                    />\n                </div>\n            );\n        }\n\n        return (\n            <div\n                className='system-notice bg--white shadow--2'\n            >\n                <div className='system-notice__header'>\n                    <div className='system-notice__logo'>\n                        <MattermostLogo/>\n                    </div>\n                    <div className='system-notice__title'>\n                        {notice.title}\n                    </div>\n                </div>\n                <div className='system-notice__body'>\n                    {notice.body}\n                </div>\n                {visibleMessage}\n                <div className='system-notice__footer'>\n                    <button\n                        id='systemnotice_remindme'\n                        className='btn btn-transparent'\n                        onClick={this.hideAndRemind}\n                    >\n                        <FormattedMessage\n                            id='system_notice.remind_me'\n                            defaultMessage='Remind Me Later'\n                        />\n                    </button>\n                    {notice.allowForget &&\n                        <button\n                            id='systemnotice_dontshow'\n                            className='btn btn-transparent'\n                            onClick={this.hideAndForget}\n                        >\n                            <FormattedMessage\n                                id='system_notice.dont_show'\n                                defaultMessage=\"Don't Show Again\"\n                            />\n                        </button>}\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {createSelector} from 'reselect';\n\nimport {makeGetCategory} from 'mattermost-redux/selectors/entities/preferences';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getStandardAnalytics} from 'mattermost-redux/actions/admin';\n\nimport {PreferenceType} from 'mattermost-redux/types/preferences';\n\nimport {Preferences} from 'utils/constants';\n\nimport {dismissNotice} from 'actions/views/notice';\n\nimport Notices from 'components/system_notice/notices';\nimport SystemNotice from 'components/system_notice/system_notice';\nimport {GlobalState} from 'types/store';\n\nfunction makeMapStateToProps() {\n    const getCategory = makeGetCategory();\n\n    const getPreferenceNameMap = createSelector(\n        'getPreferenceNameMap',\n        getCategory,\n        (preferences) => {\n            const nameMap: {[key: string]: PreferenceType} = {};\n            preferences.forEach((p) => {\n                nameMap[p.name] = p;\n            });\n            return nameMap;\n        },\n    );\n\n    return function mapStateToProps(state: GlobalState) {\n        const license = getLicense(state);\n        const config = getConfig(state);\n        const serverVersion = state.entities.general.serverVersion;\n        const analytics = state.entities.admin.analytics;\n\n        return {\n            currentUserId: state.entities.users.currentUserId,\n            preferences: getPreferenceNameMap(state, Preferences.CATEGORY_SYSTEM_NOTICE),\n            dismissedNotices: state.views.notice.hasBeenDismissed,\n            isSystemAdmin: haveISystemPermission(state, {permission: Permissions.MANAGE_SYSTEM}),\n            notices: Notices,\n            config,\n            license,\n            serverVersion,\n            analytics,\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            savePreferences,\n            dismissNotice,\n            getStandardAnalytics,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(SystemNotice);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Team, TeamMembership} from 'mattermost-redux/types/teams';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {ActionFunc} from 'mattermost-redux/types/actions';\nimport type {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {browserHistory} from 'utils/browser_history';\nimport * as Utils from 'utils/utils.jsx';\nimport ConfirmModal from 'components/confirm_modal';\nimport DropdownIcon from 'components/widgets/icons/fa_dropdown_icon';\n\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nconst ROWS_FROM_BOTTOM_TO_OPEN_UP = 3;\n\ntype Props = {\n    user: UserProfile;\n    currentUser: UserProfile;\n    teamMember: TeamMembership;\n    teamUrl: string;\n    currentTeam: Team;\n    index: number;\n    totalUsers: number;\n    collapsedThreads: ReturnType<typeof isCollapsedThreadsEnabled>;\n    actions: {\n        getMyTeamMembers: () => void;\n        getMyTeamUnreads: (collapsedThreads: boolean) => void;\n        getUser: (id: string) => void;\n        getTeamMember: (teamId: string, userId: string) => void;\n        getTeamStats: (teamId: string) => ActionFunc;\n        getChannelStats: (channelId: string) => void;\n        updateTeamMemberSchemeRoles: (teamId: string, userId: string, b1: boolean, b2: boolean) => ActionFunc & Partial<{error: Error}>;\n        updateUserActive: (userId: string, active: boolean) => ActionFunc;\n        removeUserFromTeamAndGetStats: (teamId: string, userId: string) => ActionFunc & Partial<{error: Error}>;\n    };\n};\n\ntype State = {\n    serverError: string|null;\n    showDemoteModal: boolean;\n    user: UserProfile|null;\n    role: string|null;\n}\n\nexport default class TeamMembersDropdown extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            serverError: null,\n            showDemoteModal: false,\n            user: null,\n            role: null,\n        };\n    }\n\n    private handleMakeMember = async () => {\n        const me = this.props.currentUser;\n        if (this.props.user.id === me.id && me.roles.includes('system_admin')) {\n            this.handleDemote(this.props.user, 'team_user');\n        } else {\n            const {error} = await this.props.actions.updateTeamMemberSchemeRoles(this.props.teamMember.team_id, this.props.user.id, true, false);\n            if (error) {\n                this.setState({serverError: error.message});\n            } else {\n                this.props.actions.getUser(this.props.user.id);\n                this.props.actions.getTeamMember(this.props.teamMember.team_id, this.props.user.id);\n                if (this.props.user.id === me.id) {\n                    await this.props.actions.getMyTeamMembers();\n                    this.props.actions.getMyTeamUnreads(this.props.collapsedThreads);\n                }\n            }\n        }\n    }\n\n    private handleRemoveFromTeam = async () => {\n        const {error} = await this.props.actions.removeUserFromTeamAndGetStats(this.props.teamMember.team_id, this.props.user.id);\n        if (error) {\n            this.setState({serverError: error.message});\n        }\n    }\n\n    private handleMakeAdmin = async () => {\n        const me = this.props.currentUser;\n        if (this.props.user.id === me.id && me.roles.includes('system_admin')) {\n            this.handleDemote(this.props.user, 'team_user team_admin');\n        } else {\n            const {error} = await this.props.actions.updateTeamMemberSchemeRoles(this.props.teamMember.team_id, this.props.user.id, true, true);\n            if (error) {\n                this.setState({serverError: error.message});\n            } else {\n                this.props.actions.getUser(this.props.user.id);\n                this.props.actions.getTeamMember(this.props.teamMember.team_id, this.props.user.id);\n            }\n        }\n    }\n\n    private handleDemote = (user: UserProfile, role: string): void => {\n        this.setState({\n            serverError: this.state.serverError,\n            showDemoteModal: true,\n            user,\n            role,\n        });\n    }\n\n    private handleDemoteCancel = (): void => {\n        this.setState({\n            serverError: null,\n            showDemoteModal: false,\n            user: null,\n            role: null,\n        });\n    }\n\n    private handleDemoteSubmit = async () => {\n        const {error} = await this.props.actions.updateTeamMemberSchemeRoles(this.props.teamMember.team_id, this.props.user.id, true, false);\n        if (error) {\n            this.setState({serverError: error.message});\n        } else {\n            this.props.actions.getUser(this.props.user.id);\n            browserHistory.push(this.props.teamUrl);\n        }\n    }\n\n    render() {\n        let serverError = null;\n        if (this.state.serverError) {\n            serverError = (\n                <div className='has-error'>\n                    <label className='has-error control-label'>{this.state.serverError}</label>\n                </div>\n            );\n        }\n\n        const {currentTeam, teamMember, user} = this.props;\n\n        let currentRoles = null;\n\n        if (Utils.isGuest(user)) {\n            currentRoles = (\n                <FormattedMessage\n                    id='team_members_dropdown.guest'\n                    defaultMessage='Guest'\n                />\n            );\n        } else if (user.roles.length > 0 && Utils.isSystemAdmin(user.roles)) {\n            currentRoles = (\n                <FormattedMessage\n                    id='team_members_dropdown.systemAdmin'\n                    defaultMessage='System Admin'\n                />\n            );\n        } else if ((teamMember.roles.length > 0 && Utils.isAdmin(teamMember.roles)) || teamMember.scheme_admin) {\n            currentRoles = (\n                <FormattedMessage\n                    id='team_members_dropdown.teamAdmin'\n                    defaultMessage='Team Admin'\n                />\n            );\n        } else {\n            currentRoles = (\n                <FormattedMessage\n                    id='team_members_dropdown.member'\n                    defaultMessage='Member'\n                />\n            );\n        }\n\n        const me = this.props.currentUser;\n        let showMakeMember = !Utils.isGuest(user) && (Utils.isAdmin(teamMember.roles) || teamMember.scheme_admin) && !Utils.isSystemAdmin(user.roles);\n        let showMakeAdmin = !Utils.isGuest(user) && !Utils.isAdmin(teamMember.roles) && !Utils.isSystemAdmin(user.roles) && !teamMember.scheme_admin;\n\n        if (user.delete_at > 0) {\n            currentRoles = (\n                <FormattedMessage\n                    id='team_members_dropdown.inactive'\n                    defaultMessage='Inactive'\n                />\n            );\n            showMakeMember = false;\n            showMakeAdmin = false;\n        }\n\n        const canRemoveFromTeam = user.id !== me.id && (!currentTeam.group_constrained || user.is_bot);\n\n        let makeDemoteModal = null;\n        if (user.id === me.id) {\n            const title = (\n                <FormattedMessage\n                    id='team_members_dropdown.confirmDemoteRoleTitle'\n                    defaultMessage='Confirm Demotion from System Admin Role'\n                />\n            );\n\n            const message = (\n                <div>\n                    <FormattedMessage\n                        id='team_members_dropdown.confirmDemoteDescription'\n                        defaultMessage=\"If you demote yourself from the System Admin role and there is not another user with System Admin privileges, you'll need to re-assign a System Admin by accessing the Mattermost server through a terminal and running the following command.\"\n                    />\n                    <br/>\n                    <br/>\n                    <FormattedMessage\n                        id='team_members_dropdown.confirmDemotionCmd'\n                        defaultMessage='platform roles system_admin {username}'\n                        values={{\n                            username: me.username,\n                        }}\n                    />\n                    {serverError}\n                </div>\n            );\n\n            const confirmButton = (\n                <FormattedMessage\n                    id='team_members_dropdown.confirmDemotion'\n                    defaultMessage='Confirm Demotion'\n                />\n            );\n\n            makeDemoteModal = (\n                <ConfirmModal\n                    show={this.state.showDemoteModal}\n                    title={title}\n                    message={message}\n                    confirmButtonText={confirmButton}\n                    onConfirm={this.handleDemoteSubmit}\n                    onCancel={this.handleDemoteCancel}\n                />\n            );\n        }\n\n        if (!canRemoveFromTeam && !showMakeAdmin && !showMakeMember) {\n            return <div>{currentRoles}</div>;\n        }\n\n        const {index, totalUsers} = this.props;\n        let openUp = false;\n        if (totalUsers > ROWS_FROM_BOTTOM_TO_OPEN_UP && totalUsers - index <= ROWS_FROM_BOTTOM_TO_OPEN_UP) {\n            openUp = true;\n        }\n\n        const menuRemove = (\n            <Menu.ItemAction\n                id='removeFromTeam'\n                onClick={this.handleRemoveFromTeam}\n                text={Utils.localizeMessage('team_members_dropdown.leave_team', 'Remove From Team')}\n            />\n        );\n        const menuMakeAdmin = (\n            <Menu.ItemAction\n                onClick={this.handleMakeAdmin}\n                text={Utils.localizeMessage('team_members_dropdown.makeAdmin', 'Make Team Admin')}\n            />\n        );\n        const menuMakeMember = (\n            <Menu.ItemAction\n                onClick={this.handleMakeMember}\n                text={Utils.localizeMessage('team_members_dropdown.makeMember', 'Make Member')}\n            />\n        );\n        return (\n            <MenuWrapper>\n                <button\n                    id={`teamMembersDropdown_${user.username}`}\n                    className='dropdown-toggle theme color--link style--none'\n                    type='button'\n                    aria-expanded='true'\n                >\n                    <span>{currentRoles} </span>\n                    <DropdownIcon/>\n                </button>\n                <div>\n                    <Menu\n                        openLeft={true}\n                        openUp={openUp}\n                        ariaLabel={Utils.localizeMessage('team_members_dropdown.menuAriaLabel', 'Change the role of a team member')}\n                    >\n                        {canRemoveFromTeam ? menuRemove : null}\n                        {showMakeAdmin ? menuMakeAdmin : null}\n                        {showMakeMember ? menuMakeMember : null}\n                    </Menu>\n                    {makeDemoteModal}\n                    {serverError}\n                </div>\n            </MenuWrapper>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {getChannelStats} from 'mattermost-redux/actions/channels';\nimport {\n    getMyTeamMembers,\n    getMyTeamUnreads,\n    getTeamStats,\n    getTeamMember,\n    updateTeamMemberSchemeRoles,\n} from 'mattermost-redux/actions/teams';\nimport {getUser, updateUserActive} from 'mattermost-redux/actions/users';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {getCurrentRelativeTeamUrl, getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {removeUserFromTeamAndGetStats} from 'actions/team_actions.jsx';\n\nimport TeamMembersDropdown from './team_members_dropdown';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        currentUser: getCurrentUser(state),\n        teamUrl: getCurrentRelativeTeamUrl(state),\n        currentTeam: getCurrentTeam(state),\n        collapsedThreads: isCollapsedThreadsEnabled(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            getMyTeamMembers,\n            getMyTeamUnreads,\n            getUser,\n            getTeamMember,\n            getTeamStats,\n            getChannelStats,\n            updateUserActive,\n            updateTeamMemberSchemeRoles,\n            removeUserFromTeamAndGetStats,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamMembersDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {ActionResult} from 'mattermost-redux/types/actions';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {TeamMembership, TeamStats, GetTeamMembersOpts} from 'mattermost-redux/types/teams';\nimport {Teams} from 'mattermost-redux/constants';\n\nimport Constants from 'utils/constants';\nimport * as UserAgent from 'utils/user_agent';\n\nimport SearchableUserList from 'components/searchable_user_list/searchable_user_list_container.jsx';\nimport TeamMembersDropdown from 'components/team_members_dropdown';\n\nconst USERS_PER_PAGE = 50;\n\ntype Props = {\n    searchTerm: string;\n    users: UserProfile[];\n    teamMembers: {\n        [userId: string]: TeamMembership;\n    };\n    currentTeamId: string;\n    totalTeamMembers: number;\n    canManageTeamMembers?: boolean;\n    actions: {\n        getTeamMembers: (teamId: string, page?: number, perPage?: number, options?: GetTeamMembersOpts) => Promise<{data: TeamMembership}>;\n        searchProfiles: (term: string, options?: {[key: string]: any}) => Promise<{data: UserProfile[]}>;\n        getTeamStats: (teamId: string) => Promise<{data: TeamStats}>;\n        loadProfilesAndTeamMembers: (page: number, perPage: number, teamId?: string, options?: {[key: string]: any}) => Promise<{\n            data: boolean;\n        }>;\n        loadStatusesForProfilesList: (users: UserProfile[]) => Promise<{\n            data: boolean;\n        }>;\n        loadTeamMembersForProfilesList: (profiles: any, teamId: string, reloadAllMembers: boolean) => Promise<{\n            data: boolean;\n        }>;\n        setModalSearchTerm: (term: string) => ActionResult;\n    };\n}\n\ntype State = {\n    loading: boolean;\n}\n\nexport default class MemberListTeam extends React.PureComponent<Props, State> {\n    private searchTimeoutId: number;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.searchTimeoutId = 0;\n\n        this.state = {\n            loading: true,\n        };\n    }\n\n    async componentDidMount() {\n        await Promise.all([\n            this.props.actions.loadProfilesAndTeamMembers(0, Constants.PROFILE_CHUNK_SIZE, this.props.currentTeamId, {active: true}),\n            this.props.actions.getTeamMembers(this.props.currentTeamId, 0, Constants.DEFAULT_MAX_USERS_PER_TEAM,\n                {\n                    sort: Teams.SORT_USERNAME_OPTION,\n                    exclude_deleted_users: true,\n                } as GetTeamMembersOpts,\n            ),\n            this.props.actions.getTeamStats(this.props.currentTeamId),\n        ]);\n        this.loadComplete();\n    }\n\n    componentWillUnmount() {\n        this.props.actions.setModalSearchTerm('');\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (prevProps.searchTerm !== this.props.searchTerm) {\n            clearTimeout(this.searchTimeoutId);\n\n            const searchTerm = this.props.searchTerm;\n            if (searchTerm === '') {\n                this.loadComplete();\n                this.searchTimeoutId = 0;\n                return;\n            }\n\n            const searchTimeoutId = window.setTimeout(\n                async () => {\n                    const {\n                        loadStatusesForProfilesList,\n                        loadTeamMembersForProfilesList,\n                        searchProfiles,\n                    } = this.props.actions;\n                    const {data} = await searchProfiles(searchTerm, {team_id: this.props.currentTeamId});\n\n                    if (searchTimeoutId !== this.searchTimeoutId) {\n                        return;\n                    }\n\n                    this.setState({loading: true});\n\n                    loadStatusesForProfilesList(data);\n                    loadTeamMembersForProfilesList(data, this.props.currentTeamId, true).then(({data: membersLoaded}) => {\n                        if (membersLoaded) {\n                            this.loadComplete();\n                        }\n                    });\n                },\n                Constants.SEARCH_TIMEOUT_MILLISECONDS,\n            );\n\n            this.searchTimeoutId = searchTimeoutId;\n        }\n    }\n\n    loadComplete = () => {\n        this.setState({loading: false});\n    }\n\n    nextPage = async (page: number) => {\n        this.setState({loading: true});\n        await Promise.all([\n            this.props.actions.loadProfilesAndTeamMembers(page, USERS_PER_PAGE, this.props.currentTeamId, {active: true}),\n            this.props.actions.getTeamMembers(this.props.currentTeamId, page, Constants.DEFAULT_MAX_USERS_PER_TEAM,\n                {\n                    sort: Teams.SORT_USERNAME_OPTION,\n                    exclude_deleted_users: true,\n                } as GetTeamMembersOpts,\n            ),\n        ]);\n        this.loadComplete();\n    }\n\n    search = (term: string) => {\n        this.props.actions.setModalSearchTerm(term);\n    }\n\n    render() {\n        let teamMembersDropdown = null;\n        if (this.props.canManageTeamMembers) {\n            teamMembersDropdown = [TeamMembersDropdown];\n        }\n\n        const teamMembers = this.props.teamMembers;\n        const users = this.props.users;\n        const actionUserProps: {\n            [userId: string]: {\n                teamMember: TeamMembership;\n            };\n        } = {};\n\n        let usersToDisplay;\n        if (this.state.loading) {\n            usersToDisplay = null;\n        } else {\n            usersToDisplay = [];\n\n            for (let i = 0; i < users.length; i++) {\n                const user = users[i];\n\n                if (teamMembers[user.id] && user.delete_at === 0) {\n                    usersToDisplay.push(user);\n                    actionUserProps[user.id] = {\n                        teamMember: teamMembers[user.id],\n                    };\n                }\n            }\n        }\n\n        return (\n            <SearchableUserList\n                users={usersToDisplay}\n                usersPerPage={USERS_PER_PAGE}\n                total={this.props.totalTeamMembers}\n                nextPage={this.nextPage}\n                search={this.search}\n                actions={teamMembersDropdown}\n                actionUserProps={actionUserProps}\n                focusOnMount={!UserAgent.isMobile()}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport {getTeamStats, getTeamMembers} from 'mattermost-redux/actions/teams';\nimport {GetTeamMembersOpts, TeamStats, TeamMembership} from 'mattermost-redux/types/teams';\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getMembersInCurrentTeam, getCurrentTeamStats} from 'mattermost-redux/selectors/entities/teams';\nimport {getProfilesInCurrentTeam, searchProfilesInCurrentTeam} from 'mattermost-redux/selectors/entities/users';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {searchProfiles} from 'mattermost-redux/actions/users';\nimport {ActionFunc, GenericAction, ActionResult} from 'mattermost-redux/types/actions';\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport {loadStatusesForProfilesList} from 'actions/status_actions.jsx';\nimport {loadProfilesAndTeamMembers, loadTeamMembersForProfilesList} from 'actions/user_actions.jsx';\nimport {setModalSearchTerm} from 'actions/views/search';\n\nimport {GlobalState} from 'types/store';\n\nimport MemberListTeam from './member_list_team';\n\ntype Props = {\n    teamId: string;\n}\n\ntype Actions = {\n    getTeamMembers: (teamId: string, page?: number, perPage?: number, options?: GetTeamMembersOpts) => Promise<{data: TeamMembership}>;\n    searchProfiles: (term: string, options?: {[key: string]: any}) => Promise<{data: UserProfile[]}>;\n    getTeamStats: (teamId: string) => Promise<{data: TeamStats}>;\n    loadProfilesAndTeamMembers: (page: number, perPage: number, teamId?: string, options?: {[key: string]: any}) => Promise<{\n        data: boolean;\n    }>;\n    loadStatusesForProfilesList: (users: UserProfile[]) => Promise<{\n        data: boolean;\n    }>;\n    loadTeamMembersForProfilesList: (profiles: any, teamId: string, reloadAllMembers: boolean) => Promise<{\n        data: boolean;\n    }>;\n    setModalSearchTerm: (term: string) => ActionResult;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const canManageTeamMembers = haveITeamPermission(state, ownProps.teamId, Permissions.MANAGE_TEAM_ROLES);\n\n    const searchTerm = state.views.search.modalSearch;\n\n    let users;\n    if (searchTerm) {\n        users = searchProfilesInCurrentTeam(state, searchTerm);\n    } else {\n        users = getProfilesInCurrentTeam(state);\n    }\n\n    const stats = getCurrentTeamStats(state) || {active_member_count: 0};\n\n    return {\n        searchTerm,\n        users,\n        teamMembers: getMembersInCurrentTeam(state) || {},\n        currentTeamId: state.entities.teams.currentTeamId,\n        totalTeamMembers: stats.active_member_count,\n        canManageTeamMembers,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc | GenericAction>, Actions>({\n            searchProfiles,\n            getTeamStats,\n            getTeamMembers,\n            loadProfilesAndTeamMembers,\n            loadStatusesForProfilesList,\n            loadTeamMembersForProfilesList,\n            setModalSearchTerm,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MemberListTeam);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\nimport MemberListTeam from 'components/member_list_team';\nimport InvitationModal from 'components/invitation_modal';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\ntype Props = {\n    currentTeam: {\n        id: string;\n        display_name: string;\n    };\n    onHide: () => void;\n    onLoad?: () => void;\n    actions: {\n        openModal: (modalData: {modalId: string; dialogType: any}) => Promise<{\n            data: boolean;\n        }>;\n    };\n}\n\ntype State = {\n    show: boolean;\n}\n\nexport default class TeamMembersModal extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            show: true,\n        };\n    }\n\n    componentDidMount() {\n        if (this.props.onLoad) {\n            this.props.onLoad();\n        }\n    }\n\n    handleHide = () => {\n        this.setState({show: false});\n    }\n\n    handleExit = () => {\n        this.props.onHide();\n    }\n\n    handleInvitePeople = () => {\n        const {actions} = this.props;\n\n        actions.openModal({\n            modalId: ModalIdentifiers.INVITATION,\n            dialogType: InvitationModal,\n        });\n\n        this.handleExit();\n    }\n\n    render() {\n        let teamDisplayName = '';\n        if (this.props.currentTeam) {\n            teamDisplayName = this.props.currentTeam.display_name;\n        }\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal more-modal'\n                show={this.state.show}\n                onHide={this.handleHide}\n                onExited={this.handleExit}\n                role='dialog'\n                aria-labelledby='teamMemberModalLabel'\n                id='teamMembersModal'\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title\n                        componentClass='h1'\n                        id='teamMemberModalLabel'\n                    >\n                        <FormattedMessage\n                            id='team_member_modal.members'\n                            defaultMessage='{team} Members'\n                            values={{\n                                team: teamDisplayName,\n                            }}\n                        />\n                    </Modal.Title>\n                    <TeamPermissionGate\n                        teamId={this.props.currentTeam.id}\n                        permissions={[Permissions.ADD_USER_TO_TEAM, Permissions.INVITE_GUEST]}\n                    >\n                        <button\n                            id='invitePeople'\n                            type='button'\n                            className='btn btn-primary invite-people-btn'\n                            onClick={this.handleInvitePeople}\n                        >\n                            <FormattedMessage\n                                id='team_member_modal.invitePeople'\n                                defaultMessage='Invite People'\n                            />\n                        </button>\n                    </TeamPermissionGate>\n                </Modal.Header>\n                <Modal.Body>\n                    <MemberListTeam\n                        teamId={this.props.currentTeam.id}\n                    />\n                </Modal.Body>\n            </Modal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {ActionFunc} from 'mattermost-redux/types/actions';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {isModalOpen} from 'selectors/views/modals';\nimport {openModal} from 'actions/views/modals';\n\nimport {GlobalState} from 'types/store';\n\nimport TeamMembersModal from './team_members_modal';\n\ntype Actions = {\n    openModal: (modalData: {modalId: string; dialogType: React.Component }) => Promise<{\n        data: boolean;\n    }>;\n}\n\nfunction mapStateToProps(state: GlobalState) {\n    const modalId = ModalIdentifiers.TEAM_MEMBERS;\n    return {\n        currentTeam: getCurrentTeam(state),\n        show: isModalOpen(state, modalId),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n            openModal,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamMembersModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {searchAssociatedGroupsForReferenceLocal} from 'mattermost-redux/selectors/entities/groups';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nexport function searchAssociatedGroupsForReference(prefix, teamId, channelId) {\n    return async (dispatch, getState) => {\n        const state = getState();\n        if (!haveIChannelPermission(state,\n            teamId,\n            channelId,\n            Permissions.USE_GROUP_MENTIONS,\n        )) {\n            return {data: []};\n        }\n        return {data: searchAssociatedGroupsForReferenceLocal(state, prefix, teamId, channelId)};\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Constants} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\n\nimport BotBadge from 'components/widgets/badges/bot_badge';\nimport GuestBadge from 'components/widgets/badges/guest_badge';\nimport SharedUserIndicator from 'components/shared_user_indicator';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport Suggestion from '../suggestion.jsx';\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\n\nexport default class AtMentionSuggestion extends Suggestion {\n    render() {\n        const isSelection = this.props.isSelection;\n        const item = this.props.item;\n\n        let itemname;\n        let description;\n        let icon;\n        let customStatus;\n        if (item.username === 'all') {\n            itemname = 'all';\n            description = (\n                <span className='ml-2'>\n                    <FormattedMessage\n                        id='suggestion.mention.all'\n                        defaultMessage='Notifies everyone in this channel'\n                    />\n                </span>\n            );\n            icon = (\n                <FormattedMessage\n                    id='generic_icons.member'\n                    defaultMessage='Member Icon'\n                >\n                    {(title) => (\n                        <span className='suggestion-list__icon suggestion-list__icon--large'>\n                            <i\n                                className='icon icon-account-multiple-outline'\n                                title={title}\n                            />\n                        </span>\n                    )}\n                </FormattedMessage>\n            );\n        } else if (item.username === 'channel') {\n            itemname = 'channel';\n            description = (\n                <span className='ml-2'>\n                    <FormattedMessage\n                        id='suggestion.mention.channel'\n                        defaultMessage='Notifies everyone in this channel'\n                    />\n                </span>\n            );\n            icon = (\n                <FormattedMessage\n                    id='generic_icons.member'\n                    defaultMessage='Member Icon'\n                >\n                    {(title) => (\n                        <span className='suggestion-list__icon suggestion-list__icon--large'>\n                            <i\n                                className='icon icon-account-multiple-outline'\n                                title={title}\n                            />\n                        </span>\n                    )}\n                </FormattedMessage>\n            );\n        } else if (item.username === 'here') {\n            itemname = 'here';\n            description = (\n                <span className='ml-2'>\n                    <FormattedMessage\n                        id='suggestion.mention.here'\n                        defaultMessage='Notifies everyone online in this channel'\n                    />\n                </span>\n            );\n            icon = (\n                <FormattedMessage\n                    id='generic_icons.member'\n                    defaultMessage='Member Icon'\n                >\n                    {(title) => (\n                        <span className='suggestion-list__icon suggestion-list__icon--large'>\n                            <i\n                                className='icon icon-account-multiple-outline'\n                                title={title}\n                            />\n                        </span>\n                    )}\n                </FormattedMessage>\n            );\n        } else if (item.type === Constants.MENTION_GROUPS) {\n            itemname = item.name;\n            description = `- ${item.display_name}`;\n            icon = (\n                <FormattedMessage\n                    id='generic_icons.member'\n                    defaultMessage='Group Icon'\n                >\n                    {(title) => (\n                        <i\n                            className='suggestion-list__icon fa fa-users fa-2x'\n                            title={title}\n                        />\n                    )}\n                </FormattedMessage>\n            );\n        } else {\n            itemname = item.username;\n\n            if (item.isCurrentUser) {\n                if (item.first_name || item.last_name) {\n                    description = (\n                        <span className='ml-2'>\n                            {Utils.getFullName(item)}\n                        </span>\n                    );\n                }\n            } else if (item.first_name || item.last_name || item.nickname) {\n                description = (\n                    <span className='ml-2'>\n                        {`${Utils.getFullName(item)} ${\n                            item.nickname ? `(${item.nickname})` : ''\n                        }`.trim()}\n                    </span>\n                );\n            }\n\n            icon = (\n                <Avatar\n                    size='sm'\n                    username={item && item.username}\n                    url={Utils.imageURLForUser(item.id, item.last_picture_update)}\n                />\n            );\n\n            customStatus = (\n                <CustomStatusEmoji\n                    showTooltip={true}\n                    userID={item.id}\n                    emojiSize={15}\n                    emojiStyle={{\n                        margin: '0 4px 4px',\n                    }}\n                />\n            );\n        }\n\n        let youElement = null;\n        if (item.isCurrentUser) {\n            youElement =\n            (<span className='ml-1'>\n                <FormattedMessage\n                    id='suggestion.user.isCurrent'\n                    defaultMessage='(you)'\n                />\n            </span>);\n        }\n\n        let className = 'suggestion-list__item';\n        if (isSelection) {\n            className += ' suggestion--selected';\n        }\n\n        let sharedIcon;\n        if (item.remote_id) {\n            sharedIcon = (\n                <SharedUserIndicator\n                    className='shared-user-icon'\n                    withTooltip={true}\n                />\n            );\n        }\n\n        return (\n            <div\n                className={className}\n                data-testid={`mentionSuggestion_${itemname}`}\n                onClick={this.handleClick}\n                onMouseMove={this.handleMouseMove}\n                {...Suggestion.baseProps}\n            >\n                {icon}\n                <span className='suggestion-list__ellipsis'>\n                    <span className='suggestion-list__main'>\n                        {'@' + itemname}\n                    </span>\n                    <BotBadge\n                        show={Boolean(item.is_bot)}\n                        className='badge-autocomplete'\n                    />\n                    {customStatus}\n                    {description}\n                    {youElement}\n                    {sharedIcon}\n                    <GuestBadge\n                        show={Utils.isGuest(item)}\n                        className='badge-autocomplete'\n                    />\n                </span>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport XRegExp from 'xregexp';\n\nimport {getSuggestionsSplitBy, getSuggestionsSplitByMultiple} from 'mattermost-redux/utils/user_utils';\n\nimport {Constants} from 'utils/constants';\n\nimport Provider from '../provider.jsx';\n\nimport AtMentionSuggestion from './at_mention_suggestion.jsx';\n\n// The AtMentionProvider provides matches for at mentions, including @here, @channel, @all,\n// users in the channel and users not in the channel. It mixes together results from the local\n// store with results fetch from the server.\nexport default class AtMentionProvider extends Provider {\n    constructor(props) {\n        super();\n\n        this.setProps(props);\n\n        this.data = null;\n        this.lastCompletedWord = '';\n        this.lastPrefixWithNoResults = '';\n        this.triggerCharacter = '@';\n    }\n\n    // setProps gives the provider additional context for matching pretexts. Ideally this would\n    // just be something akin to a connected component with access to the store itself.\n    setProps({currentUserId, profilesInChannel, autocompleteUsersInChannel, useChannelMentions, autocompleteGroups, searchAssociatedGroupsForReference, priorityProfiles}) {\n        this.currentUserId = currentUserId;\n        this.profilesInChannel = profilesInChannel;\n        this.autocompleteUsersInChannel = autocompleteUsersInChannel;\n        this.useChannelMentions = useChannelMentions;\n        this.autocompleteGroups = autocompleteGroups;\n        this.searchAssociatedGroupsForReference = searchAssociatedGroupsForReference;\n        this.priorityProfiles = priorityProfiles;\n    }\n\n    // specialMentions matches one of @here, @channel or @all, unless using /msg.\n    specialMentions() {\n        if (this.latestPrefix.startsWith('/msg') || !this.useChannelMentions) {\n            return [];\n        }\n\n        return ['here', 'channel', 'all'].filter((item) =>\n            item.startsWith(this.latestPrefix),\n        ).map((name) => ({\n            username: name,\n            type: Constants.MENTION_SPECIAL,\n        }));\n    }\n\n    // retrieves the parts of the profile that should be checked\n    // against the term\n    getProfileSuggestions(profile) {\n        const profileSuggestions = [];\n        if (!profile) {\n            return profileSuggestions;\n        }\n\n        if (profile.username) {\n            const usernameSuggestions = getSuggestionsSplitByMultiple(profile.username.toLowerCase(), Constants.AUTOCOMPLETE_SPLIT_CHARACTERS);\n            profileSuggestions.push(...usernameSuggestions);\n        }\n        [profile.first_name, profile.last_name, profile.nickname].forEach((property) => {\n            const suggestions = getSuggestionsSplitBy(property.toLowerCase(), ' ');\n            profileSuggestions.push(...suggestions);\n        });\n        profileSuggestions.push(profile.first_name.toLowerCase() + ' ' + profile.last_name.toLowerCase());\n\n        return profileSuggestions;\n    }\n\n    // retrieves the parts of the group mention that should be checked\n    // against the term\n    getGroupSuggestions(group) {\n        const groupSuggestions = [];\n        if (!group) {\n            return groupSuggestions;\n        }\n\n        if (group.name) {\n            const groupnameSuggestions = getSuggestionsSplitByMultiple(group.name.toLowerCase(), Constants.AUTOCOMPLETE_SPLIT_CHARACTERS);\n            groupSuggestions.push(...groupnameSuggestions);\n        }\n\n        const suggestions = getSuggestionsSplitBy(group.display_name.toLowerCase(), ' ');\n        groupSuggestions.push(...suggestions);\n\n        groupSuggestions.push(group.display_name.toLowerCase());\n        return groupSuggestions;\n    }\n\n    // filterProfile constrains profiles to those matching the latest prefix.\n    filterProfile(profile) {\n        if (!profile) {\n            return false;\n        }\n\n        const prefixLower = this.latestPrefix.toLowerCase();\n        const profileSuggestions = this.getProfileSuggestions(profile);\n        return profileSuggestions.some((suggestion) => suggestion.startsWith(prefixLower));\n    }\n\n    // filterGroup constrains group mentions to those matching the latest prefix.\n    filterGroup(group) {\n        if (!group) {\n            return false;\n        }\n\n        const prefixLower = this.latestPrefix.toLowerCase();\n        const groupSuggestions = this.getGroupSuggestions(group);\n        return groupSuggestions.some((suggestion) => suggestion.startsWith(prefixLower));\n    }\n\n    // localMembers matches up to 25 local results from the store before the server has responded.\n    localMembers() {\n        const localMembers = this.profilesInChannel.\n            filter((profile) => this.filterProfile(profile)).\n            map((profile) => this.createFromProfile(profile, Constants.MENTION_MEMBERS)).\n            splice(0, 25);\n\n        return localMembers;\n    }\n\n    filterPriorityProfiles() {\n        if (!this.priorityProfiles) {\n            return [];\n        }\n\n        const priorityProfiles = this.priorityProfiles.\n            filter((profile) => this.filterProfile(profile)).\n            map((profile) => this.createFromProfile(profile, Constants.MENTION_MEMBERS));\n\n        return priorityProfiles;\n    }\n\n    // localGroups matches up to 25 local results from the store\n    localGroups() {\n        if (!this.autocompleteGroups) {\n            return [];\n        }\n\n        const localGroups = this.autocompleteGroups.\n            filter((group) => this.filterGroup(group)).\n            map((group) => this.createFromGroup(group, Constants.MENTION_GROUPS)).\n            sort((a, b) => a.name.localeCompare(b.name)).\n            splice(0, 25);\n\n        return localGroups;\n    }\n\n    // remoteMembers matches the users listed in the channel by the server.\n    remoteMembers() {\n        if (!this.data) {\n            return [];\n        }\n\n        const remoteMembers = (this.data.users || []).\n            filter((profile) => this.filterProfile(profile)).\n            map((profile) => this.createFromProfile(profile, Constants.MENTION_MEMBERS));\n\n        return remoteMembers;\n    }\n\n    // remoteGroups matches the users listed in the channel by the server.\n    remoteGroups() {\n        if (!this.data) {\n            return [];\n        }\n        const remoteGroups = (this.data.groups || []).\n            filter((group) => this.filterGroup(group)).\n            map((group) => this.createFromGroup(group, Constants.MENTION_GROUPS));\n\n        return remoteGroups;\n    }\n\n    // remoteNonMembers matches users listed as not in the channel by the server.\n    // listed in the channel from local results.\n    remoteNonMembers() {\n        if (!this.data) {\n            return [];\n        }\n\n        return (this.data.out_of_channel || []).\n            filter((profile) => this.filterProfile(profile)).\n            map((profile) => ({\n                type: Constants.MENTION_NONMEMBERS,\n                ...profile,\n            }));\n    }\n\n    items() {\n        const priorityProfilesIds = {};\n        const priorityProfiles = this.filterPriorityProfiles();\n\n        priorityProfiles.forEach((member) => {\n            priorityProfilesIds[member.id] = true;\n        });\n\n        const specialMentions = this.specialMentions();\n        const localMembers = this.localMembers().filter((member) => !priorityProfilesIds[member.id]);\n\n        const localUserIds = {};\n\n        localMembers.forEach((member) => {\n            localUserIds[member.id] = true;\n        });\n\n        const remoteMembers = this.remoteMembers().filter((member) => !localUserIds[member.id] && !priorityProfilesIds[member.id]);\n\n        // comparator which prioritises users with usernames starting with search term\n        const orderUsers = (a, b) => {\n            const aStartsWith = a.username.startsWith(this.latestPrefix);\n            const bStartsWith = b.username.startsWith(this.latestPrefix);\n\n            if (aStartsWith && !bStartsWith) {\n                return -1;\n            } else if (!aStartsWith && bStartsWith) {\n                return 1;\n            }\n\n            // Sort recently viewed channels first\n            if (a.last_viewed_at && b.last_viewed_at) {\n                return b.last_viewed_at - a.last_viewed_at;\n            } else if (a.last_viewed_at) {\n                return -1;\n            } else if (b.last_viewed_at) {\n                return 1;\n            }\n\n            return a.username.localeCompare(b.username);\n        };\n\n        // Combine the local and remote members, sorting to mix the results together.\n        const localAndRemoteMembers = localMembers.concat(remoteMembers).sort(orderUsers);\n\n        // handle groups\n        const localGroups = this.localGroups();\n\n        const localGroupIds = {};\n        localGroups.forEach((group) => {\n            localGroupIds[group.id] = true;\n        });\n\n        const remoteGroups = this.remoteGroups().filter((group) => !localGroupIds[group.id]);\n\n        // comparator which prioritises users with usernames starting with search term\n        const orderGroups = (a, b) => {\n            const aStartsWith = a.name.startsWith(this.latestPrefix);\n            const bStartsWith = b.name.startsWith(this.latestPrefix);\n\n            if (aStartsWith && bStartsWith) {\n                return a.name.localeCompare(b.name);\n            }\n            if (aStartsWith) {\n                return -1;\n            }\n            if (bStartsWith) {\n                return 1;\n            }\n            return a.name.localeCompare(b.name);\n        };\n\n        // Combine the local and remote groups, sorting to mix the results together.\n        const localAndRemoteGroups = localGroups.concat(remoteGroups).sort(orderGroups);\n\n        const remoteNonMembers = this.remoteNonMembers().\n            filter((member) => !localUserIds[member.id]).\n            sort(orderUsers);\n\n        return priorityProfiles.concat(localAndRemoteMembers).concat(localAndRemoteGroups).concat(specialMentions).concat(remoteNonMembers);\n    }\n\n    // updateMatches invokes the resultCallback with the metadata for rendering at mentions\n    updateMatches(resultCallback, items) {\n        if (items.length === 0) {\n            this.lastPrefixWithNoResults = this.latestPrefix;\n        } else if (this.lastPrefixWithNoResults === this.latestPrefix) {\n            this.lastPrefixWithNoResults = '';\n        }\n        const mentions = items.map((item) => {\n            if (item.username) {\n                return '@' + item.username;\n            } else if (item.name) {\n                return '@' + item.name;\n            }\n            return '';\n        });\n\n        resultCallback({\n            matchedPretext: `@${this.latestPrefix}`,\n            terms: mentions,\n            items,\n            component: AtMentionSuggestion,\n        });\n    }\n\n    handlePretextChanged(pretext, resultCallback) {\n        const captured = XRegExp.cache('(?:^|\\\\W)@([\\\\pL\\\\d\\\\-_. ]*)$', 'i').exec(pretext.toLowerCase());\n        if (!captured) {\n            return false;\n        }\n\n        if (this.lastCompletedWord && captured[0].trim().startsWith(this.lastCompletedWord.trim())) {\n            // It appears we're still matching a channel handle that we already completed\n            return false;\n        }\n\n        const prefix = captured[1];\n        if (this.lastPrefixWithNoResults && prefix.startsWith(this.lastPrefixWithNoResults)) {\n            // Just give up since we know it won't return any results\n            return false;\n        }\n\n        this.startNewRequest(prefix);\n        this.updateMatches(resultCallback, this.items());\n\n        // If we haven't gotten server-side results in 500 ms, add the loading indicator.\n        let showLoadingIndicator = setTimeout(() => {\n            if (this.shouldCancelDispatch(prefix)) {\n                return;\n            }\n\n            this.updateMatches(resultCallback, this.items().concat([{\n                type: Constants.MENTION_MORE_MEMBERS,\n                loading: true,\n            }]));\n\n            showLoadingIndicator = null;\n        }, 500);\n\n        // Query the server for remote results to add to the local results.\n        this.autocompleteUsersInChannel(prefix).then(({data}) => {\n            if (showLoadingIndicator) {\n                clearTimeout(showLoadingIndicator);\n            }\n\n            if (this.shouldCancelDispatch(prefix)) {\n                return;\n            }\n\n            this.data = data;\n\n            this.searchAssociatedGroupsForReference(prefix).then((groupsData) => {\n                if (this.data && groupsData && groupsData.data) {\n                    this.data.groups = groupsData.data;\n                }\n                this.updateMatches(resultCallback, this.items());\n            });\n        });\n\n        return true;\n    }\n\n    handleCompleteWord(term) {\n        this.lastCompletedWord = term;\n        this.lastPrefixWithNoResults = '';\n    }\n\n    createFromProfile(profile, type) {\n        if (profile.id === this.currentUserId) {\n            return {\n                type,\n                ...profile,\n                isCurrentUser: true,\n            };\n        }\n\n        return {\n            type,\n            ...profile,\n        };\n    }\n\n    createFromGroup(group, type) {\n        return {\n            type,\n            ...group,\n        };\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport AtMentionProvider from './at_mention_provider.jsx';\n\nexport default AtMentionProvider;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {getMyChannels, getMyChannelMemberships} from 'mattermost-redux/selectors/entities/channels';\n\nimport {sortChannelsByTypeAndDisplayName} from 'mattermost-redux/utils/channel_utils';\n\nimport store from 'stores/redux_store.jsx';\n\nimport {Constants} from 'utils/constants';\n\nimport Provider from './provider.jsx';\nimport Suggestion from './suggestion.jsx';\n\nexport class ChannelMentionSuggestion extends Suggestion {\n    render() {\n        const isSelection = this.props.isSelection;\n        const item = this.props.item;\n\n        const channelName = item.channel.display_name;\n        const channelIcon = (\n            <span className='suggestion-list__icon suggestion-list__icon--large'>\n                <i className={`icon icon--no-spacing icon-${item.channel.type === Constants.OPEN_CHANNEL ? 'globe' : 'lock'}`}/>\n            </span>\n        );\n\n        let className = 'suggestion-list__item';\n        if (isSelection) {\n            className += ' suggestion--selected';\n        }\n\n        const description = '~' + item.channel.name;\n\n        return (\n            <div\n                className={className}\n                onClick={this.handleClick}\n                onMouseMove={this.handleMouseMove}\n                {...Suggestion.baseProps}\n            >\n                {channelIcon}\n                <div className='suggestion-list__ellipsis'>\n                    <span className='suggestion-list__main'>\n                        {channelName}\n                    </span>\n                    <span className='ml-2'>\n                        {description}\n                    </span>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default class ChannelMentionProvider extends Provider {\n    constructor(channelSearchFunc) {\n        super();\n\n        this.lastPrefixTrimmed = '';\n        this.lastPrefixWithNoResults = '';\n        this.lastCompletedWord = '';\n        this.triggerCharacter = '~';\n\n        this.autocompleteChannels = channelSearchFunc;\n    }\n\n    handlePretextChanged(pretext, resultCallback) {\n        this.resetRequest();\n\n        const captured = (/\\B(~([^~\\r\\n]*))$/i).exec(pretext.toLowerCase());\n\n        if (!captured) {\n            // Not a channel mention\n            return false;\n        }\n\n        if (captured.index > 0 && pretext[captured.index - 1] === '~') {\n            // Multiple ~'s in a row so let's return and not show the autocomplete\n            return false;\n        }\n\n        const prefix = captured[2];\n\n        if (this.lastPrefixTrimmed && prefix.trim() === this.lastPrefixTrimmed) {\n            // Don't keep searching if the user keeps typing spaces\n            return true;\n        }\n\n        this.lastPrefixTrimmed = prefix.trim();\n\n        if (this.lastPrefixWithNoResults && prefix.startsWith(this.lastPrefixWithNoResults)) {\n            // Just give up since we know it won't return any results\n            return false;\n        }\n\n        if (this.lastCompletedWord && captured[0].startsWith(this.lastCompletedWord)) {\n            // It appears we're still matching a channel handle that we already completed\n            return false;\n        }\n\n        // Clear the last completed word since we've started to match new text\n        this.lastCompletedWord = '';\n\n        this.startNewRequest(prefix);\n\n        const words = prefix.toLowerCase().split(/\\s+/);\n        const wrappedChannelIds = {};\n        var wrappedChannels = [];\n        getMyChannels(store.getState()).forEach((item) => {\n            if (item.type !== 'O' || item.delete_at > 0) {\n                return;\n            }\n            const nameWords = item.name.toLowerCase().split(/\\s+/).concat(item.display_name.toLowerCase().split(/\\s+/));\n            var matched = true;\n            for (var j = 0; matched && j < words.length; j++) {\n                if (!words[j]) {\n                    continue;\n                }\n                var wordMatched = false;\n                for (var i = 0; i < nameWords.length; i++) {\n                    if (nameWords[i].startsWith(words[j])) {\n                        wordMatched = true;\n                        break;\n                    }\n                }\n                if (!wordMatched) {\n                    matched = false;\n                    break;\n                }\n            }\n            if (!matched) {\n                return;\n            }\n            wrappedChannelIds[item.id] = true;\n            wrappedChannels.push({\n                type: Constants.MENTION_CHANNELS,\n                channel: item,\n            });\n        });\n        wrappedChannels = wrappedChannels.sort((a, b) => {\n            //\n            // MM-12677 When this is migrated this needs to be fixed to pull the user's locale\n            //\n            return sortChannelsByTypeAndDisplayName('en', a.channel, b.channel);\n        });\n        const channelMentions = wrappedChannels.map((item) => '~' + item.channel.name);\n        resultCallback({\n            terms: channelMentions.concat([' ']),\n            items: wrappedChannels.concat([{\n                type: Constants.MENTION_MORE_CHANNELS,\n                loading: true,\n            }]),\n            component: ChannelMentionSuggestion,\n            matchedPretext: captured[1],\n        });\n\n        const handleChannels = (channels, withError) => {\n            if (prefix !== this.latestPrefix || this.shouldCancelDispatch(prefix)) {\n                return;\n            }\n\n            const myMembers = getMyChannelMemberships(store.getState());\n\n            if (channels.length === 0 && !withError) {\n                this.lastPrefixWithNoResults = prefix;\n            }\n\n            // Wrap channels in an outer object to avoid overwriting the 'type' property.\n            const wrappedMoreChannels = [];\n            channels.forEach((item) => {\n                if (item.delete_at > 0 && !myMembers[item.id]) {\n                    return;\n                }\n\n                if (myMembers[item.id] && !wrappedChannelIds[item.id]) {\n                    wrappedChannelIds[item.id] = true;\n                    wrappedChannels.push({\n                        type: Constants.MENTION_CHANNELS,\n                        channel: item,\n                    });\n                    return;\n                }\n\n                if (myMembers[item.id] && wrappedChannelIds[item.id]) {\n                    return;\n                }\n\n                if (!myMembers[item.id] && wrappedChannelIds[item.id]) {\n                    delete wrappedChannelIds[item.id];\n                    const idx = wrappedChannels.map((el) => el.channel.id).indexOf(item.id);\n                    if (idx >= 0) {\n                        wrappedChannels.splice(idx, 1);\n                    }\n                }\n\n                wrappedMoreChannels.push({\n                    type: Constants.MENTION_MORE_CHANNELS,\n                    channel: item,\n                });\n            });\n\n            wrappedChannels = wrappedChannels.sort((a, b) => {\n                //\n                // MM-12677 When this is migrated this needs to be fixed to pull the user's locale\n                //\n                return sortChannelsByTypeAndDisplayName('en', a.channel, b.channel);\n            });\n\n            const wrapped = wrappedChannels.concat(wrappedMoreChannels);\n            const mentions = wrapped.map((item) => '~' + item.channel.name);\n\n            resultCallback({\n                matchedPretext: captured[1],\n                terms: mentions,\n                items: wrapped,\n                component: ChannelMentionSuggestion,\n            });\n        };\n\n        this.autocompleteChannels(\n            prefix,\n            (channels) => handleChannels(channels, false),\n            () => handleChannels([], true),\n        );\n\n        return true;\n    }\n\n    handleCompleteWord(term) {\n        this.lastCompletedWord = term;\n        this.lastPrefixWithNoResults = '';\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {Store} from 'redux';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\nimport {AutocompleteSuggestion, CommandArgs} from 'mattermost-redux/types/integrations';\n\nimport globalStore from 'stores/redux_store';\n\nimport * as UserAgent from 'utils/user_agent';\nimport * as Utils from 'utils/utils';\nimport {Constants} from 'utils/constants';\n\nimport Suggestion from '../suggestion';\nimport Provider from '../provider';\n\nimport {GlobalState} from 'types/store';\n\nimport {AppCommandParser} from './app_command_parser/app_command_parser';\nimport {intlShim} from './app_command_parser/app_command_parser_dependencies';\n\nconst EXECUTE_CURRENT_COMMAND_ITEM_ID = Constants.Integrations.EXECUTE_CURRENT_COMMAND_ITEM_ID;\nconst COMMAND_SUGGESTION_ERROR = Constants.Integrations.COMMAND_SUGGESTION_ERROR;\n\nexport class CommandSuggestion extends Suggestion {\n    render() {\n        const {isSelection} = this.props;\n        const item = this.props.item as AutocompleteSuggestion;\n\n        let className = 'slash-command';\n        if (isSelection) {\n            className += ' suggestion--selected';\n        }\n        let symbolSpan = <span>{'/'}</span>;\n        switch (item.IconData) {\n        case EXECUTE_CURRENT_COMMAND_ITEM_ID:\n            symbolSpan = <span className='block mt-1'>{'↵'}</span>;\n            break;\n        case COMMAND_SUGGESTION_ERROR:\n            symbolSpan = <span>{'!'}</span>;\n            break;\n        }\n        let icon = <div className='slash-command__icon'>{symbolSpan}</div>;\n        if (item.IconData && ![EXECUTE_CURRENT_COMMAND_ITEM_ID, COMMAND_SUGGESTION_ERROR].includes(item.IconData)) {\n            icon = (\n                <div\n                    className='slash-command__icon'\n                    style={{backgroundColor: 'transparent'}}\n                >\n                    <img src={item.IconData}/>\n                </div>);\n        }\n\n        return (\n            <div\n                className={className}\n                onClick={this.handleClick}\n                onMouseMove={this.handleMouseMove}\n                {...Suggestion.baseProps}\n            >\n                {icon}\n                <div className='slash-command__info'>\n                    <div className='slash-command__title'>\n                        {item.Suggestion.substring(1) + ' ' + item.Hint}\n                    </div>\n                    <div className='slash-command__desc'>\n                        {item.Description}\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n\ntype Props = {\n    teamId: string;\n    channelId: string;\n    rootId?: string;\n};\n\nexport type Results = {\n    matchedPretext: string;\n    terms: string[];\n    items: AutocompleteSuggestion[];\n    component: React.ElementType;\n}\n\ntype ResultsCallback = (results: Results) => void;\n\nexport default class CommandProvider extends Provider {\n    private props: Props;\n    private store: Store<GlobalState>;\n    private triggerCharacter: string;\n    private appCommandParser: AppCommandParser;\n\n    constructor(props: Props) {\n        super();\n\n        this.store = globalStore;\n        this.props = props;\n        this.appCommandParser = new AppCommandParser(this.store as any, intlShim, props.channelId, props.teamId, props.rootId);\n        this.triggerCharacter = '/';\n    }\n\n    setProps(props: Props) {\n        this.props = props;\n        this.appCommandParser.setChannelContext(props.channelId, props.teamId, props.rootId);\n    }\n\n    handlePretextChanged(pretext: string, resultCallback: ResultsCallback) {\n        if (!pretext.startsWith(this.triggerCharacter)) {\n            return false;\n        }\n\n        if (appsEnabled(this.store.getState()) && this.appCommandParser.isAppCommand(pretext)) {\n            this.appCommandParser.getSuggestions(pretext).then((suggestions) => {\n                const matches = suggestions.map((suggestion) => ({\n                    ...suggestion,\n                    Complete: '/' + suggestion.Complete,\n                    Suggestion: '/' + suggestion.Suggestion,\n                }));\n\n                const terms = matches.map((suggestion) => suggestion.Complete);\n                resultCallback({\n                    matchedPretext: pretext,\n                    terms,\n                    items: matches,\n                    component: CommandSuggestion,\n                });\n            });\n            return true;\n        }\n\n        if (UserAgent.isMobile()) {\n            this.handleMobile(pretext, resultCallback);\n        } else {\n            this.handleWebapp(pretext, resultCallback);\n        }\n\n        return true;\n    }\n\n    handleCompleteWord(term: string, pretext: string, callback: (s: string) => void) {\n        callback(term + ' ');\n    }\n\n    handleMobile(pretext: string, resultCallback: ResultsCallback) {\n        const {teamId} = this.props;\n\n        const command = pretext.toLowerCase();\n        Client4.getCommandsList(teamId).then(\n            (data) => {\n                let matches: AutocompleteSuggestion[] = [];\n                if (appsEnabled(this.store.getState())) {\n                    const appCommandSuggestions = this.appCommandParser.getSuggestionsBase(pretext);\n                    matches = matches.concat(appCommandSuggestions);\n                }\n\n                data.forEach((cmd) => {\n                    if (!cmd.auto_complete) {\n                        return;\n                    }\n\n                    if (cmd.trigger === 'shortcuts') {\n                        return;\n                    }\n\n                    if ((this.triggerCharacter + cmd.trigger).indexOf(command) === 0) {\n                        const s = this.triggerCharacter + cmd.trigger;\n                        let hint = '';\n                        if (cmd.auto_complete_hint && cmd.auto_complete_hint.length !== 0) {\n                            hint = cmd.auto_complete_hint;\n                        }\n                        matches.push({\n                            Suggestion: s,\n                            Complete: '',\n                            Hint: hint,\n                            Description: cmd.auto_complete_desc,\n                            IconData: '',\n                        });\n                    }\n                });\n\n                matches = matches.sort((a, b) => a.Suggestion.localeCompare(b.Suggestion));\n\n                // pull out the suggested commands from the returned data\n                const terms = matches.map((suggestion) => suggestion.Suggestion);\n\n                resultCallback({\n                    matchedPretext: command,\n                    terms,\n                    items: matches,\n                    component: CommandSuggestion,\n                });\n            },\n        );\n    }\n\n    handleWebapp(pretext: string, resultCallback: ResultsCallback) {\n        const command = pretext.toLowerCase();\n\n        const {teamId, channelId, rootId} = this.props;\n        const args: CommandArgs = {\n            team_id: teamId,\n            channel_id: channelId,\n            root_id: rootId,\n        };\n\n        Client4.getCommandAutocompleteSuggestionsList(command, teamId, args).then(\n            ((data: AutocompleteSuggestion[]) => {\n                let matches: AutocompleteSuggestion[] = [];\n\n                let cmd = 'Ctrl';\n                if (Utils.isMac()) {\n                    cmd = '⌘';\n                }\n\n                if (appsEnabled(this.store.getState()) && this.appCommandParser) {\n                    const appCommandSuggestions = this.appCommandParser.getSuggestionsBase(pretext).map((suggestion) => ({\n                        ...suggestion,\n                        Complete: '/' + suggestion.Complete,\n                        Suggestion: suggestion.Suggestion,\n                    }));\n                    matches = matches.concat(appCommandSuggestions);\n                }\n\n                data.forEach((s) => {\n                    if (!this.contains(matches, this.triggerCharacter + s.Complete)) {\n                        matches.push({\n                            Complete: this.triggerCharacter + s.Complete,\n                            Suggestion: this.triggerCharacter + s.Suggestion,\n                            Hint: s.Hint,\n                            Description: s.Description,\n                            IconData: s.IconData,\n                        });\n                    }\n                });\n\n                // sort only if we are looking at base commands\n                if (!pretext.includes(' ')) {\n                    matches.sort((a, b) => {\n                        if (a.Suggestion.toLowerCase() > b.Suggestion.toLowerCase()) {\n                            return 1;\n                        } else if (a.Suggestion.toLowerCase() < b.Suggestion.toLowerCase()) {\n                            return -1;\n                        }\n                        return 0;\n                    });\n                }\n\n                if (this.shouldAddExecuteItem(data, pretext)) {\n                    matches.unshift({\n                        Complete: pretext + EXECUTE_CURRENT_COMMAND_ITEM_ID,\n                        Suggestion: '/Execute Current Command',\n                        Hint: '',\n                        Description: 'Select this option or use ' + cmd + '+Enter to execute the current command.',\n                        IconData: EXECUTE_CURRENT_COMMAND_ITEM_ID,\n                    });\n                }\n\n                // pull out the suggested commands from the returned data\n                const terms = matches.map((suggestion) => suggestion.Complete);\n\n                resultCallback({\n                    matchedPretext: command,\n                    terms,\n                    items: matches,\n                    component: CommandSuggestion,\n                });\n            }),\n        );\n    }\n\n    shouldAddExecuteItem(data: AutocompleteSuggestion[], pretext: string) {\n        if (data.length === 0) {\n            return false;\n        }\n        if (pretext[pretext.length - 1] === ' ') {\n            return true;\n        }\n\n        // If suggestion is empty it means that user can input any text so we allow them to execute.\n        return data.findIndex((item) => item.Suggestion === '') !== -1;\n    }\n\n    contains(matches: AutocompleteSuggestion[], complete: string) {\n        return matches.findIndex((match) => match.Complete === complete) !== -1;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {Store} from 'redux';\n\nimport globalStore from 'stores/redux_store';\n\nimport Provider from '../provider';\nimport {GlobalState} from 'types/store';\n\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\n\nimport AtMentionSuggestion from '../at_mention_provider/at_mention_suggestion';\n\nimport {ChannelMentionSuggestion} from '../channel_mention_provider';\n\nimport {AppCommandParser} from './app_command_parser/app_command_parser';\n\nimport {AutocompleteSuggestion, Channel, COMMAND_SUGGESTION_CHANNEL, COMMAND_SUGGESTION_USER, intlShim, UserProfile} from './app_command_parser/app_command_parser_dependencies';\nimport {CommandSuggestion} from './command_provider';\n\ntype Props = {\n    teamId: string;\n    channelId: string;\n    rootId?: string;\n};\n\nexport type Results = {\n    matchedPretext: string;\n    terms: string[];\n    items: Array<AutocompleteSuggestion | UserProfile | {channel: Channel}>;\n    component: React.ElementType;\n}\n\ntype ResultsCallback = (results: Results) => void;\n\nexport default class AppCommandProvider extends Provider {\n    private store: Store<GlobalState>;\n    private triggerCharacter: string;\n    private appCommandParser: AppCommandParser;\n\n    constructor(props: Props) {\n        super();\n\n        this.store = globalStore;\n        this.appCommandParser = new AppCommandParser(this.store as any, intlShim, props.channelId, props.teamId, props.rootId);\n        this.triggerCharacter = '/';\n    }\n\n    setProps(props: Props) {\n        this.appCommandParser.setChannelContext(props.channelId, props.teamId, props.rootId);\n    }\n\n    handlePretextChanged(pretext: string, resultCallback: ResultsCallback) {\n        if (!pretext.startsWith(this.triggerCharacter)) {\n            return false;\n        }\n\n        if (!appsEnabled(this.store.getState())) {\n            return false;\n        }\n\n        if (!this.appCommandParser.isAppCommand(pretext)) {\n            return false;\n        }\n\n        this.appCommandParser.getSuggestions(pretext).then((suggestions) => {\n            let element = CommandSuggestion;\n            const matches = suggestions.map((suggestion) => {\n                switch (suggestion.type) {\n                case COMMAND_SUGGESTION_USER:\n                    element = AtMentionSuggestion;\n                    return suggestion.item! as UserProfile;\n                case COMMAND_SUGGESTION_CHANNEL:\n                    element = ChannelMentionSuggestion;\n                    return {channel: suggestion.item! as Channel};\n                default:\n                    return {\n                        ...suggestion,\n                        Complete: '/' + suggestion.Complete,\n                        Suggestion: '/' + suggestion.Suggestion,\n                    };\n                }\n            });\n\n            const terms = suggestions.map((suggestion) => '/' + suggestion.Complete);\n            resultCallback({\n                matchedPretext: pretext,\n                terms,\n                items: matches,\n                component: element,\n            });\n        });\n        return true;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {autocompleteCustomEmojis} from 'mattermost-redux/actions/emojis';\nimport {getEmojiImageUrl} from 'mattermost-redux/utils/emoji_utils';\n\nimport {getEmojiMap, getRecentEmojis} from 'selectors/emojis';\n\nimport store from 'stores/redux_store.jsx';\n\nimport * as Emoticons from 'utils/emoticons';\nimport {compareEmojis} from 'utils/emoji_utils';\n\nimport Suggestion from './suggestion.jsx';\nimport Provider from './provider.jsx';\n\nexport const MIN_EMOTICON_LENGTH = 2;\nexport const EMOJI_CATEGORY_SUGGESTION_BLOCKLIST = ['skintone'];\n\nclass EmoticonSuggestion extends Suggestion {\n    render() {\n        const text = this.props.term;\n        const emoji = this.props.item.emoji;\n\n        let className = 'emoticon-suggestion';\n        if (this.props.isSelection) {\n            className += ' suggestion--selected';\n        }\n\n        return (\n            <div\n                className={className}\n                onClick={this.handleClick}\n                onMouseMove={this.handleMouseMove}\n                {...Suggestion.baseProps}\n            >\n                <div className='pull-left'>\n                    <img\n                        alt={text}\n                        className='emoticon-suggestion__image'\n                        src={getEmojiImageUrl(emoji)}\n                        title={text}\n                    />\n                </div>\n                <div className='pull-left'>\n                    {text}\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default class EmoticonProvider extends Provider {\n    constructor() {\n        super();\n\n        this.triggerCharacter = ':';\n    }\n    handlePretextChanged(pretext, resultsCallback) {\n        // Look for the potential emoticons at the start of the text, after whitespace, and at the start of emoji reaction commands\n        const captured = (/(^|\\s|^\\+|^-)(:([^:\\s]*))$/g).exec(pretext.toLowerCase());\n        if (!captured) {\n            return false;\n        }\n\n        const prefix = captured[1];\n        const text = captured[2];\n        const partialName = captured[3];\n\n        if (partialName.length < MIN_EMOTICON_LENGTH) {\n            return false;\n        }\n\n        // Check for text emoticons if this isn't for an emoji reaction\n        if (prefix !== '-' && prefix !== '+') {\n            for (const emoticon of Object.keys(Emoticons.emoticonPatterns)) {\n                if (Emoticons.emoticonPatterns[emoticon].test(text)) {\n                    // Don't show the autocomplete for text emoticons\n                    return false;\n                }\n            }\n        }\n\n        if (store.getState().entities.general.config.EnableCustomEmoji === 'true') {\n            store.dispatch(autocompleteCustomEmojis(partialName)).then(() => this.findAndSuggestEmojis(text, partialName, resultsCallback));\n        } else {\n            this.findAndSuggestEmojis(text, partialName, resultsCallback);\n        }\n\n        return true;\n    }\n\n    formatEmojis(emojis) {\n        return emojis.map((item) => ':' + item.name + ':');\n    }\n\n    // findAndSuggestEmojis uses the provided partialName to match anywhere inside an emoji name.\n    //\n    // For example, typing `:welc` would match both `:welcome:` and `:youre_welcome:` if those\n    // emojis are present in the local store. Note, however, that the server only does prefix\n    // matches, so a query to populate the local store for `:welc` would only return `:welcome:`.\n    // This results in surprising differences between a fresh load of the application, and the\n    // changes to the cache from expanding the cache with emojis found in existing posts.\n    //\n    // For now, this behaviour and difference is by design.\n    // See https://mattermost.atlassian.net/browse/MM-17320.\n    findAndSuggestEmojis(text, partialName, resultsCallback) {\n        const recentMatched = [];\n        const matched = [];\n        const state = store.getState();\n        const skintone = state.entities?.preferences?.myPreferences['emoji--emoji_skintone']?.value || 'default';\n        const emojiMap = getEmojiMap(state);\n        const recentEmojis = getRecentEmojis(state);\n\n        // Check for named emoji\n        for (const [name, emoji] of emojiMap) {\n            if (EMOJI_CATEGORY_SUGGESTION_BLOCKLIST.includes(emoji.category)) {\n                continue;\n            }\n\n            if (emoji.short_names) {\n                // This is a system emoji so it may have multiple names\n                for (const alias of emoji.short_names) {\n                    if (alias.indexOf(partialName) !== -1) {\n                        const matchedArray = recentEmojis.includes(alias) || recentEmojis.includes(name) ?\n                            recentMatched :\n                            matched;\n\n                        // if the emoji has skin, only add those that match with the user selected skin.\n                        if (Emoticons.emojiMatchesSkin(emoji, skintone)) {\n                            matchedArray.push({name: alias, emoji});\n                        }\n                        break;\n                    }\n                }\n            } else if (name.indexOf(partialName) !== -1) {\n                // This is a custom emoji so it only has one name\n                if (emojiMap.hasSystemEmoji(name)) {\n                    // System emojis take precedence over custom ones\n                    continue;\n                }\n\n                const matchedArray = recentEmojis.includes(name) ?\n                    recentMatched :\n                    matched;\n\n                matchedArray.push({name, emoji});\n            }\n        }\n\n        const sortEmojisHelper = (a, b) => {\n            return compareEmojis(a, b, partialName);\n        };\n\n        recentMatched.sort(sortEmojisHelper);\n\n        matched.sort(sortEmojisHelper);\n\n        const terms = [\n            ...this.formatEmojis(recentMatched),\n            ...this.formatEmojis(matched),\n        ];\n\n        const items = [\n            ...recentMatched,\n            ...matched,\n        ];\n\n        // Required to get past the dispatch during dispatch error\n\n        resultsCallback({\n            matchedPretext: text,\n            terms,\n            items,\n            component: EmoticonSuggestion,\n        });\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ChangeEvent, ElementType, FocusEvent, KeyboardEvent, MouseEvent} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {ActionResult} from 'mattermost-redux/types/actions';\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport AutosizeTextarea from 'components/autosize_textarea';\nimport PostMarkdown from 'components/post_markdown';\nimport Provider from 'components/suggestion/provider';\nimport AtMentionProvider from 'components/suggestion/at_mention_provider';\nimport ChannelMentionProvider from 'components/suggestion/channel_mention_provider.jsx';\nimport AppCommandProvider from 'components/suggestion/command_provider/app_provider';\nimport CommandProvider from 'components/suggestion/command_provider/command_provider';\nimport EmoticonProvider from 'components/suggestion/emoticon_provider.jsx';\nimport SuggestionBox from 'components/suggestion/suggestion_box.jsx';\nimport SuggestionList from 'components/suggestion/suggestion_list.jsx';\n\nimport * as Utils from 'utils/utils.jsx';\n\ntype Props = {\n    id: string;\n    channelId: string;\n    rootId?: string;\n    tabIndex?: number;\n    value: string;\n    onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n    onKeyPress: (e: KeyboardEvent) => void;\n    onComposition?: () => void;\n    onHeightChange?: (height: number, maxHeight: number) => void;\n    createMessage: string;\n    onKeyDown?: (e: KeyboardEvent) => void;\n    onSelect?: (e: React.SyntheticEvent) => void;\n    onMouseUp?: (e: MouseEvent) => void;\n    onKeyUp?: (e: KeyboardEvent) => void;\n    onBlur?: (e: FocusEvent) => void;\n    supportsCommands: boolean;\n    handlePostError?: (message: JSX.Element | null) => void;\n    suggestionList?: React.ComponentProps<typeof SuggestionBox>['listComponent'];\n    suggestionListPosition?: React.ComponentProps<typeof SuggestionList>['position'];\n    emojiEnabled?: boolean;\n    isRHS?: boolean;\n    characterLimit: number;\n    disabled?: boolean;\n    badConnection?: boolean;\n    listenForMentionKeyClick?: boolean;\n    currentUserId: string;\n    currentTeamId: string;\n    preview?: boolean;\n    profilesInChannel: Array<{ id: string }>;\n    autocompleteGroups: Array<{ id: string }> | null;\n    actions: {\n        autocompleteUsersInChannel: (prefix: string, channelId: string | undefined) => (dispatch: any, getState: any) => Promise<string[]>;\n        autocompleteChannels: (term: string, success: (channels: Channel[]) => void, error: () => void) => (dispatch: any, getState: any) => Promise<ActionResult>;\n        searchAssociatedGroupsForReference: (prefix: string, teamId: string, channelId: string | undefined) => (dispatch: any, getState: any) => Promise<{ data: any }>;\n    };\n    useChannelMentions: boolean;\n    inputComponent?: ElementType;\n    openWhenEmpty?: boolean;\n    priorityProfiles?: UserProfile[];\n};\n\nexport default class Textbox extends React.PureComponent<Props> {\n    private suggestionProviders: Provider[];\n    private wrapper: React.RefObject<HTMLDivElement>;\n    private message: React.RefObject<SuggestionBox>;\n    private preview: React.RefObject<HTMLDivElement>;\n\n    static defaultProps = {\n        supportsCommands: true,\n        isRHS: false,\n        listenForMentionKeyClick: false,\n        inputComponent: AutosizeTextarea,\n        suggestionList: SuggestionList,\n    };\n\n    constructor(props: Props) {\n        super(props);\n\n        this.suggestionProviders = [];\n\n        if (props.supportsCommands) {\n            this.suggestionProviders.push(new AppCommandProvider({\n                teamId: this.props.currentTeamId,\n                channelId: this.props.channelId,\n                rootId: this.props.rootId,\n            }));\n        }\n\n        this.suggestionProviders.push(\n            new AtMentionProvider({\n                currentUserId: this.props.currentUserId,\n                profilesInChannel: this.props.profilesInChannel,\n                autocompleteUsersInChannel: (prefix: string) => this.props.actions.autocompleteUsersInChannel(prefix, this.props.channelId),\n                useChannelMentions: this.props.useChannelMentions,\n                autocompleteGroups: this.props.autocompleteGroups,\n                searchAssociatedGroupsForReference: (prefix: string) => this.props.actions.searchAssociatedGroupsForReference(prefix, this.props.currentTeamId, this.props.channelId),\n                priorityProfiles: this.props.priorityProfiles,\n            }),\n            new ChannelMentionProvider(props.actions.autocompleteChannels),\n            new EmoticonProvider(),\n        );\n\n        if (props.supportsCommands) {\n            this.suggestionProviders.push(new CommandProvider({\n                teamId: this.props.currentTeamId,\n                channelId: this.props.channelId,\n                rootId: this.props.rootId,\n            }));\n        }\n\n        this.checkMessageLength(props.value);\n        this.wrapper = React.createRef();\n        this.message = React.createRef();\n        this.preview = React.createRef();\n    }\n\n    handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n        this.props.onChange(e);\n    }\n\n    updateSuggestions(prevProps: Props) {\n        if (this.props.channelId !== prevProps.channelId ||\n            this.props.currentUserId !== prevProps.currentUserId ||\n            this.props.profilesInChannel !== prevProps.profilesInChannel ||\n            this.props.autocompleteGroups !== prevProps.autocompleteGroups) {\n            // Update channel id for AtMentionProvider.\n            const providers = this.suggestionProviders;\n            for (let i = 0; i < providers.length; i++) {\n                if (providers[i] instanceof AtMentionProvider) {\n                    (providers[i] as AtMentionProvider).setProps({\n                        currentUserId: this.props.currentUserId,\n                        profilesInChannel: this.props.profilesInChannel,\n                        autocompleteUsersInChannel: (prefix: string) => this.props.actions.autocompleteUsersInChannel(prefix, this.props.channelId),\n                        useChannelMentions: this.props.useChannelMentions,\n                        autocompleteGroups: this.props.autocompleteGroups,\n                        searchAssociatedGroupsForReference: (prefix: string) => this.props.actions.searchAssociatedGroupsForReference(prefix, this.props.currentTeamId, this.props.channelId),\n                        priorityProfiles: this.props.priorityProfiles,\n                    });\n                }\n                if (providers[i] instanceof CommandProvider) {\n                    (providers[i] as CommandProvider).setProps({\n                        teamId: this.props.currentTeamId,\n                        channelId: this.props.channelId,\n                        rootId: this.props.rootId,\n                    });\n                }\n            }\n        }\n        if (prevProps.value !== this.props.value) {\n            this.checkMessageLength(this.props.value);\n        }\n    }\n    componentDidUpdate(prevProps: Props) {\n        if (!prevProps.preview && this.props.preview) {\n            this.preview.current?.focus();\n        }\n\n        this.updateSuggestions(prevProps);\n    }\n\n    checkMessageLength = (message: string) => {\n        if (this.props.handlePostError) {\n            if (message.length > this.props.characterLimit) {\n                const errorMessage = (\n                    <FormattedMessage\n                        id='create_post.error_message'\n                        defaultMessage='Your message is too long. Character count: {length}/{limit}'\n                        values={{\n                            length: message.length,\n                            limit: this.props.characterLimit,\n                        }}\n                    />);\n                this.props.handlePostError(errorMessage);\n            } else {\n                this.props.handlePostError(null);\n            }\n        }\n    }\n\n    handleKeyDown = (e: KeyboardEvent) => {\n        this.props.onKeyDown?.(e);\n    }\n\n    handleSelect = (e: React.SyntheticEvent) => {\n        this.props.onSelect?.(e);\n    }\n\n    handleMouseUp = (e: MouseEvent) => {\n        this.props.onMouseUp?.(e);\n    }\n\n    handleKeyUp = (e: KeyboardEvent) => {\n        this.props.onKeyUp?.(e);\n    }\n\n    handleBlur = (e: FocusEvent) => {\n        this.props.onBlur?.(e);\n    }\n\n    handleHeightChange = (height: number, maxHeight: number) => {\n        this.props.onHeightChange?.(height, maxHeight);\n    }\n\n    getInputBox = () => {\n        return this.message.current?.getTextbox();\n    }\n\n    focus = () => {\n        const textbox = this.getInputBox();\n        if (textbox) {\n            textbox.focus();\n            Utils.placeCaretAtEnd(textbox);\n\n            // reset character count warning\n            this.checkMessageLength(textbox.value);\n        }\n    }\n\n    blur = () => {\n        this.getInputBox()?.blur();\n    };\n\n    recalculateSize = () => {\n        this.message.current?.recalculateSize();\n    }\n\n    render() {\n        let preview = null;\n\n        let textboxClassName = 'form-control custom-textarea';\n        let textWrapperClass = 'textarea-wrapper';\n        let wrapperHeight;\n        if (this.props.emojiEnabled) {\n            textboxClassName += ' custom-textarea--emoji-picker';\n        }\n        if (this.props.badConnection) {\n            textboxClassName += ' bad-connection';\n        }\n        if (this.wrapper.current) {\n            wrapperHeight = this.getInputBox()?.clientHeight;\n        }\n        if (this.props.preview) {\n            textboxClassName += ' custom-textarea--preview';\n            textWrapperClass += ' textarea-wrapper--preview';\n\n            preview = (\n                <div\n                    tabIndex={this.props.tabIndex || 0}\n                    ref={this.preview}\n                    className='form-control custom-textarea textbox-preview-area'\n                    onKeyPress={this.props.onKeyPress}\n                    onKeyDown={this.handleKeyDown}\n                    onSelect={this.handleSelect}\n                    onBlur={this.handleBlur}\n                >\n                    <PostMarkdown\n                        isRHS={this.props.isRHS}\n                        message={this.props.value}\n                        mentionKeys={[]}\n                        channelId={this.props.channelId}\n                    />\n                </div>\n            );\n        }\n\n        return (\n            <div\n                ref={this.wrapper}\n                className={textWrapperClass}\n            >\n                <SuggestionBox\n                    id={this.props.id}\n                    ref={this.message}\n                    className={textboxClassName}\n                    spellCheck='true'\n                    placeholder={this.props.createMessage}\n                    onChange={this.handleChange}\n                    onKeyPress={this.props.onKeyPress}\n                    onSelect={this.handleSelect}\n                    onKeyDown={this.handleKeyDown}\n                    onMouseUp={this.handleMouseUp}\n                    onKeyUp={this.handleKeyUp}\n                    onComposition={this.props.onComposition}\n                    onBlur={this.handleBlur}\n                    onHeightChange={this.handleHeightChange}\n                    style={{visibility: this.props.preview ? 'hidden' : 'visible'}}\n                    inputComponent={this.props.inputComponent}\n                    listComponent={this.props.suggestionList}\n                    listPosition={this.props.suggestionListPosition}\n                    providers={this.suggestionProviders}\n                    channelId={this.props.channelId}\n                    value={this.props.value}\n                    renderDividers={true}\n                    isRHS={this.props.isRHS}\n                    disabled={this.props.disabled}\n                    contextId={this.props.channelId}\n                    listenForMentionKeyClick={this.props.listenForMentionKeyClick}\n                    wrapperHeight={wrapperHeight}\n                    openWhenEmpty={this.props.openWhenEmpty}\n                />\n                {preview}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {bindActionCreators, Dispatch} from 'redux';\nimport {connect} from 'react-redux';\n\nimport {getAssociatedGroupsForReference} from 'mattermost-redux/selectors/entities/groups';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {makeGetProfilesForThread} from 'mattermost-redux/selectors/entities/posts';\n\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nimport {getCurrentUserId, makeGetProfilesInChannel} from 'mattermost-redux/selectors/entities/users';\nimport {makeAddLastViewAtToProfiles} from 'mattermost-redux/selectors/entities/utils';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {autocompleteUsersInChannel} from 'actions/views/channel';\nimport {searchAssociatedGroupsForReference} from 'actions/views/group';\nimport {autocompleteChannels} from 'actions/channel_actions';\n\nimport Textbox from './textbox';\n\ntype Props = {\n    channelId: string;\n    rootId?: string;\n};\n\n/* eslint-disable camelcase */\n\nconst getProfilesInChannelOptions = {active: true};\n\nconst makeMapStateToProps = () => {\n    const getProfilesInChannel = makeGetProfilesInChannel();\n    const addLastViewAtToProfiles = makeAddLastViewAtToProfiles();\n    const getProfilesForThread = makeGetProfilesForThread();\n    return (state: GlobalState, ownProps: Props) => {\n        const teamId = getCurrentTeamId(state);\n        const license = getLicense(state);\n        const useGroupMentions = license?.IsLicensed === 'true' && license?.LDAPGroups === 'true' && haveIChannelPermission(state,\n            teamId,\n            ownProps.channelId,\n            Permissions.USE_GROUP_MENTIONS,\n        );\n        const autocompleteGroups = useGroupMentions ? getAssociatedGroupsForReference(state, teamId, ownProps.channelId) : null;\n        const profilesInChannel = getProfilesInChannel(state, ownProps.channelId, getProfilesInChannelOptions);\n        const profilesWithLastViewAtInChannel = addLastViewAtToProfiles(state, profilesInChannel);\n\n        return {\n            currentUserId: getCurrentUserId(state),\n            currentTeamId: teamId,\n            profilesInChannel: profilesWithLastViewAtInChannel,\n            autocompleteGroups,\n            priorityProfiles: getProfilesForThread(state, ownProps.rootId ?? ''),\n        };\n    };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch<GenericAction>) => ({\n    actions: bindActionCreators({\n        autocompleteUsersInChannel,\n        autocompleteChannels,\n        searchAssociatedGroupsForReference,\n    }, dispatch),\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps, null, {forwardRef: true})(Textbox);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {MouseEvent} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\ntype Props = {\n    showPreview?: boolean;\n    characterLimit: number;\n    previewMessageLink?: string;\n    updatePreview?: (showPreview: boolean) => void;\n    message: string;\n    isMarkdownPreviewEnabled: boolean;\n};\n\nexport default class TextboxLinks extends React.PureComponent<Props> {\n    static propTypes = {\n    };\n\n    static defaultProps = {\n        message: '',\n    };\n\n    togglePreview = (e: MouseEvent) => {\n        e.preventDefault();\n        this.props.updatePreview?.(!this.props.showPreview);\n    }\n\n    render() {\n        const {isMarkdownPreviewEnabled} = this.props;\n        const hasText = this.props.message && this.props.message.length > 0;\n        let editHeader;\n\n        let helpTextClass = '';\n\n        if (this.props.message && this.props.message.length > this.props.characterLimit) {\n            helpTextClass = 'hidden';\n        }\n\n        if (this.props.previewMessageLink) {\n            editHeader = (\n                <span>\n                    {this.props.previewMessageLink}\n                </span>\n            );\n        } else {\n            editHeader = (\n                <FormattedMessage\n                    id='textbox.edit'\n                    defaultMessage='Edit message'\n                />\n            );\n        }\n\n        let previewLink = null;\n        if (isMarkdownPreviewEnabled) {\n            previewLink = (\n                <button\n                    id='previewLink'\n                    onClick={this.togglePreview}\n                    className='style--none textbox-preview-link color--link'\n                >\n                    {this.props.showPreview ? (\n                        editHeader\n                    ) : (\n                        <FormattedMessage\n                            id='textbox.preview'\n                            defaultMessage='Preview'\n                        />\n                    )}\n                </button>\n            );\n        }\n\n        const helpText = (\n            <div\n                style={{visibility: hasText ? 'visible' : 'hidden', opacity: hasText ? '0.45' : '0'}}\n                className='help__format-text'\n            >\n                <b>\n                    <FormattedMessage\n                        id='textbox.bold'\n                        defaultMessage='**bold**'\n                    />\n                </b>\n                <i>\n                    <FormattedMessage\n                        id='textbox.italic'\n                        defaultMessage='*italic*'\n                    />\n                </i>\n                <span>\n                    {'~~'}\n                    <s>\n                        <FormattedMessage\n                            id='textbox.strike'\n                            defaultMessage='strike'\n                        />\n                    </s>\n                    {'~~ '}\n                </span>\n                <span>\n                    <FormattedMessage\n                        id='textbox.inlinecode'\n                        defaultMessage='`inline code`'\n                    />\n                </span>\n                <span>\n                    <FormattedMessage\n                        id='textbox.preformatted'\n                        defaultMessage='```preformatted```'\n                    />\n                </span>\n                <span>\n                    <FormattedMessage\n                        id='textbox.quote'\n                        defaultMessage='>quote'\n                    />\n                </span>\n            </div>\n        );\n\n        return (\n            <div className={'help__text ' + helpTextClass}>\n                {helpText}\n                {previewLink}\n                <Link\n                    target='_blank'\n                    rel='noopener noreferrer'\n                    to='/help/messaging'\n                    className='textbox-help-link'\n                >\n                    <FormattedMessage\n                        id='textbox.help'\n                        defaultMessage='Help'\n                    />\n                </Link>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport Constants from 'utils/constants';\nimport {isFeatureEnabled} from 'utils/utils';\n\nimport TextboxLinks from './textbox_links';\n\nconst PreReleaseFeatures = Constants.PRE_RELEASE_FEATURES;\n\nconst mapStateToProps = (state: GlobalState) => {\n    return ({\n        isMarkdownPreviewEnabled: isFeatureEnabled(PreReleaseFeatures.MARKDOWN_PREVIEW, state),\n    });\n};\n\nexport default connect(mapStateToProps)(TextboxLinks);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, ButtonHTMLAttributes, ReactNode} from 'react';\nimport classNames from 'classnames';\n\nimport './button.scss';\n\ntype Props = {\n    prepend?: ReactNode;\n    append?: ReactNode;\n    isActive?: boolean;\n    hasDot?: boolean;\n    allowTextOverflow?: boolean;\n}\n\ntype Attrs = Exclude<ButtonHTMLAttributes<HTMLButtonElement>, Props>\n\nfunction Button({\n    prepend,\n    append,\n    children,\n    isActive,\n    hasDot,\n    allowTextOverflow = false,\n    ...attrs\n}: Props & Attrs) {\n    return (\n        <button\n            {...attrs}\n            className={classNames('Button Button___transparent', {'is-active': isActive, allowTextOverflow}, attrs.className)}\n        >\n            {prepend && (\n                <span className='Button_prepended'>\n                    {prepend}\n                </span>\n            )}\n            <span className='Button_label'>\n                {children}\n                {hasDot && <span className='dot'/>}\n            </span>\n            {append && (\n                <span className='Button_appended'>\n                    {append}\n                </span>\n            )}\n        </button>\n    );\n}\n\nexport default memo(Button);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, ComponentProps} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport classNames from 'classnames';\n\nimport Button from '../button';\nimport {t} from 'utils/i18n';\n\ntype Props = {\n    isFollowing: boolean | null | undefined;\n}\n\nfunction FollowButton({\n    isFollowing,\n    ...props\n}: Props & Exclude<ComponentProps<typeof Button>, Props>) {\n    const {formatMessage} = useIntl();\n    return (\n        <Button\n            {...props}\n            className={classNames(props.className, 'FollowButton')}\n            disabled={props.disabled ?? isFollowing == null}\n            isActive={isFollowing ?? false}\n        >\n            {formatMessage(isFollowing ? {\n                id: t('threading.following'),\n                defaultMessage: 'Following',\n            } : {\n                id: t('threading.notFollowing'),\n                defaultMessage: 'Follow',\n            })}\n        </Button>\n    );\n}\n\nexport default memo(FollowButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {ComponentProps} from 'react';\n\nimport Timestamp from 'components/timestamp';\n\nexport const THREADING_TIME: Partial<ComponentProps<typeof Timestamp>> = {\n    units: [\n        'now',\n        'minute',\n        'hour',\n        'day',\n        'week',\n    ],\n    useTime: false,\n    day: 'numeric',\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useMemo, useCallback} from 'react';\nimport {useParams, useHistory} from 'react-router-dom';\nimport {useSelector, shallowEqual} from 'react-redux';\n\nimport {UserThread} from 'mattermost-redux/types/threads';\nimport {$ID, $Name} from 'mattermost-redux/types/utilities';\nimport {Team} from 'mattermost-redux/types/teams';\n\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\n/**\n * GlobalThreads-specific hook for nav/routing, selection, and common data needed for actions.\n */\nexport function useThreadRouting() {\n    const matchParams = useParams<{team: string; threadIdentifier?: $ID<UserThread>}>();\n    const params = useMemo(() => matchParams, [matchParams.threadIdentifier, matchParams.team]);\n    const history = useHistory();\n\n    const currentTeamId = useSelector(getCurrentTeamId, shallowEqual);\n    const currentUserId = useSelector(getCurrentUserId, shallowEqual);\n\n    const select = useCallback((threadId?: $ID<UserThread>) => {\n        return history.push(`/${params.team}/threads${threadId ? '/' + threadId : ''}`);\n    }, [params.team]);\n\n    const clear = useCallback(() => history.replace(`/${params.team}/threads`), [params.team]);\n\n    const goToInChannel = useCallback((threadId?: $ID<UserThread>, teamName: $Name<Team> = params.team) => {\n        return history.push(`/${teamName}/pl/${threadId ?? params.threadIdentifier}`);\n    }, [params.threadIdentifier, params.team]);\n\n    return {\n        params,\n        history,\n        currentTeamId,\n        currentUserId,\n        clear,\n        select,\n        goToInChannel,\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createSelector} from 'reselect';\n\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {\n    makeGetMessageInHistoryItem,\n    getPost,\n    makeGetPostIdsForThread,\n} from 'mattermost-redux/selectors/entities/posts';\nimport {getCustomEmojisByName} from 'mattermost-redux/selectors/entities/emojis';\nimport {\n    removeReaction,\n    addMessageIntoHistory,\n    moveHistoryIndexBack,\n    moveHistoryIndexForward,\n} from 'mattermost-redux/actions/posts';\nimport {Posts} from 'mattermost-redux/constants';\nimport {isPostPendingOrFailed} from 'mattermost-redux/utils/post_utils';\n\nimport * as PostActions from 'actions/post_actions.jsx';\nimport {executeCommand} from 'actions/command';\nimport {runMessageWillBePostedHooks, runSlashCommandWillBePostedHooks} from 'actions/hooks';\nimport {setGlobalItem, actionOnGlobalItemsWithPrefix} from 'actions/storage';\nimport EmojiMap from 'utils/emoji_map';\nimport {getPostDraft} from 'selectors/rhs';\n\nimport * as Utils from 'utils/utils.jsx';\nimport {Constants, StoragePrefixes} from 'utils/constants';\nimport {PostDraft} from 'types/store/rhs';\nimport {GlobalState} from 'types/store';\nimport {DispatchFunc, GetStateFunc} from 'mattermost-redux/types/actions';\n\nexport function clearCommentDraftUploads() {\n    return actionOnGlobalItemsWithPrefix(StoragePrefixes.COMMENT_DRAFT, (_key: string, value: PostDraft) => {\n        if (value) {\n            return {...value, uploadsInProgress: []};\n        }\n        return value;\n    });\n}\n\n// Temporarily store draft manually in localStorage since the current version of redux-persist\n// we're on will not save the draft quickly enough on page unload.\nexport function updateCommentDraft(rootId: string, draft?: PostDraft | null) {\n    const key = `${StoragePrefixes.COMMENT_DRAFT}${rootId}`;\n    if (draft) {\n        localStorage.setItem(key, JSON.stringify(draft));\n    } else {\n        localStorage.removeItem(key);\n    }\n    return setGlobalItem(key, draft);\n}\n\nexport function makeOnMoveHistoryIndex(rootId: string, direction: number) {\n    const getMessageInHistory = makeGetMessageInHistoryItem(Posts.MESSAGE_TYPES.COMMENT as 'comment');\n\n    return () => (dispatch: DispatchFunc, getState: () => GlobalState) => {\n        const draft = getPostDraft(getState(), StoragePrefixes.COMMENT_DRAFT, rootId);\n        if (draft.message !== '' && draft.message !== getMessageInHistory(getState())) {\n            return {data: true};\n        }\n\n        if (direction === -1) {\n            dispatch(moveHistoryIndexBack(Posts.MESSAGE_TYPES.COMMENT));\n        } else if (direction === 1) {\n            dispatch(moveHistoryIndexForward(Posts.MESSAGE_TYPES.COMMENT));\n        }\n\n        const nextMessageInHistory = getMessageInHistory(getState());\n\n        dispatch(updateCommentDraft(rootId, {...draft, message: nextMessageInHistory}));\n        return {data: true};\n    };\n}\n\nexport function submitPost(channelId: string, rootId: string, draft: PostDraft) {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState();\n\n        const userId = getCurrentUserId(state);\n\n        const time = Utils.getTimestamp();\n\n        let post = {\n            file_ids: [],\n            message: draft.message,\n            channel_id: channelId,\n            root_id: rootId,\n            pending_post_id: `${userId}:${time}`,\n            user_id: userId,\n            create_at: time,\n            metadata: {},\n            props: {...draft.props},\n        };\n\n        const hookResult = await dispatch(runMessageWillBePostedHooks(post));\n        if (hookResult.error) {\n            return {error: hookResult.error};\n        }\n\n        post = hookResult.data;\n\n        return dispatch(PostActions.createPost(post, draft.fileInfos));\n    };\n}\n\nexport function submitReaction(postId: string, action: string, emojiName: string) {\n    return (dispatch: DispatchFunc) => {\n        if (action === '+') {\n            dispatch(PostActions.addReaction(postId, emojiName));\n        } else if (action === '-') {\n            dispatch(removeReaction(postId, emojiName));\n        }\n        return {data: true};\n    };\n}\n\nexport function submitCommand(channelId: string, rootId: string, draft: PostDraft) {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState();\n\n        const teamId = getCurrentTeamId(state);\n\n        let args = {\n            channel_id: channelId,\n            team_id: teamId,\n            root_id: rootId,\n        };\n\n        let {message} = draft;\n\n        const hookResult = await dispatch(runSlashCommandWillBePostedHooks(message, args));\n        if (hookResult.error) {\n            return {error: hookResult.error};\n        } else if (!hookResult.data.message && !hookResult.data.args) {\n            // do nothing with an empty return from a hook\n            return {};\n        }\n\n        message = hookResult.data.message;\n        args = hookResult.data.args;\n\n        const {error} = await dispatch(executeCommand(message, args));\n\n        if (error) {\n            if (error.sendMessage) {\n                return dispatch(submitPost(channelId, rootId, draft));\n            }\n            throw (error);\n        }\n\n        return {};\n    };\n}\n\nexport function makeOnSubmit(channelId: string, rootId: string, latestPostId: string) {\n    return (draft: PostDraft, options: {ignoreSlash?: boolean} = {}) => async (dispatch: DispatchFunc, getState: () => GlobalState) => {\n        const {message} = draft;\n\n        dispatch(addMessageIntoHistory(message));\n\n        dispatch(updateCommentDraft(rootId, null));\n\n        const isReaction = Utils.REACTION_PATTERN.exec(message);\n\n        const emojis = getCustomEmojisByName(getState());\n        const emojiMap = new EmojiMap(emojis);\n\n        if (isReaction && emojiMap.has(isReaction[2])) {\n            dispatch(submitReaction(latestPostId, isReaction[1], isReaction[2]));\n        } else if (message.indexOf('/') === 0 && !options.ignoreSlash) {\n            try {\n                await dispatch(submitCommand(channelId, rootId, draft));\n            } catch (err) {\n                dispatch(updateCommentDraft(rootId, draft));\n                throw err;\n            }\n        } else {\n            dispatch(submitPost(channelId, rootId, draft));\n        }\n        return {data: true};\n    };\n}\n\nfunction makeGetCurrentUsersLatestReply() {\n    const getPostIdsInThread = makeGetPostIdsForThread();\n    return createSelector(\n        'makeGetCurrentUsersLatestReply',\n        getCurrentUserId,\n        getPostIdsInThread,\n        (state) => (id: string) => getPost(state, id),\n        (_state, rootId) => rootId,\n        (userId, postIds, getPostById, rootId) => {\n            let lastPost = null;\n\n            if (!postIds) {\n                return lastPost;\n            }\n\n            for (const id of postIds) {\n                const post = getPostById(id) || {};\n\n                // don't edit webhook posts, deleted posts, or system messages\n                if (\n                    post.user_id !== userId ||\n                    (post.props && post.props.from_webhook) ||\n                    post.state === Constants.POST_DELETED ||\n                    (post.type && post.type.startsWith(Constants.SYSTEM_MESSAGE_PREFIX)) ||\n                    isPostPendingOrFailed(post)\n                ) {\n                    continue;\n                }\n\n                if (rootId) {\n                    if (post.root_id === rootId || post.id === rootId) {\n                        lastPost = post;\n                        break;\n                    }\n                } else {\n                    lastPost = post;\n                    break;\n                }\n            }\n\n            return lastPost;\n        },\n    );\n}\n\nexport function makeOnEditLatestPost(rootId: string) {\n    const getCurrentUsersLatestPost = makeGetCurrentUsersLatestReply();\n\n    return () => (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState();\n\n        const lastPost = getCurrentUsersLatestPost(state, rootId);\n\n        if (!lastPost) {\n            return {data: false};\n        }\n\n        return dispatch(PostActions.setEditingPost(\n            lastPost.id,\n            'reply_textbox',\n            Utils.localizeMessage('create_comment.commentTitle', 'Comment'),\n            true,\n        ));\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\n\nimport AutosizeTextarea from 'components/autosize_textarea';\nimport QuickInput from 'components/quick_input';\n\nimport Constants from 'utils/constants';\n\nimport SuggestionList from './suggestion_list';\n\ntype Props = React.ComponentProps<typeof SuggestionList> & {\n    inputRef: React.RefObject<QuickInput>;\n}\n\nexport default function RhsSuggestionList(props: Props): JSX.Element {\n    const [position, setPosition] = useState<Props['position']>('top');\n\n    useEffect(() => {\n        const input = props.inputRef.current;\n\n        if (props.open) {\n            const inputTop = (input?.getInput() as AutosizeTextarea).getDOMNode()?.getBoundingClientRect().top || 0;\n            const newPosition = (inputTop < Constants.SUGGESTION_LIST_SPACE_RHS) ? 'bottom' : 'top';\n\n            if (newPosition !== position) {\n                // This potentially causes a second render when the list position changes, but that's better\n                // than checking the bounding rectangle while rendering.\n                setPosition(newPosition);\n            }\n        }\n    }, [props.inputRef, props.open]);\n\n    return (\n        <SuggestionList\n            {...props}\n            position={position}\n        />\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/* eslint-disable max-lines */\n\nimport React from 'react';\nimport classNames from 'classnames';\nimport {FormattedMessage, injectIntl, IntlShape} from 'react-intl';\n\nimport {sortFileInfos} from 'mattermost-redux/utils/file_utils';\n\nimport * as GlobalActions from 'actions/global_actions';\n\nimport Constants, {Locations} from 'utils/constants';\nimport * as UserAgent from 'utils/user_agent';\nimport * as Utils from 'utils/utils.jsx';\nimport {\n    containsAtChannel,\n    postMessageOnKeyPress,\n    shouldFocusMainTextbox,\n    isErrorInvalidSlashCommand,\n    splitMessageBasedOnCaretPosition,\n    groupsMentionedInText,\n} from 'utils/post_utils';\nimport {getTable, formatMarkdownTableMessage, isGitHubCodeBlock, formatGithubCodePaste} from 'utils/paste';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport EmojiPickerOverlay from 'components/emoji_picker/emoji_picker_overlay.jsx';\nimport FilePreview from 'components/file_preview';\nimport FileUpload from 'components/file_upload';\nimport {FileUpload as FileUploadClass} from 'components/file_upload/file_upload';\nimport MsgTyping from 'components/msg_typing';\nimport PostDeletedModal from 'components/post_deleted_modal';\nimport EmojiIcon from 'components/widgets/icons/emoji_icon';\nimport Textbox from 'components/textbox';\nimport TextboxClass from 'components/textbox/textbox';\nimport TextboxLinks from 'components/textbox/textbox_links';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message.jsx';\nimport MessageSubmitError from 'components/message_submit_error';\nimport {PostDraft} from 'types/store/rhs';\nimport {Group} from 'mattermost-redux/types/groups';\nimport {ChannelMemberCountsByGroup} from 'mattermost-redux/types/channels';\nimport {FilePreviewInfo} from 'components/file_preview/file_preview';\nimport {Emoji} from 'mattermost-redux/types/emojis';\nimport {ActionResult} from 'mattermost-redux/types/actions';\nimport {ServerError} from 'mattermost-redux/types/errors';\nimport {FileInfo} from 'mattermost-redux/types/files';\n\nimport RhsSuggestionList from 'components/suggestion/rhs_suggestion_list';\n\nconst KeyCodes = Constants.KeyCodes;\n\nconst CreateCommentDraftTimeoutMilliseconds = 500;\n\ntype Props = {\n\n    /**\n         * The channel for which this comment is a part of\n         */\n    channelId: string;\n\n    /**\n      * The number of channel members\n      */\n    channelMembersCount: number;\n\n    /**\n      * The id of the parent post\n      */\n    rootId: string;\n\n    /**\n      * True if the root message was deleted\n      */\n    rootDeleted: boolean;\n\n    /**\n      * The current history message selected\n      */\n    messageInHistory?: string;\n\n    /**\n      * The current draft of the comment\n      */\n    draft: PostDraft;\n\n    /**\n      * Whether the submit button is enabled\n      */\n    enableAddButton?: boolean;\n\n    /**\n      * Force message submission on CTRL/CMD + ENTER\n      */\n    codeBlockOnCtrlEnter?: boolean;\n\n    /**\n      * Set to force form submission on CTRL/CMD + ENTER instead of ENTER\n      */\n    ctrlSend?: boolean;\n\n    /**\n      * The id of the latest post in this channel\n      */\n    latestPostId?: string;\n    locale: string;\n\n    /**\n      * Create post error id\n      */\n    createPostErrorId?: string;\n\n    /**\n      * Called to clear file uploads in progress\n      */\n    clearCommentDraftUploads: () => void;\n\n    intl: IntlShape;\n\n    /**\n      * Called when comment draft needs to be updated\n      */\n    onUpdateCommentDraft: (draft?: PostDraft) => void;\n\n    /**\n      * Called when comment draft needs to be updated for an specific root ID\n      */\n    updateCommentDraftWithRootId: (rootID: string, draft: PostDraft) => void;\n\n    /**\n      * Called when submitting the comment\n      */\n    onSubmit: (draft: PostDraft, options: {ignoreSlash: boolean}) => void;\n\n    /**\n      * Called when resetting comment message history index\n      */\n    onResetHistoryIndex: () => void;\n\n    /**\n      * Called when navigating back through comment message history\n      */\n    onMoveHistoryIndexBack: () => void;\n\n    /**\n      * Called when navigating forward through comment message history\n      */\n    onMoveHistoryIndexForward: () => void;\n\n    /**\n      * Called to initiate editing the user's latest post\n      */\n    onEditLatestPost: () => ActionResult;\n\n    /**\n      * Function to get the users timezones in the channel\n      */\n    getChannelTimezones: (channelId: string) => Promise<ActionResult>;\n\n    /**\n      * Reset state of createPost request\n      */\n    resetCreatePostRequest: () => void;\n\n    /**\n      * Set if @channel should warn in this channel.\n      */\n    enableConfirmNotificationsToChannel: boolean;\n\n    /**\n      * Set if the emoji picker is enabled.\n      */\n    enableEmojiPicker: boolean;\n\n    /**\n      * Set if the gif picker is enabled.\n      */\n    enableGifPicker: boolean;\n\n    /**\n      * Set if the connection may be bad to warn user\n      */\n    badConnection: boolean;\n\n    /**\n      * The maximum length of a post\n      */\n    maxPostSize: number;\n    rhsExpanded: boolean;\n\n    /**\n      * To check if the timezones are enable on the server.\n      */\n    isTimezoneEnabled: boolean;\n\n    /**\n      * The last time, if any, when the selected post changed. Will be 0 if no post selected.\n      */\n    selectedPostFocussedAt: number;\n\n    /**\n      * Function to set or unset emoji picker for last message\n      */\n    emitShortcutReactToLastPostFrom: (location: string) => void;\n\n    canPost: boolean;\n\n    /**\n      * To determine if the current user can send special channel mentions\n      */\n    useChannelMentions: boolean;\n\n    /**\n      * To determine if the current user can send group mentions\n      */\n    useGroupMentions: boolean;\n\n    /**\n      * Set show preview for textbox\n      */\n    setShowPreview: (showPreview: boolean) => void;\n\n    /**\n      * Should preview be showed\n      */\n    shouldShowPreview: boolean;\n\n    /***\n      * Called when parent component should be scrolled to bottom\n      */\n    scrollToBottom?: () => void;\n\n    /*\n         Group member mention\n     */\n    getChannelMemberCountsByGroup: (channelID: string) => void;\n    groupsWithAllowReference: Map<string, Group> | null;\n    channelMemberCountsByGroup: ChannelMemberCountsByGroup;\n    onHeightChange?: (height: number, maxHeight: number) => void;\n    focusOnMount?: boolean;\n}\n\ntype State = {\n    showPostDeletedModal: boolean;\n    showConfirmModal: boolean;\n    showEmojiPicker: boolean;\n    channelTimezoneCount: number;\n    uploadsProgressPercent: {[clientID: string]: FilePreviewInfo};\n    renderScrollbar: boolean;\n    scrollbarWidth: number;\n    mentions: string[];\n    memberNotifyCount: number;\n    draft?: PostDraft;\n    rootId?: string;\n    messageInHistory?: string;\n    createPostErrorId?: string;\n    caretPosition?: number;\n    postError?: React.ReactNode;\n    errorClass: string | null;\n    serverError: (ServerError & {submittedMessage?: string}) | null;\n}\n\nclass CreateComment extends React.PureComponent<Props, State> {\n    private lastBlurAt = 0;\n    private draftsForPost: {[postID: string]: PostDraft | null} = {};\n    private doInitialScrollToBottom = false;\n\n    private saveDraftFrame?: number | null;\n\n    private textboxRef: React.RefObject<TextboxClass>;\n    private fileUploadRef: React.RefObject<FileUploadClass>;\n    private createCommentControlsRef: React.RefObject<HTMLSpanElement>;\n\n    static defaultProps = {\n        focusOnMount: true,\n    }\n\n    static getDerivedStateFromProps(props: Props, state: State) {\n        let updatedState: Partial<State> = {\n            createPostErrorId: props.createPostErrorId,\n            rootId: props.rootId,\n            messageInHistory: props.messageInHistory,\n            draft: state.draft || {...props.draft, caretPosition: props.draft.message.length, uploadsInProgress: []},\n        };\n\n        const rootChanged = props.rootId !== state.rootId;\n        const messageInHistoryChanged = props.messageInHistory !== state.messageInHistory;\n        if (rootChanged || messageInHistoryChanged) {\n            updatedState = {...updatedState, draft: {...props.draft, uploadsInProgress: rootChanged ? [] : props.draft.uploadsInProgress}};\n        }\n\n        if (props.createPostErrorId === 'api.post.create_post.root_id.app_error' && props.createPostErrorId !== state.createPostErrorId) {\n            updatedState = {...updatedState, showPostDeletedModal: true};\n        }\n\n        return updatedState;\n    }\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            showPostDeletedModal: false,\n            showConfirmModal: false,\n            showEmojiPicker: false,\n            channelTimezoneCount: 0,\n            uploadsProgressPercent: {},\n            renderScrollbar: false,\n            scrollbarWidth: 0,\n            mentions: [],\n            memberNotifyCount: 0,\n            errorClass: null,\n            serverError: null,\n        };\n\n        this.textboxRef = React.createRef();\n        this.fileUploadRef = React.createRef();\n        this.createCommentControlsRef = React.createRef();\n    }\n\n    componentDidMount() {\n        const {useGroupMentions, getChannelMemberCountsByGroup, channelId, clearCommentDraftUploads, onResetHistoryIndex, setShowPreview, draft} = this.props;\n        clearCommentDraftUploads();\n        onResetHistoryIndex();\n        setShowPreview(false);\n\n        if (this.props.focusOnMount) {\n            this.focusTextbox();\n        }\n\n        document.addEventListener('paste', this.pasteHandler);\n        document.addEventListener('keydown', this.focusTextboxIfNecessary);\n        window.addEventListener('beforeunload', this.saveDraft);\n        if (useGroupMentions) {\n            getChannelMemberCountsByGroup(channelId);\n        }\n\n        // When draft.message is not empty, set doInitialScrollToBottom to true so that\n        // on next component update, the actual this.scrollToBottom() will be called.\n        // This is made so that the this.scrollToBottom() will be called only once.\n        if (draft.message !== '') {\n            this.doInitialScrollToBottom = true;\n        }\n    }\n\n    componentWillUnmount() {\n        this.props.resetCreatePostRequest();\n        document.removeEventListener('paste', this.pasteHandler);\n        document.removeEventListener('keydown', this.focusTextboxIfNecessary);\n        window.removeEventListener('beforeunload', this.saveDraft);\n        this.saveDraft();\n    }\n\n    componentDidUpdate(prevProps: Props, prevState: State) {\n        if (prevState.draft!.uploadsInProgress.length < this.state.draft!.uploadsInProgress.length && this.props.scrollToBottom) {\n            this.props.scrollToBottom();\n        }\n\n        // Focus on textbox when emoji picker is closed\n        if (prevState.showEmojiPicker && !this.state.showEmojiPicker) {\n            this.focusTextbox();\n        }\n\n        // Focus on textbox when returned from preview mode\n        if (prevProps.shouldShowPreview && !this.props.shouldShowPreview) {\n            this.focusTextbox();\n        }\n\n        if (prevProps.rootId !== this.props.rootId || prevProps.selectedPostFocussedAt !== this.props.selectedPostFocussedAt) {\n            if (this.props.useGroupMentions) {\n                this.props.getChannelMemberCountsByGroup(this.props.channelId);\n            }\n            this.focusTextbox();\n        }\n\n        if (this.doInitialScrollToBottom) {\n            if (this.props.scrollToBottom) {\n                this.props.scrollToBottom();\n            }\n            this.doInitialScrollToBottom = false;\n        }\n    }\n\n    saveDraft = () => {\n        if (this.saveDraftFrame) {\n            clearTimeout(this.saveDraftFrame);\n            this.props.onUpdateCommentDraft(this.state.draft);\n            this.saveDraftFrame = null;\n        }\n    }\n\n    setShowPreview = (newPreviewValue: boolean) => {\n        this.props.setShowPreview(newPreviewValue);\n    }\n\n    focusTextboxIfNecessary = (e: KeyboardEvent) => {\n        // Should only focus if RHS is expanded\n        if (!this.props.rhsExpanded) {\n            return;\n        }\n\n        // Bit of a hack to not steal focus from the channel switch modal if it's open\n        // This is a special case as the channel switch modal does not enforce focus like\n        // most modals do\n        if (document.getElementsByClassName('channel-switch-modal').length) {\n            return;\n        }\n\n        if (shouldFocusMainTextbox(e, document.activeElement)) {\n            this.focusTextbox();\n        }\n    }\n\n    setCaretPosition = (newCaretPosition: number) => {\n        const textbox = this.textboxRef.current && this.textboxRef.current.getInputBox();\n\n        this.setState({\n            caretPosition: newCaretPosition,\n        }, () => {\n            Utils.setCaretPosition(textbox, newCaretPosition);\n        });\n    }\n\n    pasteHandler = (e: ClipboardEvent) => {\n        if (!e.clipboardData || !e.clipboardData.items || (e.target as any).id !== 'reply_textbox') {\n            return;\n        }\n\n        const {clipboardData} = e;\n        let table = getTable(clipboardData);\n        if (!table) {\n            return;\n        }\n        table = table as HTMLTableElement;\n\n        e.preventDefault();\n\n        const draft = this.state.draft!;\n        let message = draft.message;\n\n        const caretPosition = this.state.caretPosition || 0;\n        if (isGitHubCodeBlock(table.className)) {\n            const {formattedMessage, formattedCodeBlock} = formatGithubCodePaste(caretPosition, message, clipboardData);\n            const newCaretPosition = caretPosition + formattedCodeBlock.length;\n            message = formattedMessage;\n            this.setCaretPosition(newCaretPosition);\n        } else {\n            const originalSize = draft.message.length;\n            message = formatMarkdownTableMessage(table, draft.message.trim(), this.state.caretPosition);\n            const newCaretPosition = message.length - (originalSize - caretPosition);\n            this.setCaretPosition(newCaretPosition);\n        }\n\n        const updatedDraft = {...draft, message};\n\n        this.props.onUpdateCommentDraft(updatedDraft);\n        this.setState({draft: updatedDraft});\n    }\n\n    handleNotifyAllConfirmation = () => {\n        this.hideNotifyAllModal();\n        this.doSubmit();\n    }\n\n    hideNotifyAllModal = () => {\n        this.setState({showConfirmModal: false});\n    }\n\n    showNotifyAllModal = () => {\n        this.setState({showConfirmModal: true});\n    }\n\n    toggleEmojiPicker = () => {\n        this.setState({showEmojiPicker: !this.state.showEmojiPicker});\n    }\n\n    hideEmojiPicker = () => {\n        this.setState({showEmojiPicker: false});\n    }\n\n    handleEmojiClick = (emoji: Emoji) => {\n        const emojiAlias = ('short_name' in emoji && emoji.short_name) || emoji.name;\n\n        if (!emojiAlias) {\n            //Oops.. There went something wrong\n            return;\n        }\n\n        const draft = this.state.draft!;\n\n        let newMessage = '';\n        if (draft.message === '') {\n            newMessage = `:${emojiAlias}: `;\n        } else {\n            const {message} = draft;\n            const {firstPiece, lastPiece} = splitMessageBasedOnCaretPosition(this.state.caretPosition || 0, message);\n\n            // check whether the first piece of the message is empty when cursor is placed at beginning of message and avoid adding an empty string at the beginning of the message\n            newMessage = firstPiece === '' ? `:${emojiAlias}: ${lastPiece} ` : `${firstPiece} :${emojiAlias}: ${lastPiece} `;\n\n            const newCaretPosition = firstPiece === '' ? `:${emojiAlias}: `.length : `${firstPiece} :${emojiAlias}: `.length;\n            this.setCaretPosition(newCaretPosition);\n        }\n\n        const modifiedDraft = {\n            ...draft,\n            message: newMessage,\n        };\n\n        this.props.onUpdateCommentDraft(modifiedDraft);\n        this.draftsForPost[this.props.rootId] = modifiedDraft;\n\n        this.setState({\n            showEmojiPicker: false,\n            draft: modifiedDraft,\n        });\n    }\n\n    handleGifClick = (gif: string) => {\n        const draft = this.state.draft!;\n\n        let newMessage = '';\n        if (draft.message === '') {\n            newMessage = gif;\n        } else if ((/\\s+$/).test(draft.message)) {\n            // Check whether there is already a blank at the end of the current message\n            newMessage = `${draft.message}${gif} `;\n        } else {\n            newMessage = `${draft.message} ${gif} `;\n        }\n\n        const modifiedDraft = {\n            ...draft,\n            message: newMessage,\n        };\n\n        this.props.onUpdateCommentDraft(modifiedDraft);\n        this.draftsForPost[this.props.rootId] = modifiedDraft;\n\n        this.setState({\n            showEmojiPicker: false,\n            draft: modifiedDraft,\n        });\n\n        this.focusTextbox();\n    }\n\n    handlePostError = (postError: React.ReactNode) => {\n        this.setState({postError});\n    }\n\n    handleSubmit = async (e: React.FormEvent | React.MouseEvent) => {\n        e.preventDefault();\n        this.setShowPreview(false);\n\n        const {\n            channelMembersCount,\n            enableConfirmNotificationsToChannel,\n            useChannelMentions,\n            isTimezoneEnabled,\n            groupsWithAllowReference,\n            channelMemberCountsByGroup,\n            useGroupMentions,\n        } = this.props;\n        const draft = this.state.draft!;\n        const notificationsToChannel = enableConfirmNotificationsToChannel && useChannelMentions;\n        let memberNotifyCount = 0;\n        let channelTimezoneCount = 0;\n        let mentions: string[] = [];\n        const notContainsAtChannel = !containsAtChannel(draft.message);\n        if (enableConfirmNotificationsToChannel && notContainsAtChannel && useGroupMentions) {\n            // Groups mentioned in users text\n            const mentionGroups = groupsMentionedInText(draft.message, groupsWithAllowReference);\n            if (mentionGroups.length > 0) {\n                mentions = mentionGroups.\n                    map((group) => {\n                        const mappedValue = channelMemberCountsByGroup[group.id];\n                        if (mappedValue && mappedValue.channel_member_count > Constants.NOTIFY_ALL_MEMBERS && mappedValue.channel_member_count > memberNotifyCount) {\n                            memberNotifyCount = mappedValue.channel_member_count;\n                            channelTimezoneCount = mappedValue.channel_member_timezones_count;\n                        }\n                        return `@${group.name}`;\n                    });\n                mentions = [...new Set(mentions)];\n            }\n        }\n\n        if (!useGroupMentions && mentions.length > 0) {\n            const updatedDraft = {\n                ...draft,\n                props: {\n                    ...draft.props,\n                    disable_group_highlight: true,\n                },\n            };\n\n            this.props.onUpdateCommentDraft(updatedDraft);\n            this.setState({draft: updatedDraft});\n        }\n\n        if (notificationsToChannel &&\n            channelMembersCount > Constants.NOTIFY_ALL_MEMBERS &&\n            !notContainsAtChannel) {\n            memberNotifyCount = channelMembersCount - 1;\n            mentions = ['@all', '@channel'];\n            if (isTimezoneEnabled) {\n                const {data} = await this.props.getChannelTimezones(this.props.channelId);\n                channelTimezoneCount = data ? data.length : 0;\n            }\n        }\n\n        if (!useChannelMentions && containsAtChannel(draft.message, {checkAllMentions: true})) {\n            const updatedDraft = {\n                ...draft,\n                props: {\n                    ...draft.props,\n                    mentionHighlightDisabled: true,\n                },\n            };\n\n            this.props.onUpdateCommentDraft(updatedDraft);\n            this.setState({draft: updatedDraft});\n        }\n\n        if (memberNotifyCount > 0) {\n            this.setState({\n                channelTimezoneCount,\n                memberNotifyCount,\n                mentions,\n\n            });\n            this.showNotifyAllModal();\n            return;\n        }\n\n        await this.doSubmit(e);\n    }\n\n    doSubmit = async (e?: React.FormEvent) => {\n        if (e) {\n            e.preventDefault();\n        }\n\n        const draft = this.state.draft!;\n        const enableAddButton = this.shouldEnableAddButton();\n\n        if (!enableAddButton) {\n            return;\n        }\n\n        if (draft.uploadsInProgress.length > 0) {\n            return;\n        }\n\n        if (this.state.postError) {\n            this.setState({errorClass: 'animation--highlight'});\n            setTimeout(() => {\n                this.setState({errorClass: null});\n            }, Constants.ANIMATION_TIMEOUT);\n            return;\n        }\n\n        if (this.props.rootDeleted) {\n            this.showPostDeletedModal();\n            return;\n        }\n\n        const fasterThanHumanWillClick = 150;\n        const forceFocus = (Date.now() - this.lastBlurAt < fasterThanHumanWillClick);\n        this.focusTextbox(forceFocus);\n\n        const serverError = this.state.serverError;\n        let ignoreSlash = false;\n        if (isErrorInvalidSlashCommand(serverError) && draft.message === serverError?.submittedMessage) {\n            ignoreSlash = true;\n        }\n\n        const options = {ignoreSlash};\n\n        try {\n            await this.props.onSubmit(draft, options);\n\n            this.setState({\n                postError: null,\n                serverError: null,\n            });\n        } catch (err) {\n            if (isErrorInvalidSlashCommand(err)) {\n                this.props.onUpdateCommentDraft(draft);\n            }\n            err.submittedMessage = draft.message;\n            this.setState({serverError: err});\n            return;\n        }\n\n        if (this.saveDraftFrame) {\n            clearTimeout(this.saveDraftFrame);\n        }\n        this.setState({draft: {...this.props.draft, uploadsInProgress: []}});\n        this.draftsForPost[this.props.rootId] = null;\n    }\n\n    commentMsgKeyPress = (e: React.KeyboardEvent) => {\n        const {\n            ctrlSend,\n            codeBlockOnCtrlEnter,\n        } = this.props;\n\n        const {\n            allowSending,\n            withClosedCodeBlock,\n            message,\n        } = postMessageOnKeyPress(\n            e,\n            this.state.draft!.message,\n            Boolean(ctrlSend),\n            Boolean(codeBlockOnCtrlEnter),\n            0,\n            0,\n            this.state.caretPosition,\n        ) as {\n            allowSending: boolean;\n            withClosedCodeBlock?: boolean;\n            message?: string;\n        };\n\n        if (allowSending) {\n            if (e.persist) {\n                e.persist();\n            }\n            if (this.textboxRef.current) {\n                this.textboxRef.current.blur();\n            }\n\n            if (withClosedCodeBlock && message) {\n                const draft = this.state.draft!;\n                const updatedDraft = {...draft, message};\n                this.props.onUpdateCommentDraft(updatedDraft);\n                this.setState({draft: updatedDraft}, () => this.handleSubmit(e));\n                this.draftsForPost[this.props.rootId] = updatedDraft;\n            } else {\n                this.handleSubmit(e);\n            }\n\n            this.setShowPreview(false);\n            setTimeout(() => {\n                this.focusTextbox();\n            });\n        }\n\n        this.emitTypingEvent();\n    }\n\n    reactToLastMessage = (e: React.KeyboardEvent) => {\n        e.preventDefault();\n\n        const {emitShortcutReactToLastPostFrom} = this.props;\n\n        // Here we are not handling conditions such as check for modals,  popups etc as shortcut is only trigger on\n        // textbox input focus. Since all of them will already be closed as soon as they loose focus.\n        emitShortcutReactToLastPostFrom(Locations.RHS_ROOT);\n    }\n\n    emitTypingEvent = () => {\n        const {channelId, rootId} = this.props;\n        GlobalActions.emitLocalUserTypingEvent(channelId, rootId);\n    }\n\n    handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n        const message = e.target.value;\n\n        let serverError = this.state.serverError;\n        if (isErrorInvalidSlashCommand(serverError)) {\n            serverError = null;\n        }\n\n        const draft = this.state.draft!;\n        const updatedDraft = {...draft, message};\n\n        if (this.saveDraftFrame) {\n            clearTimeout(this.saveDraftFrame);\n        }\n        this.saveDraftFrame = window.setTimeout(() => {\n            this.props.onUpdateCommentDraft(updatedDraft);\n        }, CreateCommentDraftTimeoutMilliseconds);\n\n        this.setState({draft: updatedDraft, serverError}, () => {\n            if (this.props.scrollToBottom) {\n                this.props.scrollToBottom();\n            }\n        });\n        this.draftsForPost[this.props.rootId] = updatedDraft;\n    }\n\n    handleMouseUpKeyUp = (e: React.MouseEvent | React.KeyboardEvent) => {\n        const caretPosition = Utils.getCaretPosition(e.target);\n        this.setState({\n            caretPosition,\n        });\n    }\n\n    handleSelect = (e: React.SyntheticEvent) => {\n        Utils.adjustSelection(this.textboxRef.current?.getInputBox(), e);\n    }\n\n    handleKeyDown = (e: React.KeyboardEvent) => {\n        const ctrlOrMetaKeyPressed = e.ctrlKey || e.metaKey;\n        const lastMessageReactionKeyCombo = ctrlOrMetaKeyPressed && e.shiftKey && Utils.isKeyPressed(e, KeyCodes.BACK_SLASH);\n\n        // listen for line break key combo and insert new line character\n        if (Utils.isUnhandledLineBreakKeyCombo(e)) {\n            this.setState({\n                draft: {\n                    ...this.state.draft!,\n                    message: Utils.insertLineBreakFromKeyEvent(e),\n                },\n            });\n            return;\n        }\n\n        if (\n            (this.props.ctrlSend || this.props.codeBlockOnCtrlEnter) &&\n            Utils.isKeyPressed(e, Constants.KeyCodes.ENTER) &&\n            (e.ctrlKey || e.metaKey)\n        ) {\n            this.setShowPreview(false);\n            this.commentMsgKeyPress(e);\n            return;\n        }\n\n        const draft = this.state.draft!;\n        const {message} = draft;\n\n        if (!e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey && Utils.isKeyPressed(e, Constants.KeyCodes.UP) && message === '') {\n            e.preventDefault();\n            if (this.textboxRef.current) {\n                this.textboxRef.current.blur();\n            }\n\n            const {data: canEditNow} = this.props.onEditLatestPost();\n            if (!canEditNow) {\n                this.focusTextbox(true);\n            }\n        }\n\n        const ctrlKeyCombo = Utils.cmdOrCtrlPressed(e) && !e.altKey && !e.shiftKey;\n        const ctrlAltCombo = Utils.cmdOrCtrlPressed(e, true) && e.altKey;\n\n        if (ctrlKeyCombo) {\n            if (Utils.isKeyPressed(e, Constants.KeyCodes.UP)) {\n                e.preventDefault();\n                this.props.onMoveHistoryIndexBack();\n            } else if (Utils.isKeyPressed(e, Constants.KeyCodes.DOWN)) {\n                e.preventDefault();\n                this.props.onMoveHistoryIndexForward();\n            } else if (Utils.isKeyPressed(e, Constants.KeyCodes.B) ||\n                       Utils.isKeyPressed(e, Constants.KeyCodes.I)) {\n                this.applyHotkeyMarkdown(e);\n            }\n        }\n\n        if (ctrlAltCombo && Utils.isKeyPressed(e, Constants.KeyCodes.K)) {\n            this.applyHotkeyMarkdown(e);\n        }\n\n        if (lastMessageReactionKeyCombo) {\n            this.reactToLastMessage(e);\n        }\n    }\n\n    applyHotkeyMarkdown = (e: React.KeyboardEvent) => {\n        const res = Utils.applyHotkeyMarkdown(e);\n\n        const draft = this.state.draft!;\n        const modifiedDraft = {\n            ...draft,\n            message: res.message,\n        };\n\n        this.props.onUpdateCommentDraft(modifiedDraft);\n        this.draftsForPost[this.props.rootId] = modifiedDraft;\n\n        this.setState({\n            draft: modifiedDraft,\n        }, () => {\n            const textbox = this.textboxRef.current?.getInputBox();\n            Utils.setSelectionRange(textbox, res.selectionStart, res.selectionEnd);\n        });\n    }\n\n    handleFileUploadChange = () => {\n        this.focusTextbox();\n    }\n\n    handleUploadStart = (clientIds: string[]) => {\n        const draft = this.state.draft!;\n        const uploadsInProgress = [...draft.uploadsInProgress, ...clientIds];\n\n        const modifiedDraft = {\n            ...draft,\n            uploadsInProgress,\n        };\n        this.props.onUpdateCommentDraft(modifiedDraft);\n        this.setState({draft: modifiedDraft});\n        this.draftsForPost[this.props.rootId] = modifiedDraft;\n\n        // this is a bit redundant with the code that sets focus when the file input is clicked,\n        // but this also resets the focus after a drag and drop\n        this.focusTextbox();\n    }\n\n    handleUploadProgress = (filePreviewInfo: FilePreviewInfo) => {\n        const uploadsProgressPercent = {...this.state.uploadsProgressPercent, [filePreviewInfo.clientId]: filePreviewInfo};\n        this.setState({uploadsProgressPercent});\n    }\n\n    handleFileUploadComplete = (fileInfos: FileInfo[], clientIds: string, channelId: string, rootId: string) => {\n        const draft = this.draftsForPost[rootId]!;\n        const uploadsInProgress = [...draft.uploadsInProgress];\n        const newFileInfos = sortFileInfos([...draft.fileInfos, ...fileInfos], this.props.locale);\n\n        // remove each finished file from uploads\n        for (let i = 0; i < clientIds.length; i++) {\n            const index = uploadsInProgress.indexOf(clientIds[i]);\n\n            if (index !== -1) {\n                uploadsInProgress.splice(index, 1);\n            }\n        }\n\n        const modifiedDraft = {\n            ...draft,\n            fileInfos: newFileInfos,\n            uploadsInProgress,\n        };\n        this.props.updateCommentDraftWithRootId(rootId, modifiedDraft);\n        this.draftsForPost[rootId] = modifiedDraft;\n        if (this.props.rootId === rootId) {\n            this.setState({draft: modifiedDraft});\n        }\n    }\n\n    handleUploadError = (err: string | ServerError | null, clientId: string | number = -1, currentChannelId?: string, rootId = '') => {\n        if (clientId !== -1) {\n            const draft = {...this.draftsForPost[rootId]!};\n            const uploadsInProgress = [...draft.uploadsInProgress];\n\n            const index = uploadsInProgress.indexOf(clientId as string);\n            if (index !== -1) {\n                uploadsInProgress.splice(index, 1);\n            }\n\n            const modifiedDraft = {\n                ...draft,\n                uploadsInProgress,\n            };\n            this.props.updateCommentDraftWithRootId(rootId, modifiedDraft);\n            this.draftsForPost[rootId] = modifiedDraft;\n            if (this.props.rootId === rootId) {\n                this.setState({draft: modifiedDraft});\n            }\n        }\n\n        let serverError = err;\n        if (typeof serverError === 'string') {\n            serverError = new Error(serverError);\n        }\n\n        this.setState({serverError}, () => {\n            if (serverError && this.props.scrollToBottom) {\n                this.props.scrollToBottom();\n            }\n        });\n    }\n\n    removePreview = (id: string) => {\n        const draft = this.state.draft!;\n        const fileInfos = [...draft.fileInfos];\n        const uploadsInProgress = [...draft.uploadsInProgress];\n\n        // Clear previous errors\n        this.handleUploadError(null);\n\n        // id can either be the id of an uploaded file or the client id of an in progress upload\n        let index = fileInfos.findIndex((info) => info.id === id);\n        if (index === -1) {\n            index = uploadsInProgress.indexOf(id);\n\n            if (index !== -1) {\n                uploadsInProgress.splice(index, 1);\n\n                if (this.fileUploadRef.current) {\n                    this.fileUploadRef.current.cancelUpload(id);\n                }\n            }\n        } else {\n            fileInfos.splice(index, 1);\n        }\n\n        const modifiedDraft = {\n            ...draft,\n            fileInfos,\n            uploadsInProgress,\n        };\n\n        this.props.onUpdateCommentDraft(modifiedDraft);\n        this.setState({draft: modifiedDraft});\n        this.draftsForPost[this.props.rootId] = modifiedDraft;\n\n        this.handleFileUploadChange();\n    }\n\n    getFileCount = () => {\n        const {\n            fileInfos,\n            uploadsInProgress,\n        } = this.state.draft!;\n        return fileInfos.length + uploadsInProgress.length;\n    }\n\n    getFileUploadTarget = () => {\n        return this.textboxRef.current;\n    }\n\n    getCreateCommentControls = () => {\n        return this.createCommentControlsRef.current;\n    }\n\n    focusTextbox = (keepFocus = false) => {\n        if (this.textboxRef.current && (keepFocus || !UserAgent.isMobile())) {\n            this.textboxRef.current.focus();\n        }\n    }\n\n    shouldEnableAddButton = () => {\n        const {draft} = this.state;\n        if (draft) {\n            const message = draft.message ? draft.message.trim() : '';\n            const fileInfos = draft.fileInfos ? draft.fileInfos : [];\n            if (message.trim().length !== 0 || fileInfos.length !== 0) {\n                return true;\n            }\n        }\n\n        return isErrorInvalidSlashCommand(this.state.serverError);\n    }\n\n    showPostDeletedModal = () => {\n        this.setState({\n            showPostDeletedModal: true,\n        });\n    }\n\n    hidePostDeletedModal = () => {\n        this.setState({\n            showPostDeletedModal: false,\n        });\n\n        this.props.resetCreatePostRequest();\n    }\n\n    handleBlur = () => {\n        this.lastBlurAt = Date.now();\n    }\n\n    handleHeightChange = (height: number, maxHeight: number) => {\n        this.setState({renderScrollbar: height > maxHeight});\n        window.requestAnimationFrame(() => {\n            if (this.textboxRef.current) {\n                this.setState({scrollbarWidth: Utils.scrollbarWidth(this.textboxRef.current.getInputBox())});\n            }\n        });\n\n        if (this.props.onHeightChange) {\n            this.props.onHeightChange(height, maxHeight);\n        }\n    }\n\n    render() {\n        const draft = this.state.draft!;\n        const readOnlyChannel = !this.props.canPost;\n        const {formatMessage} = this.props.intl;\n        const enableAddButton = this.shouldEnableAddButton();\n        const {renderScrollbar, channelTimezoneCount, mentions, memberNotifyCount} = this.state;\n        const ariaLabelReplyInput = Utils.localizeMessage('accessibility.sections.rhsFooter', 'reply input region');\n        let notifyAllMessage: React.ReactNode = '';\n        let notifyAllTitle: React.ReactNode = '';\n        if (mentions.includes('@all') || mentions.includes('@channel')) {\n            notifyAllTitle = (\n                <FormattedMessage\n                    id='notify_all.title.confirm'\n                    defaultMessage='Confirm sending notifications to entire channel'\n                />\n            );\n            if (channelTimezoneCount > 0) {\n                notifyAllMessage = (\n                    <FormattedMarkdownMessage\n                        id='notify_all.question_timezone'\n                        defaultMessage='By using **@all** or **@channel** you are about to send notifications to **{totalMembers} people** in **{timezones, number} {timezones, plural, one {timezone} other {timezones}}**. Are you sure you want to do this?'\n                        values={{\n                            totalMembers: memberNotifyCount,\n                            timezones: channelTimezoneCount,\n                        }}\n                    />\n                );\n            } else {\n                notifyAllMessage = (\n                    <FormattedMarkdownMessage\n                        id='notify_all.question'\n                        defaultMessage='By using **@all** or **@channel** you are about to send notifications to **{totalMembers} people**. Are you sure you want to do this?'\n                        values={{\n                            totalMembers: memberNotifyCount,\n                        }}\n                    />\n                );\n            }\n        } else if (mentions.length > 0) {\n            notifyAllTitle = (\n                <FormattedMessage\n                    id='notify_all.title.confirm_groups'\n                    defaultMessage='Confirm sending notifications to groups'\n                />\n            );\n\n            if (mentions.length === 1) {\n                if (channelTimezoneCount > 0) {\n                    notifyAllMessage = (\n                        <FormattedMarkdownMessage\n                            id='notify_all.question_timezone_one_group'\n                            defaultMessage='By using **{mention}** you are about to send notifications of up to **{totalMembers} people** in **{timezones, number} {timezones, plural, one {timezone} other {timezones}}**. Are you sure you want to do this?'\n                            values={{\n                                mention: mentions[0],\n                                totalMembers: memberNotifyCount,\n                                timezones: channelTimezoneCount,\n                            }}\n                        />\n                    );\n                } else {\n                    notifyAllMessage = (\n                        <FormattedMarkdownMessage\n                            id='notify_all.question_one_group'\n                            defaultMessage='By using **{mention}** you are about to send notifications of up to **{totalMembers} people**. Are you sure you want to do this?'\n                            values={{\n                                mention: mentions[0],\n                                totalMembers: memberNotifyCount,\n                            }}\n                        />\n                    );\n                }\n            } else if (channelTimezoneCount > 0) {\n                notifyAllMessage = (\n                    <FormattedMarkdownMessage\n                        id='notify_all.question_timezone_groups'\n                        defaultMessage='By using **{mentions}** and **{finalMention}** you are about to send notifications of up to **{totalMembers} people** in **{timezones, number} {timezones, plural, one {timezone} other {timezones}}**. Are you sure you want to do this?'\n                        values={{\n                            mentions: mentions.slice(0, -1).join(', '),\n                            finalMention: mentions[mentions.length - 1],\n                            totalMembers: memberNotifyCount,\n                            timezones: channelTimezoneCount,\n                        }}\n                    />\n                );\n            } else {\n                notifyAllMessage = (\n                    <FormattedMarkdownMessage\n                        id='notify_all.question_groups'\n                        defaultMessage='By using **{mentions}** and **{finalMention}** you are about to send notifications of up to **{totalMembers} people**. Are you sure you want to do this?'\n                        values={{\n                            mentions: mentions.slice(0, -1).join(', '),\n                            finalMention: mentions[mentions.length - 1],\n                            totalMembers: memberNotifyCount,\n                        }}\n                    />\n                );\n            }\n        }\n\n        const notifyAllConfirm = (\n            <FormattedMessage\n                id='notify_all.confirm'\n                defaultMessage='Confirm'\n            />\n        );\n\n        let serverError = null;\n        if (this.state.serverError) {\n            serverError = (\n                <MessageSubmitError\n                    error={this.state.serverError}\n                    submittedMessage={this.state.serverError.submittedMessage}\n                    handleSubmit={this.handleSubmit}\n                />\n            );\n        }\n\n        let postError = null;\n        if (this.state.postError) {\n            const postErrorClass = 'post-error' + (this.state.errorClass ? (' ' + this.state.errorClass) : '');\n            postError = <label className={postErrorClass}>{this.state.postError}</label>;\n        }\n\n        let preview = null;\n        if (!readOnlyChannel && (draft.fileInfos.length > 0 || draft.uploadsInProgress.length > 0)) {\n            preview = (\n                <FilePreview\n                    fileInfos={draft.fileInfos}\n                    onRemove={this.removePreview}\n                    uploadsInProgress={draft.uploadsInProgress}\n                    uploadsProgressPercent={this.state.uploadsProgressPercent}\n                />\n            );\n        }\n\n        let uploadsInProgressText = null;\n        if (draft.uploadsInProgress.length > 0) {\n            uploadsInProgressText = (\n                <span className='post-right-comments-upload-in-progress'>\n                    {draft.uploadsInProgress.length === 1 ? (\n                        <FormattedMessage\n                            id='create_comment.file'\n                            defaultMessage='File uploading'\n                        />\n                    ) : (\n                        <FormattedMessage\n                            id='create_comment.files'\n                            defaultMessage='Files uploading'\n                        />\n                    )}\n                </span>\n            );\n        }\n\n        let addButtonClass = 'btn btn-primary comment-btn';\n        if (!enableAddButton) {\n            addButtonClass += ' disabled';\n        }\n\n        let fileUpload;\n        if (!readOnlyChannel && !this.props.shouldShowPreview) {\n            fileUpload = (\n                <FileUpload\n                    ref={this.fileUploadRef}\n                    fileCount={this.getFileCount()}\n                    getTarget={this.getFileUploadTarget}\n                    onFileUploadChange={this.handleFileUploadChange}\n                    onUploadStart={this.handleUploadStart}\n                    onFileUpload={this.handleFileUploadComplete}\n                    onUploadError={this.handleUploadError}\n                    onUploadProgress={this.handleUploadProgress}\n                    rootId={this.props.rootId}\n                    channelId={this.props.channelId}\n                    postType='comment'\n                />\n            );\n        }\n\n        let emojiPicker = null;\n        const emojiButtonAriaLabel = formatMessage({id: 'emoji_picker.emojiPicker', defaultMessage: 'Emoji Picker'}).toLowerCase();\n\n        if (this.props.enableEmojiPicker && !readOnlyChannel && !this.props.shouldShowPreview) {\n            emojiPicker = (\n                <div>\n                    <EmojiPickerOverlay\n                        show={this.state.showEmojiPicker}\n                        target={this.getCreateCommentControls}\n                        onHide={this.hideEmojiPicker}\n                        onEmojiClose={this.hideEmojiPicker}\n                        onEmojiClick={this.handleEmojiClick}\n                        onGifClick={this.handleGifClick}\n                        enableGifPicker={this.props.enableGifPicker}\n                        topOffset={55}\n                    />\n                    <button\n                        aria-label={emojiButtonAriaLabel}\n                        type='button'\n                        onClick={this.toggleEmojiPicker}\n                        className={classNames('emoji-picker__container', 'post-action', {\n                            'post-action--active': this.state.showEmojiPicker,\n                        })}\n                    >\n                        <EmojiIcon className={'icon icon--emoji emoji-rhs '}/>\n                    </button>\n                </div>\n            );\n        }\n\n        let createMessage;\n        if (readOnlyChannel) {\n            createMessage = Utils.localizeMessage('create_post.read_only', 'This channel is read-only. Only members with permission can post here.');\n        } else {\n            createMessage = Utils.localizeMessage('create_comment.addComment', 'Add a comment...');\n        }\n\n        let scrollbarClass = '';\n        if (renderScrollbar) {\n            scrollbarClass = ' scroll';\n        }\n\n        return (\n            <form onSubmit={this.handleSubmit}>\n                <div\n                    role='form'\n                    aria-label={ariaLabelReplyInput}\n                    tabIndex={-1}\n                    className={`post-create a11y__region${scrollbarClass}`}\n                    style={this.state.renderScrollbar && this.state.scrollbarWidth ? {'--detected-scrollbar-width': `${this.state.scrollbarWidth}px`} as any : undefined}\n                    data-a11y-sort-order='4'\n                >\n                    <div\n                        id={this.props.rootId}\n                        className='post-create-body comment-create-body'\n                    >\n                        <div className='post-body__cell'>\n                            <Textbox\n                                onChange={this.handleChange}\n                                onKeyPress={this.commentMsgKeyPress}\n                                onKeyDown={this.handleKeyDown}\n                                onSelect={this.handleSelect}\n                                onMouseUp={this.handleMouseUpKeyUp}\n                                onKeyUp={this.handleMouseUpKeyUp}\n                                onComposition={this.emitTypingEvent}\n                                onHeightChange={this.handleHeightChange}\n                                handlePostError={this.handlePostError}\n                                value={readOnlyChannel ? '' : draft.message}\n                                onBlur={this.handleBlur}\n                                createMessage={createMessage}\n                                emojiEnabled={this.props.enableEmojiPicker}\n                                channelId={this.props.channelId}\n                                rootId={this.props.rootId}\n                                isRHS={true}\n                                id='reply_textbox'\n                                ref={this.textboxRef}\n                                disabled={readOnlyChannel}\n                                characterLimit={this.props.maxPostSize}\n                                preview={this.props.shouldShowPreview}\n                                suggestionList={RhsSuggestionList}\n                                badConnection={this.props.badConnection}\n                                listenForMentionKeyClick={true}\n                                useChannelMentions={this.props.useChannelMentions}\n                            />\n                            <span\n                                ref={this.createCommentControlsRef}\n                                className='post-body__actions'\n                            >\n                                {fileUpload}\n                                {emojiPicker}\n                            </span>\n                        </div>\n                    </div>\n                    <div\n                        className='post-create-footer'\n                    >\n                        <div className='d-flex justify-content-between'>\n                            <div className='col'>\n                                <MsgTyping\n                                    channelId={this.props.channelId}\n                                    postId={this.props.rootId}\n                                />\n                                {postError}\n                            </div>\n                            <div className='col col-auto'>\n                                <TextboxLinks\n                                    characterLimit={this.props.maxPostSize}\n                                    showPreview={this.props.shouldShowPreview}\n                                    updatePreview={this.setShowPreview}\n                                />\n                            </div>\n                        </div>\n                        <div className='text-right mt-2'>\n                            {uploadsInProgressText}\n                            <input\n                                type='button'\n                                disabled={!enableAddButton}\n                                id='addCommentButton'\n                                className={addButtonClass}\n                                value={formatMessage({id: 'create_comment.comment', defaultMessage: 'Add Comment'})}\n                                onClick={this.handleSubmit}\n                            />\n                            {preview}\n                            {serverError}\n                        </div>\n                    </div>\n                </div>\n                <PostDeletedModal\n                    show={this.state.showPostDeletedModal}\n                    onHide={this.hidePostDeletedModal}\n                />\n                <ConfirmModal\n                    title={notifyAllTitle}\n                    message={notifyAllMessage}\n                    confirmButtonText={notifyAllConfirm}\n                    show={this.state.showConfirmModal}\n                    onConfirm={this.handleNotifyAllConfirmation}\n                    onCancel={this.hideNotifyAllModal}\n                />\n            </form>\n        );\n    }\n}\n\nexport default injectIntl(CreateComment);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {ActionCreatorsMapObject, bindActionCreators, Dispatch} from 'redux';\n\nimport {GlobalState} from 'types/store/index.js';\n\nimport {PostDraft} from 'types/store/rhs.js';\n\nimport {ActionFunc, ActionResult, DispatchFunc} from 'mattermost-redux/types/actions.js';\n\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {getAllChannelStats, getChannelMemberCountsByGroup as selectChannelMemberCountsByGroup} from 'mattermost-redux/selectors/entities/channels';\nimport {makeGetMessageInHistoryItem} from 'mattermost-redux/selectors/entities/posts';\nimport {resetCreatePostRequest, resetHistoryIndex} from 'mattermost-redux/actions/posts';\nimport {getChannelTimezones, getChannelMemberCountsByGroup} from 'mattermost-redux/actions/channels';\nimport {Permissions, Preferences, Posts} from 'mattermost-redux/constants';\nimport {getAssociatedGroupsForReferenceByMention} from 'mattermost-redux/selectors/entities/groups';\n\nimport {connectionErrorCount} from 'selectors/views/system';\n\nimport {Constants, StoragePrefixes} from 'utils/constants';\nimport {getCurrentLocale} from 'selectors/i18n';\n\nimport {\n    clearCommentDraftUploads,\n    updateCommentDraft,\n    makeOnMoveHistoryIndex,\n    makeOnSubmit,\n    makeOnEditLatestPost,\n} from 'actions/views/create_comment';\nimport {emitShortcutReactToLastPostFrom} from 'actions/post_actions';\nimport {getPostDraft, getIsRhsExpanded, getSelectedPostFocussedAt} from 'selectors/rhs';\nimport {showPreviewOnCreateComment} from 'selectors/views/textbox';\nimport {setShowPreviewOnCreateComment} from 'actions/views/textbox';\n\nimport CreateComment from './create_comment';\n\ntype OwnProps = {\n    rootId: string;\n    channelId: string;\n    latestPostId: string;\n}\n\nfunction makeMapStateToProps() {\n    const getMessageInHistoryItem = makeGetMessageInHistoryItem(Posts.MESSAGE_TYPES.COMMENT as 'comment');\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        const err = state.requests.posts.createPost.error || {};\n\n        const draft = getPostDraft(state, StoragePrefixes.COMMENT_DRAFT, ownProps.rootId);\n\n        const channelMembersCount = getAllChannelStats(state)[ownProps.channelId] ? getAllChannelStats(state)[ownProps.channelId].member_count : 1;\n        const messageInHistory = getMessageInHistoryItem(state);\n\n        const channel = state.entities.channels.channels[ownProps.channelId] || {};\n\n        const config = getConfig(state);\n        const license = getLicense(state);\n        const enableConfirmNotificationsToChannel = config.EnableConfirmNotificationsToChannel === 'true';\n        const enableEmojiPicker = config.EnableEmojiPicker === 'true';\n        const enableGifPicker = config.EnableGifPicker === 'true';\n        const badConnection = connectionErrorCount(state) > 1;\n        const isTimezoneEnabled = config.ExperimentalTimezone === 'true';\n        const canPost = haveIChannelPermission(state, channel.team_id, channel.id, Permissions.CREATE_POST);\n        const useChannelMentions = haveIChannelPermission(state, channel.team_id, channel.id, Permissions.USE_CHANNEL_MENTIONS);\n        const isLDAPEnabled = license?.IsLicensed === 'true' && license?.LDAPGroups === 'true';\n        const useGroupMentions = isLDAPEnabled && haveIChannelPermission(state, channel.team_id, channel.id, Permissions.USE_GROUP_MENTIONS);\n        const channelMemberCountsByGroup = selectChannelMemberCountsByGroup(state, ownProps.channelId);\n        const groupsWithAllowReference = useGroupMentions ? getAssociatedGroupsForReferenceByMention(state, channel.team_id, channel.id) : null;\n\n        return {\n            draft,\n            messageInHistory,\n            channelMembersCount,\n            codeBlockOnCtrlEnter: getBool(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'code_block_ctrl_enter', true),\n            ctrlSend: getBool(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter'),\n            createPostErrorId: err.server_error_id,\n            enableConfirmNotificationsToChannel,\n            enableEmojiPicker,\n            enableGifPicker,\n            locale: getCurrentLocale(state),\n            maxPostSize: parseInt(config.MaxPostSize || '', 10) || Constants.DEFAULT_CHARACTER_LIMIT,\n            rhsExpanded: getIsRhsExpanded(state),\n            badConnection,\n            isTimezoneEnabled,\n            selectedPostFocussedAt: getSelectedPostFocussedAt(state),\n            canPost,\n            useChannelMentions,\n            shouldShowPreview: showPreviewOnCreateComment(state),\n            groupsWithAllowReference,\n            useGroupMentions,\n            channelMemberCountsByGroup,\n        };\n    };\n}\n\nfunction makeOnUpdateCommentDraft(rootId: string) {\n    return (draft?: PostDraft) => updateCommentDraft(rootId, draft);\n}\n\ntype Actions = {\n    clearCommentDraftUploads: () => void;\n    onUpdateCommentDraft: (draft?: PostDraft) => void;\n    updateCommentDraftWithRootId: (rootID: string, draft: PostDraft) => void;\n    onSubmit: (draft: PostDraft, options: {ignoreSlash: boolean}) => void;\n    onResetHistoryIndex: () => void;\n    onMoveHistoryIndexBack: () => void;\n    onMoveHistoryIndexForward: () => void;\n    onEditLatestPost: () => ActionResult;\n    resetCreatePostRequest: () => void;\n    getChannelTimezones: (channelId: string) => Promise<ActionResult>;\n    emitShortcutReactToLastPostFrom: (location: string) => void;\n    setShowPreview: (showPreview: boolean) => void;\n    getChannelMemberCountsByGroup: (channelID: string) => void;\n}\n\nfunction makeMapDispatchToProps() {\n    let onUpdateCommentDraft: (draft?: PostDraft) => void;\n    let onSubmit: (draft: PostDraft, options: {ignoreSlash: boolean}) => (dispatch: DispatchFunc, getState: () => GlobalState) => Promise<ActionResult | ActionResult[]> | ActionResult;\n    let onMoveHistoryIndexBack: () => (dispatch: DispatchFunc, getState: () => GlobalState) => Promise<ActionResult | ActionResult[]> | ActionResult;\n    let onMoveHistoryIndexForward: () => (dispatch: DispatchFunc, getState: () => GlobalState) => Promise<ActionResult | ActionResult[]> | ActionResult;\n    let onEditLatestPost: () => ActionFunc;\n\n    function onResetHistoryIndex() {\n        return resetHistoryIndex(Posts.MESSAGE_TYPES.COMMENT);\n    }\n\n    let rootId: string;\n    let channelId: string;\n    let latestPostId: string;\n\n    return (dispatch: Dispatch, ownProps: OwnProps) => {\n        if (rootId !== ownProps.rootId) {\n            onUpdateCommentDraft = makeOnUpdateCommentDraft(ownProps.rootId);\n            onMoveHistoryIndexBack = makeOnMoveHistoryIndex(ownProps.rootId, -1);\n            onMoveHistoryIndexForward = makeOnMoveHistoryIndex(ownProps.rootId, 1);\n        }\n\n        if (rootId !== ownProps.rootId) {\n            onEditLatestPost = makeOnEditLatestPost(ownProps.rootId);\n        }\n\n        if (rootId !== ownProps.rootId || channelId !== ownProps.channelId || latestPostId !== ownProps.latestPostId) {\n            onSubmit = makeOnSubmit(ownProps.channelId, ownProps.rootId, ownProps.latestPostId);\n        }\n\n        rootId = ownProps.rootId;\n        channelId = ownProps.channelId;\n        latestPostId = ownProps.latestPostId;\n\n        return bindActionCreators<ActionCreatorsMapObject<any>, Actions>({\n            clearCommentDraftUploads,\n            onUpdateCommentDraft,\n            updateCommentDraftWithRootId: updateCommentDraft,\n            onSubmit,\n            onResetHistoryIndex,\n            onMoveHistoryIndexBack,\n            onMoveHistoryIndexForward,\n            onEditLatestPost,\n            resetCreatePostRequest,\n            getChannelTimezones,\n            emitShortcutReactToLastPostFrom,\n            setShowPreview: setShowPreviewOnCreateComment,\n            getChannelMemberCountsByGroup,\n        }, dispatch);\n    };\n}\n\nexport default connect(makeMapStateToProps, makeMapDispatchToProps, null, {forwardRef: true})(CreateComment);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, forwardRef} from 'react';\n\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {Post} from 'mattermost-redux/types/posts';\nimport {$ID} from 'mattermost-redux/types/utilities';\n\nimport GenericCreateComment from 'components/create_comment';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport Constants from 'utils/constants';\n\ntype Props = {\n    focusOnMount: boolean;\n    channelId: string;\n    channelIsArchived: boolean;\n    channelType: string;\n    isDeleted: boolean;\n    isFakeDeletedPost: boolean;\n    onHeightChange: (height: number, maxHeight: number) => void;\n    teammate?: UserProfile;\n    threadId: string;\n    latestPostId: $ID<Post>;\n};\n\nconst CreateComment = forwardRef<HTMLDivElement, Props>(({\n    focusOnMount,\n    channelId,\n    channelIsArchived,\n    channelType,\n    isDeleted,\n    isFakeDeletedPost,\n    onHeightChange,\n    teammate,\n    threadId,\n    latestPostId,\n}: Props, ref) => {\n    if (channelType === Constants.DM_CHANNEL && teammate?.delete_at) {\n        return (\n            <div\n                className='post-create-message'\n            >\n                <FormattedMarkdownMessage\n                    id='create_post.deactivated'\n                    defaultMessage='You are viewing an archived channel with a **deactivated user**. New messages cannot be posted.'\n                />\n            </div>\n        );\n    }\n\n    if (isFakeDeletedPost) {\n        return null;\n    }\n\n    if (channelIsArchived) {\n        return (\n            <div className='channel-archived-warning'>\n                <FormattedMarkdownMessage\n                    id='archivedChannelMessage'\n                    defaultMessage='You are viewing an **archived channel**. New messages cannot be posted.'\n                />\n            </div>\n        );\n    }\n\n    return (\n        <div\n            className='post-create__container'\n            ref={ref}\n        >\n            <GenericCreateComment\n                focusOnMount={focusOnMount}\n                channelId={channelId}\n                latestPostId={latestPostId}\n                onHeightChange={onHeightChange}\n                rootDeleted={isDeleted}\n                rootId={threadId}\n            />\n        </div>\n    );\n});\n\nexport default memo(CreateComment);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {Posts} from 'mattermost-redux/constants';\n\nimport PostBodyAdditionalContent from 'components/post_view/post_body_additional_content';\nimport PostMessageView from 'components/post_view/post_message_view';\n\nexport default function MessageWithAdditionalContent({post, previewCollapsed, previewEnabled, isEmbedVisible, pluginPostTypes}) {\n    const hasPlugin = post.type && pluginPostTypes.hasOwnProperty(post.type);\n    let msg;\n    const messageWrapper = (\n        <PostMessageView\n            post={post}\n            isRHS={true}\n            hasMention={true}\n        />\n    );\n    if (post.state === Posts.POST_DELETED || hasPlugin) {\n        msg = messageWrapper;\n    } else {\n        msg = (\n            <PostBodyAdditionalContent\n                post={post}\n                previewCollapsed={previewCollapsed}\n                previewEnabled={previewEnabled}\n                isEmbedVisible={isEmbedVisible}\n            >\n                {messageWrapper}\n            </PostBodyAdditionalContent>\n        );\n    }\n    return msg;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Tooltip} from 'react-bootstrap';\n\nimport {Posts} from 'mattermost-redux/constants';\nimport * as ReduxPostUtils from 'mattermost-redux/utils/post_utils';\n\nimport Constants, {Locations} from 'utils/constants';\nimport * as PostUtils from 'utils/post_utils';\nimport * as Utils from 'utils/utils.jsx';\nimport DotMenu from 'components/dot_menu';\nimport FileAttachmentListContainer from 'components/file_attachment_list';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport PostProfilePicture from 'components/post_profile_picture';\nimport PostAriaLabelDiv from 'components/post_view/post_aria_label_div';\nimport PostFlagIcon from 'components/post_view/post_flag_icon';\nimport ReactionList from 'components/post_view/reaction_list';\nimport PostTime from 'components/post_view/post_time';\nimport PostReaction from 'components/post_view/post_reaction';\nimport MessageWithAdditionalContent from 'components/message_with_additional_content';\nimport BotBadge from 'components/widgets/badges/bot_badge';\nimport InfoSmallIcon from 'components/widgets/icons/info_small_icon';\n\nimport UserProfile from 'components/user_profile';\nimport PostPreHeader from 'components/post_view/post_pre_header';\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\n\nexport default class RhsRootPost extends React.PureComponent {\n    static propTypes = {\n        post: PropTypes.object.isRequired,\n        teamId: PropTypes.string.isRequired,\n        currentUserId: PropTypes.string.isRequired,\n        compactDisplay: PropTypes.bool,\n        commentCount: PropTypes.number.isRequired,\n        isFlagged: PropTypes.bool.isRequired,\n        previewCollapsed: PropTypes.string,\n        previewEnabled: PropTypes.bool,\n        isBusy: PropTypes.bool,\n        isEmbedVisible: PropTypes.bool,\n        enableEmojiPicker: PropTypes.bool.isRequired,\n        enablePostUsernameOverride: PropTypes.bool.isRequired,\n        isReadOnly: PropTypes.bool.isRequired,\n        pluginPostTypes: PropTypes.object,\n        channelIsArchived: PropTypes.bool.isRequired,\n        handleCardClick: PropTypes.func.isRequired,\n\n        /**\n         * To Check if the current post is last in the list of RHS\n         */\n        isLastPost: PropTypes.bool,\n\n        /**\n         * To check if the state of emoji for last message and from where it was emitted\n         */\n        shortcutReactToLastPostEmittedFrom: PropTypes.string,\n        actions: PropTypes.shape({\n            markPostAsUnread: PropTypes.func.isRequired,\n\n            /**\n             * Function to set or unset emoji picker for last message\n             */\n            emitShortcutReactToLastPostFrom: PropTypes.func,\n        }),\n        timestampProps: PropTypes.object,\n        isBot: PropTypes.bool,\n        collapsedThreadsEnabled: PropTypes.bool,\n    };\n\n    static defaultProps = {\n        commentCount: 0,\n    };\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            alt: false,\n            showEmojiPicker: false,\n            testStateObj: true,\n            dropdownOpened: false,\n            fileDropdownOpened: false,\n        };\n\n        this.postHeaderRef = React.createRef();\n        this.dotMenuRef = React.createRef();\n    }\n\n    handleShortcutReactToLastPost = (isLastPost) => {\n        if (isLastPost) {\n            const {post, enableEmojiPicker, channelIsArchived,\n                actions: {emitShortcutReactToLastPostFrom}} = this.props;\n\n            // Setting the last message emoji action to empty to clean up the redux state\n            emitShortcutReactToLastPostFrom(Locations.NO_WHERE);\n\n            // Following are the types of posts on which adding reaction is not possible\n            const isDeletedPost = post && post.state === Posts.POST_DELETED;\n            const isEphemeralPost = post && Utils.isPostEphemeral(post);\n            const isSystemMessage = post && PostUtils.isSystemMessage(post);\n            const isFailedPost = post && post.failed;\n            const isPostsFakeParentDeleted = post && post.type === Constants.PostTypes.FAKE_PARENT_DELETED;\n\n            // Checking if rhs root comment is at scroll view of the user\n            const boundingRectOfPostInfo = this.postHeaderRef.current.getBoundingClientRect();\n            const isPostHeaderVisibleToUser = (boundingRectOfPostInfo.top - 110) > 0 &&\n                boundingRectOfPostInfo.bottom < (window.innerHeight);\n\n            if (isPostHeaderVisibleToUser) {\n                if (!isEphemeralPost && !isSystemMessage && !isDeletedPost && !isFailedPost && !Utils.isMobile() &&\n                    !channelIsArchived && !isPostsFakeParentDeleted && enableEmojiPicker) {\n                    // As per issue in #2 of mattermost-webapp/pull/4478#pullrequestreview-339313236\n                    // We are not not handling focus condition as we did for rhs_comment as the dot menu is already in dom and not visible\n                    this.toggleEmojiPicker(isLastPost);\n                }\n            }\n        }\n    }\n\n    componentDidMount() {\n        document.addEventListener('keydown', this.handleAlt);\n        document.addEventListener('keyup', this.handleAlt);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleAlt);\n        document.removeEventListener('keyup', this.handleAlt);\n    }\n\n    componentDidUpdate(prevProps) {\n        const {shortcutReactToLastPostEmittedFrom, isLastPost} = this.props;\n\n        const shortcutReactToLastPostEmittedFromRHS = prevProps.shortcutReactToLastPostEmittedFrom !== shortcutReactToLastPostEmittedFrom &&\n            shortcutReactToLastPostEmittedFrom === Locations.RHS_ROOT;\n        if (shortcutReactToLastPostEmittedFromRHS) {\n            this.handleShortcutReactToLastPost(isLastPost);\n        }\n    }\n\n    renderPostTime = (isEphemeral) => {\n        const post = this.props.post;\n\n        if (post.type === Constants.PostTypes.FAKE_PARENT_DELETED) {\n            return null;\n        }\n\n        const isPermalink = !(isEphemeral ||\n            Posts.POST_DELETED === post.state ||\n            ReduxPostUtils.isPostPendingOrFailed(post));\n\n        return (\n            <PostTime\n                isPermalink={isPermalink}\n                eventTime={post.create_at}\n                postId={post.id}\n                location={Locations.RHS_ROOT}\n                timestampProps={this.props.timestampProps}\n            />\n        );\n    };\n\n    toggleEmojiPicker = () => {\n        const showEmojiPicker = !this.state.showEmojiPicker;\n\n        this.setState({\n            showEmojiPicker,\n        });\n    };\n\n    getClassName = (post, isSystemMessage, isMeMessage) => {\n        let className = 'post post--root post--thread';\n        if (this.props.currentUserId === post.user_id) {\n            className += ' current--user';\n        }\n\n        if (isSystemMessage || isMeMessage) {\n            className += ' post--system';\n        }\n\n        if (this.props.compactDisplay) {\n            className += ' post--compact';\n        }\n\n        if (this.state.dropdownOpened || this.state.fileDropdownOpened || this.state.showEmojiPicker) {\n            className += ' post--hovered';\n        }\n\n        if (this.state.alt && !this.props.channelIsArchived) {\n            className += ' cursor--pointer';\n        }\n\n        return className;\n    };\n\n    handleAlt = (e) => {\n        if (this.state.alt !== e.altKey) {\n            this.setState({alt: e.altKey});\n        }\n    }\n\n    handleDropdownOpened = (isOpened) => {\n        this.setState({\n            dropdownOpened: isOpened,\n        });\n    };\n\n    handleFileDropdownOpened = (isOpened) => {\n        this.setState({\n            fileDropdownOpened: isOpened,\n        });\n    };\n\n    handlePostClick = (e) => {\n        if (this.props.channelIsArchived) {\n            return;\n        }\n\n        if (e.altKey) {\n            this.props.actions.markPostAsUnread(this.props.post, 'RHS_ROOT');\n        }\n    }\n\n    getDotMenuRef = () => {\n        return this.dotMenuRef.current;\n    };\n\n    render() {\n        const {post, isReadOnly, teamId, channelIsArchived, collapsedThreadsEnabled, isBot} = this.props;\n\n        const isPostDeleted = post && post.state === Posts.POST_DELETED;\n        const isEphemeral = Utils.isPostEphemeral(post);\n        const isSystemMessage = PostUtils.isSystemMessage(post);\n        const isMeMessage = ReduxPostUtils.isMeMessage(post);\n\n        let postReaction;\n        if (!isReadOnly && !isEphemeral && !post.failed && !isSystemMessage && this.props.enableEmojiPicker && !channelIsArchived) {\n            postReaction = (\n                <PostReaction\n                    channelId={post.channel_id}\n                    postId={post.id}\n                    teamId={teamId}\n                    getDotMenuRef={this.getDotMenuRef}\n                    location={Locations.RHS_ROOT}\n                    showEmojiPicker={this.state.showEmojiPicker}\n                    toggleEmojiPicker={this.toggleEmojiPicker}\n                />\n            );\n        }\n\n        let fileAttachment = null;\n        if (post.file_ids && post.file_ids.length > 0) {\n            fileAttachment = (\n                <FileAttachmentListContainer\n                    post={post}\n                    compactDisplay={this.props.compactDisplay}\n                    handleFileDropdownOpened={this.handleFileDropdownOpened}\n                />\n            );\n        }\n\n        let userProfile;\n        let botIndicator;\n        if (isSystemMessage) {\n            userProfile = (\n                <UserProfile\n                    overwriteName={\n                        <FormattedMessage\n                            id='post_info.system'\n                            defaultMessage='System'\n                        />\n                    }\n                    overwriteImage={Constants.SYSTEM_MESSAGE_PROFILE_IMAGE}\n                    disablePopover={true}\n                />\n            );\n        } else if (post.props && post.props.from_webhook) {\n            if (post.props.override_username && this.props.enablePostUsernameOverride) {\n                userProfile = (\n                    <UserProfile\n                        key={post.user_id}\n                        userId={post.user_id}\n                        hideStatus={true}\n                        overwriteName={post.props.override_username}\n                        disablePopover={true}\n                    />\n                );\n            } else {\n                userProfile = (\n                    <UserProfile\n                        key={post.user_id}\n                        userId={post.user_id}\n                        hideStatus={true}\n                        disablePopover={true}\n                    />\n                );\n            }\n\n            botIndicator = <BotBadge/>;\n        } else {\n            userProfile = (\n                <UserProfile\n                    key={post.user_id}\n                    userId={post.user_id}\n                    isBusy={this.props.isBusy}\n                    isRHS={true}\n                    hasMention={true}\n                />\n            );\n        }\n\n        let postClass = '';\n        if (PostUtils.isEdited(this.props.post)) {\n            postClass += ' post--edited';\n        }\n\n        const dotMenu = (\n            <DotMenu\n                post={this.props.post}\n                location={Locations.RHS_ROOT}\n                isFlagged={this.props.isFlagged}\n                handleDropdownOpened={this.handleDropdownOpened}\n                handleAddReactionClick={this.toggleEmojiPicker}\n                commentCount={this.props.commentCount}\n                isMenuOpen={this.state.dropdownOpened}\n                isReadOnly={isReadOnly || channelIsArchived}\n                enableEmojiPicker={this.props.enableEmojiPicker}\n            />\n        );\n\n        let postFlagIcon;\n        const showFlagIcon = !isEphemeral && !post.failed && !isSystemMessage && !Utils.isMobile();\n        if (showFlagIcon) {\n            postFlagIcon = (\n                <PostFlagIcon\n                    location={Locations.RHS_ROOT}\n                    postId={post.id}\n                    isFlagged={this.props.isFlagged}\n                />\n            );\n        }\n\n        let dotMenuContainer;\n        if (!isPostDeleted && this.props.post.type !== Constants.PostTypes.FAKE_PARENT_DELETED) {\n            dotMenuContainer = (\n                <div\n                    ref={this.dotMenuRef}\n                    className='col post-menu'\n                >\n                    {!collapsedThreadsEnabled && dotMenu}\n                    {postReaction}\n                    {postFlagIcon}\n                    {collapsedThreadsEnabled && dotMenu}\n                </div>\n            );\n        }\n\n        let postInfoIcon;\n        if (this.props.post.props && this.props.post.props.card) {\n            postInfoIcon = (\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='top'\n                    overlay={\n                        <Tooltip>\n                            <FormattedMessage\n                                id='post_info.info.view_additional_info'\n                                defaultMessage='View additional info'\n                            />\n                        </Tooltip>\n                    }\n                >\n                    <button\n                        className='card-icon__container icon--show style--none'\n                        onClick={(e) => {\n                            e.preventDefault();\n                            this.props.handleCardClick(this.props.post);\n                        }}\n                    >\n                        <InfoSmallIcon\n                            className='icon icon__info'\n                            aria-hidden='true'\n                        />\n                    </button>\n                </OverlayTrigger>\n            );\n        }\n\n        let customStatus;\n        if (!(isSystemMessage || post?.props?.from_webhook || isBot)) {\n            customStatus = (\n                <CustomStatusEmoji\n                    userID={post.user_id}\n                    showTooltip={true}\n                    emojiStyle={{\n                        marginLeft: 4,\n                        marginTop: 2,\n                    }}\n                />\n            );\n        }\n\n        return (\n            <PostAriaLabelDiv\n                role='listitem'\n                id={'rhsPost_' + post.id}\n                tabIndex='-1'\n                className={`thread__root a11y__section ${this.getClassName(post, isSystemMessage, isMeMessage)}`}\n                onClick={this.handlePostClick}\n                data-a11y-sort-order='0'\n                post={post}\n            >\n                <PostPreHeader\n                    isFlagged={this.props.isFlagged}\n                    isPinned={post.is_pinned}\n                    channelId={post.channel_id}\n                />\n                <div\n                    role='application'\n                    className='post__content'\n                >\n                    <div className='post__img'>\n                        <PostProfilePicture\n                            compactDisplay={this.props.compactDisplay}\n                            isBusy={this.props.isBusy}\n                            isRHS={true}\n                            post={post}\n                            userId={post.user_id}\n                            channelId={post.channel_id}\n                        />\n                    </div>\n                    <div>\n                        <div\n                            className='post__header'\n                            ref={this.postHeaderRef}\n                        >\n                            <div className='col__name'>\n                                {userProfile}\n                                {botIndicator}\n                                {customStatus}\n                            </div>\n                            <div className='col'>\n                                {this.renderPostTime(isEphemeral)}\n                                {postInfoIcon}\n                            </div>\n                            {dotMenuContainer}\n                        </div>\n                        <div className='post__body'>\n                            <div className={postClass}>\n                                <MessageWithAdditionalContent\n                                    post={post}\n                                    previewCollapsed={this.props.previewCollapsed}\n                                    previewEnabled={this.props.previewEnabled}\n                                    isEmbedVisible={this.props.isEmbedVisible}\n                                    pluginPostTypes={this.props.pluginPostTypes}\n                                />\n                            </div>\n                            {fileAttachment}\n                            <ReactionList\n                                post={post}\n                                isReadOnly={isReadOnly || channelIsArchived}\n                            />\n                        </div>\n                    </div>\n                </div>\n            </PostAriaLabelDiv>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {get, isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {markPostAsUnread, emitShortcutReactToLastPostFrom} from 'actions/post_actions';\n\nimport {getShortcutReactToLastPostEmittedFrom} from 'selectors/emojis';\nimport {isEmbedVisible} from 'selectors/posts';\n\nimport {GlobalState} from 'types/store';\nimport {FakePost} from 'types/store/rhs';\n\nimport {isArchivedChannel} from 'utils/channel_utils';\nimport {Preferences} from 'utils/constants';\n\nimport RhsRootPost from './rhs_root_post.jsx';\n\ninterface OwnProps {\n    post: Post | FakePost;\n    teamId: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const config = getConfig(state);\n    const enableEmojiPicker = config.EnableEmojiPicker === 'true';\n    const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n    const teamId = ownProps.teamId || getCurrentTeamId(state);\n    const channel = getChannel(state, ownProps.post.channel_id);\n    const shortcutReactToLastPostEmittedFrom = getShortcutReactToLastPostEmittedFrom(state);\n\n    const user = getUser(state, ownProps.post.user_id);\n    const isBot = Boolean(user && user.is_bot);\n\n    return {\n        isBot,\n        enableEmojiPicker,\n        enablePostUsernameOverride,\n        isEmbedVisible: isEmbedVisible(state, ownProps.post.id),\n        isReadOnly: false,\n        teamId,\n        pluginPostTypes: state.plugins.postTypes,\n        channelIsArchived: isArchivedChannel(channel),\n        isFlagged: get(state, Preferences.CATEGORY_FLAGGED_POST, ownProps.post.id, null) != null,\n        compactDisplay: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.MESSAGE_DISPLAY, Preferences.MESSAGE_DISPLAY_DEFAULT) === Preferences.MESSAGE_DISPLAY_COMPACT,\n        shortcutReactToLastPostEmittedFrom,\n        collapsedThreadsEnabled: isCollapsedThreadsEnabled(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            markPostAsUnread,\n            emitShortcutReactToLastPostFrom,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(RhsRootPost);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport RhsRootPost from 'components/rhs_root_post';\nimport {Props as TimestampProps} from 'components/timestamp/timestamp';\n\ntype Props = {\n    currentUserId: string;\n    isLastPost: boolean;\n    onCardClick: (post: Post) => void;\n    post: Post;\n    previewCollapsed: string;\n    previewEnabled: boolean;\n    teamId: string;\n    timestampProps?: Partial<TimestampProps>;\n}\n\nfunction RootPost({\n    currentUserId,\n    isLastPost,\n    onCardClick,\n    post,\n    previewCollapsed,\n    previewEnabled,\n    teamId,\n    timestampProps,\n}: Props) {\n    return (\n        <RhsRootPost\n            commentCount={post.reply_count}\n            currentUserId={currentUserId}\n            handleCardClick={onCardClick}\n            isLastPost={isLastPost}\n            post={post}\n            previewCollapsed={previewCollapsed}\n            previewEnabled={previewEnabled}\n            teamId={teamId}\n            timestampProps={timestampProps}\n        />\n    );\n}\n\nexport default memo(RootPost);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {get, getBool} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {Preferences} from 'utils/constants';\n\nimport {GlobalState} from 'types/store';\n\nimport RootPost from './root_post';\n\ntype OwnProps = {\n    id: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const previewCollapsed = get(\n        state,\n        Preferences.CATEGORY_DISPLAY_SETTINGS,\n        Preferences.COLLAPSE_DISPLAY,\n        Preferences.COLLAPSE_DISPLAY_DEFAULT,\n    );\n\n    const previewEnabled = getBool(\n        state,\n        Preferences.CATEGORY_DISPLAY_SETTINGS,\n        Preferences.LINK_PREVIEW_DISPLAY,\n        Preferences.LINK_PREVIEW_DISPLAY_DEFAULT === 'true',\n    );\n\n    return {\n        post: getPost(state, ownProps.id),\n        previewEnabled,\n        previewCollapsed,\n    };\n}\n\nexport default connect(mapStateToProps)(RootPost);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n/* eslint-disable react/no-string-refs */\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Tooltip} from 'react-bootstrap';\n\nimport {Posts} from 'mattermost-redux/constants/index';\nimport {\n    isPostEphemeral,\n    isPostPendingOrFailed,\n    isMeMessage as checkIsMeMessage,\n} from 'mattermost-redux/utils/post_utils';\n\nimport Constants, {Locations, A11yCustomEventTypes} from 'utils/constants';\nimport * as PostUtils from 'utils/post_utils';\nimport {isMobile} from 'utils/utils.jsx';\nimport DotMenu from 'components/dot_menu';\nimport FileAttachmentListContainer from 'components/file_attachment_list';\nimport OverlayTrigger from 'components/overlay_trigger';\nimport PostProfilePicture from 'components/post_profile_picture';\nimport FailedPostOptions from 'components/post_view/failed_post_options';\nimport PostAriaLabelDiv from 'components/post_view/post_aria_label_div';\nimport PostFlagIcon from 'components/post_view/post_flag_icon';\nimport PostTime from 'components/post_view/post_time';\nimport PostReaction from 'components/post_view/post_reaction';\nimport ReactionList from 'components/post_view/reaction_list';\nimport MessageWithAdditionalContent from 'components/message_with_additional_content';\nimport BotBadge from 'components/widgets/badges/bot_badge';\nimport Badge from 'components/widgets/badges/badge';\nimport InfoSmallIcon from 'components/widgets/icons/info_small_icon';\nimport PostPreHeader from 'components/post_view/post_pre_header';\nimport UserProfile from 'components/user_profile';\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\n\nexport default class RhsComment extends React.PureComponent {\n    static propTypes = {\n        post: PropTypes.object,\n        teamId: PropTypes.string.isRequired,\n        currentUserId: PropTypes.string.isRequired,\n        compactDisplay: PropTypes.bool,\n        isFlagged: PropTypes.bool.isRequired,\n        isBusy: PropTypes.bool,\n        removePost: PropTypes.func.isRequired,\n        previewCollapsed: PropTypes.string.isRequired,\n        previewEnabled: PropTypes.bool.isRequired,\n        isEmbedVisible: PropTypes.bool,\n        enableEmojiPicker: PropTypes.bool.isRequired,\n        enablePostUsernameOverride: PropTypes.bool.isRequired,\n        isReadOnly: PropTypes.bool.isRequired,\n        pluginPostTypes: PropTypes.object,\n        channelIsArchived: PropTypes.bool.isRequired,\n        isConsecutivePost: PropTypes.bool,\n        handleCardClick: PropTypes.func,\n        a11yIndex: PropTypes.number,\n        isInViewport: PropTypes.func.isRequired,\n\n        /**\n         * If the user that made the post is a bot.\n         */\n        isBot: PropTypes.bool.isRequired,\n\n        /**\n         * To Check if the current post is last in the list of RHS\n         */\n        isLastPost: PropTypes.bool,\n\n        /**\n         * To check if the state of emoji for last message and from where it was emitted\n         */\n        shortcutReactToLastPostEmittedFrom: PropTypes.string,\n        actions: PropTypes.shape({\n            markPostAsUnread: PropTypes.func.isRequired,\n\n            /**\n             * Function to set or unset emoji picker for last message\n             */\n            emitShortcutReactToLastPostFrom: PropTypes.func,\n        }),\n        timestampProps: PropTypes.object,\n        collapsedThreadsEnabled: PropTypes.bool,\n\n        /**\n         * To Check if the current post is to be highlighted and scrolled into center view of RHS\n         */\n        shouldHighlight: PropTypes.bool,\n    };\n\n    constructor(props) {\n        super(props);\n\n        this.postRef = React.createRef();\n        this.dotMenuRef = React.createRef();\n\n        this.state = {\n            showEmojiPicker: false,\n            dropdownOpened: false,\n            fileDropdownOpened: false,\n            alt: false,\n            hover: false,\n            a11yActive: false,\n            currentAriaLabel: '',\n        };\n\n        this.postHeaderRef = React.createRef();\n    }\n\n    componentDidMount() {\n        document.addEventListener('keydown', this.handleAlt);\n        document.addEventListener('keyup', this.handleAlt);\n\n        if (this.postRef.current) {\n            this.postRef.current.addEventListener(A11yCustomEventTypes.ACTIVATE, this.handleA11yActivateEvent);\n            this.postRef.current.addEventListener(A11yCustomEventTypes.DEACTIVATE, this.handleA11yDeactivateEvent);\n        }\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleAlt);\n        document.removeEventListener('keyup', this.handleAlt);\n\n        if (this.postRef.current) {\n            this.postRef.current.removeEventListener(A11yCustomEventTypes.ACTIVATE, this.handleA11yActivateEvent);\n            this.postRef.current.removeEventListener(A11yCustomEventTypes.DEACTIVATE, this.handleA11yDeactivateEvent);\n        }\n    }\n\n    componentDidUpdate(prevProps) {\n        const {shortcutReactToLastPostEmittedFrom, isLastPost} = this.props;\n\n        if (this.state.a11yActive) {\n            this.postRef.current.dispatchEvent(new Event(A11yCustomEventTypes.UPDATE));\n        }\n\n        const shortcutReactToLastPostEmittedFromRHS = prevProps.shortcutReactToLastPostEmittedFrom !== shortcutReactToLastPostEmittedFrom &&\n        shortcutReactToLastPostEmittedFrom === Locations.RHS_ROOT;\n        if (shortcutReactToLastPostEmittedFromRHS) {\n            // Opening the emoji picker when more than one post in rhs is present\n            this.handleShortcutReactToLastPost(isLastPost);\n        }\n    }\n\n    handleShortcutReactToLastPost = (isLastPost) => {\n        if (isLastPost) {\n            const {isReadOnly, channelIsArchived, enableEmojiPicker, post,\n                actions: {emitShortcutReactToLastPostFrom}} = this.props;\n\n            // Setting the last message emoji action to empty to clean up the redux state\n            emitShortcutReactToLastPostFrom(Locations.NO_WHERE);\n\n            // Following are the types of posts on which adding reaction is not possible\n            const isDeletedPost = post && post.state === Posts.POST_DELETED;\n            const isEphemeralPost = post && isPostEphemeral(post);\n            const isSystemMessage = post && PostUtils.isSystemMessage(post);\n            const isAutoRespondersPost = post && PostUtils.fromAutoResponder(post);\n            const isFailedPost = post && post.failed;\n\n            // Checking if rhs comment is in scroll view of the user\n            const boundingRectOfPostInfo = this.postHeaderRef.current.getBoundingClientRect();\n            const isPostHeaderVisibleToUser = (boundingRectOfPostInfo.top - 110) > 0 &&\n                boundingRectOfPostInfo.bottom < (window.innerHeight);\n\n            if (isPostHeaderVisibleToUser && !isEphemeralPost && !isSystemMessage && !isReadOnly && !isFailedPost &&\n                !isAutoRespondersPost && !isDeletedPost && !channelIsArchived && !isMobile() && enableEmojiPicker) {\n                this.setState({hover: true}, () => {\n                    this.toggleEmojiPicker();\n                });\n            }\n        }\n    }\n\n    removePost = () => {\n        this.props.removePost(this.props.post);\n    };\n\n    createRemovePostButton = () => {\n        return (\n            <button\n                className='post__remove theme color--link style--none'\n                type='button'\n                onClick={this.removePost}\n            >\n                {'×'}\n            </button>\n        );\n    };\n\n    renderPostTime = () => {\n        const post = this.props.post;\n\n        const isPermalink = !(Posts.POST_DELETED === post.state || isPostPendingOrFailed(post));\n\n        return (\n            <PostTime\n                isPermalink={isPermalink}\n                eventTime={post.create_at}\n                postId={post.id}\n                location={Locations.RHS_COMMENT}\n                timestampProps={{...this.props.timestampProps, style: this.props.isConsecutivePost && !this.props.compactDisplay ? 'narrow' : undefined}}\n            />\n        );\n    };\n\n    toggleEmojiPicker = () => {\n        const showEmojiPicker = !this.state.showEmojiPicker;\n\n        this.setState({\n            showEmojiPicker,\n        });\n    };\n\n    getClassName = (post, isSystemMessage, isMeMessage) => {\n        let className = 'post post--thread same--root post--comment';\n\n        if (this.props.shouldHighlight) {\n            className += ' post--highlight';\n        }\n\n        if (this.props.currentUserId === post.user_id) {\n            className += ' current--user';\n        }\n\n        if (isSystemMessage || isMeMessage) {\n            className += ' post--system';\n        }\n\n        if (this.props.compactDisplay) {\n            className += ' post--compact';\n        }\n\n        if (this.state.dropdownOpened || this.state.fileDropdownOpened || this.state.showEmojiPicker) {\n            className += ' post--hovered';\n        }\n\n        if (this.props.isConsecutivePost) {\n            className += ' same--user';\n        }\n\n        if (this.state.alt && !this.props.channelIsArchived) {\n            className += ' cursor--pointer';\n        }\n\n        return className;\n    };\n\n    handleAlt = (e) => {\n        if (this.state.alt !== e.altKey) {\n            this.setState({alt: e.altKey});\n        }\n    }\n\n    handleDropdownOpened = (isOpened) => {\n        this.setState({\n            dropdownOpened: isOpened,\n        });\n    };\n\n    handleFileDropdownOpened = (isOpened) => {\n        this.setState({\n            fileDropdownOpened: isOpened,\n        });\n    };\n\n    getDotMenuRef = () => {\n        return this.dotMenuRef.current;\n    };\n\n    setHover = () => {\n        this.setState({hover: true});\n    }\n\n    unsetHover = () => {\n        this.setState({hover: false});\n    }\n\n    handleA11yActivateEvent = () => {\n        this.setState({a11yActive: true});\n    }\n\n    handleA11yDeactivateEvent = () => {\n        this.setState({a11yActive: false});\n    }\n\n    handlePostClick = (e) => {\n        if (this.props.channelIsArchived) {\n            return;\n        }\n\n        if (e.altKey) {\n            this.props.actions.markPostAsUnread(this.props.post, 'RHS_COMMENT');\n        }\n    }\n\n    render() {\n        const {post, isConsecutivePost, isReadOnly, channelIsArchived, collapsedThreadsEnabled} = this.props;\n\n        const isPostDeleted = post && post.state === Posts.POST_DELETED;\n        const isEphemeral = isPostEphemeral(post);\n        const isSystemMessage = PostUtils.isSystemMessage(post);\n        const isMeMessage = checkIsMeMessage(post);\n        const fromAutoResponder = PostUtils.fromAutoResponder(post);\n\n        let botIndicator;\n        let profilePicture;\n        let visibleMessage;\n\n        let userProfile = null;\n        if (this.props.compactDisplay || isMobile()) {\n            userProfile = (\n                <UserProfile\n                    userId={post.user_id}\n                    channelId={post.channel_id}\n                    isBusy={this.props.isBusy}\n                    isRHS={true}\n                    hasMention={true}\n                />\n            );\n        }\n\n        if (!isConsecutivePost) {\n            userProfile = (\n                <UserProfile\n                    userId={post.user_id}\n                    channelId={post.channel_id}\n                    isBusy={this.props.isBusy}\n                    isRHS={true}\n                    hasMention={true}\n                />\n            );\n\n            profilePicture = (\n                <PostProfilePicture\n                    compactDisplay={this.props.compactDisplay}\n                    isBusy={this.props.isBusy}\n                    isRHS={true}\n                    post={post}\n                    userId={post.user_id}\n                    channelId={post.channel_id}\n                />\n            );\n\n            if (post.props && post.props.from_webhook) {\n                if (post.props.override_username && this.props.enablePostUsernameOverride) {\n                    userProfile = (\n                        <UserProfile\n                            userId={post.user_id}\n                            channelId={post.channel_id}\n                            hideStatus={true}\n                            overwriteName={post.props.override_username}\n                            disablePopover={true}\n                        />\n                    );\n                } else {\n                    userProfile = (\n                        <UserProfile\n                            userId={post.user_id}\n                            channelId={post.channel_id}\n                            hideStatus={true}\n                            disablePopover={true}\n                        />\n                    );\n                }\n\n                botIndicator = (<BotBadge className='col col__name'/>);\n            } else if (fromAutoResponder) {\n                userProfile = (\n                    <span className='auto-responder'>\n                        <UserProfile\n                            userId={post.user_id}\n                            channelId={post.channel_id}\n                            hideStatus={true}\n                            isBusy={this.props.isBusy}\n                            isRHS={true}\n                            hasMention={true}\n                        />\n                    </span>\n                );\n                botIndicator = (\n                    <Badge className='col col__name'>\n                        <FormattedMessage\n                            id='post_info.auto_responder'\n                            defaultMessage='AUTOMATIC REPLY'\n                        />\n                    </Badge>\n                );\n            } else if (isSystemMessage && this.props.isBot) {\n                userProfile = (\n                    <UserProfile\n                        userId={post.user_id}\n                        channelId={post.channel_id}\n                        hideStatus={true}\n                    />\n                );\n\n                visibleMessage = (\n                    <span className='post__visibility'>\n                        <FormattedMessage\n                            id='post_info.message.visible'\n                            defaultMessage='(Only visible to you)'\n                        />\n                    </span>\n                );\n            } else if (isSystemMessage) {\n                userProfile = (\n                    <UserProfile\n                        overwriteName={\n                            <FormattedMessage\n                                id='post_info.system'\n                                defaultMessage='System'\n                            />\n                        }\n                        overwriteImage={Constants.SYSTEM_MESSAGE_PROFILE_IMAGE}\n                        disablePopover={true}\n                        channelId={post.channel_id}\n                    />\n                );\n                visibleMessage = (\n                    <span className='post__visibility'>\n                        <FormattedMessage\n                            id='post_info.message.visible'\n                            defaultMessage='(Only visible to you)'\n                        />\n                    </span>\n                );\n            }\n        }\n\n        let failedPostOptions;\n        let postClass = '';\n\n        if (post.failed) {\n            postClass += ' post-failed';\n            failedPostOptions = <FailedPostOptions post={this.props.post}/>;\n        }\n\n        if (PostUtils.isEdited(this.props.post)) {\n            postClass += ' post--edited';\n        }\n\n        let fileAttachment = null;\n        if (post.file_ids && post.file_ids.length > 0) {\n            fileAttachment = (\n                <FileAttachmentListContainer\n                    post={post}\n                    compactDisplay={this.props.compactDisplay}\n                    handleFileDropdownOpened={this.handleFileDropdownOpened}\n                />\n            );\n        }\n\n        let postReaction;\n        if (!isReadOnly && !isEphemeral && !post.failed && !isSystemMessage && this.props.enableEmojiPicker && !channelIsArchived) {\n            postReaction = (\n                <PostReaction\n                    channelId={post.channel_id}\n                    postId={post.id}\n                    teamId={this.props.teamId}\n                    getDotMenuRef={this.getDotMenuRef}\n                    location={Locations.RHS_COMMENT}\n                    showEmojiPicker={this.state.showEmojiPicker}\n                    toggleEmojiPicker={this.toggleEmojiPicker}\n                />\n            );\n        }\n\n        let flagIcon = null;\n        if (!isMobile() && (!isEphemeral && !post.failed && !isSystemMessage)) {\n            flagIcon = (\n                <PostFlagIcon\n                    location={Locations.RHS_COMMENT}\n                    postId={post.id}\n                    isFlagged={this.props.isFlagged}\n                />\n            );\n        }\n\n        let options;\n        if (isEphemeral) {\n            options = (\n                <div className='col col__remove'>\n                    {this.createRemovePostButton()}\n                </div>\n            );\n        } else if (isPostDeleted) {\n            options = null;\n        } else if (!isSystemMessage && (isMobile() || this.state.hover || this.state.a11yActive || this.state.dropdownOpened || this.state.showEmojiPicker)) {\n            const dotMenu = (\n                <DotMenu\n                    post={this.props.post}\n                    location={Locations.RHS_COMMENT}\n                    isFlagged={this.props.isFlagged}\n                    handleDropdownOpened={this.handleDropdownOpened}\n                    handleAddReactionClick={this.toggleEmojiPicker}\n                    isReadOnly={isReadOnly || channelIsArchived}\n                    isMenuOpen={this.state.dropdownOpened}\n                    enableEmojiPicker={this.props.enableEmojiPicker}\n                />\n            );\n\n            options = (\n                <div\n                    ref={this.dotMenuRef}\n                    data-testid={`post-menu-${this.props.post.id}`}\n                    className='col post-menu'\n                >\n                    {!collapsedThreadsEnabled && dotMenu}\n                    {postReaction}\n                    {flagIcon}\n                    {collapsedThreadsEnabled && dotMenu}\n                </div>\n            );\n        }\n\n        const postTime = this.renderPostTime();\n\n        let postInfoIcon;\n        if (post.props && post.props.card) {\n            postInfoIcon = (\n                <OverlayTrigger\n                    delayShow={Constants.OVERLAY_TIME_DELAY}\n                    placement='top'\n                    overlay={\n                        <Tooltip>\n                            <FormattedMessage\n                                id='post_info.info.view_additional_info'\n                                defaultMessage='View additional info'\n                            />\n                        </Tooltip>\n                    }\n                >\n                    <button\n                        className='card-icon__container icon--show style--none'\n                        onClick={(e) => {\n                            e.preventDefault();\n                            this.props.handleCardClick(this.props.post);\n                        }}\n                    >\n                        <InfoSmallIcon\n                            className='icon icon__info'\n                            aria-hidden='true'\n                        />\n                    </button>\n                </OverlayTrigger>\n            );\n        }\n\n        let customStatus;\n        if (!isSystemMessage) {\n            customStatus = (\n                <CustomStatusEmoji\n                    userID={post.user_id}\n                    showTooltip={true}\n                    emojiStyle={{\n                        marginLeft: 4,\n                        marginTop: 2,\n                    }}\n                />\n            );\n        }\n\n        return (\n            <PostAriaLabelDiv\n                role='listitem'\n                post={post}\n                ref={this.postRef}\n                id={'rhsPost_' + post.id}\n                tabIndex='-1'\n                className={`a11y__section ${this.getClassName(post, isSystemMessage, isMeMessage)}`}\n                onClick={this.handlePostClick}\n                onMouseOver={this.setHover}\n                onMouseLeave={this.unsetHover}\n                onFocus={this.handlePostFocus}\n                data-a11y-sort-order={this.props.a11yIndex}\n            >\n                <PostPreHeader\n                    isFlagged={this.props.isFlagged}\n                    isPinned={post.is_pinned}\n                    channelId={post.channel_id}\n                />\n                <div\n                    role='application'\n                    className='post__content'\n                >\n                    <div className='post__img'>\n                        {profilePicture}\n                    </div>\n                    <div>\n                        <div\n                            className='post__header'\n                            ref={this.postHeaderRef}\n                        >\n                            <div className='col col__name'>\n                                {userProfile}\n                                {botIndicator}\n                                {customStatus}\n                            </div>\n                            <div className='col'>\n                                {postTime}\n                                {postInfoIcon}\n                                {visibleMessage}\n                            </div>\n                            {options}\n                        </div>\n                        <div className='post__body' >\n                            <div className={postClass}>\n                                {failedPostOptions}\n                                <MessageWithAdditionalContent\n                                    post={post}\n                                    previewCollapsed={this.props.previewCollapsed}\n                                    previewEnabled={this.props.previewEnabled}\n                                    isEmbedVisible={this.props.isEmbedVisible}\n                                    pluginPostTypes={this.props.pluginPostTypes}\n                                />\n                            </div>\n                            {fileAttachment}\n                            <ReactionList\n                                post={post}\n                                isReadOnly={isReadOnly || channelIsArchived}\n                            />\n                        </div>\n                    </div>\n                </div>\n            </PostAriaLabelDiv>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {get, isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {markPostAsUnread, emitShortcutReactToLastPostFrom} from 'actions/post_actions';\n\nimport {getShortcutReactToLastPostEmittedFrom} from 'selectors/emojis';\nimport {isEmbedVisible} from 'selectors/posts';\nimport {getHighlightedPostId} from 'selectors/rhs';\n\nimport {GlobalState} from 'types/store';\n\nimport {isArchivedChannel} from 'utils/channel_utils';\nimport {areConsecutivePostsBySameUser} from 'utils/post_utils';\nimport {Preferences} from 'utils/constants';\n\nimport RhsComment from './rhs_comment.jsx';\n\ninterface OwnProps {\n    post: Post;\n    previousPostId: string;\n    teamId: string;\n}\n\nfunction isConsecutivePost(state: GlobalState, ownProps: OwnProps) {\n    const post = ownProps.post;\n    const previousPost = ownProps.previousPostId && getPost(state, ownProps.previousPostId);\n\n    let consecutivePost = false;\n\n    if (previousPost) {\n        consecutivePost = areConsecutivePostsBySameUser(post, previousPost);\n    }\n    return consecutivePost;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const config = getConfig(state);\n    const enableEmojiPicker = config.EnableEmojiPicker === 'true';\n    const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n    const teamId = ownProps.teamId || getCurrentTeamId(state);\n    const channel = state.entities.channels.channels[ownProps.post.channel_id];\n    const shortcutReactToLastPostEmittedFrom = getShortcutReactToLastPostEmittedFrom(state);\n\n    const user = getUser(state, ownProps.post.user_id);\n    const isBot = Boolean(user && user.is_bot);\n    const highlightedPostId = getHighlightedPostId(state);\n\n    return {\n        enableEmojiPicker,\n        enablePostUsernameOverride,\n        isEmbedVisible: isEmbedVisible(state, ownProps.post.id),\n        isReadOnly: false,\n        teamId,\n        pluginPostTypes: state.plugins.postTypes,\n        channelIsArchived: isArchivedChannel(channel),\n        isConsecutivePost: isConsecutivePost(state, ownProps),\n        isFlagged: get(state, Preferences.CATEGORY_FLAGGED_POST, ownProps.post.id, null) != null,\n        compactDisplay: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.MESSAGE_DISPLAY, Preferences.MESSAGE_DISPLAY_DEFAULT) === Preferences.MESSAGE_DISPLAY_COMPACT,\n        shortcutReactToLastPostEmittedFrom,\n        isBot,\n        collapsedThreadsEnabled: isCollapsedThreadsEnabled(state),\n        shouldHighlight: highlightedPostId === ownProps.post.id,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            markPostAsUnread,\n            emitShortcutReactToLastPostFrom,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(RhsComment);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback} from 'react';\n\nimport {useDispatch} from 'react-redux';\n\nimport {removePost} from 'mattermost-redux/actions/posts';\n\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport RhsComment from 'components/rhs_comment';\nimport {Props as TimestampProps} from 'components/timestamp/timestamp';\n\ntype Props = {\n    a11yIndex: number;\n    currentUserId: string;\n    isLastPost: boolean;\n    onCardClick: (post: Post) => void;\n    post: Post;\n    previewCollapsed: string;\n    previewEnabled: boolean;\n    previousPostId: string;\n    teamId: string;\n    timestampProps?: Partial<TimestampProps>;\n}\n\nfunction Reply({\n    a11yIndex,\n    currentUserId,\n    isLastPost,\n    onCardClick,\n    post,\n    previewCollapsed,\n    previewEnabled,\n    previousPostId,\n    teamId,\n    timestampProps,\n}: Props) {\n    const dispatch = useDispatch();\n\n    const handleRemovePost = useCallback((post: Post) => {\n        dispatch(removePost(post));\n    }, []);\n\n    return (\n        <RhsComment\n            a11yIndex={a11yIndex}\n            currentUserId={currentUserId}\n            handleCardClick={onCardClick}\n            isLastPost={isLastPost}\n            post={post}\n            previewCollapsed={previewCollapsed}\n            previewEnabled={previewEnabled}\n            previousPostId={previousPostId}\n            removePost={handleRemovePost}\n            teamId={teamId}\n            timestampProps={timestampProps}\n        />\n    );\n}\n\nexport default memo(Reply);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {get, getBool} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {Preferences} from 'utils/constants';\n\nimport {GlobalState} from 'types/store';\n\nimport Reply from './reply';\n\ntype OwnProps = {\n    id: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const previewCollapsed = get(\n        state,\n        Preferences.CATEGORY_DISPLAY_SETTINGS,\n        Preferences.COLLAPSE_DISPLAY,\n        Preferences.COLLAPSE_DISPLAY_DEFAULT,\n    );\n    const previewEnabled = getBool(\n        state,\n        Preferences.CATEGORY_DISPLAY_SETTINGS,\n        Preferences.LINK_PREVIEW_DISPLAY,\n        Preferences.LINK_PREVIEW_DISPLAY_DEFAULT === 'true',\n    );\n\n    return {\n        post: getPost(state, ownProps.id),\n        previewEnabled,\n        previewCollapsed,\n    };\n}\n\nexport default connect(mapStateToProps)(Reply);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nimport * as PostListUtils from 'mattermost-redux/utils/post_list';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport DateSeparator from 'components/post_view/date_separator';\nimport NewMessageSeparator from 'components/post_view/new_message_separator/new_message_separator';\nimport {Props as TimestampProps} from 'components/timestamp/timestamp';\n\nimport RootPost from './root_post';\nimport Reply from './reply';\n\ntype Props = {\n    a11yIndex: number;\n    currentUserId: string;\n    isRootPost: boolean;\n    isLastPost: boolean;\n    listId: string;\n    onCardClick: (post: Post) => void;\n    onCardClickPost: (post: Post) => void;\n    previousPostId: string;\n    teamId: string;\n    timestampProps?: Partial<TimestampProps>;\n};\n\nfunction ThreadViewerRow({\n    a11yIndex,\n    currentUserId,\n    isRootPost,\n    isLastPost,\n    listId,\n    onCardClick,\n    onCardClickPost,\n    previousPostId,\n    teamId,\n    timestampProps,\n}: Props) {\n    switch (true) {\n    case PostListUtils.isDateLine(listId): {\n        const date = PostListUtils.getDateForDateLine(listId);\n        return (\n            <DateSeparator\n                key={date}\n                date={date}\n            />\n        );\n    }\n\n    case PostListUtils.isStartOfNewMessages(listId):\n        return <NewMessageSeparator separatorId={listId}/>;\n\n    case isRootPost:\n        return (\n            <RootPost\n                currentUserId={currentUserId}\n                id={listId}\n                isLastPost={isLastPost}\n                onCardClick={onCardClick}\n                teamId={teamId}\n                timestampProps={timestampProps}\n            />\n        );\n    default:\n        return (\n            <Reply\n                a11yIndex={a11yIndex}\n                currentUserId={currentUserId}\n                id={listId}\n                isLastPost={isLastPost}\n                onCardClick={onCardClickPost}\n                previousPostId={previousPostId}\n                teamId={teamId}\n                timestampProps={timestampProps}\n            />\n        );\n    }\n}\n\nexport default memo(ThreadViewerRow);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent, RefObject} from 'react';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport {DynamicSizeList, OnScrollArgs} from 'dynamic-virtualized-list';\n\nimport {$ID} from 'mattermost-redux/types/utilities';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {Post} from 'mattermost-redux/types/posts';\nimport {UserProfile} from 'mattermost-redux/types/users';\n\nimport {Posts} from 'mattermost-redux/constants';\nimport {isDateLine, isStartOfNewMessages, isCreateComment} from 'mattermost-redux/utils/post_list';\n\nimport DelayedAction from 'utils/delayed_action';\nimport * as Utils from 'utils/utils.jsx';\nimport Constants from 'utils/constants';\nimport {FakePost} from 'types/store/rhs';\nimport {getNewMessageIndex, getPreviousPostId, getLatestPostId} from 'utils/post_utils';\n\nimport FloatingTimestamp from 'components/post_view/floating_timestamp';\nimport {THREADING_TIME as BASE_THREADING_TIME} from 'components/threading/common/options';\n\nimport CreateComment from './create_comment';\nimport Row from './thread_viewer_row';\n\ntype Props = {\n    channel: Channel;\n    currentUserId: string;\n    directTeammate: UserProfile | undefined;\n    highlightedPostId?: $ID<Post>;\n    lastPost: Post;\n    onCardClick: (post: Post) => void;\n    onCardClickPost: (post: Post) => void;\n    replyListIds: string[];\n    selected: Post | FakePost;\n    teamId: string;\n    useRelativeTimestamp: boolean;\n}\n\ntype State = {\n    createCommentHeight: number;\n    isMobile: boolean;\n    isScrolling: boolean;\n    topRhsPostId?: string;\n    userScrolled: boolean;\n    userScrolledToBottom: boolean;\n}\n\nconst virtListStyles = {\n    position: 'absolute',\n    top: '0',\n    height: '100%',\n    willChange: 'auto',\n};\n\nconst CREATE_COMMENT_BUTTON_HEIGHT = 81;\n\nconst THREADING_TIME: typeof BASE_THREADING_TIME = {\n    ...BASE_THREADING_TIME,\n    units: [\n        'now',\n        'minute',\n        'hour',\n        'day',\n        'week',\n        'month',\n        'year',\n    ],\n};\n\nconst OFFSET_TO_SHOW_TOAST = -50;\nconst OVERSCAN_COUNT_FORWARD = 30;\nconst OVERSCAN_COUNT_BACKWARD = 30;\n\nclass ThreadViewerVirtualized extends PureComponent<Props, State> {\n    private mounted = false;\n    private scrollStopAction: DelayedAction;\n    postCreateContainerRef: RefObject<HTMLDivElement>;\n    listRef: RefObject<DynamicSizeList>;\n    innerRef: RefObject<HTMLDivElement>;\n    initRangeToRender: number[];\n\n    constructor(props: Props) {\n        super(props);\n\n        const postIndex = this.getInitialPostIndex();\n        const isMobile = Utils.isMobile();\n\n        this.initRangeToRender = [\n            Math.max(postIndex - 30, 0),\n            Math.max(postIndex + 30, Math.min(props.replyListIds.length - 1, 50)),\n        ];\n\n        this.listRef = React.createRef();\n        this.innerRef = React.createRef();\n        this.postCreateContainerRef = React.createRef();\n        this.scrollStopAction = new DelayedAction(this.handleScrollStop);\n\n        this.state = {\n            createCommentHeight: 0,\n            isMobile,\n            isScrolling: false,\n            userScrolled: false,\n            userScrolledToBottom: false,\n            topRhsPostId: undefined,\n        };\n    }\n\n    componentDidMount() {\n        this.mounted = true;\n        window.addEventListener('resize', this.handleWindowResize);\n    }\n\n    componentWillUnmount() {\n        this.mounted = false;\n        window.removeEventListener('resize', this.handleWindowResize);\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        const {highlightedPostId, lastPost, currentUserId} = this.props;\n\n        if (highlightedPostId && prevProps.highlightedPostId !== highlightedPostId) {\n            this.scrollToHighlightedPost();\n        } else if (\n            prevProps.lastPost.id !== lastPost.id &&\n            (lastPost.user_id === currentUserId || this.state.userScrolledToBottom)\n        ) {\n            this.scrollToBottom();\n        }\n    }\n\n    canLoadMorePosts() {}\n\n    handleWindowResize = () => {\n        const isMobile = Utils.isMobile();\n        if (isMobile !== this.state.isMobile) {\n            this.setState({\n                isMobile,\n            });\n        }\n    }\n\n    initScrollToIndex = (): {index: number; position: string; offset?: number} => {\n        const {highlightedPostId, replyListIds} = this.props;\n\n        if (highlightedPostId) {\n            const index = replyListIds.indexOf(highlightedPostId);\n            return {\n                index,\n                position: 'center',\n            };\n        }\n\n        const newMessagesSeparatorIndex = getNewMessageIndex(replyListIds);\n        if (newMessagesSeparatorIndex > 0) {\n            return {\n                index: newMessagesSeparatorIndex,\n                position: 'start',\n                offset: OFFSET_TO_SHOW_TOAST,\n            };\n        }\n\n        return {\n            index: 0,\n            position: 'end',\n        };\n    }\n\n    onScroll = ({scrollHeight, scrollUpdateWasRequested, scrollOffset, clientHeight}: OnScrollArgs) => {\n        if (scrollHeight <= 0 || scrollUpdateWasRequested) {\n            return;\n        }\n        const {createCommentHeight} = this.state;\n\n        const userScrolledToBottom = scrollHeight - scrollOffset - createCommentHeight <= clientHeight;\n\n        this.setState({\n            isScrolling: true,\n            userScrolled: true,\n            userScrolledToBottom,\n        });\n\n        this.scrollStopAction.fireAfter(Constants.SCROLL_DELAY);\n    }\n\n    updateFloatingTimestamp = (visibleTopItem: number) => {\n        if (!this.props.replyListIds) {\n            return;\n        }\n\n        this.setState({\n            topRhsPostId: getLatestPostId(this.props.replyListIds.slice(visibleTopItem)),\n        });\n    }\n\n    onItemsRendered = ({visibleStartIndex}: {visibleStartIndex: number}) => {\n        if (this.state.isMobile) {\n            this.updateFloatingTimestamp(visibleStartIndex);\n        }\n    }\n\n    getInitialPostIndex = (): number => {\n        let postIndex = 0;\n\n        if (this.props.highlightedPostId) {\n            postIndex = this.props.replyListIds.findIndex((postId) => postId === this.props.highlightedPostId);\n        } else {\n            postIndex = getNewMessageIndex(this.props.replyListIds);\n        }\n\n        return postIndex === -1 ? 0 : postIndex;\n    }\n\n    scrollToItem = (index: number, position: string, offset?: number) => {\n        if (this.listRef.current) {\n            this.listRef.current.scrollToItem(index, position, offset);\n        }\n    }\n\n    scrollToBottom = () => {\n        this.scrollToItem(0, 'end');\n    }\n\n    scrollToNewMessage = () => {\n        this.scrollToItem(getNewMessageIndex(this.props.replyListIds), 'start', OFFSET_TO_SHOW_TOAST);\n    }\n\n    scrollToHighlightedPost = () => {\n        const {highlightedPostId, replyListIds} = this.props;\n\n        if (highlightedPostId) {\n            this.scrollToItem(replyListIds.indexOf(highlightedPostId), 'center');\n        }\n    }\n\n    handleScrollStop = () => {\n        if (this.mounted) {\n            this.setState({isScrolling: false});\n        }\n    }\n\n    handleCreateCommentHeightChange = (height: number, maxHeight: number) => {\n        let createCommentHeight = height > maxHeight ? maxHeight : height;\n        createCommentHeight += CREATE_COMMENT_BUTTON_HEIGHT;\n\n        if (createCommentHeight !== this.state.createCommentHeight) {\n            this.setState({createCommentHeight});\n            if (this.state.userScrolledToBottom) {\n                this.scrollToBottom();\n            }\n        }\n    }\n\n    renderRow = ({data, itemId, style}: {data: any; itemId: any; style: any}) => {\n        const index = data.indexOf(itemId);\n        let className = '';\n        let a11yIndex = 0;\n        const basePaddingClass = 'post-row__padding';\n        const previousItemId = (index !== -1 && index < data.length - 1) ? data[index + 1] : '';\n        const nextItemId = (index > 0 && index < data.length) ? data[index - 1] : '';\n\n        if (isDateLine(nextItemId) || isStartOfNewMessages(nextItemId)) {\n            className += basePaddingClass + ' bottom';\n        }\n\n        if (isDateLine(previousItemId) || isStartOfNewMessages(previousItemId)) {\n            if (className.includes(basePaddingClass)) {\n                className += ' top';\n            } else {\n                className += basePaddingClass + ' top';\n            }\n        }\n\n        const isLastPost = itemId === this.props.lastPost.id;\n        const isRootPost = itemId === this.props.selected.id;\n\n        if (!isDateLine(itemId) && !isStartOfNewMessages(itemId) && !isCreateComment(itemId) && !isRootPost) {\n            a11yIndex++;\n        }\n\n        return (\n            <>\n                {!isCreateComment(itemId) && (\n                    <div\n                        style={style}\n                        className={className}\n                    >\n                        <Row\n                            a11yIndex={a11yIndex}\n                            currentUserId={this.props.currentUserId}\n                            isRootPost={isRootPost}\n                            isLastPost={isLastPost}\n                            listId={itemId}\n                            onCardClick={this.props.onCardClick}\n                            onCardClickPost={this.props.onCardClickPost}\n                            previousPostId={getPreviousPostId(data, index)}\n                            teamId={this.props.teamId}\n                            timestampProps={this.props.useRelativeTimestamp ? THREADING_TIME : undefined}\n                        />\n                    </div>\n                )}\n\n                {isCreateComment(itemId) && (\n                    <CreateComment\n                        focusOnMount={this.state.userScrolledToBottom || (!this.state.userScrolled && this.getInitialPostIndex() === 0)}\n                        channelId={this.props.channel.id}\n                        channelIsArchived={this.props.channel.delete_at !== 0}\n                        channelType={this.props.channel.type}\n                        isDeleted={(this.props.selected as Post).state === Posts.POST_DELETED}\n                        isFakeDeletedPost={this.props.selected.type === Constants.PostTypes.FAKE_PARENT_DELETED}\n                        latestPostId={this.props.lastPost.id}\n                        onHeightChange={this.handleCreateCommentHeightChange}\n                        ref={this.postCreateContainerRef}\n                        teammate={this.props.directTeammate}\n                        threadId={this.props.selected.id}\n                    />\n                )}\n            </>\n        );\n    };\n\n    getInnerStyles = (): React.CSSProperties|undefined => {\n        if (!this.props.useRelativeTimestamp) {\n            return {\n                paddingTop: '28px',\n            };\n        }\n\n        return undefined;\n    }\n\n    render() {\n        const {isMobile, topRhsPostId} = this.state;\n\n        return (\n            <>\n                {isMobile && topRhsPostId && !this.props.useRelativeTimestamp && (\n                    <FloatingTimestamp\n                        isMobile={true}\n                        isRhsPost={true}\n                        isScrolling={this.state.isScrolling}\n                        postId={topRhsPostId}\n                    />\n                )}\n                <div\n                    role='application'\n                    aria-label={Utils.localizeMessage('accessibility.sections.rhsContent', 'message details complimentary region')}\n                    className='post-right__content a11y__region'\n                    style={{height: '100%'}}\n                    data-a11y-sort-order='3'\n                    data-a11y-focus-child={true}\n                    data-a11y-order-reversed={true}\n                >\n                    <AutoSizer>\n                        {({width, height}) => (\n                            <DynamicSizeList\n                                canLoadMorePosts={this.canLoadMorePosts}\n                                height={height}\n                                initRangeToRender={this.initRangeToRender}\n                                initScrollToIndex={this.initScrollToIndex}\n                                innerListStyle={this.getInnerStyles()}\n                                innerRef={this.innerRef}\n                                itemData={this.props.replyListIds}\n                                onItemsRendered={this.onItemsRendered}\n                                onScroll={this.onScroll}\n                                overscanCountBackward={OVERSCAN_COUNT_BACKWARD}\n                                overscanCountForward={OVERSCAN_COUNT_FORWARD}\n                                ref={this.listRef}\n                                style={virtListStyles}\n                                width={width}\n                            >\n                                {this.renderRow}\n                            </DynamicSizeList>\n                        )}\n                    </AutoSizer>\n                </div>\n            </>\n        );\n    }\n}\n\nexport default ThreadViewerVirtualized;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {getDirectTeammate} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/common';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {$ID} from 'mattermost-redux/types/utilities';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {Post} from 'mattermost-redux/types/posts';\n\nimport {FakePost} from 'types/store/rhs';\n\nimport {makePrepareReplyIdsForThreadViewer, makeGetThreadLastViewedAt} from 'selectors/views/threads';\n\nimport {GlobalState} from 'types/store';\n\nimport ThreadViewerVirtualized from './virtualized_thread_viewer';\n\ntype OwnProps = {\n    channel: Channel;\n    openTime: number;\n    postIds: Array<$ID<Post | FakePost>>;\n    selected: Post | FakePost;\n    useRelativeTimestamp: boolean;\n}\n\nfunction makeMapStateToProps() {\n    const getRepliesListWithSeparators = makePrepareReplyIdsForThreadViewer();\n    const getThreadLastViewedAt = makeGetThreadLastViewedAt();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        const {postIds, useRelativeTimestamp, selected, channel} = ownProps;\n\n        const collapsedThreads = isCollapsedThreadsEnabled(state);\n        const currentUserId = getCurrentUserId(state);\n        const lastViewedAt = getThreadLastViewedAt(state, selected.id);\n        const directTeammate = getDirectTeammate(state, channel.id);\n\n        const lastPost = getPost(state, postIds[0]);\n\n        const replyListIds = getRepliesListWithSeparators(state, {\n            postIds,\n            showDate: !useRelativeTimestamp,\n            lastViewedAt: collapsedThreads ? lastViewedAt : undefined,\n        });\n\n        return {\n            currentUserId,\n            directTeammate,\n            lastPost,\n            replyListIds,\n            teamId: channel.team_id,\n        };\n    };\n}\n\nexport default connect(makeMapStateToProps)(ThreadViewerVirtualized);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/* eslint-disable max-lines */\n\nimport React, {HTMLAttributes} from 'react';\nimport classNames from 'classnames';\n\nimport {ActionFunc} from 'mattermost-redux/types/actions';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {ExtendedPost} from 'mattermost-redux/actions/posts';\nimport {Post} from 'mattermost-redux/types/posts';\nimport {UserThread} from 'mattermost-redux/types/threads';\nimport {$ID} from 'mattermost-redux/types/utilities';\n\nimport deferComponentRender from 'components/deferComponentRender';\nimport LoadingScreen from 'components/loading_screen';\nimport {FakePost} from 'types/store/rhs';\nimport ThreadViewerVirtualized from '../virtualized_thread_viewer';\n\nimport './thread_viewer.scss';\n\nconst DeferredThreadViewerVirt = deferComponentRender(ThreadViewerVirtualized);\n\ntype Attrs = Pick<HTMLAttributes<HTMLDivElement>, 'className' | 'id'>;\n\ntype Props = Attrs & {\n    isCollapsedThreadsEnabled: boolean;\n    userThread?: UserThread | null;\n    channel: Channel | null;\n    selected: Post | FakePost;\n    previousRhsState?: string;\n    currentUserId: string;\n    currentTeamId: string;\n    socketConnectionStatus: boolean;\n    actions: {\n        removePost: (post: ExtendedPost) => void;\n        selectPostCard: (post: Post) => void;\n        getPostThread: (rootId: string, root?: boolean) => Promise<any>|ActionFunc;\n        getThread: (userId: string, teamId: string, threadId: string, extended: boolean) => Promise<any>|ActionFunc;\n        updateThreadRead: (userId: string, teamId: string, threadId: string, timestamp: number) => unknown;\n        updateThreadLastOpened: (threadId: string, lastViewedAt: number) => unknown;\n    };\n    useRelativeTimestamp?: boolean;\n    postIds: string[];\n    highlightedPostId?: $ID<Post>;\n};\n\ntype State = {\n    isLoading: boolean;\n}\n\nexport default class ThreadViewer extends React.PureComponent<Props, State> {\n    public constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            isLoading: false,\n        };\n    }\n\n    public componentDidMount() {\n        if (this.props.isCollapsedThreadsEnabled && this.props.userThread !== null) {\n            this.markThreadRead();\n        }\n\n        this.onInit();\n    }\n\n    public componentDidUpdate(prevProps: Props) {\n        const reconnected = this.props.socketConnectionStatus && !prevProps.socketConnectionStatus;\n        const selectedChanged = this.props.selected && this.props.selected.id !== prevProps.selected?.id;\n\n        if (reconnected || selectedChanged) {\n            this.onInit(reconnected);\n        }\n\n        if (\n            this.props.isCollapsedThreadsEnabled &&\n            this.props.userThread?.id !== prevProps.userThread?.id\n        ) {\n            this.markThreadRead();\n        }\n    }\n\n    public morePostsToFetch(): boolean {\n        const replyCount = this.getReplyCount();\n        return this.props.selected && this.props.postIds.length < (replyCount + 1);\n    }\n\n    public getReplyCount(): number {\n        return (this.props.selected as Post)?.reply_count || this.props.userThread?.reply_count || 0;\n    }\n\n    fetchThread() {\n        const {\n            actions: {\n                getThread,\n            },\n            currentUserId,\n            currentTeamId,\n            selected,\n        } = this.props;\n\n        if (selected && this.getReplyCount() && (this.props.selected as Post)?.is_following) {\n            return getThread(\n                currentUserId,\n                currentTeamId,\n                selected.id,\n                true,\n            );\n        }\n\n        return Promise.resolve({data: true});\n    }\n\n    markThreadRead() {\n        if (this.props.userThread) {\n            // update last viewed at for thread before marking as read.\n            this.props.actions.updateThreadLastOpened(\n                this.props.userThread.id,\n                this.props.userThread.last_viewed_at,\n            );\n\n            if (\n                this.props.userThread.last_viewed_at < this.props.userThread.last_reply_at ||\n                this.props.userThread.unread_mentions ||\n                this.props.userThread.unread_replies\n            ) {\n                this.props.actions.updateThreadRead(\n                    this.props.currentUserId,\n                    this.props.currentTeamId,\n                    this.props.selected.id,\n                    Date.now(),\n                );\n            }\n        }\n    }\n\n    // called either after mount, socket reconnected, or selected thread changed\n    // fetches the thread/posts if needed and\n    // scrolls to either bottom or new messages line\n    private onInit = async (reconnected = false): Promise<void> => {\n        if (reconnected || this.morePostsToFetch()) {\n            this.setState({isLoading: !reconnected});\n            await this.props.actions.getPostThread(this.props.selected.id, !reconnected);\n        }\n\n        if (\n            this.props.isCollapsedThreadsEnabled &&\n            this.props.userThread == null\n        ) {\n            this.setState({isLoading: !reconnected});\n            await this.fetchThread();\n        }\n\n        this.setState({isLoading: false});\n    }\n\n    private handleCardClick = (post: Post) => {\n        if (!post) {\n            return;\n        }\n\n        this.props.actions.selectPostCard(post);\n    }\n\n    private handleCardClickPost = (post: Post) => {\n        if (!post) {\n            return;\n        }\n\n        this.props.actions.selectPostCard(post);\n    }\n\n    public render(): JSX.Element {\n        if (this.props.postIds == null || this.props.selected == null || !this.props.channel) {\n            return (\n                <span/>\n            );\n        }\n\n        if (this.state.isLoading) {\n            return (\n                <LoadingScreen\n                    style={{\n                        display: 'grid',\n                        placeContent: 'center',\n                        flex: '1',\n                    }}\n                />\n            );\n        }\n\n        return (\n            <>\n                <div className={classNames('ThreadViewer', this.props.className)}>\n                    <div className='post-right-comments-container'>\n                        {this.props.selected && (\n                            <DeferredThreadViewerVirt\n                                key={this.props.selected.id}\n                                channel={this.props.channel}\n                                onCardClick={this.handleCardClick}\n                                onCardClickPost={this.handleCardClickPost}\n                                postIds={this.props.postIds}\n                                removePost={this.props.actions.removePost}\n                                selected={this.props.selected}\n                                useRelativeTimestamp={this.props.useRelativeTimestamp || false}\n                                highlightedPostId={this.props.highlightedPostId}\n                            />\n                        )}\n                    </div>\n                </div>\n            </>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {makeGetChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getPost, makeGetPostIdsForThread} from 'mattermost-redux/selectors/entities/posts';\nimport {getThread} from 'mattermost-redux/selectors/entities/threads';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {removePost, getPostThread} from 'mattermost-redux/actions/posts';\nimport {getThread as fetchThread, updateThreadRead} from 'mattermost-redux/actions/threads';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\nimport {UserThread} from 'mattermost-redux/types/threads';\nimport {Channel} from 'mattermost-redux/types/channels';\n\nimport {getSocketStatus} from 'selectors/views/websocket';\nimport {selectPostCard} from 'actions/views/rhs';\nimport {getHighlightedPostId} from 'selectors/rhs';\nimport {updateThreadLastOpened} from 'actions/views/threads';\nimport {GlobalState} from 'types/store';\n\nimport ThreadViewer from './thread_viewer';\n\ntype OwnProps = {\n    rootPostId: string;\n};\n\nfunction makeMapStateToProps() {\n    const getPostIdsForThread = makeGetPostIdsForThread();\n    const getChannel = makeGetChannel();\n\n    return function mapStateToProps(state: GlobalState, {rootPostId}: OwnProps) {\n        const currentUserId = getCurrentUserId(state);\n        const currentTeamId = getCurrentTeamId(state);\n        const selected = getPost(state, rootPostId);\n        const socketStatus = getSocketStatus(state);\n        const highlightedPostId = getHighlightedPostId(state);\n\n        let postIds: string[] = [];\n        let userThread: UserThread | null = null;\n        let channel: Channel | null = null;\n\n        if (selected) {\n            postIds = getPostIdsForThread(state, selected.id);\n            userThread = getThread(state, selected.id);\n            channel = getChannel(state, {id: selected.channel_id});\n        }\n\n        return {\n            isCollapsedThreadsEnabled: isCollapsedThreadsEnabled(state),\n            currentUserId,\n            currentTeamId,\n            userThread,\n            selected,\n            postIds,\n            socketConnectionStatus: socketStatus.connected,\n            channel,\n            highlightedPostId,\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators({\n            removePost,\n            getPostThread,\n            selectPostCard,\n            getThread: fetchThread,\n            updateThreadRead,\n            updateThreadLastOpened,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(ThreadViewer);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\ntype ResolvableFunction<TVal, TArg, TArg2> = (arg: TArg, arg2: TArg2) => TVal;\n\nexport type Resolvable<TVal, TArg = undefined, TArg2 = undefined> = ResolvableFunction<TVal, TArg, TArg2> | TVal;\n\nexport function resolve<TVal, TArg = undefined, TArg2 = undefined>(\n    prop: Resolvable<TVal, TArg, TArg2>,\n    arg: TArg,\n    arg2: TArg2,\n): TVal {\n    return typeof prop === 'function' ? (prop as ResolvableFunction<TVal, TArg, TArg2>)(arg, arg2) : prop;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {FC, ReactNode, memo, TimeHTMLAttributes} from 'react';\n\nexport type Props = {\n    value: Date;\n    children?: ReactNode;\n} & TimeHTMLAttributes<HTMLTimeElement>;\n\nconst SemanticTime: FC<Props> = ({\n    value,\n    children,\n    'aria-label': label = value.toLocaleString(),\n    ...props\n}: Props) => {\n    return (\n        <time\n            {...props}\n            aria-label={label}\n            dateTime={value.toISOString()}\n        >\n            {children}\n        </time>\n    );\n};\n\nexport default memo(SemanticTime);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Unit} from '@formatjs/intl-relativetimeformat';\n\nimport {RangeDescriptor} from './timestamp';\n\nexport const TODAY_YESTERDAY: RangeDescriptor = {\n    within: ['day', -1],\n    display: ['day'],\n};\n\nexport const TODAY_TITLE_CASE: RangeDescriptor = {\n    equals: ['day', 0],\n    display: (\n        <FormattedMessage\n            id='date_separator.today'\n            defaultMessage='Today'\n        />\n    ),\n};\n\nexport const YESTERDAY_TITLE_CASE: RangeDescriptor = {\n    equals: ['day', -1],\n    display: (\n        <FormattedMessage\n            id='date_separator.yesterday'\n            defaultMessage='Yesterday'\n        />\n    ),\n};\n\nexport const TOMORROW_TITLE_CASE: RangeDescriptor = {\n    equals: ['day', 1],\n    display: (\n        <FormattedMessage\n            id='date_separator.tomorrow'\n            defaultMessage='Tomorrow'\n        />\n    ),\n};\n\nexport const STANDARD_UNITS: {[key in Unit]: RangeDescriptor} & {[key: string]: RangeDescriptor} = {\n    now: {within: ['second', -45], display: ['second', 0]},\n    second: {within: ['second', -59], display: ['second']},\n    minute: {within: ['minute', -59], display: ['minute']},\n    hour: {within: ['hour', -23.75], display: ['hour']},\n    'today-yesterday': TODAY_YESTERDAY,\n    Today: TODAY_TITLE_CASE,\n    Yesterday: YESTERDAY_TITLE_CASE,\n    day: {within: ['day', -6], display: ['day']},\n    week: {within: ['week', -3], display: ['week']},\n    month: {within: ['month', -11], display: ['month']},\n    quarter: {within: ['quarter', -3], display: ['quarter']},\n    year: {within: ['year', -1000], display: ['year']},\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent, ReactNode} from 'react';\nimport {\n    injectIntl,\n    IntlShape,\n    FormatDateOptions,\n    FormatRelativeTimeOptions,\n    FormattedMessage,\n} from 'react-intl';\nimport {isValidElementType} from 'react-is';\nimport {Unit} from '@formatjs/intl-relativetimeformat';\nimport moment, {Moment} from 'moment-timezone';\nimport {capitalize as caps, isArray} from 'lodash';\n\nimport {isSameYear, isWithin, isEqual, getDiff} from 'utils/datetime';\nimport {Resolvable, resolve} from 'utils/resolvable';\nimport {RequireOnlyOne} from 'utils/conditional_types';\n\nimport SemanticTime from './semantic_time';\n\nimport {STANDARD_UNITS} from './relative_ranges';\n\n// Feature test the browser for support of hourCycle.\n// Note that Intl.DateTimeFormatOptions typings are stale and do not have definitions of hourCycle, dateStyle, etc..\n// See https://github.com/microsoft/TypeScript/issues/34399\nexport const supportsHourCycle = Boolean(((new Intl.DateTimeFormat('en-US', {hour: 'numeric'})).resolvedOptions() as DateTimeOptions).hourCycle);\n\nexport type DateTimeOptions = FormatDateOptions & {\n    hourCycle?: string;\n}\n\nfunction is12HourTime(hourCycle: DateTimeOptions['hourCycle'], hour12?: DateTimeOptions['hour12']) {\n    return hour12 ?? !(hourCycle === 'h23' || hourCycle === 'h24');\n}\n\nexport type RelativeOptions = FormatRelativeTimeOptions & {\n    unit: Unit;\n    relNearest?: number;\n    truncateEndpoints?: boolean;\n    updateIntervalInSeconds?: number;\n    capitalize?: boolean;\n}\n\nfunction isRelative(format: ResolvedFormats['relative']): format is RelativeOptions {\n    return Boolean((format as RelativeOptions)?.unit);\n}\n\nexport type SimpleRelativeOptions = {\n    message: ReactNode;\n    updateIntervalInSeconds?: number;\n}\n\nfunction isSimpleRelative(format: unknown): format is SimpleRelativeOptions {\n    return (format as SimpleRelativeOptions)?.message != null;\n}\n\nconst defaultRefreshIntervals = new Map<Unit, number /* seconds */>([\n    ['hour', 60 * 5],\n    ['minute', 15],\n    ['second', 1],\n]);\n\ntype UnitDescriptor = [Unit, number?, boolean?];\n\nfunction isUnitDescriptor(unit: unknown): unit is UnitDescriptor {\n    return isArray(unit) && typeof unit[0] === 'string';\n}\n\ntype Breakpoint = RequireOnlyOne<{\n    within: UnitDescriptor;\n    equals: UnitDescriptor;\n}>\n\ntype DisplayAs = {\n    display: UnitDescriptor | ReactNode;\n    updateIntervalInSeconds?: number;\n    capitalize?: boolean;\n}\n\nexport type RangeDescriptor = Breakpoint & DisplayAs;\n\nfunction normalizeRangeDescriptor(unit: NonNullable<Props['units']>[number]): RangeDescriptor {\n    if (typeof unit === 'string' || typeof unit === 'number') {\n        return STANDARD_UNITS[unit];\n    }\n    if (isUnitDescriptor(unit)) {\n        const [u, n] = unit;\n        return {within: [u, n], display: [u]};\n    }\n    return unit;\n}\n\nexport type ResolvedFormats = {\n    relative: RelativeOptions | SimpleRelativeOptions | false;\n    date: DateTimeOptions | false;\n    time: DateTimeOptions | false;\n}\n\ntype FormattedParts = {\n    relative?: ReactNode;\n    date?: ReactNode;\n    time?: ReactNode;\n}\n\ntype FormatOptions = DateTimeOptions & Partial<RelativeOptions>;\n\nexport type Props = FormatOptions & {\n    value?: ConstructorParameters<typeof Date>[0];\n\n    useRelative?: Resolvable<ResolvedFormats['relative'], {value: Date}, FormatOptions>;\n    units?: Array<RangeDescriptor | UnitDescriptor | Unit | keyof typeof STANDARD_UNITS>;\n    ranges?: Props['units'];\n    useDate?: Resolvable<Exclude<ResolvedFormats['date'], 'timeZone'> | false, {value: Date}, FormatOptions>;\n    useTime?: Resolvable<Exclude<ResolvedFormats['time'], 'timeZone' | 'hourCycle' | 'hour12'> | false, {value: Date}, FormatOptions>;\n\n    children?: Resolvable<ReactNode, {value: Date; timeZone: DateTimeOptions['timeZone']; formatted: ReactNode} & FormattedParts, ResolvedFormats>;\n    className?: string;\n    label?: string;\n    useSemanticOutput?: boolean;\n\n    intl: IntlShape;\n}\n\ntype State = {\n    now: Date;\n    prevValue: Props['value'];\n}\n\n/**\n * A feature-rich, react-intl oriented wrapper around Intl.DateTimeFormat and Intl.RelativeTimeFormat.\n *\n * If (for some odd reason) Intl.DateTimeFormat does not support the specified timezone, Moment will be used as a fallback formatter.\n * This fallback implementation only supports the following non-localized formats:\n *\n * TIME:\n * - `h:mm A`\n * - `HH:mm`\n *\n * DATE:\n * - `dddd`\n * - `MMMM DD`\n * - `MMMM DD, YYYY`\n * - `dddd, MMMM DD, YYYY`\n *\n * `DateTimeOptions.hourCycle` is preferred over `DateTimeOptions.hour12`.\n *\n * `hour12` will override the specified `hourCycle` and will defer to the default locale `hourCycle`.\n * This might result in `H24` behavior. (See https://github.com/formatjs/formatjs/issues/1577)\n *\n * @remarks Fallback-formatting should be rare, as `Intl.DateTimeFormat` (in Chrome, Safari, FF, and Edge) supports all timezones that are supported by `moment-timezone`.\n */\nclass Timestamp extends PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            now: new Date(),\n            prevValue: props.value,\n        };\n    }\n\n    static defaultProps: Partial<Props> = {\n\n        // relative\n        numeric: 'auto',\n        style: 'long',\n        relNearest: 1,\n\n        // fixed\n        year: 'numeric',\n        month: 'long',\n        day: '2-digit',\n        weekday: 'long',\n        hour: 'numeric',\n        minute: 'numeric',\n        second: 'numeric',\n        hourCycle: 'h12',\n        timeZoneName: 'short',\n    }\n    nextUpdate: ReturnType<typeof setTimeout> | null = null;\n\n    formatParts(value: Date, {relative: relFormat, date: dateFormat, time: timeFormat}: ResolvedFormats): FormattedParts {\n        try {\n            let relative: FormattedParts['relative'];\n            let date: FormattedParts['date'];\n            let time: FormattedParts['time'];\n\n            if (isSimpleRelative(relFormat)) {\n                relative = relFormat.message;\n            } else if (isRelative(relFormat)) {\n                relative = this.formatRelative(value, relFormat);\n\n                if (relFormat.unit !== 'day' || !timeFormat) {\n                    return {relative};\n                }\n            }\n\n            if (relative == null && dateFormat) {\n                date = this.formatDateTime(value, dateFormat);\n            }\n\n            if (timeFormat) {\n                const {\n                    hourCycle,\n                    hour12 = supportsHourCycle ? undefined : is12HourTime(hourCycle),\n                } = this.props;\n\n                time = this.formatDateTime(value, {hourCycle, hour12, ...timeFormat});\n            }\n\n            return {relative, date, time};\n        } catch {\n            // fallback to moment for unsupported timezones\n            const {timeZone, hourCycle, hour12} = this.props;\n\n            const momentValue = moment.utc(value.getTime());\n\n            if (timeZone) {\n                momentValue.tz(timeZone);\n            }\n\n            return {\n                date: dateFormat && Timestamp.momentDate(momentValue, {...dateFormat}),\n                time: timeFormat && Timestamp.momentTime(momentValue, {hourCycle, hour12, ...timeFormat}),\n            };\n        }\n    }\n\n    formatRelative(value: Date, {unit, relNearest, truncateEndpoints, ...format}: RelativeOptions): string {\n        let diff: number;\n\n        if (relNearest === 0) {\n            diff = 0;\n        } else {\n            diff = getDiff(value, this.state.now, this.props.timeZone, unit, truncateEndpoints);\n            if (relNearest != null) {\n                diff = Math.round(diff / relNearest) * relNearest;\n            }\n        }\n\n        if (diff === 0) {\n            diff = value <= this.state.now ? -0 : +0;\n        }\n\n        const rel = this.props.intl.formatRelativeTime(diff, unit, format);\n        return format.capitalize ? caps(rel) : rel;\n    }\n\n    formatDateTime(value: Date, format: DateTimeOptions): string {\n        const {timeZone, intl: {locale}} = this.props;\n\n        return (new Intl.DateTimeFormat(locale, {timeZone, ...format} as any)).format(value); // TODO remove any when React-Intl is next updated\n    }\n\n    static momentTime(value: Moment, {hour, minute, hourCycle, hour12}: DateTimeOptions): string | undefined {\n        if (hour && minute) {\n            return value.format(is12HourTime(hourCycle, hour12) ? 'h:mm A' : 'HH:mm');\n        }\n        return undefined;\n    }\n\n    static momentDate(value: Moment, {weekday, day, month, year}: DateTimeOptions): string | undefined {\n        if (weekday && day && month && year) {\n            return value.format('dddd, MMMM DD, YYYY');\n        } else if (day && month && year) {\n            return value.format('MMMM DD, YYYY');\n        } else if (day && month) {\n            return value.format('MMMM DD');\n        } else if (weekday) {\n            return value.format('dddd');\n        }\n        return undefined;\n    }\n\n    autoRange(value: Date, units: Props['units'] = (this.props.units || this.props.ranges)): DisplayAs {\n        return units?.map(normalizeRangeDescriptor).find(({equals, within}) => {\n            if (equals != null) {\n                return isEqual(value, this.state.now, this.props.timeZone, ...equals);\n            }\n            if (within != null) {\n                return isWithin(value, this.state.now, this.props.timeZone, ...within);\n            }\n            return false;\n        }) ?? {\n            display: [this.props.unit],\n            updateIntervalInSeconds: this.props.updateIntervalInSeconds,\n        };\n    }\n\n    private getFormats(value: Date): ResolvedFormats {\n        const {\n            numeric,\n            style,\n            useRelative = (): ResolvedFormats['relative'] => {\n                const {\n                    display,\n                    updateIntervalInSeconds = this.props.updateIntervalInSeconds,\n                    capitalize = this.props.capitalize,\n                } = this.autoRange(value);\n\n                if (display) {\n                    if (isValidElementType(display) || !Array.isArray(display)) {\n                        return {\n                            message: display,\n                            updateIntervalInSeconds,\n                        };\n                    }\n\n                    const [\n                        unit,\n                        relNearest = this.props.relNearest,\n                        truncateEndpoints = this.props.truncateEndpoints,\n                    ] = display as UnitDescriptor;\n\n                    if (unit) {\n                        return {\n                            unit,\n                            relNearest,\n                            truncateEndpoints,\n                            numeric,\n                            style,\n                            updateIntervalInSeconds: updateIntervalInSeconds ?? defaultRefreshIntervals.get(unit),\n                            capitalize,\n                        };\n                    }\n                }\n\n                return false;\n            },\n            year,\n            month,\n            day,\n            weekday,\n            hour,\n            minute,\n            timeZone,\n            useDate = (): ResolvedFormats['date'] => {\n                if (isWithin(value, this.state.now, timeZone, 'day', -6)) {\n                    return {weekday};\n                }\n                if (isSameYear(value)) {\n                    return {day, month};\n                }\n\n                return {year, month, day};\n            },\n            useTime = {hour, minute},\n        } = this.props;\n\n        const relative = resolve(useRelative, {value}, this.props);\n        const date = !relative && resolve(useDate, {value}, this.props);\n        const time = resolve(useTime, {value}, this.props);\n\n        return {relative, date, time};\n    }\n\n    componentWillUnmount() {\n        if (this.nextUpdate) {\n            clearTimeout(this.nextUpdate);\n            this.nextUpdate = null;\n        }\n    }\n\n    static getDerivedStateFromProps(props: Props, state: State) {\n        if (props.value !== state.prevValue) {\n            return ({now: new Date(), prevValue: props.value});\n        }\n\n        return null;\n    }\n\n    private maybeUpdate(relative: ResolvedFormats['relative']): ReturnType<typeof setTimeout> | null {\n        if (!relative ||\n            !relative.updateIntervalInSeconds) {\n            return null;\n        }\n        return setTimeout(() => this.setState({now: new Date()}), relative.updateIntervalInSeconds * 1000);\n    }\n\n    static format({relative, date, time}: FormattedParts): ReactNode {\n        return (relative || date) && time ? (\n            <FormattedMessage\n                id='timestamp.datetime'\n                defaultMessage='{relativeOrDate} at {time}'\n                values={{\n                    relativeOrDate: relative || date,\n                    time,\n                }}\n            />\n        ) : relative || date || time;\n    }\n\n    static formatLabel(value: Date, timeZone?: string) {\n        const momentValue = moment(value);\n\n        if (timeZone) {\n            momentValue.tz(timeZone);\n        }\n\n        return momentValue.toString() + (timeZone ? ` (${momentValue.tz()})` : '');\n    }\n\n    render() {\n        const {\n            value: unparsed = this.state.now,\n            children,\n            useSemanticOutput = true,\n            timeZone,\n            label,\n            className,\n        } = this.props;\n\n        const value = unparsed instanceof Date ? unparsed : new Date(unparsed);\n        const formats = this.getFormats(value);\n        const parts = this.formatParts(value, formats);\n        let formatted = Timestamp.format(parts);\n\n        if (useSemanticOutput) {\n            formatted = (\n                <SemanticTime\n                    value={value}\n                    aria-label={label ?? Timestamp.formatLabel(value, timeZone)}\n                    className={className}\n                >\n                    {formatted}\n                </SemanticTime>\n            );\n        }\n\n        this.nextUpdate = this.maybeUpdate(formats.relative);\n\n        if (children) {\n            return resolve(children, {value, timeZone, formatted, ...parts}, formats);\n        }\n\n        return formatted;\n    }\n}\n\nexport default injectIntl(Timestamp);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getUserTimezone} from 'mattermost-redux/selectors/entities/timezone';\nimport {getUserCurrentTimezone} from 'mattermost-redux/utils/timezone_utils';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {UserTimezone} from 'mattermost-redux/types/users';\n\nimport {areTimezonesEnabledAndSupported} from 'selectors/general';\n\nimport {GlobalState} from 'types/store';\n\nimport {Preferences} from 'utils/constants';\n\nimport Timestamp, {Props as TimestampProps, supportsHourCycle} from './timestamp';\n\ntype Props = {\n    userTimezone?: UserTimezone;\n}\n\nfunction mapStateToProps(state: GlobalState, {userTimezone}: Props) {\n    const currentUserId = getCurrentUserId(state);\n\n    let timeZone: TimestampProps['timeZone'];\n    let hourCycle: TimestampProps['hourCycle'];\n    let hour12: TimestampProps['hour12'];\n\n    if (areTimezonesEnabledAndSupported(state)) {\n        timeZone = getUserCurrentTimezone(userTimezone ?? getUserTimezone(state, currentUserId)) ?? undefined;\n    }\n\n    const useMilitaryTime = getBool(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.USE_MILITARY_TIME, false);\n\n    if (supportsHourCycle) {\n        hourCycle = useMilitaryTime ? 'h23' : 'h12';\n    } else {\n        hour12 = !useMilitaryTime;\n    }\n\n    return {timeZone, hourCycle, hour12};\n}\n\nexport default connect(mapStateToProps)(Timestamp);\n\nexport {default as SemanticTime} from './semantic_time';\nimport * as RelativeRanges from './relative_ranges';\nexport {RelativeRanges};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nexport default class ModalToggleButton extends React.PureComponent {\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            show: false,\n        };\n    }\n\n    show = (e) => {\n        if (e) {\n            e.preventDefault();\n        }\n        this.setState({show: true});\n    }\n\n    hide = () => {\n        this.setState({show: false});\n    }\n\n    render() {\n        const {children, dialogType, dialogProps, onClick, isDisabled, id, ...props} = this.props;\n\n        // allow callers to provide an onClick which will be called before the modal is shown\n        let clickHandler = this.show;\n        if (onClick) {\n            clickHandler = (e) => {\n                onClick();\n\n                this.show(e);\n            };\n        }\n\n        let dialog;\n        if (this.state.show) {\n            // this assumes that all modals will have an onHide event and will show when mounted\n            dialog = React.createElement(dialogType, Object.assign({}, dialogProps, {\n                onHide: () => {\n                    this.hide();\n\n                    if (dialogProps.onHide) {\n                        dialogProps.onHide();\n                    }\n                },\n            }));\n        }\n\n        // nesting the dialog in the anchor tag looks like it shouldn't work, but it does due to how react-bootstrap\n        // renders modals at the top level of the DOM instead of where you specify in the virtual DOM\n        return (\n            <button\n                {...props}\n                className={'style--none ' + props.className}\n                onClick={clickHandler}\n                data-testid={id}\n                disabled={isDisabled}\n            >\n                {children}\n                {dialog}\n            </button>\n        );\n    }\n}\n\nModalToggleButton.propTypes = {\n    children: PropTypes.node.isRequired,\n    dialogType: PropTypes.any.isRequired,\n    dialogProps: PropTypes.object,\n    onClick: PropTypes.func,\n    className: PropTypes.string,\n    id: PropTypes.string,\n    isDisabled: PropTypes.bool,\n};\n\nModalToggleButton.defaultProps = {\n    dialogProps: {},\n    className: '',\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport {injectIntl} from 'react-intl';\n\nimport {intlShape} from 'utils/react_intl';\n\nclass ModalToggleButtonRedux extends React.PureComponent {\n    static propTypes = {\n        ariaLabel: PropTypes.string,\n        children: PropTypes.node.isRequired,\n        modalId: PropTypes.string.isRequired,\n        dialogType: PropTypes.elementType.isRequired,\n        dialogProps: PropTypes.object,\n        intl: intlShape.isRequired,\n        onClick: PropTypes.func,\n        className: PropTypes.string,\n        showUnread: PropTypes.bool,\n        actions: PropTypes.shape({\n            openModal: PropTypes.func.isRequired,\n        }).isRequired,\n    };\n\n    static defaultProps = {\n        dialogProps: {},\n        className: '',\n    };\n\n    show(e) {\n        if (e) {\n            e.preventDefault();\n        }\n\n        const {modalId, dialogProps, dialogType} = this.props;\n\n        const modalData = {\n            modalId,\n            dialogProps,\n            dialogType,\n        };\n\n        this.props.actions.openModal(modalData);\n    }\n\n    render() {\n        const {\n            children,\n            onClick,\n            intl: {\n                formatMessage,\n            },\n            ...props\n        } = this.props;\n\n        const ariaLabel = formatMessage({id: 'accessibility.button.dialog', defaultMessage: '{dialogName} dialog'}, {dialogName: props.ariaLabel});\n\n        let badge = null;\n        if (this.props.showUnread) {\n            badge = (\n                <span className={'unread-badge'}/>\n            );\n        }\n\n        // removing these three props since they are not valid props on buttons\n        delete props.modalId;\n        delete props.dialogType;\n        delete props.dialogProps;\n        delete props.ariaLabel;\n        delete props.actions;\n        delete props.showUnread;\n\n        // allow callers to provide an onClick which will be called before the modal is shown\n        let clickHandler = () => this.show();\n        if (onClick) {\n            clickHandler = (e) => {\n                onClick();\n\n                this.show(e);\n            };\n        }\n\n        return (\n            <button\n                {...props}\n                className={'style--none ' + props.className}\n                data-toggle='modal toggle'\n                aria-label={ariaLabel}\n                onClick={clickHandler}\n            >\n                {children}\n                {badge}\n            </button>\n        );\n    }\n}\n\nexport default injectIntl(ModalToggleButtonRedux);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {openModal} from 'actions/views/modals';\n\nimport ModalToggleButtonRedux from './toggle_modal_button_redux.jsx';\n\nfunction mapDispatchToProps(dispatch) {\n    return {\n        actions: bindActionCreators({\n            openModal,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(ModalToggleButtonRedux);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getUser, makeGetDisplayName} from 'mattermost-redux/selectors/entities/users';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport UserProfile from './user_profile';\n\ntype OwnProps = {\n    userId: string;\n}\n\nfunction makeMapStateToProps() {\n    const getDisplayName = makeGetDisplayName();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        const user = getUser(state, ownProps.userId);\n\n        return {\n            displayName: getDisplayName(state, ownProps.userId, true),\n            user,\n            isShared: Boolean(user && user.remote_id),\n        };\n    };\n}\n\nexport default connect(makeMapStateToProps)(UserProfile);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent} from 'react';\n\nimport {UserProfile as UserProfileType} from 'mattermost-redux/types/users';\n\nimport {imageURLForUser, isMobile, isGuest} from 'utils/utils.jsx';\n\nimport OverlayTrigger, {BaseOverlayTrigger} from 'components/overlay_trigger';\nimport ProfilePopover from 'components/profile_popover';\nimport BotBadge from 'components/widgets/badges/bot_badge';\nimport GuestBadge from 'components/widgets/badges/guest_badge';\nimport SharedUserIndicator from 'components/shared_user_indicator';\n\nexport type UserProfileProps = {\n    userId: string;\n    displayName?: string;\n    isBusy?: boolean;\n    isShared?: boolean;\n    overwriteName?: React.ReactNode;\n    overwriteIcon?: string;\n    user?: UserProfileType;\n    disablePopover?: boolean;\n    displayUsername?: boolean;\n    hasMention?: boolean;\n    hideStatus?: boolean;\n    isRHS?: boolean;\n    overwriteImage?: React.ReactNode;\n    channelId?: string;\n}\n\nexport default class UserProfile extends PureComponent<UserProfileProps> {\n    private overlay?: BaseOverlayTrigger;\n\n    static defaultProps: Partial<UserProfileProps> = {\n        disablePopover: false,\n        displayUsername: false,\n        hasMention: false,\n        hideStatus: false,\n        isRHS: false,\n        overwriteImage: '',\n        overwriteName: '',\n    }\n\n    hideProfilePopover = (): void => {\n        if (this.overlay) {\n            this.overlay.hide();\n        }\n    }\n\n    setOverlaynRef = (ref: BaseOverlayTrigger): void => {\n        this.overlay = ref;\n    }\n\n    render(): React.ReactNode {\n        const {\n            disablePopover,\n            displayName,\n            displayUsername,\n            isBusy,\n            isRHS,\n            isShared,\n            hasMention,\n            hideStatus,\n            overwriteName,\n            overwriteIcon,\n            user,\n            userId,\n            channelId,\n        } = this.props;\n\n        let name: React.ReactNode;\n        if (user && displayUsername) {\n            name = `@${(user.username)}`;\n        } else {\n            name = overwriteName || displayName || '...';\n        }\n\n        const ariaName: string = typeof name === 'string' ? name.toLowerCase() : '';\n\n        if (disablePopover) {\n            return <div className='user-popover'>{name}</div>;\n        }\n\n        let placement = 'right';\n        if (isRHS && !isMobile()) {\n            placement = 'left';\n        }\n\n        let profileImg = '';\n        if (user) {\n            profileImg = imageURLForUser(user.id, user.last_picture_update);\n        }\n\n        let sharedIcon;\n        if (isShared) {\n            sharedIcon = (\n                <SharedUserIndicator\n                    className='shared-user-icon'\n                    withTooltip={true}\n                />\n            );\n        }\n\n        return (\n            <React.Fragment>\n                <OverlayTrigger\n                    ref={this.setOverlaynRef}\n                    trigger='click'\n                    placement={placement}\n                    rootClose={true}\n                    overlay={\n                        <ProfilePopover\n                            className='user-profile-popover'\n                            userId={userId}\n                            channelId={channelId}\n                            src={profileImg}\n                            isBusy={isBusy}\n                            hide={this.hideProfilePopover}\n                            hideStatus={hideStatus}\n                            isRHS={isRHS}\n                            hasMention={hasMention}\n                            overwriteName={overwriteName}\n                            overwriteIcon={overwriteIcon}\n                        />\n                    }\n                >\n                    <button\n                        aria-label={ariaName}\n                        className='user-popover style--none'\n                    >\n                        {name}\n                    </button>\n                </OverlayTrigger>\n                {sharedIcon}\n                <BotBadge\n                    show={Boolean(user && user.is_bot)}\n                    className='badge-popoverlist'\n                />\n                <GuestBadge\n                    show={Boolean(user && isGuest(user))}\n                    className='badge-popoverlist'\n                />\n            </React.Fragment>\n        );\n    }\n}\n","export default __webpack_public_path__ + \"files/53ce94abb6d1dee43dd34d93f510071f.gif\";","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback} from 'react';\nimport {useDispatch} from 'react-redux';\nimport {FormattedMessage} from 'react-intl';\n\nimport crtBetaImg from 'images/crt-beta.gif';\n\nimport {closeModal} from 'actions/views/modals';\n\nimport GenericModal from 'components/generic_modal';\nimport AlertBanner from 'components/alert_banner';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport './collapsed_reply_threads_modal.scss';\n\nfunction CollapsedReplyThreadsModal() {\n    const dispatch = useDispatch();\n\n    const onHide = useCallback(() => {\n        dispatch(closeModal(ModalIdentifiers.COLLAPSED_REPLY_THREADS_MODAL));\n    }, []);\n\n    return (\n        <GenericModal\n            className='CollapsedReplyThreadsModal'\n            id={ModalIdentifiers.COLLAPSED_REPLY_THREADS_MODAL}\n            enforceFocus={false}\n            onHide={onHide}\n            handleConfirm={onHide}\n            modalHeaderText={(\n                <FormattedMessage\n                    id='collapsed_reply_threads_modal.title'\n                    defaultMessage={'You\\'re accessing an early beta of Collapsed Reply Threads'}\n                />\n            )}\n            confirmButtonText={(\n                <FormattedMessage\n                    id={'collapsed_reply_threads_modal.confirm'}\n                    defaultMessage='Got it'\n                />\n            )}\n        >\n            <div>\n                <AlertBanner\n                    variant='app'\n                    mode='info'\n                    title={(\n                        <FormattedMarkdownMessage\n                            id='collapsed_reply_threads_modal.banner.title'\n                            defaultMessage='Please  [review the list of known issues](!https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues) as we work on stabilizing the feature.'\n                        />\n                    )}\n                    message={(\n                        <FormattedMessage\n                            id='collapsed_reply_threads_modal.banner.message'\n                            defaultMessage='In particular, you may notice a number of channels and threads appear as unread when you enable Collapsed Reply Threads for the first time.'\n                        />\n                    )}\n                />\n\n                <img\n                    src={crtBetaImg}\n                    className='CollapsedReplyThreadsModal__img'\n                />\n            </div>\n        </GenericModal>\n    );\n}\n\nexport default memo(CollapsedReplyThreadsModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {Provider} from 'react-redux';\n\nimport ReactDOM from 'react-dom';\nimport {\n    defineMessages,\n    FormattedMessage,\n    injectIntl,\n    IntlShape,\n} from 'react-intl';\n\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {StatusOK} from 'mattermost-redux/types/client4';\n\nimport store from 'stores/redux_store.jsx';\n\nimport CollapsedReplyThreadsModal from 'components/collapsed_reply_threads_modal';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\nimport {t} from 'utils/i18n';\nimport ConfirmModal from '../../confirm_modal';\n\nconst UserSettings = React.lazy(() => import(/* webpackPrefetch: true */ 'components/user_settings'));\nconst SettingsSidebar = React.lazy(() => import(/* webpackPrefetch: true */ '../../settings_sidebar'));\n\nconst holders = defineMessages({\n    profile: {\n        id: t('user.settings.modal.profile'),\n        defaultMessage: 'Profile',\n    },\n    security: {\n        id: t('user.settings.modal.security'),\n        defaultMessage: 'Security',\n    },\n    notifications: {\n        id: t('user.settings.modal.notifications'),\n        defaultMessage: 'Notifications',\n    },\n    display: {\n        id: t('user.settings.modal.display'),\n        defaultMessage: 'Display',\n    },\n    sidebar: {\n        id: t('user.settings.modal.sidebar'),\n        defaultMessage: 'Sidebar',\n    },\n    advanced: {\n        id: t('user.settings.modal.advanced'),\n        defaultMessage: 'Advanced',\n    },\n    checkEmail: {\n        id: 'user.settings.general.checkEmail',\n        defaultMessage: 'Check your email at {email} to verify the address. Cannot find the email?',\n    },\n    confirmTitle: {\n        id: t('user.settings.modal.confirmTitle'),\n        defaultMessage: 'Discard Changes?',\n    },\n    confirmMsg: {\n        id: t('user.settings.modal.confirmMsg'),\n        defaultMessage: 'You have unsaved changes, are you sure you want to discard them?',\n    },\n    confirmBtns: {\n        id: t('user.settings.modal.confirmBtns'),\n        defaultMessage: 'Yes, Discard',\n    },\n});\n\nexport type Props = {\n    currentUser: UserProfile;\n    onHide: () => void;\n    onExit: () => void;\n    intl: IntlShape;\n    collapsedThreads: boolean;\n    globalHeaderEnabled: boolean;\n    isContentProductSettings: boolean;\n    actions: {\n        openModal: (params: {modalId: string; dialogType: any}) => void;\n        sendVerificationEmail: (email: string) => Promise<{\n            data: StatusOK;\n            error: {\n                err: string;\n            };\n        }>;\n    };\n}\n\ntype State = {\n    active_tab?: string;\n    active_section: string;\n    showConfirmModal: boolean;\n    enforceFocus?: boolean;\n    show: boolean;\n    resendStatus: string;\n}\n\nclass UserSettingsModal extends React.PureComponent<Props, State> {\n    private requireConfirm: boolean;\n    private showCRTBetaModal: boolean;\n    private customConfirmAction: ((handleConfirm: () => void) => void) | null;\n    private modalBodyRef: React.RefObject<Modal>;\n    private afterConfirm: (() => void) | null;\n\n    static defaultProps = {\n        onExit: () => {},\n    };\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            active_tab: props.isContentProductSettings ? 'notifications' : 'profile',\n            active_section: '',\n            showConfirmModal: false,\n            enforceFocus: true,\n            show: true,\n            resendStatus: '',\n        };\n\n        this.requireConfirm = false;\n        this.showCRTBetaModal = false;\n\n        // Used when settings want to override the default confirm modal with their own\n        // If set by a child, it will be called in place of showing the regular confirm\n        // modal. It will be passed a function to call on modal confirm\n        this.customConfirmAction = null;\n        this.afterConfirm = null;\n\n        this.modalBodyRef = React.createRef();\n    }\n\n    handleResend = (email: string) => {\n        this.setState({resendStatus: 'sending'});\n\n        this.props.actions.sendVerificationEmail(email).then(({data, error: err}) => {\n            if (data) {\n                this.setState({resendStatus: 'success'});\n            } else if (err) {\n                this.setState({resendStatus: 'failure'});\n            }\n        });\n    }\n\n    componentDidMount() {\n        document.addEventListener('keydown', this.handleKeyDown);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleKeyDown);\n    }\n\n    componentDidUpdate(prevProps: Props, prevState: State) {\n        if (this.state.active_tab !== prevState.active_tab) {\n            const el = ReactDOM.findDOMNode(this.modalBodyRef.current) as any;\n            el.scrollTop = 0;\n        }\n\n        // we use the showCRTBetaModal to track change of collapsedThreads between states\n        // but NOT when both prev and current collapsedThreads prop is the same\n        if (this.props.collapsedThreads && !prevProps.collapsedThreads) {\n            this.showCRTBetaModal = true;\n        } else if (!this.props.collapsedThreads && prevProps.collapsedThreads) {\n            this.showCRTBetaModal = false;\n        }\n    }\n\n    handleKeyDown = (e: KeyboardEvent) => {\n        if (Utils.cmdOrCtrlPressed(e) && e.shiftKey && Utils.isKeyPressed(e, Constants.KeyCodes.A)) {\n            e.preventDefault();\n            this.handleHide();\n        }\n    }\n\n    // Called when the close button is pressed on the main modal\n    handleHide = () => {\n        if (this.requireConfirm) {\n            this.showConfirmModal(() => this.handleHide());\n            return;\n        }\n\n        this.setState({\n            show: false,\n        });\n    }\n\n    // called after the dialog is fully hidden and faded out\n    handleHidden = () => {\n        this.setState({\n            active_tab: this.props.isContentProductSettings ? 'notifications' : 'profile',\n            active_section: '',\n        });\n        this.props.onHide();\n        this.props.onExit();\n\n        if (this.showCRTBetaModal) {\n            this.props.actions.openModal({\n                modalId: ModalIdentifiers.COLLAPSED_REPLY_THREADS_MODAL,\n                dialogType: CollapsedReplyThreadsModal,\n            });\n        }\n    }\n\n    // Called to hide the settings pane when on mobile\n    handleCollapse = () => {\n        const el = ReactDOM.findDOMNode(this.modalBodyRef.current) as HTMLDivElement;\n        el.closest('.modal-dialog')!.classList.remove('display--content');\n\n        this.setState({\n            active_tab: '',\n            active_section: '',\n        });\n    }\n\n    handleConfirm = () => {\n        this.setState({\n            showConfirmModal: false,\n            enforceFocus: true,\n        });\n\n        this.requireConfirm = false;\n        this.customConfirmAction = null;\n\n        if (this.afterConfirm) {\n            this.afterConfirm();\n            this.afterConfirm = null;\n        }\n    }\n\n    handleCancelConfirmation = () => {\n        this.setState({\n            showConfirmModal: false,\n            enforceFocus: true,\n        });\n\n        this.afterConfirm = null;\n    }\n\n    showConfirmModal = (afterConfirm: () => void) => {\n        if (afterConfirm) {\n            this.afterConfirm = afterConfirm;\n        }\n\n        if (this.customConfirmAction) {\n            this.customConfirmAction(this.handleConfirm);\n            return;\n        }\n\n        this.setState({\n            showConfirmModal: true,\n            enforceFocus: false,\n        });\n    }\n\n    // Called by settings tabs when their close button is pressed\n    closeModal = () => {\n        if (this.requireConfirm) {\n            this.showConfirmModal(this.closeModal);\n        } else {\n            this.handleHide();\n        }\n    }\n\n    // Called by settings tabs when their back button is pressed\n    collapseModal = () => {\n        if (this.requireConfirm) {\n            this.showConfirmModal(this.collapseModal);\n        } else {\n            this.handleCollapse();\n        }\n    }\n\n    updateTab = (tab?: string, skipConfirm?: boolean) => {\n        if (!skipConfirm && this.requireConfirm) {\n            this.showConfirmModal(() => this.updateTab(tab, true));\n        } else {\n            this.setState({\n                active_tab: tab,\n                active_section: '',\n            });\n        }\n    }\n\n    updateSection = (section?: string, skipConfirm?: boolean) => {\n        if (!skipConfirm && this.requireConfirm) {\n            this.showConfirmModal(() => this.updateSection(section, true));\n        } else {\n            this.setState({\n                active_section: section!,\n            });\n        }\n    }\n\n    render() {\n        const {formatMessage} = this.props.intl;\n        if (this.props.currentUser == null) {\n            return (<div/>);\n        }\n        const tabs = [];\n        if (this.props.globalHeaderEnabled) {\n            if (this.props.isContentProductSettings) {\n                tabs.push({name: 'notifications', uiName: formatMessage(holders.notifications), icon: 'icon fa fa-exclamation-circle', iconTitle: Utils.localizeMessage('user.settings.notifications.icon', 'Notification Settings Icon')});\n                tabs.push({name: 'display', uiName: formatMessage(holders.display), icon: 'icon fa fa-eye', iconTitle: Utils.localizeMessage('user.settings.display.icon', 'Display Settings Icon')});\n                tabs.push({name: 'sidebar', uiName: formatMessage(holders.sidebar), icon: 'icon fa fa-columns', iconTitle: Utils.localizeMessage('user.settings.sidebar.icon', 'Sidebar Settings Icon')});\n                tabs.push({name: 'advanced', uiName: formatMessage(holders.advanced), icon: 'icon fa fa-list-alt', iconTitle: Utils.localizeMessage('user.settings.advance.icon', 'Advanced Settings Icon')});\n            } else {\n                tabs.push({name: 'profile', uiName: formatMessage(holders.profile), icon: 'icon fa fa-gear', iconTitle: Utils.localizeMessage('user.settings.profile.icon', 'Profile Settings Icon')});\n                tabs.push({name: 'security', uiName: formatMessage(holders.security), icon: 'icon fa fa-lock', iconTitle: Utils.localizeMessage('user.settings.security.icon', 'Security Settings Icon')});\n            }\n        } else {\n            tabs.push({name: 'profile', uiName: formatMessage(holders.profile), icon: 'icon fa fa-gear', iconTitle: Utils.localizeMessage('user.settings.profile.icon', 'Profile Settings Icon')});\n            tabs.push({name: 'security', uiName: formatMessage(holders.security), icon: 'icon fa fa-lock', iconTitle: Utils.localizeMessage('user.settings.security.icon', 'Security Settings Icon')});\n            tabs.push({name: 'notifications', uiName: formatMessage(holders.notifications), icon: 'icon fa fa-exclamation-circle', iconTitle: Utils.localizeMessage('user.settings.notifications.icon', 'Notification Settings Icon')});\n            tabs.push({name: 'display', uiName: formatMessage(holders.display), icon: 'icon fa fa-eye', iconTitle: Utils.localizeMessage('user.settings.display.icon', 'Display Settings Icon')});\n            tabs.push({name: 'sidebar', uiName: formatMessage(holders.sidebar), icon: 'icon fa fa-columns', iconTitle: Utils.localizeMessage('user.settings.sidebar.icon', 'Sidebar Settings Icon')});\n            tabs.push({name: 'advanced', uiName: formatMessage(holders.advanced), icon: 'icon fa fa-list-alt', iconTitle: Utils.localizeMessage('user.settings.advance.icon', 'Advanced Settings Icon')});\n        }\n\n        return (\n            <Modal\n                id='accountSettingsModal'\n                dialogClassName='a11y__modal settings-modal'\n                show={this.state.show}\n                onHide={this.handleHide}\n                onExited={this.handleHidden}\n                enforceFocus={this.state.enforceFocus}\n                role='dialog'\n                aria-labelledby='accountSettingsModalLabel'\n            >\n                <Modal.Header\n                    id='accountSettingsHeader'\n                    closeButton={true}\n                >\n                    <Modal.Title\n                        componentClass='h1'\n                        id='accountSettingsModalLabel'\n                    >\n                        {this.props.globalHeaderEnabled && this.props.isContentProductSettings ? (\n                            <FormattedMessage\n                                id='global_header.productSettings'\n                                defaultMessage='Settings'\n                            />\n                        ) : (\n                            <FormattedMessage\n                                id='user.settings.modal.title'\n                                defaultMessage='Account Settings'\n                            />\n                        )}\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body ref={this.modalBodyRef}>\n                    <div className='settings-table'>\n                        <div className='settings-links'>\n                            <React.Suspense fallback={null}>\n                                <Provider store={store}>\n                                    <SettingsSidebar\n                                        tabs={tabs}\n                                        activeTab={this.state.active_tab}\n                                        updateTab={this.updateTab}\n                                    />\n                                </Provider>\n                            </React.Suspense>\n                        </div>\n                        <div className='settings-content minimize-settings'>\n                            <React.Suspense fallback={null}>\n                                <Provider store={store}>\n                                    <UserSettings\n                                        activeTab={this.state.active_tab}\n                                        activeSection={this.state.active_section}\n                                        updateSection={this.updateSection}\n                                        updateTab={this.updateTab}\n                                        closeModal={this.closeModal}\n                                        collapseModal={this.collapseModal}\n                                        setEnforceFocus={(enforceFocus?: boolean) => this.setState({enforceFocus})}\n                                        setRequireConfirm={\n                                            (requireConfirm?: boolean, customConfirmAction?: () => () => void) => {\n                                                this.requireConfirm = requireConfirm!;\n                                                this.customConfirmAction = customConfirmAction!;\n                                            }\n                                        }\n                                    />\n                                </Provider>\n                            </React.Suspense>\n                        </div>\n                    </div>\n                </Modal.Body>\n                <ConfirmModal\n                    title={formatMessage(holders.confirmTitle)}\n                    message={formatMessage(holders.confirmMsg)}\n                    confirmButtonText={formatMessage(holders.confirmBtns)}\n                    show={this.state.showConfirmModal}\n                    onConfirm={this.handleConfirm}\n                    onCancel={this.handleCancelConfirmation}\n                />\n            </Modal>\n        );\n    }\n}\n\nexport default injectIntl(UserSettingsModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport {sendVerificationEmail} from 'mattermost-redux/actions/users';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {GlobalState} from 'types/store';\nimport {GenericAction, ActionFunc} from 'mattermost-redux/types/actions';\nimport {getGlobalHeaderEnabled} from 'selectors/global_header';\n\nimport {openModal} from 'actions/views/modals';\n\nimport UserSettingsModal, {Props} from './user_settings_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n\n    const sendEmailNotifications = config.SendEmailNotifications === 'true';\n    const requireEmailVerification = config.RequireEmailVerification === 'true';\n    const collapsedThreads = isCollapsedThreadsEnabled(state);\n\n    return {\n        currentUser: getCurrentUser(state),\n        sendEmailNotifications,\n        requireEmailVerification,\n        collapsedThreads,\n        globalHeaderEnabled: getGlobalHeaderEnabled(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n    return {\n        actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Props['actions']>({\n            sendVerificationEmail,\n            openModal,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(UserSettingsModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, ReactNode, HTMLAttributes} from 'react';\nimport classNames from 'classnames';\n\nimport './badge.scss';\n\ntype Props = {\n    show?: boolean;\n    children: ReactNode;\n};\n\ntype Attrs = HTMLAttributes<HTMLElement>\n\nconst Badge = ({\n    show = true,\n    children,\n    ...attrs\n}: Props & Attrs) => {\n    if (!show) {\n        return null;\n    }\n    const ButtonOrDiv: keyof JSX.IntrinsicElements = attrs.onClick ? 'button' : 'div';\n    return (\n        <div className='Badge'>\n            <ButtonOrDiv\n                {...attrs}\n                className={classNames('Badge__box', attrs.className)}\n            >\n                {children}\n            </ButtonOrDiv>\n        </div>\n    );\n};\n\nexport default memo(Badge);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport Badge from './badge';\n\ntype Props = {\n    className?: string;\n    show?: boolean;\n}\n\nconst BotBadge: React.FC<Props> = (props: Props) => (\n    <Badge\n        className={'BotBadge ' + props.className}\n        show={props.show}\n    >\n        <FormattedMessage\n            id='post_info.bot'\n            defaultMessage='BOT'\n        />\n    </Badge>\n);\n\nBotBadge.defaultProps = {\n    show: true,\n    className: '',\n};\n\nexport default BotBadge;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport Badge from './badge';\n\ntype Props = {\n    className?: string;\n    show?: boolean;\n};\n\nconst GuestBadge: React.FC<Props> = (props: Props) => (\n    <Badge\n        className={'GuestBadge ' + props.className}\n        show={props.show}\n    >\n        <FormattedMessage\n            id='post_info.guest'\n            defaultMessage='GUEST'\n        />\n    </Badge>\n);\n\nGuestBadge.defaultProps = {\n    show: true,\n    className: '',\n};\n\nexport default GuestBadge;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function ArchiveIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='16px'\n                height='16px'\n                viewBox='0 0 16 16'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.archive', defaultMessage: 'Archive Icon'})}\n            >\n                <path d='M13.994 14.75H2.006V6.50599H3.5V13.256H12.5V6.50599H13.994V14.75ZM1.25 1.24999H14.75V5.74999H1.25V1.24999ZM6.128 7.24399H9.872C9.98 7.24399 10.07 7.27999 10.142 7.35199C10.214 7.42399 10.25 7.51399 10.25 7.62199V8.75599H5.75V7.62199C5.75 7.51399 5.786 7.42399 5.858 7.35199C5.93 7.27999 6.02 7.24399 6.128 7.24399ZM2.744 2.74399V4.25599H13.256V2.74399H2.744Z'/>\n            </svg>\n        </span>\n    );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function AttachmentIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='16px'\n                height='16px'\n                viewBox='0 0 16 16'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.attach', defaultMessage: 'Attachment Icon'})}\n            >\n                <g\n                    fill='inherit'\n                    fillRule='evenodd'\n                >\n                    <g\n                        transform='translate(-1029.000000, -954.000000)'\n                        fillRule='nonzero'\n                        fill='inherit'\n                    >\n                        <g transform='translate(25.000000, 937.000000)'>\n                            <g transform='translate(1004.000000, 17.000000)'>\n                                <path d='M5.35,15.56 C3.98,15.56 2.61,15.039 1.567,13.997 C0.557,12.984 0,11.642 0,10.212 C0,8.783 0.557,7.44 1.566,6.429 L6.869,1.126 C8.371,-0.376 10.812,-0.375 12.314,1.125 C13.815,2.627 13.815,5.069 12.314,6.57 L7.011,11.873 C6.094,12.792 4.603,12.79 3.687,11.873 C2.771,10.958 2.771,9.467 3.687,8.551 L8.99,3.248 C9.323,2.916 9.861,2.916 10.193,3.248 C10.525,3.579 10.525,4.118 10.193,4.449 L4.89,9.752 C4.637,10.006 4.637,10.418 4.89,10.672 C5.143,10.923 5.555,10.925 5.809,10.672 L11.113,5.369 C11.952,4.53 11.952,3.166 11.113,2.327 C10.276,1.49 8.911,1.488 8.073,2.327 L2.769,7.631 C2.079,8.32 1.699,9.237 1.699,10.212 C1.699,11.188 2.079,12.104 2.768,12.794 C4.19,14.216 6.502,14.216 7.925,12.798 L7.929,12.794 C7.929,12.793 7.929,12.793 7.929,12.793 L15.355,5.369 C15.687,5.037 16.224,5.037 16.556,5.369 C16.888,5.7 16.888,6.239 16.556,6.57 L8.779,14.348 L8.761,14.332 C7.776,15.15 6.562,15.56 5.35,15.56 Z'/>\n                            </g>\n                        </g>\n                    </g>\n                </g>\n            </svg>\n        </span>\n    );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function CloseCircleSolidIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='16px'\n                height='16px'\n                viewBox='0 0 16 16'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.close', defaultMessage: 'Close Icon'})}\n            >\n                <path\n                    d='m 8,0 c 4.424,0 8,3.576 8,8 0,4.424 -3.576,8 -8,8 C 3.576,16 0,12.424 0,8 0,3.576 3.576,0 8,0 Z M 10.872,4 8,6.872 5.128,4 4,5.128 6.872,8 4,10.872 5.128,12 8,9.128 10.872,12 12,10.872 9.128,8 12,5.128 Z'\n                />\n            </svg>\n        </span>\n    );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {t} from 'utils/i18n';\n\nexport default function CloseIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='24px'\n                height='24px'\n                viewBox='0 0 24 24'\n                role='img'\n                aria-label={formatMessage({id: t('generic_icons.close'), defaultMessage: 'Close Icon'})}\n            >\n                <path\n                    fillRule='nonzero'\n                    d='M18 7.209L16.791 6 12 10.791 7.209 6 6 7.209 10.791 12 6 16.791 7.209 18 12 13.209 16.791 18 18 16.791 13.209 12z'\n                />\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nexport default class EmojiIcon extends React.PureComponent<React.HTMLAttributes<HTMLSpanElement>> {\n    render() {\n        return (\n            <span {...this.props}>\n                <svg\n                    width='16px'\n                    height='16px'\n                    viewBox='0 0 16 16'\n                    role='img'\n                    aria-label='Emoji icon'\n                >\n                    <path d='M8 12.4C8.59733 12.4 9.17333 12.2773 9.728 12.032C10.2613 11.7973 10.7307 11.4667 11.136 11.04C11.552 10.6133 11.8667 10.1333 12.08 9.60001H3.92C4.13333 10.1333 4.44267 10.6133 4.848 11.04C5.264 11.4667 5.73867 11.7973 6.272 12.032C6.82667 12.2773 7.40267 12.4 8 12.4ZM5.2 7.20001C5.52 7.20001 5.79733 7.08267 6.032 6.84801C6.27733 6.60267 6.4 6.32001 6.4 6.00001C6.4 5.68001 6.27733 5.40267 6.032 5.16801C5.79733 4.92267 5.52 4.80001 5.2 4.80001C4.88 4.80001 4.59733 4.92267 4.352 5.16801C4.11733 5.40267 4 5.68001 4 6.00001C4 6.32001 4.11733 6.60267 4.352 6.84801C4.59733 7.08267 4.88 7.20001 5.2 7.20001ZM10.8 7.20001C11.12 7.20001 11.3973 7.08267 11.632 6.84801C11.8773 6.60267 12 6.32001 12 6.00001C12 5.68001 11.8773 5.40267 11.632 5.16801C11.3973 4.92267 11.12 4.80001 10.8 4.80001C10.48 4.80001 10.1973 4.92267 9.952 5.16801C9.71733 5.40267 9.6 5.68001 9.6 6.00001C9.6 6.32001 9.71733 6.60267 9.952 6.84801C10.1973 7.08267 10.48 7.20001 10.8 7.20001ZM8 14.4C6.848 14.4 5.776 14.1067 4.784 13.52C3.81333 12.9547 3.04533 12.1867 2.48 11.216C1.89333 10.224 1.6 9.15201 1.6 8.00001C1.6 6.84801 1.89333 5.77601 2.48 4.78401C3.04533 3.81334 3.81333 3.04534 4.784 2.48001C5.776 1.89334 6.848 1.60001 8 1.60001C9.152 1.60001 10.224 1.89334 11.216 2.48001C12.1867 3.04534 12.9547 3.81334 13.52 4.78401C14.1067 5.77601 14.4 6.84801 14.4 8.00001C14.4 9.15201 14.1067 10.224 13.52 11.216C12.9547 12.1867 12.1867 12.9547 11.216 13.52C10.224 14.1067 9.152 14.4 8 14.4ZM8 5.72205e-06C6.56 5.72205e-06 5.216 0.368006 3.968 1.10401C2.76267 1.80801 1.808 2.76267 1.104 3.96801C0.368 5.21601 0 6.56001 0 8.00001C0 9.44001 0.368 10.784 1.104 12.032C1.808 13.2373 2.76267 14.192 3.968 14.896C5.216 15.632 6.56 16 8 16C9.44 16 10.784 15.632 12.032 14.896C13.2373 14.192 14.192 13.2373 14.896 12.032C15.632 10.784 16 9.44001 16 8.00001C16 6.56001 15.632 5.21601 14.896 3.96801C14.192 2.76267 13.2373 1.80801 12.032 1.10401C10.784 0.368006 9.44 5.72205e-06 8 5.72205e-06Z'/>\n\n                </svg>\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function AddIcon() {\n    const {formatMessage} = useIntl();\n    return (\n        <i\n            className='fa fa-plus'\n            title={formatMessage({id: 'generic_icons.add', defaultMessage: 'Add Icon'})}\n        />\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function BackIcon() {\n    const {formatMessage} = useIntl();\n    return (\n        <i\n            className='fa fa-angle-left'\n            title={formatMessage({id: 'generic_icons.back', defaultMessage: 'Back Icon'})}\n        />\n    );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function DropdownIcon() {\n    const {formatMessage} = useIntl();\n    return (\n        <i\n            className='fa fa-angle-down'\n            title={formatMessage({id: 'generic_icons.dropdown', defaultMessage: 'Dropdown Icon'})}\n        />\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function EditIcon() {\n    const {formatMessage} = useIntl();\n    return (\n        <i\n            className='icon-pencil-outline'\n            title={formatMessage({id: 'generic_icons.edit', defaultMessage: 'Edit Icon'})}\n        />\n    );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport LocalizedIcon from 'components/localized_icon';\n\nimport {t} from 'utils/i18n';\n\ntype Props = {\n    additionalClassName: string | null;\n}\n\nexport default class NextIcon extends React.PureComponent<Props> {\n    public static defaultProps: Props = {\n        additionalClassName: null,\n    };\n\n    public render(): JSX.Element {\n        const className = 'fa fa-1x fa-angle-right' + (this.props.additionalClassName ? ' ' + this.props.additionalClassName : '');\n        return (\n            <LocalizedIcon\n                className={className}\n                title={{id: t('generic_icons.next'), defaultMessage: 'Next Icon'}}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport LocalizedIcon from 'components/localized_icon';\n\nimport {t} from 'utils/i18n';\n\ntype Props = {\n    additionalClassName: string | null;\n}\n\nexport default class PreviousIcon extends React.PureComponent<Props> {\n    public static defaultProps: Props = {\n        additionalClassName: null,\n    };\n\n    public render(): JSX.Element {\n        const className = 'fa fa-1x fa-angle-left' + (this.props.additionalClassName ? ' ' + this.props.additionalClassName : '');\n        return (\n            <LocalizedIcon\n                className={className}\n                title={{id: t('generic_icons.previous'), defaultMessage: 'Previous Icon'}}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport LocalizedIcon from 'components/localized_icon';\nimport {t} from 'utils/i18n';\n\nexport default function SuccessIcon() {\n    return (\n        <LocalizedIcon\n            className='fa fa-check'\n            title={{id: t('generic_icons.success'), defaultMessage: 'Success Icon'}}\n        />\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function FlagIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='16px'\n                height='16px'\n                viewBox='0 0 16 16'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.flag', defaultMessage: 'Flag Icon'})}\n            >\n                <path d='M11.744 12.5L8 10.862L4.256 12.5V2.74405H11.744V12.5ZM11.744 1.25005H4.256C3.836 1.25005 3.476 1.40005 3.176 1.70005C2.888 1.98805 2.744 2.33605 2.744 2.74405V14.75L8 12.5L13.256 14.75V2.74405C13.256 2.33605 13.106 1.98805 12.806 1.70005C12.518 1.40005 12.164 1.25005 11.744 1.25005Z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function FlagIconFilled(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='12px'\n                height='15px'\n                viewBox='0 0 12 15'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.flagged', defaultMessage: 'Flagged Icon'})}\n            >\n                <g\n                    stroke='none'\n                    strokeWidth='1'\n                    fill='inherit'\n                    fillRule='evenodd'\n                >\n                    <g\n                        transform='translate(-1073.000000, -33.000000)'\n                        fillRule='nonzero'\n                        fill='inherit'\n                    >\n                        <g transform='translate(-1.000000, 0.000000)'>\n                            <g transform='translate(1064.000000, 22.000000)'>\n                                <g transform='translate(10.000000, 11.000000)'>\n                                    <path d='M9.76172 0.800049H2.23828C1.83984 0.800049 1.48828 0.952393 1.18359 1.25708C0.902344 1.53833 0.761719 1.88989 0.761719 2.31177V14.3L6 12.05L11.2383 14.3V2.31177C11.2383 1.88989 11.0859 1.53833 10.7812 1.25708C10.5 0.952393 10.1602 0.800049 9.76172 0.800049Z'/>\n                                </g>\n                            </g>\n                        </g>\n                    </g>\n                </g>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function GlobeIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='13px'\n                height='13px'\n                viewBox='0 0 16 16'\n                role='presentation'\n                aria-label={formatMessage({id: 'generic_icons.channel.public', defaultMessage: 'Public Channel Icon'})}\n            >\n                <path d='M8 -2.47955e-05C6.56 -2.47955e-05 5.216 0.367975 3.968 1.10398C2.76267 1.80798 1.808 2.76264 1.104 3.96797C0.368 5.21598 0 6.55998 0 7.99998C0 9.43998 0.368 10.784 1.104 12.032C1.808 13.2373 2.76267 14.192 3.968 14.896C5.216 15.632 6.56 16 8 16C9.44 16 10.784 15.632 12.032 14.896C13.2373 14.192 14.192 13.2373 14.896 12.032C15.632 10.784 16 9.43998 16 7.99998C16 6.55998 15.632 5.21598 14.896 3.96797C14.192 2.76264 13.2373 1.80798 12.032 1.10398C10.784 0.367975 9.44 -2.47955e-05 8 -2.47955e-05ZM14.4 8.39998C14.2507 8.59198 13.92 8.80531 13.408 9.03998C12.768 9.31731 12.032 9.53064 11.2 9.67998V6.95998C12.288 6.77864 13.168 6.53864 13.84 6.23998C13.872 6.20798 13.9253 6.18131 14 6.15998C14.0853 6.12798 14.1387 6.10131 14.16 6.07998C14.32 6.63464 14.4 7.27464 14.4 7.99998V8.39998ZM6.8 11.52C6.93867 11.52 7.14133 11.536 7.408 11.568C7.67467 11.5893 7.872 11.6 8 11.6C8.53333 11.6 8.93333 11.5733 9.2 11.52C9.008 12.2773 8.8 12.912 8.576 13.424C8.36267 13.8933 8.17067 14.192 8 14.32C7.808 14.1813 7.61067 13.8826 7.408 13.424C7.152 12.8906 6.94933 12.256 6.8 11.52ZM8 9.99998C7.63733 9.99998 7.376 9.99464 7.216 9.98398C6.93867 9.97331 6.69333 9.95198 6.48 9.91998C6.48 9.74931 6.46933 9.46664 6.448 9.07198C6.416 8.61331 6.4 8.25598 6.4 7.99998V7.11998C6.77333 7.17331 7.30667 7.19998 8 7.19998C8.69333 7.19998 9.22667 7.17331 9.6 7.11998V7.99998C9.6 8.25598 9.584 8.61331 9.552 9.07198C9.53067 9.46664 9.52 9.74931 9.52 9.91998C9.30667 9.95198 9.06133 9.97331 8.784 9.98398C8.624 9.99464 8.36267 9.99998 8 9.99998ZM9.44 5.51998C9.12 5.57331 8.64 5.59998 8 5.59998C7.36 5.59998 6.88 5.57331 6.56 5.51998C6.656 4.82664 6.8 4.18131 6.992 3.58397C7.14133 3.07198 7.31733 2.62931 7.52 2.25597C7.69067 1.93598 7.85067 1.71731 8 1.59997C8.14933 1.71731 8.30933 1.93598 8.48 2.25597C8.68267 2.62931 8.85867 3.07198 9.008 3.58397C9.2 4.18131 9.344 4.82664 9.44 5.51998ZM13.44 4.63998C12.5867 5.00264 11.7867 5.24264 11.04 5.35997C10.9653 4.71997 10.848 4.11198 10.688 3.53598C10.5387 2.95998 10.3627 2.44798 10.16 1.99998C11.5573 2.49064 12.6507 3.37064 13.44 4.63998ZM2.56 4.63998C2.976 4.02131 3.456 3.49331 4 3.05597C4.576 2.58664 5.216 2.23464 5.92 1.99998C5.52533 2.87464 5.20533 3.99464 4.96 5.35997C3.92533 5.11464 3.12533 4.87464 2.56 4.63998ZM1.92 6.07998C1.952 6.11198 2.00533 6.14398 2.08 6.17598L2.24 6.23998C2.96533 6.55998 3.84533 6.79998 4.88 6.95998C4.848 7.09864 4.82667 7.26398 4.816 7.45598C4.80533 7.56264 4.8 7.74398 4.8 7.99998C4.8 8.74664 4.82667 9.30664 4.88 9.67998C4.048 9.53064 3.31733 9.31731 2.688 9.03998C2.16533 8.80531 1.82933 8.59198 1.68 8.39998V7.99998C1.63733 7.67998 1.63733 7.34931 1.68 7.00798C1.72267 6.66664 1.80267 6.35731 1.92 6.07998ZM2.16 10.56C3.14133 10.9546 4.128 11.2213 5.12 11.36C5.248 12.2133 5.51467 13.0933 5.92 14C5.088 13.7226 4.34133 13.2853 3.68 12.688C3.02933 12.08 2.52267 11.3706 2.16 10.56ZM13.84 10.56C13.4773 11.3706 12.9653 12.08 12.304 12.688C11.6533 13.2853 10.912 13.7226 10.08 14C10.4853 13.0933 10.752 12.2133 10.88 11.36C12.1493 11.1786 13.136 10.912 13.84 10.56Z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function InfoSmallIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                className='svg-text-color'\n                aria-label={formatMessage({id: 'generic_icons.info', defaultMessage: 'Info Icon'})}\n                width='24px'\n                height='24px'\n                viewBox='0 0 24 24'\n                version='1.1'\n            >\n                <g\n                    stroke='none'\n                    strokeWidth='1'\n                    fill='inherit'\n                    fillRule='evenodd'\n                >\n                    <g\n                        transform='translate(-1015.000000, -516.000000)'\n                        fill='inherit'\n                    >\n                        <path d='M1027,540 C1020.37258,540 1015,534.627417 1015,528 C1015,521.372583 1020.37258,516 1027,516 C1033.62742,516 1039,521.372583 1039,528 C1039,534.627417 1033.62742,540 1027,540 Z M1027,527 C1025.89543,527 1025,527.895431 1025,529 L1025,533 C1025,534.104569 1025.89543,535 1027,535 C1028.10457,535 1029,534.104569 1029,533 L1029,529 C1029,527.895431 1028.10457,527 1027,527 Z M1027,525 C1028.10457,525 1029,524.104569 1029,523 C1029,521.895431 1028.10457,521 1027,521 C1025.89543,521 1025,521.895431 1025,523 C1025,524.104569 1025.89543,525 1027,525 Z'/>\n                    </g>\n                </g>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function LockIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='12px'\n                height='13px'\n                viewBox='0 0 13 15'\n                role='presentation'\n                aria-label={formatMessage({id: 'generic_icons.channel.private', defaultMessage: 'Private Channel Icon'})}\n            >\n                <g\n                    stroke='none'\n                    strokeWidth='1'\n                    fill='inherit'\n                    fillRule='evenodd'\n                >\n                    <g\n                        transform='translate(-116.000000, -175.000000)'\n                        fillRule='nonzero'\n                        fill='inherit'\n                    >\n                        <g transform='translate(95.000000, 0.000000)'>\n                            <g transform='translate(20.000000, 113.000000)'>\n                                <g transform='translate(1.000000, 62.000000)'>\n                                    <path d='M12.0714286,6.5 L11.1428571,6.5 L11.1428571,4.64285714 C11.1428571,2.07814286 9.06471429,0 6.5,0 C3.93528571,0 1.85714286,2.07814286 1.85714286,4.64285714 L1.85714286,6.5 L0.928571429,6.5 C0.415071429,6.5 0,7.00792857 0,7.52142857 L0,13.9285714 C0,14.4420714 0.415071429,14.8571429 0.928571429,14.8571429 L12.0714286,14.8571429 C12.5849286,14.8571429 13,14.4420714 13,13.9285714 L13,7.52142857 C13,7.00792857 12.5849286,6.5 12.0714286,6.5 Z M6.5,1.85714286 C8.03585714,1.85714286 9.28571429,3.107 9.28571429,4.64285714 L9.28571429,6.5 L8.35714286,6.5 L4.64285714,6.5 L3.71428571,6.5 L3.71428571,4.64285714 C3.71428571,3.107 4.96414286,1.85714286 6.5,1.85714286 Z'/>\n                                </g>\n                            </g>\n                        </g>\n                    </g>\n                </g>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function MattermostLogo(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                version='1.1'\n                x='0px'\n                y='0px'\n                viewBox='0 0 500 500'\n                enableBackground='new 0 0 500 500'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.mattermost', defaultMessage: 'Mattermost Logo'})}\n            >\n                <g>\n                    <g>\n                        <path\n                            style={style}\n                            d='M396.9,47.7l2.6,53.1c43,47.5,60,114.8,38.6,178.1c-32,94.4-137.4,144.1-235.4,110.9 S51.1,253.1,83,158.7C104.5,95.2,159.2,52,222.5,40.5l34.2-40.4C150-2.8,49.3,63.4,13.3,169.9C-31,300.6,39.1,442.5,169.9,486.7 s272.6-25.8,316.9-156.6C522.7,223.9,483.1,110.3,396.9,47.7z'\n                        />\n                    </g>\n                    <path\n                        style={style}\n                        d='M335.6,204.3l-1.8-74.2l-1.5-42.7l-1-37c0,0,0.2-17.8-0.4-22c-0.1-0.9-0.4-1.6-0.7-2.2 c0-0.1-0.1-0.2-0.1-0.3c0-0.1-0.1-0.2-0.1-0.2c-0.7-1.2-1.8-2.1-3.1-2.6c-1.4-0.5-2.9-0.4-4.2,0.2c0,0-0.1,0-0.1,0 c-0.2,0.1-0.3,0.1-0.4,0.2c-0.6,0.3-1.2,0.7-1.8,1.3c-3,3-13.7,17.2-13.7,17.2l-23.2,28.8l-27.1,33l-46.5,57.8 c0,0-21.3,26.6-16.6,59.4s29.1,48.7,48,55.1c18.9,6.4,48,8.5,71.6-14.7C336.4,238.4,335.6,204.3,335.6,204.3z'\n                    />\n                </g>\n            </svg>\n        </span>\n    );\n}\n\nconst style: CSSProperties = {\n    fillRule: 'evenodd',\n    clipRule: 'evenodd',\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function MentionsIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='12px'\n                height='12px'\n                viewBox='0 0 18 18'\n                version='1.1'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.mention', defaultMessage: 'Mention Icon'})}\n                fill='inherit'\n            >\n                <path d='M9 11.7C9.72 11.7 10.35 11.43 10.89 10.89C11.43 10.35 11.7 9.71999 11.7 8.99999C11.7 8.27999 11.43 7.64999 10.89 7.10999C10.35 6.56999 9.72 6.29999 9 6.29999C8.28 6.29999 7.65 6.56999 7.11 7.10999C6.57 7.64999 6.3 8.27999 6.3 8.99999C6.3 9.71999 6.57 10.35 7.11 10.89C7.65 11.43 8.28 11.7 9 11.7ZM9 -1.26362e-05C11.46 -1.26362e-05 13.56 0.869987 15.3 2.60999C16.176 3.48599 16.842 4.45199 17.298 5.50799C17.766 6.59999 18 7.76399 18 8.99999V10.26C18 10.692 17.916 11.118 17.748 11.538C17.592 11.922 17.376 12.276 17.1 12.6C16.788 12.912 16.446 13.14 16.074 13.284C15.714 13.428 15.306 13.5 14.85 13.5C13.746 13.5 12.876 13.05 12.24 12.15C11.34 13.05 10.26 13.5 9 13.5C7.716 13.5 6.666 13.05 5.85 12.15C4.95 11.25 4.5 10.2 4.5 8.99999C4.5 7.70399 4.95 6.65399 5.85 5.84999C6.666 4.94999 7.716 4.49999 9 4.49999C10.296 4.49999 11.346 4.94999 12.15 5.84999C13.05 6.74999 13.5 7.79999 13.5 8.99999V10.26C13.5 10.44 13.536 10.614 13.608 10.782C13.692 10.95 13.8 11.106 13.932 11.25C14.076 11.382 14.232 11.49 14.4 11.574C14.568 11.658 14.718 11.7 14.85 11.7C15.03 11.7 15.204 11.664 15.372 11.592C15.54 11.508 15.696 11.394 15.84 11.25C16.08 11.01 16.2 10.68 16.2 10.26V8.99999C16.2 7.01999 15.48 5.30999 14.04 3.86999C13.332 3.16199 12.564 2.63999 11.736 2.30399C10.908 1.96799 9.996 1.79999 9 1.79999C7.056 1.79999 5.346 2.48999 3.87 3.86999C3.174 4.52999 2.652 5.30399 2.304 6.19199C1.968 7.04399 1.8 7.97999 1.8 8.99999C1.8 9.98399 1.974 10.902 2.322 11.754C2.67 12.594 3.186 13.356 3.87 14.04C4.554 14.724 5.328 15.252 6.192 15.624C7.092 16.008 8.028 16.2 9 16.2H13.5V18H9C7.752 18 6.6 17.772 5.544 17.316C4.488 16.872 3.51 16.2 2.61 15.3C1.71 14.4 1.05 13.44 0.63 12.42C0.21 11.4 0 10.266 0 9.01799C0 7.75799 0.222 6.59399 0.666 5.52599C1.098 4.49399 1.746 3.52199 2.61 2.60999C4.266 0.869987 6.396 -1.26362e-05 9 -1.26362e-05Z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function MenuIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='16px'\n                height='10px'\n                viewBox='0 0 16 10'\n                version='1.1'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.menu', defaultMessage: 'Menu Icon'})}\n            >\n                <g\n                    stroke='none'\n                    strokeWidth='1'\n                    fill='inherit'\n                    fillRule='evenodd'\n                >\n                    <g\n                        transform='translate(-188.000000, -38.000000)'\n                        fillRule='nonzero'\n                        fill='inherit'\n                    >\n                        <g>\n                            <g>\n                                <g transform='translate(188.000000, 38.000000)'>\n                                    <path d='M15.5,0 C15.776,0 16,0.224 16,0.5 L16,1.5 C16,1.776 15.776,2 15.5,2 L0.5,2 C0.224,2 0,1.776 0,1.5 L0,0.5 C0,0.224 0.224,0 0.5,0 L15.5,0 Z M15.5,4 C15.776,4 16,4.224 16,4.5 L16,5.5 C16,5.776 15.776,6 15.5,6 L0.5,6 C0.224,6 0,5.776 0,5.5 L0,4.5 C0,4.224 0.224,4 0.5,4 L15.5,4 Z M15.5,8 C15.776,8 16,8.224 16,8.5 L16,9.5 C16,9.776 15.776,10 15.5,10 L0.5,10 C0.224,10 0,9.776 0,9.5 L0,8.5 C0,8.224 0.224,8 0.5,8 L15.5,8 Z'/>\n                                </g>\n                            </g>\n                        </g>\n                    </g>\n                </g>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function SearchIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='16px'\n                height='16px'\n                viewBox='0 0 17 17'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.search', defaultMessage: 'Search Icon'})}\n            >\n                <path d='M16.398 15.138L13.014 11.754C13.458 11.178 13.8 10.548 14.04 9.86399C14.28 9.14399 14.4 8.40599 14.4 7.64999C14.4 6.42599 14.094 5.29199 13.482 4.24799C12.882 3.22799 12.072 2.41799 11.052 1.81799C10.008 1.20599 8.874 0.899988 7.65 0.899988C6.426 0.899988 5.292 1.20599 4.248 1.81799C3.228 2.41799 2.418 3.22799 1.818 4.24799C1.206 5.29199 0.9 6.42599 0.9 7.64999C0.9 8.87399 1.206 10.008 1.818 11.052C2.418 12.072 3.228 12.882 4.248 13.482C5.292 14.094 6.426 14.4 7.65 14.4C8.406 14.4 9.138 14.274 9.846 14.022C10.53 13.794 11.16 13.458 11.736 13.014L15.138 16.398C15.306 16.566 15.516 16.65 15.768 16.65C16.02 16.65 16.23 16.56 16.398 16.38C16.566 16.212 16.65 16.008 16.65 15.768C16.65 15.528 16.566 15.318 16.398 15.138ZM2.7 7.64999C2.7 6.74999 2.922 5.92199 3.366 5.16599C3.81 4.40999 4.41 3.80999 5.166 3.36599C5.922 2.92199 6.75 2.69999 7.65 2.69999C8.55 2.69999 9.378 2.92199 10.134 3.36599C10.89 3.80999 11.49 4.40999 11.934 5.16599C12.378 5.92199 12.6 6.74999 12.6 7.64999C12.6 8.54999 12.378 9.37799 11.934 10.134C11.49 10.89 10.89 11.49 10.134 11.934C9.378 12.378 8.55 12.6 7.65 12.6C6.75 12.6 5.922 12.378 5.166 11.934C4.41 11.49 3.81 10.89 3.366 10.134C2.922 9.37799 2.7 8.54999 2.7 7.64999Z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, useEffect} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {Client4} from 'mattermost-redux/client';\n\nenum NotifyStatus {\n    NotStarted = 'NOT_STARTED',\n    Started = 'STARTED',\n    Success = 'SUCCESS',\n    Failed = 'FAILED'\n}\n\nexport enum DafaultBtnText {\n    NotifyAdmin = 'Notify the admin.',\n    Sending = 'Sending...',\n    Sent = 'Sent!',\n    Failed = 'Failed. Try again later.',\n}\n\ntype Props = {\n    className?: string;\n\n    // extraFunc is a function to run after sending notification process\n    extraFunc?: () => void;\n}\n\nconst NotifyLink = (props: Props): JSX.Element => {\n    const [notifyStatus, setStatus] = useState(NotifyStatus.NotStarted);\n    const {formatMessage} = useIntl();\n\n    useEffect(\n        () => {\n            if (typeof props.extraFunc === 'function') {\n                if (notifyStatus === NotifyStatus.Success || notifyStatus === NotifyStatus.Failed) {\n                    props.extraFunc();\n                }\n            }\n        }, [notifyStatus]);\n\n    const notifyFunc = async () => {\n        try {\n            setStatus(NotifyStatus.Started);\n            await Client4.sendAdminUpgradeRequestEmail();\n            setStatus(NotifyStatus.Success);\n        } catch (error) {\n            if (error) {\n                setStatus(NotifyStatus.Failed);\n            }\n        }\n    };\n\n    const btnText = (status: NotifyStatus): string => {\n        switch (status) {\n        case NotifyStatus.Started:\n            return formatMessage({id: 'invitation-modal.notify-admin.sending', defaultMessage: DafaultBtnText.Sending});\n        case NotifyStatus.Success:\n            return formatMessage({id: 'invitation-modal.notify-admin.sent', defaultMessage: DafaultBtnText.Sent});\n        case NotifyStatus.Failed:\n            return formatMessage({id: 'invitation-modal.notify-admin.failed', defaultMessage: DafaultBtnText.Failed});\n        default:\n            return formatMessage({id: 'invitation-modal.notify-admin.notify', defaultMessage: DafaultBtnText.NotifyAdmin});\n        }\n    };\n    return (\n        <button\n            disabled={notifyStatus !== NotifyStatus.NotStarted}\n            onClick={() => notifyFunc()}\n            className={props.className ? props.className : 'btn-link'}\n        >{btnText(notifyStatus)}</button>\n    );\n};\n\nexport default NotifyLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useDispatch} from 'react-redux';\n\nimport {FormattedMessage} from 'react-intl';\n\nimport {DispatchFunc} from 'mattermost-redux/types/actions';\n\nimport {openModal} from 'actions/views/modals';\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {ModalIdentifiers} from 'utils/constants';\nimport PurchaseModal from 'components/purchase_modal';\n\nimport './link.scss';\n\nexport interface UpgradeLinkProps {\n    telemetryInfo?: string;\n    buttonText?: string;\n    styleButton?: boolean; // show as a blue primary button\n    styleLink?: boolean; // show as a anchor link\n}\n\nconst UpgradeLink: React.FC<UpgradeLinkProps> = (props: UpgradeLinkProps) => {\n    const dispatch = useDispatch<DispatchFunc>();\n    const styleButton = props.styleButton ? ' style-button' : '';\n    const styleLink = props.styleLink ? ' style-link' : '';\n\n    const handleLinkClick = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n        e.preventDefault();\n        if (props.telemetryInfo) {\n            trackEvent('upgrade_mm_cloud', props.telemetryInfo);\n        }\n        try {\n            dispatch(openModal({\n                modalId: ModalIdentifiers.CLOUD_PURCHASE,\n                dialogType: PurchaseModal,\n            }));\n        } catch (error) {\n            // do nothing\n        }\n    };\n    const buttonText = (\n        <FormattedMessage\n            id='upgradeLink.warn.upgrade_now'\n            defaultMessage='Upgrade now'\n        />\n    );\n    return (\n        <button\n            className={`upgradeLink${styleButton}${styleLink}`}\n            onClick={(e) => handleLinkClick(e)}\n        >\n            {props.buttonText ? props.buttonText : buttonText}\n        </button>\n    );\n};\n\nexport default UpgradeLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport LocalizedIcon from 'components/localized_icon';\n\nimport {t} from 'utils/i18n';\n\ntype Props = {\n    text: React.ReactNode;\n}\n\nexport default class LoadingSpinner extends React.PureComponent<Props> {\n    public static defaultProps: Props = {\n        text: null,\n    }\n\n    public render() {\n        return (\n            <span\n                id='loadingSpinner'\n                className={'LoadingSpinner' + (this.props.text ? ' with-text' : '')}\n            >\n                <LocalizedIcon\n                    className='fa fa-spinner fa-fw fa-pulse spinner'\n                    component='span'\n                    title={{id: t('generic_icons.loading'), defaultMessage: 'Loading Icon'}}\n                />\n                {this.props.text}\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport LoadingSpinner from './loading_spinner';\n\ntype Props = {\n    loading: boolean;\n    text: React.ReactNode;\n    children: React.ReactNode;\n}\n\nexport default class LoadingWrapper extends React.PureComponent<Props> {\n    public static defaultProps: Props = {\n        loading: true,\n        text: null,\n        children: null,\n    }\n\n    public render() {\n        const {text, loading, children} = this.props;\n        if (!loading) {\n            return children;\n        }\n\n        return <LoadingSpinner text={text}/>;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {CSSProperties} from 'react';\nimport classNames from 'classnames';\n\nimport * as Utils from 'utils/utils.jsx';\nimport {showMobileSubMenuModal} from 'actions/global_actions';\n\nimport './menu_item.scss';\nimport Constants from 'utils/constants';\n\n// Requires an object conforming to a submenu structure passed to registerPostDropdownSubMenuAction\n// of the form:\n// {\n//     \"id\": \"A\",\n//     \"parentMenuId\": null,\n//     \"text\": \"A text\",\n//     \"subMenu\": [\n//         {\n//             \"id\": \"B\",\n//             \"parentMenuId\": \"A\",\n//             \"text\": \"B text\"\n//             \"subMenu\": [],\n//             \"action\": () => {},\n//             \"filter\": () => {},\n//         }\n//     ],\n//     \"action\": () => {},\n//     \"filter\": () => {},\n// }\n// Submenus can contain Submenus as well\n\nexport type Props = {\n    id?: string;\n    postId?: string;\n    text: React.ReactNode;\n    selectedValueText?: React.ReactNode;\n    subMenu?: Props[];\n    subMenuClass?: string;\n    icon?: React.ReactNode;\n    action?: (id?: string) => void;\n    filter?: (id?: string) => boolean;\n    ariaLabel?: string;\n    root?: boolean;\n    show?: boolean;\n    direction?: 'left' | 'right';\n    openUp?: boolean;\n    styleSelectableItem?: boolean;\n    extraText?: string;\n}\n\ntype State = {\n    show: boolean;\n}\n\nexport default class SubMenuItem extends React.PureComponent<Props, State> {\n    private node: React.RefObject<HTMLLIElement>;\n\n    public static defaultProps = {\n        show: true,\n        direction: 'left',\n        subMenuClass: 'pl-4',\n    };\n\n    public constructor(props: Props) {\n        super(props);\n        this.node = React.createRef();\n\n        this.state = {\n            show: false,\n        };\n    }\n\n    show = () => {\n        this.setState({show: true});\n    }\n\n    hide = () => {\n        this.setState({show: false});\n    }\n\n    private onClick = (event: React.SyntheticEvent<HTMLElement>) => {\n        event.preventDefault();\n        const {id, postId, subMenu, action, root} = this.props;\n        const isMobile = Utils.isMobile();\n        const pathPair = Object.entries(event.nativeEvent).find(([key]) => key === 'path');\n        let path: HTMLElement[] | undefined;\n        if (pathPair) {\n            path = pathPair[1];\n        }\n        if (isMobile) {\n            if (subMenu && subMenu.length) { // if contains a submenu, call openModal with it\n                if (!root) { //required to close only the original menu\n                    event.stopPropagation();\n                }\n                showMobileSubMenuModal(subMenu);\n            } else if (action) { // leaf node in the tree handles action only\n                action(postId);\n            }\n        } else if (\n            path && // the first 2 elements in path match original event id\n            path.slice(0, 2).find((e) => e.id === id) &&\n            action\n        ) {\n            action(postId);\n        } else if (\n            !path &&\n            !event.nativeEvent.composedPath &&\n            action\n        ) { //for tests only that don't contain `path` or `composedPath`\n            action(postId);\n        } else if (\n            !path &&\n            (event.nativeEvent.composedPath() as HTMLElement[]).slice(0, 2).find((e) => e.id === id) &&\n            action\n        ) {\n            action(postId);\n        }\n    }\n\n    handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n        if (Utils.isKeyPressed(event, Constants.KeyCodes.ENTER)) {\n            if (this.props.action) {\n                this.onClick(event);\n            } else {\n                this.show();\n            }\n        }\n\n        if (Utils.isKeyPressed(event, Constants.KeyCodes.RIGHT)) {\n            if (this.props.direction === 'right') {\n                this.show();\n            } else {\n                this.hide();\n            }\n        }\n\n        if (Utils.isKeyPressed(event, Constants.KeyCodes.LEFT)) {\n            if (this.props.direction === 'left') {\n                this.show();\n            } else {\n                this.hide();\n            }\n        }\n    }\n\n    public render() {\n        const {id, postId, text, selectedValueText, subMenu, icon, filter, ariaLabel, direction, styleSelectableItem, extraText} = this.props;\n        const isMobile = Utils.isMobile();\n\n        if (filter && !filter(id)) {\n            return ('');\n        }\n\n        const selectedValueElement = typeof selectedValueText === 'string' ? <span className='selected'>{selectedValueText}</span> : selectedValueText;\n\n        let textProp = text;\n        if (icon) {\n            textProp = (\n                <React.Fragment>\n                    <span className={classNames(['icon', {'sorting-menu-icon': styleSelectableItem}])}>{icon}</span>\n                    {textProp}\n                </React.Fragment>\n            );\n        }\n\n        const hasSubmenu = subMenu && subMenu.length;\n        const subMenuStyle: CSSProperties = {\n            visibility: (this.state.show && hasSubmenu && !isMobile ? 'visible' : 'hidden') as 'visible' | 'hidden',\n            top: this.node && this.node.current ? String(this.node.current.offsetTop) + 'px' : 'unset',\n        };\n\n        const menuOffset = '100%';\n        if (direction === 'left') {\n            subMenuStyle.right = menuOffset;\n        } else {\n            subMenuStyle.left = menuOffset;\n        }\n\n        let subMenuContent: React.ReactNode = '';\n\n        if (!isMobile) {\n            subMenuContent = (\n                <ul\n                    className={classNames(['a11y__popup Menu dropdown-menu SubMenu', {styleSelectableItem}])}\n                    style={subMenuStyle}\n                >\n                    {hasSubmenu ? subMenu!.map((s) => {\n                        const hasDivider = s.id === 'SidebarChannelMenu-moveToDivider';\n                        return (\n                            <span\n                                className={classNames(['SubMenuItemContainer', {hasDivider}])}\n                                key={s.id}\n                            >\n                                <SubMenuItem\n                                    id={s.id}\n                                    postId={postId}\n                                    text={s.text}\n                                    selectedValueText={s.selectedValueText}\n                                    icon={s.icon}\n                                    subMenu={s.subMenu}\n                                    action={s.action}\n                                    filter={s.filter}\n                                    ariaLabel={ariaLabel}\n                                    root={false}\n                                    direction={s.direction}\n                                />\n                                {s.text === selectedValueText && <span className='sorting-menu-checkbox'>\n                                    <i className='icon-check'/>\n                                </span>}\n                            </span>\n                        );\n                    }) : ''}\n                </ul>\n            );\n        }\n\n        return (\n            <li\n                className={classNames(['SubMenuItem MenuItem', {styleSelectableItem}])}\n                role='menuitem'\n                id={id + '_menuitem'}\n                ref={this.node}\n            >\n                <div\n                    className={classNames([{styleSelectableItemDiv: styleSelectableItem}])}\n                    id={id}\n                    aria-label={ariaLabel}\n                    onMouseEnter={this.show}\n                    onMouseLeave={this.hide}\n                    onClick={this.onClick}\n                    tabIndex={0}\n                    onKeyDown={this.handleKeyDown}\n                >\n                    <span className='MenuItem__primary-text'>\n                        {textProp}\n                        {selectedValueText && selectedValueElement}\n                        {id !== 'SidebarChannelMenu-moveToDivider' &&\n                            <span\n                                id={'channelHeaderDropdownIconRight_' + id}\n                                className={classNames([`fa fa-angle-right SubMenu__icon-right${hasSubmenu ? '' : '-empty'}`, {mobile: isMobile}])}\n                                aria-label={Utils.localizeMessage('post_info.submenu.icon', 'submenu icon').toLowerCase()}\n                            />\n                        }\n                    </span>\n                    {extraText && <span className='MenuItem__help-text'>{extraText}</span>}\n                    {subMenuContent}\n                </div>\n            </li>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport './menu_header.scss';\n\ntype Props = {\n    divider?: React.ReactNode;\n    children?: React.ReactNode;\n}\n\nexport default class MenuHeader extends React.PureComponent<Props> {\n    public render() {\n        const {children} = this.props;\n\n        return (\n            <li className='MenuHeader'>\n                {children}\n            </li>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport './menu_group.scss';\n\ntype Props = {\n    divider?: React.ReactNode;\n    children?: React.ReactNode;\n}\n\nexport default class MenuGroup extends React.PureComponent<Props> {\n    handleDividerClick = (e: React.MouseEvent): void => {\n        e.preventDefault();\n        e.stopPropagation();\n    }\n\n    public render() {\n        const {children} = this.props;\n\n        const divider = this.props.divider || (\n            <li\n                className='MenuGroup menu-divider'\n                onClick={this.handleDividerClick}\n            />\n        );\n\n        return (\n            <React.Fragment>\n                {divider}\n                {children}\n            </React.Fragment>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport menuItem from './menu_item';\n\ntype Props = {\n    onClick: (e: React.MouseEvent) => void;\n    ariaLabel?: string;\n    text: React.ReactNode;\n    extraText?: string;\n    id?: string;\n    buttonClass?: string;\n    rightDecorator?: React.ReactNode;\n    isDangerous?: boolean;\n}\nexport const MenuItemActionImpl = ({\n    onClick,\n    ariaLabel,\n    text,\n    extraText,\n    id,\n    buttonClass,\n    rightDecorator,\n    isDangerous,\n}: Props) => (\n    <button\n        data-testid={id}\n        id={id}\n        aria-label={ariaLabel}\n        className={\n            classNames([\n                'style--none',\n                {\n                    'MenuItem__with-help': extraText,\n                    [`${buttonClass}`]: buttonClass,\n                    MenuItem__dangerous: isDangerous,\n                },\n            ])\n        }\n        onClick={onClick}\n    >\n        {text && <span className='MenuItem__primary-text'>{text}{rightDecorator}</span>}\n        {extraText && <span className='MenuItem__help-text'>{extraText}</span>}\n    </button>\n);\n\nconst MenuItemAction = menuItem(MenuItemActionImpl);\nMenuItemAction.displayName = 'MenuItemAction';\n\nexport default MenuItemAction;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport menuItem from './menu_item';\n\ntype Props = {\n    url: string;\n    text: React.ReactNode;\n    onClick?: (event: React.MouseEvent<HTMLElement>) => void;\n}\nexport const MenuItemExternalLinkImpl: React.FC<Props> = ({url, text, onClick}: Props) => (\n    <a\n        target='_blank'\n        rel='noopener noreferrer'\n        href={url}\n        onClick={onClick}\n    >\n        <span className='MenuItem__primary-text'>\n            {text}\n        </span>\n    </a>\n);\n\nconst MenuItemExternalLink = menuItem(MenuItemExternalLinkImpl);\nMenuItemExternalLink.displayName = 'MenuItemExternalLink';\nexport default MenuItemExternalLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Link} from 'react-router-dom';\n\nimport menuItem from './menu_item';\n\ntype Props = {\n    to: string;\n    text: React.ReactNode;\n}\n\nexport const MenuItemLinkImpl: React.FC<Props> = ({to, text}: Props) => <Link to={to}><span className='MenuItem__primary-text'>{text}</span></Link>;\n\nconst MenuItemLink = menuItem(MenuItemLinkImpl);\nMenuItemLink.displayName = 'MenuItemLink';\n\nexport default MenuItemLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport './menu_item.scss';\n\ntype MenuTopNotificationProps = {\n    show: boolean;\n    id?: string;\n    children?: React.ReactNode;\n}\nconst MenuTopNotification: React.FC<MenuTopNotificationProps> = ({id, show, children}: MenuTopNotificationProps) => {\n    if (!show) {\n        return null;\n    }\n\n    return (\n        <li\n            className={'MenuTopNotification'}\n            role='menuitem'\n            id={id}\n        >\n            {children}\n        </li>\n    );\n};\nexport default MenuTopNotification;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {FC} from 'react';\n\nconst StartTrialModalSvg: FC = () => (\n    <svg\n        width='512'\n        height='156'\n        viewBox='0 0 512 156'\n        display='inline-block'\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n    >\n        <g\n            clipPath='url(#clip0)'\n            style={{transform: 'translate(135px, 10px)'}}\n        >\n            <path\n                d='M117.504 138.565C156.52 138.565 188.158 107.604 188.158 69.4C188.158 31.1964 156.52 0.235336 117.504 0.235336C78.4886 0.235336 46.851 31.1964 46.851 69.4C46.851 107.604 78.4886 138.565 117.504 138.565Z'\n                fill='#E8E9ED'\n                stroke='#E8E9ED'\n                strokeWidth='0.5'\n            />\n            <path\n                d='M97.7842 49.8971C100.351 52.3506 101.639 55.4564 101.639 59.2294C101.639 63.0023 100.351 66.1155 97.7842 68.5616C95.2171 71.0151 92.0367 72.2974 88.2504 72.4309H17.4471C12.4417 72.2974 8.28436 70.6148 4.96759 67.3682C1.65839 64.129 0 60.0596 0 55.1599C0 50.2603 1.65839 46.1909 4.96759 42.9443C8.27679 39.7051 12.4417 38.015 17.4471 37.8816C17.5834 31.3957 19.8476 25.9995 24.2473 21.7003C28.6394 17.4011 34.1522 15.1848 40.7781 15.0514C46.3212 15.044 51.1525 16.6302 55.2796 19.8101C59.4066 22.9901 62.1403 27.0891 63.4958 32.1222C65.7902 30.5359 68.4331 29.7354 71.4091 29.7354C75.3316 29.8688 78.6106 31.2253 81.2458 33.8048C83.8811 36.3843 85.2668 39.6013 85.4031 43.4335C85.4031 44.4935 85.2668 45.4867 84.9942 46.4133C86.0771 46.1465 87.1524 46.013 88.2428 46.013C92.0291 46.1539 95.2096 47.4436 97.7842 49.8971Z'\n                fill='#FFBC1F'\n            />\n            <path\n                d='M101.639 59.2301C101.639 55.4572 100.351 52.3514 97.7842 49.8979C95.2171 47.4518 92.0367 46.1621 88.2504 46.0286C87.1675 46.0286 86.0847 46.1621 85.0018 46.4289C85.2744 45.5024 85.4107 44.5091 85.4107 43.4491C85.2744 39.6095 83.8886 36.3999 81.2534 33.8204C78.6181 31.2409 75.3316 29.8696 71.4091 29.7361C68.4331 29.7361 65.7978 30.5293 63.4958 32.1229C62.1403 27.0899 59.4066 22.9908 55.2796 19.8109C51.1525 16.631 46.3212 15.0447 40.7781 15.0447C34.1522 15.1782 28.6394 17.3945 24.2473 21.6937C19.8476 26.0003 17.5834 31.3965 17.4471 37.875C12.4417 38.0084 8.28436 39.6984 4.96759 42.9377C1.65839 46.1917 0 50.2611 0 55.1607C0 55.1607 0.21203 42.6412 18.5906 39.6169C19.2797 22.4572 34.5687 17.7503 40.9296 17.7503C47.2905 17.7503 57.7028 20.7745 63.0338 34.3986C74.2563 27.505 86.804 35.9033 83.3661 48.5266C98.9958 45.1614 101.639 59.2301 101.639 59.2301Z'\n                fill='#F5AB00'\n            />\n            <path\n                d='M225.894 63.9064C227.346 65.2949 228.075 67.0526 228.075 69.1878C228.075 71.323 227.346 73.0848 225.894 74.4691C224.441 75.8576 222.641 76.5834 220.498 76.6589H180.429C177.596 76.5834 175.243 75.6311 173.366 73.7938C171.493 71.9606 170.555 69.6576 170.555 66.8848C170.555 64.112 171.493 61.809 173.366 59.9716C175.239 58.1385 177.596 57.182 180.429 57.1065C180.506 53.436 181.787 50.3821 184.277 47.9491C186.763 45.5161 189.882 44.2618 193.632 44.1863C196.769 44.1821 199.503 45.0798 201.839 46.8794C204.175 48.679 205.722 50.9988 206.489 53.8471C207.787 52.9494 209.283 52.4963 210.967 52.4963C213.187 52.5718 215.043 53.3395 216.534 54.7993C218.025 56.2591 218.81 58.0797 218.887 60.2485C218.887 60.8484 218.81 61.4105 218.655 61.9348C219.268 61.7838 219.877 61.7083 220.494 61.7083C222.637 61.788 224.436 62.5179 225.894 63.9064Z'\n                fill='#FFBC1F'\n            />\n            <path\n                d='M228.075 69.189C228.075 67.0538 227.346 65.2961 225.894 63.9076C224.441 62.5233 222.641 61.7934 220.498 61.7179C219.885 61.7179 219.272 61.7934 218.66 61.9444C218.814 61.42 218.891 60.8579 218.891 60.2581C218.814 58.0851 218.03 56.2687 216.538 54.8089C215.047 53.3491 213.187 52.573 210.967 52.4975C209.283 52.4975 207.792 52.9464 206.489 53.8483C205.722 50.9999 204.175 48.6802 201.839 46.8806C199.503 45.081 196.769 44.1833 193.632 44.1833C189.882 44.2588 186.763 45.513 184.277 47.9461C181.787 50.3833 180.506 53.4372 180.429 57.1035C177.596 57.179 175.243 58.1354 173.366 59.9686C171.493 61.8102 170.555 64.1132 170.555 66.886C170.555 66.886 170.675 59.8008 181.076 58.0893C181.466 48.3781 190.118 45.7144 193.718 45.7144C197.318 45.7144 203.21 47.4259 206.227 55.1361C212.579 51.2349 219.68 55.9877 217.734 63.1316C226.579 61.2271 228.075 69.189 228.075 69.189Z'\n                fill='#F5AB00'\n            />\n            <path\n                d='M199.061 63.0908L190.387 73.9565H194.064V92.2097H203.809V73.9702V73.9565H207.74L199.061 63.0908Z'\n                fill='#386FE5'\n            />\n            <path\n                d='M49.3268 40.2811L28.7566 65.8203H37.4771V108.225H60.5857V65.8523V65.8203H69.9079L49.3268 40.2811Z'\n                fill='#386FE5'\n            />\n            <mask\n                id='mask0'\n                mask-type='alpha'\n                maskUnits='userSpaceOnUse'\n                x='47'\n                y='0'\n                width='141'\n                height='139'\n            >\n                <path\n                    d='M117.504 138.315C156.387 138.315 187.908 107.46 187.908 69.4C187.908 31.3395 156.387 0.485336 117.504 0.485336C78.6216 0.485336 47.101 31.3395 47.101 69.4C47.101 107.46 78.6216 138.315 117.504 138.315Z'\n                    fill='#E8E9ED'\n                />\n            </mask>\n            <g mask='url(#mask0)'>\n                <path\n                    d='M54.6396 94.6503C55.2591 91.4217 56.4956 88.343 57.7274 85.2854C59.0477 82.0077 60.3799 78.7019 62.2527 75.6864C66.6201 68.6627 73.7333 63.594 81.3871 60.2062C89.0408 56.8185 96.3645 54.9034 104.554 53.0679C101.87 55.8961 101.052 59.4968 99.4475 63.0227C95.702 71.2498 92.4826 79.6945 89.2656 88.1323C84.4358 100.792 79.6084 113.45 74.7833 126.107C64.3096 120.069 56.785 109.348 54.7855 97.6119L54.6396 94.6503Z'\n                    fill='white'\n                />\n                <path\n                    d='M134.964 53.3651C139.63 54.8775 146.923 57.5418 146.923 57.5418C146.923 57.5418 163.665 104.783 167.375 127.544C167.485 128.214 167.583 128.949 167.268 129.544C166.806 130.419 165.689 130.686 164.778 131.105C162.69 132.061 161.369 134.102 159.561 135.5C158.002 136.701 156.107 137.401 154.244 138.075C137.659 144.026 119.647 149.004 102.522 144.759C101.438 144.49 100.319 144.162 99.4936 143.422C98.776 142.769 98.3383 141.861 97.9437 140.974C92.7272 129.267 82.4831 105.083 82.5835 87.973C82.7007 68.2037 93.6456 56.1534 93.825 55.8983C94.2531 55.2919 110.271 51.1947 120.135 50.9817C120.144 50.9864 131.041 52.0914 134.964 53.3651Z'\n                    fill='white'\n                />\n                <mask\n                    id='mask1'\n                    mask-type='alpha'\n                    maskUnits='userSpaceOnUse'\n                    x='82'\n                    y='50'\n                    width='86'\n                    height='97'\n                >\n                    <path\n                        d='M134.964 53.3651C139.63 54.8775 146.923 57.5418 146.923 57.5418C146.923 57.5418 163.665 104.783 167.375 127.544C167.485 128.214 167.583 128.949 167.268 129.544C166.806 130.419 165.689 130.686 164.778 131.105C162.69 132.061 161.369 134.102 159.561 135.5C158.002 136.701 156.107 137.401 154.244 138.075C137.659 144.026 119.647 149.004 102.522 144.759C101.438 144.49 100.319 144.162 99.4936 143.422C98.776 142.769 98.3383 141.861 97.9437 140.974C92.7272 129.267 82.4831 105.083 82.5835 87.973C82.7007 68.2037 93.6456 56.1534 93.825 55.8983C94.2531 55.2919 110.271 51.1947 120.135 50.9817C120.144 50.9864 131.041 52.0914 134.964 53.3651Z'\n                        fill='white'\n                    />\n                </mask>\n                <g mask='url(#mask1)'>\n                    <rect\n                        x='82.3802'\n                        y='50.9582'\n                        width='85.148'\n                        height='82.6451'\n                        fill='url(#pattern0)'\n                    />\n                    <rect\n                        x='82.3802'\n                        y='50.9582'\n                        width='74.6241'\n                        height='95.5218'\n                        fill='url(#pattern1)'\n                    />\n                </g>\n                <path\n                    d='M84.3219 100.889C83.7064 98.6605 83.0902 96.4317 82.4731 94.2028C82.4443 94.1173 82.3831 94.0459 82.3021 94.0033C82.221 93.9607 82.1264 93.9502 82.0377 93.974C81.949 93.9977 81.873 94.0539 81.8254 94.1309C81.7778 94.2079 81.7622 94.2998 81.7818 94.3878C82.3989 96.6166 83.0152 98.8462 83.6307 101.077C83.6582 101.164 83.7195 101.237 83.8013 101.281C83.8832 101.325 83.9793 101.336 84.0692 101.311C84.1591 101.287 84.2358 101.229 84.283 101.151C84.3302 101.072 84.3441 100.978 84.3219 100.889Z'\n                    fill='#1D1400'\n                />\n                <path\n                    d='M81.4944 92.3346L81.3222 91.5573C81.2934 91.4718 81.2321 91.4004 81.1511 91.3578C81.0701 91.3152 80.9755 91.3047 80.8868 91.3284C80.7981 91.3522 80.7221 91.4083 80.6745 91.4853C80.6268 91.5623 80.6113 91.6543 80.6309 91.7422L80.8031 92.5219C80.8294 92.6108 80.89 92.6863 80.9722 92.7322C81.0544 92.7781 81.1516 92.7908 81.2432 92.7677C81.3317 92.7386 81.4057 92.6777 81.4501 92.5973C81.4945 92.5169 81.506 92.423 81.4824 92.3346H81.4944Z'\n                    fill='#1D1400'\n                />\n            </g>\n            <path\n                d='M145.561 57.0946C150.823 58.7334 168.01 64.4273 172.009 68.5853C186.157 83.2952 191.928 122.918 192.376 126.608C193.021 131.789 191.558 143.465 186.157 146.742C183.198 148.538 174.437 142.762 169.893 138.08C163.562 131.555 160.483 114.845 159.213 105.932C156.884 89.586 145.561 57.0946 145.561 57.0946Z'\n                fill='white'\n            />\n            <path\n                d='M122.065 51.2391L151.268 49.5137C151.268 49.5137 152.225 45.5547 149.439 40.9612C147.829 38.3062 144.949 36.8617 143.06 33.2C141.247 29.6882 141.479 25.6262 140.752 22.0277C139.199 14.3392 133.5 8.19112 130.639 6.88004C123.782 3.73578 122.065 51.2391 122.065 51.2391Z'\n                fill='#1D1400'\n            />\n            <path\n                d='M112.684 49.5534C108.962 52.611 111.155 68.55 119.529 68.55C128.702 68.55 128.075 46.3084 128.737 46.175C131.78 45.592 134.904 43.9953 136.843 36.9014C137.121 35.89 137.126 35.2626 137.305 34.305C137.398 33.8157 138.111 27.1572 137.912 19.8667C137.824 16.5515 134.456 6.36955 122.289 8.95894C107.077 12.1945 109.696 26.6352 111.177 29.7326C112.045 31.547 113.275 36.0258 113.48 38.4255C113.731 41.317 113.1 49.2092 112.684 49.5534Z'\n                fill='#CB8E00'\n            />\n            <path\n                opacity='0.3'\n                d='M128.711 46.154C128.045 46.2766 127.369 46.3393 126.69 46.3413C124.979 46.3388 123.29 45.9587 121.749 45.2292H121.73C121.694 45.2131 121.657 45.1991 121.62 45.1871C120.955 44.9857 120.61 45.9573 121.24 46.2476C122.483 46.8343 123.629 47.5997 124.641 48.5186C125.678 49.4739 126.494 50.6364 127.032 51.9274C127.373 52.5704 127.651 53.2429 127.865 53.9362C128.403 49.7407 128.468 46.2593 128.726 46.1868L128.711 46.154Z'\n                fill='black'\n            />\n            <path\n                d='M111.636 7.62455C117.415 2.56985 125.549 4.52243 129.096 6.05827C135.188 8.69917 137.037 14.8332 137.037 14.8332C135.626 16.5446 136.236 18.0828 134.667 20.1828C132.835 22.6388 130.584 20.5855 126.838 23.5565C125.306 24.7888 124.061 26.3279 123.186 28.0704C123.186 28.0704 121.926 25.6004 120.395 25.6215C118.642 25.6473 117.585 27.2604 118.07 28.8992C118.422 30.0815 119.804 32.8114 119.804 32.8114L114.32 46.5544C113.754 47.9729 112.686 49.1455 111.311 49.8587C109.936 50.5719 108.346 50.7785 106.829 50.4408L74.2858 40.2167C77.3545 33.3382 82.4706 32.4743 86.3811 29.1872C90.208 25.961 91.1839 22.6622 94.3817 20.1992C98.1536 17.2914 104.042 15.6011 105.697 13.9856C110.402 9.39217 107.977 10.825 111.636 7.62455Z'\n                fill='#1D1400'\n            />\n            <mask\n                id='mask2'\n                mask-type='alpha'\n                maskUnits='userSpaceOnUse'\n                x='74'\n                y='4'\n                width='64'\n                height='47'\n            >\n                <path\n                    d='M111.636 7.62455C117.415 2.56985 125.549 4.52243 129.096 6.05827C135.188 8.69917 137.037 14.8332 137.037 14.8332C135.626 16.5446 136.236 18.0828 134.667 20.1828C132.835 22.6388 130.584 20.5855 126.838 23.5565C125.306 24.7888 124.061 26.3279 123.186 28.0704C123.186 28.0704 121.926 25.6004 120.395 25.6215C118.642 25.6473 117.585 27.2604 118.07 28.8992C118.422 30.0815 119.804 32.8114 119.804 32.8114L114.32 46.5544C113.754 47.9729 112.686 49.1455 111.311 49.8587C109.936 50.5719 108.346 50.7785 106.829 50.4408L74.2858 40.2167C77.3545 33.3382 82.4706 32.4743 86.3811 29.1872C90.208 25.961 91.1839 22.6622 94.3817 20.1992C98.1536 17.2914 104.042 15.6011 105.697 13.9856C110.402 9.39217 107.977 10.825 111.636 7.62455Z'\n                    fill='#1D1400'\n                />\n            </mask>\n            <g mask='url(#mask2)'>\n                <rect\n                    x='74.2472'\n                    y='4.36786'\n                    width='53.3371'\n                    height='46.3562'\n                    fill='url(#pattern2)'\n                />\n            </g>\n            <path\n                d='M132.08 67.6581C130.776 64.1323 129.927 60.5385 131.051 56.9494C132.534 52.171 134.321 51.9509 138.868 49.6916C143.414 47.4323 144.18 46.1517 146.954 41.3288C147.607 40.1909 148.289 40.4321 148.425 41.2937C148.545 42.0522 148.425 43.6349 148.425 43.6349C148.425 43.6349 150.339 37.7818 151.056 37.5477C152.436 37.0958 152.783 39.9545 152.97 40.5913C153.792 43.4125 153.209 44.8055 151.295 49.9562C150.049 53.3065 147.325 57.3357 144.228 59.2555C143.032 59.9953 141.597 60.8733 141.513 62.7673C141.482 63.4931 142.018 64.1229 142.446 64.7152C144.94 68.1545 164.998 91.3138 167.923 94.0601C177.452 103.008 185.67 109.709 189.564 122.061C191.274 127.49 189.803 141.493 188.368 144.537C185.02 151.631 172.822 142.196 167.799 135.874C156.636 121.822 136.519 79.6803 132.08 67.6581Z'\n                fill='#CB8E00'\n            />\n            <mask\n                id='mask3'\n                mask-type='alpha'\n                maskUnits='userSpaceOnUse'\n                x='130'\n                y='37'\n                width='61'\n                height='111'\n            >\n                <path\n                    d='M132.08 67.6581C130.776 64.1323 129.927 60.5385 131.051 56.9494C132.534 52.171 134.321 51.9509 138.868 49.6916C143.414 47.4323 144.18 46.1517 146.954 41.3288C147.607 40.1909 148.289 40.4321 148.425 41.2937C148.545 42.0522 148.425 43.6349 148.425 43.6349C148.425 43.6349 150.339 37.7818 151.056 37.5477C152.436 37.0958 152.783 39.9545 152.97 40.5913C153.792 43.4125 153.209 44.8055 151.295 49.9562C150.049 53.3065 147.325 57.3357 144.228 59.2555C143.032 59.9953 141.597 60.8733 141.513 62.7673C141.482 63.4931 142.018 64.1229 142.446 64.7152C144.94 68.1545 164.998 91.3138 167.923 94.0601C177.452 103.008 185.67 109.709 189.564 122.061C191.274 127.49 189.803 141.493 188.368 144.537C185.02 151.631 172.822 142.196 167.799 135.874C156.636 121.822 136.519 79.6803 132.08 67.6581Z'\n                    fill='#674600'\n                />\n            </mask>\n            <g mask='url(#mask3)'>\n                <rect\n                    x='130.456'\n                    y='37.3792'\n                    width='37.5512'\n                    height='76.0897'\n                    fill='url(#pattern3)'\n                />\n            </g>\n            <path\n                d='M190.041 122.059C186.147 109.706 177.451 103.006 167.922 94.0577C167.343 93.5146 166.099 92.1848 164.454 90.3539C164.353 90.464 164.255 90.588 164.155 90.684C160.768 94.3644 156.587 97.0053 151.885 98.7542C150.256 99.3606 147.247 99.9553 145.561 100.18C152.669 114.298 161.043 129.515 166.762 136.703C171.785 143.024 185.499 151.619 188.845 144.525C190.28 141.491 191.751 127.488 190.041 122.059Z'\n                fill='white'\n            />\n            <path\n                d='M95.0299 134.636C97.426 135.825 99.7521 137.144 101.997 138.588C105.286 140.749 114.824 140.187 114.824 140.187C114.824 140.187 119.692 150.238 120.194 146.827C120.455 145.05 119.677 143.999 119.445 142.226C120.436 143.502 121.036 144.186 121.526 145.715C122.017 147.244 121.84 148.62 121.619 150.163C121.452 151.322 122.045 151.844 122.665 151.898C123.861 151.999 124.1 150.664 124.698 150.475C129.802 148.836 128.749 146.981 129.201 142.409C129.163 147.976 128.845 147.508 126.532 150.709C126.068 151.35 126.932 152.113 129.163 150.863C130.916 149.849 132.103 148.756 132.911 146.181C133.787 143.51 133.582 140.612 132.337 138.085C129.57 132.543 127.367 130.698 121.11 129.949C114.853 129.2 107.63 128.65 103.172 130.183C101.44 130.78 95.0299 134.636 95.0299 134.636Z'\n                fill='#CB8E00'\n            />\n            <path\n                d='M182.266 107.644C176.867 101.505 171.325 95.4961 165.639 89.6165C165.572 89.5567 165.484 89.524 165.393 89.525C165.303 89.5259 165.216 89.5603 165.15 89.6214C165.084 89.6825 165.045 89.7657 165.039 89.8542C165.033 89.9428 165.062 90.0301 165.12 90.0988C170.804 95.9846 176.347 101.994 181.747 108.126C182.049 108.47 182.568 107.986 182.266 107.644Z'\n                fill='#1D1400'\n            />\n            <path\n                d='M160.311 126.231L160.472 126.388C160.54 126.452 160.631 126.487 160.725 126.487C160.82 126.487 160.911 126.452 160.979 126.388C161.045 126.321 161.083 126.232 161.083 126.139C161.083 126.047 161.045 125.957 160.979 125.891L160.819 125.734C160.786 125.7 160.746 125.672 160.702 125.653C160.658 125.634 160.611 125.623 160.562 125.623C160.514 125.622 160.466 125.63 160.422 125.648C160.377 125.666 160.336 125.692 160.302 125.725C160.268 125.759 160.241 125.799 160.223 125.842C160.205 125.886 160.196 125.933 160.197 125.98C160.198 126.027 160.209 126.074 160.228 126.117C160.248 126.16 160.276 126.199 160.311 126.231Z'\n                fill='white'\n            />\n            <path\n                d='M160.381 126.746C155.218 118.275 150.381 109.625 145.872 100.796C145.666 100.393 145.047 100.746 145.253 101.152C149.759 109.973 154.595 118.623 159.761 127.102C159.809 127.182 159.888 127.24 159.981 127.264C160.073 127.287 160.171 127.274 160.253 127.227C160.335 127.18 160.395 127.102 160.419 127.012C160.443 126.922 160.429 126.826 160.381 126.746Z'\n                fill='#1D1400'\n            />\n            <path\n                d='M148.121 43.8619C147.681 45.0332 147.098 46.148 146.385 47.1818C146.126 47.5564 146.748 47.9099 147.004 47.5353C147.748 46.4482 148.355 45.2778 148.815 44.0492C148.972 43.6231 148.281 43.4405 148.121 43.8619Z'\n                fill='black'\n            />\n            <path\n                d='M145.975 48.7621H146.095C146.19 48.7621 146.281 48.7251 146.348 48.6593C146.416 48.5934 146.453 48.5041 146.453 48.4109C146.453 48.3178 146.416 48.2285 146.348 48.1626C146.281 48.0968 146.19 48.0598 146.095 48.0598H145.975C145.88 48.0598 145.789 48.0968 145.721 48.1626C145.654 48.2285 145.616 48.3178 145.616 48.4109C145.616 48.5041 145.654 48.5934 145.721 48.6593C145.789 48.7251 145.88 48.7621 145.975 48.7621Z'\n                fill='black'\n            />\n            <path\n                d='M151.529 42.2161C151.112 44.3131 150.312 46.319 149.166 48.137C148.927 48.5233 149.544 48.8745 149.785 48.4906C150.964 46.6214 151.789 44.5593 152.22 42.4034C152.311 41.9609 151.617 41.7713 151.529 42.2161Z'\n                fill='black'\n            />\n            <path\n                d='M148.965 49.4646C149.06 49.4646 149.151 49.4276 149.219 49.3617C149.286 49.2959 149.324 49.2065 149.324 49.1134C149.324 49.0203 149.286 48.9309 149.219 48.8651C149.151 48.7992 149.06 48.7622 148.965 48.7622C148.87 48.7622 148.779 48.7992 148.711 48.8651C148.644 48.9309 148.606 49.0203 148.606 49.1134C148.606 49.2065 148.644 49.2959 148.711 49.3617C148.779 49.4276 148.87 49.4646 148.965 49.4646Z'\n                fill='black'\n            />\n            <path\n                d='M119.709 139.555L119.039 138.129C118.845 137.719 118.226 138.075 118.42 138.482C118.641 138.951 118.865 139.426 119.089 139.908C119.283 140.318 119.9 139.962 119.709 139.555Z'\n                fill='#1D1400'\n            />\n            <path\n                d='M127.446 136.165C128.286 138.026 128.609 140.021 128.661 142.043C128.697 142.846 128.683 143.649 128.621 144.45C128.503 145.635 127.774 146.384 126.946 147.178C126.614 147.494 127.123 147.99 127.453 147.674C128.113 147.049 128.81 146.379 129.128 145.515C129.482 144.579 129.398 143.446 129.388 142.472C129.364 140.177 129.02 137.932 128.068 135.82C127.881 135.408 127.264 135.764 127.449 136.174L127.446 136.165Z'\n                fill='#1D1400'\n            />\n            <path\n                d='M124.781 142.397C125.072 143.671 125.139 144.985 124.982 146.281C124.93 146.728 125.647 146.726 125.7 146.281C125.86 144.921 125.783 143.544 125.473 142.21C125.372 141.77 124.679 141.957 124.781 142.397Z'\n                fill='#1D1400'\n            />\n            <path\n                d='M124.59 139.15C124.398 138.299 124.309 137.429 124.325 136.558C124.325 136.106 123.607 136.106 123.607 136.558C123.592 137.492 123.69 138.425 123.899 139.337C124 139.777 124.691 139.59 124.59 139.15Z'\n                fill='#1D1400'\n            />\n            <path\n                d='M128.768 27.8247H128.701C128.445 27.8247 128.198 27.9246 128.016 28.1024C127.835 28.2802 127.733 28.5214 127.733 28.7729C127.733 29.0243 127.835 29.2655 128.016 29.4433C128.198 29.6212 128.445 29.7211 128.701 29.7211H128.768C129.025 29.7211 129.272 29.6212 129.453 29.4433C129.635 29.2655 129.737 29.0243 129.737 28.7729C129.737 28.5214 129.635 28.2802 129.453 28.1024C129.272 27.9246 129.025 27.8247 128.768 27.8247Z'\n                fill='black'\n            />\n            <path\n                d='M135.585 29.4471H135.516C135.259 29.4471 135.013 29.5469 134.832 29.7245C134.65 29.9021 134.548 30.143 134.548 30.3942C134.548 30.6453 134.65 30.8862 134.832 31.0638C135.013 31.2414 135.259 31.3412 135.516 31.3412H135.585C135.842 31.3412 136.088 31.2414 136.269 31.0638C136.451 30.8862 136.553 30.6453 136.553 30.3942C136.553 30.143 136.451 29.9021 136.269 29.7245C136.088 29.5469 135.842 29.4471 135.585 29.4471Z'\n                fill='black'\n            />\n            <path\n                d='M126.41 37.379C127.381 38.4247 128.504 39.3255 129.742 40.0527C129.117 40.8768 127.752 40.9237 126.943 40.2728C126.135 39.6219 125.876 38.4607 126.14 37.4633'\n                fill='black'\n            />\n            <path\n                d='M131.811 36.8033C132.529 36.6465 134.153 36.6231 134.267 35.6514C134.346 34.9772 133.631 34.0805 133.411 33.4788C133.007 32.4336 132.778 31.3316 132.732 30.2151C132.732 29.6954 131.895 29.693 131.904 30.2151C131.963 31.669 132.303 33.0988 132.904 34.4293C132.997 34.6424 133.289 35.0287 133.301 35.2628C133.332 35.8622 133.244 35.5578 132.823 35.7451C132.462 35.9066 131.976 35.9301 131.586 36.0143C131.065 36.1267 131.287 36.911 131.806 36.7963L131.811 36.8033Z'\n                fill='black'\n            />\n            <path\n                opacity='0.3'\n                d='M142.445 64.7129C139.192 62.5027 138.618 59.0939 142.445 57.0945C146.272 55.0951 150.671 51.4241 150.671 51.4241C150.671 51.4241 148.568 57.043 144.227 59.2485C139.886 61.4539 142.445 64.7129 142.445 64.7129Z'\n                fill='black'\n            />\n        </g>\n        <defs>\n            <pattern\n                id='pattern0'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    transform='scale(0.00280899)'\n                />\n            </pattern>\n            <pattern\n                id='pattern1'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    transform='scale(0.00320513 0.00245098)'\n                />\n            </pattern>\n            <pattern\n                id='pattern2'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    transform='scale(0.0044843 0.00505051)'\n                />\n            </pattern>\n            <pattern\n                id='pattern3'\n                patternContentUnits='objectBoundingBox'\n                width='1'\n                height='1'\n            >\n                <use\n                    transform='scale(0.00636943 0.00307692)'\n                />\n            </pattern>\n            <clipPath id='clip0'>\n                <rect\n                    width='236'\n                    height='156'\n                    fill='white'\n                />\n            </clipPath>\n        </defs>\n    </svg>\n);\n\nexport default StartTrialModalSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport {useSelector, useDispatch} from 'react-redux';\nimport {Modal, Button} from 'react-bootstrap';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useHistory} from 'react-router-dom';\n\nimport {isModalOpen} from 'selectors/views/modals';\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {ModalIdentifiers} from 'utils/constants';\nimport {closeModal} from 'actions/views/modals';\nimport {getLicenseConfig} from 'mattermost-redux/actions/general';\nimport {requestTrialLicense} from 'actions/admin_actions';\nimport {getStandardAnalytics} from 'mattermost-redux/actions/admin';\nimport {DispatchFunc} from 'mattermost-redux/types/actions';\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\n\nimport StartTrialModalSvg from './start_trial_modal_svg';\n\nimport './start_trial_modal.scss';\n\nenum TrialLoadStatus {\n    NotStarted = 'NOT_STARTED',\n    Started = 'STARTED',\n    Success = 'SUCCESS',\n    Failed = 'FAILED'\n}\n\nfunction StartTrialModal(): JSX.Element | null {\n    const [status, setLoadStatus] = useState(TrialLoadStatus.NotStarted);\n    const dispatch = useDispatch<DispatchFunc>();\n\n    useEffect(() => {\n        dispatch(getStandardAnalytics());\n    }, []);\n\n    const {formatMessage} = useIntl();\n    const history = useHistory();\n    const show = useSelector((state: GlobalState) => isModalOpen(state, ModalIdentifiers.START_TRIAL_MODAL));\n    const stats = useSelector((state: GlobalState) => state.entities.admin.analytics);\n\n    const requestLicense = async () => {\n        setLoadStatus(TrialLoadStatus.Started);\n        let users = 0;\n        if (stats && (typeof stats.TOTAL_USERS === 'number')) {\n            users = stats.TOTAL_USERS;\n        }\n        const requestedUsers = Math.max(users, 30);\n        const {error} = await dispatch(requestTrialLicense(requestedUsers, true, true, 'license'));\n        if (error) {\n            setLoadStatus(TrialLoadStatus.Failed);\n        }\n\n        setLoadStatus(TrialLoadStatus.Success);\n        await dispatch(getLicenseConfig());\n        dispatch(closeModal(ModalIdentifiers.START_TRIAL_MODAL));\n        history.push('/admin_console/about/license');\n    };\n\n    const btnText = (status: TrialLoadStatus): string => {\n        switch (status) {\n        case TrialLoadStatus.Started:\n            return formatMessage({id: 'start_trial.modal.loading', defaultMessage: 'Loading...'});\n        case TrialLoadStatus.Success:\n            return formatMessage({id: 'start_trial.modal.loaded', defaultMessage: 'Loaded!'});\n        case TrialLoadStatus.Failed:\n            return formatMessage({id: 'start_trial.modal.failed', defaultMessage: 'Failed'});\n        default:\n            return formatMessage({id: 'start_trial.modal_btn.start', defaultMessage: 'Start 30-day trial'});\n        }\n    };\n\n    if (!show) {\n        return null;\n    }\n\n    return (\n        <Modal\n            className={'StartTrialModal'}\n            show={show}\n            id='startTrialModal'\n            role='dialog'\n            onHide={() => dispatch(closeModal(ModalIdentifiers.START_TRIAL_MODAL))}\n        >\n            <Modal.Header closeButton={true}/>\n            <Modal.Body>\n                <StartTrialModalSvg/>\n                <div className='title'>\n                    <FormattedMessage\n                        id='start_trial.modal_title'\n                        defaultMessage='Start your free Enterprise trial now'\n                    />\n                </div>\n                <div className='description'>\n                    <FormattedMessage\n                        id='start_trial.modal_body'\n                        defaultMessage='Start Enterprise for free to try advanced security and compliance features with premium support.'\n                    />\n                </div>\n                <div className='buttons'>\n                    <Button\n                        className='dismiss-btn'\n                        onClick={() => dispatch(closeModal(ModalIdentifiers.START_TRIAL_MODAL))}\n                    >\n                        <FormattedMessage\n                            id='start_trial.modal_btn.nottnow'\n                            defaultMessage='Not now'\n                        />\n                    </Button>\n                    <Button\n                        className='confirm-btn'\n                        onClick={requestLicense}\n                    >\n                        {btnText(status)}\n                    </Button>\n                </div>\n                <div className='disclaimer'>\n                    <span>\n                        <FormattedMarkdownMessage\n                            id='start_trial.modal.disclaimer'\n                            defaultMessage='By clicking “Start 30-day trial”, I agree to the [Mattermost Software Evaluation Agreement, Privacy Policy,](!https://mattermost.com/software-evaluation-agreement) and receiving product emails.'\n                        />\n                    </span>\n                </div>\n            </Modal.Body>\n        </Modal>\n    );\n}\n\nexport default StartTrialModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {openModal} from 'actions/views/modals';\nimport StartTrialModal from 'components/start_trial_modal';\nimport {getPrevTrialLicense} from 'mattermost-redux/actions/admin';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport './menu_item.scss';\n\ntype Props = {\n    id: string;\n}\n\nconst MenuStartTrial = (props: Props): JSX.Element | null => {\n    const {formatMessage} = useIntl();\n    const dispatch = useDispatch();\n\n    useEffect(() => {\n        dispatch(getPrevTrialLicense());\n    }, []);\n\n    const openStartTrialModal = () => {\n        dispatch(openModal({\n            modalId: ModalIdentifiers.START_TRIAL_MODAL,\n            dialogType: StartTrialModal,\n        }));\n    };\n\n    const prevTrialLicense = useSelector((state: GlobalState) => state.entities.admin.prevTrialLicense);\n    const currentLicense = useSelector(getLicense);\n    const isPrevLicensed = prevTrialLicense?.IsLicensed;\n    const isCurrentLicensed = currentLicense?.IsLicensed;\n\n    // Show this CTA if the instance is currently not licensed and has never had a trial license loaded before\n    const show = (isCurrentLicensed === 'false') && (isPrevLicensed === 'false');\n\n    if (!show) {\n        return null;\n    }\n\n    return (\n        <li\n            className={'MenuStartTrial'}\n            role='menuitem'\n            id={props.id}\n        >\n            <span>{formatMessage({id: 'navbar_dropdown.tryTrialNow', defaultMessage: 'Try Enterprise for free now!'})}</span>\n            <button onClick={openStartTrialModal}>{formatMessage({id: 'navbar_dropdown.startTrial', defaultMessage: 'Start Trial'})}</button>\n        </li>\n    );\n};\n\nexport default MenuStartTrial;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport classNames from 'classnames';\n\nimport {Dictionary} from 'mattermost-redux/types/utilities';\n\nimport ToggleModalButtonRedux from 'components/toggle_modal_button_redux';\n\nimport menuItem from './menu_item';\n\ntype Props = {\n    modalId: string;\n    dialogType: React.ComponentType<any>;\n    dialogProps?: Dictionary<any>;\n    extraText?: string;\n    text?: React.ReactNode;\n    ariaLabel?: string;\n    className?: string;\n    children?: React.ReactNode;\n    sibling?: React.ReactNode;\n    showUnread?: boolean;\n}\n\nexport const MenuItemToggleModalReduxImpl: React.FC<Props> = ({modalId, dialogType, dialogProps, text, ariaLabel, extraText, children, className, sibling, showUnread}: Props) => (\n    <>\n        <ToggleModalButtonRedux\n            ariaLabel={ariaLabel}\n            modalId={modalId}\n            dialogType={dialogType}\n            dialogProps={dialogProps}\n            className={classNames({\n                'MenuItem__with-help': extraText,\n                [`${className}`]: className,\n            })}\n            showUnread={showUnread}\n        >\n            {text && <span className='MenuItem__primary-text'>{text}</span>}\n            {extraText && <span className='MenuItem__help-text'>{extraText}</span>}\n            {children}\n        </ToggleModalButtonRedux>\n        {sibling}\n    </>\n);\n\nconst MenuItemToggleModalRedux = menuItem(MenuItemToggleModalReduxImpl);\nMenuItemToggleModalRedux.displayName = 'MenuItemToggleModalRedux';\n\nexport default MenuItemToggleModalRedux;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {CSSProperties} from 'react';\nimport classNames from 'classnames';\n\nimport {isMobile} from 'utils/utils';\n\nimport SubMenuItem from './menu_items/submenu_item';\n\nimport MenuHeader from './menu_header';\nimport MenuGroup from './menu_group';\nimport MenuItemAction from './menu_items/menu_item_action';\nimport MenuItemExternalLink from './menu_items/menu_item_external_link';\nimport MenuItemLink from './menu_items/menu_item_link';\nimport MenuTopNotification from './menu_items/menu_top_notification';\nimport MenuStartTrial from './menu_items/menu_start_trial';\nimport MenuItemToggleModalRedux from './menu_items/menu_item_toggle_modal_redux';\n\nimport './menu.scss';\n\ntype Props = {\n    children?: React.ReactNode;\n    openLeft?: boolean;\n    openUp?: boolean;\n    id?: string;\n    ariaLabel: string;\n    customStyles?: CSSProperties;\n    className?: string;\n}\n\nexport default class Menu extends React.PureComponent<Props> {\n    public static Header = MenuHeader\n    public static Group = MenuGroup\n    public static ItemAction = MenuItemAction\n    public static ItemExternalLink = MenuItemExternalLink\n    public static ItemLink = MenuItemLink\n    public static ItemToggleModalRedux = MenuItemToggleModalRedux\n    public static ItemSubMenu = SubMenuItem\n    public static TopNotification = MenuTopNotification\n    public static StartTrial = MenuStartTrial\n\n    public node: React.RefObject<HTMLUListElement>; //Public because it is used by tests\n    private observer: MutationObserver;\n\n    public constructor(props: Props) {\n        super(props);\n        this.node = React.createRef();\n        this.observer = new MutationObserver(this.hideUnneededDividers);\n    }\n\n    public hideUnneededDividers = () => { //Public because it is used by tests\n        if (this.node.current === null) {\n            return;\n        }\n\n        this.observer.disconnect();\n        const children = Object.values(this.node.current.children).slice(0, this.node.current.children.length) as HTMLElement[];\n\n        // Hiding dividers at beginning and duplicated ones\n        let prevWasDivider = false;\n        let isAtBeginning = true;\n        for (const child of children) {\n            if (child.classList.contains('menu-divider') || child.classList.contains('mobile-menu-divider')) {\n                child.style.display = 'block';\n                if (isAtBeginning || prevWasDivider) {\n                    child.style.display = 'none';\n                }\n                prevWasDivider = true;\n            } else {\n                isAtBeginning = false;\n                prevWasDivider = false;\n            }\n        }\n        children.reverse();\n\n        // Hiding trailing dividers\n        for (const child of children) {\n            if (child.classList.contains('menu-divider') || child.classList.contains('mobile-menu-divider')) {\n                child.style.display = 'none';\n            } else {\n                break;\n            }\n        }\n        this.observer.observe(this.node.current, {attributes: true, childList: true, subtree: true});\n    }\n\n    public componentDidMount() {\n        this.hideUnneededDividers();\n    }\n\n    public componentDidUpdate() {\n        this.hideUnneededDividers();\n    }\n\n    public componentWillUnmount() {\n        this.observer.disconnect();\n    }\n\n    // Used from DotMenu component to know in which direction show the menu\n    public rect() {\n        if (this.node && this.node.current) {\n            return this.node.current.getBoundingClientRect();\n        }\n        return null;\n    }\n\n    handleMenuClick = (e: React.MouseEvent) => {\n        if (e.target === this.node.current) {\n            e.preventDefault();\n            e.stopPropagation();\n        }\n    }\n\n    public render() {\n        const {children, openUp, openLeft, id, ariaLabel, customStyles} = this.props;\n        let styles: CSSProperties = {};\n        if (customStyles) {\n            styles = customStyles;\n        } else {\n            if (openLeft) {\n                styles.left = 'inherit';\n                styles.right = 0;\n            }\n            if (openUp && !isMobile()) {\n                styles.bottom = '100%';\n                styles.top = 'auto';\n            }\n        }\n\n        return (\n            <div\n                aria-label={ariaLabel}\n                className='a11y__popup Menu'\n                id={id}\n                role='menu'\n            >\n                <ul\n                    ref={this.node}\n                    style={styles}\n                    className={classNames('Menu__content dropdown-menu', this.props.className)}\n                    onClick={this.handleMenuClick}\n                >\n                    {children}\n                </ul>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport classNames from 'classnames';\n\nimport './menu_item.scss';\n\nexport default function menuItem(Component: React.ComponentType<any>) {\n    type Props = {\n        show: boolean;\n        id?: string;\n        icon?: React.ReactNode;\n        text?: React.ReactNode;\n    }\n    class MenuItem extends React.PureComponent<Props & React.ComponentProps<typeof Component>> {\n        public static defaultProps = {\n            show: true,\n        };\n\n        public static displayName?: string;\n\n        public render() {\n            const {id, show, icon, text, ...props} = this.props;\n            if (!show) {\n                return null;\n            }\n\n            let textProp: React.ReactNode = text;\n            if (icon) {\n                textProp = (\n                    <>\n                        <span className='icon'>{icon}</span>\n                        {text}\n                    </>\n                );\n            }\n\n            return (\n                <li\n                    className={classNames('MenuItem', {\n                        'MenuItem--with-icon': icon,\n                    })}\n                    role='menuitem'\n                    id={id}\n                >\n                    <Component\n                        text={textProp}\n                        ariaLabel={text}\n                        {...props}\n                    />\n                </li>\n            );\n        }\n    }\n    return MenuItem;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {CSSTransition} from 'react-transition-group';\n\nimport {isMobile} from 'utils/utils.jsx';\n\nconst ANIMATION_DURATION = 80;\n\ntype Props = {\n    children?: React.ReactNode;\n    show: boolean;\n}\n\nexport default function MenuWrapperAnimation(props: Props) {\n    if (isMobile()) {\n        if (props.show) {\n            return props.children;\n        }\n\n        return null;\n    }\n\n    return (\n        <CSSTransition\n            in={props.show}\n            classNames='MenuWrapperAnimation'\n            enter={true}\n            exit={true}\n            mountOnEnter={true}\n            unmountOnExit={true}\n            timeout={ANIMATION_DURATION}\n        >\n            {props.children}\n        </CSSTransition>\n    );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport Constants from 'utils/constants';\n\nimport MenuWrapperAnimation from './menu_wrapper_animation';\n\nimport './menu_wrapper.scss';\n\ndeclare module 'react' {\n    interface HTMLAttributes<T> extends AriaAttributes, DOMAttributes<T> {\n        disabled?: boolean;\n    }\n}\ntype Props = {\n    children?: React.ReactNode;\n    className: string;\n    onToggle?: (open: boolean) => void;\n    animationComponent: any;\n    id?: string;\n    isDisabled?: boolean;\n    stopPropagationOnToggle?: boolean;\n    open?: boolean;\n}\n\ntype State = {\n    open: boolean;\n}\n\nexport default class MenuWrapper extends React.PureComponent<Props, State> {\n    private node: React.RefObject<HTMLDivElement>;\n\n    public static defaultProps = {\n        className: '',\n        animationComponent: MenuWrapperAnimation,\n    };\n\n    public constructor(props: Props) {\n        super(props);\n        if (!Array.isArray(props.children) || props.children.length !== 2) {\n            throw new Error('MenuWrapper needs exactly 2 children');\n        }\n        this.state = {\n            open: false,\n        };\n        this.node = React.createRef();\n    }\n\n    public componentDidMount() {\n        document.addEventListener('click', this.closeOnBlur, true);\n        document.addEventListener('keyup', this.keyboardClose, true);\n    }\n\n    static getDerivedStateFromProps(props: Props, state: State) {\n        if (props.open !== undefined && props.open !== state.open) {\n            return {\n                open: props.open,\n            };\n        }\n        return null;\n    }\n\n    public componentWillUnmount() {\n        document.removeEventListener('click', this.closeOnBlur, true);\n        document.removeEventListener('keyup', this.keyboardClose, true);\n    }\n\n    private keyboardClose = (e: KeyboardEvent) => {\n        if (e.key === Constants.KeyCodes.ESCAPE[0]) {\n            this.close();\n        }\n\n        if (e.key === Constants.KeyCodes.TAB[0]) {\n            this.closeOnBlur(e);\n        }\n    }\n\n    private closeOnBlur = (e: Event) => {\n        if (this.node && this.node.current && e.target && this.node.current.contains(e.target as Node)) {\n            return;\n        }\n\n        this.close();\n    }\n\n    public close = () => {\n        if (this.state.open) {\n            this.setState({open: false});\n            if (this.props.onToggle) {\n                this.props.onToggle(false);\n            }\n        }\n    }\n\n    toggle = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n        /**\n         * This is only here so that we can toggle the menus in the sidebar, because the default behavior of the mobile\n         * version (ie the one that uses a modal) needs propagation to close the modal after selecting something\n         * We need to refactor this so that the modal is explicitly closed on toggle, but for now I am aiming to preserve the existing logic\n         * so as to not break other things\n        **/\n        if (this.props.stopPropagationOnToggle) {\n            e.preventDefault();\n            e.stopPropagation();\n        }\n        const newState = !this.state.open;\n        this.setState({open: newState}, () => {\n            if (this.props.onToggle) {\n                this.props.onToggle(newState);\n            }\n        });\n    }\n\n    public render() {\n        const {children} = this.props;\n\n        const Animation = this.props.animationComponent;\n\n        return (\n            <div\n                id={this.props.id}\n                className={'MenuWrapper ' + this.props.className + (this.state.open ? ' MenuWrapper--open' : '')}\n                onClick={this.toggle}\n                ref={this.node}\n                disabled={this.props.isDisabled}\n            >\n                {children ? Object.values(children)[0] : {}}\n                <Animation show={this.state.open}>\n                    {children ? Object.values(children)[1] : {}}\n                </Animation>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function BackIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='24px'\n                height='24px'\n                viewBox='0 0 24 24'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.back', defaultMessage: 'Back Icon'})}\n            >\n                <path d='M20,11V13H8L13.5,18.5L12.08,19.92L4.16,12L12.08,4.08L13.5,5.5L8,11H20Z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {CSSTransition} from 'react-transition-group';\nimport {injectIntl} from 'react-intl';\n\nimport CloseIcon from 'components/widgets/icons/close_icon';\nimport BackIcon from 'components/widgets/icons/back_icon';\n\nimport './full_screen_modal.scss';\n\n// This must be on sync with the animation time in ./full_screen_modal.scss\nconst ANIMATION_DURATION = 100;\n\ntype Props = {\n    show: boolean;\n    onClose: () => void;\n    onGoBack?: () => void;\n    children: React.ReactNode;\n    ariaLabel?: string;\n    ariaLabelledBy?: string;\n    intl: any; // TODO This needs to be replaced with IntlShape once react-intl is upgraded\n};\n\nclass FullScreenModal extends React.PureComponent<Props> {\n    private modal = React.createRef<HTMLDivElement>();\n\n    public componentDidMount() {\n        document.addEventListener('keydown', this.handleKeypress);\n        document.addEventListener('focus', this.enforceFocus, true);\n        this.enforceFocus();\n    }\n\n    public componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleKeypress);\n        document.removeEventListener('focus', this.enforceFocus, true);\n    }\n\n    public enforceFocus = () => {\n        setTimeout(() => {\n            const currentActiveElement = document.activeElement;\n            if (this.modal && this.modal.current && !this.modal.current.contains(currentActiveElement)) {\n                this.modal.current.focus();\n            }\n        });\n    }\n\n    private handleKeypress = (e: KeyboardEvent) => {\n        if (e.key === 'Escape' && this.props.show) {\n            this.close();\n        }\n    }\n\n    private close = () => {\n        this.props.onClose();\n    }\n\n    public render() {\n        return (\n            <CSSTransition\n                in={this.props.show}\n                classNames='FullScreenModal'\n                mountOnEnter={true}\n                unmountOnExit={true}\n                timeout={ANIMATION_DURATION}\n                appear={true}\n            >\n                <>\n                    <div\n                        className='FullScreenModal'\n                        ref={this.modal}\n                        tabIndex={-1}\n                        aria-modal={true}\n                        aria-label={this.props.ariaLabel}\n                        aria-labelledby={this.props.ariaLabelledBy}\n                        role='dialog'\n                    >\n                        {this.props.onGoBack &&\n                            <button\n                                onClick={this.props.onGoBack}\n                                className='back'\n                                aria-label={this.props.intl.formatMessage({id: 'full_screen_modal.back', defaultMessage: 'Back'})}\n                            >\n                                <BackIcon id='backIcon'/>\n                            </button>}\n                        <button\n                            onClick={this.close}\n                            className='close-x'\n                            aria-label={this.props.intl.formatMessage({id: 'full_screen_modal.close', defaultMessage: 'Close'})}\n                        >\n                            <CloseIcon id='closeIcon'/>\n                        </button>\n                        {this.props.children}\n                    </div>\n                    <div\n                        tabIndex={0}\n                        style={{display: 'none'}}\n                    />\n                </>\n            </CSSTransition>\n        );\n    }\n}\n\nconst wrappedComponent = injectIntl(FullScreenModal, {forwardRef: true});\nwrappedComponent.displayName = 'injectIntl(FullScreenModal)';\nexport default wrappedComponent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Popover as BSPopover, Sizes as BSSizes} from 'react-bootstrap';\n\nconst SizeMap = {xs: 'xsmall', sm: 'small', md: 'medium', lg: 'large'};\nexport type Sizes = 'xs' | 'sm' | 'md' | 'lg';\n\ninterface Props {\n    id?: string;\n    children?: React.ReactNode;\n    popoverStyle?: 'info';\n    popoverSize?: Sizes;\n    title?: React.ReactNode;\n    placement?: 'bottom' | 'top' | 'right' | 'left';\n    className?: string;\n    style?: React.CSSProperties;\n    onMouseOut?: React.MouseEventHandler<BSPopover>; // didn't find a better way to satisfy typing, so for now we have a slight 'bootstrap leakage'\n    onMouseOver?: React.MouseEventHandler<BSPopover>;\n}\n\nexport default class Popover extends React.PureComponent<Props> {\n    static defaultProps = {\n        placement: 'right',\n        popoverStyle: 'info',\n        popoverSize: 'sm',\n\n    }\n    render() {\n        const {placement, popoverSize, children, popoverStyle, title, id, onMouseOut, onMouseOver, className, style} = this.props;\n        return (\n            <BSPopover\n                id={id}\n                style={style}\n                className={className}\n                bsStyle={popoverStyle}\n                placement={placement}\n                bsClass='popover'\n                title={title}\n                bsSize={popoverSize && SizeMap[popoverSize] as BSSizes} // map our sizes to bootstrap\n                onMouseOut={onMouseOut!}\n                onMouseOver={onMouseOver}\n            >\n                {children}\n            </BSPopover>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport Setting from './setting';\n\ntype Props = {\n    id: string;\n    label: React.ReactNode;\n    labelClassName: string;\n    helpText?: React.ReactNode;\n    placeholder: string;\n    value: boolean;\n    disabled?: boolean;\n    inputClassName: string;\n    onChange(name: string, value: any): void; // value is any since onChange is a common func for inputs and checkboxes\n    autoFocus?: boolean;\n}\n\nexport default class BoolSetting extends React.PureComponent<Props> {\n    public static defaultProps: Partial<Props> = {\n        labelClassName: '',\n        inputClassName: '',\n    };\n\n    private handleChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n        this.props.onChange(this.props.id, e.target.checked);\n    }\n\n    public render(): JSX.Element {\n        return (\n            <Setting\n                label={this.props.label}\n                labelClassName={this.props.labelClassName}\n                inputClassName={this.props.inputClassName}\n                helpText={this.props.helpText}\n                inputId={this.props.id}\n            >\n                <div className='checkbox'>\n                    <label>\n                        <input\n                            id={this.props.id}\n                            disabled={this.props.disabled}\n                            autoFocus={this.props.autoFocus}\n                            type='checkbox'\n                            checked={this.props.value}\n                            onChange={this.handleChange}\n                        />\n                        <span>{this.props.placeholder}</span>\n                    </label>\n                </div>\n            </Setting>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n    inputId?: string;\n    label: React.ReactNode;\n    labelClassName?: string;\n    inputClassName?: string;\n    children: React.ReactNode;\n    helpText?: React.ReactNode;\n    footer?: React.ReactNode;\n}\n\nconst Setting: React.FC<Props> = ({\n    inputId,\n    label,\n    labelClassName,\n    inputClassName,\n    children,\n    footer,\n    helpText,\n}: Props) => {\n    return (\n        <div\n            data-testid={inputId}\n            className='form-group'\n        >\n            <label\n                data-testid={inputId + 'label'}\n                className={'control-label ' + labelClassName}\n                htmlFor={inputId}\n            >\n                {label}\n            </label>\n            <div className={inputClassName}>\n                {children}\n                <div\n                    data-testid={inputId + 'help-text'}\n                    className='help-text'\n                >\n                    {helpText}\n                </div>\n                {footer}\n            </div>\n        </div>\n    );\n};\n\nexport default Setting;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport Setting from './setting';\n\nexport type InputTypes = 'input' | 'textarea' | 'number' | 'email' | 'tel' | 'url' | 'password'\n\nexport type WidgetTextSettingProps = {\n    id: string;\n    label: React.ReactNode;\n    labelClassName?: string;\n    placeholder?: string;\n    helpText?: React.ReactNode;\n    footer?: React.ReactNode;\n    value: string | number;\n    inputClassName?: string;\n    maxLength?: number;\n    resizable?: boolean;\n    onChange(name: string, value: any): void;\n    disabled?: boolean;\n    type: InputTypes;\n    autoFocus?: boolean;\n}\n\n// Since handle change is read from input and textarea element\ntype HandleChangeTypes = React.ChangeEventHandler<HTMLInputElement | HTMLTextAreaElement>\n\nexport default class TextSetting extends React.PureComponent<WidgetTextSettingProps> {\n    public static validTypes: string[] = ['input', 'textarea', 'number', 'email', 'tel', 'url', 'password'];\n\n    public static defaultProps: Partial<WidgetTextSettingProps> = {\n        labelClassName: '',\n        inputClassName: '',\n        type: 'input',\n        maxLength: -1, // A negative number allows for values of any length\n        resizable: true,\n    };\n\n    private handleChange: HandleChangeTypes = (e) => {\n        if (this.props.type === 'number') {\n            this.props.onChange(this.props.id, parseInt(e.target.value, 10));\n        } else {\n            this.props.onChange(this.props.id, e.target.value);\n        }\n    }\n\n    public render(): JSX.Element {\n        const {resizable} = this.props;\n        let {type} = this.props;\n        let input = null;\n\n        if (type === 'textarea') {\n            let style = {};\n            if (!resizable) {\n                style = Object.assign({}, {resize: 'none'});\n            }\n\n            input = (\n                <textarea\n                    autoFocus={this.props.autoFocus}\n                    data-testid={this.props.id + 'input'}\n                    id={this.props.id}\n                    dir='auto'\n                    style={style}\n                    className='form-control'\n                    rows={5}\n                    placeholder={this.props.placeholder}\n                    value={this.props.value}\n                    maxLength={this.props.maxLength}\n                    onChange={this.handleChange}\n                    disabled={this.props.disabled}\n                />\n            );\n        } else {\n            type = ['input', 'email', 'tel', 'number', 'url', 'password'].includes(type) ? type : 'input';\n\n            input = (\n                <input\n                    autoFocus={this.props.autoFocus}\n                    data-testid={this.props.id + type}\n                    id={this.props.id}\n                    className='form-control'\n                    type={type}\n                    placeholder={this.props.placeholder}\n                    value={this.props.value}\n                    maxLength={this.props.maxLength}\n                    onChange={this.handleChange}\n                    disabled={this.props.disabled}\n                />\n            );\n        }\n\n        return (\n            <Setting\n                label={this.props.label}\n                labelClassName={this.props.labelClassName}\n                inputClassName={this.props.inputClassName}\n                helpText={this.props.helpText}\n                inputId={this.props.id}\n                footer={this.props.footer}\n            >\n                {input}\n            </Setting>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {ReactNode, ComponentProps, useState, CSSProperties, useMemo} from 'react';\nimport {Tooltip} from 'react-bootstrap';\n\nimport OverlayTrigger from 'components/overlay_trigger';\n\ntype Props = {\n    id: string;\n    content: ReactNode;\n    children: ReactNode;\n    className?: string;\n    arrowOffsetTop?: number | string;\n    style?: CSSProperties;\n}\n\nconst SimpleTooltip = ({\n    id,\n    content,\n    children,\n    placement = 'top',\n    className = 'hidden-xs',\n    delayShow = 500,\n    style,\n    ...props\n}: Props & Omit<ComponentProps<typeof OverlayTrigger>, 'overlay'>) => {\n    return (\n        <OverlayTrigger\n            {...props}\n            delayShow={delayShow}\n            placement={placement}\n            overlay={\n                <Tooltip\n                    id={id}\n                    style={style}\n                    className={className}\n                    placement={placement}\n                >\n                    {content}\n                </Tooltip>\n            }\n        >\n            {children}\n        </OverlayTrigger>\n    );\n};\n\nexport default SimpleTooltip;\n\nexport function useSynchronizedImmediate(): [Partial<ComponentProps<typeof SimpleTooltip>>, (isImmediate: boolean) => void] {\n    const [isImmediate, setImmediate] = useState(false);\n\n    return [\n        useMemo((): Partial<ComponentProps<typeof SimpleTooltip>> => ({\n            onEntered: () => setImmediate(true),\n            animation: !isImmediate,\n            delayShow: isImmediate ? 0 : undefined,\n        }), [isImmediate, setImmediate]),\n        setImmediate,\n    ];\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport classNames from 'classnames';\n\nimport {imageURLForTeam} from 'utils/utils.jsx';\n\nimport './team_icon.scss';\n\ntype Props = {\n\n    /** Team icon URL (when available) */\n    url?: string | null;\n\n    /** Team display name (used for the initials) if icon URL is not set */\n    content: React.ReactNode;\n\n    /**\n     * Size of the icon, \"sm\", \"md\" or \"lg\".\n     *\n     * @default \"regular\"\n     **/\n    size?: 'sm' | 'lg';\n\n    /** Whether to add hover effect to the icon */\n    withHover?: boolean;\n\n    /** Whether to add additional classnames */\n    className?: string;\n};\n\n/**\n * An icon representing a Team. If `url` is set - shows the image,\n * otherwise shows team initials\n */\nexport class TeamIcon extends React.PureComponent<Props> {\n    public static defaultProps = {\n        size: 'sm',\n    };\n\n    public render() {\n        const {content, url, size, withHover, className} = this.props;\n        const hoverCss = withHover ? '' : 'no-hover';\n\n        // FIXME Nowhere does imageURLForTeam seem to check for display_name.\n        const teamIconUrl = url || imageURLForTeam({display_name: content});\n        let icon;\n        if (typeof content === 'string') {\n            if (teamIconUrl) {\n                icon = (\n                    <div\n                        data-testid='teamIconImage'\n                        className={`TeamIcon__image TeamIcon__${size}`}\n                        aria-label={'Team Icon'}\n                        style={{backgroundImage: `url('${teamIconUrl}')`}}\n                    />\n                );\n            } else {\n                icon = (\n                    <div\n                        data-testid='teamIconInitial'\n                        className={`TeamIcon__initials TeamIcon__initials__${size}`}\n                        aria-label={'Team Initials'}\n                    >\n                        {content ? content.replace(/\\s/g, '').substring(0, 2) : '??'}\n                    </div>\n                );\n            }\n        } else {\n            icon = content;\n        }\n        return (\n            <div className={classNames(`TeamIcon TeamIcon__${size}`, {withImage: teamIconUrl}, className, hoverCss)}>\n                <div className={`TeamIcon__content ${hoverCss}`}>\n                    {icon}\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default TeamIcon;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, HTMLAttributes} from 'react';\nimport classNames from 'classnames';\n\nimport './avatar.scss';\n\nexport type TAvatarSizeToken = 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\n\ntype Props = {\n    url?: string;\n    username?: string;\n    size?: TAvatarSizeToken;\n    text?: string;\n};\n\ntype Attrs = HTMLAttributes<HTMLElement>;\n\nconst Avatar = ({\n    url,\n    username,\n    size = 'md',\n    text,\n    ...attrs\n}: Props & Attrs) => {\n    const classes = classNames(`Avatar Avatar-${size}`, attrs.className);\n\n    if (text) {\n        return (\n            <div\n                {...attrs}\n                className={classes + ' Avatar-plain'}\n                data-content={text}\n            />\n        );\n    }\n\n    return (\n        <img\n            {...attrs}\n            className={classes}\n            alt={`${username || 'user'} profile image`}\n            src={url}\n        />\n    );\n};\nexport default memo(Avatar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, ComponentProps, CSSProperties, useMemo, useEffect} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector, useDispatch} from 'react-redux';\nimport tinycolor from 'tinycolor2';\n\nimport {$ID} from 'mattermost-redux/types/utilities';\nimport {UserProfile} from 'mattermost-redux/types/users';\nimport {getUser as selectUser, makeDisplayNameGetter} from 'mattermost-redux/selectors/entities/users';\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {GlobalState} from 'types/store';\n\nimport {t} from 'utils/i18n';\nimport {imageURLForUser} from 'utils/utils';\n\nimport SimpleTooltip, {useSynchronizedImmediate} from 'components/widgets/simple_tooltip';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport './avatars.scss';\nimport {getMissingProfilesByIds} from 'mattermost-redux/actions/users';\n\ntype Props = {\n    userIds: Array<$ID<UserProfile>>;\n    totalUsers?: number;\n    breakAt?: number;\n    size?: ComponentProps<typeof Avatar>['size'];\n    fetchMissingUsers?: boolean;\n};\n\nconst OTHERS_DISPLAY_LIMIT = 99;\n\nfunction countMeta<T>(\n    items: T[],\n    total = items.length,\n): [T[], T[], {overflowUnnamedCount: number; nonDisplayCount: number}] {\n    const breakAt = Math.max(items.length, total) > 4 ? 3 : 4;\n\n    const displayItems = items.slice(0, breakAt);\n    const overflowItems = items.slice(breakAt);\n\n    const overflowUnnamedCount = Math.max(total - displayItems.length - overflowItems.length, 0);\n    const nonDisplayCount = overflowItems.length + overflowUnnamedCount;\n\n    return [displayItems, overflowItems, {overflowUnnamedCount, nonDisplayCount}];\n}\n\nconst displayNameGetter = makeDisplayNameGetter();\n\nfunction UserAvatar({\n    userId,\n    overlayProps,\n    ...props\n}: {\n    userId: $ID<UserProfile>;\n    overlayProps: Partial<ComponentProps<typeof SimpleTooltip>>;\n} & ComponentProps<typeof Avatar>) {\n    const user = useSelector((state: GlobalState) => selectUser(state, userId)) as UserProfile | undefined;\n    const name = useSelector((state: GlobalState) => displayNameGetter(state, true)(user));\n\n    return (\n        <SimpleTooltip\n            id={`name-${userId}`}\n            content={name}\n            {...overlayProps}\n        >\n            <Avatar\n                url={imageURLForUser(userId, user?.last_picture_update)}\n                tabIndex={0}\n                {...props}\n            />\n        </SimpleTooltip>\n    );\n}\n\nfunction Avatars({\n    size,\n    userIds,\n    totalUsers,\n    fetchMissingUsers = true,\n}: Props) {\n    const {formatMessage} = useIntl();\n    const dispatch = useDispatch();\n    const [overlayProps, setImmediate] = useSynchronizedImmediate();\n    const [displayUserIds, overflowUserIds, {overflowUnnamedCount, nonDisplayCount}] = countMeta(userIds, totalUsers);\n    const overflowNames = useSelector((state: GlobalState) => {\n        return overflowUserIds.map((userId) => displayNameGetter(state, true)(selectUser(state, userId))).join(', ');\n    });\n\n    const {centerChannelBg, centerChannelColor} = useSelector(getTheme);\n    const avatarStyle: CSSProperties = useMemo(() => ({\n        background: tinycolor.mix(centerChannelBg, centerChannelColor, 8).toRgbString(),\n    }), [centerChannelBg, centerChannelColor]);\n\n    useEffect(() => {\n        if (fetchMissingUsers) {\n            dispatch(getMissingProfilesByIds(userIds));\n        }\n    }, [fetchMissingUsers, userIds]);\n\n    return (\n        <div\n            className={`Avatars Avatars___${size}`}\n            onMouseLeave={() => setImmediate(false)}\n        >\n            {displayUserIds.map((id) => (\n                <UserAvatar\n                    style={avatarStyle}\n                    key={id}\n                    userId={id}\n                    size={size}\n                    tabIndex={0}\n                    overlayProps={overlayProps}\n                />\n            ))}\n            {Boolean(nonDisplayCount) && (\n                <SimpleTooltip\n                    id={'names-overflow'}\n                    {...overlayProps}\n                    content={overflowUserIds.length ? formatMessage(\n                        {\n                            id: t('avatars.overflowUsers'),\n                            defaultMessage: '{overflowUnnamedCount, plural, =0 {{names}} =1 {{names} and one other} other {{names} and # others}}',\n                        },\n                        {\n                            overflowUnnamedCount,\n                            names: overflowNames,\n                        },\n                    ) : formatMessage(\n                        {\n                            id: t('avatars.overflowUnnamedOnly'),\n                            defaultMessage: '{overflowUnnamedCount, plural, =1 {one other} other {# others}}',\n                        },\n                        {overflowUnnamedCount},\n                    )}\n                >\n                    <Avatar\n                        style={avatarStyle}\n                        size={size}\n                        tabIndex={0}\n                        text={nonDisplayCount > OTHERS_DISPLAY_LIMIT ? `${OTHERS_DISPLAY_LIMIT}+` : `+${nonDisplayCount}`}\n                    />\n                </SimpleTooltip>\n            )}\n        </div>\n    );\n}\n\nexport default memo(Avatars);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport * as Flux from 'flux';\n\nimport Constants from 'utils/constants';\n\nconst PayloadSources = Constants.PayloadSources;\n\nconst AppDispatcher = Object.assign(new Flux.Dispatcher(), {\n    handleServerAction: function performServerAction(action) {\n        if (!action.type) {\n            console.warn('handleServerAction called with undefined action type'); // eslint-disable-line no-console\n        }\n\n        var payload = {\n            source: PayloadSources.SERVER_ACTION,\n            action,\n        };\n        this.dispatch(payload);\n    },\n\n    handleViewAction: function performViewAction(action) {\n        if (!action.type) {\n            console.warn('handleViewAction called with undefined action type'); // eslint-disable-line no-console\n        }\n\n        var payload = {\n            source: PayloadSources.VIEW_ACTION,\n            action,\n        };\n        this.dispatch(payload);\n    },\n});\n\nexport default AppDispatcher;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {AdminTypes} from 'mattermost-redux/action_types';\nimport {General} from '../constants';\nimport {Client4} from 'mattermost-redux/client';\n\nimport {Action, ActionFunc, batchActions, DispatchFunc, GetStateFunc} from 'mattermost-redux/types/actions';\nimport {Compliance} from 'mattermost-redux/types/compliance';\nimport {GroupSearchOpts} from 'mattermost-redux/types/groups';\nimport {\n    CreateDataRetentionCustomPolicy,\n} from 'mattermost-redux/types/data_retention';\nimport {\n    TeamSearchOpts,\n} from 'mattermost-redux/types/teams';\nimport {\n    ChannelSearchOpts,\n} from 'mattermost-redux/types/channels';\n\nimport {bindClientFunc, forceLogoutIfNecessary} from './helpers';\nimport {logError} from './errors';\n\nexport function getLogs(page = 0, perPage: number = General.LOGS_PAGE_SIZE_DEFAULT): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getLogs,\n        onRequest: AdminTypes.GET_LOGS_REQUEST,\n        onSuccess: [AdminTypes.RECEIVED_LOGS, AdminTypes.GET_LOGS_SUCCESS],\n        onFailure: AdminTypes.GET_LOGS_FAILURE,\n        params: [\n            page,\n            perPage,\n        ],\n    });\n}\n\nexport function getAudits(page = 0, perPage: number = General.PAGE_SIZE_DEFAULT): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getAudits,\n        onRequest: AdminTypes.GET_AUDITS_REQUEST,\n        onSuccess: [AdminTypes.RECEIVED_AUDITS, AdminTypes.GET_AUDITS_SUCCESS],\n        onFailure: AdminTypes.GET_AUDITS_FAILURE,\n        params: [\n            page,\n            perPage,\n        ],\n    });\n}\n\nexport function getConfig(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getConfig,\n        onRequest: AdminTypes.GET_CONFIG_REQUEST,\n        onSuccess: [AdminTypes.RECEIVED_CONFIG, AdminTypes.GET_CONFIG_SUCCESS],\n        onFailure: AdminTypes.GET_CONFIG_FAILURE,\n    });\n}\n\nexport function updateConfig(config: Record<string, any>): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.updateConfig,\n        onRequest: AdminTypes.UPDATE_CONFIG_REQUEST,\n        onSuccess: [AdminTypes.RECEIVED_CONFIG, AdminTypes.UPDATE_CONFIG_SUCCESS],\n        onFailure: AdminTypes.UPDATE_CONFIG_FAILURE,\n        params: [\n            config,\n        ],\n    });\n}\n\nexport function patchConfig(config: Record<string, any>): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.patchConfig,\n        onRequest: AdminTypes.PATCH_CONFIG_REQUEST,\n        onSuccess: [AdminTypes.RECEIVED_CONFIG, AdminTypes.PATCH_CONFIG_SUCCESS],\n        onFailure: AdminTypes.PATCH_CONFIG_FAILURE,\n        params: [\n            config,\n        ],\n    });\n}\n\nexport function reloadConfig(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.reloadConfig,\n        onRequest: AdminTypes.RELOAD_CONFIG_REQUEST,\n        onSuccess: AdminTypes.RELOAD_CONFIG_SUCCESS,\n        onFailure: AdminTypes.RELOAD_CONFIG_FAILURE,\n    });\n}\n\nexport function getEnvironmentConfig(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getEnvironmentConfig,\n        onRequest: AdminTypes.GET_ENVIRONMENT_CONFIG_REQUEST,\n        onSuccess: [AdminTypes.RECEIVED_ENVIRONMENT_CONFIG, AdminTypes.GET_ENVIRONMENT_CONFIG_SUCCESS],\n        onFailure: AdminTypes.GET_ENVIRONMENT_CONFIG_FAILURE,\n    });\n}\n\nexport function testEmail(config: any): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.testEmail,\n        onRequest: AdminTypes.TEST_EMAIL_REQUEST,\n        onSuccess: AdminTypes.TEST_EMAIL_SUCCESS,\n        onFailure: AdminTypes.TEST_EMAIL_FAILURE,\n        params: [\n            config,\n        ],\n    });\n}\n\nexport function testSiteURL(siteURL: string): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.testSiteURL,\n        onRequest: AdminTypes.TEST_SITE_URL_REQUEST,\n        onSuccess: AdminTypes.TEST_SITE_URL_SUCCESS,\n        onFailure: AdminTypes.TEST_SITE_URL_FAILURE,\n        params: [\n            siteURL,\n        ],\n    });\n}\n\nexport function testS3Connection(config: any): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.testS3Connection,\n        onRequest: AdminTypes.TEST_S3_REQUEST,\n        onSuccess: AdminTypes.TEST_S3_SUCCESS,\n        onFailure: AdminTypes.TEST_S3_FAILURE,\n        params: [\n            config,\n        ],\n    });\n}\n\nexport function invalidateCaches(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.invalidateCaches,\n        onRequest: AdminTypes.INVALIDATE_CACHES_REQUEST,\n        onSuccess: AdminTypes.INVALIDATE_CACHES_SUCCESS,\n        onFailure: AdminTypes.INVALIDATE_CACHES_FAILURE,\n    });\n}\n\nexport function recycleDatabase(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.recycleDatabase,\n        onRequest: AdminTypes.RECYCLE_DATABASE_REQUEST,\n        onSuccess: AdminTypes.RECYCLE_DATABASE_SUCCESS,\n        onFailure: AdminTypes.RECYCLE_DATABASE_FAILURE,\n    });\n}\n\nexport function createComplianceReport(job: Partial<Compliance>): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.createComplianceReport,\n        onRequest: AdminTypes.CREATE_COMPLIANCE_REQUEST,\n        onSuccess: [AdminTypes.RECEIVED_COMPLIANCE_REPORT, AdminTypes.CREATE_COMPLIANCE_SUCCESS],\n        onFailure: AdminTypes.CREATE_COMPLIANCE_FAILURE,\n        params: [\n            job,\n        ],\n    });\n}\n\nexport function getComplianceReport(reportId: string): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getComplianceReport,\n        onRequest: AdminTypes.GET_COMPLIANCE_REQUEST,\n        onSuccess: [AdminTypes.RECEIVED_COMPLIANCE_REPORT, AdminTypes.GET_COMPLIANCE_SUCCESS],\n        onFailure: AdminTypes.GET_COMPLIANCE_FAILURE,\n        params: [\n            reportId,\n        ],\n    });\n}\n\nexport function getComplianceReports(page = 0, perPage: number = General.PAGE_SIZE_DEFAULT): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getComplianceReports,\n        onRequest: AdminTypes.GET_COMPLIANCE_REQUEST,\n        onSuccess: [AdminTypes.RECEIVED_COMPLIANCE_REPORTS, AdminTypes.GET_COMPLIANCE_SUCCESS],\n        onFailure: AdminTypes.GET_COMPLIANCE_FAILURE,\n        params: [\n            page,\n            perPage,\n        ],\n    });\n}\n\nexport function uploadBrandImage(imageData: File): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.uploadBrandImage,\n        onRequest: AdminTypes.UPLOAD_BRAND_IMAGE_REQUEST,\n        onSuccess: AdminTypes.UPLOAD_BRAND_IMAGE_SUCCESS,\n        onFailure: AdminTypes.UPLOAD_BRAND_IMAGE_FAILURE,\n        params: [\n            imageData,\n        ],\n    });\n}\n\nexport function deleteBrandImage(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.deleteBrandImage,\n        onRequest: AdminTypes.DELETE_BRAND_IMAGE_REQUEST,\n        onSuccess: AdminTypes.DELETE_BRAND_IMAGE_SUCCESS,\n        onFailure: AdminTypes.DELETE_BRAND_IMAGE_FAILURE,\n    });\n}\n\nexport function getClusterStatus(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getClusterStatus,\n        onRequest: AdminTypes.GET_CLUSTER_STATUS_REQUEST,\n        onSuccess: [AdminTypes.RECEIVED_CLUSTER_STATUS, AdminTypes.GET_CLUSTER_STATUS_SUCCESS],\n        onFailure: AdminTypes.GET_CLUSTER_STATUS_FAILURE,\n    });\n}\n\nexport function testLdap(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.testLdap,\n        onRequest: AdminTypes.TEST_LDAP_REQUEST,\n        onSuccess: AdminTypes.TEST_LDAP_SUCCESS,\n        onFailure: AdminTypes.TEST_LDAP_FAILURE,\n    });\n}\n\nexport function syncLdap(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.syncLdap,\n        onRequest: AdminTypes.SYNC_LDAP_REQUEST,\n        onSuccess: AdminTypes.SYNC_LDAP_SUCCESS,\n        onFailure: AdminTypes.SYNC_LDAP_FAILURE,\n    });\n}\n\nexport function getLdapGroups(page = 0, perPage: number = General.PAGE_SIZE_MAXIMUM, opts: GroupSearchOpts = {q: ''}): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getLdapGroups,\n        onRequest: AdminTypes.GET_LDAP_GROUPS_REQUEST,\n        onSuccess: [AdminTypes.RECEIVED_LDAP_GROUPS, AdminTypes.GET_LDAP_GROUPS_SUCCESS],\n        onFailure: AdminTypes.GET_LDAP_GROUPS_FAILURE,\n        params: [\n            page,\n            perPage,\n            opts,\n        ],\n    });\n}\n\nexport function linkLdapGroup(key: string): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        dispatch({type: AdminTypes.LINK_LDAP_GROUP_REQUEST, data: key});\n\n        let data;\n        try {\n            data = await Client4.linkLdapGroup(key);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(batchActions([\n                {type: AdminTypes.LINK_LDAP_GROUP_FAILURE, error, data: key},\n                logError(error),\n            ]));\n            return {error};\n        }\n\n        dispatch(batchActions([\n            {type: AdminTypes.LINK_LDAP_GROUP_SUCCESS, data: null},\n            {\n                type: AdminTypes.LINKED_LDAP_GROUP,\n                data: {\n                    primary_key: key,\n                    name: data.display_name,\n                    mattermost_group_id: data.id,\n                    has_syncables: false,\n                },\n            },\n        ]));\n\n        return {data: true};\n    };\n}\n\nexport function unlinkLdapGroup(key: string): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        dispatch({type: AdminTypes.UNLINK_LDAP_GROUP_REQUEST, data: key});\n\n        try {\n            await Client4.unlinkLdapGroup(key);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(batchActions([\n                {type: AdminTypes.UNLINK_LDAP_GROUP_FAILURE, error, data: key},\n                logError(error),\n            ]));\n            return {error};\n        }\n\n        dispatch(batchActions([\n            {type: AdminTypes.UNLINK_LDAP_GROUP_SUCCESS, data: null},\n            {type: AdminTypes.UNLINKED_LDAP_GROUP, data: key},\n        ]));\n\n        return {data: true};\n    };\n}\n\nexport function getSamlCertificateStatus(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getSamlCertificateStatus,\n        onRequest: AdminTypes.SAML_CERT_STATUS_REQUEST,\n        onSuccess: [AdminTypes.RECEIVED_SAML_CERT_STATUS, AdminTypes.SAML_CERT_STATUS_SUCCESS],\n        onFailure: AdminTypes.SAML_CERT_STATUS_FAILURE,\n    });\n}\n\nexport function uploadPublicSamlCertificate(fileData: File): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.uploadPublicSamlCertificate,\n        onRequest: AdminTypes.UPLOAD_SAML_PUBLIC_REQUEST,\n        onSuccess: AdminTypes.UPLOAD_SAML_PUBLIC_SUCCESS,\n        onFailure: AdminTypes.UPLOAD_SAML_PUBLIC_FAILURE,\n        params: [\n            fileData,\n        ],\n    });\n}\n\nexport function uploadPrivateSamlCertificate(fileData: File): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.uploadPrivateSamlCertificate,\n        onRequest: AdminTypes.UPLOAD_SAML_PRIVATE_REQUEST,\n        onSuccess: AdminTypes.UPLOAD_SAML_PRIVATE_SUCCESS,\n        onFailure: AdminTypes.UPLOAD_SAML_PRIVATE_FAILURE,\n        params: [\n            fileData,\n        ],\n    });\n}\n\nexport function uploadPublicLdapCertificate(fileData: File): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.uploadPublicLdapCertificate,\n        onSuccess: AdminTypes.UPLOAD_LDAP_PUBLIC_SUCCESS,\n        params: [\n            fileData,\n        ],\n    });\n}\n\nexport function uploadPrivateLdapCertificate(fileData: File): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.uploadPrivateLdapCertificate,\n        onSuccess: AdminTypes.UPLOAD_LDAP_PRIVATE_SUCCESS,\n        params: [\n            fileData,\n        ],\n    });\n}\n\nexport function uploadIdpSamlCertificate(fileData: File): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.uploadIdpSamlCertificate,\n        onRequest: AdminTypes.UPLOAD_SAML_IDP_REQUEST,\n        onSuccess: AdminTypes.UPLOAD_SAML_IDP_SUCCESS,\n        onFailure: AdminTypes.UPLOAD_SAML_IDP_FAILURE,\n        params: [\n            fileData,\n        ],\n    });\n}\n\nexport function removePublicSamlCertificate(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.deletePublicSamlCertificate,\n        onRequest: AdminTypes.DELETE_SAML_PUBLIC_REQUEST,\n        onSuccess: AdminTypes.DELETE_SAML_PUBLIC_SUCCESS,\n        onFailure: AdminTypes.DELETE_SAML_PUBLIC_FAILURE,\n    });\n}\n\nexport function removePrivateSamlCertificate(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.deletePrivateSamlCertificate,\n        onRequest: AdminTypes.DELETE_SAML_PRIVATE_REQUEST,\n        onSuccess: AdminTypes.DELETE_SAML_PRIVATE_SUCCESS,\n        onFailure: AdminTypes.DELETE_SAML_PRIVATE_FAILURE,\n    });\n}\n\nexport function removePublicLdapCertificate(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.deletePublicLdapCertificate,\n        onSuccess: AdminTypes.DELETE_LDAP_PUBLIC_SUCCESS,\n    });\n}\n\nexport function removePrivateLdapCertificate(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.deletePrivateLdapCertificate,\n        onSuccess: AdminTypes.DELETE_LDAP_PRIVATE_SUCCESS,\n    });\n}\n\nexport function removeIdpSamlCertificate(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.deleteIdpSamlCertificate,\n        onRequest: AdminTypes.DELETE_SAML_IDP_REQUEST,\n        onSuccess: AdminTypes.DELETE_SAML_IDP_SUCCESS,\n        onFailure: AdminTypes.DELETE_SAML_IDP_FAILURE,\n    });\n}\n\nexport function testElasticsearch(config: any): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.testElasticsearch,\n        onRequest: AdminTypes.TEST_ELASTICSEARCH_REQUEST,\n        onSuccess: AdminTypes.TEST_ELASTICSEARCH_SUCCESS,\n        onFailure: AdminTypes.TEST_ELASTICSEARCH_FAILURE,\n        params: [\n            config,\n        ],\n    });\n}\n\nexport function purgeElasticsearchIndexes(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.purgeElasticsearchIndexes,\n        onRequest: AdminTypes.PURGE_ELASTICSEARCH_INDEXES_REQUEST,\n        onSuccess: AdminTypes.PURGE_ELASTICSEARCH_INDEXES_SUCCESS,\n        onFailure: AdminTypes.PURGE_ELASTICSEARCH_INDEXES_FAILURE,\n    });\n}\n\nexport function uploadLicense(fileData: File): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.uploadLicense,\n        onRequest: AdminTypes.UPLOAD_LICENSE_REQUEST,\n        onSuccess: AdminTypes.UPLOAD_LICENSE_SUCCESS,\n        onFailure: AdminTypes.UPLOAD_LICENSE_FAILURE,\n        params: [\n            fileData,\n        ],\n    });\n}\n\nexport function removeLicense(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.removeLicense,\n        onRequest: AdminTypes.REMOVE_LICENSE_REQUEST,\n        onSuccess: AdminTypes.REMOVE_LICENSE_SUCCESS,\n        onFailure: AdminTypes.REMOVE_LICENSE_FAILURE,\n    });\n}\n\nexport function getPrevTrialLicense(): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        let data;\n        try {\n            data = await Client4.getPrevTrialLicense();\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            return {error};\n        }\n\n        dispatch({type: AdminTypes.PREV_TRIAL_LICENSE_SUCCESS, data});\n        return {data};\n    };\n}\n\nexport function getAnalytics(name: string, teamId = ''): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        dispatch({type: AdminTypes.GET_ANALYTICS_REQUEST, data: null});\n\n        let data;\n        try {\n            data = await Client4.getAnalytics(name, teamId);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(batchActions([\n                {type: AdminTypes.GET_ANALYTICS_FAILURE, error},\n                logError(error),\n            ]));\n            return {error};\n        }\n\n        const actions: Action[] = [{type: AdminTypes.GET_ANALYTICS_SUCCESS, data: null}];\n        if (teamId === '') {\n            actions.push({type: AdminTypes.RECEIVED_SYSTEM_ANALYTICS, data, name});\n        } else {\n            actions.push({type: AdminTypes.RECEIVED_TEAM_ANALYTICS, data, name, teamId});\n        }\n\n        dispatch(batchActions(actions));\n\n        return {data};\n    };\n}\n\nexport function getStandardAnalytics(teamId = ''): ActionFunc {\n    return getAnalytics('standard', teamId);\n}\n\nexport function getAdvancedAnalytics(teamId = ''): ActionFunc {\n    return getAnalytics('extra_counts', teamId);\n}\n\nexport function getPostsPerDayAnalytics(teamId = ''): ActionFunc {\n    return getAnalytics('post_counts_day', teamId);\n}\n\nexport function getBotPostsPerDayAnalytics(teamId = ''): ActionFunc {\n    return getAnalytics('bot_post_counts_day', teamId);\n}\n\nexport function getUsersPerDayAnalytics(teamId = ''): ActionFunc {\n    return getAnalytics('user_counts_with_posts_day', teamId);\n}\n\nexport function uploadPlugin(fileData: File, force = false): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        dispatch({type: AdminTypes.UPLOAD_PLUGIN_REQUEST, data: null});\n\n        let data;\n        try {\n            data = await Client4.uploadPlugin(fileData, force);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(batchActions([\n                {type: AdminTypes.UPLOAD_PLUGIN_FAILURE, error},\n                logError(error),\n            ]));\n            return {error};\n        }\n\n        dispatch(batchActions([\n            {type: AdminTypes.UPLOAD_PLUGIN_SUCCESS, data: null},\n        ]));\n\n        return {data};\n    };\n}\n\nexport function installPluginFromUrl(url: string, force = false): ActionFunc {\n    return async (dispatch, getState) => {\n        dispatch({type: AdminTypes.INSTALL_PLUGIN_FROM_URL_REQUEST, data: null});\n\n        let data;\n        try {\n            data = await Client4.installPluginFromUrl(url, force);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(batchActions([\n                {type: AdminTypes.INSTALL_PLUGIN_FROM_URL_FAILURE, error},\n                logError(error),\n            ]));\n            return {error};\n        }\n\n        dispatch({type: AdminTypes.INSTALL_PLUGIN_FROM_URL_SUCCESS, data: null});\n\n        return {data};\n    };\n}\n\nexport function getPlugins(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getPlugins,\n        onRequest: AdminTypes.GET_PLUGIN_REQUEST,\n        onSuccess: [AdminTypes.GET_PLUGIN_SUCCESS, AdminTypes.RECEIVED_PLUGINS],\n        onFailure: AdminTypes.GET_PLUGIN_FAILURE,\n    });\n}\n\nexport function getPluginStatuses(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getPluginStatuses,\n        onRequest: AdminTypes.GET_PLUGIN_STATUSES_REQUEST,\n        onSuccess: [AdminTypes.GET_PLUGIN_STATUSES_SUCCESS, AdminTypes.RECEIVED_PLUGIN_STATUSES],\n        onFailure: AdminTypes.GET_PLUGIN_STATUSES_FAILURE,\n    });\n}\n\nexport function removePlugin(pluginId: string): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        dispatch({type: AdminTypes.REMOVE_PLUGIN_REQUEST, data: pluginId});\n\n        try {\n            await Client4.removePlugin(pluginId);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(batchActions([\n                {type: AdminTypes.REMOVE_PLUGIN_FAILURE, error, data: pluginId},\n                logError(error),\n            ]));\n            return {error};\n        }\n\n        dispatch(batchActions([\n            {type: AdminTypes.REMOVE_PLUGIN_SUCCESS, data: null},\n            {type: AdminTypes.REMOVED_PLUGIN, data: pluginId},\n        ]));\n\n        return {data: true};\n    };\n}\n\nexport function enablePlugin(pluginId: string): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        dispatch({type: AdminTypes.ENABLE_PLUGIN_REQUEST, data: pluginId});\n\n        try {\n            await Client4.enablePlugin(pluginId);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(batchActions([\n                {type: AdminTypes.ENABLE_PLUGIN_FAILURE, error, data: pluginId},\n                logError(error),\n            ]));\n            return {error};\n        }\n\n        dispatch(batchActions([\n            {type: AdminTypes.ENABLE_PLUGIN_SUCCESS, data: null},\n            {type: AdminTypes.ENABLED_PLUGIN, data: pluginId},\n        ]));\n\n        return {data: true};\n    };\n}\n\nexport function disablePlugin(pluginId: string): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        dispatch({type: AdminTypes.DISABLE_PLUGIN_REQUEST, data: pluginId});\n\n        try {\n            await Client4.disablePlugin(pluginId);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(batchActions([\n                {type: AdminTypes.DISABLE_PLUGIN_FAILURE, error, data: pluginId},\n                logError(error),\n            ]));\n            return {error};\n        }\n\n        dispatch(batchActions([\n            {type: AdminTypes.DISABLE_PLUGIN_SUCCESS, data: null},\n            {type: AdminTypes.DISABLED_PLUGIN, data: pluginId},\n        ]));\n\n        return {data: true};\n    };\n}\n\nexport function getSamlMetadataFromIdp(samlMetadataURL: string): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getSamlMetadataFromIdp,\n        onSuccess: AdminTypes.RECEIVED_SAML_METADATA_RESPONSE,\n        params: [\n            samlMetadataURL,\n        ],\n    });\n}\n\nexport function setSamlIdpCertificateFromMetadata(certData: string): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.setSamlIdpCertificateFromMetadata,\n        onSuccess: AdminTypes.SET_SAML_IDP_SUCCESS,\n        params: [\n            certData,\n        ],\n    });\n}\n\nexport function sendWarnMetricAck(warnMetricId: string, forceAck: boolean) {\n    return async (dispatch: DispatchFunc) => {\n        try {\n            Client4.trackEvent('api', 'api_request_send_metric_ack', {warnMetricId});\n            await Client4.sendWarnMetricAck(warnMetricId, forceAck);\n            return {data: true};\n        } catch (e) {\n            dispatch(logError(e));\n            return {error: e.message};\n        }\n    };\n}\n\nexport function getDataRetentionCustomPolicies(page = 0, perPage = 10): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        let data;\n        try {\n            data = await Client4.getDataRetentionCustomPolicies(page, perPage);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(\n                {\n                    type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICIES,\n                    error,\n                },\n            );\n            return {error};\n        }\n\n        dispatch(\n            {type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICIES, data},\n        );\n\n        return {data};\n    };\n}\n\nexport function getDataRetentionCustomPolicy(id: string): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        let data;\n        try {\n            data = await Client4.getDataRetentionCustomPolicy(id);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(\n                {\n                    type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY,\n                    error,\n                },\n            );\n            return {error};\n        }\n\n        dispatch(\n            {type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY, data},\n        );\n\n        return {data};\n    };\n}\n\nexport function deleteDataRetentionCustomPolicy(id: string): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        try {\n            await Client4.deleteDataRetentionCustomPolicy(id);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(\n                {\n                    type: AdminTypes.DELETE_DATA_RETENTION_CUSTOM_POLICY_FAILURE,\n                    error,\n                },\n            );\n            return {error};\n        }\n        const data = {\n            id,\n        };\n        dispatch(\n            {type: AdminTypes.DELETE_DATA_RETENTION_CUSTOM_POLICY_SUCCESS, data},\n        );\n\n        return {data};\n    };\n}\n\nexport function getDataRetentionCustomPolicyTeams(id: string, page = 0, perPage: number = General.TEAMS_CHUNK_SIZE): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        let data;\n        try {\n            data = await Client4.getDataRetentionCustomPolicyTeams(id, page, perPage);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(\n                {\n                    type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_TEAMS,\n                    error,\n                },\n            );\n            return {error};\n        }\n\n        dispatch(\n            {type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_TEAMS, data},\n        );\n\n        return {data};\n    };\n}\n\nexport function getDataRetentionCustomPolicyChannels(id: string, page = 0, perPage: number = General.TEAMS_CHUNK_SIZE): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        let data;\n        try {\n            data = await Client4.getDataRetentionCustomPolicyChannels(id, page, perPage);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(\n                {\n                    type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_CHANNELS,\n                    error,\n                },\n            );\n            return {error};\n        }\n\n        dispatch(\n            {type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_CHANNELS, data},\n        );\n\n        return {data};\n    };\n}\n\nexport function searchDataRetentionCustomPolicyTeams(id: string, term: string, opts: TeamSearchOpts): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        let data;\n        try {\n            data = await Client4.searchDataRetentionCustomPolicyTeams(id, term, opts);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(\n                {\n                    type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_TEAMS_SEARCH,\n                    error,\n                },\n            );\n            return {error};\n        }\n\n        dispatch(\n            {type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_TEAMS_SEARCH, data},\n        );\n\n        return {data};\n    };\n}\n\nexport function searchDataRetentionCustomPolicyChannels(id: string, term: string, opts: ChannelSearchOpts): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        let data;\n        try {\n            data = await Client4.searchDataRetentionCustomPolicyChannels(id, term, opts);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(\n                {\n                    type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_CHANNELS_SEARCH,\n                    error,\n                },\n            );\n            return {error};\n        }\n\n        dispatch(\n            {type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_CHANNELS_SEARCH, data},\n        );\n\n        return {data};\n    };\n}\n\nexport function createDataRetentionCustomPolicy(policy: CreateDataRetentionCustomPolicy): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        let data;\n        try {\n            data = await Client4.createDataRetentionPolicy(policy);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            return {error};\n        }\n\n        dispatch(\n            {type: AdminTypes.CREATE_DATA_RETENTION_CUSTOM_POLICY_SUCCESS, data},\n        );\n\n        return {data};\n    };\n}\n\nexport function updateDataRetentionCustomPolicy(id: string, policy: CreateDataRetentionCustomPolicy): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        let data;\n        try {\n            data = await Client4.updateDataRetentionPolicy(id, policy);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            return {error};\n        }\n\n        dispatch(\n            {type: AdminTypes.UPDATE_DATA_RETENTION_CUSTOM_POLICY_SUCCESS, data},\n        );\n\n        return {data};\n    };\n}\n\nexport function addDataRetentionCustomPolicyTeams(id: string, teams: string[]): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.addDataRetentionPolicyTeams,\n        onSuccess: AdminTypes.ADD_DATA_RETENTION_CUSTOM_POLICY_TEAMS_SUCCESS,\n        params: [\n            id,\n            teams,\n        ],\n    });\n}\n\nexport function removeDataRetentionCustomPolicyTeams(id: string, teams: string[]): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        try {\n            await Client4.removeDataRetentionPolicyTeams(id, teams);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(\n                {\n                    type: AdminTypes.REMOVE_DATA_RETENTION_CUSTOM_POLICY_TEAMS_FAILURE,\n                    error,\n                },\n            );\n            return {error};\n        }\n        const data = {\n            teams,\n        };\n        dispatch(\n            {type: AdminTypes.REMOVE_DATA_RETENTION_CUSTOM_POLICY_TEAMS_SUCCESS, data},\n        );\n\n        return {data};\n    };\n}\n\nexport function addDataRetentionCustomPolicyChannels(id: string, channels: string[]): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.addDataRetentionPolicyChannels,\n        onSuccess: AdminTypes.ADD_DATA_RETENTION_CUSTOM_POLICY_CHANNELS_SUCCESS,\n        params: [\n            id,\n            channels,\n        ],\n    });\n}\n\nexport function removeDataRetentionCustomPolicyChannels(id: string, channels: string[]): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        try {\n            await Client4.removeDataRetentionPolicyChannels(id, channels);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(\n                {\n                    type: AdminTypes.REMOVE_DATA_RETENTION_CUSTOM_POLICY_CHANNELS_FAILURE,\n                    error,\n                },\n            );\n            return {error};\n        }\n        const data = {\n            channels,\n        };\n        dispatch(\n            {type: AdminTypes.REMOVE_DATA_RETENTION_CUSTOM_POLICY_CHANNELS_SUCCESS, data},\n        );\n\n        return {data};\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {AppsTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\n\nimport {ActionFunc, DispatchFunc, GetStateFunc} from 'mattermost-redux/types/actions';\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\n\nimport {bindClientFunc} from './helpers';\n\n// This file's contents belong to the Apps Framework feature.\n// Apps Framework feature is experimental, and the contents of this file are\n// susceptible to breaking changes without pushing the major version of this package.\n\nexport function fetchAppBindings(userID: string, channelID: string): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const channel = getChannel(getState(), channelID);\n        const teamID = channel?.team_id || '';\n\n        return dispatch(bindClientFunc({\n            clientFunc: () => Client4.getAppsBindings(userID, channelID, teamID),\n            onSuccess: AppsTypes.RECEIVED_APP_BINDINGS,\n        }));\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {CloudTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\n\nimport {ActionFunc} from 'mattermost-redux/types/actions';\nimport {Address, CloudCustomerPatch} from 'mattermost-redux/types/cloud';\n\nimport {bindClientFunc} from './helpers';\n\nexport function getCloudSubscription(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getSubscription,\n        onSuccess: [CloudTypes.RECEIVED_CLOUD_SUBSCRIPTION],\n    });\n}\n\nexport function getCloudProducts(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getCloudProducts,\n        onSuccess: [CloudTypes.RECEIVED_CLOUD_PRODUCTS],\n    });\n}\n\nexport function getSubscriptionStats(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getSubscriptionStats,\n        onSuccess: CloudTypes.RECEIVED_CLOUD_SUBSCRIPTION_STATS,\n    });\n}\n\nexport function getCloudCustomer(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getCloudCustomer,\n        onSuccess: [CloudTypes.RECEIVED_CLOUD_CUSTOMER],\n    });\n}\n\nexport function getInvoices(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getInvoices,\n        onSuccess: [CloudTypes.RECEIVED_CLOUD_INVOICES],\n    });\n}\n\nexport function updateCloudCustomer(customerPatch: CloudCustomerPatch): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.updateCloudCustomer,\n        onSuccess: [CloudTypes.RECEIVED_CLOUD_CUSTOMER],\n        params: [customerPatch],\n    });\n}\n\nexport function updateCloudCustomerAddress(address: Address): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.updateCloudCustomerAddress,\n        onSuccess: [CloudTypes.RECEIVED_CLOUD_CUSTOMER],\n        params: [address],\n    });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {GroupTypes} from 'mattermost-redux/action_types';\nimport {General, Groups} from '../constants';\nimport {Client4} from 'mattermost-redux/client';\n\nimport {Action, ActionFunc, batchActions, DispatchFunc, GetStateFunc} from 'mattermost-redux/types/actions';\nimport {GroupPatch, SyncableType, SyncablePatch} from 'mattermost-redux/types/groups';\n\nimport {logError} from './errors';\nimport {bindClientFunc, forceLogoutIfNecessary} from './helpers';\n\nexport function linkGroupSyncable(groupID: string, syncableID: string, syncableType: SyncableType, patch: SyncablePatch): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        let data;\n        try {\n            data = await Client4.linkGroupSyncable(groupID, syncableID, syncableType, patch);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(logError(error));\n            return {error};\n        }\n\n        const dispatches: Action[] = [];\n        let type = '';\n        switch (syncableType) {\n        case Groups.SYNCABLE_TYPE_TEAM:\n            dispatches.push({type: GroupTypes.RECEIVED_GROUP_ASSOCIATED_TO_TEAM, data: {teamID: syncableID, groups: [{id: groupID}]}});\n            type = GroupTypes.LINKED_GROUP_TEAM;\n            break;\n        case Groups.SYNCABLE_TYPE_CHANNEL:\n            type = GroupTypes.LINKED_GROUP_CHANNEL;\n            break;\n        default:\n            console.warn(`unhandled syncable type ${syncableType}`); // eslint-disable-line no-console\n        }\n\n        dispatches.push({type, data});\n        dispatch(batchActions(dispatches));\n\n        return {data: true};\n    };\n}\n\nexport function unlinkGroupSyncable(groupID: string, syncableID: string, syncableType: SyncableType): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        try {\n            await Client4.unlinkGroupSyncable(groupID, syncableID, syncableType);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(logError(error));\n            return {error};\n        }\n\n        const dispatches: Action[] = [];\n\n        let type = '';\n        const data = {group_id: groupID, syncable_id: syncableID};\n        switch (syncableType) {\n        case Groups.SYNCABLE_TYPE_TEAM:\n            type = GroupTypes.UNLINKED_GROUP_TEAM;\n            data.syncable_id = syncableID;\n            dispatches.push({type: GroupTypes.RECEIVED_GROUPS_NOT_ASSOCIATED_TO_TEAM, data: {teamID: syncableID, groups: [{id: groupID}]}});\n            break;\n        case Groups.SYNCABLE_TYPE_CHANNEL:\n            type = GroupTypes.UNLINKED_GROUP_CHANNEL;\n            data.syncable_id = syncableID;\n            break;\n        default:\n            console.warn(`unhandled syncable type ${syncableType}`); // eslint-disable-line no-console\n        }\n\n        dispatches.push({type, data});\n        dispatch(batchActions(dispatches));\n\n        return {data: true};\n    };\n}\n\nexport function getGroupSyncables(groupID: string, syncableType: SyncableType): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        let data;\n        try {\n            data = await Client4.getGroupSyncables(groupID, syncableType);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(logError(error));\n            return {error};\n        }\n\n        let type = '';\n        switch (syncableType) {\n        case Groups.SYNCABLE_TYPE_TEAM:\n            type = GroupTypes.RECEIVED_GROUP_TEAMS;\n            break;\n        case Groups.SYNCABLE_TYPE_CHANNEL:\n            type = GroupTypes.RECEIVED_GROUP_CHANNELS;\n            break;\n        default:\n            console.warn(`unhandled syncable type ${syncableType}`); // eslint-disable-line no-console\n        }\n\n        dispatch(batchActions([\n            {type, data, group_id: groupID},\n        ]));\n\n        return {data: true};\n    };\n}\n\nexport function patchGroupSyncable(groupID: string, syncableID: string, syncableType: SyncableType, patch: SyncablePatch): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        let data;\n        try {\n            data = await Client4.patchGroupSyncable(groupID, syncableID, syncableType, patch);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            return {error};\n        }\n\n        const dispatches: Action[] = [];\n\n        let type = '';\n        switch (syncableType) {\n        case Groups.SYNCABLE_TYPE_TEAM:\n            type = GroupTypes.PATCHED_GROUP_TEAM;\n            break;\n        case Groups.SYNCABLE_TYPE_CHANNEL:\n            type = GroupTypes.PATCHED_GROUP_CHANNEL;\n            break;\n        default:\n            console.warn(`unhandled syncable type ${syncableType}`); // eslint-disable-line no-console\n        }\n\n        dispatches.push(\n            {type, data},\n        );\n        dispatch(batchActions(dispatches));\n\n        return {data: true};\n    };\n}\n\nexport function getGroup(id: string): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getGroup,\n        onSuccess: [GroupTypes.RECEIVED_GROUP],\n        params: [\n            id,\n        ],\n    });\n}\n\nexport function getGroups(filterAllowReference: false, page = 0, perPage: number = General.PAGE_SIZE_DEFAULT): ActionFunc {\n    return bindClientFunc({\n        clientFunc: async (param1, param2, param3) => {\n            const result = await Client4.getGroups(param1, param2, param3);\n            return result;\n        },\n        onSuccess: [GroupTypes.RECEIVED_GROUPS],\n        params: [\n            filterAllowReference,\n            page,\n            perPage,\n        ],\n    });\n}\n\nexport function getGroupsNotAssociatedToTeam(teamID: string, q = '', page = 0, perPage: number = General.PAGE_SIZE_DEFAULT): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getGroupsNotAssociatedToTeam,\n        onSuccess: [GroupTypes.RECEIVED_GROUPS],\n        params: [\n            teamID,\n            q,\n            page,\n            perPage,\n        ],\n    });\n}\n\nexport function getGroupsNotAssociatedToChannel(channelID: string, q = '', page = 0, perPage: number = General.PAGE_SIZE_DEFAULT, filterParentTeamPermitted = false): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getGroupsNotAssociatedToChannel,\n        onSuccess: [GroupTypes.RECEIVED_GROUPS],\n        params: [\n            channelID,\n            q,\n            page,\n            perPage,\n            filterParentTeamPermitted,\n        ],\n    });\n}\n\nexport function getAllGroupsAssociatedToTeam(teamID: string, filterAllowReference: false, includeMemberCount: false): ActionFunc {\n    return bindClientFunc({\n        clientFunc: async (param1, param2, param3) => {\n            const result = await Client4.getAllGroupsAssociatedToTeam(param1, param2, param3);\n            result.teamID = param1;\n            return result;\n        },\n        onSuccess: [GroupTypes.RECEIVED_ALL_GROUPS_ASSOCIATED_TO_TEAM],\n        params: [\n            teamID,\n            filterAllowReference,\n            includeMemberCount,\n        ],\n    });\n}\n\nexport function getAllGroupsAssociatedToChannelsInTeam(teamID: string, filterAllowReference: false): ActionFunc {\n    return bindClientFunc({\n        clientFunc: async (param1, param2) => {\n            const result = await Client4.getAllGroupsAssociatedToChannelsInTeam(param1, param2);\n            return {groupsByChannelId: result.groups};\n        },\n        onSuccess: [GroupTypes.RECEIVED_ALL_GROUPS_ASSOCIATED_TO_CHANNELS_IN_TEAM],\n        params: [\n            teamID,\n            filterAllowReference,\n        ],\n    });\n}\n\nexport function getAllGroupsAssociatedToChannel(channelID: string, filterAllowReference: false, includeMemberCount: false): ActionFunc {\n    return bindClientFunc({\n        clientFunc: async (param1, param2, param3) => {\n            const result = await Client4.getAllGroupsAssociatedToChannel(param1, param2, param3);\n            result.channelID = param1;\n            return result;\n        },\n        onSuccess: [GroupTypes.RECEIVED_ALL_GROUPS_ASSOCIATED_TO_CHANNEL],\n        params: [\n            channelID,\n            filterAllowReference,\n            includeMemberCount,\n        ],\n    });\n}\n\nexport function getGroupsAssociatedToTeam(teamID: string, q = '', page = 0, perPage: number = General.PAGE_SIZE_DEFAULT, filterAllowReference: false): ActionFunc {\n    return bindClientFunc({\n        clientFunc: async (param1, param2, param3, param4, param5) => {\n            const result = await Client4.getGroupsAssociatedToTeam(param1, param2, param3, param4, param5);\n            return {groups: result.groups, totalGroupCount: result.total_group_count, teamID: param1};\n        },\n        onSuccess: [GroupTypes.RECEIVED_GROUPS_ASSOCIATED_TO_TEAM],\n        params: [\n            teamID,\n            q,\n            page,\n            perPage,\n            filterAllowReference,\n        ],\n    });\n}\n\nexport function getGroupsAssociatedToChannel(channelID: string, q = '', page = 0, perPage: number = General.PAGE_SIZE_DEFAULT, filterAllowReference = false): ActionFunc {\n    return bindClientFunc({\n        clientFunc: async (param1, param2, param3, param4, param5) => {\n            const result = await Client4.getGroupsAssociatedToChannel(param1, param2, param3, param4, param5);\n            return {groups: result.groups, totalGroupCount: result.total_group_count, channelID: param1};\n        },\n        onSuccess: [GroupTypes.RECEIVED_GROUPS_ASSOCIATED_TO_CHANNEL],\n        params: [\n            channelID,\n            q,\n            page,\n            perPage,\n            filterAllowReference,\n        ],\n    });\n}\n\nexport function patchGroup(groupID: string, patch: GroupPatch): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.patchGroup,\n        onSuccess: [GroupTypes.PATCHED_GROUP],\n        params: [\n            groupID,\n            patch,\n        ],\n    });\n}\n\nexport function getGroupsByUserId(userID: string): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getGroupsByUserId,\n        onSuccess: [GroupTypes.RECEIVED_MY_GROUPS],\n        params: [\n            userID,\n        ],\n    });\n}\n\nexport function getGroupStats(groupID: string): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getGroupStats,\n        onSuccess: [GroupTypes.RECEIVED_GROUP_STATS],\n        params: [\n            groupID,\n        ],\n    });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {IntegrationTypes} from 'mattermost-redux/action_types';\nimport {General} from '../constants';\nimport {Client4} from 'mattermost-redux/client';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\nimport {batchActions, DispatchFunc, GetStateFunc, ActionFunc} from 'mattermost-redux/types/actions';\n\nimport {Command, CommandArgs, DialogSubmission, IncomingWebhook, OAuthApp, OutgoingWebhook} from 'mattermost-redux/types/integrations';\n\nimport {logError} from './errors';\nimport {bindClientFunc, forceLogoutIfNecessary} from './helpers';\nexport function createIncomingHook(hook: IncomingWebhook): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.createIncomingWebhook,\n        onSuccess: [IntegrationTypes.RECEIVED_INCOMING_HOOK],\n        params: [\n            hook,\n        ],\n    });\n}\n\nexport function getIncomingHook(hookId: string): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getIncomingWebhook,\n        onSuccess: [IntegrationTypes.RECEIVED_INCOMING_HOOK],\n        params: [\n            hookId,\n        ],\n    });\n}\n\nexport function getIncomingHooks(teamId = '', page = 0, perPage: number = General.PAGE_SIZE_DEFAULT): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getIncomingWebhooks,\n        onSuccess: [IntegrationTypes.RECEIVED_INCOMING_HOOKS],\n        params: [\n            teamId,\n            page,\n            perPage,\n        ],\n    });\n}\n\nexport function removeIncomingHook(hookId: string): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        try {\n            await Client4.removeIncomingWebhook(hookId);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n\n            dispatch(logError(error));\n            return {error};\n        }\n\n        dispatch(batchActions([\n            {\n                type: IntegrationTypes.DELETED_INCOMING_HOOK,\n                data: {id: hookId},\n            },\n        ]));\n\n        return {data: true};\n    };\n}\n\nexport function updateIncomingHook(hook: IncomingWebhook): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.updateIncomingWebhook,\n        onSuccess: [IntegrationTypes.RECEIVED_INCOMING_HOOK],\n        params: [\n            hook,\n        ],\n    });\n}\n\nexport function createOutgoingHook(hook: OutgoingWebhook): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.createOutgoingWebhook,\n        onSuccess: [IntegrationTypes.RECEIVED_OUTGOING_HOOK],\n        params: [\n            hook,\n        ],\n    });\n}\n\nexport function getOutgoingHook(hookId: string): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getOutgoingWebhook,\n        onSuccess: [IntegrationTypes.RECEIVED_OUTGOING_HOOK],\n        params: [\n            hookId,\n        ],\n    });\n}\n\nexport function getOutgoingHooks(channelId = '', teamId = '', page = 0, perPage: number = General.PAGE_SIZE_DEFAULT): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getOutgoingWebhooks,\n        onSuccess: [IntegrationTypes.RECEIVED_OUTGOING_HOOKS],\n        params: [\n            channelId,\n            teamId,\n            page,\n            perPage,\n        ],\n    });\n}\n\nexport function removeOutgoingHook(hookId: string): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        try {\n            await Client4.removeOutgoingWebhook(hookId);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n\n            dispatch(logError(error));\n            return {error};\n        }\n\n        dispatch(batchActions([\n            {\n                type: IntegrationTypes.DELETED_OUTGOING_HOOK,\n                data: {id: hookId},\n            },\n        ]));\n\n        return {data: true};\n    };\n}\n\nexport function updateOutgoingHook(hook: OutgoingWebhook): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.updateOutgoingWebhook,\n        onSuccess: [IntegrationTypes.RECEIVED_OUTGOING_HOOK],\n        params: [\n            hook,\n        ],\n    });\n}\n\nexport function regenOutgoingHookToken(hookId: string): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.regenOutgoingHookToken,\n        onSuccess: [IntegrationTypes.RECEIVED_OUTGOING_HOOK],\n        params: [\n            hookId,\n        ],\n    });\n}\n\nexport function getCommands(teamId: string): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getCommandsList,\n        onSuccess: [IntegrationTypes.RECEIVED_COMMANDS],\n        params: [\n            teamId,\n        ],\n    });\n}\n\nexport function getAutocompleteCommands(teamId: string, page = 0, perPage: number = General.PAGE_SIZE_DEFAULT): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getAutocompleteCommandsList,\n        onSuccess: [IntegrationTypes.RECEIVED_COMMANDS],\n        params: [\n            teamId,\n            page,\n            perPage,\n        ],\n    });\n}\n\nexport function getCustomTeamCommands(teamId: string): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getCustomTeamCommands,\n        onSuccess: [IntegrationTypes.RECEIVED_CUSTOM_TEAM_COMMANDS],\n        params: [\n            teamId,\n        ],\n    });\n}\n\nexport function addCommand(command: Command): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.addCommand,\n        onSuccess: [IntegrationTypes.RECEIVED_COMMAND],\n        params: [\n            command,\n        ],\n    });\n}\n\nexport function editCommand(command: Command): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.editCommand,\n        onSuccess: [IntegrationTypes.RECEIVED_COMMAND],\n        params: [\n            command,\n        ],\n    });\n}\n\nexport function executeCommand(command: string, args: CommandArgs): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.executeCommand,\n        params: [\n            command,\n            args,\n        ],\n    });\n}\n\nexport function regenCommandToken(id: string): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        let res;\n        try {\n            res = await Client4.regenCommandToken(id);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n\n            dispatch(logError(error));\n            return {error};\n        }\n\n        dispatch(batchActions([\n            {\n                type: IntegrationTypes.RECEIVED_COMMAND_TOKEN,\n                data: {\n                    id,\n                    token: res.token,\n                },\n            },\n        ]));\n\n        return {data: true};\n    };\n}\n\nexport function deleteCommand(id: string): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        try {\n            await Client4.deleteCommand(id);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n\n            dispatch(logError(error));\n            return {error};\n        }\n\n        dispatch(batchActions([\n            {\n                type: IntegrationTypes.DELETED_COMMAND,\n                data: {id},\n            },\n        ]));\n\n        return {data: true};\n    };\n}\n\nexport function addOAuthApp(app: OAuthApp): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.createOAuthApp,\n        onSuccess: [IntegrationTypes.RECEIVED_OAUTH_APP],\n        params: [\n            app,\n        ],\n    });\n}\n\nexport function editOAuthApp(app: OAuthApp): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.editOAuthApp,\n        onSuccess: IntegrationTypes.RECEIVED_OAUTH_APP,\n        params: [\n            app,\n        ],\n    });\n}\n\nexport function getOAuthApps(page = 0, perPage: number = General.PAGE_SIZE_DEFAULT): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getOAuthApps,\n        onSuccess: [IntegrationTypes.RECEIVED_OAUTH_APPS],\n        params: [\n            page,\n            perPage,\n        ],\n    });\n}\n\nexport function getAppsOAuthAppIDs(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getAppsOAuthAppIDs,\n        onSuccess: [IntegrationTypes.RECEIVED_APPS_OAUTH_APP_IDS],\n    });\n}\n\nexport function getAppsBotIDs(): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getAppsBotIDs,\n        onSuccess: [IntegrationTypes.RECEIVED_APPS_BOT_IDS],\n    });\n}\n\nexport function getOAuthApp(appId: string): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.getOAuthApp,\n        onSuccess: [IntegrationTypes.RECEIVED_OAUTH_APP],\n        params: [\n            appId,\n        ],\n    });\n}\n\nexport function getAuthorizedOAuthApps(): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState();\n        const currentUserId = getCurrentUserId(state);\n\n        let data;\n        try {\n            data = await Client4.getAuthorizedOAuthApps(currentUserId);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n\n            dispatch(logError(error));\n\n            return {error};\n        }\n\n        return {data};\n    };\n}\n\nexport function deauthorizeOAuthApp(clientId: string): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.deauthorizeOAuthApp,\n        params: [clientId],\n    });\n}\n\nexport function deleteOAuthApp(id: string): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        try {\n            await Client4.deleteOAuthApp(id);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n\n            dispatch(logError(error));\n            return {error};\n        }\n\n        dispatch(batchActions([\n            {\n                type: IntegrationTypes.DELETED_OAUTH_APP,\n                data: {id},\n            },\n        ]));\n\n        return {data: true};\n    };\n}\n\nexport function regenOAuthAppSecret(appId: string): ActionFunc {\n    return bindClientFunc({\n        clientFunc: Client4.regenOAuthAppSecret,\n        onSuccess: [IntegrationTypes.RECEIVED_OAUTH_APP],\n        params: [\n            appId,\n        ],\n    });\n}\n\nexport function submitInteractiveDialog(submission: DialogSubmission): ActionFunc {\n    return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n        const state = getState();\n        submission.channel_id = getCurrentChannelId(state);\n        submission.team_id = getCurrentTeamId(state);\n\n        let data;\n        try {\n            data = await Client4.submitInteractiveDialog(submission);\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n\n            dispatch(logError(error));\n            return {error};\n        }\n\n        return {data};\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createSelector} from 'reselect';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {AppBinding} from 'mattermost-redux/types/apps';\nimport {ClientConfig} from 'mattermost-redux/types/config';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\n// This file's contents belong to the Apps Framework feature.\n// Apps Framework feature is experimental, and the contents of this file are\n// susceptible to breaking changes without pushing the major version of this package.\nexport const appsEnabled = createSelector(\n    'appsEnabled',\n    (state: GlobalState) => getConfig(state),\n    (config?: Partial<ClientConfig>) => {\n        const enabled = config?.['FeatureFlagAppsEnabled' as keyof Partial<ClientConfig>];\n        return enabled === 'true';\n    },\n);\n\nexport const makeAppBindingsSelector = (location: string) => {\n    return createSelector(\n        'makeAppBindingsSelector',\n        (state: GlobalState) => state.entities.apps.bindings,\n        (state: GlobalState) => appsEnabled(state),\n        (bindings: AppBinding[], areAppsEnabled: boolean) => {\n            if (!areAppsEnabled || !bindings) {\n                return [];\n            }\n\n            const headerBindings = bindings.filter((b) => b.location === location);\n            return headerBindings.reduce((accum: AppBinding[], current: AppBinding) => accum.concat(current.bindings || []), []);\n        },\n    );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createSelector} from 'reselect';\n\nimport {getCurrentUserLocale} from 'mattermost-redux/selectors/entities/i18n';\n\nimport {FileInfo, FileSearchResultItem} from 'mattermost-redux/types/files';\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport {sortFileInfos} from 'mattermost-redux/utils/file_utils';\n\nfunction getAllFiles(state: GlobalState) {\n    return state.entities.files.files;\n}\n\nfunction getAllFilesFromSearch(state: GlobalState) {\n    return state.entities.files.filesFromSearch;\n}\n\nfunction getFilesIdsForPost(state: GlobalState, postId: string) {\n    if (postId) {\n        return state.entities.files.fileIdsByPostId[postId] || [];\n    }\n\n    return [];\n}\n\nexport function getFilePublicLink(state: GlobalState) {\n    return state.entities.files.filePublicLink;\n}\n\nexport function makeGetFilesForPost(): (state: GlobalState, postId: string) => FileInfo[] {\n    return createSelector(\n        'makeGetFilesForPost',\n        getAllFiles,\n        getFilesIdsForPost,\n        getCurrentUserLocale,\n        (allFiles, fileIdsForPost, locale) => {\n            const fileInfos = fileIdsForPost.map((id) => allFiles[id]).filter((id) => Boolean(id));\n\n            return sortFileInfos(fileInfos, locale);\n        },\n    );\n}\n\nexport const getSearchFilesResults: (state: GlobalState) => FileSearchResultItem[] = createSelector(\n    'getSearchFilesResults',\n    getAllFilesFromSearch,\n    (state: GlobalState) => state.entities.search.fileResults,\n    (files, fileIds) => {\n        if (!fileIds) {\n            return [];\n        }\n\n        return fileIds.map((id) => files[id]);\n    },\n);\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {createSelector} from 'reselect';\n\nimport {Group} from 'mattermost-redux/types/groups';\nimport {filterGroupsMatchingTerm} from 'mattermost-redux/utils/group_utils';\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {UserMentionKey} from 'mattermost-redux/selectors/entities/users';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport {Dictionary, NameMappedObjects} from 'mattermost-redux/types/utilities';\n\nconst emptyList: any[] = [];\nconst emptySyncables = {\n    teams: [],\n    channels: [],\n};\n\nexport function getAllGroups(state: GlobalState) {\n    return state.entities.groups.groups;\n}\n\nexport function getMyGroups(state: GlobalState) {\n    return state.entities.groups.myGroups;\n}\n\nexport function getAllGroupStats(state: GlobalState) {\n    return state.entities.groups.stats;\n}\n\nexport function getGroupStats(state: GlobalState, id: string) {\n    return getAllGroupStats(state)[id] || {};\n}\n\nexport function getGroup(state: GlobalState, id: string) {\n    return getAllGroups(state)[id];\n}\n\nexport function getGroupMemberCount(state: GlobalState, id: string) {\n    return getGroupStats(state, id).total_member_count;\n}\n\nfunction getGroupSyncables(state: GlobalState, id: string) {\n    return state.entities.groups.syncables[id] || emptySyncables;\n}\n\nexport function getGroupTeams(state: GlobalState, id: string) {\n    return getGroupSyncables(state, id).teams;\n}\n\nexport function getGroupChannels(state: GlobalState, id: string) {\n    return getGroupSyncables(state, id).channels;\n}\n\nexport const getAssociatedGroupsByName: (state: GlobalState, teamID: string, channelId: string) => NameMappedObjects<Group> = createSelector(\n    'getAssociatedGroupsByName',\n    getAssociatedGroupsForReference,\n    (groups) => {\n        const groupsByName: Dictionary<Group> = {};\n\n        for (const id in groups) {\n            if (groups.hasOwnProperty(id)) {\n                const group = groups[id];\n                groupsByName[group.name] = group;\n            }\n        }\n\n        return groupsByName;\n    },\n);\n\nexport const getAssociatedGroupsForReferenceByMention: (state: GlobalState, teamID: string, channelId: string) => Map<string, Group> = createSelector(\n    'getAssociatedGroupsForReferenceByMention',\n    getAssociatedGroupsForReference,\n    (groups) => {\n        return new Map(groups.map((group) => [`@${group.name}`, group]));\n    },\n);\n\nexport function searchAssociatedGroupsForReferenceLocal(state: GlobalState, term: string, teamId: string, channelId: string): Group[] {\n    const groups = getAssociatedGroupsForReference(state, teamId, channelId);\n    if (!groups) {\n        return emptyList;\n    }\n    const filteredGroups = filterGroupsMatchingTerm(groups, term);\n    return filteredGroups;\n}\n\nexport function getAssociatedGroupsForReference(state: GlobalState, teamId: string, channelId: string): Group[] {\n    const team = getTeam(state, teamId);\n    const channel = getChannel(state, channelId);\n\n    let groupsForReference = [];\n    if (team && team.group_constrained && channel && channel.group_constrained) {\n        const groupsFromChannel = getGroupsAssociatedToChannelForReference(state, channelId);\n        const groupsFromTeam = getGroupsAssociatedToTeamForReference(state, teamId);\n        groupsForReference = groupsFromChannel.concat(groupsFromTeam.filter((item) => groupsFromChannel.indexOf(item) < 0));\n    } else if (team && team.group_constrained) {\n        groupsForReference = getGroupsAssociatedToTeamForReference(state, teamId);\n    } else if (channel && channel.group_constrained) {\n        groupsForReference = getGroupsAssociatedToChannelForReference(state, channelId);\n    } else {\n        groupsForReference = getAllAssociatedGroupsForReference(state);\n    }\n    return groupsForReference;\n}\n\nconst teamGroupIDs = (state: GlobalState, teamID: string) => state.entities.teams.groupsAssociatedToTeam[teamID]?.ids || [];\n\nconst channelGroupIDs = (state: GlobalState, channelID: string) => state.entities.channels.groupsAssociatedToChannel[channelID]?.ids || [];\n\nconst getTeamGroupIDSet = createSelector(\n    'getTeamGroupIDSet',\n    teamGroupIDs,\n    (teamIDs) => new Set(teamIDs),\n);\n\nconst getChannelGroupIDSet = createSelector(\n    'getChannelGroupIDSet',\n    channelGroupIDs,\n    (channelIDs) => new Set(channelIDs),\n);\n\nexport const getGroupsNotAssociatedToTeam: (state: GlobalState, teamID: string) => Group[] = createSelector(\n    'getGroupsNotAssociatedToTeam',\n    getAllGroups,\n    (state: GlobalState, teamID: string) => getTeamGroupIDSet(state, teamID),\n    (allGroups, teamGroupIDSet) => {\n        return Object.entries(allGroups).filter(([groupID]) => !teamGroupIDSet.has(groupID)).map((entry) => entry[1]);\n    },\n);\n\nexport const getGroupsAssociatedToTeam: (state: GlobalState, teamID: string) => Group[] = createSelector(\n    'getGroupsAssociatedToTeam',\n    getAllGroups,\n    (state: GlobalState, teamID: string) => getTeamGroupIDSet(state, teamID),\n    (allGroups, teamGroupIDSet) => {\n        return Object.entries(allGroups).filter(([groupID]) => teamGroupIDSet.has(groupID)).map((entry) => entry[1]);\n    },\n);\n\nexport const getGroupsNotAssociatedToChannel: (state: GlobalState, channelID: string, teamID: string) => Group[] = createSelector(\n    'getGroupsNotAssociatedToChannel',\n    getAllGroups,\n    (state: GlobalState, channelID: string) => getChannelGroupIDSet(state, channelID),\n    (state: GlobalState, channelID: string, teamID: string) => getTeam(state, teamID),\n    (state: GlobalState, channelID: string, teamID: string) => getGroupsAssociatedToTeam(state, teamID),\n    (allGroups, channelGroupIDSet, team, teamGroups) => {\n        let result = Object.values(allGroups).filter((group) => !channelGroupIDSet.has(group.id));\n        if (team.group_constrained) {\n            const gids = teamGroups.map((group) => group.id);\n            result = result.filter((group) => gids?.includes(group.id));\n        }\n        return result;\n    },\n);\n\nexport const getGroupsAssociatedToChannel: (state: GlobalState, channelID: string) => Group[] = createSelector(\n    'getGroupsAssociatedToChannel',\n    getAllGroups,\n    (state: GlobalState, channelID: string) => getChannelGroupIDSet(state, channelID),\n    (allGroups, channelGroupIDSet) => {\n        return Object.entries(allGroups).filter(([groupID]) => channelGroupIDSet.has(groupID)).map((entry) => entry[1]);\n    },\n);\n\nexport const getGroupsAssociatedToTeamForReference: (state: GlobalState, teamID: string) => Group[] = createSelector(\n    'getGroupsAssociatedToTeamForReference',\n    getAllGroups,\n    (state: GlobalState, teamID: string) => getTeamGroupIDSet(state, teamID),\n    (allGroups, teamGroupIDSet) => {\n        return Object.entries(allGroups).filter(([groupID]) => teamGroupIDSet.has(groupID)).filter((entry) => (entry[1].allow_reference && entry[1].delete_at === 0)).map((entry) => entry[1]);\n    },\n);\n\nexport const getGroupsAssociatedToChannelForReference: (state: GlobalState, channelID: string) => Group[] = createSelector(\n    'getGroupsAssociatedToChannelForReference',\n    getAllGroups,\n    (state: GlobalState, channelID: string) => getChannelGroupIDSet(state, channelID),\n    (allGroups, channelGroupIDSet) => {\n        return Object.entries(allGroups).filter(([groupID]) => channelGroupIDSet.has(groupID)).filter((entry) => (entry[1].allow_reference && entry[1].delete_at === 0)).map((entry) => entry[1]);\n    },\n);\n\nexport const getAllAssociatedGroupsForReference: (state: GlobalState) => Group[] = createSelector(\n    'getAllAssociatedGroupsForReference',\n    getAllGroups,\n    (allGroups) => {\n        return Object.entries(allGroups).filter((entry) => (entry[1].allow_reference && entry[1].delete_at === 0)).map((entry) => entry[1]);\n    },\n);\n\nexport const getAllGroupsForReferenceByName: (state: GlobalState) => NameMappedObjects<Group> = createSelector(\n    'getAllGroupsForReferenceByName',\n    getAllAssociatedGroupsForReference,\n    (groups) => {\n        const groupsByName: Dictionary<Group> = {};\n\n        for (const id in groups) {\n            if (groups.hasOwnProperty(id)) {\n                const group = groups[id];\n                groupsByName[group.name] = group;\n            }\n        }\n\n        return groupsByName;\n    },\n);\n\nexport const getMyAllowReferencedGroups: (state: GlobalState) => Group[] = createSelector(\n    'getMyAllowReferencedGroups',\n    getMyGroups,\n    (myGroups) => {\n        return Object.values(myGroups).filter((group) => group.allow_reference && group.delete_at === 0);\n    },\n);\n\nexport const getMyGroupsAssociatedToChannelForReference: (state: GlobalState, teamId: string, channelId: string) => Group[] = createSelector(\n    'getMyGroupsAssociatedToChannelForReference',\n    getMyGroups,\n    getAssociatedGroupsByName,\n    (myGroups, groups) => {\n        return Object.values(myGroups).filter((group) => group.allow_reference && group.delete_at === 0 && groups[group.name]);\n    },\n);\n\nexport const getMyGroupMentionKeys: (state: GlobalState) => UserMentionKey[] = createSelector(\n    'getMyGroupMentionKeys',\n    getMyAllowReferencedGroups,\n    (groups: Group[]) => {\n        const keys: UserMentionKey[] = [];\n        groups.forEach((group) => keys.push({key: `@${group.name}`}));\n        return keys;\n    },\n);\n\nexport const getMyGroupMentionKeysForChannel: (state: GlobalState, teamId: string, channelId: string) => UserMentionKey[] = createSelector(\n    'getMyGroupMentionKeysForChannel',\n    getMyGroupsAssociatedToChannelForReference,\n    (groups: Group[]) => {\n        const keys: UserMentionKey[] = [];\n        groups.forEach((group) => keys.push({key: `@${group.name}`}));\n        return keys;\n    },\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {General} from '../constants';\nimport {Group} from 'mattermost-redux/types/groups';\n\nimport {getSuggestionsSplitByMultiple} from './user_utils';\n\nexport function filterGroupsMatchingTerm(groups: Group[], term: string): Group[] {\n    const lowercasedTerm = term.toLowerCase();\n    let trimmedTerm = lowercasedTerm;\n    if (trimmedTerm.startsWith('@')) {\n        trimmedTerm = trimmedTerm.substr(1);\n    }\n\n    return groups.filter((group: Group) => {\n        if (!group) {\n            return false;\n        }\n\n        const groupSuggestions: string[] = [];\n\n        const groupnameSuggestions = getSuggestionsSplitByMultiple((group.name || '').toLowerCase(), General.AUTOCOMPLETE_SPLIT_CHARACTERS);\n\n        groupSuggestions.push(...groupnameSuggestions);\n        const displayname = (group.display_name || '').toLowerCase();\n        groupSuggestions.push(displayname);\n\n        return groupSuggestions.\n            filter((suggestion) => suggestion !== '').\n            some((suggestion) => suggestion.startsWith(trimmedTerm));\n    });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createSelector} from 'reselect';\n\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserMentionKeys} from 'mattermost-redux/selectors/entities/users';\nimport {getMyGroupMentionKeys} from 'mattermost-redux/selectors/entities/groups';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport {UserMentionKey} from './users';\n\nexport const getCurrentSearchForCurrentTeam: (state: GlobalState) => string = createSelector(\n    'getCurrentSearchForCurrentTeam',\n    (state: GlobalState) => state.entities.search.current,\n    getCurrentTeamId,\n    (current, teamId) => {\n        return current[teamId];\n    },\n);\n\nexport const getAllUserMentionKeys: (state: GlobalState) => UserMentionKey[] = createSelector(\n    'getAllUserMentionKeys',\n    getCurrentUserMentionKeys,\n    getMyGroupMentionKeys,\n    (userMentionKeys, groupMentionKeys) => {\n        return userMentionKeys.concat(groupMentionKeys);\n    },\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createSelector} from 'reselect';\n\nimport {getMyChannelMemberships, getAllChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {Channel} from 'mattermost-redux/types/channels';\nimport {UserProfile, UserProfileWithLastViewAt} from 'mattermost-redux/types/users';\nimport {getDirectChannelName} from 'mattermost-redux/utils/channel_utils';\nimport {General} from 'mattermost-redux/constants';\n\nimport {NameMappedObjects} from 'mattermost-redux/types/utilities';\n\nexport function makeAddLastViewAtToProfiles(): (state: GlobalState, profiles: UserProfile[]) => UserProfileWithLastViewAt[] {\n    return createSelector(\n        'makeAddLastViewAtToProfiles',\n        getCurrentUserId,\n        getMyChannelMemberships,\n        getAllChannels,\n        (state: GlobalState, profiles: UserProfile[]) => profiles,\n        (currentUserId, memberships, allChannels, profiles) => {\n            const DMchannels = Object.values(allChannels).reduce((acc: NameMappedObjects<Channel>, channel) => {\n                if (channel.type === General.DM_CHANNEL) {\n                    return {\n                        ...acc,\n                        [channel.name]: channel,\n                    };\n                }\n                return acc;\n            }, {});\n\n            const formattedProfiles: UserProfileWithLastViewAt[] = profiles.map((profile) => {\n                const channelName = getDirectChannelName(currentUserId, profile.id);\n                const channel = DMchannels[channelName];\n                const membership = channel ? memberships[channel.id] : null;\n                return {\n                    ...profile,\n                    last_viewed_at: channel && membership ? membership.last_viewed_at : 0,\n                };\n            });\n            return formattedProfiles;\n        },\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {Files, General} from '../constants';\nimport {Client4} from 'mattermost-redux/client';\nimport {FileInfo} from 'mattermost-redux/types/files';\nimport {Dictionary} from 'mattermost-redux/types/utilities';\n\nconst mimeDB = require('mime-db');\n\nexport function getFormattedFileSize(file: FileInfo): string {\n    const bytes = file.size;\n    const fileSizes = [\n        ['TB', 1024 * 1024 * 1024 * 1024],\n        ['GB', 1024 * 1024 * 1024],\n        ['MB', 1024 * 1024],\n        ['KB', 1024],\n    ];\n    const size = fileSizes.find((unitAndMinBytes) => {\n        const minBytes = unitAndMinBytes[1];\n        return bytes > minBytes;\n    });\n\n    if (size) {\n        return `${Math.floor(bytes / (size[1] as any))} ${size[0]}`;\n    }\n\n    return `${bytes} B`;\n}\n\nexport function getFileType(file: FileInfo): string {\n    if (!file || !file.extension) {\n        return 'other';\n    }\n\n    const fileExt = file.extension.toLowerCase();\n    const fileTypes = [\n        'image',\n        'code',\n        'pdf',\n        'video',\n        'audio',\n        'spreadsheet',\n        'text',\n        'word',\n        'presentation',\n        'patch',\n    ];\n    return fileTypes.find((fileType) => {\n        const constForFileTypeExtList = `${fileType}_types`.toUpperCase();\n        const fileTypeExts = Files[constForFileTypeExtList];\n        return fileTypeExts.indexOf(fileExt) > -1;\n    }) || 'other';\n}\n\nlet extToMime: Dictionary<string>;\nfunction buildExtToMime() {\n    extToMime = {};\n    Object.keys(mimeDB).forEach((key) => {\n        const mime = mimeDB[key];\n        if (mime.extensions) {\n            mime.extensions.forEach((ext: string) => {\n                extToMime[ext] = key;\n            });\n        }\n    });\n}\n\nexport function lookupMimeType(filename: string): string {\n    if (!extToMime) {\n        buildExtToMime();\n    }\n\n    const ext = filename.split('.').pop()!.toLowerCase();\n    return extToMime[ext] || 'application/octet-stream';\n}\n\nexport function getFileUrl(fileId: string): string {\n    return Client4.getFileRoute(fileId);\n}\n\nexport function getFileDownloadUrl(fileId: string): string {\n    return `${Client4.getFileRoute(fileId)}?download=1`;\n}\n\nexport function getFileThumbnailUrl(fileId: string): string {\n    return `${Client4.getFileRoute(fileId)}/thumbnail`;\n}\n\nexport function getFilePreviewUrl(fileId: string): string {\n    return `${Client4.getFileRoute(fileId)}/preview`;\n}\n\nexport function sortFileInfos(fileInfos: FileInfo[] = [], locale: string = General.DEFAULT_LOCALE): FileInfo[] {\n    return fileInfos.sort((a, b) => {\n        if (a.create_at !== b.create_at) {\n            return a.create_at - b.create_at;\n        }\n\n        return a.name.localeCompare(b.name, locale, {numeric: true});\n    });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {DialogElement} from 'mattermost-redux/types/integrations';\n\ntype DialogError = {\n    id: string;\n    defaultMessage: string;\n    values?: any;\n};\nexport function checkDialogElementForError(elem: DialogElement, value: any): DialogError | undefined | null {\n    if (!value && !elem.optional) {\n        return {\n            id: 'interactive_dialog.error.required',\n            defaultMessage: 'This field is required.',\n        };\n    }\n\n    const type = elem.type;\n\n    if (type === 'text' || type === 'textarea') {\n        if (value && value.length < elem.min_length) {\n            return {\n                id: 'interactive_dialog.error.too_short',\n                defaultMessage: 'Minimum input length is {minLength}.',\n                values: {minLength: elem.min_length},\n            };\n        }\n\n        if (elem.subtype === 'email') {\n            if (value && !value.includes('@')) {\n                return {\n                    id: 'interactive_dialog.error.bad_email',\n                    defaultMessage: 'Must be a valid email address.',\n                };\n            }\n        }\n\n        if (elem.subtype === 'number') {\n            if (value && isNaN(value)) {\n                return {\n                    id: 'interactive_dialog.error.bad_number',\n                    defaultMessage: 'Must be a number.',\n                };\n            }\n        }\n\n        if (elem.subtype === 'url') {\n            if (value && !value.includes('http://') && !value.includes('https://')) {\n                return {\n                    id: 'interactive_dialog.error.bad_url',\n                    defaultMessage: 'URL must include http:// or https://.',\n                };\n            }\n        }\n    } else if (type === 'radio') {\n        const options = elem.options;\n\n        if (typeof value !== 'undefined' && Array.isArray(options) && !options.some((e) => e.value === value)) {\n            return {\n                id: 'interactive_dialog.error.invalid_option',\n                defaultMessage: 'Must be a valid option',\n            };\n        }\n    }\n\n    return null;\n}\n\n// If we're returned errors that don't match any of the elements we have,\n// ignore them and complete the dialog\n\nexport function checkIfErrorsMatchElements(errors: {\n    [x: string]: DialogError;\n} = {}, elements: DialogElement[] = []) {\n    for (const name in errors) {\n        if (!errors.hasOwnProperty(name)) {\n            continue;\n        }\n        for (const elem of elements) {\n            if (elem.name === name) {\n                return true;\n            }\n        }\n    }\n\n    return false;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/* eslint max-lines: 0 */\n\nimport React from 'react';\n\nimport reducerRegistry from 'mattermost-redux/store/reducer_registry';\n\nimport {\n    registerPluginWebSocketEvent,\n    unregisterPluginWebSocketEvent,\n    registerPluginReconnectHandler,\n    unregisterPluginReconnectHandler,\n} from 'actions/websocket_actions.jsx';\n\nimport {showRHSPlugin, hideRHSPlugin, toggleRHSPlugin} from 'actions/views/rhs';\n\nimport {\n    registerPluginTranslationsSource,\n} from 'actions/views/root';\n\nimport {\n    registerAdminConsolePlugin,\n    unregisterAdminConsolePlugin,\n    registerAdminConsoleCustomSetting,\n} from 'actions/admin_actions';\n\nimport store from 'stores/redux_store.jsx';\nimport {ActionTypes} from 'utils/constants';\nimport {generateId} from 'utils/utils.jsx';\n\nfunction dispatchPluginComponentAction(name, pluginId, component, id = generateId()) {\n    store.dispatch({\n        type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n        name,\n        data: {\n            id,\n            pluginId,\n            component,\n        },\n    });\n\n    return id;\n}\n\nconst resolveReactElement = (element) => {\n    if (element && !React.isValidElement(element) && typeof element !== 'string') {\n        // Allow element to be passed as the name of the component, instead of a React element.\n        return React.createElement(element);\n    }\n\n    return element;\n};\n\nconst standardizeRoute = (route) => {\n    let fixedRoute = route.trim();\n    if (fixedRoute[0] === '/') {\n        fixedRoute = fixedRoute.substring(1);\n    }\n    return fixedRoute;\n};\n\nexport default class PluginRegistry {\n    constructor(id) {\n        this.id = id;\n    }\n\n    // Register a component at the root of the channel view of the app.\n    // Accepts a React component. Returns a unique identifier.\n    registerRootComponent(component) {\n        return dispatchPluginComponentAction('Root', this.id, component);\n    }\n\n    // Register a component in the user attributes section of the profile popover (hovercard), below the default user attributes.\n    // Accepts a React component. Returns a unique identifier.\n    registerPopoverUserAttributesComponent(component) {\n        return dispatchPluginComponentAction('PopoverUserAttributes', this.id, component);\n    }\n\n    // Register a component in the user actions of the profile popover (hovercard), below the default actions.\n    // Accepts a React component. Returns a unique identifier.\n    registerPopoverUserActionsComponent(component) {\n        return dispatchPluginComponentAction('PopoverUserActions', this.id, component);\n    }\n\n    // Register a component fixed to the top of the left-hand channel sidebar.\n    // Accepts a React component. Returns a unique identifier.\n    registerLeftSidebarHeaderComponent(component) {\n        return dispatchPluginComponentAction('LeftSidebarHeader', this.id, component);\n    }\n\n    // Register a component fixed to the bottom of the team sidebar. Does not render if\n    // user is only on one team and the team sidebar is not shown.\n    // Accepts a React component. Returns a unique identifier.\n    registerBottomTeamSidebarComponent(component) {\n        return dispatchPluginComponentAction('BottomTeamSidebar', this.id, component);\n    }\n\n    // Register a component fixed to the bottom of the post message.\n    // Accepts a React component. Returns a unique identifier.\n    registerPostMessageAttachmentComponent(component) {\n        return dispatchPluginComponentAction('PostMessageAttachment', this.id, component);\n    }\n\n    // Register a component to show as a tooltip when a user hovers on a link in a post.\n    // Accepts a React component. Returns a unique identifier.\n    registerLinkTooltipComponent(component) {\n        return dispatchPluginComponentAction('LinkTooltip', this.id, component);\n    }\n\n    // Add a button to the channel header. If there are more than one buttons registered by any\n    // plugin, a dropdown menu is created to contain all the plugin buttons.\n    // Accepts the following:\n    // - icon - React element to use as the button's icon\n    // - action - a function called when the button is clicked, passed the channel and channel member as arguments\n    // - dropdown_text - string or React element shown for the dropdown button description\n    // - tooltip_text - string or React element shown for tooltip appear on hover\n    registerChannelHeaderButtonAction(icon, action, dropdownText, tooltipText) {\n        const id = generateId();\n\n        const data = {\n            id,\n            pluginId: this.id,\n            icon: resolveReactElement(icon),\n            action,\n            dropdownText: resolveReactElement(dropdownText),\n            tooltipText: resolveReactElement(tooltipText),\n        };\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'ChannelHeaderButton',\n            data,\n        });\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'MobileChannelHeaderButton',\n            data,\n        });\n\n        return id;\n    }\n\n    // Add a \"call button\"\" next to the attach file button. If there are more than one button registered by any\n    // plugin, a dropdown menu is created to contain all the call plugin buttons.\n    // Accepts the following:\n    // - icon - React element to use as the button's icon\n    // - action - a function called when the button is clicked, passed the channel and channel member as arguments\n    // - dropdown_text - string or React element shown for the dropdown button description\n    // - tooltip_text - string shown for tooltip appear on hover\n    // Returns an unique identifier\n    // Minimum required version: 5.28\n    registerCallButtonAction(icon, action, dropdownText, tooltipText) {\n        const id = generateId();\n\n        const data = {\n            id,\n            pluginId: this.id,\n            icon: resolveReactElement(icon),\n            action,\n            dropdownText: resolveReactElement(dropdownText),\n            tooltipText,\n        };\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'CallButton',\n            data,\n        });\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'MobileChannelHeaderButton',\n            data,\n        });\n\n        return id;\n    }\n\n    // Register a component to render a custom body for posts with a specific type.\n    // Custom post types must be prefixed with 'custom_'.\n    // Custom post types can also apply for ephemeral posts.\n    // Accepts a string type and a component.\n    // Returns a unique identifier.\n    registerPostTypeComponent(type, component) {\n        const id = generateId();\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_POST_COMPONENT,\n            data: {\n                id,\n                pluginId: this.id,\n                type,\n                component,\n            },\n        });\n\n        return id;\n    }\n\n    // Register a component to render a custom body for post cards with a specific type.\n    // Custom post types must be prefixed with 'custom_'.\n    // Accepts a string type and a component.\n    // Returns a unique identifier.\n    registerPostCardTypeComponent(type, component) {\n        const id = generateId();\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_POST_CARD_COMPONENT,\n            data: {\n                id,\n                pluginId: this.id,\n                type,\n                component,\n            },\n        });\n\n        return id;\n    }\n\n    // Register a component to render a custom embed preview for post links.\n    // Accepts the following:\n    // - match - A function that receives the embed object and returns a\n    //   boolean indicating if the plugin is able to process it.\n    //   The embed object contains the embed `type`, the `url` of the post link\n    //   and in some cases, a `data` object with information related to the\n    //   link (the opengraph or the image details, for example).\n    // - component - The component that renders the embed view for the link\n    // - toggleable - A boolean indicating if the embed view should be collapsable\n    // Returns a unique identifier.\n    registerPostWillRenderEmbedComponent(match, component, toggleable) {\n        const id = generateId();\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'PostWillRenderEmbedComponent',\n            data: {\n                id,\n                pluginId: this.id,\n                component,\n                match,\n                toggleable,\n            },\n        });\n\n        return id;\n    }\n\n    // Register a main menu list item by providing some text and an action function.\n    // Accepts the following:\n    // - text - A string or React element to display in the menu\n    // - action - A function to trigger when component is clicked on\n    // - mobileIcon - A React element to display as the icon in the menu in mobile view\n    // Returns a unique identifier.\n    registerMainMenuAction(text, action, mobileIcon) {\n        const id = generateId();\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'MainMenu',\n            data: {\n                id,\n                pluginId: this.id,\n                text: resolveReactElement(text),\n                action,\n                mobileIcon: resolveReactElement(mobileIcon),\n            },\n        });\n\n        return id;\n    }\n\n    // Register a channel menu list item by providing some text and an action function.\n    // Accepts the following:\n    // - text - A string or React element to display in the menu\n    // - action - A function that receives the channelId and is called when the menu items is clicked.\n    // Returns a unique identifier.\n    registerChannelHeaderMenuAction(text, action) {\n        const id = generateId();\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'ChannelHeader',\n            data: {\n                id,\n                pluginId: this.id,\n                text: resolveReactElement(text),\n                action,\n            },\n        });\n\n        return id;\n    }\n\n    // Register a files dropdown list item by providing some text and an action function.\n    // Accepts the following:\n    // - match - A function  that receives the fileInfo and returns a boolean indicating if the plugin is able to process it.\n    // - text - A string or React element to display in the menu\n    // - action - A function that receives the fileInfo and is called when the menu items is clicked.\n    // Returns a unique identifier.\n    registerFileDropdownMenuAction(match, text, action) {\n        const id = generateId();\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'FilesDropdown',\n            data: {\n                id,\n                pluginId: this.id,\n                match,\n                text: resolveReactElement(text),\n                action,\n            },\n        });\n\n        return id;\n    }\n\n    // Register a post menu list item by providing some text and an action function.\n    // Accepts the following:\n    // - text - A string or React element to display in the menu\n    // - action - A function to trigger when component is clicked on\n    // - filter - A function whether to apply the plugin into the post' dropdown menu\n    // Returns a unique identifier.\n    registerPostDropdownMenuAction(text, action, filter) {\n        const id = generateId();\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'PostDropdownMenu',\n            data: {\n                id,\n                pluginId: this.id,\n                text: resolveReactElement(text),\n                action,\n                filter,\n            },\n        });\n\n        return id;\n    }\n\n    // Register a post sub menu list item by providing some text and an action function.\n    // Accepts the following:\n    // - text - A string or React element to display in the menu\n    // - action - A function to trigger when component is clicked on\n    // - filter - A function whether to apply the plugin into the post' dropdown menu\n    //\n    // Returns an unique identifier for the root submenu, and a function to register submenu items.\n    // At this time, only one level of nesting is allowed to avoid rendering issue in the RHS.\n    registerPostDropdownSubMenuAction(text, action, filter) {\n        function registerMenuItem(pluginId, id, parentMenuId, innerText, innerAction, innerFilter) {\n            store.dispatch({\n                type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n                name: 'PostDropdownMenu',\n                data: {\n                    id,\n                    parentMenuId,\n                    pluginId,\n                    text: resolveReactElement(innerText),\n                    subMenu: [],\n                    action: innerAction,\n                    filter: innerFilter,\n                },\n            });\n            return function registerSubMenuItem(t, a, f) {\n                if (parentMenuId) {\n                    throw new Error('Submenus are currently limited to a single level.');\n                }\n\n                return registerMenuItem(pluginId, generateId(), id, t, a, f);\n            };\n        }\n        const id = generateId();\n        return {id, rootRegisterMenuItem: registerMenuItem(this.id, id, null, text, action, filter)};\n    }\n\n    // Register a component at the bottom of the post dropdown menu.\n    // Accepts a React component. Returns a unique identifier.\n    registerPostDropdownMenuComponent(component) {\n        return dispatchPluginComponentAction('PostDropdownMenuItem', this.id, component);\n    }\n\n    // Register a file upload method by providing some text, an icon, and an action function.\n    // Accepts the following:\n    // - icon - JSX element to use as the button's icon\n    // - text - A string or JSX element to display in the file upload menu\n    // - action - A function to trigger when the menu item is selected.\n    // Returns a unique identifier.\n    registerFileUploadMethod(icon, action, text) {\n        const id = generateId();\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'FileUploadMethod',\n            data: {\n                id,\n                pluginId: this.id,\n                text,\n                action,\n                icon,\n            },\n        });\n\n        return id;\n    }\n\n    // Register a hook to intercept file uploads before they take place.\n    // Accepts a function to run before files get uploaded. Receives an array of\n    // files and a function to upload files at a later time as arguments. Must\n    // return an object that can contain two properties:\n    // - message - An error message to display, leave blank or null to display no message\n    // - files - Modified array of files to upload, set to null to reject all files\n    // Returns a unique identifier.\n    registerFilesWillUploadHook(hook) {\n        const id = generateId();\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'FilesWillUploadHook',\n            data: {\n                id,\n                pluginId: this.id,\n                hook,\n            },\n        });\n\n        return id;\n    }\n\n    // Unregister a component, action or hook using the unique identifier returned after registration.\n    // Accepts a string id.\n    // Returns undefined in all cases.\n    unregisterComponent(componentId) {\n        store.dispatch({\n            type: ActionTypes.REMOVED_PLUGIN_COMPONENT,\n            id: componentId,\n        });\n    }\n\n    // Unregister a component that provided a custom body for posts with a specific type.\n    // Accepts a string id.\n    // Returns undefined in all cases.\n    unregisterPostTypeComponent(componentId) {\n        store.dispatch({\n            type: ActionTypes.REMOVED_PLUGIN_POST_COMPONENT,\n            id: componentId,\n        });\n    }\n\n    // Register a reducer against the Redux store. It will be accessible in redux state\n    // under \"state['plugins-<yourpluginid>']\"\n    // Accepts a reducer. Returns undefined.\n    registerReducer(reducer) {\n        reducerRegistry.register('plugins-' + this.id, reducer);\n    }\n\n    // Register a handler for WebSocket events.\n    // Accepts the following:\n    // - event - the event type, can be a regular server event or an event from plugins.\n    // Plugin events will have \"custom_<pluginid>_\" prepended\n    // - handler - a function to handle the event, receives the event message as an argument\n    // Returns undefined.\n    registerWebSocketEventHandler(event, handler) {\n        registerPluginWebSocketEvent(this.id, event, handler);\n    }\n\n    // Unregister a handler for a custom WebSocket event.\n    // Accepts a string event type.\n    // Returns undefined.\n    unregisterWebSocketEventHandler(event) {\n        unregisterPluginWebSocketEvent(this.id, event);\n    }\n\n    // Register a handler that will be called when the app reconnects to the\n    // internet after previously disconnecting.\n    // Accepts a function to handle the event. Returns undefined.\n    registerReconnectHandler(handler) {\n        registerPluginReconnectHandler(this.id, handler);\n    }\n\n    // Unregister a previously registered reconnect handler.\n    // Returns undefined.\n    unregisterReconnectHandler() {\n        unregisterPluginReconnectHandler(this.id);\n    }\n\n    // Register a hook that will be called when a message is posted by the user before it\n    // is sent to the server. Accepts a function that receives the post as an argument.\n    //\n    // To reject a post, return an object containing an error such as\n    //     {error: {message: 'Rejected'}}\n    // To modify or allow the post without modifcation, return an object containing the post\n    // such as\n    //     {post: {...}}\n    //\n    // If the hook function is asynchronous, the message will not be sent to the server\n    // until the hook returns.\n    registerMessageWillBePostedHook(hook) {\n        const id = generateId();\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'MessageWillBePosted',\n            data: {\n                id,\n                pluginId: this.id,\n                hook,\n            },\n        });\n\n        return id;\n    }\n\n    // Register a hook that will be called when a slash command is posted by the user before it\n    // is sent to the server. Accepts a function that receives the message (string) and the args\n    // (object) as arguments.\n    // The args object is:\n    //        {\n    //            channel_id: channelId,\n    //            team_id: teamId,\n    //            root_id: rootId,\n    //        }\n    //\n    // To reject a command, return an object containing an error:\n    //     {error: {message: 'Rejected'}}\n    // To ignore a command, return an empty object (to prevent an error from being displayed):\n    //     {}\n    // To modify or allow the command without modification, return an object containing the new message\n    // and args. It is not likely that you will need to change the args, so return the object that was provided:\n    //     {message: {...}, args}\n    //\n    // If the hook function is asynchronous, the command will not be sent to the server\n    // until the hook returns.\n    registerSlashCommandWillBePostedHook(hook) {\n        const id = generateId();\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'SlashCommandWillBePosted',\n            data: {\n                id,\n                pluginId: this.id,\n                hook,\n            },\n        });\n\n        return id;\n    }\n\n    // Register a hook that will be called before a message is formatted into Markdown.\n    // Accepts a function that receives the unmodified post and the message (potentially\n    // already modified by other hooks) as arguments. This function must return a string\n    // message that will be formatted.\n    // Returns a unique identifier.\n    registerMessageWillFormatHook(hook) {\n        const id = generateId();\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'MessageWillFormat',\n            data: {\n                id,\n                pluginId: this.id,\n                hook,\n            },\n        });\n\n        return id;\n    }\n\n    // Register a component to override file previews. Accepts a function to run before file is\n    // previewed and a react component to be rendered as the file preview.\n    // - override - A function to check whether preview needs to be overridden. Receives fileInfo and post as arguments.\n    // Returns true is preview should be overridden and false otherwise.\n    // - component - A react component to display instead of original preview. Receives fileInfo and post as props.\n    // Returns a unique identifier.\n    // Only one plugin can override a file preview at a time. If two plugins try to override the same file preview, the first plugin will perform the override and the second will not. Plugin precedence is ordered alphabetically by plugin ID.\n    registerFilePreviewComponent(override, component) {\n        const id = generateId();\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'FilePreview',\n            data: {\n                id,\n                pluginId: this.id,\n                override,\n                component,\n            },\n        });\n\n        return id;\n    }\n\n    registerTranslations(getTranslationsForLocale) {\n        store.dispatch(registerPluginTranslationsSource(this.id, getTranslationsForLocale));\n    }\n\n    // Register a admin console definitions override function\n    // Note that this is a low-level interface primarily meant for internal use, and is not subject\n    // to semver guarantees. It may change in the future.\n    // Accepts the following:\n    // - func - A function that recieve the admin console config definitions and return a new\n    //          version of it, which is used for build the admin console.\n    // Each plugin can register at most one admin console plugin function, with newer registrations\n    // replacing older ones.\n    registerAdminConsolePlugin(func) {\n        store.dispatch(registerAdminConsolePlugin(this.id, func));\n    }\n\n    // Register a custom React component to manage the plugin configuration for the given setting key.\n    // Accepts the following:\n    // - key - A key specified in the settings_schema.settings block of the plugin's manifest.\n    // - component - A react component to render in place of the default handling.\n    // - options - Object for the following available options to display the setting:\n    //     showTitle - Optional boolean that if true the display_name of the setting will be rendered\n    // on the left column of the settings page and the registered component will be displayed on the\n    // available space in the right column.\n    registerAdminConsoleCustomSetting(key, component, {showTitle} = {}) {\n        store.dispatch(registerAdminConsoleCustomSetting(this.id, key, component, {showTitle}));\n    }\n\n    // Unregister a previously registered admin console definition override function.\n    // Returns undefined.\n    unregisterAdminConsolePlugin() {\n        store.dispatch(unregisterAdminConsolePlugin(this.id));\n    }\n\n    // Register a Right-Hand Sidebar component by providing a title for the right hand component.\n    // Accepts the following:\n    // - title - A string or JSX element to display as a title for the RHS.\n    // - component - A react component to display in the Right-Hand Sidebar.\n    // Returns:\n    // - id: a unique identifier\n    // - showRHSPlugin: the action to dispatch that will open the RHS.\n    // - hideRHSPlugin: the action to dispatch that will close the RHS\n    // - toggleRHSPlugin: the action to dispatch that will toggle the RHS\n    registerRightHandSidebarComponent(component, title) {\n        const id = generateId();\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'RightHandSidebarComponent',\n            data: {\n                id,\n                pluginId: this.id,\n                component,\n                title,\n            },\n        });\n\n        return {id, showRHSPlugin: showRHSPlugin(id), hideRHSPlugin: hideRHSPlugin(id), toggleRHSPlugin: toggleRHSPlugin(id)};\n    }\n\n    // Register a Needs Team component by providing a route past /:team/:pluginId/ to be displayed at.\n    // Accepts the following:\n    // - route - The route to be displayed at.\n    // - component - A react component to display.\n    // Returns:\n    // - id: a unique identifier\n    registerNeedsTeamRoute(route, component) {\n        const id = generateId();\n        let fixedRoute = standardizeRoute(route);\n        fixedRoute = this.id + '/' + fixedRoute;\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'NeedsTeamComponent',\n            data: {\n                id,\n                pluginId: this.id,\n                component,\n                route: fixedRoute,\n            },\n        });\n\n        return id;\n    }\n\n    // Register a component to be displayed at a custom route under /plug/:pluginId\n    // Accepts the following:\n    // - route - The route to be displayed at.\n    // - component - A react component to display.\n    // Returns:\n    // - id: a unique identifier\n    registerCustomRoute(route, component) {\n        const id = generateId();\n        let fixedRoute = standardizeRoute(route);\n        fixedRoute = this.id + '/' + fixedRoute;\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'CustomRouteComponent',\n            data: {\n                id,\n                pluginId: this.id,\n                component,\n                route: fixedRoute,\n            },\n        });\n\n        return id;\n    }\n\n    // INTERNAL: Subject to change without notice.\n    // DANGER: Interferes with historic routes.\n    // Register a global header menu item\n    // Accepts the following:\n    // - baseURL - The route to be displayed at starting from the siteURL\n    // - switcherIcon - A react element to display as the icon in the product switcher\n    // - switcherText - A string or React element to display in the product switcher\n    // - switcherLinkURL - A string specifying the URL the switcher item should point to.\n    // - mainComponent - The component to be displayed below the global header when your route is active.\n    // - headerComponent - A component to fill the generic area in the center of\n    //                     the global header when your route is active.\n    // All parameters are required.\n    // Returns a unique identifier.\n    registerProduct(baseURL, switcherIcon, switcherText, switcherLinkURL, mainComponent, headerCentreComponent = () => null, headerRightComponent = () => null) {\n        const id = generateId();\n\n        store.dispatch({\n            type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n            name: 'Product',\n            data: {\n                id,\n                pluginId: this.id,\n                switcherIcon: resolveReactElement(switcherIcon),\n                switcherText: resolveReactElement(switcherText),\n                baseURL: '/' + standardizeRoute(baseURL),\n                switcherLinkURL: '/' + standardizeRoute(switcherLinkURL),\n                mainComponent,\n                headerCentreComponent,\n                headerRightComponent,\n            },\n        });\n\n        return id;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionTypes} from 'utils/constants.jsx';\nimport {hideRHSPlugin as hideRHSPluginAction} from 'actions/views/rhs';\nimport {getPluggableId} from 'selectors/rhs';\n\nexport const removeWebappPlugin = (manifest) => {\n    return (dispatch) => {\n        dispatch(hideRHSPlugin(manifest.id));\n        dispatch({type: ActionTypes.REMOVED_WEBAPP_PLUGIN, data: manifest});\n    };\n};\n\n// hideRHSPlugin closes the RHS if currently showing this plugin.\nconst hideRHSPlugin = (manifestId) => {\n    return (dispatch, getState) => {\n        const state = getState();\n        const rhsPlugins = state.plugins.components.RightHandSidebarComponent || [];\n        const pluggableId = getPluggableId(state);\n        const pluginComponent = rhsPlugins.find((element) => element.id === pluggableId && element.pluginId === manifestId);\n\n        // Hide RHS if its showing this plugin\n        if (pluginComponent) {\n            dispatch(hideRHSPluginAction(pluggableId));\n        }\n    };\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport regeneratorRuntime from 'regenerator-runtime';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport store from 'stores/redux_store.jsx';\nimport {ActionTypes} from 'utils/constants.jsx';\nimport {getSiteURL} from 'utils/url';\nimport PluginRegistry from 'plugins/registry';\nimport {unregisterAllPluginWebSocketEvents, unregisterPluginReconnectHandler} from 'actions/websocket_actions.jsx';\nimport {unregisterPluginTranslationsSource} from 'actions/views/root';\nimport {unregisterAdminConsolePlugin} from 'actions/admin_actions';\n\nimport {removeWebappPlugin} from './actions';\n\n// Plugins may have been compiled with the regenerator runtime. Ensure this remains available\n// as a global export even though the webapp does not depend on same.\nwindow.regeneratorRuntime = regeneratorRuntime;\n\n// plugins records all active web app plugins by id.\nwindow.plugins = {};\n\n// registerPlugin, on the global window object, should be invoked by a plugin's web app bundle as\n// it is loaded.\n//\n// During the beta, plugins manipulated the global window.plugins data structure directly. This\n// remains possible, but is officially deprecated and may be removed in a future release.\nfunction registerPlugin(id, plugin) {\n    window.plugins[id] = plugin;\n}\nwindow.registerPlugin = registerPlugin;\n\n// initializePlugins queries the server for all enabled plugins and loads each in turn.\nexport async function initializePlugins() {\n    if (store.getState().entities.general.config.PluginsEnabled !== 'true') {\n        return;\n    }\n\n    const {data, error} = await getPlugins()(store.dispatch);\n    if (error) {\n        console.error(error); //eslint-disable-line no-console\n        return;\n    }\n\n    if (data == null || data.length === 0) {\n        return;\n    }\n\n    await Promise.all(data.map((m) => {\n        return loadPlugin(m).catch((loadErr) => {\n            console.error(loadErr.message); //eslint-disable-line no-console\n        });\n    }));\n}\n\n// getPlugins queries the server for all enabled plugins\nexport function getPlugins() {\n    return async (dispatch) => {\n        let plugins;\n        try {\n            plugins = await Client4.getWebappPlugins();\n        } catch (error) {\n            return {error};\n        }\n\n        dispatch({type: ActionTypes.RECEIVED_WEBAPP_PLUGINS, data: plugins});\n\n        return {data: plugins};\n    };\n}\n\n// loadedPlugins tracks which plugins have been added as script tags to the page\nconst loadedPlugins = {};\n\n// describePlugin takes a manifest and spits out a string suitable for console.log messages.\nconst describePlugin = (manifest) => (\n    'plugin ' + manifest.id + ', version ' + manifest.version\n);\n\n// loadPlugin fetches the web app bundle described by the given manifest, waits for the bundle to\n// load, and then ensures the plugin has been initialized.\nexport function loadPlugin(manifest) {\n    return new Promise((resolve, reject) => {\n        // Don't load it again if previously loaded\n        const oldManifest = loadedPlugins[manifest.id];\n        if (oldManifest && oldManifest.webapp.bundle_path === manifest.webapp.bundle_path) {\n            resolve();\n            return;\n        }\n\n        if (oldManifest) {\n            // upgrading, perform cleanup\n            store.dispatch(removeWebappPlugin(manifest));\n        }\n\n        function onLoad() {\n            initializePlugin(manifest);\n            console.log('Loaded ' + describePlugin(manifest)); //eslint-disable-line no-console\n            resolve();\n        }\n\n        function onError() {\n            reject(new Error('Unable to load bundle for ' + describePlugin(manifest)));\n        }\n\n        // Backwards compatibility for old plugins\n        let bundlePath = manifest.webapp.bundle_path;\n        if (bundlePath.includes('/static/') && !bundlePath.includes('/static/plugins/')) {\n            bundlePath = bundlePath.replace('/static/', '/static/plugins/');\n        }\n\n        console.log('Loading ' + describePlugin(manifest)); //eslint-disable-line no-console\n\n        const script = document.createElement('script');\n        script.id = 'plugin_' + manifest.id;\n        script.type = 'text/javascript';\n        script.src = getSiteURL() + bundlePath;\n        script.onload = onLoad;\n        script.onerror = onError;\n\n        document.getElementsByTagName('head')[0].appendChild(script);\n        loadedPlugins[manifest.id] = manifest;\n    });\n}\n\n// initializePlugin creates a registry specific to the plugin and invokes any initialize function\n// on the registered plugin class.\nfunction initializePlugin(manifest) {\n    // Initialize the plugin\n    const plugin = window.plugins[manifest.id];\n    const registry = new PluginRegistry(manifest.id);\n    if (plugin && plugin.initialize) {\n        plugin.initialize(registry, store);\n    }\n}\n\n// removePlugin triggers any uninitialize callback on the registered plugin, unregisters any\n// event handlers, and removes the plugin script from the DOM entirely. The plugin is responsible\n// for removing any of its registered components.\nexport function removePlugin(manifest) {\n    if (!loadedPlugins[manifest.id]) {\n        return;\n    }\n    console.log('Removing ' + describePlugin(manifest)); //eslint-disable-line no-console\n\n    delete loadedPlugins[manifest.id];\n\n    store.dispatch(removeWebappPlugin(manifest));\n\n    const plugin = window.plugins[manifest.id];\n    if (plugin && plugin.uninitialize) {\n        plugin.uninitialize();\n\n    // Support the deprecated deinitialize callback from the plugins beta.\n    } else if (plugin && plugin.deinitialize) {\n        plugin.deinitialize();\n    }\n    unregisterAllPluginWebSocketEvents(manifest.id);\n    unregisterPluginReconnectHandler(manifest.id);\n    store.dispatch(unregisterAdminConsolePlugin(manifest.id));\n    unregisterPluginTranslationsSource(manifest.id);\n    const script = document.getElementById('plugin_' + manifest.id);\n    if (!script) {\n        return;\n    }\n    script.parentNode.removeChild(script);\n    console.log('Removed ' + describePlugin(manifest)); //eslint-disable-line no-console\n}\n\n// loadPluginsIfNecessary synchronizes the current state of loaded plugins with that of the server,\n// loading any newly added plugins and unloading any removed ones.\nexport async function loadPluginsIfNecessary() {\n    if (store.getState().entities.general.config.PluginsEnabled !== 'true') {\n        return;\n    }\n\n    const oldManifests = store.getState().plugins.plugins;\n\n    const {error} = await getPlugins()(store.dispatch);\n    if (error) {\n        console.error(error); //eslint-disable-line no-console\n        return;\n    }\n\n    const newManifests = store.getState().plugins.plugins;\n\n    // Get new plugins and update existing plugins if version changed\n    Object.values(newManifests).forEach((newManifest) => {\n        const oldManifest = oldManifests[newManifest.id];\n        if (!oldManifest || oldManifest.version !== newManifest.version) {\n            loadPlugin(newManifest).catch((loadErr) => {\n                console.error(loadErr.message); //eslint-disable-line no-console\n            });\n        }\n    });\n\n    // Remove old plugins\n    Object.keys(oldManifests).forEach((id) => {\n        if (!newManifests.hasOwnProperty(id)) {\n            const oldManifest = oldManifests[id];\n            removePlugin(oldManifest);\n        }\n    });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nexport default class Pluggable extends React.PureComponent {\n    static propTypes = {\n\n        /*\n         * Should be a single overridable React component. One of this or pluggableName is required\n         */\n        children: PropTypes.element,\n\n        /*\n         * Override the component to be plugged. One of this or children is required\n         */\n        pluggableName: PropTypes.string,\n\n        /*\n         * Components for overriding provided by plugins\n         */\n        components: PropTypes.object.isRequired,\n\n        /*\n         * Logged in user's theme\n         */\n        theme: PropTypes.object.isRequired,\n\n        /*\n         * Id of the specific component to be plugged.\n         */\n        pluggableId: PropTypes.string,\n\n        /*\n         * Name of the sub component to use. Defaults to 'component' if unspecified.\n         */\n        subComponentName: PropTypes.string,\n    }\n\n    render() {\n        const pluggableName = this.props.pluggableName;\n\n        let child;\n        if (this.props.children) {\n            child = React.Children.only(this.props.children).type;\n        } else if (!pluggableName) {\n            return null;\n        }\n\n        const components = this.props.components;\n        const childrenProps = child ? this.props.children.props : {};\n        const componentName = pluggableName || child.getComponentName();\n\n        // Include any props passed to this component or to the child component\n        let props = {...this.props};\n        Reflect.deleteProperty(props, 'children');\n        Reflect.deleteProperty(props, 'components');\n        Reflect.deleteProperty(props, 'pluggableName');\n        props = {...props, ...childrenProps};\n\n        // Override the default component with any registered plugin's component\n        // Select a specific component by pluginId if available\n        if (components.hasOwnProperty(componentName)) {\n            let pluginComponents = components[componentName];\n\n            if (this.props.pluggableId) {\n                pluginComponents = pluginComponents.filter(\n                    (element) => element.id === this.props.pluggableId);\n            }\n\n            const content = pluginComponents.map((p) => {\n                let PluginComponent = p.component;\n                if (this.props.subComponentName) {\n                    PluginComponent = p[this.props.subComponentName];\n                }\n                return (\n                    <PluginComponent\n                        {...props}\n                        theme={this.props.theme}\n                        key={componentName + p.id}\n                    />\n                );\n            });\n\n            return (\n                <React.Fragment>\n                    {content}\n                </React.Fragment>\n            );\n        }\n\n        if (child == null) {\n            return null;\n        }\n\n        return React.cloneElement(this.props.children, {...props});\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\n\nimport Pluggable from './pluggable.jsx';\n\nfunction mapStateToProps(state) {\n    return {\n        components: state.plugins.components,\n        theme: getTheme(state),\n    };\n}\n\nexport default connect(mapStateToProps)(Pluggable);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {GlobalState} from 'types/store';\n\nexport enum InquiryType {\n    Technical = 'technical',\n    Sales = 'sales',\n    Billing = 'billing'\n}\n\nexport enum InquiryIssue{\n    CancelAccount = 'cancel_account',\n    TrialQuestions = 'trial_questions'\n}\n\nexport function getCloudContactUsLink(state: GlobalState, inquiry: InquiryType, inquiryIssue?: InquiryIssue): string {\n    // cloud/contact-us with query params for name, email and inquiry\n    const cwsUrl = getConfig(state).CWSURL;\n    const user = getCurrentUser(state);\n    const fullName = `${user.first_name} ${user.last_name}`;\n    const inquiryIssueQuery = inquiryIssue ? `&inquiry-issue=${inquiryIssue}` : '';\n\n    return `${cwsUrl}/cloud/contact-us?email=${encodeURIComponent(user.email)}&name=${encodeURIComponent(fullName)}&inquiry=${inquiry}${inquiryIssueQuery}`;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {GlobalState} from 'types/store';\nimport {getFeatureFlagValue} from 'mattermost-redux/selectors/entities/general';\n\nexport function getGlobalHeaderEnabled(state: GlobalState): boolean {\n    const featureFlagEnabled = getFeatureFlagValue(state, 'GlobalHeader') === 'true';\n\n    return featureFlagEnabled;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getCurrentTeamId, getTeamByName} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport localStorageStore from 'stores/local_storage_store';\n\n// getLastViewedChannelName combines data from the Redux store and localStorage to return the\n// previously selected channel name, returning the default channel if none exists.\n//\n// See LocalStorageStore for context.\nexport const getLastViewedChannelName = (state) => {\n    const userId = getCurrentUserId(state);\n    const teamId = getCurrentTeamId(state);\n\n    return localStorageStore.getPreviousChannelName(userId, teamId);\n};\n\nexport const getPenultimateViewedChannelName = (state) => {\n    const userId = getCurrentUserId(state);\n    const teamId = getCurrentTeamId(state);\n\n    return localStorageStore.getPenultimateChannelName(userId, teamId);\n};\n\n// getLastViewedChannelNameByTeamName combines data from the Redux store and localStorage to return\n// the url to the previously selected channel, returning the path to the default channel if none\n// exists.\n//\n// See LocalStorageStore for context.\nexport const getLastViewedChannelNameByTeamName = (state, teamName) => {\n    const userId = getCurrentUserId(state);\n    const team = getTeamByName(state, teamName);\n    const teamId = team && team.id;\n\n    return localStorageStore.getPreviousChannelName(userId, teamId);\n};\n\nexport const getPreviousTeamId = (state) => {\n    const userId = getCurrentUserId(state);\n\n    return localStorageStore.getPreviousTeamId(userId);\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createSelector} from 'reselect';\n\nimport {GlobalState} from 'types/store';\nimport {FileDropdownPluginComponent} from '../types/store/plugins';\n\nexport const getFilesDropdownPluginMenuItems = createSelector(\n    'getFilesDropdownPluginMenuItems',\n    (state: GlobalState) => state.plugins.components.FilesDropdown,\n    (components) => {\n        return (components || []) as unknown as FileDropdownPluginComponent[];\n    },\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport function getNavigationBlocked(state) {\n    return state.views.admin.navigationBlock.blocked;\n}\n\nexport function showNavigationPrompt(state) {\n    return state.views.admin.navigationBlock.showNavigationPrompt;\n}\n\nexport function getOnNavigationConfirmed(state) {\n    return state.views.admin.navigationBlock.onNavigationConfirmed;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport function getAnnouncementBarCount(state) {\n    return state.views.announcementBar.announcementBarState.announcementBarCount;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport const getLastPostsApiTimeForChannel = (state, channelId) => state.views.channel.lastGetPosts[channelId];\nexport const getToastStatus = (state) => state.views.channel.toastStatus;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport function isModalOpen(state, modalId) {\n    return Boolean(state.views.modals.modalState[modalId] && state.views.modals.modalState[modalId].open);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport function connectionErrorCount(state) {\n    return state.views.system.websocketConnectionErrorCount;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport function showPreviewOnCreateComment(state) {\n    return state.views.textbox.shouldShowPreviewOnCreateComment;\n}\n\nexport function showPreviewOnCreatePost(state) {\n    return state.views.textbox.shouldShowPreviewOnCreatePost;\n}\n\nexport function showPreviewOnEditChannelHeaderModal(state) {\n    return state.views.textbox.shouldShowPreviewOnEditChannelHeaderModal;\n}\n\nexport function showPreviewOnEditPostModal(state) {\n    return state.views.textbox.shouldShowPreviewOnEditPostModal;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport const getSocketStatus = (state) => state.websocket;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {browserHistory} from 'utils/browser_history';\nimport * as Selectors from 'selectors/storage';\nimport * as Actions from 'actions/storage';\nimport store from 'stores/redux_store.jsx';\nimport {ErrorPageTypes, StoragePrefixes, LandingPreferenceTypes} from 'utils/constants';\nimport * as Utils from 'utils/utils.jsx';\n\nconst dispatch = store.dispatch;\nconst getState = store.getState;\n\nclass BrowserStoreClass {\n    private hasCheckedLocalStorage?: boolean;\n    private localStorageSupported?: boolean;\n\n    setItem(name: string, value: string) {\n        dispatch(Actions.setItem(name, value));\n    }\n\n    getItem(name: string, defaultValue: string) {\n        return Selectors.makeGetItem(name, defaultValue)(getState());\n    }\n\n    removeItem(name: string) {\n        dispatch(Actions.removeItem(name));\n    }\n\n    setGlobalItem(name: string, value: string) {\n        dispatch(Actions.setGlobalItem(name, value));\n    }\n\n    getGlobalItem(name: string, defaultValue: string | null = null) {\n        return Selectors.makeGetGlobalItem(name, defaultValue)(getState());\n    }\n\n    removeGlobalItem(name: string) {\n        dispatch(Actions.removeGlobalItem(name));\n    }\n\n    signalLogout() {\n        if (this.isLocalStorageSupported()) {\n            // PLT-1285 store an identifier in session storage so we can catch if the logout came from this tab on IE11\n            const logoutId = Utils.generateId();\n\n            Utils.removePrefixFromLocalStorage(StoragePrefixes.ANNOUNCEMENT);\n\n            sessionStorage.setItem(StoragePrefixes.LOGOUT, logoutId);\n            localStorage.setItem(StoragePrefixes.LOGOUT, logoutId);\n            localStorage.removeItem(StoragePrefixes.LOGOUT);\n        }\n    }\n\n    isSignallingLogout(logoutId: string) {\n        return logoutId === sessionStorage.getItem(StoragePrefixes.LOGOUT);\n    }\n\n    signalLogin() {\n        if (this.isLocalStorageSupported()) {\n            // PLT-1285 store an identifier in session storage so we can catch if the logout came from this tab on IE11\n            const loginId = Utils.generateId();\n\n            sessionStorage.setItem(StoragePrefixes.LOGIN, loginId);\n            localStorage.setItem(StoragePrefixes.LOGIN, loginId);\n            localStorage.removeItem(StoragePrefixes.LOGIN);\n        }\n    }\n\n    isSignallingLogin(loginId: string) {\n        return loginId === sessionStorage.getItem(StoragePrefixes.LOGIN);\n    }\n\n    clear(options?: {exclude: any}) { // TODO add more specific types\n        dispatch(Actions.clear(options));\n    }\n\n    isLocalStorageSupported() {\n        if (this.hasCheckedLocalStorage) {\n            return this.localStorageSupported;\n        }\n\n        this.localStorageSupported = false;\n\n        try {\n            localStorage.setItem('__testLocal__', '1');\n            if (localStorage.getItem('__testLocal__') === '1') {\n                this.localStorageSupported = true;\n            }\n            localStorage.removeItem('__testLocal__');\n        } catch (e) {\n            this.localStorageSupported = false;\n        }\n\n        try {\n            sessionStorage.setItem('__testSession__', '1');\n            sessionStorage.removeItem('__testSession__');\n        } catch (e) {\n            // Session storage not usable, website is unusable\n            browserHistory.push('/error?type=' + ErrorPageTypes.LOCAL_STORAGE);\n        }\n\n        this.hasCheckedLocalStorage = true;\n\n        return this.localStorageSupported;\n    }\n\n    hasSeenLandingPage() {\n        return localStorage.getItem(StoragePrefixes.LANDING_PAGE_SEEN);\n    }\n\n    setLandingPageSeen(landingPageSeen: boolean) {\n        localStorage.setItem(StoragePrefixes.LANDING_PAGE_SEEN, String(landingPageSeen));\n    }\n\n    getLandingPreference(siteUrl?: string) {\n        return localStorage.getItem(StoragePrefixes.LANDING_PREFERENCE + String(siteUrl));\n    }\n\n    setLandingPreferenceToMattermostApp(siteUrl?: string) {\n        localStorage.setItem(StoragePrefixes.LANDING_PREFERENCE + String(siteUrl), LandingPreferenceTypes.MATTERMOSTAPP);\n    }\n\n    setLandingPreferenceToBrowser(siteUrl?: string) {\n        localStorage.setItem(StoragePrefixes.LANDING_PREFERENCE + String(siteUrl), LandingPreferenceTypes.BROWSER);\n    }\n\n    clearLandingPreference(siteUrl?: string) {\n        localStorage.removeItem(StoragePrefixes.LANDING_PREFERENCE + String(siteUrl));\n    }\n}\n\nconst BrowserStore = new BrowserStoreClass();\nexport default BrowserStore;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {ActionResult} from 'mattermost-redux/types/actions';\nimport {Dictionary} from 'mattermost-redux/types/utilities';\n\nexport type SuccessResult = {data: any}\n\nexport type ErrorResult = {error: any}\n\nexport function isSuccess(result: ActionResult): result is SuccessResult {\n    return 'data' in result && !isError(result);\n}\n\nexport function isError(result: ActionResult): result is ErrorResult {\n    return Boolean((result as ErrorResult).error);\n}\n\nexport type ModalData = {\n    modalId: string;\n    dialogProps: Dictionary<any>;\n    dialogType: React.Component;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {StripeCardElement} from '@stripe/stripe-js';\n\nexport type StripeSetupIntent = {\n    id: string;\n    client_secret: string;\n};\n\nexport type BillingDetails = {\n    address: string;\n    address2: string;\n    city: string;\n    state: string;\n    country: string;\n    postalCode: string;\n    name: string;\n    card: StripeCardElement;\n    agreedTerms?: boolean;\n};\n\nexport const areBillingDetailsValid = (\n    billingDetails: BillingDetails | null | undefined,\n): boolean => {\n    if (billingDetails == null) {\n        return false;\n    }\n\n    return Boolean(\n        billingDetails.address &&\n      billingDetails.city &&\n      billingDetails.state &&\n      billingDetails.country &&\n      billingDetails.postalCode &&\n      billingDetails.name,\n    );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {AppCallResponseTypes} from 'mattermost-redux/constants/apps';\nimport {AppCall, AppCallRequest, AppCallValues, AppContext, AppExpand, AppSelectOption} from 'mattermost-redux/types/apps';\n\nexport const appsPluginID = 'com.mattermost.apps';\n\nexport function createCallContext(\n    appID: string,\n    location?: string,\n    channelID?: string,\n    teamID?: string,\n    postID?: string,\n    rootID?: string,\n): AppContext {\n    return {\n        app_id: appID,\n        location,\n        channel_id: channelID,\n        team_id: teamID,\n        post_id: postID,\n        root_id: rootID,\n    };\n}\n\nexport function createCallRequest(\n    call: AppCall,\n    context: AppContext,\n    defaultExpand: AppExpand = {},\n    values?: AppCallValues,\n    rawCommand?: string,\n    query?: string,\n    selectedField?: string,\n): AppCallRequest {\n    return {\n        ...call,\n        context,\n        values,\n        expand: {\n            ...defaultExpand,\n            ...call.expand,\n        },\n        raw_command: rawCommand,\n        query,\n        selected_field: selectedField,\n    };\n}\n\nexport const makeCallErrorResponse = (errMessage: string) => {\n    return {\n        type: AppCallResponseTypes.ERROR,\n        error: errMessage,\n    };\n};\n\nexport const filterEmptyOptions = (option: AppSelectOption) => option.value && !option.value.match(/^[ \\t]+$/);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {CloudCustomer} from 'mattermost-redux/types/cloud';\n\nexport function isCustomerCardExpired(customer?: CloudCustomer): boolean {\n    if (!customer) {\n        return false;\n    }\n\n    const expiryYear = customer.payment_method.exp_year;\n\n    // If not expiry year, or its 0, it's not expired (because it probably isn't set)\n    if (!expiryYear) {\n        return false;\n    }\n\n    // This works because we store the expiry month as the actual 1-12 base month, but Date uses a 0-11 base month\n    // But credit cards expire at the end of their expiry month, so we can just use that number.\n    const lastExpiryDate = new Date(expiryYear, customer.payment_method.exp_month, 1);\n    return lastExpiryDate <= new Date();\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getData} from 'country-list';\n\ntype Country = {\n    name: string;\n    code: string;\n}\n\nexport const COUNTRIES = getData().sort((a: Country, b: Country) => (a.name > b.name ? 1 : -1));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport moment from 'moment-timezone';\nimport {Unit} from '@formatjs/intl-relativetimeformat';\n\nconst shouldTruncate = new Map<Unit, boolean>([\n    ['year', true],\n    ['quarter', true],\n    ['month', true],\n    ['week', true],\n    ['day', true],\n    ['hour', false],\n    ['minute', false],\n    ['second', true],\n]);\n\nexport function isWithin(\n    a: Date,\n    b: Date,\n    timeZone: string = new Intl.DateTimeFormat().resolvedOptions().timeZone,\n    unit: Unit,\n    threshold = 1,\n    truncateEndpoints = shouldTruncate.get(unit) || false,\n): boolean {\n    const diff = getDiff(a, b, timeZone, unit, truncateEndpoints);\n    return threshold >= 0 ?\n        diff <= threshold && diff >= 0 :\n        diff >= threshold && diff <= 0;\n}\n\nexport function isEqual(\n    a: Date,\n    b: Date,\n    timeZone: string = new Intl.DateTimeFormat().resolvedOptions().timeZone,\n    unit: Unit,\n    threshold = 1,\n    truncateEndpoints = shouldTruncate.get(unit) || false,\n): boolean {\n    return threshold === getDiff(a, b, timeZone, unit, truncateEndpoints);\n}\n\nexport function getDiff(\n    a: Date,\n    b: Date,\n    timeZone: string = new Intl.DateTimeFormat().resolvedOptions().timeZone,\n    unit: Unit,\n    truncateEndpoints = shouldTruncate.get(unit) || false,\n): number {\n    const momentA = moment.utc(a.getTime());\n    const momentB = moment.utc(b.getTime());\n\n    if (timeZone) {\n        momentA.tz(timeZone);\n        momentB.tz(timeZone);\n    }\n\n    return truncateEndpoints ?\n        momentA.startOf(unit).diff(momentB.startOf(unit), unit) :\n        momentA.diff(b, unit, true);\n}\n\nexport function isSameDay(a: Date, b: Date = new Date()) {\n    return a.getDate() === b.getDate() && isSameMonth(a, b);\n}\n\nexport function isSameMonth(a: Date, b: Date = new Date()) {\n    return a.getMonth() === b.getMonth() && isSameYear(a, b);\n}\n\nexport function isSameYear(a: Date, b: Date = new Date()) {\n    return a.getFullYear() === b.getFullYear();\n}\n\nexport function isToday(date: Date) {\n    return isSameDay(date);\n}\n\nexport function isYesterday(date: Date) {\n    const yesterday = new Date();\n    yesterday.setDate(yesterday.getDate() - 1);\n\n    return isSameDay(date, yesterday);\n}\n\nexport function toUTCUnix(date: Date): number {\n    return Math.round(new Date(date.toISOString()).getTime() / 1000);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport default class DelayedAction {\n    private action: () => void;\n    private timer: number;\n\n    public constructor(action: () => void) {\n        this.action = action;\n\n        this.timer = -1;\n\n        // bind fire since it doesn't get passed the correct this value with setTimeout\n        this.fire = this.fire.bind(this);\n    }\n\n    public fire() {\n        this.action();\n\n        this.timer = -1;\n    }\n\n    public fireAfter(timeout: number) {\n        if (this.timer >= 0) {\n            window.clearTimeout(this.timer);\n        }\n\n        this.timer = window.setTimeout(this.fire, timeout);\n    }\n\n    public cancel() {\n        window.clearTimeout(this.timer);\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport emojiRegex from 'emoji-regex';\nimport React from 'react';\n\nimport {Emoji} from 'mattermost-redux/types/emojis';\n\nconst defaultRule = (aName: string, bName: string, emojiA: Emoji, emojiB: Emoji) => {\n    if (emojiA.category === 'custom' && emojiB.category !== 'custom') {\n        return 1;\n    } else if (emojiB.category === 'custom' && emojiA.category !== 'custom') {\n        return -1;\n    }\n\n    return aName.localeCompare(bName);\n};\n\nconst thumbsDownRule = (otherName: string) => {\n    if (otherName === 'thumbsup' || otherName === '+1') {\n        return 1;\n    }\n    return 0;\n};\n\nconst thumbsUpRule = (otherName: string) => {\n    if (otherName === 'thumbsdown' || otherName === '-1') {\n        return -1;\n    }\n    return 0;\n};\n\nconst customRules: Record<string, (emojiName: string) => number> = {\n    thumbsdown: thumbsDownRule,\n    '-1': thumbsDownRule,\n    thumbsup: thumbsUpRule,\n    '+1': thumbsUpRule,\n};\n\nconst getEmojiName = (emoji: Emoji, searchedName: string) => {\n    // There's an edge case for custom emojis that start with a thumb prefix.\n    // It doesn't match the first alias for the relevant system emoji.\n    // We don't have control over the names or aliases of custom emojis...\n    // ... and how they compare to the relevant system ones.\n    // So we need to search for a matching alias in the whole array.\n    // E.g. thumbsup-custom vs [+1, thumbsup]\n    if (!emoji) {\n        return '';\n    }\n\n    // does it have aliases?\n    if (searchedName && 'short_names' in emoji) {\n        return emoji.short_names.find((alias: string) => alias.startsWith(searchedName)) || emoji.short_name;\n    }\n\n    return 'short_name' in emoji ? emoji.short_name : emoji.name;\n};\n\nexport function compareEmojis(emojiA: Emoji, emojiB: Emoji, searchedName: string) {\n    const aName = getEmojiName(emojiA, searchedName);\n    const bName = getEmojiName(emojiB, searchedName);\n\n    // Have the emojis that starts with the search appear first\n    const aPrefix = aName.startsWith(searchedName);\n    const bPrefix = bName.startsWith(searchedName);\n\n    if (aPrefix === bPrefix) {\n        if (aName in customRules) {\n            return customRules[aName](bName) || defaultRule(aName, bName, emojiA, emojiB);\n        }\n\n        return defaultRule(aName, bName, emojiA, emojiB);\n    } else if (aPrefix) {\n        return -1;\n    }\n\n    return 1;\n}\n\n// wrapEmojis takes a text string and returns it with any Unicode emojis wrapped by a span with the emoji class.\nexport function wrapEmojis(text: string): React.ReactNode {\n    const nodes = [];\n\n    let lastIndex = 0;\n\n    // Manually split the string into an array of strings and spans wrapping individual emojis\n    for (const match of text.matchAll(emojiRegex())) {\n        const emoji = match[0];\n        const index = match.index!;\n\n        if (match.index !== lastIndex) {\n            nodes.push(text.substring(lastIndex, index));\n        }\n\n        nodes.push(\n            <span\n                key={index}\n                className='emoji'\n            >\n                {emoji}\n            </span>,\n        );\n\n        // Remember that emojis can be multiple code points long when incrementing the index\n        lastIndex = index + emoji.length;\n    }\n\n    if (lastIndex < text.length) {\n        nodes.push(text.substring(lastIndex));\n    }\n\n    // Only return an array if we're returning multiple nodes\n    return nodes.length === 1 ? nodes[0] : nodes;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport exif2css from 'exif2css';\n\nimport Constants from 'utils/constants';\nimport * as UserAgent from 'utils/user_agent';\n\nexport function canUploadFiles(config) {\n    const enableFileAttachments = config.EnableFileAttachments === 'true';\n    const enableMobileFileUpload = config.EnableMobileFileUpload === 'true';\n\n    if (!enableFileAttachments) {\n        return false;\n    }\n\n    if (UserAgent.isMobileApp()) {\n        return enableMobileFileUpload;\n    }\n\n    return true;\n}\n\nexport function canDownloadFiles(config) {\n    if (UserAgent.isMobileApp()) {\n        return config.EnableMobileFileDownload === 'true';\n    }\n\n    return true;\n}\n\nexport function trimFilename(filename) {\n    let trimmedFilename = filename;\n    if (filename.length > Constants.MAX_FILENAME_LENGTH) {\n        trimmedFilename = filename.substring(0, Math.min(Constants.MAX_FILENAME_LENGTH, filename.length)) + '...';\n    }\n\n    return trimmedFilename;\n}\n\nexport function getFileTypeFromMime(mimetype) {\n    const mimeTypeSplitBySlash = mimetype.split('/');\n    const mimeTypePrefix = mimeTypeSplitBySlash[0];\n    const mimeTypeSuffix = mimeTypeSplitBySlash[1];\n\n    if (mimeTypePrefix === 'video') {\n        return 'video';\n    } else if (mimeTypePrefix === 'audio') {\n        return 'audio';\n    } else if (mimeTypePrefix === 'image') {\n        return 'image';\n    }\n\n    if (mimeTypeSuffix) {\n        if (mimeTypeSuffix === 'pdf') {\n            return 'pdf';\n        } else if (mimeTypeSuffix.includes('vnd.ms-excel') || mimeTypeSuffix.includes('spreadsheetml') || mimeTypeSuffix.includes('vnd.sun.xml.calc') || mimeTypeSuffix.includes('opendocument.spreadsheet')) {\n            return 'spreadsheet';\n        } else if (mimeTypeSuffix.includes('vnd.ms-powerpoint') || mimeTypeSuffix.includes('presentationml') || mimeTypeSuffix.includes('vnd.sun.xml.impress') || mimeTypeSuffix.includes('opendocument.presentation')) {\n            return 'presentation';\n        } else if ((mimeTypeSuffix === 'msword') || mimeTypeSuffix.includes('vnd.ms-word') || mimeTypeSuffix.includes('officedocument.wordprocessingml') || mimeTypeSuffix.includes('application/x-mswrite')) {\n            return 'word';\n        }\n    }\n\n    return 'other';\n}\n\n// based on https://stackoverflow.com/questions/7584794/accessing-jpeg-exif-rotation-data-in-javascript-on-the-client-side/32490603#32490603\nexport function getExifOrientation(data) {\n    var view = new DataView(data);\n\n    if (view.getUint16(0, false) !== 0xFFD8) {\n        return -2;\n    }\n\n    var length = view.byteLength;\n    var offset = 2;\n\n    while (offset < length) {\n        var marker = view.getUint16(offset, false);\n        offset += 2;\n\n        if (marker === 0xFFE1) {\n            if (view.getUint32(offset += 2, false) !== 0x45786966) {\n                return -1;\n            }\n\n            var little = view.getUint16(offset += 6, false) === 0x4949;\n            offset += view.getUint32(offset + 4, little);\n            var tags = view.getUint16(offset, little);\n            offset += 2;\n\n            for (var i = 0; i < tags; i++) {\n                if (view.getUint16(offset + (i * 12), little) === 0x0112) {\n                    return view.getUint16(offset + (i * 12) + 8, little);\n                }\n            }\n        } else if ((marker & 0xFF00) === 0xFF00) {\n            offset += view.getUint16(offset, false);\n        } else {\n            break;\n        }\n    }\n    return -1;\n}\n\nexport function getOrientationStyles(orientation) {\n    const {\n        transform,\n        'transform-origin': transformOrigin,\n    } = exif2css(orientation);\n    return {transform, transformOrigin};\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport moment from 'moment';\n\nconst LICENSE_EXPIRY_NOTIFICATION = 1000 * 60 * 60 * 24 * 60; // 60 days\nconst LICENSE_GRACE_PERIOD = 1000 * 60 * 60 * 24 * 10; // 10 days\n\nexport function isLicenseExpiring(license) {\n    if (license.IsLicensed !== 'true') {\n        return false;\n    }\n\n    if (license.IsTrial === 'true') {\n        return true;\n    }\n\n    const timeDiff = parseInt(license.ExpiresAt, 10) - Date.now();\n    return timeDiff <= LICENSE_EXPIRY_NOTIFICATION;\n}\n\nexport function daysToLicenseExpire(license) {\n    if (license.IsLicensed !== 'true') {\n        return undefined;\n    }\n\n    const endDate = new Date(parseInt(license?.ExpiresAt, 10));\n    return moment(endDate).startOf('day').diff(moment().startOf('day'), 'days');\n}\n\nexport function isLicenseExpired(license) {\n    if (license.IsLicensed !== 'true') {\n        return false;\n    }\n\n    const endDate = new Date(parseInt(license?.ExpiresAt, 10));\n    const timeDiff = moment(endDate).startOf('day').diff(moment().startOf('day'), 'days');\n    return timeDiff < 0;\n}\n\nexport function isLicensePastGracePeriod(license) {\n    if (license.IsLicensed !== 'true') {\n        return false;\n    }\n\n    const timeDiff = Date.now() - parseInt(license.ExpiresAt, 10);\n    return timeDiff > LICENSE_GRACE_PERIOD;\n}\n\nexport function isTrialLicense(license) {\n    if (license.IsLicensed !== 'true') {\n        return false;\n    }\n\n    if (license.IsTrial === 'true') {\n        return true;\n    }\n\n    // Currently all trial licenses are issued with a 30 day, 8 hours duration.\n    // We're using this logic to detect a trial license until we add the right field in the license itself.\n    const timeDiff = parseInt(license.ExpiresAt, 10) - parseInt(license.StartsAt, 10);\n\n    // 30 days + 8 hours\n    const trialLicenseDuration = (1000 * 60 * 60 * 24 * 30) + (1000 * 60 * 60 * 8);\n\n    return timeDiff === trialLicenseDuration;\n}\n\nexport function isCloudLicense(license) {\n    return license?.Cloud === 'true';\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {KatexOptions, renderToString} from 'katex';\n\ntype Props = {\n    content: string;\n    enableLatex: boolean;\n};\n\nexport default class LatexBlock extends React.PureComponent<Props> {\n    render(): React.ReactNode {\n        if (!this.props.enableLatex) {\n            return (\n                <div\n                    className='post-body--code tex'\n                >\n                    {this.props.content}\n                </div>\n            );\n        }\n\n        try {\n            const katexOptions: KatexOptions = {\n                throwOnError: false,\n                displayMode: true,\n                maxSize: 200,\n                maxExpand: 100,\n                fleqn: true,\n            };\n\n            const html = renderToString(this.props.content, katexOptions);\n\n            return (\n                <div\n                    className='post-body--code tex'\n                    dangerouslySetInnerHTML={{__html: html}}\n                />\n            );\n        } catch (e) {\n            return (\n                <div\n                    className='post-body--code tex'\n                >\n                    <FormattedMessage\n                        id='katex.error'\n                        defaultMessage=\"Couldn't compile your Latex code. Please review the syntax and try again.\"\n                    />\n                </div>\n            );\n        }\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport LatexBlock from './latex_block';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n    return {\n        enableLatex: config.EnableLatex === 'true',\n    };\n}\n\nexport default connect(mapStateToProps)(LatexBlock);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {RefObject, CSSProperties} from 'react';\nimport Popper from 'popper.js';\nimport ReactDOM from 'react-dom';\nimport classNames from 'classnames';\n\nimport {Constants} from 'utils/constants';\nimport Pluggable from 'plugins/pluggable';\n\nimport './link_tooltip.scss';\n\nconst tooltipContainerStyles: CSSProperties = {\n    display: 'flex',\n    flexDirection: 'column',\n    alignItems: 'center',\n    zIndex: 1070,\n    position: 'absolute',\n    top: -1000,\n    left: -1000,\n};\n\ntype Props = {\n    href: string;\n    attributes: {[attribute: string]: string};\n}\n\ntype State = {\n    show: boolean;\n}\n\nexport default class LinkTooltip extends React.PureComponent<Props, State> {\n    private tooltipContainerRef: RefObject<HTMLDivElement>;\n    private hideTimeout: number;\n    private showTimeout: number;\n    private popper?: Popper;\n\n    public constructor(props: Props) {\n        super(props);\n\n        this.tooltipContainerRef = React.createRef();\n        this.showTimeout = -1;\n        this.hideTimeout = -1;\n\n        this.state = {\n            show: false,\n        };\n    }\n\n    public showTooltip = (e: React.MouseEvent<HTMLSpanElement>): void => {\n        //clear the hideTimeout in the case when the cursor is moved from a tooltipContainer child to the link\n        window.clearTimeout(this.hideTimeout);\n\n        if (!this.state.show) {\n            const target = e.currentTarget;\n            const tooltipContainer = this.tooltipContainerRef.current;\n\n            //clear the old this.showTimeout if there is any before overriding\n            window.clearTimeout(this.showTimeout);\n\n            this.showTimeout = window.setTimeout(() => {\n                this.setState({show: true});\n\n                if (!tooltipContainer) {\n                    return;\n                }\n\n                const addChildEventListeners = (node: Node) => {\n                    node.addEventListener('mouseover', () => clearTimeout(this.hideTimeout));\n                    (node as HTMLElement).addEventListener('mouseleave', (event) => {\n                        if (event.relatedTarget !== null) {\n                            this.hideTooltip();\n                        }\n                    });\n                };\n                tooltipContainer.childNodes.forEach(addChildEventListeners);\n\n                this.popper = new Popper(target, tooltipContainer, {\n                    placement: 'bottom',\n                    modifiers: {\n                        preventOverflow: {enabled: false},\n                        hide: {enabled: false},\n                    },\n                });\n            }, Constants.OVERLAY_TIME_DELAY);\n        }\n    };\n\n    public hideTooltip = (): void => {\n        //clear the old this.hideTimeout if there is any before overriding\n        window.clearTimeout(this.hideTimeout);\n\n        this.hideTimeout = window.setTimeout(() => {\n            this.setState({show: false});\n\n            //prevent executing the showTimeout after the hideTooltip\n            clearTimeout(this.showTimeout);\n        }, Constants.OVERLAY_TIME_DELAY_SMALL);\n    };\n\n    public render() {\n        const {href, children, attributes} = this.props;\n\n        const dataAttributes = {\n            'data-hashtag': attributes['data-hashtag'],\n            'data-link': attributes['data-link'],\n            'data-channel-mention': attributes['data-channel-mention'],\n        };\n        return (\n            <React.Fragment>\n                {ReactDOM.createPortal(\n                    <div\n                        style={tooltipContainerStyles}\n                        ref={this.tooltipContainerRef}\n                        className={classNames('tooltip-container', {visible: this.state.show})}\n                    >\n                        <Pluggable\n                            href={href}\n                            show={this.state.show}\n                            pluggableName='LinkTooltip'\n                        />\n                    </div>,\n                    document.getElementById('root') as HTMLElement,\n                )}\n                <span\n                    onMouseOver={this.showTooltip}\n                    onMouseLeave={this.hideTooltip}\n                    {...dataAttributes}\n                >\n                    {children}\n                </span>\n            </React.Fragment>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React, {useEffect} from 'react';\nimport './markdown_image_expand.scss';\n\nexport type Props = {\n    alt: string;\n    imageKey: string;\n    children: React.ReactNode;\n    isExpanded: boolean;\n    postId: string;\n    onToggle?: (isExpanded: boolean) => void;\n    actions: {\n        toggleInlineImageVisibility: (postId: string, imageKey: string) => void;\n    };\n};\n\nconst MarkdownImageExpand: React.FC<Props> = ({children, alt, isExpanded, postId, actions, onToggle, imageKey}: Props) => {\n    const {toggleInlineImageVisibility} = actions;\n\n    useEffect(() => {\n        onToggle?.(isExpanded);\n    }, [isExpanded]);\n\n    const handleToggleButtonClick = () => {\n        toggleInlineImageVisibility(postId, imageKey);\n    };\n\n    const wrapperClassName = `markdown-image-expand ${isExpanded ? 'markdown-image-expand--expanded' : ''}`;\n\n    return (\n        <div className={wrapperClassName}>\n            {\n                isExpanded &&\n                <>\n                    <button\n                        className='markdown-image-expand__collapse-button'\n                        type='button'\n                        onClick={handleToggleButtonClick}\n                    >\n                        <span className='icon icon-menu-down'/>\n                    </button>\n                    {children}\n                </>\n            }\n\n            {\n                !isExpanded &&\n                <button\n                    className='markdown-image-expand__expand-button'\n                    type='button'\n                    onClick={handleToggleButtonClick}\n                >\n                    <span className='icon icon-menu-right markdown-image-expand__expand-icon'/>\n\n                    <span className='markdown-image-expand__alt-text'>\n                        {alt}\n                    </span>\n                </button>\n            }\n        </div>\n    );\n};\n\nexport default MarkdownImageExpand;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {bindActionCreators, Dispatch} from 'redux';\n\nimport {connect} from 'react-redux';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\n\nimport {GenericAction} from 'mattermost-redux/types/actions';\n\nimport {toggleInlineImageVisibility} from 'actions/post_actions';\nimport {isInlineImageVisible} from 'selectors/posts';\n\nimport MarkdownImageExpand, {Props} from './markdown_image_expand';\n\nconst mapStateToProps = (state: GlobalState, {postId, imageKey}: Props) => {\n    return {\n        isExpanded: isInlineImageVisible(state, postId, imageKey),\n    };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch<GenericAction>) => {\n    return {\n        actions: bindActionCreators({toggleInlineImageVisibility}, dispatch),\n    };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MarkdownImageExpand);\n","export default __webpack_public_path__ + \"files/82c53ca565ed83a033dfb4284740873d.png\";","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport Constants from 'utils/constants.jsx';\n\nimport MarkdownImageExpand from 'components/markdown_image_expand';\nimport ExternalImage from 'components/external_image';\nimport SizeAwareImage from 'components/size_aware_image';\nimport FilePreviewModal from 'components/file_preview_modal';\n\nimport brokenImageIcon from 'images/icons/brokenimage.png';\n\nexport default class MarkdownImage extends React.PureComponent {\n    static defaultProps = {\n        imageMetadata: {},\n    };\n\n    static propTypes = {\n        alt: PropTypes.string,\n        imageMetadata: PropTypes.object,\n        src: PropTypes.string.isRequired,\n\n        // height and width come from the Markdown renderer as either \"auto\" or a string containing a number.\n        height: PropTypes.string,\n        width: PropTypes.string,\n\n        title: PropTypes.string,\n        className: PropTypes.string.isRequired,\n        postId: PropTypes.string.isRequired,\n        imageIsLink: PropTypes.bool.isRequired,\n        onImageLoaded: PropTypes.func,\n        onImageHeightChanged: PropTypes.func,\n        postType: PropTypes.string,\n    }\n\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            showModal: false,\n            loadFailed: false,\n            loaded: false,\n        };\n    }\n\n    getHeight = () => {\n        const {\n            height,\n            imageMetadata,\n            width,\n        } = this.props;\n\n        if (!height) {\n            return imageMetadata.height;\n        }\n\n        if (height === 'auto') {\n            const widthNumber = parseInt(width, 10);\n\n            return (imageMetadata.height / imageMetadata.width) * widthNumber;\n        }\n\n        return parseInt(height, 10);\n    }\n\n    showModal = (e) => {\n        if (!this.props.imageIsLink) {\n            e.preventDefault();\n            this.setState({showModal: true});\n        }\n    }\n\n    hideModal = () => {\n        this.setState({showModal: false});\n    }\n\n    handleLoadFail = () => {\n        this.setState({loadFailed: true});\n    }\n\n    isHeaderChangeMessage = () => {\n        return this.props.postType &&\n            this.props.postType === Constants.PostTypes.HEADER_CHANGE;\n    }\n\n    componentDidUpdate(prevProps) {\n        this.onUpdated(prevProps.src);\n    }\n\n    onUpdated = (prevSrc) => {\n        if (this.props.src && this.props.src !== prevSrc) {\n            this.setState({loadFailed: false});\n        }\n    }\n\n    handleImageLoaded = ({height, width}) => {\n        this.setState({\n            loaded: true,\n        }, () => { // Call onImageLoaded prop only after state has already been set\n            if (this.props.onImageLoaded) {\n                this.props.onImageLoaded({height, width});\n            }\n        });\n    }\n\n    render() {\n        const {imageMetadata, src, alt, imageIsLink} = this.props;\n        if (src === '' || this.state.loadFailed) {\n            let className = 'markdown-inline-img broken-image';\n            if (this.isHeaderChangeMessage()) {\n                className += ' broken-image--scaled-down';\n            }\n\n            return (\n                <div style={{display: 'inline-block'}}>\n                    <img\n                        className={className}\n                        alt={alt}\n                        src={brokenImageIcon}\n                    />\n                </div>\n            );\n        }\n        return (\n            <ExternalImage\n                src={src}\n                imageMetadata={imageMetadata}\n            >\n                {(safeSrc) => {\n                    if (!safeSrc) {\n                        return (\n                            <a\n                                className='theme markdown__link'\n                                href={src}\n                                rel='noopener noreferrer'\n                                target='_blank'\n                                title={this.props.title}\n                            >\n                                {alt}\n                            </a>\n                        );\n                    }\n\n                    const getFileExtensionFromUrl = (url) => {\n                        const index = url.lastIndexOf('.');\n                        return index > 0 ? url.substring(index + 1) : null;\n                    };\n                    const extension = getFileExtensionFromUrl(safeSrc);\n\n                    let className = '';\n                    if (this.state.loaded) {\n                        className = imageIsLink || !extension ?\n                            `${this.props.className} markdown-inline-img--hover markdown-inline-img--no-border` :\n                            `${this.props.className} markdown-inline-img--hover cursor--pointer a11y--active`;\n\n                        if (this.isHeaderChangeMessage()) {\n                            className += ' markdown-inline-img--scaled-down';\n                        }\n                    } else {\n                        const loadingClass = this.isHeaderChangeMessage() ?\n                            'markdown-inline-img--scaled-down-loading' : 'markdown-inline-img--loading';\n                        className = `${this.props.className} ${loadingClass}`;\n                    }\n\n                    const {height, width, title, postId, onImageHeightChanged} = this.props;\n\n                    let imageElement = (\n                        <>\n                            <SizeAwareImage\n                                alt={alt}\n                                className={className}\n                                src={safeSrc}\n                                height={height === 'auto' ? undefined : height}\n                                width={width === 'auto' ? undefined : width}\n                                title={title}\n                                dimensions={imageMetadata}\n                                showLoader={false}\n                                onClick={this.showModal}\n                                onImageLoadFail={this.handleLoadFail}\n                                onImageLoaded={this.handleImageLoaded}\n                            />\n                            {!imageIsLink && extension &&\n                            <FilePreviewModal\n                                show={this.state.showModal}\n                                onModalDismissed={this.hideModal}\n                                postId={this.props.postId}\n                                startIndex={0}\n                                fileInfos={[{\n                                    has_preview_image: false,\n                                    link: safeSrc,\n                                    extension: imageMetadata.format || extension,\n                                    name: alt,\n                                }]}\n                            />\n                            }\n                        </>\n                    );\n\n                    const actualHeight = this.getHeight();\n                    if (actualHeight >= Constants.EXPANDABLE_INLINE_IMAGE_MIN_HEIGHT) {\n                        imageElement = (\n                            <MarkdownImageExpand\n                                alt={alt || safeSrc}\n                                postId={postId}\n                                imageKey={safeSrc}\n                                onToggle={onImageHeightChanged}\n                            >\n                                {imageElement}\n                            </MarkdownImageExpand>\n                        );\n                    }\n\n                    return imageElement;\n                }}\n            </ExternalImage>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ninterface PostEmojiProps {\n    name: string;\n    imageUrl: string;\n}\ndeclare module 'react' {\n    interface HTMLAttributes<T> extends AriaAttributes, DOMAttributes<T> {\n        alt?: string;\n    }\n}\n\nexport default class PostEmoji extends React.PureComponent<PostEmojiProps> {\n    public render() {\n        const emojiText = ':' + this.props.name + ':';\n\n        if (!this.props.imageUrl) {\n            return emojiText;\n        }\n\n        return (\n            <span\n                alt={emojiText}\n                className='emoticon'\n                title={emojiText}\n                style={{backgroundImage: 'url(' + this.props.imageUrl + ')'}}\n            >\n                {emojiText}\n            </span>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getEmojiImageUrl} from 'mattermost-redux/utils/emoji_utils';\n\nimport {getEmojiMap} from 'selectors/emojis';\n\nimport {GlobalState} from 'types/store';\n\nimport PostEmoji from './post_emoji';\n\ntype Props = {\n    name: string;\n};\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const emojiMap = getEmojiMap(state);\n    const emoji = emojiMap.get(ownProps.name);\n\n    return {\n        imageUrl: emoji ? getEmojiImageUrl(emoji) : '',\n    };\n}\n\nexport default connect(mapStateToProps)(PostEmoji);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Parser, ProcessNodeDefinitions} from 'html-to-react';\n\nimport AtMention from 'components/at_mention';\nimport LatexBlock from 'components/latex_block';\nimport LinkTooltip from 'components/link_tooltip/link_tooltip';\nimport MarkdownImage from 'components/markdown_image';\nimport PostEmoji from 'components/post_emoji';\n\n/*\n * Converts HTML to React components using html-to-react.\n * The following options can be specified:\n * - mentions - If specified, mentions are replaced with the AtMention component. Defaults to true.\n * - mentionHighlight - If specified, mentions for the current user are highlighted. Defaults to true.\n * - disableGroupHighlight - If specified, group mentions are not displayed as blue links. Defaults to false.\n * - emoji - If specified, emoji text is replaced with the PostEmoji component. Defaults to true.\n * - images - If specified, markdown images are replaced with the image component. Defaults to true.\n * - imageProps - If specified, any extra props that should be passed into the image component.\n * - latex - If specified, latex is replaced with the LatexBlock component. Defaults to true.\n * - imagesMetadata - the dimensions of the image as retrieved from post.metadata.images.\n * - hasPluginTooltips - If specified, the LinkTooltip component is placed inside links. Defaults to false.\n * - channelId = If specified, to be passed along to ProfilePopover via AtMention\n */\nexport function messageHtmlToComponent(html, isRHS, options = {}) {\n    if (!html) {\n        return null;\n    }\n\n    const parser = new Parser();\n    const processNodeDefinitions = new ProcessNodeDefinitions(React);\n\n    function isValidNode() {\n        return true;\n    }\n\n    const processingInstructions = [\n\n        // Workaround to fix MM-14931\n        {\n            replaceChildren: false,\n            shouldProcessNode: (node) => node.type === 'tag' && node.name === 'input' && node.attribs.type === 'checkbox',\n            processNode: (node) => {\n                const attribs = node.attribs || {};\n                node.attribs.checked = Boolean(attribs.checked);\n\n                return React.createElement('input', {...node.attribs});\n            },\n        },\n    ];\n\n    if (options.hasPluginTooltips) {\n        const hrefAttrib = 'href';\n        processingInstructions.push({\n            replaceChildren: true,\n            shouldProcessNode: (node) => node.type === 'tag' && node.name === 'a' && node.attribs[hrefAttrib],\n            processNode: (node, children) => {\n                return (\n                    <LinkTooltip\n                        href={node.attribs[hrefAttrib]}\n                        attributes={node.attribs}\n                    >\n                        {children}\n                    </LinkTooltip>\n                );\n            },\n        });\n    }\n    if (!('mentions' in options) || options.mentions) {\n        const mentionHighlight = 'mentionHighlight' in options ? options.mentionHighlight : true;\n        const disableGroupHighlight = 'disableGroupHighlight' in options ? options.disableGroupHighlight === true : false;\n        const mentionAttrib = 'data-mention';\n        processingInstructions.push({\n            replaceChildren: true,\n            shouldProcessNode: (node) => node.attribs && node.attribs[mentionAttrib],\n            processNode: (node, children) => {\n                const mentionName = node.attribs[mentionAttrib];\n                const callAtMention = (\n                    <AtMention\n                        mentionName={mentionName}\n                        isRHS={isRHS}\n                        hasMention={true}\n                        disableHighlight={!mentionHighlight}\n                        disableGroupHighlight={disableGroupHighlight}\n                        channelId={options.channelId}\n                    >\n                        {children}\n                    </AtMention>\n                );\n                return callAtMention;\n            },\n        });\n    }\n\n    if (!('emoji' in options) || options.emoji) {\n        const emojiAttrib = 'data-emoticon';\n        processingInstructions.push({\n            replaceChildren: true,\n            shouldProcessNode: (node) => node.attribs && node.attribs[emojiAttrib],\n            processNode: (node) => {\n                const emojiName = node.attribs[emojiAttrib];\n\n                return <PostEmoji name={emojiName}/>;\n            },\n        });\n    }\n\n    if (!('images' in options) || options.images) {\n        processingInstructions.push({\n            shouldProcessNode: (node) => node.type === 'tag' && node.name === 'img',\n            processNode: (node) => {\n                const {\n                    class: className,\n                    ...attribs\n                } = node.attribs;\n\n                const imageIsLink = (parentNode) => {\n                    if (parentNode &&\n                        parentNode.type === 'tag' &&\n                        parentNode.name === 'a'\n                    ) {\n                        return true;\n                    }\n                    return false;\n                };\n\n                return (\n                    <MarkdownImage\n                        className={className}\n                        imageMetadata={options.imagesMetadata && options.imagesMetadata[attribs.src]}\n                        {...attribs}\n                        {...options.imageProps}\n                        postId={options.postId}\n                        imageIsLink={imageIsLink(node.parentNode)}\n                        postType={options.postType}\n                    />\n                );\n            },\n        });\n    }\n\n    if (!('latex' in options) || options.latex) {\n        processingInstructions.push({\n            shouldProcessNode: (node) => node.attribs && node.attribs['data-latex'],\n            processNode: (node) => {\n                return (\n                    <LatexBlock content={node.attribs['data-latex']}/>\n                );\n            },\n        });\n    }\n\n    processingInstructions.push({\n        shouldProcessNode: () => true,\n        processNode: processNodeDefinitions.processDefaultNode,\n    });\n\n    return parser.parseWithInstructions(html, isValidNode, processingInstructions);\n}\n\nexport default messageHtmlToComponent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport {splitMessageBasedOnCaretPosition} from 'utils/post_utils';\n\nexport function parseTable(html: string): HTMLTableElement | null {\n    return new DOMParser().parseFromString(html, 'text/html').querySelector('table');\n}\n\nexport function getTable(clipboardData: DataTransfer): HTMLTableElement | null {\n    if (Array.from(clipboardData.types).indexOf('text/html') === -1) {\n        return null;\n    }\n\n    const html = clipboardData.getData('text/html');\n\n    if (!(/<table/i).test(html)) {\n        return null;\n    }\n\n    const table = parseTable(html);\n    if (!table) {\n        return null;\n    }\n\n    return table;\n}\n\nexport function getPlainText(clipboardData: DataTransfer): string | boolean {\n    if (Array.from(clipboardData.types).indexOf('text/plain') === -1) {\n        return false;\n    }\n\n    const plainText = clipboardData.getData('text/plain');\n\n    return plainText;\n}\n\nexport function isGitHubCodeBlock(tableClassName: string): boolean {\n    const result = (/\\b(js|blob|diff)-./).test(tableClassName);\n    return result;\n}\n\nfunction columnText(column: Element): string {\n    const noBreakSpace = '\\u00A0';\n    const text = column.textContent == null ?\n        noBreakSpace : column.textContent.trim().replace(/\\|/g, '\\\\|').replace(/\\n/g, ' ');\n    return text;\n}\n\nfunction tableHeaders(row: HTMLTableRowElement): string[] {\n    return Array.from(row.querySelectorAll('td, th')).map(columnText);\n}\n\nexport function formatMarkdownTableMessage(table: HTMLTableElement, message?: string, caretPosition?: number): string {\n    const rows = Array.from(table.querySelectorAll('tr'));\n\n    const headerRow = rows.shift();\n    const headers = headerRow ? tableHeaders(headerRow) : [];\n    const spacers = headers.map(() => '---');\n    const header = `|${headers.join(' | ')}|\\n|${spacers.join(' | ')}|\\n`;\n\n    const body = rows.map((row) => {\n        return `|${Array.from(row.querySelectorAll('td')).map(columnText).join(' | ')}|`;\n    }).join('\\n');\n\n    const formattedTable = `${header}${body}\\n`;\n    if (!message) {\n        return formattedTable;\n    }\n    if (typeof caretPosition === 'undefined') {\n        return `${message}\\n\\n${formattedTable}`;\n    }\n    const newMessage = [message.slice(0, caretPosition), formattedTable, message.slice(caretPosition)];\n    return newMessage.join('\\n');\n}\n\nexport function formatGithubCodePaste(caretPosition: number, message: string, clipboardData: DataTransfer): {formattedMessage: string; formattedCodeBlock: string} {\n    const {firstPiece, lastPiece} = splitMessageBasedOnCaretPosition(caretPosition, message);\n\n    // Add new lines if content exists before or after the cursor.\n    const requireStartLF = firstPiece === '' ? '' : '\\n';\n    const requireEndLF = lastPiece === '' ? '' : '\\n';\n    const formattedCodeBlock = requireStartLF + '```\\n' + getPlainText(clipboardData) + '\\n```' + requireEndLF;\n    const formattedMessage = `${firstPiece}${formattedCodeBlock}${lastPiece}`;\n\n    return {formattedMessage, formattedCodeBlock};\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport function popOverOverlayPosition(\n    targetBounds: DOMRect,\n    innerHeight: number,\n    spaceRequiredAbove: number,\n    spaceRequiredBelow?: number,\n    horizontalPosition?: 'left' | 'right',\n): string {\n    let placement: string;\n\n    if (targetBounds.top > spaceRequiredAbove) {\n        placement = 'top';\n    } else if (innerHeight - targetBounds.bottom > (spaceRequiredBelow || spaceRequiredAbove)) {\n        placement = 'bottom';\n    } else {\n        placement = horizontalPosition || 'left';\n    }\n    return placement;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\n\n// Prop types copied from the old version of\n\nexport const intlConfigPropTypes = {\n    locale: PropTypes.string,\n    timeZone: PropTypes.string,\n    formats: PropTypes.object,\n    messages: PropTypes.object,\n    textComponent: PropTypes.any,\n\n    defaultLocale: PropTypes.string,\n    defaultFormats: PropTypes.object,\n    wrapRichTextChunksInFragment: PropTypes.bool,\n\n    onError: PropTypes.func,\n};\n\nexport const intlFormatPropTypes = {\n    formatDate: PropTypes.func.isRequired,\n    formatTime: PropTypes.func.isRequired,\n    formatRelativeTime: PropTypes.func.isRequired,\n    formatNumber: PropTypes.func.isRequired,\n    formatPlural: PropTypes.func.isRequired,\n    formatMessage: PropTypes.func.isRequired,\n};\n\nexport const intlShape = PropTypes.shape({\n    ...intlConfigPropTypes,\n    ...intlFormatPropTypes,\n    formatters: PropTypes.object,\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ErrorPageTypes} from 'utils/constants';\nimport {isGuest} from 'utils/utils.jsx';\n\nexport function importComponentSuccess(callback) {\n    return (comp) => callback(null, comp.default);\n}\n\nexport function createGetChildComponentsFunction(arrayOfComponents) {\n    return (locaiton, callback) => callback(null, arrayOfComponents);\n}\n\nexport const notFoundParams = {\n    type: ErrorPageTypes.PAGE_NOT_FOUND,\n};\n\nconst mfaPaths = [\n    '/mfa/setup',\n    '/mfa/confirm',\n];\n\nconst mfaAuthServices = [\n    '',\n    'email',\n    'ldap',\n];\n\nexport function checkIfMFARequired(user, license, config, path) {\n    if (license.MFA === 'true' &&\n            config.EnableMultifactorAuthentication === 'true' &&\n            config.EnforceMultifactorAuthentication === 'true' &&\n            mfaPaths.indexOf(path) === -1) {\n        if (isGuest(user) && config.GuestAccountsEnforceMultifactorAuthentication !== 'true') {\n            return false;\n        }\n\n        if (user && !user.mfa_active &&\n                mfaAuthServices.indexOf(user.auth_service) !== -1) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n// Use when sorting multiple teams by their `display_name` field\nfunction compareTeamsByDisplayName(locale, a, b) {\n    if (a.display_name !== null) {\n        if (a.display_name !== b.display_name) {\n            return a.display_name.localeCompare(b.display_name, locale, {numeric: true});\n        }\n    }\n\n    return a.name.localeCompare(b.name, locale, {numeric: true});\n}\n\n// Use to filter out teams that are deleted and without display_name, then sort by their `display_name` field\nexport function filterAndSortTeamsByDisplayName(teams, locale, teamsOrder = '') {\n    if (!teams) {\n        return [];\n    }\n\n    const teamsOrderList = teamsOrder.split(',');\n\n    const customSortedTeams = teams.filter((team) => {\n        if (team !== null) {\n            return teamsOrderList.includes(team.id);\n        }\n        return false;\n    }).sort((a, b) => {\n        return teamsOrderList.indexOf(a.id) - teamsOrderList.indexOf(b.id);\n    });\n\n    const otherTeams = teams.filter((team) => {\n        if (team !== null) {\n            return !teamsOrderList.includes(team.id);\n        }\n        return false;\n    }).sort((a, b) => {\n        return compareTeamsByDisplayName(locale, a, b);\n    });\n\n    return [...customSortedTeams, ...otherTeams].filter((team) => {\n        return team && !team.delete_at > 0 && team.display_name != null;\n    });\n}\n","export default __webpack_public_path__ + \"files/228bff4301724dfe4fdc5bfc15e84f43.svg\";","export default __webpack_public_path__ + \"files/63ee9f55a9acf5209476b0e0e97de80b.svg\";","export default __webpack_public_path__ + \"files/52fd1c66da2cc4e23dfa5a212c645db2.svg\";","export default __webpack_public_path__ + \"files/377564d283f9bc35cce974f33e37eaf3.png\";"],"sourceRoot":""}