diff --git a/README.md b/README.md index 5aa3c8b5..6f2e5ff6 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ The app is currently available in the following languages: * English * Chinese (simplified) * Chinese (traditional) + * French * German * Korean * Romanian @@ -44,7 +45,6 @@ More translations are welcome. See [instructions](https://github.com/tinode/chat ## Not done yet -* Video or audio calling. * End-to-End encryption. * Emoji support is weak. * Mentions, hashtags. diff --git a/service-worker.js b/service-worker.js index c9e3baac..5620e8a6 100644 --- a/service-worker.js +++ b/service-worker.js @@ -19,6 +19,10 @@ const i18n = { 'new_message': "New message", 'new_chat': "New chat", }, + 'fr': { + 'new_message': "Nouveau message", + 'new_chat': "Nouvelle conversation", + }, 'es': { 'new_message': "Nuevo mensaje", 'new_chat': "Nueva conversación", diff --git a/src/i18n/fr.json b/src/i18n/fr.json new file mode 100644 index 00000000..49dc217c --- /dev/null +++ b/src/i18n/fr.json @@ -0,0 +1,1427 @@ +{ + "action_block_contact": { + "translation": "Bloquer le Contact", + "defaultMessage": "Block Contact", + "description": "Flat button [Block Contact]", + "missing": false, + "obsolete": false + }, + "action_cancel": { + "translation": "annuler", + "defaultMessage": "cancel", + "description": "Call to action [cancel]", + "missing": false, + "obsolete": false + }, + "action_clear_messages": { + "translation": "Effacer les Messages", + "defaultMessage": "Clear Messages", + "description": "Flat button [Clear Messages] (soft-delete messages)", + "missing": false, + "obsolete": false + }, + "action_delete_messages": { + "translation": "Effacer les Messages pour Tous", + "defaultMessage": "Clear Messages for All", + "description": "Flat button [Clear for All] (hard-delete all messages)", + "missing": false, + "obsolete": false + }, + "action_leave_chat": { + "translation": "Quitter la Conversation", + "defaultMessage": "Leave Conversation", + "description": "Flat button [Leave Conversation]", + "missing": false, + "obsolete": false + }, + "action_report_chat": { + "translation": "Signaler la Conversation", + "defaultMessage": "Report Conversation", + "description": "Flat button [Report Group]", + "missing": false, + "obsolete": false + }, + "archived_contacts": { + "translation": "Contacts archivés ({count})", + "defaultMessage": "Archived contacts ({count})", + "description": "Label for archived chats", + "missing": false, + "obsolete": false + }, + "badge_danger": { + "translation": "Non fiable", + "defaultMessage": "Untrustworthy", + "description": "Suspicious or untrustworthy account or topic badge", + "missing": false, + "obsolete": false + }, + "badge_owner": { + "translation": "propriétaire", + "defaultMessage": "owner", + "description": "Badge for indicating the owner", + "missing": false, + "obsolete": false + }, + "badge_staff": { + "translation": "Géré par le Staff", + "defaultMessage": "Staff-managed", + "description": "Explanation of a staff-managed account or topic badge", + "missing": false, + "obsolete": false + }, + "badge_verified": { + "translation": "Vérifié / Officiel", + "defaultMessage": "Verified/official", + "description": "Explanation of a verified account or topic badge", + "missing": false, + "obsolete": false + }, + "badge_you": { + "translation": "vous", + "defaultMessage": "you", + "description": "Badge for indicating the current user", + "missing": false, + "obsolete": false + }, + "block_contact_warning": { + "translation": "Êtes-vous sûr de bloquer le contact ?", + "defaultMessage": "Are you sure you want to block this contact?", + "description": "Alert dialog warning when blocking a contact.", + "missing": false, + "obsolete": false + }, + "blocked_contacts_link": { + "translation": "Contacts bloqués ({count})", + "defaultMessage": "Blocked contacts ({count})", + "description": "Blocked contacts link", + "missing": false, + "obsolete": false + }, + "button_add_another": { + "translation": "Ajouter un autre", + "defaultMessage": "Add another", + "description": "Call to action [+ add another]", + "missing": false, + "obsolete": false + }, + "button_add_members": { + "translation": "Ajouter des membres", + "defaultMessage": "Add members", + "description": "Flat button [Add members] (to topic)", + "missing": false, + "obsolete": false + }, + "button_cancel": { + "translation": "Annuler", + "defaultMessage": "Cancel", + "description": "Button [Cancel]", + "missing": false, + "obsolete": false + }, + "button_confirm": { + "translation": "Confirmer", + "defaultMessage": "Confirm", + "description": "Button [Confirm]", + "missing": false, + "obsolete": false + }, + "button_create": { + "translation": "Créer", + "defaultMessage": "Create", + "description": "Button [Create]", + "missing": false, + "obsolete": false + }, + "button_delete_account": { + "translation": "Supprimer le compte", + "defaultMessage": "Delete account", + "description": "Button [Delete account]", + "missing": false, + "obsolete": false + }, + "button_edit": { + "translation": "Modifier", + "defaultMessage": "Edit", + "description": "Call to action [Edit]", + "missing": false, + "obsolete": false + }, + "button_logout": { + "translation": "Déconnexion", + "defaultMessage": "Logout", + "description": "Button [Logout]", + "missing": false, + "obsolete": false + }, + "button_ok": { + "translation": "OK", + "defaultMessage": "OK", + "description": "Button [OK]", + "missing": false, + "obsolete": false + }, + "button_reset": { + "translation": "Remettre à Zéro", + "defaultMessage": "Reset", + "description": "Button [Reset]", + "missing": false, + "obsolete": false + }, + "button_send_request": { + "translation": "Envoyer une demande", + "defaultMessage": "Send request", + "description": "Button [Send request]", + "missing": false, + "obsolete": false + }, + "button_sign_in": { + "translation": "Connexion", + "defaultMessage": "Sign in", + "description": "Button [Sign In]", + "missing": false, + "obsolete": false + }, + "button_sign_up": { + "translation": "Créer un compte", + "defaultMessage": "Sign up", + "description": "Create account button [Sign Up]", + "missing": false, + "obsolete": false + }, + "button_subscribe": { + "translation": "S'abonner", + "defaultMessage": "Subscribe", + "description": "Button [Subscribe]", + "missing": false, + "obsolete": false + }, + "button_update": { + "translation": "Mettre à jour", + "defaultMessage": "Update", + "description": "Button [Update]", + "missing": false, + "obsolete": false + }, + "cannot_initiate_file_upload": { + "translation": "Impossible de démarrer l'envoi.", + "defaultMessage": "Cannot initiate file upload.", + "description": "Generic error messagewhen attachment fails", + "missing": false, + "obsolete": false + }, + "channel": { + "translation": "canal", + "defaultMessage": "channel", + "description": "Subtitle shown for channels in MessagesView instead of last seen", + "missing": false, + "obsolete": false + }, + "channel_prompt": { + "translation": "C'est un canal", + "defaultMessage": "This is a channel", + "description": "Checkbox label when creating a channel", + "missing": false, + "obsolete": false + }, + "chat_invitation": { + "translation": "Vous êtes invité à démarrer une conversation. Que voulez vous faire ?", + "defaultMessage": "You are invited to start a new chat. What would you like to do?", + "description": "New chat invitation message: [Accept] [Ignore] [Block].", + "missing": false, + "obsolete": false + }, + "chat_invitation_accept": { + "translation": "Accepter", + "defaultMessage": "Accept", + "description": "Action [Accept] for chat invitation.", + "missing": false, + "obsolete": false + }, + "chat_invitation_block": { + "translation": "Bloquer", + "defaultMessage": "Block", + "description": "Action [Block] for chat invitation.", + "missing": false, + "obsolete": false + }, + "chat_invitation_ignore": { + "translation": "Ignorer", + "defaultMessage": "Ignore", + "description": "Action [Ignore] for chat invitation.", + "missing": false, + "obsolete": false + }, + "clear_messages_warning": { + "translation": "Êtes-vous sûr de vouloir effacer tous les messages ? Aucun retour possible.", + "defaultMessage": "Are you sure you want to clear all messages? It cannot be undone.", + "description": "Alert dialog warning when deleting all messages.", + "missing": false, + "obsolete": false + }, + "code_doesnot_match": { + "translation": "Le code ne correspond pas", + "defaultMessage": "Code does not match", + "description": "Error message when the credential validation code is incorrect.", + "missing": false, + "obsolete": false + }, + "contacts_not_found": { + "translation": "Vous n'avez aucune conversation
¯∖_(ツ)_/¯", + "defaultMessage": "You have no chats
¯∖_(ツ)_/¯", + "description": "HTML message shown in ContactList when no contacts are found", + "missing": false, + "obsolete": false + }, + "contacts_not_found_short": { + "translation": "Aucun contact ne correspond à ''{query}''", + "defaultMessage": "No contacts match ''{query}''", + "description": "Shown in ContactsView when search returned no results", + "missing": false, + "obsolete": false + }, + "credential_email_prompt": { + "translation": "Votre email d'enregistrement", + "defaultMessage": "Your registration email", + "description": "Placeholder for entering email", + "missing": false, + "obsolete": false + }, + "delete_account": { + "translation": "Supprimer le compte", + "defaultMessage": "Delete account", + "description": "Title for delete account warning", + "missing": false, + "obsolete": false + }, + "delete_account_warning": { + "translation": "Êtes-vous sûr de vouloir supprimer votre compte ? Aucun retour possible.", + "defaultMessage": "Are you sure you want to delete your account? It cannot be undone.", + "description": "Warning message when deleting an account", + "missing": false, + "obsolete": false + }, + "delete_messages_warning": { + "translation": "Êtes-vous sûr de vouloir supprimer tous les messages pour tous ? Aucun retour possible.", + "defaultMessage": "Are you sure you want to delete all messages for everyone? It cannot be undone.", + "description": "Alert dialog warning when hard-deleting all messages.", + "missing": false, + "obsolete": false + }, + "deleted_content": { + "translation": "contenu supprimé", + "defaultMessage": "content deleted", + "description": "Shown when messages are deleted", + "missing": false, + "obsolete": false + }, + "download_action": { + "translation": "télécharger", + "defaultMessage": "download", + "description": "Call to action [download]", + "missing": false, + "obsolete": false + }, + "drafty_attachment": { + "translation": "Pièce(s) jointe(s)", + "defaultMessage": "Attachment", + "description": "Comment for attachment in drafty", + "missing": false, + "obsolete": false + }, + "drafty_form": { + "translation": "Formulaire:", + "defaultMessage": "Form:", + "description": "Comment for form in drafty", + "missing": false, + "obsolete": false + }, + "drafty_image": { + "translation": "Image", + "defaultMessage": "Picture", + "description": "Comment for embedded images in drafty", + "missing": false, + "obsolete": false + }, + "email_dative": { + "translation": "email", + "defaultMessage": "email", + "description": "Dative case of 'email', i.e. 'email' in 'by email'", + "missing": false, + "obsolete": false + }, + "email_prompt": { + "translation": "Email, par exemple jdoe@exemple.com", + "defaultMessage": "Email, e.g. jdoe@example.com", + "description": "Input placeholder for email entry", + "missing": false, + "obsolete": false + }, + "enable_peers_messaging": { + "translation": "Activer", + "defaultMessage": "Enable", + "description": "Call to action to enable peer's messaging", + "missing": false, + "obsolete": false + }, + "enter_confirmation_code_prompt": { + "translation": "Entrez le code de confirmation envoyé par {method}:", + "defaultMessage": "Enter confirmation code sent to you by {method}:", + "description": "Request to enter confirmation code", + "missing": false, + "obsolete": false + }, + "error_invalid_id": { + "translation": "Identifiant invalide", + "defaultMessage": "Invalid ID", + "description": "Error message", + "missing": false, + "obsolete": false + }, + "file_attachment_too_large": { + "translation": "Le fichier de taille {size} dépasse la limite de {limit}.", + "defaultMessage": "The file size {size} exceeds the {limit} limit.", + "description": "Error message when attachment is too large", + "missing": false, + "obsolete": false + }, + "forgot_password_link": { + "translation": "Mot de passe oublié ?", + "defaultMessage": "Forgot password?", + "description": "Link to Reset password form", + "missing": false, + "obsolete": false + }, + "full_name_prompt": { + "translation": "Nom complet, par exemple John Doe", + "defaultMessage": "Full name, e.g. John Doe", + "description": "Input placeholder for person's full name", + "missing": false, + "obsolete": false + }, + "granted_permissions": { + "translation": "Accordé", + "defaultMessage": "Granted", + "description": "Title for permissions", + "missing": false, + "obsolete": false + }, + "group_has_no_members": { + "translation": "Aucun membre", + "defaultMessage": "No members", + "description": "Shown in place of group members", + "missing": false, + "obsolete": false + }, + "group_user_id_prompt": { + "translation": "Identifiant d'utilisateur ou de groupe", + "defaultMessage": "Group or User ID", + "description": "Prompt for entering user or group ID", + "missing": false, + "obsolete": false + }, + "image_caption_prompt": { + "translation": "Description de l'image", + "defaultMessage": "Image caption", + "description": "Prompt in SendMessage for attached image", + "missing": false, + "obsolete": false + }, + "invalid_content": { + "translation": "contenu invalide", + "defaultMessage": "invalid content", + "description": "Shown when the message is unreadable", + "missing": false, + "obsolete": false + }, + "invalid_security_token": { + "translation": "Token de sécurité invalide", + "defaultMessage": "Invalid security token", + "description": "Error message when resetting password.", + "missing": false, + "obsolete": false + }, + "label_client": { + "translation": "Client :", + "defaultMessage": "Client:", + "description": "Label for a client version", + "missing": false, + "obsolete": false + }, + "label_content_type": { + "translation": "Type de contenu :", + "defaultMessage": "Content type:", + "description": "Label for file content type (mime)", + "missing": false, + "obsolete": false + }, + "label_default_access_mode": { + "translation": "Mode d'accès par défaut :", + "defaultMessage": "Default access mode:", + "description": "Label for default access mode", + "missing": false, + "obsolete": false + }, + "label_file_name": { + "translation": "Nom du fichier :", + "defaultMessage": "File name:", + "description": "Label for a file name", + "missing": false, + "obsolete": false + }, + "label_group_members": { + "translation": "Membres du groupe :", + "defaultMessage": "Group members:", + "description": "Section title or label", + "missing": false, + "obsolete": false + }, + "label_incognito_mode": { + "translation": "Mode incognito :", + "defaultMessage": "Incognito mode:", + "description": "Label for incognito mode toggle", + "missing": false, + "obsolete": false + }, + "label_message_sound": { + "translation": "Son du message :", + "defaultMessage": "Message sound:", + "description": "Label for message sounds toggle", + "missing": false, + "obsolete": false + }, + "label_muting_topic": { + "translation": "Mué :", + "defaultMessage": "Muted:", + "description": "Label for Muting/unmuting the topic", + "missing": false, + "obsolete": false + }, + "label_other_user": { + "translation": "Autre", + "defaultMessage": "Other", + "description": "Label for the other user when the user is unnamed", + "missing": false, + "obsolete": false + }, + "label_password": { + "translation": "Mot de passe", + "defaultMessage": "Password", + "description": "Label for password editing", + "missing": false, + "obsolete": false + }, + "label_permissions": { + "translation": "Permissions :", + "defaultMessage": "Permissions:", + "description": "Section title", + "missing": false, + "obsolete": false + }, + "label_private": { + "translation": "Commentaire privé", + "defaultMessage": "Private comment", + "description": "Label for editing 'private'", + "missing": false, + "obsolete": false + }, + "label_push_notifications": { + "translation": "Notifications :", + "defaultMessage": "Notification alerts:", + "description": "Label for push notifications switch", + "missing": false, + "obsolete": false + }, + "label_push_notifications_disabled": { + "translation": "Notifications (requière HTTPS):", + "defaultMessage": "Notification alerts (requires HTTPS):", + "description": "Label for push notifications switch", + "missing": false, + "obsolete": false + }, + "label_reset_password": { + "translation": "Envoyer un mail de remise à zéro de mot de passe :", + "defaultMessage": "Send a password reset email:", + "description": "Label for password reset field", + "missing": false, + "obsolete": false + }, + "label_sdk": { + "translation": "SDK :", + "defaultMessage": "SDK:", + "missing": false, + "obsolete": false + }, + "label_server": { + "translation": "Serveur :", + "defaultMessage": "Server:", + "description": "Label for a server version", + "missing": false, + "obsolete": false + }, + "label_server_address": { + "translation": "Adresse du serveur :", + "defaultMessage": "Server address:", + "missing": false, + "obsolete": false + }, + "label_server_to_use": { + "translation": "Serveur à utiliser :", + "defaultMessage": "Server to use:", + "description": "Label for server selector in SettingsView", + "missing": false, + "obsolete": false + }, + "label_size": { + "translation": "Taille :", + "defaultMessage": "Size:", + "description": "Label for file size", + "missing": false, + "obsolete": false + }, + "label_topic_name": { + "translation": "Nom", + "defaultMessage": "Name", + "description": "Label for editing topic name", + "missing": false, + "obsolete": false + }, + "label_user_contacts": { + "translation": "Contacts :", + "defaultMessage": "Contacts:", + "description": "Label for user contacts", + "missing": false, + "obsolete": false + }, + "label_user_id": { + "translation": "ID :", + "defaultMessage": "ID:", + "description": "Label for user address (ID)", + "missing": false, + "obsolete": false + }, + "label_wire_transport": { + "translation": "Transport par cable :", + "defaultMessage": "Wire transport:", + "description": "Label for wire transport selection in SettingsView", + "missing": false, + "obsolete": false + }, + "label_you": { + "translation": "Vous :", + "defaultMessage": "You:", + "description": "Label for the current user", + "missing": false, + "obsolete": false + }, + "label_your_name": { + "translation": "Votre nom", + "defaultMessage": "Your name", + "description": "Label for full name editing", + "missing": false, + "obsolete": false + }, + "label_your_permissions": { + "translation": "Vos permissions :", + "defaultMessage": "Your permissions:", + "description": "Label for current user permissions", + "missing": false, + "obsolete": false + }, + "last_seen_timestamp": { + "translation": "Vu pour la dernière fois", + "defaultMessage": "Last seen", + "description": "Label for the timestamp of when the user or topic was last online", + "missing": false, + "obsolete": false + }, + "leave_chat_warning": { + "translation": "Êtes-vous sûr de vouloir quitter cette conversation ?", + "defaultMessage": "Are you sure you want to leave this conversation?", + "description": "Alert dialog warning when unsubscribing from a chat.", + "missing": false, + "obsolete": false + }, + "link_contact_us": { + "translation": "Contactez Nous", + "defaultMessage": "Contact Us", + "description": "Ancor text for contacting us by email", + "missing": false, + "obsolete": false + }, + "link_privacy_policy": { + "translation": "Politique de confidentialité", + "defaultMessage": "Privacy Policy", + "description": "Ancor text for privacy policy link", + "missing": false, + "obsolete": false + }, + "link_terms_of_service": { + "translation": "Conditions d'utilisation", + "defaultMessage": "Terms of Service", + "description": "Ancor text for terms of service link", + "missing": false, + "obsolete": false + }, + "login_prompt": { + "translation": "Connexion", + "defaultMessage": "Login", + "description": "Placeholer for username/login", + "missing": false, + "obsolete": false + }, + "menu_item_archive_topic": { + "translation": "Archiver", + "defaultMessage": "Archive", + "description": "Move topic from the list of active chats to archive", + "missing": false, + "obsolete": false + }, + "menu_item_block": { + "translation": "Bloquer", + "defaultMessage": "Block", + "description": "Block topic or user", + "missing": false, + "obsolete": false + }, + "menu_item_clear_messages": { + "translation": "Effacer les messages", + "defaultMessage": "Clear messages", + "description": "Delete all messages", + "missing": false, + "obsolete": false + }, + "menu_item_clear_messages_for_all": { + "translation": "Effacer pour Tous", + "defaultMessage": "Clear for All", + "description": "Delete all message(s) for all members", + "missing": false, + "obsolete": false + }, + "menu_item_delete": { + "translation": "Supprimer", + "defaultMessage": "Delete", + "description": "Delete selected messages", + "missing": false, + "obsolete": false + }, + "menu_item_delete_for_all": { + "translation": "Supprimer pour Tous", + "defaultMessage": "Delete for All", + "description": "Delete selected message(s) for all members", + "missing": false, + "obsolete": false + }, + "menu_item_delete_topic": { + "translation": "Supprimer", + "defaultMessage": "Delete", + "description": "Delete entire topic", + "missing": false, + "obsolete": false + }, + "menu_item_edit_permissions": { + "translation": "Modifier les permissions", + "defaultMessage": "Edit permissions", + "description": "Menu item [Edit permissions]", + "missing": false, + "obsolete": false + }, + "menu_item_info": { + "translation": "Informations", + "defaultMessage": "Info", + "description": "Show extended topic information", + "missing": false, + "obsolete": false + }, + "menu_item_member_delete": { + "translation": "Supprimer", + "defaultMessage": "Remove", + "description": "Remove user from topic", + "missing": false, + "obsolete": false + }, + "menu_item_mute": { + "translation": "Rendre muer", + "defaultMessage": "Mute", + "description": "Turn off notifications", + "missing": false, + "obsolete": false + }, + "menu_item_reply": { + "translation": "Répondre", + "defaultMessage": "Reply", + "description": "Reply to message", + "missing": false, + "obsolete": false + }, + "menu_item_restore_topic": { + "translation": "Restorer", + "defaultMessage": "Restore", + "description": "Restore topic from archive", + "missing": false, + "obsolete": false + }, + "menu_item_send_retry": { + "translation": "Réessayer", + "defaultMessage": "Retry", + "description": "Retry sending message", + "missing": false, + "obsolete": false + }, + "menu_item_unblock": { + "translation": "Débloquer", + "defaultMessage": "Unblock", + "description": "Unblock topic or user", + "missing": false, + "obsolete": false + }, + "menu_item_unmute": { + "translation": "Recevoir à nouveau", + "defaultMessage": "Unmute", + "description": "Turn notifications on", + "missing": false, + "obsolete": false + }, + "message_sending": { + "translation": "envoi en cours...", + "defaultMessage": "sending...", + "description": "Message being sent, in place of time stamp", + "missing": false, + "obsolete": false + }, + "message_sending_failed": { + "translation": "échoué", + "defaultMessage": "failed", + "description": "Failed to send message, in place of time stamp", + "missing": false, + "obsolete": false + }, + "messages_not_readable": { + "translation": "aucun accès aux messages", + "defaultMessage": "no access to messages", + "description": "Message shown in topic without the read access", + "missing": false, + "obsolete": false + }, + "messaging_disabled_prompt": { + "translation": "Discussion désactivée", + "defaultMessage": "Messaging disabled", + "description": "Prompt in SendMessage in read-only topic", + "missing": false, + "obsolete": false + }, + "more_online_members": { + "translation": "+{overflow} de plus", + "defaultMessage": "+{overflow} more", + "description": "Shown in MessagesView title bar when the number of online subscribers exceeds MAX_ONLINE_IN_TOPIC", + "missing": false, + "obsolete": false + }, + "new_message_prompt": { + "translation": "Nouveau message", + "defaultMessage": "New message", + "description": "Prompt in send message field", + "missing": false, + "obsolete": false + }, + "new_password_placeholder": { + "translation": "Entrez un nouveau mot de passe", + "defaultMessage": "Enter new password", + "description": "Placeholder for entering new password", + "missing": false, + "obsolete": false + }, + "no_connection": { + "translation": "Aucune connexion", + "defaultMessage": "No connection", + "description": "Warning that the user is offline.", + "missing": false, + "obsolete": false + }, + "no_contacts": { + "translation": "Vous n'avez pas de contacts :-(", + "defaultMessage": "You have no contacts :-(", + "description": "Shown in ContactsView when the user has no contacts", + "missing": false, + "obsolete": false + }, + "numeric_confirmation_code_prompt": { + "translation": "Nombres seulement", + "defaultMessage": "Numbers only", + "description": "Prompt for numeric conformation code", + "missing": false, + "obsolete": false + }, + "online_now": { + "translation": "en ligne", + "defaultMessage": "online now", + "description": "Indicator that the user or topic is currently online", + "missing": false, + "obsolete": false + }, + "password_prompt": { + "translation": "Mot de passe", + "defaultMessage": "Password", + "description": "Placeholder/prompt for entering password", + "missing": false, + "obsolete": false + }, + "password_unchanged_prompt": { + "translation": "Non changé", + "defaultMessage": "Unchanged", + "description": "Message in editor while password is unchanged", + "missing": false, + "obsolete": false + }, + "peers_messaging_disabled": { + "translation": "La messagerie point à point est désactivée.", + "defaultMessage": "Peer's messaging is disabled.", + "description": "Shown when the p2p peer's messaging is disabled", + "missing": false, + "obsolete": false + }, + "permission_admin": { + "translation": "Approver ({val})", + "defaultMessage": "Approve ({val})", + "description": "Name of A permission", + "missing": false, + "obsolete": false + }, + "permission_delete": { + "translation": "Supprimer ({val})", + "defaultMessage": "Delete ({val})", + "description": "Name of D permission", + "missing": false, + "obsolete": false + }, + "permission_join": { + "translation": "Rejoindre ({val})", + "defaultMessage": "Join ({val})", + "description": "Name of J permission", + "missing": false, + "obsolete": false + }, + "permission_owner": { + "translation": "Propriétaire ({val})", + "defaultMessage": "Owner ({val})", + "description": "Name of O permission", + "missing": false, + "obsolete": false + }, + "permission_pres": { + "translation": "Recevoir une notification ({val})", + "defaultMessage": "Get notified ({val})", + "description": "Name of P permission", + "missing": false, + "obsolete": false + }, + "permission_read": { + "translation": "Lire ({val})", + "defaultMessage": "Read ({val})", + "description": "Name of R permission", + "missing": false, + "obsolete": false + }, + "permission_share": { + "translation": "Partager ({val})", + "defaultMessage": "Share ({val})", + "description": "Name of S permission", + "missing": false, + "obsolete": false + }, + "permission_write": { + "translation": "Ecrire ({val})", + "defaultMessage": "Write ({val})", + "description": "Name of W permission", + "missing": false, + "obsolete": false + }, + "phone_dative": { + "translation": "téléphone", + "defaultMessage": "phone", + "description": "Dative case of 'phone', i.e. 'phone' in 'by phone'", + "missing": false, + "obsolete": false + }, + "private_editing_placeholder": { + "translation": "Visible par vous seulement", + "defaultMessage": "Visible to you only", + "description": "Placeholder for editing 'private'", + "missing": false, + "obsolete": false + }, + "push_init_failed": { + "translation": "Impossible d'initialiser les notifications push", + "defaultMessage": "Failed to initialize push notifications", + "description": "Error message when push notifications have failed to initialize.", + "missing": false, + "obsolete": false + }, + "reconnect_countdown": { + "translation": "Déconnecté. Reconnexion dans {seconds}…", + "defaultMessage": "Disconnected. Reconnecting in {seconds}…", + "description": "Message shown when an app update is available.", + "missing": false, + "obsolete": false + }, + "reconnect_now": { + "translation": "Essayer maintenant", + "defaultMessage": "Try now", + "description": "Prompt for reconnecting now", + "missing": false, + "obsolete": false + }, + "reload_update": { + "translation": "Recharger", + "defaultMessage": "Reload", + "description": "Call to action to reload application when update is available.", + "missing": false, + "obsolete": false + }, + "report_chat_warning": { + "translation": "Êtes-vous sûr de vouloir bloquer et signaler cette conversation ?", + "defaultMessage": "Are you sure you want to block and report this conversation?", + "description": "Alert dialog warning when reporting a conversation for abuse", + "missing": false, + "obsolete": false + }, + "requested_permissions": { + "translation": "Demandé", + "defaultMessage": "Requested", + "description": "Title for permissions", + "missing": false, + "obsolete": false + }, + "save_attachment": { + "translation": "sauvegarder", + "defaultMessage": "save", + "description": "Call to save an attachment", + "missing": false, + "obsolete": false + }, + "search_for_contacts": { + "translation": "Utilisez la recherche pour trouver des contacts", + "defaultMessage": "Use search to find contacts", + "description": "Text shown in contacts view when user entered no search query.", + "missing": false, + "obsolete": false + }, + "search_no_results": { + "translation": "La recherche n'a donné aucun résultat", + "defaultMessage": "Search returned no results", + "description": "Text shown in contacts view when query returned no results.", + "missing": false, + "obsolete": false + }, + "search_placeholder": { + "translation": "Liste comme email:alice@exemple.com, tel:17025550003...", + "defaultMessage": "List like email:alice@example.com, tel:17025550003...", + "description": "Placeholder in contacts search field", + "missing": false, + "obsolete": false + }, + "sidepanel_title_acc_notifications": { + "translation": "Notifications", + "defaultMessage": "Notifications", + "description": "Sidepanel title for AccNotificationsView.", + "missing": false, + "obsolete": false + }, + "sidepanel_title_acc_support": { + "translation": "Support", + "defaultMessage": "Support", + "description": "Sidepanel title for AccSupportView.", + "missing": false, + "obsolete": false + }, + "sidepanel_title_account_settings": { + "translation": "Paramètres du compte", + "defaultMessage": "Account Settings", + "description": "Sidepanel title for AccountSettingsView.", + "missing": false, + "obsolete": false + }, + "sidepanel_title_archive": { + "translation": "Conversations Archivées", + "defaultMessage": "Archived Chats", + "description": "Sidepanel title for ContactsView-Archive.", + "missing": false, + "obsolete": false + }, + "sidepanel_title_blocked": { + "translation": "Conversations Bloquées", + "defaultMessage": "Blocked Chats", + "description": "Sidepanel title for ContactsView-Blocked.", + "missing": false, + "obsolete": false + }, + "sidepanel_title_cred": { + "translation": "Confirmer les identifiants", + "defaultMessage": "Confirm Credentials", + "description": "Sidepanel title for ValidationView.", + "missing": false, + "obsolete": false + }, + "sidepanel_title_login": { + "translation": "Se Connecter", + "defaultMessage": "Sign In", + "description": "Sidepanel title for LoginView.", + "missing": false, + "obsolete": false + }, + "sidepanel_title_newtpk": { + "translation": "Démarrer une nouvelle Conversation", + "defaultMessage": "Start New Chat", + "description": "Sidepanel title for NewTopicView.", + "missing": false, + "obsolete": false + }, + "sidepanel_title_register": { + "translation": "Créer un compte", + "defaultMessage": "Create Account", + "description": "Sidepanel title for CreateAccountView.", + "missing": false, + "obsolete": false + }, + "sidepanel_title_reset": { + "translation": "Remettre à Zéro le Mot de Passe", + "defaultMessage": "Reset Password", + "description": "Sidepanel title for PasswordResetView.", + "missing": false, + "obsolete": false + }, + "sidepanel_title_settings": { + "translation": "Paramètres", + "defaultMessage": "Settings", + "description": "Sidepanel title for SettingsView.", + "missing": false, + "obsolete": false + }, + "stay_logged_in": { + "translation": "Rester connecté", + "defaultMessage": "Stay logged in", + "description": "Label for a checkbox", + "missing": false, + "obsolete": false + }, + "tabtitle_find_user": { + "translation": "trouver", + "defaultMessage": "find", + "description": "Tab title Find", + "missing": false, + "obsolete": false + }, + "tabtitle_group_by_id": { + "translation": "par identifiant", + "defaultMessage": "by id", + "description": "Tab title Find topic by ID", + "missing": false, + "obsolete": false + }, + "tabtitle_new_group": { + "translation": "nouveau groupe", + "defaultMessage": "new group", + "description": "Tab title New Group", + "missing": false, + "obsolete": false + }, + "tags_editor_no_tags": { + "translation": "Ajouter des étiquettes", + "defaultMessage": "Add some tags", + "description": "Tag editor prompt when no tags are found.", + "missing": false, + "obsolete": false + }, + "tags_not_found": { + "translation": "Aucune étiquette définie. Ajoutez en.", + "defaultMessage": "No tags defined. Add some.", + "description": "", + "missing": false, + "obsolete": false + }, + "title_all_contacts": { + "translation": "Tous les Contacts", + "defaultMessage": "All Contacts", + "description": "Section title [All Contacts]", + "missing": false, + "obsolete": false + }, + "title_group_members": { + "translation": "Membres du Groupe", + "defaultMessage": "Group Members", + "description": "Section title", + "missing": false, + "obsolete": false + }, + "title_manage_tags": { + "translation": "Gérer", + "defaultMessage": "Manage", + "description": "Section title for the list of tags", + "missing": false, + "obsolete": false + }, + "title_not_found": { + "translation": "Pas trouvé", + "defaultMessage": "Not found", + "description": "Title shown when topic is not found", + "missing": false, + "obsolete": false + }, + "title_permissions": { + "translation": "Permissions", + "defaultMessage": "Permissions", + "description": "Section title", + "missing": false, + "obsolete": false + }, + "title_tag_manager": { + "translation": "Etiquettes (recherche & découverte)", + "defaultMessage": "Tags (search & discovery)", + "description": "Section title for TagManager", + "missing": false, + "obsolete": false + }, + "topic_block_warning": { + "translation": "Êtes-vous sûr de vouloir bloquer cette conversation ?", + "defaultMessage": "Are you sure you want to block this conversation?", + "description": "Alert warning when blocking a topic.", + "missing": false, + "obsolete": false + }, + "topic_delete_warning": { + "translation": "Êtes-vous sûr de vouloir supprimer cette conversation ?", + "defaultMessage": "Are you sure you want to delete this conversation? It cannot be undone.", + "description": "Alert warning when deleting entire topic", + "missing": false, + "obsolete": false + }, + "topic_name_editing_placeholder": { + "translation": "Nom libre du groupe", + "defaultMessage": "Freeform name of the group", + "description": "Prompt for entering topic name", + "missing": false, + "obsolete": false + }, + "unnamed_topic": { + "translation": "Non nommé", + "defaultMessage": "Unnamed", + "description": "Title shown when the topic has no name", + "missing": false, + "obsolete": false + }, + "update_available": { + "translation": "Mise à jour disponible.", + "defaultMessage": "Update available.", + "description": "Message shown when an app update is available.", + "missing": false, + "obsolete": false + }, + "upload_finishing": { + "translation": "fin...", + "defaultMessage": "finishing...", + "description": "Notification that upload is finishing", + "missing": false, + "obsolete": false + }, + "user_not_found": { + "translation": "Pas trouvé", + "defaultMessage": "Not found", + "description": "In place of a user's full name when the user is not found.", + "missing": false, + "obsolete": false + }, + "validate_credential_action": { + "translation": "confirmer", + "defaultMessage": "confirm", + "description": "Validate credentail call to action", + "missing": false, + "obsolete": false + }, + "description_editing_placeholder": { + "translation": "Description facultative", + "defaultMessage": "Description (optional)", + "description": "Placeholder for editing topic description", + "missing": false, + "obsolete": false + }, + "label_description": { + "translation": "Description", + "defaultMessage": "Description", + "description": "Label for editing topic description", + "missing": false, + "obsolete": false + }, + "button_security": { + "translation": "Sécurité", + "defaultMessage": "Security", + "description": "Navigaton button for security panel.", + "missing": false, + "obsolete": false + }, + "panel_title_crop": { + "translation": "Déplacez pour ajuster", + "defaultMessage": "Drag to Adjust", + "description": "Title for AvatarCropView.", + "missing": false, + "obsolete": false + }, + "panel_title_general": { + "translation": "Général", + "defaultMessage": "General", + "description": "Title for TopicCommon.", + "missing": false, + "obsolete": false + }, + "panel_title_members": { + "translation": "Membres", + "defaultMessage": "Members", + "description": "Title for managing group members view.", + "missing": false, + "obsolete": false + }, + "panel_title_security": { + "translation": "Sécurité", + "defaultMessage": "Security", + "description": "Title for TopicSecirity and AccSecurity.", + "missing": false, + "obsolete": false + }, + "panel_title_info": { + "translation": "Informations", + "defaultMessage": "Info", + "description": "Title for InfoView", + "missing": false, + "obsolete": false + }, + "permissions_anonymous": { + "translation": "Anonyme", + "defaultMessage": "Anonymous", + "description": "Title for editing default anonymous permissions", + "missing": false, + "obsolete": false + }, + "permissions_authenticated": { + "translation": "Authentifié", + "defaultMessage": "Authenticated", + "description": "Title for editing default authenticated permissions", + "missing": false, + "obsolete": false + }, + "topic_delete": { + "translation": "Supprimer la Conversation", + "defaultMessage": "Delete Conversation", + "description": "Alert title when deleting the topic.", + "missing": false, + "obsolete": false + }, + "permissions_user": { + "translation": "Permissions d'Utilisateur", + "defaultMessage": "User's Permissions", + "description": "Title for editing user's permissions", + "missing": false, + "obsolete": false + }, + "password_reset_email_sent": { + "translation": "Un email a été envoyé à {email}. Suivez les instructions du mail pour remettre à zéro votre mot de passe.", + "defaultMessage": "An email has been sent to {email}. Follow the directions in the email to reset your password.", + "description": "Notification that the email with password reset instructions has been sent", + "missing": false, + "obsolete": false + }, + "label_unarchive_topic": { + "translation": "Archivé:", + "defaultMessage": "Archived:", + "description": "Label for unarchiving the topic", + "missing": false, + "obsolete": false + }, + "menu_item_forward": { + "translation": "Transférer", + "defaultMessage": "Forward", + "description": "Forward message", + "missing": false, + "obsolete": false + }, + "forward_to": { + "translation": "Transférer à", + "defaultMessage": "Forward to", + "missing": false, + "obsolete": false + }, + "forward_to_search_placeholder": { + "translation": "Rechercher des contacts", + "defaultMessage": "Search contacts", + "description": "Contact search prompt when forwarding a message.", + "missing": false, + "obsolete": false + }, + "label_new_password": { + "translation": "Nouveau mot de passe", + "defaultMessage": "New password", + "description": "Label for entering a new password", + "missing": false, + "obsolete": false + }, + "drafty_unknown": { + "translation": "Non supporté", + "defaultMessage": "Unsupported", + "description": "Unsupported entity in drafty", + "missing": false, + "obsolete": false + }, + "already_in_call": { + "translation": "", + "defaultMessage": "You already in an ongoing call!", + "description": "Error message when the user tried to accept a new call without finishing pervious one", + "missing": true, + "obsolete": false + }, + "call_cancelled": { + "translation": "", + "defaultMessage": "cancelled", + "description": "Label for cancelled outgoing call", + "missing": true, + "obsolete": false + }, + "call_declined": { + "translation": "", + "defaultMessage": "declined", + "description": "Label for declined incoming call", + "missing": true, + "obsolete": false + }, + "call_missed": { + "translation": "", + "defaultMessage": "missed", + "description": "Label for missed incoming call", + "missing": true, + "obsolete": false + }, + "calls_incoming": { + "translation": "", + "defaultMessage": "Incoming call", + "description": "Incoming call label", + "missing": true, + "obsolete": false + }, + "calls_outgoing": { + "translation": "", + "defaultMessage": "Outgoing call", + "description": "Outgoing call label", + "missing": true, + "obsolete": false + }, + "calls_you_label": { + "translation": "", + "defaultMessage": "You", + "description": "Shown over the local video screen", + "missing": true, + "obsolete": false + }, + "menu_item_video_call": { + "translation": "", + "defaultMessage": "Video call", + "description": "Start video call", + "missing": true, + "obsolete": false + } +} diff --git a/src/messages.json b/src/messages.json index 496e274a..adfb0d64 100644 --- a/src/messages.json +++ b/src/messages.json @@ -1 +1 @@ -{"de":{"action_block_contact":"Kontakt blockieren","action_cancel":"Abbrechen","action_clear_messages":"Nachrichten leeren","action_delete_messages":"Nachrichten für alle löschen","action_leave_chat":"Unterhaltung verlassen","action_report_chat":"Unterhaltung melden","archived_contacts":"Archivierte Kontakte ({count})","badge_danger":"Verdächtig","badge_owner":"Besitzer","badge_staff":"Verwaltung","badge_verified":"Verifiziert","badge_you":"Sie","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","blocked_contacts_link":"Blockierte Kontakte ({count})","button_add_another":"Hinzufügen","button_add_members":"Mitglieder hinzufügen","button_cancel":"Abbrechen","button_confirm":"Bestätigen","button_create":"Erstellen","button_delete_account":"Konto löschen","button_edit":"Bearbeiten","button_logout":"Abmelden","button_ok":"OK","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","button_sign_in":"Anmelden","button_sign_up":"Anmelden","button_subscribe":"Abbonieren","button_update":"Aktualisieren","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","channel":"Sender","channel_prompt":"Dies ist ein Sender","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_block":"Blockieren","chat_invitation_ignore":"Ignorieren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","code_doesnot_match":"Code stimmt nicht überein","contacts_not_found":"Sie haben keine Unterhaltungen
¯∖_(ツ)_/¯","contacts_not_found_short":"Keine Kontakte für ''{query}''","credential_email_prompt":"E-Mail Adresse für Registrierung","delete_account":"Konto löschen","delete_account_warning":"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","deleted_content":"Inhalt gelöscht","download_action":"herunterladen","drafty_attachment":"Dateianhang","drafty_form":"Formular:","drafty_image":"Bild","email_dative":"E-Mail","email_prompt":"E-Mail, z.B. lisam@beispiel.de","enable_peers_messaging":"Aktivieren","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","error_invalid_id":"ungültige ID","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","forgot_password_link":"Passwort vergessen?","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","granted_permissions":"Erteilt","group_has_no_members":"Keine Mitglieder","group_user_id_prompt":"Gruppe oder Benutzer ID","image_caption_prompt":"Bildunterschrift","invalid_content":"ungültiger Inhalt","invalid_security_token":"Ungültiger Sicherheitsschlüssel","label_client":"Client:","label_content_type":"Inhaltsart:","label_default_access_mode":"Standard Zugriffsmodus:","label_file_name":"Dateiname:","label_group_members":"Gruppenmitglieder:","label_incognito_mode":"inkognito-Modus:","label_message_sound":"Benachrichtigungston:","label_muting_topic":"Stumm geschaltet:","label_other_user":"Andere","label_password":"Passwort","label_permissions":"Berechtigungen:","label_private":"Privater Kommentar","label_push_notifications":"Benachrichtigungsmeldungen:","label_push_notifications_disabled":"Benachrichtigungsmeldungen (erfordert HTTPS):","label_reset_password":"Passwort per E-Mail wiederherstellen:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server Adresse:","label_server_to_use":"Server verwenden:","label_size":"Größe:","label_topic_name":"Name","label_user_contacts":"Kontakte:","label_user_id":"ID:","label_wire_transport":"Übertragung per Kabel:","label_you":"Sie:","label_your_name":"Ihr Name","label_your_permissions":"Ihre Berechtigungen:","last_seen_timestamp":"Zuletzt gesehen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","link_contact_us":"Kontakt","link_privacy_policy":"Datenschutzerklärung","link_terms_of_service":"Nutzungsbedingungen","login_prompt":"Anmelden","menu_item_archive_topic":"Archivieren","menu_item_block":"Blockieren","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_delete_topic":"Entfernen","menu_item_edit_permissions":"Berechtigungen ändern","menu_item_info":"Info","menu_item_member_delete":"Entfernen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_restore_topic":"Wiederherstellen","menu_item_send_retry":"Wiederholen","menu_item_unblock":"Blockierung aufheben","menu_item_unmute":"Stumm schalten beenden","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","more_online_members":"+{overflow} mehr","new_message_prompt":"Neue Nachricht","new_password_placeholder":"Geben Sie ein neues Passwort ein","no_connection":"Keine Verbindung","no_contacts":"Sie haben keine Kontakte :-(","numeric_confirmation_code_prompt":"Nur zahlen","online_now":"jetzt online","password_prompt":"Passwort","password_unchanged_prompt":"unverändert","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","permission_admin":"Bestätigen ({val})","permission_delete":"Entfernen ({val})","permission_join":"Beitreten ({val})","permission_owner":"Besitzer ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_read":"Lesen ({val})","permission_share":"Teilen ({val})","permission_write":"Schreiben ({val})","phone_dative":"Telefon","private_editing_placeholder":"Nur für Sie sichtbar","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","reload_update":"Neu laden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","requested_permissions":"Angefordert","save_attachment":"Speichern","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_login":"Anmelden","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_register":"Konto erstellen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_settings":"Einstellungen","stay_logged_in":"Angemeldet bleiben","tabtitle_find_user":"Suchen","tabtitle_group_by_id":"nach ID","tabtitle_new_group":"Neue Gruppe","tags_editor_no_tags":"Schlagworte hinzufügen","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","title_all_contacts":"Alle Kontakte","title_group_members":"Gruppenmitglieder","panel_title_info":"Info","title_manage_tags":"Verwalten","title_not_found":"Nicht gefunden","title_permissions":"Berechtigungen","title_tag_manager":"Schlagworte (Nutzer entdecken)","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","topic_name_editing_placeholder":"Freiform Name der Gruppe","unnamed_topic":"Unbenannt","update_available":"Aktualisierung verfügbar.","upload_finishing":"wird abgeschlossen...","user_not_found":"Nicht gefunden","validate_credential_action":"bestätigen","description_editing_placeholder":"Beschreibung (optional)","label_description":"Beschreibung","button_security":"Sicherheit","panel_title_general":"Allgemein","panel_title_security":"Sicherheit","panel_title_crop":"Zum Anpassen ziehen","panel_title_members":"Mitglieder","permissions_anonymous":"Anonym","permissions_authenticated":"Authentifiziert","topic_delete":"Chat löschen","permissions_user":"Benutzerberechtigungen","password_reset_email_sent":"Eine E-Mail wurde an {email} gesendet. Folgen Sie den Anweisungen in der E-Mail, um Ihr Passwort zurückzusetzen.","label_unarchive_topic":"Archiviert:","menu_item_reply":"Antwort","menu_item_forward":"Nach vorne","forward_to":"Weiterleiten","forward_to_search_placeholder":"Kontakte durchsuchen","label_new_password":"Neues Kennwort","drafty_unknown":"Nicht unterstützt","calls_incoming":"Eingehender Anruf","calls_outgoing":"Ausgehender Anruf","calls_you_label":"Du","menu_item_video_call":"Videoanruf","already_in_call":"Du redest schon!","call_cancelled":"abgebrochen","call_missed":"verpasster","call_declined":"abgelehnt"},"en":{"action_block_contact":"Block Contact","action_cancel":"cancel","action_clear_messages":"Clear Messages","action_delete_messages":"Clear Messages for All","action_leave_chat":"Leave Conversation","action_report_chat":"Report Conversation","archived_contacts":"Archived contacts ({count})","badge_danger":"Untrustworthy","badge_owner":"owner","badge_staff":"Staff-managed","badge_verified":"Verified/official","badge_you":"you","block_contact_warning":"Are you sure you want to block this contact?","blocked_contacts_link":"Blocked contacts ({count})","button_add_another":"Add another","button_add_members":"Add members","button_cancel":"Cancel","button_confirm":"Confirm","button_create":"Create","button_delete_account":"Delete account","button_edit":"Edit","button_logout":"Logout","button_ok":"OK","button_reset":"Reset","button_send_request":"Send request","button_sign_in":"Sign in","button_sign_up":"Sign up","button_subscribe":"Subscribe","button_update":"Update","cannot_initiate_file_upload":"Cannot initiate file upload.","channel":"channel","channel_prompt":"This is a channel","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_block":"Block","chat_invitation_ignore":"Ignore","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","code_doesnot_match":"Code does not match","contacts_not_found":"You have no chats
¯∖_(ツ)_/¯","contacts_not_found_short":"No contacts match ''{query}''","credential_email_prompt":"Your registration email","delete_account":"Delete account","delete_account_warning":"Are you sure you want to delete your account? It cannot be undone.","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","deleted_content":"content deleted","download_action":"download","drafty_attachment":"Attachment","drafty_form":"Form:","drafty_image":"Picture","email_dative":"email","email_prompt":"Email, e.g. jdoe@example.com","enable_peers_messaging":"Enable","enter_confirmation_code_prompt":"Enter confirmation code sent to you by {method}:","error_invalid_id":"Invalid ID","file_attachment_too_large":"The file size {size} exceeds the {limit} limit.","forgot_password_link":"Forgot password?","full_name_prompt":"Full name, e.g. John Doe","granted_permissions":"Granted","group_has_no_members":"No members","group_user_id_prompt":"Group or User ID","image_caption_prompt":"Image caption","invalid_content":"invalid content","invalid_security_token":"Invalid security token","label_client":"Client:","label_content_type":"Content type:","label_default_access_mode":"Default access mode:","label_file_name":"File name:","label_group_members":"Group members:","label_incognito_mode":"Incognito mode:","label_message_sound":"Message sound:","label_muting_topic":"Muted:","label_other_user":"Other","label_password":"Password","label_permissions":"Permissions:","label_private":"Private comment","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_reset_password":"Send a password reset email:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server address:","label_server_to_use":"Server to use:","label_size":"Size:","label_topic_name":"Name","label_user_contacts":"Contacts:","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"You:","label_your_name":"Your name","label_your_permissions":"Your permissions:","last_seen_timestamp":"Last seen","leave_chat_warning":"Are you sure you want to leave this conversation?","link_contact_us":"Contact Us","link_privacy_policy":"Privacy Policy","link_terms_of_service":"Terms of Service","login_prompt":"Login","menu_item_archive_topic":"Archive","menu_item_block":"Block","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_delete_topic":"Delete","menu_item_edit_permissions":"Edit permissions","menu_item_info":"Info","menu_item_member_delete":"Remove","menu_item_mute":"Mute","menu_item_reply":"Reply","menu_item_restore_topic":"Restore","menu_item_send_retry":"Retry","menu_item_unblock":"Unblock","menu_item_unmute":"Unmute","message_sending":"sending...","message_sending_failed":"failed","messages_not_readable":"no access to messages","messaging_disabled_prompt":"Messaging disabled","more_online_members":"+{overflow} more","new_message_prompt":"New message","new_password_placeholder":"Enter new password","no_connection":"No connection","no_contacts":"You have no contacts :-(","numeric_confirmation_code_prompt":"Numbers only","online_now":"online now","password_prompt":"Password","password_unchanged_prompt":"Unchanged","peers_messaging_disabled":"Peer's messaging is disabled.","permission_admin":"Approve ({val})","permission_delete":"Delete ({val})","permission_join":"Join ({val})","permission_owner":"Owner ({val})","permission_pres":"Get notified ({val})","permission_read":"Read ({val})","permission_share":"Share ({val})","permission_write":"Write ({val})","phone_dative":"phone","private_editing_placeholder":"Visible to you only","push_init_failed":"Failed to initialize push notifications","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","reload_update":"Reload","report_chat_warning":"Are you sure you want to block and report this conversation?","requested_permissions":"Requested","save_attachment":"save","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","search_placeholder":"List like email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Account Settings","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_login":"Sign In","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_register":"Create Account","sidepanel_title_reset":"Reset Password","sidepanel_title_settings":"Settings","stay_logged_in":"Stay logged in","tabtitle_find_user":"find","tabtitle_group_by_id":"by id","tabtitle_new_group":"new group","tags_editor_no_tags":"Add some tags","tags_not_found":"No tags defined. Add some.","title_all_contacts":"All Contacts","title_group_members":"Group Members","title_manage_tags":"Manage","title_not_found":"Not found","title_permissions":"Permissions","title_tag_manager":"Tags (search & discovery)","topic_block_warning":"Are you sure you want to block this conversation?","topic_delete_warning":"Are you sure you want to delete this conversation?","topic_name_editing_placeholder":"Freeform name of the group","unnamed_topic":"Unnamed","update_available":"Update available.","upload_finishing":"finishing...","user_not_found":"Not found","validate_credential_action":"confirm","description_editing_placeholder":"Optional description","label_description":"Description","button_security":"Security","panel_title_crop":"Drag to Adjust","panel_title_general":"General","panel_title_members":"Members","panel_title_security":"Security","panel_title_info":"Info","permissions_anonymous":"Anonymous","permissions_authenticated":"Authenticated","topic_delete":"Delete Conversation","permissions_user":"User's Permissions","password_reset_email_sent":"An email has been sent to {email}. Follow the directions in the email to reset your password.","label_unarchive_topic":"Archived:","menu_item_forward":"Forward","forward_to":"Forward to","forward_to_search_placeholder":"Search contacts","label_new_password":"New password","drafty_unknown":"Unsupported","calls_incoming":"Incoming call","calls_outgoing":"Outgoing call","calls_you_label":"You","menu_item_video_call":"Video call","already_in_call":"You already in an ongoing call!","call_cancelled":"cancelled","call_missed":"missed","call_declined":"declined"},"es":{"action_block_contact":"Bloquear contacto","action_cancel":"cancelar","action_clear_messages":"Borrar mensajes","action_delete_messages":"Borrar mensajes para todos","action_leave_chat":"Dejar conversación","action_report_chat":"Reportar conversación","archived_contacts":"Contactos archivados ({count})","badge_danger":"Suspicaz","badge_owner":"propietario","badge_staff":"Administración","badge_verified":"Verificado","badge_you":"tú","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","blocked_contacts_link":"Contactos bloqueados ({count})","button_add_another":"Añadir contacto","button_add_members":"Añadir miembros","button_cancel":"Cancelar","button_confirm":"Confirmar","button_create":"Crear","button_delete_account":"Eliminar cuenta","button_edit":"Editar","button_logout":"Cerrar sesión","button_ok":"OK","button_reset":"Restablecer","button_send_request":"Enviar petición","button_sign_in":"Entrar","button_sign_up":"Regístrate","button_subscribe":"Suscribirse","button_update":"Actualizar","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","channel":"canal","channel_prompt":"Este es un canal","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_block":"Bloquear","chat_invitation_ignore":"Ignorar","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","code_doesnot_match":"El código no coincide","contacts_not_found":"No tienes chats
¯∖_(ツ)_/¯","contacts_not_found_short":"Ningún contacto coincide con ''{query}''","credential_email_prompt":"Tu correo electrónico de registro","delete_account":"Eliminar cuenta","delete_account_warning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","deleted_content":"este mensaje fue eliminado","download_action":"descargar","drafty_attachment":"Archivo","drafty_form":"Formulario:","drafty_image":"Imagen","email_dative":"correo electrónico","email_prompt":"Correo electrónico, p.ej. juan@example.com","enable_peers_messaging":"Habilitar","enter_confirmation_code_prompt":"Introduzca el código de confirmación enviado a tu {method}:","error_invalid_id":"ID inválido","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","forgot_password_link":"¿Olvidaste tu contraseña?","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","granted_permissions":"Otorgados","group_has_no_members":"No hay miembros","group_user_id_prompt":"ID del grupo o usuario","image_caption_prompt":"Añade un comentario","invalid_content":"contenido inválido","invalid_security_token":"Token de seguridad inválido","label_client":"Cliente:","label_content_type":"Tipo de contenido:","label_default_access_mode":"Modo de acceso predeterminado:","label_file_name":"Nombre del archivo:","label_group_members":"Miembros del grupo:","label_incognito_mode":"Modo incógnito:","label_message_sound":"Sonido de mensaje:","label_muting_topic":"Silenciado:","label_other_user":"Otros","label_password":"Contraseña","label_permissions":"Permisos:","label_private":"Comentario privado","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","label_sdk":"SDK:","label_server":"Servidor:","label_server_address":"Dirección del servidor:","label_server_to_use":"Servidor para usar:","label_size":"Tamaño:","label_topic_name":"Nombre del tema","label_user_contacts":"Contactos:","label_user_id":"ID:","label_wire_transport":"Transporte de alambre:","label_you":"Tú:","label_your_name":"Tu nombre","label_your_permissions":"Tus permisos:","last_seen_timestamp":"Últ. vez","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","link_contact_us":"Contáctanos","link_privacy_policy":"Política de privacidad","link_terms_of_service":"Términos de uso","login_prompt":"Nombre de usuario","menu_item_archive_topic":"Archivar","menu_item_block":"Bloquear","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_delete_topic":"Eliminar","menu_item_edit_permissions":"Editar permisos","menu_item_info":"Información","menu_item_member_delete":"Eliminar","menu_item_mute":"Silenciar","menu_item_restore_topic":"Restaurar","menu_item_send_retry":"Inténtalo de nuevo","menu_item_unblock":"Desbloquear","menu_item_unmute":"Anular el silencio","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","messages_not_readable":"sin acceso a mensajes","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","more_online_members":"+{overflow} más","new_message_prompt":"Nuevo mensaje","new_password_placeholder":"Introduzca una nueva contraseña","no_connection":"Sin conexión","no_contacts":"No tienes contactos :-(","numeric_confirmation_code_prompt":"Sólo números","online_now":"en línea","password_prompt":"Contraseña","password_unchanged_prompt":"Sin cambios","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","permission_admin":"Approbar ({val})","permission_delete":"Eliminar ({val})","permission_join":"Unirse ({val})","permission_owner":"Propietario ({val})","permission_pres":"Ser notificado ({val})","permission_read":"Leer ({val})","permission_share":"Compartir ({val})","permission_write":"Escribir ({val})","phone_dative":"teléfono","private_editing_placeholder":"Sólo visible para tí","push_init_failed":"Error al inicializar las notificaciones push","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","reload_update":"Recargar","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","requested_permissions":"Solicitados","save_attachment":"guardar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_login":"Iniciar sesión","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_register":"Crear cuenta","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_settings":"Ajustes","stay_logged_in":"Permanecer conectado","tabtitle_find_user":"encontrar","tabtitle_group_by_id":"por ID","tabtitle_new_group":"nuevo grupo","tags_editor_no_tags":"Añadir etiquetas","tags_not_found":"No hay etiquetas definidas. Añade unas.","title_all_contacts":"Todos los contactos","title_group_members":"Miembros del grupo","title_manage_tags":"Gestionar","title_not_found":"No encontrado","title_permissions":"Permisos","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","topic_name_editing_placeholder":"Nombre del grupo","unnamed_topic":"Sin nombre","update_available":"Actualización disponible.","upload_finishing":"terminando...","user_not_found":"Usuario no encontrado","validate_credential_action":"confirmar","description_editing_placeholder":"Descripción (opcional)","label_description":"Descripción","button_security":"Seguridad","panel_title_crop":"Arrastra para ajustar","panel_title_general":"General","panel_title_members":"Miembros","panel_title_security":"Seguridad","panel_title_info":"Información","permissions_anonymous":"Anónimo","permissions_authenticated":"Autenticado","topic_delete":"Eliminar chat","permissions_user":"Permisos del usuario","password_reset_email_sent":"Se ha enviado un correo electrónico a {email}. Siga las instrucciones del correo electrónico para restablecer su contraseña.","label_unarchive_topic":"Archivado:","menu_item_reply":"Respuesta","menu_item_forward":"Reenviar","forward_to":"Reenviar a","forward_to_search_placeholder":"Buscar contactos","label_new_password":"Nueva contraseña","drafty_unknown":"No soportado","calls_incoming":"Llamada entrante","calls_outgoing":"Llamada saliente","calls_you_label":"Tú","menu_item_video_call":"Videollamada","already_in_call":"¡Ya estás hablando!","call_cancelled":"cancelada","call_missed":"perdida","call_declined":"rechazada"},"ko":{"action_block_contact":"연락차단","action_cancel":"취소","action_clear_messages":"메시지지우기","action_delete_messages":"모든메시지지우기","action_leave_chat":"대화나누기","action_report_chat":"대화기록","archived_contacts":"보관된연락처({수})","badge_danger":"의심 많은","badge_owner":"소유자","badge_staff":"직원 관리하에","badge_verified":"확인 됨","badge_you":"당신","block_contact_warning":"이연락처를차단하시겠습니까?","blocked_contacts_link":"차단된연락처({수})","button_add_another":"다른항목추가","button_add_members":"회원추가","button_cancel":"취소","button_confirm":"확인","button_create":"작성","button_delete_account":"계정삭제","button_edit":"편집","button_logout":"로그아웃","button_ok":"OK","button_reset":"재설정","button_send_request":"요청보내기","button_sign_in":"로그인","button_sign_up":"가입","button_subscribe":"구독","button_update":"업데이트","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","channel":"채널","channel_prompt":"이 채널입니다","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_block":"차단","chat_invitation_ignore":"무시","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","code_doesnot_match":"코드가일치하지않습니다","contacts_not_found":"채팅이없습니다
¯∖_(ツ)_/¯","contacts_not_found_short":"'{문의}'와일치하는연락처가없습니다.","credential_email_prompt":"등록이메일","delete_account":"계정삭제","delete_account_warning":"계정을삭제하시겠습니까?실행취소할수없습니다.","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","deleted_content":"내용이 삭제되었습니다","download_action":"다운로드","drafty_attachment":"부착","drafty_form":"형태:","drafty_image":"이미지","email_dative":"이메일","email_prompt":"이메일(예:hong@example.com)","enable_peers_messaging":"활성화","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","error_invalid_id":"잘못된ID","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","forgot_password_link":"비밀번호를잊으셨습니까?","full_name_prompt":"전체이름(예:홍길동)","granted_permissions":"승낙하다","group_has_no_members":"회원없음","group_user_id_prompt":"그룹또는사용자ID","image_caption_prompt":"이미지설명","invalid_content":"잘못된내용","invalid_security_token":"유효하지않은보안토큰","label_client":"클라이언트: ","label_content_type":"컨텐츠유형: ","label_default_access_mode":"기본액세스모드: ","label_file_name":"파일이름: ","label_group_members":"그룹회원: ","label_incognito_mode":"시크릿모드: ","label_message_sound":"메시지소리: ","label_muting_topic":"음소거: ","label_other_user":"기타","label_password":"비밀번호","label_permissions":"권한: ","label_private":"개인코멘트","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_reset_password":"비밀번호재설정이메일보내기: ","label_sdk":"SDK:","label_server":"서버: ","label_server_address":"서버주소: ","label_server_to_use":"사용할서버:","label_size":"크기: ","label_topic_name":"이름","label_user_contacts":"연락처: ","label_user_id":"ID:","label_wire_transport":"와이어수송:","label_you":"당신: ","label_your_name":"이름","label_your_permissions":"권한: ","last_seen_timestamp":"마지막으로본","leave_chat_warning":"이대화를나가시겠습니까?","link_contact_us":"문의처","link_privacy_policy":"개인정보보호정책","link_terms_of_service":"서비스약관","login_prompt":"로그인","menu_item_archive_topic":"보관","menu_item_block":"차단","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_delete_topic":"삭제","menu_item_edit_permissions":"편집권한","menu_item_info":"정보","menu_item_member_delete":"제거","menu_item_mute":"음소거","menu_item_restore_topic":"복원","menu_item_send_retry":"다시시도","menu_item_unblock":"차단해제","menu_item_unmute":"음소거해제","message_sending":"보내기...","message_sending_failed":"실패","messages_not_readable":"메시지에 액세스 할 수 없습니다","messaging_disabled_prompt":"메시지비활성화","more_online_members":"+{넘침}더보기","new_message_prompt":"새메시지","new_password_placeholder":"새비밀번호입력","no_connection":"연결없음","no_contacts":"연락처가없습니다 (._.)","numeric_confirmation_code_prompt":"숫자만","online_now":"현재접속중","password_prompt":"비밀번호","password_unchanged_prompt":"변경되지않음","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","permission_admin":"승인({val})","permission_delete":"삭제({val})","permission_join":"참여({val})","permission_owner":"소유자({val})","permission_pres":"알림받기({val})","permission_read":"읽기({val})","permission_share":"공유({val})","permission_write":"쓰기({val})","phone_dative":"전화","private_editing_placeholder":"나만볼수있습니다","push_init_failed":"푸시알림을초기화하지못했습니다","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","reload_update":"재로드","report_chat_warning":"이대화를차단하고기록하시겠습니까?","requested_permissions":"요청","save_attachment":"저장","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_account_settings":"계정설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","sidepanel_title_cred":"자격증명확인","sidepanel_title_login":"로그인","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_register":"계정만들기","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_settings":"설정","stay_logged_in":"로그인상태유지","tabtitle_find_user":"찾기","tabtitle_group_by_id":"id로","tabtitle_new_group":"새그룹","tags_editor_no_tags":"일부태그추가","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","title_all_contacts":"모든연락처","title_group_members":"그룹구성원","title_manage_tags":"관리","title_not_found":"찾을수없음","title_permissions":"권한","title_tag_manager":"태그(사용자검색)","topic_block_warning":"이대화를차단하시겠습니까?","topic_delete_warning":"이대화를삭제하시겠습니까?","topic_name_editing_placeholder":"그룹의자유형이름","unnamed_topic":"이름없는","update_available":"업데이트가능.","upload_finishing":"마무리...","user_not_found":"찾을수없음","validate_credential_action":"확인","description_editing_placeholder":"설명(선택 사항)","label_description":"설명","button_security":"보안","panel_title_crop":"드래그하여 조정","panel_title_general":"일반","panel_title_members":"구성원","panel_title_security":"보안","panel_title_info":"정보","permissions_anonymous":"익명","permissions_authenticated":"인증됨","topic_delete":"채팅 삭제","permissions_user":"사용자 권한","password_reset_email_sent":"이메일이 {email}(으)로 전송되었습니다. 이메일의 지침에 따라 비밀번호를 재설정하세요.","label_unarchive_topic":"보관됨:","menu_item_reply":"회신하다","menu_item_forward":"리디렉션","forward_to":"메시지를 리디렉션","forward_to_search_placeholder":"연락처 검색","label_new_password":"새 비밀번호","drafty_unknown":"지원되지 않음","calls_incoming":"수신 전화","calls_outgoing":"발신 전화","calls_you_label":"너","menu_item_video_call":"영상 통화","already_in_call":"당신은 이미 말하고 있습니다!","call_cancelled":"취소 된","call_missed":"부재중","call_declined":"통화 거부"},"ro":{"action_block_contact":"Blochează contact","action_cancel":"anulează","action_clear_messages":"Șterge mesajele","action_delete_messages":"Șterge toate mesajele","action_leave_chat":"Ieși din conversație","action_report_chat":"Raportează conversația","archived_contacts":"Contacte arhivate ({count})","badge_danger":"Suspicios","badge_owner":"owner","badge_staff":"Administrare","badge_verified":"Verificat","badge_you":"tu","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","blocked_contacts_link":"Contact blocate ({count})","button_add_another":"Adaugă","button_add_members":"Adaugă persoane","button_cancel":"Anulează","button_confirm":"Confirmă","button_create":"Creează","button_delete_account":"Șterge cont","button_edit":"Editează","button_logout":"Deconectare","button_ok":"OK","button_reset":"Resetează","button_send_request":"Trimite cerere","button_sign_in":"Conectează-te","button_sign_up":"Creează cont","button_subscribe":"Subscribe","button_update":"Actualizează","cannot_initiate_file_upload":"Nu se poate face încărcarea.","channel":"canal","channel_prompt":"Acesta este un canal","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_block":"Blochează","chat_invitation_ignore":"Ignoră","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","code_doesnot_match":"Codul furnizat nu este valid","contacts_not_found":"Nu ai contacte salvate
¯∖_(ツ)_/¯","contacts_not_found_short":"Niciun contact găsit după criteriile ''{query}''","credential_email_prompt":"Adresa de e-mail","delete_account":"Șterge contul","delete_account_warning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","deleted_content":"conținut șters","download_action":"download","drafty_attachment":"Atasament","drafty_form":"Formă:","drafty_image":"Imagine","email_dative":"email","email_prompt":"Adresa de e-mail","enable_peers_messaging":"Activează","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","error_invalid_id":"ID Invalid","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","forgot_password_link":"Ți-ai uitat parola?","full_name_prompt":"Numele tău","granted_permissions":"Oferite","group_has_no_members":"În acest grup nu se află persoane","group_user_id_prompt":"Grup sau user ID","image_caption_prompt":"Titlul imaginii","invalid_content":"conținut invalid","invalid_security_token":"Codul de securitate este invalid","label_client":"Client:","label_content_type":"Tip conținut:","label_default_access_mode":"Default access mode:","label_file_name":"Nume fișier:","label_group_members":"Membrii grupului:","label_incognito_mode":"Mod incognito:","label_message_sound":"Sunet de mesaj:","label_muting_topic":"Mod silențios (muted):","label_other_user":"Altele","label_password":"Parola","label_permissions":"Permisiuni:","label_private":"Comentariu privat","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_reset_password":"Resetează parola:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Adresa serverului:","label_server_to_use":"Server de utilizat:","label_size":"Size:","label_topic_name":"Nume","label_user_contacts":"Contacte:","label_user_id":"ID:","label_wire_transport":"Transportul legat:","label_you":"Tu:","label_your_name":"Numele tău","label_your_permissions":"Permisiuniile tale:","last_seen_timestamp":"Văzut ultima dată","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","link_contact_us":"Contactează-ne","link_privacy_policy":"Politica de Confidențialitate","link_terms_of_service":"Termenii Serviciului","login_prompt":"Conectează-te","menu_item_archive_topic":"Arhivează","menu_item_block":"Blochează","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_delete_topic":"Șterge","menu_item_edit_permissions":"Editează permisiuni","menu_item_info":"Info","menu_item_member_delete":"Șterge persoană","menu_item_mute":"Mute","menu_item_restore_topic":"Restabili","menu_item_send_retry":"Reîncearcă","menu_item_unblock":"Deblochează","menu_item_unmute":"Unmute","message_sending":"se trimite...","message_sending_failed":"eroare","messages_not_readable":"Mesajele nu pot fi citite","messaging_disabled_prompt":"Mesageria este dezactivată","more_online_members":"+{overflow} mai mult","new_message_prompt":"Mesaj nou","new_password_placeholder":"Introdu parolă","no_connection":"Nu există conexiune","no_contacts":"Nu ai contacte adăugate :-(","numeric_confirmation_code_prompt":"Doar cifre","online_now":"online acum","password_prompt":"Parola","password_unchanged_prompt":"Neschimbată","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","permission_admin":"Aprobare ({val})","permission_delete":"Ștergere ({val})","permission_join":"Participare ({val})","permission_owner":"Deținător ({val})","permission_pres":"Notificare ({val})","permission_read":"Citire ({val})","permission_share":"Distribuire ({val})","permission_write":"Scriere ({val})","phone_dative":"telefon","private_editing_placeholder":"Vizibil doar ție","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","reload_update":"Reîncarcă","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","requested_permissions":"Necesare","save_attachment":"salvează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","search_placeholder":"Caută după e-mail sau număr telefon...","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_login":"Conectează-te","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_register":"Creează Cont","sidepanel_title_reset":"Resetează Parola","sidepanel_title_settings":"Setări","stay_logged_in":"Rămâi conectat","tabtitle_find_user":"caută","tabtitle_group_by_id":"după id","tabtitle_new_group":"grup nou","tags_editor_no_tags":"Adaugă tag-uri","tags_not_found":"Niciun tag definit. Adaugă.","title_all_contacts":"Toate Contactele","title_group_members":"Persoanele din grup","title_manage_tags":"Administrează","title_not_found":"Nu a fost găsit","title_permissions":"Permisiuni","title_tag_manager":"Tag-uri (user discovery)","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","topic_name_editing_placeholder":"Numele grupului","unnamed_topic":"Nedenumit","update_available":"Actualizare disponibilă.","upload_finishing":"se încarcă...","user_not_found":"Utilizatorul nu a fost găsit","validate_credential_action":"confirmă","description_editing_placeholder":"Descriere (opțional)","label_description":"Descriere","button_security":"Securitate","panel_title_crop":"Trageți pentru a ajusta","panel_title_general":"Generale","panel_title_members":"Membri","panel_title_security":"Securitate","panel_title_info":"Info","permissions_anonymous":"Anonim","permissions_authenticated":"Autentificat","topic_delete":"Ștergeți Chat","permissions_user":"Permisiunile utilizatorului","password_reset_email_sent":"Un e-mail a fost trimis către {email}. Urmați instrucțiunile din e-mail pentru a vă reseta parola.","label_unarchive_topic":"Arhivat:","menu_item_reply":"A raspunde","menu_item_forward":"Redirecţiona","forward_to":"Redirecționați către","forward_to_search_placeholder":"Căutați contacte","label_new_password":"Parolă Nouă","drafty_unknown":"Neacceptat","calls_incoming":"Apel primit","calls_outgoing":"Apel efectuat","calls_you_label":"Tu","menu_item_video_call":"Apel video","already_in_call":"Deja vorbesti!","call_cancelled":"anulat","call_missed":"pierdut","call_declined":"refuzat"},"ru":{"action_block_contact":"Заблокировать контакт","action_cancel":"отменить","action_clear_messages":"Удалить сообщения","action_delete_messages":"Удалить сообщения","action_leave_chat":"Уйти из чата","action_report_chat":"Сообщить о нарушении","archived_contacts":"Чаты в архиве ({count})","badge_danger":"Подозрительный","badge_owner":"влад.","badge_staff":"Администрация","badge_verified":"Верифицированный","badge_you":"вы","block_contact_warning":"Вы действительно заблокировать этот контакт?","blocked_contacts_link":"Заблокированные ({count})","button_add_another":"Добавить","button_add_members":"Добавить","button_cancel":"Отменить","button_confirm":"Подтвердить","button_create":"Создать","button_delete_account":"Удалить аккаунт","button_edit":"Редактировать","button_logout":"Выйти","button_ok":"OK","button_reset":"Изменить","button_send_request":"Отправить","button_sign_in":"Войти","button_sign_up":"Создать аккаунт","button_subscribe":"Подписаться","button_update":"Применить","cannot_initiate_file_upload":"Ошибка загрузки файла.","channel":"канал","channel_prompt":"Создать канал","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_block":"Заблокировать","chat_invitation_ignore":"Игнорировать","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","code_doesnot_match":"Код не совпадает","contacts_not_found":"Чатов нет
¯∖_(ツ)_/¯","contacts_not_found_short":"Нет контактов для запроса ''{query}''","credential_email_prompt":"Регистрационный емейл","delete_account":"Удалить аккаунт","delete_account_warning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","deleted_content":"удалено","download_action":"скачать","drafty_attachment":"Аттачмент","drafty_form":"Форма:","drafty_image":"Картинка","email_dative":"емейлу","email_prompt":"Email, напр. ivan@example.com","enable_peers_messaging":"Разблокировать.","enter_confirmation_code_prompt":"Код подтверждения, полученный по {method}:","error_invalid_id":"Неверный ID","file_attachment_too_large":"Размер файла {size} превышает {limit} лимит.","forgot_password_link":"Напомнить пароль","full_name_prompt":"Полное имя, напр. Иван Петров","granted_permissions":"Получены","group_has_no_members":"Нет участников","group_user_id_prompt":"ID чата или пользователя","image_caption_prompt":"Подпись к фото","invalid_content":"сообщение не читается","invalid_security_token":"Токен некорректен","label_client":"Клиент:","label_content_type":"Тип:","label_default_access_mode":"Доступ по умолчанию:","label_file_name":"Имя файла:","label_group_members":"Участники чата:","label_incognito_mode":"Режим инкогнито:","label_message_sound":"Звук нового сообщения:","label_muting_topic":"Без уведомлений","label_other_user":"Второй","label_password":"Пароль","label_permissions":"Права доступа:","label_private":"Комментарий","label_push_notifications":"Уведомления:","label_push_notifications_disabled":"Уведомления (требуют HTTPS):","label_reset_password":"Отправить емейл для смены пароля:","label_sdk":"SDK:","label_server":"Сервер:","label_server_address":"Адрес сервера:","label_server_to_use":"Использовать сервер:","label_size":"Размер:","label_topic_name":"Название","label_user_contacts":"Конакты:","label_user_id":"ID:","label_wire_transport":"Соединение:","label_you":"Вы:","label_your_name":"Ваше имя","label_your_permissions":"Ваши права доступа:","last_seen_timestamp":"Был активен","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","link_contact_us":"Связаться с нами","link_privacy_policy":"Политика конфиденциальности","link_terms_of_service":"Условия сервиса","login_prompt":"Логин","menu_item_archive_topic":"В архив","menu_item_block":"Заблокировать","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_delete_topic":"Удалить чат","menu_item_edit_permissions":"Права доступа","menu_item_info":"Информация","menu_item_member_delete":"Отписать","menu_item_mute":"Не уведомлять","menu_item_restore_topic":"Разархивировать","menu_item_send_retry":"Отправить заново","menu_item_unblock":"Разблокировать","menu_item_unmute":"Уведомлять","message_sending":"в пути...","message_sending_failed":"ошибка","messages_not_readable":"нет доступа к сообщениям","messaging_disabled_prompt":"Отправка недоступна","more_online_members":"+еще {overflow}","new_message_prompt":"Новое сообщение","new_password_placeholder":"Введите новый пароль","no_connection":"Нет связи","no_contacts":"Ничего нет :-(","numeric_confirmation_code_prompt":"Только цифры","online_now":"онлайн","password_prompt":"Пароль","password_unchanged_prompt":"Не изменен","peers_messaging_disabled":"Чат заблокирован у корреспондента.","permission_admin":"Подтверждать ({val})","permission_delete":"Удалять ({val})","permission_join":"Подписываться ({val})","permission_owner":"Владелец ({val})","permission_pres":"Уведомлять ({val})","permission_read":"Читать ({val})","permission_share":"Приглашать ({val})","permission_write":"Писать ({val})","phone_dative":"телефону","private_editing_placeholder":"Виден только вам","push_init_failed":"Ошибка инициализации пуш уведомлений","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","reload_update":"Обновить","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","requested_permissions":"Требуются","save_attachment":"сохранить","search_for_contacts":"Поиск контактов","search_no_results":"Ничего не найдено","search_placeholder":"Список, напр. email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","sidepanel_title_account_settings":"Настройки аккаунта","sidepanel_title_archive":"Архив чатов","sidepanel_title_blocked":"Заблокированные чаты","sidepanel_title_cred":"Подтвердить","sidepanel_title_login":"Авторизация","sidepanel_title_newtpk":"Новый чат","sidepanel_title_register":"Зарегистрироваться","sidepanel_title_reset":"Сменить пароль","sidepanel_title_settings":"Настройки","stay_logged_in":"Запомнить","tabtitle_find_user":"найти","tabtitle_group_by_id":"по id","tabtitle_new_group":"создать","tags_editor_no_tags":"Добавьте теги","tags_not_found":"Тегов нет. Добавьте","title_all_contacts":"Все контакты","title_group_members":"Участники","title_manage_tags":"Редактировать","title_not_found":"Не найден","title_permissions":"Права доступа","title_tag_manager":"Теги для поиска","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_name_editing_placeholder":"Название чата","unnamed_topic":"Без названия","update_available":"Есть новая версия приложения.","upload_finishing":"завершение...","user_not_found":"Не найден","validate_credential_action":"подтвердить","description_editing_placeholder":"Описание (не обязательно)","label_description":"Описание","button_security":"Безопасность","panel_title_crop":"Обрезать картинку","panel_title_general":"Общие настройки","panel_title_members":"Участники","panel_title_security":"Безопасность","panel_title_info":"Подробности","permissions_anonymous":"Анонимный","permissions_authenticated":"Авторизованный","topic_delete":"Удалить чат","permissions_user":"Права доступа","password_reset_email_sent":"Сообщение было отправлено на адрес {email}. Следуйте инструкциям в сообщении, чтобы изменить пароль.","label_unarchive_topic":"Архивирован:","menu_item_reply":"Ответить","menu_item_forward":"Переслать","forward_to":"Переслать","forward_to_search_placeholder":"Поиск контактов","label_new_password":"Новый пароль","drafty_unknown":"Не поддерживается","calls_incoming":"Входящий звонок","calls_outgoing":"Исходящий звонок","calls_you_label":"Вы","menu_item_video_call":"Видеозвонок","already_in_call":"Вы уже звоните кому-то!","call_cancelled":"отменен","call_missed":"пропущен","call_declined":"отклонен"},"zh-TW":{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_another":"新增其他人","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話
¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 ''{query}'' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","deleted_content":"內容已被刪除","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人:","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","validate_credential_action":"確認","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"一封電子郵件已發送至 {email}。按照電子郵件中的說明重置密碼。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒"},"zh":{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_another":"加上另一个","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话
¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配''{query}''","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","deleted_content":"内容已删除","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"蓦然访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来:","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后可见","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"成员间消息已禁用。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索返回任何结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","validate_credential_action":"确认","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"一封电子邮件已发送至 {email}。按照电子邮件中的说明重置密码。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒"}} \ No newline at end of file +{"de":{"action_block_contact":"Kontakt blockieren","action_cancel":"Abbrechen","action_clear_messages":"Nachrichten leeren","action_delete_messages":"Nachrichten für alle löschen","action_leave_chat":"Unterhaltung verlassen","action_report_chat":"Unterhaltung melden","archived_contacts":"Archivierte Kontakte ({count})","badge_danger":"Verdächtig","badge_owner":"Besitzer","badge_staff":"Verwaltung","badge_verified":"Verifiziert","badge_you":"Sie","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","blocked_contacts_link":"Blockierte Kontakte ({count})","button_add_another":"Hinzufügen","button_add_members":"Mitglieder hinzufügen","button_cancel":"Abbrechen","button_confirm":"Bestätigen","button_create":"Erstellen","button_delete_account":"Konto löschen","button_edit":"Bearbeiten","button_logout":"Abmelden","button_ok":"OK","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","button_sign_in":"Anmelden","button_sign_up":"Anmelden","button_subscribe":"Abbonieren","button_update":"Aktualisieren","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","channel":"Sender","channel_prompt":"Dies ist ein Sender","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_block":"Blockieren","chat_invitation_ignore":"Ignorieren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","code_doesnot_match":"Code stimmt nicht überein","contacts_not_found":"Sie haben keine Unterhaltungen
¯∖_(ツ)_/¯","contacts_not_found_short":"Keine Kontakte für ''{query}''","credential_email_prompt":"E-Mail Adresse für Registrierung","delete_account":"Konto löschen","delete_account_warning":"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","deleted_content":"Inhalt gelöscht","download_action":"herunterladen","drafty_attachment":"Dateianhang","drafty_form":"Formular:","drafty_image":"Bild","email_dative":"E-Mail","email_prompt":"E-Mail, z.B. lisam@beispiel.de","enable_peers_messaging":"Aktivieren","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","error_invalid_id":"ungültige ID","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","forgot_password_link":"Passwort vergessen?","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","granted_permissions":"Erteilt","group_has_no_members":"Keine Mitglieder","group_user_id_prompt":"Gruppe oder Benutzer ID","image_caption_prompt":"Bildunterschrift","invalid_content":"ungültiger Inhalt","invalid_security_token":"Ungültiger Sicherheitsschlüssel","label_client":"Client:","label_content_type":"Inhaltsart:","label_default_access_mode":"Standard Zugriffsmodus:","label_file_name":"Dateiname:","label_group_members":"Gruppenmitglieder:","label_incognito_mode":"inkognito-Modus:","label_message_sound":"Benachrichtigungston:","label_muting_topic":"Stumm geschaltet:","label_other_user":"Andere","label_password":"Passwort","label_permissions":"Berechtigungen:","label_private":"Privater Kommentar","label_push_notifications":"Benachrichtigungsmeldungen:","label_push_notifications_disabled":"Benachrichtigungsmeldungen (erfordert HTTPS):","label_reset_password":"Passwort per E-Mail wiederherstellen:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server Adresse:","label_server_to_use":"Server verwenden:","label_size":"Größe:","label_topic_name":"Name","label_user_contacts":"Kontakte:","label_user_id":"ID:","label_wire_transport":"Übertragung per Kabel:","label_you":"Sie:","label_your_name":"Ihr Name","label_your_permissions":"Ihre Berechtigungen:","last_seen_timestamp":"Zuletzt gesehen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","link_contact_us":"Kontakt","link_privacy_policy":"Datenschutzerklärung","link_terms_of_service":"Nutzungsbedingungen","login_prompt":"Anmelden","menu_item_archive_topic":"Archivieren","menu_item_block":"Blockieren","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_delete_topic":"Entfernen","menu_item_edit_permissions":"Berechtigungen ändern","menu_item_info":"Info","menu_item_member_delete":"Entfernen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_restore_topic":"Wiederherstellen","menu_item_send_retry":"Wiederholen","menu_item_unblock":"Blockierung aufheben","menu_item_unmute":"Stumm schalten beenden","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","more_online_members":"+{overflow} mehr","new_message_prompt":"Neue Nachricht","new_password_placeholder":"Geben Sie ein neues Passwort ein","no_connection":"Keine Verbindung","no_contacts":"Sie haben keine Kontakte :-(","numeric_confirmation_code_prompt":"Nur zahlen","online_now":"jetzt online","password_prompt":"Passwort","password_unchanged_prompt":"unverändert","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","permission_admin":"Bestätigen ({val})","permission_delete":"Entfernen ({val})","permission_join":"Beitreten ({val})","permission_owner":"Besitzer ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_read":"Lesen ({val})","permission_share":"Teilen ({val})","permission_write":"Schreiben ({val})","phone_dative":"Telefon","private_editing_placeholder":"Nur für Sie sichtbar","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","reload_update":"Neu laden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","requested_permissions":"Angefordert","save_attachment":"Speichern","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_login":"Anmelden","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_register":"Konto erstellen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_settings":"Einstellungen","stay_logged_in":"Angemeldet bleiben","tabtitle_find_user":"Suchen","tabtitle_group_by_id":"nach ID","tabtitle_new_group":"Neue Gruppe","tags_editor_no_tags":"Schlagworte hinzufügen","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","title_all_contacts":"Alle Kontakte","title_group_members":"Gruppenmitglieder","panel_title_info":"Info","title_manage_tags":"Verwalten","title_not_found":"Nicht gefunden","title_permissions":"Berechtigungen","title_tag_manager":"Schlagworte (Nutzer entdecken)","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","topic_name_editing_placeholder":"Freiform Name der Gruppe","unnamed_topic":"Unbenannt","update_available":"Aktualisierung verfügbar.","upload_finishing":"wird abgeschlossen...","user_not_found":"Nicht gefunden","validate_credential_action":"bestätigen","description_editing_placeholder":"Beschreibung (optional)","label_description":"Beschreibung","button_security":"Sicherheit","panel_title_general":"Allgemein","panel_title_security":"Sicherheit","panel_title_crop":"Zum Anpassen ziehen","panel_title_members":"Mitglieder","permissions_anonymous":"Anonym","permissions_authenticated":"Authentifiziert","topic_delete":"Chat löschen","permissions_user":"Benutzerberechtigungen","password_reset_email_sent":"Eine E-Mail wurde an {email} gesendet. Folgen Sie den Anweisungen in der E-Mail, um Ihr Passwort zurückzusetzen.","label_unarchive_topic":"Archiviert:","menu_item_reply":"Antwort","menu_item_forward":"Nach vorne","forward_to":"Weiterleiten","forward_to_search_placeholder":"Kontakte durchsuchen","label_new_password":"Neues Kennwort","drafty_unknown":"Nicht unterstützt","calls_incoming":"Eingehender Anruf","calls_outgoing":"Ausgehender Anruf","calls_you_label":"Du","menu_item_video_call":"Videoanruf","already_in_call":"Du redest schon!","call_cancelled":"abgebrochen","call_missed":"verpasster","call_declined":"abgelehnt"},"en":{"action_block_contact":"Block Contact","action_cancel":"cancel","action_clear_messages":"Clear Messages","action_delete_messages":"Clear Messages for All","action_leave_chat":"Leave Conversation","action_report_chat":"Report Conversation","archived_contacts":"Archived contacts ({count})","badge_danger":"Untrustworthy","badge_owner":"owner","badge_staff":"Staff-managed","badge_verified":"Verified/official","badge_you":"you","block_contact_warning":"Are you sure you want to block this contact?","blocked_contacts_link":"Blocked contacts ({count})","button_add_another":"Add another","button_add_members":"Add members","button_cancel":"Cancel","button_confirm":"Confirm","button_create":"Create","button_delete_account":"Delete account","button_edit":"Edit","button_logout":"Logout","button_ok":"OK","button_reset":"Reset","button_send_request":"Send request","button_sign_in":"Sign in","button_sign_up":"Sign up","button_subscribe":"Subscribe","button_update":"Update","cannot_initiate_file_upload":"Cannot initiate file upload.","channel":"channel","channel_prompt":"This is a channel","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_block":"Block","chat_invitation_ignore":"Ignore","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","code_doesnot_match":"Code does not match","contacts_not_found":"You have no chats
¯∖_(ツ)_/¯","contacts_not_found_short":"No contacts match ''{query}''","credential_email_prompt":"Your registration email","delete_account":"Delete account","delete_account_warning":"Are you sure you want to delete your account? It cannot be undone.","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","deleted_content":"content deleted","download_action":"download","drafty_attachment":"Attachment","drafty_form":"Form:","drafty_image":"Picture","email_dative":"email","email_prompt":"Email, e.g. jdoe@example.com","enable_peers_messaging":"Enable","enter_confirmation_code_prompt":"Enter confirmation code sent to you by {method}:","error_invalid_id":"Invalid ID","file_attachment_too_large":"The file size {size} exceeds the {limit} limit.","forgot_password_link":"Forgot password?","full_name_prompt":"Full name, e.g. John Doe","granted_permissions":"Granted","group_has_no_members":"No members","group_user_id_prompt":"Group or User ID","image_caption_prompt":"Image caption","invalid_content":"invalid content","invalid_security_token":"Invalid security token","label_client":"Client:","label_content_type":"Content type:","label_default_access_mode":"Default access mode:","label_file_name":"File name:","label_group_members":"Group members:","label_incognito_mode":"Incognito mode:","label_message_sound":"Message sound:","label_muting_topic":"Muted:","label_other_user":"Other","label_password":"Password","label_permissions":"Permissions:","label_private":"Private comment","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_reset_password":"Send a password reset email:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server address:","label_server_to_use":"Server to use:","label_size":"Size:","label_topic_name":"Name","label_user_contacts":"Contacts:","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"You:","label_your_name":"Your name","label_your_permissions":"Your permissions:","last_seen_timestamp":"Last seen","leave_chat_warning":"Are you sure you want to leave this conversation?","link_contact_us":"Contact Us","link_privacy_policy":"Privacy Policy","link_terms_of_service":"Terms of Service","login_prompt":"Login","menu_item_archive_topic":"Archive","menu_item_block":"Block","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_delete_topic":"Delete","menu_item_edit_permissions":"Edit permissions","menu_item_info":"Info","menu_item_member_delete":"Remove","menu_item_mute":"Mute","menu_item_reply":"Reply","menu_item_restore_topic":"Restore","menu_item_send_retry":"Retry","menu_item_unblock":"Unblock","menu_item_unmute":"Unmute","message_sending":"sending...","message_sending_failed":"failed","messages_not_readable":"no access to messages","messaging_disabled_prompt":"Messaging disabled","more_online_members":"+{overflow} more","new_message_prompt":"New message","new_password_placeholder":"Enter new password","no_connection":"No connection","no_contacts":"You have no contacts :-(","numeric_confirmation_code_prompt":"Numbers only","online_now":"online now","password_prompt":"Password","password_unchanged_prompt":"Unchanged","peers_messaging_disabled":"Peer's messaging is disabled.","permission_admin":"Approve ({val})","permission_delete":"Delete ({val})","permission_join":"Join ({val})","permission_owner":"Owner ({val})","permission_pres":"Get notified ({val})","permission_read":"Read ({val})","permission_share":"Share ({val})","permission_write":"Write ({val})","phone_dative":"phone","private_editing_placeholder":"Visible to you only","push_init_failed":"Failed to initialize push notifications","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","reload_update":"Reload","report_chat_warning":"Are you sure you want to block and report this conversation?","requested_permissions":"Requested","save_attachment":"save","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","search_placeholder":"List like email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Account Settings","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_login":"Sign In","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_register":"Create Account","sidepanel_title_reset":"Reset Password","sidepanel_title_settings":"Settings","stay_logged_in":"Stay logged in","tabtitle_find_user":"find","tabtitle_group_by_id":"by id","tabtitle_new_group":"new group","tags_editor_no_tags":"Add some tags","tags_not_found":"No tags defined. Add some.","title_all_contacts":"All Contacts","title_group_members":"Group Members","title_manage_tags":"Manage","title_not_found":"Not found","title_permissions":"Permissions","title_tag_manager":"Tags (search & discovery)","topic_block_warning":"Are you sure you want to block this conversation?","topic_delete_warning":"Are you sure you want to delete this conversation?","topic_name_editing_placeholder":"Freeform name of the group","unnamed_topic":"Unnamed","update_available":"Update available.","upload_finishing":"finishing...","user_not_found":"Not found","validate_credential_action":"confirm","description_editing_placeholder":"Optional description","label_description":"Description","button_security":"Security","panel_title_crop":"Drag to Adjust","panel_title_general":"General","panel_title_members":"Members","panel_title_security":"Security","panel_title_info":"Info","permissions_anonymous":"Anonymous","permissions_authenticated":"Authenticated","topic_delete":"Delete Conversation","permissions_user":"User's Permissions","password_reset_email_sent":"An email has been sent to {email}. Follow the directions in the email to reset your password.","label_unarchive_topic":"Archived:","menu_item_forward":"Forward","forward_to":"Forward to","forward_to_search_placeholder":"Search contacts","label_new_password":"New password","drafty_unknown":"Unsupported","calls_incoming":"Incoming call","calls_outgoing":"Outgoing call","calls_you_label":"You","menu_item_video_call":"Video call","already_in_call":"You already in an ongoing call!","call_cancelled":"cancelled","call_missed":"missed","call_declined":"declined"},"es":{"action_block_contact":"Bloquear contacto","action_cancel":"cancelar","action_clear_messages":"Borrar mensajes","action_delete_messages":"Borrar mensajes para todos","action_leave_chat":"Dejar conversación","action_report_chat":"Reportar conversación","archived_contacts":"Contactos archivados ({count})","badge_danger":"Suspicaz","badge_owner":"propietario","badge_staff":"Administración","badge_verified":"Verificado","badge_you":"tú","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","blocked_contacts_link":"Contactos bloqueados ({count})","button_add_another":"Añadir contacto","button_add_members":"Añadir miembros","button_cancel":"Cancelar","button_confirm":"Confirmar","button_create":"Crear","button_delete_account":"Eliminar cuenta","button_edit":"Editar","button_logout":"Cerrar sesión","button_ok":"OK","button_reset":"Restablecer","button_send_request":"Enviar petición","button_sign_in":"Entrar","button_sign_up":"Regístrate","button_subscribe":"Suscribirse","button_update":"Actualizar","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","channel":"canal","channel_prompt":"Este es un canal","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_block":"Bloquear","chat_invitation_ignore":"Ignorar","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","code_doesnot_match":"El código no coincide","contacts_not_found":"No tienes chats
¯∖_(ツ)_/¯","contacts_not_found_short":"Ningún contacto coincide con ''{query}''","credential_email_prompt":"Tu correo electrónico de registro","delete_account":"Eliminar cuenta","delete_account_warning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","deleted_content":"este mensaje fue eliminado","download_action":"descargar","drafty_attachment":"Archivo","drafty_form":"Formulario:","drafty_image":"Imagen","email_dative":"correo electrónico","email_prompt":"Correo electrónico, p.ej. juan@example.com","enable_peers_messaging":"Habilitar","enter_confirmation_code_prompt":"Introduzca el código de confirmación enviado a tu {method}:","error_invalid_id":"ID inválido","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","forgot_password_link":"¿Olvidaste tu contraseña?","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","granted_permissions":"Otorgados","group_has_no_members":"No hay miembros","group_user_id_prompt":"ID del grupo o usuario","image_caption_prompt":"Añade un comentario","invalid_content":"contenido inválido","invalid_security_token":"Token de seguridad inválido","label_client":"Cliente:","label_content_type":"Tipo de contenido:","label_default_access_mode":"Modo de acceso predeterminado:","label_file_name":"Nombre del archivo:","label_group_members":"Miembros del grupo:","label_incognito_mode":"Modo incógnito:","label_message_sound":"Sonido de mensaje:","label_muting_topic":"Silenciado:","label_other_user":"Otros","label_password":"Contraseña","label_permissions":"Permisos:","label_private":"Comentario privado","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","label_sdk":"SDK:","label_server":"Servidor:","label_server_address":"Dirección del servidor:","label_server_to_use":"Servidor para usar:","label_size":"Tamaño:","label_topic_name":"Nombre del tema","label_user_contacts":"Contactos:","label_user_id":"ID:","label_wire_transport":"Transporte de alambre:","label_you":"Tú:","label_your_name":"Tu nombre","label_your_permissions":"Tus permisos:","last_seen_timestamp":"Últ. vez","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","link_contact_us":"Contáctanos","link_privacy_policy":"Política de privacidad","link_terms_of_service":"Términos de uso","login_prompt":"Nombre de usuario","menu_item_archive_topic":"Archivar","menu_item_block":"Bloquear","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_delete_topic":"Eliminar","menu_item_edit_permissions":"Editar permisos","menu_item_info":"Información","menu_item_member_delete":"Eliminar","menu_item_mute":"Silenciar","menu_item_restore_topic":"Restaurar","menu_item_send_retry":"Inténtalo de nuevo","menu_item_unblock":"Desbloquear","menu_item_unmute":"Anular el silencio","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","messages_not_readable":"sin acceso a mensajes","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","more_online_members":"+{overflow} más","new_message_prompt":"Nuevo mensaje","new_password_placeholder":"Introduzca una nueva contraseña","no_connection":"Sin conexión","no_contacts":"No tienes contactos :-(","numeric_confirmation_code_prompt":"Sólo números","online_now":"en línea","password_prompt":"Contraseña","password_unchanged_prompt":"Sin cambios","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","permission_admin":"Approbar ({val})","permission_delete":"Eliminar ({val})","permission_join":"Unirse ({val})","permission_owner":"Propietario ({val})","permission_pres":"Ser notificado ({val})","permission_read":"Leer ({val})","permission_share":"Compartir ({val})","permission_write":"Escribir ({val})","phone_dative":"teléfono","private_editing_placeholder":"Sólo visible para tí","push_init_failed":"Error al inicializar las notificaciones push","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","reload_update":"Recargar","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","requested_permissions":"Solicitados","save_attachment":"guardar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_login":"Iniciar sesión","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_register":"Crear cuenta","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_settings":"Ajustes","stay_logged_in":"Permanecer conectado","tabtitle_find_user":"encontrar","tabtitle_group_by_id":"por ID","tabtitle_new_group":"nuevo grupo","tags_editor_no_tags":"Añadir etiquetas","tags_not_found":"No hay etiquetas definidas. Añade unas.","title_all_contacts":"Todos los contactos","title_group_members":"Miembros del grupo","title_manage_tags":"Gestionar","title_not_found":"No encontrado","title_permissions":"Permisos","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","topic_name_editing_placeholder":"Nombre del grupo","unnamed_topic":"Sin nombre","update_available":"Actualización disponible.","upload_finishing":"terminando...","user_not_found":"Usuario no encontrado","validate_credential_action":"confirmar","description_editing_placeholder":"Descripción (opcional)","label_description":"Descripción","button_security":"Seguridad","panel_title_crop":"Arrastra para ajustar","panel_title_general":"General","panel_title_members":"Miembros","panel_title_security":"Seguridad","panel_title_info":"Información","permissions_anonymous":"Anónimo","permissions_authenticated":"Autenticado","topic_delete":"Eliminar chat","permissions_user":"Permisos del usuario","password_reset_email_sent":"Se ha enviado un correo electrónico a {email}. Siga las instrucciones del correo electrónico para restablecer su contraseña.","label_unarchive_topic":"Archivado:","menu_item_reply":"Respuesta","menu_item_forward":"Reenviar","forward_to":"Reenviar a","forward_to_search_placeholder":"Buscar contactos","label_new_password":"Nueva contraseña","drafty_unknown":"No soportado","calls_incoming":"Llamada entrante","calls_outgoing":"Llamada saliente","calls_you_label":"Tú","menu_item_video_call":"Videollamada","already_in_call":"¡Ya estás hablando!","call_cancelled":"cancelada","call_missed":"perdida","call_declined":"rechazada"},"fr":{"action_block_contact":"Bloquer le Contact","action_cancel":"annuler","action_clear_messages":"Effacer les Messages","action_delete_messages":"Effacer les Messages pour Tous","action_leave_chat":"Quitter la Conversation","action_report_chat":"Signaler la Conversation","archived_contacts":"Contacts archivés ({count})","badge_danger":"Non fiable","badge_owner":"propriétaire","badge_staff":"Géré par le Staff","badge_verified":"Vérifié / Officiel","badge_you":"vous","block_contact_warning":"Êtes-vous sûr de bloquer le contact ?","blocked_contacts_link":"Contacts bloqués ({count})","button_add_another":"Ajouter un autre","button_add_members":"Ajouter des membres","button_cancel":"Annuler","button_confirm":"Confirmer","button_create":"Créer","button_delete_account":"Supprimer le compte","button_edit":"Modifier","button_logout":"Déconnexion","button_ok":"OK","button_reset":"Remettre à Zéro","button_send_request":"Envoyer une demande","button_sign_in":"Connexion","button_sign_up":"Créer un compte","button_subscribe":"S'abonner","button_update":"Mettre à jour","cannot_initiate_file_upload":"Impossible de démarrer l'envoi.","channel":"canal","channel_prompt":"C'est un canal","chat_invitation":"Vous êtes invité à démarrer une conversation. Que voulez vous faire ?","chat_invitation_accept":"Accepter","chat_invitation_block":"Bloquer","chat_invitation_ignore":"Ignorer","clear_messages_warning":"Êtes-vous sûr de vouloir effacer tous les messages ? Aucun retour possible.","code_doesnot_match":"Le code ne correspond pas","contacts_not_found":"Vous n'avez aucune conversation
¯∖_(ツ)_/¯","contacts_not_found_short":"Aucun contact ne correspond à ''{query}''","credential_email_prompt":"Votre email d'enregistrement","delete_account":"Supprimer le compte","delete_account_warning":"Êtes-vous sûr de vouloir supprimer votre compte ? Aucun retour possible.","delete_messages_warning":"Êtes-vous sûr de vouloir supprimer tous les messages pour tous ? Aucun retour possible.","deleted_content":"contenu supprimé","download_action":"télécharger","drafty_attachment":"Pièce(s) jointe(s)","drafty_form":"Formulaire:","drafty_image":"Image","email_dative":"email","email_prompt":"Email, par exemple jdoe@exemple.com","enable_peers_messaging":"Activer","enter_confirmation_code_prompt":"Entrez le code de confirmation envoyé par {method}:","error_invalid_id":"Identifiant invalide","file_attachment_too_large":"Le fichier de taille {size} dépasse la limite de {limit}.","forgot_password_link":"Mot de passe oublié ?","full_name_prompt":"Nom complet, par exemple John Doe","granted_permissions":"Accordé","group_has_no_members":"Aucun membre","group_user_id_prompt":"Identifiant d'utilisateur ou de groupe","image_caption_prompt":"Description de l'image","invalid_content":"contenu invalide","invalid_security_token":"Token de sécurité invalide","label_client":"Client :","label_content_type":"Type de contenu :","label_default_access_mode":"Mode d'accès par défaut :","label_file_name":"Nom du fichier :","label_group_members":"Membres du groupe :","label_incognito_mode":"Mode incognito :","label_message_sound":"Son du message :","label_muting_topic":"Mué :","label_other_user":"Autre","label_password":"Mot de passe","label_permissions":"Permissions :","label_private":"Commentaire privé","label_push_notifications":"Notifications :","label_push_notifications_disabled":"Notifications (requière HTTPS):","label_reset_password":"Envoyer un mail de remise à zéro de mot de passe :","label_sdk":"SDK :","label_server":"Serveur :","label_server_address":"Adresse du serveur :","label_server_to_use":"Serveur à utiliser :","label_size":"Taille :","label_topic_name":"Nom","label_user_contacts":"Contacts :","label_user_id":"ID :","label_wire_transport":"Transport par cable :","label_you":"Vous :","label_your_name":"Votre nom","label_your_permissions":"Vos permissions :","last_seen_timestamp":"Vu pour la dernière fois","leave_chat_warning":"Êtes-vous sûr de vouloir quitter cette conversation ?","link_contact_us":"Contactez Nous","link_privacy_policy":"Politique de confidentialité","link_terms_of_service":"Conditions d'utilisation","login_prompt":"Connexion","menu_item_archive_topic":"Archiver","menu_item_block":"Bloquer","menu_item_clear_messages":"Effacer les messages","menu_item_clear_messages_for_all":"Effacer pour Tous","menu_item_delete":"Supprimer","menu_item_delete_for_all":"Supprimer pour Tous","menu_item_delete_topic":"Supprimer","menu_item_edit_permissions":"Modifier les permissions","menu_item_info":"Informations","menu_item_member_delete":"Supprimer","menu_item_mute":"Rendre muer","menu_item_reply":"Répondre","menu_item_restore_topic":"Restorer","menu_item_send_retry":"Réessayer","menu_item_unblock":"Débloquer","menu_item_unmute":"Recevoir à nouveau","message_sending":"envoi en cours...","message_sending_failed":"échoué","messages_not_readable":"aucun accès aux messages","messaging_disabled_prompt":"Discussion désactivée","more_online_members":"+{overflow} de plus","new_message_prompt":"Nouveau message","new_password_placeholder":"Entrez un nouveau mot de passe","no_connection":"Aucune connexion","no_contacts":"Vous n'avez pas de contacts :-(","numeric_confirmation_code_prompt":"Nombres seulement","online_now":"en ligne","password_prompt":"Mot de passe","password_unchanged_prompt":"Non changé","peers_messaging_disabled":"La messagerie point à point est désactivée.","permission_admin":"Approver ({val})","permission_delete":"Supprimer ({val})","permission_join":"Rejoindre ({val})","permission_owner":"Propriétaire ({val})","permission_pres":"Recevoir une notification ({val})","permission_read":"Lire ({val})","permission_share":"Partager ({val})","permission_write":"Ecrire ({val})","phone_dative":"téléphone","private_editing_placeholder":"Visible par vous seulement","push_init_failed":"Impossible d'initialiser les notifications push","reconnect_countdown":"Déconnecté. Reconnexion dans {seconds}…","reconnect_now":"Essayer maintenant","reload_update":"Recharger","report_chat_warning":"Êtes-vous sûr de vouloir bloquer et signaler cette conversation ?","requested_permissions":"Demandé","save_attachment":"sauvegarder","search_for_contacts":"Utilisez la recherche pour trouver des contacts","search_no_results":"La recherche n'a donné aucun résultat","search_placeholder":"Liste comme email:alice@exemple.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Paramètres du compte","sidepanel_title_archive":"Conversations Archivées","sidepanel_title_blocked":"Conversations Bloquées","sidepanel_title_cred":"Confirmer les identifiants","sidepanel_title_login":"Se Connecter","sidepanel_title_newtpk":"Démarrer une nouvelle Conversation","sidepanel_title_register":"Créer un compte","sidepanel_title_reset":"Remettre à Zéro le Mot de Passe","sidepanel_title_settings":"Paramètres","stay_logged_in":"Rester connecté","tabtitle_find_user":"trouver","tabtitle_group_by_id":"par identifiant","tabtitle_new_group":"nouveau groupe","tags_editor_no_tags":"Ajouter des étiquettes","tags_not_found":"Aucune étiquette définie. Ajoutez en.","title_all_contacts":"Tous les Contacts","title_group_members":"Membres du Groupe","title_manage_tags":"Gérer","title_not_found":"Pas trouvé","title_permissions":"Permissions","title_tag_manager":"Etiquettes (recherche & découverte)","topic_block_warning":"Êtes-vous sûr de vouloir bloquer cette conversation ?","topic_delete_warning":"Êtes-vous sûr de vouloir supprimer cette conversation ?","topic_name_editing_placeholder":"Nom libre du groupe","unnamed_topic":"Non nommé","update_available":"Mise à jour disponible.","upload_finishing":"fin...","user_not_found":"Pas trouvé","validate_credential_action":"confirmer","description_editing_placeholder":"Description facultative","label_description":"Description","button_security":"Sécurité","panel_title_crop":"Déplacez pour ajuster","panel_title_general":"Général","panel_title_members":"Membres","panel_title_security":"Sécurité","panel_title_info":"Informations","permissions_anonymous":"Anonyme","permissions_authenticated":"Authentifié","topic_delete":"Supprimer la Conversation","permissions_user":"Permissions d'Utilisateur","password_reset_email_sent":"Un email a été envoyé à {email}. Suivez les instructions du mail pour remettre à zéro votre mot de passe.","label_unarchive_topic":"Archivé:","menu_item_forward":"Transférer","forward_to":"Transférer à","forward_to_search_placeholder":"Rechercher des contacts","label_new_password":"Nouveau mot de passe","drafty_unknown":"Non supporté"},"ko":{"action_block_contact":"연락차단","action_cancel":"취소","action_clear_messages":"메시지지우기","action_delete_messages":"모든메시지지우기","action_leave_chat":"대화나누기","action_report_chat":"대화기록","archived_contacts":"보관된연락처({수})","badge_danger":"의심 많은","badge_owner":"소유자","badge_staff":"직원 관리하에","badge_verified":"확인 됨","badge_you":"당신","block_contact_warning":"이연락처를차단하시겠습니까?","blocked_contacts_link":"차단된연락처({수})","button_add_another":"다른항목추가","button_add_members":"회원추가","button_cancel":"취소","button_confirm":"확인","button_create":"작성","button_delete_account":"계정삭제","button_edit":"편집","button_logout":"로그아웃","button_ok":"OK","button_reset":"재설정","button_send_request":"요청보내기","button_sign_in":"로그인","button_sign_up":"가입","button_subscribe":"구독","button_update":"업데이트","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","channel":"채널","channel_prompt":"이 채널입니다","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_block":"차단","chat_invitation_ignore":"무시","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","code_doesnot_match":"코드가일치하지않습니다","contacts_not_found":"채팅이없습니다
¯∖_(ツ)_/¯","contacts_not_found_short":"'{문의}'와일치하는연락처가없습니다.","credential_email_prompt":"등록이메일","delete_account":"계정삭제","delete_account_warning":"계정을삭제하시겠습니까?실행취소할수없습니다.","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","deleted_content":"내용이 삭제되었습니다","download_action":"다운로드","drafty_attachment":"부착","drafty_form":"형태:","drafty_image":"이미지","email_dative":"이메일","email_prompt":"이메일(예:hong@example.com)","enable_peers_messaging":"활성화","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","error_invalid_id":"잘못된ID","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","forgot_password_link":"비밀번호를잊으셨습니까?","full_name_prompt":"전체이름(예:홍길동)","granted_permissions":"승낙하다","group_has_no_members":"회원없음","group_user_id_prompt":"그룹또는사용자ID","image_caption_prompt":"이미지설명","invalid_content":"잘못된내용","invalid_security_token":"유효하지않은보안토큰","label_client":"클라이언트: ","label_content_type":"컨텐츠유형: ","label_default_access_mode":"기본액세스모드: ","label_file_name":"파일이름: ","label_group_members":"그룹회원: ","label_incognito_mode":"시크릿모드: ","label_message_sound":"메시지소리: ","label_muting_topic":"음소거: ","label_other_user":"기타","label_password":"비밀번호","label_permissions":"권한: ","label_private":"개인코멘트","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_reset_password":"비밀번호재설정이메일보내기: ","label_sdk":"SDK:","label_server":"서버: ","label_server_address":"서버주소: ","label_server_to_use":"사용할서버:","label_size":"크기: ","label_topic_name":"이름","label_user_contacts":"연락처: ","label_user_id":"ID:","label_wire_transport":"와이어수송:","label_you":"당신: ","label_your_name":"이름","label_your_permissions":"권한: ","last_seen_timestamp":"마지막으로본","leave_chat_warning":"이대화를나가시겠습니까?","link_contact_us":"문의처","link_privacy_policy":"개인정보보호정책","link_terms_of_service":"서비스약관","login_prompt":"로그인","menu_item_archive_topic":"보관","menu_item_block":"차단","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_delete_topic":"삭제","menu_item_edit_permissions":"편집권한","menu_item_info":"정보","menu_item_member_delete":"제거","menu_item_mute":"음소거","menu_item_restore_topic":"복원","menu_item_send_retry":"다시시도","menu_item_unblock":"차단해제","menu_item_unmute":"음소거해제","message_sending":"보내기...","message_sending_failed":"실패","messages_not_readable":"메시지에 액세스 할 수 없습니다","messaging_disabled_prompt":"메시지비활성화","more_online_members":"+{넘침}더보기","new_message_prompt":"새메시지","new_password_placeholder":"새비밀번호입력","no_connection":"연결없음","no_contacts":"연락처가없습니다 (._.)","numeric_confirmation_code_prompt":"숫자만","online_now":"현재접속중","password_prompt":"비밀번호","password_unchanged_prompt":"변경되지않음","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","permission_admin":"승인({val})","permission_delete":"삭제({val})","permission_join":"참여({val})","permission_owner":"소유자({val})","permission_pres":"알림받기({val})","permission_read":"읽기({val})","permission_share":"공유({val})","permission_write":"쓰기({val})","phone_dative":"전화","private_editing_placeholder":"나만볼수있습니다","push_init_failed":"푸시알림을초기화하지못했습니다","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","reload_update":"재로드","report_chat_warning":"이대화를차단하고기록하시겠습니까?","requested_permissions":"요청","save_attachment":"저장","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_account_settings":"계정설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","sidepanel_title_cred":"자격증명확인","sidepanel_title_login":"로그인","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_register":"계정만들기","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_settings":"설정","stay_logged_in":"로그인상태유지","tabtitle_find_user":"찾기","tabtitle_group_by_id":"id로","tabtitle_new_group":"새그룹","tags_editor_no_tags":"일부태그추가","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","title_all_contacts":"모든연락처","title_group_members":"그룹구성원","title_manage_tags":"관리","title_not_found":"찾을수없음","title_permissions":"권한","title_tag_manager":"태그(사용자검색)","topic_block_warning":"이대화를차단하시겠습니까?","topic_delete_warning":"이대화를삭제하시겠습니까?","topic_name_editing_placeholder":"그룹의자유형이름","unnamed_topic":"이름없는","update_available":"업데이트가능.","upload_finishing":"마무리...","user_not_found":"찾을수없음","validate_credential_action":"확인","description_editing_placeholder":"설명(선택 사항)","label_description":"설명","button_security":"보안","panel_title_crop":"드래그하여 조정","panel_title_general":"일반","panel_title_members":"구성원","panel_title_security":"보안","panel_title_info":"정보","permissions_anonymous":"익명","permissions_authenticated":"인증됨","topic_delete":"채팅 삭제","permissions_user":"사용자 권한","password_reset_email_sent":"이메일이 {email}(으)로 전송되었습니다. 이메일의 지침에 따라 비밀번호를 재설정하세요.","label_unarchive_topic":"보관됨:","menu_item_reply":"회신하다","menu_item_forward":"리디렉션","forward_to":"메시지를 리디렉션","forward_to_search_placeholder":"연락처 검색","label_new_password":"새 비밀번호","drafty_unknown":"지원되지 않음","calls_incoming":"수신 전화","calls_outgoing":"발신 전화","calls_you_label":"너","menu_item_video_call":"영상 통화","already_in_call":"당신은 이미 말하고 있습니다!","call_cancelled":"취소 된","call_missed":"부재중","call_declined":"통화 거부"},"ro":{"action_block_contact":"Blochează contact","action_cancel":"anulează","action_clear_messages":"Șterge mesajele","action_delete_messages":"Șterge toate mesajele","action_leave_chat":"Ieși din conversație","action_report_chat":"Raportează conversația","archived_contacts":"Contacte arhivate ({count})","badge_danger":"Suspicios","badge_owner":"owner","badge_staff":"Administrare","badge_verified":"Verificat","badge_you":"tu","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","blocked_contacts_link":"Contact blocate ({count})","button_add_another":"Adaugă","button_add_members":"Adaugă persoane","button_cancel":"Anulează","button_confirm":"Confirmă","button_create":"Creează","button_delete_account":"Șterge cont","button_edit":"Editează","button_logout":"Deconectare","button_ok":"OK","button_reset":"Resetează","button_send_request":"Trimite cerere","button_sign_in":"Conectează-te","button_sign_up":"Creează cont","button_subscribe":"Subscribe","button_update":"Actualizează","cannot_initiate_file_upload":"Nu se poate face încărcarea.","channel":"canal","channel_prompt":"Acesta este un canal","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_block":"Blochează","chat_invitation_ignore":"Ignoră","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","code_doesnot_match":"Codul furnizat nu este valid","contacts_not_found":"Nu ai contacte salvate
¯∖_(ツ)_/¯","contacts_not_found_short":"Niciun contact găsit după criteriile ''{query}''","credential_email_prompt":"Adresa de e-mail","delete_account":"Șterge contul","delete_account_warning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","deleted_content":"conținut șters","download_action":"download","drafty_attachment":"Atasament","drafty_form":"Formă:","drafty_image":"Imagine","email_dative":"email","email_prompt":"Adresa de e-mail","enable_peers_messaging":"Activează","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","error_invalid_id":"ID Invalid","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","forgot_password_link":"Ți-ai uitat parola?","full_name_prompt":"Numele tău","granted_permissions":"Oferite","group_has_no_members":"În acest grup nu se află persoane","group_user_id_prompt":"Grup sau user ID","image_caption_prompt":"Titlul imaginii","invalid_content":"conținut invalid","invalid_security_token":"Codul de securitate este invalid","label_client":"Client:","label_content_type":"Tip conținut:","label_default_access_mode":"Default access mode:","label_file_name":"Nume fișier:","label_group_members":"Membrii grupului:","label_incognito_mode":"Mod incognito:","label_message_sound":"Sunet de mesaj:","label_muting_topic":"Mod silențios (muted):","label_other_user":"Altele","label_password":"Parola","label_permissions":"Permisiuni:","label_private":"Comentariu privat","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_reset_password":"Resetează parola:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Adresa serverului:","label_server_to_use":"Server de utilizat:","label_size":"Size:","label_topic_name":"Nume","label_user_contacts":"Contacte:","label_user_id":"ID:","label_wire_transport":"Transportul legat:","label_you":"Tu:","label_your_name":"Numele tău","label_your_permissions":"Permisiuniile tale:","last_seen_timestamp":"Văzut ultima dată","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","link_contact_us":"Contactează-ne","link_privacy_policy":"Politica de Confidențialitate","link_terms_of_service":"Termenii Serviciului","login_prompt":"Conectează-te","menu_item_archive_topic":"Arhivează","menu_item_block":"Blochează","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_delete_topic":"Șterge","menu_item_edit_permissions":"Editează permisiuni","menu_item_info":"Info","menu_item_member_delete":"Șterge persoană","menu_item_mute":"Mute","menu_item_restore_topic":"Restabili","menu_item_send_retry":"Reîncearcă","menu_item_unblock":"Deblochează","menu_item_unmute":"Unmute","message_sending":"se trimite...","message_sending_failed":"eroare","messages_not_readable":"Mesajele nu pot fi citite","messaging_disabled_prompt":"Mesageria este dezactivată","more_online_members":"+{overflow} mai mult","new_message_prompt":"Mesaj nou","new_password_placeholder":"Introdu parolă","no_connection":"Nu există conexiune","no_contacts":"Nu ai contacte adăugate :-(","numeric_confirmation_code_prompt":"Doar cifre","online_now":"online acum","password_prompt":"Parola","password_unchanged_prompt":"Neschimbată","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","permission_admin":"Aprobare ({val})","permission_delete":"Ștergere ({val})","permission_join":"Participare ({val})","permission_owner":"Deținător ({val})","permission_pres":"Notificare ({val})","permission_read":"Citire ({val})","permission_share":"Distribuire ({val})","permission_write":"Scriere ({val})","phone_dative":"telefon","private_editing_placeholder":"Vizibil doar ție","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","reload_update":"Reîncarcă","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","requested_permissions":"Necesare","save_attachment":"salvează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","search_placeholder":"Caută după e-mail sau număr telefon...","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_login":"Conectează-te","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_register":"Creează Cont","sidepanel_title_reset":"Resetează Parola","sidepanel_title_settings":"Setări","stay_logged_in":"Rămâi conectat","tabtitle_find_user":"caută","tabtitle_group_by_id":"după id","tabtitle_new_group":"grup nou","tags_editor_no_tags":"Adaugă tag-uri","tags_not_found":"Niciun tag definit. Adaugă.","title_all_contacts":"Toate Contactele","title_group_members":"Persoanele din grup","title_manage_tags":"Administrează","title_not_found":"Nu a fost găsit","title_permissions":"Permisiuni","title_tag_manager":"Tag-uri (user discovery)","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","topic_name_editing_placeholder":"Numele grupului","unnamed_topic":"Nedenumit","update_available":"Actualizare disponibilă.","upload_finishing":"se încarcă...","user_not_found":"Utilizatorul nu a fost găsit","validate_credential_action":"confirmă","description_editing_placeholder":"Descriere (opțional)","label_description":"Descriere","button_security":"Securitate","panel_title_crop":"Trageți pentru a ajusta","panel_title_general":"Generale","panel_title_members":"Membri","panel_title_security":"Securitate","panel_title_info":"Info","permissions_anonymous":"Anonim","permissions_authenticated":"Autentificat","topic_delete":"Ștergeți Chat","permissions_user":"Permisiunile utilizatorului","password_reset_email_sent":"Un e-mail a fost trimis către {email}. Urmați instrucțiunile din e-mail pentru a vă reseta parola.","label_unarchive_topic":"Arhivat:","menu_item_reply":"A raspunde","menu_item_forward":"Redirecţiona","forward_to":"Redirecționați către","forward_to_search_placeholder":"Căutați contacte","label_new_password":"Parolă Nouă","drafty_unknown":"Neacceptat","calls_incoming":"Apel primit","calls_outgoing":"Apel efectuat","calls_you_label":"Tu","menu_item_video_call":"Apel video","already_in_call":"Deja vorbesti!","call_cancelled":"anulat","call_missed":"pierdut","call_declined":"refuzat"},"ru":{"action_block_contact":"Заблокировать контакт","action_cancel":"отменить","action_clear_messages":"Удалить сообщения","action_delete_messages":"Удалить сообщения","action_leave_chat":"Уйти из чата","action_report_chat":"Сообщить о нарушении","archived_contacts":"Чаты в архиве ({count})","badge_danger":"Подозрительный","badge_owner":"влад.","badge_staff":"Администрация","badge_verified":"Верифицированный","badge_you":"вы","block_contact_warning":"Вы действительно заблокировать этот контакт?","blocked_contacts_link":"Заблокированные ({count})","button_add_another":"Добавить","button_add_members":"Добавить","button_cancel":"Отменить","button_confirm":"Подтвердить","button_create":"Создать","button_delete_account":"Удалить аккаунт","button_edit":"Редактировать","button_logout":"Выйти","button_ok":"OK","button_reset":"Изменить","button_send_request":"Отправить","button_sign_in":"Войти","button_sign_up":"Создать аккаунт","button_subscribe":"Подписаться","button_update":"Применить","cannot_initiate_file_upload":"Ошибка загрузки файла.","channel":"канал","channel_prompt":"Создать канал","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_block":"Заблокировать","chat_invitation_ignore":"Игнорировать","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","code_doesnot_match":"Код не совпадает","contacts_not_found":"Чатов нет
¯∖_(ツ)_/¯","contacts_not_found_short":"Нет контактов для запроса ''{query}''","credential_email_prompt":"Регистрационный емейл","delete_account":"Удалить аккаунт","delete_account_warning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","deleted_content":"удалено","download_action":"скачать","drafty_attachment":"Аттачмент","drafty_form":"Форма:","drafty_image":"Картинка","email_dative":"емейлу","email_prompt":"Email, напр. ivan@example.com","enable_peers_messaging":"Разблокировать.","enter_confirmation_code_prompt":"Код подтверждения, полученный по {method}:","error_invalid_id":"Неверный ID","file_attachment_too_large":"Размер файла {size} превышает {limit} лимит.","forgot_password_link":"Напомнить пароль","full_name_prompt":"Полное имя, напр. Иван Петров","granted_permissions":"Получены","group_has_no_members":"Нет участников","group_user_id_prompt":"ID чата или пользователя","image_caption_prompt":"Подпись к фото","invalid_content":"сообщение не читается","invalid_security_token":"Токен некорректен","label_client":"Клиент:","label_content_type":"Тип:","label_default_access_mode":"Доступ по умолчанию:","label_file_name":"Имя файла:","label_group_members":"Участники чата:","label_incognito_mode":"Режим инкогнито:","label_message_sound":"Звук нового сообщения:","label_muting_topic":"Без уведомлений","label_other_user":"Второй","label_password":"Пароль","label_permissions":"Права доступа:","label_private":"Комментарий","label_push_notifications":"Уведомления:","label_push_notifications_disabled":"Уведомления (требуют HTTPS):","label_reset_password":"Отправить емейл для смены пароля:","label_sdk":"SDK:","label_server":"Сервер:","label_server_address":"Адрес сервера:","label_server_to_use":"Использовать сервер:","label_size":"Размер:","label_topic_name":"Название","label_user_contacts":"Конакты:","label_user_id":"ID:","label_wire_transport":"Соединение:","label_you":"Вы:","label_your_name":"Ваше имя","label_your_permissions":"Ваши права доступа:","last_seen_timestamp":"Был активен","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","link_contact_us":"Связаться с нами","link_privacy_policy":"Политика конфиденциальности","link_terms_of_service":"Условия сервиса","login_prompt":"Логин","menu_item_archive_topic":"В архив","menu_item_block":"Заблокировать","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_delete_topic":"Удалить чат","menu_item_edit_permissions":"Права доступа","menu_item_info":"Информация","menu_item_member_delete":"Отписать","menu_item_mute":"Не уведомлять","menu_item_restore_topic":"Разархивировать","menu_item_send_retry":"Отправить заново","menu_item_unblock":"Разблокировать","menu_item_unmute":"Уведомлять","message_sending":"в пути...","message_sending_failed":"ошибка","messages_not_readable":"нет доступа к сообщениям","messaging_disabled_prompt":"Отправка недоступна","more_online_members":"+еще {overflow}","new_message_prompt":"Новое сообщение","new_password_placeholder":"Введите новый пароль","no_connection":"Нет связи","no_contacts":"Ничего нет :-(","numeric_confirmation_code_prompt":"Только цифры","online_now":"онлайн","password_prompt":"Пароль","password_unchanged_prompt":"Не изменен","peers_messaging_disabled":"Чат заблокирован у корреспондента.","permission_admin":"Подтверждать ({val})","permission_delete":"Удалять ({val})","permission_join":"Подписываться ({val})","permission_owner":"Владелец ({val})","permission_pres":"Уведомлять ({val})","permission_read":"Читать ({val})","permission_share":"Приглашать ({val})","permission_write":"Писать ({val})","phone_dative":"телефону","private_editing_placeholder":"Виден только вам","push_init_failed":"Ошибка инициализации пуш уведомлений","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","reload_update":"Обновить","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","requested_permissions":"Требуются","save_attachment":"сохранить","search_for_contacts":"Поиск контактов","search_no_results":"Ничего не найдено","search_placeholder":"Список, напр. email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","sidepanel_title_account_settings":"Настройки аккаунта","sidepanel_title_archive":"Архив чатов","sidepanel_title_blocked":"Заблокированные чаты","sidepanel_title_cred":"Подтвердить","sidepanel_title_login":"Авторизация","sidepanel_title_newtpk":"Новый чат","sidepanel_title_register":"Зарегистрироваться","sidepanel_title_reset":"Сменить пароль","sidepanel_title_settings":"Настройки","stay_logged_in":"Запомнить","tabtitle_find_user":"найти","tabtitle_group_by_id":"по id","tabtitle_new_group":"создать","tags_editor_no_tags":"Добавьте теги","tags_not_found":"Тегов нет. Добавьте","title_all_contacts":"Все контакты","title_group_members":"Участники","title_manage_tags":"Редактировать","title_not_found":"Не найден","title_permissions":"Права доступа","title_tag_manager":"Теги для поиска","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_name_editing_placeholder":"Название чата","unnamed_topic":"Без названия","update_available":"Есть новая версия приложения.","upload_finishing":"завершение...","user_not_found":"Не найден","validate_credential_action":"подтвердить","description_editing_placeholder":"Описание (не обязательно)","label_description":"Описание","button_security":"Безопасность","panel_title_crop":"Обрезать картинку","panel_title_general":"Общие настройки","panel_title_members":"Участники","panel_title_security":"Безопасность","panel_title_info":"Подробности","permissions_anonymous":"Анонимный","permissions_authenticated":"Авторизованный","topic_delete":"Удалить чат","permissions_user":"Права доступа","password_reset_email_sent":"Сообщение было отправлено на адрес {email}. Следуйте инструкциям в сообщении, чтобы изменить пароль.","label_unarchive_topic":"Архивирован:","menu_item_reply":"Ответить","menu_item_forward":"Переслать","forward_to":"Переслать","forward_to_search_placeholder":"Поиск контактов","label_new_password":"Новый пароль","drafty_unknown":"Не поддерживается","calls_incoming":"Входящий звонок","calls_outgoing":"Исходящий звонок","calls_you_label":"Вы","menu_item_video_call":"Видеозвонок","already_in_call":"Вы уже звоните кому-то!","call_cancelled":"отменен","call_missed":"пропущен","call_declined":"отклонен"},"zh-TW":{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_another":"新增其他人","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話
¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 ''{query}'' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","deleted_content":"內容已被刪除","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人:","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","validate_credential_action":"確認","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"一封電子郵件已發送至 {email}。按照電子郵件中的說明重置密碼。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒"},"zh":{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_another":"加上另一个","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话
¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配''{query}''","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","deleted_content":"内容已删除","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"蓦然访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来:","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后可见","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"成员间消息已禁用。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索返回任何结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","validate_credential_action":"确认","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"一封电子邮件已发送至 {email}。按照电子邮件中的说明重置密码。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒"}} \ No newline at end of file diff --git a/umd/index.dev.js b/umd/index.dev.js index c6ebbe2d..40b529e8 100644 --- a/umd/index.dev.js +++ b/umd/index.dev.js @@ -22170,7 +22170,7 @@ registerMessagingInWindow(); /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"de":{"action_block_contact":"Kontakt blockieren","action_cancel":"Abbrechen","action_clear_messages":"Nachrichten leeren","action_delete_messages":"Nachrichten für alle löschen","action_leave_chat":"Unterhaltung verlassen","action_report_chat":"Unterhaltung melden","archived_contacts":"Archivierte Kontakte ({count})","badge_danger":"Verdächtig","badge_owner":"Besitzer","badge_staff":"Verwaltung","badge_verified":"Verifiziert","badge_you":"Sie","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","blocked_contacts_link":"Blockierte Kontakte ({count})","button_add_another":"Hinzufügen","button_add_members":"Mitglieder hinzufügen","button_cancel":"Abbrechen","button_confirm":"Bestätigen","button_create":"Erstellen","button_delete_account":"Konto löschen","button_edit":"Bearbeiten","button_logout":"Abmelden","button_ok":"OK","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","button_sign_in":"Anmelden","button_sign_up":"Anmelden","button_subscribe":"Abbonieren","button_update":"Aktualisieren","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","channel":"Sender","channel_prompt":"Dies ist ein Sender","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_block":"Blockieren","chat_invitation_ignore":"Ignorieren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","code_doesnot_match":"Code stimmt nicht überein","contacts_not_found":"Sie haben keine Unterhaltungen
¯∖_(ツ)_/¯","contacts_not_found_short":"Keine Kontakte für \'\'{query}\'\'","credential_email_prompt":"E-Mail Adresse für Registrierung","delete_account":"Konto löschen","delete_account_warning":"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","deleted_content":"Inhalt gelöscht","download_action":"herunterladen","drafty_attachment":"Dateianhang","drafty_form":"Formular:","drafty_image":"Bild","email_dative":"E-Mail","email_prompt":"E-Mail, z.B. lisam@beispiel.de","enable_peers_messaging":"Aktivieren","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","error_invalid_id":"ungültige ID","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","forgot_password_link":"Passwort vergessen?","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","granted_permissions":"Erteilt","group_has_no_members":"Keine Mitglieder","group_user_id_prompt":"Gruppe oder Benutzer ID","image_caption_prompt":"Bildunterschrift","invalid_content":"ungültiger Inhalt","invalid_security_token":"Ungültiger Sicherheitsschlüssel","label_client":"Client:","label_content_type":"Inhaltsart:","label_default_access_mode":"Standard Zugriffsmodus:","label_file_name":"Dateiname:","label_group_members":"Gruppenmitglieder:","label_incognito_mode":"inkognito-Modus:","label_message_sound":"Benachrichtigungston:","label_muting_topic":"Stumm geschaltet:","label_other_user":"Andere","label_password":"Passwort","label_permissions":"Berechtigungen:","label_private":"Privater Kommentar","label_push_notifications":"Benachrichtigungsmeldungen:","label_push_notifications_disabled":"Benachrichtigungsmeldungen (erfordert HTTPS):","label_reset_password":"Passwort per E-Mail wiederherstellen:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server Adresse:","label_server_to_use":"Server verwenden:","label_size":"Größe:","label_topic_name":"Name","label_user_contacts":"Kontakte:","label_user_id":"ID:","label_wire_transport":"Übertragung per Kabel:","label_you":"Sie:","label_your_name":"Ihr Name","label_your_permissions":"Ihre Berechtigungen:","last_seen_timestamp":"Zuletzt gesehen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","link_contact_us":"Kontakt","link_privacy_policy":"Datenschutzerklärung","link_terms_of_service":"Nutzungsbedingungen","login_prompt":"Anmelden","menu_item_archive_topic":"Archivieren","menu_item_block":"Blockieren","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_delete_topic":"Entfernen","menu_item_edit_permissions":"Berechtigungen ändern","menu_item_info":"Info","menu_item_member_delete":"Entfernen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_restore_topic":"Wiederherstellen","menu_item_send_retry":"Wiederholen","menu_item_unblock":"Blockierung aufheben","menu_item_unmute":"Stumm schalten beenden","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","more_online_members":"+{overflow} mehr","new_message_prompt":"Neue Nachricht","new_password_placeholder":"Geben Sie ein neues Passwort ein","no_connection":"Keine Verbindung","no_contacts":"Sie haben keine Kontakte :-(","numeric_confirmation_code_prompt":"Nur zahlen","online_now":"jetzt online","password_prompt":"Passwort","password_unchanged_prompt":"unverändert","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","permission_admin":"Bestätigen ({val})","permission_delete":"Entfernen ({val})","permission_join":"Beitreten ({val})","permission_owner":"Besitzer ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_read":"Lesen ({val})","permission_share":"Teilen ({val})","permission_write":"Schreiben ({val})","phone_dative":"Telefon","private_editing_placeholder":"Nur für Sie sichtbar","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","reload_update":"Neu laden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","requested_permissions":"Angefordert","save_attachment":"Speichern","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_login":"Anmelden","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_register":"Konto erstellen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_settings":"Einstellungen","stay_logged_in":"Angemeldet bleiben","tabtitle_find_user":"Suchen","tabtitle_group_by_id":"nach ID","tabtitle_new_group":"Neue Gruppe","tags_editor_no_tags":"Schlagworte hinzufügen","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","title_all_contacts":"Alle Kontakte","title_group_members":"Gruppenmitglieder","panel_title_info":"Info","title_manage_tags":"Verwalten","title_not_found":"Nicht gefunden","title_permissions":"Berechtigungen","title_tag_manager":"Schlagworte (Nutzer entdecken)","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","topic_name_editing_placeholder":"Freiform Name der Gruppe","unnamed_topic":"Unbenannt","update_available":"Aktualisierung verfügbar.","upload_finishing":"wird abgeschlossen...","user_not_found":"Nicht gefunden","validate_credential_action":"bestätigen","description_editing_placeholder":"Beschreibung (optional)","label_description":"Beschreibung","button_security":"Sicherheit","panel_title_general":"Allgemein","panel_title_security":"Sicherheit","panel_title_crop":"Zum Anpassen ziehen","panel_title_members":"Mitglieder","permissions_anonymous":"Anonym","permissions_authenticated":"Authentifiziert","topic_delete":"Chat löschen","permissions_user":"Benutzerberechtigungen","password_reset_email_sent":"Eine E-Mail wurde an {email} gesendet. Folgen Sie den Anweisungen in der E-Mail, um Ihr Passwort zurückzusetzen.","label_unarchive_topic":"Archiviert:","menu_item_reply":"Antwort","menu_item_forward":"Nach vorne","forward_to":"Weiterleiten","forward_to_search_placeholder":"Kontakte durchsuchen","label_new_password":"Neues Kennwort","drafty_unknown":"Nicht unterstützt","calls_incoming":"Eingehender Anruf","calls_outgoing":"Ausgehender Anruf","calls_you_label":"Du","menu_item_video_call":"Videoanruf","already_in_call":"Du redest schon!","call_cancelled":"abgebrochen","call_missed":"verpasster","call_declined":"abgelehnt"},"en":{"action_block_contact":"Block Contact","action_cancel":"cancel","action_clear_messages":"Clear Messages","action_delete_messages":"Clear Messages for All","action_leave_chat":"Leave Conversation","action_report_chat":"Report Conversation","archived_contacts":"Archived contacts ({count})","badge_danger":"Untrustworthy","badge_owner":"owner","badge_staff":"Staff-managed","badge_verified":"Verified/official","badge_you":"you","block_contact_warning":"Are you sure you want to block this contact?","blocked_contacts_link":"Blocked contacts ({count})","button_add_another":"Add another","button_add_members":"Add members","button_cancel":"Cancel","button_confirm":"Confirm","button_create":"Create","button_delete_account":"Delete account","button_edit":"Edit","button_logout":"Logout","button_ok":"OK","button_reset":"Reset","button_send_request":"Send request","button_sign_in":"Sign in","button_sign_up":"Sign up","button_subscribe":"Subscribe","button_update":"Update","cannot_initiate_file_upload":"Cannot initiate file upload.","channel":"channel","channel_prompt":"This is a channel","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_block":"Block","chat_invitation_ignore":"Ignore","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","code_doesnot_match":"Code does not match","contacts_not_found":"You have no chats
¯∖_(ツ)_/¯","contacts_not_found_short":"No contacts match \'\'{query}\'\'","credential_email_prompt":"Your registration email","delete_account":"Delete account","delete_account_warning":"Are you sure you want to delete your account? It cannot be undone.","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","deleted_content":"content deleted","download_action":"download","drafty_attachment":"Attachment","drafty_form":"Form:","drafty_image":"Picture","email_dative":"email","email_prompt":"Email, e.g. jdoe@example.com","enable_peers_messaging":"Enable","enter_confirmation_code_prompt":"Enter confirmation code sent to you by {method}:","error_invalid_id":"Invalid ID","file_attachment_too_large":"The file size {size} exceeds the {limit} limit.","forgot_password_link":"Forgot password?","full_name_prompt":"Full name, e.g. John Doe","granted_permissions":"Granted","group_has_no_members":"No members","group_user_id_prompt":"Group or User ID","image_caption_prompt":"Image caption","invalid_content":"invalid content","invalid_security_token":"Invalid security token","label_client":"Client:","label_content_type":"Content type:","label_default_access_mode":"Default access mode:","label_file_name":"File name:","label_group_members":"Group members:","label_incognito_mode":"Incognito mode:","label_message_sound":"Message sound:","label_muting_topic":"Muted:","label_other_user":"Other","label_password":"Password","label_permissions":"Permissions:","label_private":"Private comment","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_reset_password":"Send a password reset email:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server address:","label_server_to_use":"Server to use:","label_size":"Size:","label_topic_name":"Name","label_user_contacts":"Contacts:","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"You:","label_your_name":"Your name","label_your_permissions":"Your permissions:","last_seen_timestamp":"Last seen","leave_chat_warning":"Are you sure you want to leave this conversation?","link_contact_us":"Contact Us","link_privacy_policy":"Privacy Policy","link_terms_of_service":"Terms of Service","login_prompt":"Login","menu_item_archive_topic":"Archive","menu_item_block":"Block","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_delete_topic":"Delete","menu_item_edit_permissions":"Edit permissions","menu_item_info":"Info","menu_item_member_delete":"Remove","menu_item_mute":"Mute","menu_item_reply":"Reply","menu_item_restore_topic":"Restore","menu_item_send_retry":"Retry","menu_item_unblock":"Unblock","menu_item_unmute":"Unmute","message_sending":"sending...","message_sending_failed":"failed","messages_not_readable":"no access to messages","messaging_disabled_prompt":"Messaging disabled","more_online_members":"+{overflow} more","new_message_prompt":"New message","new_password_placeholder":"Enter new password","no_connection":"No connection","no_contacts":"You have no contacts :-(","numeric_confirmation_code_prompt":"Numbers only","online_now":"online now","password_prompt":"Password","password_unchanged_prompt":"Unchanged","peers_messaging_disabled":"Peer\'s messaging is disabled.","permission_admin":"Approve ({val})","permission_delete":"Delete ({val})","permission_join":"Join ({val})","permission_owner":"Owner ({val})","permission_pres":"Get notified ({val})","permission_read":"Read ({val})","permission_share":"Share ({val})","permission_write":"Write ({val})","phone_dative":"phone","private_editing_placeholder":"Visible to you only","push_init_failed":"Failed to initialize push notifications","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","reload_update":"Reload","report_chat_warning":"Are you sure you want to block and report this conversation?","requested_permissions":"Requested","save_attachment":"save","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","search_placeholder":"List like email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Account Settings","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_login":"Sign In","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_register":"Create Account","sidepanel_title_reset":"Reset Password","sidepanel_title_settings":"Settings","stay_logged_in":"Stay logged in","tabtitle_find_user":"find","tabtitle_group_by_id":"by id","tabtitle_new_group":"new group","tags_editor_no_tags":"Add some tags","tags_not_found":"No tags defined. Add some.","title_all_contacts":"All Contacts","title_group_members":"Group Members","title_manage_tags":"Manage","title_not_found":"Not found","title_permissions":"Permissions","title_tag_manager":"Tags (search & discovery)","topic_block_warning":"Are you sure you want to block this conversation?","topic_delete_warning":"Are you sure you want to delete this conversation?","topic_name_editing_placeholder":"Freeform name of the group","unnamed_topic":"Unnamed","update_available":"Update available.","upload_finishing":"finishing...","user_not_found":"Not found","validate_credential_action":"confirm","description_editing_placeholder":"Optional description","label_description":"Description","button_security":"Security","panel_title_crop":"Drag to Adjust","panel_title_general":"General","panel_title_members":"Members","panel_title_security":"Security","panel_title_info":"Info","permissions_anonymous":"Anonymous","permissions_authenticated":"Authenticated","topic_delete":"Delete Conversation","permissions_user":"User\'s Permissions","password_reset_email_sent":"An email has been sent to {email}. Follow the directions in the email to reset your password.","label_unarchive_topic":"Archived:","menu_item_forward":"Forward","forward_to":"Forward to","forward_to_search_placeholder":"Search contacts","label_new_password":"New password","drafty_unknown":"Unsupported","calls_incoming":"Incoming call","calls_outgoing":"Outgoing call","calls_you_label":"You","menu_item_video_call":"Video call","already_in_call":"You already in an ongoing call!","call_cancelled":"cancelled","call_missed":"missed","call_declined":"declined"},"es":{"action_block_contact":"Bloquear contacto","action_cancel":"cancelar","action_clear_messages":"Borrar mensajes","action_delete_messages":"Borrar mensajes para todos","action_leave_chat":"Dejar conversación","action_report_chat":"Reportar conversación","archived_contacts":"Contactos archivados ({count})","badge_danger":"Suspicaz","badge_owner":"propietario","badge_staff":"Administración","badge_verified":"Verificado","badge_you":"tú","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","blocked_contacts_link":"Contactos bloqueados ({count})","button_add_another":"Añadir contacto","button_add_members":"Añadir miembros","button_cancel":"Cancelar","button_confirm":"Confirmar","button_create":"Crear","button_delete_account":"Eliminar cuenta","button_edit":"Editar","button_logout":"Cerrar sesión","button_ok":"OK","button_reset":"Restablecer","button_send_request":"Enviar petición","button_sign_in":"Entrar","button_sign_up":"Regístrate","button_subscribe":"Suscribirse","button_update":"Actualizar","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","channel":"canal","channel_prompt":"Este es un canal","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_block":"Bloquear","chat_invitation_ignore":"Ignorar","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","code_doesnot_match":"El código no coincide","contacts_not_found":"No tienes chats
¯∖_(ツ)_/¯","contacts_not_found_short":"Ningún contacto coincide con \'\'{query}\'\'","credential_email_prompt":"Tu correo electrónico de registro","delete_account":"Eliminar cuenta","delete_account_warning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","deleted_content":"este mensaje fue eliminado","download_action":"descargar","drafty_attachment":"Archivo","drafty_form":"Formulario:","drafty_image":"Imagen","email_dative":"correo electrónico","email_prompt":"Correo electrónico, p.ej. juan@example.com","enable_peers_messaging":"Habilitar","enter_confirmation_code_prompt":"Introduzca el código de confirmación enviado a tu {method}:","error_invalid_id":"ID inválido","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","forgot_password_link":"¿Olvidaste tu contraseña?","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","granted_permissions":"Otorgados","group_has_no_members":"No hay miembros","group_user_id_prompt":"ID del grupo o usuario","image_caption_prompt":"Añade un comentario","invalid_content":"contenido inválido","invalid_security_token":"Token de seguridad inválido","label_client":"Cliente:","label_content_type":"Tipo de contenido:","label_default_access_mode":"Modo de acceso predeterminado:","label_file_name":"Nombre del archivo:","label_group_members":"Miembros del grupo:","label_incognito_mode":"Modo incógnito:","label_message_sound":"Sonido de mensaje:","label_muting_topic":"Silenciado:","label_other_user":"Otros","label_password":"Contraseña","label_permissions":"Permisos:","label_private":"Comentario privado","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","label_sdk":"SDK:","label_server":"Servidor:","label_server_address":"Dirección del servidor:","label_server_to_use":"Servidor para usar:","label_size":"Tamaño:","label_topic_name":"Nombre del tema","label_user_contacts":"Contactos:","label_user_id":"ID:","label_wire_transport":"Transporte de alambre:","label_you":"Tú:","label_your_name":"Tu nombre","label_your_permissions":"Tus permisos:","last_seen_timestamp":"Últ. vez","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","link_contact_us":"Contáctanos","link_privacy_policy":"Política de privacidad","link_terms_of_service":"Términos de uso","login_prompt":"Nombre de usuario","menu_item_archive_topic":"Archivar","menu_item_block":"Bloquear","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_delete_topic":"Eliminar","menu_item_edit_permissions":"Editar permisos","menu_item_info":"Información","menu_item_member_delete":"Eliminar","menu_item_mute":"Silenciar","menu_item_restore_topic":"Restaurar","menu_item_send_retry":"Inténtalo de nuevo","menu_item_unblock":"Desbloquear","menu_item_unmute":"Anular el silencio","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","messages_not_readable":"sin acceso a mensajes","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","more_online_members":"+{overflow} más","new_message_prompt":"Nuevo mensaje","new_password_placeholder":"Introduzca una nueva contraseña","no_connection":"Sin conexión","no_contacts":"No tienes contactos :-(","numeric_confirmation_code_prompt":"Sólo números","online_now":"en línea","password_prompt":"Contraseña","password_unchanged_prompt":"Sin cambios","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","permission_admin":"Approbar ({val})","permission_delete":"Eliminar ({val})","permission_join":"Unirse ({val})","permission_owner":"Propietario ({val})","permission_pres":"Ser notificado ({val})","permission_read":"Leer ({val})","permission_share":"Compartir ({val})","permission_write":"Escribir ({val})","phone_dative":"teléfono","private_editing_placeholder":"Sólo visible para tí","push_init_failed":"Error al inicializar las notificaciones push","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","reload_update":"Recargar","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","requested_permissions":"Solicitados","save_attachment":"guardar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_login":"Iniciar sesión","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_register":"Crear cuenta","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_settings":"Ajustes","stay_logged_in":"Permanecer conectado","tabtitle_find_user":"encontrar","tabtitle_group_by_id":"por ID","tabtitle_new_group":"nuevo grupo","tags_editor_no_tags":"Añadir etiquetas","tags_not_found":"No hay etiquetas definidas. Añade unas.","title_all_contacts":"Todos los contactos","title_group_members":"Miembros del grupo","title_manage_tags":"Gestionar","title_not_found":"No encontrado","title_permissions":"Permisos","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","topic_name_editing_placeholder":"Nombre del grupo","unnamed_topic":"Sin nombre","update_available":"Actualización disponible.","upload_finishing":"terminando...","user_not_found":"Usuario no encontrado","validate_credential_action":"confirmar","description_editing_placeholder":"Descripción (opcional)","label_description":"Descripción","button_security":"Seguridad","panel_title_crop":"Arrastra para ajustar","panel_title_general":"General","panel_title_members":"Miembros","panel_title_security":"Seguridad","panel_title_info":"Información","permissions_anonymous":"Anónimo","permissions_authenticated":"Autenticado","topic_delete":"Eliminar chat","permissions_user":"Permisos del usuario","password_reset_email_sent":"Se ha enviado un correo electrónico a {email}. Siga las instrucciones del correo electrónico para restablecer su contraseña.","label_unarchive_topic":"Archivado:","menu_item_reply":"Respuesta","menu_item_forward":"Reenviar","forward_to":"Reenviar a","forward_to_search_placeholder":"Buscar contactos","label_new_password":"Nueva contraseña","drafty_unknown":"No soportado","calls_incoming":"Llamada entrante","calls_outgoing":"Llamada saliente","calls_you_label":"Tú","menu_item_video_call":"Videollamada","already_in_call":"¡Ya estás hablando!","call_cancelled":"cancelada","call_missed":"perdida","call_declined":"rechazada"},"ko":{"action_block_contact":"연락차단","action_cancel":"취소","action_clear_messages":"메시지지우기","action_delete_messages":"모든메시지지우기","action_leave_chat":"대화나누기","action_report_chat":"대화기록","archived_contacts":"보관된연락처({수})","badge_danger":"의심 많은","badge_owner":"소유자","badge_staff":"직원 관리하에","badge_verified":"확인 됨","badge_you":"당신","block_contact_warning":"이연락처를차단하시겠습니까?","blocked_contacts_link":"차단된연락처({수})","button_add_another":"다른항목추가","button_add_members":"회원추가","button_cancel":"취소","button_confirm":"확인","button_create":"작성","button_delete_account":"계정삭제","button_edit":"편집","button_logout":"로그아웃","button_ok":"OK","button_reset":"재설정","button_send_request":"요청보내기","button_sign_in":"로그인","button_sign_up":"가입","button_subscribe":"구독","button_update":"업데이트","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","channel":"채널","channel_prompt":"이 채널입니다","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_block":"차단","chat_invitation_ignore":"무시","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","code_doesnot_match":"코드가일치하지않습니다","contacts_not_found":"채팅이없습니다
¯∖_(ツ)_/¯","contacts_not_found_short":"\'{문의}\'와일치하는연락처가없습니다.","credential_email_prompt":"등록이메일","delete_account":"계정삭제","delete_account_warning":"계정을삭제하시겠습니까?실행취소할수없습니다.","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","deleted_content":"내용이 삭제되었습니다","download_action":"다운로드","drafty_attachment":"부착","drafty_form":"형태:","drafty_image":"이미지","email_dative":"이메일","email_prompt":"이메일(예:hong@example.com)","enable_peers_messaging":"활성화","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","error_invalid_id":"잘못된ID","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","forgot_password_link":"비밀번호를잊으셨습니까?","full_name_prompt":"전체이름(예:홍길동)","granted_permissions":"승낙하다","group_has_no_members":"회원없음","group_user_id_prompt":"그룹또는사용자ID","image_caption_prompt":"이미지설명","invalid_content":"잘못된내용","invalid_security_token":"유효하지않은보안토큰","label_client":"클라이언트: ","label_content_type":"컨텐츠유형: ","label_default_access_mode":"기본액세스모드: ","label_file_name":"파일이름: ","label_group_members":"그룹회원: ","label_incognito_mode":"시크릿모드: ","label_message_sound":"메시지소리: ","label_muting_topic":"음소거: ","label_other_user":"기타","label_password":"비밀번호","label_permissions":"권한: ","label_private":"개인코멘트","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_reset_password":"비밀번호재설정이메일보내기: ","label_sdk":"SDK:","label_server":"서버: ","label_server_address":"서버주소: ","label_server_to_use":"사용할서버:","label_size":"크기: ","label_topic_name":"이름","label_user_contacts":"연락처: ","label_user_id":"ID:","label_wire_transport":"와이어수송:","label_you":"당신: ","label_your_name":"이름","label_your_permissions":"권한: ","last_seen_timestamp":"마지막으로본","leave_chat_warning":"이대화를나가시겠습니까?","link_contact_us":"문의처","link_privacy_policy":"개인정보보호정책","link_terms_of_service":"서비스약관","login_prompt":"로그인","menu_item_archive_topic":"보관","menu_item_block":"차단","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_delete_topic":"삭제","menu_item_edit_permissions":"편집권한","menu_item_info":"정보","menu_item_member_delete":"제거","menu_item_mute":"음소거","menu_item_restore_topic":"복원","menu_item_send_retry":"다시시도","menu_item_unblock":"차단해제","menu_item_unmute":"음소거해제","message_sending":"보내기...","message_sending_failed":"실패","messages_not_readable":"메시지에 액세스 할 수 없습니다","messaging_disabled_prompt":"메시지비활성화","more_online_members":"+{넘침}더보기","new_message_prompt":"새메시지","new_password_placeholder":"새비밀번호입력","no_connection":"연결없음","no_contacts":"연락처가없습니다 (._.)","numeric_confirmation_code_prompt":"숫자만","online_now":"현재접속중","password_prompt":"비밀번호","password_unchanged_prompt":"변경되지않음","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","permission_admin":"승인({val})","permission_delete":"삭제({val})","permission_join":"참여({val})","permission_owner":"소유자({val})","permission_pres":"알림받기({val})","permission_read":"읽기({val})","permission_share":"공유({val})","permission_write":"쓰기({val})","phone_dative":"전화","private_editing_placeholder":"나만볼수있습니다","push_init_failed":"푸시알림을초기화하지못했습니다","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","reload_update":"재로드","report_chat_warning":"이대화를차단하고기록하시겠습니까?","requested_permissions":"요청","save_attachment":"저장","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_account_settings":"계정설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","sidepanel_title_cred":"자격증명확인","sidepanel_title_login":"로그인","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_register":"계정만들기","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_settings":"설정","stay_logged_in":"로그인상태유지","tabtitle_find_user":"찾기","tabtitle_group_by_id":"id로","tabtitle_new_group":"새그룹","tags_editor_no_tags":"일부태그추가","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","title_all_contacts":"모든연락처","title_group_members":"그룹구성원","title_manage_tags":"관리","title_not_found":"찾을수없음","title_permissions":"권한","title_tag_manager":"태그(사용자검색)","topic_block_warning":"이대화를차단하시겠습니까?","topic_delete_warning":"이대화를삭제하시겠습니까?","topic_name_editing_placeholder":"그룹의자유형이름","unnamed_topic":"이름없는","update_available":"업데이트가능.","upload_finishing":"마무리...","user_not_found":"찾을수없음","validate_credential_action":"확인","description_editing_placeholder":"설명(선택 사항)","label_description":"설명","button_security":"보안","panel_title_crop":"드래그하여 조정","panel_title_general":"일반","panel_title_members":"구성원","panel_title_security":"보안","panel_title_info":"정보","permissions_anonymous":"익명","permissions_authenticated":"인증됨","topic_delete":"채팅 삭제","permissions_user":"사용자 권한","password_reset_email_sent":"이메일이 {email}(으)로 전송되었습니다. 이메일의 지침에 따라 비밀번호를 재설정하세요.","label_unarchive_topic":"보관됨:","menu_item_reply":"회신하다","menu_item_forward":"리디렉션","forward_to":"메시지를 리디렉션","forward_to_search_placeholder":"연락처 검색","label_new_password":"새 비밀번호","drafty_unknown":"지원되지 않음","calls_incoming":"수신 전화","calls_outgoing":"발신 전화","calls_you_label":"너","menu_item_video_call":"영상 통화","already_in_call":"당신은 이미 말하고 있습니다!","call_cancelled":"취소 된","call_missed":"부재중","call_declined":"통화 거부"},"ro":{"action_block_contact":"Blochează contact","action_cancel":"anulează","action_clear_messages":"Șterge mesajele","action_delete_messages":"Șterge toate mesajele","action_leave_chat":"Ieși din conversație","action_report_chat":"Raportează conversația","archived_contacts":"Contacte arhivate ({count})","badge_danger":"Suspicios","badge_owner":"owner","badge_staff":"Administrare","badge_verified":"Verificat","badge_you":"tu","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","blocked_contacts_link":"Contact blocate ({count})","button_add_another":"Adaugă","button_add_members":"Adaugă persoane","button_cancel":"Anulează","button_confirm":"Confirmă","button_create":"Creează","button_delete_account":"Șterge cont","button_edit":"Editează","button_logout":"Deconectare","button_ok":"OK","button_reset":"Resetează","button_send_request":"Trimite cerere","button_sign_in":"Conectează-te","button_sign_up":"Creează cont","button_subscribe":"Subscribe","button_update":"Actualizează","cannot_initiate_file_upload":"Nu se poate face încărcarea.","channel":"canal","channel_prompt":"Acesta este un canal","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_block":"Blochează","chat_invitation_ignore":"Ignoră","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","code_doesnot_match":"Codul furnizat nu este valid","contacts_not_found":"Nu ai contacte salvate
¯∖_(ツ)_/¯","contacts_not_found_short":"Niciun contact găsit după criteriile \'\'{query}\'\'","credential_email_prompt":"Adresa de e-mail","delete_account":"Șterge contul","delete_account_warning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","deleted_content":"conținut șters","download_action":"download","drafty_attachment":"Atasament","drafty_form":"Formă:","drafty_image":"Imagine","email_dative":"email","email_prompt":"Adresa de e-mail","enable_peers_messaging":"Activează","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","error_invalid_id":"ID Invalid","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","forgot_password_link":"Ți-ai uitat parola?","full_name_prompt":"Numele tău","granted_permissions":"Oferite","group_has_no_members":"În acest grup nu se află persoane","group_user_id_prompt":"Grup sau user ID","image_caption_prompt":"Titlul imaginii","invalid_content":"conținut invalid","invalid_security_token":"Codul de securitate este invalid","label_client":"Client:","label_content_type":"Tip conținut:","label_default_access_mode":"Default access mode:","label_file_name":"Nume fișier:","label_group_members":"Membrii grupului:","label_incognito_mode":"Mod incognito:","label_message_sound":"Sunet de mesaj:","label_muting_topic":"Mod silențios (muted):","label_other_user":"Altele","label_password":"Parola","label_permissions":"Permisiuni:","label_private":"Comentariu privat","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_reset_password":"Resetează parola:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Adresa serverului:","label_server_to_use":"Server de utilizat:","label_size":"Size:","label_topic_name":"Nume","label_user_contacts":"Contacte:","label_user_id":"ID:","label_wire_transport":"Transportul legat:","label_you":"Tu:","label_your_name":"Numele tău","label_your_permissions":"Permisiuniile tale:","last_seen_timestamp":"Văzut ultima dată","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","link_contact_us":"Contactează-ne","link_privacy_policy":"Politica de Confidențialitate","link_terms_of_service":"Termenii Serviciului","login_prompt":"Conectează-te","menu_item_archive_topic":"Arhivează","menu_item_block":"Blochează","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_delete_topic":"Șterge","menu_item_edit_permissions":"Editează permisiuni","menu_item_info":"Info","menu_item_member_delete":"Șterge persoană","menu_item_mute":"Mute","menu_item_restore_topic":"Restabili","menu_item_send_retry":"Reîncearcă","menu_item_unblock":"Deblochează","menu_item_unmute":"Unmute","message_sending":"se trimite...","message_sending_failed":"eroare","messages_not_readable":"Mesajele nu pot fi citite","messaging_disabled_prompt":"Mesageria este dezactivată","more_online_members":"+{overflow} mai mult","new_message_prompt":"Mesaj nou","new_password_placeholder":"Introdu parolă","no_connection":"Nu există conexiune","no_contacts":"Nu ai contacte adăugate :-(","numeric_confirmation_code_prompt":"Doar cifre","online_now":"online acum","password_prompt":"Parola","password_unchanged_prompt":"Neschimbată","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","permission_admin":"Aprobare ({val})","permission_delete":"Ștergere ({val})","permission_join":"Participare ({val})","permission_owner":"Deținător ({val})","permission_pres":"Notificare ({val})","permission_read":"Citire ({val})","permission_share":"Distribuire ({val})","permission_write":"Scriere ({val})","phone_dative":"telefon","private_editing_placeholder":"Vizibil doar ție","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","reload_update":"Reîncarcă","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","requested_permissions":"Necesare","save_attachment":"salvează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","search_placeholder":"Caută după e-mail sau număr telefon...","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_login":"Conectează-te","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_register":"Creează Cont","sidepanel_title_reset":"Resetează Parola","sidepanel_title_settings":"Setări","stay_logged_in":"Rămâi conectat","tabtitle_find_user":"caută","tabtitle_group_by_id":"după id","tabtitle_new_group":"grup nou","tags_editor_no_tags":"Adaugă tag-uri","tags_not_found":"Niciun tag definit. Adaugă.","title_all_contacts":"Toate Contactele","title_group_members":"Persoanele din grup","title_manage_tags":"Administrează","title_not_found":"Nu a fost găsit","title_permissions":"Permisiuni","title_tag_manager":"Tag-uri (user discovery)","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","topic_name_editing_placeholder":"Numele grupului","unnamed_topic":"Nedenumit","update_available":"Actualizare disponibilă.","upload_finishing":"se încarcă...","user_not_found":"Utilizatorul nu a fost găsit","validate_credential_action":"confirmă","description_editing_placeholder":"Descriere (opțional)","label_description":"Descriere","button_security":"Securitate","panel_title_crop":"Trageți pentru a ajusta","panel_title_general":"Generale","panel_title_members":"Membri","panel_title_security":"Securitate","panel_title_info":"Info","permissions_anonymous":"Anonim","permissions_authenticated":"Autentificat","topic_delete":"Ștergeți Chat","permissions_user":"Permisiunile utilizatorului","password_reset_email_sent":"Un e-mail a fost trimis către {email}. Urmați instrucțiunile din e-mail pentru a vă reseta parola.","label_unarchive_topic":"Arhivat:","menu_item_reply":"A raspunde","menu_item_forward":"Redirecţiona","forward_to":"Redirecționați către","forward_to_search_placeholder":"Căutați contacte","label_new_password":"Parolă Nouă","drafty_unknown":"Neacceptat","calls_incoming":"Apel primit","calls_outgoing":"Apel efectuat","calls_you_label":"Tu","menu_item_video_call":"Apel video","already_in_call":"Deja vorbesti!","call_cancelled":"anulat","call_missed":"pierdut","call_declined":"refuzat"},"ru":{"action_block_contact":"Заблокировать контакт","action_cancel":"отменить","action_clear_messages":"Удалить сообщения","action_delete_messages":"Удалить сообщения","action_leave_chat":"Уйти из чата","action_report_chat":"Сообщить о нарушении","archived_contacts":"Чаты в архиве ({count})","badge_danger":"Подозрительный","badge_owner":"влад.","badge_staff":"Администрация","badge_verified":"Верифицированный","badge_you":"вы","block_contact_warning":"Вы действительно заблокировать этот контакт?","blocked_contacts_link":"Заблокированные ({count})","button_add_another":"Добавить","button_add_members":"Добавить","button_cancel":"Отменить","button_confirm":"Подтвердить","button_create":"Создать","button_delete_account":"Удалить аккаунт","button_edit":"Редактировать","button_logout":"Выйти","button_ok":"OK","button_reset":"Изменить","button_send_request":"Отправить","button_sign_in":"Войти","button_sign_up":"Создать аккаунт","button_subscribe":"Подписаться","button_update":"Применить","cannot_initiate_file_upload":"Ошибка загрузки файла.","channel":"канал","channel_prompt":"Создать канал","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_block":"Заблокировать","chat_invitation_ignore":"Игнорировать","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","code_doesnot_match":"Код не совпадает","contacts_not_found":"Чатов нет
¯∖_(ツ)_/¯","contacts_not_found_short":"Нет контактов для запроса \'\'{query}\'\'","credential_email_prompt":"Регистрационный емейл","delete_account":"Удалить аккаунт","delete_account_warning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","deleted_content":"удалено","download_action":"скачать","drafty_attachment":"Аттачмент","drafty_form":"Форма:","drafty_image":"Картинка","email_dative":"емейлу","email_prompt":"Email, напр. ivan@example.com","enable_peers_messaging":"Разблокировать.","enter_confirmation_code_prompt":"Код подтверждения, полученный по {method}:","error_invalid_id":"Неверный ID","file_attachment_too_large":"Размер файла {size} превышает {limit} лимит.","forgot_password_link":"Напомнить пароль","full_name_prompt":"Полное имя, напр. Иван Петров","granted_permissions":"Получены","group_has_no_members":"Нет участников","group_user_id_prompt":"ID чата или пользователя","image_caption_prompt":"Подпись к фото","invalid_content":"сообщение не читается","invalid_security_token":"Токен некорректен","label_client":"Клиент:","label_content_type":"Тип:","label_default_access_mode":"Доступ по умолчанию:","label_file_name":"Имя файла:","label_group_members":"Участники чата:","label_incognito_mode":"Режим инкогнито:","label_message_sound":"Звук нового сообщения:","label_muting_topic":"Без уведомлений","label_other_user":"Второй","label_password":"Пароль","label_permissions":"Права доступа:","label_private":"Комментарий","label_push_notifications":"Уведомления:","label_push_notifications_disabled":"Уведомления (требуют HTTPS):","label_reset_password":"Отправить емейл для смены пароля:","label_sdk":"SDK:","label_server":"Сервер:","label_server_address":"Адрес сервера:","label_server_to_use":"Использовать сервер:","label_size":"Размер:","label_topic_name":"Название","label_user_contacts":"Конакты:","label_user_id":"ID:","label_wire_transport":"Соединение:","label_you":"Вы:","label_your_name":"Ваше имя","label_your_permissions":"Ваши права доступа:","last_seen_timestamp":"Был активен","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","link_contact_us":"Связаться с нами","link_privacy_policy":"Политика конфиденциальности","link_terms_of_service":"Условия сервиса","login_prompt":"Логин","menu_item_archive_topic":"В архив","menu_item_block":"Заблокировать","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_delete_topic":"Удалить чат","menu_item_edit_permissions":"Права доступа","menu_item_info":"Информация","menu_item_member_delete":"Отписать","menu_item_mute":"Не уведомлять","menu_item_restore_topic":"Разархивировать","menu_item_send_retry":"Отправить заново","menu_item_unblock":"Разблокировать","menu_item_unmute":"Уведомлять","message_sending":"в пути...","message_sending_failed":"ошибка","messages_not_readable":"нет доступа к сообщениям","messaging_disabled_prompt":"Отправка недоступна","more_online_members":"+еще {overflow}","new_message_prompt":"Новое сообщение","new_password_placeholder":"Введите новый пароль","no_connection":"Нет связи","no_contacts":"Ничего нет :-(","numeric_confirmation_code_prompt":"Только цифры","online_now":"онлайн","password_prompt":"Пароль","password_unchanged_prompt":"Не изменен","peers_messaging_disabled":"Чат заблокирован у корреспондента.","permission_admin":"Подтверждать ({val})","permission_delete":"Удалять ({val})","permission_join":"Подписываться ({val})","permission_owner":"Владелец ({val})","permission_pres":"Уведомлять ({val})","permission_read":"Читать ({val})","permission_share":"Приглашать ({val})","permission_write":"Писать ({val})","phone_dative":"телефону","private_editing_placeholder":"Виден только вам","push_init_failed":"Ошибка инициализации пуш уведомлений","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","reload_update":"Обновить","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","requested_permissions":"Требуются","save_attachment":"сохранить","search_for_contacts":"Поиск контактов","search_no_results":"Ничего не найдено","search_placeholder":"Список, напр. email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","sidepanel_title_account_settings":"Настройки аккаунта","sidepanel_title_archive":"Архив чатов","sidepanel_title_blocked":"Заблокированные чаты","sidepanel_title_cred":"Подтвердить","sidepanel_title_login":"Авторизация","sidepanel_title_newtpk":"Новый чат","sidepanel_title_register":"Зарегистрироваться","sidepanel_title_reset":"Сменить пароль","sidepanel_title_settings":"Настройки","stay_logged_in":"Запомнить","tabtitle_find_user":"найти","tabtitle_group_by_id":"по id","tabtitle_new_group":"создать","tags_editor_no_tags":"Добавьте теги","tags_not_found":"Тегов нет. Добавьте","title_all_contacts":"Все контакты","title_group_members":"Участники","title_manage_tags":"Редактировать","title_not_found":"Не найден","title_permissions":"Права доступа","title_tag_manager":"Теги для поиска","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_name_editing_placeholder":"Название чата","unnamed_topic":"Без названия","update_available":"Есть новая версия приложения.","upload_finishing":"завершение...","user_not_found":"Не найден","validate_credential_action":"подтвердить","description_editing_placeholder":"Описание (не обязательно)","label_description":"Описание","button_security":"Безопасность","panel_title_crop":"Обрезать картинку","panel_title_general":"Общие настройки","panel_title_members":"Участники","panel_title_security":"Безопасность","panel_title_info":"Подробности","permissions_anonymous":"Анонимный","permissions_authenticated":"Авторизованный","topic_delete":"Удалить чат","permissions_user":"Права доступа","password_reset_email_sent":"Сообщение было отправлено на адрес {email}. Следуйте инструкциям в сообщении, чтобы изменить пароль.","label_unarchive_topic":"Архивирован:","menu_item_reply":"Ответить","menu_item_forward":"Переслать","forward_to":"Переслать","forward_to_search_placeholder":"Поиск контактов","label_new_password":"Новый пароль","drafty_unknown":"Не поддерживается","calls_incoming":"Входящий звонок","calls_outgoing":"Исходящий звонок","calls_you_label":"Вы","menu_item_video_call":"Видеозвонок","already_in_call":"Вы уже звоните кому-то!","call_cancelled":"отменен","call_missed":"пропущен","call_declined":"отклонен"},"zh-TW":{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_another":"新增其他人","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話
¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 \'\'{query}\'\' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","deleted_content":"內容已被刪除","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人:","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","validate_credential_action":"確認","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"一封電子郵件已發送至 {email}。按照電子郵件中的說明重置密碼。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒"},"zh":{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_another":"加上另一个","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话
¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配\'\'{query}\'\'","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","deleted_content":"内容已删除","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"蓦然访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来:","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后可见","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"成员间消息已禁用。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索返回任何结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","validate_credential_action":"确认","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"一封电子邮件已发送至 {email}。按照电子邮件中的说明重置密码。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒"}}'); +module.exports = JSON.parse('{"de":{"action_block_contact":"Kontakt blockieren","action_cancel":"Abbrechen","action_clear_messages":"Nachrichten leeren","action_delete_messages":"Nachrichten für alle löschen","action_leave_chat":"Unterhaltung verlassen","action_report_chat":"Unterhaltung melden","archived_contacts":"Archivierte Kontakte ({count})","badge_danger":"Verdächtig","badge_owner":"Besitzer","badge_staff":"Verwaltung","badge_verified":"Verifiziert","badge_you":"Sie","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","blocked_contacts_link":"Blockierte Kontakte ({count})","button_add_another":"Hinzufügen","button_add_members":"Mitglieder hinzufügen","button_cancel":"Abbrechen","button_confirm":"Bestätigen","button_create":"Erstellen","button_delete_account":"Konto löschen","button_edit":"Bearbeiten","button_logout":"Abmelden","button_ok":"OK","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","button_sign_in":"Anmelden","button_sign_up":"Anmelden","button_subscribe":"Abbonieren","button_update":"Aktualisieren","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","channel":"Sender","channel_prompt":"Dies ist ein Sender","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_block":"Blockieren","chat_invitation_ignore":"Ignorieren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","code_doesnot_match":"Code stimmt nicht überein","contacts_not_found":"Sie haben keine Unterhaltungen
¯∖_(ツ)_/¯","contacts_not_found_short":"Keine Kontakte für \'\'{query}\'\'","credential_email_prompt":"E-Mail Adresse für Registrierung","delete_account":"Konto löschen","delete_account_warning":"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","deleted_content":"Inhalt gelöscht","download_action":"herunterladen","drafty_attachment":"Dateianhang","drafty_form":"Formular:","drafty_image":"Bild","email_dative":"E-Mail","email_prompt":"E-Mail, z.B. lisam@beispiel.de","enable_peers_messaging":"Aktivieren","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","error_invalid_id":"ungültige ID","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","forgot_password_link":"Passwort vergessen?","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","granted_permissions":"Erteilt","group_has_no_members":"Keine Mitglieder","group_user_id_prompt":"Gruppe oder Benutzer ID","image_caption_prompt":"Bildunterschrift","invalid_content":"ungültiger Inhalt","invalid_security_token":"Ungültiger Sicherheitsschlüssel","label_client":"Client:","label_content_type":"Inhaltsart:","label_default_access_mode":"Standard Zugriffsmodus:","label_file_name":"Dateiname:","label_group_members":"Gruppenmitglieder:","label_incognito_mode":"inkognito-Modus:","label_message_sound":"Benachrichtigungston:","label_muting_topic":"Stumm geschaltet:","label_other_user":"Andere","label_password":"Passwort","label_permissions":"Berechtigungen:","label_private":"Privater Kommentar","label_push_notifications":"Benachrichtigungsmeldungen:","label_push_notifications_disabled":"Benachrichtigungsmeldungen (erfordert HTTPS):","label_reset_password":"Passwort per E-Mail wiederherstellen:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server Adresse:","label_server_to_use":"Server verwenden:","label_size":"Größe:","label_topic_name":"Name","label_user_contacts":"Kontakte:","label_user_id":"ID:","label_wire_transport":"Übertragung per Kabel:","label_you":"Sie:","label_your_name":"Ihr Name","label_your_permissions":"Ihre Berechtigungen:","last_seen_timestamp":"Zuletzt gesehen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","link_contact_us":"Kontakt","link_privacy_policy":"Datenschutzerklärung","link_terms_of_service":"Nutzungsbedingungen","login_prompt":"Anmelden","menu_item_archive_topic":"Archivieren","menu_item_block":"Blockieren","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_delete_topic":"Entfernen","menu_item_edit_permissions":"Berechtigungen ändern","menu_item_info":"Info","menu_item_member_delete":"Entfernen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_restore_topic":"Wiederherstellen","menu_item_send_retry":"Wiederholen","menu_item_unblock":"Blockierung aufheben","menu_item_unmute":"Stumm schalten beenden","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","more_online_members":"+{overflow} mehr","new_message_prompt":"Neue Nachricht","new_password_placeholder":"Geben Sie ein neues Passwort ein","no_connection":"Keine Verbindung","no_contacts":"Sie haben keine Kontakte :-(","numeric_confirmation_code_prompt":"Nur zahlen","online_now":"jetzt online","password_prompt":"Passwort","password_unchanged_prompt":"unverändert","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","permission_admin":"Bestätigen ({val})","permission_delete":"Entfernen ({val})","permission_join":"Beitreten ({val})","permission_owner":"Besitzer ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_read":"Lesen ({val})","permission_share":"Teilen ({val})","permission_write":"Schreiben ({val})","phone_dative":"Telefon","private_editing_placeholder":"Nur für Sie sichtbar","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","reload_update":"Neu laden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","requested_permissions":"Angefordert","save_attachment":"Speichern","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_login":"Anmelden","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_register":"Konto erstellen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_settings":"Einstellungen","stay_logged_in":"Angemeldet bleiben","tabtitle_find_user":"Suchen","tabtitle_group_by_id":"nach ID","tabtitle_new_group":"Neue Gruppe","tags_editor_no_tags":"Schlagworte hinzufügen","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","title_all_contacts":"Alle Kontakte","title_group_members":"Gruppenmitglieder","panel_title_info":"Info","title_manage_tags":"Verwalten","title_not_found":"Nicht gefunden","title_permissions":"Berechtigungen","title_tag_manager":"Schlagworte (Nutzer entdecken)","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","topic_name_editing_placeholder":"Freiform Name der Gruppe","unnamed_topic":"Unbenannt","update_available":"Aktualisierung verfügbar.","upload_finishing":"wird abgeschlossen...","user_not_found":"Nicht gefunden","validate_credential_action":"bestätigen","description_editing_placeholder":"Beschreibung (optional)","label_description":"Beschreibung","button_security":"Sicherheit","panel_title_general":"Allgemein","panel_title_security":"Sicherheit","panel_title_crop":"Zum Anpassen ziehen","panel_title_members":"Mitglieder","permissions_anonymous":"Anonym","permissions_authenticated":"Authentifiziert","topic_delete":"Chat löschen","permissions_user":"Benutzerberechtigungen","password_reset_email_sent":"Eine E-Mail wurde an {email} gesendet. Folgen Sie den Anweisungen in der E-Mail, um Ihr Passwort zurückzusetzen.","label_unarchive_topic":"Archiviert:","menu_item_reply":"Antwort","menu_item_forward":"Nach vorne","forward_to":"Weiterleiten","forward_to_search_placeholder":"Kontakte durchsuchen","label_new_password":"Neues Kennwort","drafty_unknown":"Nicht unterstützt","calls_incoming":"Eingehender Anruf","calls_outgoing":"Ausgehender Anruf","calls_you_label":"Du","menu_item_video_call":"Videoanruf","already_in_call":"Du redest schon!","call_cancelled":"abgebrochen","call_missed":"verpasster","call_declined":"abgelehnt"},"en":{"action_block_contact":"Block Contact","action_cancel":"cancel","action_clear_messages":"Clear Messages","action_delete_messages":"Clear Messages for All","action_leave_chat":"Leave Conversation","action_report_chat":"Report Conversation","archived_contacts":"Archived contacts ({count})","badge_danger":"Untrustworthy","badge_owner":"owner","badge_staff":"Staff-managed","badge_verified":"Verified/official","badge_you":"you","block_contact_warning":"Are you sure you want to block this contact?","blocked_contacts_link":"Blocked contacts ({count})","button_add_another":"Add another","button_add_members":"Add members","button_cancel":"Cancel","button_confirm":"Confirm","button_create":"Create","button_delete_account":"Delete account","button_edit":"Edit","button_logout":"Logout","button_ok":"OK","button_reset":"Reset","button_send_request":"Send request","button_sign_in":"Sign in","button_sign_up":"Sign up","button_subscribe":"Subscribe","button_update":"Update","cannot_initiate_file_upload":"Cannot initiate file upload.","channel":"channel","channel_prompt":"This is a channel","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_block":"Block","chat_invitation_ignore":"Ignore","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","code_doesnot_match":"Code does not match","contacts_not_found":"You have no chats
¯∖_(ツ)_/¯","contacts_not_found_short":"No contacts match \'\'{query}\'\'","credential_email_prompt":"Your registration email","delete_account":"Delete account","delete_account_warning":"Are you sure you want to delete your account? It cannot be undone.","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","deleted_content":"content deleted","download_action":"download","drafty_attachment":"Attachment","drafty_form":"Form:","drafty_image":"Picture","email_dative":"email","email_prompt":"Email, e.g. jdoe@example.com","enable_peers_messaging":"Enable","enter_confirmation_code_prompt":"Enter confirmation code sent to you by {method}:","error_invalid_id":"Invalid ID","file_attachment_too_large":"The file size {size} exceeds the {limit} limit.","forgot_password_link":"Forgot password?","full_name_prompt":"Full name, e.g. John Doe","granted_permissions":"Granted","group_has_no_members":"No members","group_user_id_prompt":"Group or User ID","image_caption_prompt":"Image caption","invalid_content":"invalid content","invalid_security_token":"Invalid security token","label_client":"Client:","label_content_type":"Content type:","label_default_access_mode":"Default access mode:","label_file_name":"File name:","label_group_members":"Group members:","label_incognito_mode":"Incognito mode:","label_message_sound":"Message sound:","label_muting_topic":"Muted:","label_other_user":"Other","label_password":"Password","label_permissions":"Permissions:","label_private":"Private comment","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_reset_password":"Send a password reset email:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server address:","label_server_to_use":"Server to use:","label_size":"Size:","label_topic_name":"Name","label_user_contacts":"Contacts:","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"You:","label_your_name":"Your name","label_your_permissions":"Your permissions:","last_seen_timestamp":"Last seen","leave_chat_warning":"Are you sure you want to leave this conversation?","link_contact_us":"Contact Us","link_privacy_policy":"Privacy Policy","link_terms_of_service":"Terms of Service","login_prompt":"Login","menu_item_archive_topic":"Archive","menu_item_block":"Block","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_delete_topic":"Delete","menu_item_edit_permissions":"Edit permissions","menu_item_info":"Info","menu_item_member_delete":"Remove","menu_item_mute":"Mute","menu_item_reply":"Reply","menu_item_restore_topic":"Restore","menu_item_send_retry":"Retry","menu_item_unblock":"Unblock","menu_item_unmute":"Unmute","message_sending":"sending...","message_sending_failed":"failed","messages_not_readable":"no access to messages","messaging_disabled_prompt":"Messaging disabled","more_online_members":"+{overflow} more","new_message_prompt":"New message","new_password_placeholder":"Enter new password","no_connection":"No connection","no_contacts":"You have no contacts :-(","numeric_confirmation_code_prompt":"Numbers only","online_now":"online now","password_prompt":"Password","password_unchanged_prompt":"Unchanged","peers_messaging_disabled":"Peer\'s messaging is disabled.","permission_admin":"Approve ({val})","permission_delete":"Delete ({val})","permission_join":"Join ({val})","permission_owner":"Owner ({val})","permission_pres":"Get notified ({val})","permission_read":"Read ({val})","permission_share":"Share ({val})","permission_write":"Write ({val})","phone_dative":"phone","private_editing_placeholder":"Visible to you only","push_init_failed":"Failed to initialize push notifications","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","reload_update":"Reload","report_chat_warning":"Are you sure you want to block and report this conversation?","requested_permissions":"Requested","save_attachment":"save","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","search_placeholder":"List like email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Account Settings","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_login":"Sign In","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_register":"Create Account","sidepanel_title_reset":"Reset Password","sidepanel_title_settings":"Settings","stay_logged_in":"Stay logged in","tabtitle_find_user":"find","tabtitle_group_by_id":"by id","tabtitle_new_group":"new group","tags_editor_no_tags":"Add some tags","tags_not_found":"No tags defined. Add some.","title_all_contacts":"All Contacts","title_group_members":"Group Members","title_manage_tags":"Manage","title_not_found":"Not found","title_permissions":"Permissions","title_tag_manager":"Tags (search & discovery)","topic_block_warning":"Are you sure you want to block this conversation?","topic_delete_warning":"Are you sure you want to delete this conversation?","topic_name_editing_placeholder":"Freeform name of the group","unnamed_topic":"Unnamed","update_available":"Update available.","upload_finishing":"finishing...","user_not_found":"Not found","validate_credential_action":"confirm","description_editing_placeholder":"Optional description","label_description":"Description","button_security":"Security","panel_title_crop":"Drag to Adjust","panel_title_general":"General","panel_title_members":"Members","panel_title_security":"Security","panel_title_info":"Info","permissions_anonymous":"Anonymous","permissions_authenticated":"Authenticated","topic_delete":"Delete Conversation","permissions_user":"User\'s Permissions","password_reset_email_sent":"An email has been sent to {email}. Follow the directions in the email to reset your password.","label_unarchive_topic":"Archived:","menu_item_forward":"Forward","forward_to":"Forward to","forward_to_search_placeholder":"Search contacts","label_new_password":"New password","drafty_unknown":"Unsupported","calls_incoming":"Incoming call","calls_outgoing":"Outgoing call","calls_you_label":"You","menu_item_video_call":"Video call","already_in_call":"You already in an ongoing call!","call_cancelled":"cancelled","call_missed":"missed","call_declined":"declined"},"es":{"action_block_contact":"Bloquear contacto","action_cancel":"cancelar","action_clear_messages":"Borrar mensajes","action_delete_messages":"Borrar mensajes para todos","action_leave_chat":"Dejar conversación","action_report_chat":"Reportar conversación","archived_contacts":"Contactos archivados ({count})","badge_danger":"Suspicaz","badge_owner":"propietario","badge_staff":"Administración","badge_verified":"Verificado","badge_you":"tú","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","blocked_contacts_link":"Contactos bloqueados ({count})","button_add_another":"Añadir contacto","button_add_members":"Añadir miembros","button_cancel":"Cancelar","button_confirm":"Confirmar","button_create":"Crear","button_delete_account":"Eliminar cuenta","button_edit":"Editar","button_logout":"Cerrar sesión","button_ok":"OK","button_reset":"Restablecer","button_send_request":"Enviar petición","button_sign_in":"Entrar","button_sign_up":"Regístrate","button_subscribe":"Suscribirse","button_update":"Actualizar","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","channel":"canal","channel_prompt":"Este es un canal","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_block":"Bloquear","chat_invitation_ignore":"Ignorar","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","code_doesnot_match":"El código no coincide","contacts_not_found":"No tienes chats
¯∖_(ツ)_/¯","contacts_not_found_short":"Ningún contacto coincide con \'\'{query}\'\'","credential_email_prompt":"Tu correo electrónico de registro","delete_account":"Eliminar cuenta","delete_account_warning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","deleted_content":"este mensaje fue eliminado","download_action":"descargar","drafty_attachment":"Archivo","drafty_form":"Formulario:","drafty_image":"Imagen","email_dative":"correo electrónico","email_prompt":"Correo electrónico, p.ej. juan@example.com","enable_peers_messaging":"Habilitar","enter_confirmation_code_prompt":"Introduzca el código de confirmación enviado a tu {method}:","error_invalid_id":"ID inválido","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","forgot_password_link":"¿Olvidaste tu contraseña?","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","granted_permissions":"Otorgados","group_has_no_members":"No hay miembros","group_user_id_prompt":"ID del grupo o usuario","image_caption_prompt":"Añade un comentario","invalid_content":"contenido inválido","invalid_security_token":"Token de seguridad inválido","label_client":"Cliente:","label_content_type":"Tipo de contenido:","label_default_access_mode":"Modo de acceso predeterminado:","label_file_name":"Nombre del archivo:","label_group_members":"Miembros del grupo:","label_incognito_mode":"Modo incógnito:","label_message_sound":"Sonido de mensaje:","label_muting_topic":"Silenciado:","label_other_user":"Otros","label_password":"Contraseña","label_permissions":"Permisos:","label_private":"Comentario privado","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","label_sdk":"SDK:","label_server":"Servidor:","label_server_address":"Dirección del servidor:","label_server_to_use":"Servidor para usar:","label_size":"Tamaño:","label_topic_name":"Nombre del tema","label_user_contacts":"Contactos:","label_user_id":"ID:","label_wire_transport":"Transporte de alambre:","label_you":"Tú:","label_your_name":"Tu nombre","label_your_permissions":"Tus permisos:","last_seen_timestamp":"Últ. vez","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","link_contact_us":"Contáctanos","link_privacy_policy":"Política de privacidad","link_terms_of_service":"Términos de uso","login_prompt":"Nombre de usuario","menu_item_archive_topic":"Archivar","menu_item_block":"Bloquear","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_delete_topic":"Eliminar","menu_item_edit_permissions":"Editar permisos","menu_item_info":"Información","menu_item_member_delete":"Eliminar","menu_item_mute":"Silenciar","menu_item_restore_topic":"Restaurar","menu_item_send_retry":"Inténtalo de nuevo","menu_item_unblock":"Desbloquear","menu_item_unmute":"Anular el silencio","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","messages_not_readable":"sin acceso a mensajes","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","more_online_members":"+{overflow} más","new_message_prompt":"Nuevo mensaje","new_password_placeholder":"Introduzca una nueva contraseña","no_connection":"Sin conexión","no_contacts":"No tienes contactos :-(","numeric_confirmation_code_prompt":"Sólo números","online_now":"en línea","password_prompt":"Contraseña","password_unchanged_prompt":"Sin cambios","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","permission_admin":"Approbar ({val})","permission_delete":"Eliminar ({val})","permission_join":"Unirse ({val})","permission_owner":"Propietario ({val})","permission_pres":"Ser notificado ({val})","permission_read":"Leer ({val})","permission_share":"Compartir ({val})","permission_write":"Escribir ({val})","phone_dative":"teléfono","private_editing_placeholder":"Sólo visible para tí","push_init_failed":"Error al inicializar las notificaciones push","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","reload_update":"Recargar","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","requested_permissions":"Solicitados","save_attachment":"guardar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_login":"Iniciar sesión","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_register":"Crear cuenta","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_settings":"Ajustes","stay_logged_in":"Permanecer conectado","tabtitle_find_user":"encontrar","tabtitle_group_by_id":"por ID","tabtitle_new_group":"nuevo grupo","tags_editor_no_tags":"Añadir etiquetas","tags_not_found":"No hay etiquetas definidas. Añade unas.","title_all_contacts":"Todos los contactos","title_group_members":"Miembros del grupo","title_manage_tags":"Gestionar","title_not_found":"No encontrado","title_permissions":"Permisos","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","topic_name_editing_placeholder":"Nombre del grupo","unnamed_topic":"Sin nombre","update_available":"Actualización disponible.","upload_finishing":"terminando...","user_not_found":"Usuario no encontrado","validate_credential_action":"confirmar","description_editing_placeholder":"Descripción (opcional)","label_description":"Descripción","button_security":"Seguridad","panel_title_crop":"Arrastra para ajustar","panel_title_general":"General","panel_title_members":"Miembros","panel_title_security":"Seguridad","panel_title_info":"Información","permissions_anonymous":"Anónimo","permissions_authenticated":"Autenticado","topic_delete":"Eliminar chat","permissions_user":"Permisos del usuario","password_reset_email_sent":"Se ha enviado un correo electrónico a {email}. Siga las instrucciones del correo electrónico para restablecer su contraseña.","label_unarchive_topic":"Archivado:","menu_item_reply":"Respuesta","menu_item_forward":"Reenviar","forward_to":"Reenviar a","forward_to_search_placeholder":"Buscar contactos","label_new_password":"Nueva contraseña","drafty_unknown":"No soportado","calls_incoming":"Llamada entrante","calls_outgoing":"Llamada saliente","calls_you_label":"Tú","menu_item_video_call":"Videollamada","already_in_call":"¡Ya estás hablando!","call_cancelled":"cancelada","call_missed":"perdida","call_declined":"rechazada"},"fr":{"action_block_contact":"Bloquer le Contact","action_cancel":"annuler","action_clear_messages":"Effacer les Messages","action_delete_messages":"Effacer les Messages pour Tous","action_leave_chat":"Quitter la Conversation","action_report_chat":"Signaler la Conversation","archived_contacts":"Contacts archivés ({count})","badge_danger":"Non fiable","badge_owner":"propriétaire","badge_staff":"Géré par le Staff","badge_verified":"Vérifié / Officiel","badge_you":"vous","block_contact_warning":"Êtes-vous sûr de bloquer le contact ?","blocked_contacts_link":"Contacts bloqués ({count})","button_add_another":"Ajouter un autre","button_add_members":"Ajouter des membres","button_cancel":"Annuler","button_confirm":"Confirmer","button_create":"Créer","button_delete_account":"Supprimer le compte","button_edit":"Modifier","button_logout":"Déconnexion","button_ok":"OK","button_reset":"Remettre à Zéro","button_send_request":"Envoyer une demande","button_sign_in":"Connexion","button_sign_up":"Créer un compte","button_subscribe":"S\'abonner","button_update":"Mettre à jour","cannot_initiate_file_upload":"Impossible de démarrer l\'envoi.","channel":"canal","channel_prompt":"C\'est un canal","chat_invitation":"Vous êtes invité à démarrer une conversation. Que voulez vous faire ?","chat_invitation_accept":"Accepter","chat_invitation_block":"Bloquer","chat_invitation_ignore":"Ignorer","clear_messages_warning":"Êtes-vous sûr de vouloir effacer tous les messages ? Aucun retour possible.","code_doesnot_match":"Le code ne correspond pas","contacts_not_found":"Vous n\'avez aucune conversation
¯∖_(ツ)_/¯","contacts_not_found_short":"Aucun contact ne correspond à \'\'{query}\'\'","credential_email_prompt":"Votre email d\'enregistrement","delete_account":"Supprimer le compte","delete_account_warning":"Êtes-vous sûr de vouloir supprimer votre compte ? Aucun retour possible.","delete_messages_warning":"Êtes-vous sûr de vouloir supprimer tous les messages pour tous ? Aucun retour possible.","deleted_content":"contenu supprimé","download_action":"télécharger","drafty_attachment":"Pièce(s) jointe(s)","drafty_form":"Formulaire:","drafty_image":"Image","email_dative":"email","email_prompt":"Email, par exemple jdoe@exemple.com","enable_peers_messaging":"Activer","enter_confirmation_code_prompt":"Entrez le code de confirmation envoyé par {method}:","error_invalid_id":"Identifiant invalide","file_attachment_too_large":"Le fichier de taille {size} dépasse la limite de {limit}.","forgot_password_link":"Mot de passe oublié ?","full_name_prompt":"Nom complet, par exemple John Doe","granted_permissions":"Accordé","group_has_no_members":"Aucun membre","group_user_id_prompt":"Identifiant d\'utilisateur ou de groupe","image_caption_prompt":"Description de l\'image","invalid_content":"contenu invalide","invalid_security_token":"Token de sécurité invalide","label_client":"Client :","label_content_type":"Type de contenu :","label_default_access_mode":"Mode d\'accès par défaut :","label_file_name":"Nom du fichier :","label_group_members":"Membres du groupe :","label_incognito_mode":"Mode incognito :","label_message_sound":"Son du message :","label_muting_topic":"Mué :","label_other_user":"Autre","label_password":"Mot de passe","label_permissions":"Permissions :","label_private":"Commentaire privé","label_push_notifications":"Notifications :","label_push_notifications_disabled":"Notifications (requière HTTPS):","label_reset_password":"Envoyer un mail de remise à zéro de mot de passe :","label_sdk":"SDK :","label_server":"Serveur :","label_server_address":"Adresse du serveur :","label_server_to_use":"Serveur à utiliser :","label_size":"Taille :","label_topic_name":"Nom","label_user_contacts":"Contacts :","label_user_id":"ID :","label_wire_transport":"Transport par cable :","label_you":"Vous :","label_your_name":"Votre nom","label_your_permissions":"Vos permissions :","last_seen_timestamp":"Vu pour la dernière fois","leave_chat_warning":"Êtes-vous sûr de vouloir quitter cette conversation ?","link_contact_us":"Contactez Nous","link_privacy_policy":"Politique de confidentialité","link_terms_of_service":"Conditions d\'utilisation","login_prompt":"Connexion","menu_item_archive_topic":"Archiver","menu_item_block":"Bloquer","menu_item_clear_messages":"Effacer les messages","menu_item_clear_messages_for_all":"Effacer pour Tous","menu_item_delete":"Supprimer","menu_item_delete_for_all":"Supprimer pour Tous","menu_item_delete_topic":"Supprimer","menu_item_edit_permissions":"Modifier les permissions","menu_item_info":"Informations","menu_item_member_delete":"Supprimer","menu_item_mute":"Rendre muer","menu_item_reply":"Répondre","menu_item_restore_topic":"Restorer","menu_item_send_retry":"Réessayer","menu_item_unblock":"Débloquer","menu_item_unmute":"Recevoir à nouveau","message_sending":"envoi en cours...","message_sending_failed":"échoué","messages_not_readable":"aucun accès aux messages","messaging_disabled_prompt":"Discussion désactivée","more_online_members":"+{overflow} de plus","new_message_prompt":"Nouveau message","new_password_placeholder":"Entrez un nouveau mot de passe","no_connection":"Aucune connexion","no_contacts":"Vous n\'avez pas de contacts :-(","numeric_confirmation_code_prompt":"Nombres seulement","online_now":"en ligne","password_prompt":"Mot de passe","password_unchanged_prompt":"Non changé","peers_messaging_disabled":"La messagerie point à point est désactivée.","permission_admin":"Approver ({val})","permission_delete":"Supprimer ({val})","permission_join":"Rejoindre ({val})","permission_owner":"Propriétaire ({val})","permission_pres":"Recevoir une notification ({val})","permission_read":"Lire ({val})","permission_share":"Partager ({val})","permission_write":"Ecrire ({val})","phone_dative":"téléphone","private_editing_placeholder":"Visible par vous seulement","push_init_failed":"Impossible d\'initialiser les notifications push","reconnect_countdown":"Déconnecté. Reconnexion dans {seconds}…","reconnect_now":"Essayer maintenant","reload_update":"Recharger","report_chat_warning":"Êtes-vous sûr de vouloir bloquer et signaler cette conversation ?","requested_permissions":"Demandé","save_attachment":"sauvegarder","search_for_contacts":"Utilisez la recherche pour trouver des contacts","search_no_results":"La recherche n\'a donné aucun résultat","search_placeholder":"Liste comme email:alice@exemple.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Paramètres du compte","sidepanel_title_archive":"Conversations Archivées","sidepanel_title_blocked":"Conversations Bloquées","sidepanel_title_cred":"Confirmer les identifiants","sidepanel_title_login":"Se Connecter","sidepanel_title_newtpk":"Démarrer une nouvelle Conversation","sidepanel_title_register":"Créer un compte","sidepanel_title_reset":"Remettre à Zéro le Mot de Passe","sidepanel_title_settings":"Paramètres","stay_logged_in":"Rester connecté","tabtitle_find_user":"trouver","tabtitle_group_by_id":"par identifiant","tabtitle_new_group":"nouveau groupe","tags_editor_no_tags":"Ajouter des étiquettes","tags_not_found":"Aucune étiquette définie. Ajoutez en.","title_all_contacts":"Tous les Contacts","title_group_members":"Membres du Groupe","title_manage_tags":"Gérer","title_not_found":"Pas trouvé","title_permissions":"Permissions","title_tag_manager":"Etiquettes (recherche & découverte)","topic_block_warning":"Êtes-vous sûr de vouloir bloquer cette conversation ?","topic_delete_warning":"Êtes-vous sûr de vouloir supprimer cette conversation ?","topic_name_editing_placeholder":"Nom libre du groupe","unnamed_topic":"Non nommé","update_available":"Mise à jour disponible.","upload_finishing":"fin...","user_not_found":"Pas trouvé","validate_credential_action":"confirmer","description_editing_placeholder":"Description facultative","label_description":"Description","button_security":"Sécurité","panel_title_crop":"Déplacez pour ajuster","panel_title_general":"Général","panel_title_members":"Membres","panel_title_security":"Sécurité","panel_title_info":"Informations","permissions_anonymous":"Anonyme","permissions_authenticated":"Authentifié","topic_delete":"Supprimer la Conversation","permissions_user":"Permissions d\'Utilisateur","password_reset_email_sent":"Un email a été envoyé à {email}. Suivez les instructions du mail pour remettre à zéro votre mot de passe.","label_unarchive_topic":"Archivé:","menu_item_forward":"Transférer","forward_to":"Transférer à","forward_to_search_placeholder":"Rechercher des contacts","label_new_password":"Nouveau mot de passe","drafty_unknown":"Non supporté"},"ko":{"action_block_contact":"연락차단","action_cancel":"취소","action_clear_messages":"메시지지우기","action_delete_messages":"모든메시지지우기","action_leave_chat":"대화나누기","action_report_chat":"대화기록","archived_contacts":"보관된연락처({수})","badge_danger":"의심 많은","badge_owner":"소유자","badge_staff":"직원 관리하에","badge_verified":"확인 됨","badge_you":"당신","block_contact_warning":"이연락처를차단하시겠습니까?","blocked_contacts_link":"차단된연락처({수})","button_add_another":"다른항목추가","button_add_members":"회원추가","button_cancel":"취소","button_confirm":"확인","button_create":"작성","button_delete_account":"계정삭제","button_edit":"편집","button_logout":"로그아웃","button_ok":"OK","button_reset":"재설정","button_send_request":"요청보내기","button_sign_in":"로그인","button_sign_up":"가입","button_subscribe":"구독","button_update":"업데이트","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","channel":"채널","channel_prompt":"이 채널입니다","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_block":"차단","chat_invitation_ignore":"무시","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","code_doesnot_match":"코드가일치하지않습니다","contacts_not_found":"채팅이없습니다
¯∖_(ツ)_/¯","contacts_not_found_short":"\'{문의}\'와일치하는연락처가없습니다.","credential_email_prompt":"등록이메일","delete_account":"계정삭제","delete_account_warning":"계정을삭제하시겠습니까?실행취소할수없습니다.","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","deleted_content":"내용이 삭제되었습니다","download_action":"다운로드","drafty_attachment":"부착","drafty_form":"형태:","drafty_image":"이미지","email_dative":"이메일","email_prompt":"이메일(예:hong@example.com)","enable_peers_messaging":"활성화","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","error_invalid_id":"잘못된ID","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","forgot_password_link":"비밀번호를잊으셨습니까?","full_name_prompt":"전체이름(예:홍길동)","granted_permissions":"승낙하다","group_has_no_members":"회원없음","group_user_id_prompt":"그룹또는사용자ID","image_caption_prompt":"이미지설명","invalid_content":"잘못된내용","invalid_security_token":"유효하지않은보안토큰","label_client":"클라이언트: ","label_content_type":"컨텐츠유형: ","label_default_access_mode":"기본액세스모드: ","label_file_name":"파일이름: ","label_group_members":"그룹회원: ","label_incognito_mode":"시크릿모드: ","label_message_sound":"메시지소리: ","label_muting_topic":"음소거: ","label_other_user":"기타","label_password":"비밀번호","label_permissions":"권한: ","label_private":"개인코멘트","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_reset_password":"비밀번호재설정이메일보내기: ","label_sdk":"SDK:","label_server":"서버: ","label_server_address":"서버주소: ","label_server_to_use":"사용할서버:","label_size":"크기: ","label_topic_name":"이름","label_user_contacts":"연락처: ","label_user_id":"ID:","label_wire_transport":"와이어수송:","label_you":"당신: ","label_your_name":"이름","label_your_permissions":"권한: ","last_seen_timestamp":"마지막으로본","leave_chat_warning":"이대화를나가시겠습니까?","link_contact_us":"문의처","link_privacy_policy":"개인정보보호정책","link_terms_of_service":"서비스약관","login_prompt":"로그인","menu_item_archive_topic":"보관","menu_item_block":"차단","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_delete_topic":"삭제","menu_item_edit_permissions":"편집권한","menu_item_info":"정보","menu_item_member_delete":"제거","menu_item_mute":"음소거","menu_item_restore_topic":"복원","menu_item_send_retry":"다시시도","menu_item_unblock":"차단해제","menu_item_unmute":"음소거해제","message_sending":"보내기...","message_sending_failed":"실패","messages_not_readable":"메시지에 액세스 할 수 없습니다","messaging_disabled_prompt":"메시지비활성화","more_online_members":"+{넘침}더보기","new_message_prompt":"새메시지","new_password_placeholder":"새비밀번호입력","no_connection":"연결없음","no_contacts":"연락처가없습니다 (._.)","numeric_confirmation_code_prompt":"숫자만","online_now":"현재접속중","password_prompt":"비밀번호","password_unchanged_prompt":"변경되지않음","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","permission_admin":"승인({val})","permission_delete":"삭제({val})","permission_join":"참여({val})","permission_owner":"소유자({val})","permission_pres":"알림받기({val})","permission_read":"읽기({val})","permission_share":"공유({val})","permission_write":"쓰기({val})","phone_dative":"전화","private_editing_placeholder":"나만볼수있습니다","push_init_failed":"푸시알림을초기화하지못했습니다","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","reload_update":"재로드","report_chat_warning":"이대화를차단하고기록하시겠습니까?","requested_permissions":"요청","save_attachment":"저장","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_account_settings":"계정설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","sidepanel_title_cred":"자격증명확인","sidepanel_title_login":"로그인","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_register":"계정만들기","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_settings":"설정","stay_logged_in":"로그인상태유지","tabtitle_find_user":"찾기","tabtitle_group_by_id":"id로","tabtitle_new_group":"새그룹","tags_editor_no_tags":"일부태그추가","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","title_all_contacts":"모든연락처","title_group_members":"그룹구성원","title_manage_tags":"관리","title_not_found":"찾을수없음","title_permissions":"권한","title_tag_manager":"태그(사용자검색)","topic_block_warning":"이대화를차단하시겠습니까?","topic_delete_warning":"이대화를삭제하시겠습니까?","topic_name_editing_placeholder":"그룹의자유형이름","unnamed_topic":"이름없는","update_available":"업데이트가능.","upload_finishing":"마무리...","user_not_found":"찾을수없음","validate_credential_action":"확인","description_editing_placeholder":"설명(선택 사항)","label_description":"설명","button_security":"보안","panel_title_crop":"드래그하여 조정","panel_title_general":"일반","panel_title_members":"구성원","panel_title_security":"보안","panel_title_info":"정보","permissions_anonymous":"익명","permissions_authenticated":"인증됨","topic_delete":"채팅 삭제","permissions_user":"사용자 권한","password_reset_email_sent":"이메일이 {email}(으)로 전송되었습니다. 이메일의 지침에 따라 비밀번호를 재설정하세요.","label_unarchive_topic":"보관됨:","menu_item_reply":"회신하다","menu_item_forward":"리디렉션","forward_to":"메시지를 리디렉션","forward_to_search_placeholder":"연락처 검색","label_new_password":"새 비밀번호","drafty_unknown":"지원되지 않음","calls_incoming":"수신 전화","calls_outgoing":"발신 전화","calls_you_label":"너","menu_item_video_call":"영상 통화","already_in_call":"당신은 이미 말하고 있습니다!","call_cancelled":"취소 된","call_missed":"부재중","call_declined":"통화 거부"},"ro":{"action_block_contact":"Blochează contact","action_cancel":"anulează","action_clear_messages":"Șterge mesajele","action_delete_messages":"Șterge toate mesajele","action_leave_chat":"Ieși din conversație","action_report_chat":"Raportează conversația","archived_contacts":"Contacte arhivate ({count})","badge_danger":"Suspicios","badge_owner":"owner","badge_staff":"Administrare","badge_verified":"Verificat","badge_you":"tu","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","blocked_contacts_link":"Contact blocate ({count})","button_add_another":"Adaugă","button_add_members":"Adaugă persoane","button_cancel":"Anulează","button_confirm":"Confirmă","button_create":"Creează","button_delete_account":"Șterge cont","button_edit":"Editează","button_logout":"Deconectare","button_ok":"OK","button_reset":"Resetează","button_send_request":"Trimite cerere","button_sign_in":"Conectează-te","button_sign_up":"Creează cont","button_subscribe":"Subscribe","button_update":"Actualizează","cannot_initiate_file_upload":"Nu se poate face încărcarea.","channel":"canal","channel_prompt":"Acesta este un canal","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_block":"Blochează","chat_invitation_ignore":"Ignoră","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","code_doesnot_match":"Codul furnizat nu este valid","contacts_not_found":"Nu ai contacte salvate
¯∖_(ツ)_/¯","contacts_not_found_short":"Niciun contact găsit după criteriile \'\'{query}\'\'","credential_email_prompt":"Adresa de e-mail","delete_account":"Șterge contul","delete_account_warning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","deleted_content":"conținut șters","download_action":"download","drafty_attachment":"Atasament","drafty_form":"Formă:","drafty_image":"Imagine","email_dative":"email","email_prompt":"Adresa de e-mail","enable_peers_messaging":"Activează","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","error_invalid_id":"ID Invalid","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","forgot_password_link":"Ți-ai uitat parola?","full_name_prompt":"Numele tău","granted_permissions":"Oferite","group_has_no_members":"În acest grup nu se află persoane","group_user_id_prompt":"Grup sau user ID","image_caption_prompt":"Titlul imaginii","invalid_content":"conținut invalid","invalid_security_token":"Codul de securitate este invalid","label_client":"Client:","label_content_type":"Tip conținut:","label_default_access_mode":"Default access mode:","label_file_name":"Nume fișier:","label_group_members":"Membrii grupului:","label_incognito_mode":"Mod incognito:","label_message_sound":"Sunet de mesaj:","label_muting_topic":"Mod silențios (muted):","label_other_user":"Altele","label_password":"Parola","label_permissions":"Permisiuni:","label_private":"Comentariu privat","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_reset_password":"Resetează parola:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Adresa serverului:","label_server_to_use":"Server de utilizat:","label_size":"Size:","label_topic_name":"Nume","label_user_contacts":"Contacte:","label_user_id":"ID:","label_wire_transport":"Transportul legat:","label_you":"Tu:","label_your_name":"Numele tău","label_your_permissions":"Permisiuniile tale:","last_seen_timestamp":"Văzut ultima dată","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","link_contact_us":"Contactează-ne","link_privacy_policy":"Politica de Confidențialitate","link_terms_of_service":"Termenii Serviciului","login_prompt":"Conectează-te","menu_item_archive_topic":"Arhivează","menu_item_block":"Blochează","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_delete_topic":"Șterge","menu_item_edit_permissions":"Editează permisiuni","menu_item_info":"Info","menu_item_member_delete":"Șterge persoană","menu_item_mute":"Mute","menu_item_restore_topic":"Restabili","menu_item_send_retry":"Reîncearcă","menu_item_unblock":"Deblochează","menu_item_unmute":"Unmute","message_sending":"se trimite...","message_sending_failed":"eroare","messages_not_readable":"Mesajele nu pot fi citite","messaging_disabled_prompt":"Mesageria este dezactivată","more_online_members":"+{overflow} mai mult","new_message_prompt":"Mesaj nou","new_password_placeholder":"Introdu parolă","no_connection":"Nu există conexiune","no_contacts":"Nu ai contacte adăugate :-(","numeric_confirmation_code_prompt":"Doar cifre","online_now":"online acum","password_prompt":"Parola","password_unchanged_prompt":"Neschimbată","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","permission_admin":"Aprobare ({val})","permission_delete":"Ștergere ({val})","permission_join":"Participare ({val})","permission_owner":"Deținător ({val})","permission_pres":"Notificare ({val})","permission_read":"Citire ({val})","permission_share":"Distribuire ({val})","permission_write":"Scriere ({val})","phone_dative":"telefon","private_editing_placeholder":"Vizibil doar ție","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","reload_update":"Reîncarcă","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","requested_permissions":"Necesare","save_attachment":"salvează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","search_placeholder":"Caută după e-mail sau număr telefon...","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_login":"Conectează-te","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_register":"Creează Cont","sidepanel_title_reset":"Resetează Parola","sidepanel_title_settings":"Setări","stay_logged_in":"Rămâi conectat","tabtitle_find_user":"caută","tabtitle_group_by_id":"după id","tabtitle_new_group":"grup nou","tags_editor_no_tags":"Adaugă tag-uri","tags_not_found":"Niciun tag definit. Adaugă.","title_all_contacts":"Toate Contactele","title_group_members":"Persoanele din grup","title_manage_tags":"Administrează","title_not_found":"Nu a fost găsit","title_permissions":"Permisiuni","title_tag_manager":"Tag-uri (user discovery)","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","topic_name_editing_placeholder":"Numele grupului","unnamed_topic":"Nedenumit","update_available":"Actualizare disponibilă.","upload_finishing":"se încarcă...","user_not_found":"Utilizatorul nu a fost găsit","validate_credential_action":"confirmă","description_editing_placeholder":"Descriere (opțional)","label_description":"Descriere","button_security":"Securitate","panel_title_crop":"Trageți pentru a ajusta","panel_title_general":"Generale","panel_title_members":"Membri","panel_title_security":"Securitate","panel_title_info":"Info","permissions_anonymous":"Anonim","permissions_authenticated":"Autentificat","topic_delete":"Ștergeți Chat","permissions_user":"Permisiunile utilizatorului","password_reset_email_sent":"Un e-mail a fost trimis către {email}. Urmați instrucțiunile din e-mail pentru a vă reseta parola.","label_unarchive_topic":"Arhivat:","menu_item_reply":"A raspunde","menu_item_forward":"Redirecţiona","forward_to":"Redirecționați către","forward_to_search_placeholder":"Căutați contacte","label_new_password":"Parolă Nouă","drafty_unknown":"Neacceptat","calls_incoming":"Apel primit","calls_outgoing":"Apel efectuat","calls_you_label":"Tu","menu_item_video_call":"Apel video","already_in_call":"Deja vorbesti!","call_cancelled":"anulat","call_missed":"pierdut","call_declined":"refuzat"},"ru":{"action_block_contact":"Заблокировать контакт","action_cancel":"отменить","action_clear_messages":"Удалить сообщения","action_delete_messages":"Удалить сообщения","action_leave_chat":"Уйти из чата","action_report_chat":"Сообщить о нарушении","archived_contacts":"Чаты в архиве ({count})","badge_danger":"Подозрительный","badge_owner":"влад.","badge_staff":"Администрация","badge_verified":"Верифицированный","badge_you":"вы","block_contact_warning":"Вы действительно заблокировать этот контакт?","blocked_contacts_link":"Заблокированные ({count})","button_add_another":"Добавить","button_add_members":"Добавить","button_cancel":"Отменить","button_confirm":"Подтвердить","button_create":"Создать","button_delete_account":"Удалить аккаунт","button_edit":"Редактировать","button_logout":"Выйти","button_ok":"OK","button_reset":"Изменить","button_send_request":"Отправить","button_sign_in":"Войти","button_sign_up":"Создать аккаунт","button_subscribe":"Подписаться","button_update":"Применить","cannot_initiate_file_upload":"Ошибка загрузки файла.","channel":"канал","channel_prompt":"Создать канал","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_block":"Заблокировать","chat_invitation_ignore":"Игнорировать","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","code_doesnot_match":"Код не совпадает","contacts_not_found":"Чатов нет
¯∖_(ツ)_/¯","contacts_not_found_short":"Нет контактов для запроса \'\'{query}\'\'","credential_email_prompt":"Регистрационный емейл","delete_account":"Удалить аккаунт","delete_account_warning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","deleted_content":"удалено","download_action":"скачать","drafty_attachment":"Аттачмент","drafty_form":"Форма:","drafty_image":"Картинка","email_dative":"емейлу","email_prompt":"Email, напр. ivan@example.com","enable_peers_messaging":"Разблокировать.","enter_confirmation_code_prompt":"Код подтверждения, полученный по {method}:","error_invalid_id":"Неверный ID","file_attachment_too_large":"Размер файла {size} превышает {limit} лимит.","forgot_password_link":"Напомнить пароль","full_name_prompt":"Полное имя, напр. Иван Петров","granted_permissions":"Получены","group_has_no_members":"Нет участников","group_user_id_prompt":"ID чата или пользователя","image_caption_prompt":"Подпись к фото","invalid_content":"сообщение не читается","invalid_security_token":"Токен некорректен","label_client":"Клиент:","label_content_type":"Тип:","label_default_access_mode":"Доступ по умолчанию:","label_file_name":"Имя файла:","label_group_members":"Участники чата:","label_incognito_mode":"Режим инкогнито:","label_message_sound":"Звук нового сообщения:","label_muting_topic":"Без уведомлений","label_other_user":"Второй","label_password":"Пароль","label_permissions":"Права доступа:","label_private":"Комментарий","label_push_notifications":"Уведомления:","label_push_notifications_disabled":"Уведомления (требуют HTTPS):","label_reset_password":"Отправить емейл для смены пароля:","label_sdk":"SDK:","label_server":"Сервер:","label_server_address":"Адрес сервера:","label_server_to_use":"Использовать сервер:","label_size":"Размер:","label_topic_name":"Название","label_user_contacts":"Конакты:","label_user_id":"ID:","label_wire_transport":"Соединение:","label_you":"Вы:","label_your_name":"Ваше имя","label_your_permissions":"Ваши права доступа:","last_seen_timestamp":"Был активен","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","link_contact_us":"Связаться с нами","link_privacy_policy":"Политика конфиденциальности","link_terms_of_service":"Условия сервиса","login_prompt":"Логин","menu_item_archive_topic":"В архив","menu_item_block":"Заблокировать","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_delete_topic":"Удалить чат","menu_item_edit_permissions":"Права доступа","menu_item_info":"Информация","menu_item_member_delete":"Отписать","menu_item_mute":"Не уведомлять","menu_item_restore_topic":"Разархивировать","menu_item_send_retry":"Отправить заново","menu_item_unblock":"Разблокировать","menu_item_unmute":"Уведомлять","message_sending":"в пути...","message_sending_failed":"ошибка","messages_not_readable":"нет доступа к сообщениям","messaging_disabled_prompt":"Отправка недоступна","more_online_members":"+еще {overflow}","new_message_prompt":"Новое сообщение","new_password_placeholder":"Введите новый пароль","no_connection":"Нет связи","no_contacts":"Ничего нет :-(","numeric_confirmation_code_prompt":"Только цифры","online_now":"онлайн","password_prompt":"Пароль","password_unchanged_prompt":"Не изменен","peers_messaging_disabled":"Чат заблокирован у корреспондента.","permission_admin":"Подтверждать ({val})","permission_delete":"Удалять ({val})","permission_join":"Подписываться ({val})","permission_owner":"Владелец ({val})","permission_pres":"Уведомлять ({val})","permission_read":"Читать ({val})","permission_share":"Приглашать ({val})","permission_write":"Писать ({val})","phone_dative":"телефону","private_editing_placeholder":"Виден только вам","push_init_failed":"Ошибка инициализации пуш уведомлений","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","reload_update":"Обновить","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","requested_permissions":"Требуются","save_attachment":"сохранить","search_for_contacts":"Поиск контактов","search_no_results":"Ничего не найдено","search_placeholder":"Список, напр. email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","sidepanel_title_account_settings":"Настройки аккаунта","sidepanel_title_archive":"Архив чатов","sidepanel_title_blocked":"Заблокированные чаты","sidepanel_title_cred":"Подтвердить","sidepanel_title_login":"Авторизация","sidepanel_title_newtpk":"Новый чат","sidepanel_title_register":"Зарегистрироваться","sidepanel_title_reset":"Сменить пароль","sidepanel_title_settings":"Настройки","stay_logged_in":"Запомнить","tabtitle_find_user":"найти","tabtitle_group_by_id":"по id","tabtitle_new_group":"создать","tags_editor_no_tags":"Добавьте теги","tags_not_found":"Тегов нет. Добавьте","title_all_contacts":"Все контакты","title_group_members":"Участники","title_manage_tags":"Редактировать","title_not_found":"Не найден","title_permissions":"Права доступа","title_tag_manager":"Теги для поиска","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_name_editing_placeholder":"Название чата","unnamed_topic":"Без названия","update_available":"Есть новая версия приложения.","upload_finishing":"завершение...","user_not_found":"Не найден","validate_credential_action":"подтвердить","description_editing_placeholder":"Описание (не обязательно)","label_description":"Описание","button_security":"Безопасность","panel_title_crop":"Обрезать картинку","panel_title_general":"Общие настройки","panel_title_members":"Участники","panel_title_security":"Безопасность","panel_title_info":"Подробности","permissions_anonymous":"Анонимный","permissions_authenticated":"Авторизованный","topic_delete":"Удалить чат","permissions_user":"Права доступа","password_reset_email_sent":"Сообщение было отправлено на адрес {email}. Следуйте инструкциям в сообщении, чтобы изменить пароль.","label_unarchive_topic":"Архивирован:","menu_item_reply":"Ответить","menu_item_forward":"Переслать","forward_to":"Переслать","forward_to_search_placeholder":"Поиск контактов","label_new_password":"Новый пароль","drafty_unknown":"Не поддерживается","calls_incoming":"Входящий звонок","calls_outgoing":"Исходящий звонок","calls_you_label":"Вы","menu_item_video_call":"Видеозвонок","already_in_call":"Вы уже звоните кому-то!","call_cancelled":"отменен","call_missed":"пропущен","call_declined":"отклонен"},"zh-TW":{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_another":"新增其他人","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話
¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 \'\'{query}\'\' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","deleted_content":"內容已被刪除","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人:","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","validate_credential_action":"確認","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"一封電子郵件已發送至 {email}。按照電子郵件中的說明重置密碼。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒"},"zh":{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_another":"加上另一个","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话
¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配\'\'{query}\'\'","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","deleted_content":"内容已删除","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"蓦然访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来:","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后可见","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"成员间消息已禁用。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索返回任何结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","validate_credential_action":"确认","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"一封电子邮件已发送至 {email}。按照电子邮件中的说明重置密码。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒"}}'); /***/ }) diff --git a/umd/index.prod.js b/umd/index.prod.js index ec2b6cbd..b4998f97 100644 --- a/umd/index.prod.js +++ b/umd/index.prod.js @@ -1,2 +1,2 @@ -(()=>{var e={27:(e,t,a)=>{var s,i;s=function(){var e={172351395:{name:"EBML",type:"Container"},646:{name:"EBMLVersion",type:"Uint"},759:{name:"EBMLReadVersion",type:"Uint"},754:{name:"EBMLMaxIDLength",type:"Uint"},755:{name:"EBMLMaxSizeLength",type:"Uint"},642:{name:"DocType",type:"String"},647:{name:"DocTypeVersion",type:"Uint"},645:{name:"DocTypeReadVersion",type:"Uint"},108:{name:"Void",type:"Binary"},63:{name:"CRC-32",type:"Binary"},190023271:{name:"SignatureSlot",type:"Container"},16010:{name:"SignatureAlgo",type:"Uint"},16026:{name:"SignatureHash",type:"Uint"},16037:{name:"SignaturePublicKey",type:"Binary"},16053:{name:"Signature",type:"Binary"},15963:{name:"SignatureElements",type:"Container"},15995:{name:"SignatureElementList",type:"Container"},9522:{name:"SignedElement",type:"Binary"},139690087:{name:"Segment",type:"Container"},21863284:{name:"SeekHead",type:"Container"},3515:{name:"Seek",type:"Container"},5035:{name:"SeekID",type:"Binary"},5036:{name:"SeekPosition",type:"Uint"},88713574:{name:"Info",type:"Container"},13220:{name:"SegmentUID",type:"Binary"},13188:{name:"SegmentFilename",type:"String"},1882403:{name:"PrevUID",type:"Binary"},1868715:{name:"PrevFilename",type:"String"},2013475:{name:"NextUID",type:"Binary"},1999803:{name:"NextFilename",type:"String"},1092:{name:"SegmentFamily",type:"Binary"},10532:{name:"ChapterTranslate",type:"Container"},10748:{name:"ChapterTranslateEditionUID",type:"Uint"},10687:{name:"ChapterTranslateCodec",type:"Uint"},10661:{name:"ChapterTranslateID",type:"Binary"},710577:{name:"TimecodeScale",type:"Uint"},1161:{name:"Duration",type:"Float"},1121:{name:"DateUTC",type:"Date"},15273:{name:"Title",type:"String"},3456:{name:"MuxingApp",type:"String"},5953:{name:"WritingApp",type:"String"},103:{name:"Timecode",type:"Uint"},6228:{name:"SilentTracks",type:"Container"},6359:{name:"SilentTrackNumber",type:"Uint"},39:{name:"Position",type:"Uint"},43:{name:"PrevSize",type:"Uint"},35:{name:"SimpleBlock",type:"Binary"},32:{name:"BlockGroup",type:"Container"},33:{name:"Block",type:"Binary"},34:{name:"BlockVirtual",type:"Binary"},13729:{name:"BlockAdditions",type:"Container"},38:{name:"BlockMore",type:"Container"},110:{name:"BlockAddID",type:"Uint"},37:{name:"BlockAdditional",type:"Binary"},27:{name:"BlockDuration",type:"Uint"},122:{name:"ReferencePriority",type:"Uint"},123:{name:"ReferenceBlock",type:"Int"},125:{name:"ReferenceVirtual",type:"Int"},36:{name:"CodecState",type:"Binary"},13730:{name:"DiscardPadding",type:"Int"},14:{name:"Slices",type:"Container"},104:{name:"TimeSlice",type:"Container"},76:{name:"LaceNumber",type:"Uint"},77:{name:"FrameNumber",type:"Uint"},75:{name:"BlockAdditionID",type:"Uint"},78:{name:"Delay",type:"Uint"},79:{name:"SliceDuration",type:"Uint"},72:{name:"ReferenceFrame",type:"Container"},73:{name:"ReferenceOffset",type:"Uint"},74:{name:"ReferenceTimeCode",type:"Uint"},47:{name:"EncryptedBlock",type:"Binary"},106212971:{name:"Tracks",type:"Container"},46:{name:"TrackEntry",type:"Container"},87:{name:"TrackNumber",type:"Uint"},13253:{name:"TrackUID",type:"Uint"},3:{name:"TrackType",type:"Uint"},57:{name:"FlagEnabled",type:"Uint"},8:{name:"FlagDefault",type:"Uint"},5546:{name:"FlagForced",type:"Uint"},28:{name:"FlagLacing",type:"Uint"},11751:{name:"MinCache",type:"Uint"},11768:{name:"MaxCache",type:"Uint"},254851:{name:"DefaultDuration",type:"Uint"},216698:{name:"DefaultDecodedFieldDuration",type:"Uint"},209231:{name:"TrackTimecodeScale",type:"Float"},4991:{name:"TrackOffset",type:"Int"},5614:{name:"MaxBlockAdditionID",type:"Uint"},4974:{name:"Name",type:"String"},177564:{name:"Language",type:"String"},6:{name:"CodecID",type:"String"},9122:{name:"CodecPrivate",type:"Binary"},362120:{name:"CodecName",type:"String"},13382:{name:"AttachmentLink",type:"Uint"},1742487:{name:"CodecSettings",type:"String"},1785920:{name:"CodecInfoURL",type:"String"},438848:{name:"CodecDownloadURL",type:"String"},42:{name:"CodecDecodeAll",type:"Uint"},12203:{name:"TrackOverlay",type:"Uint"},5802:{name:"CodecDelay",type:"Uint"},5819:{name:"SeekPreRoll",type:"Uint"},9764:{name:"TrackTranslate",type:"Container"},9980:{name:"TrackTranslateEditionUID",type:"Uint"},9919:{name:"TrackTranslateCodec",type:"Uint"},9893:{name:"TrackTranslateTrackID",type:"Binary"},96:{name:"Video",type:"Container"},26:{name:"FlagInterlaced",type:"Uint"},5048:{name:"StereoMode",type:"Uint"},5056:{name:"AlphaMode",type:"Uint"},5049:{name:"OldStereoMode",type:"Uint"},48:{name:"PixelWidth",type:"Uint"},58:{name:"PixelHeight",type:"Uint"},5290:{name:"PixelCropBottom",type:"Uint"},5307:{name:"PixelCropTop",type:"Uint"},5324:{name:"PixelCropLeft",type:"Uint"},5341:{name:"PixelCropRight",type:"Uint"},5296:{name:"DisplayWidth",type:"Uint"},5306:{name:"DisplayHeight",type:"Uint"},5298:{name:"DisplayUnit",type:"Uint"},5299:{name:"AspectRatioType",type:"Uint"},963876:{name:"ColourSpace",type:"Binary"},1029411:{name:"GammaValue",type:"Float"},230371:{name:"FrameRate",type:"Float"},97:{name:"Audio",type:"Container"},53:{name:"SamplingFrequency",type:"Float"},14517:{name:"OutputSamplingFrequency",type:"Float"},31:{name:"Channels",type:"Uint"},15739:{name:"ChannelPositions",type:"Binary"},8804:{name:"BitDepth",type:"Uint"},98:{name:"TrackOperation",type:"Container"},99:{name:"TrackCombinePlanes",type:"Container"},100:{name:"TrackPlane",type:"Container"},101:{name:"TrackPlaneUID",type:"Uint"},102:{name:"TrackPlaneType",type:"Uint"},105:{name:"TrackJoinBlocks",type:"Container"},109:{name:"TrackJoinUID",type:"Uint"},64:{name:"TrickTrackUID",type:"Uint"},65:{name:"TrickTrackSegmentUID",type:"Binary"},70:{name:"TrickTrackFlag",type:"Uint"},71:{name:"TrickMasterTrackUID",type:"Uint"},68:{name:"TrickMasterTrackSegmentUID",type:"Binary"},11648:{name:"ContentEncodings",type:"Container"},8768:{name:"ContentEncoding",type:"Container"},4145:{name:"ContentEncodingOrder",type:"Uint"},4146:{name:"ContentEncodingScope",type:"Uint"},4147:{name:"ContentEncodingType",type:"Uint"},4148:{name:"ContentCompression",type:"Container"},596:{name:"ContentCompAlgo",type:"Uint"},597:{name:"ContentCompSettings",type:"Binary"},4149:{name:"ContentEncryption",type:"Container"},2017:{name:"ContentEncAlgo",type:"Uint"},2018:{name:"ContentEncKeyID",type:"Binary"},2019:{name:"ContentSignature",type:"Binary"},2020:{name:"ContentSigKeyID",type:"Binary"},2021:{name:"ContentSigAlgo",type:"Uint"},2022:{name:"ContentSigHashAlgo",type:"Uint"},206814059:{name:"Cues",type:"Container"},59:{name:"CuePoint",type:"Container"},51:{name:"CueTime",type:"Uint"},55:{name:"CueTrackPositions",type:"Container"},119:{name:"CueTrack",type:"Uint"},113:{name:"CueClusterPosition",type:"Uint"},112:{name:"CueRelativePosition",type:"Uint"},50:{name:"CueDuration",type:"Uint"},4984:{name:"CueBlockNumber",type:"Uint"},106:{name:"CueCodecState",type:"Uint"},91:{name:"CueReference",type:"Container"},22:{name:"CueRefTime",type:"Uint"},23:{name:"CueRefCluster",type:"Uint"},4959:{name:"CueRefNumber",type:"Uint"},107:{name:"CueRefCodecState",type:"Uint"},155296873:{name:"Attachments",type:"Container"},8615:{name:"AttachedFile",type:"Container"},1662:{name:"FileDescription",type:"String"},1646:{name:"FileName",type:"String"},1632:{name:"FileMimeType",type:"String"},1628:{name:"FileData",type:"Binary"},1710:{name:"FileUID",type:"Uint"},1653:{name:"FileReferral",type:"Binary"},1633:{name:"FileUsedStartTime",type:"Uint"},1634:{name:"FileUsedEndTime",type:"Uint"},4433776:{name:"Chapters",type:"Container"},1465:{name:"EditionEntry",type:"Container"},1468:{name:"EditionUID",type:"Uint"},1469:{name:"EditionFlagHidden",type:"Uint"},1499:{name:"EditionFlagDefault",type:"Uint"},1501:{name:"EditionFlagOrdered",type:"Uint"},54:{name:"ChapterAtom",type:"Container"},13252:{name:"ChapterUID",type:"Uint"},5716:{name:"ChapterStringUID",type:"String"},17:{name:"ChapterTimeStart",type:"Uint"},18:{name:"ChapterTimeEnd",type:"Uint"},24:{name:"ChapterFlagHidden",type:"Uint"},1432:{name:"ChapterFlagEnabled",type:"Uint"},11879:{name:"ChapterSegmentUID",type:"Binary"},11964:{name:"ChapterSegmentEditionUID",type:"Uint"},9155:{name:"ChapterPhysicalEquiv",type:"Uint"},15:{name:"ChapterTrack",type:"Container"},9:{name:"ChapterTrackNumber",type:"Uint"},0:{name:"ChapterDisplay",type:"Container"},5:{name:"ChapString",type:"String"},892:{name:"ChapLanguage",type:"String"},894:{name:"ChapCountry",type:"String"},10564:{name:"ChapProcess",type:"Container"},10581:{name:"ChapProcessCodecID",type:"Uint"},1293:{name:"ChapProcessPrivate",type:"Binary"},10513:{name:"ChapProcessCommand",type:"Container"},10530:{name:"ChapProcessTime",type:"Uint"},10547:{name:"ChapProcessData",type:"Binary"},39109479:{name:"Tags",type:"Container"},13171:{name:"Tag",type:"Container"},9152:{name:"Targets",type:"Container"},10442:{name:"TargetTypeValue",type:"Uint"},9162:{name:"TargetType",type:"String"},9157:{name:"TagTrackUID",type:"Uint"},9161:{name:"TagEditionUID",type:"Uint"},9156:{name:"TagChapterUID",type:"Uint"},9158:{name:"TagAttachmentUID",type:"Uint"},10184:{name:"SimpleTag",type:"Container"},1443:{name:"TagName",type:"String"},1146:{name:"TagLanguage",type:"String"},1156:{name:"TagDefault",type:"Uint"},1159:{name:"TagString",type:"String"},1157:{name:"TagBinary",type:"Binary"}};function t(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e}function a(e,t){this.name=e||"Unknown",this.type=t||"Unknown"}function s(e,t){a.call(this,e,t||"Uint")}function i(e){return e.length%2==1?"0"+e:e}function n(e,t){a.call(this,e,t||"Float")}function o(e,t){a.call(this,e,t||"Container")}function r(e){o.call(this,"File","File"),this.setSource(e)}function l(e,t,a,s){if("object"==typeof a&&(s=a,a=void 0),!a)return new Promise((function(a){l(e,t,a,s)}));try{var i=new FileReader;i.onloadend=function(){try{var n=new r(new Uint8Array(i.result));n.fixDuration(t,s)&&(e=n.toBlob(e.type))}catch(e){}a(e)},i.readAsArrayBuffer(e)}catch(t){a(e)}}return a.prototype.updateBySource=function(){},a.prototype.setSource=function(e){this.source=e,this.updateBySource()},a.prototype.updateByData=function(){},a.prototype.setData=function(e){this.data=e,this.updateByData()},t(s,a),s.prototype.updateBySource=function(){this.data="";for(var e=0;e=s&&a<8;a++,s*=128);if(!t)for(var i=s+e,n=a-1;n>=0;n--){var o=i%256;this.source[this.offset+n]=o,i=(i-o)/256}this.offset+=a},o.prototype.writeSections=function(e){this.offset=0;for(var t=0;t{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var s in t)a.o(t,s)&&!a.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";const e=React;var t=a.n(e);const s=ReactDOM;var i=a.n(s);const n=ReactIntl,o=JSON.parse('{"de":{"action_block_contact":"Kontakt blockieren","action_cancel":"Abbrechen","action_clear_messages":"Nachrichten leeren","action_delete_messages":"Nachrichten für alle löschen","action_leave_chat":"Unterhaltung verlassen","action_report_chat":"Unterhaltung melden","archived_contacts":"Archivierte Kontakte ({count})","badge_danger":"Verdächtig","badge_owner":"Besitzer","badge_staff":"Verwaltung","badge_verified":"Verifiziert","badge_you":"Sie","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","blocked_contacts_link":"Blockierte Kontakte ({count})","button_add_another":"Hinzufügen","button_add_members":"Mitglieder hinzufügen","button_cancel":"Abbrechen","button_confirm":"Bestätigen","button_create":"Erstellen","button_delete_account":"Konto löschen","button_edit":"Bearbeiten","button_logout":"Abmelden","button_ok":"OK","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","button_sign_in":"Anmelden","button_sign_up":"Anmelden","button_subscribe":"Abbonieren","button_update":"Aktualisieren","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","channel":"Sender","channel_prompt":"Dies ist ein Sender","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_block":"Blockieren","chat_invitation_ignore":"Ignorieren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","code_doesnot_match":"Code stimmt nicht überein","contacts_not_found":"Sie haben keine Unterhaltungen
¯∖_(ツ)_/¯","contacts_not_found_short":"Keine Kontakte für \'\'{query}\'\'","credential_email_prompt":"E-Mail Adresse für Registrierung","delete_account":"Konto löschen","delete_account_warning":"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","deleted_content":"Inhalt gelöscht","download_action":"herunterladen","drafty_attachment":"Dateianhang","drafty_form":"Formular:","drafty_image":"Bild","email_dative":"E-Mail","email_prompt":"E-Mail, z.B. lisam@beispiel.de","enable_peers_messaging":"Aktivieren","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","error_invalid_id":"ungültige ID","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","forgot_password_link":"Passwort vergessen?","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","granted_permissions":"Erteilt","group_has_no_members":"Keine Mitglieder","group_user_id_prompt":"Gruppe oder Benutzer ID","image_caption_prompt":"Bildunterschrift","invalid_content":"ungültiger Inhalt","invalid_security_token":"Ungültiger Sicherheitsschlüssel","label_client":"Client:","label_content_type":"Inhaltsart:","label_default_access_mode":"Standard Zugriffsmodus:","label_file_name":"Dateiname:","label_group_members":"Gruppenmitglieder:","label_incognito_mode":"inkognito-Modus:","label_message_sound":"Benachrichtigungston:","label_muting_topic":"Stumm geschaltet:","label_other_user":"Andere","label_password":"Passwort","label_permissions":"Berechtigungen:","label_private":"Privater Kommentar","label_push_notifications":"Benachrichtigungsmeldungen:","label_push_notifications_disabled":"Benachrichtigungsmeldungen (erfordert HTTPS):","label_reset_password":"Passwort per E-Mail wiederherstellen:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server Adresse:","label_server_to_use":"Server verwenden:","label_size":"Größe:","label_topic_name":"Name","label_user_contacts":"Kontakte:","label_user_id":"ID:","label_wire_transport":"Übertragung per Kabel:","label_you":"Sie:","label_your_name":"Ihr Name","label_your_permissions":"Ihre Berechtigungen:","last_seen_timestamp":"Zuletzt gesehen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","link_contact_us":"Kontakt","link_privacy_policy":"Datenschutzerklärung","link_terms_of_service":"Nutzungsbedingungen","login_prompt":"Anmelden","menu_item_archive_topic":"Archivieren","menu_item_block":"Blockieren","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_delete_topic":"Entfernen","menu_item_edit_permissions":"Berechtigungen ändern","menu_item_info":"Info","menu_item_member_delete":"Entfernen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_restore_topic":"Wiederherstellen","menu_item_send_retry":"Wiederholen","menu_item_unblock":"Blockierung aufheben","menu_item_unmute":"Stumm schalten beenden","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","more_online_members":"+{overflow} mehr","new_message_prompt":"Neue Nachricht","new_password_placeholder":"Geben Sie ein neues Passwort ein","no_connection":"Keine Verbindung","no_contacts":"Sie haben keine Kontakte :-(","numeric_confirmation_code_prompt":"Nur zahlen","online_now":"jetzt online","password_prompt":"Passwort","password_unchanged_prompt":"unverändert","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","permission_admin":"Bestätigen ({val})","permission_delete":"Entfernen ({val})","permission_join":"Beitreten ({val})","permission_owner":"Besitzer ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_read":"Lesen ({val})","permission_share":"Teilen ({val})","permission_write":"Schreiben ({val})","phone_dative":"Telefon","private_editing_placeholder":"Nur für Sie sichtbar","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","reload_update":"Neu laden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","requested_permissions":"Angefordert","save_attachment":"Speichern","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_login":"Anmelden","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_register":"Konto erstellen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_settings":"Einstellungen","stay_logged_in":"Angemeldet bleiben","tabtitle_find_user":"Suchen","tabtitle_group_by_id":"nach ID","tabtitle_new_group":"Neue Gruppe","tags_editor_no_tags":"Schlagworte hinzufügen","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","title_all_contacts":"Alle Kontakte","title_group_members":"Gruppenmitglieder","panel_title_info":"Info","title_manage_tags":"Verwalten","title_not_found":"Nicht gefunden","title_permissions":"Berechtigungen","title_tag_manager":"Schlagworte (Nutzer entdecken)","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","topic_name_editing_placeholder":"Freiform Name der Gruppe","unnamed_topic":"Unbenannt","update_available":"Aktualisierung verfügbar.","upload_finishing":"wird abgeschlossen...","user_not_found":"Nicht gefunden","validate_credential_action":"bestätigen","description_editing_placeholder":"Beschreibung (optional)","label_description":"Beschreibung","button_security":"Sicherheit","panel_title_general":"Allgemein","panel_title_security":"Sicherheit","panel_title_crop":"Zum Anpassen ziehen","panel_title_members":"Mitglieder","permissions_anonymous":"Anonym","permissions_authenticated":"Authentifiziert","topic_delete":"Chat löschen","permissions_user":"Benutzerberechtigungen","password_reset_email_sent":"Eine E-Mail wurde an {email} gesendet. Folgen Sie den Anweisungen in der E-Mail, um Ihr Passwort zurückzusetzen.","label_unarchive_topic":"Archiviert:","menu_item_reply":"Antwort","menu_item_forward":"Nach vorne","forward_to":"Weiterleiten","forward_to_search_placeholder":"Kontakte durchsuchen","label_new_password":"Neues Kennwort","drafty_unknown":"Nicht unterstützt","calls_incoming":"Eingehender Anruf","calls_outgoing":"Ausgehender Anruf","calls_you_label":"Du","menu_item_video_call":"Videoanruf","already_in_call":"Du redest schon!","call_cancelled":"abgebrochen","call_missed":"verpasster","call_declined":"abgelehnt"},"en":{"action_block_contact":"Block Contact","action_cancel":"cancel","action_clear_messages":"Clear Messages","action_delete_messages":"Clear Messages for All","action_leave_chat":"Leave Conversation","action_report_chat":"Report Conversation","archived_contacts":"Archived contacts ({count})","badge_danger":"Untrustworthy","badge_owner":"owner","badge_staff":"Staff-managed","badge_verified":"Verified/official","badge_you":"you","block_contact_warning":"Are you sure you want to block this contact?","blocked_contacts_link":"Blocked contacts ({count})","button_add_another":"Add another","button_add_members":"Add members","button_cancel":"Cancel","button_confirm":"Confirm","button_create":"Create","button_delete_account":"Delete account","button_edit":"Edit","button_logout":"Logout","button_ok":"OK","button_reset":"Reset","button_send_request":"Send request","button_sign_in":"Sign in","button_sign_up":"Sign up","button_subscribe":"Subscribe","button_update":"Update","cannot_initiate_file_upload":"Cannot initiate file upload.","channel":"channel","channel_prompt":"This is a channel","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_block":"Block","chat_invitation_ignore":"Ignore","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","code_doesnot_match":"Code does not match","contacts_not_found":"You have no chats
¯∖_(ツ)_/¯","contacts_not_found_short":"No contacts match \'\'{query}\'\'","credential_email_prompt":"Your registration email","delete_account":"Delete account","delete_account_warning":"Are you sure you want to delete your account? It cannot be undone.","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","deleted_content":"content deleted","download_action":"download","drafty_attachment":"Attachment","drafty_form":"Form:","drafty_image":"Picture","email_dative":"email","email_prompt":"Email, e.g. jdoe@example.com","enable_peers_messaging":"Enable","enter_confirmation_code_prompt":"Enter confirmation code sent to you by {method}:","error_invalid_id":"Invalid ID","file_attachment_too_large":"The file size {size} exceeds the {limit} limit.","forgot_password_link":"Forgot password?","full_name_prompt":"Full name, e.g. John Doe","granted_permissions":"Granted","group_has_no_members":"No members","group_user_id_prompt":"Group or User ID","image_caption_prompt":"Image caption","invalid_content":"invalid content","invalid_security_token":"Invalid security token","label_client":"Client:","label_content_type":"Content type:","label_default_access_mode":"Default access mode:","label_file_name":"File name:","label_group_members":"Group members:","label_incognito_mode":"Incognito mode:","label_message_sound":"Message sound:","label_muting_topic":"Muted:","label_other_user":"Other","label_password":"Password","label_permissions":"Permissions:","label_private":"Private comment","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_reset_password":"Send a password reset email:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server address:","label_server_to_use":"Server to use:","label_size":"Size:","label_topic_name":"Name","label_user_contacts":"Contacts:","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"You:","label_your_name":"Your name","label_your_permissions":"Your permissions:","last_seen_timestamp":"Last seen","leave_chat_warning":"Are you sure you want to leave this conversation?","link_contact_us":"Contact Us","link_privacy_policy":"Privacy Policy","link_terms_of_service":"Terms of Service","login_prompt":"Login","menu_item_archive_topic":"Archive","menu_item_block":"Block","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_delete_topic":"Delete","menu_item_edit_permissions":"Edit permissions","menu_item_info":"Info","menu_item_member_delete":"Remove","menu_item_mute":"Mute","menu_item_reply":"Reply","menu_item_restore_topic":"Restore","menu_item_send_retry":"Retry","menu_item_unblock":"Unblock","menu_item_unmute":"Unmute","message_sending":"sending...","message_sending_failed":"failed","messages_not_readable":"no access to messages","messaging_disabled_prompt":"Messaging disabled","more_online_members":"+{overflow} more","new_message_prompt":"New message","new_password_placeholder":"Enter new password","no_connection":"No connection","no_contacts":"You have no contacts :-(","numeric_confirmation_code_prompt":"Numbers only","online_now":"online now","password_prompt":"Password","password_unchanged_prompt":"Unchanged","peers_messaging_disabled":"Peer\'s messaging is disabled.","permission_admin":"Approve ({val})","permission_delete":"Delete ({val})","permission_join":"Join ({val})","permission_owner":"Owner ({val})","permission_pres":"Get notified ({val})","permission_read":"Read ({val})","permission_share":"Share ({val})","permission_write":"Write ({val})","phone_dative":"phone","private_editing_placeholder":"Visible to you only","push_init_failed":"Failed to initialize push notifications","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","reload_update":"Reload","report_chat_warning":"Are you sure you want to block and report this conversation?","requested_permissions":"Requested","save_attachment":"save","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","search_placeholder":"List like email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Account Settings","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_login":"Sign In","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_register":"Create Account","sidepanel_title_reset":"Reset Password","sidepanel_title_settings":"Settings","stay_logged_in":"Stay logged in","tabtitle_find_user":"find","tabtitle_group_by_id":"by id","tabtitle_new_group":"new group","tags_editor_no_tags":"Add some tags","tags_not_found":"No tags defined. Add some.","title_all_contacts":"All Contacts","title_group_members":"Group Members","title_manage_tags":"Manage","title_not_found":"Not found","title_permissions":"Permissions","title_tag_manager":"Tags (search & discovery)","topic_block_warning":"Are you sure you want to block this conversation?","topic_delete_warning":"Are you sure you want to delete this conversation?","topic_name_editing_placeholder":"Freeform name of the group","unnamed_topic":"Unnamed","update_available":"Update available.","upload_finishing":"finishing...","user_not_found":"Not found","validate_credential_action":"confirm","description_editing_placeholder":"Optional description","label_description":"Description","button_security":"Security","panel_title_crop":"Drag to Adjust","panel_title_general":"General","panel_title_members":"Members","panel_title_security":"Security","panel_title_info":"Info","permissions_anonymous":"Anonymous","permissions_authenticated":"Authenticated","topic_delete":"Delete Conversation","permissions_user":"User\'s Permissions","password_reset_email_sent":"An email has been sent to {email}. Follow the directions in the email to reset your password.","label_unarchive_topic":"Archived:","menu_item_forward":"Forward","forward_to":"Forward to","forward_to_search_placeholder":"Search contacts","label_new_password":"New password","drafty_unknown":"Unsupported","calls_incoming":"Incoming call","calls_outgoing":"Outgoing call","calls_you_label":"You","menu_item_video_call":"Video call","already_in_call":"You already in an ongoing call!","call_cancelled":"cancelled","call_missed":"missed","call_declined":"declined"},"es":{"action_block_contact":"Bloquear contacto","action_cancel":"cancelar","action_clear_messages":"Borrar mensajes","action_delete_messages":"Borrar mensajes para todos","action_leave_chat":"Dejar conversación","action_report_chat":"Reportar conversación","archived_contacts":"Contactos archivados ({count})","badge_danger":"Suspicaz","badge_owner":"propietario","badge_staff":"Administración","badge_verified":"Verificado","badge_you":"tú","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","blocked_contacts_link":"Contactos bloqueados ({count})","button_add_another":"Añadir contacto","button_add_members":"Añadir miembros","button_cancel":"Cancelar","button_confirm":"Confirmar","button_create":"Crear","button_delete_account":"Eliminar cuenta","button_edit":"Editar","button_logout":"Cerrar sesión","button_ok":"OK","button_reset":"Restablecer","button_send_request":"Enviar petición","button_sign_in":"Entrar","button_sign_up":"Regístrate","button_subscribe":"Suscribirse","button_update":"Actualizar","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","channel":"canal","channel_prompt":"Este es un canal","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_block":"Bloquear","chat_invitation_ignore":"Ignorar","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","code_doesnot_match":"El código no coincide","contacts_not_found":"No tienes chats
¯∖_(ツ)_/¯","contacts_not_found_short":"Ningún contacto coincide con \'\'{query}\'\'","credential_email_prompt":"Tu correo electrónico de registro","delete_account":"Eliminar cuenta","delete_account_warning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","deleted_content":"este mensaje fue eliminado","download_action":"descargar","drafty_attachment":"Archivo","drafty_form":"Formulario:","drafty_image":"Imagen","email_dative":"correo electrónico","email_prompt":"Correo electrónico, p.ej. juan@example.com","enable_peers_messaging":"Habilitar","enter_confirmation_code_prompt":"Introduzca el código de confirmación enviado a tu {method}:","error_invalid_id":"ID inválido","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","forgot_password_link":"¿Olvidaste tu contraseña?","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","granted_permissions":"Otorgados","group_has_no_members":"No hay miembros","group_user_id_prompt":"ID del grupo o usuario","image_caption_prompt":"Añade un comentario","invalid_content":"contenido inválido","invalid_security_token":"Token de seguridad inválido","label_client":"Cliente:","label_content_type":"Tipo de contenido:","label_default_access_mode":"Modo de acceso predeterminado:","label_file_name":"Nombre del archivo:","label_group_members":"Miembros del grupo:","label_incognito_mode":"Modo incógnito:","label_message_sound":"Sonido de mensaje:","label_muting_topic":"Silenciado:","label_other_user":"Otros","label_password":"Contraseña","label_permissions":"Permisos:","label_private":"Comentario privado","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","label_sdk":"SDK:","label_server":"Servidor:","label_server_address":"Dirección del servidor:","label_server_to_use":"Servidor para usar:","label_size":"Tamaño:","label_topic_name":"Nombre del tema","label_user_contacts":"Contactos:","label_user_id":"ID:","label_wire_transport":"Transporte de alambre:","label_you":"Tú:","label_your_name":"Tu nombre","label_your_permissions":"Tus permisos:","last_seen_timestamp":"Últ. vez","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","link_contact_us":"Contáctanos","link_privacy_policy":"Política de privacidad","link_terms_of_service":"Términos de uso","login_prompt":"Nombre de usuario","menu_item_archive_topic":"Archivar","menu_item_block":"Bloquear","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_delete_topic":"Eliminar","menu_item_edit_permissions":"Editar permisos","menu_item_info":"Información","menu_item_member_delete":"Eliminar","menu_item_mute":"Silenciar","menu_item_restore_topic":"Restaurar","menu_item_send_retry":"Inténtalo de nuevo","menu_item_unblock":"Desbloquear","menu_item_unmute":"Anular el silencio","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","messages_not_readable":"sin acceso a mensajes","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","more_online_members":"+{overflow} más","new_message_prompt":"Nuevo mensaje","new_password_placeholder":"Introduzca una nueva contraseña","no_connection":"Sin conexión","no_contacts":"No tienes contactos :-(","numeric_confirmation_code_prompt":"Sólo números","online_now":"en línea","password_prompt":"Contraseña","password_unchanged_prompt":"Sin cambios","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","permission_admin":"Approbar ({val})","permission_delete":"Eliminar ({val})","permission_join":"Unirse ({val})","permission_owner":"Propietario ({val})","permission_pres":"Ser notificado ({val})","permission_read":"Leer ({val})","permission_share":"Compartir ({val})","permission_write":"Escribir ({val})","phone_dative":"teléfono","private_editing_placeholder":"Sólo visible para tí","push_init_failed":"Error al inicializar las notificaciones push","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","reload_update":"Recargar","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","requested_permissions":"Solicitados","save_attachment":"guardar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_login":"Iniciar sesión","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_register":"Crear cuenta","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_settings":"Ajustes","stay_logged_in":"Permanecer conectado","tabtitle_find_user":"encontrar","tabtitle_group_by_id":"por ID","tabtitle_new_group":"nuevo grupo","tags_editor_no_tags":"Añadir etiquetas","tags_not_found":"No hay etiquetas definidas. Añade unas.","title_all_contacts":"Todos los contactos","title_group_members":"Miembros del grupo","title_manage_tags":"Gestionar","title_not_found":"No encontrado","title_permissions":"Permisos","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","topic_name_editing_placeholder":"Nombre del grupo","unnamed_topic":"Sin nombre","update_available":"Actualización disponible.","upload_finishing":"terminando...","user_not_found":"Usuario no encontrado","validate_credential_action":"confirmar","description_editing_placeholder":"Descripción (opcional)","label_description":"Descripción","button_security":"Seguridad","panel_title_crop":"Arrastra para ajustar","panel_title_general":"General","panel_title_members":"Miembros","panel_title_security":"Seguridad","panel_title_info":"Información","permissions_anonymous":"Anónimo","permissions_authenticated":"Autenticado","topic_delete":"Eliminar chat","permissions_user":"Permisos del usuario","password_reset_email_sent":"Se ha enviado un correo electrónico a {email}. Siga las instrucciones del correo electrónico para restablecer su contraseña.","label_unarchive_topic":"Archivado:","menu_item_reply":"Respuesta","menu_item_forward":"Reenviar","forward_to":"Reenviar a","forward_to_search_placeholder":"Buscar contactos","label_new_password":"Nueva contraseña","drafty_unknown":"No soportado","calls_incoming":"Llamada entrante","calls_outgoing":"Llamada saliente","calls_you_label":"Tú","menu_item_video_call":"Videollamada","already_in_call":"¡Ya estás hablando!","call_cancelled":"cancelada","call_missed":"perdida","call_declined":"rechazada"},"ko":{"action_block_contact":"연락차단","action_cancel":"취소","action_clear_messages":"메시지지우기","action_delete_messages":"모든메시지지우기","action_leave_chat":"대화나누기","action_report_chat":"대화기록","archived_contacts":"보관된연락처({수})","badge_danger":"의심 많은","badge_owner":"소유자","badge_staff":"직원 관리하에","badge_verified":"확인 됨","badge_you":"당신","block_contact_warning":"이연락처를차단하시겠습니까?","blocked_contacts_link":"차단된연락처({수})","button_add_another":"다른항목추가","button_add_members":"회원추가","button_cancel":"취소","button_confirm":"확인","button_create":"작성","button_delete_account":"계정삭제","button_edit":"편집","button_logout":"로그아웃","button_ok":"OK","button_reset":"재설정","button_send_request":"요청보내기","button_sign_in":"로그인","button_sign_up":"가입","button_subscribe":"구독","button_update":"업데이트","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","channel":"채널","channel_prompt":"이 채널입니다","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_block":"차단","chat_invitation_ignore":"무시","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","code_doesnot_match":"코드가일치하지않습니다","contacts_not_found":"채팅이없습니다
¯∖_(ツ)_/¯","contacts_not_found_short":"\'{문의}\'와일치하는연락처가없습니다.","credential_email_prompt":"등록이메일","delete_account":"계정삭제","delete_account_warning":"계정을삭제하시겠습니까?실행취소할수없습니다.","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","deleted_content":"내용이 삭제되었습니다","download_action":"다운로드","drafty_attachment":"부착","drafty_form":"형태:","drafty_image":"이미지","email_dative":"이메일","email_prompt":"이메일(예:hong@example.com)","enable_peers_messaging":"활성화","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","error_invalid_id":"잘못된ID","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","forgot_password_link":"비밀번호를잊으셨습니까?","full_name_prompt":"전체이름(예:홍길동)","granted_permissions":"승낙하다","group_has_no_members":"회원없음","group_user_id_prompt":"그룹또는사용자ID","image_caption_prompt":"이미지설명","invalid_content":"잘못된내용","invalid_security_token":"유효하지않은보안토큰","label_client":"클라이언트: ","label_content_type":"컨텐츠유형: ","label_default_access_mode":"기본액세스모드: ","label_file_name":"파일이름: ","label_group_members":"그룹회원: ","label_incognito_mode":"시크릿모드: ","label_message_sound":"메시지소리: ","label_muting_topic":"음소거: ","label_other_user":"기타","label_password":"비밀번호","label_permissions":"권한: ","label_private":"개인코멘트","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_reset_password":"비밀번호재설정이메일보내기: ","label_sdk":"SDK:","label_server":"서버: ","label_server_address":"서버주소: ","label_server_to_use":"사용할서버:","label_size":"크기: ","label_topic_name":"이름","label_user_contacts":"연락처: ","label_user_id":"ID:","label_wire_transport":"와이어수송:","label_you":"당신: ","label_your_name":"이름","label_your_permissions":"권한: ","last_seen_timestamp":"마지막으로본","leave_chat_warning":"이대화를나가시겠습니까?","link_contact_us":"문의처","link_privacy_policy":"개인정보보호정책","link_terms_of_service":"서비스약관","login_prompt":"로그인","menu_item_archive_topic":"보관","menu_item_block":"차단","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_delete_topic":"삭제","menu_item_edit_permissions":"편집권한","menu_item_info":"정보","menu_item_member_delete":"제거","menu_item_mute":"음소거","menu_item_restore_topic":"복원","menu_item_send_retry":"다시시도","menu_item_unblock":"차단해제","menu_item_unmute":"음소거해제","message_sending":"보내기...","message_sending_failed":"실패","messages_not_readable":"메시지에 액세스 할 수 없습니다","messaging_disabled_prompt":"메시지비활성화","more_online_members":"+{넘침}더보기","new_message_prompt":"새메시지","new_password_placeholder":"새비밀번호입력","no_connection":"연결없음","no_contacts":"연락처가없습니다 (._.)","numeric_confirmation_code_prompt":"숫자만","online_now":"현재접속중","password_prompt":"비밀번호","password_unchanged_prompt":"변경되지않음","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","permission_admin":"승인({val})","permission_delete":"삭제({val})","permission_join":"참여({val})","permission_owner":"소유자({val})","permission_pres":"알림받기({val})","permission_read":"읽기({val})","permission_share":"공유({val})","permission_write":"쓰기({val})","phone_dative":"전화","private_editing_placeholder":"나만볼수있습니다","push_init_failed":"푸시알림을초기화하지못했습니다","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","reload_update":"재로드","report_chat_warning":"이대화를차단하고기록하시겠습니까?","requested_permissions":"요청","save_attachment":"저장","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_account_settings":"계정설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","sidepanel_title_cred":"자격증명확인","sidepanel_title_login":"로그인","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_register":"계정만들기","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_settings":"설정","stay_logged_in":"로그인상태유지","tabtitle_find_user":"찾기","tabtitle_group_by_id":"id로","tabtitle_new_group":"새그룹","tags_editor_no_tags":"일부태그추가","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","title_all_contacts":"모든연락처","title_group_members":"그룹구성원","title_manage_tags":"관리","title_not_found":"찾을수없음","title_permissions":"권한","title_tag_manager":"태그(사용자검색)","topic_block_warning":"이대화를차단하시겠습니까?","topic_delete_warning":"이대화를삭제하시겠습니까?","topic_name_editing_placeholder":"그룹의자유형이름","unnamed_topic":"이름없는","update_available":"업데이트가능.","upload_finishing":"마무리...","user_not_found":"찾을수없음","validate_credential_action":"확인","description_editing_placeholder":"설명(선택 사항)","label_description":"설명","button_security":"보안","panel_title_crop":"드래그하여 조정","panel_title_general":"일반","panel_title_members":"구성원","panel_title_security":"보안","panel_title_info":"정보","permissions_anonymous":"익명","permissions_authenticated":"인증됨","topic_delete":"채팅 삭제","permissions_user":"사용자 권한","password_reset_email_sent":"이메일이 {email}(으)로 전송되었습니다. 이메일의 지침에 따라 비밀번호를 재설정하세요.","label_unarchive_topic":"보관됨:","menu_item_reply":"회신하다","menu_item_forward":"리디렉션","forward_to":"메시지를 리디렉션","forward_to_search_placeholder":"연락처 검색","label_new_password":"새 비밀번호","drafty_unknown":"지원되지 않음","calls_incoming":"수신 전화","calls_outgoing":"발신 전화","calls_you_label":"너","menu_item_video_call":"영상 통화","already_in_call":"당신은 이미 말하고 있습니다!","call_cancelled":"취소 된","call_missed":"부재중","call_declined":"통화 거부"},"ro":{"action_block_contact":"Blochează contact","action_cancel":"anulează","action_clear_messages":"Șterge mesajele","action_delete_messages":"Șterge toate mesajele","action_leave_chat":"Ieși din conversație","action_report_chat":"Raportează conversația","archived_contacts":"Contacte arhivate ({count})","badge_danger":"Suspicios","badge_owner":"owner","badge_staff":"Administrare","badge_verified":"Verificat","badge_you":"tu","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","blocked_contacts_link":"Contact blocate ({count})","button_add_another":"Adaugă","button_add_members":"Adaugă persoane","button_cancel":"Anulează","button_confirm":"Confirmă","button_create":"Creează","button_delete_account":"Șterge cont","button_edit":"Editează","button_logout":"Deconectare","button_ok":"OK","button_reset":"Resetează","button_send_request":"Trimite cerere","button_sign_in":"Conectează-te","button_sign_up":"Creează cont","button_subscribe":"Subscribe","button_update":"Actualizează","cannot_initiate_file_upload":"Nu se poate face încărcarea.","channel":"canal","channel_prompt":"Acesta este un canal","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_block":"Blochează","chat_invitation_ignore":"Ignoră","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","code_doesnot_match":"Codul furnizat nu este valid","contacts_not_found":"Nu ai contacte salvate
¯∖_(ツ)_/¯","contacts_not_found_short":"Niciun contact găsit după criteriile \'\'{query}\'\'","credential_email_prompt":"Adresa de e-mail","delete_account":"Șterge contul","delete_account_warning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","deleted_content":"conținut șters","download_action":"download","drafty_attachment":"Atasament","drafty_form":"Formă:","drafty_image":"Imagine","email_dative":"email","email_prompt":"Adresa de e-mail","enable_peers_messaging":"Activează","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","error_invalid_id":"ID Invalid","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","forgot_password_link":"Ți-ai uitat parola?","full_name_prompt":"Numele tău","granted_permissions":"Oferite","group_has_no_members":"În acest grup nu se află persoane","group_user_id_prompt":"Grup sau user ID","image_caption_prompt":"Titlul imaginii","invalid_content":"conținut invalid","invalid_security_token":"Codul de securitate este invalid","label_client":"Client:","label_content_type":"Tip conținut:","label_default_access_mode":"Default access mode:","label_file_name":"Nume fișier:","label_group_members":"Membrii grupului:","label_incognito_mode":"Mod incognito:","label_message_sound":"Sunet de mesaj:","label_muting_topic":"Mod silențios (muted):","label_other_user":"Altele","label_password":"Parola","label_permissions":"Permisiuni:","label_private":"Comentariu privat","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_reset_password":"Resetează parola:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Adresa serverului:","label_server_to_use":"Server de utilizat:","label_size":"Size:","label_topic_name":"Nume","label_user_contacts":"Contacte:","label_user_id":"ID:","label_wire_transport":"Transportul legat:","label_you":"Tu:","label_your_name":"Numele tău","label_your_permissions":"Permisiuniile tale:","last_seen_timestamp":"Văzut ultima dată","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","link_contact_us":"Contactează-ne","link_privacy_policy":"Politica de Confidențialitate","link_terms_of_service":"Termenii Serviciului","login_prompt":"Conectează-te","menu_item_archive_topic":"Arhivează","menu_item_block":"Blochează","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_delete_topic":"Șterge","menu_item_edit_permissions":"Editează permisiuni","menu_item_info":"Info","menu_item_member_delete":"Șterge persoană","menu_item_mute":"Mute","menu_item_restore_topic":"Restabili","menu_item_send_retry":"Reîncearcă","menu_item_unblock":"Deblochează","menu_item_unmute":"Unmute","message_sending":"se trimite...","message_sending_failed":"eroare","messages_not_readable":"Mesajele nu pot fi citite","messaging_disabled_prompt":"Mesageria este dezactivată","more_online_members":"+{overflow} mai mult","new_message_prompt":"Mesaj nou","new_password_placeholder":"Introdu parolă","no_connection":"Nu există conexiune","no_contacts":"Nu ai contacte adăugate :-(","numeric_confirmation_code_prompt":"Doar cifre","online_now":"online acum","password_prompt":"Parola","password_unchanged_prompt":"Neschimbată","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","permission_admin":"Aprobare ({val})","permission_delete":"Ștergere ({val})","permission_join":"Participare ({val})","permission_owner":"Deținător ({val})","permission_pres":"Notificare ({val})","permission_read":"Citire ({val})","permission_share":"Distribuire ({val})","permission_write":"Scriere ({val})","phone_dative":"telefon","private_editing_placeholder":"Vizibil doar ție","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","reload_update":"Reîncarcă","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","requested_permissions":"Necesare","save_attachment":"salvează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","search_placeholder":"Caută după e-mail sau număr telefon...","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_login":"Conectează-te","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_register":"Creează Cont","sidepanel_title_reset":"Resetează Parola","sidepanel_title_settings":"Setări","stay_logged_in":"Rămâi conectat","tabtitle_find_user":"caută","tabtitle_group_by_id":"după id","tabtitle_new_group":"grup nou","tags_editor_no_tags":"Adaugă tag-uri","tags_not_found":"Niciun tag definit. Adaugă.","title_all_contacts":"Toate Contactele","title_group_members":"Persoanele din grup","title_manage_tags":"Administrează","title_not_found":"Nu a fost găsit","title_permissions":"Permisiuni","title_tag_manager":"Tag-uri (user discovery)","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","topic_name_editing_placeholder":"Numele grupului","unnamed_topic":"Nedenumit","update_available":"Actualizare disponibilă.","upload_finishing":"se încarcă...","user_not_found":"Utilizatorul nu a fost găsit","validate_credential_action":"confirmă","description_editing_placeholder":"Descriere (opțional)","label_description":"Descriere","button_security":"Securitate","panel_title_crop":"Trageți pentru a ajusta","panel_title_general":"Generale","panel_title_members":"Membri","panel_title_security":"Securitate","panel_title_info":"Info","permissions_anonymous":"Anonim","permissions_authenticated":"Autentificat","topic_delete":"Ștergeți Chat","permissions_user":"Permisiunile utilizatorului","password_reset_email_sent":"Un e-mail a fost trimis către {email}. Urmați instrucțiunile din e-mail pentru a vă reseta parola.","label_unarchive_topic":"Arhivat:","menu_item_reply":"A raspunde","menu_item_forward":"Redirecţiona","forward_to":"Redirecționați către","forward_to_search_placeholder":"Căutați contacte","label_new_password":"Parolă Nouă","drafty_unknown":"Neacceptat","calls_incoming":"Apel primit","calls_outgoing":"Apel efectuat","calls_you_label":"Tu","menu_item_video_call":"Apel video","already_in_call":"Deja vorbesti!","call_cancelled":"anulat","call_missed":"pierdut","call_declined":"refuzat"},"ru":{"action_block_contact":"Заблокировать контакт","action_cancel":"отменить","action_clear_messages":"Удалить сообщения","action_delete_messages":"Удалить сообщения","action_leave_chat":"Уйти из чата","action_report_chat":"Сообщить о нарушении","archived_contacts":"Чаты в архиве ({count})","badge_danger":"Подозрительный","badge_owner":"влад.","badge_staff":"Администрация","badge_verified":"Верифицированный","badge_you":"вы","block_contact_warning":"Вы действительно заблокировать этот контакт?","blocked_contacts_link":"Заблокированные ({count})","button_add_another":"Добавить","button_add_members":"Добавить","button_cancel":"Отменить","button_confirm":"Подтвердить","button_create":"Создать","button_delete_account":"Удалить аккаунт","button_edit":"Редактировать","button_logout":"Выйти","button_ok":"OK","button_reset":"Изменить","button_send_request":"Отправить","button_sign_in":"Войти","button_sign_up":"Создать аккаунт","button_subscribe":"Подписаться","button_update":"Применить","cannot_initiate_file_upload":"Ошибка загрузки файла.","channel":"канал","channel_prompt":"Создать канал","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_block":"Заблокировать","chat_invitation_ignore":"Игнорировать","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","code_doesnot_match":"Код не совпадает","contacts_not_found":"Чатов нет
¯∖_(ツ)_/¯","contacts_not_found_short":"Нет контактов для запроса \'\'{query}\'\'","credential_email_prompt":"Регистрационный емейл","delete_account":"Удалить аккаунт","delete_account_warning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","deleted_content":"удалено","download_action":"скачать","drafty_attachment":"Аттачмент","drafty_form":"Форма:","drafty_image":"Картинка","email_dative":"емейлу","email_prompt":"Email, напр. ivan@example.com","enable_peers_messaging":"Разблокировать.","enter_confirmation_code_prompt":"Код подтверждения, полученный по {method}:","error_invalid_id":"Неверный ID","file_attachment_too_large":"Размер файла {size} превышает {limit} лимит.","forgot_password_link":"Напомнить пароль","full_name_prompt":"Полное имя, напр. Иван Петров","granted_permissions":"Получены","group_has_no_members":"Нет участников","group_user_id_prompt":"ID чата или пользователя","image_caption_prompt":"Подпись к фото","invalid_content":"сообщение не читается","invalid_security_token":"Токен некорректен","label_client":"Клиент:","label_content_type":"Тип:","label_default_access_mode":"Доступ по умолчанию:","label_file_name":"Имя файла:","label_group_members":"Участники чата:","label_incognito_mode":"Режим инкогнито:","label_message_sound":"Звук нового сообщения:","label_muting_topic":"Без уведомлений","label_other_user":"Второй","label_password":"Пароль","label_permissions":"Права доступа:","label_private":"Комментарий","label_push_notifications":"Уведомления:","label_push_notifications_disabled":"Уведомления (требуют HTTPS):","label_reset_password":"Отправить емейл для смены пароля:","label_sdk":"SDK:","label_server":"Сервер:","label_server_address":"Адрес сервера:","label_server_to_use":"Использовать сервер:","label_size":"Размер:","label_topic_name":"Название","label_user_contacts":"Конакты:","label_user_id":"ID:","label_wire_transport":"Соединение:","label_you":"Вы:","label_your_name":"Ваше имя","label_your_permissions":"Ваши права доступа:","last_seen_timestamp":"Был активен","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","link_contact_us":"Связаться с нами","link_privacy_policy":"Политика конфиденциальности","link_terms_of_service":"Условия сервиса","login_prompt":"Логин","menu_item_archive_topic":"В архив","menu_item_block":"Заблокировать","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_delete_topic":"Удалить чат","menu_item_edit_permissions":"Права доступа","menu_item_info":"Информация","menu_item_member_delete":"Отписать","menu_item_mute":"Не уведомлять","menu_item_restore_topic":"Разархивировать","menu_item_send_retry":"Отправить заново","menu_item_unblock":"Разблокировать","menu_item_unmute":"Уведомлять","message_sending":"в пути...","message_sending_failed":"ошибка","messages_not_readable":"нет доступа к сообщениям","messaging_disabled_prompt":"Отправка недоступна","more_online_members":"+еще {overflow}","new_message_prompt":"Новое сообщение","new_password_placeholder":"Введите новый пароль","no_connection":"Нет связи","no_contacts":"Ничего нет :-(","numeric_confirmation_code_prompt":"Только цифры","online_now":"онлайн","password_prompt":"Пароль","password_unchanged_prompt":"Не изменен","peers_messaging_disabled":"Чат заблокирован у корреспондента.","permission_admin":"Подтверждать ({val})","permission_delete":"Удалять ({val})","permission_join":"Подписываться ({val})","permission_owner":"Владелец ({val})","permission_pres":"Уведомлять ({val})","permission_read":"Читать ({val})","permission_share":"Приглашать ({val})","permission_write":"Писать ({val})","phone_dative":"телефону","private_editing_placeholder":"Виден только вам","push_init_failed":"Ошибка инициализации пуш уведомлений","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","reload_update":"Обновить","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","requested_permissions":"Требуются","save_attachment":"сохранить","search_for_contacts":"Поиск контактов","search_no_results":"Ничего не найдено","search_placeholder":"Список, напр. email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","sidepanel_title_account_settings":"Настройки аккаунта","sidepanel_title_archive":"Архив чатов","sidepanel_title_blocked":"Заблокированные чаты","sidepanel_title_cred":"Подтвердить","sidepanel_title_login":"Авторизация","sidepanel_title_newtpk":"Новый чат","sidepanel_title_register":"Зарегистрироваться","sidepanel_title_reset":"Сменить пароль","sidepanel_title_settings":"Настройки","stay_logged_in":"Запомнить","tabtitle_find_user":"найти","tabtitle_group_by_id":"по id","tabtitle_new_group":"создать","tags_editor_no_tags":"Добавьте теги","tags_not_found":"Тегов нет. Добавьте","title_all_contacts":"Все контакты","title_group_members":"Участники","title_manage_tags":"Редактировать","title_not_found":"Не найден","title_permissions":"Права доступа","title_tag_manager":"Теги для поиска","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_name_editing_placeholder":"Название чата","unnamed_topic":"Без названия","update_available":"Есть новая версия приложения.","upload_finishing":"завершение...","user_not_found":"Не найден","validate_credential_action":"подтвердить","description_editing_placeholder":"Описание (не обязательно)","label_description":"Описание","button_security":"Безопасность","panel_title_crop":"Обрезать картинку","panel_title_general":"Общие настройки","panel_title_members":"Участники","panel_title_security":"Безопасность","panel_title_info":"Подробности","permissions_anonymous":"Анонимный","permissions_authenticated":"Авторизованный","topic_delete":"Удалить чат","permissions_user":"Права доступа","password_reset_email_sent":"Сообщение было отправлено на адрес {email}. Следуйте инструкциям в сообщении, чтобы изменить пароль.","label_unarchive_topic":"Архивирован:","menu_item_reply":"Ответить","menu_item_forward":"Переслать","forward_to":"Переслать","forward_to_search_placeholder":"Поиск контактов","label_new_password":"Новый пароль","drafty_unknown":"Не поддерживается","calls_incoming":"Входящий звонок","calls_outgoing":"Исходящий звонок","calls_you_label":"Вы","menu_item_video_call":"Видеозвонок","already_in_call":"Вы уже звоните кому-то!","call_cancelled":"отменен","call_missed":"пропущен","call_declined":"отклонен"},"zh-TW":{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_another":"新增其他人","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話
¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 \'\'{query}\'\' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","deleted_content":"內容已被刪除","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人:","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","validate_credential_action":"確認","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"一封電子郵件已發送至 {email}。按照電子郵件中的說明重置密碼。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒"},"zh":{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_another":"加上另一个","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话
¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配\'\'{query}\'\'","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","deleted_content":"内容已删除","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"蓦然访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来:","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后可见","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"成员间消息已禁用。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索返回任何结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","validate_credential_action":"确认","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"一封电子邮件已发送至 {email}。按照电子邮件中的说明重置密码。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒"}}'),r=function(e){const t=[];let a=0;for(let s=0;s>6|192,t[a++]=63&i|128):55296==(64512&i)&&s+1>18|240,t[a++]=i>>12&63|128,t[a++]=i>>6&63|128,t[a++]=63&i|128):(t[a++]=i>>12|224,t[a++]=i>>6&63|128,t[a++]=63&i|128)}return t},l={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:"function"==typeof atob,encodeByteArray(e,t){if(!Array.isArray(e))throw Error("encodeByteArray takes an array as a parameter");this.init_();const a=t?this.byteToCharMapWebSafe_:this.byteToCharMap_,s=[];for(let t=0;t>2,d=(3&i)<<4|o>>4;let h=(15&o)<<2|l>>6,p=63&l;r||(p=64,n||(h=64)),s.push(a[c],a[d],a[h],a[p])}return s.join("")},encodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?btoa(e):this.encodeByteArray(r(e),t)},decodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?atob(e):function(e){const t=[];let a=0,s=0;for(;a191&&i<224){const n=e[a++];t[s++]=String.fromCharCode((31&i)<<6|63&n)}else if(i>239&&i<365){const n=((7&i)<<18|(63&e[a++])<<12|(63&e[a++])<<6|63&e[a++])-65536;t[s++]=String.fromCharCode(55296+(n>>10)),t[s++]=String.fromCharCode(56320+(1023&n))}else{const n=e[a++],o=e[a++];t[s++]=String.fromCharCode((15&i)<<12|(63&n)<<6|63&o)}}return t.join("")}(this.decodeStringToByteArray(e,t))},decodeStringToByteArray(e,t){this.init_();const a=t?this.charToByteMapWebSafe_:this.charToByteMap_,s=[];for(let t=0;t>4;if(s.push(l),64!==o){const e=n<<4&240|o>>2;if(s.push(e),64!==r){const e=o<<6&192|r;s.push(e)}}}return s},init_(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(let e=0;e=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(e)]=e,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(e)]=e)}}},c=function(e){return function(e){const t=r(e);return l.encodeByteArray(t,!0)}(e).replace(/\./g,"")};class d{constructor(){this.reject=()=>{},this.resolve=()=>{},this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}wrapCallback(e){return(t,a)=>{t?this.reject(t):this.resolve(a),"function"==typeof e&&(this.promise.catch((()=>{})),1===e.length?e(t):e(t,a))}}}function h(){return"object"==typeof indexedDB}function p(){return new Promise(((e,t)=>{try{let a=!0;const s="validate-browser-context-for-indexeddb-analytics-module",i=self.indexedDB.open(s);i.onsuccess=()=>{i.result.close(),a||self.indexedDB.deleteDatabase(s),e(!0)},i.onupgradeneeded=()=>{a=!1},i.onerror=()=>{var e;t((null===(e=i.error)||void 0===e?void 0:e.message)||"")}}catch(e){t(e)}}))}class m extends Error{constructor(e,t,a){super(t),this.code=e,this.customData=a,this.name="FirebaseError",Object.setPrototypeOf(this,m.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,u.prototype.create)}}class u{constructor(e,t,a){this.service=e,this.serviceName=t,this.errors=a}create(e,...t){const a=t[0]||{},s=`${this.service}/${e}`,i=this.errors[e],n=i?function(e,t){return e.replace(g,((e,a)=>{const s=t[a];return null!=s?String(s):`<${a}?>`}))}(i,a):"Error",o=`${this.serviceName}: ${n} (${s}).`;return new m(s,o,a)}}const g=/\{\$([^}]+)}/g;function _(e,t){if(e===t)return!0;const a=Object.keys(e),s=Object.keys(t);for(const i of a){if(!s.includes(i))return!1;const a=e[i],n=t[i];if(f(a)&&f(n)){if(!_(a,n))return!1}else if(a!==n)return!1}for(const e of s)if(!a.includes(e))return!1;return!0}function f(e){return null!==e&&"object"==typeof e}function b(e){return e&&e._delegate?e._delegate:e}function v(e,t){return new Promise(((a,s)=>{e.onsuccess=e=>{a(e.target.result)},e.onerror=e=>{var a;s(`${t}: ${null===(a=e.target.error)||void 0===a?void 0:a.message}`)}}))}class y{constructor(e){this._db=e,this.objectStoreNames=this._db.objectStoreNames}transaction(e,t="readonly"){return new w(this._db.transaction.call(this._db,e,t))}createObjectStore(e,t){return new E(this._db.createObjectStore(e,t))}close(){this._db.close()}}class w{constructor(e){this._transaction=e,this.complete=new Promise(((e,t)=>{this._transaction.oncomplete=function(){e()},this._transaction.onerror=()=>{t(this._transaction.error)},this._transaction.onabort=()=>{t(this._transaction.error)}}))}objectStore(e){return new E(this._transaction.objectStore(e))}}class E{constructor(e){this._store=e}index(e){return new C(this._store.index(e))}createIndex(e,t,a){return new C(this._store.createIndex(e,t,a))}get(e){return v(this._store.get(e),"Error reading from IndexedDB")}put(e,t){return v(this._store.put(e,t),"Error writing to IndexedDB")}delete(e){return v(this._store.delete(e),"Error deleting from IndexedDB")}clear(){return v(this._store.clear(),"Error clearing IndexedDB object store")}}class C{constructor(e){this._index=e}get(e){return v(this._index.get(e),"Error reading from IndexedDB")}}function S(e,t,a){return new Promise(((s,i)=>{try{const n=indexedDB.open(e,t);n.onsuccess=e=>{s(new y(e.target.result))},n.onerror=e=>{var t;i(`Error opening indexedDB: ${null===(t=e.target.error)||void 0===t?void 0:t.message}`)},n.onupgradeneeded=e=>{a(new y(n.result),e.oldVersion,e.newVersion,new w(n.transaction))}}catch(e){i(`Error opening indexedDB: ${e.message}`)}}))}async function M(e){return new Promise(((t,a)=>{try{const s=indexedDB.deleteDatabase(e);s.onsuccess=()=>{t()},s.onerror=t=>{var s;a(`Error deleting indexedDB database "${e}": ${null===(s=t.target.error)||void 0===s?void 0:s.message}`)}}catch(t){a(`Error deleting indexedDB database "${e}": ${t.message}`)}}))}class k{constructor(e,t,a){this.name=e,this.instanceFactory=t,this.type=a,this.multipleInstances=!1,this.serviceProps={},this.instantiationMode="LAZY",this.onInstanceCreated=null}setInstantiationMode(e){return this.instantiationMode=e,this}setMultipleInstances(e){return this.multipleInstances=e,this}setServiceProps(e){return this.serviceProps=e,this}setInstanceCreatedCallback(e){return this.onInstanceCreated=e,this}}const T="[DEFAULT]";class N{constructor(e,t){this.name=e,this.container=t,this.component=null,this.instances=new Map,this.instancesDeferred=new Map,this.instancesOptions=new Map,this.onInitCallbacks=new Map}get(e){const t=this.normalizeInstanceIdentifier(e);if(!this.instancesDeferred.has(t)){const e=new d;if(this.instancesDeferred.set(t,e),this.isInitialized(t)||this.shouldAutoInitialize())try{const a=this.getOrInitializeService({instanceIdentifier:t});a&&e.resolve(a)}catch(e){}}return this.instancesDeferred.get(t).promise}getImmediate(e){var t;const a=this.normalizeInstanceIdentifier(null==e?void 0:e.identifier),s=null!==(t=null==e?void 0:e.optional)&&void 0!==t&&t;if(!this.isInitialized(a)&&!this.shouldAutoInitialize()){if(s)return null;throw Error(`Service ${this.name} is not available`)}try{return this.getOrInitializeService({instanceIdentifier:a})}catch(e){if(s)return null;throw e}}getComponent(){return this.component}setComponent(e){if(e.name!==this.name)throw Error(`Mismatching Component ${e.name} for Provider ${this.name}.`);if(this.component)throw Error(`Component for ${this.name} has already been provided`);if(this.component=e,this.shouldAutoInitialize()){if(function(e){return"EAGER"===e.instantiationMode}(e))try{this.getOrInitializeService({instanceIdentifier:T})}catch(e){}for(const[e,t]of this.instancesDeferred.entries()){const a=this.normalizeInstanceIdentifier(e);try{const e=this.getOrInitializeService({instanceIdentifier:a});t.resolve(e)}catch(e){}}}}clearInstance(e="[DEFAULT]"){this.instancesDeferred.delete(e),this.instancesOptions.delete(e),this.instances.delete(e)}async delete(){const e=Array.from(this.instances.values());await Promise.all([...e.filter((e=>"INTERNAL"in e)).map((e=>e.INTERNAL.delete())),...e.filter((e=>"_delete"in e)).map((e=>e._delete()))])}isComponentSet(){return null!=this.component}isInitialized(e="[DEFAULT]"){return this.instances.has(e)}getOptions(e="[DEFAULT]"){return this.instancesOptions.get(e)||{}}initialize(e={}){const{options:t={}}=e,a=this.normalizeInstanceIdentifier(e.instanceIdentifier);if(this.isInitialized(a))throw Error(`${this.name}(${a}) has already been initialized`);if(!this.isComponentSet())throw Error(`Component ${this.name} has not been registered yet`);const s=this.getOrInitializeService({instanceIdentifier:a,options:t});for(const[e,t]of this.instancesDeferred.entries()){a===this.normalizeInstanceIdentifier(e)&&t.resolve(s)}return s}onInit(e,t){var a;const s=this.normalizeInstanceIdentifier(t),i=null!==(a=this.onInitCallbacks.get(s))&&void 0!==a?a:new Set;i.add(e),this.onInitCallbacks.set(s,i);const n=this.instances.get(s);return n&&e(n,s),()=>{i.delete(e)}}invokeOnInitCallbacks(e,t){const a=this.onInitCallbacks.get(t);if(a)for(const s of a)try{s(e,t)}catch(e){}}getOrInitializeService({instanceIdentifier:e,options:t={}}){let a=this.instances.get(e);if(!a&&this.component&&(a=this.component.instanceFactory(this.container,{instanceIdentifier:(s=e,s===T?void 0:s),options:t}),this.instances.set(e,a),this.instancesOptions.set(e,t),this.invokeOnInitCallbacks(a,e),this.component.onInstanceCreated))try{this.component.onInstanceCreated(this.container,e,a)}catch(e){}var s;return a||null}normalizeInstanceIdentifier(e="[DEFAULT]"){return this.component?this.component.multipleInstances?e:T:e}shouldAutoInitialize(){return!!this.component&&"EXPLICIT"!==this.component.instantiationMode}}class A{constructor(e){this.name=e,this.providers=new Map}addComponent(e){const t=this.getProvider(e.name);if(t.isComponentSet())throw new Error(`Component ${e.name} has already been registered with ${this.name}`);t.setComponent(e)}addOrOverwriteComponent(e){this.getProvider(e.name).isComponentSet()&&this.providers.delete(e.name),this.addComponent(e)}getProvider(e){if(this.providers.has(e))return this.providers.get(e);const t=new N(e,this);return this.providers.set(e,t),t}getProviders(){return Array.from(this.providers.values())}}const D=[];var P;!function(e){e[e.DEBUG=0]="DEBUG",e[e.VERBOSE=1]="VERBOSE",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.SILENT=5]="SILENT"}(P||(P={}));const I={debug:P.DEBUG,verbose:P.VERBOSE,info:P.INFO,warn:P.WARN,error:P.ERROR,silent:P.SILENT},U=P.INFO,R={[P.DEBUG]:"log",[P.VERBOSE]:"log",[P.INFO]:"info",[P.WARN]:"warn",[P.ERROR]:"error"},F=(e,t,...a)=>{if(t{if(function(e){const t=e.getComponent();return"VERSION"===(null==t?void 0:t.type)}(e)){const t=e.getImmediate();return`${t.library}/${t.version}`}return null})).filter((e=>e)).join(" ")}}const B="@firebase/app",L="0.7.21",O=new class{constructor(e){this.name=e,this._logLevel=U,this._logHandler=F,this._userLogHandler=null,D.push(this)}get logLevel(){return this._logLevel}set logLevel(e){if(!(e in P))throw new TypeError(`Invalid value "${e}" assigned to \`logLevel\``);this._logLevel=e}setLogLevel(e){this._logLevel="string"==typeof e?I[e]:e}get logHandler(){return this._logHandler}set logHandler(e){if("function"!=typeof e)throw new TypeError("Value assigned to `logHandler` must be a function");this._logHandler=e}get userLogHandler(){return this._userLogHandler}set userLogHandler(e){this._userLogHandler=e}debug(...e){this._userLogHandler&&this._userLogHandler(this,P.DEBUG,...e),this._logHandler(this,P.DEBUG,...e)}log(...e){this._userLogHandler&&this._userLogHandler(this,P.VERBOSE,...e),this._logHandler(this,P.VERBOSE,...e)}info(...e){this._userLogHandler&&this._userLogHandler(this,P.INFO,...e),this._logHandler(this,P.INFO,...e)}warn(...e){this._userLogHandler&&this._userLogHandler(this,P.WARN,...e),this._logHandler(this,P.WARN,...e)}error(...e){this._userLogHandler&&this._userLogHandler(this,P.ERROR,...e),this._logHandler(this,P.ERROR,...e)}}("@firebase/app"),q="[DEFAULT]",j={[B]:"fire-core","@firebase/app-compat":"fire-core-compat","@firebase/analytics":"fire-analytics","@firebase/analytics-compat":"fire-analytics-compat","@firebase/app-check":"fire-app-check","@firebase/app-check-compat":"fire-app-check-compat","@firebase/auth":"fire-auth","@firebase/auth-compat":"fire-auth-compat","@firebase/database":"fire-rtdb","@firebase/database-compat":"fire-rtdb-compat","@firebase/functions":"fire-fn","@firebase/functions-compat":"fire-fn-compat","@firebase/installations":"fire-iid","@firebase/installations-compat":"fire-iid-compat","@firebase/messaging":"fire-fcm","@firebase/messaging-compat":"fire-fcm-compat","@firebase/performance":"fire-perf","@firebase/performance-compat":"fire-perf-compat","@firebase/remote-config":"fire-rc","@firebase/remote-config-compat":"fire-rc-compat","@firebase/storage":"fire-gcs","@firebase/storage-compat":"fire-gcs-compat","@firebase/firestore":"fire-fst","@firebase/firestore-compat":"fire-fst-compat","fire-js":"fire-js",firebase:"fire-js-all"},z=new Map,H=new Map;function V(e,t){try{e.container.addComponent(t)}catch(a){O.debug(`Component ${t.name} failed to register with FirebaseApp ${e.name}`,a)}}function W(e){const t=e.name;if(H.has(t))return O.debug(`There were multiple attempts to register component ${t}.`),!1;H.set(t,e);for(const t of z.values())V(t,e);return!0}function K(e,t){const a=e.container.getProvider("heartbeat").getImmediate({optional:!0});return a&&a.triggerHeartbeat(),e.container.getProvider(t)}const G=new u("app","Firebase",{"no-app":"No Firebase App '{$appName}' has been created - call Firebase App.initializeApp()","bad-app-name":"Illegal App name: '{$appName}","duplicate-app":"Firebase App named '{$appName}' already exists with different options or config","app-deleted":"Firebase App named '{$appName}' already deleted","invalid-app-argument":"firebase.{$appName}() takes either no argument or a Firebase App instance.","invalid-log-argument":"First argument to `onLog` must be null or a function.","storage-open":"Error thrown when opening storage. Original error: {$originalErrorMessage}.","storage-get":"Error thrown when reading from storage. Original error: {$originalErrorMessage}.","storage-set":"Error thrown when writing to storage. Original error: {$originalErrorMessage}.","storage-delete":"Error thrown when deleting from storage. Original error: {$originalErrorMessage}."});class ${constructor(e,t,a){this._isDeleted=!1,this._options=Object.assign({},e),this._config=Object.assign({},t),this._name=t.name,this._automaticDataCollectionEnabled=t.automaticDataCollectionEnabled,this._container=a,this.container.addComponent(new k("app",(()=>this),"PUBLIC"))}get automaticDataCollectionEnabled(){return this.checkDestroyed(),this._automaticDataCollectionEnabled}set automaticDataCollectionEnabled(e){this.checkDestroyed(),this._automaticDataCollectionEnabled=e}get name(){return this.checkDestroyed(),this._name}get options(){return this.checkDestroyed(),this._options}get config(){return this.checkDestroyed(),this._config}get container(){return this._container}get isDeleted(){return this._isDeleted}set isDeleted(e){this._isDeleted=e}checkDestroyed(){if(this.isDeleted)throw G.create("app-deleted",{appName:this._name})}}function Y(e,t={}){if("object"!=typeof t){t={name:t}}const a=Object.assign({name:q,automaticDataCollectionEnabled:!1},t),s=a.name;if("string"!=typeof s||!s)throw G.create("bad-app-name",{appName:String(s)});const i=z.get(s);if(i){if(_(e,i.options)&&_(a,i.config))return i;throw G.create("duplicate-app",{appName:s})}const n=new A(s);for(const e of H.values())n.addComponent(e);const o=new $(e,a,n);return z.set(s,o),o}function Q(e,t,a){var s;let i=null!==(s=j[e])&&void 0!==s?s:e;a&&(i+=`-${a}`);const n=i.match(/\s|\//),o=t.match(/\s|\//);if(n||o){const e=[`Unable to register library "${i}" with version "${t}":`];return n&&e.push(`library name "${i}" contains illegal characters (whitespace or "/")`),n&&o&&e.push("and"),o&&e.push(`version name "${t}" contains illegal characters (whitespace or "/")`),void O.warn(e.join(" "))}W(new k(`${i}-version`,(()=>({library:i,version:t})),"VERSION"))}const J="firebase-heartbeat-store";let X=null;function Z(){return X||(X=S("firebase-heartbeat-database",1,((e,t)=>{if(0===t)e.createObjectStore(J)})).catch((e=>{throw G.create("storage-open",{originalErrorMessage:e.message})}))),X}async function ee(e,t){try{const a=(await Z()).transaction(J,"readwrite"),s=a.objectStore(J);return await s.put(t,te(e)),a.complete}catch(e){throw G.create("storage-set",{originalErrorMessage:e.message})}}function te(e){return`${e.name}!${e.options.appId}`}class ae{constructor(e){this.container=e,this._heartbeatsCache=null;const t=this.container.getProvider("app").getImmediate();this._storage=new ie(t),this._heartbeatsCachePromise=this._storage.read().then((e=>(this._heartbeatsCache=e,e)))}async triggerHeartbeat(){const e=this.container.getProvider("platform-logger").getImmediate().getPlatformInfoString(),t=se();if(null===this._heartbeatsCache&&(this._heartbeatsCache=await this._heartbeatsCachePromise),this._heartbeatsCache.lastSentHeartbeatDate!==t&&!this._heartbeatsCache.heartbeats.some((e=>e.date===t)))return this._heartbeatsCache.heartbeats.push({date:t,agent:e}),this._heartbeatsCache.heartbeats=this._heartbeatsCache.heartbeats.filter((e=>{const t=new Date(e.date).valueOf();return Date.now()-t<=2592e6})),this._storage.overwrite(this._heartbeatsCache)}async getHeartbeatsHeader(){if(null===this._heartbeatsCache&&await this._heartbeatsCachePromise,null===this._heartbeatsCache||0===this._heartbeatsCache.heartbeats.length)return"";const e=se(),{heartbeatsToSend:t,unsentEntries:a}=function(e,t=1024){const a=[];let s=e.slice();for(const i of e){const e=a.find((e=>e.agent===i.agent));if(e){if(e.dates.push(i.date),ne(a)>t){e.dates.pop();break}}else if(a.push({agent:i.agent,dates:[i.date]}),ne(a)>t){a.pop();break}s=s.slice(1)}return{heartbeatsToSend:a,unsentEntries:s}}(this._heartbeatsCache.heartbeats),s=c(JSON.stringify({version:2,heartbeats:t}));return this._heartbeatsCache.lastSentHeartbeatDate=e,a.length>0?(this._heartbeatsCache.heartbeats=a,await this._storage.overwrite(this._heartbeatsCache)):(this._heartbeatsCache.heartbeats=[],this._storage.overwrite(this._heartbeatsCache)),s}}function se(){return(new Date).toISOString().substring(0,10)}class ie{constructor(e){this.app=e,this._canUseIndexedDBPromise=this.runIndexedDBEnvironmentCheck()}async runIndexedDBEnvironmentCheck(){return!!h()&&p().then((()=>!0)).catch((()=>!1))}async read(){if(await this._canUseIndexedDBPromise){return await async function(e){try{return(await Z()).transaction(J).objectStore(J).get(te(e))}catch(e){throw G.create("storage-get",{originalErrorMessage:e.message})}}(this.app)||{heartbeats:[]}}return{heartbeats:[]}}async overwrite(e){var t;if(await this._canUseIndexedDBPromise){const a=await this.read();return ee(this.app,{lastSentHeartbeatDate:null!==(t=e.lastSentHeartbeatDate)&&void 0!==t?t:a.lastSentHeartbeatDate,heartbeats:e.heartbeats})}}async add(e){var t;if(await this._canUseIndexedDBPromise){const a=await this.read();return ee(this.app,{lastSentHeartbeatDate:null!==(t=e.lastSentHeartbeatDate)&&void 0!==t?t:a.lastSentHeartbeatDate,heartbeats:[...a.heartbeats,...e.heartbeats]})}}}function ne(e){return c(JSON.stringify({version:2,heartbeats:e})).length}var oe;oe="",W(new k("platform-logger",(e=>new x(e)),"PRIVATE")),W(new k("heartbeat",(e=>new ae(e)),"PRIVATE")),Q(B,L,oe),Q(B,L,"esm2017"),Q("fire-js","");Q("firebase","9.6.11","app");const re="@firebase/installations",le="0.5.8",ce=1e4,de="w:0.5.8",he="FIS_v2",pe=36e5,me=new u("installations","Installations",{"missing-app-config-values":'Missing App configuration value: "{$valueName}"',"not-registered":"Firebase Installation is not registered.","installation-not-found":"Firebase Installation not found.","request-failed":'{$requestName} request failed with error "{$serverCode} {$serverStatus}: {$serverMessage}"',"app-offline":"Could not process request. Application offline.","delete-pending-registration":"Can't delete installation while there is a pending registration request."});function ue(e){return e instanceof m&&e.code.includes("request-failed")}function ge({projectId:e}){return`https://firebaseinstallations.googleapis.com/v1/projects/${e}/installations`}function _e(e){return{token:e.token,requestStatus:2,expiresIn:(t=e.expiresIn,Number(t.replace("s","000"))),creationTime:Date.now()};var t}async function fe(e,t){const a=(await t.json()).error;return me.create("request-failed",{requestName:e,serverCode:a.code,serverMessage:a.message,serverStatus:a.status})}function be({apiKey:e}){return new Headers({"Content-Type":"application/json",Accept:"application/json","x-goog-api-key":e})}function ve(e,{refreshToken:t}){const a=be(e);return a.append("Authorization",function(e){return`FIS_v2 ${e}`}(t)),a}async function ye(e){const t=await e();return t.status>=500&&t.status<600?e():t}function we(e){return new Promise((t=>{setTimeout(t,e)}))}const Ee=/^[cdef][\w-]{21}$/;function Ce(){try{const e=new Uint8Array(17);(self.crypto||self.msCrypto).getRandomValues(e),e[0]=112+e[0]%16;const t=function(e){return(t=e,btoa(String.fromCharCode(...t)).replace(/\+/g,"-").replace(/\//g,"_")).substr(0,22);var t}(e);return Ee.test(t)?t:""}catch(e){return""}}function Se(e){return`${e.appName}!${e.appId}`}const Me=new Map;function ke(e,t){const a=Se(e);Te(a,t),function(e,t){const a=Ae();a&&a.postMessage({key:e,fid:t});De()}(a,t)}function Te(e,t){const a=Me.get(e);if(a)for(const e of a)e(t)}let Ne=null;function Ae(){return!Ne&&"BroadcastChannel"in self&&(Ne=new BroadcastChannel("[Firebase] FID Change"),Ne.onmessage=e=>{Te(e.data.key,e.data.fid)}),Ne}function De(){0===Me.size&&Ne&&(Ne.close(),Ne=null)}const Pe="firebase-installations-store";let Ie=null;function Ue(){return Ie||(Ie=S("firebase-installations-database",1,((e,t)=>{if(0===t)e.createObjectStore(Pe)}))),Ie}async function Re(e,t){const a=Se(e),s=(await Ue()).transaction(Pe,"readwrite"),i=s.objectStore(Pe),n=await i.get(a);return await i.put(t,a),await s.complete,n&&n.fid===t.fid||ke(e,t.fid),t}async function Fe(e){const t=Se(e),a=(await Ue()).transaction(Pe,"readwrite");await a.objectStore(Pe).delete(t),await a.complete}async function xe(e,t){const a=Se(e),s=(await Ue()).transaction(Pe,"readwrite"),i=s.objectStore(Pe),n=await i.get(a),o=t(n);return void 0===o?await i.delete(a):await i.put(o,a),await s.complete,!o||n&&n.fid===o.fid||ke(e,o.fid),o}async function Be(e){let t;const a=await xe(e.appConfig,(a=>{const s=function(e){return qe(e||{fid:Ce(),registrationStatus:0})}(a),i=function(e,t){if(0===t.registrationStatus){if(!navigator.onLine){return{installationEntry:t,registrationPromise:Promise.reject(me.create("app-offline"))}}const a={fid:t.fid,registrationStatus:1,registrationTime:Date.now()},s=async function(e,t){try{const a=await async function({appConfig:e,heartbeatServiceProvider:t},{fid:a}){const s=ge(e),i=be(e),n=t.getImmediate({optional:!0});if(n){const e=await n.getHeartbeatsHeader();e&&i.append("x-firebase-client",e)}const o={fid:a,authVersion:he,appId:e.appId,sdkVersion:de},r={method:"POST",headers:i,body:JSON.stringify(o)},l=await ye((()=>fetch(s,r)));if(l.ok){const e=await l.json();return{fid:e.fid||a,registrationStatus:2,refreshToken:e.refreshToken,authToken:_e(e.authToken)}}throw await fe("Create Installation",l)}(e,t);return Re(e.appConfig,a)}catch(a){throw ue(a)&&409===a.customData.serverCode?await Fe(e.appConfig):await Re(e.appConfig,{fid:t.fid,registrationStatus:0}),a}}(e,a);return{installationEntry:a,registrationPromise:s}}return 1===t.registrationStatus?{installationEntry:t,registrationPromise:Le(e)}:{installationEntry:t}}(e,s);return t=i.registrationPromise,i.installationEntry}));return""===a.fid?{installationEntry:await t}:{installationEntry:a,registrationPromise:t}}async function Le(e){let t=await Oe(e.appConfig);for(;1===t.registrationStatus;)await we(100),t=await Oe(e.appConfig);if(0===t.registrationStatus){const{installationEntry:t,registrationPromise:a}=await Be(e);return a||t}return t}function Oe(e){return xe(e,(e=>{if(!e)throw me.create("installation-not-found");return qe(e)}))}function qe(e){return 1===(t=e).registrationStatus&&t.registrationTime+cefetch(s,r)));if(l.ok){return _e(await l.json())}throw await fe("Generate Auth Token",l)}async function ze(e,t=!1){let a;const s=await xe(e.appConfig,(s=>{if(!Ve(s))throw me.create("not-registered");const i=s.authToken;if(!t&&function(e){return 2===e.requestStatus&&!function(e){const t=Date.now();return t{if(!Ve(e))throw me.create("not-registered");const t=e.authToken;return 1===(a=t).requestStatus&&a.requestTime+ce{const t=K(e.getProvider("app").getImmediate(),Ge).getImmediate();return{getId:()=>async function(e){const t=e,{installationEntry:a,registrationPromise:s}=await Be(t);return s?s.catch(console.error):ze(t).catch(console.error),a.fid}(t),getToken:e=>We(t,e)}};W(new k(Ge,(e=>{const t=e.getProvider("app").getImmediate(),a=function(e){if(!e||!e.options)throw Ke("App Configuration");if(!e.name)throw Ke("App Name");const t=["projectId","apiKey","appId"];for(const a of t)if(!e.options[a])throw Ke(a);return{appName:e.name,projectId:e.options.projectId,apiKey:e.options.apiKey,appId:e.options.appId}}(t);return{app:t,appConfig:a,heartbeatServiceProvider:K(t,"heartbeat"),_delete:()=>Promise.resolve()}}),"PUBLIC")),W(new k("installations-internal",$e,"PRIVATE")),Q(re,le),Q(re,le,"esm2017");const Ye="BDOU99-h67HcA6JeFXHbSNMu7e2yNNu3RzoMj8TM4W88jITfq7ZmPvIM1Iv-4_l2LxQcYwhqby2xGpWwzjfAnG4",Qe="google.c.a.c_id";var Je,Xe;function Ze(e){const t=new Uint8Array(e);return btoa(String.fromCharCode(...t)).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}function et(e){const t=(e+"=".repeat((4-e.length%4)%4)).replace(/\-/g,"+").replace(/_/g,"/"),a=atob(t),s=new Uint8Array(a.length);for(let e=0;e{if(0===t)e.createObjectStore(st)}))),it}async function ot(e){const t=lt(e),a=await nt(),s=await a.transaction(st).objectStore(st).get(t);if(s)return s;{const t=await async function(e){if("databases"in indexedDB){const e=(await indexedDB.databases()).map((e=>e.name));if(!e.includes(tt))return null}let t=null;return(await S(tt,5,(async(a,s,i,n)=>{var o;if(s<2)return;if(!a.objectStoreNames.contains(at))return;const r=n.objectStore(at),l=await r.index("fcmSenderId").get(e);if(await r.clear(),l)if(2===s){const e=l;if(!e.auth||!e.p256dh||!e.endpoint)return;t={token:e.fcmToken,createTime:null!==(o=e.createTime)&&void 0!==o?o:Date.now(),subscriptionOptions:{auth:e.auth,p256dh:e.p256dh,endpoint:e.endpoint,swScope:e.swScope,vapidKey:"string"==typeof e.vapidKey?e.vapidKey:Ze(e.vapidKey)}}}else if(3===s){const e=l;t={token:e.fcmToken,createTime:e.createTime,subscriptionOptions:{auth:Ze(e.auth),p256dh:Ze(e.p256dh),endpoint:e.endpoint,swScope:e.swScope,vapidKey:Ze(e.vapidKey)}}}else if(4===s){const e=l;t={token:e.fcmToken,createTime:e.createTime,subscriptionOptions:{auth:Ze(e.auth),p256dh:Ze(e.p256dh),endpoint:e.endpoint,swScope:e.swScope,vapidKey:Ze(e.vapidKey)}}}}))).close(),await M(tt),await M("fcm_vapid_details_db"),await M("undefined"),function(e){if(!e||!e.subscriptionOptions)return!1;const{subscriptionOptions:t}=e;return"number"==typeof e.createTime&&e.createTime>0&&"string"==typeof e.token&&e.token.length>0&&"string"==typeof t.auth&&t.auth.length>0&&"string"==typeof t.p256dh&&t.p256dh.length>0&&"string"==typeof t.endpoint&&t.endpoint.length>0&&"string"==typeof t.swScope&&t.swScope.length>0&&"string"==typeof t.vapidKey&&t.vapidKey.length>0}(t)?t:null}(e.appConfig.senderId);if(t)return await rt(e,t),t}}async function rt(e,t){const a=lt(e),s=(await nt()).transaction(st,"readwrite");return await s.objectStore(st).put(t,a),await s.complete,t}function lt({appConfig:e}){return e.appId}const ct=new u("messaging","Messaging",{"missing-app-config-values":'Missing App configuration value: "{$valueName}"',"only-available-in-window":"This method is available in a Window context.","only-available-in-sw":"This method is available in a service worker context.","permission-default":"The notification permission was not granted and dismissed instead.","permission-blocked":"The notification permission was not granted and blocked instead.","unsupported-browser":"This browser doesn't support the API's required to use the Firebase SDK.","indexed-db-unsupported":"This browser doesn't support indexedDb.open() (ex. Safari iFrame, Firefox Private Browsing, etc)","failed-service-worker-registration":"We are unable to register the default service worker. {$browserErrorMessage}","token-subscribe-failed":"A problem occurred while subscribing the user to FCM: {$errorInfo}","token-subscribe-no-token":"FCM returned no token when subscribing the user to push.","token-unsubscribe-failed":"A problem occurred while unsubscribing the user from FCM: {$errorInfo}","token-update-failed":"A problem occurred while updating the user from FCM: {$errorInfo}","token-update-no-token":"FCM returned no token when updating the user to push.","use-sw-after-get-token":"The useServiceWorker() method may only be called once and must be called before calling getToken() to ensure your service worker is used.","invalid-sw-registration":"The input to useServiceWorker() must be a ServiceWorkerRegistration.","invalid-bg-handler":"The input to setBackgroundMessageHandler() must be a function.","invalid-vapid-key":"The public VAPID key must be a string.","use-vapid-key-after-get-token":"The usePublicVapidKey() method may only be called once and must be called before calling getToken() to ensure your VAPID key is used."});async function dt(e,t){const a={method:"DELETE",headers:await pt(e)};try{const s=await fetch(`${ht(e.appConfig)}/${t}`,a),i=await s.json();if(i.error){const e=i.error.message;throw ct.create("token-unsubscribe-failed",{errorInfo:e})}}catch(e){throw ct.create("token-unsubscribe-failed",{errorInfo:e})}}function ht({projectId:e}){return`https://fcmregistrations.googleapis.com/v1/projects/${e}/registrations`}async function pt({appConfig:e,installations:t}){const a=await t.getToken();return new Headers({"Content-Type":"application/json",Accept:"application/json","x-goog-api-key":e.apiKey,"x-goog-firebase-installations-auth":`FIS ${a}`})}function mt({p256dh:e,auth:t,endpoint:a,vapidKey:s}){const i={web:{endpoint:a,auth:t,p256dh:e}};return s!==Ye&&(i.web.applicationPubKey=s),i}async function ut(e){const t=await async function(e,t){const a=await e.pushManager.getSubscription();if(a)return a;return e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:et(t)})}(e.swRegistration,e.vapidKey),a={vapidKey:e.vapidKey,swScope:e.swRegistration.scope,endpoint:t.endpoint,auth:Ze(t.getKey("auth")),p256dh:Ze(t.getKey("p256dh"))},s=await ot(e.firebaseDependencies);if(s){if(function(e,t){const a=t.vapidKey===e.vapidKey,s=t.endpoint===e.endpoint,i=t.auth===e.auth,n=t.p256dh===e.p256dh;return a&&s&&i&&n}(s.subscriptionOptions,a))return Date.now()>=s.createTime+6048e5?async function(e,t){try{const a=await async function(e,t){const a=await pt(e),s=mt(t.subscriptionOptions),i={method:"PATCH",headers:a,body:JSON.stringify(s)};let n;try{const a=await fetch(`${ht(e.appConfig)}/${t.token}`,i);n=await a.json()}catch(e){throw ct.create("token-update-failed",{errorInfo:e})}if(n.error){const e=n.error.message;throw ct.create("token-update-failed",{errorInfo:e})}if(!n.token)throw ct.create("token-update-no-token");return n.token}(e.firebaseDependencies,t),s=Object.assign(Object.assign({},t),{token:a,createTime:Date.now()});return await rt(e.firebaseDependencies,s),a}catch(t){throw await gt(e),t}}(e,{token:s.token,createTime:Date.now(),subscriptionOptions:a}):s.token;try{await dt(e.firebaseDependencies,s.token)}catch(e){console.warn(e)}return _t(e.firebaseDependencies,a)}return _t(e.firebaseDependencies,a)}async function gt(e){const t=await ot(e.firebaseDependencies);t&&(await dt(e.firebaseDependencies,t.token),await async function(e){const t=lt(e),a=(await nt()).transaction(st,"readwrite");await a.objectStore(st).delete(t),await a.complete}(e.firebaseDependencies));const a=await e.swRegistration.pushManager.getSubscription();return!a||a.unsubscribe()}async function _t(e,t){const a=await async function(e,t){const a=await pt(e),s=mt(t),i={method:"POST",headers:a,body:JSON.stringify(s)};let n;try{const t=await fetch(ht(e.appConfig),i);n=await t.json()}catch(e){throw ct.create("token-subscribe-failed",{errorInfo:e})}if(n.error){const e=n.error.message;throw ct.create("token-subscribe-failed",{errorInfo:e})}if(!n.token)throw ct.create("token-subscribe-no-token");return n.token}(e,t),s={token:a,createTime:Date.now(),subscriptionOptions:t};return await rt(e,s),s.token}function ft(e){const t={from:e.from,collapseKey:e.collapse_key,messageId:e.fcmMessageId};return function(e,t){if(!t.notification)return;e.notification={};const a=t.notification.title;a&&(e.notification.title=a);const s=t.notification.body;s&&(e.notification.body=s);const i=t.notification.image;i&&(e.notification.image=i)}(t,e),function(e,t){if(!t.data)return;e.data=t.data}(t,e),function(e,t){if(!t.fcmOptions)return;e.fcmOptions={};const a=t.fcmOptions.link;a&&(e.fcmOptions.link=a);const s=t.fcmOptions.analytics_label;s&&(e.fcmOptions.analyticsLabel=s)}(t,e),t}function bt(e,t){const a=[];for(let s=0;s{}))}catch(e){throw ct.create("failed-service-worker-registration",{browserErrorMessage:e.message})}}async function Et(e,t){if(!navigator)throw ct.create("only-available-in-window");if("default"===Notification.permission&&await Notification.requestPermission(),"granted"!==Notification.permission)throw ct.create("permission-blocked");return await async function(e,t){t?e.vapidKey=t:e.vapidKey||(e.vapidKey=Ye)}(e,null==t?void 0:t.vapidKey),await async function(e,t){if(t||e.swRegistration||await wt(e),t||!e.swRegistration){if(!(t instanceof ServiceWorkerRegistration))throw ct.create("invalid-sw-registration");e.swRegistration=t}}(e,null==t?void 0:t.serviceWorkerRegistration),ut(e)}async function Ct(e,t,a){const s=function(e){switch(e){case Xe.NOTIFICATION_CLICKED:return"notification_open";case Xe.PUSH_RECEIVED:return"notification_foreground";default:throw new Error}}(t);(await e.firebaseDependencies.analyticsProvider.get()).logEvent(s,{message_id:a["google.c.a.c_id"],message_name:a["google.c.a.c_l"],message_time:a["google.c.a.ts"],message_device_time:Math.floor(Date.now()/1e3)})}async function St(e,t){const a=t.data;if(!a.isFirebaseMessaging)return;e.onMessageHandler&&a.messageType===Xe.PUSH_RECEIVED&&("function"==typeof e.onMessageHandler?e.onMessageHandler(ft(a)):e.onMessageHandler.next(ft(a)));const s=a.data;var i;"object"==typeof(i=s)&&i&&Qe in i&&"1"===s["google.c.a.e"]&&await Ct(e,a.messageType,s)}const Mt="@firebase/messaging",kt="0.9.12",Tt=e=>{const t=e.getProvider("messaging").getImmediate();return{getToken:e=>Et(t,e)}};async function Nt(){try{await p()}catch(e){return!1}return"undefined"!=typeof window&&h()&&!("undefined"==typeof navigator||!navigator.cookieEnabled)&&"serviceWorker"in navigator&&"PushManager"in window&&"Notification"in window&&"fetch"in window&&ServiceWorkerRegistration.prototype.hasOwnProperty("showNotification")&&PushSubscription.prototype.hasOwnProperty("getKey")}function At(e=function(e="[DEFAULT]"){const t=z.get(e);if(!t)throw G.create("no-app",{appName:e});return t}()){return Nt().then((e=>{if(!e)throw ct.create("unsupported-browser")}),(e=>{throw ct.create("indexed-db-unsupported")})),K(b(e),"messaging").getImmediate()}async function Dt(e,t){return Et(e=b(e),t)}function Pt(e){return async function(e){if(!navigator)throw ct.create("only-available-in-window");return e.swRegistration||await wt(e),gt(e)}(e=b(e))}function It(e,t){return function(e,t){if(!navigator)throw ct.create("only-available-in-window");return e.onMessageHandler=t,()=>{e.onMessageHandler=null}}(e=b(e),t)}W(new k("messaging",(e=>{const t=new yt(e.getProvider("app").getImmediate(),e.getProvider("installations-internal").getImmediate(),e.getProvider("analytics-internal"));return navigator.serviceWorker.addEventListener("message",(e=>St(t,e))),t}),"PUBLIC")),W(new k("messaging-internal",Tt,"PRIVATE")),Q(Mt,kt),Q(Mt,kt,"esm2017");const Ut=Tinode;class Rt extends t().PureComponent{render(){return this.props.visible?t().createElement("div",{className:"alert-container"},t().createElement("div",{className:"alert"},t().createElement("div",{className:"title"},this.props.title),t().createElement("div",{className:"content"},this.props.content),t().createElement("div",{className:"dialog-buttons"},this.props.onReject?t().createElement("button",{className:"outline",onClick:this.props.onReject},this.props.reject||t().createElement(n.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})):null,t().createElement("button",{className:"primary",onClick:this.props.onConfirm},this.props.confirm||t().createElement(n.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))))):null}}const Ft="0.20.0-beta1",xt="TinodeWeb/0.20.0-beta1",Bt={hosted:"web.tinode.co",local:"localhost:6060"},Lt=Bt.hosted,Ot=3e3,qt="JRWPS",jt=13,zt=384,Ht=262144,Vt=1<<23,Wt=36,Kt=60,Gt=360,$t=(0,n.defineMessages)({info:{id:"menu_item_info",defaultMessage:[{type:0,value:"Info"}]},clear_messages:{id:"menu_item_clear_messages",defaultMessage:[{type:0,value:"Clear messages"}]},clear_for_all:{id:"menu_item_clear_messages_for_all",defaultMessage:[{type:0,value:"Clear for All"}]},delete:{id:"menu_item_delete",defaultMessage:[{type:0,value:"Delete"}]},delete_for_all:{id:"menu_item_delete_for_all",defaultMessage:[{type:0,value:"Delete for All"}]},send_retry:{id:"menu_item_send_retry",defaultMessage:[{type:0,value:"Retry"}]},mute:{id:"menu_item_mute",defaultMessage:[{type:0,value:"Mute"}]},unmute:{id:"menu_item_unmute",defaultMessage:[{type:0,value:"Unmute"}]},reply:{id:"menu_item_reply",defaultMessage:[{type:0,value:"Reply"}]},forward:{id:"menu_item_forward",defaultMessage:[{type:0,value:"Forward"}]},topic_delete:{id:"menu_item_delete_topic",defaultMessage:[{type:0,value:"Delete"}]},topic_delete_warning:{id:"topic_delete_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete this conversation? It cannot be undone."}]},delete_messages_warning:{id:"delete_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete all messages for everyone? It cannot be undone."}]},unblock:{id:"menu_item_unblock",defaultMessage:[{type:0,value:"Unblock"}]},block:{id:"menu_item_block",defaultMessage:[{type:0,value:"Block"}]},topic_block_warning:{id:"topic_block_warning",defaultMessage:[{type:0,value:"Are you sure you want to block this conversation?"}]},member_delete:{id:"menu_item_member_delete",defaultMessage:[{type:0,value:"Remove"}]},archive:{id:"menu_item_archive_topic",defaultMessage:[{type:0,value:"Archive"}]},unarchive:{id:"menu_item_restore_topic",defaultMessage:[{type:0,value:"Restore"}]},edit_permissions:{id:"menu_item_edit_permissions",defaultMessage:[{type:0,value:"Edit permissions"}]},clear_messages_warning:{id:"clear_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to clear all messages? It cannot be undone."}]}});class Yt extends t().Component{constructor(e){super(e),this.selfRef=t().createRef();const{formatMessage:a}=e.intl;this.handlePageClick=this.handlePageClick.bind(this),this.handleEscapeKey=this.handleEscapeKey.bind(this),this.handleClick=this.handleClick.bind(this),this.MenuItems={topic_info:{id:"topic_info",title:a($t.info),handler:null},messages_clear:{id:"messages_clear",title:a($t.clear_messages),handler:(t,s)=>e.onShowAlert(a($t.clear_messages),a($t.clear_messages_warning),(()=>{this.deleteMessages(!0,!1,t,s)}),null,!0,null)},messages_clear_hard:{id:"messages_clear_hard",title:a($t.clear_for_all),handler:(t,s)=>e.onShowAlert(a($t.clear_for_all),a(message.delete_messages_warning),(()=>this.deleteMessages(!0,!0,t,s)),null,!0,null)},message_delete:{id:"message_delete",title:a($t.delete),handler:(e,t)=>this.deleteMessages(!1,!1,e,t)},message_delete_hard:{id:"message_delete_hard",title:a($t.delete_for_all),handler:(e,t)=>this.deleteMessages(!1,!0,e,t)},menu_item_send_retry:{id:"menu_item_send_retry",title:a($t.send_retry),handler:(e,t)=>this.retryMessage(e,t)},menu_item_reply:{id:"menu_item_reply",title:a($t.reply),handler:(e,t)=>this.replyToMessage(e,t)},menu_item_forward:{id:"menu_item_forward",title:a($t.forward),handler:()=>{}},topic_unmute:{id:"topic_unmute",title:a($t.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},topic_mute:{id:"topic_mute",title:a($t.mute),handler:this.topicPermissionSetter.bind(this,"-P")},topic_unblock:{id:"topic_unblock",title:a($t.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")},topic_block:{id:"topic_block",title:a($t.block),handler:(t,s)=>e.onShowAlert(a($t.block),a($t.topic_block_warning),(()=>this.topicPermissionSetter("-JP",t,s).then((e=>(this.props.onTopicRemoved(t.topicName),e)))),null,!0,null)},topic_delete:{id:"topic_delete",title:a($t.topic_delete),handler:(t,s)=>e.onShowAlert(a($t.topic_delete),a($t.topic_delete_warning),(()=>{const e=this.props.tinode.getTopic(t.topicName);if(e)return e.delTopic(!0).catch((e=>{s&&s(e.message,"err")}));console.warn("Topic not found: ",t.topicName)}),null,!0,null)},topic_archive:{id:"topic_archive",title:a($t.archive),handler:(e,t)=>{const a=this.props.tinode.getTopic(e.topicName);if(a)return a.archive(!0).catch((e=>{t&&t(e.message,"err")}));console.warn("Topic not found: ",e.topicName)}},topic_restore:{id:"topic_restore",title:a($t.unarchive),handler:(e,t)=>{const a=this.props.tinode.getTopic(e.topicName);if(a)return a.archive(!1).catch((e=>{t&&t(e.message,"err")}));console.warn("Topic not found: ",e.topicName)}},permissions:{id:"permissions",title:a($t.edit_permissions),handler:null},member_delete:{id:"member_delete",title:a($t.member_delete),handler:(e,t)=>{const a=this.props.tinode.getTopic(e.topicName);if(a&&e.user)return a.delSubscription(e.user).catch((e=>{t&&t(e.message,"err")}));console.warn("Topic or user not found: '"+e.topicName+"', '"+e.user+"'")}},member_mute:{id:"member_mute",title:a($t.mute),handler:this.topicPermissionSetter.bind(this,"-P")},member_unmute:{id:"member_unmute",title:a($t.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},member_block:{id:"member_block",title:a($t.block),handler:this.topicPermissionSetter.bind(this,"-JP")},member_unblock:{id:"member_unblock",title:a($t.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")}}}componentDidMount(){document.addEventListener("mousedown",this.handlePageClick,!1),document.addEventListener("keyup",this.handleEscapeKey,!1)}componentWillUnmount(){document.removeEventListener("mousedown",this.handlePageClick,!1),document.removeEventListener("keyup",this.handleEscapeKey,!1)}handlePageClick(e){this.selfRef.current.contains(e.target)||(e.preventDefault(),e.stopPropagation(),this.props.hide())}handleEscapeKey(e){27===e.keyCode&&this.props.hide()}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.hide();let t=this.props.items[e.currentTarget.dataset.id];"string"==typeof t&&(t=this.MenuItems[t]),t?this.props.onAction(t.id,t.handler(this.props.params,this.props.onError),this.props.params):console.error("Invalid menu item ID",e.currentTarget.dataset.id)}deleteMessages(e,t,a,s){const i=this.props.tinode.getTopic(a.topicName);if(!i)return void console.warn("Topic not found: ",a.topicName);if(!e&&i.cancelSend(a.seq))return;return(e?i.delMessagesAll(t):i.delMessagesList([a.seq],t)).catch((e=>{s&&s(e.message,"err")}))}retryMessage(e,t){const a=this.props.tinode.getTopic(e.topicName);if(!a||!a.flushMessage(e.seq))return;const s=a.createMessage(e.content,!1);return a.publishDraft(s).catch((e=>{t&&t(e.message,"err")}))}topicPermissionSetter(e,t,a){const s=this.props.tinode.getTopic(t.topicName);if(!s)return void console.warn("Topic not found",t.topicName);let i=s.updateMode(t.user,e);return a&&(i=i.catch((e=>{a(e.message,"err")}))),i}replyToMessage(e,t){e.pickReply(e.seq,e.content,e.userFrom,e.userName,t)}render(){const e=[];let a=0;this.props.items.map((s=>{"string"==typeof s&&(s=this.MenuItems[s]),s&&s.title&&e.push("-"==s.title?t().createElement("li",{className:"separator",key:a}):t().createElement("li",{onClick:this.handleClick,"data-id":a,key:a},s.title)),a++}));const s=jt*(.7+2.5*e.length),i={left:(this.props.bounds.right-this.props.clickAt.x<156?this.props.clickAt.x-this.props.bounds.left-156:this.props.clickAt.x-this.props.bounds.left)+"px",top:(this.props.bounds.bottom-this.props.clickAt.y0?(e=[],this.props.badges.map((a=>{const s=a.color?" "+a.color:"";a.icon?e.push(t().createElement("i",{className:"material-icons as-badge"+s,key:a.key||a.icon},Jt[a.icon]||a.icon)):e.push(t().createElement("span",{className:"badge"+s,key:a.key||a.name},a.name))})),t().createElement(t().Fragment,null,e)):null}}function Zt(e,t){let a=0|Math.floor(e/60),s=0|Math.floor(a/60);(t||s>0)&&(a=a<10?"0".concat(a):a);let i=e%60|0;return i=i<10?"0".concat(i):i,0==s?"".concat(a,":").concat(i):"".concat(s,":").concat(a,":").concat(i)}function ea(e){if(!e||0==e)return"0 Bytes";const t=["Bytes","KB","MB","GB","TB","PB"],a=Math.min(0|Math.floor(Math.log2(e)/10),t.length-1),s=e/Math.pow(1024,a),i=a>0?s<3?2:s<30?1:0:0;return s.toFixed(i)+" "+t[a]}function ta(e,t){return"string"!=typeof e?e:e.length>t?e.slice(0,t/2-1)+"…"+e.slice(1-t/2):e}function aa(e,t,a){return(t?"lt-":"dk-")+(a?"fg-":"bg-")+(s=e,Math.abs(function(e){let t=0;e=""+e;for(let a=0;a0?"a":"")+".png",t&&a.removeChild(t),a.appendChild(s),document.title=(e>0?"("+e+") ":"")+"Tinode"}function ia(e,t,a,s){let i=null;if((e=e&&e.trim())&&(i={fn:e}),"string"==typeof(s=s&&s.trim())&&(i=i||{},i.note=s||Ut.Tinode.DEL_CHAR),t){i=i||{};let e=a;const s=/^data:(image\/[-a-z0-9+.]+)?(;base64)?,/i.exec(t);s?(e=s[1],i.photo={data:t.substring(t.indexOf(",")+1),ref:Ut.Tinode.DEL_CHAR}):i.photo={data:Ut.Tinode.DEL_CHAR,ref:t},i.photo.type=(e||"image/jpeg").substring("image/".length)}return i}function na(e,t){if(e===t)return!0;if(!Array.isArray(e)||!Array.isArray(t))return!1;if(e.length!=t.length)return!1;e.sort(),t.sort();for(let a=0,s=e.length;a{e.then((e=>t?s({isCanceled:!0}):a(e)),(e=>s(t?{isCanceled:!0}:e)))})),cancel(){t=!0}}}function da(e,t){return e&&e.substring(0,t)}class ha extends t().PureComponent{render(){let e;if(!0===this.props.avatar){const a=Ut.Tinode.isGroupTopicName(this.props.topic),s=aa(this.props.topic,a);if(this.props.topic&&this.props.title&&this.props.title.trim()){const a=this.props.title.trim().charAt(0),i="lettertile "+s+(this.props.deleted?" disabled":"");e=t().createElement("div",{className:i},t().createElement("div",null,a))}else{const i="material-icons "+s+(this.props.deleted?" disabled":"");e=a?t().createElement("i",{className:i},"group"):t().createElement("i",{className:i},"person")}}else if(this.props.avatar){const a=this.props.tinode.authorizeURL(ra(this.props.avatar,"image")),s="avatar"+(this.props.deleted?" deleted":"");e=t().createElement("img",{className:s,alt:"avatar",src:a,onError:e=>{e.target.onerror=null,e.target.src="../img/broken_image.png"}})}else e=null;return e}}class pa extends t().PureComponent{render(){return this.props.count>0?t().createElement("span",{className:"unread"},this.props.count>9?"9+":this.props.count):null}}const ma=["image/jpeg","image/gif","image/png","image/svg","image/svg+xml"],ua=["jpg","gif","png","svg","svg"];function ga(e){if(e&&"object"==typeof e){if(e.ref)return e.ref;if(e.data&&e.type){return"data:"+(e.type.startsWith("image/")?e.type:"image/"+e.type)+";base64,"+e.data}}return null}function _a(e,t,a,s,i){if(t|=0,a|=0,s|=0,(e|=0)<=0||t<=0||a<=0||s<=0)return null;i&&(a=s=Math.min(a,s));const n=Math.min(Math.min(e,a)/e,Math.min(t,s)/t),o={dstWidth:e*n|0,dstHeight:t*n|0};return i?(o.dstWidth=o.dstHeight=Math.min(o.dstWidth,o.dstHeight),o.srcWidth=o.srcHeight=Math.min(e,t),o.xoffset=(e-o.srcWidth)/2|0,o.yoffset=(t-o.srcWidth)/2|0):(o.xoffset=o.yoffset=0,o.srcWidth=e,o.srcHeight=t),o}function fa(e,t){const a=ma.indexOf(t);if(a<0||!e)return e;const s=ua[a],i=e.lastIndexOf(".");return i>=0&&(e=e.substring(0,i)),e+"."+s}function ba(e,t,a,s,i){return new Promise(((n,o)=>{const r=new Image;r.crossOrigin="Anonymous",r.onerror=function(e){o(new Error("Image format unrecognized"))},r.onload=async function(){URL.revokeObjectURL(r.src);const l=_a(r.width,r.height,t,a,i);if(!l)return void o(new Error("Invalid image"));let c=document.createElement("canvas");c.width=l.dstWidth,c.height=l.dstHeight;let d=c.getContext("2d");d.imageSmoothingEnabled=!0,d.drawImage(r,l.xoffset,l.yoffset,l.srcWidth,l.srcHeight,0,0,l.dstWidth,l.dstHeight);const h=ma.includes(e.type)?e.type:"image/jpeg";let p=await new Promise((e=>c.toBlob(e,h)));if(p){for(;s>0&&p.length>s;)l.dstWidth=.70710678118*l.dstWidth|0,l.dstHeight=.70710678118*l.dstHeight|0,c.width=l.dstWidth,c.height=l.dstHeight,d=c.getContext("2d"),d.clearRect(0,0,c.width,c.height),d.drawImage(r,l.xoffset,l.yoffset,l.srcWidth,l.srcHeight,0,0,l.dstWidth,l.dstHeight),p=await new Promise((e=>c.toBlob(e,h)));c=null,n({mime:h,blob:p,width:l.dstWidth,height:l.dstHeight,name:fa(e.name,h)})}else o(new Error("Unsupported image format"))},r.src=URL.createObjectURL(e)}))}function va(e){return new Promise(((t,a)=>{const s=new FileReader;s.onerror=e=>{a(s.error)},s.onload=()=>{t({mime:e.type,bits:s.result.split(",")[1]})},s.readAsDataURL(e)}))}function ya(e){if(!Array.isArray(e))return null;try{let t="";return new Uint8Array(e).forEach((e=>t+=String.fromCharCode(e))),window.btoa(t)}catch(e){}return null}function wa(e){const t=[];try{return[...window.atob(e)].forEach((e=>{t.push(e.charCodeAt(0))})),t}catch(e){}return null}const Ea="#666C";class Ca extends t().PureComponent{constructor(e){super(e);let a=wa(this.props.preview);(!Array.isArray(a)||a.length<16)&&(a=null),this.state={canPlay:!1,playing:!1,currentTime:"0:00",duration:this.props.duration>0?Zt(this.props.duration/1e3):"-:--",longMin:this.props.duration>=6e5,preview:a},this.initAudio=this.initAudio.bind(this),this.initCanvas=this.initCanvas.bind(this),this.resampleBars=this.resampleBars.bind(this),this.visualize=this.visualize.bind(this),this.handlePlay=this.handlePlay.bind(this),this.handleSeek=this.handleSeek.bind(this),this.handleError=this.handleError.bind(this),this.audioPlayer=null,this.viewBuffer=[],this.canvasRef=t().createRef()}componentDidMount(){this.props.src&&this.initAudio(),this.initCanvas()}componentWillUnmount(){this.audioPlayer&&(this.audioPlayer.oncanplay=null,this.audioPlayer.ontimeupdate=null,this.audioPlayer.onended=null,this.audioPlayer.pause(),this.audioPlayer=null)}componentDidUpdate(e){if(this.props.src!=e.src&&this.initAudio(),this.props.preview!=e.preview){let e=wa(this.props.preview);(!Array.isArray(e)||e.length<16)&&(e=null),this.setState({preview:e},this.initCanvas)}}initAudio(){this.audioPlayer=new Audio(this.props.src),this.audioPlayer.oncanplay=e=>this.setState({canPlay:!0}),this.audioPlayer.ontimeupdate=e=>this.setState({currentTime:Zt(this.audioPlayer.currentTime,this.state.longMin)}),this.audioPlayer.onended=e=>{this.audioPlayer.currentTime=0,this.setState({playing:!1,currentTime:Zt(0,this.state.longMin)})}}initCanvas(){this.canvasRef.current.width=2*this.canvasRef.current.offsetWidth,this.canvasRef.current.height=2*this.canvasRef.current.offsetHeight,this.canvasContext=this.canvasRef.current.getContext("2d"),this.canvasContext.lineCap="round",this.viewBuffer=this.resampleBars(this.state.preview),this.visualize()}visualize(){if(!this.canvasRef.current)return;const e=this.effectiveWidth,t=this.canvasRef.current.height;this.canvasContext.lineWidth=6;const a=()=>{if(this.canvasRef.current&&this.audioPlayer&&(this.canvasContext.clearRect(0,0,this.canvasRef.current.width,t),this.viewBuffer)){this.state.playing&&window.requestAnimationFrame(a);const s=this.props.duration?Math.max(0,Math.min(1e3*this.audioPlayer.currentTime/this.props.duration,1))*(e-12):-1;this.canvasContext.beginPath(),this.canvasContext.strokeStyle=Ea;for(let e=0;e.01));const a=e.length/t;let s=[],i=-1;for(let n=0;n0?s.map((e=>e/i)):Array.apply(null,Array(t)).map((e=>.01))}handlePlay(e){e.preventDefault(),this.state.canPlay&&(this.state.playing?(this.audioPlayer.pause(),this.setState({playing:!1})):(this.audioPlayer.play(),this.setState({playing:!0},this.visualize)))}handleError(e){console.error(e)}handleSeek(e){if(e.preventDefault(),e.target&&this.props.duration){const t=e.target.getBoundingClientRect(),a=(e.clientX-t.left)/this.effectiveWidth*2;this.audioPlayer.currentTime=this.props.duration*a/1e3,this.setState({currentTime:Zt(this.audioPlayer.currentTime,this.state.longMin)}),this.state.playing||this.visualize()}}render(){const e="material-icons"+(this.props.short?"":" large")+(this.state.canPlay?"":" disabled"),a=t().createElement("a",{href:"#",onClick:this.handlePlay,title:"Play"},t().createElement("i",{className:e},this.state.playing?"pause_circle":this.state.canPlay?"play_circle":"not_interested"));return t().createElement("div",{className:"audio-player"},this.props.short?t().createElement(t().Fragment,null,t().createElement("canvas",{className:"playback",ref:this.canvasRef,onClick:this.handleSeek}),a):t().createElement(t().Fragment,null,a,t().createElement("div",null,t().createElement("canvas",{className:"playback",ref:this.canvasRef,onClick:this.handleSeek}),t().createElement("div",{className:"timer"},this.state.currentTime,"/",this.state.duration))))}}class Sa extends t().PureComponent{render(){const e=["declined","disconnected","missed"].includes(this.props.callState),a="material-icons medium "+(e?"red":"green"),s=this.props.incoming?e?"call_missed":"call_received":e?"call_missed_outgoing":"call_made",i=e?this.props.incoming?"declined"==this.props.callState?t().createElement(n.FormattedMessage,{id:"call_declined",defaultMessage:[{type:0,value:"declined"}]}):t().createElement(n.FormattedMessage,{id:"call_missed",defaultMessage:[{type:0,value:"missed"}]}):t().createElement(n.FormattedMessage,{id:"call_cancelled",defaultMessage:[{type:0,value:"cancelled"}]}):t().createElement("span",null,Zt(this.props.duration/1e3));return t().createElement("div",{className:"call-message"},t().createElement("div",null,t().createElement("i",{className:"material-icons big gray"},"call")),t().createElement("div",{className:"flex-column narrow"},t().createElement("div",null,this.props.incoming?t().createElement(n.FormattedMessage,{id:"calls_incoming",defaultMessage:[{type:0,value:"Incoming call"}]}):t().createElement(n.FormattedMessage,{id:"calls_outgoing",defaultMessage:[{type:0,value:"Outgoing call"}]})),t().createElement("div",{className:"duration"},t().createElement("i",{className:a},s)," ",i)))}}class Ma extends t().PureComponent{render(){const e=["declined","disconnected","missed"].includes(this.props.callState),a=this.props.incoming?e?"call_missed":"call_received":e?"call_missed_outgoing":"call_made",s=e?this.props.incoming?"declined"==this.props.callState?t().createElement(n.FormattedMessage,{id:"call_declined",defaultMessage:[{type:0,value:"declined"}]}):t().createElement(n.FormattedMessage,{id:"call_missed",defaultMessage:[{type:0,value:"missed"}]}):t().createElement(n.FormattedMessage,{id:"call_cancelled",defaultMessage:[{type:0,value:"cancelled"}]}):t().createElement("span",null,Zt(this.props.duration/1e3));return t().createElement(t().Fragment,null,t().createElement("div",{className:"composed-material"},t().createElement("i",{className:"material-icons"},"call"),t().createElement("i",{className:"material-icons second"},a))," ",s)}}class ka extends t().PureComponent{constructor(e){super(e),this.state={src:"img/placeholder.png",style:Object.assign({padding:"4px"},this.props.style),className:this.props.className,alt:this.props.alt,onClick:this.props.onClick}}componentDidMount(){this.props.whenDone.promise.then((e=>this.setState({src:e.src,style:{...this.state.style,padding:0}}))).catch((()=>this.setState({src:"img/broken_image.png"})))}componentWillUnmount(){this.props.whenDone.cancel()}componentDidUpdate(e){e.whenDone!=this.props.whenDone&&(this.setState({src:"img/placeholder.png",style:{...this.state.style,padding:"4px"}}),this.props.whenDone.promise.then((e=>this.setState({src:e.src,style:{...this.state.style,padding:0}}))).catch((()=>this.setState({src:"img/broken_image.png"}))))}render(){return t().createElement("img",this.state)}}class Ta extends t().PureComponent{render(){return t().createElement("div",{className:"uploader"},t().createElement("div",null,t().createElement("span",{style:{width:100*this.props.progress+"%"}})),this.props.progress<.999?t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancel()}},t().createElement("i",{className:"material-icons"},"close")," ",t().createElement(n.FormattedMessage,{id:"action_cancel",defaultMessage:[{type:0,value:"cancel"}]})):t().createElement(n.FormattedMessage,{id:"upload_finishing",defaultMessage:[{type:0,value:"finishing..."}]}))}}class Na extends t().PureComponent{constructor(e){super(e)}render(){return t().createElement("div",{className:"inline-image"},t().createElement("img",this.props),t().createElement("div",{className:"rounded-container"},t().createElement(Ta,{progress:this.props.progress,onCancel:this.props.onCancelUpload})))}}const Aa=(0,n.defineMessages)({drafty_form:{id:"drafty_form",defaultMessage:[{type:0,value:"Form:"}]},drafty_attachment:{id:"drafty_attachment",defaultMessage:[{type:0,value:"Attachment"}]},drafty_image:{id:"drafty_image",defaultMessage:[{type:0,value:"Picture"}]},drafty_unknown:{id:"drafty_unknown",defaultMessage:[{type:0,value:"Unsupported"}]}});function Da(e,t,a){if(!t)return a.src="img/broken_image.png",a.style={width:"36px",height:"36px"},e;a.className="inline-image";const s=_a(t.width,t.height,this.viewportWidth>0?Math.min(this.viewportWidth-84.5,448.5):448.5,312,!1)||{dstWidth:32,dstHeight:32};return a.style={width:s.dstWidth+"px",height:s.dstHeight+"px",minWidth:s.dstWidth+"px",minHeight:s.dstHeight+"px"},Ut.Drafty.isProcessing(t)?e=Na:(a.src=this.authorizeURL(ra(a.src,"image")),a.alt=t.name,a.src?(Math.max(t.width||0,t.height||0)>Wt&&(a.onClick=this.onImagePreview,a.className+=" image-clickable"),a.loading="lazy"):a.src="img/broken_image.png"),e}function Pa(e,a,s,i,n){if(n.includes("QQ"))return Ra.call(this,e,a,s,i);if(!e)return s;let o=Ut.Drafty.tagName(e),r=Ut.Drafty.attrValue(e,a)||{};switch(r.key=i,e){case"AU":r.src&&(r.src=this.authorizeURL(ra(r.src,"audio")),r.duration=a.duration>0?0|a.duration:void 0,r.preview=a.preview,r.loading="lazy"),o=Ca,s=null;break;case"BR":s=null;break;case"EX":case"RW":break;case"HL":r.className="highlight";break;case"HD":o=null,s=null;break;case"IM":o=Da.call(this,o,a,r),s=null;break;case"BN":r.onClick=this.onFormButtonClick;let e=t().Children.map(s,(e=>"string"==typeof e?e:void 0));e&&0!=e.length||(e=[r.name]),r["data-title"]=e.join("");break;case"MN":r.className="mention",a&&(r.className+=" "+aa(a.val,!1,!0));break;case"FM":r.className="bot-form";break;case"QQ":r.className="reply-quote",r.onClick=this.onQuoteClick;break;case"VC":o=Sa,s=null,a&&(r.callState=a.state,r.incoming=a.incoming,r.duration=a.duration);break;default:if(!o){o=t().Fragment,r={key:i};let e=s;Array.isArray(s)&&s.join("").trim()||(e=[t().createElement("span",{key:"x1",className:"gray"},this.formatMessage(Aa.drafty_unknown))]),s=[t().createElement("i",{key:"x0",className:"material-icons gray"},"extension")," "].concat(e)}}return o?t().createElement(o,r,s):s}function Ia(e,a,s,i){if(!e)return s;let n=Ut.Drafty.tagName(e);const o={key:i};switch(e){case"AU":n=t().Fragment,s=[t().createElement("i",{key:"au",className:"material-icons"},"mic")," ",Zt(a.duration/1e3)];break;case"BR":n=t().Fragment,s=[" "];break;case"HL":o.className="highlight preview";break;case"LN":case"MN":n="span";break;case"IM":n=t().Fragment,s=[t().createElement("i",{key:"im",className:"material-icons"},"photo")," ",this.formatMessage(Aa.drafty_image)];break;case"BN":n="span",o.className="flat-button faux";break;case"FM":n=t().Fragment,s=[t().createElement("i",{key:"fm",className:"material-icons"},"dashboard"),this.formatMessage(Aa.drafty_form)].concat(" ",s||[]);break;case"RW":n=t().Fragment;break;case"EX":if(a){if("application/json"==a.mime)return null;delete a.val,delete a.ref}n=t().Fragment,s=[t().createElement("i",{key:"ex",className:"material-icons"},"attachment")," ",this.formatMessage(Aa.drafty_attachment)];break;case"VC":n=Ma,a&&(o.callState=a.state,o.incoming=a.incoming,o.duration=a.duration),s=null;break;case"QQ":case"HD":n=null,s=null;break;default:n||(n=t().Fragment,s=[t().createElement("i",{key:"x0",className:"material-icons gray"},"extension")," ",this.formatMessage(Aa.drafty_unknown)])}return n?t().createElement(n,o,s):s}function Ua(e,t){return e.style={width:"36px",height:"36px",maxWidth:"36px",maxHeight:"36px"},e.className="inline-image",e.alt=this.formatMessage(Aa.drafty_image),t||(e.src="img/broken_image.png"),e.title=e.alt,e}function Ra(e,a,s,i){if(["BR","EX","IM","MN"].includes(e)){let n=Ut.Drafty.tagName(e),o=Ut.Drafty.attrValue(e,a)||{};switch(o.key=i,e){case"BR":s=null;break;case"IM":o=Ua.call(this,o,a),s=[t().createElement("img",o,null)," ",o.alt],n=t().Fragment,o={key:i};break;case"MN":n="span",o.className="mention",a&&(o.className+=" "+aa(a.val,!1,!0));break;case"EX":let e;if(a){if("application/json"==a.mime)return null;e=a.name,delete a.val,delete a.ref}n=t().Fragment,s=[t().createElement("i",{key:"ex",className:"material-icons"},"attachment"),ta(e,16)||this.formatMessage(Aa.drafty_attachment)]}return t().createElement(n,o,s)}return Ia.call(this,e,a,s,i)}function Fa(e){let t;if(e.val){const a=function(e,t){if(!e)return null;try{const a=atob(e),s=a.length,i=new ArrayBuffer(s),n=new Uint8Array(i);for(let e=0;e{if(e.ok)return e.blob();throw new Error("Image fetch unsuccessful: ".concat(e.status," ").concat(e.statusText))}))}return t.then((e=>ba(e,Wt,Wt,-1,!0))).then((t=>(e.mime=t.mime,e.size=t.blob.size,e.width=t.width,e.height=t.height,delete e.ref,e.src=URL.createObjectURL(t.blob),va(t.blob)))).then((t=>(e.val=t.bits,e))).catch((t=>{throw delete e.val,delete e.src,e.width=Wt,e.height=Wt,t}))}function xa(e,a,s,i,n){if("IM"==e){const e=Ua.call(this,{key:i},a);let n;try{n=ca(Fa.call(this,a))}catch(e){n=ca(e)}return e.whenDone=n,s=[t().createElement(ka,e,null)," ",e.alt],t().createElement(t().Fragment,{key:i},s)}if("QQ"==e){if(n.includes("QQ"))return t().createElement("span",{key:i},[t().createElement("i",{key:"qq",className:"material-icons"},"format_quote")," "]);const e=Ut.Drafty.attrValue("QQ",a)||{};return e.key=i,e.className="reply-quote",t().createElement(Ut.Drafty.tagName("QQ"),e,s)}return Ra.call(this,e,a,s,i)}class Ba extends t().Component{constructor(e){super(e),this.handleClick=this.handleClick.bind(this),this.handleContextClick=this.handleContextClick.bind(this)}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.onSelected&&this.props.onSelected(this.props.item,this.props.index)}handleContextClick(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.props.item,y:e.pageY,x:e.pageX})}render(){let e=this.props.title;e?e.length>30&&(e=e.substring(0,28)+"…"):e=t().createElement("i",null,t().createElement(n.FormattedMessage,{id:"unnamed_topic",defaultMessage:[{type:0,value:"Unnamed"}]}));const a=this.props.now?"online":"offline",s=!this.props.avatar||this.props.avatar,i=this.props.badges?this.props.badges.slice():[],o=[];let r;this.props.isVerified&&o.push({icon:"verified",color:"verified-color"}),this.props.isStaff&&o.push({icon:"staff",color:"staff-color"}),this.props.isDangerous&&o.push({icon:"dangerous",color:"danger-color"}),this.props.acs&&(this.props.showMode&&i.push({name:this.props.acs.getMode(),key:"mode"}),this.props.acs.isMuted()&&o.push({icon:"muted"}),this.props.acs.isJoiner()||o.push({icon:"banned"})),"string"==typeof this.props.preview?r=this.props.preview:Ut.Drafty.isValid(this.props.preview)?r=t().createElement(t().Fragment,null,Ut.Drafty.format(this.props.preview,Ia,{formatMessage:this.props.intl.formatMessage,previewIsResponse:this.props.previewIsResponse})):this.props.preview&&(r=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons gray"},"warning_amber")," ",t().createElement("i",{className:"gray"},t().createElement(n.FormattedMessage,{id:"invalid_content",defaultMessage:[{type:0,value:"invalid content"}]}))));const l=la(this.props.received),c=l?t().createElement("i",{className:"material-icons small space-right"+(l.color?" "+l.color:"")},l.name):null,d="contact-title"+(this.props.deleted?" deleted":"");return t().createElement("li",{className:!this.props.showCheckmark&&this.props.selected?"selected":null,onClick:this.handleClick},t().createElement("div",{className:"avatar-box"},t().createElement(ha,{tinode:this.props.tinode,avatar:s,title:this.props.title,topic:this.props.item,deleted:this.props.deleted}),this.props.deleted?t().createElement("i",{className:"deleted material-icons"},"cancel"):this.props.showOnline?t().createElement("span",{className:a}):this.props.showCheckmark&&this.props.selected?t().createElement("i",{className:"checkmark material-icons"},"check_circle"):null),t().createElement("div",{className:"text-box"},t().createElement("div",null,t().createElement("span",{className:d},e),this.props.isChannel?t().createElement("img",{src:"/img/channel.png",className:"channel",alt:"channel"}):null,t().createElement(Xt,{badges:o}),this.props.deleted?null:t().createElement(pa,{count:this.props.unread})),this.props.showMode?t().createElement("span",null,t().createElement(Xt,{badges:i})):this.props.small?null:t().createElement("div",{className:"contact-comment"},c,t().createElement("span",null,r||this.props.comment||" "))),this.props.showContextMenu?t().createElement("span",{className:"menuTrigger"},t().createElement("a",{href:"#",onClick:this.handleContextClick},t().createElement("i",{className:"material-icons"},"expand_more"))):null)}}const La=(0,n.injectIntl)(Ba);class Oa extends t().PureComponent{constructor(e){super(e),this.handleClick=this.handleClick.bind(this)}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.onAction(this.props.action)}render(){const{formatMessage:e}=this.props.intl;return t().createElement("li",{onClick:this.handleClick,className:"action"},t().createElement("div",{className:"action-text"},e(this.props.title,this.props.values)))}}const qa=(0,n.injectIntl)(Oa),ja=(0,n.defineMessages)({badge_you:{id:"badge_you",defaultMessage:[{type:0,value:"you"}]},badge_owner:{id:"badge_owner",defaultMessage:[{type:0,value:"owner"}]}});class za extends t().Component{render(){const{formatMessage:e}=this.props.intl,a=Array.isArray(this.props.topicSelected),s=[];let i=0;return this.props.contacts&&this.props.contacts.length>0&&this.props.contacts.map((n=>{if(n.action)s.push(t().createElement(qa,{title:n.title,action:n.action,values:n.values,key:n.action,onAction:this.props.onAction}));else{const o=this.props.showMode?n.user:n.topic||n.user;if(this.props.filterFunc&&this.props.filter){const e=[o];if(n.private&&n.private.comment&&e.push((""+n.private.comment).toLowerCase()),n.public&&n.public.fn&&e.push((""+n.public.fn).toLowerCase()),!this.props.filterFunc(this.props.filter,e))return}const r=Ut.Tinode.isChannelTopicName(o),l=a?this.props.topicSelected.indexOf(o)>-1:this.props.topicSelected===o,c=[];this.props.showMode&&(o==this.props.myUserId&&c.push({name:e(ja.badge_you),color:"green"}),n.acs&&n.acs.isOwner()&&c.push({name:e(ja.badge_owner),color:"blue"}));const d=Array.isArray(n.private)?n.private.join(","):n.private?n.private.comment:null;let h,p,m,u;if(!this.props.showMode&&n.latestMessage){const e=n.latestMessage(!0);e&&(p=e.head?e.head.forwarded:null,u=e._status||n.msgStatus(e,!0),m=e.from!=this.props.myUserId,e.content&&(h="string"==typeof e.content?e.content.substr(0,80):Ut.Drafty.preview(e.content,80)))}s.push(t().createElement(La,{tinode:this.props.tinode,title:n.public?n.public.fn:null,avatar:ga(n.public?n.public.photo:null),comment:d,preview:h,previewIsResponse:m,forwarded:p,received:u,unread:this.props.showUnread?n.unread:0,now:n.online&&this.props.connected,acs:n.acs,showMode:this.props.showMode,badges:c,showCheckmark:a,selected:l,showOnline:this.props.showOnline&&!r,isChannel:r,showContextMenu:this.props.showContextMenu,isVerified:n.trusted&&n.trusted.verified,isStaff:n.trusted&&n.trusted.staff,isDangerous:n.trusted&&n.trusted.danger,deleted:n._deleted,onSelected:this.props.onTopicSelected,item:o,index:s.length,key:o})),i++}}),this),t().createElement("div",{className:this.props.noScroll?null:"scrollable-panel"},0==i?t().createElement("div",{className:"center-medium-text",dangerouslySetInnerHTML:{__html:this.props.emptyListMessage}}):null,s.length>0?t().createElement("ul",{className:"contact-box"},s):null)}}const Ha=(0,n.injectIntl)(za);class Va extends t().PureComponent{constructor(e){super(e),this.state={edited:!1,search:""},this.handleSearchChange=this.handleSearchChange.bind(this),this.handleSearch=this.handleSearch.bind(this),this.handleClear=this.handleClear.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}componentWillUnmount(){this.state.edited&&(this.setState({search:"",edited:!1}),this.props.onSearchContacts(Ut.Tinode.DEL_CHAR))}handleSearchChange(e){this.setState({search:e.target.value})}handleSearch(e){e.preventDefault();var t=this.state.search.trim();this.setState({edited:t.length>0}),this.props.onSearchContacts(t.length>0?t:Ut.Tinode.DEL_CHAR)}handleClear(e){e.preventDefault(),this.state.edited&&this.props.onSearchContacts(Ut.Tinode.DEL_CHAR),this.setState({search:"",edited:!1})}handleKeyDown(e){"Enter"===e.key?this.handleSearch(e):"Escape"===e.key&&this.handleClear()}render(){return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement("i",{className:"material-icons search"},"search"),t().createElement("input",{className:"search",type:"text",placeholder:this.props.placeholder,value:this.state.search,onChange:this.handleSearchChange,onKeyDown:this.handleKeyDown,required:!0,autoFocus:!0}),this.state.search?t().createElement("a",{href:"#",onClick:this.handleClear},t().createElement("i",{className:"material-icons"},"highlight_off")):t().createElement("span",null,t().createElement("i",{className:"material-icons"}," "))))}}class Wa extends t().Component{constructor(e){super(e),this.state={query:null},this.handleEscapeKey=this.handleEscapeKey.bind(this),this.handleClose=this.handleClose.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleContactSelected=this.handleContactSelected.bind(this)}componentDidMount(){this.props.onInitFind()}handleEscapeKey(e){27===e.keyCode&&this.props.hide(!1)}handleClose(e){e.preventDefault(),this.props.hide(!1)}handleSearchContacts(e){this.setState({query:Ut.Tinode.isNullValue(e)?null:e}),this.props.onSearchContacts(e)}handleContactSelected(e){this.props.onTopicSelected(e),this.props.hide(!0)}render(){let e=null!=this.state.query?this.props.searchResults:this.props.contacts;return e=e.filter((e=>e.name!=this.props.topicSelected&&e.acs.isJoiner()&&e.acs.isWriter())),t().createElement("div",{className:"alert-container"},t().createElement("div",{className:"forward-dialog"},t().createElement("div",{className:"title with-control"},t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"forward_to",defaultMessage:[{type:0,value:"Forward to"}],desription:"Title of the contact selector dialog when forwarding a message"})),t().createElement("div",null,t().createElement("a",{href:"#",onClick:this.handleClose},t().createElement("i",{className:"material-icons"},"close")))),t().createElement(n.FormattedMessage,{id:"forward_to_search_placeholder",defaultMessage:[{type:0,value:"Search contacts"}]},(e=>t().createElement(Va,{placeholder:e,onSearchContacts:this.handleSearchContacts}))),t().createElement(n.FormattedMessage,{id:"search_no_results",defaultMessage:[{type:0,value:"Search returned no results"}]},(a=>t().createElement(Ha,{tinode:this.props.tinode,contacts:e,myUserId:this.props.myUserId,emptyListMessage:a,showOnline:!1,showUnread:!1,showContextMenu:!1,onTopicSelected:this.handleContactSelected})))))}}const Ka={staff:"verified_user"},Ga=(0,n.defineMessages)({badge_verified:{id:"badge_verified",defaultMessage:[{type:0,value:"Verified/official"}]},badge_staff:{id:"badge_staff",defaultMessage:[{type:0,value:"Staff-managed"}]},badge_danger:{id:"badge_danger",defaultMessage:[{type:0,value:"Untrustworthy"}]}});class $a extends t().PureComponent{render(){const{formatMessage:e}=this.props.intl;let a=null;return this.props.trustedBadges&&this.props.trustedBadges.length>0?(a=[],this.props.trustedBadges.map((s=>{const i=this.props.short?null:e(Ga["badge_"+s]),n="material-icons "+s+"-color";a.push(t().createElement("div",{className:"trusted-badge",key:s},t().createElement("i",{className:n},Ka[s]||s)," ",i))})),t().createElement(t().Fragment,null,a)):null}}const Ya=(0,n.injectIntl)($a),Qa=new Audio("audio/call-in.m4a");class Ja extends t().Component{constructor(e){super(e),this.state={topic:null,fullName:void 0,avatar:null,trustedBadges:[],previousMetaDesc:void 0},this.resetDesc=this.resetDesc.bind(this),this.onMetaDesc=this.onMetaDesc.bind(this),this.handleRejectCall=this.handleRejectCall.bind(this),this.handleAcceptCall=this.handleAcceptCall.bind(this),this.ringTimer=null}componentDidMount(){const e=this.props.tinode.getTopic(this.props.topic);e&&(this.resetDesc(e,this.props),2==this.props.callState&&(Qa.play(),this.ringTimer=setInterval((()=>Qa.play()),2e3),this.props.onRinging(this.props.topic,this.props.seq)))}componentDidUpdate(e){const t=this.props.tinode.getTopic(e.topic);t&&(this.onMetaDesc!=t.onMetaDesc&&(this.previousMetaDesc=t.onMetaDesc,t.onMetaDesc=this.onMetaDesc),this.state.topic!=e.topic&&(this.setState({topic:e.topic}),this.resetDesc(t,e)))}componentWillUnmount(){null!=this.ringTimer&&(clearInterval(this.ringTimer),Qa.pause());const e=this.props.tinode.getTopic(this.props.topic);e&&(this.setState({topic:null}),e.onMetaDesc=this.previousMetaDesc)}resetDesc(e,t){e.getDefaultAccess(),e.getAccessMode();const a=[];if(e.trusted)for(const[t,s]of Object.entries(e.trusted))s&&a.push(t);this.setState({fullName:da(e.public?e.public.fn:void 0,Kt),avatar:ga(e.public?e.public.photo:null),trustedBadges:a})}onMetaDesc(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetDesc(t,this.props),this.previousMetaDesc&&this.previousMetaDesc!=this.onMetaDesc&&this.previousMetaDesc(e))}handleAcceptCall(){this.props.onAcceptCall(this.props.topic)}handleRejectCall(){this.props.onReject(this.props.topic,this.props.seq),this.props.onClose()}render(){return t().createElement("div",{className:"alert-container"},t().createElement("div",{className:"incoming-call"},t().createElement("div",{className:"caller-card incoming pulse"},t().createElement("div",{className:"avatar-box"},t().createElement(ha,{tinode:this.props.tinode,avatar:this.state.avatar||!0,topic:this.props.topic,title:this.state.fullName})),t().createElement("div",{className:"caller-name"},da(this.state.fullName,20),t().createElement(Ya,{short:!0,trustedBadges:this.state.trustedBadges}))),t().createElement("div",{className:"controls"},2==this.props.callState?t().createElement(t().Fragment,null,t().createElement("button",{className:"danger",onClick:this.handleRejectCall},t().createElement("i",{className:"material-icons"},"call_end")),t().createElement("button",{className:"positive",onClick:this.handleAcceptCall},t().createElement("i",{className:"material-icons"},"call"))):null)))}}class Xa extends t().PureComponent{render(){const e="load-spinner-box"+(this.props.large?" large":"")+(this.props.clear?" clear":"")+(this.props.centered?" centered":"");return this.props.show?t().createElement("div",{className:e},t().createElement("div",{className:"loader-spinner"})):null}}class Za extends t().Component{constructor(e){super(e),this.state={source:e.avatar},this.handleFileReceived=this.handleFileReceived.bind(this)}componentDidUpdate(e){this.props.avatar!=e.avatar&&this.setState({source:this.props.avatar})}handleFileReceived(e){const t=e.target.files[0];this.props.onImageUpdated(t.type,URL.createObjectURL(t),t.name),e.target.value=""}render(){const e="file-input-avatar-"+(""+Math.random()).substring(0,4),a="avatar-upload"+(this.props.readOnly?" read-only":"");return t().createElement("div",{className:a},this.props.readOnly||!this.state.source?null:t().createElement("a",{href:"#",className:"clear-avatar",onClick:e=>{e.preventDefault(),this.props.onImageUpdated()}},t().createElement("i",{className:"material-icons"},"clear")),this.state.source?t().createElement("img",{src:this.props.tinode.authorizeURL(ra(this.state.source,"image")),className:"preview"}):this.props.readOnly&&this.props.uid?t().createElement("div",{className:"avatar-box"},t().createElement(ha,{tinode:this.props.tinode,avatar:!0,topic:this.props.uid,title:this.props.title})):t().createElement("div",{className:"blank"},zt,"×",zt),this.props.readOnly?null:t().createElement("input",{type:"file",id:e,className:"inputfile hidden",accept:"image/*",onChange:this.handleFileReceived}),this.props.readOnly?null:t().createElement("label",{htmlFor:e,className:"round"},t().createElement("i",{className:"material-icons"},"file_upload")),t().createElement(Xa,{show:this.props.uploading,large:!0,clear:!0,centered:!0}))}}class es extends t().PureComponent{constructor(e){super(e),this.handleChange=this.handleChange.bind(this)}handleChange(){this.props.onChange(this.props.name,!this.props.checked)}render(){return this.props.onChange?!0===this.props.checked?t().createElement("i",{className:"material-icons blue clickable",onClick:this.handleChange},"check_box"):!1===this.props.checked?t().createElement("i",{className:"material-icons blue clickable",onClick:this.handleChange},"check_box_outline_blank"):t().createElement("i",{className:"material-icons lt-blue"},"indeterminate_check_box"):this.props.checked?t().createElement("i",{className:"material-icons"},"check_box"):t().createElement("i",{className:"material-icons"},"check_box_outline_blank")}}class ts extends t().PureComponent{render(){return t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancel()}},t().createElement("i",{className:"material-icons"},"close"))}}class as extends t().PureComponent{constructor(e){super(e),this.state={show:!1},this.hide=this.hide.bind(this)}componentDidUpdate(e){e.level!==this.props.level&&this.setState({show:!!this.props.level})}hide(){this.setState({show:!1}),this.props.onClearError&&this.props.onClearError()}render(){const e={err:"error",warn:"warning",info:"info"}[this.props.level]||"",a="info-box "+e;return t().createElement("div",{className:a},t().createElement("div",{className:"icon"},t().createElement("i",{className:"material-icons"},e)),t().createElement("span",null,this.props.text,this.props.action?t().createElement(t().Fragment,null,t().createElement("a",{href:"#",style:{whiteSpace:"nowrap"},onClick:e=>{e.preventDefault(),this.props.action()}},this.props.actionText)):null),t().createElement("div",{className:"cancel"},t().createElement(ts,{onCancel:this.hide})))}}class ss extends t().PureComponent{constructor(e){super(e),this.handleCancel=this.handleCancel.bind(this)}handleCancel(e){e.preventDefault(),this.props.onCancel(this.props.topic,this.props.index)}render(){const e=this.props.title||this.props.topic,a=this.props.invalid?"chip invalid":"chip";return t().createElement("div",{className:a},this.props.noAvatar?t().createElement("span",{className:"spacer"}):t().createElement("div",{className:"avatar-box"},t().createElement(ha,{tinode:this.props.tinode,avatar:this.props.avatar||!0,topic:this.props.topic,title:this.props.title})),t().createElement("span",null,e),this.props.onCancel&&!this.props.required?t().createElement("a",{href:"#",onClick:this.handleCancel},"×"):t().createElement("span",{className:"spacer"}))}}class is extends t().Component{constructor(e){super(e),this.state=is.deriveStateFromProps(e),this.state.input="",this.state.focused=!1,this.handleTextInput=this.handleTextInput.bind(this),this.removeChipAt=this.removeChipAt.bind(this),this.handleChipCancel=this.handleChipCancel.bind(this),this.handleFocusGained=this.handleFocusGained.bind(this),this.handleFocusLost=this.handleFocusLost.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}static deriveStateFromProps(e){return{placeholder:e.chips?"":e.prompt,sortedChips:is.sortChips(e.chips,e.staticMembers),chipIndex:is.indexChips(e.chips)}}componentDidUpdate(e,t){e.chips==this.props.chips&&e.staticMembers==this.props.staticMembers&&e.prompt==this.props.prompt||this.setState(is.deriveStateFromProps(this.props)),(!t||this.props.chips.length>t.sortedChips.length)&&this.setState({input:""})}static indexChips(e){const t={};let a=0;return e.map((e=>{t[e.user]=a,a++})),t}static sortChips(e,t){const a=[],s=[];return e.map((e=>{t&&t.includes(e.user)?a.push(e):s.push(e)})),a.concat(s)}handleTextInput(e){this.setState({input:e.target.value}),this.props.filterFunc&&this.props.filterFunc(e.target.value)}removeChipAt(e){const t=this.state.sortedChips[e];this.props.onChipRemoved(t.user,this.state.chipIndex[t.user])}handleChipCancel(e,t){this.removeChipAt(t)}handleFocusGained(){this.setState({focused:!0})}handleFocusLost(){this.setState({focused:!1}),this.props.onFocusLost&&this.props.onFocusLost(this.state.input)}handleKeyDown(e){if("Backspace"===e.key){if(0==this.state.input.length&&this.state.sortedChips.length>0){const e=this.state.sortedChips.length-1;this.state.sortedChips[e].user!==this.props.staticMembers&&this.removeChipAt(e)}}else"Enter"===e.key?this.props.onEnter&&this.props.onEnter(this.state.input):"Escape"===e.key&&this.props.onCancel&&this.props.onCancel()}render(){const e=[];let a=0;const s=this.props.staticMembers||[];this.state.sortedChips.map((i=>{e.push(t().createElement(ss,{tinode:this.props.tinode,onCancel:this.handleChipCancel,avatar:ga(i.public?i.public.photo:null),title:i.public?i.public.fn:void 0,noAvatar:this.props.avatarDisabled,topic:i.user,required:s.includes(i.user),invalid:i.invalid,index:a,key:i.user})),a++}));const i="chip-input"+(this.state.focused?" focused":""),n=!(this.props.tabIndex>0);return t().createElement("div",{className:i},e,t().createElement("input",{type:"text",placeholder:this.state.placeholder,onChange:this.handleTextInput,onFocus:this.handleFocusGained,onBlur:this.handleFocusLost,onKeyDown:this.handleKeyDown,value:this.state.input,tabIndex:this.props.tabIndex,autoFocus:n}))}}const ns=(0,n.defineMessages)({no_contacts:{id:"no_contacts",defaultMessage:[{type:0,value:"You have no contacts :-("}]},contacts_not_found_short:{id:"contacts_not_found_short",defaultMessage:[{type:0,value:"No contacts match '"},{type:1,value:"query"},{type:0,value:"'"}]}});class os extends t().Component{constructor(e){super(e),this.state={members:e.members,index:os.indexMembers(e.members),staticMembers:os.staticMembers(e.members,e.keepInitialMembers,e.requiredMember),contactFilter:"",noContactsMessage:e.intl.formatMessage(ns.no_contacts),selectedContacts:os.selectedContacts(e.members)},this.handleContactSelected=this.handleContactSelected.bind(this),this.handleMemberRemoved=this.handleMemberRemoved.bind(this),this.handleContactFilter=this.handleContactFilter.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static indexMembers(e){let t={};return e.map((e=>{t[e.user]={delta:0,present:!0}})),t}static staticMembers(e,t,a){let s=[];return e.map((e=>{(t||e.user==a)&&s.push(e.user)})),s}static selectedContacts(e){let t=[];return e.map((e=>{t.push(e.user)})),t}handleContactSelected(e,t){let a=this.state.index[e];if(a){if(a.present)return;a.delta+=1,a.present=!0}else a={delta:1,present:!0};let s=this.state.members.slice();s.push(this.props.contacts[t]);const i=os.selectedContacts(s),n=this.state.index;n[e]=a,this.setState({members:s,index:n,selectedContacts:i})}handleMemberRemoved(e,t){const a=this.state.index[e];if(!a||!a.present)return;a.present=!1,a.delta-=1;let s=this.state.members.slice();s.splice(t,1);const i=os.selectedContacts(s),n=this.state.index;n[e]=a,this.setState({members:s,index:n,selectedContacts:i})}handleContactFilter(e){const{formatMessage:t}=this.props.intl,a=e?t(ns.contacts_not_found_short,{query:e}):t(ns.no_contacts);this.setState({contactFilter:e,noContactsMessage:a})}static doContactFiltering(e,t){if(e){for(let a=0;a=0)return!0;return!1}return!0}handleSubmit(){var e=this,t=[],a=[],s=[];Object.keys(this.state.index).map((function(i){e.state.index[i].present&&t.push(i),e.state.index[i].delta>0?a.push(i):e.state.index[i].delta<0&&s.push(i)})),this.props.onSubmit(t,a,s)}handleCancel(){this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl;return t().createElement("div",{id:"group-manager"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"title_group_members",defaultMessage:[{type:0,value:"Group Members"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement(is,{tinode:this.props.tinode,chips:this.state.members,staticMembers:this.state.staticMembers,prompt:"add members",filterFunc:this.handleContactFilter,onChipRemoved:this.handleMemberRemoved})),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"title_all_contacts",defaultMessage:[{type:0,value:"All Contacts"}]}))),t().createElement(Ha,{tinode:this.props.tinode,contacts:this.props.contacts,myUserId:this.props.myUserId,topicSelected:this.state.selectedContacts,filter:this.state.contactFilter,filterFunc:os.doContactFiltering,emptyListMessage:this.state.noContactsMessage,showOnline:!1,showUnread:!1,onTopicSelected:this.handleContactSelected}),t().createElement("div",{id:"group-manager-buttons",className:"panel-form-row"},t().createElement("button",{className:"secondary",onClick:this.handleCancel},t().createElement(n.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(n.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))))}}const rs=(0,n.injectIntl)(os),ls=(0,n.defineMessages)({joiner:{id:"permission_join",defaultMessage:[{type:0,value:"Join ("},{type:1,value:"val"},{type:0,value:")"}]},reader:{id:"permission_read",defaultMessage:[{type:0,value:"Read ("},{type:1,value:"val"},{type:0,value:")"}]},writer:{id:"permission_write",defaultMessage:[{type:0,value:"Write ("},{type:1,value:"val"},{type:0,value:")"}]},preser:{id:"permission_pres",defaultMessage:[{type:0,value:"Get notified ("},{type:1,value:"val"},{type:0,value:")"}]},approver:{id:"permission_admin",defaultMessage:[{type:0,value:"Approve ("},{type:1,value:"val"},{type:0,value:")"}]},sharer:{id:"permission_share",defaultMessage:[{type:0,value:"Share ("},{type:1,value:"val"},{type:0,value:")"}]},deleter:{id:"permission_delete",defaultMessage:[{type:0,value:"Delete ("},{type:1,value:"val"},{type:0,value:")"}]},owner:{id:"permission_owner",defaultMessage:[{type:0,value:"Owner ("},{type:1,value:"val"},{type:0,value:")"}]}});class cs extends t().Component{constructor(e){super(e),this.state={mode:(e.mode||"").replace("N","")},this.handleChange=this.handleChange.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}handleChange(e){let t=this.state.mode;-1==t.indexOf(e)?t+=e:t=t.replace(e,""),this.setState({mode:t})}handleSubmit(){const e=(this.state.mode||"N").split("").sort().join("");e!==(this.props.mode||"N").split("").sort().join("")?this.props.onSubmit(e):this.props.onCancel()}handleCancel(){this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl,a="JRWPASDO",s={J:e(ls.joiner,{val:"J"}),R:e(ls.reader,{val:"R"}),W:e(ls.writer,{val:"W"}),P:e(ls.preser,{val:"P"}),A:e(ls.approver,{val:"A"}),S:e(ls.sharer,{val:"S"}),D:e(ls.deleter,{val:"D"}),O:e(ls.owner,{val:"O"})};let i=this.props.skip||"",o=this.state.mode,r=(this.props.compare||"").replace("N",""),l=[];for(let e=0;e=0&&o.indexOf(n)<0||l.push(t().createElement("tr",{key:n},t().createElement("td",null,s[n]),t().createElement("td",{className:"checkbox"},i.indexOf(n)<0?t().createElement(es,{name:n,checked:o.indexOf(n)>=0,onChange:this.handleChange}):t().createElement(es,{name:n,checked:o.indexOf(n)>=0})),this.props.compare?t().createElement("td",{className:"checkbox"},t().createElement(es,{name:n,checked:r.indexOf(n)>=0})):null))}return t().createElement("div",{className:"panel-form-column"},this.props.userTitle?t().createElement("ul",{className:"contact-box small"},t().createElement(La,{tinode:this.props.tinode,item:this.props.item,title:this.props.userTitle,small:!0,avatar:ga(this.props.userAvatar?this.props.userAvatar:null)})):null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"title_permissions",defaultMessage:[{type:0,value:"Permissions"}]})),t().createElement("table",{className:"permission-editor"},this.props.compare?t().createElement("thead",null,t().createElement("tr",null,t().createElement("th",null),t().createElement("th",null,this.props.modeTitle),t().createElement("th",null,this.props.compareTitle))):null,t().createElement("tbody",null,l)),t().createElement("br",null),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:"outline",onClick:this.handleCancel},t().createElement(n.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(n.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))))}}const ds=(0,n.injectIntl)(cs);class hs extends t().Component{constructor(e){super(e),this.state={panX:0,panY:0,originX:0,originY:0,zoom:1,minZoom:0,maxZoom:2.5},this.overlay=t().createRef(),this.cutout=t().createRef(),this.preview=t().createRef(),this.boundingBox=t().createRef(),this.imageWidth=0,this.imageHeight=0,this.mouseX=0,this.mouseY=0,this.prevDistance=0,this.cutoutRect={},this.bBoxRect={},this.originX=0,this.originY=0,this.initScaling=this.initScaling.bind(this),this.onZoom=this.onZoom.bind(this),this.handleZoom=this.handleZoom.bind(this),this.mouseDown=this.mouseDown.bind(this),this.mouseUp=this.mouseUp.bind(this),this.mouseMove=this.mouseMove.bind(this),this.mouseTouch=this.mouseTouch.bind(this),this.positionAll=this.positionAll.bind(this),this.translate=this.translate.bind(this)}componentDidMount(){this.overlay.current.addEventListener("mousedown",this.mouseDown,{passive:!0}),this.overlay.current.addEventListener("touchstart",this.mouseDown,{passive:!0}),this.bBoxRect=this.boundingBox.current.getBoundingClientRect(),this.originX=this.bBoxRect.width/2,this.originY=this.bBoxRect.height/2,this.cutoutRect=this.cutout.current.getBoundingClientRect()}componentWillUnmount(){this.overlay.current.removeEventListener("mousedown",this.mouseDown),this.overlay.current.removeEventListener("touchstart",this.mouseDown)}positionAll(e,t,a){this.setState({panX:e,panY:t,zoom:a,originX:this.originX-e,originY:this.originY-t});const s=(this.originX-e)*a-this.originX,i=(this.originY-t)*a-this.originY;this.props.onChange((s+this.cutoutRect.left-this.bBoxRect.left)/a,(i+this.cutoutRect.top-this.bBoxRect.top)/a,this.cutoutRect.width/a,this.cutoutRect.height/a,a)}static checkBound(e,t,a,s){let i=Math.min(0,a[0]-t[0]-s,t[1]-a[1]+s);return(0==i||Math.min(0,a[0]-t[0],t[1]-a[1])i&&(t+=o-i);const r=this.originY-(this.originY-a)*e,l=r+this.imageHeight*e,c=this.cutoutRect.top-this.bBoxRect.top,d=c+this.cutoutRect.height;cl&&(a+=d-l),this.positionAll(t,a,e)}mouseDown(e){e.touches?(this.mouseX=e.touches[0].pageX,this.mouseY=e.touches[0].pageY):(this.mouseX=e.pageX,this.mouseY=e.pageY),window.addEventListener("mousemove",this.mouseMove,{passive:!1}),window.addEventListener("touchmove",this.mouseTouch,{passive:!1}),window.addEventListener("mouseup",this.mouseUp,{passive:!0}),window.addEventListener("touchend",this.mouseUp,{passive:!0}),document.body.style.userSelect="none"}translate(e,t){const a=e-this.mouseX,s=t-this.mouseY;this.mouseX=e,this.mouseY=t;const i=this.preview.current.getBoundingClientRect();let n=hs.checkBound(this.state.panX,[i.left,i.right],[this.cutoutRect.left,this.cutoutRect.right],a),o=hs.checkBound(this.state.panY,[i.top,i.bottom],[this.cutoutRect.top,this.cutoutRect.bottom],s);this.positionAll(n,o,this.state.zoom)}mouseMove(e){e.preventDefault(),this.translate(e.pageX,e.pageY)}mouseTouch(e){if(e.preventDefault(),1==e.touches.length)return void this.translate(e.touches[0].pageX,e.touches[0].pageY);const[t,a]=e.touches,s=Math.sqrt((t.pageX-a.pageX)*(t.pageX-a.pageX)+(t.pageY-a.pageY)*(t.pageY-a.pageY));this.prevDistance||(this.prevDistance=s/this.state.zoom);let i=s/this.prevDistance;this.handleZoom(Math.max(this.minZoom,Math.min(this.maxZoom,i)))}mouseUp(e){window.removeEventListener("mousemove",this.mouseMove),window.removeEventListener("touchmove",this.mouseTouch),window.removeEventListener("mouseup",this.mouseUp),window.removeEventListener("touchend",this.mouseUp),document.body.style.userSelect="",this.positionAll(this.state.panX,this.state.panY,this.state.zoom)}render(){const e="translate3d(".concat(this.state.panX,"px, ").concat(this.state.panY,"px, 0) scale(").concat(this.state.zoom,")"),a="".concat(this.state.originX,"px ").concat(this.state.originY,"px"),s={top:"".concat(this.originY-this.state.originY*this.state.zoom,"px"),left:"".concat(this.originX-this.state.originX*this.state.zoom,"px"),width:"".concat(this.imageWidth*this.state.zoom,"px"),height:"".concat(this.imageHeight*this.state.zoom,"px")};return t().createElement("div",{className:"cropper"},t().createElement("div",{className:"bounding-box",ref:this.boundingBox},t().createElement("img",{src:this.props.source,className:"preview",alt:"",style:{transform:e,transformOrigin:a},ref:this.preview,onLoad:this.initScaling}),t().createElement("div",{className:"cutout circle",ref:this.cutout}),t().createElement("div",{className:"overlay",style:s,ref:this.overlay})),t().createElement("div",{className:"zoom-wrapper"},t().createElement("input",{type:"range",className:"zoomer",step:"0.001",min:this.state.minZoom,max:this.state.maxZoom,value:this.state.zoom,onChange:this.onZoom})))}}class ps extends t().PureComponent{constructor(e){super(e),this.state={top:0,left:0,width:0,height:0,scale:1},this.handleSubmit=this.handleSubmit.bind(this),this.handleChange=this.handleChange.bind(this)}handleChange(e,t,a,s,i){this.setState({left:e,top:t,width:a,height:s,scale:i})}handleSubmit(){var e,t,a,s,i,n,o;(e=this.props.mime,t=this.props.avatar,a=this.state.left,s=this.state.top,i=this.state.width,n=this.state.height,o=this.state.scale,new Promise(((r,l)=>{const c=new Image;c.crossOrigin="Anonymous",c.onerror=e=>{l(new Error("Image format unrecognized"))},c.onload=()=>{URL.revokeObjectURL(c.src);let t=document.createElement("canvas");t.width=i*o,t.height=n*o;let d=t.getContext("2d");d.imageSmoothingEnabled=!0,d.drawImage(c,a,s,i,n,0,0,t.width,t.height),e=ma.includes(e)?e:"image/jpeg",t.toBlob((a=>{t=null,a?r({mime:e,blob:a,width:i,height:n}):l(new Error("Unsupported image format"))}),e)},c.src=t}))).then((e=>{this.props.onSubmit(e.mime,e.blob,e.width,e.height)})).catch((e=>{this.props.onError(e)}))}render(){return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement(hs,{source:this.props.avatar,onChange:this.handleChange})),t().createElement("div",{className:"dialog-buttons"},this.props.onCancel?t().createElement("button",{className:"secondary",onClick:this.props.onCancel},t().createElement(n.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})):null,t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(n.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))))}}class ms extends t().PureComponent{constructor(e){super(e),this.state={value:this.props.value,visible:!1},this.handleVisibility=this.handleVisibility.bind(this),this.handeTextChange=this.handeTextChange.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this)}handeTextChange(e){this.setState({value:e.target.value}),this.props.onChange&&this.props.onChange(e)}handleVisibility(e){e.preventDefault(),this.setState({visible:!this.state.visible})}handleKeyDown(e){27==e.keyCode?(this.setState({value:this.props.value,visible:!1}),this.props.onFinished&&this.props.onFinished()):13==e.keyCode&&this.handleEditingFinished()}handleEditingFinished(e){if(e){let t=e.currentTarget;setTimeout((()=>{t.contains(document.activeElement)||this.props.onFinished&&this.props.onFinished(this.state.value)}),0)}else this.props.onFinished&&this.props.onFinished(this.state.value.trim())}render(){return t().createElement("div",{tabIndex:"-1",className:"group-focus",onBlur:this.handleEditingFinished},t().createElement("input",{className:"with-visibility",type:this.state.visible?"text":"password",value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoFocus:this.props.autoFocus?"autoFocus":"",autoComplete:this.props.autoComplete,onChange:this.handeTextChange,onKeyDown:this.handleKeyDown}),t().createElement("span",{onClick:this.handleVisibility},t().createElement("i",{className:"material-icons clickable light-gray"},this.state.visible?"visibility":"visibility_off")))}}class us extends t().Component{constructor(e){super(e),this.selfRef=t().createRef(),this.state={active:e.active,initialValue:e.value||"",value:e.value||""},this.handeTextChange=this.handeTextChange.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleStartEditing=this.handleStartEditing.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this),this.handlePasswordFinished=this.handlePasswordFinished.bind(this)}componentDidUpdate(e,t){const a=this.props.value||"";t.initialValue==a||t.active||this.setState({initialValue:a,value:a})}handeTextChange(e){this.setState({value:e.target.value||""})}handleKeyDown(e){27===e.keyCode?this.setState({value:this.props.value,active:!1}):13===e.keyCode&&this.handleEditingFinished(e)}handleStartEditing(){this.props.readOnly||this.setState({active:!0},(()=>{this.selfRef.current&&this.selfRef.current.focus()}))}handleEditingFinished(e){const t=this.state.value.trim();!this.props.required||e.target.checkValidity()&&t?(this.setState({active:!1}),(t||this.props.value)&&t!==this.props.value&&this.props.onFinished(t)):this.setState({value:this.props.value,active:!1})}handlePasswordFinished(e){this.setState({active:!1}),e&&e!==this.props.value&&this.props.onFinished(e)}render(){if(!this.state.active){let e="password"==this.props.type?"••••••••":this.state.value,a="in-place-edit"+(this.props.readOnly?" disabled":"");return e||(e=this.props.placeholder,a+=" placeholder"),this.props.multiline&&1!=this.props.multiline||(a+=" short"),t().createElement("span",{className:a,onClick:this.handleStartEditing},t().createElement("span",null,e))}let e;const a={};return"password"==this.props.type?(e=ms,a.onFinished=this.handlePasswordFinished):(this.props.multiline>1?(e="textarea",a.rows=this.props.multiline,a.className="inplace-edit"):(e="input",a.type=this.props.type||"text"),a.value=this.state.value,a.onChange=this.handeTextChange,a.onKeyDown=this.handleKeyDown,a.onBlur=this.handleEditingFinished),a.placeholder=this.props.placeholder,a.required=this.props.required?"required":"",a.autoComplete=this.props.autoComplete,a.autoFocus=!0,a.ref=this.selfRef,t().createElement(e,a,null)}}class gs extends t().Component{constructor(e){super(e),this.state={tags:this.props.tags||[],tagInput:"",activated:this.props.activated},this.handleTagInput=this.handleTagInput.bind(this),this.handleAddTag=this.handleAddTag.bind(this),this.handleRemoveTag=this.handleRemoveTag.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static getDerivedStateFromProps(e,t){const a=e.tags||[];return na(a,t.tags)||t.activated?null:{tags:a}}handleTagInput(e){if(this.setState({tagInput:e}),e.length>0){const t=e[e.length-1];'"'==e[0]?e.length>1&&'"'==t&&this.handleAddTag(e.substring(1,e.length-1)):","!=t&&" "!=t&&";"!=t&&'"'!=t||this.handleAddTag(e.substring(0,e.length-1).trim())}}handleAddTag(e){const t=this.props.tinode.getServerParam("maxTagCount",16);if(e.length>0&&this.state.tags.length{s.push({user:t,invalid:t.lengtha})})):(this.state.tags.map((e=>{s.push(t().createElement("span",{className:"badge",key:s.length},e))})),0==s.length&&(s=t().createElement("i",null,t().createElement(n.FormattedMessage,{id:"tags_not_found",defaultMessage:[{type:0,value:"No tags defined. Add some."}]})))),t().createElement("div",{className:"panel-form-column"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},this.props.title)),this.state.activated?t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"tags_editor_no_tags",defaultMessage:[{type:0,value:"Add some tags"}]},(e=>t().createElement(is,{tinode:this.props.tinode,chips:s,avatarDisabled:!0,prompt:e,tabIndex:this.props.tabIndex,onEnter:this.handleAddTag,onFocusLost:this.handleAddTag,onCancel:this.handleCancel,onChipRemoved:this.handleRemoveTag,filterFunc:this.handleTagInput}))),this.props.onSubmit||this.props.onCancel?t().createElement("div",{id:"tag-manager-buttons",className:"dialog-buttons panel-form-row"},t().createElement("button",{className:"outline",onClick:this.handleCancel},t().createElement(n.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(n.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))):null):t().createElement("div",{className:"quoted"},t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.setState({activated:!0})}},t().createElement("i",{className:"material-icons"},"edit"),"  ",t().createElement(n.FormattedMessage,{id:"title_manage_tags",defaultMessage:[{type:0,value:"Manage"}]})),t().createElement(t().Fragment,null,s)))}}class _s extends t().Component{constructor(e){super(e);const t=this.props.tinode.getTopic(this.props.topic),a=t.getAccessMode();this.state={isMe:Ut.Tinode.isMeTopicName(this.props.topic),owner:a&&a.isOwner(),fullName:t.public?t.public.fn:void 0,private:t.private?t.private.comment:null,description:t.public?t.public.note:void 0,avatar:ga(t.public?t.public.photo:null),tags:t.tags()||[],newAvatar:null,newAvatarMime:null},this.previousOnTags=null,this.tnNewTags=this.tnNewTags.bind(this),this.handleFullNameUpdate=this.handleFullNameUpdate.bind(this),this.handleImageUpdated=this.handleImageUpdated.bind(this),this.handleAvatarCropped=this.handleAvatarCropped.bind(this),this.handlePrivateUpdate=this.handlePrivateUpdate.bind(this),this.handleDescriptionUpdate=this.handleDescriptionUpdate.bind(this),this.uploadAvatar=this.uploadAvatar.bind(this),this.handleAvatarCropCancel=this.handleAvatarCropCancel.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this)}componentDidMount(){const e=this.props.tinode.getTopic(this.props.topic);this.previousOnTags=e.onTagsUpdated,e.onTagsUpdated=this.tnNewTags}componentWillUnmount(){this.props.tinode.getTopic(this.props.topic).onTagsUpdated=this.previousOnTags}tnNewTags(e){this.setState({tags:e})}handleFullNameUpdate(e){(e=e.trim().substring(0,Kt))&&this.state.fullName!==e&&(this.setState({fullName:e}),this.props.onUpdateTopicDesc(this.props.topic,ia(e,null)))}handlePrivateUpdate(e){e=e.trim().substring(0,Kt),this.state.private!==e&&(this.setState({private:e}),this.props.onUpdateTopicDesc(this.props.topic,null,e||Ut.Tinode.DEL_CHAR))}handleDescriptionUpdate(e){(e=e.trim().substring(0,Gt))&&(this.setState({description:e}),this.props.onUpdateTopicDesc(this.props.topic,ia(null,null,null,e)))}handleImageUpdated(e,t){this.setState({newAvatar:t,newAvatarMime:e}),t||(this.setState({avatar:null}),this.props.onUpdateTopicDesc(this.props.topic,ia(null,Ut.Tinode.DEL_CHAR)))}handleAvatarCropped(e,t,a,s){const i=t?URL.createObjectURL(t):null;this.setState({avatar:i,newAvatar:null,newAvatarMime:null}),t&&this.uploadAvatar(e,t,a,s)}uploadAvatar(e,t,a,s){const i=e=>{let{mime:t,blob:a}=e;if(a.size>4096){const e=this.props.tinode.getLargeFileHelper();this.setState({uploading:!0}),e.upload(a).then((e=>{this.props.onUpdateTopicDesc(this.props.topic,ia(null,e))})).catch((e=>{this.props.onError(e,"err")})).finally((()=>{this.setState({uploading:!1})}))}else this.setState({uploading:!0}),va(a).then((e=>{const a=ga({data:e.bits,type:t});this.setState({source:a}),this.props.onUpdateTopicDesc(this.props.topic,ia(null,a)),this.setState({uploading:!1})}))};a>zt||s>zt||a!=s?ba(t,zt,zt,Vt,!0).then((e=>i(e))).catch((e=>this.props.onError(e,"err"))):i({mime:e,blob:t,width:a,height:s})}handleAvatarCropCancel(e){this.setState({newAvatar:null,newAvatarMime:null})}handleTagsUpdated(e){na(this.state.tags.slice(0),e.slice(0))||this.props.onUpdateTags(e)}render(){if(this.state.newAvatar)return t().createElement(ps,{avatar:this.state.newAvatar,mime:this.state.newAvatarMime,onSubmit:this.handleAvatarCropped,onCancel:this.handleAvatarCropCancel,onError:this.props.onError});const e=this.state.isMe||this.state.owner;return t().createElement(t().Fragment,null,t().createElement("div",{className:"panel-form-column"},t().createElement("center",null,t().createElement(Za,{tinode:this.props.tinode,avatar:this.state.avatar,readOnly:!e,uid:this.props.topic,title:this.state.fullName,onImageUpdated:this.handleImageUpdated,onError:this.props.onError})),this.state.isMe?t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_your_name",defaultMessage:[{type:0,value:"Your name"}]})),t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"full_name_prompt",defaultMessage:[{type:0,value:"Full name, e.g. John Doe"}]},(e=>t().createElement(us,{placeholder:e,value:this.state.fullName,required:!0,onFinished:this.handleFullNameUpdate}))))):t().createElement(t().Fragment,null,t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_topic_name",defaultMessage:[{type:0,value:"Name"}]}))),t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"topic_name_editing_placeholder",defaultMessage:[{type:0,value:"Freeform name of the group"}]},(a=>t().createElement(us,{placeholder:a,readOnly:!e,value:this.state.fullName,required:!0,onFinished:this.handleFullNameUpdate}))))),t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_private",defaultMessage:[{type:0,value:"Private comment"}]}))),t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"private_editing_placeholder",defaultMessage:[{type:0,value:"Visible to you only"}]},(e=>t().createElement(us,{placeholder:e,value:this.state.private,onFinished:this.handlePrivateUpdate})))))),e||this.state.description?t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]}))),t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"description_editing_placeholder",defaultMessage:[{type:0,value:"Description (optional)"}]},(a=>t().createElement(us,{placeholder:a,readOnly:!e,value:this.state.description,multiline:2,onFinished:this.handleDescriptionUpdate}))))):null),e?t().createElement(t().Fragment,null,t().createElement("div",{className:"hr"}),t().createElement(n.FormattedMessage,{id:"title_tag_manager",defaultMessage:[{type:0,value:"Tags (search & discovery)"}]},(e=>t().createElement(gs,{tinode:this.props.tinode,title:e,activated:!1,tags:this.state.tags,onSubmit:this.handleTagsUpdated})))):null)}}class fs extends t().Component{constructor(e){super(e);const t=this.props.tinode.getTopic(this.props.topic),a=t.getAccessMode();this.state={isMe:"me"==this.props.topic,owner:a&&a.isOwner(),credentials:(t.getCredentials?t.getCredentials():null)||[],addCredActive:!1,addCredInvalid:!1,newCred:"",tags:[]},this.previousTagsUpdated=void 0,this.onTagsUpdated=this.onTagsUpdated.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this),this.tnCredsUpdated=this.tnCredsUpdated.bind(this),this.handleCredChange=this.handleCredChange.bind(this),this.handleCredKeyDown=this.handleCredKeyDown.bind(this),this.handleCredEntered=this.handleCredEntered.bind(this)}componentDidUpdate(e){const t=this.props.tinode.getTopic(e.topic);t&&(t.onCredsUpdated=this.tnCredsUpdated,t.onTagsUpdated!=this.onTagsUpdated&&("grp"==t.getType()?(this.previousTagsUpdated=t.onTagsUpdated,t.onTagsUpdated=this.onTagsUpdated):this.previousTagsUpdated=void 0),this.state.topic!=e.topic&&this.setState({topic:e.topic}))}componentWillUnmount(){const e=this.props.tinode.getTopic(this.props.topic);e.onCredsUpdated=void 0,e.onTagsUpdated=this.previousTagsUpdated}tnCredsUpdated(e){this.setState({credentials:e||[]})}handleCredChange(e){this.setState({newCred:e.target.value,addCredInvalid:!1})}handleCredKeyDown(e){27===e.keyCode?this.setState({newCred:"",addCredActive:!1}):13===e.keyCode&&this.handleCredEntered(e)}handleCredEntered(e){const t=this.state.newCred.trim();if(!t)return void this.setState({addCredActive:!1,addCredInvalid:!1});let a,s=function(e){return e=e.trim(),/^(?:\+?(\d{1,3}))?[- (.]*(\d{3})[- ).]*(\d{3})[- .]*(\d{2})[- .]*(\d{2})?$/.test(e)?e.replace(/[- ().]*/,""):null}(t);s?a="tel":(s=function(e){return e=e.trim(),/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/.test(e)?e:null}(t),s&&(a="email")),a?(this.props.onCredAdd(a,s),this.setState({addCredActive:!1,newCred:""})):this.setState({addCredInvalid:!0})}onTagsUpdated(e){this.setState({tags:e}),this.previousTagsUpdated&&this.previousTagsUpdated!=this.onTagsUpdated&&this.previousTagsUpdated(e)}handleTagsUpdated(e){na(this.state.tags.slice(0),e.slice(0))||this.props.onTopicTagsUpdateRequest(this.props.topic,e)}render(){const e=[];return this.state.isMe&&this.state.credentials.map((a=>{e.push(t().createElement("div",{key:a.meth+":"+a.val+":"+a.done},a.meth,": ",t().createElement("tt",null,a.val),t().createElement("span",null," ",a.done?null:t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCredConfirm(a.meth,a.val)}},t().createElement(n.FormattedMessage,{id:"validate_credential_action",defaultMessage:[{type:0,value:"confirm"}]}))," ",t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCredDelete(a.meth,a.val)}},t().createElement("i",{className:"material-icons gray"},"delete_outline")))))})),t().createElement("div",{className:"scrollable-panel"},t().createElement(_s,{tinode:this.props.tinode,topic:this.props.topic,onUpdateTopicDesc:this.props.onUpdateTopicDesc,onUpdateTags:this.handleTagsUpdated,onError:this.props.onError}),this.state.isMe?t().createElement(t().Fragment,null,t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_user_contacts",defaultMessage:[{type:0,value:"Contacts:"}]})),t().createElement("div",{className:"quoted"},e,this.state.addCredActive?t().createElement("input",{type:"text",value:this.state.value,className:this.state.addCredInvalid?"invalid":null,placeholder:"Phone number or email",required:"required",autoFocus:!0,onChange:this.handleCredChange,onKeyDown:this.handleCredKeyDown,onBlur:this.handleCredEntered}):null,t().createElement("div",null,t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.setState({addCredActive:!0})}},t().createElement("i",{className:"material-icons"},"add"),t().createElement(n.FormattedMessage,{id:"button_add_another",defaultMessage:[{type:0,value:"Add another"}]})))))):null)}}const bs=(0,n.defineMessages)({clear_messages:{id:"action_clear_messages",defaultMessage:[{type:0,value:"Clear Messages"}]},clear_messages_warning:{id:"clear_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to clear all messages? It cannot be undone."}]},delete_messages:{id:"action_delete_messages",defaultMessage:[{type:0,value:"Clear Messages for All"}]},delete_messages_warning:{id:"delete_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete all messages for everyone? It cannot be undone."}]},topic_delete:{id:"topic_delete",defaultMessage:[{type:0,value:"Delete Conversation"}]},topic_delete_warning:{id:"topic_delete_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete this conversation? It cannot be undone."}]},leave_chat:{id:"action_leave_chat",defaultMessage:[{type:0,value:"Leave Conversation"}]},leave_chat_warning:{id:"leave_chat_warning",defaultMessage:[{type:0,value:"Are you sure you want to leave this conversation?"}]},block_contact:{id:"action_block_contact",defaultMessage:[{type:0,value:"Block Contact"}]},block_contact_warning:{id:"block_contact_warning",defaultMessage:[{type:0,value:"Are you sure you want to block this contact?"}]},report_chat:{id:"action_report_chat",defaultMessage:[{type:0,value:"Report Conversation"}]},report_chat_warning:{id:"report_chat_warning",defaultMessage:[{type:0,value:"Are you sure you want to block and report this conversation?"}]},other_user:{id:"label_other_user",defaultMessage:[{type:0,value:"Other"}]}});class vs extends t().PureComponent{constructor(e){super(e),this.handleDeleteTopic=this.handleDeleteTopic.bind(this),this.handleDeleteMessages=this.handleDeleteMessages.bind(this),this.handleLeave=this.handleLeave.bind(this),this.handleBlock=this.handleBlock.bind(this),this.handleReport=this.handleReport.bind(this)}handleDeleteTopic(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(bs.topic_delete),t(bs.topic_delete_warning),(()=>{this.props.onDeleteTopic(this.props.topic)}),null,!0,null)}handleDeleteMessages(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(this.props.deleter?bs.delete_messages:bs.clear_messages),t(this.props.deleter?bs.delete_messages_warning:bs.clear_messages_warning),(()=>{this.props.onDeleteMessages(this.props.topic)}),null,!0,null)}handleLeave(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(bs.leave_chat),t(bs.leave_chat_warning),(()=>{this.props.onLeaveTopic(this.props.topic)}),null,!0,null)}handleBlock(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(bs.block_contact),t(bs.block_contact_warning),(()=>{this.props.onBlockTopic(this.props.topic)}),null,!0,null)}handleReport(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(bs.report_chat),t(bs.report_chat_warning),(e=>{this.props.onReportTopic(this.props.topic)}),null,!0,null)}render(){const{formatMessage:e}=this.props.intl;return t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},this.props.channel?null:t().createElement("a",{href:"#",className:"flat-button",onClick:this.handleDeleteMessages},t().createElement("i",{className:"material-icons"},"delete_outline"),"  ",e(this.props.deleter?bs.delete_messages:bs.clear_messages)),this.props.owner?t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleDeleteTopic},t().createElement("i",{className:"material-icons"},"delete"),"  ",e(bs.topic_delete)):t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleLeave},t().createElement("i",{className:"material-icons"},"exit_to_app"),"  ",e(bs.leave_chat)),this.props.groupTopic?null:t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleBlock},t().createElement("i",{className:"material-icons"},"block"),"  ",e(bs.block_contact)),this.props.owner?null:t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleReport},t().createElement("i",{className:"material-icons"},"report"),"  ",e(bs.report_chat))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},this.props.groupTopic?t().createElement(t().Fragment,null,t().createElement("div",{className:"group"},t().createElement("label",null,t().createElement(n.FormattedMessage,{id:"label_your_permissions",defaultMessage:[{type:0,value:"Your permissions:"}]}))," ",t().createElement("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.props.onLaunchPermissionsEditor("want")}},this.props.access)),this.props.channel?null:t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_default_access_mode",defaultMessage:[{type:0,value:"Default access mode:"}]}))),t().createElement("div",{className:"quoted"},t().createElement("div",null,"Auth: ",t().createElement("tt",{className:this.props.owner?"clickable":null,onClick:e=>{e.preventDefault(),this.props.owner&&this.props.onLaunchPermissionsEditor("auth")}},this.props.auth)),t().createElement("div",null,"Anon: ",t().createElement("tt",{className:this.props.owner?"clickable":null,onClick:e=>{e.preventDefault(),this.props.owner&&this.props.onLaunchPermissionsEditor("anon")}},this.props.anon))))):t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_permissions",defaultMessage:[{type:0,value:"Permissions:"}]}))),t().createElement("div",{className:"quoted"},t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"label_you",defaultMessage:[{type:0,value:"You:"}]})," ",t().createElement("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.props.onLaunchPermissionsEditor("want")}},this.props.access)),t().createElement("div",null,this.props.fullName?this.props.fullName:e(bs.other_user),":  ",t().createElement("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.props.onLaunchPermissionsEditor("given")}},this.props.modeGiven2))))))}}const ys=(0,n.injectIntl)(vs),ws=(0,n.defineMessages)({info:{id:"panel_title_info",defaultMessage:[{type:0,value:"Info"}]},general:{id:"panel_title_general",defaultMessage:[{type:0,value:"General"}]},security:{id:"panel_title_security",defaultMessage:[{type:0,value:"Security"}]},members:{id:"panel_title_members",defaultMessage:[{type:0,value:"Members"}]},crop:{id:"panel_title_crop",defaultMessage:[{type:0,value:"Drag to Adjust"}]},perm_want:{id:"requested_permissions",defaultMessage:[{type:0,value:"Requested"}]},perm_given:{id:"granted_permissions",defaultMessage:[{type:0,value:"Granted"}]},perm_auth:{id:"permissions_authenticated",defaultMessage:[{type:0,value:"Authenticated"}]},perm_anon:{id:"permissions_anonymous",defaultMessage:[{type:0,value:"Anonymous"}]},perm_user:{id:"permissions_user",defaultMessage:[{type:0,value:"User's Permissions"}]},edit_permissions:{id:"menu_item_edit_permissions",defaultMessage:[{type:0,value:"Edit permissions"}]}});class Es extends t().Component{constructor(e){super(e),this.state={topic:null,owner:!1,admin:!1,sharer:!1,deleter:!1,muted:!1,address:null,groupTopic:void 0,channel:void 0,fullName:void 0,description:void 0,avatar:null,private:null,selectedContact:null,access:null,modeGiven:null,modeWant:null,modeGiven2:null,modeWant2:null,auth:null,anon:null,contactList:[],trustedBadges:[],previousMetaDesc:void 0,previousSubsUpdated:void 0},this.resetSubs=this.resetSubs.bind(this),this.resetDesc=this.resetDesc.bind(this),this.resetTags=this.resetTags.bind(this),this.onMetaDesc=this.onMetaDesc.bind(this),this.onSubsUpdated=this.onSubsUpdated.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleMuted=this.handleMuted.bind(this),this.handleUnarchive=this.handleUnarchive.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleShowAddMembers=this.handleShowAddMembers.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleMemberSelected=this.handleMemberSelected.bind(this),this.handleContextMenu=this.handleContextMenu.bind(this),this.handleBackNavigate=this.handleBackNavigate.bind(this)}componentDidUpdate(e){const t=this.props.tinode.getTopic(e.topic);t&&(this.onMetaDesc!=t.onMetaDesc&&(this.previousMetaDesc=t.onMetaDesc,t.onMetaDesc=this.onMetaDesc,this.previousSubsUpdated=t.onSubsUpdated,t.onSubsUpdated=this.onSubsUpdated),this.state.topic!=e.topic&&(this.setState({topic:e.topic}),this.resetDesc(t,e),this.resetSubs(t,e),this.resetTags(t)))}componentWillUnmount(){const e=this.props.tinode.getTopic(this.props.topic);e&&(this.setState({topic:null}),e.onMetaDesc=this.previousMetaDesc,e.onSubsUpdated=this.previousSubsUpdated)}resetSubs(e,t){const a={contactList:[]};if("p2p"==e.getType()){const s=e.subscriber(t.topic);s?(a.modeGiven2=s.acs.getGiven(),a.modeWant2=s.acs.getWant()):(a.modeGiven2="N",a.modeWant2="N")}else e.subscribers((e=>{a.contactList.push(e)}),this);this.setState(a)}resetDesc(e,t){const a=e.getDefaultAccess()||{},s=e.getAccessMode(),i=[];if(e.trusted)for(const[t,a]of Object.entries(e.trusted))a&&i.push(t);this.setState({owner:s&&s.isOwner(),admin:s&&s.isAdmin(),sharer:s&&s.isSharer(),deleter:s&&s.isDeleter(),muted:s&&s.isMuted(),fullName:da(e.public&&e.public.fn,Kt),description:da(e.public&&e.public.note,Gt),avatar:ga(e.public?e.public.photo:null),trustedBadges:i,private:da(e.private&&e.private.comment,Kt),archived:e.isArchived(),address:e.name,groupTopic:e.isGroupType(),channel:e.isChannelType()||e.chan,access:s?s.getMode():void 0,modeGiven:s?s.getGiven():void 0,modeWant:s?s.getWant():void 0,auth:a.auth,anon:a.anon})}resetTags(e){if("grp"!=e.getType())return;const t=e.getAccessMode();t&&t.isOwner()&&e.getMeta(e.startMetaQuery().withTags().build())}onMetaDesc(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetDesc(t,this.props),this.previousMetaDesc&&this.previousMetaDesc!=this.onMetaDesc&&this.previousMetaDesc(e))}onSubsUpdated(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetSubs(t,this.props),this.previousSubsUpdated&&this.previousSubsUpdated!=this.onSubsUpdated&&this.previousSubsUpdated(e))}handleImageChanged(e){this.setState({avatar:e}),this.props.onTopicDescUpdate(this.props.topic,ia(null,e||Ut.Tinode.DEL_CHAR),null)}handleMuted(e,t){this.setState({muted:t}),this.props.onChangePermissions(this.props.topic,t?"-P":"+P")}handleUnarchive(e,t){this.props.onTopicUnArchive(this.props.topic)}handlePermissionsChanged(e,t){switch(e){case"auth":this.props.onTopicDescUpdateRequest(this.props.topic,null,null,{auth:t});break;case"anon":this.props.onTopicDescUpdateRequest(this.props.topic,null,null,{anon:t});break;case"mode":case"want":this.props.onChangePermissions(this.props.topic,t);break;case"given":this.props.onChangePermissions(this.props.topic,t,this.props.topic);break;case"user":this.props.onChangePermissions(this.props.topic,t,this.state.userPermissionsEdited)}this.handleBackNavigate()}handleLaunchPermissionsEditor(e,t){const{formatMessage:a}=this.props.intl;let s,i,n,o,r,l,c;switch(e){case"mode":s=this.state.access;break;case"want":s=this.state.modeWant,i=this.state.modeGiven,this.state.owner?n="O":(n=Ut.Tinode.AccessMode.encode(Ut.Tinode.AccessMode.diff("ASDO",this.state.modeGiven)),this.state.channel&&(n+="W")),o=a(ws.perm_want),r=a(ws.perm_given);break;case"given":s=this.state.modeGiven2,i=this.state.modeWant2,n=this.state.groupTopic?this.state.owner?"":"O":"ASDO",o=a(ws.perm_given),r=a(ws.perm_want);break;case"auth":s=this.state.auth,n="O";break;case"anon":s=this.state.anon,n="O";break;case"user":{const e=this.props.tinode.getTopic(this.props.topic);if(!e)return;const d=e.subscriber(t);if(!d||!d.acs)return;s=d.acs.getGiven(),i=d.acs.getWant(),n=this.state.owner?"":"O",o=a(ws.perm_given),r=a(ws.perm_want),d.public&&(l=d.public.fn,c=d.public.photo);break}default:return void console.error("Unknown permission editing mode '"+e+"'")}this.setState({userPermissionsEdited:t,userPermissionsTitle:l,userPermissionsAvatar:c,editedPermissions:s,immutablePermissions:i,editedPermissionsTitle:o,immutablePermissionsTitle:r,editedPermissionsSkipped:n}),this.props.onNavigate("perm/".concat(e))}handleShowAddMembers(e){e.preventDefault(),this.props.onInitFind(),this.props.onNavigate("members")}handleMemberUpdateRequest(e,t,a){this.props.onMemberUpdateRequest(this.props.topic,t,a),this.props.onNavigate("info")}handleMemberSelected(e){this.setState({selectedContact:e})}handleBackNavigate(){const e=(this.props.panel||"info").split("/");"info"==e[0]?this.props.onNavigate(null):"perm"==e[0]?"user"==e[1]?this.props.onNavigate("info"):this.props.onNavigate("security"):this.props.onNavigate("info")}handleContextMenu(e){const{formatMessage:t}=this.props.intl,a=this.props.tinode.getTopic(this.props.topic);if(!a)return;const s=a.subscriber(e.topicName);if(!s||!s.acs)return;const i=this.props.tinode.isMe(e.topicName),n=[{title:t(ws.edit_permissions),handler:()=>{this.handleLaunchPermissionsEditor(i?"want":"user",e.topicName)}}];i||n.push("member_delete"),n.push(s.acs.isMuted()?"member_unmute":"member_mute"),i||n.push(s.acs.isJoiner()?"member_block":"member_unblock"),this.props.showContextMenu({topicName:this.props.topic,x:e.x,y:e.y,user:e.topicName},n)}render(){const e=(this.props.panel||"info").split("/"),a=e[0];e.shift();const{formatMessage:s}=this.props.intl,i=s(("perm"==a?ws["perm_"+e[0]]:ws[a])||ws.info);return t().createElement("div",{id:"info-view"},t().createElement("div",{className:"caption-panel",id:"info-caption-panel"},t().createElement("div",{className:"panel-title",id:"info-title"},i),t().createElement("div",null,t().createElement(ts,{onCancel:this.handleBackNavigate}))),this.props.displayMobile?t().createElement(as,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,"members"==a?t().createElement(rs,{tinode:this.props.tinode,members:this.state.contactList,requiredMember:this.props.myUserId,keepInitialMembers:!this.state.admin&&!this.state.owner,myUserId:this.props.myUserId,contacts:this.props.searchableContacts,onCancel:this.handleBackNavigate,onSubmit:this.handleMemberUpdateRequest}):"perm"==a&&e.length>0?t().createElement(ds,{tinode:this.props.tinode,mode:this.state.editedPermissions,compare:this.state.immutablePermissions,skip:this.state.editedPermissionsSkipped,modeTitle:this.state.editedPermissionsTitle,compareTitle:this.state.immutablePermissionsTitle,userTitle:this.state.userPermissionsTitle,item:this.state.userPermissionsEdited,userAvatar:this.state.userPermissionsAvatar,onSubmit:t=>this.handlePermissionsChanged(e[0],t),onCancel:this.handleBackNavigate}):"general"==a?t().createElement(fs,{tinode:this.props.tinode,topic:this.props.topic,onCredAdd:this.props.onCredAdd,onTopicTagsUpdateRequest:this.props.onTopicTagsUpdateRequest,onCredConfirm:this.props.onCredConfirm,onCredDelete:this.props.onCredDelete,onUpdateTopicDesc:this.props.onTopicDescUpdateRequest,onError:this.props.onError}):"security"==a?t().createElement(ys,{topic:this.props.topic,owner:this.state.owner,admin:this.state.admin,sharer:this.state.sharer,deleter:this.state.deleter,muted:this.state.muted,groupTopic:this.state.groupTopic,channel:this.state.channel,access:this.state.access,modeGiven:this.state.modeGiven,modeWant:this.state.modeWant,modeGiven2:this.state.modeGiven2,modeWant2:this.state.modeWant2,auth:this.state.auth,anon:this.state.anon,onShowAlert:this.props.onShowAlert,onDeleteMessages:this.props.onDeleteMessages,onLeaveTopic:this.props.onLeaveTopic,onBlockTopic:this.props.onBlockTopic,onReportTopic:this.props.onReportTopic,onLaunchPermissionsEditor:this.handleLaunchPermissionsEditor,onNavigate:this.props.onNavigate}):t().createElement("div",{id:"info-view-content",className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"flat-button float-right",onClick:e=>{e.preventDefault(),this.props.onNavigate("general")}},t().createElement("i",{className:"material-icons"},"edit")," ",t().createElement(n.FormattedMessage,{id:"button_edit",defaultMessage:[{type:0,value:"Edit"}]})),t().createElement("center",null,t().createElement(Za,{tinode:this.props.tinode,avatar:this.state.avatar,readOnly:!0,uid:this.props.topic,title:this.state.fullName})),t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_topic_name",defaultMessage:[{type:0,value:"Name"}]}))),t().createElement("div",{className:"large ellipsized"},this.state.fullName,this.state.channel?t().createElement("img",{src:"/img/channel.png",className:"channel",alt:"channel"}):null)),this.state.private?t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_private",defaultMessage:[{type:0,value:"Private comment"}]}))),t().createElement("div",{className:"large ellipsized"},this.state.private)):null,t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_user_id",defaultMessage:[{type:0,value:"ID:"}]}))," ",t().createElement("tt",null,this.state.address)),t().createElement("div",{className:"group"},t().createElement(Ya,{trustedBadges:this.state.trustedBadges})),this.state.description?t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]})),t().createElement("div",null,this.state.description)):null),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("label",null,t().createElement(n.FormattedMessage,{id:"label_muting_topic",defaultMessage:[{type:0,value:"Muted:"}]})),t().createElement(es,{name:"P",checked:this.state.muted,onChange:this.handleMuted})),this.state.archived?t().createElement("div",{className:"panel-form-row"},t().createElement("label",null,t().createElement(n.FormattedMessage,{id:"label_unarchive_topic",defaultMessage:[{type:0,value:"Archived:"}]})),t().createElement(es,{name:"archived",checked:!0,onChange:this.handleUnarchive})):null,t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("security")}},t().createElement("i",{className:"material-icons"},"security")," ",t().createElement(n.FormattedMessage,{id:"button_security",defaultMessage:[{type:0,value:"Security"}]}))),this.state.groupTopic&&this.state.sharer?t().createElement(t().Fragment,null,t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_group_members",defaultMessage:[{type:0,value:"Group members:"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement("a",{href:"#",className:"flat-button",onClick:this.handleShowAddMembers},t().createElement("i",{className:"material-icons"},"person_add"),"  ",t().createElement(n.FormattedMessage,{id:"button_add_members",defaultMessage:[{type:0,value:"Add members"}]}))),t().createElement(n.FormattedMessage,{id:"group_has_no_members",defaultMessage:[{type:0,value:"No members"}]},(e=>t().createElement(Ha,{tinode:this.props.tinode,contacts:this.state.contactList,myUserId:this.props.myUserId,emptyListMessage:e,topicSelected:this.state.selectedContact,showOnline:!1,showUnread:!1,showMode:!0,noScroll:!0,onTopicSelected:this.handleMemberSelected,showContextMenu:!!this.state.admin&&this.handleContextMenu})))):null))}}const Cs=(0,n.injectIntl)(Es),Ss=new Audio("audio/call-out.m4a");Ss.loop=!0;const Ms=new Audio("audio/call-end.m4a");Ms.loop=!0;const ks=(0,n.defineMessages)({already_in_call:{id:"already_in_call",defaultMessage:[{type:0,value:"You already in an ongoing call!"}]}});class Ts extends t().PureComponent{constructor(e){super(e),this.state={localStream:void 0,pc:void 0,previousOnInfo:void 0,waitingForPeer:!1},this.localStreamConstraints={audio:!0,video:!0},this.localRef=t().createRef(),this.remoteRef=t().createRef(),this.onInfo=this.onInfo.bind(this),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this.createPeerConnection=this.createPeerConnection.bind(this),this.handleNegotiationNeededEvent=this.handleNegotiationNeededEvent.bind(this),this.handleICECandidateEvent=this.handleICECandidateEvent.bind(this),this.handleNewICECandidateMsg=this.handleNewICECandidateMsg.bind(this),this.handleICEConnectionStateChangeEvent=this.handleICEConnectionStateChangeEvent.bind(this),this.handleSignalingStateChangeEvent=this.handleSignalingStateChangeEvent.bind(this),this.handleICEGatheringStateChangeEvent=this.handleICEGatheringStateChangeEvent.bind(this),this.handleTrackEvent=this.handleTrackEvent.bind(this),this.handleVideoOfferMsg=this.handleVideoOfferMsg.bind(this),this.handleVideoAnswerMsg=this.handleVideoAnswerMsg.bind(this),this.handleNewICECandidateMsg=this.handleNewICECandidateMsg.bind(this),this.reportError=this.reportError.bind(this),this.handleGetUserMediaError=this.handleGetUserMediaError.bind(this),this.stopTracks=this.stopTracks.bind(this),this.handleCloseClick=this.handleCloseClick.bind(this),this.handleToggleCameraClick=this.handleToggleCameraClick.bind(this),this.handleToggleMicClick=this.handleToggleMicClick.bind(this),this.toggleMedia=this.toggleMedia.bind(this),this.handleRemoteHangup=this.handleRemoteHangup.bind(this),this.handleVideoCallAccepted=this.handleVideoCallAccepted.bind(this)}componentDidMount(){const e=this.props.tinode.getTopic(this.props.topic);this.previousOnInfo=e.onInfo,e.onInfo=this.onInfo,1!=this.props.callState&&3!=this.props.callState||!this.localRef.current||this.start()}componentWillUnmount(){this.props.tinode.getTopic(this.props.topic).onInfo=this.previousOnInfo,this.stop()}handleVideoCallAccepted(e){Ss.pause();const t=this.createPeerConnection(),a=this.state.localStream;a.getTracks().forEach((e=>{t.addTrack(e,a)}))}onInfo(e){if("call"==e.what)switch(e.event){case"accept":this.handleVideoCallAccepted(e);break;case"offer":this.handleVideoOfferMsg(e);break;case"answer":this.handleVideoAnswerMsg(e);break;case"ice-candidate":this.handleNewICECandidateMsg(e);break;case"hang-up":this.handleRemoteHangup(e)}}start(){this.state.localStream?this.props.onError(this.props.intl.formatMessage(ks.already_in_call)):3!=this.props.callState?navigator.mediaDevices.getUserMedia(this.localStreamConstraints).then((e=>{this.setState({localStream:e,waitingForPeer:!0}),this.localRef.current.srcObject=e,Ss.play(),this.props.onInvite(this.props.topic,this.props.seq,this.props.callState)})).catch(this.handleGetUserMediaError):this.props.onInvite(this.props.topic,this.props.seq,this.props.callState)}stop(){Ms.pause(),Ms.currentTime=0,Ss.pause(),Ss.currentTime=0,this.stopTracks(this.localRef.current),this.stopTracks(this.remoteRef.current),this.state.pc&&(this.state.pc.ontrack=null,this.state.pc.onremovetrack=null,this.state.pc.onremovestream=null,this.state.pc.onicecandidate=null,this.state.pc.oniceconnectionstatechange=null,this.state.pc.onsignalingstatechange=null,this.state.pc.onicegatheringstatechange=null,this.state.pc.onnegotiationneeded=null,this.state.pc.close()),this.setState({pc:null,waitingForPeer:!1})}stopTracks(e){if(!e)return;let t=e.srcObject;if(!t)return;let a=t.getTracks();a&&a.forEach((e=>{e.stop(),e.enabled=!1})),e.srcObject=null,e.src=""}createPeerConnection(){const e=this.props.tinode.getServerParam("iceServers",null),t=e?new RTCPeerConnection({iceServers:e}):new RTCPeerConnection;return t.onicecandidate=this.handleICECandidateEvent,t.oniceconnectionstatechange=this.handleICEConnectionStateChangeEvent,t.onicegatheringstatechange=this.handleICEGatheringStateChangeEvent,t.onsignalingstatechange=this.handleSignalingStateChangeEvent,t.onnegotiationneeded=this.handleNegotiationNeededEvent,t.ontrack=this.handleTrackEvent,this.setState({pc:t,waitingForPeer:!1}),t}handleVideoAnswerMsg(e){const t=new RTCSessionDescription(e.payload);this.state.pc.setRemoteDescription(t).catch(this.reportError)}reportError(e){this.props.onError(e.message,"err")}handleNegotiationNeededEvent(){this.state.pc.createOffer().then((e=>this.state.pc.setLocalDescription(e))).then((e=>{this.props.onSendOffer(this.props.topic,this.props.seq,this.state.pc.localDescription.toJSON())})).catch(this.reportError)}handleICECandidateEvent(e){e.candidate&&this.props.onIceCandidate(this.props.topic,this.props.seq,e.candidate.toJSON())}handleNewICECandidateMsg(e){const t=new RTCIceCandidate(e.payload);this.state.pc.addIceCandidate(t).catch(this.reportError)}handleICEConnectionStateChangeEvent(e){switch(this.state.pc.iceConnectionState){case"closed":case"failed":this.handleCloseClick()}}handleSignalingStateChangeEvent(e){"closed"==this.state.pc.signalingState&&this.handleCloseClick()}handleICEGatheringStateChangeEvent(e){console.log("ICE gathering change state: ",e)}handleTrackEvent(e){this.remoteRef.current.srcObject=e.streams[0],this.forceUpdate()}handleGetUserMediaError(e){switch(e.name){case"NotFoundError":this.reportError(e.message);break;case"SecurityError":case"PermissionDeniedError":break;default:this.reportError(e.message),console.error("Error opening your camera and/or microphone: "+e.message)}this.handleCloseClick()}handleVideoOfferMsg(e){let t=null;const a=this.createPeerConnection(),s=new RTCSessionDescription(e.payload);a.setRemoteDescription(s).then((e=>navigator.mediaDevices.getUserMedia(this.localStreamConstraints))).then((e=>{t=e,this.localRef.current.srcObject=e,this.setState({localStream:e}),t.getTracks().forEach((e=>{a.addTrack(e,t)}))})).then((e=>a.createAnswer())).then((e=>a.setLocalDescription(e))).then((e=>{this.props.onSendAnswer(this.props.topic,this.props.seq,a.localDescription.toJSON())})).catch(this.handleGetUserMediaError)}handleRemoteHangup(){this.state.waitingForPeer?(this.setState({waitingForPeer:!1}),Ss.pause(),Ss.currentTime=0,Ms.loop=!0,Ms.play(),setTimeout((e=>{this.handleCloseClick()}),2e3)):this.handleCloseClick()}handleCloseClick(){this.stop(),this.props.onHangup(this.props.topic,this.props.seq)}toggleMedia(e){this.state.localStream.getTracks().forEach((t=>{t.kind==e&&(t.enabled=!t.enabled)})),this.forceUpdate()}handleToggleCameraClick(){this.toggleMedia("video")}handleToggleMicClick(){this.toggleMedia("audio")}render(){const e=this.remoteRef.current&&this.remoteRef.current.srcObject,a=!(this.state.localStream&&this.state.localStream.getTracks()),s=this.state.localStream&&this.state.localStream.getAudioTracks()[0].enabled?"mic":"mic_off",i=this.state.localStream&&this.state.localStream.getVideoTracks()[0].enabled?"videocam":"videocam_off",o=da(this.props.title,20),r=this.state.waitingForPeer?" pulse":"";return t().createElement(t().Fragment,null,t().createElement("div",{id:"video-container"},t().createElement("div",{id:"video-container-panel"},t().createElement("div",{className:"call-party self"},t().createElement("video",{ref:this.localRef,autoPlay:!0,muted:!0,playsInline:!0}),t().createElement("div",{className:"caller-name inactive"},t().createElement(n.FormattedMessage,{id:"calls_you_label",defaultMessage:[{type:0,value:"You"}]}))),t().createElement("div",{className:"call-party peer"},t().createElement("video",{ref:this.remoteRef,autoPlay:!0,playsInline:!0}),e?t().createElement("div",{className:"caller-name inactive"},o):t().createElement("div",{className:"caller-card".concat(r)},t().createElement("div",{className:"avatar-box"},t().createElement(ha,{tinode:this.props.tinode,avatar:this.props.avatar,topic:this.props.topic,title:this.props.title})),t().createElement("div",{className:"caller-name"},o)))),t().createElement("div",{className:"controls"},t().createElement("button",{className:"danger",onClick:this.handleCloseClick},t().createElement("i",{className:"material-icons"},"call_end")),t().createElement("button",{className:"secondary",onClick:this.handleToggleCameraClick,disabled:a},t().createElement("i",{className:"material-icons"},i)),t().createElement("button",{className:"secondary",onClick:this.handleToggleMicClick,disabled:a},t().createElement("i",{className:"material-icons"},s)))))}}const Ns=(0,n.injectIntl)(Ts);class As extends t().Component{constructor(e){super(e),this.state={downloader:null,progress:0},this.downloadFile=this.downloadFile.bind(this),this.handleCancel=this.handleCancel.bind(this)}downloadFile(e,t,a){if(!e)return void this.props.onError("Invalid download URL '"+e+"'");const s=this.props.tinode.getLargeFileHelper();this.setState({downloader:s}),s.download(e,t,a,(e=>{this.setState({progress:e/this.props.size})}),(e=>{this.props.onError(e,"err")})).then((()=>{this.setState({downloader:null,progress:0})})).catch((e=>{e&&this.props.onError("Error downloading file: "+e.message,"err"),this.setState({downloader:null,progress:0})}))}handleCancel(){this.props.uploading?this.props.onCancelUpload():this.state.downloader&&this.state.downloader.cancel()}render(){let e=this.props.filename||"file_attachment";e.length>36&&(e=e.substr(0,16)+"..."+e.substr(-16));let a,s,i=this.props.size>0?t().createElement("span",{className:"small gray"},"(",ea(this.props.size),")"):null;this.props.uploading||this.state.downloader||!function(e){return e&&!/^\s*([a-z][a-z0-9+.-]*:|\/\/)/im.test(e)}(this.props.downloadUrl)?(a=oa(this.props.downloadUrl),s=null):(a="#",s=e=>{e.preventDefault(),this.downloadFile(this.props.downloadUrl,this.props.filename,this.props.mimetype)});const o=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons"},"file_download")," ",t().createElement(n.FormattedMessage,{id:"save_attachment",defaultMessage:[{type:0,value:"save"}]}));return t().createElement("div",{className:"attachment"},t().createElement("div",null,t().createElement("i",{className:"material-icons big gray"},"insert_drive_file")),t().createElement("div",{className:"flex-column"},t().createElement("div",null,e," ",i),this.props.uploading||this.state.downloader?t().createElement(Ta,{progress:this.props.uploading?this.props.progress:this.state.progress,onCancel:this.handleCancel}):t().createElement("div",null,a?t().createElement("a",{href:a,download:this.props.filename,onClick:s},o):t().createElement("span",{className:"light-gray"},o))))}}const Ds=(0,n.defineMessages)({message_sending:{id:"message_sending",defaultMessage:[{type:0,value:"sending..."}]},message_sending_failed:{id:"message_sending_failed",defaultMessage:[{type:0,value:"failed"}]}});class Ps extends t().PureComponent{render(){const{formatMessage:e}=this.props.intl;let a;a=this.props.received<=Ut.Tinode.MESSAGE_STATUS_SENDING?e(Ds.message_sending):this.props.received==Ut.Tinode.MESSAGE_STATUS_FAILED?e(Ds.message_sending_failed):this.props.timestamp.toLocaleTimeString(this.props.intl.locale,{timeStyle:"short"});const s=la(this.props.received),i=s?t().createElement("i",{className:"material-icons small "+s.color},s.name):null;return t().createElement("span",{className:"timestamp"},a," ",i)}}const Is=(0,n.injectIntl)(Ps);function Us(){return Us=Object.assign||function(e){for(var t=1;tUt.Tinode.MESSAGE_STATUS_FAILED&&this.props.received{"application/json"!=e.mime&&r.push(t().createElement(As,{tinode:this.props.tinode,downloadUrl:Ut.Drafty.getDownloadUrl(e),filename:e.name,uploading:Ut.Drafty.isProcessing(e),mimetype:e.mime,size:Ut.Drafty.getEntitySize(e),progress:this.state.progress,onCancelUpload:this.handleCancelUpload,onError:this.props.onError,key:a}))}),this);const e=Ut.Drafty.format(o,Pa,this.formatterContext);o=t().createElement(t().Fragment,null,e)}else this.props.deleted?o=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons gray"},"block")," ",t().createElement("i",{className:"gray"},t().createElement(n.FormattedMessage,{id:"deleted_content",defaultMessage:[{type:0,value:"content deleted"}]}))):"string"!=typeof o&&(o=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons gray"},"warning_amber")," ",t().createElement("i",{className:"gray"},t().createElement(n.FormattedMessage,{id:"invalid_content",defaultMessage:[{type:0,value:"invalid content"}]}))));return t().createElement("li",{ref:this.props.innerRef,className:e},this.props.isGroup&&this.props.response?t().createElement("div",{className:"avatar-box"},i?t().createElement(ha,{tinode:this.props.tinode,topic:this.props.userFrom,title:this.props.userName,avatar:s}):null):null,t().createElement("div",null,t().createElement("div",{className:a},t().createElement("div",{className:"content-meta"},t().createElement("div",{className:"message-content"},o,r),this.props.timestamp?t().createElement(Is,{timestamp:this.props.timestamp,received:this.props.received}):null),this.props.showContextMenu?t().createElement("span",{className:"menuTrigger"},t().createElement("a",{href:"#",onClick:this.handleContextClick},t().createElement("i",{className:"material-icons"},"expand_more"))):null),i?t().createElement("div",{className:"author"},this.props.userName||t().createElement("i",null,t().createElement(n.FormattedMessage,{id:"user_not_found",defaultMessage:[{type:0,value:"Not found"}]}))):null))}}const Fs=(0,n.injectIntl)(Rs),xs=t().forwardRef(((e,a)=>t().createElement(Fs,Us({innerRef:a},e))));var Bs=a(27),Ls=a.n(Bs);const Os=100,qs="audio/webm";class js extends t().PureComponent{constructor(e){super(e),this.state={enabled:!0,audioRecord:null,recording:!0,paused:!1,duration:"0:00",blobUrl:null,preview:null},this.visualize=this.visualize.bind(this),this.initMediaRecording=this.initMediaRecording.bind(this),this.initCanvas=this.initCanvas.bind(this),this.getRecording=this.getRecording.bind(this),this.cleanUp=this.cleanUp.bind(this),this.handleResume=this.handleResume.bind(this),this.handlePause=this.handlePause.bind(this),this.handleDelete=this.handleDelete.bind(this),this.handleDone=this.handleDone.bind(this),this.durationMillis=0,this.startedOn=null,this.viewBuffer=[],this.canvasRef=t().createRef()}componentDidMount(){this.stream=null,this.mediaRecorder=null,this.audioContext=null,this.audioInput=null,this.analyser=null,this.audioChunks=[];try{navigator.mediaDevices.getUserMedia({audio:!0,video:!1}).then(this.initMediaRecording,this.props.onError)}catch(e){this.props.onError(e)}}componentWillUnmount(){this.startedOn=null,this.stream&&this.cleanUp()}visualize(){this.initCanvas();const e=new Uint8Array(this.analyser.frequencyBinCount),t=this.canvasWidth,a=this.canvasHeight,s=t/10|0,i=Os*s;this.canvasContext.lineWidth=6,this.canvasContext.strokeStyle="#BBBD";let n=0,o=0,r=0;const l=()=>{if(!this.startedOn)return;window.requestAnimationFrame(l);const c=this.durationMillis+(Date.now()-this.startedOn);this.setState({duration:Zt(c/1e3)}),c>6e5&&(this.startedOn=null,this.mediaRecorder.pause(),this.durationMillis+=Date.now()-this.startedOn,this.setState({enabled:!1,recording:!1,duration:Zt(this.durationMillis/1e3)})),this.analyser.getByteTimeDomainData(e);let d=0;for(const t of e)d+=(t-127)**2;o+=Math.sqrt(d/e.length),r++;let h=c/Os|0;const p=i>c?0:(c-Os*h)/Os*10;n!=h&&(n=h,this.viewBuffer.push(o/r),o=0,r=0,this.viewBuffer.length>s&&this.viewBuffer.shift()),this.canvasContext.clearRect(0,0,t,a),this.canvasContext.beginPath();for(let e=0;e{this.durationMillis>2e3?this.getRecording(this.mediaRecorder.mimeType,this.durationMillis).then((e=>this.props.onFinished(e.url,e.preview,this.durationMillis))):this.props.onDeleted(),this.cleanUp()},this.mediaRecorder.ondataavailable=e=>{e.data.size>0&&this.audioChunks.push(e.data),"inactive"!=this.mediaRecorder.state&&this.getRecording(this.mediaRecorder.mimeType).then((e=>{this.setState({blobUrl:e.url,preview:e.preview})}))},this.durationMillis=0,this.startedOn=Date.now(),this.mediaRecorder.start(),this.visualize()}getRecording(e,t){let a=new Blob(this.audioChunks,{type:e||qs});return(t>0?Ls()(a,t,{logger:!1}):Promise.resolve(a)).then((e=>(a=e,e.arrayBuffer()))).then((e=>this.audioContext.decodeAudioData(e))).then((e=>this.createPreview(e))).then((e=>({url:window.URL.createObjectURL(a),preview:ya(e)})))}createPreview(e){const t=e.getChannelData(0),a=Math.min(t.length,96),s=t.length/a|0,i=Math.max(1,s/10|0);let n=[],o=-1;for(let e=0;e0&&(n=n.map((e=>100*e/o|0))),n}cleanUp(){this.audioInput.disconnect(),this.stream.getTracks().forEach((e=>e.stop()))}render(){const e="material-icons "+(this.state.enabled?"red":"gray");return t().createElement("div",{className:"audio"},t().createElement("a",{href:"#",onClick:this.handleDelete,title:"Delete"},t().createElement("i",{className:"material-icons gray"},"delete_outline")),this.state.recording?t().createElement("canvas",{ref:this.canvasRef}):t().createElement(Ca,{src:this.state.blobUrl,preview:this.state.preview,duration:this.durationMillis,short:!0}),t().createElement("div",{className:"duration"},this.state.duration),this.state.recording?t().createElement("a",{href:"#",onClick:this.handlePause,title:"Pause"},t().createElement("i",{className:"material-icons"},"pause_circle_outline")):t().createElement("a",{href:"#",onClick:this.handleResume,title:"Resume"},t().createElement("i",{className:e},"radio_button_checked")),t().createElement("a",{href:"#",onClick:this.handleDone,title:"Send"},t().createElement("i",{className:"material-icons"},"send")))}}const zs=(0,n.defineMessages)({messaging_disabled:{id:"messaging_disabled_prompt",defaultMessage:[{type:0,value:"Messaging disabled"}]},type_new_message:{id:"new_message_prompt",defaultMessage:[{type:0,value:"New message"}]},add_image_caption:{id:"image_caption_prompt",defaultMessage:[{type:0,value:"Image caption"}]},file_attachment_too_large:{id:"file_attachment_too_large",defaultMessage:[{type:0,value:"The file size "},{type:1,value:"size"},{type:0,value:" exceeds the "},{type:1,value:"limit"},{type:0,value:" limit."}]},cannot_initiate_upload:{id:"cannot_initiate_file_upload",defaultMessage:[{type:0,value:"Cannot initiate file upload."}]}});class Hs extends t().PureComponent{constructor(e){super(e),this.state={quote:null,message:"",audioRec:!1,audioAvailable:!!navigator.mediaDevices.getUserMedia,keypressTimestamp:(new Date).getTime()-Ot-1},this.handlePasteEvent=this.handlePasteEvent.bind(this),this.handleAttachImage=this.handleAttachImage.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleAttachAudio=this.handleAttachAudio.bind(this),this.handleSend=this.handleSend.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleMessageTyping=this.handleMessageTyping.bind(this),this.handleQuoteClick=this.handleQuoteClick.bind(this),this.formatReply=this.formatReply.bind(this)}componentDidMount(){this.messageEditArea&&this.messageEditArea.addEventListener("paste",this.handlePasteEvent,!1),this.setState({quote:this.formatReply()})}componentWillUnmount(){this.messageEditArea&&this.messageEditArea.removeEventListener("paste",this.handlePasteEvent,!1)}componentDidUpdate(e){this.messageEditArea&&this.messageEditArea.focus(),e.topicName!=this.props.topicName&&this.setState({message:"",audioRec:!1,quote:null}),e.reply!=this.props.reply&&this.setState({quote:this.formatReply()})}formatReply(){return this.props.reply?Ut.Drafty.format(this.props.reply.content,xa,{formatMessage:this.props.intl.formatMessage.bind(this.props.intl),authorizeURL:this.props.tinode.authorizeURL.bind(this.props.tinode)}):null}handlePasteEvent(e){this.props.disabled||function(e,t,a,s){const i=(e.clipboardData||e.originalEvent.clipboardData||{}).items;if(!i||!i.length)return!1;for(let e in i){const n=i[e];if("file"===n.kind){const e=n.getAsFile();if(!e){console.error("Failed to get file object from pasted file item",n.kind,n.type),s("Failed to get file object from pasted file item");continue}return e.type&&"image"==e.type.split("/")[0]?t(e):a(e),!0}}return!1}(e,(e=>{this.props.onAttachImage(e)}),(e=>{this.props.onAttachFile(e)}),this.props.onError)&&e.preventDefault()}handleAttachImage(e){e.target.files&&e.target.files.length>0&&this.props.onAttachImage(e.target.files[0]),e.target.value=""}handleAttachFile(e){e.target.files&&e.target.files.length>0&&this.props.onAttachFile(e.target.files[0]),e.target.value=""}handleAttachAudio(e,t,a){this.setState({audioRec:!1}),this.props.onAttachAudio(e,t,a)}handleSend(e){e.preventDefault();const t=this.state.message.trim();(t||this.props.acceptBlank||this.props.noInput)&&(this.props.onSendMessage(t),this.setState({message:""}))}handleKeyPress(e){if(this.state.audioRec)return e.preventDefault(),void e.stopPropagation();"Enter"===e.key&&(e.shiftKey||(e.preventDefault(),e.stopPropagation(),this.handleSend(e)))}handleMessageTyping(e){const t={message:e.target.value};if(this.props.onKeyPress){const e=(new Date).getTime();e-this.state.keypressTimestamp>Ot&&(this.props.onKeyPress(),t.keypressTimestamp=e)}this.setState(t)}handleQuoteClick(e){if(e.preventDefault(),e.stopPropagation(),this.props.reply&&this.props.onQuoteClick){const e=this.props.reply.seq;this.props.onQuoteClick(e)}}render(){const{formatMessage:e}=this.props.intl,a=this.props.disabled?e(zs.messaging_disabled):this.props.messagePrompt?e(zs[this.props.messagePrompt]):e(zs.type_new_message),s=this.state.quote?t().createElement("div",{id:"reply-quote-preview"},t().createElement("div",{className:"cancel"},t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancelReply()}},t().createElement("i",{className:"material-icons gray"},"close"))),this.state.quote):null,i=this.state.audioAvailable&&this.props.onAttachAudio;return t().createElement("div",{id:"send-message-wrapper"},this.props.noInput?null:s,t().createElement("div",{id:"send-message-panel"},this.props.disabled?t().createElement("div",{id:"writing-disabled"},a):t().createElement(t().Fragment,null,this.props.onAttachFile&&!this.state.audioRec?t().createElement(t().Fragment,null,t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachImage.click()},title:"Add image"},t().createElement("i",{className:"material-icons secondary"},"photo")),t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachFile.click()},title:"Attach file"},t().createElement("i",{className:"material-icons secondary"},"attach_file"))):null,this.props.noInput?s||t().createElement("div",{className:"hr thin"}):this.state.audioRec?t().createElement(js,{onDeleted:e=>this.setState({audioRec:!1}),onFinished:this.handleAttachAudio}):t().createElement("textarea",{id:"sendMessage",placeholder:a,value:this.state.message,onChange:this.handleMessageTyping,onKeyPress:this.handleKeyPress,ref:e=>{this.messageEditArea=e},autoFocus:!0}),this.state.message||!i?t().createElement("a",{href:"#",onClick:this.handleSend,title:"Send"},t().createElement("i",{className:"material-icons"},"send")):this.state.audioRec?null:t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.setState({audioRec:!0})},title:"Voice"},t().createElement("i",{className:"material-icons"},"mic")),t().createElement("input",{type:"file",ref:e=>{this.attachFile=e},onChange:this.handleAttachFile,style:{display:"none"}}),t().createElement("input",{type:"file",ref:e=>{this.attachImage=e},accept:"image/*",onChange:this.handleAttachImage,style:{display:"none"}}))))}}const Vs=(0,n.injectIntl)(Hs);class Ws extends t().PureComponent{constructor(e){super(e),this.handleSendDoc=this.handleSendDoc.bind(this)}handleSendDoc(e){this.props.onClose(),this.props.onSendMessage(this.props.content.file)}render(){return this.props.content?t().createElement("div",{id:"image-preview"},t().createElement("div",{id:"image-preview-caption-panel"},t().createElement("span",null,this.props.content.name),t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()}},t().createElement("i",{className:"material-icons gray"},"close"))),t().createElement("div",{id:"image-preview-container"},t().createElement("div",{className:"flex-column narrow"},t().createElement("i",{className:"material-icons gray"},function(e){const t={default:"insert_drive_file",image:"image",text:"description",video:"theaters"};return t[e]||t[(e||"").split("/")[0]]||t.default}(this.props.content.type)),t().createElement("div",null,t().createElement("b",null,t().createElement(n.FormattedMessage,{id:"label_file_name",defaultMessage:[{type:0,value:"File name:"}]}))," ",ta(this.props.content.name,24)||"-"),t().createElement("div",null,t().createElement("b",null,t().createElement(n.FormattedMessage,{id:"label_content_type",defaultMessage:[{type:0,value:"Content type:"}]}))," ",this.props.content.type||"application/octet-stream"),t().createElement("div",null,t().createElement("b",null,t().createElement(n.FormattedMessage,{id:"label_size",defaultMessage:[{type:0,value:"Size:"}]}))," ",ea(this.props.content.size)))),t().createElement(Vs,{noInput:!0,tinode:this.props.tinode,reply:this.props.reply,onCancelReply:this.props.onCancelReply,onSendMessage:this.handleSendDoc,onError:this.props.onError})):null}}class Ks extends t().Component{constructor(e){super(e)}render(){const e=[],a=(this.props.subscribers||[]).length,s=Math.min(4,a);return(this.props.subscribers||[]).some((a=>(e.push(t().createElement("div",{className:"avatar-box",key:a.user},t().createElement(ha,{tinode:this.props.tinode,topic:a.user,avatar:ga(a.public?a.public.photo:null)||!0,title:a.public?a.public.fn:null}))),e.length==s))),t().createElement("div",{id:"topic-users"},e," ",a>s?t().createElement("span",null,t().createElement(n.FormattedMessage,{id:"more_online_members",defaultMessage:[{type:0,value:"+"},{type:1,value:"overflow"},{type:0,value:" more"}],values:{overflow:a-s}})):null)}}class Gs extends t().PureComponent{constructor(e){super(e),this.state={width:0,height:0},this.handleSendImage=this.handleSendImage.bind(this)}assignWidth(e){if(e&&!this.state.width){const t=e.getBoundingClientRect();this.setState({width:0|t.width,height:0|t.height})}}handleSendImage(e){this.props.onClose(),this.props.onSendMessage(e,this.props.content.blob)}render(){if(!this.props.content)return null;const e=_a(this.props.content.width,this.props.content.height,this.state.width,this.state.height,!1),a=e?{width:e.dstWidth+"px",height:e.dstHeight+"px"}:this.props.content.width>this.props.content.height?{width:"100%"}:{height:"100%"};a.maxWidth="100%",a.maxHeight="100%";const s=Math.max((this.state.width/jt/1.5|0)-2,12),i=ta(this.props.content.name,s)||"-",o=this.props.content.width||"-",r=this.props.content.height||"-";return t().createElement("div",{id:"image-preview"},t().createElement("div",{id:"image-preview-caption-panel"},this.props.onSendMessage?t().createElement("span",null,i):t().createElement("a",{href:this.props.content.url,download:!0},t().createElement("i",{className:"material-icons"},"file_download")," ",t().createElement(n.FormattedMessage,{id:"download_action",defaultMessage:[{type:0,value:"download"}]})),t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()}},t().createElement("i",{className:"material-icons gray"},"close"))),t().createElement("div",{id:"image-preview-container",ref:e=>this.assignWidth(e)},t().createElement("img",{src:this.props.content.url,style:a,className:"image-preview",alt:this.props.content.name})),this.props.onSendMessage?t().createElement(Vs,{messagePrompt:"add_image_caption",acceptBlank:!0,tinode:this.props.tinode,reply:this.props.reply,onCancelReply:this.props.onCancelReply,onSendMessage:this.handleSendImage,onError:this.props.onError}):t().createElement("div",{id:"image-preview-footer"},t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(n.FormattedMessage,{id:"label_file_name",defaultMessage:[{type:0,value:"File name:"}]}))),t().createElement("div",null,t().createElement("span",{title:this.props.content.name},i))),t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(n.FormattedMessage,{id:"label_content_type",defaultMessage:[{type:0,value:"Content type:"}]}))),t().createElement("div",null,this.props.content.type)),t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(n.FormattedMessage,{id:"label_size",defaultMessage:[{type:0,value:"Size:"}]}))),t().createElement("div",null,o," × ",r," px; ",ea(this.props.content.size)))))}}class $s extends t().PureComponent{constructor(e){super(e),this.handleButtonAction=this.handleButtonAction.bind(this)}handleButtonAction(e,t){e.preventDefault(),this.props.onAction(t)}render(){return t().createElement("div",{className:"accept-invite-panel"},t().createElement("div",{className:"title"},t().createElement(n.FormattedMessage,{id:"chat_invitation",defaultMessage:[{type:0,value:"You are invited to start a new chat. What would you like to do?"}]})),t().createElement("div",{className:"footer"},t().createElement("button",{className:"primary",onClick:e=>{this.handleButtonAction(e,"accept")}},t().createElement(n.FormattedMessage,{id:"chat_invitation_accept",defaultMessage:[{type:0,value:"Accept"}]})),t().createElement("button",{className:"secondary",onClick:e=>{this.handleButtonAction(e,"delete")}},t().createElement(n.FormattedMessage,{id:"chat_invitation_ignore",defaultMessage:[{type:0,value:"Ignore"}]})),t().createElement("button",{className:"secondary",onClick:e=>{this.handleButtonAction(e,"block")}},t().createElement(n.FormattedMessage,{id:"chat_invitation_block",defaultMessage:[{type:0,value:"Block"}]}))))}}class Ys extends t().PureComponent{render(){const e=xt+" ("+Ut.Tinode.getLibrary()+")";return t().createElement("div",{id:"dummy-view"},t().createElement("div",null,t().createElement("a",{href:"https://github.com/tinode/chat/"},t().createElement("img",{id:"logo",alt:"logo",src:"img/logo.svg"}),t().createElement("h2",null,"Tinode Web")),t().createElement("p",null,t().createElement(n.FormattedMessage,{id:"label_client",defaultMessage:[{type:0,value:"Client:"}]})," ",e),t().createElement("p",null,t().createElement(n.FormattedMessage,{id:"label_server",defaultMessage:[{type:0,value:"Server:"}]})," ",this.props.serverVersion," (",this.props.serverAddress,")")))}}class Qs extends t().PureComponent{constructor(e){super(e)}render(){let e=null,a="bubble";return this.props.deleted?(e=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons gray"},"block")," ",t().createElement("i",{className:"gray"},t().createElement(n.FormattedMessage,{id:"deleted_content",defaultMessage:[{type:0,value:"content deleted"}]}))),a+=" deleted"):this.props.date&&(e=t().createElement(t().Fragment,null,this.props.date),a+=" date"),e?t().createElement("li",{className:"meta"},t().createElement("div",{className:a},t().createElement("div",{className:"message-content"},e))):t().createElement(t().Fragment,null,null)}}class Js{static parseUrlHash(e){const t=e.split("?",2),a={};let s=[];return t[0]&&(s=t[0].replace("#","").split("/")),t[1]&&t[1].split("&").forEach((function(e){const t=e.split("=");t[0]&&(a[decodeURIComponent(t[0])]=decodeURIComponent(t[1]))})),{path:s,params:a}}static navigateTo(e){window.location.hash=e}static composeUrlHash(e,t){let a=e.join("/");const s=[];for(const e in t)t.hasOwnProperty(e)&&s.push(e+"="+t[e]);return s.length>0&&(a+="?"+s.join("&")),a}static addUrlParam(e,t,a){const s=this.parseUrlHash(e);return s.params[t]=a,this.composeUrlHash(s.path,s.params)}static removeUrlParam(e,t){const a=this.parseUrlHash(e);return delete a.params[t],this.composeUrlHash(a.path,a.params)}static setUrlSidePanel(e,t){const a=this.parseUrlHash(e);return a.path[0]=t,this.composeUrlHash(a.path,a.params)}static setUrlInfoPanel(e,t){const a=this.parseUrlHash(e);return t?a.params.info=t:delete a.params.info,this.composeUrlHash(a.path,a.params)}static setUrlTopic(e,t){const a=this.parseUrlHash(e);return a.path[1]=t,delete a.params.info,this.composeUrlHash(a.path,a.params)}}const Xs=(0,n.defineMessages)({online_now:{id:"online_now",defaultMessage:[{type:0,value:"online now"}]},last_seen:{id:"last_seen_timestamp",defaultMessage:[{type:0,value:"Last seen"}]},not_found:{id:"title_not_found",defaultMessage:[{type:0,value:"Not found"}]},channel:{id:"channel",defaultMessage:[{type:0,value:"channel"}]},file_attachment_too_large:{id:"file_attachment_too_large",defaultMessage:[{type:0,value:"The file size "},{type:1,value:"size"},{type:0,value:" exceeds the "},{type:1,value:"limit"},{type:0,value:" limit."}]},invalid_content:{id:"invalid_content",defaultMessage:[{type:0,value:"invalid content"}]}});function Zs(e){if(e){const t=e.getExcessive()||"";return e.isJoiner("given")&&(t.includes("R")||t.includes("W"))}return!1}function ei(e){if(e){const t=e.getMissing()||"";return e.isJoiner("want")&&(t.includes("R")||t.includes("W"))}return!1}function ti(e){return 1==e||3==e}class ai extends t().Component{constructor(e){super(e),this.state=ai.getDerivedStateFromProps(e,{}),this.leave=this.leave.bind(this),this.sendMessage=this.sendMessage.bind(this),this.retrySend=this.retrySend.bind(this),this.sendImageAttachment=this.sendImageAttachment.bind(this),this.sendFileAttachment=this.sendFileAttachment.bind(this),this.sendAudioAttachment=this.sendAudioAttachment.bind(this),this.sendKeyPress=this.sendKeyPress.bind(this),this.subscribe=this.subscribe.bind(this),this.handleScrollReference=this.handleScrollReference.bind(this),this.handleScrollEvent=this.handleScrollEvent.bind(this),this.handleDescChange=this.handleDescChange.bind(this),this.handleSubsUpdated=this.handleSubsUpdated.bind(this),this.handleMessageUpdate=this.handleMessageUpdate.bind(this),this.handleAllMessagesReceived=this.handleAllMessagesReceived.bind(this),this.handleInfoReceipt=this.handleInfoReceipt.bind(this),this.handleImagePostview=this.handleImagePostview.bind(this),this.handleClosePreview=this.handleClosePreview.bind(this),this.handleFormResponse=this.handleFormResponse.bind(this),this.handleContextClick=this.handleContextClick.bind(this),this.handleShowMessageContextMenu=this.handleShowMessageContextMenu.bind(this),this.handleNewChatAcceptance=this.handleNewChatAcceptance.bind(this),this.handleEnablePeer=this.handleEnablePeer.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleAttachImage=this.handleAttachImage.bind(this),this.handleCancelUpload=this.handleCancelUpload.bind(this),this.postReadNotification=this.postReadNotification.bind(this),this.clearNotificationQueue=this.clearNotificationQueue.bind(this),this.goToLatestMessage=this.goToLatestMessage.bind(this),this.handlePickReply=this.handlePickReply.bind(this),this.handleCancelReply=this.handleCancelReply.bind(this),this.handleQuoteClick=this.handleQuoteClick.bind(this),this.handleCallHangup=this.handleCallHangup.bind(this),this.chatMessageRefs={},this.getOrCreateMessageRef=this.getOrCreateMessageRef.bind(this),this.readNotificationQueue=[],this.readNotificationTimer=null}getOrCreateMessageRef(e){if(this.chatMessageRefs.hasOwnProperty(e))return this.chatMessageRefs[e];const a=t().createRef();return this.chatMessageRefs[e]=a,a}componentDidMount(){this.messagesScroller&&this.messagesScroller.addEventListener("scroll",this.handleScrollEvent)}componentWillUnmount(){this.messagesScroller&&this.messagesScroller.removeEventListener("scroll",this.handleScrollEvent),this.clearNotificationQueue()}componentDidUpdate(e,t){!this.messagesScroller||t.topic==this.state.topic&&t.messageCount==this.state.messageCount||this.state.scrollPosition<100&&(this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition-this.messagesScroller.offsetHeight);const a=this.props.tinode?this.props.tinode.getTopic(this.state.topic):void 0;this.state.topic!=t.topic&&(t.topic&&!Ut.Tinode.isNewGroupTopicName(t.topic)&&(this.leave(t.topic),t.rtcPanel&&this.handleCallHangup(t.topic,e.callSeq)),a&&(a.onData=this.handleMessageUpdate,a.onAllMessagesReceived=this.handleAllMessagesReceived,a.onInfo=this.handleInfoReceipt,a.onMetaDesc=this.handleDescChange,a.onSubsUpdated=this.handleSubsUpdated,a.onPres=this.handleSubsUpdated)),this.props.applicationVisible?this.postReadNotification(0):this.clearNotificationQueue(),!a||this.state.topic==t.topic&&e.ready||(a._new&&a.isP2PType()?a.getMeta(a.startMetaQuery().withDesc().build()):this.subscribe(a))}static getDerivedStateFromProps(e,t){let a={};if(e.topic)if(e.topic!=t.topic){const s=e.tinode.getTopic(e.topic);if(a={topic:e.topic,docPreview:null,imagePreview:null,imagePostview:null,rtcPanel:null,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1,showGoToLastButton:!1,deleted:s._deleted},e.forwardMessage&&(a.reply={content:e.forwardMessage.preview,seq:null}),s){const i=[];e.connected&&s.subscribers((t=>{t.online&&t.user!=e.myUserId&&i.push(t)})),Object.assign(a,{onlineSubs:i}),s.public?Object.assign(a,{title:s.public.fn,avatar:ga(s.public.photo)}):Object.assign(a,{title:"",avatar:null});const n=s.p2pPeerDesc();n?Object.assign(a,{peerMessagingDisabled:ei(n.acs)}):t.peerMessagingDisabled&&Object.assign(a,{peerMessagingDisabled:!1}),Object.assign(a,{messageCount:s.messageCount(),latestClearId:s.maxClearId(),channel:s.isChannelType()}),e.callTopic==s.name&&ti(e.callState)&&(a.rtcPanel=e.callTopic)}else Object.assign(a,{messageCount:0,latestClearId:-1,onlineSubs:[],title:"",avatar:null,peerMessagingDisabled:!1,channel:!1})}else e.callTopic==t.topic&&!t.rtcPanel&&ti(e.callState)&&(a.rtcPanel=e.callTopic);else a={messageCount:0,latestClearId:-1,onlineSubs:[],topic:null,title:"",avatar:null,isVerified:!1,isStaff:!1,isDangerous:!1,deleted:!1,docPreview:null,imagePreview:null,imagePostview:null,rtcPanel:null,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1,peerMessagingDisabled:!1,channel:!1,reply:null,showGoToLastButton:!1};return e.acs?(e.acs.isWriter()!=t.isWriter&&(a.isWriter=!t.isWriter),e.acs.isReader()!=t.isReader&&(a.isReader=!t.isReader),!e.acs.isReader("given")!=t.readingBlocked&&(a.readingBlocked=!t.readingBlocked),e.acs.isSharer()!=t.isSharer&&(a.isSharer=!t.isSharer)):(t.isWriter&&(a.isWriter=!1),t.isReader&&(a.isReader=!1),t.readingBlocked||(t.readingBlocked=!0),t.isSharer&&(a.isSharer=!1)),Zs(e.acs)==!t.unconformed&&(a.unconfirmed=!t.unconformed),!e.connected&&t.onlineSubs&&t.onlineSubs.length>0&&(a.onlineSubs=[]),a}subscribe(e){if(e.isSubscribed()||!this.props.ready)return;const t=this.props.newTopicParams&&this.props.newTopicParams._topicName==this.props.topic;let a=e.startMetaQuery().withLaterDesc().withLaterSub();(this.state.isReader||t)&&(a=a.withLaterData(24),this.state.isReader&&(a=a.withLaterDel()),this.setState({fetchingMessages:!0}));const s=t?this.props.newTopicParams:void 0;e.subscribe(a.build(),s).then((t=>{303!=t.code?(this.state.topic!=t.topic&&this.setState({topic:t.topic}),this.props.onNewTopicCreated(this.props.topic,t.topic),e.queuedMessages((t=>{t._sending||e.isSubscribed()&&this.retrySend(t)}))):Js.navigateTo(Js.setUrlTopic("",t.params.topic))})).catch((e=>{console.error("Failed subscription to",this.state.topic,e),this.props.onError(e.message,"err");const t=ai.getDerivedStateFromProps({},{});t.title=this.props.intl.formatMessage(Xs.not_found),this.setState(t)}))}leave(e){if(!e||!this.props.tinode.isTopicCached(e))return;const t=this.props.tinode.getTopic(e);t&&t.isSubscribed()&&t.leave(!1).catch((()=>{})).finally((()=>{this.setState({fetchingMessages:!1}),t.onData=void 0,t.onAllMessagesReceived=void 0,t.onInfo=void 0,t.onMetaDesc=void 0,t.onSubsUpdated=void 0,t.onPres=void 0}))}handleScrollReference(e){e&&(e.addEventListener("scroll",this.handleScrollEvent),this.messagesScroller=e,this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition)}handleScrollEvent(e){const t=e.target.scrollHeight-e.target.scrollTop-e.target.offsetHeight;if(this.setState({scrollPosition:t,showGoToLastButton:t>100&&t{e.getMessagesPage(24).catch((e=>this.props.onError(e.message,"err"))).finally((()=>this.setState({fetchingMessages:!1})))}))}}goToLatestMessage(){this.setState({scrollPosition:0}),this.messagesScroller&&(this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight)}handleDescChange(e){e.public?this.setState({title:e.public.fn,avatar:ga(e.public.photo)}):this.setState({title:"",avatar:null}),e.acs&&this.setState({isWriter:e.acs.isWriter(),isReader:e.acs.isReader(),readingBlocked:!e.acs.isReader("given"),unconfirmed:Zs(e.acs)})}postReadNotification(e){if(!this.props.applicationVisible)return;this.readNotificationTimer||(this.readNotificationTimer=setInterval((()=>{if(0==this.readNotificationQueue.length)return clearInterval(this.readNotificationTimer),void(this.readNotificationTimer=null);let e=-1;for(;this.readNotificationQueue.length>0;){const t=this.readNotificationQueue[0];if(t.topicName!=this.state.topic){this.readNotificationQueue.shift();continue}const a=new Date;if(!(t.sendAt<=a))break;this.readNotificationQueue.shift(),e=Math.max(e,t.seq)}if(e>=0){const t=this.props.tinode.getTopic(this.state.topic);t&&t.noteRead(e)}}),300));const t=new Date;this.readNotificationQueue.push({topicName:this.state.topic,seq:e,sendAt:t.setMilliseconds(t.getMilliseconds()+1e3)})}clearNotificationQueue(){this.readNotificationQueue=[],this.readNotificationTimer&&(clearInterval(this.readNotificationTimer),this.readNotificationTimer=null)}handleSubsUpdated(){if(this.state.topic){const e=[],t=this.props.tinode.getTopic(this.state.topic);t.subscribers((t=>{t.online&&t.user!=this.props.myUserId&&e.push(t)}));const a={onlineSubs:e},s=t.p2pPeerDesc();s?Object.assign(a,{peerMessagingDisabled:ei(s.acs)}):this.state.peerMessagingDisabled&&Object.assign(a,{peerMessagingDisabled:!1}),this.setState(a)}}handleMessageUpdate(e){const t=this.props.tinode.getTopic(this.state.topic);if(!e)return void this.setState({latestClearId:t.maxClearId()});clearTimeout(this.keyPressTimer),this.setState({messageCount:t.messageCount(),typingIndicator:!1}),t.isNewMessage(e.seq)&&(this.state.scrollPosition>100?this.setState({showGoToLastButton:!0}):this.setState({scrollPosition:0}));t.msgStatus(e,!0)>=Ut.Tinode.MESSAGE_STATUS_SENT&&e.from!=this.props.myUserId&&this.postReadNotification(e.seq),this.props.onData(e)}handleAllMessagesReceived(e){this.setState({fetchingMessages:!1}),e>0&&this.postReadNotification(0)}handleInfoReceipt(e){switch(e.what){case"kp":clearTimeout(this.keyPressTimer),this.keyPressTimer=setTimeout((()=>{this.setState({typingIndicator:!1})}),4e3),this.state.typingIndicator||this.setState({typingIndicator:!0});break;case"read":case"recv":this.forceUpdate();break;default:console.info("Other change in topic: ",e.what)}}handleImagePostview(e){this.setState({imagePostview:e})}handleClosePreview(){this.state.imagePreview&&this.state.imagePreview.url&&URL.revokeObjectURL(this.state.imagePreview.url),this.setState({imagePostview:null,imagePreview:null,docPreview:null})}handleFormResponse(e,t,a){if("pub"==e)this.sendMessage(Ut.Drafty.attachJSON(Ut.Drafty.parse(t),a));else if("url"==e){const e=new URL(a.ref),t=e.searchParams;for(let e in a.resp)a.resp.hasOwnProperty(e)&&t.set(e,a.resp[e]);["name","seq"].map((e=>{a[e]&&t.set(e,a[e])})),t.set("uid",this.props.myUserId),t.set("topic",this.state.topic),e.search=t,window.open(e,"_blank")}else console.info("Unknown action in form",e)}handleContextClick(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.state.topic,y:e.pageY,x:e.pageX})}handleShowMessageContextMenu(e,t){"chan"==e.userFrom&&(e.userFrom=this.state.topic,e.userName=this.state.title),e.topicName=this.state.topic;const a=t||[],s=this.props.tinode.getTopic(e.topicName);if(s){s.isChannelType()||a.push("message_delete");const e=s.getAccessMode();e&&e.isDeleter()&&a.push("message_delete_hard")}this.props.showContextMenu(e,a)}handleNewChatAcceptance(e){this.props.onNewChat(this.state.topic,e)}handleEnablePeer(e){e.preventDefault(),this.props.onChangePermissions(this.state.topic,qt,this.state.topic)}sendKeyPress(){const e=this.props.tinode.getTopic(this.state.topic);e.isSubscribed()&&e.noteKeyPress()}sendMessage(e,t,a){let s;this.props.forwardMessage?(e=this.props.forwardMessage.msg,s=this.props.forwardMessage.head,this.handleCancelReply()):this.state.reply&&this.state.reply.content&&(s={reply:""+this.state.reply.seq},"string"==typeof e&&(e=Ut.Drafty.parse(e)),e=Ut.Drafty.append(Ut.Drafty.sanitizeEntities(this.state.reply.content),e),this.handleCancelReply()),this.props.sendMessage(e,t,a,s)}retrySend(e){this.props.sendMessage(e.content,void 0,void 0,e.head)}sendFileAttachment(e){const t=.75*this.props.tinode.getServerParam("maxMessageSize",Ht)-1024|0;if(e.size>t){const t=this.props.tinode.getLargeFileHelper();if(!t)return void this.props.onError(this.props.intl.formatMessage(Xs.cannot_initiate_upload));const a=t.upload(e),s=Ut.Drafty.attachFile(null,{mime:e.type,filename:e.name,size:e.size,urlPromise:a});this.sendMessage(s,a,t)}else(function(e){return new Promise(((t,a)=>{const s=new FileReader;s.onerror=e=>{a(s.error)},s.onload=()=>{t({mime:e.type,bits:s.result.split(",")[1],name:e.name})},s.readAsDataURL(e)}))})(e).then((e=>this.sendMessage(Ut.Drafty.attachFile(null,{mime:e.mime,data:e.bits,filename:e.name})))).catch((e=>this.props.onError(e)))}handleAttachFile(e){const t=this.props.tinode.getServerParam("maxFileUploadSize",Vt);e.size>t?this.props.onError(this.props.intl.formatMessage(Xs.file_attachment_too_large,{size:ea(e.size),limit:ea(t)}),"err"):this.setState({docPreview:{file:e,name:e.name,size:e.size,type:e.type}})}handleCallHangup(e,t){this.props.onVideoCallClosed(),this.setState({rtcPanel:null}),this.props.onCallHangup(e,t)}sendImageAttachment(e,t){const a=this.state.imagePreview.mime,s=this.state.imagePreview.width,i=this.state.imagePreview.height,n=this.state.imagePreview.name,o=.75*this.props.tinode.getServerParam("maxMessageSize",Ht)-1024|0;if(t.size>o){const o=this.props.tinode.getLargeFileHelper();if(!o)return void this.props.onError(this.props.intl.formatMessage(Xs.cannot_initiate_upload));const r=o.upload(t);ba(t,64,64,-1,!1).then((e=>va(e.blob))).then((l=>{let c=Ut.Drafty.insertImage(null,0,{mime:a,_tempPreview:l.bits,width:s,height:i,filename:n,size:t.size,urlPromise:r});e&&(c=Ut.Drafty.appendLineBreak(c),c=Ut.Drafty.append(c,Ut.Drafty.parse(e))),this.sendMessage(c,r,o)})).catch((e=>{this.props.onError(e,"err")}))}else va(t).then((a=>{let o=Ut.Drafty.insertImage(null,0,{mime:a.mime,preview:a.bits,width:s,height:i,filename:n,size:t.size});e&&(o=Ut.Drafty.appendLineBreak(o),o=Ut.Drafty.append(o,Ut.Drafty.parse(e))),this.sendMessage(o)}))}handleAttachImage(e){ba(e,1024,1024,this.props.tinode.getServerParam("maxFileUploadSize",Vt),!1).then((e=>{this.setState({imagePreview:{url:URL.createObjectURL(e.blob),blob:e.blob,name:e.name,width:e.width,height:e.height,size:e.blob.size,mime:e.mime}})})).catch((e=>{this.props.onError(e,"err")}))}sendAudioAttachment(e,t,a){fetch(e).then((e=>e.blob())).then((e=>{const s=.75*this.props.tinode.getServerParam("maxMessageSize",Ht)-1024;if(e.size>s){const s=this.props.tinode.getLargeFileHelper();if(!s)return void this.props.onError(this.props.intl.formatMessage(Xs.cannot_initiate_upload));const i=s.upload(e),n=Ut.Drafty.appendAudio(null,{mime:e.type,size:e.size,duration:a,preview:t,urlPromise:i});this.sendMessage(n,i,s)}else va(e).then((s=>{this.sendMessage(Ut.Drafty.appendAudio(null,{mime:s.mime,size:e.size,data:s.bits,duration:a,preview:t}))}))})).catch((e=>{this.props.onError(e)}))}handleCancelUpload(e,t){const a=this.props.tinode.getTopic(this.state.topic).findMessage(e);a&&(a._cancelled=!0),t.cancel()}handlePickReply(e,t,a,s){this.setState({reply:null}),e&&t&&(t="string"==typeof t?Ut.Drafty.init(t):t,t=Ut.Drafty.isValid(t)?Ut.Drafty.replyContent(t,30):Ut.Drafty.append(Ut.Drafty.init("⚠ "),Ut.Drafty.wrapInto(this.props.intl.formatMessage(Xs.invalid_content),"EM")),this.setState({reply:{content:Ut.Drafty.quote(s,a,t),seq:e}}),this.props.onCancelForwardMessage())}handleCancelReply(){this.setState({reply:null}),this.props.onCancelForwardMessage()}handleQuoteClick(e){const t=this.getOrCreateMessageRef(e);t&&t.current?(t.current.scrollIntoView({block:"center",behavior:"smooth"}),t.current.classList.add("flash"),setTimeout((()=>{t.current.classList.remove("flash")}),1e3)):console.error("Unresolved message ref",e)}render(){const{formatMessage:e}=this.props.intl;let a;if(this.props.hideSelf)a=null;else if(this.state.topic){let s;if(this.state.imagePreview)s=t().createElement(Gs,{content:this.state.imagePreview,tinode:this.props.tinode,reply:this.state.reply,onCancelReply:this.handleCancelReply,onClose:this.handleClosePreview,onSendMessage:this.sendImageAttachment});else if(this.state.imagePostview)s=t().createElement(Gs,{content:this.state.imagePostview,onClose:this.handleClosePreview});else if(this.state.docPreview)s=t().createElement(Ws,{content:this.state.docPreview,tinode:this.props.tinode,reply:this.state.reply,onCancelReply:this.handleCancelReply,onClose:this.handleClosePreview,onSendMessage:this.sendFileAttachment});else if(this.state.rtcPanel)s=t().createElement(Ns,{topic:this.state.topic,seq:this.props.callSeq,callState:this.props.callState,tinode:this.props.tinode,title:this.state.title,avatar:this.state.avatar||!0,onError:this.props.onError,onHangup:this.handleCallHangup,onInvite:this.props.onCallInvite,onSendOffer:this.props.onCallSendOffer,onIceCandidate:this.props.onCallIceCandidate,onSendAnswer:this.props.onCallSendAnswer});else{const a=this.props.tinode.getTopic(this.state.topic),i=a.isChannelType(),o=a.isGroupType()&&!i,r=[];a.trusted&&(a.trusted.verified&&r.push({icon:"verified",color:"badge-inv"}),a.trusted.staff&&r.push({icon:"staff",color:"badge-inv"}),a.trusted.danger&&r.push({icon:"dangerous",color:"badge-inv"}));const l=[];let c=null,d=null,h=null;const p=new Intl.DateTimeFormat(this.props.intl.locale);a.messages(((e,s,i,n)=>{let r=i?i.from||"chan":null,m="single",u=e.from||"chan";u==c?m=u==r?"middle":"last":u==r&&(m="first"),c=u;const g=!(u==this.props.myUserId),_=a.msgStatus(e,!0);let f,b,v=u;const y=a.userDesc(u);y&&y.public&&(f=y.public.fn,b=ga(y.public.photo)),h=o?"chat-box group":"chat-box";const w=this.getOrCreateMessageRef(e.seq);let E=e.head?parseInt(e.head.reply):null;if(E&&!isNaN(E)||(E=null),e.hi)l.push(t().createElement(Qs,{deleted:!0,key:e.seq}));else{const a=new Date(e.ts);d&&d.toDateString()==a.toDateString()||(l.push(t().createElement(Qs,{date:p.format(e.ts),locale:this.props.intl.locale,key:"date-"+e.seq})),d=a),l.push(t().createElement(xs,{tinode:this.props.tinode,content:e.content,mimeType:e.head&&e.head.mime,timestamp:e.ts,response:g,seq:e.seq,isGroup:o,isChan:this.state.channel,userFrom:v,userName:f,userAvatar:b,sequence:m,received:_,uploader:e._uploader,viewportWidth:this.props.viewportWidth,showContextMenu:this.handleShowMessageContextMenu,onImagePreview:this.handleImagePostview,onFormResponse:this.handleFormResponse,onError:this.props.onError,onCancelUpload:this.handleCancelUpload,pickReply:this.handlePickReply,replyToSeq:E,onQuoteClick:this.handleQuoteClick,ref:w,userIsWriter:this.state.isWriter,key:e.seq}))}}));let m=null;if(i)m=e(Xs.channel);else{const t=this.props.tinode.getMeTopic().getContact(this.state.topic);t&&Ut.Tinode.isP2PTopicName(t.topic)&&(t.online?m=e(Xs.online_now):t.seen&&(m=e(Xs.last_seen)+": "+function(e,t){t=t||window.navigator.userLanguage||window.navigator.language;const a=new Date;return e.getFullYear()==a.getFullYear()?e.getMonth()==a.getMonth()&&e.getDate()==a.getDate()?e.toLocaleTimeString(t,{hour12:!1,hour:"2-digit",minute:"2-digit"}):e.toLocaleDateString(t,{hour12:!1,month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):e.toLocaleDateString(t,{year:"numeric",month:"short",day:"numeric"})}(t.seen.when,this.props.intl.locale)))}const u=this.state.avatar||!0,g=this.state.deleted?null:this.props.online?"online"+(this.state.typingIndicator?" typing":""):"offline",_="panel-title"+(this.state.deleted?" deleted":"");s=t().createElement(t().Fragment,null,t().createElement("div",{id:"topic-caption-panel",className:"caption-panel"},this.props.displayMobile?t().createElement("a",{href:"#",id:"hide-message-view",onClick:e=>{e.preventDefault(),this.props.onHideMessagesView()}},t().createElement("i",{className:"material-icons"},"arrow_back")):null,t().createElement("div",{className:"avatar-box"},t().createElement(ha,{tinode:this.props.tinode,avatar:u,topic:this.state.topic,title:this.state.title,deleted:this.state.deleted}),i?null:t().createElement("span",{className:g})),t().createElement("div",{id:"topic-title-group"},t().createElement("div",{id:"topic-title",className:_},this.state.title||t().createElement("i",null,t().createElement(n.FormattedMessage,{id:"unnamed_topic",defaultMessage:[{type:0,value:"Unnamed"}]})),t().createElement(Xt,{badges:r})),t().createElement("div",{id:"topic-last-seen"},m)),o?t().createElement(Ks,{tinode:this.props.tinode,subscribers:this.state.onlineSubs}):t().createElement("div",{id:"topic-users"}),t().createElement("div",null,t().createElement("a",{href:"#",onClick:this.handleContextClick},t().createElement("i",{className:"material-icons"},"more_vert")))),this.props.displayMobile?t().createElement(as,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,t().createElement(Xa,{show:this.state.fetchingMessages}),t().createElement("div",{id:"messages-container"},t().createElement("button",{className:"action-button"+(this.state.showGoToLastButton?"":" hidden"),onClick:this.goToLatestMessage},t().createElement("i",{className:"material-icons"},"arrow_downward")),t().createElement("div",{id:"messages-panel",ref:this.handleScrollReference},t().createElement("ul",{id:"scroller",className:h},l)),this.state.isReader?null:t().createElement("div",{id:"write-only-background"},this.state.readingBlocked?t().createElement("div",{id:"write-only-note"},t().createElement(n.FormattedMessage,{id:"messages_not_readable",defaultMessage:[{type:0,value:"no access to messages"}]})):null)),this.state.peerMessagingDisabled&&!this.state.unconfirmed?t().createElement("div",{id:"peer-messaging-disabled-note"},t().createElement("i",{className:"material-icons secondary"},"block")," ",t().createElement(n.FormattedMessage,{id:"peers_messaging_disabled",defaultMessage:[{type:0,value:"Peer's messaging is disabled."}]})," ",t().createElement("a",{href:"#",onClick:this.handleEnablePeer},t().createElement(n.FormattedMessage,{id:"enable_peers_messaging",defaultMessage:[{type:0,value:"Enable"}]})),"."):null,this.state.unconfirmed?t().createElement($s,{onAction:this.handleNewChatAcceptance}):t().createElement(Vs,{tinode:this.props.tinode,topicName:this.state.topic,noInput:!!this.props.forwardMessage,disabled:!this.state.isWriter||this.state.deleted,onKeyPress:this.sendKeyPress,onSendMessage:this.sendMessage,onAttachFile:this.props.forwardMessage?null:this.handleAttachFile,onAttachImage:this.props.forwardMessage?null:this.handleAttachImage,onAttachAudio:this.props.forwardMessage?null:this.sendAudioAttachment,onError:this.props.onError,reply:this.state.reply,onQuoteClick:this.handleQuoteClick,onCancelReply:this.handleCancelReply}))}a=t().createElement("div",{id:"topic-view"},s)}else a=t().createElement(Ys,{serverVersion:this.props.serverVersion,serverAddress:this.props.serverAddress});return a}}const si=(0,n.injectIntl)(ai);class ii extends t().PureComponent{render(){return t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onBack()}},t().createElement("i",{className:"material-icons"},"arrow_back"))}}class ni extends t().PureComponent{render(){return t().createElement("div",null,t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onNewTopic()}},t().createElement("i",{className:"material-icons"},"chat"))," ",t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSettings()}},t().createElement("i",{className:"material-icons"},"settings")))}}class oi extends t().PureComponent{render(){return t().createElement("div",null,t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSignUp()}},t().createElement("i",{className:"material-icons"},"person_add"))," ",t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSettings()}},t().createElement("i",{className:"material-icons"},"settings")))}}class ri extends t().PureComponent{render(){const e=[];this.props.trustedBadges&&this.props.trustedBadges.map((t=>{e.push({icon:t,color:"badge-inv"})}));let a=null;return this.props.tinode&&(a=this.props.tinode.authorizeURL(ra(this.props.avatar,"image"))),t().createElement("div",{id:"side-caption-panel",className:"caption-panel"},this.props.onCancel?t().createElement(ii,{onBack:this.props.onCancel}):null,a?t().createElement("div",{id:"self-avatar",className:"avatar-box"},t().createElement(ha,{tinode:this.props.tinode,avatar:a,topic:this.props.myUserId,title:this.props.title})):null,t().createElement("div",{id:"sidepanel-title",className:"panel-title"},this.props.title,t().createElement(Xt,{badges:e})),"login"===this.props.state?t().createElement(oi,{onSignUp:this.props.onSignUp,onSettings:this.props.onSettings}):"contacts"===this.props.state?t().createElement(ni,{onNewTopic:this.props.onNewTopic,onSettings:this.props.onSettings}):null)}}function li(e,t){return e&&e.substring(0,t)}class ci extends t().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();this.state={fullName:li(t.public?t.public.fn:void 0,Kt),description:li(t.public?t.public.note:void 0,Gt),avatar:ga(t.public?t.public.photo:null)}}render(){return t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"flat-button float-right",onClick:e=>{e.preventDefault(),this.props.onNavigate("general")}},t().createElement("i",{className:"material-icons"},"edit")," ",t().createElement(n.FormattedMessage,{id:"button_edit",defaultMessage:[{type:0,value:"Edit"}]})),t().createElement("center",null,t().createElement(Za,{tinode:this.props.tinode,avatar:this.state.avatar,readOnly:!0,uid:this.props.myUserId,title:this.state.fullName})),t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_your_name",defaultMessage:[{type:0,value:"Your name"}]})),t().createElement("div",{className:"large ellipsized"},this.state.fullName)),t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_user_id",defaultMessage:[{type:0,value:"ID:"}]}))," ",t().createElement("tt",null,this.props.myUserId)),t().createElement("div",{className:"group"},t().createElement(Ya,{trustedBadges:this.props.trustedBadges})),this.state.description?t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]})),t().createElement("div",null,this.state.description)):null),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("notif")}},t().createElement("i",{className:"material-icons"},"notifications")," ",t().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_notifications",defaultMessage:[{type:0,value:"Notifications"}]})),t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("security")}},t().createElement("i",{className:"material-icons"},"security")," ",t().createElement(n.FormattedMessage,{id:"button_security",defaultMessage:[{type:0,value:"Security"}]})),t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("support")}},t().createElement("i",{className:"material-icons"},"contact_support")," ",t().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_support",defaultMessage:[{type:0,value:"Support"}]}))))}}const di=(0,n.defineMessages)({archived_contacts_title:{id:"archived_contacts",defaultMessage:[{type:0,value:"Archived contacts ("},{type:1,value:"count"},{type:0,value:")"}]}});class hi extends t().Component{constructor(e){super(e),this.handleAction=this.handleAction.bind(this),this.state=hi.deriveStateFromProps(e)}static deriveStateFromProps(e){const t=[];let a=0,s=0;return e.chatList.map((i=>{const n=i.acs&&!i.acs.isJoiner();n&&e.blocked&&t.push(i),n||e.blocked||(i.private&&i.private.arch?e.archive?t.push(i):s++:e.archive||(t.push(i),a+=i.unread>0?1:0))})),t.sort(((e,t)=>(t.touched||0)-(e.touched||0))),s>0&&t.push({action:"archive",title:di.archived_contacts_title,values:{count:s}}),{contactList:t,unreadThreads:a}}componentDidUpdate(e,t){if(e.chatList!=this.props.chatList||e.archive!=this.props.archive||e.blocked!=this.props.blocked){const e=hi.deriveStateFromProps(this.props);this.setState(e),e.unreadThreads!=t.unreadThreads&&sa(e.unreadThreads)}}handleAction(e){this.props.onShowArchive()}render(){return t().createElement(n.FormattedMessage,{id:"contacts_not_found",defaultMessage:[{type:0,value:"You have no chats"},{type:0,value:"
"},{type:0,value:"¯∖_(ツ)_/¯"}]},(e=>t().createElement(Ha,{tinode:this.props.tinode,connected:this.props.connected,contacts:this.state.contactList,emptyListMessage:e,topicSelected:this.props.topicSelected,myUserId:this.props.myUserId,showOnline:!0,showUnread:!0,onTopicSelected:this.props.onTopicSelected,showContextMenu:this.props.showContextMenu,onAction:this.handleAction})))}}class pi{static setObject(e,t){localStorage.setItem(e,JSON.stringify(t))}static getObject(e){const t=localStorage.getItem(e);return t&&JSON.parse(t)}static updateObject(e,t){const a=this.getObject(e);this.setObject(e,Object.assign(a||{},t))}static removeItem(e){localStorage.removeItem(e)}}class mi extends t().PureComponent{constructor(e){super(e),this.state={login:"",password:"",email:"",fn:"",imageDataUrl:null,errorCleared:!1,saveToken:pi.getObject("keep-logged-in")},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handleFnChange=this.handleFnChange.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e})}handleEmailChange(e){this.setState({email:e.target.value})}handleFnChange(e){this.setState({fn:e.target.value})}handleImageChanged(e){this.setState({imageDataUrl:e})}handleToggleSaveToken(){pi.setObject("keep-logged-in",!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.setState({errorCleared:!1}),this.props.onCreateAccount(this.state.login.trim(),this.state.password.trim(),ia(this.state.fn.trim().substring(0,Kt),this.state.imageDataUrl),{meth:"email",val:this.state.email})}render(){let e="primary";return this.props.disabled&&(e+=" disabled"),t().createElement("form",{className:"panel-form-column",onSubmit:this.handleSubmit},t().createElement("div",{className:"panel-form-row"},t().createElement("div",{className:"panel-form-column"},t().createElement(n.FormattedMessage,{id:"login_prompt",defaultMessage:[{type:0,value:"Login"}]},(e=>t().createElement("input",{type:"text",placeholder:e,autoComplete:"user-name",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),t().createElement(n.FormattedMessage,{id:"password_prompt",defaultMessage:[{type:0,value:"Password"}]},(e=>t().createElement(ms,{placeholder:e,autoComplete:"new-password",value:this.state.password,onFinished:this.handlePasswordChange,required:!0})))),t().createElement(Za,{tinode:this.props.tinode,onImageChanged:this.handleImageChanged,onError:this.props.onError})),t().createElement("div",{className:"panel-form-row"},t().createElement(n.FormattedMessage,{id:"full_name_prompt",defaultMessage:[{type:0,value:"Full name, e.g. John Doe"}]},(e=>t().createElement("input",{type:"text",placeholder:e,autoComplete:"name",value:this.state.fn,onChange:this.handleFnChange,required:!0})))),t().createElement("div",{className:"panel-form-row"},t().createElement(n.FormattedMessage,{id:"email_prompt",defaultMessage:[{type:0,value:"Email, e.g. jdoe@example.com"}]},(e=>t().createElement("input",{type:"email",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0})))),t().createElement("div",{className:"panel-form-row"},t().createElement(es,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),t().createElement(n.FormattedMessage,{id:"stay_logged_in",defaultMessage:[{type:0,value:"Stay logged in"}]},(e=>t().createElement("label",{htmlFor:"save-token"}," ",e)))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:e,type:"submit"},t().createElement(n.FormattedMessage,{id:"button_sign_up",defaultMessage:[{type:0,value:"Sign up"}]}))))}}class ui extends t().PureComponent{constructor(e){super(e),this.handleCheckboxClick=this.handleCheckboxClick.bind(this)}handleCheckboxClick(e,t){"sound"==e?this.props.onToggleMessageSounds(t):"alert"==e?this.props.onTogglePushNotifications(t):"incognito"==e&&this.props.onToggleIncognitoMode(t)}render(){return t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{htmlFor:"message-sound"},t().createElement(n.FormattedMessage,{id:"label_message_sound",defaultMessage:[{type:0,value:"Message sound:"}]})),t().createElement(es,{name:"sound",id:"message-sound",checked:this.props.messageSounds,onChange:this.handleCheckboxClick})),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{htmlFor:"desktop-alerts"},this.props.desktopAlertsEnabled?t().createElement(n.FormattedMessage,{id:"label_push_notifications",defaultMessage:[{type:0,value:"Notification alerts:"}]}):t().createElement(n.FormattedMessage,{id:"label_push_notifications_disabled",defaultMessage:[{type:0,value:"Notification alerts (requires HTTPS):"}]})),t().createElement(es,{name:"alert",id:"desktop-alerts",checked:this.props.desktopAlerts,onChange:this.props.desktopAlertsEnabled?this.handleCheckboxClick:null})),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{htmlFor:"incognito-mode"},t().createElement(n.FormattedMessage,{id:"label_incognito_mode",defaultMessage:[{type:0,value:"Incognito mode:"}]})),t().createElement(es,{name:"incognito",id:"incognito-mode",checked:this.props.incognitoMode,onChange:this.handleCheckboxClick})))}}const gi=(0,n.defineMessages)({delete_account:{id:"delete_account",defaultMessage:[{type:0,value:"Delete account"}]},delete_account_warning:{id:"delete_account_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete your account? It cannot be undone."}]}});class _i extends t().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();let a=0;t.contacts((e=>{e.acs&&!e.acs.isJoiner()&&a++}));const s=t.getDefaultAccess();this.state={auth:s?s.auth:null,anon:s?s.anon:null,showPermissionEditorFor:void 0,blockedCount:a},this.handlePasswordUpdate=this.handlePasswordUpdate.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleHidePermissionsEditor=this.handleHidePermissionsEditor.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this)}handlePasswordUpdate(e){this.setState({password:e}),this.props.onUpdatePassword(e)}handleLaunchPermissionsEditor(e){this.setState({showPermissionEditorFor:e,editedPermissions:this.state[e]})}handleHidePermissionsEditor(){this.setState({showPermissionEditorFor:void 0})}handlePermissionsChanged(e){let t={};t[this.state.showPermissionEditorFor]=e,this.props.onUpdateAccountDesc("me",void 0,void 0,t);let a={showPermissionEditorFor:void 0};a[this.state.showPermissionEditorFor]=e,this.setState(a)}handleDeleteAccount(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(gi.delete_account),t(gi.delete_account_warning),(()=>{this.props.onDeleteAccount()}),null,!0,null)}render(){return t().createElement(t().Fragment,null,this.state.showPermissionEditorFor?t().createElement(ds,{mode:this.state.editedPermissions,skip:"O",onSubmit:this.handlePermissionsChanged,onCancel:this.handleHidePermissionsEditor}):t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_password",defaultMessage:[{type:0,value:"Password"}]})),t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"password_unchanged_prompt",defaultMessage:[{type:0,value:"Unchanged"}]},(e=>t().createElement(us,{placeholder:e,type:"password",onFinished:this.handlePasswordUpdate}))))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"danger flat-button",onClick:e=>{e.preventDefault(),this.props.onLogout()}},t().createElement("i",{className:"material-icons"},"exit_to_app"),"  ",t().createElement(n.FormattedMessage,{id:"button_logout",defaultMessage:[{type:0,value:"Logout"}]})),t().createElement("a",{href:"#",className:"danger flat-button",onClick:e=>{this.handleDeleteAccount(e)}},t().createElement("i",{className:"material-icons"},"delete"),"  ",t().createElement(n.FormattedMessage,{id:"button_delete_account",defaultMessage:[{type:0,value:"Delete account"}]}))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_default_access_mode",defaultMessage:[{type:0,value:"Default access mode:"}]}))),t().createElement("div",{className:"quoted"},t().createElement("div",null,"Auth: ",t().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"auth")},this.state.auth)),t().createElement("div",null,"Anon: ",t().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"anon")},this.state.anon)))),this.state.blockedCount>0?t().createElement(t().Fragment,null,t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("i",{className:"material-icons"},"block")," ",t().createElement("a",{href:"#",className:"gray",onClick:e=>{e.preventDefault(),this.props.onShowBlocked()}},t().createElement(n.FormattedMessage,{id:"blocked_contacts_link",defaultMessage:[{type:0,value:"Blocked contacts ("},{type:1,value:"count"},{type:0,value:")"}],values:{count:this.state.blockedCount}})))):null))}}const fi=(0,n.injectIntl)(_i);class bi extends t().PureComponent{render(){return t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"mailto:support@tinode.co",className:"flat-button",target:"_blank"},t().createElement("i",{className:"material-icons"},"email"),"  ",t().createElement(n.FormattedMessage,{id:"link_contact_us",defaultMessage:[{type:0,value:"Contact Us"}]})),t().createElement("a",{href:"https://tinode.co/terms.html",className:"flat-button",target:"_blank"},t().createElement("i",{className:"material-icons"},"description"),"  ",t().createElement(n.FormattedMessage,{id:"link_terms_of_service",defaultMessage:[{type:0,value:"Terms of Service"}]})),t().createElement("a",{href:"https://tinode.co/privacy.html",className:"flat-button",target:"_blank"},t().createElement("i",{className:"material-icons"},"policy"),"  ",t().createElement(n.FormattedMessage,{id:"link_privacy_policy",defaultMessage:[{type:0,value:"Privacy Policy"}]}))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_client",defaultMessage:[{type:0,value:"Client:"}]})),xt),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_sdk",defaultMessage:[{type:0,value:"SDK:"}]})),Ut.Tinode.getLibrary()),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_server",defaultMessage:[{type:0,value:"Server:"}]})),this.props.serverVersion),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_server_address",defaultMessage:[{type:0,value:"Server address:"}]})),this.props.serverAddress)))}}class vi extends t().Component{constructor(e){super(e),this.state={login:e.login,password:"",hostName:e.serverAddress,saveToken:e.persist},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}handleToggleSaveToken(){this.props.onPersistenceChange(!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.props.onLogin(this.state.login.trim(),this.state.password.trim())}render(){let e="primary";return this.props.disabled&&(e+=" disabled"),t().createElement("form",{id:"login-form",onSubmit:this.handleSubmit},t().createElement(n.FormattedMessage,{id:"login_prompt",defaultMessage:[{type:0,value:"Login"}]},(e=>t().createElement("input",{type:"text",id:"inputLogin",placeholder:e,autoComplete:"username",autoCorrect:"off",autoCapitalize:"none",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),t().createElement(n.FormattedMessage,{id:"password_prompt",defaultMessage:[{type:0,value:"Password"}]},(e=>t().createElement(ms,{type:"password",id:"inputPassword",placeholder:e,autoComplete:"current-password",value:this.state.password,onChange:this.handlePasswordChange,required:!0}))),t().createElement("div",{className:"panel-form-row"},t().createElement(es,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),t().createElement("label",{htmlFor:"save-token"}," ",t().createElement(n.FormattedMessage,{id:"stay_logged_in",defaultMessage:[{type:0,value:"Stay logged in"}]})),t().createElement("a",{href:"#reset"},t().createElement(n.FormattedMessage,{id:"forgot_password_link",defaultMessage:[{type:0,value:"Forgot password?"}]}))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:e,type:"submit"},t().createElement(n.FormattedMessage,{id:"button_sign_in",defaultMessage:[{type:0,value:"Sign in"}]}))))}}const yi=(0,n.defineMessages)({invalid_id:{id:"error_invalid_id",defaultMessage:[{type:0,value:"Invalid ID"}]}});class wi extends t().PureComponent{constructor(e){super(e),this.state={groupId:""},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleChange(e){this.setState({groupId:e.target.value})}handleKeyPress(e){"Enter"===e.key&&this.handleSubmit(e)}handleSubmit(e){if(e.preventDefault(),this.state.groupId){const e=this.state.groupId.trim(),t=e.substr(0,3);e.length>3&&["usr","grp","chn"].includes(t)?this.props.onSubmit(e):this.props.onError(this.props.intl.formatMessage(yi.invalid_id),"err")}}render(){return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement(n.FormattedMessage,{id:"group_user_id_prompt",defaultMessage:[{type:0,value:"Group or User ID"}]},(e=>t().createElement("input",{type:"text",placeholder:e,value:this.state.groupId,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0,autoFocus:!0})))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(n.FormattedMessage,{id:"button_subscribe",defaultMessage:[{type:0,value:"Subscribe"}]}))))}}const Ei=(0,n.injectIntl)(wi);class Ci extends t().PureComponent{constructor(e){super(e),this.fullName=t().createRef(),this.state={fullName:"",private:"",description:"",imageDataUrl:null,tags:[],isChannel:!1},this.handleFieldEdit=this.handleFieldEdit.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleTagsChanged=this.handleTagsChanged.bind(this),this.handleChannelToggle=this.handleChannelToggle.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}componentDidMount(){}handleFieldEdit(e,t){this.setState({[e]:t.target.value||""})}handleImageChanged(e){this.setState({imageDataUrl:e})}handleTagsChanged(e){this.setState({tags:e})}handleChannelToggle(){this.setState({isChannel:!this.state.isChannel})}handleSubmit(e){e.preventDefault();const t=this.state.fullName.trim().substring(0,Kt),a=this.state.private.trim().substring(0,Kt),s=this.state.description.trim().substring(0,Gt);t&&this.props.onSubmit(t,s,this.state.imageDataUrl,a,this.state.tags,this.state.isChannel)}render(){let e="primary";return this.props.disabled&&(e+=" disabled"),t().createElement("form",{className:"panel-form",onSubmit:this.handleSubmit},t().createElement("div",{className:"panel-form-column"},t().createElement("center",null,t().createElement(Za,{tinode:this.props.tinode,onError:this.props.onError,onImageChanged:this.handleImageChanged})),t().createElement("div",{className:"group"},t().createElement("label",{className:"small",htmlFor:"new-topic-fn"},t().createElement(n.FormattedMessage,{id:"label_topic_name",defaultMessage:[{type:0,value:"Name"}]})),t().createElement(n.FormattedMessage,{id:"topic_name_editing_placeholder",defaultMessage:[{type:0,value:"Freeform name of the group"}]},(e=>t().createElement("input",{type:"text",id:"new-topic-fn",placeholder:e,ref:this.fullName,value:this.state.fullName,onChange:this.handleFieldEdit.bind(this,"fullName"),autoFocus:!0,required:!0,tabIndex:0})))),t().createElement("div",{className:"group"},t().createElement("label",{className:"small",htmlFor:"new-topic-priv"},t().createElement(n.FormattedMessage,{id:"label_private",defaultMessage:[{type:0,value:"Private comment"}]})),t().createElement(n.FormattedMessage,{id:"private_editing_placeholder",defaultMessage:[{type:0,value:"Visible to you only"}]},(e=>t().createElement("input",{type:"text",id:"new-topic-priv",placeholder:e,value:this.state.private,onChange:this.handleFieldEdit.bind(this,"private"),tabIndex:1})))),t().createElement("div",{className:"group"},t().createElement("label",{className:"small",htmlFor:"new-topic-desc"},t().createElement(n.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]})),t().createElement(n.FormattedMessage,{id:"description_editing_placeholder",defaultMessage:[{type:0,value:"Description (optional)"}]},(e=>t().createElement("input",{type:"text",id:"new-topic-desc",placeholder:e,value:this.state.description,onChange:this.handleFieldEdit.bind(this,"description"),tabIndex:2}))))),t().createElement("div",{className:"panel-form-row"},t().createElement(es,{checked:this.state.isChannel,tabIndex:3,onChange:this.handleChannelToggle})," ",t().createElement("label",{onClick:this.handleChannelToggle},t().createElement(n.FormattedMessage,{id:"channel_prompt",defaultMessage:[{type:0,value:"This is a channel"}]}))),t().createElement(n.FormattedMessage,{id:"title_tag_manager",defaultMessage:[{type:0,value:"Tags (search & discovery)"}]},(e=>t().createElement(gs,{tinode:this.props.tinode,tags:this.state.tags,activated:!0,onTagsChanged:this.handleTagsChanged,tabIndex:4,title:e}))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:e},t().createElement(n.FormattedMessage,{id:"button_create",defaultMessage:[{type:0,value:"Create"}]}))))}}const Si=(0,n.defineMessages)({search_for_contacts:{id:"search_for_contacts",defaultMessage:[{type:0,value:"Use search to find contacts"}]},search_no_results:{id:"search_no_results",defaultMessage:[{type:0,value:"Search returned no results"}]},search_placeholder:{id:"search_placeholder",defaultMessage:[{type:0,value:"List like email:alice@example.com, tel:17025550003..."}]}});class Mi extends t().Component{constructor(e){super(e),this.state={tabSelected:"find",searchQuery:null},this.handleTabClick=this.handleTabClick.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleSearchResultSelected=this.handleSearchResultSelected.bind(this),this.handleNewGroupSubmit=this.handleNewGroupSubmit.bind(this),this.handleGroupByID=this.handleGroupByID.bind(this)}componentDidMount(){this.props.onInitFind()}handleTabClick(e){e.preventDefault(),Js.navigateTo(Js.addUrlParam(window.location.hash,"tab",e.currentTarget.dataset.id)),this.setState({tabSelected:e.currentTarget.dataset.id})}handleSearchContacts(e){this.props.onSearchContacts(e),this.setState({searchQuery:Ut.Tinode.isNullValue(e)?null:e})}handleSearchResultSelected(e){"find"==this.state.tabSelected&&(Js.navigateTo(Js.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e))}handleNewGroupSubmit(e,t,a,s,i,n){Js.navigateTo(Js.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(void 0,{public:ia(e,a,null,t),private:s,tags:i},n)}handleGroupByID(e){Js.navigateTo(Js.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e)}render(){const{formatMessage:e}=this.props.intl,a=e(this.state.searchQuery?Si.search_no_results:Si.search_for_contacts),s=e(Si.search_placeholder);return t().createElement("div",{className:"flex-column"},t().createElement("ul",{className:"tabbar"},t().createElement("li",{className:"find"===this.state.tabSelected?"active":null},t().createElement("a",{href:"#","data-id":"find",onClick:this.handleTabClick},t().createElement(n.FormattedMessage,{id:"tabtitle_find_user",defaultMessage:[{type:0,value:"find"}]}))),t().createElement("li",{className:"grp"===this.state.tabSelected?"active":null},t().createElement("a",{href:"#","data-id":"grp",onClick:this.handleTabClick},t().createElement(n.FormattedMessage,{id:"tabtitle_new_group",defaultMessage:[{type:0,value:"new group"}]}))),t().createElement("li",{className:"byid"===this.state.tabSelected?"active":null},t().createElement("a",{href:"#","data-id":"byid",onClick:this.handleTabClick},t().createElement(n.FormattedMessage,{id:"tabtitle_group_by_id",defaultMessage:[{type:0,value:"by id"}]})))),"grp"===this.state.tabSelected?t().createElement(Ci,{tinode:this.props.tinode,onSubmit:this.handleNewGroupSubmit}):"byid"===this.state.tabSelected?t().createElement(Ei,{onSubmit:this.handleGroupByID,onError:this.props.onError}):t().createElement("div",{className:"flex-column"},t().createElement(Va,{placeholder:s,onSearchContacts:this.handleSearchContacts}),t().createElement(Ha,{tinode:this.props.tinode,contacts:this.props.searchResults,myUserId:this.props.myUserId,emptyListMessage:a,showOnline:!1,showUnread:!1,showContextMenu:!1,onTopicSelected:this.handleSearchResultSelected})))}}const ki=(0,n.injectIntl)(Mi);class Ti extends t().PureComponent{constructor(e){super(e),this.state={email:"",password:"",sent:!1},this.handleSubmit=this.handleSubmit.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this)}componentDidMount(){const e=Js.parseUrlHash(window.location.hash);this.setState({token:e.params.token,scheme:e.params.scheme})}handleSubmit(e){if(e.preventDefault(),this.state.token)this.props.onReset(this.state.scheme,this.state.password.trim(),this.state.token);else if(this.state.sent)this.props.onCancel();else{const e=this.state.email.trim();this.setState({email:e}),this.props.onRequest("email",e).then((()=>{this.setState({sent:!0})}))}}handleEmailChange(e){this.setState({email:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}render(){return t().createElement("form",{id:"password-reset-form",onSubmit:this.handleSubmit},this.state.token&&this.state.scheme?t().createElement(t().Fragment,null,t().createElement("label",{htmlFor:"new-password"},t().createElement(n.FormattedMessage,{id:"label_new_password",defaultMessage:[{type:0,value:"New password"}]})),t().createElement(n.FormattedMessage,{id:"new_password_placeholder",defaultMessage:[{type:0,value:"Enter new password"}]},(e=>t().createElement(ms,{id:"new-password",placeholder:e,autoComplete:"new-password",value:this.state.password,required:!0,autoFocus:!0,onChange:this.handlePasswordChange})))):this.state.sent?t().createElement(t().Fragment,null,t().createElement("br",null),t().createElement("center",null,t().createElement("i",{className:"material-icons huge green"},"task_alt")),t().createElement("br",null),t().createElement("center",null,t().createElement(n.FormattedMessage,{id:"password_reset_email_sent",defaultMessage:[{type:0,value:"An email has been sent to "},{type:1,value:"email"},{type:0,value:". Follow the directions in the email to reset your password."}],values:{email:t().createElement("tt",null,this.state.email)}}))):t().createElement(t().Fragment,null,t().createElement("label",{htmlFor:"inputEmail"},t().createElement(n.FormattedMessage,{id:"label_reset_password",defaultMessage:[{type:0,value:"Send a password reset email:"}]})),t().createElement(n.FormattedMessage,{id:"credential_email_prompt",defaultMessage:[{type:0,value:"Your registration email"}]},(e=>t().createElement("input",{type:"email",id:"inputEmail",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0,autoFocus:!0})))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:"primary",type:"submit"},this.state.token&&this.state.scheme?t().createElement(n.FormattedMessage,{id:"button_reset",defaultMessage:[{type:0,value:"Reset"}]}):this.state.sent?t().createElement(n.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}):t().createElement(n.FormattedMessage,{id:"button_send_request",defaultMessage:[{type:0,value:"Send request"}]}))))}}class Ni extends t().PureComponent{constructor(e){super(e),this.state={hostName:e.serverAddress,changed:!1},this.handleHostNameChange=this.handleHostNameChange.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this)}handleHostNameChange(e){this.setState({hostName:e.target.value,changed:!0})}handleEditingFinished(){this.state.changed&&(this.setState({changed:!1}),this.props.onServerAddressChange(this.state.hostName.trim()))}render(){var e=[];for(let a in Bt){let s=Bt[a];e.push(t().createElement("option",{key:s,value:s}))}return t().createElement("div",{className:"panel-form-row"},t().createElement("input",{type:"search",id:"host-name",placeholder:this.props.hostName,list:"known-hosts",className:"quoted",value:this.state.hostName,onChange:this.handleHostNameChange,onBlur:this.handleEditingFinished,required:!0}),t().createElement("datalist",{id:"known-hosts"},e))}}class Ai extends t().PureComponent{constructor(e){super(e),this.state={transport:e.transport||"def",serverAddress:e.serverAddress},this.handleSubmit=this.handleSubmit.bind(this),this.handleTransportSelected=this.handleTransportSelected.bind(this),this.handleServerAddressChange=this.handleServerAddressChange.bind(this)}handleSubmit(e){e.preventDefault(),this.props.onUpdate({transport:this.state.transport,serverAddress:this.state.serverAddress})}handleTransportSelected(e){this.setState({transport:e.currentTarget.value})}handleServerAddressChange(e){this.setState({serverAddress:e})}render(){const e={def:"default",ws:"websocket",lp:"long polling"},a=[];return["def","ws","lp"].map((s=>{const i="transport-"+s,n=e[s];a.push(t().createElement("li",{key:s},t().createElement("input",{type:"radio",id:i,name:"transport-select",value:s,checked:this.state.transport===s,onChange:this.handleTransportSelected}),t().createElement("label",{htmlFor:i},n)))})),t().createElement("form",{id:"settings-form",className:"panel-form",onSubmit:this.handleSubmit},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_server_to_use",defaultMessage:[{type:0,value:"Server to use:"}]}))),t().createElement(Ni,{serverAddress:this.state.serverAddress,onServerAddressChange:this.handleServerAddressChange}),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_wire_transport",defaultMessage:[{type:0,value:"Wire transport:"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement("ul",{className:"quoted"},a)),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{type:"submit",className:"primary"},t().createElement(n.FormattedMessage,{id:"button_update",defaultMessage:[{type:0,value:"Update"}]}))))}}const Di=(0,n.defineMessages)({phone:{id:"phone_dative",defaultMessage:[{type:0,value:"phone"}]},email:{id:"email_dative",defaultMessage:[{type:0,value:"email"}]}});class Pi extends t().PureComponent{constructor(e){super(e),this.state={code:e.credCode||""},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}handleChange(e){this.setState({code:e.target.value})}handleKeyPress(e){"Enter"===e.key?this.handleSubmit(e):"Escape"==e.key&&this.handleCancel(e)}handleSubmit(e){e.preventDefault(),this.state.code&&this.state.code.trim()&&this.props.onSubmit(this.props.credMethod,this.state.code.trim())}handleCancel(e){e.preventDefault(),this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl;let a={email:e(Di.email),tel:e(Di.phone)}[this.props.credMethod]||this.props.credMethod;return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small",htmlFor:"enter-confirmation-code"},t().createElement(n.FormattedMessage,{id:"enter_confirmation_code_prompt",defaultMessage:[{type:0,value:"Enter confirmation code sent to you by "},{type:1,value:"method"},{type:0,value:":"}],values:{method:a}}))),t().createElement("div",{className:"panel-form-row"},t().createElement(n.FormattedMessage,{id:"numeric_confirmation_code_prompt",defaultMessage:[{type:0,value:"Numbers only"}]},(e=>t().createElement("input",{type:"text",id:"enter-confirmation-code",placeholder:e,value:this.state.code,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0})))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:"secondary",onClick:this.handleCancel},t().createElement(n.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(n.FormattedMessage,{id:"button_confirm",defaultMessage:[{type:0,value:"Confirm"}]}))))}}const Ii=(0,n.injectIntl)(Pi),Ui=(0,n.defineMessages)({login:{id:"sidepanel_title_login",defaultMessage:[{type:0,value:"Sign In"}]},register:{id:"sidepanel_title_register",defaultMessage:[{type:0,value:"Create Account"}]},settings:{id:"sidepanel_title_settings",defaultMessage:[{type:0,value:"Settings"}]},edit:{id:"sidepanel_title_account_settings",defaultMessage:[{type:0,value:"Account Settings"}]},general:{id:"panel_title_general",defaultMessage:[{type:0,value:"General"}]},security:{id:"panel_title_security",defaultMessage:[{type:0,value:"Security"}]},crop:{id:"panel_title_crop",defaultMessage:[{type:0,value:"Drag to Adjust"}]},notif:{id:"sidepanel_title_acc_notifications",defaultMessage:[{type:0,value:"Notifications"}]},support:{id:"sidepanel_title_acc_support",defaultMessage:[{type:0,value:"Support"}]},newtpk:{id:"sidepanel_title_newtpk",defaultMessage:[{type:0,value:"Start New Chat"}]},cred:{id:"sidepanel_title_cred",defaultMessage:[{type:0,value:"Confirm Credentials"}]},reset:{id:"sidepanel_title_reset",defaultMessage:[{type:0,value:"Reset Password"}]},archive:{id:"sidepanel_title_archive",defaultMessage:[{type:0,value:"Archived Chats"}]},blocked:{id:"sidepanel_title_blocked",defaultMessage:[{type:0,value:"Blocked Chats"}]}});class Ri extends t().Component{constructor(e){super(e),this.handleNewTopic=this.handleNewTopic.bind(this)}handleNewTopic(){this.props.onNavigate("newtpk")}render(){const{formatMessage:e}=this.props.intl,a=this.props.state||(this.props.myUserId?"contacts":"login");let s,i,n,o;return"contacts"==a?(s=this.props.title,i=!this.props.avatar||this.props.avatar,n=this.props.trustedBadges):(s=e(Ui[a]),i=!1,n=null),-1==["login","contacts"].indexOf(a)&&(o=this.props.onCancel),t().createElement("div",{id:"sidepanel",className:this.props.hideSelf?"nodisplay":null},t().createElement(ri,{state:a,title:s,avatar:i,tinode:this.props.tinode,trustedBadges:n,myUserId:this.props.myUserId,onSignUp:this.props.onSignUp,onSettings:this.props.onSettings,onNewTopic:this.handleNewTopic,onCancel:o}),t().createElement(as,{level:this.props.errorLevel,text:this.props.errorText,action:this.props.errorAction,actionText:this.props.errorActionText,onClearError:this.props.onError}),t().createElement(Xa,{show:this.props.loadSpinnerVisible}),"login"===a?t().createElement(vi,{login:this.props.login,disabled:this.props.loginDisabled,persist:this.props.persist,onLogin:this.props.onLoginRequest,onPersistenceChange:this.props.onPersistenceChange}):"register"===a?t().createElement(mi,{tinode:this.props.tinode,onCreateAccount:this.props.onCreateAccount,onCancel:this.props.onCancel,onError:this.props.onError}):"settings"===a?t().createElement(Ai,{transport:this.props.transport,serverAddress:this.props.serverAddress,onCancel:this.props.onCancel,onUpdate:this.props.onGlobalSettings}):"edit"===a?t().createElement(ci,{tinode:this.props.tinode,myUserId:this.props.myUserId,trustedBadges:this.props.trustedBadges,onNavigate:this.props.onNavigate}):"general"===a||"crop"===a?t().createElement(fs,{topic:"me",tinode:this.props.tinode,myUserId:this.props.myUserId,onUpdateTopicDesc:this.props.onUpdateAccountDesc,onUpdateTags:this.props.onUpdateAccountTags,onCredAdd:this.props.onCredAdd,onCredDelete:this.props.onCredDelete,onCredConfirm:this.props.onCredConfirm,onError:this.props.onError}):"notif"===a?t().createElement(ui,{messageSounds:this.props.messageSounds,desktopAlerts:this.props.desktopAlerts,desktopAlertsEnabled:this.props.desktopAlertsEnabled,incognitoMode:this.props.incognitoMode,onTogglePushNotifications:this.props.onTogglePushNotifications,onToggleMessageSounds:this.props.onToggleMessageSounds,onToggleIncognitoMode:this.props.onToggleIncognitoMode}):"security"===a?t().createElement(fi,{tinode:this.props.tinode,onUpdateAccountDesc:this.props.onUpdateAccountDesc,onUpdatePassword:this.props.onUpdatePassword,onLogout:this.props.onLogout,onDeleteAccount:this.props.onDeleteAccount,onShowAlert:this.props.onShowAlert,onShowBlocked:this.props.onShowBlocked}):"support"===a?t().createElement(bi,{serverAddress:this.props.serverAddress,serverVersion:this.props.serverVersion}):"contacts"===a||"archive"==a||"blocked"==a?t().createElement(hi,{tinode:this.props.tinode,myUserId:this.props.myUserId,connected:this.props.connected,topicSelected:this.props.topicSelected,archive:"archive"==a,blocked:"blocked"==a,chatList:this.props.chatList,showContextMenu:this.props.showContextMenu,onTopicSelected:this.props.onTopicSelected,onShowArchive:this.props.onShowArchive}):"newtpk"===a?t().createElement(ki,{tinode:this.props.tinode,searchResults:this.props.searchResults,onInitFind:this.props.onInitFind,onSearchContacts:this.props.onSearchContacts,onCreateTopic:this.props.onCreateTopic,onError:this.props.onError}):"cred"===a?t().createElement(Ii,{credCode:this.props.credCode,credMethod:this.props.credMethod,onSubmit:this.props.onValidateCredentials,onCancel:this.props.onCancel,onError:this.props.onError}):"reset"===a?t().createElement(Ti,{onRequest:this.props.onPasswordResetRequest,onReset:this.props.onResetPassword,onCancel:this.props.onCancel}):null)}}const Fi=(0,n.injectIntl)(Ri);function xi(){let e=Lt;return"object"==typeof window.location&&("file:"==window.location.protocol||"localhost"==window.location.hostname?e=Bt.local:window.location.hostname&&(e=window.location.hostname+(window.location.port?":"+window.location.port:""))),e}function Bi(){return"object"==typeof window.location&&"https:"==window.location.protocol}const Li=new Audio("audio/msg.m4a"),Oi=(0,n.defineMessages)({reconnect_countdown:{id:"reconnect_countdown",defaultMessage:[{type:0,value:"Disconnected. Reconnecting in "},{type:1,value:"seconds"},{type:0,value:"…"}]},reconnect_now:{id:"reconnect_now",defaultMessage:[{type:0,value:"Try now"}]},push_init_failed:{id:"push_init_failed",defaultMessage:[{type:0,value:"Failed to initialize push notifications"}]},invalid_security_token:{id:"invalid_security_token",defaultMessage:[{type:0,value:"Invalid security token"}]},no_connection:{id:"no_connection",defaultMessage:[{type:0,value:"No connection"}]},code_doesnot_match:{id:"code_doesnot_match",defaultMessage:[{type:0,value:"Code does not match"}]},menu_item_info:{id:"menu_item_info",defaultMessage:[{type:0,value:"Info"}]},menu_item_video_call:{id:"menu_item_video_call",defaultMessage:[{type:0,value:"Video call"}]}});class qi extends t().Component{constructor(e){super(e),this.selfRef=t().createRef(),this.state=this.getBlankState(),this.handleResize=this.handleResize.bind(this),this.handleHashRoute=this.handleHashRoute.bind(this),this.handleOnline=this.handleOnline.bind(this),this.checkForAppUpdate=this.checkForAppUpdate.bind(this),this.handleVisibilityEvent=this.handleVisibilityEvent.bind(this),this.handleError=this.handleError.bind(this),this.handleLoginRequest=this.handleLoginRequest.bind(this),this.handlePersistenceChange=this.handlePersistenceChange.bind(this),this.handleConnected=this.handleConnected.bind(this),this.handleAutoreconnectIteration=this.handleAutoreconnectIteration.bind(this),this.doLogin=this.doLogin.bind(this),this.handleCredentialsRequest=this.handleCredentialsRequest.bind(this),this.handleLoginSuccessful=this.handleLoginSuccessful.bind(this),this.handleDisconnect=this.handleDisconnect.bind(this),this.tnMeMetaDesc=this.tnMeMetaDesc.bind(this),this.tnMeContactUpdate=this.tnMeContactUpdate.bind(this),this.tnMeSubsUpdated=this.tnMeSubsUpdated.bind(this),this.resetContactList=this.resetContactList.bind(this),this.tnData=this.tnData.bind(this),this.tnInitFind=this.tnInitFind.bind(this),this.tnFndSubsUpdated=this.tnFndSubsUpdated.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleTopicSelected=this.handleTopicSelected.bind(this),this.handleHideMessagesView=this.handleHideMessagesView.bind(this),this.handleSendMessage=this.handleSendMessage.bind(this),this.handleNewChatInvitation=this.handleNewChatInvitation.bind(this),this.handleNewAccount=this.handleNewAccount.bind(this),this.handleNewAccountRequest=this.handleNewAccountRequest.bind(this),this.handleUpdatePasswordRequest=this.handleUpdatePasswordRequest.bind(this),this.handleUpdateAccountTagsRequest=this.handleUpdateAccountTagsRequest.bind(this),this.handleToggleIncognitoMode=this.handleToggleIncognitoMode.bind(this),this.handleSettings=this.handleSettings.bind(this),this.handleGlobalSettings=this.handleGlobalSettings.bind(this),this.handleShowArchive=this.handleShowArchive.bind(this),this.handleShowBlocked=this.handleShowBlocked.bind(this),this.handleToggleMessageSounds=this.handleToggleMessageSounds.bind(this),this.handleCredAdd=this.handleCredAdd.bind(this),this.handleCredDelete=this.handleCredDelete.bind(this),this.handleCredConfirm=this.handleCredConfirm.bind(this),this.initFCMessaging=this.initFCMessaging.bind(this),this.toggleFCMToken=this.toggleFCMToken.bind(this),this.handlePushMessage=this.handlePushMessage.bind(this),this.handleSidepanelCancel=this.handleSidepanelCancel.bind(this),this.handleStartTopicRequest=this.handleStartTopicRequest.bind(this),this.handleNewTopicCreated=this.handleNewTopicCreated.bind(this),this.handleTopicUpdateRequest=this.handleTopicUpdateRequest.bind(this),this.handleUnarchive=this.handleUnarchive.bind(this),this.handleChangePermissions=this.handleChangePermissions.bind(this),this.handleTagsUpdateRequest=this.handleTagsUpdateRequest.bind(this),this.handleLogout=this.handleLogout.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this),this.handleDeleteTopicRequest=this.handleDeleteTopicRequest.bind(this),this.handleDeleteMessagesRequest=this.handleDeleteMessagesRequest.bind(this),this.handleLeaveUnsubRequest=this.handleLeaveUnsubRequest.bind(this),this.handleBlockTopicRequest=this.handleBlockTopicRequest.bind(this),this.handleReportTopic=this.handleReportTopic.bind(this),this.handleShowContextMenu=this.handleShowContextMenu.bind(this),this.defaultTopicContextMenu=this.defaultTopicContextMenu.bind(this),this.handleHideContextMenu=this.handleHideContextMenu.bind(this),this.handleShowAlert=this.handleShowAlert.bind(this),this.handleShowInfoView=this.handleShowInfoView.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleValidateCredentialsRequest=this.handleValidateCredentialsRequest.bind(this),this.handlePasswordResetRequest=this.handlePasswordResetRequest.bind(this),this.handleResetPassword=this.handleResetPassword.bind(this),this.handleContextMenuAction=this.handleContextMenuAction.bind(this),this.handleShowForwardDialog=this.handleShowForwardDialog.bind(this),this.handleHideForwardDialog=this.handleHideForwardDialog.bind(this),this.handleStartVideoCall=this.handleStartVideoCall.bind(this),this.handleInfoMessage=this.handleInfoMessage.bind(this),this.handleCallClose=this.handleCallClose.bind(this),this.handleCallInvite=this.handleCallInvite.bind(this),this.handleCallRinging=this.handleCallRinging.bind(this),this.handleCallHangup=this.handleCallHangup.bind(this),this.handleCallSendOffer=this.handleCallSendOffer.bind(this),this.handleCallIceCandidate=this.handleCallIceCandidate.bind(this),this.handleCallSendAnswer=this.handleCallSendAnswer.bind(this),this.handleCallAcceptCall=this.handleCallAcceptCall.bind(this),this.sendMessageToTopic=this.sendMessageToTopic.bind(this)}getBlankState(){const e=pi.getObject("settings")||{},t=!!pi.getObject("keep-logged-in");return{connected:!1,ready:!1,autoLogin:!1,transport:e.transport||null,serverAddress:e.serverAddress||xi(),serverVersion:"no connection",messageSounds:!e.messageSoundsOff,incognitoMode:!1,desktopAlerts:t&&!!e.desktopAlerts,desktopAlertsEnabled:(Bi()||"object"==typeof window.location&&"localhost"==window.location.hostname)&&"undefined"!=typeof navigator&&"undefined"!=typeof FIREBASE_INIT,firebaseToken:t?pi.getObject("firebase-token"):null,applicationVisible:!document.hidden,errorText:"",errorLevel:null,errorAction:void 0,errorActionText:null,sidePanelSelected:"login",sidePanelTitle:null,sidePanelAvatar:null,myTrustedBadges:[],loadSpinnerVisible:!1,login:"",password:"",persist:t,myUserId:null,liveConnection:navigator.onLine,topicSelected:"",topicSelectedOnline:!1,topicSelectedAcs:null,newTopicParams:null,loginDisabled:!1,displayMobile:window.innerWidth<=640,infoPanel:void 0,mobilePanel:"sidepanel",callTopic:void 0,callState:0,callShouldStart:!1,contextMenuVisible:!1,contextMenuBounds:null,contextMenuClickAt:null,contextMenuParams:null,contextMenuItems:[],forwardDialogVisible:!1,forwardMessage:null,alertVisible:!1,alertParams:{},chatList:[],searchResults:[],searchableContacts:[],credMethod:void 0,credCode:void 0,requestedTopic:void 0}}componentDidMount(){if(window.addEventListener("resize",this.handleResize),window.addEventListener("online",(e=>{this.handleOnline(!0)})),window.addEventListener("offline",(e=>{this.handleOnline(!1)})),window.addEventListener("hashchange",this.handleHashRoute),"function"==typeof BroadcastChannel){new BroadcastChannel("tinode-sw").addEventListener("message",this.handlePushMessage)}else console.warn("Your browser does not support BroadcastChannel. Some features will not be available");document.addEventListener("visibilitychange",this.handleVisibilityEvent),this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight}),new Promise(((e,t)=>{this.tinode=qi.tnSetup(this.state.serverAddress,this.state.transport,this.props.intl.locale,this.state.persist,e),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,this.tinode.onInfoMessage=this.handleInfoMessage})).then((()=>{this.state.desktopAlertsEnabled&&this.initFCMessaging().then((()=>{this.state.desktopAlerts&&this.tinode.setDeviceToken(this.state.firebaseToken)})).catch((()=>{}));const e=Js.parseUrlHash(window.location.hash);this.resetContactList();const t=this.state.persist?pi.getObject("auth-token"):void 0;t&&(this.setState({autoLogin:!0}),t.expires=new Date(t.expires),this.tinode.setAuthToken(t),this.tinode.connect().catch((e=>{this.handleError(e.message,"err")}))),["cred","reset","register"].includes(e.path[0])||(this.setState({requestedTopic:e.path[1]}),Js.navigateTo("")),this.readTimer=null,this.readTimerCallback=null,this.handleHashRoute()}))}componentWillUnmount(){window.removeEventListener("resize",this.handleResize),window.removeEventListener("hashchange",this.handleHashRoute),document.removeEventListener("visibilitychange",this.handleVisibilityEvent)}static tnSetup(e,t,a,s,i){const n=new Ut.Tinode({appName:xt,host:e,apiKey:"AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K",transport:t,secure:Bi(),persist:s},i);return n.setHumanLanguage(a),n.enableLogging(true,!0),n}handlePushMessage(e){this.tinode.oobNotification(e.data||{})}initFCMessaging(){const{formatMessage:e,locale:t}=this.props.intl,a=(t,a)=>{console.error(t,a),this.handleError(e(Oi.push_init_failed),"err"),this.setState({desktopAlertsEnabled:!1,firebaseToken:null}),pi.updateObject("settings",{desktopAlerts:!1})};try{return this.fcm=At(Y(FIREBASE_INIT,xt)),navigator.serviceWorker.register("/service-worker.js").then((e=>(this.checkForAppUpdate(e),e.active.postMessage(JSON.stringify({locale:t,version:Ft})),e))).then((e=>qi.requestFCMToken(this.fcm,e))).then((e=>{const t=pi.getObject("keep-logged-in");e!=this.state.firebaseToken&&(this.tinode.setDeviceToken(e),t&&pi.setObject("firebase-token",e)),this.setState({firebaseToken:e,desktopAlerts:!0}),t&&pi.updateObject("settings",{desktopAlerts:!0}),It(this.fcm,(e=>{this.handlePushMessage(e)}))})).catch((e=>{throw a(e),e}))}catch(e){return a(e),Promise.reject(e)}}static requestFCMToken(e,t){return Dt(e,{serviceWorkerRegistration:t,vapidKey:FIREBASE_INIT.messagingVapidKey}).then((t=>t||Notification.requestPermission().then((t=>{if("granted"===t)return Dt(e,{serviceWorkerRegistration:reg,vapidKey:FIREBASE_INIT.messagingVapidKey}).then((e=>{if(e)return e;throw new Error("Failed to initialize notifications")}));throw new Error("No permission to send notifications: "+t)}))))}handleResize(){const e=document.documentElement.clientWidth<=640;this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight}),this.state.displayMobile!=e&&this.setState({displayMobile:e})}checkForAppUpdate(e){e.onupdatefound=()=>{const a=e.installing;a.onstatechange=()=>{if("installed"==a.state&&navigator.serviceWorker.controller){const e=t().createElement(t().Fragment,null,t().createElement(n.FormattedMessage,{id:"update_available",defaultMessage:[{type:0,value:"Update available."}]})," ",t().createElement("a",{href:""},t().createElement(n.FormattedMessage,{id:"reload_update",defaultMessage:[{type:0,value:"Reload"}]})),".");this.handleError(e,"info")}}}}handleHashRoute(){const e=Js.parseUrlHash(window.location.hash);if(e.path&&e.path.length>0){["register","settings","edit","notif","security","support","general","crop","cred","reset","newtpk","archive","blocked","contacts",""].includes(e.path[0])?this.setState({sidePanelSelected:e.path[0]}):console.warn("Unknown sidepanel view",e.path[0]);let t=e.path[1]||null;t!=this.state.topicSelected&&(Ut.Tinode.topicType(t)||(t=null),this.setState({topicSelected:t,topicSelectedAcs:this.tinode.getTopicAccessMode(t)}))}else this.setState({sidePanelSelected:"",topicSelected:null});e.params.method&&this.setState({credMethod:e.params.method}),e.params.code&&this.setState({credCode:e.params.code}),this.setState({infoPanel:e.params.info,newTopicTabSelected:e.params.tab})}handleOnline(e){e?(this.handleError(),clearInterval(this.reconnectCountdown),this.tinode.reconnect()):this.handleError(this.props.intl.formatMessage(Oi.no_connection),"warn"),this.setState({liveConnection:e})}handleVisibilityEvent(){this.setState({applicationVisible:!document.hidden})}handleError(e,t,a,s){this.setState({errorText:e,errorLevel:t,errorAction:a,errorActionText:s,callShouldStart:!1})}handleLoginRequest(e,t){this.setState({loginDisabled:!0,login:e,password:t,loadSpinnerVisible:!0,autoLogin:!0}),this.handleError("",null),this.tinode.isConnected()?this.doLogin(e,t,{meth:this.state.credMethod,resp:this.state.credCode}):this.tinode.connect().catch((e=>{this.setState({loginDisabled:!1,autoLogin:!1,loadSpinnerVisible:!1}),this.handleError(e.message,"err")}))}handlePersistenceChange(e){e?this.tinode.initStorage().then((()=>{pi.setObject("keep-logged-in",!0),this.setState({persist:!0})})):this.tinode.clearStorage().then((()=>{pi.setObject("keep-logged-in",!1),this.setState({persist:!1})}))}handleConnected(){clearInterval(this.reconnectCountdown),this.handleError();const e=this.tinode.getServerInfo();this.setState({serverVersion:e.ver+" "+(e.build?e.build:"none")}),this.state.autoLogin&&this.doLogin(this.state.login,this.state.password,{meth:this.state.credMethod,resp:this.state.credCode})}handleAutoreconnectIteration(e,t){if(clearInterval(this.reconnectCountdown),e<0)return void this.handleError();if(t)return void t.then((()=>{this.handleError()})).catch((e=>{this.handleError(e.message,"err")}));const{formatMessage:a}=this.props.intl;let s=e/1e3;s|=s,this.reconnectCountdown=setInterval((()=>{const e=s>99?Zt(s):s;this.handleError(a(Oi.reconnect_countdown,{seconds:e}),"warn",(e=>{clearInterval(this.reconnectCountdown),this.tinode.reconnect()}),a(Oi.reconnect_now)),s-=1}),1e3)}handleDisconnect(e){this.setState({connected:!1,ready:!1,topicSelectedOnline:!1,errorText:e&&e.message?e.message:"Disconnected",errorLevel:e&&e.message?"err":"warn",loginDisabled:!1,contextMenuVisible:!1,forwardDialogVisible:!1,serverVersion:"no connection"})}doLogin(e,t,a){if(this.tinode.isAuthenticated())return void Js.navigateTo("");a=Ut.Tinode.credential(a);let s=null,i=this.tinode.getAuthToken();e&&t?(i=null,this.setState({password:null}),s=this.tinode.loginBasic(e,t,a)):i&&(s=this.tinode.loginToken(i.token,a)),s?s.then((e=>{e.code>=300&&"validate credentials"===e.text?(this.setState({loadSpinnerVisible:!1}),a&&this.handleError(this.props.intl.formatMessage(Oi.code_doesnot_match),"warn"),this.handleCredentialsRequest(e.params)):this.handleLoginSuccessful()})).catch((e=>{this.setState({loginDisabled:!1,credMethod:void 0,credCode:void 0,loadSpinnerVisible:!1,autoLogin:!1}),this.handleError(e.message,"err"),i&&this.handleLogout(),Js.navigateTo("")})):(Js.navigateTo(""),this.setState({loginDisabled:!1}))}handleCredentialsRequest(e){const t=Js.parseUrlHash(window.location.hash);t.path[0]="cred",t.params.method=e.cred[0],Js.navigateTo(Js.composeUrlHash(t.path,t.params))}handleLoginSuccessful(){this.handleError(),pi.getObject("keep-logged-in")&&pi.setObject("auth-token",this.tinode.getAuthToken());const e=this.state.requestedTopic,t=this.tinode.getMeTopic();t.onMetaDesc=this.tnMeMetaDesc,t.onContactUpdate=this.tnMeContactUpdate,t.onSubsUpdated=this.tnMeSubsUpdated,this.setState({connected:!0,credMethod:void 0,credCode:void 0,myUserId:this.tinode.getCurrentUserID(),autoLogin:!0,requestedTopic:void 0}),t.subscribe(t.startMetaQuery().withLaterSub().withDesc().withTags().withCred().build()).catch((e=>{this.tinode.disconnect(),localStorage.removeItem("auth-token"),this.handleError(e.message,"err"),Js.navigateTo("")})).finally((()=>{this.setState({loadSpinnerVisible:!1})}));let a=Js.setUrlSidePanel(window.location.hash,"contacts");e&&(a=Js.setUrlTopic(a,e)),Js.navigateTo(a)}tnMeMetaDesc(e){if(e){if(e.public&&this.setState({sidePanelTitle:e.public.fn,sidePanelAvatar:ga(e.public.photo)}),e.trusted){const t=[];for(const[a,s]of Object.entries(e.trusted))s&&t.push(a);this.setState({myTrustedBadges:t})}e.acs&&this.setState({incognitoMode:!e.acs.isPresencer()})}}tnMeContactUpdate(e,t){if("on"==e||"off"==e)this.resetContactList(),this.state.topicSelected==t.topic&&this.setState({topicSelectedOnline:"on"==e});else if("read"==e)this.resetContactList();else if("msg"==e){const e=this.tinode.getTopic(t.topic),a=e&&e.isArchived();t.unread>0&&this.state.messageSounds&&!a&&(document.hidden||this.state.topicSelected!=t.topic)&&Li.play(),this.resetContactList()}else"recv"==e||("gone"==e||"unsub"==e?(this.state.topicSelected==t.topic&&this.handleTopicSelected(null),this.resetContactList()):"acs"==e?this.state.topicSelected==t.topic&&this.setState({topicSelectedAcs:t.acs}):"del"==e||"upd"==e||console.info("Unsupported (yet) presence update:"+e+" in: "+t.topic))}tnMeSubsUpdated(e){this.resetContactList()}static prepareSearchableContacts(e,t){const a={};for(const t of e)Ut.Tinode.isP2PTopicName(t.topic)&&(a[t.topic]={user:t.topic,updated:t.updated,public:t.public,private:t.private,acs:t.acs});for(const e of t)a[e.user]||(a[e.user]=e);return Object.values(a)}resetContactList(){const e={chatList:[]};this.state.ready||(e.ready=!0),this.tinode.getMeTopic().contacts((t=>{t.topic||t.user||(t.topic=t.name),e.chatList.push(t),this.state.topicSelected==t.topic&&(e.topicSelectedOnline=t.online,e.topicSelectedAcs=t.acs)}));const t=new Date(0);e.chatList.sort(((e,a)=>(e.touched||t).getTime()-(a.touched||t).getTime())),e.searchableContacts=qi.prepareSearchableContacts(e.chatList,this.state.searchResults),this.setState(e)}tnData(e){const t=this.tinode.getTopic(e.topic);t.msgStatus(e,!0)>=Ut.Tinode.MESSAGE_STATUS_SENT&&e.from!=this.state.myUserId&&(clearTimeout(this.receivedTimer),this.receivedTimer=setTimeout((()=>{this.receivedTimer=void 0,t.noteRecv(e.seq)}),500))}tnInitFind(){const e=this.tinode.getFndTopic();e.onSubsUpdated=this.tnFndSubsUpdated,e.isSubscribed()?this.tnFndSubsUpdated():e.subscribe(e.startMetaQuery().withSub().build()).catch((e=>{this.handleError(e.message,"err")}))}tnFndSubsUpdated(){const e=[];this.tinode.getFndTopic().contacts((t=>{e.push(t)})),this.setState({searchResults:e,searchableContacts:qi.prepareSearchableContacts(this.state.chatList,e)})}handleSearchContacts(e){const t=this.tinode.getFndTopic();t.setMeta({desc:{public:e}}).then((e=>t.getMeta(t.startMetaQuery().withSub().build()))).catch((e=>{this.handleError(e.message,"err")}))}handleTopicSelected(e){this.state.newTopicParams&&this.state.newTopicParams._topicName!=e&&this.setState({newTopicParams:null}),e?(this.setState({errorText:"",errorLevel:null,mobilePanel:"topic-view",infoPanel:void 0}),this.state.topicSelected!=e&&(this.setState({topicSelectedOnline:this.tinode.isTopicOnline(e),topicSelectedAcs:this.tinode.getTopicAccessMode(e),forwardMessage:null}),Js.navigateTo(Js.setUrlTopic("",e)))):(this.setState({errorText:"",errorLevel:null,mobilePanel:"sidepanel",topicSelectedOnline:!1,topicSelectedAcs:null,infoPanel:void 0,forwardMessage:null}),Js.navigateTo(Js.setUrlTopic("",null)))}handleHideMessagesView(){this.setState({mobilePanel:"sidepanel"}),Js.navigateTo(Js.setUrlTopic(window.location.hash,null))}handleSendMessage(e,t,a,s){const i=this.tinode.getTopic(this.state.topicSelected);return this.sendMessageToTopic(i,e,t,a,s)}sendMessageToTopic(e,t,a,s,i){(t=e.createMessage(t,!1))._uploader=s,i&&(t.head=Object.assign(t.head||{},i));const n=[];if(a&&n.push(a),!e.isSubscribed()){const a=e.subscribe().then((()=>{e.queuedMessages((a=>{a._sending||a.seq==t.seq||e.isSubscribed()&&e.publishMessage(a)}))}));n.push(a)}return e.publishDraft(t,Promise.all(n)).then((t=>(e.isArchived()&&e.archive(!1),t))).catch((e=>{this.handleError(e.message,"err")}))}handleNewChatInvitation(e,t){const a=this.tinode.getTopic(e);let s=null;switch(t){case"accept":const i=a.getAccessMode().getGiven();s=a.setMeta({sub:{mode:i}}),a.isP2PType()&&(s=s.then((t=>{a.setMeta({sub:{user:e,mode:i}})})));break;case"delete":s=a.delTopic(!0);break;case"block":const n=a.getAccessMode().updateWant("-JP").getWant();s=a.setMeta({sub:{mode:n}}).then((e=>this.handleTopicSelected(null)));break;default:console.warn("Unknown invitation action",'"'+t+'""')}null!=s&&s.catch((e=>{this.handleError(e.message,"err")}))}handleNewAccount(){this.handleError(),Js.navigateTo(Js.setUrlSidePanel(window.location.hash,"register"))}handleNewAccountRequest(e,t,a,s,i){this.handleError(),this.tinode.connect(this.state.serverAddress).then((()=>this.tinode.createAccountBasic(e,t,{public:a,tags:i,cred:Ut.Tinode.credential(s)}))).then((e=>{e.code>=300&&"validate credentials"==e.text?this.handleCredentialsRequest(e.params):this.handleLoginSuccessful(this)})).catch((e=>{this.handleError(e.message,"err")}))}handleToggleIncognitoMode(e){this.setState({incognitoMode:null});const t=this.tinode.getMeTopic(),a=t.getAccessMode().updateWant(e?"-P":"+P").getWant();t.setMeta({sub:{mode:a}}).catch((t=>{this.setState({incognitoMode:!e}),this.handleError(t.message,"err")}))}handleUpdateAccountTagsRequest(e){this.tinode.getMeTopic().setMeta({tags:e}).catch((e=>{this.handleError(e.message,"err")}))}handleSettings(){this.handleError(),Js.navigateTo(Js.setUrlSidePanel(window.location.hash,this.state.myUserId?"edit":"settings"))}handleGlobalSettings(e){const t=e.serverAddress||this.state.serverAddress,a=e.transport||this.state.transport;this.tinode&&(this.tinode.clearStorage(),this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.tinode=qi.tnSetup(t,a,this.props.intl.locale,pi.getObject("keep-logged-in")),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,this.setState({serverAddress:t,transport:a}),pi.setObject("settings",{serverAddress:t,transport:a}),Js.navigateTo(Js.setUrlSidePanel(window.location.hash,""))}handleShowArchive(){Js.navigateTo(Js.setUrlSidePanel(window.location.hash,this.state.myUserId?"archive":""))}handleShowBlocked(){Js.navigateTo(Js.setUrlSidePanel(window.location.hash,this.state.myUserId?"blocked":""))}toggleFCMToken(e){e?(this.setState({desktopAlerts:null}),this.state.firebaseToken?(this.setState({desktopAlerts:!0}),pi.getObject("keep-logged-in")&&pi.updateObject("settings",{desktopAlerts:!0})):this.initFCMessaging()):this.state.firebaseToken&&this.fcm?Pt(this.fcm).catch((e=>{console.error("Unable to delete token.",e)})).finally((()=>{pi.updateObject("settings",{desktopAlerts:!1}),localStorage.removeItem("firebase-token"),this.setState({desktopAlerts:!1,firebaseToken:null}),this.tinode.setDeviceToken(null)})):(this.setState({desktopAlerts:!1,firebaseToken:null}),pi.updateObject("settings",{desktopAlerts:!1}))}handleToggleMessageSounds(e){this.setState({messageSounds:e}),pi.updateObject("settings",{messageSoundsOff:!e})}handleCredAdd(e,t){this.tinode.getMeTopic().setMeta({cred:{meth:e,val:t}}).catch((e=>{this.handleError(e.message,"err")}))}handleCredDelete(e,t){this.tinode.getMeTopic().delCredential(e,t).catch((e=>{this.handleError(e.message,"err")}))}handleCredConfirm(e,t){this.handleCredentialsRequest({cred:[e]})}handleSidepanelCancel(){const e=Js.parseUrlHash(window.location.hash);let t="";["security","support","general","notif"].includes(e.path[0])?t="edit":"crop"==e.path[0]?t="general":"blocked"==e.path[0]?t="security":this.state.myUserId&&(t="contacts"),e.path[0]=t,e.params&&(delete e.params.code,delete e.params.method,delete e.params.tab,delete e.params.scheme,delete e.params.token),Js.navigateTo(Js.composeUrlHash(e.path,e.params)),this.setState({errorText:"",errorLevel:null})}basicNavigator(e){Js.navigateTo(Js.setUrlSidePanel(window.location.hash,e))}infoNavigator(e){Js.navigateTo(Js.setUrlInfoPanel(window.location.hash,e))}handleStartTopicRequest(e,t,a){if(e&&this.tinode.isTopicCached(e))return void this.handleTopicSelected(e);const s={};Ut.Tinode.isP2PTopicName(e)?(s.sub={mode:qt},s.desc={defacs:{auth:qt}}):(e=e||this.tinode.newGroupTopicName(a),t&&(s.desc={public:t.public,private:{comment:t.private}},s.tags=t.tags)),s._topicName=e,this.setState({newTopicParams:s},(()=>{this.handleTopicSelected(e)}))}handleNewTopicCreated(e,t){let a={};this.state.callShouldStart&&(a={callState:3,callShouldStart:!1}),this.state.topicSelected==e&&e!=t&&(a.topicSelected=t),this.setState(a,(e=>{Js.navigateTo(Js.setUrlTopic("",t))}))}handleTopicUpdateRequest(e,t,a,s){this.handleError();const i=this.tinode.getTopic(e);if(i){const e={};let n;t&&(t.photo&&(t.photo.ref&&t.photo.ref!=Ut.Tinode.DEL_CHAR?n=[t.photo.ref]:t.photo.data&&t.photo.data!=Ut.Tinode.DEL_CHAR||(t.photo=Ut.Tinode.DEL_CHAR)),e.public=t),"string"==typeof a&&(e.private=a===Ut.Tinode.DEL_CHAR?Ut.Tinode.DEL_CHAR:{comment:a}),s&&(e.defacs=s),i.setMeta({desc:e,attachments:n}).catch((e=>{this.handleError(e.message,"err")}))}}handleUnarchive(e){const t=this.tinode.getTopic(e);t&&t.archive(!1)}handleUpdatePasswordRequest(e){this.handleError(),e&&this.tinode.updateAccountBasic(null,this.tinode.getCurrentLogin(),e).catch((e=>{this.handleError(e.message,"err")}))}handleChangePermissions(e,t,a){const s=this.tinode.getTopic(e);if(s){const e=s.getAccessMode();a?(e.updateGiven(t),t=e.getGiven()):(e.updateWant(t),t=e.getWant()),s.setMeta({sub:{user:a,mode:t}}).catch((e=>{this.handleError(e.message,"err")}))}}handleTagsUpdateRequest(e,t){const a=this.tinode.getTopic(e);a&&a.setMeta({tags:t}).catch((e=>{this.handleError(e.message,"err")}))}handleLogout(){let e;sa(0),localStorage.removeItem("auth-token"),localStorage.removeItem("firebase-token"),localStorage.removeItem("settings"),this.state.firebaseToken&&Pt(this.fcm),clearInterval(this.reconnectCountdown),this.tinode?(e=this.tinode.clearStorage(),this.tinode.onDisconnect=void 0,this.tinode.disconnect()):e=Promose.resolve(),this.setState(this.getBlankState()),e.then((()=>{this.tinode=qi.tnSetup(this.state.serverAddress,this.state.transport,this.props.intl.locale,pi.getObject("keep-logged-in"),(()=>{this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,Js.navigateTo("")}))}))}handleDeleteAccount(){this.tinode.delCurrentUser(!0).then((e=>{this.handleLogout()}))}handleDeleteTopicRequest(e){const t=this.tinode.getTopic(e);t&&t.delTopic(!0).then((e=>{Js.navigateTo(Js.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleDeleteMessagesRequest(e){const t=this.tinode.getTopic(e);t&&t.delMessagesAll(!0).catch((e=>{this.handleError(e.message,"err")}))}handleLeaveUnsubRequest(e){const t=this.tinode.getTopic(e);t&&t.leave(!0).then((e=>{Js.navigateTo(Js.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleBlockTopicRequest(e){const t=this.tinode.getTopic(e);t&&t.updateMode(null,"-JP").then((e=>{Js.navigateTo(Js.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleReportTopic(e){const t=this.tinode.getTopic(e);t&&(this.tinode.report("report",e),t.updateMode(null,"-JP").then((e=>{Js.navigateTo(Js.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")})))}handleShowContextMenu(e,t){this.setState({contextMenuVisible:!0,contextMenuClickAt:{x:e.x,y:e.y},contextMenuParams:e,contextMenuItems:t||this.defaultTopicContextMenu(e.topicName),contextMenuBounds:this.selfRef.current.getBoundingClientRect()})}handleShowForwardDialog(e){"newtpk"==this.state.sidePanelSelected&&this.handleSidepanelCancel();const t="➦ "+e.userName,a="string"==typeof e.content?Ut.Drafty.init(e.content):Ut.Drafty.forwardedContent(e.content),s=Ut.Drafty.preview(a,84,!0),i=Ut.Drafty.append(Ut.Drafty.appendLineBreak(Ut.Drafty.mention(t,e.userFrom)),a),n=Ut.Drafty.quote(t,e.userFrom,s),o={forwarded:e.topicName+":"+e.seq};this.setState({forwardDialogVisible:!0,forwardMessage:{head:o,msg:i,preview:n}})}defaultTopicContextMenu(e){const t=this.tinode.getTopic(e);if(t._deleted)return["topic_delete"];let a=!1,s=!1,i=!1,n=!1,o=!1,r=!1;if(t){n=t.isSubscribed(),r=t.isArchived();const e=t.getAccessMode();e&&(a=e.isMuted(),s=!e.isJoiner(),i=!e.isJoiner("want"),o=e.isDeleter())}return[n?{title:this.props.intl.formatMessage(Oi.menu_item_info),handler:this.handleShowInfoView}:null,n&&Ut.Tinode.isP2PTopicName(e)?{title:this.props.intl.formatMessage(Oi.menu_item_video_call),handler:this.handleStartVideoCall}:null,n?"messages_clear":null,n&&o?"messages_clear_hard":null,a?s?null:"topic_unmute":"topic_mute",i?"topic_unblock":"topic_block",r?"topic_restore":"topic_archive","topic_delete"]}handleHideContextMenu(){this.setState({contextMenuVisible:!1,contextMenuClickAt:null,contextMenuParams:null,contextMenuBounds:null})}handleHideForwardDialog(e){this.setState({forwardDialogVisible:!1,forwardMessage:e?this.state.forwardMessage:null})}handleContextMenuAction(e,t,a){"topic_archive"==e?t&&a.topicName&&a.topicName==this.state.topicSelected&&t.then((()=>{this.handleTopicSelected(null)})):"menu_item_forward"==e&&this.handleShowForwardDialog(a)}handleShowAlert(e,t,a,s,i,n){this.setState({alertVisible:!0,alertParams:{title:e,content:t,onConfirm:a,confirm:s,onReject:i,reject:n}})}handleShowInfoView(){Js.navigateTo(Js.addUrlParam(window.location.hash,"info","info")),this.setState({infoPanel:"info"})}handleMemberUpdateRequest(e,t,a){if(!e)return;const s=this.tinode.getTopic(e);s&&(t&&t.length>0&&t.map((e=>{s.invite(e,null).catch((e=>{this.handleError(e.message,"err")}))})),a&&a.length>0&&a.map((e=>{s.delSubscription(e).catch((e=>{this.handleError(e.message,"err")}))})))}handleValidateCredentialsRequest(e,t){if(this.tinode.isAuthenticated()){this.tinode.getMeTopic().setMeta({cred:{meth:e,resp:t}}).then((()=>{Js.navigateTo("")})).catch((e=>{this.handleError(e.message,"err")}))}else this.setState({credMethod:e,credCode:t}),this.doLogin(null,null,{meth:e,resp:t})}handlePasswordResetRequest(e,t){return this.tinode.connect().then((()=>this.tinode.requestResetAuthSecret("basic",e,t))).catch((e=>{this.handleError(e.message,"err")}))}handleResetPassword(e,t,a){(a=function(e){if(e){e=e.replace(/-/g,"+").replace(/_/g,"/");try{e=btoa(atob(e))}catch(t){console.error("Failed to base64 re-encode string.",t),e=null}}return e}(a))?this.tinode.connect().then((()=>this.tinode.updateAccountBasic(null,null,t,{token:a}))).then((()=>{Js.navigateTo("")})).catch((e=>{this.handleError(e.message,"err")})):this.handleError(this.props.intl.formatMessage(Oi.invalid_security_token),"err")}handleStartVideoCall(){this.setState({callTopic:this.state.topicSelected,callState:1})}handleCallInvite(e,t,a){switch(a){case 1:let a={webrtc:"started"};this.handleSendMessage(Ut.Drafty.videoCall(),void 0,void 0,a).then((e=>{e.code<200||e.code>=300||!e.params||!e.params.seq?this.handleCallClose():this.setState({callSeq:e.params.seq})}));break;case 3:const s=this.tinode.getTopic(e);if(!s)return;s.videoCall("accept",t)}}handleCallRinging(e,t){const a=this.tinode.getTopic(e);a&&a.videoCall("ringing",t)}handleCallHangup(e,t){const a=this.tinode.getTopic(e);a&&a.videoCall("hang-up",t)}handleCallSendOffer(e,t,a){const s=this.tinode.getTopic(e);s&&s.videoCall("offer",t,a)}handleCallIceCandidate(e,t,a){const s=this.tinode.getTopic(e);s&&s.videoCall("ice-candidate",t,a)}handleCallSendAnswer(e,t,a){const s=this.tinode.getTopic(e);s&&s.videoCall("answer",t,a)}handleCallClose(){this.state.callTimeout&&(console.log("closing call timeout ",this.state.callTimeout),clearTimeout(this.state.callTimeout)),this.setState({callTopic:void 0,callState:0})}handleCallAcceptCall(e){const t=this.tinode.getTopic(e);t&&(t.isSubscribed()?(this.handleTopicSelected(this.state.callTopic),this.setState({callState:3})):this.setState({callShouldStart:!0},(()=>this.handleTopicSelected(this.state.callTopic))))}handleInfoMessage(e){if("call"==e.what)switch(e.event){case"invite":e.from!=this.state.myUserId&&this.setState({callTopic:e.src,callState:2,callSeq:e.seq});break;case"accept":if(console.log("TinodeWeb: received accept msg ",e),Ut.Tinode.isMeTopicName(e.topic)&&this.tinode.isMe(e.from))return void this.setState({callTopic:null,callState:0,callSeq:null});e.topic==this.state.callTopic&&this.setState({callState:3});break;case"hang-up":this.handleCallClose()}}render(){return t().createElement("div",{id:"app-container",ref:this.selfRef},this.state.contextMenuVisible?t().createElement(Qt,{tinode:this.tinode,bounds:this.state.contextMenuBounds,clickAt:this.state.contextMenuClickAt,params:this.state.contextMenuParams,items:this.state.contextMenuItems,hide:this.handleHideContextMenu,onShowAlert:this.handleShowAlert,onAction:this.handleContextMenuAction,onTopicRemoved:e=>{e==this.state.topicSelected&&this.handleTopicSelected(null)},onError:this.handleError}):null,this.state.forwardDialogVisible?t().createElement(Wa,{tinode:this.tinode,contacts:this.state.chatList,topicSelected:this.state.topicSelected,myUserId:this.state.myUserId,hide:this.handleHideForwardDialog,onInitFind:this.tnInitFind,searchResults:this.state.searchResults,onSearchContacts:this.handleSearchContacts,onTopicSelected:this.handleStartTopicRequest}):null,this.state.callTopic&&2==this.state.callState?t().createElement(Ja,{tinode:this.tinode,onClose:this.handleCallClose,topic:this.state.callTopic,seq:this.state.callSeq,callState:this.state.callState,onRinging:this.handleCallRinging,onAcceptCall:this.handleCallAcceptCall,onReject:this.handleCallHangup}):null,t().createElement(Rt,{visible:this.state.alertVisible,title:this.state.alertParams.title,content:this.state.alertParams.content,onReject:this.state.alertParams.onReject?()=>{this.setState({alertVisible:!1})}:null,reject:this.state.alertParams.reject,onConfirm:()=>{this.setState({alertVisible:!1}),this.state.alertParams.onConfirm()},confirm:this.state.alertParams.confirm}),t().createElement(Fi,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,hideSelf:this.state.displayMobile&&"sidepanel"!==this.state.mobilePanel,state:this.state.sidePanelSelected,title:this.state.sidePanelTitle,avatar:this.state.sidePanelAvatar,trustedBadges:this.state.myTrustedBadges,login:this.state.login,persist:this.state.persist,myUserId:this.state.myUserId,loginDisabled:this.state.loginDisabled,loadSpinnerVisible:this.state.loadSpinnerVisible,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,topicSelected:this.state.topicSelected,chatList:this.state.chatList,credMethod:this.state.credMethod,credCode:this.state.credCode,transport:this.state.transport,messageSounds:this.state.messageSounds,desktopAlerts:this.state.desktopAlerts,desktopAlertsEnabled:this.state.desktopAlertsEnabled,incognitoMode:this.state.incognitoMode,serverAddress:this.state.serverAddress,serverVersion:this.state.serverVersion,onGlobalSettings:this.handleGlobalSettings,onSignUp:this.handleNewAccount,onSettings:this.handleSettings,onNavigate:this.basicNavigator,onLoginRequest:this.handleLoginRequest,onPersistenceChange:this.handlePersistenceChange,onCreateAccount:this.handleNewAccountRequest,onUpdateAccountDesc:this.handleTopicUpdateRequest,onUpdatePassword:this.handleUpdatePasswordRequest,onUpdateAccountTags:this.handleUpdateAccountTagsRequest,onTogglePushNotifications:this.toggleFCMToken,onToggleMessageSounds:this.handleToggleMessageSounds,onToggleIncognitoMode:this.handleToggleIncognitoMode,onCredAdd:this.handleCredAdd,onCredDelete:this.handleCredDelete,onCredConfirm:this.handleCredConfirm,onTopicSelected:this.handleTopicSelected,onCreateTopic:this.handleStartTopicRequest,onLogout:this.handleLogout,onDeleteAccount:this.handleDeleteAccount,onShowAlert:this.handleShowAlert,onCancel:this.handleSidepanelCancel,onError:this.handleError,onValidateCredentials:this.handleValidateCredentialsRequest,onPasswordResetRequest:this.handlePasswordResetRequest,onResetPassword:this.handleResetPassword,onShowArchive:this.handleShowArchive,onShowBlocked:this.handleShowBlocked,onInitFind:this.tnInitFind,searchResults:this.state.searchResults,onSearchContacts:this.handleSearchContacts,showContextMenu:this.handleShowContextMenu}),t().createElement(si,{tinode:this.tinode,connected:this.state.connected,ready:this.state.ready,online:this.state.topicSelectedOnline,acs:this.state.topicSelectedAcs,displayMobile:this.state.displayMobile,viewportWidth:this.state.viewportWidth,viewportHeight:this.state.viewportHeight,hideSelf:this.state.displayMobile&&("topic-view"!==this.state.mobilePanel||this.state.infoPanel),topic:this.state.topicSelected,myUserId:this.state.myUserId,myUserName:this.state.sidePanelTitle,serverVersion:this.state.serverVersion,serverAddress:this.state.serverAddress,applicationVisible:this.state.applicationVisible,forwardMessage:this.state.forwardMessage,onCancelForwardMessage:this.handleHideForwardDialog,callTopic:this.state.callTopic,callSeq:this.state.callSeq,callState:this.state.callState,onCallHangup:this.handleCallHangup,onCallInvite:this.handleCallInvite,onCallSendOffer:this.handleCallSendOffer,onCallIceCandidate:this.handleCallIceCandidate,onCallSendAnswer:this.handleCallSendAnswer,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,newTopicParams:this.state.newTopicParams,onHideMessagesView:this.handleHideMessagesView,onData:this.tnData,onError:this.handleError,onNewTopicCreated:this.handleNewTopicCreated,showContextMenu:this.handleShowContextMenu,onChangePermissions:this.handleChangePermissions,onNewChat:this.handleNewChatInvitation,sendMessage:this.handleSendMessage,onVideoCallClosed:this.handleCallClose}),this.state.infoPanel?t().createElement(Cs,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,topic:this.state.topicSelected,searchableContacts:this.state.searchableContacts,myUserId:this.state.myUserId,panel:this.state.infoPanel,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,onNavigate:this.infoNavigator,onTopicDescUpdateRequest:this.handleTopicUpdateRequest,onShowAlert:this.handleShowAlert,onChangePermissions:this.handleChangePermissions,onMemberUpdateRequest:this.handleMemberUpdateRequest,onDeleteTopic:this.handleDeleteTopicRequest,onDeleteMessages:this.handleDeleteMessagesRequest,onLeaveTopic:this.handleLeaveUnsubRequest,onBlockTopic:this.handleBlockTopicRequest,onReportTopic:this.handleReportTopic,onAddMember:this.handleManageGroupMembers,onTopicTagsUpdateRequest:this.handleTagsUpdateRequest,onTopicUnArchive:this.handleUnarchive,onInitFind:this.tnInitFind,onError:this.handleError,showContextMenu:this.handleShowContextMenu}):null)}}const ji=(0,n.injectIntl)(qi),{params:zi}=Js.parseUrlHash(window.location.hash),Hi=zi&&zi.hl||navigator.languages&&navigator.languages[0]||navigator.language||navigator.userLanguage||"en",Vi=Hi.toLowerCase().split(/[-_]/)[0],Wi=o[Hi]?Hi:o[Vi]?Vi:"en",Ki=o[Wi];document.getElementsByTagName("html")[0].setAttribute("lang",Wi),i().render(t().createElement(t().StrictMode,null,t().createElement(n.IntlProvider,{locale:Hi,messages:Ki,textComponent:t().Fragment},t().createElement(ji,null))),document.getElementById("mountPoint"))})()})(); +(()=>{var e={27:(e,t,a)=>{var s,i;s=function(){var e={172351395:{name:"EBML",type:"Container"},646:{name:"EBMLVersion",type:"Uint"},759:{name:"EBMLReadVersion",type:"Uint"},754:{name:"EBMLMaxIDLength",type:"Uint"},755:{name:"EBMLMaxSizeLength",type:"Uint"},642:{name:"DocType",type:"String"},647:{name:"DocTypeVersion",type:"Uint"},645:{name:"DocTypeReadVersion",type:"Uint"},108:{name:"Void",type:"Binary"},63:{name:"CRC-32",type:"Binary"},190023271:{name:"SignatureSlot",type:"Container"},16010:{name:"SignatureAlgo",type:"Uint"},16026:{name:"SignatureHash",type:"Uint"},16037:{name:"SignaturePublicKey",type:"Binary"},16053:{name:"Signature",type:"Binary"},15963:{name:"SignatureElements",type:"Container"},15995:{name:"SignatureElementList",type:"Container"},9522:{name:"SignedElement",type:"Binary"},139690087:{name:"Segment",type:"Container"},21863284:{name:"SeekHead",type:"Container"},3515:{name:"Seek",type:"Container"},5035:{name:"SeekID",type:"Binary"},5036:{name:"SeekPosition",type:"Uint"},88713574:{name:"Info",type:"Container"},13220:{name:"SegmentUID",type:"Binary"},13188:{name:"SegmentFilename",type:"String"},1882403:{name:"PrevUID",type:"Binary"},1868715:{name:"PrevFilename",type:"String"},2013475:{name:"NextUID",type:"Binary"},1999803:{name:"NextFilename",type:"String"},1092:{name:"SegmentFamily",type:"Binary"},10532:{name:"ChapterTranslate",type:"Container"},10748:{name:"ChapterTranslateEditionUID",type:"Uint"},10687:{name:"ChapterTranslateCodec",type:"Uint"},10661:{name:"ChapterTranslateID",type:"Binary"},710577:{name:"TimecodeScale",type:"Uint"},1161:{name:"Duration",type:"Float"},1121:{name:"DateUTC",type:"Date"},15273:{name:"Title",type:"String"},3456:{name:"MuxingApp",type:"String"},5953:{name:"WritingApp",type:"String"},103:{name:"Timecode",type:"Uint"},6228:{name:"SilentTracks",type:"Container"},6359:{name:"SilentTrackNumber",type:"Uint"},39:{name:"Position",type:"Uint"},43:{name:"PrevSize",type:"Uint"},35:{name:"SimpleBlock",type:"Binary"},32:{name:"BlockGroup",type:"Container"},33:{name:"Block",type:"Binary"},34:{name:"BlockVirtual",type:"Binary"},13729:{name:"BlockAdditions",type:"Container"},38:{name:"BlockMore",type:"Container"},110:{name:"BlockAddID",type:"Uint"},37:{name:"BlockAdditional",type:"Binary"},27:{name:"BlockDuration",type:"Uint"},122:{name:"ReferencePriority",type:"Uint"},123:{name:"ReferenceBlock",type:"Int"},125:{name:"ReferenceVirtual",type:"Int"},36:{name:"CodecState",type:"Binary"},13730:{name:"DiscardPadding",type:"Int"},14:{name:"Slices",type:"Container"},104:{name:"TimeSlice",type:"Container"},76:{name:"LaceNumber",type:"Uint"},77:{name:"FrameNumber",type:"Uint"},75:{name:"BlockAdditionID",type:"Uint"},78:{name:"Delay",type:"Uint"},79:{name:"SliceDuration",type:"Uint"},72:{name:"ReferenceFrame",type:"Container"},73:{name:"ReferenceOffset",type:"Uint"},74:{name:"ReferenceTimeCode",type:"Uint"},47:{name:"EncryptedBlock",type:"Binary"},106212971:{name:"Tracks",type:"Container"},46:{name:"TrackEntry",type:"Container"},87:{name:"TrackNumber",type:"Uint"},13253:{name:"TrackUID",type:"Uint"},3:{name:"TrackType",type:"Uint"},57:{name:"FlagEnabled",type:"Uint"},8:{name:"FlagDefault",type:"Uint"},5546:{name:"FlagForced",type:"Uint"},28:{name:"FlagLacing",type:"Uint"},11751:{name:"MinCache",type:"Uint"},11768:{name:"MaxCache",type:"Uint"},254851:{name:"DefaultDuration",type:"Uint"},216698:{name:"DefaultDecodedFieldDuration",type:"Uint"},209231:{name:"TrackTimecodeScale",type:"Float"},4991:{name:"TrackOffset",type:"Int"},5614:{name:"MaxBlockAdditionID",type:"Uint"},4974:{name:"Name",type:"String"},177564:{name:"Language",type:"String"},6:{name:"CodecID",type:"String"},9122:{name:"CodecPrivate",type:"Binary"},362120:{name:"CodecName",type:"String"},13382:{name:"AttachmentLink",type:"Uint"},1742487:{name:"CodecSettings",type:"String"},1785920:{name:"CodecInfoURL",type:"String"},438848:{name:"CodecDownloadURL",type:"String"},42:{name:"CodecDecodeAll",type:"Uint"},12203:{name:"TrackOverlay",type:"Uint"},5802:{name:"CodecDelay",type:"Uint"},5819:{name:"SeekPreRoll",type:"Uint"},9764:{name:"TrackTranslate",type:"Container"},9980:{name:"TrackTranslateEditionUID",type:"Uint"},9919:{name:"TrackTranslateCodec",type:"Uint"},9893:{name:"TrackTranslateTrackID",type:"Binary"},96:{name:"Video",type:"Container"},26:{name:"FlagInterlaced",type:"Uint"},5048:{name:"StereoMode",type:"Uint"},5056:{name:"AlphaMode",type:"Uint"},5049:{name:"OldStereoMode",type:"Uint"},48:{name:"PixelWidth",type:"Uint"},58:{name:"PixelHeight",type:"Uint"},5290:{name:"PixelCropBottom",type:"Uint"},5307:{name:"PixelCropTop",type:"Uint"},5324:{name:"PixelCropLeft",type:"Uint"},5341:{name:"PixelCropRight",type:"Uint"},5296:{name:"DisplayWidth",type:"Uint"},5306:{name:"DisplayHeight",type:"Uint"},5298:{name:"DisplayUnit",type:"Uint"},5299:{name:"AspectRatioType",type:"Uint"},963876:{name:"ColourSpace",type:"Binary"},1029411:{name:"GammaValue",type:"Float"},230371:{name:"FrameRate",type:"Float"},97:{name:"Audio",type:"Container"},53:{name:"SamplingFrequency",type:"Float"},14517:{name:"OutputSamplingFrequency",type:"Float"},31:{name:"Channels",type:"Uint"},15739:{name:"ChannelPositions",type:"Binary"},8804:{name:"BitDepth",type:"Uint"},98:{name:"TrackOperation",type:"Container"},99:{name:"TrackCombinePlanes",type:"Container"},100:{name:"TrackPlane",type:"Container"},101:{name:"TrackPlaneUID",type:"Uint"},102:{name:"TrackPlaneType",type:"Uint"},105:{name:"TrackJoinBlocks",type:"Container"},109:{name:"TrackJoinUID",type:"Uint"},64:{name:"TrickTrackUID",type:"Uint"},65:{name:"TrickTrackSegmentUID",type:"Binary"},70:{name:"TrickTrackFlag",type:"Uint"},71:{name:"TrickMasterTrackUID",type:"Uint"},68:{name:"TrickMasterTrackSegmentUID",type:"Binary"},11648:{name:"ContentEncodings",type:"Container"},8768:{name:"ContentEncoding",type:"Container"},4145:{name:"ContentEncodingOrder",type:"Uint"},4146:{name:"ContentEncodingScope",type:"Uint"},4147:{name:"ContentEncodingType",type:"Uint"},4148:{name:"ContentCompression",type:"Container"},596:{name:"ContentCompAlgo",type:"Uint"},597:{name:"ContentCompSettings",type:"Binary"},4149:{name:"ContentEncryption",type:"Container"},2017:{name:"ContentEncAlgo",type:"Uint"},2018:{name:"ContentEncKeyID",type:"Binary"},2019:{name:"ContentSignature",type:"Binary"},2020:{name:"ContentSigKeyID",type:"Binary"},2021:{name:"ContentSigAlgo",type:"Uint"},2022:{name:"ContentSigHashAlgo",type:"Uint"},206814059:{name:"Cues",type:"Container"},59:{name:"CuePoint",type:"Container"},51:{name:"CueTime",type:"Uint"},55:{name:"CueTrackPositions",type:"Container"},119:{name:"CueTrack",type:"Uint"},113:{name:"CueClusterPosition",type:"Uint"},112:{name:"CueRelativePosition",type:"Uint"},50:{name:"CueDuration",type:"Uint"},4984:{name:"CueBlockNumber",type:"Uint"},106:{name:"CueCodecState",type:"Uint"},91:{name:"CueReference",type:"Container"},22:{name:"CueRefTime",type:"Uint"},23:{name:"CueRefCluster",type:"Uint"},4959:{name:"CueRefNumber",type:"Uint"},107:{name:"CueRefCodecState",type:"Uint"},155296873:{name:"Attachments",type:"Container"},8615:{name:"AttachedFile",type:"Container"},1662:{name:"FileDescription",type:"String"},1646:{name:"FileName",type:"String"},1632:{name:"FileMimeType",type:"String"},1628:{name:"FileData",type:"Binary"},1710:{name:"FileUID",type:"Uint"},1653:{name:"FileReferral",type:"Binary"},1633:{name:"FileUsedStartTime",type:"Uint"},1634:{name:"FileUsedEndTime",type:"Uint"},4433776:{name:"Chapters",type:"Container"},1465:{name:"EditionEntry",type:"Container"},1468:{name:"EditionUID",type:"Uint"},1469:{name:"EditionFlagHidden",type:"Uint"},1499:{name:"EditionFlagDefault",type:"Uint"},1501:{name:"EditionFlagOrdered",type:"Uint"},54:{name:"ChapterAtom",type:"Container"},13252:{name:"ChapterUID",type:"Uint"},5716:{name:"ChapterStringUID",type:"String"},17:{name:"ChapterTimeStart",type:"Uint"},18:{name:"ChapterTimeEnd",type:"Uint"},24:{name:"ChapterFlagHidden",type:"Uint"},1432:{name:"ChapterFlagEnabled",type:"Uint"},11879:{name:"ChapterSegmentUID",type:"Binary"},11964:{name:"ChapterSegmentEditionUID",type:"Uint"},9155:{name:"ChapterPhysicalEquiv",type:"Uint"},15:{name:"ChapterTrack",type:"Container"},9:{name:"ChapterTrackNumber",type:"Uint"},0:{name:"ChapterDisplay",type:"Container"},5:{name:"ChapString",type:"String"},892:{name:"ChapLanguage",type:"String"},894:{name:"ChapCountry",type:"String"},10564:{name:"ChapProcess",type:"Container"},10581:{name:"ChapProcessCodecID",type:"Uint"},1293:{name:"ChapProcessPrivate",type:"Binary"},10513:{name:"ChapProcessCommand",type:"Container"},10530:{name:"ChapProcessTime",type:"Uint"},10547:{name:"ChapProcessData",type:"Binary"},39109479:{name:"Tags",type:"Container"},13171:{name:"Tag",type:"Container"},9152:{name:"Targets",type:"Container"},10442:{name:"TargetTypeValue",type:"Uint"},9162:{name:"TargetType",type:"String"},9157:{name:"TagTrackUID",type:"Uint"},9161:{name:"TagEditionUID",type:"Uint"},9156:{name:"TagChapterUID",type:"Uint"},9158:{name:"TagAttachmentUID",type:"Uint"},10184:{name:"SimpleTag",type:"Container"},1443:{name:"TagName",type:"String"},1146:{name:"TagLanguage",type:"String"},1156:{name:"TagDefault",type:"Uint"},1159:{name:"TagString",type:"String"},1157:{name:"TagBinary",type:"Binary"}};function t(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e}function a(e,t){this.name=e||"Unknown",this.type=t||"Unknown"}function s(e,t){a.call(this,e,t||"Uint")}function i(e){return e.length%2==1?"0"+e:e}function n(e,t){a.call(this,e,t||"Float")}function o(e,t){a.call(this,e,t||"Container")}function r(e){o.call(this,"File","File"),this.setSource(e)}function l(e,t,a,s){if("object"==typeof a&&(s=a,a=void 0),!a)return new Promise((function(a){l(e,t,a,s)}));try{var i=new FileReader;i.onloadend=function(){try{var n=new r(new Uint8Array(i.result));n.fixDuration(t,s)&&(e=n.toBlob(e.type))}catch(e){}a(e)},i.readAsArrayBuffer(e)}catch(t){a(e)}}return a.prototype.updateBySource=function(){},a.prototype.setSource=function(e){this.source=e,this.updateBySource()},a.prototype.updateByData=function(){},a.prototype.setData=function(e){this.data=e,this.updateByData()},t(s,a),s.prototype.updateBySource=function(){this.data="";for(var e=0;e=s&&a<8;a++,s*=128);if(!t)for(var i=s+e,n=a-1;n>=0;n--){var o=i%256;this.source[this.offset+n]=o,i=(i-o)/256}this.offset+=a},o.prototype.writeSections=function(e){this.offset=0;for(var t=0;t{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var s in t)a.o(t,s)&&!a.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";const e=React;var t=a.n(e);const s=ReactDOM;var i=a.n(s);const n=ReactIntl,o=JSON.parse('{"de":{"action_block_contact":"Kontakt blockieren","action_cancel":"Abbrechen","action_clear_messages":"Nachrichten leeren","action_delete_messages":"Nachrichten für alle löschen","action_leave_chat":"Unterhaltung verlassen","action_report_chat":"Unterhaltung melden","archived_contacts":"Archivierte Kontakte ({count})","badge_danger":"Verdächtig","badge_owner":"Besitzer","badge_staff":"Verwaltung","badge_verified":"Verifiziert","badge_you":"Sie","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","blocked_contacts_link":"Blockierte Kontakte ({count})","button_add_another":"Hinzufügen","button_add_members":"Mitglieder hinzufügen","button_cancel":"Abbrechen","button_confirm":"Bestätigen","button_create":"Erstellen","button_delete_account":"Konto löschen","button_edit":"Bearbeiten","button_logout":"Abmelden","button_ok":"OK","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","button_sign_in":"Anmelden","button_sign_up":"Anmelden","button_subscribe":"Abbonieren","button_update":"Aktualisieren","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","channel":"Sender","channel_prompt":"Dies ist ein Sender","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_block":"Blockieren","chat_invitation_ignore":"Ignorieren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","code_doesnot_match":"Code stimmt nicht überein","contacts_not_found":"Sie haben keine Unterhaltungen
¯∖_(ツ)_/¯","contacts_not_found_short":"Keine Kontakte für \'\'{query}\'\'","credential_email_prompt":"E-Mail Adresse für Registrierung","delete_account":"Konto löschen","delete_account_warning":"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","deleted_content":"Inhalt gelöscht","download_action":"herunterladen","drafty_attachment":"Dateianhang","drafty_form":"Formular:","drafty_image":"Bild","email_dative":"E-Mail","email_prompt":"E-Mail, z.B. lisam@beispiel.de","enable_peers_messaging":"Aktivieren","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","error_invalid_id":"ungültige ID","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","forgot_password_link":"Passwort vergessen?","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","granted_permissions":"Erteilt","group_has_no_members":"Keine Mitglieder","group_user_id_prompt":"Gruppe oder Benutzer ID","image_caption_prompt":"Bildunterschrift","invalid_content":"ungültiger Inhalt","invalid_security_token":"Ungültiger Sicherheitsschlüssel","label_client":"Client:","label_content_type":"Inhaltsart:","label_default_access_mode":"Standard Zugriffsmodus:","label_file_name":"Dateiname:","label_group_members":"Gruppenmitglieder:","label_incognito_mode":"inkognito-Modus:","label_message_sound":"Benachrichtigungston:","label_muting_topic":"Stumm geschaltet:","label_other_user":"Andere","label_password":"Passwort","label_permissions":"Berechtigungen:","label_private":"Privater Kommentar","label_push_notifications":"Benachrichtigungsmeldungen:","label_push_notifications_disabled":"Benachrichtigungsmeldungen (erfordert HTTPS):","label_reset_password":"Passwort per E-Mail wiederherstellen:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server Adresse:","label_server_to_use":"Server verwenden:","label_size":"Größe:","label_topic_name":"Name","label_user_contacts":"Kontakte:","label_user_id":"ID:","label_wire_transport":"Übertragung per Kabel:","label_you":"Sie:","label_your_name":"Ihr Name","label_your_permissions":"Ihre Berechtigungen:","last_seen_timestamp":"Zuletzt gesehen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","link_contact_us":"Kontakt","link_privacy_policy":"Datenschutzerklärung","link_terms_of_service":"Nutzungsbedingungen","login_prompt":"Anmelden","menu_item_archive_topic":"Archivieren","menu_item_block":"Blockieren","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_delete_topic":"Entfernen","menu_item_edit_permissions":"Berechtigungen ändern","menu_item_info":"Info","menu_item_member_delete":"Entfernen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_restore_topic":"Wiederherstellen","menu_item_send_retry":"Wiederholen","menu_item_unblock":"Blockierung aufheben","menu_item_unmute":"Stumm schalten beenden","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","more_online_members":"+{overflow} mehr","new_message_prompt":"Neue Nachricht","new_password_placeholder":"Geben Sie ein neues Passwort ein","no_connection":"Keine Verbindung","no_contacts":"Sie haben keine Kontakte :-(","numeric_confirmation_code_prompt":"Nur zahlen","online_now":"jetzt online","password_prompt":"Passwort","password_unchanged_prompt":"unverändert","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","permission_admin":"Bestätigen ({val})","permission_delete":"Entfernen ({val})","permission_join":"Beitreten ({val})","permission_owner":"Besitzer ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_read":"Lesen ({val})","permission_share":"Teilen ({val})","permission_write":"Schreiben ({val})","phone_dative":"Telefon","private_editing_placeholder":"Nur für Sie sichtbar","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","reload_update":"Neu laden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","requested_permissions":"Angefordert","save_attachment":"Speichern","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_login":"Anmelden","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_register":"Konto erstellen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_settings":"Einstellungen","stay_logged_in":"Angemeldet bleiben","tabtitle_find_user":"Suchen","tabtitle_group_by_id":"nach ID","tabtitle_new_group":"Neue Gruppe","tags_editor_no_tags":"Schlagworte hinzufügen","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","title_all_contacts":"Alle Kontakte","title_group_members":"Gruppenmitglieder","panel_title_info":"Info","title_manage_tags":"Verwalten","title_not_found":"Nicht gefunden","title_permissions":"Berechtigungen","title_tag_manager":"Schlagworte (Nutzer entdecken)","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","topic_name_editing_placeholder":"Freiform Name der Gruppe","unnamed_topic":"Unbenannt","update_available":"Aktualisierung verfügbar.","upload_finishing":"wird abgeschlossen...","user_not_found":"Nicht gefunden","validate_credential_action":"bestätigen","description_editing_placeholder":"Beschreibung (optional)","label_description":"Beschreibung","button_security":"Sicherheit","panel_title_general":"Allgemein","panel_title_security":"Sicherheit","panel_title_crop":"Zum Anpassen ziehen","panel_title_members":"Mitglieder","permissions_anonymous":"Anonym","permissions_authenticated":"Authentifiziert","topic_delete":"Chat löschen","permissions_user":"Benutzerberechtigungen","password_reset_email_sent":"Eine E-Mail wurde an {email} gesendet. Folgen Sie den Anweisungen in der E-Mail, um Ihr Passwort zurückzusetzen.","label_unarchive_topic":"Archiviert:","menu_item_reply":"Antwort","menu_item_forward":"Nach vorne","forward_to":"Weiterleiten","forward_to_search_placeholder":"Kontakte durchsuchen","label_new_password":"Neues Kennwort","drafty_unknown":"Nicht unterstützt","calls_incoming":"Eingehender Anruf","calls_outgoing":"Ausgehender Anruf","calls_you_label":"Du","menu_item_video_call":"Videoanruf","already_in_call":"Du redest schon!","call_cancelled":"abgebrochen","call_missed":"verpasster","call_declined":"abgelehnt"},"en":{"action_block_contact":"Block Contact","action_cancel":"cancel","action_clear_messages":"Clear Messages","action_delete_messages":"Clear Messages for All","action_leave_chat":"Leave Conversation","action_report_chat":"Report Conversation","archived_contacts":"Archived contacts ({count})","badge_danger":"Untrustworthy","badge_owner":"owner","badge_staff":"Staff-managed","badge_verified":"Verified/official","badge_you":"you","block_contact_warning":"Are you sure you want to block this contact?","blocked_contacts_link":"Blocked contacts ({count})","button_add_another":"Add another","button_add_members":"Add members","button_cancel":"Cancel","button_confirm":"Confirm","button_create":"Create","button_delete_account":"Delete account","button_edit":"Edit","button_logout":"Logout","button_ok":"OK","button_reset":"Reset","button_send_request":"Send request","button_sign_in":"Sign in","button_sign_up":"Sign up","button_subscribe":"Subscribe","button_update":"Update","cannot_initiate_file_upload":"Cannot initiate file upload.","channel":"channel","channel_prompt":"This is a channel","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_block":"Block","chat_invitation_ignore":"Ignore","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","code_doesnot_match":"Code does not match","contacts_not_found":"You have no chats
¯∖_(ツ)_/¯","contacts_not_found_short":"No contacts match \'\'{query}\'\'","credential_email_prompt":"Your registration email","delete_account":"Delete account","delete_account_warning":"Are you sure you want to delete your account? It cannot be undone.","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","deleted_content":"content deleted","download_action":"download","drafty_attachment":"Attachment","drafty_form":"Form:","drafty_image":"Picture","email_dative":"email","email_prompt":"Email, e.g. jdoe@example.com","enable_peers_messaging":"Enable","enter_confirmation_code_prompt":"Enter confirmation code sent to you by {method}:","error_invalid_id":"Invalid ID","file_attachment_too_large":"The file size {size} exceeds the {limit} limit.","forgot_password_link":"Forgot password?","full_name_prompt":"Full name, e.g. John Doe","granted_permissions":"Granted","group_has_no_members":"No members","group_user_id_prompt":"Group or User ID","image_caption_prompt":"Image caption","invalid_content":"invalid content","invalid_security_token":"Invalid security token","label_client":"Client:","label_content_type":"Content type:","label_default_access_mode":"Default access mode:","label_file_name":"File name:","label_group_members":"Group members:","label_incognito_mode":"Incognito mode:","label_message_sound":"Message sound:","label_muting_topic":"Muted:","label_other_user":"Other","label_password":"Password","label_permissions":"Permissions:","label_private":"Private comment","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_reset_password":"Send a password reset email:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server address:","label_server_to_use":"Server to use:","label_size":"Size:","label_topic_name":"Name","label_user_contacts":"Contacts:","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"You:","label_your_name":"Your name","label_your_permissions":"Your permissions:","last_seen_timestamp":"Last seen","leave_chat_warning":"Are you sure you want to leave this conversation?","link_contact_us":"Contact Us","link_privacy_policy":"Privacy Policy","link_terms_of_service":"Terms of Service","login_prompt":"Login","menu_item_archive_topic":"Archive","menu_item_block":"Block","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_delete_topic":"Delete","menu_item_edit_permissions":"Edit permissions","menu_item_info":"Info","menu_item_member_delete":"Remove","menu_item_mute":"Mute","menu_item_reply":"Reply","menu_item_restore_topic":"Restore","menu_item_send_retry":"Retry","menu_item_unblock":"Unblock","menu_item_unmute":"Unmute","message_sending":"sending...","message_sending_failed":"failed","messages_not_readable":"no access to messages","messaging_disabled_prompt":"Messaging disabled","more_online_members":"+{overflow} more","new_message_prompt":"New message","new_password_placeholder":"Enter new password","no_connection":"No connection","no_contacts":"You have no contacts :-(","numeric_confirmation_code_prompt":"Numbers only","online_now":"online now","password_prompt":"Password","password_unchanged_prompt":"Unchanged","peers_messaging_disabled":"Peer\'s messaging is disabled.","permission_admin":"Approve ({val})","permission_delete":"Delete ({val})","permission_join":"Join ({val})","permission_owner":"Owner ({val})","permission_pres":"Get notified ({val})","permission_read":"Read ({val})","permission_share":"Share ({val})","permission_write":"Write ({val})","phone_dative":"phone","private_editing_placeholder":"Visible to you only","push_init_failed":"Failed to initialize push notifications","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","reload_update":"Reload","report_chat_warning":"Are you sure you want to block and report this conversation?","requested_permissions":"Requested","save_attachment":"save","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","search_placeholder":"List like email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Account Settings","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_login":"Sign In","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_register":"Create Account","sidepanel_title_reset":"Reset Password","sidepanel_title_settings":"Settings","stay_logged_in":"Stay logged in","tabtitle_find_user":"find","tabtitle_group_by_id":"by id","tabtitle_new_group":"new group","tags_editor_no_tags":"Add some tags","tags_not_found":"No tags defined. Add some.","title_all_contacts":"All Contacts","title_group_members":"Group Members","title_manage_tags":"Manage","title_not_found":"Not found","title_permissions":"Permissions","title_tag_manager":"Tags (search & discovery)","topic_block_warning":"Are you sure you want to block this conversation?","topic_delete_warning":"Are you sure you want to delete this conversation?","topic_name_editing_placeholder":"Freeform name of the group","unnamed_topic":"Unnamed","update_available":"Update available.","upload_finishing":"finishing...","user_not_found":"Not found","validate_credential_action":"confirm","description_editing_placeholder":"Optional description","label_description":"Description","button_security":"Security","panel_title_crop":"Drag to Adjust","panel_title_general":"General","panel_title_members":"Members","panel_title_security":"Security","panel_title_info":"Info","permissions_anonymous":"Anonymous","permissions_authenticated":"Authenticated","topic_delete":"Delete Conversation","permissions_user":"User\'s Permissions","password_reset_email_sent":"An email has been sent to {email}. Follow the directions in the email to reset your password.","label_unarchive_topic":"Archived:","menu_item_forward":"Forward","forward_to":"Forward to","forward_to_search_placeholder":"Search contacts","label_new_password":"New password","drafty_unknown":"Unsupported","calls_incoming":"Incoming call","calls_outgoing":"Outgoing call","calls_you_label":"You","menu_item_video_call":"Video call","already_in_call":"You already in an ongoing call!","call_cancelled":"cancelled","call_missed":"missed","call_declined":"declined"},"es":{"action_block_contact":"Bloquear contacto","action_cancel":"cancelar","action_clear_messages":"Borrar mensajes","action_delete_messages":"Borrar mensajes para todos","action_leave_chat":"Dejar conversación","action_report_chat":"Reportar conversación","archived_contacts":"Contactos archivados ({count})","badge_danger":"Suspicaz","badge_owner":"propietario","badge_staff":"Administración","badge_verified":"Verificado","badge_you":"tú","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","blocked_contacts_link":"Contactos bloqueados ({count})","button_add_another":"Añadir contacto","button_add_members":"Añadir miembros","button_cancel":"Cancelar","button_confirm":"Confirmar","button_create":"Crear","button_delete_account":"Eliminar cuenta","button_edit":"Editar","button_logout":"Cerrar sesión","button_ok":"OK","button_reset":"Restablecer","button_send_request":"Enviar petición","button_sign_in":"Entrar","button_sign_up":"Regístrate","button_subscribe":"Suscribirse","button_update":"Actualizar","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","channel":"canal","channel_prompt":"Este es un canal","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_block":"Bloquear","chat_invitation_ignore":"Ignorar","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","code_doesnot_match":"El código no coincide","contacts_not_found":"No tienes chats
¯∖_(ツ)_/¯","contacts_not_found_short":"Ningún contacto coincide con \'\'{query}\'\'","credential_email_prompt":"Tu correo electrónico de registro","delete_account":"Eliminar cuenta","delete_account_warning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","deleted_content":"este mensaje fue eliminado","download_action":"descargar","drafty_attachment":"Archivo","drafty_form":"Formulario:","drafty_image":"Imagen","email_dative":"correo electrónico","email_prompt":"Correo electrónico, p.ej. juan@example.com","enable_peers_messaging":"Habilitar","enter_confirmation_code_prompt":"Introduzca el código de confirmación enviado a tu {method}:","error_invalid_id":"ID inválido","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","forgot_password_link":"¿Olvidaste tu contraseña?","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","granted_permissions":"Otorgados","group_has_no_members":"No hay miembros","group_user_id_prompt":"ID del grupo o usuario","image_caption_prompt":"Añade un comentario","invalid_content":"contenido inválido","invalid_security_token":"Token de seguridad inválido","label_client":"Cliente:","label_content_type":"Tipo de contenido:","label_default_access_mode":"Modo de acceso predeterminado:","label_file_name":"Nombre del archivo:","label_group_members":"Miembros del grupo:","label_incognito_mode":"Modo incógnito:","label_message_sound":"Sonido de mensaje:","label_muting_topic":"Silenciado:","label_other_user":"Otros","label_password":"Contraseña","label_permissions":"Permisos:","label_private":"Comentario privado","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","label_sdk":"SDK:","label_server":"Servidor:","label_server_address":"Dirección del servidor:","label_server_to_use":"Servidor para usar:","label_size":"Tamaño:","label_topic_name":"Nombre del tema","label_user_contacts":"Contactos:","label_user_id":"ID:","label_wire_transport":"Transporte de alambre:","label_you":"Tú:","label_your_name":"Tu nombre","label_your_permissions":"Tus permisos:","last_seen_timestamp":"Últ. vez","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","link_contact_us":"Contáctanos","link_privacy_policy":"Política de privacidad","link_terms_of_service":"Términos de uso","login_prompt":"Nombre de usuario","menu_item_archive_topic":"Archivar","menu_item_block":"Bloquear","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_delete_topic":"Eliminar","menu_item_edit_permissions":"Editar permisos","menu_item_info":"Información","menu_item_member_delete":"Eliminar","menu_item_mute":"Silenciar","menu_item_restore_topic":"Restaurar","menu_item_send_retry":"Inténtalo de nuevo","menu_item_unblock":"Desbloquear","menu_item_unmute":"Anular el silencio","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","messages_not_readable":"sin acceso a mensajes","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","more_online_members":"+{overflow} más","new_message_prompt":"Nuevo mensaje","new_password_placeholder":"Introduzca una nueva contraseña","no_connection":"Sin conexión","no_contacts":"No tienes contactos :-(","numeric_confirmation_code_prompt":"Sólo números","online_now":"en línea","password_prompt":"Contraseña","password_unchanged_prompt":"Sin cambios","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","permission_admin":"Approbar ({val})","permission_delete":"Eliminar ({val})","permission_join":"Unirse ({val})","permission_owner":"Propietario ({val})","permission_pres":"Ser notificado ({val})","permission_read":"Leer ({val})","permission_share":"Compartir ({val})","permission_write":"Escribir ({val})","phone_dative":"teléfono","private_editing_placeholder":"Sólo visible para tí","push_init_failed":"Error al inicializar las notificaciones push","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","reload_update":"Recargar","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","requested_permissions":"Solicitados","save_attachment":"guardar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_login":"Iniciar sesión","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_register":"Crear cuenta","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_settings":"Ajustes","stay_logged_in":"Permanecer conectado","tabtitle_find_user":"encontrar","tabtitle_group_by_id":"por ID","tabtitle_new_group":"nuevo grupo","tags_editor_no_tags":"Añadir etiquetas","tags_not_found":"No hay etiquetas definidas. Añade unas.","title_all_contacts":"Todos los contactos","title_group_members":"Miembros del grupo","title_manage_tags":"Gestionar","title_not_found":"No encontrado","title_permissions":"Permisos","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","topic_name_editing_placeholder":"Nombre del grupo","unnamed_topic":"Sin nombre","update_available":"Actualización disponible.","upload_finishing":"terminando...","user_not_found":"Usuario no encontrado","validate_credential_action":"confirmar","description_editing_placeholder":"Descripción (opcional)","label_description":"Descripción","button_security":"Seguridad","panel_title_crop":"Arrastra para ajustar","panel_title_general":"General","panel_title_members":"Miembros","panel_title_security":"Seguridad","panel_title_info":"Información","permissions_anonymous":"Anónimo","permissions_authenticated":"Autenticado","topic_delete":"Eliminar chat","permissions_user":"Permisos del usuario","password_reset_email_sent":"Se ha enviado un correo electrónico a {email}. Siga las instrucciones del correo electrónico para restablecer su contraseña.","label_unarchive_topic":"Archivado:","menu_item_reply":"Respuesta","menu_item_forward":"Reenviar","forward_to":"Reenviar a","forward_to_search_placeholder":"Buscar contactos","label_new_password":"Nueva contraseña","drafty_unknown":"No soportado","calls_incoming":"Llamada entrante","calls_outgoing":"Llamada saliente","calls_you_label":"Tú","menu_item_video_call":"Videollamada","already_in_call":"¡Ya estás hablando!","call_cancelled":"cancelada","call_missed":"perdida","call_declined":"rechazada"},"fr":{"action_block_contact":"Bloquer le Contact","action_cancel":"annuler","action_clear_messages":"Effacer les Messages","action_delete_messages":"Effacer les Messages pour Tous","action_leave_chat":"Quitter la Conversation","action_report_chat":"Signaler la Conversation","archived_contacts":"Contacts archivés ({count})","badge_danger":"Non fiable","badge_owner":"propriétaire","badge_staff":"Géré par le Staff","badge_verified":"Vérifié / Officiel","badge_you":"vous","block_contact_warning":"Êtes-vous sûr de bloquer le contact ?","blocked_contacts_link":"Contacts bloqués ({count})","button_add_another":"Ajouter un autre","button_add_members":"Ajouter des membres","button_cancel":"Annuler","button_confirm":"Confirmer","button_create":"Créer","button_delete_account":"Supprimer le compte","button_edit":"Modifier","button_logout":"Déconnexion","button_ok":"OK","button_reset":"Remettre à Zéro","button_send_request":"Envoyer une demande","button_sign_in":"Connexion","button_sign_up":"Créer un compte","button_subscribe":"S\'abonner","button_update":"Mettre à jour","cannot_initiate_file_upload":"Impossible de démarrer l\'envoi.","channel":"canal","channel_prompt":"C\'est un canal","chat_invitation":"Vous êtes invité à démarrer une conversation. Que voulez vous faire ?","chat_invitation_accept":"Accepter","chat_invitation_block":"Bloquer","chat_invitation_ignore":"Ignorer","clear_messages_warning":"Êtes-vous sûr de vouloir effacer tous les messages ? Aucun retour possible.","code_doesnot_match":"Le code ne correspond pas","contacts_not_found":"Vous n\'avez aucune conversation
¯∖_(ツ)_/¯","contacts_not_found_short":"Aucun contact ne correspond à \'\'{query}\'\'","credential_email_prompt":"Votre email d\'enregistrement","delete_account":"Supprimer le compte","delete_account_warning":"Êtes-vous sûr de vouloir supprimer votre compte ? Aucun retour possible.","delete_messages_warning":"Êtes-vous sûr de vouloir supprimer tous les messages pour tous ? Aucun retour possible.","deleted_content":"contenu supprimé","download_action":"télécharger","drafty_attachment":"Pièce(s) jointe(s)","drafty_form":"Formulaire:","drafty_image":"Image","email_dative":"email","email_prompt":"Email, par exemple jdoe@exemple.com","enable_peers_messaging":"Activer","enter_confirmation_code_prompt":"Entrez le code de confirmation envoyé par {method}:","error_invalid_id":"Identifiant invalide","file_attachment_too_large":"Le fichier de taille {size} dépasse la limite de {limit}.","forgot_password_link":"Mot de passe oublié ?","full_name_prompt":"Nom complet, par exemple John Doe","granted_permissions":"Accordé","group_has_no_members":"Aucun membre","group_user_id_prompt":"Identifiant d\'utilisateur ou de groupe","image_caption_prompt":"Description de l\'image","invalid_content":"contenu invalide","invalid_security_token":"Token de sécurité invalide","label_client":"Client :","label_content_type":"Type de contenu :","label_default_access_mode":"Mode d\'accès par défaut :","label_file_name":"Nom du fichier :","label_group_members":"Membres du groupe :","label_incognito_mode":"Mode incognito :","label_message_sound":"Son du message :","label_muting_topic":"Mué :","label_other_user":"Autre","label_password":"Mot de passe","label_permissions":"Permissions :","label_private":"Commentaire privé","label_push_notifications":"Notifications :","label_push_notifications_disabled":"Notifications (requière HTTPS):","label_reset_password":"Envoyer un mail de remise à zéro de mot de passe :","label_sdk":"SDK :","label_server":"Serveur :","label_server_address":"Adresse du serveur :","label_server_to_use":"Serveur à utiliser :","label_size":"Taille :","label_topic_name":"Nom","label_user_contacts":"Contacts :","label_user_id":"ID :","label_wire_transport":"Transport par cable :","label_you":"Vous :","label_your_name":"Votre nom","label_your_permissions":"Vos permissions :","last_seen_timestamp":"Vu pour la dernière fois","leave_chat_warning":"Êtes-vous sûr de vouloir quitter cette conversation ?","link_contact_us":"Contactez Nous","link_privacy_policy":"Politique de confidentialité","link_terms_of_service":"Conditions d\'utilisation","login_prompt":"Connexion","menu_item_archive_topic":"Archiver","menu_item_block":"Bloquer","menu_item_clear_messages":"Effacer les messages","menu_item_clear_messages_for_all":"Effacer pour Tous","menu_item_delete":"Supprimer","menu_item_delete_for_all":"Supprimer pour Tous","menu_item_delete_topic":"Supprimer","menu_item_edit_permissions":"Modifier les permissions","menu_item_info":"Informations","menu_item_member_delete":"Supprimer","menu_item_mute":"Rendre muer","menu_item_reply":"Répondre","menu_item_restore_topic":"Restorer","menu_item_send_retry":"Réessayer","menu_item_unblock":"Débloquer","menu_item_unmute":"Recevoir à nouveau","message_sending":"envoi en cours...","message_sending_failed":"échoué","messages_not_readable":"aucun accès aux messages","messaging_disabled_prompt":"Discussion désactivée","more_online_members":"+{overflow} de plus","new_message_prompt":"Nouveau message","new_password_placeholder":"Entrez un nouveau mot de passe","no_connection":"Aucune connexion","no_contacts":"Vous n\'avez pas de contacts :-(","numeric_confirmation_code_prompt":"Nombres seulement","online_now":"en ligne","password_prompt":"Mot de passe","password_unchanged_prompt":"Non changé","peers_messaging_disabled":"La messagerie point à point est désactivée.","permission_admin":"Approver ({val})","permission_delete":"Supprimer ({val})","permission_join":"Rejoindre ({val})","permission_owner":"Propriétaire ({val})","permission_pres":"Recevoir une notification ({val})","permission_read":"Lire ({val})","permission_share":"Partager ({val})","permission_write":"Ecrire ({val})","phone_dative":"téléphone","private_editing_placeholder":"Visible par vous seulement","push_init_failed":"Impossible d\'initialiser les notifications push","reconnect_countdown":"Déconnecté. Reconnexion dans {seconds}…","reconnect_now":"Essayer maintenant","reload_update":"Recharger","report_chat_warning":"Êtes-vous sûr de vouloir bloquer et signaler cette conversation ?","requested_permissions":"Demandé","save_attachment":"sauvegarder","search_for_contacts":"Utilisez la recherche pour trouver des contacts","search_no_results":"La recherche n\'a donné aucun résultat","search_placeholder":"Liste comme email:alice@exemple.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Paramètres du compte","sidepanel_title_archive":"Conversations Archivées","sidepanel_title_blocked":"Conversations Bloquées","sidepanel_title_cred":"Confirmer les identifiants","sidepanel_title_login":"Se Connecter","sidepanel_title_newtpk":"Démarrer une nouvelle Conversation","sidepanel_title_register":"Créer un compte","sidepanel_title_reset":"Remettre à Zéro le Mot de Passe","sidepanel_title_settings":"Paramètres","stay_logged_in":"Rester connecté","tabtitle_find_user":"trouver","tabtitle_group_by_id":"par identifiant","tabtitle_new_group":"nouveau groupe","tags_editor_no_tags":"Ajouter des étiquettes","tags_not_found":"Aucune étiquette définie. Ajoutez en.","title_all_contacts":"Tous les Contacts","title_group_members":"Membres du Groupe","title_manage_tags":"Gérer","title_not_found":"Pas trouvé","title_permissions":"Permissions","title_tag_manager":"Etiquettes (recherche & découverte)","topic_block_warning":"Êtes-vous sûr de vouloir bloquer cette conversation ?","topic_delete_warning":"Êtes-vous sûr de vouloir supprimer cette conversation ?","topic_name_editing_placeholder":"Nom libre du groupe","unnamed_topic":"Non nommé","update_available":"Mise à jour disponible.","upload_finishing":"fin...","user_not_found":"Pas trouvé","validate_credential_action":"confirmer","description_editing_placeholder":"Description facultative","label_description":"Description","button_security":"Sécurité","panel_title_crop":"Déplacez pour ajuster","panel_title_general":"Général","panel_title_members":"Membres","panel_title_security":"Sécurité","panel_title_info":"Informations","permissions_anonymous":"Anonyme","permissions_authenticated":"Authentifié","topic_delete":"Supprimer la Conversation","permissions_user":"Permissions d\'Utilisateur","password_reset_email_sent":"Un email a été envoyé à {email}. Suivez les instructions du mail pour remettre à zéro votre mot de passe.","label_unarchive_topic":"Archivé:","menu_item_forward":"Transférer","forward_to":"Transférer à","forward_to_search_placeholder":"Rechercher des contacts","label_new_password":"Nouveau mot de passe","drafty_unknown":"Non supporté"},"ko":{"action_block_contact":"연락차단","action_cancel":"취소","action_clear_messages":"메시지지우기","action_delete_messages":"모든메시지지우기","action_leave_chat":"대화나누기","action_report_chat":"대화기록","archived_contacts":"보관된연락처({수})","badge_danger":"의심 많은","badge_owner":"소유자","badge_staff":"직원 관리하에","badge_verified":"확인 됨","badge_you":"당신","block_contact_warning":"이연락처를차단하시겠습니까?","blocked_contacts_link":"차단된연락처({수})","button_add_another":"다른항목추가","button_add_members":"회원추가","button_cancel":"취소","button_confirm":"확인","button_create":"작성","button_delete_account":"계정삭제","button_edit":"편집","button_logout":"로그아웃","button_ok":"OK","button_reset":"재설정","button_send_request":"요청보내기","button_sign_in":"로그인","button_sign_up":"가입","button_subscribe":"구독","button_update":"업데이트","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","channel":"채널","channel_prompt":"이 채널입니다","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_block":"차단","chat_invitation_ignore":"무시","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","code_doesnot_match":"코드가일치하지않습니다","contacts_not_found":"채팅이없습니다
¯∖_(ツ)_/¯","contacts_not_found_short":"\'{문의}\'와일치하는연락처가없습니다.","credential_email_prompt":"등록이메일","delete_account":"계정삭제","delete_account_warning":"계정을삭제하시겠습니까?실행취소할수없습니다.","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","deleted_content":"내용이 삭제되었습니다","download_action":"다운로드","drafty_attachment":"부착","drafty_form":"형태:","drafty_image":"이미지","email_dative":"이메일","email_prompt":"이메일(예:hong@example.com)","enable_peers_messaging":"활성화","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","error_invalid_id":"잘못된ID","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","forgot_password_link":"비밀번호를잊으셨습니까?","full_name_prompt":"전체이름(예:홍길동)","granted_permissions":"승낙하다","group_has_no_members":"회원없음","group_user_id_prompt":"그룹또는사용자ID","image_caption_prompt":"이미지설명","invalid_content":"잘못된내용","invalid_security_token":"유효하지않은보안토큰","label_client":"클라이언트: ","label_content_type":"컨텐츠유형: ","label_default_access_mode":"기본액세스모드: ","label_file_name":"파일이름: ","label_group_members":"그룹회원: ","label_incognito_mode":"시크릿모드: ","label_message_sound":"메시지소리: ","label_muting_topic":"음소거: ","label_other_user":"기타","label_password":"비밀번호","label_permissions":"권한: ","label_private":"개인코멘트","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_reset_password":"비밀번호재설정이메일보내기: ","label_sdk":"SDK:","label_server":"서버: ","label_server_address":"서버주소: ","label_server_to_use":"사용할서버:","label_size":"크기: ","label_topic_name":"이름","label_user_contacts":"연락처: ","label_user_id":"ID:","label_wire_transport":"와이어수송:","label_you":"당신: ","label_your_name":"이름","label_your_permissions":"권한: ","last_seen_timestamp":"마지막으로본","leave_chat_warning":"이대화를나가시겠습니까?","link_contact_us":"문의처","link_privacy_policy":"개인정보보호정책","link_terms_of_service":"서비스약관","login_prompt":"로그인","menu_item_archive_topic":"보관","menu_item_block":"차단","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_delete_topic":"삭제","menu_item_edit_permissions":"편집권한","menu_item_info":"정보","menu_item_member_delete":"제거","menu_item_mute":"음소거","menu_item_restore_topic":"복원","menu_item_send_retry":"다시시도","menu_item_unblock":"차단해제","menu_item_unmute":"음소거해제","message_sending":"보내기...","message_sending_failed":"실패","messages_not_readable":"메시지에 액세스 할 수 없습니다","messaging_disabled_prompt":"메시지비활성화","more_online_members":"+{넘침}더보기","new_message_prompt":"새메시지","new_password_placeholder":"새비밀번호입력","no_connection":"연결없음","no_contacts":"연락처가없습니다 (._.)","numeric_confirmation_code_prompt":"숫자만","online_now":"현재접속중","password_prompt":"비밀번호","password_unchanged_prompt":"변경되지않음","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","permission_admin":"승인({val})","permission_delete":"삭제({val})","permission_join":"참여({val})","permission_owner":"소유자({val})","permission_pres":"알림받기({val})","permission_read":"읽기({val})","permission_share":"공유({val})","permission_write":"쓰기({val})","phone_dative":"전화","private_editing_placeholder":"나만볼수있습니다","push_init_failed":"푸시알림을초기화하지못했습니다","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","reload_update":"재로드","report_chat_warning":"이대화를차단하고기록하시겠습니까?","requested_permissions":"요청","save_attachment":"저장","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_account_settings":"계정설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","sidepanel_title_cred":"자격증명확인","sidepanel_title_login":"로그인","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_register":"계정만들기","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_settings":"설정","stay_logged_in":"로그인상태유지","tabtitle_find_user":"찾기","tabtitle_group_by_id":"id로","tabtitle_new_group":"새그룹","tags_editor_no_tags":"일부태그추가","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","title_all_contacts":"모든연락처","title_group_members":"그룹구성원","title_manage_tags":"관리","title_not_found":"찾을수없음","title_permissions":"권한","title_tag_manager":"태그(사용자검색)","topic_block_warning":"이대화를차단하시겠습니까?","topic_delete_warning":"이대화를삭제하시겠습니까?","topic_name_editing_placeholder":"그룹의자유형이름","unnamed_topic":"이름없는","update_available":"업데이트가능.","upload_finishing":"마무리...","user_not_found":"찾을수없음","validate_credential_action":"확인","description_editing_placeholder":"설명(선택 사항)","label_description":"설명","button_security":"보안","panel_title_crop":"드래그하여 조정","panel_title_general":"일반","panel_title_members":"구성원","panel_title_security":"보안","panel_title_info":"정보","permissions_anonymous":"익명","permissions_authenticated":"인증됨","topic_delete":"채팅 삭제","permissions_user":"사용자 권한","password_reset_email_sent":"이메일이 {email}(으)로 전송되었습니다. 이메일의 지침에 따라 비밀번호를 재설정하세요.","label_unarchive_topic":"보관됨:","menu_item_reply":"회신하다","menu_item_forward":"리디렉션","forward_to":"메시지를 리디렉션","forward_to_search_placeholder":"연락처 검색","label_new_password":"새 비밀번호","drafty_unknown":"지원되지 않음","calls_incoming":"수신 전화","calls_outgoing":"발신 전화","calls_you_label":"너","menu_item_video_call":"영상 통화","already_in_call":"당신은 이미 말하고 있습니다!","call_cancelled":"취소 된","call_missed":"부재중","call_declined":"통화 거부"},"ro":{"action_block_contact":"Blochează contact","action_cancel":"anulează","action_clear_messages":"Șterge mesajele","action_delete_messages":"Șterge toate mesajele","action_leave_chat":"Ieși din conversație","action_report_chat":"Raportează conversația","archived_contacts":"Contacte arhivate ({count})","badge_danger":"Suspicios","badge_owner":"owner","badge_staff":"Administrare","badge_verified":"Verificat","badge_you":"tu","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","blocked_contacts_link":"Contact blocate ({count})","button_add_another":"Adaugă","button_add_members":"Adaugă persoane","button_cancel":"Anulează","button_confirm":"Confirmă","button_create":"Creează","button_delete_account":"Șterge cont","button_edit":"Editează","button_logout":"Deconectare","button_ok":"OK","button_reset":"Resetează","button_send_request":"Trimite cerere","button_sign_in":"Conectează-te","button_sign_up":"Creează cont","button_subscribe":"Subscribe","button_update":"Actualizează","cannot_initiate_file_upload":"Nu se poate face încărcarea.","channel":"canal","channel_prompt":"Acesta este un canal","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_block":"Blochează","chat_invitation_ignore":"Ignoră","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","code_doesnot_match":"Codul furnizat nu este valid","contacts_not_found":"Nu ai contacte salvate
¯∖_(ツ)_/¯","contacts_not_found_short":"Niciun contact găsit după criteriile \'\'{query}\'\'","credential_email_prompt":"Adresa de e-mail","delete_account":"Șterge contul","delete_account_warning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","deleted_content":"conținut șters","download_action":"download","drafty_attachment":"Atasament","drafty_form":"Formă:","drafty_image":"Imagine","email_dative":"email","email_prompt":"Adresa de e-mail","enable_peers_messaging":"Activează","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","error_invalid_id":"ID Invalid","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","forgot_password_link":"Ți-ai uitat parola?","full_name_prompt":"Numele tău","granted_permissions":"Oferite","group_has_no_members":"În acest grup nu se află persoane","group_user_id_prompt":"Grup sau user ID","image_caption_prompt":"Titlul imaginii","invalid_content":"conținut invalid","invalid_security_token":"Codul de securitate este invalid","label_client":"Client:","label_content_type":"Tip conținut:","label_default_access_mode":"Default access mode:","label_file_name":"Nume fișier:","label_group_members":"Membrii grupului:","label_incognito_mode":"Mod incognito:","label_message_sound":"Sunet de mesaj:","label_muting_topic":"Mod silențios (muted):","label_other_user":"Altele","label_password":"Parola","label_permissions":"Permisiuni:","label_private":"Comentariu privat","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_reset_password":"Resetează parola:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Adresa serverului:","label_server_to_use":"Server de utilizat:","label_size":"Size:","label_topic_name":"Nume","label_user_contacts":"Contacte:","label_user_id":"ID:","label_wire_transport":"Transportul legat:","label_you":"Tu:","label_your_name":"Numele tău","label_your_permissions":"Permisiuniile tale:","last_seen_timestamp":"Văzut ultima dată","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","link_contact_us":"Contactează-ne","link_privacy_policy":"Politica de Confidențialitate","link_terms_of_service":"Termenii Serviciului","login_prompt":"Conectează-te","menu_item_archive_topic":"Arhivează","menu_item_block":"Blochează","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_delete_topic":"Șterge","menu_item_edit_permissions":"Editează permisiuni","menu_item_info":"Info","menu_item_member_delete":"Șterge persoană","menu_item_mute":"Mute","menu_item_restore_topic":"Restabili","menu_item_send_retry":"Reîncearcă","menu_item_unblock":"Deblochează","menu_item_unmute":"Unmute","message_sending":"se trimite...","message_sending_failed":"eroare","messages_not_readable":"Mesajele nu pot fi citite","messaging_disabled_prompt":"Mesageria este dezactivată","more_online_members":"+{overflow} mai mult","new_message_prompt":"Mesaj nou","new_password_placeholder":"Introdu parolă","no_connection":"Nu există conexiune","no_contacts":"Nu ai contacte adăugate :-(","numeric_confirmation_code_prompt":"Doar cifre","online_now":"online acum","password_prompt":"Parola","password_unchanged_prompt":"Neschimbată","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","permission_admin":"Aprobare ({val})","permission_delete":"Ștergere ({val})","permission_join":"Participare ({val})","permission_owner":"Deținător ({val})","permission_pres":"Notificare ({val})","permission_read":"Citire ({val})","permission_share":"Distribuire ({val})","permission_write":"Scriere ({val})","phone_dative":"telefon","private_editing_placeholder":"Vizibil doar ție","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","reload_update":"Reîncarcă","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","requested_permissions":"Necesare","save_attachment":"salvează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","search_placeholder":"Caută după e-mail sau număr telefon...","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_login":"Conectează-te","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_register":"Creează Cont","sidepanel_title_reset":"Resetează Parola","sidepanel_title_settings":"Setări","stay_logged_in":"Rămâi conectat","tabtitle_find_user":"caută","tabtitle_group_by_id":"după id","tabtitle_new_group":"grup nou","tags_editor_no_tags":"Adaugă tag-uri","tags_not_found":"Niciun tag definit. Adaugă.","title_all_contacts":"Toate Contactele","title_group_members":"Persoanele din grup","title_manage_tags":"Administrează","title_not_found":"Nu a fost găsit","title_permissions":"Permisiuni","title_tag_manager":"Tag-uri (user discovery)","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","topic_name_editing_placeholder":"Numele grupului","unnamed_topic":"Nedenumit","update_available":"Actualizare disponibilă.","upload_finishing":"se încarcă...","user_not_found":"Utilizatorul nu a fost găsit","validate_credential_action":"confirmă","description_editing_placeholder":"Descriere (opțional)","label_description":"Descriere","button_security":"Securitate","panel_title_crop":"Trageți pentru a ajusta","panel_title_general":"Generale","panel_title_members":"Membri","panel_title_security":"Securitate","panel_title_info":"Info","permissions_anonymous":"Anonim","permissions_authenticated":"Autentificat","topic_delete":"Ștergeți Chat","permissions_user":"Permisiunile utilizatorului","password_reset_email_sent":"Un e-mail a fost trimis către {email}. Urmați instrucțiunile din e-mail pentru a vă reseta parola.","label_unarchive_topic":"Arhivat:","menu_item_reply":"A raspunde","menu_item_forward":"Redirecţiona","forward_to":"Redirecționați către","forward_to_search_placeholder":"Căutați contacte","label_new_password":"Parolă Nouă","drafty_unknown":"Neacceptat","calls_incoming":"Apel primit","calls_outgoing":"Apel efectuat","calls_you_label":"Tu","menu_item_video_call":"Apel video","already_in_call":"Deja vorbesti!","call_cancelled":"anulat","call_missed":"pierdut","call_declined":"refuzat"},"ru":{"action_block_contact":"Заблокировать контакт","action_cancel":"отменить","action_clear_messages":"Удалить сообщения","action_delete_messages":"Удалить сообщения","action_leave_chat":"Уйти из чата","action_report_chat":"Сообщить о нарушении","archived_contacts":"Чаты в архиве ({count})","badge_danger":"Подозрительный","badge_owner":"влад.","badge_staff":"Администрация","badge_verified":"Верифицированный","badge_you":"вы","block_contact_warning":"Вы действительно заблокировать этот контакт?","blocked_contacts_link":"Заблокированные ({count})","button_add_another":"Добавить","button_add_members":"Добавить","button_cancel":"Отменить","button_confirm":"Подтвердить","button_create":"Создать","button_delete_account":"Удалить аккаунт","button_edit":"Редактировать","button_logout":"Выйти","button_ok":"OK","button_reset":"Изменить","button_send_request":"Отправить","button_sign_in":"Войти","button_sign_up":"Создать аккаунт","button_subscribe":"Подписаться","button_update":"Применить","cannot_initiate_file_upload":"Ошибка загрузки файла.","channel":"канал","channel_prompt":"Создать канал","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_block":"Заблокировать","chat_invitation_ignore":"Игнорировать","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","code_doesnot_match":"Код не совпадает","contacts_not_found":"Чатов нет
¯∖_(ツ)_/¯","contacts_not_found_short":"Нет контактов для запроса \'\'{query}\'\'","credential_email_prompt":"Регистрационный емейл","delete_account":"Удалить аккаунт","delete_account_warning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","deleted_content":"удалено","download_action":"скачать","drafty_attachment":"Аттачмент","drafty_form":"Форма:","drafty_image":"Картинка","email_dative":"емейлу","email_prompt":"Email, напр. ivan@example.com","enable_peers_messaging":"Разблокировать.","enter_confirmation_code_prompt":"Код подтверждения, полученный по {method}:","error_invalid_id":"Неверный ID","file_attachment_too_large":"Размер файла {size} превышает {limit} лимит.","forgot_password_link":"Напомнить пароль","full_name_prompt":"Полное имя, напр. Иван Петров","granted_permissions":"Получены","group_has_no_members":"Нет участников","group_user_id_prompt":"ID чата или пользователя","image_caption_prompt":"Подпись к фото","invalid_content":"сообщение не читается","invalid_security_token":"Токен некорректен","label_client":"Клиент:","label_content_type":"Тип:","label_default_access_mode":"Доступ по умолчанию:","label_file_name":"Имя файла:","label_group_members":"Участники чата:","label_incognito_mode":"Режим инкогнито:","label_message_sound":"Звук нового сообщения:","label_muting_topic":"Без уведомлений","label_other_user":"Второй","label_password":"Пароль","label_permissions":"Права доступа:","label_private":"Комментарий","label_push_notifications":"Уведомления:","label_push_notifications_disabled":"Уведомления (требуют HTTPS):","label_reset_password":"Отправить емейл для смены пароля:","label_sdk":"SDK:","label_server":"Сервер:","label_server_address":"Адрес сервера:","label_server_to_use":"Использовать сервер:","label_size":"Размер:","label_topic_name":"Название","label_user_contacts":"Конакты:","label_user_id":"ID:","label_wire_transport":"Соединение:","label_you":"Вы:","label_your_name":"Ваше имя","label_your_permissions":"Ваши права доступа:","last_seen_timestamp":"Был активен","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","link_contact_us":"Связаться с нами","link_privacy_policy":"Политика конфиденциальности","link_terms_of_service":"Условия сервиса","login_prompt":"Логин","menu_item_archive_topic":"В архив","menu_item_block":"Заблокировать","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_delete_topic":"Удалить чат","menu_item_edit_permissions":"Права доступа","menu_item_info":"Информация","menu_item_member_delete":"Отписать","menu_item_mute":"Не уведомлять","menu_item_restore_topic":"Разархивировать","menu_item_send_retry":"Отправить заново","menu_item_unblock":"Разблокировать","menu_item_unmute":"Уведомлять","message_sending":"в пути...","message_sending_failed":"ошибка","messages_not_readable":"нет доступа к сообщениям","messaging_disabled_prompt":"Отправка недоступна","more_online_members":"+еще {overflow}","new_message_prompt":"Новое сообщение","new_password_placeholder":"Введите новый пароль","no_connection":"Нет связи","no_contacts":"Ничего нет :-(","numeric_confirmation_code_prompt":"Только цифры","online_now":"онлайн","password_prompt":"Пароль","password_unchanged_prompt":"Не изменен","peers_messaging_disabled":"Чат заблокирован у корреспондента.","permission_admin":"Подтверждать ({val})","permission_delete":"Удалять ({val})","permission_join":"Подписываться ({val})","permission_owner":"Владелец ({val})","permission_pres":"Уведомлять ({val})","permission_read":"Читать ({val})","permission_share":"Приглашать ({val})","permission_write":"Писать ({val})","phone_dative":"телефону","private_editing_placeholder":"Виден только вам","push_init_failed":"Ошибка инициализации пуш уведомлений","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","reload_update":"Обновить","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","requested_permissions":"Требуются","save_attachment":"сохранить","search_for_contacts":"Поиск контактов","search_no_results":"Ничего не найдено","search_placeholder":"Список, напр. email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","sidepanel_title_account_settings":"Настройки аккаунта","sidepanel_title_archive":"Архив чатов","sidepanel_title_blocked":"Заблокированные чаты","sidepanel_title_cred":"Подтвердить","sidepanel_title_login":"Авторизация","sidepanel_title_newtpk":"Новый чат","sidepanel_title_register":"Зарегистрироваться","sidepanel_title_reset":"Сменить пароль","sidepanel_title_settings":"Настройки","stay_logged_in":"Запомнить","tabtitle_find_user":"найти","tabtitle_group_by_id":"по id","tabtitle_new_group":"создать","tags_editor_no_tags":"Добавьте теги","tags_not_found":"Тегов нет. Добавьте","title_all_contacts":"Все контакты","title_group_members":"Участники","title_manage_tags":"Редактировать","title_not_found":"Не найден","title_permissions":"Права доступа","title_tag_manager":"Теги для поиска","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_name_editing_placeholder":"Название чата","unnamed_topic":"Без названия","update_available":"Есть новая версия приложения.","upload_finishing":"завершение...","user_not_found":"Не найден","validate_credential_action":"подтвердить","description_editing_placeholder":"Описание (не обязательно)","label_description":"Описание","button_security":"Безопасность","panel_title_crop":"Обрезать картинку","panel_title_general":"Общие настройки","panel_title_members":"Участники","panel_title_security":"Безопасность","panel_title_info":"Подробности","permissions_anonymous":"Анонимный","permissions_authenticated":"Авторизованный","topic_delete":"Удалить чат","permissions_user":"Права доступа","password_reset_email_sent":"Сообщение было отправлено на адрес {email}. Следуйте инструкциям в сообщении, чтобы изменить пароль.","label_unarchive_topic":"Архивирован:","menu_item_reply":"Ответить","menu_item_forward":"Переслать","forward_to":"Переслать","forward_to_search_placeholder":"Поиск контактов","label_new_password":"Новый пароль","drafty_unknown":"Не поддерживается","calls_incoming":"Входящий звонок","calls_outgoing":"Исходящий звонок","calls_you_label":"Вы","menu_item_video_call":"Видеозвонок","already_in_call":"Вы уже звоните кому-то!","call_cancelled":"отменен","call_missed":"пропущен","call_declined":"отклонен"},"zh-TW":{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_another":"新增其他人","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話
¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 \'\'{query}\'\' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","deleted_content":"內容已被刪除","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人:","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","validate_credential_action":"確認","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"一封電子郵件已發送至 {email}。按照電子郵件中的說明重置密碼。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒"},"zh":{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_another":"加上另一个","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话
¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配\'\'{query}\'\'","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","deleted_content":"内容已删除","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"蓦然访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来:","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后可见","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"成员间消息已禁用。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索返回任何结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","validate_credential_action":"确认","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"一封电子邮件已发送至 {email}。按照电子邮件中的说明重置密码。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒"}}'),r=function(e){const t=[];let a=0;for(let s=0;s>6|192,t[a++]=63&i|128):55296==(64512&i)&&s+1>18|240,t[a++]=i>>12&63|128,t[a++]=i>>6&63|128,t[a++]=63&i|128):(t[a++]=i>>12|224,t[a++]=i>>6&63|128,t[a++]=63&i|128)}return t},l={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:"function"==typeof atob,encodeByteArray(e,t){if(!Array.isArray(e))throw Error("encodeByteArray takes an array as a parameter");this.init_();const a=t?this.byteToCharMapWebSafe_:this.byteToCharMap_,s=[];for(let t=0;t>2,d=(3&i)<<4|o>>4;let h=(15&o)<<2|l>>6,p=63&l;r||(p=64,n||(h=64)),s.push(a[c],a[d],a[h],a[p])}return s.join("")},encodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?btoa(e):this.encodeByteArray(r(e),t)},decodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?atob(e):function(e){const t=[];let a=0,s=0;for(;a191&&i<224){const n=e[a++];t[s++]=String.fromCharCode((31&i)<<6|63&n)}else if(i>239&&i<365){const n=((7&i)<<18|(63&e[a++])<<12|(63&e[a++])<<6|63&e[a++])-65536;t[s++]=String.fromCharCode(55296+(n>>10)),t[s++]=String.fromCharCode(56320+(1023&n))}else{const n=e[a++],o=e[a++];t[s++]=String.fromCharCode((15&i)<<12|(63&n)<<6|63&o)}}return t.join("")}(this.decodeStringToByteArray(e,t))},decodeStringToByteArray(e,t){this.init_();const a=t?this.charToByteMapWebSafe_:this.charToByteMap_,s=[];for(let t=0;t>4;if(s.push(l),64!==o){const e=n<<4&240|o>>2;if(s.push(e),64!==r){const e=o<<6&192|r;s.push(e)}}}return s},init_(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(let e=0;e=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(e)]=e,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(e)]=e)}}},c=function(e){return function(e){const t=r(e);return l.encodeByteArray(t,!0)}(e).replace(/\./g,"")};class d{constructor(){this.reject=()=>{},this.resolve=()=>{},this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}wrapCallback(e){return(t,a)=>{t?this.reject(t):this.resolve(a),"function"==typeof e&&(this.promise.catch((()=>{})),1===e.length?e(t):e(t,a))}}}function h(){return"object"==typeof indexedDB}function p(){return new Promise(((e,t)=>{try{let a=!0;const s="validate-browser-context-for-indexeddb-analytics-module",i=self.indexedDB.open(s);i.onsuccess=()=>{i.result.close(),a||self.indexedDB.deleteDatabase(s),e(!0)},i.onupgradeneeded=()=>{a=!1},i.onerror=()=>{var e;t((null===(e=i.error)||void 0===e?void 0:e.message)||"")}}catch(e){t(e)}}))}class u extends Error{constructor(e,t,a){super(t),this.code=e,this.customData=a,this.name="FirebaseError",Object.setPrototypeOf(this,u.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,m.prototype.create)}}class m{constructor(e,t,a){this.service=e,this.serviceName=t,this.errors=a}create(e,...t){const a=t[0]||{},s=`${this.service}/${e}`,i=this.errors[e],n=i?function(e,t){return e.replace(g,((e,a)=>{const s=t[a];return null!=s?String(s):`<${a}?>`}))}(i,a):"Error",o=`${this.serviceName}: ${n} (${s}).`;return new u(s,o,a)}}const g=/\{\$([^}]+)}/g;function _(e,t){if(e===t)return!0;const a=Object.keys(e),s=Object.keys(t);for(const i of a){if(!s.includes(i))return!1;const a=e[i],n=t[i];if(f(a)&&f(n)){if(!_(a,n))return!1}else if(a!==n)return!1}for(const e of s)if(!a.includes(e))return!1;return!0}function f(e){return null!==e&&"object"==typeof e}function b(e){return e&&e._delegate?e._delegate:e}function v(e,t){return new Promise(((a,s)=>{e.onsuccess=e=>{a(e.target.result)},e.onerror=e=>{var a;s(`${t}: ${null===(a=e.target.error)||void 0===a?void 0:a.message}`)}}))}class y{constructor(e){this._db=e,this.objectStoreNames=this._db.objectStoreNames}transaction(e,t="readonly"){return new w(this._db.transaction.call(this._db,e,t))}createObjectStore(e,t){return new C(this._db.createObjectStore(e,t))}close(){this._db.close()}}class w{constructor(e){this._transaction=e,this.complete=new Promise(((e,t)=>{this._transaction.oncomplete=function(){e()},this._transaction.onerror=()=>{t(this._transaction.error)},this._transaction.onabort=()=>{t(this._transaction.error)}}))}objectStore(e){return new C(this._transaction.objectStore(e))}}class C{constructor(e){this._store=e}index(e){return new E(this._store.index(e))}createIndex(e,t,a){return new E(this._store.createIndex(e,t,a))}get(e){return v(this._store.get(e),"Error reading from IndexedDB")}put(e,t){return v(this._store.put(e,t),"Error writing to IndexedDB")}delete(e){return v(this._store.delete(e),"Error deleting from IndexedDB")}clear(){return v(this._store.clear(),"Error clearing IndexedDB object store")}}class E{constructor(e){this._index=e}get(e){return v(this._index.get(e),"Error reading from IndexedDB")}}function S(e,t,a){return new Promise(((s,i)=>{try{const n=indexedDB.open(e,t);n.onsuccess=e=>{s(new y(e.target.result))},n.onerror=e=>{var t;i(`Error opening indexedDB: ${null===(t=e.target.error)||void 0===t?void 0:t.message}`)},n.onupgradeneeded=e=>{a(new y(n.result),e.oldVersion,e.newVersion,new w(n.transaction))}}catch(e){i(`Error opening indexedDB: ${e.message}`)}}))}async function M(e){return new Promise(((t,a)=>{try{const s=indexedDB.deleteDatabase(e);s.onsuccess=()=>{t()},s.onerror=t=>{var s;a(`Error deleting indexedDB database "${e}": ${null===(s=t.target.error)||void 0===s?void 0:s.message}`)}}catch(t){a(`Error deleting indexedDB database "${e}": ${t.message}`)}}))}class k{constructor(e,t,a){this.name=e,this.instanceFactory=t,this.type=a,this.multipleInstances=!1,this.serviceProps={},this.instantiationMode="LAZY",this.onInstanceCreated=null}setInstantiationMode(e){return this.instantiationMode=e,this}setMultipleInstances(e){return this.multipleInstances=e,this}setServiceProps(e){return this.serviceProps=e,this}setInstanceCreatedCallback(e){return this.onInstanceCreated=e,this}}const T="[DEFAULT]";class N{constructor(e,t){this.name=e,this.container=t,this.component=null,this.instances=new Map,this.instancesDeferred=new Map,this.instancesOptions=new Map,this.onInitCallbacks=new Map}get(e){const t=this.normalizeInstanceIdentifier(e);if(!this.instancesDeferred.has(t)){const e=new d;if(this.instancesDeferred.set(t,e),this.isInitialized(t)||this.shouldAutoInitialize())try{const a=this.getOrInitializeService({instanceIdentifier:t});a&&e.resolve(a)}catch(e){}}return this.instancesDeferred.get(t).promise}getImmediate(e){var t;const a=this.normalizeInstanceIdentifier(null==e?void 0:e.identifier),s=null!==(t=null==e?void 0:e.optional)&&void 0!==t&&t;if(!this.isInitialized(a)&&!this.shouldAutoInitialize()){if(s)return null;throw Error(`Service ${this.name} is not available`)}try{return this.getOrInitializeService({instanceIdentifier:a})}catch(e){if(s)return null;throw e}}getComponent(){return this.component}setComponent(e){if(e.name!==this.name)throw Error(`Mismatching Component ${e.name} for Provider ${this.name}.`);if(this.component)throw Error(`Component for ${this.name} has already been provided`);if(this.component=e,this.shouldAutoInitialize()){if(function(e){return"EAGER"===e.instantiationMode}(e))try{this.getOrInitializeService({instanceIdentifier:T})}catch(e){}for(const[e,t]of this.instancesDeferred.entries()){const a=this.normalizeInstanceIdentifier(e);try{const e=this.getOrInitializeService({instanceIdentifier:a});t.resolve(e)}catch(e){}}}}clearInstance(e="[DEFAULT]"){this.instancesDeferred.delete(e),this.instancesOptions.delete(e),this.instances.delete(e)}async delete(){const e=Array.from(this.instances.values());await Promise.all([...e.filter((e=>"INTERNAL"in e)).map((e=>e.INTERNAL.delete())),...e.filter((e=>"_delete"in e)).map((e=>e._delete()))])}isComponentSet(){return null!=this.component}isInitialized(e="[DEFAULT]"){return this.instances.has(e)}getOptions(e="[DEFAULT]"){return this.instancesOptions.get(e)||{}}initialize(e={}){const{options:t={}}=e,a=this.normalizeInstanceIdentifier(e.instanceIdentifier);if(this.isInitialized(a))throw Error(`${this.name}(${a}) has already been initialized`);if(!this.isComponentSet())throw Error(`Component ${this.name} has not been registered yet`);const s=this.getOrInitializeService({instanceIdentifier:a,options:t});for(const[e,t]of this.instancesDeferred.entries()){a===this.normalizeInstanceIdentifier(e)&&t.resolve(s)}return s}onInit(e,t){var a;const s=this.normalizeInstanceIdentifier(t),i=null!==(a=this.onInitCallbacks.get(s))&&void 0!==a?a:new Set;i.add(e),this.onInitCallbacks.set(s,i);const n=this.instances.get(s);return n&&e(n,s),()=>{i.delete(e)}}invokeOnInitCallbacks(e,t){const a=this.onInitCallbacks.get(t);if(a)for(const s of a)try{s(e,t)}catch(e){}}getOrInitializeService({instanceIdentifier:e,options:t={}}){let a=this.instances.get(e);if(!a&&this.component&&(a=this.component.instanceFactory(this.container,{instanceIdentifier:(s=e,s===T?void 0:s),options:t}),this.instances.set(e,a),this.instancesOptions.set(e,t),this.invokeOnInitCallbacks(a,e),this.component.onInstanceCreated))try{this.component.onInstanceCreated(this.container,e,a)}catch(e){}var s;return a||null}normalizeInstanceIdentifier(e="[DEFAULT]"){return this.component?this.component.multipleInstances?e:T:e}shouldAutoInitialize(){return!!this.component&&"EXPLICIT"!==this.component.instantiationMode}}class A{constructor(e){this.name=e,this.providers=new Map}addComponent(e){const t=this.getProvider(e.name);if(t.isComponentSet())throw new Error(`Component ${e.name} has already been registered with ${this.name}`);t.setComponent(e)}addOrOverwriteComponent(e){this.getProvider(e.name).isComponentSet()&&this.providers.delete(e.name),this.addComponent(e)}getProvider(e){if(this.providers.has(e))return this.providers.get(e);const t=new N(e,this);return this.providers.set(e,t),t}getProviders(){return Array.from(this.providers.values())}}const D=[];var P;!function(e){e[e.DEBUG=0]="DEBUG",e[e.VERBOSE=1]="VERBOSE",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.SILENT=5]="SILENT"}(P||(P={}));const I={debug:P.DEBUG,verbose:P.VERBOSE,info:P.INFO,warn:P.WARN,error:P.ERROR,silent:P.SILENT},U=P.INFO,R={[P.DEBUG]:"log",[P.VERBOSE]:"log",[P.INFO]:"info",[P.WARN]:"warn",[P.ERROR]:"error"},F=(e,t,...a)=>{if(t{if(function(e){const t=e.getComponent();return"VERSION"===(null==t?void 0:t.type)}(e)){const t=e.getImmediate();return`${t.library}/${t.version}`}return null})).filter((e=>e)).join(" ")}}const B="@firebase/app",L="0.7.21",O=new class{constructor(e){this.name=e,this._logLevel=U,this._logHandler=F,this._userLogHandler=null,D.push(this)}get logLevel(){return this._logLevel}set logLevel(e){if(!(e in P))throw new TypeError(`Invalid value "${e}" assigned to \`logLevel\``);this._logLevel=e}setLogLevel(e){this._logLevel="string"==typeof e?I[e]:e}get logHandler(){return this._logHandler}set logHandler(e){if("function"!=typeof e)throw new TypeError("Value assigned to `logHandler` must be a function");this._logHandler=e}get userLogHandler(){return this._userLogHandler}set userLogHandler(e){this._userLogHandler=e}debug(...e){this._userLogHandler&&this._userLogHandler(this,P.DEBUG,...e),this._logHandler(this,P.DEBUG,...e)}log(...e){this._userLogHandler&&this._userLogHandler(this,P.VERBOSE,...e),this._logHandler(this,P.VERBOSE,...e)}info(...e){this._userLogHandler&&this._userLogHandler(this,P.INFO,...e),this._logHandler(this,P.INFO,...e)}warn(...e){this._userLogHandler&&this._userLogHandler(this,P.WARN,...e),this._logHandler(this,P.WARN,...e)}error(...e){this._userLogHandler&&this._userLogHandler(this,P.ERROR,...e),this._logHandler(this,P.ERROR,...e)}}("@firebase/app"),q="[DEFAULT]",j={[B]:"fire-core","@firebase/app-compat":"fire-core-compat","@firebase/analytics":"fire-analytics","@firebase/analytics-compat":"fire-analytics-compat","@firebase/app-check":"fire-app-check","@firebase/app-check-compat":"fire-app-check-compat","@firebase/auth":"fire-auth","@firebase/auth-compat":"fire-auth-compat","@firebase/database":"fire-rtdb","@firebase/database-compat":"fire-rtdb-compat","@firebase/functions":"fire-fn","@firebase/functions-compat":"fire-fn-compat","@firebase/installations":"fire-iid","@firebase/installations-compat":"fire-iid-compat","@firebase/messaging":"fire-fcm","@firebase/messaging-compat":"fire-fcm-compat","@firebase/performance":"fire-perf","@firebase/performance-compat":"fire-perf-compat","@firebase/remote-config":"fire-rc","@firebase/remote-config-compat":"fire-rc-compat","@firebase/storage":"fire-gcs","@firebase/storage-compat":"fire-gcs-compat","@firebase/firestore":"fire-fst","@firebase/firestore-compat":"fire-fst-compat","fire-js":"fire-js",firebase:"fire-js-all"},z=new Map,H=new Map;function V(e,t){try{e.container.addComponent(t)}catch(a){O.debug(`Component ${t.name} failed to register with FirebaseApp ${e.name}`,a)}}function W(e){const t=e.name;if(H.has(t))return O.debug(`There were multiple attempts to register component ${t}.`),!1;H.set(t,e);for(const t of z.values())V(t,e);return!0}function K(e,t){const a=e.container.getProvider("heartbeat").getImmediate({optional:!0});return a&&a.triggerHeartbeat(),e.container.getProvider(t)}const G=new m("app","Firebase",{"no-app":"No Firebase App '{$appName}' has been created - call Firebase App.initializeApp()","bad-app-name":"Illegal App name: '{$appName}","duplicate-app":"Firebase App named '{$appName}' already exists with different options or config","app-deleted":"Firebase App named '{$appName}' already deleted","invalid-app-argument":"firebase.{$appName}() takes either no argument or a Firebase App instance.","invalid-log-argument":"First argument to `onLog` must be null or a function.","storage-open":"Error thrown when opening storage. Original error: {$originalErrorMessage}.","storage-get":"Error thrown when reading from storage. Original error: {$originalErrorMessage}.","storage-set":"Error thrown when writing to storage. Original error: {$originalErrorMessage}.","storage-delete":"Error thrown when deleting from storage. Original error: {$originalErrorMessage}."});class ${constructor(e,t,a){this._isDeleted=!1,this._options=Object.assign({},e),this._config=Object.assign({},t),this._name=t.name,this._automaticDataCollectionEnabled=t.automaticDataCollectionEnabled,this._container=a,this.container.addComponent(new k("app",(()=>this),"PUBLIC"))}get automaticDataCollectionEnabled(){return this.checkDestroyed(),this._automaticDataCollectionEnabled}set automaticDataCollectionEnabled(e){this.checkDestroyed(),this._automaticDataCollectionEnabled=e}get name(){return this.checkDestroyed(),this._name}get options(){return this.checkDestroyed(),this._options}get config(){return this.checkDestroyed(),this._config}get container(){return this._container}get isDeleted(){return this._isDeleted}set isDeleted(e){this._isDeleted=e}checkDestroyed(){if(this.isDeleted)throw G.create("app-deleted",{appName:this._name})}}function Q(e,t={}){if("object"!=typeof t){t={name:t}}const a=Object.assign({name:q,automaticDataCollectionEnabled:!1},t),s=a.name;if("string"!=typeof s||!s)throw G.create("bad-app-name",{appName:String(s)});const i=z.get(s);if(i){if(_(e,i.options)&&_(a,i.config))return i;throw G.create("duplicate-app",{appName:s})}const n=new A(s);for(const e of H.values())n.addComponent(e);const o=new $(e,a,n);return z.set(s,o),o}function Y(e,t,a){var s;let i=null!==(s=j[e])&&void 0!==s?s:e;a&&(i+=`-${a}`);const n=i.match(/\s|\//),o=t.match(/\s|\//);if(n||o){const e=[`Unable to register library "${i}" with version "${t}":`];return n&&e.push(`library name "${i}" contains illegal characters (whitespace or "/")`),n&&o&&e.push("and"),o&&e.push(`version name "${t}" contains illegal characters (whitespace or "/")`),void O.warn(e.join(" "))}W(new k(`${i}-version`,(()=>({library:i,version:t})),"VERSION"))}const J="firebase-heartbeat-store";let X=null;function Z(){return X||(X=S("firebase-heartbeat-database",1,((e,t)=>{if(0===t)e.createObjectStore(J)})).catch((e=>{throw G.create("storage-open",{originalErrorMessage:e.message})}))),X}async function ee(e,t){try{const a=(await Z()).transaction(J,"readwrite"),s=a.objectStore(J);return await s.put(t,te(e)),a.complete}catch(e){throw G.create("storage-set",{originalErrorMessage:e.message})}}function te(e){return`${e.name}!${e.options.appId}`}class ae{constructor(e){this.container=e,this._heartbeatsCache=null;const t=this.container.getProvider("app").getImmediate();this._storage=new ie(t),this._heartbeatsCachePromise=this._storage.read().then((e=>(this._heartbeatsCache=e,e)))}async triggerHeartbeat(){const e=this.container.getProvider("platform-logger").getImmediate().getPlatformInfoString(),t=se();if(null===this._heartbeatsCache&&(this._heartbeatsCache=await this._heartbeatsCachePromise),this._heartbeatsCache.lastSentHeartbeatDate!==t&&!this._heartbeatsCache.heartbeats.some((e=>e.date===t)))return this._heartbeatsCache.heartbeats.push({date:t,agent:e}),this._heartbeatsCache.heartbeats=this._heartbeatsCache.heartbeats.filter((e=>{const t=new Date(e.date).valueOf();return Date.now()-t<=2592e6})),this._storage.overwrite(this._heartbeatsCache)}async getHeartbeatsHeader(){if(null===this._heartbeatsCache&&await this._heartbeatsCachePromise,null===this._heartbeatsCache||0===this._heartbeatsCache.heartbeats.length)return"";const e=se(),{heartbeatsToSend:t,unsentEntries:a}=function(e,t=1024){const a=[];let s=e.slice();for(const i of e){const e=a.find((e=>e.agent===i.agent));if(e){if(e.dates.push(i.date),ne(a)>t){e.dates.pop();break}}else if(a.push({agent:i.agent,dates:[i.date]}),ne(a)>t){a.pop();break}s=s.slice(1)}return{heartbeatsToSend:a,unsentEntries:s}}(this._heartbeatsCache.heartbeats),s=c(JSON.stringify({version:2,heartbeats:t}));return this._heartbeatsCache.lastSentHeartbeatDate=e,a.length>0?(this._heartbeatsCache.heartbeats=a,await this._storage.overwrite(this._heartbeatsCache)):(this._heartbeatsCache.heartbeats=[],this._storage.overwrite(this._heartbeatsCache)),s}}function se(){return(new Date).toISOString().substring(0,10)}class ie{constructor(e){this.app=e,this._canUseIndexedDBPromise=this.runIndexedDBEnvironmentCheck()}async runIndexedDBEnvironmentCheck(){return!!h()&&p().then((()=>!0)).catch((()=>!1))}async read(){if(await this._canUseIndexedDBPromise){return await async function(e){try{return(await Z()).transaction(J).objectStore(J).get(te(e))}catch(e){throw G.create("storage-get",{originalErrorMessage:e.message})}}(this.app)||{heartbeats:[]}}return{heartbeats:[]}}async overwrite(e){var t;if(await this._canUseIndexedDBPromise){const a=await this.read();return ee(this.app,{lastSentHeartbeatDate:null!==(t=e.lastSentHeartbeatDate)&&void 0!==t?t:a.lastSentHeartbeatDate,heartbeats:e.heartbeats})}}async add(e){var t;if(await this._canUseIndexedDBPromise){const a=await this.read();return ee(this.app,{lastSentHeartbeatDate:null!==(t=e.lastSentHeartbeatDate)&&void 0!==t?t:a.lastSentHeartbeatDate,heartbeats:[...a.heartbeats,...e.heartbeats]})}}}function ne(e){return c(JSON.stringify({version:2,heartbeats:e})).length}var oe;oe="",W(new k("platform-logger",(e=>new x(e)),"PRIVATE")),W(new k("heartbeat",(e=>new ae(e)),"PRIVATE")),Y(B,L,oe),Y(B,L,"esm2017"),Y("fire-js","");Y("firebase","9.6.11","app");const re="@firebase/installations",le="0.5.8",ce=1e4,de="w:0.5.8",he="FIS_v2",pe=36e5,ue=new m("installations","Installations",{"missing-app-config-values":'Missing App configuration value: "{$valueName}"',"not-registered":"Firebase Installation is not registered.","installation-not-found":"Firebase Installation not found.","request-failed":'{$requestName} request failed with error "{$serverCode} {$serverStatus}: {$serverMessage}"',"app-offline":"Could not process request. Application offline.","delete-pending-registration":"Can't delete installation while there is a pending registration request."});function me(e){return e instanceof u&&e.code.includes("request-failed")}function ge({projectId:e}){return`https://firebaseinstallations.googleapis.com/v1/projects/${e}/installations`}function _e(e){return{token:e.token,requestStatus:2,expiresIn:(t=e.expiresIn,Number(t.replace("s","000"))),creationTime:Date.now()};var t}async function fe(e,t){const a=(await t.json()).error;return ue.create("request-failed",{requestName:e,serverCode:a.code,serverMessage:a.message,serverStatus:a.status})}function be({apiKey:e}){return new Headers({"Content-Type":"application/json",Accept:"application/json","x-goog-api-key":e})}function ve(e,{refreshToken:t}){const a=be(e);return a.append("Authorization",function(e){return`FIS_v2 ${e}`}(t)),a}async function ye(e){const t=await e();return t.status>=500&&t.status<600?e():t}function we(e){return new Promise((t=>{setTimeout(t,e)}))}const Ce=/^[cdef][\w-]{21}$/;function Ee(){try{const e=new Uint8Array(17);(self.crypto||self.msCrypto).getRandomValues(e),e[0]=112+e[0]%16;const t=function(e){return(t=e,btoa(String.fromCharCode(...t)).replace(/\+/g,"-").replace(/\//g,"_")).substr(0,22);var t}(e);return Ce.test(t)?t:""}catch(e){return""}}function Se(e){return`${e.appName}!${e.appId}`}const Me=new Map;function ke(e,t){const a=Se(e);Te(a,t),function(e,t){const a=Ae();a&&a.postMessage({key:e,fid:t});De()}(a,t)}function Te(e,t){const a=Me.get(e);if(a)for(const e of a)e(t)}let Ne=null;function Ae(){return!Ne&&"BroadcastChannel"in self&&(Ne=new BroadcastChannel("[Firebase] FID Change"),Ne.onmessage=e=>{Te(e.data.key,e.data.fid)}),Ne}function De(){0===Me.size&&Ne&&(Ne.close(),Ne=null)}const Pe="firebase-installations-store";let Ie=null;function Ue(){return Ie||(Ie=S("firebase-installations-database",1,((e,t)=>{if(0===t)e.createObjectStore(Pe)}))),Ie}async function Re(e,t){const a=Se(e),s=(await Ue()).transaction(Pe,"readwrite"),i=s.objectStore(Pe),n=await i.get(a);return await i.put(t,a),await s.complete,n&&n.fid===t.fid||ke(e,t.fid),t}async function Fe(e){const t=Se(e),a=(await Ue()).transaction(Pe,"readwrite");await a.objectStore(Pe).delete(t),await a.complete}async function xe(e,t){const a=Se(e),s=(await Ue()).transaction(Pe,"readwrite"),i=s.objectStore(Pe),n=await i.get(a),o=t(n);return void 0===o?await i.delete(a):await i.put(o,a),await s.complete,!o||n&&n.fid===o.fid||ke(e,o.fid),o}async function Be(e){let t;const a=await xe(e.appConfig,(a=>{const s=function(e){return qe(e||{fid:Ee(),registrationStatus:0})}(a),i=function(e,t){if(0===t.registrationStatus){if(!navigator.onLine){return{installationEntry:t,registrationPromise:Promise.reject(ue.create("app-offline"))}}const a={fid:t.fid,registrationStatus:1,registrationTime:Date.now()},s=async function(e,t){try{const a=await async function({appConfig:e,heartbeatServiceProvider:t},{fid:a}){const s=ge(e),i=be(e),n=t.getImmediate({optional:!0});if(n){const e=await n.getHeartbeatsHeader();e&&i.append("x-firebase-client",e)}const o={fid:a,authVersion:he,appId:e.appId,sdkVersion:de},r={method:"POST",headers:i,body:JSON.stringify(o)},l=await ye((()=>fetch(s,r)));if(l.ok){const e=await l.json();return{fid:e.fid||a,registrationStatus:2,refreshToken:e.refreshToken,authToken:_e(e.authToken)}}throw await fe("Create Installation",l)}(e,t);return Re(e.appConfig,a)}catch(a){throw me(a)&&409===a.customData.serverCode?await Fe(e.appConfig):await Re(e.appConfig,{fid:t.fid,registrationStatus:0}),a}}(e,a);return{installationEntry:a,registrationPromise:s}}return 1===t.registrationStatus?{installationEntry:t,registrationPromise:Le(e)}:{installationEntry:t}}(e,s);return t=i.registrationPromise,i.installationEntry}));return""===a.fid?{installationEntry:await t}:{installationEntry:a,registrationPromise:t}}async function Le(e){let t=await Oe(e.appConfig);for(;1===t.registrationStatus;)await we(100),t=await Oe(e.appConfig);if(0===t.registrationStatus){const{installationEntry:t,registrationPromise:a}=await Be(e);return a||t}return t}function Oe(e){return xe(e,(e=>{if(!e)throw ue.create("installation-not-found");return qe(e)}))}function qe(e){return 1===(t=e).registrationStatus&&t.registrationTime+cefetch(s,r)));if(l.ok){return _e(await l.json())}throw await fe("Generate Auth Token",l)}async function ze(e,t=!1){let a;const s=await xe(e.appConfig,(s=>{if(!Ve(s))throw ue.create("not-registered");const i=s.authToken;if(!t&&function(e){return 2===e.requestStatus&&!function(e){const t=Date.now();return t{if(!Ve(e))throw ue.create("not-registered");const t=e.authToken;return 1===(a=t).requestStatus&&a.requestTime+ce{const t=K(e.getProvider("app").getImmediate(),Ge).getImmediate();return{getId:()=>async function(e){const t=e,{installationEntry:a,registrationPromise:s}=await Be(t);return s?s.catch(console.error):ze(t).catch(console.error),a.fid}(t),getToken:e=>We(t,e)}};W(new k(Ge,(e=>{const t=e.getProvider("app").getImmediate(),a=function(e){if(!e||!e.options)throw Ke("App Configuration");if(!e.name)throw Ke("App Name");const t=["projectId","apiKey","appId"];for(const a of t)if(!e.options[a])throw Ke(a);return{appName:e.name,projectId:e.options.projectId,apiKey:e.options.apiKey,appId:e.options.appId}}(t);return{app:t,appConfig:a,heartbeatServiceProvider:K(t,"heartbeat"),_delete:()=>Promise.resolve()}}),"PUBLIC")),W(new k("installations-internal",$e,"PRIVATE")),Y(re,le),Y(re,le,"esm2017");const Qe="BDOU99-h67HcA6JeFXHbSNMu7e2yNNu3RzoMj8TM4W88jITfq7ZmPvIM1Iv-4_l2LxQcYwhqby2xGpWwzjfAnG4",Ye="google.c.a.c_id";var Je,Xe;function Ze(e){const t=new Uint8Array(e);return btoa(String.fromCharCode(...t)).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}function et(e){const t=(e+"=".repeat((4-e.length%4)%4)).replace(/\-/g,"+").replace(/_/g,"/"),a=atob(t),s=new Uint8Array(a.length);for(let e=0;e{if(0===t)e.createObjectStore(st)}))),it}async function ot(e){const t=lt(e),a=await nt(),s=await a.transaction(st).objectStore(st).get(t);if(s)return s;{const t=await async function(e){if("databases"in indexedDB){const e=(await indexedDB.databases()).map((e=>e.name));if(!e.includes(tt))return null}let t=null;return(await S(tt,5,(async(a,s,i,n)=>{var o;if(s<2)return;if(!a.objectStoreNames.contains(at))return;const r=n.objectStore(at),l=await r.index("fcmSenderId").get(e);if(await r.clear(),l)if(2===s){const e=l;if(!e.auth||!e.p256dh||!e.endpoint)return;t={token:e.fcmToken,createTime:null!==(o=e.createTime)&&void 0!==o?o:Date.now(),subscriptionOptions:{auth:e.auth,p256dh:e.p256dh,endpoint:e.endpoint,swScope:e.swScope,vapidKey:"string"==typeof e.vapidKey?e.vapidKey:Ze(e.vapidKey)}}}else if(3===s){const e=l;t={token:e.fcmToken,createTime:e.createTime,subscriptionOptions:{auth:Ze(e.auth),p256dh:Ze(e.p256dh),endpoint:e.endpoint,swScope:e.swScope,vapidKey:Ze(e.vapidKey)}}}else if(4===s){const e=l;t={token:e.fcmToken,createTime:e.createTime,subscriptionOptions:{auth:Ze(e.auth),p256dh:Ze(e.p256dh),endpoint:e.endpoint,swScope:e.swScope,vapidKey:Ze(e.vapidKey)}}}}))).close(),await M(tt),await M("fcm_vapid_details_db"),await M("undefined"),function(e){if(!e||!e.subscriptionOptions)return!1;const{subscriptionOptions:t}=e;return"number"==typeof e.createTime&&e.createTime>0&&"string"==typeof e.token&&e.token.length>0&&"string"==typeof t.auth&&t.auth.length>0&&"string"==typeof t.p256dh&&t.p256dh.length>0&&"string"==typeof t.endpoint&&t.endpoint.length>0&&"string"==typeof t.swScope&&t.swScope.length>0&&"string"==typeof t.vapidKey&&t.vapidKey.length>0}(t)?t:null}(e.appConfig.senderId);if(t)return await rt(e,t),t}}async function rt(e,t){const a=lt(e),s=(await nt()).transaction(st,"readwrite");return await s.objectStore(st).put(t,a),await s.complete,t}function lt({appConfig:e}){return e.appId}const ct=new m("messaging","Messaging",{"missing-app-config-values":'Missing App configuration value: "{$valueName}"',"only-available-in-window":"This method is available in a Window context.","only-available-in-sw":"This method is available in a service worker context.","permission-default":"The notification permission was not granted and dismissed instead.","permission-blocked":"The notification permission was not granted and blocked instead.","unsupported-browser":"This browser doesn't support the API's required to use the Firebase SDK.","indexed-db-unsupported":"This browser doesn't support indexedDb.open() (ex. Safari iFrame, Firefox Private Browsing, etc)","failed-service-worker-registration":"We are unable to register the default service worker. {$browserErrorMessage}","token-subscribe-failed":"A problem occurred while subscribing the user to FCM: {$errorInfo}","token-subscribe-no-token":"FCM returned no token when subscribing the user to push.","token-unsubscribe-failed":"A problem occurred while unsubscribing the user from FCM: {$errorInfo}","token-update-failed":"A problem occurred while updating the user from FCM: {$errorInfo}","token-update-no-token":"FCM returned no token when updating the user to push.","use-sw-after-get-token":"The useServiceWorker() method may only be called once and must be called before calling getToken() to ensure your service worker is used.","invalid-sw-registration":"The input to useServiceWorker() must be a ServiceWorkerRegistration.","invalid-bg-handler":"The input to setBackgroundMessageHandler() must be a function.","invalid-vapid-key":"The public VAPID key must be a string.","use-vapid-key-after-get-token":"The usePublicVapidKey() method may only be called once and must be called before calling getToken() to ensure your VAPID key is used."});async function dt(e,t){const a={method:"DELETE",headers:await pt(e)};try{const s=await fetch(`${ht(e.appConfig)}/${t}`,a),i=await s.json();if(i.error){const e=i.error.message;throw ct.create("token-unsubscribe-failed",{errorInfo:e})}}catch(e){throw ct.create("token-unsubscribe-failed",{errorInfo:e})}}function ht({projectId:e}){return`https://fcmregistrations.googleapis.com/v1/projects/${e}/registrations`}async function pt({appConfig:e,installations:t}){const a=await t.getToken();return new Headers({"Content-Type":"application/json",Accept:"application/json","x-goog-api-key":e.apiKey,"x-goog-firebase-installations-auth":`FIS ${a}`})}function ut({p256dh:e,auth:t,endpoint:a,vapidKey:s}){const i={web:{endpoint:a,auth:t,p256dh:e}};return s!==Qe&&(i.web.applicationPubKey=s),i}async function mt(e){const t=await async function(e,t){const a=await e.pushManager.getSubscription();if(a)return a;return e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:et(t)})}(e.swRegistration,e.vapidKey),a={vapidKey:e.vapidKey,swScope:e.swRegistration.scope,endpoint:t.endpoint,auth:Ze(t.getKey("auth")),p256dh:Ze(t.getKey("p256dh"))},s=await ot(e.firebaseDependencies);if(s){if(function(e,t){const a=t.vapidKey===e.vapidKey,s=t.endpoint===e.endpoint,i=t.auth===e.auth,n=t.p256dh===e.p256dh;return a&&s&&i&&n}(s.subscriptionOptions,a))return Date.now()>=s.createTime+6048e5?async function(e,t){try{const a=await async function(e,t){const a=await pt(e),s=ut(t.subscriptionOptions),i={method:"PATCH",headers:a,body:JSON.stringify(s)};let n;try{const a=await fetch(`${ht(e.appConfig)}/${t.token}`,i);n=await a.json()}catch(e){throw ct.create("token-update-failed",{errorInfo:e})}if(n.error){const e=n.error.message;throw ct.create("token-update-failed",{errorInfo:e})}if(!n.token)throw ct.create("token-update-no-token");return n.token}(e.firebaseDependencies,t),s=Object.assign(Object.assign({},t),{token:a,createTime:Date.now()});return await rt(e.firebaseDependencies,s),a}catch(t){throw await gt(e),t}}(e,{token:s.token,createTime:Date.now(),subscriptionOptions:a}):s.token;try{await dt(e.firebaseDependencies,s.token)}catch(e){console.warn(e)}return _t(e.firebaseDependencies,a)}return _t(e.firebaseDependencies,a)}async function gt(e){const t=await ot(e.firebaseDependencies);t&&(await dt(e.firebaseDependencies,t.token),await async function(e){const t=lt(e),a=(await nt()).transaction(st,"readwrite");await a.objectStore(st).delete(t),await a.complete}(e.firebaseDependencies));const a=await e.swRegistration.pushManager.getSubscription();return!a||a.unsubscribe()}async function _t(e,t){const a=await async function(e,t){const a=await pt(e),s=ut(t),i={method:"POST",headers:a,body:JSON.stringify(s)};let n;try{const t=await fetch(ht(e.appConfig),i);n=await t.json()}catch(e){throw ct.create("token-subscribe-failed",{errorInfo:e})}if(n.error){const e=n.error.message;throw ct.create("token-subscribe-failed",{errorInfo:e})}if(!n.token)throw ct.create("token-subscribe-no-token");return n.token}(e,t),s={token:a,createTime:Date.now(),subscriptionOptions:t};return await rt(e,s),s.token}function ft(e){const t={from:e.from,collapseKey:e.collapse_key,messageId:e.fcmMessageId};return function(e,t){if(!t.notification)return;e.notification={};const a=t.notification.title;a&&(e.notification.title=a);const s=t.notification.body;s&&(e.notification.body=s);const i=t.notification.image;i&&(e.notification.image=i)}(t,e),function(e,t){if(!t.data)return;e.data=t.data}(t,e),function(e,t){if(!t.fcmOptions)return;e.fcmOptions={};const a=t.fcmOptions.link;a&&(e.fcmOptions.link=a);const s=t.fcmOptions.analytics_label;s&&(e.fcmOptions.analyticsLabel=s)}(t,e),t}function bt(e,t){const a=[];for(let s=0;s{}))}catch(e){throw ct.create("failed-service-worker-registration",{browserErrorMessage:e.message})}}async function Ct(e,t){if(!navigator)throw ct.create("only-available-in-window");if("default"===Notification.permission&&await Notification.requestPermission(),"granted"!==Notification.permission)throw ct.create("permission-blocked");return await async function(e,t){t?e.vapidKey=t:e.vapidKey||(e.vapidKey=Qe)}(e,null==t?void 0:t.vapidKey),await async function(e,t){if(t||e.swRegistration||await wt(e),t||!e.swRegistration){if(!(t instanceof ServiceWorkerRegistration))throw ct.create("invalid-sw-registration");e.swRegistration=t}}(e,null==t?void 0:t.serviceWorkerRegistration),mt(e)}async function Et(e,t,a){const s=function(e){switch(e){case Xe.NOTIFICATION_CLICKED:return"notification_open";case Xe.PUSH_RECEIVED:return"notification_foreground";default:throw new Error}}(t);(await e.firebaseDependencies.analyticsProvider.get()).logEvent(s,{message_id:a["google.c.a.c_id"],message_name:a["google.c.a.c_l"],message_time:a["google.c.a.ts"],message_device_time:Math.floor(Date.now()/1e3)})}async function St(e,t){const a=t.data;if(!a.isFirebaseMessaging)return;e.onMessageHandler&&a.messageType===Xe.PUSH_RECEIVED&&("function"==typeof e.onMessageHandler?e.onMessageHandler(ft(a)):e.onMessageHandler.next(ft(a)));const s=a.data;var i;"object"==typeof(i=s)&&i&&Ye in i&&"1"===s["google.c.a.e"]&&await Et(e,a.messageType,s)}const Mt="@firebase/messaging",kt="0.9.12",Tt=e=>{const t=e.getProvider("messaging").getImmediate();return{getToken:e=>Ct(t,e)}};async function Nt(){try{await p()}catch(e){return!1}return"undefined"!=typeof window&&h()&&!("undefined"==typeof navigator||!navigator.cookieEnabled)&&"serviceWorker"in navigator&&"PushManager"in window&&"Notification"in window&&"fetch"in window&&ServiceWorkerRegistration.prototype.hasOwnProperty("showNotification")&&PushSubscription.prototype.hasOwnProperty("getKey")}function At(e=function(e="[DEFAULT]"){const t=z.get(e);if(!t)throw G.create("no-app",{appName:e});return t}()){return Nt().then((e=>{if(!e)throw ct.create("unsupported-browser")}),(e=>{throw ct.create("indexed-db-unsupported")})),K(b(e),"messaging").getImmediate()}async function Dt(e,t){return Ct(e=b(e),t)}function Pt(e){return async function(e){if(!navigator)throw ct.create("only-available-in-window");return e.swRegistration||await wt(e),gt(e)}(e=b(e))}function It(e,t){return function(e,t){if(!navigator)throw ct.create("only-available-in-window");return e.onMessageHandler=t,()=>{e.onMessageHandler=null}}(e=b(e),t)}W(new k("messaging",(e=>{const t=new yt(e.getProvider("app").getImmediate(),e.getProvider("installations-internal").getImmediate(),e.getProvider("analytics-internal"));return navigator.serviceWorker.addEventListener("message",(e=>St(t,e))),t}),"PUBLIC")),W(new k("messaging-internal",Tt,"PRIVATE")),Y(Mt,kt),Y(Mt,kt,"esm2017");const Ut=Tinode;class Rt extends t().PureComponent{render(){return this.props.visible?t().createElement("div",{className:"alert-container"},t().createElement("div",{className:"alert"},t().createElement("div",{className:"title"},this.props.title),t().createElement("div",{className:"content"},this.props.content),t().createElement("div",{className:"dialog-buttons"},this.props.onReject?t().createElement("button",{className:"outline",onClick:this.props.onReject},this.props.reject||t().createElement(n.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})):null,t().createElement("button",{className:"primary",onClick:this.props.onConfirm},this.props.confirm||t().createElement(n.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))))):null}}const Ft="0.20.0-beta1",xt="TinodeWeb/0.20.0-beta1",Bt={hosted:"web.tinode.co",local:"localhost:6060"},Lt=Bt.hosted,Ot=3e3,qt="JRWPS",jt=13,zt=384,Ht=262144,Vt=1<<23,Wt=36,Kt=60,Gt=360,$t=(0,n.defineMessages)({info:{id:"menu_item_info",defaultMessage:[{type:0,value:"Info"}]},clear_messages:{id:"menu_item_clear_messages",defaultMessage:[{type:0,value:"Clear messages"}]},clear_for_all:{id:"menu_item_clear_messages_for_all",defaultMessage:[{type:0,value:"Clear for All"}]},delete:{id:"menu_item_delete",defaultMessage:[{type:0,value:"Delete"}]},delete_for_all:{id:"menu_item_delete_for_all",defaultMessage:[{type:0,value:"Delete for All"}]},send_retry:{id:"menu_item_send_retry",defaultMessage:[{type:0,value:"Retry"}]},mute:{id:"menu_item_mute",defaultMessage:[{type:0,value:"Mute"}]},unmute:{id:"menu_item_unmute",defaultMessage:[{type:0,value:"Unmute"}]},reply:{id:"menu_item_reply",defaultMessage:[{type:0,value:"Reply"}]},forward:{id:"menu_item_forward",defaultMessage:[{type:0,value:"Forward"}]},topic_delete:{id:"menu_item_delete_topic",defaultMessage:[{type:0,value:"Delete"}]},topic_delete_warning:{id:"topic_delete_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete this conversation? It cannot be undone."}]},delete_messages_warning:{id:"delete_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete all messages for everyone? It cannot be undone."}]},unblock:{id:"menu_item_unblock",defaultMessage:[{type:0,value:"Unblock"}]},block:{id:"menu_item_block",defaultMessage:[{type:0,value:"Block"}]},topic_block_warning:{id:"topic_block_warning",defaultMessage:[{type:0,value:"Are you sure you want to block this conversation?"}]},member_delete:{id:"menu_item_member_delete",defaultMessage:[{type:0,value:"Remove"}]},archive:{id:"menu_item_archive_topic",defaultMessage:[{type:0,value:"Archive"}]},unarchive:{id:"menu_item_restore_topic",defaultMessage:[{type:0,value:"Restore"}]},edit_permissions:{id:"menu_item_edit_permissions",defaultMessage:[{type:0,value:"Edit permissions"}]},clear_messages_warning:{id:"clear_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to clear all messages? It cannot be undone."}]}});class Qt extends t().Component{constructor(e){super(e),this.selfRef=t().createRef();const{formatMessage:a}=e.intl;this.handlePageClick=this.handlePageClick.bind(this),this.handleEscapeKey=this.handleEscapeKey.bind(this),this.handleClick=this.handleClick.bind(this),this.MenuItems={topic_info:{id:"topic_info",title:a($t.info),handler:null},messages_clear:{id:"messages_clear",title:a($t.clear_messages),handler:(t,s)=>e.onShowAlert(a($t.clear_messages),a($t.clear_messages_warning),(()=>{this.deleteMessages(!0,!1,t,s)}),null,!0,null)},messages_clear_hard:{id:"messages_clear_hard",title:a($t.clear_for_all),handler:(t,s)=>e.onShowAlert(a($t.clear_for_all),a(message.delete_messages_warning),(()=>this.deleteMessages(!0,!0,t,s)),null,!0,null)},message_delete:{id:"message_delete",title:a($t.delete),handler:(e,t)=>this.deleteMessages(!1,!1,e,t)},message_delete_hard:{id:"message_delete_hard",title:a($t.delete_for_all),handler:(e,t)=>this.deleteMessages(!1,!0,e,t)},menu_item_send_retry:{id:"menu_item_send_retry",title:a($t.send_retry),handler:(e,t)=>this.retryMessage(e,t)},menu_item_reply:{id:"menu_item_reply",title:a($t.reply),handler:(e,t)=>this.replyToMessage(e,t)},menu_item_forward:{id:"menu_item_forward",title:a($t.forward),handler:()=>{}},topic_unmute:{id:"topic_unmute",title:a($t.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},topic_mute:{id:"topic_mute",title:a($t.mute),handler:this.topicPermissionSetter.bind(this,"-P")},topic_unblock:{id:"topic_unblock",title:a($t.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")},topic_block:{id:"topic_block",title:a($t.block),handler:(t,s)=>e.onShowAlert(a($t.block),a($t.topic_block_warning),(()=>this.topicPermissionSetter("-JP",t,s).then((e=>(this.props.onTopicRemoved(t.topicName),e)))),null,!0,null)},topic_delete:{id:"topic_delete",title:a($t.topic_delete),handler:(t,s)=>e.onShowAlert(a($t.topic_delete),a($t.topic_delete_warning),(()=>{const e=this.props.tinode.getTopic(t.topicName);if(e)return e.delTopic(!0).catch((e=>{s&&s(e.message,"err")}));console.warn("Topic not found: ",t.topicName)}),null,!0,null)},topic_archive:{id:"topic_archive",title:a($t.archive),handler:(e,t)=>{const a=this.props.tinode.getTopic(e.topicName);if(a)return a.archive(!0).catch((e=>{t&&t(e.message,"err")}));console.warn("Topic not found: ",e.topicName)}},topic_restore:{id:"topic_restore",title:a($t.unarchive),handler:(e,t)=>{const a=this.props.tinode.getTopic(e.topicName);if(a)return a.archive(!1).catch((e=>{t&&t(e.message,"err")}));console.warn("Topic not found: ",e.topicName)}},permissions:{id:"permissions",title:a($t.edit_permissions),handler:null},member_delete:{id:"member_delete",title:a($t.member_delete),handler:(e,t)=>{const a=this.props.tinode.getTopic(e.topicName);if(a&&e.user)return a.delSubscription(e.user).catch((e=>{t&&t(e.message,"err")}));console.warn("Topic or user not found: '"+e.topicName+"', '"+e.user+"'")}},member_mute:{id:"member_mute",title:a($t.mute),handler:this.topicPermissionSetter.bind(this,"-P")},member_unmute:{id:"member_unmute",title:a($t.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},member_block:{id:"member_block",title:a($t.block),handler:this.topicPermissionSetter.bind(this,"-JP")},member_unblock:{id:"member_unblock",title:a($t.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")}}}componentDidMount(){document.addEventListener("mousedown",this.handlePageClick,!1),document.addEventListener("keyup",this.handleEscapeKey,!1)}componentWillUnmount(){document.removeEventListener("mousedown",this.handlePageClick,!1),document.removeEventListener("keyup",this.handleEscapeKey,!1)}handlePageClick(e){this.selfRef.current.contains(e.target)||(e.preventDefault(),e.stopPropagation(),this.props.hide())}handleEscapeKey(e){27===e.keyCode&&this.props.hide()}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.hide();let t=this.props.items[e.currentTarget.dataset.id];"string"==typeof t&&(t=this.MenuItems[t]),t?this.props.onAction(t.id,t.handler(this.props.params,this.props.onError),this.props.params):console.error("Invalid menu item ID",e.currentTarget.dataset.id)}deleteMessages(e,t,a,s){const i=this.props.tinode.getTopic(a.topicName);if(!i)return void console.warn("Topic not found: ",a.topicName);if(!e&&i.cancelSend(a.seq))return;return(e?i.delMessagesAll(t):i.delMessagesList([a.seq],t)).catch((e=>{s&&s(e.message,"err")}))}retryMessage(e,t){const a=this.props.tinode.getTopic(e.topicName);if(!a||!a.flushMessage(e.seq))return;const s=a.createMessage(e.content,!1);return a.publishDraft(s).catch((e=>{t&&t(e.message,"err")}))}topicPermissionSetter(e,t,a){const s=this.props.tinode.getTopic(t.topicName);if(!s)return void console.warn("Topic not found",t.topicName);let i=s.updateMode(t.user,e);return a&&(i=i.catch((e=>{a(e.message,"err")}))),i}replyToMessage(e,t){e.pickReply(e.seq,e.content,e.userFrom,e.userName,t)}render(){const e=[];let a=0;this.props.items.map((s=>{"string"==typeof s&&(s=this.MenuItems[s]),s&&s.title&&e.push("-"==s.title?t().createElement("li",{className:"separator",key:a}):t().createElement("li",{onClick:this.handleClick,"data-id":a,key:a},s.title)),a++}));const s=jt*(.7+2.5*e.length),i={left:(this.props.bounds.right-this.props.clickAt.x<156?this.props.clickAt.x-this.props.bounds.left-156:this.props.clickAt.x-this.props.bounds.left)+"px",top:(this.props.bounds.bottom-this.props.clickAt.y0?(e=[],this.props.badges.map((a=>{const s=a.color?" "+a.color:"";a.icon?e.push(t().createElement("i",{className:"material-icons as-badge"+s,key:a.key||a.icon},Jt[a.icon]||a.icon)):e.push(t().createElement("span",{className:"badge"+s,key:a.key||a.name},a.name))})),t().createElement(t().Fragment,null,e)):null}}function Zt(e,t){let a=0|Math.floor(e/60),s=0|Math.floor(a/60);(t||s>0)&&(a=a<10?"0".concat(a):a);let i=e%60|0;return i=i<10?"0".concat(i):i,0==s?"".concat(a,":").concat(i):"".concat(s,":").concat(a,":").concat(i)}function ea(e){if(!e||0==e)return"0 Bytes";const t=["Bytes","KB","MB","GB","TB","PB"],a=Math.min(0|Math.floor(Math.log2(e)/10),t.length-1),s=e/Math.pow(1024,a),i=a>0?s<3?2:s<30?1:0:0;return s.toFixed(i)+" "+t[a]}function ta(e,t){return"string"!=typeof e?e:e.length>t?e.slice(0,t/2-1)+"…"+e.slice(1-t/2):e}function aa(e,t,a){return(t?"lt-":"dk-")+(a?"fg-":"bg-")+(s=e,Math.abs(function(e){let t=0;e=""+e;for(let a=0;a0?"a":"")+".png",t&&a.removeChild(t),a.appendChild(s),document.title=(e>0?"("+e+") ":"")+"Tinode"}function ia(e,t,a,s){let i=null;if((e=e&&e.trim())&&(i={fn:e}),"string"==typeof(s=s&&s.trim())&&(i=i||{},i.note=s||Ut.Tinode.DEL_CHAR),t){i=i||{};let e=a;const s=/^data:(image\/[-a-z0-9+.]+)?(;base64)?,/i.exec(t);s?(e=s[1],i.photo={data:t.substring(t.indexOf(",")+1),ref:Ut.Tinode.DEL_CHAR}):i.photo={data:Ut.Tinode.DEL_CHAR,ref:t},i.photo.type=(e||"image/jpeg").substring("image/".length)}return i}function na(e,t){if(e===t)return!0;if(!Array.isArray(e)||!Array.isArray(t))return!1;if(e.length!=t.length)return!1;e.sort(),t.sort();for(let a=0,s=e.length;a{e.then((e=>t?s({isCanceled:!0}):a(e)),(e=>s(t?{isCanceled:!0}:e)))})),cancel(){t=!0}}}function da(e,t){return e&&e.substring(0,t)}class ha extends t().PureComponent{render(){let e;if(!0===this.props.avatar){const a=Ut.Tinode.isGroupTopicName(this.props.topic),s=aa(this.props.topic,a);if(this.props.topic&&this.props.title&&this.props.title.trim()){const a=this.props.title.trim().charAt(0),i="lettertile "+s+(this.props.deleted?" disabled":"");e=t().createElement("div",{className:i},t().createElement("div",null,a))}else{const i="material-icons "+s+(this.props.deleted?" disabled":"");e=a?t().createElement("i",{className:i},"group"):t().createElement("i",{className:i},"person")}}else if(this.props.avatar){const a=this.props.tinode.authorizeURL(ra(this.props.avatar,"image")),s="avatar"+(this.props.deleted?" deleted":"");e=t().createElement("img",{className:s,alt:"avatar",src:a,onError:e=>{e.target.onerror=null,e.target.src="../img/broken_image.png"}})}else e=null;return e}}class pa extends t().PureComponent{render(){return this.props.count>0?t().createElement("span",{className:"unread"},this.props.count>9?"9+":this.props.count):null}}const ua=["image/jpeg","image/gif","image/png","image/svg","image/svg+xml"],ma=["jpg","gif","png","svg","svg"];function ga(e){if(e&&"object"==typeof e){if(e.ref)return e.ref;if(e.data&&e.type){return"data:"+(e.type.startsWith("image/")?e.type:"image/"+e.type)+";base64,"+e.data}}return null}function _a(e,t,a,s,i){if(t|=0,a|=0,s|=0,(e|=0)<=0||t<=0||a<=0||s<=0)return null;i&&(a=s=Math.min(a,s));const n=Math.min(Math.min(e,a)/e,Math.min(t,s)/t),o={dstWidth:e*n|0,dstHeight:t*n|0};return i?(o.dstWidth=o.dstHeight=Math.min(o.dstWidth,o.dstHeight),o.srcWidth=o.srcHeight=Math.min(e,t),o.xoffset=(e-o.srcWidth)/2|0,o.yoffset=(t-o.srcWidth)/2|0):(o.xoffset=o.yoffset=0,o.srcWidth=e,o.srcHeight=t),o}function fa(e,t){const a=ua.indexOf(t);if(a<0||!e)return e;const s=ma[a],i=e.lastIndexOf(".");return i>=0&&(e=e.substring(0,i)),e+"."+s}function ba(e,t,a,s,i){return new Promise(((n,o)=>{const r=new Image;r.crossOrigin="Anonymous",r.onerror=function(e){o(new Error("Image format unrecognized"))},r.onload=async function(){URL.revokeObjectURL(r.src);const l=_a(r.width,r.height,t,a,i);if(!l)return void o(new Error("Invalid image"));let c=document.createElement("canvas");c.width=l.dstWidth,c.height=l.dstHeight;let d=c.getContext("2d");d.imageSmoothingEnabled=!0,d.drawImage(r,l.xoffset,l.yoffset,l.srcWidth,l.srcHeight,0,0,l.dstWidth,l.dstHeight);const h=ua.includes(e.type)?e.type:"image/jpeg";let p=await new Promise((e=>c.toBlob(e,h)));if(p){for(;s>0&&p.length>s;)l.dstWidth=.70710678118*l.dstWidth|0,l.dstHeight=.70710678118*l.dstHeight|0,c.width=l.dstWidth,c.height=l.dstHeight,d=c.getContext("2d"),d.clearRect(0,0,c.width,c.height),d.drawImage(r,l.xoffset,l.yoffset,l.srcWidth,l.srcHeight,0,0,l.dstWidth,l.dstHeight),p=await new Promise((e=>c.toBlob(e,h)));c=null,n({mime:h,blob:p,width:l.dstWidth,height:l.dstHeight,name:fa(e.name,h)})}else o(new Error("Unsupported image format"))},r.src=URL.createObjectURL(e)}))}function va(e){return new Promise(((t,a)=>{const s=new FileReader;s.onerror=e=>{a(s.error)},s.onload=()=>{t({mime:e.type,bits:s.result.split(",")[1]})},s.readAsDataURL(e)}))}function ya(e){if(!Array.isArray(e))return null;try{let t="";return new Uint8Array(e).forEach((e=>t+=String.fromCharCode(e))),window.btoa(t)}catch(e){}return null}function wa(e){const t=[];try{return[...window.atob(e)].forEach((e=>{t.push(e.charCodeAt(0))})),t}catch(e){}return null}const Ca="#666C";class Ea extends t().PureComponent{constructor(e){super(e);let a=wa(this.props.preview);(!Array.isArray(a)||a.length<16)&&(a=null),this.state={canPlay:!1,playing:!1,currentTime:"0:00",duration:this.props.duration>0?Zt(this.props.duration/1e3):"-:--",longMin:this.props.duration>=6e5,preview:a},this.initAudio=this.initAudio.bind(this),this.initCanvas=this.initCanvas.bind(this),this.resampleBars=this.resampleBars.bind(this),this.visualize=this.visualize.bind(this),this.handlePlay=this.handlePlay.bind(this),this.handleSeek=this.handleSeek.bind(this),this.handleError=this.handleError.bind(this),this.audioPlayer=null,this.viewBuffer=[],this.canvasRef=t().createRef()}componentDidMount(){this.props.src&&this.initAudio(),this.initCanvas()}componentWillUnmount(){this.audioPlayer&&(this.audioPlayer.oncanplay=null,this.audioPlayer.ontimeupdate=null,this.audioPlayer.onended=null,this.audioPlayer.pause(),this.audioPlayer=null)}componentDidUpdate(e){if(this.props.src!=e.src&&this.initAudio(),this.props.preview!=e.preview){let e=wa(this.props.preview);(!Array.isArray(e)||e.length<16)&&(e=null),this.setState({preview:e},this.initCanvas)}}initAudio(){this.audioPlayer=new Audio(this.props.src),this.audioPlayer.oncanplay=e=>this.setState({canPlay:!0}),this.audioPlayer.ontimeupdate=e=>this.setState({currentTime:Zt(this.audioPlayer.currentTime,this.state.longMin)}),this.audioPlayer.onended=e=>{this.audioPlayer.currentTime=0,this.setState({playing:!1,currentTime:Zt(0,this.state.longMin)})}}initCanvas(){this.canvasRef.current.width=2*this.canvasRef.current.offsetWidth,this.canvasRef.current.height=2*this.canvasRef.current.offsetHeight,this.canvasContext=this.canvasRef.current.getContext("2d"),this.canvasContext.lineCap="round",this.viewBuffer=this.resampleBars(this.state.preview),this.visualize()}visualize(){if(!this.canvasRef.current)return;const e=this.effectiveWidth,t=this.canvasRef.current.height;this.canvasContext.lineWidth=6;const a=()=>{if(this.canvasRef.current&&this.audioPlayer&&(this.canvasContext.clearRect(0,0,this.canvasRef.current.width,t),this.viewBuffer)){this.state.playing&&window.requestAnimationFrame(a);const s=this.props.duration?Math.max(0,Math.min(1e3*this.audioPlayer.currentTime/this.props.duration,1))*(e-12):-1;this.canvasContext.beginPath(),this.canvasContext.strokeStyle=Ca;for(let e=0;e.01));const a=e.length/t;let s=[],i=-1;for(let n=0;n0?s.map((e=>e/i)):Array.apply(null,Array(t)).map((e=>.01))}handlePlay(e){e.preventDefault(),this.state.canPlay&&(this.state.playing?(this.audioPlayer.pause(),this.setState({playing:!1})):(this.audioPlayer.play(),this.setState({playing:!0},this.visualize)))}handleError(e){console.error(e)}handleSeek(e){if(e.preventDefault(),e.target&&this.props.duration){const t=e.target.getBoundingClientRect(),a=(e.clientX-t.left)/this.effectiveWidth*2;this.audioPlayer.currentTime=this.props.duration*a/1e3,this.setState({currentTime:Zt(this.audioPlayer.currentTime,this.state.longMin)}),this.state.playing||this.visualize()}}render(){const e="material-icons"+(this.props.short?"":" large")+(this.state.canPlay?"":" disabled"),a=t().createElement("a",{href:"#",onClick:this.handlePlay,title:"Play"},t().createElement("i",{className:e},this.state.playing?"pause_circle":this.state.canPlay?"play_circle":"not_interested"));return t().createElement("div",{className:"audio-player"},this.props.short?t().createElement(t().Fragment,null,t().createElement("canvas",{className:"playback",ref:this.canvasRef,onClick:this.handleSeek}),a):t().createElement(t().Fragment,null,a,t().createElement("div",null,t().createElement("canvas",{className:"playback",ref:this.canvasRef,onClick:this.handleSeek}),t().createElement("div",{className:"timer"},this.state.currentTime,"/",this.state.duration))))}}class Sa extends t().PureComponent{render(){const e=["declined","disconnected","missed"].includes(this.props.callState),a="material-icons medium "+(e?"red":"green"),s=this.props.incoming?e?"call_missed":"call_received":e?"call_missed_outgoing":"call_made",i=e?this.props.incoming?"declined"==this.props.callState?t().createElement(n.FormattedMessage,{id:"call_declined",defaultMessage:[{type:0,value:"declined"}]}):t().createElement(n.FormattedMessage,{id:"call_missed",defaultMessage:[{type:0,value:"missed"}]}):t().createElement(n.FormattedMessage,{id:"call_cancelled",defaultMessage:[{type:0,value:"cancelled"}]}):t().createElement("span",null,Zt(this.props.duration/1e3));return t().createElement("div",{className:"call-message"},t().createElement("div",null,t().createElement("i",{className:"material-icons big gray"},"call")),t().createElement("div",{className:"flex-column narrow"},t().createElement("div",null,this.props.incoming?t().createElement(n.FormattedMessage,{id:"calls_incoming",defaultMessage:[{type:0,value:"Incoming call"}]}):t().createElement(n.FormattedMessage,{id:"calls_outgoing",defaultMessage:[{type:0,value:"Outgoing call"}]})),t().createElement("div",{className:"duration"},t().createElement("i",{className:a},s)," ",i)))}}class Ma extends t().PureComponent{render(){const e=["declined","disconnected","missed"].includes(this.props.callState),a=this.props.incoming?e?"call_missed":"call_received":e?"call_missed_outgoing":"call_made",s=e?this.props.incoming?"declined"==this.props.callState?t().createElement(n.FormattedMessage,{id:"call_declined",defaultMessage:[{type:0,value:"declined"}]}):t().createElement(n.FormattedMessage,{id:"call_missed",defaultMessage:[{type:0,value:"missed"}]}):t().createElement(n.FormattedMessage,{id:"call_cancelled",defaultMessage:[{type:0,value:"cancelled"}]}):t().createElement("span",null,Zt(this.props.duration/1e3));return t().createElement(t().Fragment,null,t().createElement("div",{className:"composed-material"},t().createElement("i",{className:"material-icons"},"call"),t().createElement("i",{className:"material-icons second"},a))," ",s)}}class ka extends t().PureComponent{constructor(e){super(e),this.state={src:"img/placeholder.png",style:Object.assign({padding:"4px"},this.props.style),className:this.props.className,alt:this.props.alt,onClick:this.props.onClick}}componentDidMount(){this.props.whenDone.promise.then((e=>this.setState({src:e.src,style:{...this.state.style,padding:0}}))).catch((()=>this.setState({src:"img/broken_image.png"})))}componentWillUnmount(){this.props.whenDone.cancel()}componentDidUpdate(e){e.whenDone!=this.props.whenDone&&(this.setState({src:"img/placeholder.png",style:{...this.state.style,padding:"4px"}}),this.props.whenDone.promise.then((e=>this.setState({src:e.src,style:{...this.state.style,padding:0}}))).catch((()=>this.setState({src:"img/broken_image.png"}))))}render(){return t().createElement("img",this.state)}}class Ta extends t().PureComponent{render(){return t().createElement("div",{className:"uploader"},t().createElement("div",null,t().createElement("span",{style:{width:100*this.props.progress+"%"}})),this.props.progress<.999?t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancel()}},t().createElement("i",{className:"material-icons"},"close")," ",t().createElement(n.FormattedMessage,{id:"action_cancel",defaultMessage:[{type:0,value:"cancel"}]})):t().createElement(n.FormattedMessage,{id:"upload_finishing",defaultMessage:[{type:0,value:"finishing..."}]}))}}class Na extends t().PureComponent{constructor(e){super(e)}render(){return t().createElement("div",{className:"inline-image"},t().createElement("img",this.props),t().createElement("div",{className:"rounded-container"},t().createElement(Ta,{progress:this.props.progress,onCancel:this.props.onCancelUpload})))}}const Aa=(0,n.defineMessages)({drafty_form:{id:"drafty_form",defaultMessage:[{type:0,value:"Form:"}]},drafty_attachment:{id:"drafty_attachment",defaultMessage:[{type:0,value:"Attachment"}]},drafty_image:{id:"drafty_image",defaultMessage:[{type:0,value:"Picture"}]},drafty_unknown:{id:"drafty_unknown",defaultMessage:[{type:0,value:"Unsupported"}]}});function Da(e,t,a){if(!t)return a.src="img/broken_image.png",a.style={width:"36px",height:"36px"},e;a.className="inline-image";const s=_a(t.width,t.height,this.viewportWidth>0?Math.min(this.viewportWidth-84.5,448.5):448.5,312,!1)||{dstWidth:32,dstHeight:32};return a.style={width:s.dstWidth+"px",height:s.dstHeight+"px",minWidth:s.dstWidth+"px",minHeight:s.dstHeight+"px"},Ut.Drafty.isProcessing(t)?e=Na:(a.src=this.authorizeURL(ra(a.src,"image")),a.alt=t.name,a.src?(Math.max(t.width||0,t.height||0)>Wt&&(a.onClick=this.onImagePreview,a.className+=" image-clickable"),a.loading="lazy"):a.src="img/broken_image.png"),e}function Pa(e,a,s,i,n){if(n.includes("QQ"))return Ra.call(this,e,a,s,i);if(!e)return s;let o=Ut.Drafty.tagName(e),r=Ut.Drafty.attrValue(e,a)||{};switch(r.key=i,e){case"AU":r.src&&(r.src=this.authorizeURL(ra(r.src,"audio")),r.duration=a.duration>0?0|a.duration:void 0,r.preview=a.preview,r.loading="lazy"),o=Ea,s=null;break;case"BR":s=null;break;case"EX":case"RW":break;case"HL":r.className="highlight";break;case"HD":o=null,s=null;break;case"IM":o=Da.call(this,o,a,r),s=null;break;case"BN":r.onClick=this.onFormButtonClick;let e=t().Children.map(s,(e=>"string"==typeof e?e:void 0));e&&0!=e.length||(e=[r.name]),r["data-title"]=e.join("");break;case"MN":r.className="mention",a&&(r.className+=" "+aa(a.val,!1,!0));break;case"FM":r.className="bot-form";break;case"QQ":r.className="reply-quote",r.onClick=this.onQuoteClick;break;case"VC":o=Sa,s=null,a&&(r.callState=a.state,r.incoming=a.incoming,r.duration=a.duration);break;default:if(!o){o=t().Fragment,r={key:i};let e=s;Array.isArray(s)&&s.join("").trim()||(e=[t().createElement("span",{key:"x1",className:"gray"},this.formatMessage(Aa.drafty_unknown))]),s=[t().createElement("i",{key:"x0",className:"material-icons gray"},"extension")," "].concat(e)}}return o?t().createElement(o,r,s):s}function Ia(e,a,s,i){if(!e)return s;let n=Ut.Drafty.tagName(e);const o={key:i};switch(e){case"AU":n=t().Fragment,s=[t().createElement("i",{key:"au",className:"material-icons"},"mic")," ",Zt(a.duration/1e3)];break;case"BR":n=t().Fragment,s=[" "];break;case"HL":o.className="highlight preview";break;case"LN":case"MN":n="span";break;case"IM":n=t().Fragment,s=[t().createElement("i",{key:"im",className:"material-icons"},"photo")," ",this.formatMessage(Aa.drafty_image)];break;case"BN":n="span",o.className="flat-button faux";break;case"FM":n=t().Fragment,s=[t().createElement("i",{key:"fm",className:"material-icons"},"dashboard"),this.formatMessage(Aa.drafty_form)].concat(" ",s||[]);break;case"RW":n=t().Fragment;break;case"EX":if(a){if("application/json"==a.mime)return null;delete a.val,delete a.ref}n=t().Fragment,s=[t().createElement("i",{key:"ex",className:"material-icons"},"attachment")," ",this.formatMessage(Aa.drafty_attachment)];break;case"VC":n=Ma,a&&(o.callState=a.state,o.incoming=a.incoming,o.duration=a.duration),s=null;break;case"QQ":case"HD":n=null,s=null;break;default:n||(n=t().Fragment,s=[t().createElement("i",{key:"x0",className:"material-icons gray"},"extension")," ",this.formatMessage(Aa.drafty_unknown)])}return n?t().createElement(n,o,s):s}function Ua(e,t){return e.style={width:"36px",height:"36px",maxWidth:"36px",maxHeight:"36px"},e.className="inline-image",e.alt=this.formatMessage(Aa.drafty_image),t||(e.src="img/broken_image.png"),e.title=e.alt,e}function Ra(e,a,s,i){if(["BR","EX","IM","MN"].includes(e)){let n=Ut.Drafty.tagName(e),o=Ut.Drafty.attrValue(e,a)||{};switch(o.key=i,e){case"BR":s=null;break;case"IM":o=Ua.call(this,o,a),s=[t().createElement("img",o,null)," ",o.alt],n=t().Fragment,o={key:i};break;case"MN":n="span",o.className="mention",a&&(o.className+=" "+aa(a.val,!1,!0));break;case"EX":let e;if(a){if("application/json"==a.mime)return null;e=a.name,delete a.val,delete a.ref}n=t().Fragment,s=[t().createElement("i",{key:"ex",className:"material-icons"},"attachment"),ta(e,16)||this.formatMessage(Aa.drafty_attachment)]}return t().createElement(n,o,s)}return Ia.call(this,e,a,s,i)}function Fa(e){let t;if(e.val){const a=function(e,t){if(!e)return null;try{const a=atob(e),s=a.length,i=new ArrayBuffer(s),n=new Uint8Array(i);for(let e=0;e{if(e.ok)return e.blob();throw new Error("Image fetch unsuccessful: ".concat(e.status," ").concat(e.statusText))}))}return t.then((e=>ba(e,Wt,Wt,-1,!0))).then((t=>(e.mime=t.mime,e.size=t.blob.size,e.width=t.width,e.height=t.height,delete e.ref,e.src=URL.createObjectURL(t.blob),va(t.blob)))).then((t=>(e.val=t.bits,e))).catch((t=>{throw delete e.val,delete e.src,e.width=Wt,e.height=Wt,t}))}function xa(e,a,s,i,n){if("IM"==e){const e=Ua.call(this,{key:i},a);let n;try{n=ca(Fa.call(this,a))}catch(e){n=ca(e)}return e.whenDone=n,s=[t().createElement(ka,e,null)," ",e.alt],t().createElement(t().Fragment,{key:i},s)}if("QQ"==e){if(n.includes("QQ"))return t().createElement("span",{key:i},[t().createElement("i",{key:"qq",className:"material-icons"},"format_quote")," "]);const e=Ut.Drafty.attrValue("QQ",a)||{};return e.key=i,e.className="reply-quote",t().createElement(Ut.Drafty.tagName("QQ"),e,s)}return Ra.call(this,e,a,s,i)}class Ba extends t().Component{constructor(e){super(e),this.handleClick=this.handleClick.bind(this),this.handleContextClick=this.handleContextClick.bind(this)}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.onSelected&&this.props.onSelected(this.props.item,this.props.index)}handleContextClick(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.props.item,y:e.pageY,x:e.pageX})}render(){let e=this.props.title;e?e.length>30&&(e=e.substring(0,28)+"…"):e=t().createElement("i",null,t().createElement(n.FormattedMessage,{id:"unnamed_topic",defaultMessage:[{type:0,value:"Unnamed"}]}));const a=this.props.now?"online":"offline",s=!this.props.avatar||this.props.avatar,i=this.props.badges?this.props.badges.slice():[],o=[];let r;this.props.isVerified&&o.push({icon:"verified",color:"verified-color"}),this.props.isStaff&&o.push({icon:"staff",color:"staff-color"}),this.props.isDangerous&&o.push({icon:"dangerous",color:"danger-color"}),this.props.acs&&(this.props.showMode&&i.push({name:this.props.acs.getMode(),key:"mode"}),this.props.acs.isMuted()&&o.push({icon:"muted"}),this.props.acs.isJoiner()||o.push({icon:"banned"})),"string"==typeof this.props.preview?r=this.props.preview:Ut.Drafty.isValid(this.props.preview)?r=t().createElement(t().Fragment,null,Ut.Drafty.format(this.props.preview,Ia,{formatMessage:this.props.intl.formatMessage,previewIsResponse:this.props.previewIsResponse})):this.props.preview&&(r=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons gray"},"warning_amber")," ",t().createElement("i",{className:"gray"},t().createElement(n.FormattedMessage,{id:"invalid_content",defaultMessage:[{type:0,value:"invalid content"}]}))));const l=la(this.props.received),c=l?t().createElement("i",{className:"material-icons small space-right"+(l.color?" "+l.color:"")},l.name):null,d="contact-title"+(this.props.deleted?" deleted":"");return t().createElement("li",{className:!this.props.showCheckmark&&this.props.selected?"selected":null,onClick:this.handleClick},t().createElement("div",{className:"avatar-box"},t().createElement(ha,{tinode:this.props.tinode,avatar:s,title:this.props.title,topic:this.props.item,deleted:this.props.deleted}),this.props.deleted?t().createElement("i",{className:"deleted material-icons"},"cancel"):this.props.showOnline?t().createElement("span",{className:a}):this.props.showCheckmark&&this.props.selected?t().createElement("i",{className:"checkmark material-icons"},"check_circle"):null),t().createElement("div",{className:"text-box"},t().createElement("div",null,t().createElement("span",{className:d},e),this.props.isChannel?t().createElement("img",{src:"/img/channel.png",className:"channel",alt:"channel"}):null,t().createElement(Xt,{badges:o}),this.props.deleted?null:t().createElement(pa,{count:this.props.unread})),this.props.showMode?t().createElement("span",null,t().createElement(Xt,{badges:i})):this.props.small?null:t().createElement("div",{className:"contact-comment"},c,t().createElement("span",null,r||this.props.comment||" "))),this.props.showContextMenu?t().createElement("span",{className:"menuTrigger"},t().createElement("a",{href:"#",onClick:this.handleContextClick},t().createElement("i",{className:"material-icons"},"expand_more"))):null)}}const La=(0,n.injectIntl)(Ba);class Oa extends t().PureComponent{constructor(e){super(e),this.handleClick=this.handleClick.bind(this)}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.onAction(this.props.action)}render(){const{formatMessage:e}=this.props.intl;return t().createElement("li",{onClick:this.handleClick,className:"action"},t().createElement("div",{className:"action-text"},e(this.props.title,this.props.values)))}}const qa=(0,n.injectIntl)(Oa),ja=(0,n.defineMessages)({badge_you:{id:"badge_you",defaultMessage:[{type:0,value:"you"}]},badge_owner:{id:"badge_owner",defaultMessage:[{type:0,value:"owner"}]}});class za extends t().Component{render(){const{formatMessage:e}=this.props.intl,a=Array.isArray(this.props.topicSelected),s=[];let i=0;return this.props.contacts&&this.props.contacts.length>0&&this.props.contacts.map((n=>{if(n.action)s.push(t().createElement(qa,{title:n.title,action:n.action,values:n.values,key:n.action,onAction:this.props.onAction}));else{const o=this.props.showMode?n.user:n.topic||n.user;if(this.props.filterFunc&&this.props.filter){const e=[o];if(n.private&&n.private.comment&&e.push((""+n.private.comment).toLowerCase()),n.public&&n.public.fn&&e.push((""+n.public.fn).toLowerCase()),!this.props.filterFunc(this.props.filter,e))return}const r=Ut.Tinode.isChannelTopicName(o),l=a?this.props.topicSelected.indexOf(o)>-1:this.props.topicSelected===o,c=[];this.props.showMode&&(o==this.props.myUserId&&c.push({name:e(ja.badge_you),color:"green"}),n.acs&&n.acs.isOwner()&&c.push({name:e(ja.badge_owner),color:"blue"}));const d=Array.isArray(n.private)?n.private.join(","):n.private?n.private.comment:null;let h,p,u,m;if(!this.props.showMode&&n.latestMessage){const e=n.latestMessage(!0);e&&(p=e.head?e.head.forwarded:null,m=e._status||n.msgStatus(e,!0),u=e.from!=this.props.myUserId,e.content&&(h="string"==typeof e.content?e.content.substr(0,80):Ut.Drafty.preview(e.content,80)))}s.push(t().createElement(La,{tinode:this.props.tinode,title:n.public?n.public.fn:null,avatar:ga(n.public?n.public.photo:null),comment:d,preview:h,previewIsResponse:u,forwarded:p,received:m,unread:this.props.showUnread?n.unread:0,now:n.online&&this.props.connected,acs:n.acs,showMode:this.props.showMode,badges:c,showCheckmark:a,selected:l,showOnline:this.props.showOnline&&!r,isChannel:r,showContextMenu:this.props.showContextMenu,isVerified:n.trusted&&n.trusted.verified,isStaff:n.trusted&&n.trusted.staff,isDangerous:n.trusted&&n.trusted.danger,deleted:n._deleted,onSelected:this.props.onTopicSelected,item:o,index:s.length,key:o})),i++}}),this),t().createElement("div",{className:this.props.noScroll?null:"scrollable-panel"},0==i?t().createElement("div",{className:"center-medium-text",dangerouslySetInnerHTML:{__html:this.props.emptyListMessage}}):null,s.length>0?t().createElement("ul",{className:"contact-box"},s):null)}}const Ha=(0,n.injectIntl)(za);class Va extends t().PureComponent{constructor(e){super(e),this.state={edited:!1,search:""},this.handleSearchChange=this.handleSearchChange.bind(this),this.handleSearch=this.handleSearch.bind(this),this.handleClear=this.handleClear.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}componentWillUnmount(){this.state.edited&&(this.setState({search:"",edited:!1}),this.props.onSearchContacts(Ut.Tinode.DEL_CHAR))}handleSearchChange(e){this.setState({search:e.target.value})}handleSearch(e){e.preventDefault();var t=this.state.search.trim();this.setState({edited:t.length>0}),this.props.onSearchContacts(t.length>0?t:Ut.Tinode.DEL_CHAR)}handleClear(e){e.preventDefault(),this.state.edited&&this.props.onSearchContacts(Ut.Tinode.DEL_CHAR),this.setState({search:"",edited:!1})}handleKeyDown(e){"Enter"===e.key?this.handleSearch(e):"Escape"===e.key&&this.handleClear()}render(){return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement("i",{className:"material-icons search"},"search"),t().createElement("input",{className:"search",type:"text",placeholder:this.props.placeholder,value:this.state.search,onChange:this.handleSearchChange,onKeyDown:this.handleKeyDown,required:!0,autoFocus:!0}),this.state.search?t().createElement("a",{href:"#",onClick:this.handleClear},t().createElement("i",{className:"material-icons"},"highlight_off")):t().createElement("span",null,t().createElement("i",{className:"material-icons"}," "))))}}class Wa extends t().Component{constructor(e){super(e),this.state={query:null},this.handleEscapeKey=this.handleEscapeKey.bind(this),this.handleClose=this.handleClose.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleContactSelected=this.handleContactSelected.bind(this)}componentDidMount(){this.props.onInitFind()}handleEscapeKey(e){27===e.keyCode&&this.props.hide(!1)}handleClose(e){e.preventDefault(),this.props.hide(!1)}handleSearchContacts(e){this.setState({query:Ut.Tinode.isNullValue(e)?null:e}),this.props.onSearchContacts(e)}handleContactSelected(e){this.props.onTopicSelected(e),this.props.hide(!0)}render(){let e=null!=this.state.query?this.props.searchResults:this.props.contacts;return e=e.filter((e=>e.name!=this.props.topicSelected&&e.acs.isJoiner()&&e.acs.isWriter())),t().createElement("div",{className:"alert-container"},t().createElement("div",{className:"forward-dialog"},t().createElement("div",{className:"title with-control"},t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"forward_to",defaultMessage:[{type:0,value:"Forward to"}],desription:"Title of the contact selector dialog when forwarding a message"})),t().createElement("div",null,t().createElement("a",{href:"#",onClick:this.handleClose},t().createElement("i",{className:"material-icons"},"close")))),t().createElement(n.FormattedMessage,{id:"forward_to_search_placeholder",defaultMessage:[{type:0,value:"Search contacts"}]},(e=>t().createElement(Va,{placeholder:e,onSearchContacts:this.handleSearchContacts}))),t().createElement(n.FormattedMessage,{id:"search_no_results",defaultMessage:[{type:0,value:"Search returned no results"}]},(a=>t().createElement(Ha,{tinode:this.props.tinode,contacts:e,myUserId:this.props.myUserId,emptyListMessage:a,showOnline:!1,showUnread:!1,showContextMenu:!1,onTopicSelected:this.handleContactSelected})))))}}const Ka={staff:"verified_user"},Ga=(0,n.defineMessages)({badge_verified:{id:"badge_verified",defaultMessage:[{type:0,value:"Verified/official"}]},badge_staff:{id:"badge_staff",defaultMessage:[{type:0,value:"Staff-managed"}]},badge_danger:{id:"badge_danger",defaultMessage:[{type:0,value:"Untrustworthy"}]}});class $a extends t().PureComponent{render(){const{formatMessage:e}=this.props.intl;let a=null;return this.props.trustedBadges&&this.props.trustedBadges.length>0?(a=[],this.props.trustedBadges.map((s=>{const i=this.props.short?null:e(Ga["badge_"+s]),n="material-icons "+s+"-color";a.push(t().createElement("div",{className:"trusted-badge",key:s},t().createElement("i",{className:n},Ka[s]||s)," ",i))})),t().createElement(t().Fragment,null,a)):null}}const Qa=(0,n.injectIntl)($a),Ya=new Audio("audio/call-in.m4a");class Ja extends t().Component{constructor(e){super(e),this.state={topic:null,fullName:void 0,avatar:null,trustedBadges:[],previousMetaDesc:void 0},this.resetDesc=this.resetDesc.bind(this),this.onMetaDesc=this.onMetaDesc.bind(this),this.handleRejectCall=this.handleRejectCall.bind(this),this.handleAcceptCall=this.handleAcceptCall.bind(this),this.ringTimer=null}componentDidMount(){const e=this.props.tinode.getTopic(this.props.topic);e&&(this.resetDesc(e,this.props),2==this.props.callState&&(Ya.play(),this.ringTimer=setInterval((()=>Ya.play()),2e3),this.props.onRinging(this.props.topic,this.props.seq)))}componentDidUpdate(e){const t=this.props.tinode.getTopic(e.topic);t&&(this.onMetaDesc!=t.onMetaDesc&&(this.previousMetaDesc=t.onMetaDesc,t.onMetaDesc=this.onMetaDesc),this.state.topic!=e.topic&&(this.setState({topic:e.topic}),this.resetDesc(t,e)))}componentWillUnmount(){null!=this.ringTimer&&(clearInterval(this.ringTimer),Ya.pause());const e=this.props.tinode.getTopic(this.props.topic);e&&(this.setState({topic:null}),e.onMetaDesc=this.previousMetaDesc)}resetDesc(e,t){e.getDefaultAccess(),e.getAccessMode();const a=[];if(e.trusted)for(const[t,s]of Object.entries(e.trusted))s&&a.push(t);this.setState({fullName:da(e.public?e.public.fn:void 0,Kt),avatar:ga(e.public?e.public.photo:null),trustedBadges:a})}onMetaDesc(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetDesc(t,this.props),this.previousMetaDesc&&this.previousMetaDesc!=this.onMetaDesc&&this.previousMetaDesc(e))}handleAcceptCall(){this.props.onAcceptCall(this.props.topic)}handleRejectCall(){this.props.onReject(this.props.topic,this.props.seq),this.props.onClose()}render(){return t().createElement("div",{className:"alert-container"},t().createElement("div",{className:"incoming-call"},t().createElement("div",{className:"caller-card incoming pulse"},t().createElement("div",{className:"avatar-box"},t().createElement(ha,{tinode:this.props.tinode,avatar:this.state.avatar||!0,topic:this.props.topic,title:this.state.fullName})),t().createElement("div",{className:"caller-name"},da(this.state.fullName,20),t().createElement(Qa,{short:!0,trustedBadges:this.state.trustedBadges}))),t().createElement("div",{className:"controls"},2==this.props.callState?t().createElement(t().Fragment,null,t().createElement("button",{className:"danger",onClick:this.handleRejectCall},t().createElement("i",{className:"material-icons"},"call_end")),t().createElement("button",{className:"positive",onClick:this.handleAcceptCall},t().createElement("i",{className:"material-icons"},"call"))):null)))}}class Xa extends t().PureComponent{render(){const e="load-spinner-box"+(this.props.large?" large":"")+(this.props.clear?" clear":"")+(this.props.centered?" centered":"");return this.props.show?t().createElement("div",{className:e},t().createElement("div",{className:"loader-spinner"})):null}}class Za extends t().Component{constructor(e){super(e),this.state={source:e.avatar},this.handleFileReceived=this.handleFileReceived.bind(this)}componentDidUpdate(e){this.props.avatar!=e.avatar&&this.setState({source:this.props.avatar})}handleFileReceived(e){const t=e.target.files[0];this.props.onImageUpdated(t.type,URL.createObjectURL(t),t.name),e.target.value=""}render(){const e="file-input-avatar-"+(""+Math.random()).substring(0,4),a="avatar-upload"+(this.props.readOnly?" read-only":"");return t().createElement("div",{className:a},this.props.readOnly||!this.state.source?null:t().createElement("a",{href:"#",className:"clear-avatar",onClick:e=>{e.preventDefault(),this.props.onImageUpdated()}},t().createElement("i",{className:"material-icons"},"clear")),this.state.source?t().createElement("img",{src:this.props.tinode.authorizeURL(ra(this.state.source,"image")),className:"preview"}):this.props.readOnly&&this.props.uid?t().createElement("div",{className:"avatar-box"},t().createElement(ha,{tinode:this.props.tinode,avatar:!0,topic:this.props.uid,title:this.props.title})):t().createElement("div",{className:"blank"},zt,"×",zt),this.props.readOnly?null:t().createElement("input",{type:"file",id:e,className:"inputfile hidden",accept:"image/*",onChange:this.handleFileReceived}),this.props.readOnly?null:t().createElement("label",{htmlFor:e,className:"round"},t().createElement("i",{className:"material-icons"},"file_upload")),t().createElement(Xa,{show:this.props.uploading,large:!0,clear:!0,centered:!0}))}}class es extends t().PureComponent{constructor(e){super(e),this.handleChange=this.handleChange.bind(this)}handleChange(){this.props.onChange(this.props.name,!this.props.checked)}render(){return this.props.onChange?!0===this.props.checked?t().createElement("i",{className:"material-icons blue clickable",onClick:this.handleChange},"check_box"):!1===this.props.checked?t().createElement("i",{className:"material-icons blue clickable",onClick:this.handleChange},"check_box_outline_blank"):t().createElement("i",{className:"material-icons lt-blue"},"indeterminate_check_box"):this.props.checked?t().createElement("i",{className:"material-icons"},"check_box"):t().createElement("i",{className:"material-icons"},"check_box_outline_blank")}}class ts extends t().PureComponent{render(){return t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancel()}},t().createElement("i",{className:"material-icons"},"close"))}}class as extends t().PureComponent{constructor(e){super(e),this.state={show:!1},this.hide=this.hide.bind(this)}componentDidUpdate(e){e.level!==this.props.level&&this.setState({show:!!this.props.level})}hide(){this.setState({show:!1}),this.props.onClearError&&this.props.onClearError()}render(){const e={err:"error",warn:"warning",info:"info"}[this.props.level]||"",a="info-box "+e;return t().createElement("div",{className:a},t().createElement("div",{className:"icon"},t().createElement("i",{className:"material-icons"},e)),t().createElement("span",null,this.props.text,this.props.action?t().createElement(t().Fragment,null,t().createElement("a",{href:"#",style:{whiteSpace:"nowrap"},onClick:e=>{e.preventDefault(),this.props.action()}},this.props.actionText)):null),t().createElement("div",{className:"cancel"},t().createElement(ts,{onCancel:this.hide})))}}class ss extends t().PureComponent{constructor(e){super(e),this.handleCancel=this.handleCancel.bind(this)}handleCancel(e){e.preventDefault(),this.props.onCancel(this.props.topic,this.props.index)}render(){const e=this.props.title||this.props.topic,a=this.props.invalid?"chip invalid":"chip";return t().createElement("div",{className:a},this.props.noAvatar?t().createElement("span",{className:"spacer"}):t().createElement("div",{className:"avatar-box"},t().createElement(ha,{tinode:this.props.tinode,avatar:this.props.avatar||!0,topic:this.props.topic,title:this.props.title})),t().createElement("span",null,e),this.props.onCancel&&!this.props.required?t().createElement("a",{href:"#",onClick:this.handleCancel},"×"):t().createElement("span",{className:"spacer"}))}}class is extends t().Component{constructor(e){super(e),this.state=is.deriveStateFromProps(e),this.state.input="",this.state.focused=!1,this.handleTextInput=this.handleTextInput.bind(this),this.removeChipAt=this.removeChipAt.bind(this),this.handleChipCancel=this.handleChipCancel.bind(this),this.handleFocusGained=this.handleFocusGained.bind(this),this.handleFocusLost=this.handleFocusLost.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}static deriveStateFromProps(e){return{placeholder:e.chips?"":e.prompt,sortedChips:is.sortChips(e.chips,e.staticMembers),chipIndex:is.indexChips(e.chips)}}componentDidUpdate(e,t){e.chips==this.props.chips&&e.staticMembers==this.props.staticMembers&&e.prompt==this.props.prompt||this.setState(is.deriveStateFromProps(this.props)),(!t||this.props.chips.length>t.sortedChips.length)&&this.setState({input:""})}static indexChips(e){const t={};let a=0;return e.map((e=>{t[e.user]=a,a++})),t}static sortChips(e,t){const a=[],s=[];return e.map((e=>{t&&t.includes(e.user)?a.push(e):s.push(e)})),a.concat(s)}handleTextInput(e){this.setState({input:e.target.value}),this.props.filterFunc&&this.props.filterFunc(e.target.value)}removeChipAt(e){const t=this.state.sortedChips[e];this.props.onChipRemoved(t.user,this.state.chipIndex[t.user])}handleChipCancel(e,t){this.removeChipAt(t)}handleFocusGained(){this.setState({focused:!0})}handleFocusLost(){this.setState({focused:!1}),this.props.onFocusLost&&this.props.onFocusLost(this.state.input)}handleKeyDown(e){if("Backspace"===e.key){if(0==this.state.input.length&&this.state.sortedChips.length>0){const e=this.state.sortedChips.length-1;this.state.sortedChips[e].user!==this.props.staticMembers&&this.removeChipAt(e)}}else"Enter"===e.key?this.props.onEnter&&this.props.onEnter(this.state.input):"Escape"===e.key&&this.props.onCancel&&this.props.onCancel()}render(){const e=[];let a=0;const s=this.props.staticMembers||[];this.state.sortedChips.map((i=>{e.push(t().createElement(ss,{tinode:this.props.tinode,onCancel:this.handleChipCancel,avatar:ga(i.public?i.public.photo:null),title:i.public?i.public.fn:void 0,noAvatar:this.props.avatarDisabled,topic:i.user,required:s.includes(i.user),invalid:i.invalid,index:a,key:i.user})),a++}));const i="chip-input"+(this.state.focused?" focused":""),n=!(this.props.tabIndex>0);return t().createElement("div",{className:i},e,t().createElement("input",{type:"text",placeholder:this.state.placeholder,onChange:this.handleTextInput,onFocus:this.handleFocusGained,onBlur:this.handleFocusLost,onKeyDown:this.handleKeyDown,value:this.state.input,tabIndex:this.props.tabIndex,autoFocus:n}))}}const ns=(0,n.defineMessages)({no_contacts:{id:"no_contacts",defaultMessage:[{type:0,value:"You have no contacts :-("}]},contacts_not_found_short:{id:"contacts_not_found_short",defaultMessage:[{type:0,value:"No contacts match '"},{type:1,value:"query"},{type:0,value:"'"}]}});class os extends t().Component{constructor(e){super(e),this.state={members:e.members,index:os.indexMembers(e.members),staticMembers:os.staticMembers(e.members,e.keepInitialMembers,e.requiredMember),contactFilter:"",noContactsMessage:e.intl.formatMessage(ns.no_contacts),selectedContacts:os.selectedContacts(e.members)},this.handleContactSelected=this.handleContactSelected.bind(this),this.handleMemberRemoved=this.handleMemberRemoved.bind(this),this.handleContactFilter=this.handleContactFilter.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static indexMembers(e){let t={};return e.map((e=>{t[e.user]={delta:0,present:!0}})),t}static staticMembers(e,t,a){let s=[];return e.map((e=>{(t||e.user==a)&&s.push(e.user)})),s}static selectedContacts(e){let t=[];return e.map((e=>{t.push(e.user)})),t}handleContactSelected(e,t){let a=this.state.index[e];if(a){if(a.present)return;a.delta+=1,a.present=!0}else a={delta:1,present:!0};let s=this.state.members.slice();s.push(this.props.contacts[t]);const i=os.selectedContacts(s),n=this.state.index;n[e]=a,this.setState({members:s,index:n,selectedContacts:i})}handleMemberRemoved(e,t){const a=this.state.index[e];if(!a||!a.present)return;a.present=!1,a.delta-=1;let s=this.state.members.slice();s.splice(t,1);const i=os.selectedContacts(s),n=this.state.index;n[e]=a,this.setState({members:s,index:n,selectedContacts:i})}handleContactFilter(e){const{formatMessage:t}=this.props.intl,a=e?t(ns.contacts_not_found_short,{query:e}):t(ns.no_contacts);this.setState({contactFilter:e,noContactsMessage:a})}static doContactFiltering(e,t){if(e){for(let a=0;a=0)return!0;return!1}return!0}handleSubmit(){var e=this,t=[],a=[],s=[];Object.keys(this.state.index).map((function(i){e.state.index[i].present&&t.push(i),e.state.index[i].delta>0?a.push(i):e.state.index[i].delta<0&&s.push(i)})),this.props.onSubmit(t,a,s)}handleCancel(){this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl;return t().createElement("div",{id:"group-manager"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"title_group_members",defaultMessage:[{type:0,value:"Group Members"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement(is,{tinode:this.props.tinode,chips:this.state.members,staticMembers:this.state.staticMembers,prompt:"add members",filterFunc:this.handleContactFilter,onChipRemoved:this.handleMemberRemoved})),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"title_all_contacts",defaultMessage:[{type:0,value:"All Contacts"}]}))),t().createElement(Ha,{tinode:this.props.tinode,contacts:this.props.contacts,myUserId:this.props.myUserId,topicSelected:this.state.selectedContacts,filter:this.state.contactFilter,filterFunc:os.doContactFiltering,emptyListMessage:this.state.noContactsMessage,showOnline:!1,showUnread:!1,onTopicSelected:this.handleContactSelected}),t().createElement("div",{id:"group-manager-buttons",className:"panel-form-row"},t().createElement("button",{className:"secondary",onClick:this.handleCancel},t().createElement(n.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(n.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))))}}const rs=(0,n.injectIntl)(os),ls=(0,n.defineMessages)({joiner:{id:"permission_join",defaultMessage:[{type:0,value:"Join ("},{type:1,value:"val"},{type:0,value:")"}]},reader:{id:"permission_read",defaultMessage:[{type:0,value:"Read ("},{type:1,value:"val"},{type:0,value:")"}]},writer:{id:"permission_write",defaultMessage:[{type:0,value:"Write ("},{type:1,value:"val"},{type:0,value:")"}]},preser:{id:"permission_pres",defaultMessage:[{type:0,value:"Get notified ("},{type:1,value:"val"},{type:0,value:")"}]},approver:{id:"permission_admin",defaultMessage:[{type:0,value:"Approve ("},{type:1,value:"val"},{type:0,value:")"}]},sharer:{id:"permission_share",defaultMessage:[{type:0,value:"Share ("},{type:1,value:"val"},{type:0,value:")"}]},deleter:{id:"permission_delete",defaultMessage:[{type:0,value:"Delete ("},{type:1,value:"val"},{type:0,value:")"}]},owner:{id:"permission_owner",defaultMessage:[{type:0,value:"Owner ("},{type:1,value:"val"},{type:0,value:")"}]}});class cs extends t().Component{constructor(e){super(e),this.state={mode:(e.mode||"").replace("N","")},this.handleChange=this.handleChange.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}handleChange(e){let t=this.state.mode;-1==t.indexOf(e)?t+=e:t=t.replace(e,""),this.setState({mode:t})}handleSubmit(){const e=(this.state.mode||"N").split("").sort().join("");e!==(this.props.mode||"N").split("").sort().join("")?this.props.onSubmit(e):this.props.onCancel()}handleCancel(){this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl,a="JRWPASDO",s={J:e(ls.joiner,{val:"J"}),R:e(ls.reader,{val:"R"}),W:e(ls.writer,{val:"W"}),P:e(ls.preser,{val:"P"}),A:e(ls.approver,{val:"A"}),S:e(ls.sharer,{val:"S"}),D:e(ls.deleter,{val:"D"}),O:e(ls.owner,{val:"O"})};let i=this.props.skip||"",o=this.state.mode,r=(this.props.compare||"").replace("N",""),l=[];for(let e=0;e=0&&o.indexOf(n)<0||l.push(t().createElement("tr",{key:n},t().createElement("td",null,s[n]),t().createElement("td",{className:"checkbox"},i.indexOf(n)<0?t().createElement(es,{name:n,checked:o.indexOf(n)>=0,onChange:this.handleChange}):t().createElement(es,{name:n,checked:o.indexOf(n)>=0})),this.props.compare?t().createElement("td",{className:"checkbox"},t().createElement(es,{name:n,checked:r.indexOf(n)>=0})):null))}return t().createElement("div",{className:"panel-form-column"},this.props.userTitle?t().createElement("ul",{className:"contact-box small"},t().createElement(La,{tinode:this.props.tinode,item:this.props.item,title:this.props.userTitle,small:!0,avatar:ga(this.props.userAvatar?this.props.userAvatar:null)})):null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"title_permissions",defaultMessage:[{type:0,value:"Permissions"}]})),t().createElement("table",{className:"permission-editor"},this.props.compare?t().createElement("thead",null,t().createElement("tr",null,t().createElement("th",null),t().createElement("th",null,this.props.modeTitle),t().createElement("th",null,this.props.compareTitle))):null,t().createElement("tbody",null,l)),t().createElement("br",null),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:"outline",onClick:this.handleCancel},t().createElement(n.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(n.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))))}}const ds=(0,n.injectIntl)(cs);class hs extends t().Component{constructor(e){super(e),this.state={panX:0,panY:0,originX:0,originY:0,zoom:1,minZoom:0,maxZoom:2.5},this.overlay=t().createRef(),this.cutout=t().createRef(),this.preview=t().createRef(),this.boundingBox=t().createRef(),this.imageWidth=0,this.imageHeight=0,this.mouseX=0,this.mouseY=0,this.prevDistance=0,this.cutoutRect={},this.bBoxRect={},this.originX=0,this.originY=0,this.initScaling=this.initScaling.bind(this),this.onZoom=this.onZoom.bind(this),this.handleZoom=this.handleZoom.bind(this),this.mouseDown=this.mouseDown.bind(this),this.mouseUp=this.mouseUp.bind(this),this.mouseMove=this.mouseMove.bind(this),this.mouseTouch=this.mouseTouch.bind(this),this.positionAll=this.positionAll.bind(this),this.translate=this.translate.bind(this)}componentDidMount(){this.overlay.current.addEventListener("mousedown",this.mouseDown,{passive:!0}),this.overlay.current.addEventListener("touchstart",this.mouseDown,{passive:!0}),this.bBoxRect=this.boundingBox.current.getBoundingClientRect(),this.originX=this.bBoxRect.width/2,this.originY=this.bBoxRect.height/2,this.cutoutRect=this.cutout.current.getBoundingClientRect()}componentWillUnmount(){this.overlay.current.removeEventListener("mousedown",this.mouseDown),this.overlay.current.removeEventListener("touchstart",this.mouseDown)}positionAll(e,t,a){this.setState({panX:e,panY:t,zoom:a,originX:this.originX-e,originY:this.originY-t});const s=(this.originX-e)*a-this.originX,i=(this.originY-t)*a-this.originY;this.props.onChange((s+this.cutoutRect.left-this.bBoxRect.left)/a,(i+this.cutoutRect.top-this.bBoxRect.top)/a,this.cutoutRect.width/a,this.cutoutRect.height/a,a)}static checkBound(e,t,a,s){let i=Math.min(0,a[0]-t[0]-s,t[1]-a[1]+s);return(0==i||Math.min(0,a[0]-t[0],t[1]-a[1])i&&(t+=o-i);const r=this.originY-(this.originY-a)*e,l=r+this.imageHeight*e,c=this.cutoutRect.top-this.bBoxRect.top,d=c+this.cutoutRect.height;cl&&(a+=d-l),this.positionAll(t,a,e)}mouseDown(e){e.touches?(this.mouseX=e.touches[0].pageX,this.mouseY=e.touches[0].pageY):(this.mouseX=e.pageX,this.mouseY=e.pageY),window.addEventListener("mousemove",this.mouseMove,{passive:!1}),window.addEventListener("touchmove",this.mouseTouch,{passive:!1}),window.addEventListener("mouseup",this.mouseUp,{passive:!0}),window.addEventListener("touchend",this.mouseUp,{passive:!0}),document.body.style.userSelect="none"}translate(e,t){const a=e-this.mouseX,s=t-this.mouseY;this.mouseX=e,this.mouseY=t;const i=this.preview.current.getBoundingClientRect();let n=hs.checkBound(this.state.panX,[i.left,i.right],[this.cutoutRect.left,this.cutoutRect.right],a),o=hs.checkBound(this.state.panY,[i.top,i.bottom],[this.cutoutRect.top,this.cutoutRect.bottom],s);this.positionAll(n,o,this.state.zoom)}mouseMove(e){e.preventDefault(),this.translate(e.pageX,e.pageY)}mouseTouch(e){if(e.preventDefault(),1==e.touches.length)return void this.translate(e.touches[0].pageX,e.touches[0].pageY);const[t,a]=e.touches,s=Math.sqrt((t.pageX-a.pageX)*(t.pageX-a.pageX)+(t.pageY-a.pageY)*(t.pageY-a.pageY));this.prevDistance||(this.prevDistance=s/this.state.zoom);let i=s/this.prevDistance;this.handleZoom(Math.max(this.minZoom,Math.min(this.maxZoom,i)))}mouseUp(e){window.removeEventListener("mousemove",this.mouseMove),window.removeEventListener("touchmove",this.mouseTouch),window.removeEventListener("mouseup",this.mouseUp),window.removeEventListener("touchend",this.mouseUp),document.body.style.userSelect="",this.positionAll(this.state.panX,this.state.panY,this.state.zoom)}render(){const e="translate3d(".concat(this.state.panX,"px, ").concat(this.state.panY,"px, 0) scale(").concat(this.state.zoom,")"),a="".concat(this.state.originX,"px ").concat(this.state.originY,"px"),s={top:"".concat(this.originY-this.state.originY*this.state.zoom,"px"),left:"".concat(this.originX-this.state.originX*this.state.zoom,"px"),width:"".concat(this.imageWidth*this.state.zoom,"px"),height:"".concat(this.imageHeight*this.state.zoom,"px")};return t().createElement("div",{className:"cropper"},t().createElement("div",{className:"bounding-box",ref:this.boundingBox},t().createElement("img",{src:this.props.source,className:"preview",alt:"",style:{transform:e,transformOrigin:a},ref:this.preview,onLoad:this.initScaling}),t().createElement("div",{className:"cutout circle",ref:this.cutout}),t().createElement("div",{className:"overlay",style:s,ref:this.overlay})),t().createElement("div",{className:"zoom-wrapper"},t().createElement("input",{type:"range",className:"zoomer",step:"0.001",min:this.state.minZoom,max:this.state.maxZoom,value:this.state.zoom,onChange:this.onZoom})))}}class ps extends t().PureComponent{constructor(e){super(e),this.state={top:0,left:0,width:0,height:0,scale:1},this.handleSubmit=this.handleSubmit.bind(this),this.handleChange=this.handleChange.bind(this)}handleChange(e,t,a,s,i){this.setState({left:e,top:t,width:a,height:s,scale:i})}handleSubmit(){var e,t,a,s,i,n,o;(e=this.props.mime,t=this.props.avatar,a=this.state.left,s=this.state.top,i=this.state.width,n=this.state.height,o=this.state.scale,new Promise(((r,l)=>{const c=new Image;c.crossOrigin="Anonymous",c.onerror=e=>{l(new Error("Image format unrecognized"))},c.onload=()=>{URL.revokeObjectURL(c.src);let t=document.createElement("canvas");t.width=i*o,t.height=n*o;let d=t.getContext("2d");d.imageSmoothingEnabled=!0,d.drawImage(c,a,s,i,n,0,0,t.width,t.height),e=ua.includes(e)?e:"image/jpeg",t.toBlob((a=>{t=null,a?r({mime:e,blob:a,width:i,height:n}):l(new Error("Unsupported image format"))}),e)},c.src=t}))).then((e=>{this.props.onSubmit(e.mime,e.blob,e.width,e.height)})).catch((e=>{this.props.onError(e)}))}render(){return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement(hs,{source:this.props.avatar,onChange:this.handleChange})),t().createElement("div",{className:"dialog-buttons"},this.props.onCancel?t().createElement("button",{className:"secondary",onClick:this.props.onCancel},t().createElement(n.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})):null,t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(n.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))))}}class us extends t().PureComponent{constructor(e){super(e),this.state={value:this.props.value,visible:!1},this.handleVisibility=this.handleVisibility.bind(this),this.handeTextChange=this.handeTextChange.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this)}handeTextChange(e){this.setState({value:e.target.value}),this.props.onChange&&this.props.onChange(e)}handleVisibility(e){e.preventDefault(),this.setState({visible:!this.state.visible})}handleKeyDown(e){27==e.keyCode?(this.setState({value:this.props.value,visible:!1}),this.props.onFinished&&this.props.onFinished()):13==e.keyCode&&this.handleEditingFinished()}handleEditingFinished(e){if(e){let t=e.currentTarget;setTimeout((()=>{t.contains(document.activeElement)||this.props.onFinished&&this.props.onFinished(this.state.value)}),0)}else this.props.onFinished&&this.props.onFinished(this.state.value.trim())}render(){return t().createElement("div",{tabIndex:"-1",className:"group-focus",onBlur:this.handleEditingFinished},t().createElement("input",{className:"with-visibility",type:this.state.visible?"text":"password",value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoFocus:this.props.autoFocus?"autoFocus":"",autoComplete:this.props.autoComplete,onChange:this.handeTextChange,onKeyDown:this.handleKeyDown}),t().createElement("span",{onClick:this.handleVisibility},t().createElement("i",{className:"material-icons clickable light-gray"},this.state.visible?"visibility":"visibility_off")))}}class ms extends t().Component{constructor(e){super(e),this.selfRef=t().createRef(),this.state={active:e.active,initialValue:e.value||"",value:e.value||""},this.handeTextChange=this.handeTextChange.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleStartEditing=this.handleStartEditing.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this),this.handlePasswordFinished=this.handlePasswordFinished.bind(this)}componentDidUpdate(e,t){const a=this.props.value||"";t.initialValue==a||t.active||this.setState({initialValue:a,value:a})}handeTextChange(e){this.setState({value:e.target.value||""})}handleKeyDown(e){27===e.keyCode?this.setState({value:this.props.value,active:!1}):13===e.keyCode&&this.handleEditingFinished(e)}handleStartEditing(){this.props.readOnly||this.setState({active:!0},(()=>{this.selfRef.current&&this.selfRef.current.focus()}))}handleEditingFinished(e){const t=this.state.value.trim();!this.props.required||e.target.checkValidity()&&t?(this.setState({active:!1}),(t||this.props.value)&&t!==this.props.value&&this.props.onFinished(t)):this.setState({value:this.props.value,active:!1})}handlePasswordFinished(e){this.setState({active:!1}),e&&e!==this.props.value&&this.props.onFinished(e)}render(){if(!this.state.active){let e="password"==this.props.type?"••••••••":this.state.value,a="in-place-edit"+(this.props.readOnly?" disabled":"");return e||(e=this.props.placeholder,a+=" placeholder"),this.props.multiline&&1!=this.props.multiline||(a+=" short"),t().createElement("span",{className:a,onClick:this.handleStartEditing},t().createElement("span",null,e))}let e;const a={};return"password"==this.props.type?(e=us,a.onFinished=this.handlePasswordFinished):(this.props.multiline>1?(e="textarea",a.rows=this.props.multiline,a.className="inplace-edit"):(e="input",a.type=this.props.type||"text"),a.value=this.state.value,a.onChange=this.handeTextChange,a.onKeyDown=this.handleKeyDown,a.onBlur=this.handleEditingFinished),a.placeholder=this.props.placeholder,a.required=this.props.required?"required":"",a.autoComplete=this.props.autoComplete,a.autoFocus=!0,a.ref=this.selfRef,t().createElement(e,a,null)}}class gs extends t().Component{constructor(e){super(e),this.state={tags:this.props.tags||[],tagInput:"",activated:this.props.activated},this.handleTagInput=this.handleTagInput.bind(this),this.handleAddTag=this.handleAddTag.bind(this),this.handleRemoveTag=this.handleRemoveTag.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static getDerivedStateFromProps(e,t){const a=e.tags||[];return na(a,t.tags)||t.activated?null:{tags:a}}handleTagInput(e){if(this.setState({tagInput:e}),e.length>0){const t=e[e.length-1];'"'==e[0]?e.length>1&&'"'==t&&this.handleAddTag(e.substring(1,e.length-1)):","!=t&&" "!=t&&";"!=t&&'"'!=t||this.handleAddTag(e.substring(0,e.length-1).trim())}}handleAddTag(e){const t=this.props.tinode.getServerParam("maxTagCount",16);if(e.length>0&&this.state.tags.length{s.push({user:t,invalid:t.lengtha})})):(this.state.tags.map((e=>{s.push(t().createElement("span",{className:"badge",key:s.length},e))})),0==s.length&&(s=t().createElement("i",null,t().createElement(n.FormattedMessage,{id:"tags_not_found",defaultMessage:[{type:0,value:"No tags defined. Add some."}]})))),t().createElement("div",{className:"panel-form-column"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},this.props.title)),this.state.activated?t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"tags_editor_no_tags",defaultMessage:[{type:0,value:"Add some tags"}]},(e=>t().createElement(is,{tinode:this.props.tinode,chips:s,avatarDisabled:!0,prompt:e,tabIndex:this.props.tabIndex,onEnter:this.handleAddTag,onFocusLost:this.handleAddTag,onCancel:this.handleCancel,onChipRemoved:this.handleRemoveTag,filterFunc:this.handleTagInput}))),this.props.onSubmit||this.props.onCancel?t().createElement("div",{id:"tag-manager-buttons",className:"dialog-buttons panel-form-row"},t().createElement("button",{className:"outline",onClick:this.handleCancel},t().createElement(n.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(n.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))):null):t().createElement("div",{className:"quoted"},t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.setState({activated:!0})}},t().createElement("i",{className:"material-icons"},"edit"),"  ",t().createElement(n.FormattedMessage,{id:"title_manage_tags",defaultMessage:[{type:0,value:"Manage"}]})),t().createElement(t().Fragment,null,s)))}}class _s extends t().Component{constructor(e){super(e);const t=this.props.tinode.getTopic(this.props.topic),a=t.getAccessMode();this.state={isMe:Ut.Tinode.isMeTopicName(this.props.topic),owner:a&&a.isOwner(),fullName:t.public?t.public.fn:void 0,private:t.private?t.private.comment:null,description:t.public?t.public.note:void 0,avatar:ga(t.public?t.public.photo:null),tags:t.tags()||[],newAvatar:null,newAvatarMime:null},this.previousOnTags=null,this.tnNewTags=this.tnNewTags.bind(this),this.handleFullNameUpdate=this.handleFullNameUpdate.bind(this),this.handleImageUpdated=this.handleImageUpdated.bind(this),this.handleAvatarCropped=this.handleAvatarCropped.bind(this),this.handlePrivateUpdate=this.handlePrivateUpdate.bind(this),this.handleDescriptionUpdate=this.handleDescriptionUpdate.bind(this),this.uploadAvatar=this.uploadAvatar.bind(this),this.handleAvatarCropCancel=this.handleAvatarCropCancel.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this)}componentDidMount(){const e=this.props.tinode.getTopic(this.props.topic);this.previousOnTags=e.onTagsUpdated,e.onTagsUpdated=this.tnNewTags}componentWillUnmount(){this.props.tinode.getTopic(this.props.topic).onTagsUpdated=this.previousOnTags}tnNewTags(e){this.setState({tags:e})}handleFullNameUpdate(e){(e=e.trim().substring(0,Kt))&&this.state.fullName!==e&&(this.setState({fullName:e}),this.props.onUpdateTopicDesc(this.props.topic,ia(e,null)))}handlePrivateUpdate(e){e=e.trim().substring(0,Kt),this.state.private!==e&&(this.setState({private:e}),this.props.onUpdateTopicDesc(this.props.topic,null,e||Ut.Tinode.DEL_CHAR))}handleDescriptionUpdate(e){(e=e.trim().substring(0,Gt))&&(this.setState({description:e}),this.props.onUpdateTopicDesc(this.props.topic,ia(null,null,null,e)))}handleImageUpdated(e,t){this.setState({newAvatar:t,newAvatarMime:e}),t||(this.setState({avatar:null}),this.props.onUpdateTopicDesc(this.props.topic,ia(null,Ut.Tinode.DEL_CHAR)))}handleAvatarCropped(e,t,a,s){const i=t?URL.createObjectURL(t):null;this.setState({avatar:i,newAvatar:null,newAvatarMime:null}),t&&this.uploadAvatar(e,t,a,s)}uploadAvatar(e,t,a,s){const i=e=>{let{mime:t,blob:a}=e;if(a.size>4096){const e=this.props.tinode.getLargeFileHelper();this.setState({uploading:!0}),e.upload(a).then((e=>{this.props.onUpdateTopicDesc(this.props.topic,ia(null,e))})).catch((e=>{this.props.onError(e,"err")})).finally((()=>{this.setState({uploading:!1})}))}else this.setState({uploading:!0}),va(a).then((e=>{const a=ga({data:e.bits,type:t});this.setState({source:a}),this.props.onUpdateTopicDesc(this.props.topic,ia(null,a)),this.setState({uploading:!1})}))};a>zt||s>zt||a!=s?ba(t,zt,zt,Vt,!0).then((e=>i(e))).catch((e=>this.props.onError(e,"err"))):i({mime:e,blob:t,width:a,height:s})}handleAvatarCropCancel(e){this.setState({newAvatar:null,newAvatarMime:null})}handleTagsUpdated(e){na(this.state.tags.slice(0),e.slice(0))||this.props.onUpdateTags(e)}render(){if(this.state.newAvatar)return t().createElement(ps,{avatar:this.state.newAvatar,mime:this.state.newAvatarMime,onSubmit:this.handleAvatarCropped,onCancel:this.handleAvatarCropCancel,onError:this.props.onError});const e=this.state.isMe||this.state.owner;return t().createElement(t().Fragment,null,t().createElement("div",{className:"panel-form-column"},t().createElement("center",null,t().createElement(Za,{tinode:this.props.tinode,avatar:this.state.avatar,readOnly:!e,uid:this.props.topic,title:this.state.fullName,onImageUpdated:this.handleImageUpdated,onError:this.props.onError})),this.state.isMe?t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_your_name",defaultMessage:[{type:0,value:"Your name"}]})),t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"full_name_prompt",defaultMessage:[{type:0,value:"Full name, e.g. John Doe"}]},(e=>t().createElement(ms,{placeholder:e,value:this.state.fullName,required:!0,onFinished:this.handleFullNameUpdate}))))):t().createElement(t().Fragment,null,t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_topic_name",defaultMessage:[{type:0,value:"Name"}]}))),t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"topic_name_editing_placeholder",defaultMessage:[{type:0,value:"Freeform name of the group"}]},(a=>t().createElement(ms,{placeholder:a,readOnly:!e,value:this.state.fullName,required:!0,onFinished:this.handleFullNameUpdate}))))),t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_private",defaultMessage:[{type:0,value:"Private comment"}]}))),t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"private_editing_placeholder",defaultMessage:[{type:0,value:"Visible to you only"}]},(e=>t().createElement(ms,{placeholder:e,value:this.state.private,onFinished:this.handlePrivateUpdate})))))),e||this.state.description?t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]}))),t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"description_editing_placeholder",defaultMessage:[{type:0,value:"Description (optional)"}]},(a=>t().createElement(ms,{placeholder:a,readOnly:!e,value:this.state.description,multiline:2,onFinished:this.handleDescriptionUpdate}))))):null),e?t().createElement(t().Fragment,null,t().createElement("div",{className:"hr"}),t().createElement(n.FormattedMessage,{id:"title_tag_manager",defaultMessage:[{type:0,value:"Tags (search & discovery)"}]},(e=>t().createElement(gs,{tinode:this.props.tinode,title:e,activated:!1,tags:this.state.tags,onSubmit:this.handleTagsUpdated})))):null)}}class fs extends t().Component{constructor(e){super(e);const t=this.props.tinode.getTopic(this.props.topic),a=t.getAccessMode();this.state={isMe:"me"==this.props.topic,owner:a&&a.isOwner(),credentials:(t.getCredentials?t.getCredentials():null)||[],addCredActive:!1,addCredInvalid:!1,newCred:"",tags:[]},this.previousTagsUpdated=void 0,this.onTagsUpdated=this.onTagsUpdated.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this),this.tnCredsUpdated=this.tnCredsUpdated.bind(this),this.handleCredChange=this.handleCredChange.bind(this),this.handleCredKeyDown=this.handleCredKeyDown.bind(this),this.handleCredEntered=this.handleCredEntered.bind(this)}componentDidUpdate(e){const t=this.props.tinode.getTopic(e.topic);t&&(t.onCredsUpdated=this.tnCredsUpdated,t.onTagsUpdated!=this.onTagsUpdated&&("grp"==t.getType()?(this.previousTagsUpdated=t.onTagsUpdated,t.onTagsUpdated=this.onTagsUpdated):this.previousTagsUpdated=void 0),this.state.topic!=e.topic&&this.setState({topic:e.topic}))}componentWillUnmount(){const e=this.props.tinode.getTopic(this.props.topic);e.onCredsUpdated=void 0,e.onTagsUpdated=this.previousTagsUpdated}tnCredsUpdated(e){this.setState({credentials:e||[]})}handleCredChange(e){this.setState({newCred:e.target.value,addCredInvalid:!1})}handleCredKeyDown(e){27===e.keyCode?this.setState({newCred:"",addCredActive:!1}):13===e.keyCode&&this.handleCredEntered(e)}handleCredEntered(e){const t=this.state.newCred.trim();if(!t)return void this.setState({addCredActive:!1,addCredInvalid:!1});let a,s=function(e){return e=e.trim(),/^(?:\+?(\d{1,3}))?[- (.]*(\d{3})[- ).]*(\d{3})[- .]*(\d{2})[- .]*(\d{2})?$/.test(e)?e.replace(/[- ().]*/,""):null}(t);s?a="tel":(s=function(e){return e=e.trim(),/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/.test(e)?e:null}(t),s&&(a="email")),a?(this.props.onCredAdd(a,s),this.setState({addCredActive:!1,newCred:""})):this.setState({addCredInvalid:!0})}onTagsUpdated(e){this.setState({tags:e}),this.previousTagsUpdated&&this.previousTagsUpdated!=this.onTagsUpdated&&this.previousTagsUpdated(e)}handleTagsUpdated(e){na(this.state.tags.slice(0),e.slice(0))||this.props.onTopicTagsUpdateRequest(this.props.topic,e)}render(){const e=[];return this.state.isMe&&this.state.credentials.map((a=>{e.push(t().createElement("div",{key:a.meth+":"+a.val+":"+a.done},a.meth,": ",t().createElement("tt",null,a.val),t().createElement("span",null," ",a.done?null:t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCredConfirm(a.meth,a.val)}},t().createElement(n.FormattedMessage,{id:"validate_credential_action",defaultMessage:[{type:0,value:"confirm"}]}))," ",t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCredDelete(a.meth,a.val)}},t().createElement("i",{className:"material-icons gray"},"delete_outline")))))})),t().createElement("div",{className:"scrollable-panel"},t().createElement(_s,{tinode:this.props.tinode,topic:this.props.topic,onUpdateTopicDesc:this.props.onUpdateTopicDesc,onUpdateTags:this.handleTagsUpdated,onError:this.props.onError}),this.state.isMe?t().createElement(t().Fragment,null,t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_user_contacts",defaultMessage:[{type:0,value:"Contacts:"}]})),t().createElement("div",{className:"quoted"},e,this.state.addCredActive?t().createElement("input",{type:"text",value:this.state.value,className:this.state.addCredInvalid?"invalid":null,placeholder:"Phone number or email",required:"required",autoFocus:!0,onChange:this.handleCredChange,onKeyDown:this.handleCredKeyDown,onBlur:this.handleCredEntered}):null,t().createElement("div",null,t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.setState({addCredActive:!0})}},t().createElement("i",{className:"material-icons"},"add"),t().createElement(n.FormattedMessage,{id:"button_add_another",defaultMessage:[{type:0,value:"Add another"}]})))))):null)}}const bs=(0,n.defineMessages)({clear_messages:{id:"action_clear_messages",defaultMessage:[{type:0,value:"Clear Messages"}]},clear_messages_warning:{id:"clear_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to clear all messages? It cannot be undone."}]},delete_messages:{id:"action_delete_messages",defaultMessage:[{type:0,value:"Clear Messages for All"}]},delete_messages_warning:{id:"delete_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete all messages for everyone? It cannot be undone."}]},topic_delete:{id:"topic_delete",defaultMessage:[{type:0,value:"Delete Conversation"}]},topic_delete_warning:{id:"topic_delete_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete this conversation? It cannot be undone."}]},leave_chat:{id:"action_leave_chat",defaultMessage:[{type:0,value:"Leave Conversation"}]},leave_chat_warning:{id:"leave_chat_warning",defaultMessage:[{type:0,value:"Are you sure you want to leave this conversation?"}]},block_contact:{id:"action_block_contact",defaultMessage:[{type:0,value:"Block Contact"}]},block_contact_warning:{id:"block_contact_warning",defaultMessage:[{type:0,value:"Are you sure you want to block this contact?"}]},report_chat:{id:"action_report_chat",defaultMessage:[{type:0,value:"Report Conversation"}]},report_chat_warning:{id:"report_chat_warning",defaultMessage:[{type:0,value:"Are you sure you want to block and report this conversation?"}]},other_user:{id:"label_other_user",defaultMessage:[{type:0,value:"Other"}]}});class vs extends t().PureComponent{constructor(e){super(e),this.handleDeleteTopic=this.handleDeleteTopic.bind(this),this.handleDeleteMessages=this.handleDeleteMessages.bind(this),this.handleLeave=this.handleLeave.bind(this),this.handleBlock=this.handleBlock.bind(this),this.handleReport=this.handleReport.bind(this)}handleDeleteTopic(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(bs.topic_delete),t(bs.topic_delete_warning),(()=>{this.props.onDeleteTopic(this.props.topic)}),null,!0,null)}handleDeleteMessages(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(this.props.deleter?bs.delete_messages:bs.clear_messages),t(this.props.deleter?bs.delete_messages_warning:bs.clear_messages_warning),(()=>{this.props.onDeleteMessages(this.props.topic)}),null,!0,null)}handleLeave(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(bs.leave_chat),t(bs.leave_chat_warning),(()=>{this.props.onLeaveTopic(this.props.topic)}),null,!0,null)}handleBlock(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(bs.block_contact),t(bs.block_contact_warning),(()=>{this.props.onBlockTopic(this.props.topic)}),null,!0,null)}handleReport(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(bs.report_chat),t(bs.report_chat_warning),(e=>{this.props.onReportTopic(this.props.topic)}),null,!0,null)}render(){const{formatMessage:e}=this.props.intl;return t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},this.props.channel?null:t().createElement("a",{href:"#",className:"flat-button",onClick:this.handleDeleteMessages},t().createElement("i",{className:"material-icons"},"delete_outline"),"  ",e(this.props.deleter?bs.delete_messages:bs.clear_messages)),this.props.owner?t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleDeleteTopic},t().createElement("i",{className:"material-icons"},"delete"),"  ",e(bs.topic_delete)):t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleLeave},t().createElement("i",{className:"material-icons"},"exit_to_app"),"  ",e(bs.leave_chat)),this.props.groupTopic?null:t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleBlock},t().createElement("i",{className:"material-icons"},"block"),"  ",e(bs.block_contact)),this.props.owner?null:t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleReport},t().createElement("i",{className:"material-icons"},"report"),"  ",e(bs.report_chat))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},this.props.groupTopic?t().createElement(t().Fragment,null,t().createElement("div",{className:"group"},t().createElement("label",null,t().createElement(n.FormattedMessage,{id:"label_your_permissions",defaultMessage:[{type:0,value:"Your permissions:"}]}))," ",t().createElement("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.props.onLaunchPermissionsEditor("want")}},this.props.access)),this.props.channel?null:t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_default_access_mode",defaultMessage:[{type:0,value:"Default access mode:"}]}))),t().createElement("div",{className:"quoted"},t().createElement("div",null,"Auth: ",t().createElement("tt",{className:this.props.owner?"clickable":null,onClick:e=>{e.preventDefault(),this.props.owner&&this.props.onLaunchPermissionsEditor("auth")}},this.props.auth)),t().createElement("div",null,"Anon: ",t().createElement("tt",{className:this.props.owner?"clickable":null,onClick:e=>{e.preventDefault(),this.props.owner&&this.props.onLaunchPermissionsEditor("anon")}},this.props.anon))))):t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_permissions",defaultMessage:[{type:0,value:"Permissions:"}]}))),t().createElement("div",{className:"quoted"},t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"label_you",defaultMessage:[{type:0,value:"You:"}]})," ",t().createElement("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.props.onLaunchPermissionsEditor("want")}},this.props.access)),t().createElement("div",null,this.props.fullName?this.props.fullName:e(bs.other_user),":  ",t().createElement("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.props.onLaunchPermissionsEditor("given")}},this.props.modeGiven2))))))}}const ys=(0,n.injectIntl)(vs),ws=(0,n.defineMessages)({info:{id:"panel_title_info",defaultMessage:[{type:0,value:"Info"}]},general:{id:"panel_title_general",defaultMessage:[{type:0,value:"General"}]},security:{id:"panel_title_security",defaultMessage:[{type:0,value:"Security"}]},members:{id:"panel_title_members",defaultMessage:[{type:0,value:"Members"}]},crop:{id:"panel_title_crop",defaultMessage:[{type:0,value:"Drag to Adjust"}]},perm_want:{id:"requested_permissions",defaultMessage:[{type:0,value:"Requested"}]},perm_given:{id:"granted_permissions",defaultMessage:[{type:0,value:"Granted"}]},perm_auth:{id:"permissions_authenticated",defaultMessage:[{type:0,value:"Authenticated"}]},perm_anon:{id:"permissions_anonymous",defaultMessage:[{type:0,value:"Anonymous"}]},perm_user:{id:"permissions_user",defaultMessage:[{type:0,value:"User's Permissions"}]},edit_permissions:{id:"menu_item_edit_permissions",defaultMessage:[{type:0,value:"Edit permissions"}]}});class Cs extends t().Component{constructor(e){super(e),this.state={topic:null,owner:!1,admin:!1,sharer:!1,deleter:!1,muted:!1,address:null,groupTopic:void 0,channel:void 0,fullName:void 0,description:void 0,avatar:null,private:null,selectedContact:null,access:null,modeGiven:null,modeWant:null,modeGiven2:null,modeWant2:null,auth:null,anon:null,contactList:[],trustedBadges:[],previousMetaDesc:void 0,previousSubsUpdated:void 0},this.resetSubs=this.resetSubs.bind(this),this.resetDesc=this.resetDesc.bind(this),this.resetTags=this.resetTags.bind(this),this.onMetaDesc=this.onMetaDesc.bind(this),this.onSubsUpdated=this.onSubsUpdated.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleMuted=this.handleMuted.bind(this),this.handleUnarchive=this.handleUnarchive.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleShowAddMembers=this.handleShowAddMembers.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleMemberSelected=this.handleMemberSelected.bind(this),this.handleContextMenu=this.handleContextMenu.bind(this),this.handleBackNavigate=this.handleBackNavigate.bind(this)}componentDidUpdate(e){const t=this.props.tinode.getTopic(e.topic);t&&(this.onMetaDesc!=t.onMetaDesc&&(this.previousMetaDesc=t.onMetaDesc,t.onMetaDesc=this.onMetaDesc,this.previousSubsUpdated=t.onSubsUpdated,t.onSubsUpdated=this.onSubsUpdated),this.state.topic!=e.topic&&(this.setState({topic:e.topic}),this.resetDesc(t,e),this.resetSubs(t,e),this.resetTags(t)))}componentWillUnmount(){const e=this.props.tinode.getTopic(this.props.topic);e&&(this.setState({topic:null}),e.onMetaDesc=this.previousMetaDesc,e.onSubsUpdated=this.previousSubsUpdated)}resetSubs(e,t){const a={contactList:[]};if("p2p"==e.getType()){const s=e.subscriber(t.topic);s?(a.modeGiven2=s.acs.getGiven(),a.modeWant2=s.acs.getWant()):(a.modeGiven2="N",a.modeWant2="N")}else e.subscribers((e=>{a.contactList.push(e)}),this);this.setState(a)}resetDesc(e,t){const a=e.getDefaultAccess()||{},s=e.getAccessMode(),i=[];if(e.trusted)for(const[t,a]of Object.entries(e.trusted))a&&i.push(t);this.setState({owner:s&&s.isOwner(),admin:s&&s.isAdmin(),sharer:s&&s.isSharer(),deleter:s&&s.isDeleter(),muted:s&&s.isMuted(),fullName:da(e.public&&e.public.fn,Kt),description:da(e.public&&e.public.note,Gt),avatar:ga(e.public?e.public.photo:null),trustedBadges:i,private:da(e.private&&e.private.comment,Kt),archived:e.isArchived(),address:e.name,groupTopic:e.isGroupType(),channel:e.isChannelType()||e.chan,access:s?s.getMode():void 0,modeGiven:s?s.getGiven():void 0,modeWant:s?s.getWant():void 0,auth:a.auth,anon:a.anon})}resetTags(e){if("grp"!=e.getType())return;const t=e.getAccessMode();t&&t.isOwner()&&e.getMeta(e.startMetaQuery().withTags().build())}onMetaDesc(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetDesc(t,this.props),this.previousMetaDesc&&this.previousMetaDesc!=this.onMetaDesc&&this.previousMetaDesc(e))}onSubsUpdated(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetSubs(t,this.props),this.previousSubsUpdated&&this.previousSubsUpdated!=this.onSubsUpdated&&this.previousSubsUpdated(e))}handleImageChanged(e){this.setState({avatar:e}),this.props.onTopicDescUpdate(this.props.topic,ia(null,e||Ut.Tinode.DEL_CHAR),null)}handleMuted(e,t){this.setState({muted:t}),this.props.onChangePermissions(this.props.topic,t?"-P":"+P")}handleUnarchive(e,t){this.props.onTopicUnArchive(this.props.topic)}handlePermissionsChanged(e,t){switch(e){case"auth":this.props.onTopicDescUpdateRequest(this.props.topic,null,null,{auth:t});break;case"anon":this.props.onTopicDescUpdateRequest(this.props.topic,null,null,{anon:t});break;case"mode":case"want":this.props.onChangePermissions(this.props.topic,t);break;case"given":this.props.onChangePermissions(this.props.topic,t,this.props.topic);break;case"user":this.props.onChangePermissions(this.props.topic,t,this.state.userPermissionsEdited)}this.handleBackNavigate()}handleLaunchPermissionsEditor(e,t){const{formatMessage:a}=this.props.intl;let s,i,n,o,r,l,c;switch(e){case"mode":s=this.state.access;break;case"want":s=this.state.modeWant,i=this.state.modeGiven,this.state.owner?n="O":(n=Ut.Tinode.AccessMode.encode(Ut.Tinode.AccessMode.diff("ASDO",this.state.modeGiven)),this.state.channel&&(n+="W")),o=a(ws.perm_want),r=a(ws.perm_given);break;case"given":s=this.state.modeGiven2,i=this.state.modeWant2,n=this.state.groupTopic?this.state.owner?"":"O":"ASDO",o=a(ws.perm_given),r=a(ws.perm_want);break;case"auth":s=this.state.auth,n="O";break;case"anon":s=this.state.anon,n="O";break;case"user":{const e=this.props.tinode.getTopic(this.props.topic);if(!e)return;const d=e.subscriber(t);if(!d||!d.acs)return;s=d.acs.getGiven(),i=d.acs.getWant(),n=this.state.owner?"":"O",o=a(ws.perm_given),r=a(ws.perm_want),d.public&&(l=d.public.fn,c=d.public.photo);break}default:return void console.error("Unknown permission editing mode '"+e+"'")}this.setState({userPermissionsEdited:t,userPermissionsTitle:l,userPermissionsAvatar:c,editedPermissions:s,immutablePermissions:i,editedPermissionsTitle:o,immutablePermissionsTitle:r,editedPermissionsSkipped:n}),this.props.onNavigate("perm/".concat(e))}handleShowAddMembers(e){e.preventDefault(),this.props.onInitFind(),this.props.onNavigate("members")}handleMemberUpdateRequest(e,t,a){this.props.onMemberUpdateRequest(this.props.topic,t,a),this.props.onNavigate("info")}handleMemberSelected(e){this.setState({selectedContact:e})}handleBackNavigate(){const e=(this.props.panel||"info").split("/");"info"==e[0]?this.props.onNavigate(null):"perm"==e[0]?"user"==e[1]?this.props.onNavigate("info"):this.props.onNavigate("security"):this.props.onNavigate("info")}handleContextMenu(e){const{formatMessage:t}=this.props.intl,a=this.props.tinode.getTopic(this.props.topic);if(!a)return;const s=a.subscriber(e.topicName);if(!s||!s.acs)return;const i=this.props.tinode.isMe(e.topicName),n=[{title:t(ws.edit_permissions),handler:()=>{this.handleLaunchPermissionsEditor(i?"want":"user",e.topicName)}}];i||n.push("member_delete"),n.push(s.acs.isMuted()?"member_unmute":"member_mute"),i||n.push(s.acs.isJoiner()?"member_block":"member_unblock"),this.props.showContextMenu({topicName:this.props.topic,x:e.x,y:e.y,user:e.topicName},n)}render(){const e=(this.props.panel||"info").split("/"),a=e[0];e.shift();const{formatMessage:s}=this.props.intl,i=s(("perm"==a?ws["perm_"+e[0]]:ws[a])||ws.info);return t().createElement("div",{id:"info-view"},t().createElement("div",{className:"caption-panel",id:"info-caption-panel"},t().createElement("div",{className:"panel-title",id:"info-title"},i),t().createElement("div",null,t().createElement(ts,{onCancel:this.handleBackNavigate}))),this.props.displayMobile?t().createElement(as,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,"members"==a?t().createElement(rs,{tinode:this.props.tinode,members:this.state.contactList,requiredMember:this.props.myUserId,keepInitialMembers:!this.state.admin&&!this.state.owner,myUserId:this.props.myUserId,contacts:this.props.searchableContacts,onCancel:this.handleBackNavigate,onSubmit:this.handleMemberUpdateRequest}):"perm"==a&&e.length>0?t().createElement(ds,{tinode:this.props.tinode,mode:this.state.editedPermissions,compare:this.state.immutablePermissions,skip:this.state.editedPermissionsSkipped,modeTitle:this.state.editedPermissionsTitle,compareTitle:this.state.immutablePermissionsTitle,userTitle:this.state.userPermissionsTitle,item:this.state.userPermissionsEdited,userAvatar:this.state.userPermissionsAvatar,onSubmit:t=>this.handlePermissionsChanged(e[0],t),onCancel:this.handleBackNavigate}):"general"==a?t().createElement(fs,{tinode:this.props.tinode,topic:this.props.topic,onCredAdd:this.props.onCredAdd,onTopicTagsUpdateRequest:this.props.onTopicTagsUpdateRequest,onCredConfirm:this.props.onCredConfirm,onCredDelete:this.props.onCredDelete,onUpdateTopicDesc:this.props.onTopicDescUpdateRequest,onError:this.props.onError}):"security"==a?t().createElement(ys,{topic:this.props.topic,owner:this.state.owner,admin:this.state.admin,sharer:this.state.sharer,deleter:this.state.deleter,muted:this.state.muted,groupTopic:this.state.groupTopic,channel:this.state.channel,access:this.state.access,modeGiven:this.state.modeGiven,modeWant:this.state.modeWant,modeGiven2:this.state.modeGiven2,modeWant2:this.state.modeWant2,auth:this.state.auth,anon:this.state.anon,onShowAlert:this.props.onShowAlert,onDeleteMessages:this.props.onDeleteMessages,onLeaveTopic:this.props.onLeaveTopic,onBlockTopic:this.props.onBlockTopic,onReportTopic:this.props.onReportTopic,onLaunchPermissionsEditor:this.handleLaunchPermissionsEditor,onNavigate:this.props.onNavigate}):t().createElement("div",{id:"info-view-content",className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"flat-button float-right",onClick:e=>{e.preventDefault(),this.props.onNavigate("general")}},t().createElement("i",{className:"material-icons"},"edit")," ",t().createElement(n.FormattedMessage,{id:"button_edit",defaultMessage:[{type:0,value:"Edit"}]})),t().createElement("center",null,t().createElement(Za,{tinode:this.props.tinode,avatar:this.state.avatar,readOnly:!0,uid:this.props.topic,title:this.state.fullName})),t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_topic_name",defaultMessage:[{type:0,value:"Name"}]}))),t().createElement("div",{className:"large ellipsized"},this.state.fullName,this.state.channel?t().createElement("img",{src:"/img/channel.png",className:"channel",alt:"channel"}):null)),this.state.private?t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_private",defaultMessage:[{type:0,value:"Private comment"}]}))),t().createElement("div",{className:"large ellipsized"},this.state.private)):null,t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_user_id",defaultMessage:[{type:0,value:"ID:"}]}))," ",t().createElement("tt",null,this.state.address)),t().createElement("div",{className:"group"},t().createElement(Qa,{trustedBadges:this.state.trustedBadges})),this.state.description?t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]})),t().createElement("div",null,this.state.description)):null),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("label",null,t().createElement(n.FormattedMessage,{id:"label_muting_topic",defaultMessage:[{type:0,value:"Muted:"}]})),t().createElement(es,{name:"P",checked:this.state.muted,onChange:this.handleMuted})),this.state.archived?t().createElement("div",{className:"panel-form-row"},t().createElement("label",null,t().createElement(n.FormattedMessage,{id:"label_unarchive_topic",defaultMessage:[{type:0,value:"Archived:"}]})),t().createElement(es,{name:"archived",checked:!0,onChange:this.handleUnarchive})):null,t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("security")}},t().createElement("i",{className:"material-icons"},"security")," ",t().createElement(n.FormattedMessage,{id:"button_security",defaultMessage:[{type:0,value:"Security"}]}))),this.state.groupTopic&&this.state.sharer?t().createElement(t().Fragment,null,t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_group_members",defaultMessage:[{type:0,value:"Group members:"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement("a",{href:"#",className:"flat-button",onClick:this.handleShowAddMembers},t().createElement("i",{className:"material-icons"},"person_add"),"  ",t().createElement(n.FormattedMessage,{id:"button_add_members",defaultMessage:[{type:0,value:"Add members"}]}))),t().createElement(n.FormattedMessage,{id:"group_has_no_members",defaultMessage:[{type:0,value:"No members"}]},(e=>t().createElement(Ha,{tinode:this.props.tinode,contacts:this.state.contactList,myUserId:this.props.myUserId,emptyListMessage:e,topicSelected:this.state.selectedContact,showOnline:!1,showUnread:!1,showMode:!0,noScroll:!0,onTopicSelected:this.handleMemberSelected,showContextMenu:!!this.state.admin&&this.handleContextMenu})))):null))}}const Es=(0,n.injectIntl)(Cs),Ss=new Audio("audio/call-out.m4a");Ss.loop=!0;const Ms=new Audio("audio/call-end.m4a");Ms.loop=!0;const ks=(0,n.defineMessages)({already_in_call:{id:"already_in_call",defaultMessage:[{type:0,value:"You already in an ongoing call!"}]}});class Ts extends t().PureComponent{constructor(e){super(e),this.state={localStream:void 0,pc:void 0,previousOnInfo:void 0,waitingForPeer:!1},this.localStreamConstraints={audio:!0,video:!0},this.localRef=t().createRef(),this.remoteRef=t().createRef(),this.onInfo=this.onInfo.bind(this),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this.createPeerConnection=this.createPeerConnection.bind(this),this.handleNegotiationNeededEvent=this.handleNegotiationNeededEvent.bind(this),this.handleICECandidateEvent=this.handleICECandidateEvent.bind(this),this.handleNewICECandidateMsg=this.handleNewICECandidateMsg.bind(this),this.handleICEConnectionStateChangeEvent=this.handleICEConnectionStateChangeEvent.bind(this),this.handleSignalingStateChangeEvent=this.handleSignalingStateChangeEvent.bind(this),this.handleICEGatheringStateChangeEvent=this.handleICEGatheringStateChangeEvent.bind(this),this.handleTrackEvent=this.handleTrackEvent.bind(this),this.handleVideoOfferMsg=this.handleVideoOfferMsg.bind(this),this.handleVideoAnswerMsg=this.handleVideoAnswerMsg.bind(this),this.handleNewICECandidateMsg=this.handleNewICECandidateMsg.bind(this),this.reportError=this.reportError.bind(this),this.handleGetUserMediaError=this.handleGetUserMediaError.bind(this),this.stopTracks=this.stopTracks.bind(this),this.handleCloseClick=this.handleCloseClick.bind(this),this.handleToggleCameraClick=this.handleToggleCameraClick.bind(this),this.handleToggleMicClick=this.handleToggleMicClick.bind(this),this.toggleMedia=this.toggleMedia.bind(this),this.handleRemoteHangup=this.handleRemoteHangup.bind(this),this.handleVideoCallAccepted=this.handleVideoCallAccepted.bind(this)}componentDidMount(){const e=this.props.tinode.getTopic(this.props.topic);this.previousOnInfo=e.onInfo,e.onInfo=this.onInfo,1!=this.props.callState&&3!=this.props.callState||!this.localRef.current||this.start()}componentWillUnmount(){this.props.tinode.getTopic(this.props.topic).onInfo=this.previousOnInfo,this.stop()}handleVideoCallAccepted(e){Ss.pause();const t=this.createPeerConnection(),a=this.state.localStream;a.getTracks().forEach((e=>{t.addTrack(e,a)}))}onInfo(e){if("call"==e.what)switch(e.event){case"accept":this.handleVideoCallAccepted(e);break;case"offer":this.handleVideoOfferMsg(e);break;case"answer":this.handleVideoAnswerMsg(e);break;case"ice-candidate":this.handleNewICECandidateMsg(e);break;case"hang-up":this.handleRemoteHangup(e)}}start(){this.state.localStream?this.props.onError(this.props.intl.formatMessage(ks.already_in_call)):3!=this.props.callState?navigator.mediaDevices.getUserMedia(this.localStreamConstraints).then((e=>{this.setState({localStream:e,waitingForPeer:!0}),this.localRef.current.srcObject=e,Ss.play(),this.props.onInvite(this.props.topic,this.props.seq,this.props.callState)})).catch(this.handleGetUserMediaError):this.props.onInvite(this.props.topic,this.props.seq,this.props.callState)}stop(){Ms.pause(),Ms.currentTime=0,Ss.pause(),Ss.currentTime=0,this.stopTracks(this.localRef.current),this.stopTracks(this.remoteRef.current),this.state.pc&&(this.state.pc.ontrack=null,this.state.pc.onremovetrack=null,this.state.pc.onremovestream=null,this.state.pc.onicecandidate=null,this.state.pc.oniceconnectionstatechange=null,this.state.pc.onsignalingstatechange=null,this.state.pc.onicegatheringstatechange=null,this.state.pc.onnegotiationneeded=null,this.state.pc.close()),this.setState({pc:null,waitingForPeer:!1})}stopTracks(e){if(!e)return;let t=e.srcObject;if(!t)return;let a=t.getTracks();a&&a.forEach((e=>{e.stop(),e.enabled=!1})),e.srcObject=null,e.src=""}createPeerConnection(){const e=this.props.tinode.getServerParam("iceServers",null),t=e?new RTCPeerConnection({iceServers:e}):new RTCPeerConnection;return t.onicecandidate=this.handleICECandidateEvent,t.oniceconnectionstatechange=this.handleICEConnectionStateChangeEvent,t.onicegatheringstatechange=this.handleICEGatheringStateChangeEvent,t.onsignalingstatechange=this.handleSignalingStateChangeEvent,t.onnegotiationneeded=this.handleNegotiationNeededEvent,t.ontrack=this.handleTrackEvent,this.setState({pc:t,waitingForPeer:!1}),t}handleVideoAnswerMsg(e){const t=new RTCSessionDescription(e.payload);this.state.pc.setRemoteDescription(t).catch(this.reportError)}reportError(e){this.props.onError(e.message,"err")}handleNegotiationNeededEvent(){this.state.pc.createOffer().then((e=>this.state.pc.setLocalDescription(e))).then((e=>{this.props.onSendOffer(this.props.topic,this.props.seq,this.state.pc.localDescription.toJSON())})).catch(this.reportError)}handleICECandidateEvent(e){e.candidate&&this.props.onIceCandidate(this.props.topic,this.props.seq,e.candidate.toJSON())}handleNewICECandidateMsg(e){const t=new RTCIceCandidate(e.payload);this.state.pc.addIceCandidate(t).catch(this.reportError)}handleICEConnectionStateChangeEvent(e){switch(this.state.pc.iceConnectionState){case"closed":case"failed":this.handleCloseClick()}}handleSignalingStateChangeEvent(e){"closed"==this.state.pc.signalingState&&this.handleCloseClick()}handleICEGatheringStateChangeEvent(e){console.log("ICE gathering change state: ",e)}handleTrackEvent(e){this.remoteRef.current.srcObject=e.streams[0],this.forceUpdate()}handleGetUserMediaError(e){switch(e.name){case"NotFoundError":this.reportError(e.message);break;case"SecurityError":case"PermissionDeniedError":break;default:this.reportError(e.message),console.error("Error opening your camera and/or microphone: "+e.message)}this.handleCloseClick()}handleVideoOfferMsg(e){let t=null;const a=this.createPeerConnection(),s=new RTCSessionDescription(e.payload);a.setRemoteDescription(s).then((e=>navigator.mediaDevices.getUserMedia(this.localStreamConstraints))).then((e=>{t=e,this.localRef.current.srcObject=e,this.setState({localStream:e}),t.getTracks().forEach((e=>{a.addTrack(e,t)}))})).then((e=>a.createAnswer())).then((e=>a.setLocalDescription(e))).then((e=>{this.props.onSendAnswer(this.props.topic,this.props.seq,a.localDescription.toJSON())})).catch(this.handleGetUserMediaError)}handleRemoteHangup(){this.state.waitingForPeer?(this.setState({waitingForPeer:!1}),Ss.pause(),Ss.currentTime=0,Ms.loop=!0,Ms.play(),setTimeout((e=>{this.handleCloseClick()}),2e3)):this.handleCloseClick()}handleCloseClick(){this.stop(),this.props.onHangup(this.props.topic,this.props.seq)}toggleMedia(e){this.state.localStream.getTracks().forEach((t=>{t.kind==e&&(t.enabled=!t.enabled)})),this.forceUpdate()}handleToggleCameraClick(){this.toggleMedia("video")}handleToggleMicClick(){this.toggleMedia("audio")}render(){const e=this.remoteRef.current&&this.remoteRef.current.srcObject,a=!(this.state.localStream&&this.state.localStream.getTracks()),s=this.state.localStream&&this.state.localStream.getAudioTracks()[0].enabled?"mic":"mic_off",i=this.state.localStream&&this.state.localStream.getVideoTracks()[0].enabled?"videocam":"videocam_off",o=da(this.props.title,20),r=this.state.waitingForPeer?" pulse":"";return t().createElement(t().Fragment,null,t().createElement("div",{id:"video-container"},t().createElement("div",{id:"video-container-panel"},t().createElement("div",{className:"call-party self"},t().createElement("video",{ref:this.localRef,autoPlay:!0,muted:!0,playsInline:!0}),t().createElement("div",{className:"caller-name inactive"},t().createElement(n.FormattedMessage,{id:"calls_you_label",defaultMessage:[{type:0,value:"You"}]}))),t().createElement("div",{className:"call-party peer"},t().createElement("video",{ref:this.remoteRef,autoPlay:!0,playsInline:!0}),e?t().createElement("div",{className:"caller-name inactive"},o):t().createElement("div",{className:"caller-card".concat(r)},t().createElement("div",{className:"avatar-box"},t().createElement(ha,{tinode:this.props.tinode,avatar:this.props.avatar,topic:this.props.topic,title:this.props.title})),t().createElement("div",{className:"caller-name"},o)))),t().createElement("div",{className:"controls"},t().createElement("button",{className:"danger",onClick:this.handleCloseClick},t().createElement("i",{className:"material-icons"},"call_end")),t().createElement("button",{className:"secondary",onClick:this.handleToggleCameraClick,disabled:a},t().createElement("i",{className:"material-icons"},i)),t().createElement("button",{className:"secondary",onClick:this.handleToggleMicClick,disabled:a},t().createElement("i",{className:"material-icons"},s)))))}}const Ns=(0,n.injectIntl)(Ts);class As extends t().Component{constructor(e){super(e),this.state={downloader:null,progress:0},this.downloadFile=this.downloadFile.bind(this),this.handleCancel=this.handleCancel.bind(this)}downloadFile(e,t,a){if(!e)return void this.props.onError("Invalid download URL '"+e+"'");const s=this.props.tinode.getLargeFileHelper();this.setState({downloader:s}),s.download(e,t,a,(e=>{this.setState({progress:e/this.props.size})}),(e=>{this.props.onError(e,"err")})).then((()=>{this.setState({downloader:null,progress:0})})).catch((e=>{e&&this.props.onError("Error downloading file: "+e.message,"err"),this.setState({downloader:null,progress:0})}))}handleCancel(){this.props.uploading?this.props.onCancelUpload():this.state.downloader&&this.state.downloader.cancel()}render(){let e=this.props.filename||"file_attachment";e.length>36&&(e=e.substr(0,16)+"..."+e.substr(-16));let a,s,i=this.props.size>0?t().createElement("span",{className:"small gray"},"(",ea(this.props.size),")"):null;this.props.uploading||this.state.downloader||!function(e){return e&&!/^\s*([a-z][a-z0-9+.-]*:|\/\/)/im.test(e)}(this.props.downloadUrl)?(a=oa(this.props.downloadUrl),s=null):(a="#",s=e=>{e.preventDefault(),this.downloadFile(this.props.downloadUrl,this.props.filename,this.props.mimetype)});const o=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons"},"file_download")," ",t().createElement(n.FormattedMessage,{id:"save_attachment",defaultMessage:[{type:0,value:"save"}]}));return t().createElement("div",{className:"attachment"},t().createElement("div",null,t().createElement("i",{className:"material-icons big gray"},"insert_drive_file")),t().createElement("div",{className:"flex-column"},t().createElement("div",null,e," ",i),this.props.uploading||this.state.downloader?t().createElement(Ta,{progress:this.props.uploading?this.props.progress:this.state.progress,onCancel:this.handleCancel}):t().createElement("div",null,a?t().createElement("a",{href:a,download:this.props.filename,onClick:s},o):t().createElement("span",{className:"light-gray"},o))))}}const Ds=(0,n.defineMessages)({message_sending:{id:"message_sending",defaultMessage:[{type:0,value:"sending..."}]},message_sending_failed:{id:"message_sending_failed",defaultMessage:[{type:0,value:"failed"}]}});class Ps extends t().PureComponent{render(){const{formatMessage:e}=this.props.intl;let a;a=this.props.received<=Ut.Tinode.MESSAGE_STATUS_SENDING?e(Ds.message_sending):this.props.received==Ut.Tinode.MESSAGE_STATUS_FAILED?e(Ds.message_sending_failed):this.props.timestamp.toLocaleTimeString(this.props.intl.locale,{timeStyle:"short"});const s=la(this.props.received),i=s?t().createElement("i",{className:"material-icons small "+s.color},s.name):null;return t().createElement("span",{className:"timestamp"},a," ",i)}}const Is=(0,n.injectIntl)(Ps);function Us(){return Us=Object.assign||function(e){for(var t=1;tUt.Tinode.MESSAGE_STATUS_FAILED&&this.props.received{"application/json"!=e.mime&&r.push(t().createElement(As,{tinode:this.props.tinode,downloadUrl:Ut.Drafty.getDownloadUrl(e),filename:e.name,uploading:Ut.Drafty.isProcessing(e),mimetype:e.mime,size:Ut.Drafty.getEntitySize(e),progress:this.state.progress,onCancelUpload:this.handleCancelUpload,onError:this.props.onError,key:a}))}),this);const e=Ut.Drafty.format(o,Pa,this.formatterContext);o=t().createElement(t().Fragment,null,e)}else this.props.deleted?o=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons gray"},"block")," ",t().createElement("i",{className:"gray"},t().createElement(n.FormattedMessage,{id:"deleted_content",defaultMessage:[{type:0,value:"content deleted"}]}))):"string"!=typeof o&&(o=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons gray"},"warning_amber")," ",t().createElement("i",{className:"gray"},t().createElement(n.FormattedMessage,{id:"invalid_content",defaultMessage:[{type:0,value:"invalid content"}]}))));return t().createElement("li",{ref:this.props.innerRef,className:e},this.props.isGroup&&this.props.response?t().createElement("div",{className:"avatar-box"},i?t().createElement(ha,{tinode:this.props.tinode,topic:this.props.userFrom,title:this.props.userName,avatar:s}):null):null,t().createElement("div",null,t().createElement("div",{className:a},t().createElement("div",{className:"content-meta"},t().createElement("div",{className:"message-content"},o,r),this.props.timestamp?t().createElement(Is,{timestamp:this.props.timestamp,received:this.props.received}):null),this.props.showContextMenu?t().createElement("span",{className:"menuTrigger"},t().createElement("a",{href:"#",onClick:this.handleContextClick},t().createElement("i",{className:"material-icons"},"expand_more"))):null),i?t().createElement("div",{className:"author"},this.props.userName||t().createElement("i",null,t().createElement(n.FormattedMessage,{id:"user_not_found",defaultMessage:[{type:0,value:"Not found"}]}))):null))}}const Fs=(0,n.injectIntl)(Rs),xs=t().forwardRef(((e,a)=>t().createElement(Fs,Us({innerRef:a},e))));var Bs=a(27),Ls=a.n(Bs);const Os=100,qs="audio/webm";class js extends t().PureComponent{constructor(e){super(e),this.state={enabled:!0,audioRecord:null,recording:!0,paused:!1,duration:"0:00",blobUrl:null,preview:null},this.visualize=this.visualize.bind(this),this.initMediaRecording=this.initMediaRecording.bind(this),this.initCanvas=this.initCanvas.bind(this),this.getRecording=this.getRecording.bind(this),this.cleanUp=this.cleanUp.bind(this),this.handleResume=this.handleResume.bind(this),this.handlePause=this.handlePause.bind(this),this.handleDelete=this.handleDelete.bind(this),this.handleDone=this.handleDone.bind(this),this.durationMillis=0,this.startedOn=null,this.viewBuffer=[],this.canvasRef=t().createRef()}componentDidMount(){this.stream=null,this.mediaRecorder=null,this.audioContext=null,this.audioInput=null,this.analyser=null,this.audioChunks=[];try{navigator.mediaDevices.getUserMedia({audio:!0,video:!1}).then(this.initMediaRecording,this.props.onError)}catch(e){this.props.onError(e)}}componentWillUnmount(){this.startedOn=null,this.stream&&this.cleanUp()}visualize(){this.initCanvas();const e=new Uint8Array(this.analyser.frequencyBinCount),t=this.canvasWidth,a=this.canvasHeight,s=t/10|0,i=Os*s;this.canvasContext.lineWidth=6,this.canvasContext.strokeStyle="#BBBD";let n=0,o=0,r=0;const l=()=>{if(!this.startedOn)return;window.requestAnimationFrame(l);const c=this.durationMillis+(Date.now()-this.startedOn);this.setState({duration:Zt(c/1e3)}),c>6e5&&(this.startedOn=null,this.mediaRecorder.pause(),this.durationMillis+=Date.now()-this.startedOn,this.setState({enabled:!1,recording:!1,duration:Zt(this.durationMillis/1e3)})),this.analyser.getByteTimeDomainData(e);let d=0;for(const t of e)d+=(t-127)**2;o+=Math.sqrt(d/e.length),r++;let h=c/Os|0;const p=i>c?0:(c-Os*h)/Os*10;n!=h&&(n=h,this.viewBuffer.push(o/r),o=0,r=0,this.viewBuffer.length>s&&this.viewBuffer.shift()),this.canvasContext.clearRect(0,0,t,a),this.canvasContext.beginPath();for(let e=0;e{this.durationMillis>2e3?this.getRecording(this.mediaRecorder.mimeType,this.durationMillis).then((e=>this.props.onFinished(e.url,e.preview,this.durationMillis))):this.props.onDeleted(),this.cleanUp()},this.mediaRecorder.ondataavailable=e=>{e.data.size>0&&this.audioChunks.push(e.data),"inactive"!=this.mediaRecorder.state&&this.getRecording(this.mediaRecorder.mimeType).then((e=>{this.setState({blobUrl:e.url,preview:e.preview})}))},this.durationMillis=0,this.startedOn=Date.now(),this.mediaRecorder.start(),this.visualize()}getRecording(e,t){let a=new Blob(this.audioChunks,{type:e||qs});return(t>0?Ls()(a,t,{logger:!1}):Promise.resolve(a)).then((e=>(a=e,e.arrayBuffer()))).then((e=>this.audioContext.decodeAudioData(e))).then((e=>this.createPreview(e))).then((e=>({url:window.URL.createObjectURL(a),preview:ya(e)})))}createPreview(e){const t=e.getChannelData(0),a=Math.min(t.length,96),s=t.length/a|0,i=Math.max(1,s/10|0);let n=[],o=-1;for(let e=0;e0&&(n=n.map((e=>100*e/o|0))),n}cleanUp(){this.audioInput.disconnect(),this.stream.getTracks().forEach((e=>e.stop()))}render(){const e="material-icons "+(this.state.enabled?"red":"gray");return t().createElement("div",{className:"audio"},t().createElement("a",{href:"#",onClick:this.handleDelete,title:"Delete"},t().createElement("i",{className:"material-icons gray"},"delete_outline")),this.state.recording?t().createElement("canvas",{ref:this.canvasRef}):t().createElement(Ea,{src:this.state.blobUrl,preview:this.state.preview,duration:this.durationMillis,short:!0}),t().createElement("div",{className:"duration"},this.state.duration),this.state.recording?t().createElement("a",{href:"#",onClick:this.handlePause,title:"Pause"},t().createElement("i",{className:"material-icons"},"pause_circle_outline")):t().createElement("a",{href:"#",onClick:this.handleResume,title:"Resume"},t().createElement("i",{className:e},"radio_button_checked")),t().createElement("a",{href:"#",onClick:this.handleDone,title:"Send"},t().createElement("i",{className:"material-icons"},"send")))}}const zs=(0,n.defineMessages)({messaging_disabled:{id:"messaging_disabled_prompt",defaultMessage:[{type:0,value:"Messaging disabled"}]},type_new_message:{id:"new_message_prompt",defaultMessage:[{type:0,value:"New message"}]},add_image_caption:{id:"image_caption_prompt",defaultMessage:[{type:0,value:"Image caption"}]},file_attachment_too_large:{id:"file_attachment_too_large",defaultMessage:[{type:0,value:"The file size "},{type:1,value:"size"},{type:0,value:" exceeds the "},{type:1,value:"limit"},{type:0,value:" limit."}]},cannot_initiate_upload:{id:"cannot_initiate_file_upload",defaultMessage:[{type:0,value:"Cannot initiate file upload."}]}});class Hs extends t().PureComponent{constructor(e){super(e),this.state={quote:null,message:"",audioRec:!1,audioAvailable:!!navigator.mediaDevices.getUserMedia,keypressTimestamp:(new Date).getTime()-Ot-1},this.handlePasteEvent=this.handlePasteEvent.bind(this),this.handleAttachImage=this.handleAttachImage.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleAttachAudio=this.handleAttachAudio.bind(this),this.handleSend=this.handleSend.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleMessageTyping=this.handleMessageTyping.bind(this),this.handleQuoteClick=this.handleQuoteClick.bind(this),this.formatReply=this.formatReply.bind(this)}componentDidMount(){this.messageEditArea&&this.messageEditArea.addEventListener("paste",this.handlePasteEvent,!1),this.setState({quote:this.formatReply()})}componentWillUnmount(){this.messageEditArea&&this.messageEditArea.removeEventListener("paste",this.handlePasteEvent,!1)}componentDidUpdate(e){this.messageEditArea&&this.messageEditArea.focus(),e.topicName!=this.props.topicName&&this.setState({message:"",audioRec:!1,quote:null}),e.reply!=this.props.reply&&this.setState({quote:this.formatReply()})}formatReply(){return this.props.reply?Ut.Drafty.format(this.props.reply.content,xa,{formatMessage:this.props.intl.formatMessage.bind(this.props.intl),authorizeURL:this.props.tinode.authorizeURL.bind(this.props.tinode)}):null}handlePasteEvent(e){this.props.disabled||function(e,t,a,s){const i=(e.clipboardData||e.originalEvent.clipboardData||{}).items;if(!i||!i.length)return!1;for(let e in i){const n=i[e];if("file"===n.kind){const e=n.getAsFile();if(!e){console.error("Failed to get file object from pasted file item",n.kind,n.type),s("Failed to get file object from pasted file item");continue}return e.type&&"image"==e.type.split("/")[0]?t(e):a(e),!0}}return!1}(e,(e=>{this.props.onAttachImage(e)}),(e=>{this.props.onAttachFile(e)}),this.props.onError)&&e.preventDefault()}handleAttachImage(e){e.target.files&&e.target.files.length>0&&this.props.onAttachImage(e.target.files[0]),e.target.value=""}handleAttachFile(e){e.target.files&&e.target.files.length>0&&this.props.onAttachFile(e.target.files[0]),e.target.value=""}handleAttachAudio(e,t,a){this.setState({audioRec:!1}),this.props.onAttachAudio(e,t,a)}handleSend(e){e.preventDefault();const t=this.state.message.trim();(t||this.props.acceptBlank||this.props.noInput)&&(this.props.onSendMessage(t),this.setState({message:""}))}handleKeyPress(e){if(this.state.audioRec)return e.preventDefault(),void e.stopPropagation();"Enter"===e.key&&(e.shiftKey||(e.preventDefault(),e.stopPropagation(),this.handleSend(e)))}handleMessageTyping(e){const t={message:e.target.value};if(this.props.onKeyPress){const e=(new Date).getTime();e-this.state.keypressTimestamp>Ot&&(this.props.onKeyPress(),t.keypressTimestamp=e)}this.setState(t)}handleQuoteClick(e){if(e.preventDefault(),e.stopPropagation(),this.props.reply&&this.props.onQuoteClick){const e=this.props.reply.seq;this.props.onQuoteClick(e)}}render(){const{formatMessage:e}=this.props.intl,a=this.props.disabled?e(zs.messaging_disabled):this.props.messagePrompt?e(zs[this.props.messagePrompt]):e(zs.type_new_message),s=this.state.quote?t().createElement("div",{id:"reply-quote-preview"},t().createElement("div",{className:"cancel"},t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancelReply()}},t().createElement("i",{className:"material-icons gray"},"close"))),this.state.quote):null,i=this.state.audioAvailable&&this.props.onAttachAudio;return t().createElement("div",{id:"send-message-wrapper"},this.props.noInput?null:s,t().createElement("div",{id:"send-message-panel"},this.props.disabled?t().createElement("div",{id:"writing-disabled"},a):t().createElement(t().Fragment,null,this.props.onAttachFile&&!this.state.audioRec?t().createElement(t().Fragment,null,t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachImage.click()},title:"Add image"},t().createElement("i",{className:"material-icons secondary"},"photo")),t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachFile.click()},title:"Attach file"},t().createElement("i",{className:"material-icons secondary"},"attach_file"))):null,this.props.noInput?s||t().createElement("div",{className:"hr thin"}):this.state.audioRec?t().createElement(js,{onDeleted:e=>this.setState({audioRec:!1}),onFinished:this.handleAttachAudio}):t().createElement("textarea",{id:"sendMessage",placeholder:a,value:this.state.message,onChange:this.handleMessageTyping,onKeyPress:this.handleKeyPress,ref:e=>{this.messageEditArea=e},autoFocus:!0}),this.state.message||!i?t().createElement("a",{href:"#",onClick:this.handleSend,title:"Send"},t().createElement("i",{className:"material-icons"},"send")):this.state.audioRec?null:t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.setState({audioRec:!0})},title:"Voice"},t().createElement("i",{className:"material-icons"},"mic")),t().createElement("input",{type:"file",ref:e=>{this.attachFile=e},onChange:this.handleAttachFile,style:{display:"none"}}),t().createElement("input",{type:"file",ref:e=>{this.attachImage=e},accept:"image/*",onChange:this.handleAttachImage,style:{display:"none"}}))))}}const Vs=(0,n.injectIntl)(Hs);class Ws extends t().PureComponent{constructor(e){super(e),this.handleSendDoc=this.handleSendDoc.bind(this)}handleSendDoc(e){this.props.onClose(),this.props.onSendMessage(this.props.content.file)}render(){return this.props.content?t().createElement("div",{id:"image-preview"},t().createElement("div",{id:"image-preview-caption-panel"},t().createElement("span",null,this.props.content.name),t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()}},t().createElement("i",{className:"material-icons gray"},"close"))),t().createElement("div",{id:"image-preview-container"},t().createElement("div",{className:"flex-column narrow"},t().createElement("i",{className:"material-icons gray"},function(e){const t={default:"insert_drive_file",image:"image",text:"description",video:"theaters"};return t[e]||t[(e||"").split("/")[0]]||t.default}(this.props.content.type)),t().createElement("div",null,t().createElement("b",null,t().createElement(n.FormattedMessage,{id:"label_file_name",defaultMessage:[{type:0,value:"File name:"}]}))," ",ta(this.props.content.name,24)||"-"),t().createElement("div",null,t().createElement("b",null,t().createElement(n.FormattedMessage,{id:"label_content_type",defaultMessage:[{type:0,value:"Content type:"}]}))," ",this.props.content.type||"application/octet-stream"),t().createElement("div",null,t().createElement("b",null,t().createElement(n.FormattedMessage,{id:"label_size",defaultMessage:[{type:0,value:"Size:"}]}))," ",ea(this.props.content.size)))),t().createElement(Vs,{noInput:!0,tinode:this.props.tinode,reply:this.props.reply,onCancelReply:this.props.onCancelReply,onSendMessage:this.handleSendDoc,onError:this.props.onError})):null}}class Ks extends t().Component{constructor(e){super(e)}render(){const e=[],a=(this.props.subscribers||[]).length,s=Math.min(4,a);return(this.props.subscribers||[]).some((a=>(e.push(t().createElement("div",{className:"avatar-box",key:a.user},t().createElement(ha,{tinode:this.props.tinode,topic:a.user,avatar:ga(a.public?a.public.photo:null)||!0,title:a.public?a.public.fn:null}))),e.length==s))),t().createElement("div",{id:"topic-users"},e," ",a>s?t().createElement("span",null,t().createElement(n.FormattedMessage,{id:"more_online_members",defaultMessage:[{type:0,value:"+"},{type:1,value:"overflow"},{type:0,value:" more"}],values:{overflow:a-s}})):null)}}class Gs extends t().PureComponent{constructor(e){super(e),this.state={width:0,height:0},this.handleSendImage=this.handleSendImage.bind(this)}assignWidth(e){if(e&&!this.state.width){const t=e.getBoundingClientRect();this.setState({width:0|t.width,height:0|t.height})}}handleSendImage(e){this.props.onClose(),this.props.onSendMessage(e,this.props.content.blob)}render(){if(!this.props.content)return null;const e=_a(this.props.content.width,this.props.content.height,this.state.width,this.state.height,!1),a=e?{width:e.dstWidth+"px",height:e.dstHeight+"px"}:this.props.content.width>this.props.content.height?{width:"100%"}:{height:"100%"};a.maxWidth="100%",a.maxHeight="100%";const s=Math.max((this.state.width/jt/1.5|0)-2,12),i=ta(this.props.content.name,s)||"-",o=this.props.content.width||"-",r=this.props.content.height||"-";return t().createElement("div",{id:"image-preview"},t().createElement("div",{id:"image-preview-caption-panel"},this.props.onSendMessage?t().createElement("span",null,i):t().createElement("a",{href:this.props.content.url,download:!0},t().createElement("i",{className:"material-icons"},"file_download")," ",t().createElement(n.FormattedMessage,{id:"download_action",defaultMessage:[{type:0,value:"download"}]})),t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()}},t().createElement("i",{className:"material-icons gray"},"close"))),t().createElement("div",{id:"image-preview-container",ref:e=>this.assignWidth(e)},t().createElement("img",{src:this.props.content.url,style:a,className:"image-preview",alt:this.props.content.name})),this.props.onSendMessage?t().createElement(Vs,{messagePrompt:"add_image_caption",acceptBlank:!0,tinode:this.props.tinode,reply:this.props.reply,onCancelReply:this.props.onCancelReply,onSendMessage:this.handleSendImage,onError:this.props.onError}):t().createElement("div",{id:"image-preview-footer"},t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(n.FormattedMessage,{id:"label_file_name",defaultMessage:[{type:0,value:"File name:"}]}))),t().createElement("div",null,t().createElement("span",{title:this.props.content.name},i))),t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(n.FormattedMessage,{id:"label_content_type",defaultMessage:[{type:0,value:"Content type:"}]}))),t().createElement("div",null,this.props.content.type)),t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(n.FormattedMessage,{id:"label_size",defaultMessage:[{type:0,value:"Size:"}]}))),t().createElement("div",null,o," × ",r," px; ",ea(this.props.content.size)))))}}class $s extends t().PureComponent{constructor(e){super(e),this.handleButtonAction=this.handleButtonAction.bind(this)}handleButtonAction(e,t){e.preventDefault(),this.props.onAction(t)}render(){return t().createElement("div",{className:"accept-invite-panel"},t().createElement("div",{className:"title"},t().createElement(n.FormattedMessage,{id:"chat_invitation",defaultMessage:[{type:0,value:"You are invited to start a new chat. What would you like to do?"}]})),t().createElement("div",{className:"footer"},t().createElement("button",{className:"primary",onClick:e=>{this.handleButtonAction(e,"accept")}},t().createElement(n.FormattedMessage,{id:"chat_invitation_accept",defaultMessage:[{type:0,value:"Accept"}]})),t().createElement("button",{className:"secondary",onClick:e=>{this.handleButtonAction(e,"delete")}},t().createElement(n.FormattedMessage,{id:"chat_invitation_ignore",defaultMessage:[{type:0,value:"Ignore"}]})),t().createElement("button",{className:"secondary",onClick:e=>{this.handleButtonAction(e,"block")}},t().createElement(n.FormattedMessage,{id:"chat_invitation_block",defaultMessage:[{type:0,value:"Block"}]}))))}}class Qs extends t().PureComponent{render(){const e=xt+" ("+Ut.Tinode.getLibrary()+")";return t().createElement("div",{id:"dummy-view"},t().createElement("div",null,t().createElement("a",{href:"https://github.com/tinode/chat/"},t().createElement("img",{id:"logo",alt:"logo",src:"img/logo.svg"}),t().createElement("h2",null,"Tinode Web")),t().createElement("p",null,t().createElement(n.FormattedMessage,{id:"label_client",defaultMessage:[{type:0,value:"Client:"}]})," ",e),t().createElement("p",null,t().createElement(n.FormattedMessage,{id:"label_server",defaultMessage:[{type:0,value:"Server:"}]})," ",this.props.serverVersion," (",this.props.serverAddress,")")))}}class Ys extends t().PureComponent{constructor(e){super(e)}render(){let e=null,a="bubble";return this.props.deleted?(e=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons gray"},"block")," ",t().createElement("i",{className:"gray"},t().createElement(n.FormattedMessage,{id:"deleted_content",defaultMessage:[{type:0,value:"content deleted"}]}))),a+=" deleted"):this.props.date&&(e=t().createElement(t().Fragment,null,this.props.date),a+=" date"),e?t().createElement("li",{className:"meta"},t().createElement("div",{className:a},t().createElement("div",{className:"message-content"},e))):t().createElement(t().Fragment,null,null)}}class Js{static parseUrlHash(e){const t=e.split("?",2),a={};let s=[];return t[0]&&(s=t[0].replace("#","").split("/")),t[1]&&t[1].split("&").forEach((function(e){const t=e.split("=");t[0]&&(a[decodeURIComponent(t[0])]=decodeURIComponent(t[1]))})),{path:s,params:a}}static navigateTo(e){window.location.hash=e}static composeUrlHash(e,t){let a=e.join("/");const s=[];for(const e in t)t.hasOwnProperty(e)&&s.push(e+"="+t[e]);return s.length>0&&(a+="?"+s.join("&")),a}static addUrlParam(e,t,a){const s=this.parseUrlHash(e);return s.params[t]=a,this.composeUrlHash(s.path,s.params)}static removeUrlParam(e,t){const a=this.parseUrlHash(e);return delete a.params[t],this.composeUrlHash(a.path,a.params)}static setUrlSidePanel(e,t){const a=this.parseUrlHash(e);return a.path[0]=t,this.composeUrlHash(a.path,a.params)}static setUrlInfoPanel(e,t){const a=this.parseUrlHash(e);return t?a.params.info=t:delete a.params.info,this.composeUrlHash(a.path,a.params)}static setUrlTopic(e,t){const a=this.parseUrlHash(e);return a.path[1]=t,delete a.params.info,this.composeUrlHash(a.path,a.params)}}const Xs=(0,n.defineMessages)({online_now:{id:"online_now",defaultMessage:[{type:0,value:"online now"}]},last_seen:{id:"last_seen_timestamp",defaultMessage:[{type:0,value:"Last seen"}]},not_found:{id:"title_not_found",defaultMessage:[{type:0,value:"Not found"}]},channel:{id:"channel",defaultMessage:[{type:0,value:"channel"}]},file_attachment_too_large:{id:"file_attachment_too_large",defaultMessage:[{type:0,value:"The file size "},{type:1,value:"size"},{type:0,value:" exceeds the "},{type:1,value:"limit"},{type:0,value:" limit."}]},invalid_content:{id:"invalid_content",defaultMessage:[{type:0,value:"invalid content"}]}});function Zs(e){if(e){const t=e.getExcessive()||"";return e.isJoiner("given")&&(t.includes("R")||t.includes("W"))}return!1}function ei(e){if(e){const t=e.getMissing()||"";return e.isJoiner("want")&&(t.includes("R")||t.includes("W"))}return!1}function ti(e){return 1==e||3==e}class ai extends t().Component{constructor(e){super(e),this.state=ai.getDerivedStateFromProps(e,{}),this.leave=this.leave.bind(this),this.sendMessage=this.sendMessage.bind(this),this.retrySend=this.retrySend.bind(this),this.sendImageAttachment=this.sendImageAttachment.bind(this),this.sendFileAttachment=this.sendFileAttachment.bind(this),this.sendAudioAttachment=this.sendAudioAttachment.bind(this),this.sendKeyPress=this.sendKeyPress.bind(this),this.subscribe=this.subscribe.bind(this),this.handleScrollReference=this.handleScrollReference.bind(this),this.handleScrollEvent=this.handleScrollEvent.bind(this),this.handleDescChange=this.handleDescChange.bind(this),this.handleSubsUpdated=this.handleSubsUpdated.bind(this),this.handleMessageUpdate=this.handleMessageUpdate.bind(this),this.handleAllMessagesReceived=this.handleAllMessagesReceived.bind(this),this.handleInfoReceipt=this.handleInfoReceipt.bind(this),this.handleImagePostview=this.handleImagePostview.bind(this),this.handleClosePreview=this.handleClosePreview.bind(this),this.handleFormResponse=this.handleFormResponse.bind(this),this.handleContextClick=this.handleContextClick.bind(this),this.handleShowMessageContextMenu=this.handleShowMessageContextMenu.bind(this),this.handleNewChatAcceptance=this.handleNewChatAcceptance.bind(this),this.handleEnablePeer=this.handleEnablePeer.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleAttachImage=this.handleAttachImage.bind(this),this.handleCancelUpload=this.handleCancelUpload.bind(this),this.postReadNotification=this.postReadNotification.bind(this),this.clearNotificationQueue=this.clearNotificationQueue.bind(this),this.goToLatestMessage=this.goToLatestMessage.bind(this),this.handlePickReply=this.handlePickReply.bind(this),this.handleCancelReply=this.handleCancelReply.bind(this),this.handleQuoteClick=this.handleQuoteClick.bind(this),this.handleCallHangup=this.handleCallHangup.bind(this),this.chatMessageRefs={},this.getOrCreateMessageRef=this.getOrCreateMessageRef.bind(this),this.readNotificationQueue=[],this.readNotificationTimer=null}getOrCreateMessageRef(e){if(this.chatMessageRefs.hasOwnProperty(e))return this.chatMessageRefs[e];const a=t().createRef();return this.chatMessageRefs[e]=a,a}componentDidMount(){this.messagesScroller&&this.messagesScroller.addEventListener("scroll",this.handleScrollEvent)}componentWillUnmount(){this.messagesScroller&&this.messagesScroller.removeEventListener("scroll",this.handleScrollEvent),this.clearNotificationQueue()}componentDidUpdate(e,t){!this.messagesScroller||t.topic==this.state.topic&&t.messageCount==this.state.messageCount||this.state.scrollPosition<100&&(this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition-this.messagesScroller.offsetHeight);const a=this.props.tinode?this.props.tinode.getTopic(this.state.topic):void 0;this.state.topic!=t.topic&&(t.topic&&!Ut.Tinode.isNewGroupTopicName(t.topic)&&(this.leave(t.topic),t.rtcPanel&&this.handleCallHangup(t.topic,e.callSeq)),a&&(a.onData=this.handleMessageUpdate,a.onAllMessagesReceived=this.handleAllMessagesReceived,a.onInfo=this.handleInfoReceipt,a.onMetaDesc=this.handleDescChange,a.onSubsUpdated=this.handleSubsUpdated,a.onPres=this.handleSubsUpdated)),this.props.applicationVisible?this.postReadNotification(0):this.clearNotificationQueue(),!a||this.state.topic==t.topic&&e.ready||(a._new&&a.isP2PType()?a.getMeta(a.startMetaQuery().withDesc().build()):this.subscribe(a))}static getDerivedStateFromProps(e,t){let a={};if(e.topic)if(e.topic!=t.topic){const s=e.tinode.getTopic(e.topic);if(a={topic:e.topic,docPreview:null,imagePreview:null,imagePostview:null,rtcPanel:null,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1,showGoToLastButton:!1,deleted:s._deleted},e.forwardMessage&&(a.reply={content:e.forwardMessage.preview,seq:null}),s){const i=[];e.connected&&s.subscribers((t=>{t.online&&t.user!=e.myUserId&&i.push(t)})),Object.assign(a,{onlineSubs:i}),s.public?Object.assign(a,{title:s.public.fn,avatar:ga(s.public.photo)}):Object.assign(a,{title:"",avatar:null});const n=s.p2pPeerDesc();n?Object.assign(a,{peerMessagingDisabled:ei(n.acs)}):t.peerMessagingDisabled&&Object.assign(a,{peerMessagingDisabled:!1}),Object.assign(a,{messageCount:s.messageCount(),latestClearId:s.maxClearId(),channel:s.isChannelType()}),e.callTopic==s.name&&ti(e.callState)&&(a.rtcPanel=e.callTopic)}else Object.assign(a,{messageCount:0,latestClearId:-1,onlineSubs:[],title:"",avatar:null,peerMessagingDisabled:!1,channel:!1})}else e.callTopic==t.topic&&!t.rtcPanel&&ti(e.callState)&&(a.rtcPanel=e.callTopic);else a={messageCount:0,latestClearId:-1,onlineSubs:[],topic:null,title:"",avatar:null,isVerified:!1,isStaff:!1,isDangerous:!1,deleted:!1,docPreview:null,imagePreview:null,imagePostview:null,rtcPanel:null,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1,peerMessagingDisabled:!1,channel:!1,reply:null,showGoToLastButton:!1};return e.acs?(e.acs.isWriter()!=t.isWriter&&(a.isWriter=!t.isWriter),e.acs.isReader()!=t.isReader&&(a.isReader=!t.isReader),!e.acs.isReader("given")!=t.readingBlocked&&(a.readingBlocked=!t.readingBlocked),e.acs.isSharer()!=t.isSharer&&(a.isSharer=!t.isSharer)):(t.isWriter&&(a.isWriter=!1),t.isReader&&(a.isReader=!1),t.readingBlocked||(t.readingBlocked=!0),t.isSharer&&(a.isSharer=!1)),Zs(e.acs)==!t.unconformed&&(a.unconfirmed=!t.unconformed),!e.connected&&t.onlineSubs&&t.onlineSubs.length>0&&(a.onlineSubs=[]),a}subscribe(e){if(e.isSubscribed()||!this.props.ready)return;const t=this.props.newTopicParams&&this.props.newTopicParams._topicName==this.props.topic;let a=e.startMetaQuery().withLaterDesc().withLaterSub();(this.state.isReader||t)&&(a=a.withLaterData(24),this.state.isReader&&(a=a.withLaterDel()),this.setState({fetchingMessages:!0}));const s=t?this.props.newTopicParams:void 0;e.subscribe(a.build(),s).then((t=>{303!=t.code?(this.state.topic!=t.topic&&this.setState({topic:t.topic}),this.props.onNewTopicCreated(this.props.topic,t.topic),e.queuedMessages((t=>{t._sending||e.isSubscribed()&&this.retrySend(t)}))):Js.navigateTo(Js.setUrlTopic("",t.params.topic))})).catch((e=>{console.error("Failed subscription to",this.state.topic,e),this.props.onError(e.message,"err");const t=ai.getDerivedStateFromProps({},{});t.title=this.props.intl.formatMessage(Xs.not_found),this.setState(t)}))}leave(e){if(!e||!this.props.tinode.isTopicCached(e))return;const t=this.props.tinode.getTopic(e);t&&t.isSubscribed()&&t.leave(!1).catch((()=>{})).finally((()=>{this.setState({fetchingMessages:!1}),t.onData=void 0,t.onAllMessagesReceived=void 0,t.onInfo=void 0,t.onMetaDesc=void 0,t.onSubsUpdated=void 0,t.onPres=void 0}))}handleScrollReference(e){e&&(e.addEventListener("scroll",this.handleScrollEvent),this.messagesScroller=e,this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition)}handleScrollEvent(e){const t=e.target.scrollHeight-e.target.scrollTop-e.target.offsetHeight;if(this.setState({scrollPosition:t,showGoToLastButton:t>100&&t{e.getMessagesPage(24).catch((e=>this.props.onError(e.message,"err"))).finally((()=>this.setState({fetchingMessages:!1})))}))}}goToLatestMessage(){this.setState({scrollPosition:0}),this.messagesScroller&&(this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight)}handleDescChange(e){e.public?this.setState({title:e.public.fn,avatar:ga(e.public.photo)}):this.setState({title:"",avatar:null}),e.acs&&this.setState({isWriter:e.acs.isWriter(),isReader:e.acs.isReader(),readingBlocked:!e.acs.isReader("given"),unconfirmed:Zs(e.acs)})}postReadNotification(e){if(!this.props.applicationVisible)return;this.readNotificationTimer||(this.readNotificationTimer=setInterval((()=>{if(0==this.readNotificationQueue.length)return clearInterval(this.readNotificationTimer),void(this.readNotificationTimer=null);let e=-1;for(;this.readNotificationQueue.length>0;){const t=this.readNotificationQueue[0];if(t.topicName!=this.state.topic){this.readNotificationQueue.shift();continue}const a=new Date;if(!(t.sendAt<=a))break;this.readNotificationQueue.shift(),e=Math.max(e,t.seq)}if(e>=0){const t=this.props.tinode.getTopic(this.state.topic);t&&t.noteRead(e)}}),300));const t=new Date;this.readNotificationQueue.push({topicName:this.state.topic,seq:e,sendAt:t.setMilliseconds(t.getMilliseconds()+1e3)})}clearNotificationQueue(){this.readNotificationQueue=[],this.readNotificationTimer&&(clearInterval(this.readNotificationTimer),this.readNotificationTimer=null)}handleSubsUpdated(){if(this.state.topic){const e=[],t=this.props.tinode.getTopic(this.state.topic);t.subscribers((t=>{t.online&&t.user!=this.props.myUserId&&e.push(t)}));const a={onlineSubs:e},s=t.p2pPeerDesc();s?Object.assign(a,{peerMessagingDisabled:ei(s.acs)}):this.state.peerMessagingDisabled&&Object.assign(a,{peerMessagingDisabled:!1}),this.setState(a)}}handleMessageUpdate(e){const t=this.props.tinode.getTopic(this.state.topic);if(!e)return void this.setState({latestClearId:t.maxClearId()});clearTimeout(this.keyPressTimer),this.setState({messageCount:t.messageCount(),typingIndicator:!1}),t.isNewMessage(e.seq)&&(this.state.scrollPosition>100?this.setState({showGoToLastButton:!0}):this.setState({scrollPosition:0}));t.msgStatus(e,!0)>=Ut.Tinode.MESSAGE_STATUS_SENT&&e.from!=this.props.myUserId&&this.postReadNotification(e.seq),this.props.onData(e)}handleAllMessagesReceived(e){this.setState({fetchingMessages:!1}),e>0&&this.postReadNotification(0)}handleInfoReceipt(e){switch(e.what){case"kp":clearTimeout(this.keyPressTimer),this.keyPressTimer=setTimeout((()=>{this.setState({typingIndicator:!1})}),4e3),this.state.typingIndicator||this.setState({typingIndicator:!0});break;case"read":case"recv":this.forceUpdate();break;default:console.info("Other change in topic: ",e.what)}}handleImagePostview(e){this.setState({imagePostview:e})}handleClosePreview(){this.state.imagePreview&&this.state.imagePreview.url&&URL.revokeObjectURL(this.state.imagePreview.url),this.setState({imagePostview:null,imagePreview:null,docPreview:null})}handleFormResponse(e,t,a){if("pub"==e)this.sendMessage(Ut.Drafty.attachJSON(Ut.Drafty.parse(t),a));else if("url"==e){const e=new URL(a.ref),t=e.searchParams;for(let e in a.resp)a.resp.hasOwnProperty(e)&&t.set(e,a.resp[e]);["name","seq"].map((e=>{a[e]&&t.set(e,a[e])})),t.set("uid",this.props.myUserId),t.set("topic",this.state.topic),e.search=t,window.open(e,"_blank")}else console.info("Unknown action in form",e)}handleContextClick(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.state.topic,y:e.pageY,x:e.pageX})}handleShowMessageContextMenu(e,t){"chan"==e.userFrom&&(e.userFrom=this.state.topic,e.userName=this.state.title),e.topicName=this.state.topic;const a=t||[],s=this.props.tinode.getTopic(e.topicName);if(s){s.isChannelType()||a.push("message_delete");const e=s.getAccessMode();e&&e.isDeleter()&&a.push("message_delete_hard")}this.props.showContextMenu(e,a)}handleNewChatAcceptance(e){this.props.onNewChat(this.state.topic,e)}handleEnablePeer(e){e.preventDefault(),this.props.onChangePermissions(this.state.topic,qt,this.state.topic)}sendKeyPress(){const e=this.props.tinode.getTopic(this.state.topic);e.isSubscribed()&&e.noteKeyPress()}sendMessage(e,t,a){let s;this.props.forwardMessage?(e=this.props.forwardMessage.msg,s=this.props.forwardMessage.head,this.handleCancelReply()):this.state.reply&&this.state.reply.content&&(s={reply:""+this.state.reply.seq},"string"==typeof e&&(e=Ut.Drafty.parse(e)),e=Ut.Drafty.append(Ut.Drafty.sanitizeEntities(this.state.reply.content),e),this.handleCancelReply()),this.props.sendMessage(e,t,a,s)}retrySend(e){this.props.sendMessage(e.content,void 0,void 0,e.head)}sendFileAttachment(e){const t=.75*this.props.tinode.getServerParam("maxMessageSize",Ht)-1024|0;if(e.size>t){const t=this.props.tinode.getLargeFileHelper();if(!t)return void this.props.onError(this.props.intl.formatMessage(Xs.cannot_initiate_upload));const a=t.upload(e),s=Ut.Drafty.attachFile(null,{mime:e.type,filename:e.name,size:e.size,urlPromise:a});this.sendMessage(s,a,t)}else(function(e){return new Promise(((t,a)=>{const s=new FileReader;s.onerror=e=>{a(s.error)},s.onload=()=>{t({mime:e.type,bits:s.result.split(",")[1],name:e.name})},s.readAsDataURL(e)}))})(e).then((e=>this.sendMessage(Ut.Drafty.attachFile(null,{mime:e.mime,data:e.bits,filename:e.name})))).catch((e=>this.props.onError(e)))}handleAttachFile(e){const t=this.props.tinode.getServerParam("maxFileUploadSize",Vt);e.size>t?this.props.onError(this.props.intl.formatMessage(Xs.file_attachment_too_large,{size:ea(e.size),limit:ea(t)}),"err"):this.setState({docPreview:{file:e,name:e.name,size:e.size,type:e.type}})}handleCallHangup(e,t){this.props.onVideoCallClosed(),this.setState({rtcPanel:null}),this.props.onCallHangup(e,t)}sendImageAttachment(e,t){const a=this.state.imagePreview.mime,s=this.state.imagePreview.width,i=this.state.imagePreview.height,n=this.state.imagePreview.name,o=.75*this.props.tinode.getServerParam("maxMessageSize",Ht)-1024|0;if(t.size>o){const o=this.props.tinode.getLargeFileHelper();if(!o)return void this.props.onError(this.props.intl.formatMessage(Xs.cannot_initiate_upload));const r=o.upload(t);ba(t,64,64,-1,!1).then((e=>va(e.blob))).then((l=>{let c=Ut.Drafty.insertImage(null,0,{mime:a,_tempPreview:l.bits,width:s,height:i,filename:n,size:t.size,urlPromise:r});e&&(c=Ut.Drafty.appendLineBreak(c),c=Ut.Drafty.append(c,Ut.Drafty.parse(e))),this.sendMessage(c,r,o)})).catch((e=>{this.props.onError(e,"err")}))}else va(t).then((a=>{let o=Ut.Drafty.insertImage(null,0,{mime:a.mime,preview:a.bits,width:s,height:i,filename:n,size:t.size});e&&(o=Ut.Drafty.appendLineBreak(o),o=Ut.Drafty.append(o,Ut.Drafty.parse(e))),this.sendMessage(o)}))}handleAttachImage(e){ba(e,1024,1024,this.props.tinode.getServerParam("maxFileUploadSize",Vt),!1).then((e=>{this.setState({imagePreview:{url:URL.createObjectURL(e.blob),blob:e.blob,name:e.name,width:e.width,height:e.height,size:e.blob.size,mime:e.mime}})})).catch((e=>{this.props.onError(e,"err")}))}sendAudioAttachment(e,t,a){fetch(e).then((e=>e.blob())).then((e=>{const s=.75*this.props.tinode.getServerParam("maxMessageSize",Ht)-1024;if(e.size>s){const s=this.props.tinode.getLargeFileHelper();if(!s)return void this.props.onError(this.props.intl.formatMessage(Xs.cannot_initiate_upload));const i=s.upload(e),n=Ut.Drafty.appendAudio(null,{mime:e.type,size:e.size,duration:a,preview:t,urlPromise:i});this.sendMessage(n,i,s)}else va(e).then((s=>{this.sendMessage(Ut.Drafty.appendAudio(null,{mime:s.mime,size:e.size,data:s.bits,duration:a,preview:t}))}))})).catch((e=>{this.props.onError(e)}))}handleCancelUpload(e,t){const a=this.props.tinode.getTopic(this.state.topic).findMessage(e);a&&(a._cancelled=!0),t.cancel()}handlePickReply(e,t,a,s){this.setState({reply:null}),e&&t&&(t="string"==typeof t?Ut.Drafty.init(t):t,t=Ut.Drafty.isValid(t)?Ut.Drafty.replyContent(t,30):Ut.Drafty.append(Ut.Drafty.init("⚠ "),Ut.Drafty.wrapInto(this.props.intl.formatMessage(Xs.invalid_content),"EM")),this.setState({reply:{content:Ut.Drafty.quote(s,a,t),seq:e}}),this.props.onCancelForwardMessage())}handleCancelReply(){this.setState({reply:null}),this.props.onCancelForwardMessage()}handleQuoteClick(e){const t=this.getOrCreateMessageRef(e);t&&t.current?(t.current.scrollIntoView({block:"center",behavior:"smooth"}),t.current.classList.add("flash"),setTimeout((()=>{t.current.classList.remove("flash")}),1e3)):console.error("Unresolved message ref",e)}render(){const{formatMessage:e}=this.props.intl;let a;if(this.props.hideSelf)a=null;else if(this.state.topic){let s;if(this.state.imagePreview)s=t().createElement(Gs,{content:this.state.imagePreview,tinode:this.props.tinode,reply:this.state.reply,onCancelReply:this.handleCancelReply,onClose:this.handleClosePreview,onSendMessage:this.sendImageAttachment});else if(this.state.imagePostview)s=t().createElement(Gs,{content:this.state.imagePostview,onClose:this.handleClosePreview});else if(this.state.docPreview)s=t().createElement(Ws,{content:this.state.docPreview,tinode:this.props.tinode,reply:this.state.reply,onCancelReply:this.handleCancelReply,onClose:this.handleClosePreview,onSendMessage:this.sendFileAttachment});else if(this.state.rtcPanel)s=t().createElement(Ns,{topic:this.state.topic,seq:this.props.callSeq,callState:this.props.callState,tinode:this.props.tinode,title:this.state.title,avatar:this.state.avatar||!0,onError:this.props.onError,onHangup:this.handleCallHangup,onInvite:this.props.onCallInvite,onSendOffer:this.props.onCallSendOffer,onIceCandidate:this.props.onCallIceCandidate,onSendAnswer:this.props.onCallSendAnswer});else{const a=this.props.tinode.getTopic(this.state.topic),i=a.isChannelType(),o=a.isGroupType()&&!i,r=[];a.trusted&&(a.trusted.verified&&r.push({icon:"verified",color:"badge-inv"}),a.trusted.staff&&r.push({icon:"staff",color:"badge-inv"}),a.trusted.danger&&r.push({icon:"dangerous",color:"badge-inv"}));const l=[];let c=null,d=null,h=null;const p=new Intl.DateTimeFormat(this.props.intl.locale);a.messages(((e,s,i,n)=>{let r=i?i.from||"chan":null,u="single",m=e.from||"chan";m==c?u=m==r?"middle":"last":m==r&&(u="first"),c=m;const g=!(m==this.props.myUserId),_=a.msgStatus(e,!0);let f,b,v=m;const y=a.userDesc(m);y&&y.public&&(f=y.public.fn,b=ga(y.public.photo)),h=o?"chat-box group":"chat-box";const w=this.getOrCreateMessageRef(e.seq);let C=e.head?parseInt(e.head.reply):null;if(C&&!isNaN(C)||(C=null),e.hi)l.push(t().createElement(Ys,{deleted:!0,key:e.seq}));else{const a=new Date(e.ts);d&&d.toDateString()==a.toDateString()||(l.push(t().createElement(Ys,{date:p.format(e.ts),locale:this.props.intl.locale,key:"date-"+e.seq})),d=a),l.push(t().createElement(xs,{tinode:this.props.tinode,content:e.content,mimeType:e.head&&e.head.mime,timestamp:e.ts,response:g,seq:e.seq,isGroup:o,isChan:this.state.channel,userFrom:v,userName:f,userAvatar:b,sequence:u,received:_,uploader:e._uploader,viewportWidth:this.props.viewportWidth,showContextMenu:this.handleShowMessageContextMenu,onImagePreview:this.handleImagePostview,onFormResponse:this.handleFormResponse,onError:this.props.onError,onCancelUpload:this.handleCancelUpload,pickReply:this.handlePickReply,replyToSeq:C,onQuoteClick:this.handleQuoteClick,ref:w,userIsWriter:this.state.isWriter,key:e.seq}))}}));let u=null;if(i)u=e(Xs.channel);else{const t=this.props.tinode.getMeTopic().getContact(this.state.topic);t&&Ut.Tinode.isP2PTopicName(t.topic)&&(t.online?u=e(Xs.online_now):t.seen&&(u=e(Xs.last_seen)+": "+function(e,t){t=t||window.navigator.userLanguage||window.navigator.language;const a=new Date;return e.getFullYear()==a.getFullYear()?e.getMonth()==a.getMonth()&&e.getDate()==a.getDate()?e.toLocaleTimeString(t,{hour12:!1,hour:"2-digit",minute:"2-digit"}):e.toLocaleDateString(t,{hour12:!1,month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):e.toLocaleDateString(t,{year:"numeric",month:"short",day:"numeric"})}(t.seen.when,this.props.intl.locale)))}const m=this.state.avatar||!0,g=this.state.deleted?null:this.props.online?"online"+(this.state.typingIndicator?" typing":""):"offline",_="panel-title"+(this.state.deleted?" deleted":"");s=t().createElement(t().Fragment,null,t().createElement("div",{id:"topic-caption-panel",className:"caption-panel"},this.props.displayMobile?t().createElement("a",{href:"#",id:"hide-message-view",onClick:e=>{e.preventDefault(),this.props.onHideMessagesView()}},t().createElement("i",{className:"material-icons"},"arrow_back")):null,t().createElement("div",{className:"avatar-box"},t().createElement(ha,{tinode:this.props.tinode,avatar:m,topic:this.state.topic,title:this.state.title,deleted:this.state.deleted}),i?null:t().createElement("span",{className:g})),t().createElement("div",{id:"topic-title-group"},t().createElement("div",{id:"topic-title",className:_},this.state.title||t().createElement("i",null,t().createElement(n.FormattedMessage,{id:"unnamed_topic",defaultMessage:[{type:0,value:"Unnamed"}]})),t().createElement(Xt,{badges:r})),t().createElement("div",{id:"topic-last-seen"},u)),o?t().createElement(Ks,{tinode:this.props.tinode,subscribers:this.state.onlineSubs}):t().createElement("div",{id:"topic-users"}),t().createElement("div",null,t().createElement("a",{href:"#",onClick:this.handleContextClick},t().createElement("i",{className:"material-icons"},"more_vert")))),this.props.displayMobile?t().createElement(as,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,t().createElement(Xa,{show:this.state.fetchingMessages}),t().createElement("div",{id:"messages-container"},t().createElement("button",{className:"action-button"+(this.state.showGoToLastButton?"":" hidden"),onClick:this.goToLatestMessage},t().createElement("i",{className:"material-icons"},"arrow_downward")),t().createElement("div",{id:"messages-panel",ref:this.handleScrollReference},t().createElement("ul",{id:"scroller",className:h},l)),this.state.isReader?null:t().createElement("div",{id:"write-only-background"},this.state.readingBlocked?t().createElement("div",{id:"write-only-note"},t().createElement(n.FormattedMessage,{id:"messages_not_readable",defaultMessage:[{type:0,value:"no access to messages"}]})):null)),this.state.peerMessagingDisabled&&!this.state.unconfirmed?t().createElement("div",{id:"peer-messaging-disabled-note"},t().createElement("i",{className:"material-icons secondary"},"block")," ",t().createElement(n.FormattedMessage,{id:"peers_messaging_disabled",defaultMessage:[{type:0,value:"Peer's messaging is disabled."}]})," ",t().createElement("a",{href:"#",onClick:this.handleEnablePeer},t().createElement(n.FormattedMessage,{id:"enable_peers_messaging",defaultMessage:[{type:0,value:"Enable"}]})),"."):null,this.state.unconfirmed?t().createElement($s,{onAction:this.handleNewChatAcceptance}):t().createElement(Vs,{tinode:this.props.tinode,topicName:this.state.topic,noInput:!!this.props.forwardMessage,disabled:!this.state.isWriter||this.state.deleted,onKeyPress:this.sendKeyPress,onSendMessage:this.sendMessage,onAttachFile:this.props.forwardMessage?null:this.handleAttachFile,onAttachImage:this.props.forwardMessage?null:this.handleAttachImage,onAttachAudio:this.props.forwardMessage?null:this.sendAudioAttachment,onError:this.props.onError,reply:this.state.reply,onQuoteClick:this.handleQuoteClick,onCancelReply:this.handleCancelReply}))}a=t().createElement("div",{id:"topic-view"},s)}else a=t().createElement(Qs,{serverVersion:this.props.serverVersion,serverAddress:this.props.serverAddress});return a}}const si=(0,n.injectIntl)(ai);class ii extends t().PureComponent{render(){return t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onBack()}},t().createElement("i",{className:"material-icons"},"arrow_back"))}}class ni extends t().PureComponent{render(){return t().createElement("div",null,t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onNewTopic()}},t().createElement("i",{className:"material-icons"},"chat"))," ",t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSettings()}},t().createElement("i",{className:"material-icons"},"settings")))}}class oi extends t().PureComponent{render(){return t().createElement("div",null,t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSignUp()}},t().createElement("i",{className:"material-icons"},"person_add"))," ",t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSettings()}},t().createElement("i",{className:"material-icons"},"settings")))}}class ri extends t().PureComponent{render(){const e=[];this.props.trustedBadges&&this.props.trustedBadges.map((t=>{e.push({icon:t,color:"badge-inv"})}));let a=null;return this.props.tinode&&(a=this.props.tinode.authorizeURL(ra(this.props.avatar,"image"))),t().createElement("div",{id:"side-caption-panel",className:"caption-panel"},this.props.onCancel?t().createElement(ii,{onBack:this.props.onCancel}):null,a?t().createElement("div",{id:"self-avatar",className:"avatar-box"},t().createElement(ha,{tinode:this.props.tinode,avatar:a,topic:this.props.myUserId,title:this.props.title})):null,t().createElement("div",{id:"sidepanel-title",className:"panel-title"},this.props.title,t().createElement(Xt,{badges:e})),"login"===this.props.state?t().createElement(oi,{onSignUp:this.props.onSignUp,onSettings:this.props.onSettings}):"contacts"===this.props.state?t().createElement(ni,{onNewTopic:this.props.onNewTopic,onSettings:this.props.onSettings}):null)}}function li(e,t){return e&&e.substring(0,t)}class ci extends t().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();this.state={fullName:li(t.public?t.public.fn:void 0,Kt),description:li(t.public?t.public.note:void 0,Gt),avatar:ga(t.public?t.public.photo:null)}}render(){return t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"flat-button float-right",onClick:e=>{e.preventDefault(),this.props.onNavigate("general")}},t().createElement("i",{className:"material-icons"},"edit")," ",t().createElement(n.FormattedMessage,{id:"button_edit",defaultMessage:[{type:0,value:"Edit"}]})),t().createElement("center",null,t().createElement(Za,{tinode:this.props.tinode,avatar:this.state.avatar,readOnly:!0,uid:this.props.myUserId,title:this.state.fullName})),t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_your_name",defaultMessage:[{type:0,value:"Your name"}]})),t().createElement("div",{className:"large ellipsized"},this.state.fullName)),t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_user_id",defaultMessage:[{type:0,value:"ID:"}]}))," ",t().createElement("tt",null,this.props.myUserId)),t().createElement("div",{className:"group"},t().createElement(Qa,{trustedBadges:this.props.trustedBadges})),this.state.description?t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]})),t().createElement("div",null,this.state.description)):null),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("notif")}},t().createElement("i",{className:"material-icons"},"notifications")," ",t().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_notifications",defaultMessage:[{type:0,value:"Notifications"}]})),t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("security")}},t().createElement("i",{className:"material-icons"},"security")," ",t().createElement(n.FormattedMessage,{id:"button_security",defaultMessage:[{type:0,value:"Security"}]})),t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("support")}},t().createElement("i",{className:"material-icons"},"contact_support")," ",t().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_support",defaultMessage:[{type:0,value:"Support"}]}))))}}const di=(0,n.defineMessages)({archived_contacts_title:{id:"archived_contacts",defaultMessage:[{type:0,value:"Archived contacts ("},{type:1,value:"count"},{type:0,value:")"}]}});class hi extends t().Component{constructor(e){super(e),this.handleAction=this.handleAction.bind(this),this.state=hi.deriveStateFromProps(e)}static deriveStateFromProps(e){const t=[];let a=0,s=0;return e.chatList.map((i=>{const n=i.acs&&!i.acs.isJoiner();n&&e.blocked&&t.push(i),n||e.blocked||(i.private&&i.private.arch?e.archive?t.push(i):s++:e.archive||(t.push(i),a+=i.unread>0?1:0))})),t.sort(((e,t)=>(t.touched||0)-(e.touched||0))),s>0&&t.push({action:"archive",title:di.archived_contacts_title,values:{count:s}}),{contactList:t,unreadThreads:a}}componentDidUpdate(e,t){if(e.chatList!=this.props.chatList||e.archive!=this.props.archive||e.blocked!=this.props.blocked){const e=hi.deriveStateFromProps(this.props);this.setState(e),e.unreadThreads!=t.unreadThreads&&sa(e.unreadThreads)}}handleAction(e){this.props.onShowArchive()}render(){return t().createElement(n.FormattedMessage,{id:"contacts_not_found",defaultMessage:[{type:0,value:"You have no chats"},{type:0,value:"
"},{type:0,value:"¯∖_(ツ)_/¯"}]},(e=>t().createElement(Ha,{tinode:this.props.tinode,connected:this.props.connected,contacts:this.state.contactList,emptyListMessage:e,topicSelected:this.props.topicSelected,myUserId:this.props.myUserId,showOnline:!0,showUnread:!0,onTopicSelected:this.props.onTopicSelected,showContextMenu:this.props.showContextMenu,onAction:this.handleAction})))}}class pi{static setObject(e,t){localStorage.setItem(e,JSON.stringify(t))}static getObject(e){const t=localStorage.getItem(e);return t&&JSON.parse(t)}static updateObject(e,t){const a=this.getObject(e);this.setObject(e,Object.assign(a||{},t))}static removeItem(e){localStorage.removeItem(e)}}class ui extends t().PureComponent{constructor(e){super(e),this.state={login:"",password:"",email:"",fn:"",imageDataUrl:null,errorCleared:!1,saveToken:pi.getObject("keep-logged-in")},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handleFnChange=this.handleFnChange.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e})}handleEmailChange(e){this.setState({email:e.target.value})}handleFnChange(e){this.setState({fn:e.target.value})}handleImageChanged(e){this.setState({imageDataUrl:e})}handleToggleSaveToken(){pi.setObject("keep-logged-in",!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.setState({errorCleared:!1}),this.props.onCreateAccount(this.state.login.trim(),this.state.password.trim(),ia(this.state.fn.trim().substring(0,Kt),this.state.imageDataUrl),{meth:"email",val:this.state.email})}render(){let e="primary";return this.props.disabled&&(e+=" disabled"),t().createElement("form",{className:"panel-form-column",onSubmit:this.handleSubmit},t().createElement("div",{className:"panel-form-row"},t().createElement("div",{className:"panel-form-column"},t().createElement(n.FormattedMessage,{id:"login_prompt",defaultMessage:[{type:0,value:"Login"}]},(e=>t().createElement("input",{type:"text",placeholder:e,autoComplete:"user-name",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),t().createElement(n.FormattedMessage,{id:"password_prompt",defaultMessage:[{type:0,value:"Password"}]},(e=>t().createElement(us,{placeholder:e,autoComplete:"new-password",value:this.state.password,onFinished:this.handlePasswordChange,required:!0})))),t().createElement(Za,{tinode:this.props.tinode,onImageChanged:this.handleImageChanged,onError:this.props.onError})),t().createElement("div",{className:"panel-form-row"},t().createElement(n.FormattedMessage,{id:"full_name_prompt",defaultMessage:[{type:0,value:"Full name, e.g. John Doe"}]},(e=>t().createElement("input",{type:"text",placeholder:e,autoComplete:"name",value:this.state.fn,onChange:this.handleFnChange,required:!0})))),t().createElement("div",{className:"panel-form-row"},t().createElement(n.FormattedMessage,{id:"email_prompt",defaultMessage:[{type:0,value:"Email, e.g. jdoe@example.com"}]},(e=>t().createElement("input",{type:"email",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0})))),t().createElement("div",{className:"panel-form-row"},t().createElement(es,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),t().createElement(n.FormattedMessage,{id:"stay_logged_in",defaultMessage:[{type:0,value:"Stay logged in"}]},(e=>t().createElement("label",{htmlFor:"save-token"}," ",e)))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:e,type:"submit"},t().createElement(n.FormattedMessage,{id:"button_sign_up",defaultMessage:[{type:0,value:"Sign up"}]}))))}}class mi extends t().PureComponent{constructor(e){super(e),this.handleCheckboxClick=this.handleCheckboxClick.bind(this)}handleCheckboxClick(e,t){"sound"==e?this.props.onToggleMessageSounds(t):"alert"==e?this.props.onTogglePushNotifications(t):"incognito"==e&&this.props.onToggleIncognitoMode(t)}render(){return t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{htmlFor:"message-sound"},t().createElement(n.FormattedMessage,{id:"label_message_sound",defaultMessage:[{type:0,value:"Message sound:"}]})),t().createElement(es,{name:"sound",id:"message-sound",checked:this.props.messageSounds,onChange:this.handleCheckboxClick})),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{htmlFor:"desktop-alerts"},this.props.desktopAlertsEnabled?t().createElement(n.FormattedMessage,{id:"label_push_notifications",defaultMessage:[{type:0,value:"Notification alerts:"}]}):t().createElement(n.FormattedMessage,{id:"label_push_notifications_disabled",defaultMessage:[{type:0,value:"Notification alerts (requires HTTPS):"}]})),t().createElement(es,{name:"alert",id:"desktop-alerts",checked:this.props.desktopAlerts,onChange:this.props.desktopAlertsEnabled?this.handleCheckboxClick:null})),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{htmlFor:"incognito-mode"},t().createElement(n.FormattedMessage,{id:"label_incognito_mode",defaultMessage:[{type:0,value:"Incognito mode:"}]})),t().createElement(es,{name:"incognito",id:"incognito-mode",checked:this.props.incognitoMode,onChange:this.handleCheckboxClick})))}}const gi=(0,n.defineMessages)({delete_account:{id:"delete_account",defaultMessage:[{type:0,value:"Delete account"}]},delete_account_warning:{id:"delete_account_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete your account? It cannot be undone."}]}});class _i extends t().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();let a=0;t.contacts((e=>{e.acs&&!e.acs.isJoiner()&&a++}));const s=t.getDefaultAccess();this.state={auth:s?s.auth:null,anon:s?s.anon:null,showPermissionEditorFor:void 0,blockedCount:a},this.handlePasswordUpdate=this.handlePasswordUpdate.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleHidePermissionsEditor=this.handleHidePermissionsEditor.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this)}handlePasswordUpdate(e){this.setState({password:e}),this.props.onUpdatePassword(e)}handleLaunchPermissionsEditor(e){this.setState({showPermissionEditorFor:e,editedPermissions:this.state[e]})}handleHidePermissionsEditor(){this.setState({showPermissionEditorFor:void 0})}handlePermissionsChanged(e){let t={};t[this.state.showPermissionEditorFor]=e,this.props.onUpdateAccountDesc("me",void 0,void 0,t);let a={showPermissionEditorFor:void 0};a[this.state.showPermissionEditorFor]=e,this.setState(a)}handleDeleteAccount(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(gi.delete_account),t(gi.delete_account_warning),(()=>{this.props.onDeleteAccount()}),null,!0,null)}render(){return t().createElement(t().Fragment,null,this.state.showPermissionEditorFor?t().createElement(ds,{mode:this.state.editedPermissions,skip:"O",onSubmit:this.handlePermissionsChanged,onCancel:this.handleHidePermissionsEditor}):t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_password",defaultMessage:[{type:0,value:"Password"}]})),t().createElement("div",null,t().createElement(n.FormattedMessage,{id:"password_unchanged_prompt",defaultMessage:[{type:0,value:"Unchanged"}]},(e=>t().createElement(ms,{placeholder:e,type:"password",onFinished:this.handlePasswordUpdate}))))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"danger flat-button",onClick:e=>{e.preventDefault(),this.props.onLogout()}},t().createElement("i",{className:"material-icons"},"exit_to_app"),"  ",t().createElement(n.FormattedMessage,{id:"button_logout",defaultMessage:[{type:0,value:"Logout"}]})),t().createElement("a",{href:"#",className:"danger flat-button",onClick:e=>{this.handleDeleteAccount(e)}},t().createElement("i",{className:"material-icons"},"delete"),"  ",t().createElement(n.FormattedMessage,{id:"button_delete_account",defaultMessage:[{type:0,value:"Delete account"}]}))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_default_access_mode",defaultMessage:[{type:0,value:"Default access mode:"}]}))),t().createElement("div",{className:"quoted"},t().createElement("div",null,"Auth: ",t().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"auth")},this.state.auth)),t().createElement("div",null,"Anon: ",t().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"anon")},this.state.anon)))),this.state.blockedCount>0?t().createElement(t().Fragment,null,t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("i",{className:"material-icons"},"block")," ",t().createElement("a",{href:"#",className:"gray",onClick:e=>{e.preventDefault(),this.props.onShowBlocked()}},t().createElement(n.FormattedMessage,{id:"blocked_contacts_link",defaultMessage:[{type:0,value:"Blocked contacts ("},{type:1,value:"count"},{type:0,value:")"}],values:{count:this.state.blockedCount}})))):null))}}const fi=(0,n.injectIntl)(_i);class bi extends t().PureComponent{render(){return t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"mailto:support@tinode.co",className:"flat-button",target:"_blank"},t().createElement("i",{className:"material-icons"},"email"),"  ",t().createElement(n.FormattedMessage,{id:"link_contact_us",defaultMessage:[{type:0,value:"Contact Us"}]})),t().createElement("a",{href:"https://tinode.co/terms.html",className:"flat-button",target:"_blank"},t().createElement("i",{className:"material-icons"},"description"),"  ",t().createElement(n.FormattedMessage,{id:"link_terms_of_service",defaultMessage:[{type:0,value:"Terms of Service"}]})),t().createElement("a",{href:"https://tinode.co/privacy.html",className:"flat-button",target:"_blank"},t().createElement("i",{className:"material-icons"},"policy"),"  ",t().createElement(n.FormattedMessage,{id:"link_privacy_policy",defaultMessage:[{type:0,value:"Privacy Policy"}]}))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_client",defaultMessage:[{type:0,value:"Client:"}]})),xt),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_sdk",defaultMessage:[{type:0,value:"SDK:"}]})),Ut.Tinode.getLibrary()),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_server",defaultMessage:[{type:0,value:"Server:"}]})),this.props.serverVersion),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_server_address",defaultMessage:[{type:0,value:"Server address:"}]})),this.props.serverAddress)))}}class vi extends t().Component{constructor(e){super(e),this.state={login:e.login,password:"",hostName:e.serverAddress,saveToken:e.persist},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}handleToggleSaveToken(){this.props.onPersistenceChange(!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.props.onLogin(this.state.login.trim(),this.state.password.trim())}render(){let e="primary";return this.props.disabled&&(e+=" disabled"),t().createElement("form",{id:"login-form",onSubmit:this.handleSubmit},t().createElement(n.FormattedMessage,{id:"login_prompt",defaultMessage:[{type:0,value:"Login"}]},(e=>t().createElement("input",{type:"text",id:"inputLogin",placeholder:e,autoComplete:"username",autoCorrect:"off",autoCapitalize:"none",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),t().createElement(n.FormattedMessage,{id:"password_prompt",defaultMessage:[{type:0,value:"Password"}]},(e=>t().createElement(us,{type:"password",id:"inputPassword",placeholder:e,autoComplete:"current-password",value:this.state.password,onChange:this.handlePasswordChange,required:!0}))),t().createElement("div",{className:"panel-form-row"},t().createElement(es,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),t().createElement("label",{htmlFor:"save-token"}," ",t().createElement(n.FormattedMessage,{id:"stay_logged_in",defaultMessage:[{type:0,value:"Stay logged in"}]})),t().createElement("a",{href:"#reset"},t().createElement(n.FormattedMessage,{id:"forgot_password_link",defaultMessage:[{type:0,value:"Forgot password?"}]}))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:e,type:"submit"},t().createElement(n.FormattedMessage,{id:"button_sign_in",defaultMessage:[{type:0,value:"Sign in"}]}))))}}const yi=(0,n.defineMessages)({invalid_id:{id:"error_invalid_id",defaultMessage:[{type:0,value:"Invalid ID"}]}});class wi extends t().PureComponent{constructor(e){super(e),this.state={groupId:""},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleChange(e){this.setState({groupId:e.target.value})}handleKeyPress(e){"Enter"===e.key&&this.handleSubmit(e)}handleSubmit(e){if(e.preventDefault(),this.state.groupId){const e=this.state.groupId.trim(),t=e.substr(0,3);e.length>3&&["usr","grp","chn"].includes(t)?this.props.onSubmit(e):this.props.onError(this.props.intl.formatMessage(yi.invalid_id),"err")}}render(){return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement(n.FormattedMessage,{id:"group_user_id_prompt",defaultMessage:[{type:0,value:"Group or User ID"}]},(e=>t().createElement("input",{type:"text",placeholder:e,value:this.state.groupId,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0,autoFocus:!0})))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(n.FormattedMessage,{id:"button_subscribe",defaultMessage:[{type:0,value:"Subscribe"}]}))))}}const Ci=(0,n.injectIntl)(wi);class Ei extends t().PureComponent{constructor(e){super(e),this.fullName=t().createRef(),this.state={fullName:"",private:"",description:"",imageDataUrl:null,tags:[],isChannel:!1},this.handleFieldEdit=this.handleFieldEdit.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleTagsChanged=this.handleTagsChanged.bind(this),this.handleChannelToggle=this.handleChannelToggle.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}componentDidMount(){}handleFieldEdit(e,t){this.setState({[e]:t.target.value||""})}handleImageChanged(e){this.setState({imageDataUrl:e})}handleTagsChanged(e){this.setState({tags:e})}handleChannelToggle(){this.setState({isChannel:!this.state.isChannel})}handleSubmit(e){e.preventDefault();const t=this.state.fullName.trim().substring(0,Kt),a=this.state.private.trim().substring(0,Kt),s=this.state.description.trim().substring(0,Gt);t&&this.props.onSubmit(t,s,this.state.imageDataUrl,a,this.state.tags,this.state.isChannel)}render(){let e="primary";return this.props.disabled&&(e+=" disabled"),t().createElement("form",{className:"panel-form",onSubmit:this.handleSubmit},t().createElement("div",{className:"panel-form-column"},t().createElement("center",null,t().createElement(Za,{tinode:this.props.tinode,onError:this.props.onError,onImageChanged:this.handleImageChanged})),t().createElement("div",{className:"group"},t().createElement("label",{className:"small",htmlFor:"new-topic-fn"},t().createElement(n.FormattedMessage,{id:"label_topic_name",defaultMessage:[{type:0,value:"Name"}]})),t().createElement(n.FormattedMessage,{id:"topic_name_editing_placeholder",defaultMessage:[{type:0,value:"Freeform name of the group"}]},(e=>t().createElement("input",{type:"text",id:"new-topic-fn",placeholder:e,ref:this.fullName,value:this.state.fullName,onChange:this.handleFieldEdit.bind(this,"fullName"),autoFocus:!0,required:!0,tabIndex:0})))),t().createElement("div",{className:"group"},t().createElement("label",{className:"small",htmlFor:"new-topic-priv"},t().createElement(n.FormattedMessage,{id:"label_private",defaultMessage:[{type:0,value:"Private comment"}]})),t().createElement(n.FormattedMessage,{id:"private_editing_placeholder",defaultMessage:[{type:0,value:"Visible to you only"}]},(e=>t().createElement("input",{type:"text",id:"new-topic-priv",placeholder:e,value:this.state.private,onChange:this.handleFieldEdit.bind(this,"private"),tabIndex:1})))),t().createElement("div",{className:"group"},t().createElement("label",{className:"small",htmlFor:"new-topic-desc"},t().createElement(n.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]})),t().createElement(n.FormattedMessage,{id:"description_editing_placeholder",defaultMessage:[{type:0,value:"Description (optional)"}]},(e=>t().createElement("input",{type:"text",id:"new-topic-desc",placeholder:e,value:this.state.description,onChange:this.handleFieldEdit.bind(this,"description"),tabIndex:2}))))),t().createElement("div",{className:"panel-form-row"},t().createElement(es,{checked:this.state.isChannel,tabIndex:3,onChange:this.handleChannelToggle})," ",t().createElement("label",{onClick:this.handleChannelToggle},t().createElement(n.FormattedMessage,{id:"channel_prompt",defaultMessage:[{type:0,value:"This is a channel"}]}))),t().createElement(n.FormattedMessage,{id:"title_tag_manager",defaultMessage:[{type:0,value:"Tags (search & discovery)"}]},(e=>t().createElement(gs,{tinode:this.props.tinode,tags:this.state.tags,activated:!0,onTagsChanged:this.handleTagsChanged,tabIndex:4,title:e}))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:e},t().createElement(n.FormattedMessage,{id:"button_create",defaultMessage:[{type:0,value:"Create"}]}))))}}const Si=(0,n.defineMessages)({search_for_contacts:{id:"search_for_contacts",defaultMessage:[{type:0,value:"Use search to find contacts"}]},search_no_results:{id:"search_no_results",defaultMessage:[{type:0,value:"Search returned no results"}]},search_placeholder:{id:"search_placeholder",defaultMessage:[{type:0,value:"List like email:alice@example.com, tel:17025550003..."}]}});class Mi extends t().Component{constructor(e){super(e),this.state={tabSelected:"find",searchQuery:null},this.handleTabClick=this.handleTabClick.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleSearchResultSelected=this.handleSearchResultSelected.bind(this),this.handleNewGroupSubmit=this.handleNewGroupSubmit.bind(this),this.handleGroupByID=this.handleGroupByID.bind(this)}componentDidMount(){this.props.onInitFind()}handleTabClick(e){e.preventDefault(),Js.navigateTo(Js.addUrlParam(window.location.hash,"tab",e.currentTarget.dataset.id)),this.setState({tabSelected:e.currentTarget.dataset.id})}handleSearchContacts(e){this.props.onSearchContacts(e),this.setState({searchQuery:Ut.Tinode.isNullValue(e)?null:e})}handleSearchResultSelected(e){"find"==this.state.tabSelected&&(Js.navigateTo(Js.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e))}handleNewGroupSubmit(e,t,a,s,i,n){Js.navigateTo(Js.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(void 0,{public:ia(e,a,null,t),private:s,tags:i},n)}handleGroupByID(e){Js.navigateTo(Js.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e)}render(){const{formatMessage:e}=this.props.intl,a=e(this.state.searchQuery?Si.search_no_results:Si.search_for_contacts),s=e(Si.search_placeholder);return t().createElement("div",{className:"flex-column"},t().createElement("ul",{className:"tabbar"},t().createElement("li",{className:"find"===this.state.tabSelected?"active":null},t().createElement("a",{href:"#","data-id":"find",onClick:this.handleTabClick},t().createElement(n.FormattedMessage,{id:"tabtitle_find_user",defaultMessage:[{type:0,value:"find"}]}))),t().createElement("li",{className:"grp"===this.state.tabSelected?"active":null},t().createElement("a",{href:"#","data-id":"grp",onClick:this.handleTabClick},t().createElement(n.FormattedMessage,{id:"tabtitle_new_group",defaultMessage:[{type:0,value:"new group"}]}))),t().createElement("li",{className:"byid"===this.state.tabSelected?"active":null},t().createElement("a",{href:"#","data-id":"byid",onClick:this.handleTabClick},t().createElement(n.FormattedMessage,{id:"tabtitle_group_by_id",defaultMessage:[{type:0,value:"by id"}]})))),"grp"===this.state.tabSelected?t().createElement(Ei,{tinode:this.props.tinode,onSubmit:this.handleNewGroupSubmit}):"byid"===this.state.tabSelected?t().createElement(Ci,{onSubmit:this.handleGroupByID,onError:this.props.onError}):t().createElement("div",{className:"flex-column"},t().createElement(Va,{placeholder:s,onSearchContacts:this.handleSearchContacts}),t().createElement(Ha,{tinode:this.props.tinode,contacts:this.props.searchResults,myUserId:this.props.myUserId,emptyListMessage:a,showOnline:!1,showUnread:!1,showContextMenu:!1,onTopicSelected:this.handleSearchResultSelected})))}}const ki=(0,n.injectIntl)(Mi);class Ti extends t().PureComponent{constructor(e){super(e),this.state={email:"",password:"",sent:!1},this.handleSubmit=this.handleSubmit.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this)}componentDidMount(){const e=Js.parseUrlHash(window.location.hash);this.setState({token:e.params.token,scheme:e.params.scheme})}handleSubmit(e){if(e.preventDefault(),this.state.token)this.props.onReset(this.state.scheme,this.state.password.trim(),this.state.token);else if(this.state.sent)this.props.onCancel();else{const e=this.state.email.trim();this.setState({email:e}),this.props.onRequest("email",e).then((()=>{this.setState({sent:!0})}))}}handleEmailChange(e){this.setState({email:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}render(){return t().createElement("form",{id:"password-reset-form",onSubmit:this.handleSubmit},this.state.token&&this.state.scheme?t().createElement(t().Fragment,null,t().createElement("label",{htmlFor:"new-password"},t().createElement(n.FormattedMessage,{id:"label_new_password",defaultMessage:[{type:0,value:"New password"}]})),t().createElement(n.FormattedMessage,{id:"new_password_placeholder",defaultMessage:[{type:0,value:"Enter new password"}]},(e=>t().createElement(us,{id:"new-password",placeholder:e,autoComplete:"new-password",value:this.state.password,required:!0,autoFocus:!0,onChange:this.handlePasswordChange})))):this.state.sent?t().createElement(t().Fragment,null,t().createElement("br",null),t().createElement("center",null,t().createElement("i",{className:"material-icons huge green"},"task_alt")),t().createElement("br",null),t().createElement("center",null,t().createElement(n.FormattedMessage,{id:"password_reset_email_sent",defaultMessage:[{type:0,value:"An email has been sent to "},{type:1,value:"email"},{type:0,value:". Follow the directions in the email to reset your password."}],values:{email:t().createElement("tt",null,this.state.email)}}))):t().createElement(t().Fragment,null,t().createElement("label",{htmlFor:"inputEmail"},t().createElement(n.FormattedMessage,{id:"label_reset_password",defaultMessage:[{type:0,value:"Send a password reset email:"}]})),t().createElement(n.FormattedMessage,{id:"credential_email_prompt",defaultMessage:[{type:0,value:"Your registration email"}]},(e=>t().createElement("input",{type:"email",id:"inputEmail",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0,autoFocus:!0})))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:"primary",type:"submit"},this.state.token&&this.state.scheme?t().createElement(n.FormattedMessage,{id:"button_reset",defaultMessage:[{type:0,value:"Reset"}]}):this.state.sent?t().createElement(n.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}):t().createElement(n.FormattedMessage,{id:"button_send_request",defaultMessage:[{type:0,value:"Send request"}]}))))}}class Ni extends t().PureComponent{constructor(e){super(e),this.state={hostName:e.serverAddress,changed:!1},this.handleHostNameChange=this.handleHostNameChange.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this)}handleHostNameChange(e){this.setState({hostName:e.target.value,changed:!0})}handleEditingFinished(){this.state.changed&&(this.setState({changed:!1}),this.props.onServerAddressChange(this.state.hostName.trim()))}render(){var e=[];for(let a in Bt){let s=Bt[a];e.push(t().createElement("option",{key:s,value:s}))}return t().createElement("div",{className:"panel-form-row"},t().createElement("input",{type:"search",id:"host-name",placeholder:this.props.hostName,list:"known-hosts",className:"quoted",value:this.state.hostName,onChange:this.handleHostNameChange,onBlur:this.handleEditingFinished,required:!0}),t().createElement("datalist",{id:"known-hosts"},e))}}class Ai extends t().PureComponent{constructor(e){super(e),this.state={transport:e.transport||"def",serverAddress:e.serverAddress},this.handleSubmit=this.handleSubmit.bind(this),this.handleTransportSelected=this.handleTransportSelected.bind(this),this.handleServerAddressChange=this.handleServerAddressChange.bind(this)}handleSubmit(e){e.preventDefault(),this.props.onUpdate({transport:this.state.transport,serverAddress:this.state.serverAddress})}handleTransportSelected(e){this.setState({transport:e.currentTarget.value})}handleServerAddressChange(e){this.setState({serverAddress:e})}render(){const e={def:"default",ws:"websocket",lp:"long polling"},a=[];return["def","ws","lp"].map((s=>{const i="transport-"+s,n=e[s];a.push(t().createElement("li",{key:s},t().createElement("input",{type:"radio",id:i,name:"transport-select",value:s,checked:this.state.transport===s,onChange:this.handleTransportSelected}),t().createElement("label",{htmlFor:i},n)))})),t().createElement("form",{id:"settings-form",className:"panel-form",onSubmit:this.handleSubmit},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_server_to_use",defaultMessage:[{type:0,value:"Server to use:"}]}))),t().createElement(Ni,{serverAddress:this.state.serverAddress,onServerAddressChange:this.handleServerAddressChange}),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(n.FormattedMessage,{id:"label_wire_transport",defaultMessage:[{type:0,value:"Wire transport:"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement("ul",{className:"quoted"},a)),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{type:"submit",className:"primary"},t().createElement(n.FormattedMessage,{id:"button_update",defaultMessage:[{type:0,value:"Update"}]}))))}}const Di=(0,n.defineMessages)({phone:{id:"phone_dative",defaultMessage:[{type:0,value:"phone"}]},email:{id:"email_dative",defaultMessage:[{type:0,value:"email"}]}});class Pi extends t().PureComponent{constructor(e){super(e),this.state={code:e.credCode||""},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}handleChange(e){this.setState({code:e.target.value})}handleKeyPress(e){"Enter"===e.key?this.handleSubmit(e):"Escape"==e.key&&this.handleCancel(e)}handleSubmit(e){e.preventDefault(),this.state.code&&this.state.code.trim()&&this.props.onSubmit(this.props.credMethod,this.state.code.trim())}handleCancel(e){e.preventDefault(),this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl;let a={email:e(Di.email),tel:e(Di.phone)}[this.props.credMethod]||this.props.credMethod;return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small",htmlFor:"enter-confirmation-code"},t().createElement(n.FormattedMessage,{id:"enter_confirmation_code_prompt",defaultMessage:[{type:0,value:"Enter confirmation code sent to you by "},{type:1,value:"method"},{type:0,value:":"}],values:{method:a}}))),t().createElement("div",{className:"panel-form-row"},t().createElement(n.FormattedMessage,{id:"numeric_confirmation_code_prompt",defaultMessage:[{type:0,value:"Numbers only"}]},(e=>t().createElement("input",{type:"text",id:"enter-confirmation-code",placeholder:e,value:this.state.code,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0})))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:"secondary",onClick:this.handleCancel},t().createElement(n.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(n.FormattedMessage,{id:"button_confirm",defaultMessage:[{type:0,value:"Confirm"}]}))))}}const Ii=(0,n.injectIntl)(Pi),Ui=(0,n.defineMessages)({login:{id:"sidepanel_title_login",defaultMessage:[{type:0,value:"Sign In"}]},register:{id:"sidepanel_title_register",defaultMessage:[{type:0,value:"Create Account"}]},settings:{id:"sidepanel_title_settings",defaultMessage:[{type:0,value:"Settings"}]},edit:{id:"sidepanel_title_account_settings",defaultMessage:[{type:0,value:"Account Settings"}]},general:{id:"panel_title_general",defaultMessage:[{type:0,value:"General"}]},security:{id:"panel_title_security",defaultMessage:[{type:0,value:"Security"}]},crop:{id:"panel_title_crop",defaultMessage:[{type:0,value:"Drag to Adjust"}]},notif:{id:"sidepanel_title_acc_notifications",defaultMessage:[{type:0,value:"Notifications"}]},support:{id:"sidepanel_title_acc_support",defaultMessage:[{type:0,value:"Support"}]},newtpk:{id:"sidepanel_title_newtpk",defaultMessage:[{type:0,value:"Start New Chat"}]},cred:{id:"sidepanel_title_cred",defaultMessage:[{type:0,value:"Confirm Credentials"}]},reset:{id:"sidepanel_title_reset",defaultMessage:[{type:0,value:"Reset Password"}]},archive:{id:"sidepanel_title_archive",defaultMessage:[{type:0,value:"Archived Chats"}]},blocked:{id:"sidepanel_title_blocked",defaultMessage:[{type:0,value:"Blocked Chats"}]}});class Ri extends t().Component{constructor(e){super(e),this.handleNewTopic=this.handleNewTopic.bind(this)}handleNewTopic(){this.props.onNavigate("newtpk")}render(){const{formatMessage:e}=this.props.intl,a=this.props.state||(this.props.myUserId?"contacts":"login");let s,i,n,o;return"contacts"==a?(s=this.props.title,i=!this.props.avatar||this.props.avatar,n=this.props.trustedBadges):(s=e(Ui[a]),i=!1,n=null),-1==["login","contacts"].indexOf(a)&&(o=this.props.onCancel),t().createElement("div",{id:"sidepanel",className:this.props.hideSelf?"nodisplay":null},t().createElement(ri,{state:a,title:s,avatar:i,tinode:this.props.tinode,trustedBadges:n,myUserId:this.props.myUserId,onSignUp:this.props.onSignUp,onSettings:this.props.onSettings,onNewTopic:this.handleNewTopic,onCancel:o}),t().createElement(as,{level:this.props.errorLevel,text:this.props.errorText,action:this.props.errorAction,actionText:this.props.errorActionText,onClearError:this.props.onError}),t().createElement(Xa,{show:this.props.loadSpinnerVisible}),"login"===a?t().createElement(vi,{login:this.props.login,disabled:this.props.loginDisabled,persist:this.props.persist,onLogin:this.props.onLoginRequest,onPersistenceChange:this.props.onPersistenceChange}):"register"===a?t().createElement(ui,{tinode:this.props.tinode,onCreateAccount:this.props.onCreateAccount,onCancel:this.props.onCancel,onError:this.props.onError}):"settings"===a?t().createElement(Ai,{transport:this.props.transport,serverAddress:this.props.serverAddress,onCancel:this.props.onCancel,onUpdate:this.props.onGlobalSettings}):"edit"===a?t().createElement(ci,{tinode:this.props.tinode,myUserId:this.props.myUserId,trustedBadges:this.props.trustedBadges,onNavigate:this.props.onNavigate}):"general"===a||"crop"===a?t().createElement(fs,{topic:"me",tinode:this.props.tinode,myUserId:this.props.myUserId,onUpdateTopicDesc:this.props.onUpdateAccountDesc,onUpdateTags:this.props.onUpdateAccountTags,onCredAdd:this.props.onCredAdd,onCredDelete:this.props.onCredDelete,onCredConfirm:this.props.onCredConfirm,onError:this.props.onError}):"notif"===a?t().createElement(mi,{messageSounds:this.props.messageSounds,desktopAlerts:this.props.desktopAlerts,desktopAlertsEnabled:this.props.desktopAlertsEnabled,incognitoMode:this.props.incognitoMode,onTogglePushNotifications:this.props.onTogglePushNotifications,onToggleMessageSounds:this.props.onToggleMessageSounds,onToggleIncognitoMode:this.props.onToggleIncognitoMode}):"security"===a?t().createElement(fi,{tinode:this.props.tinode,onUpdateAccountDesc:this.props.onUpdateAccountDesc,onUpdatePassword:this.props.onUpdatePassword,onLogout:this.props.onLogout,onDeleteAccount:this.props.onDeleteAccount,onShowAlert:this.props.onShowAlert,onShowBlocked:this.props.onShowBlocked}):"support"===a?t().createElement(bi,{serverAddress:this.props.serverAddress,serverVersion:this.props.serverVersion}):"contacts"===a||"archive"==a||"blocked"==a?t().createElement(hi,{tinode:this.props.tinode,myUserId:this.props.myUserId,connected:this.props.connected,topicSelected:this.props.topicSelected,archive:"archive"==a,blocked:"blocked"==a,chatList:this.props.chatList,showContextMenu:this.props.showContextMenu,onTopicSelected:this.props.onTopicSelected,onShowArchive:this.props.onShowArchive}):"newtpk"===a?t().createElement(ki,{tinode:this.props.tinode,searchResults:this.props.searchResults,onInitFind:this.props.onInitFind,onSearchContacts:this.props.onSearchContacts,onCreateTopic:this.props.onCreateTopic,onError:this.props.onError}):"cred"===a?t().createElement(Ii,{credCode:this.props.credCode,credMethod:this.props.credMethod,onSubmit:this.props.onValidateCredentials,onCancel:this.props.onCancel,onError:this.props.onError}):"reset"===a?t().createElement(Ti,{onRequest:this.props.onPasswordResetRequest,onReset:this.props.onResetPassword,onCancel:this.props.onCancel}):null)}}const Fi=(0,n.injectIntl)(Ri);function xi(){let e=Lt;return"object"==typeof window.location&&("file:"==window.location.protocol||"localhost"==window.location.hostname?e=Bt.local:window.location.hostname&&(e=window.location.hostname+(window.location.port?":"+window.location.port:""))),e}function Bi(){return"object"==typeof window.location&&"https:"==window.location.protocol}const Li=new Audio("audio/msg.m4a"),Oi=(0,n.defineMessages)({reconnect_countdown:{id:"reconnect_countdown",defaultMessage:[{type:0,value:"Disconnected. Reconnecting in "},{type:1,value:"seconds"},{type:0,value:"…"}]},reconnect_now:{id:"reconnect_now",defaultMessage:[{type:0,value:"Try now"}]},push_init_failed:{id:"push_init_failed",defaultMessage:[{type:0,value:"Failed to initialize push notifications"}]},invalid_security_token:{id:"invalid_security_token",defaultMessage:[{type:0,value:"Invalid security token"}]},no_connection:{id:"no_connection",defaultMessage:[{type:0,value:"No connection"}]},code_doesnot_match:{id:"code_doesnot_match",defaultMessage:[{type:0,value:"Code does not match"}]},menu_item_info:{id:"menu_item_info",defaultMessage:[{type:0,value:"Info"}]},menu_item_video_call:{id:"menu_item_video_call",defaultMessage:[{type:0,value:"Video call"}]}});class qi extends t().Component{constructor(e){super(e),this.selfRef=t().createRef(),this.state=this.getBlankState(),this.handleResize=this.handleResize.bind(this),this.handleHashRoute=this.handleHashRoute.bind(this),this.handleOnline=this.handleOnline.bind(this),this.checkForAppUpdate=this.checkForAppUpdate.bind(this),this.handleVisibilityEvent=this.handleVisibilityEvent.bind(this),this.handleError=this.handleError.bind(this),this.handleLoginRequest=this.handleLoginRequest.bind(this),this.handlePersistenceChange=this.handlePersistenceChange.bind(this),this.handleConnected=this.handleConnected.bind(this),this.handleAutoreconnectIteration=this.handleAutoreconnectIteration.bind(this),this.doLogin=this.doLogin.bind(this),this.handleCredentialsRequest=this.handleCredentialsRequest.bind(this),this.handleLoginSuccessful=this.handleLoginSuccessful.bind(this),this.handleDisconnect=this.handleDisconnect.bind(this),this.tnMeMetaDesc=this.tnMeMetaDesc.bind(this),this.tnMeContactUpdate=this.tnMeContactUpdate.bind(this),this.tnMeSubsUpdated=this.tnMeSubsUpdated.bind(this),this.resetContactList=this.resetContactList.bind(this),this.tnData=this.tnData.bind(this),this.tnInitFind=this.tnInitFind.bind(this),this.tnFndSubsUpdated=this.tnFndSubsUpdated.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleTopicSelected=this.handleTopicSelected.bind(this),this.handleHideMessagesView=this.handleHideMessagesView.bind(this),this.handleSendMessage=this.handleSendMessage.bind(this),this.handleNewChatInvitation=this.handleNewChatInvitation.bind(this),this.handleNewAccount=this.handleNewAccount.bind(this),this.handleNewAccountRequest=this.handleNewAccountRequest.bind(this),this.handleUpdatePasswordRequest=this.handleUpdatePasswordRequest.bind(this),this.handleUpdateAccountTagsRequest=this.handleUpdateAccountTagsRequest.bind(this),this.handleToggleIncognitoMode=this.handleToggleIncognitoMode.bind(this),this.handleSettings=this.handleSettings.bind(this),this.handleGlobalSettings=this.handleGlobalSettings.bind(this),this.handleShowArchive=this.handleShowArchive.bind(this),this.handleShowBlocked=this.handleShowBlocked.bind(this),this.handleToggleMessageSounds=this.handleToggleMessageSounds.bind(this),this.handleCredAdd=this.handleCredAdd.bind(this),this.handleCredDelete=this.handleCredDelete.bind(this),this.handleCredConfirm=this.handleCredConfirm.bind(this),this.initFCMessaging=this.initFCMessaging.bind(this),this.toggleFCMToken=this.toggleFCMToken.bind(this),this.handlePushMessage=this.handlePushMessage.bind(this),this.handleSidepanelCancel=this.handleSidepanelCancel.bind(this),this.handleStartTopicRequest=this.handleStartTopicRequest.bind(this),this.handleNewTopicCreated=this.handleNewTopicCreated.bind(this),this.handleTopicUpdateRequest=this.handleTopicUpdateRequest.bind(this),this.handleUnarchive=this.handleUnarchive.bind(this),this.handleChangePermissions=this.handleChangePermissions.bind(this),this.handleTagsUpdateRequest=this.handleTagsUpdateRequest.bind(this),this.handleLogout=this.handleLogout.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this),this.handleDeleteTopicRequest=this.handleDeleteTopicRequest.bind(this),this.handleDeleteMessagesRequest=this.handleDeleteMessagesRequest.bind(this),this.handleLeaveUnsubRequest=this.handleLeaveUnsubRequest.bind(this),this.handleBlockTopicRequest=this.handleBlockTopicRequest.bind(this),this.handleReportTopic=this.handleReportTopic.bind(this),this.handleShowContextMenu=this.handleShowContextMenu.bind(this),this.defaultTopicContextMenu=this.defaultTopicContextMenu.bind(this),this.handleHideContextMenu=this.handleHideContextMenu.bind(this),this.handleShowAlert=this.handleShowAlert.bind(this),this.handleShowInfoView=this.handleShowInfoView.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleValidateCredentialsRequest=this.handleValidateCredentialsRequest.bind(this),this.handlePasswordResetRequest=this.handlePasswordResetRequest.bind(this),this.handleResetPassword=this.handleResetPassword.bind(this),this.handleContextMenuAction=this.handleContextMenuAction.bind(this),this.handleShowForwardDialog=this.handleShowForwardDialog.bind(this),this.handleHideForwardDialog=this.handleHideForwardDialog.bind(this),this.handleStartVideoCall=this.handleStartVideoCall.bind(this),this.handleInfoMessage=this.handleInfoMessage.bind(this),this.handleCallClose=this.handleCallClose.bind(this),this.handleCallInvite=this.handleCallInvite.bind(this),this.handleCallRinging=this.handleCallRinging.bind(this),this.handleCallHangup=this.handleCallHangup.bind(this),this.handleCallSendOffer=this.handleCallSendOffer.bind(this),this.handleCallIceCandidate=this.handleCallIceCandidate.bind(this),this.handleCallSendAnswer=this.handleCallSendAnswer.bind(this),this.handleCallAcceptCall=this.handleCallAcceptCall.bind(this),this.sendMessageToTopic=this.sendMessageToTopic.bind(this)}getBlankState(){const e=pi.getObject("settings")||{},t=!!pi.getObject("keep-logged-in");return{connected:!1,ready:!1,autoLogin:!1,transport:e.transport||null,serverAddress:e.serverAddress||xi(),serverVersion:"no connection",messageSounds:!e.messageSoundsOff,incognitoMode:!1,desktopAlerts:t&&!!e.desktopAlerts,desktopAlertsEnabled:(Bi()||"object"==typeof window.location&&"localhost"==window.location.hostname)&&"undefined"!=typeof navigator&&"undefined"!=typeof FIREBASE_INIT,firebaseToken:t?pi.getObject("firebase-token"):null,applicationVisible:!document.hidden,errorText:"",errorLevel:null,errorAction:void 0,errorActionText:null,sidePanelSelected:"login",sidePanelTitle:null,sidePanelAvatar:null,myTrustedBadges:[],loadSpinnerVisible:!1,login:"",password:"",persist:t,myUserId:null,liveConnection:navigator.onLine,topicSelected:"",topicSelectedOnline:!1,topicSelectedAcs:null,newTopicParams:null,loginDisabled:!1,displayMobile:window.innerWidth<=640,infoPanel:void 0,mobilePanel:"sidepanel",callTopic:void 0,callState:0,callShouldStart:!1,contextMenuVisible:!1,contextMenuBounds:null,contextMenuClickAt:null,contextMenuParams:null,contextMenuItems:[],forwardDialogVisible:!1,forwardMessage:null,alertVisible:!1,alertParams:{},chatList:[],searchResults:[],searchableContacts:[],credMethod:void 0,credCode:void 0,requestedTopic:void 0}}componentDidMount(){if(window.addEventListener("resize",this.handleResize),window.addEventListener("online",(e=>{this.handleOnline(!0)})),window.addEventListener("offline",(e=>{this.handleOnline(!1)})),window.addEventListener("hashchange",this.handleHashRoute),"function"==typeof BroadcastChannel){new BroadcastChannel("tinode-sw").addEventListener("message",this.handlePushMessage)}else console.warn("Your browser does not support BroadcastChannel. Some features will not be available");document.addEventListener("visibilitychange",this.handleVisibilityEvent),this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight}),new Promise(((e,t)=>{this.tinode=qi.tnSetup(this.state.serverAddress,this.state.transport,this.props.intl.locale,this.state.persist,e),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,this.tinode.onInfoMessage=this.handleInfoMessage})).then((()=>{this.state.desktopAlertsEnabled&&this.initFCMessaging().then((()=>{this.state.desktopAlerts&&this.tinode.setDeviceToken(this.state.firebaseToken)})).catch((()=>{}));const e=Js.parseUrlHash(window.location.hash);this.resetContactList();const t=this.state.persist?pi.getObject("auth-token"):void 0;t&&(this.setState({autoLogin:!0}),t.expires=new Date(t.expires),this.tinode.setAuthToken(t),this.tinode.connect().catch((e=>{this.handleError(e.message,"err")}))),["cred","reset","register"].includes(e.path[0])||(this.setState({requestedTopic:e.path[1]}),Js.navigateTo("")),this.readTimer=null,this.readTimerCallback=null,this.handleHashRoute()}))}componentWillUnmount(){window.removeEventListener("resize",this.handleResize),window.removeEventListener("hashchange",this.handleHashRoute),document.removeEventListener("visibilitychange",this.handleVisibilityEvent)}static tnSetup(e,t,a,s,i){const n=new Ut.Tinode({appName:xt,host:e,apiKey:"AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K",transport:t,secure:Bi(),persist:s},i);return n.setHumanLanguage(a),n.enableLogging(true,!0),n}handlePushMessage(e){this.tinode.oobNotification(e.data||{})}initFCMessaging(){const{formatMessage:e,locale:t}=this.props.intl,a=(t,a)=>{console.error(t,a),this.handleError(e(Oi.push_init_failed),"err"),this.setState({desktopAlertsEnabled:!1,firebaseToken:null}),pi.updateObject("settings",{desktopAlerts:!1})};try{return this.fcm=At(Q(FIREBASE_INIT,xt)),navigator.serviceWorker.register("/service-worker.js").then((e=>(this.checkForAppUpdate(e),e.active.postMessage(JSON.stringify({locale:t,version:Ft})),e))).then((e=>qi.requestFCMToken(this.fcm,e))).then((e=>{const t=pi.getObject("keep-logged-in");e!=this.state.firebaseToken&&(this.tinode.setDeviceToken(e),t&&pi.setObject("firebase-token",e)),this.setState({firebaseToken:e,desktopAlerts:!0}),t&&pi.updateObject("settings",{desktopAlerts:!0}),It(this.fcm,(e=>{this.handlePushMessage(e)}))})).catch((e=>{throw a(e),e}))}catch(e){return a(e),Promise.reject(e)}}static requestFCMToken(e,t){return Dt(e,{serviceWorkerRegistration:t,vapidKey:FIREBASE_INIT.messagingVapidKey}).then((t=>t||Notification.requestPermission().then((t=>{if("granted"===t)return Dt(e,{serviceWorkerRegistration:reg,vapidKey:FIREBASE_INIT.messagingVapidKey}).then((e=>{if(e)return e;throw new Error("Failed to initialize notifications")}));throw new Error("No permission to send notifications: "+t)}))))}handleResize(){const e=document.documentElement.clientWidth<=640;this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight}),this.state.displayMobile!=e&&this.setState({displayMobile:e})}checkForAppUpdate(e){e.onupdatefound=()=>{const a=e.installing;a.onstatechange=()=>{if("installed"==a.state&&navigator.serviceWorker.controller){const e=t().createElement(t().Fragment,null,t().createElement(n.FormattedMessage,{id:"update_available",defaultMessage:[{type:0,value:"Update available."}]})," ",t().createElement("a",{href:""},t().createElement(n.FormattedMessage,{id:"reload_update",defaultMessage:[{type:0,value:"Reload"}]})),".");this.handleError(e,"info")}}}}handleHashRoute(){const e=Js.parseUrlHash(window.location.hash);if(e.path&&e.path.length>0){["register","settings","edit","notif","security","support","general","crop","cred","reset","newtpk","archive","blocked","contacts",""].includes(e.path[0])?this.setState({sidePanelSelected:e.path[0]}):console.warn("Unknown sidepanel view",e.path[0]);let t=e.path[1]||null;t!=this.state.topicSelected&&(Ut.Tinode.topicType(t)||(t=null),this.setState({topicSelected:t,topicSelectedAcs:this.tinode.getTopicAccessMode(t)}))}else this.setState({sidePanelSelected:"",topicSelected:null});e.params.method&&this.setState({credMethod:e.params.method}),e.params.code&&this.setState({credCode:e.params.code}),this.setState({infoPanel:e.params.info,newTopicTabSelected:e.params.tab})}handleOnline(e){e?(this.handleError(),clearInterval(this.reconnectCountdown),this.tinode.reconnect()):this.handleError(this.props.intl.formatMessage(Oi.no_connection),"warn"),this.setState({liveConnection:e})}handleVisibilityEvent(){this.setState({applicationVisible:!document.hidden})}handleError(e,t,a,s){this.setState({errorText:e,errorLevel:t,errorAction:a,errorActionText:s,callShouldStart:!1})}handleLoginRequest(e,t){this.setState({loginDisabled:!0,login:e,password:t,loadSpinnerVisible:!0,autoLogin:!0}),this.handleError("",null),this.tinode.isConnected()?this.doLogin(e,t,{meth:this.state.credMethod,resp:this.state.credCode}):this.tinode.connect().catch((e=>{this.setState({loginDisabled:!1,autoLogin:!1,loadSpinnerVisible:!1}),this.handleError(e.message,"err")}))}handlePersistenceChange(e){e?this.tinode.initStorage().then((()=>{pi.setObject("keep-logged-in",!0),this.setState({persist:!0})})):this.tinode.clearStorage().then((()=>{pi.setObject("keep-logged-in",!1),this.setState({persist:!1})}))}handleConnected(){clearInterval(this.reconnectCountdown),this.handleError();const e=this.tinode.getServerInfo();this.setState({serverVersion:e.ver+" "+(e.build?e.build:"none")}),this.state.autoLogin&&this.doLogin(this.state.login,this.state.password,{meth:this.state.credMethod,resp:this.state.credCode})}handleAutoreconnectIteration(e,t){if(clearInterval(this.reconnectCountdown),e<0)return void this.handleError();if(t)return void t.then((()=>{this.handleError()})).catch((e=>{this.handleError(e.message,"err")}));const{formatMessage:a}=this.props.intl;let s=e/1e3;s|=s,this.reconnectCountdown=setInterval((()=>{const e=s>99?Zt(s):s;this.handleError(a(Oi.reconnect_countdown,{seconds:e}),"warn",(e=>{clearInterval(this.reconnectCountdown),this.tinode.reconnect()}),a(Oi.reconnect_now)),s-=1}),1e3)}handleDisconnect(e){this.setState({connected:!1,ready:!1,topicSelectedOnline:!1,errorText:e&&e.message?e.message:"Disconnected",errorLevel:e&&e.message?"err":"warn",loginDisabled:!1,contextMenuVisible:!1,forwardDialogVisible:!1,serverVersion:"no connection"})}doLogin(e,t,a){if(this.tinode.isAuthenticated())return void Js.navigateTo("");a=Ut.Tinode.credential(a);let s=null,i=this.tinode.getAuthToken();e&&t?(i=null,this.setState({password:null}),s=this.tinode.loginBasic(e,t,a)):i&&(s=this.tinode.loginToken(i.token,a)),s?s.then((e=>{e.code>=300&&"validate credentials"===e.text?(this.setState({loadSpinnerVisible:!1}),a&&this.handleError(this.props.intl.formatMessage(Oi.code_doesnot_match),"warn"),this.handleCredentialsRequest(e.params)):this.handleLoginSuccessful()})).catch((e=>{this.setState({loginDisabled:!1,credMethod:void 0,credCode:void 0,loadSpinnerVisible:!1,autoLogin:!1}),this.handleError(e.message,"err"),i&&this.handleLogout(),Js.navigateTo("")})):(Js.navigateTo(""),this.setState({loginDisabled:!1}))}handleCredentialsRequest(e){const t=Js.parseUrlHash(window.location.hash);t.path[0]="cred",t.params.method=e.cred[0],Js.navigateTo(Js.composeUrlHash(t.path,t.params))}handleLoginSuccessful(){this.handleError(),pi.getObject("keep-logged-in")&&pi.setObject("auth-token",this.tinode.getAuthToken());const e=this.state.requestedTopic,t=this.tinode.getMeTopic();t.onMetaDesc=this.tnMeMetaDesc,t.onContactUpdate=this.tnMeContactUpdate,t.onSubsUpdated=this.tnMeSubsUpdated,this.setState({connected:!0,credMethod:void 0,credCode:void 0,myUserId:this.tinode.getCurrentUserID(),autoLogin:!0,requestedTopic:void 0}),t.subscribe(t.startMetaQuery().withLaterSub().withDesc().withTags().withCred().build()).catch((e=>{this.tinode.disconnect(),localStorage.removeItem("auth-token"),this.handleError(e.message,"err"),Js.navigateTo("")})).finally((()=>{this.setState({loadSpinnerVisible:!1})}));let a=Js.setUrlSidePanel(window.location.hash,"contacts");e&&(a=Js.setUrlTopic(a,e)),Js.navigateTo(a)}tnMeMetaDesc(e){if(e){if(e.public&&this.setState({sidePanelTitle:e.public.fn,sidePanelAvatar:ga(e.public.photo)}),e.trusted){const t=[];for(const[a,s]of Object.entries(e.trusted))s&&t.push(a);this.setState({myTrustedBadges:t})}e.acs&&this.setState({incognitoMode:!e.acs.isPresencer()})}}tnMeContactUpdate(e,t){if("on"==e||"off"==e)this.resetContactList(),this.state.topicSelected==t.topic&&this.setState({topicSelectedOnline:"on"==e});else if("read"==e)this.resetContactList();else if("msg"==e){const e=this.tinode.getTopic(t.topic),a=e&&e.isArchived();t.unread>0&&this.state.messageSounds&&!a&&(document.hidden||this.state.topicSelected!=t.topic)&&Li.play(),this.resetContactList()}else"recv"==e||("gone"==e||"unsub"==e?(this.state.topicSelected==t.topic&&this.handleTopicSelected(null),this.resetContactList()):"acs"==e?this.state.topicSelected==t.topic&&this.setState({topicSelectedAcs:t.acs}):"del"==e||"upd"==e||console.info("Unsupported (yet) presence update:"+e+" in: "+t.topic))}tnMeSubsUpdated(e){this.resetContactList()}static prepareSearchableContacts(e,t){const a={};for(const t of e)Ut.Tinode.isP2PTopicName(t.topic)&&(a[t.topic]={user:t.topic,updated:t.updated,public:t.public,private:t.private,acs:t.acs});for(const e of t)a[e.user]||(a[e.user]=e);return Object.values(a)}resetContactList(){const e={chatList:[]};this.state.ready||(e.ready=!0),this.tinode.getMeTopic().contacts((t=>{t.topic||t.user||(t.topic=t.name),e.chatList.push(t),this.state.topicSelected==t.topic&&(e.topicSelectedOnline=t.online,e.topicSelectedAcs=t.acs)}));const t=new Date(0);e.chatList.sort(((e,a)=>(e.touched||t).getTime()-(a.touched||t).getTime())),e.searchableContacts=qi.prepareSearchableContacts(e.chatList,this.state.searchResults),this.setState(e)}tnData(e){const t=this.tinode.getTopic(e.topic);t.msgStatus(e,!0)>=Ut.Tinode.MESSAGE_STATUS_SENT&&e.from!=this.state.myUserId&&(clearTimeout(this.receivedTimer),this.receivedTimer=setTimeout((()=>{this.receivedTimer=void 0,t.noteRecv(e.seq)}),500))}tnInitFind(){const e=this.tinode.getFndTopic();e.onSubsUpdated=this.tnFndSubsUpdated,e.isSubscribed()?this.tnFndSubsUpdated():e.subscribe(e.startMetaQuery().withSub().build()).catch((e=>{this.handleError(e.message,"err")}))}tnFndSubsUpdated(){const e=[];this.tinode.getFndTopic().contacts((t=>{e.push(t)})),this.setState({searchResults:e,searchableContacts:qi.prepareSearchableContacts(this.state.chatList,e)})}handleSearchContacts(e){const t=this.tinode.getFndTopic();t.setMeta({desc:{public:e}}).then((e=>t.getMeta(t.startMetaQuery().withSub().build()))).catch((e=>{this.handleError(e.message,"err")}))}handleTopicSelected(e){this.state.newTopicParams&&this.state.newTopicParams._topicName!=e&&this.setState({newTopicParams:null}),e?(this.setState({errorText:"",errorLevel:null,mobilePanel:"topic-view",infoPanel:void 0}),this.state.topicSelected!=e&&(this.setState({topicSelectedOnline:this.tinode.isTopicOnline(e),topicSelectedAcs:this.tinode.getTopicAccessMode(e),forwardMessage:null}),Js.navigateTo(Js.setUrlTopic("",e)))):(this.setState({errorText:"",errorLevel:null,mobilePanel:"sidepanel",topicSelectedOnline:!1,topicSelectedAcs:null,infoPanel:void 0,forwardMessage:null}),Js.navigateTo(Js.setUrlTopic("",null)))}handleHideMessagesView(){this.setState({mobilePanel:"sidepanel"}),Js.navigateTo(Js.setUrlTopic(window.location.hash,null))}handleSendMessage(e,t,a,s){const i=this.tinode.getTopic(this.state.topicSelected);return this.sendMessageToTopic(i,e,t,a,s)}sendMessageToTopic(e,t,a,s,i){(t=e.createMessage(t,!1))._uploader=s,i&&(t.head=Object.assign(t.head||{},i));const n=[];if(a&&n.push(a),!e.isSubscribed()){const a=e.subscribe().then((()=>{e.queuedMessages((a=>{a._sending||a.seq==t.seq||e.isSubscribed()&&e.publishMessage(a)}))}));n.push(a)}return e.publishDraft(t,Promise.all(n)).then((t=>(e.isArchived()&&e.archive(!1),t))).catch((e=>{this.handleError(e.message,"err")}))}handleNewChatInvitation(e,t){const a=this.tinode.getTopic(e);let s=null;switch(t){case"accept":const i=a.getAccessMode().getGiven();s=a.setMeta({sub:{mode:i}}),a.isP2PType()&&(s=s.then((t=>{a.setMeta({sub:{user:e,mode:i}})})));break;case"delete":s=a.delTopic(!0);break;case"block":const n=a.getAccessMode().updateWant("-JP").getWant();s=a.setMeta({sub:{mode:n}}).then((e=>this.handleTopicSelected(null)));break;default:console.warn("Unknown invitation action",'"'+t+'""')}null!=s&&s.catch((e=>{this.handleError(e.message,"err")}))}handleNewAccount(){this.handleError(),Js.navigateTo(Js.setUrlSidePanel(window.location.hash,"register"))}handleNewAccountRequest(e,t,a,s,i){this.handleError(),this.tinode.connect(this.state.serverAddress).then((()=>this.tinode.createAccountBasic(e,t,{public:a,tags:i,cred:Ut.Tinode.credential(s)}))).then((e=>{e.code>=300&&"validate credentials"==e.text?this.handleCredentialsRequest(e.params):this.handleLoginSuccessful(this)})).catch((e=>{this.handleError(e.message,"err")}))}handleToggleIncognitoMode(e){this.setState({incognitoMode:null});const t=this.tinode.getMeTopic(),a=t.getAccessMode().updateWant(e?"-P":"+P").getWant();t.setMeta({sub:{mode:a}}).catch((t=>{this.setState({incognitoMode:!e}),this.handleError(t.message,"err")}))}handleUpdateAccountTagsRequest(e){this.tinode.getMeTopic().setMeta({tags:e}).catch((e=>{this.handleError(e.message,"err")}))}handleSettings(){this.handleError(),Js.navigateTo(Js.setUrlSidePanel(window.location.hash,this.state.myUserId?"edit":"settings"))}handleGlobalSettings(e){const t=e.serverAddress||this.state.serverAddress,a=e.transport||this.state.transport;this.tinode&&(this.tinode.clearStorage(),this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.tinode=qi.tnSetup(t,a,this.props.intl.locale,pi.getObject("keep-logged-in")),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,this.setState({serverAddress:t,transport:a}),pi.setObject("settings",{serverAddress:t,transport:a}),Js.navigateTo(Js.setUrlSidePanel(window.location.hash,""))}handleShowArchive(){Js.navigateTo(Js.setUrlSidePanel(window.location.hash,this.state.myUserId?"archive":""))}handleShowBlocked(){Js.navigateTo(Js.setUrlSidePanel(window.location.hash,this.state.myUserId?"blocked":""))}toggleFCMToken(e){e?(this.setState({desktopAlerts:null}),this.state.firebaseToken?(this.setState({desktopAlerts:!0}),pi.getObject("keep-logged-in")&&pi.updateObject("settings",{desktopAlerts:!0})):this.initFCMessaging()):this.state.firebaseToken&&this.fcm?Pt(this.fcm).catch((e=>{console.error("Unable to delete token.",e)})).finally((()=>{pi.updateObject("settings",{desktopAlerts:!1}),localStorage.removeItem("firebase-token"),this.setState({desktopAlerts:!1,firebaseToken:null}),this.tinode.setDeviceToken(null)})):(this.setState({desktopAlerts:!1,firebaseToken:null}),pi.updateObject("settings",{desktopAlerts:!1}))}handleToggleMessageSounds(e){this.setState({messageSounds:e}),pi.updateObject("settings",{messageSoundsOff:!e})}handleCredAdd(e,t){this.tinode.getMeTopic().setMeta({cred:{meth:e,val:t}}).catch((e=>{this.handleError(e.message,"err")}))}handleCredDelete(e,t){this.tinode.getMeTopic().delCredential(e,t).catch((e=>{this.handleError(e.message,"err")}))}handleCredConfirm(e,t){this.handleCredentialsRequest({cred:[e]})}handleSidepanelCancel(){const e=Js.parseUrlHash(window.location.hash);let t="";["security","support","general","notif"].includes(e.path[0])?t="edit":"crop"==e.path[0]?t="general":"blocked"==e.path[0]?t="security":this.state.myUserId&&(t="contacts"),e.path[0]=t,e.params&&(delete e.params.code,delete e.params.method,delete e.params.tab,delete e.params.scheme,delete e.params.token),Js.navigateTo(Js.composeUrlHash(e.path,e.params)),this.setState({errorText:"",errorLevel:null})}basicNavigator(e){Js.navigateTo(Js.setUrlSidePanel(window.location.hash,e))}infoNavigator(e){Js.navigateTo(Js.setUrlInfoPanel(window.location.hash,e))}handleStartTopicRequest(e,t,a){if(e&&this.tinode.isTopicCached(e))return void this.handleTopicSelected(e);const s={};Ut.Tinode.isP2PTopicName(e)?(s.sub={mode:qt},s.desc={defacs:{auth:qt}}):(e=e||this.tinode.newGroupTopicName(a),t&&(s.desc={public:t.public,private:{comment:t.private}},s.tags=t.tags)),s._topicName=e,this.setState({newTopicParams:s},(()=>{this.handleTopicSelected(e)}))}handleNewTopicCreated(e,t){let a={};this.state.callShouldStart&&(a={callState:3,callShouldStart:!1}),this.state.topicSelected==e&&e!=t&&(a.topicSelected=t),this.setState(a,(e=>{Js.navigateTo(Js.setUrlTopic("",t))}))}handleTopicUpdateRequest(e,t,a,s){this.handleError();const i=this.tinode.getTopic(e);if(i){const e={};let n;t&&(t.photo&&(t.photo.ref&&t.photo.ref!=Ut.Tinode.DEL_CHAR?n=[t.photo.ref]:t.photo.data&&t.photo.data!=Ut.Tinode.DEL_CHAR||(t.photo=Ut.Tinode.DEL_CHAR)),e.public=t),"string"==typeof a&&(e.private=a===Ut.Tinode.DEL_CHAR?Ut.Tinode.DEL_CHAR:{comment:a}),s&&(e.defacs=s),i.setMeta({desc:e,attachments:n}).catch((e=>{this.handleError(e.message,"err")}))}}handleUnarchive(e){const t=this.tinode.getTopic(e);t&&t.archive(!1)}handleUpdatePasswordRequest(e){this.handleError(),e&&this.tinode.updateAccountBasic(null,this.tinode.getCurrentLogin(),e).catch((e=>{this.handleError(e.message,"err")}))}handleChangePermissions(e,t,a){const s=this.tinode.getTopic(e);if(s){const e=s.getAccessMode();a?(e.updateGiven(t),t=e.getGiven()):(e.updateWant(t),t=e.getWant()),s.setMeta({sub:{user:a,mode:t}}).catch((e=>{this.handleError(e.message,"err")}))}}handleTagsUpdateRequest(e,t){const a=this.tinode.getTopic(e);a&&a.setMeta({tags:t}).catch((e=>{this.handleError(e.message,"err")}))}handleLogout(){let e;sa(0),localStorage.removeItem("auth-token"),localStorage.removeItem("firebase-token"),localStorage.removeItem("settings"),this.state.firebaseToken&&Pt(this.fcm),clearInterval(this.reconnectCountdown),this.tinode?(e=this.tinode.clearStorage(),this.tinode.onDisconnect=void 0,this.tinode.disconnect()):e=Promose.resolve(),this.setState(this.getBlankState()),e.then((()=>{this.tinode=qi.tnSetup(this.state.serverAddress,this.state.transport,this.props.intl.locale,pi.getObject("keep-logged-in"),(()=>{this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,Js.navigateTo("")}))}))}handleDeleteAccount(){this.tinode.delCurrentUser(!0).then((e=>{this.handleLogout()}))}handleDeleteTopicRequest(e){const t=this.tinode.getTopic(e);t&&t.delTopic(!0).then((e=>{Js.navigateTo(Js.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleDeleteMessagesRequest(e){const t=this.tinode.getTopic(e);t&&t.delMessagesAll(!0).catch((e=>{this.handleError(e.message,"err")}))}handleLeaveUnsubRequest(e){const t=this.tinode.getTopic(e);t&&t.leave(!0).then((e=>{Js.navigateTo(Js.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleBlockTopicRequest(e){const t=this.tinode.getTopic(e);t&&t.updateMode(null,"-JP").then((e=>{Js.navigateTo(Js.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleReportTopic(e){const t=this.tinode.getTopic(e);t&&(this.tinode.report("report",e),t.updateMode(null,"-JP").then((e=>{Js.navigateTo(Js.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")})))}handleShowContextMenu(e,t){this.setState({contextMenuVisible:!0,contextMenuClickAt:{x:e.x,y:e.y},contextMenuParams:e,contextMenuItems:t||this.defaultTopicContextMenu(e.topicName),contextMenuBounds:this.selfRef.current.getBoundingClientRect()})}handleShowForwardDialog(e){"newtpk"==this.state.sidePanelSelected&&this.handleSidepanelCancel();const t="➦ "+e.userName,a="string"==typeof e.content?Ut.Drafty.init(e.content):Ut.Drafty.forwardedContent(e.content),s=Ut.Drafty.preview(a,84,!0),i=Ut.Drafty.append(Ut.Drafty.appendLineBreak(Ut.Drafty.mention(t,e.userFrom)),a),n=Ut.Drafty.quote(t,e.userFrom,s),o={forwarded:e.topicName+":"+e.seq};this.setState({forwardDialogVisible:!0,forwardMessage:{head:o,msg:i,preview:n}})}defaultTopicContextMenu(e){const t=this.tinode.getTopic(e);if(t._deleted)return["topic_delete"];let a=!1,s=!1,i=!1,n=!1,o=!1,r=!1;if(t){n=t.isSubscribed(),r=t.isArchived();const e=t.getAccessMode();e&&(a=e.isMuted(),s=!e.isJoiner(),i=!e.isJoiner("want"),o=e.isDeleter())}return[n?{title:this.props.intl.formatMessage(Oi.menu_item_info),handler:this.handleShowInfoView}:null,n&&Ut.Tinode.isP2PTopicName(e)?{title:this.props.intl.formatMessage(Oi.menu_item_video_call),handler:this.handleStartVideoCall}:null,n?"messages_clear":null,n&&o?"messages_clear_hard":null,a?s?null:"topic_unmute":"topic_mute",i?"topic_unblock":"topic_block",r?"topic_restore":"topic_archive","topic_delete"]}handleHideContextMenu(){this.setState({contextMenuVisible:!1,contextMenuClickAt:null,contextMenuParams:null,contextMenuBounds:null})}handleHideForwardDialog(e){this.setState({forwardDialogVisible:!1,forwardMessage:e?this.state.forwardMessage:null})}handleContextMenuAction(e,t,a){"topic_archive"==e?t&&a.topicName&&a.topicName==this.state.topicSelected&&t.then((()=>{this.handleTopicSelected(null)})):"menu_item_forward"==e&&this.handleShowForwardDialog(a)}handleShowAlert(e,t,a,s,i,n){this.setState({alertVisible:!0,alertParams:{title:e,content:t,onConfirm:a,confirm:s,onReject:i,reject:n}})}handleShowInfoView(){Js.navigateTo(Js.addUrlParam(window.location.hash,"info","info")),this.setState({infoPanel:"info"})}handleMemberUpdateRequest(e,t,a){if(!e)return;const s=this.tinode.getTopic(e);s&&(t&&t.length>0&&t.map((e=>{s.invite(e,null).catch((e=>{this.handleError(e.message,"err")}))})),a&&a.length>0&&a.map((e=>{s.delSubscription(e).catch((e=>{this.handleError(e.message,"err")}))})))}handleValidateCredentialsRequest(e,t){if(this.tinode.isAuthenticated()){this.tinode.getMeTopic().setMeta({cred:{meth:e,resp:t}}).then((()=>{Js.navigateTo("")})).catch((e=>{this.handleError(e.message,"err")}))}else this.setState({credMethod:e,credCode:t}),this.doLogin(null,null,{meth:e,resp:t})}handlePasswordResetRequest(e,t){return this.tinode.connect().then((()=>this.tinode.requestResetAuthSecret("basic",e,t))).catch((e=>{this.handleError(e.message,"err")}))}handleResetPassword(e,t,a){(a=function(e){if(e){e=e.replace(/-/g,"+").replace(/_/g,"/");try{e=btoa(atob(e))}catch(t){console.error("Failed to base64 re-encode string.",t),e=null}}return e}(a))?this.tinode.connect().then((()=>this.tinode.updateAccountBasic(null,null,t,{token:a}))).then((()=>{Js.navigateTo("")})).catch((e=>{this.handleError(e.message,"err")})):this.handleError(this.props.intl.formatMessage(Oi.invalid_security_token),"err")}handleStartVideoCall(){this.setState({callTopic:this.state.topicSelected,callState:1})}handleCallInvite(e,t,a){switch(a){case 1:let a={webrtc:"started"};this.handleSendMessage(Ut.Drafty.videoCall(),void 0,void 0,a).then((e=>{e.code<200||e.code>=300||!e.params||!e.params.seq?this.handleCallClose():this.setState({callSeq:e.params.seq})}));break;case 3:const s=this.tinode.getTopic(e);if(!s)return;s.videoCall("accept",t)}}handleCallRinging(e,t){const a=this.tinode.getTopic(e);a&&a.videoCall("ringing",t)}handleCallHangup(e,t){const a=this.tinode.getTopic(e);a&&a.videoCall("hang-up",t)}handleCallSendOffer(e,t,a){const s=this.tinode.getTopic(e);s&&s.videoCall("offer",t,a)}handleCallIceCandidate(e,t,a){const s=this.tinode.getTopic(e);s&&s.videoCall("ice-candidate",t,a)}handleCallSendAnswer(e,t,a){const s=this.tinode.getTopic(e);s&&s.videoCall("answer",t,a)}handleCallClose(){this.state.callTimeout&&(console.log("closing call timeout ",this.state.callTimeout),clearTimeout(this.state.callTimeout)),this.setState({callTopic:void 0,callState:0})}handleCallAcceptCall(e){const t=this.tinode.getTopic(e);t&&(t.isSubscribed()?(this.handleTopicSelected(this.state.callTopic),this.setState({callState:3})):this.setState({callShouldStart:!0},(()=>this.handleTopicSelected(this.state.callTopic))))}handleInfoMessage(e){if("call"==e.what)switch(e.event){case"invite":e.from!=this.state.myUserId&&this.setState({callTopic:e.src,callState:2,callSeq:e.seq});break;case"accept":if(console.log("TinodeWeb: received accept msg ",e),Ut.Tinode.isMeTopicName(e.topic)&&this.tinode.isMe(e.from))return void this.setState({callTopic:null,callState:0,callSeq:null});e.topic==this.state.callTopic&&this.setState({callState:3});break;case"hang-up":this.handleCallClose()}}render(){return t().createElement("div",{id:"app-container",ref:this.selfRef},this.state.contextMenuVisible?t().createElement(Yt,{tinode:this.tinode,bounds:this.state.contextMenuBounds,clickAt:this.state.contextMenuClickAt,params:this.state.contextMenuParams,items:this.state.contextMenuItems,hide:this.handleHideContextMenu,onShowAlert:this.handleShowAlert,onAction:this.handleContextMenuAction,onTopicRemoved:e=>{e==this.state.topicSelected&&this.handleTopicSelected(null)},onError:this.handleError}):null,this.state.forwardDialogVisible?t().createElement(Wa,{tinode:this.tinode,contacts:this.state.chatList,topicSelected:this.state.topicSelected,myUserId:this.state.myUserId,hide:this.handleHideForwardDialog,onInitFind:this.tnInitFind,searchResults:this.state.searchResults,onSearchContacts:this.handleSearchContacts,onTopicSelected:this.handleStartTopicRequest}):null,this.state.callTopic&&2==this.state.callState?t().createElement(Ja,{tinode:this.tinode,onClose:this.handleCallClose,topic:this.state.callTopic,seq:this.state.callSeq,callState:this.state.callState,onRinging:this.handleCallRinging,onAcceptCall:this.handleCallAcceptCall,onReject:this.handleCallHangup}):null,t().createElement(Rt,{visible:this.state.alertVisible,title:this.state.alertParams.title,content:this.state.alertParams.content,onReject:this.state.alertParams.onReject?()=>{this.setState({alertVisible:!1})}:null,reject:this.state.alertParams.reject,onConfirm:()=>{this.setState({alertVisible:!1}),this.state.alertParams.onConfirm()},confirm:this.state.alertParams.confirm}),t().createElement(Fi,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,hideSelf:this.state.displayMobile&&"sidepanel"!==this.state.mobilePanel,state:this.state.sidePanelSelected,title:this.state.sidePanelTitle,avatar:this.state.sidePanelAvatar,trustedBadges:this.state.myTrustedBadges,login:this.state.login,persist:this.state.persist,myUserId:this.state.myUserId,loginDisabled:this.state.loginDisabled,loadSpinnerVisible:this.state.loadSpinnerVisible,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,topicSelected:this.state.topicSelected,chatList:this.state.chatList,credMethod:this.state.credMethod,credCode:this.state.credCode,transport:this.state.transport,messageSounds:this.state.messageSounds,desktopAlerts:this.state.desktopAlerts,desktopAlertsEnabled:this.state.desktopAlertsEnabled,incognitoMode:this.state.incognitoMode,serverAddress:this.state.serverAddress,serverVersion:this.state.serverVersion,onGlobalSettings:this.handleGlobalSettings,onSignUp:this.handleNewAccount,onSettings:this.handleSettings,onNavigate:this.basicNavigator,onLoginRequest:this.handleLoginRequest,onPersistenceChange:this.handlePersistenceChange,onCreateAccount:this.handleNewAccountRequest,onUpdateAccountDesc:this.handleTopicUpdateRequest,onUpdatePassword:this.handleUpdatePasswordRequest,onUpdateAccountTags:this.handleUpdateAccountTagsRequest,onTogglePushNotifications:this.toggleFCMToken,onToggleMessageSounds:this.handleToggleMessageSounds,onToggleIncognitoMode:this.handleToggleIncognitoMode,onCredAdd:this.handleCredAdd,onCredDelete:this.handleCredDelete,onCredConfirm:this.handleCredConfirm,onTopicSelected:this.handleTopicSelected,onCreateTopic:this.handleStartTopicRequest,onLogout:this.handleLogout,onDeleteAccount:this.handleDeleteAccount,onShowAlert:this.handleShowAlert,onCancel:this.handleSidepanelCancel,onError:this.handleError,onValidateCredentials:this.handleValidateCredentialsRequest,onPasswordResetRequest:this.handlePasswordResetRequest,onResetPassword:this.handleResetPassword,onShowArchive:this.handleShowArchive,onShowBlocked:this.handleShowBlocked,onInitFind:this.tnInitFind,searchResults:this.state.searchResults,onSearchContacts:this.handleSearchContacts,showContextMenu:this.handleShowContextMenu}),t().createElement(si,{tinode:this.tinode,connected:this.state.connected,ready:this.state.ready,online:this.state.topicSelectedOnline,acs:this.state.topicSelectedAcs,displayMobile:this.state.displayMobile,viewportWidth:this.state.viewportWidth,viewportHeight:this.state.viewportHeight,hideSelf:this.state.displayMobile&&("topic-view"!==this.state.mobilePanel||this.state.infoPanel),topic:this.state.topicSelected,myUserId:this.state.myUserId,myUserName:this.state.sidePanelTitle,serverVersion:this.state.serverVersion,serverAddress:this.state.serverAddress,applicationVisible:this.state.applicationVisible,forwardMessage:this.state.forwardMessage,onCancelForwardMessage:this.handleHideForwardDialog,callTopic:this.state.callTopic,callSeq:this.state.callSeq,callState:this.state.callState,onCallHangup:this.handleCallHangup,onCallInvite:this.handleCallInvite,onCallSendOffer:this.handleCallSendOffer,onCallIceCandidate:this.handleCallIceCandidate,onCallSendAnswer:this.handleCallSendAnswer,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,newTopicParams:this.state.newTopicParams,onHideMessagesView:this.handleHideMessagesView,onData:this.tnData,onError:this.handleError,onNewTopicCreated:this.handleNewTopicCreated,showContextMenu:this.handleShowContextMenu,onChangePermissions:this.handleChangePermissions,onNewChat:this.handleNewChatInvitation,sendMessage:this.handleSendMessage,onVideoCallClosed:this.handleCallClose}),this.state.infoPanel?t().createElement(Es,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,topic:this.state.topicSelected,searchableContacts:this.state.searchableContacts,myUserId:this.state.myUserId,panel:this.state.infoPanel,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,onNavigate:this.infoNavigator,onTopicDescUpdateRequest:this.handleTopicUpdateRequest,onShowAlert:this.handleShowAlert,onChangePermissions:this.handleChangePermissions,onMemberUpdateRequest:this.handleMemberUpdateRequest,onDeleteTopic:this.handleDeleteTopicRequest,onDeleteMessages:this.handleDeleteMessagesRequest,onLeaveTopic:this.handleLeaveUnsubRequest,onBlockTopic:this.handleBlockTopicRequest,onReportTopic:this.handleReportTopic,onAddMember:this.handleManageGroupMembers,onTopicTagsUpdateRequest:this.handleTagsUpdateRequest,onTopicUnArchive:this.handleUnarchive,onInitFind:this.tnInitFind,onError:this.handleError,showContextMenu:this.handleShowContextMenu}):null)}}const ji=(0,n.injectIntl)(qi),{params:zi}=Js.parseUrlHash(window.location.hash),Hi=zi&&zi.hl||navigator.languages&&navigator.languages[0]||navigator.language||navigator.userLanguage||"en",Vi=Hi.toLowerCase().split(/[-_]/)[0],Wi=o[Hi]?Hi:o[Vi]?Vi:"en",Ki=o[Wi];document.getElementsByTagName("html")[0].setAttribute("lang",Wi),i().render(t().createElement(t().StrictMode,null,t().createElement(n.IntlProvider,{locale:Hi,messages:Ki,textComponent:t().Fragment},t().createElement(ji,null))),document.getElementById("mountPoint"))})()})(); //# sourceMappingURL=index.prod.js.map \ No newline at end of file diff --git a/umd/index.prod.js.map b/umd/index.prod.js.map index 69af9785..64d4585c 100644 --- a/umd/index.prod.js.map +++ b/umd/index.prod.js.map @@ -1 +1 @@ -{"version":3,"file":"index.prod.js","mappings":"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","sources":["webpack://tinode-webapp/./node_modules/fix-webm-duration/fix-webm-duration.js","webpack://tinode-webapp/webpack/bootstrap","webpack://tinode-webapp/webpack/runtime/compat get default export","webpack://tinode-webapp/webpack/runtime/define property getters","webpack://tinode-webapp/webpack/runtime/global","webpack://tinode-webapp/webpack/runtime/hasOwnProperty shorthand","webpack://tinode-webapp/external var \"React\"","webpack://tinode-webapp/external var \"ReactDOM\"","webpack://tinode-webapp/external var \"ReactIntl\"","webpack://tinode-webapp/./node_modules/@firebase/util/dist/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/component/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/logger/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/app/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/firebase/app/dist/index.esm.js","webpack://tinode-webapp/./node_modules/@firebase/installations/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/messaging/dist/esm/index.esm2017.js","webpack://tinode-webapp/external var \"Tinode\"","webpack://tinode-webapp/./src/widgets/alert.jsx","webpack://tinode-webapp/./src/version.js","webpack://tinode-webapp/./src/config.js","webpack://tinode-webapp/./src/widgets/context-menu.jsx","webpack://tinode-webapp/./src/widgets/contact-badges.jsx","webpack://tinode-webapp/./src/lib/strformat.js","webpack://tinode-webapp/./src/lib/utils.js","webpack://tinode-webapp/./src/widgets/letter-tile.jsx","webpack://tinode-webapp/./src/widgets/unread-badge.jsx","webpack://tinode-webapp/./src/lib/blob-helpers.js","webpack://tinode-webapp/./src/widgets/audio-player.jsx","webpack://tinode-webapp/./src/widgets/call-message.jsx","webpack://tinode-webapp/./src/widgets/call-status.jsx","webpack://tinode-webapp/./src/widgets/lazy-image.jsx","webpack://tinode-webapp/./src/widgets/file-progress.jsx","webpack://tinode-webapp/./src/widgets/uploading-image.jsx","webpack://tinode-webapp/./src/lib/formatters.js","webpack://tinode-webapp/./src/widgets/contact.jsx","webpack://tinode-webapp/./src/widgets/contact-action.jsx","webpack://tinode-webapp/./src/widgets/contact-list.jsx","webpack://tinode-webapp/./src/widgets/search-contacts.jsx","webpack://tinode-webapp/./src/widgets/forward-dialog.jsx","webpack://tinode-webapp/./src/widgets/badge-list.jsx","webpack://tinode-webapp/./src/widgets/call-incoming.jsx","webpack://tinode-webapp/./src/constants.js","webpack://tinode-webapp/./src/widgets/load-spinner.jsx","webpack://tinode-webapp/./src/widgets/avatar-upload.jsx","webpack://tinode-webapp/./src/widgets/checkbox.jsx","webpack://tinode-webapp/./src/widgets/menu-cancel.jsx","webpack://tinode-webapp/./src/widgets/error-panel.jsx","webpack://tinode-webapp/./src/widgets/chip.jsx","webpack://tinode-webapp/./src/widgets/chip-input.jsx","webpack://tinode-webapp/./src/widgets/group-manager.jsx","webpack://tinode-webapp/./src/widgets/permissions-editor.jsx","webpack://tinode-webapp/./src/widgets/cropper.jsx","webpack://tinode-webapp/./src/widgets/avatar-crop.jsx","webpack://tinode-webapp/./src/widgets/visible-password.jsx","webpack://tinode-webapp/./src/widgets/in-place-edit.jsx","webpack://tinode-webapp/./src/widgets/tag-manager.jsx","webpack://tinode-webapp/./src/widgets/topic-desc-edit.jsx","webpack://tinode-webapp/./src/widgets/topic-common.jsx","webpack://tinode-webapp/./src/widgets/topic-security.jsx","webpack://tinode-webapp/./src/views/info-view.jsx","webpack://tinode-webapp/./src/widgets/call-panel.jsx","webpack://tinode-webapp/./src/widgets/attachment.jsx","webpack://tinode-webapp/./src/widgets/received-marker.jsx","webpack://tinode-webapp/./src/widgets/chat-message.jsx","webpack://tinode-webapp/./src/widgets/audio-recorder.jsx","webpack://tinode-webapp/./src/widgets/send-message.jsx","webpack://tinode-webapp/./src/widgets/doc-preview.jsx","webpack://tinode-webapp/./src/widgets/group-subs.jsx","webpack://tinode-webapp/./src/widgets/image-preview.jsx","webpack://tinode-webapp/./src/widgets/invitation.jsx","webpack://tinode-webapp/./src/views/logo-view.jsx","webpack://tinode-webapp/./src/widgets/meta-message.jsx","webpack://tinode-webapp/./src/lib/navigation.js","webpack://tinode-webapp/./src/views/messages-view.jsx","webpack://tinode-webapp/./src/widgets/button-back.jsx","webpack://tinode-webapp/./src/widgets/menu-contacts.jsx","webpack://tinode-webapp/./src/widgets/menu-start.jsx","webpack://tinode-webapp/./src/widgets/side-navbar.jsx","webpack://tinode-webapp/./src/views/account-settings-view.jsx","webpack://tinode-webapp/./src/views/contacts-view.jsx","webpack://tinode-webapp/./src/lib/local-storage.js","webpack://tinode-webapp/./src/views/create-account-view.jsx","webpack://tinode-webapp/./src/views/acc-notifications-view.jsx","webpack://tinode-webapp/./src/views/acc-security-view.jsx","webpack://tinode-webapp/./src/views/acc-support-view.jsx","webpack://tinode-webapp/./src/views/login-view.jsx","webpack://tinode-webapp/./src/widgets/new-topic-by-id.jsx","webpack://tinode-webapp/./src/widgets/new-topic-group.jsx","webpack://tinode-webapp/./src/views/new-topic-view.jsx","webpack://tinode-webapp/./src/views/password-reset-view.jsx","webpack://tinode-webapp/./src/widgets/host-selector.jsx","webpack://tinode-webapp/./src/views/settings-view.jsx","webpack://tinode-webapp/./src/views/validation-view.jsx","webpack://tinode-webapp/./src/views/sidepanel-view.jsx","webpack://tinode-webapp/./src/lib/host-name.js","webpack://tinode-webapp/./src/views/tinode-web.jsx","webpack://tinode-webapp/./src/index.js"],"sourcesContent":["(function (name, definition) {\r\n if (typeof define === 'function' && define.amd) { // RequireJS / AMD\r\n define(definition);\r\n } else if (typeof module !== 'undefined' && module.exports) { // CommonJS / Node.js\r\n module.exports = definition();\r\n } else { // Direct include\r\n window.ysFixWebmDuration = definition();\r\n }\r\n})('fix-webm-duration', function () {\r\n /*\r\n * This is the list of possible WEBM file sections by their IDs.\r\n * Possible types: Container, Binary, Uint, Int, String, Float, Date\r\n */\r\n var sections = {\r\n 0xa45dfa3: { name: 'EBML', type: 'Container' },\r\n 0x286: { name: 'EBMLVersion', type: 'Uint' },\r\n 0x2f7: { name: 'EBMLReadVersion', type: 'Uint' },\r\n 0x2f2: { name: 'EBMLMaxIDLength', type: 'Uint' },\r\n 0x2f3: { name: 'EBMLMaxSizeLength', type: 'Uint' },\r\n 0x282: { name: 'DocType', type: 'String' },\r\n 0x287: { name: 'DocTypeVersion', type: 'Uint' },\r\n 0x285: { name: 'DocTypeReadVersion', type: 'Uint' },\r\n 0x6c: { name: 'Void', type: 'Binary' },\r\n 0x3f: { name: 'CRC-32', type: 'Binary' },\r\n 0xb538667: { name: 'SignatureSlot', type: 'Container' },\r\n 0x3e8a: { name: 'SignatureAlgo', type: 'Uint' },\r\n 0x3e9a: { name: 'SignatureHash', type: 'Uint' },\r\n 0x3ea5: { name: 'SignaturePublicKey', type: 'Binary' },\r\n 0x3eb5: { name: 'Signature', type: 'Binary' },\r\n 0x3e5b: { name: 'SignatureElements', type: 'Container' },\r\n 0x3e7b: { name: 'SignatureElementList', type: 'Container' },\r\n 0x2532: { name: 'SignedElement', type: 'Binary' },\r\n 0x8538067: { name: 'Segment', type: 'Container' },\r\n 0x14d9b74: { name: 'SeekHead', type: 'Container' },\r\n 0xdbb: { name: 'Seek', type: 'Container' },\r\n 0x13ab: { name: 'SeekID', type: 'Binary' },\r\n 0x13ac: { name: 'SeekPosition', type: 'Uint' },\r\n 0x549a966: { name: 'Info', type: 'Container' },\r\n 0x33a4: { name: 'SegmentUID', type: 'Binary' },\r\n 0x3384: { name: 'SegmentFilename', type: 'String' },\r\n 0x1cb923: { name: 'PrevUID', type: 'Binary' },\r\n 0x1c83ab: { name: 'PrevFilename', type: 'String' },\r\n 0x1eb923: { name: 'NextUID', type: 'Binary' },\r\n 0x1e83bb: { name: 'NextFilename', type: 'String' },\r\n 0x444: { name: 'SegmentFamily', type: 'Binary' },\r\n 0x2924: { name: 'ChapterTranslate', type: 'Container' },\r\n 0x29fc: { name: 'ChapterTranslateEditionUID', type: 'Uint' },\r\n 0x29bf: { name: 'ChapterTranslateCodec', type: 'Uint' },\r\n 0x29a5: { name: 'ChapterTranslateID', type: 'Binary' },\r\n 0xad7b1: { name: 'TimecodeScale', type: 'Uint' },\r\n 0x489: { name: 'Duration', type: 'Float' },\r\n 0x461: { name: 'DateUTC', type: 'Date' },\r\n 0x3ba9: { name: 'Title', type: 'String' },\r\n 0xd80: { name: 'MuxingApp', type: 'String' },\r\n 0x1741: { name: 'WritingApp', type: 'String' },\r\n // 0xf43b675: { name: 'Cluster', type: 'Container' },\r\n 0x67: { name: 'Timecode', type: 'Uint' },\r\n 0x1854: { name: 'SilentTracks', type: 'Container' },\r\n 0x18d7: { name: 'SilentTrackNumber', type: 'Uint' },\r\n 0x27: { name: 'Position', type: 'Uint' },\r\n 0x2b: { name: 'PrevSize', type: 'Uint' },\r\n 0x23: { name: 'SimpleBlock', type: 'Binary' },\r\n 0x20: { name: 'BlockGroup', type: 'Container' },\r\n 0x21: { name: 'Block', type: 'Binary' },\r\n 0x22: { name: 'BlockVirtual', type: 'Binary' },\r\n 0x35a1: { name: 'BlockAdditions', type: 'Container' },\r\n 0x26: { name: 'BlockMore', type: 'Container' },\r\n 0x6e: { name: 'BlockAddID', type: 'Uint' },\r\n 0x25: { name: 'BlockAdditional', type: 'Binary' },\r\n 0x1b: { name: 'BlockDuration', type: 'Uint' },\r\n 0x7a: { name: 'ReferencePriority', type: 'Uint' },\r\n 0x7b: { name: 'ReferenceBlock', type: 'Int' },\r\n 0x7d: { name: 'ReferenceVirtual', type: 'Int' },\r\n 0x24: { name: 'CodecState', type: 'Binary' },\r\n 0x35a2: { name: 'DiscardPadding', type: 'Int' },\r\n 0xe: { name: 'Slices', type: 'Container' },\r\n 0x68: { name: 'TimeSlice', type: 'Container' },\r\n 0x4c: { name: 'LaceNumber', type: 'Uint' },\r\n 0x4d: { name: 'FrameNumber', type: 'Uint' },\r\n 0x4b: { name: 'BlockAdditionID', type: 'Uint' },\r\n 0x4e: { name: 'Delay', type: 'Uint' },\r\n 0x4f: { name: 'SliceDuration', type: 'Uint' },\r\n 0x48: { name: 'ReferenceFrame', type: 'Container' },\r\n 0x49: { name: 'ReferenceOffset', type: 'Uint' },\r\n 0x4a: { name: 'ReferenceTimeCode', type: 'Uint' },\r\n 0x2f: { name: 'EncryptedBlock', type: 'Binary' },\r\n 0x654ae6b: { name: 'Tracks', type: 'Container' },\r\n 0x2e: { name: 'TrackEntry', type: 'Container' },\r\n 0x57: { name: 'TrackNumber', type: 'Uint' },\r\n 0x33c5: { name: 'TrackUID', type: 'Uint' },\r\n 0x3: { name: 'TrackType', type: 'Uint' },\r\n 0x39: { name: 'FlagEnabled', type: 'Uint' },\r\n 0x8: { name: 'FlagDefault', type: 'Uint' },\r\n 0x15aa: { name: 'FlagForced', type: 'Uint' },\r\n 0x1c: { name: 'FlagLacing', type: 'Uint' },\r\n 0x2de7: { name: 'MinCache', type: 'Uint' },\r\n 0x2df8: { name: 'MaxCache', type: 'Uint' },\r\n 0x3e383: { name: 'DefaultDuration', type: 'Uint' },\r\n 0x34e7a: { name: 'DefaultDecodedFieldDuration', type: 'Uint' },\r\n 0x3314f: { name: 'TrackTimecodeScale', type: 'Float' },\r\n 0x137f: { name: 'TrackOffset', type: 'Int' },\r\n 0x15ee: { name: 'MaxBlockAdditionID', type: 'Uint' },\r\n 0x136e: { name: 'Name', type: 'String' },\r\n 0x2b59c: { name: 'Language', type: 'String' },\r\n 0x6: { name: 'CodecID', type: 'String' },\r\n 0x23a2: { name: 'CodecPrivate', type: 'Binary' },\r\n 0x58688: { name: 'CodecName', type: 'String' },\r\n 0x3446: { name: 'AttachmentLink', type: 'Uint' },\r\n 0x1a9697: { name: 'CodecSettings', type: 'String' },\r\n 0x1b4040: { name: 'CodecInfoURL', type: 'String' },\r\n 0x6b240: { name: 'CodecDownloadURL', type: 'String' },\r\n 0x2a: { name: 'CodecDecodeAll', type: 'Uint' },\r\n 0x2fab: { name: 'TrackOverlay', type: 'Uint' },\r\n 0x16aa: { name: 'CodecDelay', type: 'Uint' },\r\n 0x16bb: { name: 'SeekPreRoll', type: 'Uint' },\r\n 0x2624: { name: 'TrackTranslate', type: 'Container' },\r\n 0x26fc: { name: 'TrackTranslateEditionUID', type: 'Uint' },\r\n 0x26bf: { name: 'TrackTranslateCodec', type: 'Uint' },\r\n 0x26a5: { name: 'TrackTranslateTrackID', type: 'Binary' },\r\n 0x60: { name: 'Video', type: 'Container' },\r\n 0x1a: { name: 'FlagInterlaced', type: 'Uint' },\r\n 0x13b8: { name: 'StereoMode', type: 'Uint' },\r\n 0x13c0: { name: 'AlphaMode', type: 'Uint' },\r\n 0x13b9: { name: 'OldStereoMode', type: 'Uint' },\r\n 0x30: { name: 'PixelWidth', type: 'Uint' },\r\n 0x3a: { name: 'PixelHeight', type: 'Uint' },\r\n 0x14aa: { name: 'PixelCropBottom', type: 'Uint' },\r\n 0x14bb: { name: 'PixelCropTop', type: 'Uint' },\r\n 0x14cc: { name: 'PixelCropLeft', type: 'Uint' },\r\n 0x14dd: { name: 'PixelCropRight', type: 'Uint' },\r\n 0x14b0: { name: 'DisplayWidth', type: 'Uint' },\r\n 0x14ba: { name: 'DisplayHeight', type: 'Uint' },\r\n 0x14b2: { name: 'DisplayUnit', type: 'Uint' },\r\n 0x14b3: { name: 'AspectRatioType', type: 'Uint' },\r\n 0xeb524: { name: 'ColourSpace', type: 'Binary' },\r\n 0xfb523: { name: 'GammaValue', type: 'Float' },\r\n 0x383e3: { name: 'FrameRate', type: 'Float' },\r\n 0x61: { name: 'Audio', type: 'Container' },\r\n 0x35: { name: 'SamplingFrequency', type: 'Float' },\r\n 0x38b5: { name: 'OutputSamplingFrequency', type: 'Float' },\r\n 0x1f: { name: 'Channels', type: 'Uint' },\r\n 0x3d7b: { name: 'ChannelPositions', type: 'Binary' },\r\n 0x2264: { name: 'BitDepth', type: 'Uint' },\r\n 0x62: { name: 'TrackOperation', type: 'Container' },\r\n 0x63: { name: 'TrackCombinePlanes', type: 'Container' },\r\n 0x64: { name: 'TrackPlane', type: 'Container' },\r\n 0x65: { name: 'TrackPlaneUID', type: 'Uint' },\r\n 0x66: { name: 'TrackPlaneType', type: 'Uint' },\r\n 0x69: { name: 'TrackJoinBlocks', type: 'Container' },\r\n 0x6d: { name: 'TrackJoinUID', type: 'Uint' },\r\n 0x40: { name: 'TrickTrackUID', type: 'Uint' },\r\n 0x41: { name: 'TrickTrackSegmentUID', type: 'Binary' },\r\n 0x46: { name: 'TrickTrackFlag', type: 'Uint' },\r\n 0x47: { name: 'TrickMasterTrackUID', type: 'Uint' },\r\n 0x44: { name: 'TrickMasterTrackSegmentUID', type: 'Binary' },\r\n 0x2d80: { name: 'ContentEncodings', type: 'Container' },\r\n 0x2240: { name: 'ContentEncoding', type: 'Container' },\r\n 0x1031: { name: 'ContentEncodingOrder', type: 'Uint' },\r\n 0x1032: { name: 'ContentEncodingScope', type: 'Uint' },\r\n 0x1033: { name: 'ContentEncodingType', type: 'Uint' },\r\n 0x1034: { name: 'ContentCompression', type: 'Container' },\r\n 0x254: { name: 'ContentCompAlgo', type: 'Uint' },\r\n 0x255: { name: 'ContentCompSettings', type: 'Binary' },\r\n 0x1035: { name: 'ContentEncryption', type: 'Container' },\r\n 0x7e1: { name: 'ContentEncAlgo', type: 'Uint' },\r\n 0x7e2: { name: 'ContentEncKeyID', type: 'Binary' },\r\n 0x7e3: { name: 'ContentSignature', type: 'Binary' },\r\n 0x7e4: { name: 'ContentSigKeyID', type: 'Binary' },\r\n 0x7e5: { name: 'ContentSigAlgo', type: 'Uint' },\r\n 0x7e6: { name: 'ContentSigHashAlgo', type: 'Uint' },\r\n 0xc53bb6b: { name: 'Cues', type: 'Container' },\r\n 0x3b: { name: 'CuePoint', type: 'Container' },\r\n 0x33: { name: 'CueTime', type: 'Uint' },\r\n 0x37: { name: 'CueTrackPositions', type: 'Container' },\r\n 0x77: { name: 'CueTrack', type: 'Uint' },\r\n 0x71: { name: 'CueClusterPosition', type: 'Uint' },\r\n 0x70: { name: 'CueRelativePosition', type: 'Uint' },\r\n 0x32: { name: 'CueDuration', type: 'Uint' },\r\n 0x1378: { name: 'CueBlockNumber', type: 'Uint' },\r\n 0x6a: { name: 'CueCodecState', type: 'Uint' },\r\n 0x5b: { name: 'CueReference', type: 'Container' },\r\n 0x16: { name: 'CueRefTime', type: 'Uint' },\r\n 0x17: { name: 'CueRefCluster', type: 'Uint' },\r\n 0x135f: { name: 'CueRefNumber', type: 'Uint' },\r\n 0x6b: { name: 'CueRefCodecState', type: 'Uint' },\r\n 0x941a469: { name: 'Attachments', type: 'Container' },\r\n 0x21a7: { name: 'AttachedFile', type: 'Container' },\r\n 0x67e: { name: 'FileDescription', type: 'String' },\r\n 0x66e: { name: 'FileName', type: 'String' },\r\n 0x660: { name: 'FileMimeType', type: 'String' },\r\n 0x65c: { name: 'FileData', type: 'Binary' },\r\n 0x6ae: { name: 'FileUID', type: 'Uint' },\r\n 0x675: { name: 'FileReferral', type: 'Binary' },\r\n 0x661: { name: 'FileUsedStartTime', type: 'Uint' },\r\n 0x662: { name: 'FileUsedEndTime', type: 'Uint' },\r\n 0x43a770: { name: 'Chapters', type: 'Container' },\r\n 0x5b9: { name: 'EditionEntry', type: 'Container' },\r\n 0x5bc: { name: 'EditionUID', type: 'Uint' },\r\n 0x5bd: { name: 'EditionFlagHidden', type: 'Uint' },\r\n 0x5db: { name: 'EditionFlagDefault', type: 'Uint' },\r\n 0x5dd: { name: 'EditionFlagOrdered', type: 'Uint' },\r\n 0x36: { name: 'ChapterAtom', type: 'Container' },\r\n 0x33c4: { name: 'ChapterUID', type: 'Uint' },\r\n 0x1654: { name: 'ChapterStringUID', type: 'String' },\r\n 0x11: { name: 'ChapterTimeStart', type: 'Uint' },\r\n 0x12: { name: 'ChapterTimeEnd', type: 'Uint' },\r\n 0x18: { name: 'ChapterFlagHidden', type: 'Uint' },\r\n 0x598: { name: 'ChapterFlagEnabled', type: 'Uint' },\r\n 0x2e67: { name: 'ChapterSegmentUID', type: 'Binary' },\r\n 0x2ebc: { name: 'ChapterSegmentEditionUID', type: 'Uint' },\r\n 0x23c3: { name: 'ChapterPhysicalEquiv', type: 'Uint' },\r\n 0xf: { name: 'ChapterTrack', type: 'Container' },\r\n 0x9: { name: 'ChapterTrackNumber', type: 'Uint' },\r\n 0x0: { name: 'ChapterDisplay', type: 'Container' },\r\n 0x5: { name: 'ChapString', type: 'String' },\r\n 0x37c: { name: 'ChapLanguage', type: 'String' },\r\n 0x37e: { name: 'ChapCountry', type: 'String' },\r\n 0x2944: { name: 'ChapProcess', type: 'Container' },\r\n 0x2955: { name: 'ChapProcessCodecID', type: 'Uint' },\r\n 0x50d: { name: 'ChapProcessPrivate', type: 'Binary' },\r\n 0x2911: { name: 'ChapProcessCommand', type: 'Container' },\r\n 0x2922: { name: 'ChapProcessTime', type: 'Uint' },\r\n 0x2933: { name: 'ChapProcessData', type: 'Binary' },\r\n 0x254c367: { name: 'Tags', type: 'Container' },\r\n 0x3373: { name: 'Tag', type: 'Container' },\r\n 0x23c0: { name: 'Targets', type: 'Container' },\r\n 0x28ca: { name: 'TargetTypeValue', type: 'Uint' },\r\n 0x23ca: { name: 'TargetType', type: 'String' },\r\n 0x23c5: { name: 'TagTrackUID', type: 'Uint' },\r\n 0x23c9: { name: 'TagEditionUID', type: 'Uint' },\r\n 0x23c4: { name: 'TagChapterUID', type: 'Uint' },\r\n 0x23c6: { name: 'TagAttachmentUID', type: 'Uint' },\r\n 0x27c8: { name: 'SimpleTag', type: 'Container' },\r\n 0x5a3: { name: 'TagName', type: 'String' },\r\n 0x47a: { name: 'TagLanguage', type: 'String' },\r\n 0x484: { name: 'TagDefault', type: 'Uint' },\r\n 0x487: { name: 'TagString', type: 'String' },\r\n 0x485: { name: 'TagBinary', type: 'Binary' }\r\n };\r\n\r\n function doInherit(newClass, baseClass) {\r\n newClass.prototype = Object.create(baseClass.prototype);\r\n newClass.prototype.constructor = newClass;\r\n }\r\n\r\n function WebmBase(name, type) {\r\n this.name = name || 'Unknown';\r\n this.type = type || 'Unknown';\r\n }\r\n WebmBase.prototype.updateBySource = function() { };\r\n WebmBase.prototype.setSource = function(source) {\r\n this.source = source;\r\n this.updateBySource();\r\n };\r\n WebmBase.prototype.updateByData = function() { };\r\n WebmBase.prototype.setData = function(data) {\r\n this.data = data;\r\n this.updateByData();\r\n };\r\n\r\n function WebmUint(name, type) {\r\n WebmBase.call(this, name, type || 'Uint');\r\n }\r\n doInherit(WebmUint, WebmBase);\r\n function padHex(hex) {\r\n return hex.length % 2 === 1 ? '0' + hex : hex;\r\n }\r\n WebmUint.prototype.updateBySource = function() {\r\n // use hex representation of a number instead of number value\r\n this.data = '';\r\n for (var i = 0; i < this.source.length; i++) {\r\n var hex = this.source[i].toString(16);\r\n this.data += padHex(hex);\r\n }\r\n };\r\n WebmUint.prototype.updateByData = function() {\r\n var length = this.data.length / 2;\r\n this.source = new Uint8Array(length);\r\n for (var i = 0; i < length; i++) {\r\n var hex = this.data.substr(i * 2, 2);\r\n this.source[i] = parseInt(hex, 16);\r\n }\r\n };\r\n WebmUint.prototype.getValue = function() {\r\n return parseInt(this.data, 16);\r\n };\r\n WebmUint.prototype.setValue = function(value) {\r\n this.setData(padHex(value.toString(16)));\r\n };\r\n\r\n function WebmFloat(name, type) {\r\n WebmBase.call(this, name, type || 'Float');\r\n }\r\n doInherit(WebmFloat, WebmBase);\r\n WebmFloat.prototype.getFloatArrayType = function() {\r\n return this.source && this.source.length === 4 ? Float32Array : Float64Array;\r\n };\r\n WebmFloat.prototype.updateBySource = function() {\r\n var byteArray = this.source.reverse();\r\n var floatArrayType = this.getFloatArrayType();\r\n var floatArray = new floatArrayType(byteArray.buffer);\r\n this.data = floatArray[0];\r\n };\r\n WebmFloat.prototype.updateByData = function() {\r\n var floatArrayType = this.getFloatArrayType();\r\n var floatArray = new floatArrayType([ this.data ]);\r\n var byteArray = new Uint8Array(floatArray.buffer);\r\n this.source = byteArray.reverse();\r\n };\r\n WebmFloat.prototype.getValue = function() {\r\n return this.data;\r\n };\r\n WebmFloat.prototype.setValue = function(value) {\r\n this.setData(value);\r\n };\r\n\r\n function WebmContainer(name, type) {\r\n WebmBase.call(this, name, type || 'Container');\r\n }\r\n doInherit(WebmContainer, WebmBase);\r\n WebmContainer.prototype.readByte = function() {\r\n return this.source[this.offset++];\r\n };\r\n WebmContainer.prototype.readUint = function() {\r\n var firstByte = this.readByte();\r\n var bytes = 8 - firstByte.toString(2).length;\r\n var value = firstByte - (1 << (7 - bytes));\r\n for (var i = 0; i < bytes; i++) {\r\n // don't use bit operators to support x86\r\n value *= 256;\r\n value += this.readByte();\r\n }\r\n return value;\r\n };\r\n WebmContainer.prototype.updateBySource = function() {\r\n this.data = [];\r\n for (this.offset = 0; this.offset < this.source.length; this.offset = end) {\r\n var id = this.readUint();\r\n var len = this.readUint();\r\n var end = Math.min(this.offset + len, this.source.length);\r\n var data = this.source.slice(this.offset, end);\r\n\r\n var info = sections[id] || { name: 'Unknown', type: 'Unknown' };\r\n var ctr = WebmBase;\r\n switch (info.type) {\r\n case 'Container':\r\n ctr = WebmContainer;\r\n break;\r\n case 'Uint':\r\n ctr = WebmUint;\r\n break;\r\n case 'Float':\r\n ctr = WebmFloat;\r\n break;\r\n }\r\n var section = new ctr(info.name, info.type);\r\n section.setSource(data);\r\n this.data.push({\r\n id: id,\r\n idHex: id.toString(16),\r\n data: section\r\n });\r\n }\r\n };\r\n WebmContainer.prototype.writeUint = function(x, draft) {\r\n for (var bytes = 1, flag = 0x80; x >= flag && bytes < 8; bytes++, flag *= 0x80) { }\r\n\r\n if (!draft) {\r\n var value = flag + x;\r\n for (var i = bytes - 1; i >= 0; i--) {\r\n // don't use bit operators to support x86\r\n var c = value % 256;\r\n this.source[this.offset + i] = c;\r\n value = (value - c) / 256;\r\n }\r\n }\r\n\r\n this.offset += bytes;\r\n };\r\n WebmContainer.prototype.writeSections = function(draft) {\r\n this.offset = 0;\r\n for (var i = 0; i < this.data.length; i++) {\r\n var section = this.data[i],\r\n content = section.data.source,\r\n contentLength = content.length;\r\n this.writeUint(section.id, draft);\r\n this.writeUint(contentLength, draft);\r\n if (!draft) {\r\n this.source.set(content, this.offset);\r\n }\r\n this.offset += contentLength;\r\n }\r\n return this.offset;\r\n };\r\n WebmContainer.prototype.updateByData = function() {\r\n // run without accessing this.source to determine total length - need to know it to create Uint8Array\r\n var length = this.writeSections('draft');\r\n this.source = new Uint8Array(length);\r\n // now really write data\r\n this.writeSections();\r\n };\r\n WebmContainer.prototype.getSectionById = function(id) {\r\n for (var i = 0; i < this.data.length; i++) {\r\n var section = this.data[i];\r\n if (section.id === id) {\r\n return section.data;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n function WebmFile(source) {\r\n WebmContainer.call(this, 'File', 'File');\r\n this.setSource(source);\r\n }\r\n doInherit(WebmFile, WebmContainer);\r\n WebmFile.prototype.fixDuration = function(duration, options) {\r\n var logger = options && options.logger;\r\n if (logger === undefined) {\r\n logger = function(message) {\r\n console.log(message);\r\n };\r\n } else if (!logger) {\r\n logger = function() { };\r\n }\r\n\r\n var segmentSection = this.getSectionById(0x8538067);\r\n if (!segmentSection) {\r\n logger('[fix-webm-duration] Segment section is missing');\r\n return false;\r\n }\r\n\r\n var infoSection = segmentSection.getSectionById(0x549a966);\r\n if (!infoSection) {\r\n logger('[fix-webm-duration] Info section is missing');\r\n return false;\r\n }\r\n\r\n var timeScaleSection = infoSection.getSectionById(0xad7b1);\r\n if (!timeScaleSection) {\r\n logger('[fix-webm-duration] TimecodeScale section is missing');\r\n return false;\r\n }\r\n\r\n var durationSection = infoSection.getSectionById(0x489);\r\n if (durationSection) {\r\n if (durationSection.getValue() <= 0) {\r\n logger('[fix-webm-duration] Duration section is present, but the value is empty');\r\n durationSection.setValue(duration);\r\n } else {\r\n logger('[fix-webm-duration] Duration section is present');\r\n return false;\r\n }\r\n } else {\r\n logger('[fix-webm-duration] Duration section is missing');\r\n // append Duration section\r\n durationSection = new WebmFloat('Duration', 'Float');\r\n durationSection.setValue(duration);\r\n infoSection.data.push({\r\n id: 0x489,\r\n data: durationSection\r\n });\r\n }\r\n\r\n // set default time scale to 1 millisecond (1000000 nanoseconds)\r\n timeScaleSection.setValue(1000000);\r\n infoSection.updateByData();\r\n segmentSection.updateByData();\r\n this.updateByData();\r\n\r\n return true;\r\n };\r\n WebmFile.prototype.toBlob = function(mimeType) {\r\n return new Blob([ this.source.buffer ], { type: mimeType || 'video/webm' });\r\n };\r\n\r\n function fixWebmDuration(blob, duration, callback, options) {\r\n // The callback may be omitted - then the third argument is options\r\n if (typeof callback === \"object\") {\r\n options = callback;\r\n callback = undefined;\r\n }\r\n\r\n if (!callback) {\r\n return new Promise(function(resolve) {\r\n fixWebmDuration(blob, duration, resolve, options);\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n reader.onloadend = function() {\r\n try {\r\n var file = new WebmFile(new Uint8Array(reader.result));\r\n if (file.fixDuration(duration, options)) {\r\n blob = file.toBlob(blob.type);\r\n }\r\n } catch (ex) {\r\n // ignore\r\n }\r\n callback(blob);\r\n };\r\n reader.readAsArrayBuffer(blob);\r\n } catch (ex) {\r\n callback(blob);\r\n }\r\n }\r\n\r\n // Support AMD import default\r\n fixWebmDuration.default = fixWebmDuration;\r\n\r\n return fixWebmDuration;\r\n});\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","const __WEBPACK_NAMESPACE_OBJECT__ = React;","const __WEBPACK_NAMESPACE_OBJECT__ = ReactDOM;","const __WEBPACK_NAMESPACE_OBJECT__ = ReactIntl;","/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Firebase constants. Some of these (@defines) can be overridden at compile-time.\r\n */\r\nconst CONSTANTS = {\r\n /**\r\n * @define {boolean} Whether this is the client Node.js SDK.\r\n */\r\n NODE_CLIENT: false,\r\n /**\r\n * @define {boolean} Whether this is the Admin Node.js SDK.\r\n */\r\n NODE_ADMIN: false,\r\n /**\r\n * Firebase SDK Version\r\n */\r\n SDK_VERSION: '${JSCORE_VERSION}'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Throws an error if the provided assertion is falsy\r\n */\r\nconst assert = function (assertion, message) {\r\n if (!assertion) {\r\n throw assertionError(message);\r\n }\r\n};\r\n/**\r\n * Returns an Error object suitable for throwing.\r\n */\r\nconst assertionError = function (message) {\r\n return new Error('Firebase Database (' +\r\n CONSTANTS.SDK_VERSION +\r\n ') INTERNAL ASSERT FAILED: ' +\r\n message);\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst stringToByteArray$1 = function (str) {\r\n // TODO(user): Use native implementations if/when available\r\n const out = [];\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n let c = str.charCodeAt(i);\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if ((c & 0xfc00) === 0xd800 &&\r\n i + 1 < str.length &&\r\n (str.charCodeAt(i + 1) & 0xfc00) === 0xdc00) {\r\n // Surrogate Pair\r\n c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Turns an array of numbers into the string given by the concatenation of the\r\n * characters to which the numbers correspond.\r\n * @param bytes Array of numbers representing characters.\r\n * @return Stringification of the array.\r\n */\r\nconst byteArrayToString = function (bytes) {\r\n // TODO(user): Use native implementations if/when available\r\n const out = [];\r\n let pos = 0, c = 0;\r\n while (pos < bytes.length) {\r\n const c1 = bytes[pos++];\r\n if (c1 < 128) {\r\n out[c++] = String.fromCharCode(c1);\r\n }\r\n else if (c1 > 191 && c1 < 224) {\r\n const c2 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));\r\n }\r\n else if (c1 > 239 && c1 < 365) {\r\n // Surrogate Pair\r\n const c2 = bytes[pos++];\r\n const c3 = bytes[pos++];\r\n const c4 = bytes[pos++];\r\n const u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) -\r\n 0x10000;\r\n out[c++] = String.fromCharCode(0xd800 + (u >> 10));\r\n out[c++] = String.fromCharCode(0xdc00 + (u & 1023));\r\n }\r\n else {\r\n const c2 = bytes[pos++];\r\n const c3 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\r\n }\r\n }\r\n return out.join('');\r\n};\r\n// We define it as an object literal instead of a class because a class compiled down to es5 can't\r\n// be treeshaked. https://github.com/rollup/rollup/issues/1691\r\n// Static lookup maps, lazily populated by init_()\r\nconst base64 = {\r\n /**\r\n * Maps bytes to characters.\r\n */\r\n byteToCharMap_: null,\r\n /**\r\n * Maps characters to bytes.\r\n */\r\n charToByteMap_: null,\r\n /**\r\n * Maps bytes to websafe characters.\r\n * @private\r\n */\r\n byteToCharMapWebSafe_: null,\r\n /**\r\n * Maps websafe characters to bytes.\r\n * @private\r\n */\r\n charToByteMapWebSafe_: null,\r\n /**\r\n * Our default alphabet, shared between\r\n * ENCODED_VALS and ENCODED_VALS_WEBSAFE\r\n */\r\n ENCODED_VALS_BASE: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789',\r\n /**\r\n * Our default alphabet. Value 64 (=) is special; it means \"nothing.\"\r\n */\r\n get ENCODED_VALS() {\r\n return this.ENCODED_VALS_BASE + '+/=';\r\n },\r\n /**\r\n * Our websafe alphabet.\r\n */\r\n get ENCODED_VALS_WEBSAFE() {\r\n return this.ENCODED_VALS_BASE + '-_.';\r\n },\r\n /**\r\n * Whether this browser supports the atob and btoa functions. This extension\r\n * started at Mozilla but is now implemented by many browsers. We use the\r\n * ASSUME_* variables to avoid pulling in the full useragent detection library\r\n * but still allowing the standard per-browser compilations.\r\n *\r\n */\r\n HAS_NATIVE_SUPPORT: typeof atob === 'function',\r\n /**\r\n * Base64-encode an array of bytes.\r\n *\r\n * @param input An array of bytes (numbers with\r\n * value in [0, 255]) to encode.\r\n * @param webSafe Boolean indicating we should use the\r\n * alternative alphabet.\r\n * @return The base64 encoded string.\r\n */\r\n encodeByteArray(input, webSafe) {\r\n if (!Array.isArray(input)) {\r\n throw Error('encodeByteArray takes an array as a parameter');\r\n }\r\n this.init_();\r\n const byteToCharMap = webSafe\r\n ? this.byteToCharMapWebSafe_\r\n : this.byteToCharMap_;\r\n const output = [];\r\n for (let i = 0; i < input.length; i += 3) {\r\n const byte1 = input[i];\r\n const haveByte2 = i + 1 < input.length;\r\n const byte2 = haveByte2 ? input[i + 1] : 0;\r\n const haveByte3 = i + 2 < input.length;\r\n const byte3 = haveByte3 ? input[i + 2] : 0;\r\n const outByte1 = byte1 >> 2;\r\n const outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);\r\n let outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6);\r\n let outByte4 = byte3 & 0x3f;\r\n if (!haveByte3) {\r\n outByte4 = 64;\r\n if (!haveByte2) {\r\n outByte3 = 64;\r\n }\r\n }\r\n output.push(byteToCharMap[outByte1], byteToCharMap[outByte2], byteToCharMap[outByte3], byteToCharMap[outByte4]);\r\n }\r\n return output.join('');\r\n },\r\n /**\r\n * Base64-encode a string.\r\n *\r\n * @param input A string to encode.\r\n * @param webSafe If true, we should use the\r\n * alternative alphabet.\r\n * @return The base64 encoded string.\r\n */\r\n encodeString(input, webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\r\n return btoa(input);\r\n }\r\n return this.encodeByteArray(stringToByteArray$1(input), webSafe);\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * @param input to decode.\r\n * @param webSafe True if we should use the\r\n * alternative alphabet.\r\n * @return string representing the decoded value.\r\n */\r\n decodeString(input, webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\r\n return atob(input);\r\n }\r\n return byteArrayToString(this.decodeStringToByteArray(input, webSafe));\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * In base-64 decoding, groups of four characters are converted into three\r\n * bytes. If the encoder did not apply padding, the input length may not\r\n * be a multiple of 4.\r\n *\r\n * In this case, the last group will have fewer than 4 characters, and\r\n * padding will be inferred. If the group has one or two characters, it decodes\r\n * to one byte. If the group has three characters, it decodes to two bytes.\r\n *\r\n * @param input Input to decode.\r\n * @param webSafe True if we should use the web-safe alphabet.\r\n * @return bytes representing the decoded value.\r\n */\r\n decodeStringToByteArray(input, webSafe) {\r\n this.init_();\r\n const charToByteMap = webSafe\r\n ? this.charToByteMapWebSafe_\r\n : this.charToByteMap_;\r\n const output = [];\r\n for (let i = 0; i < input.length;) {\r\n const byte1 = charToByteMap[input.charAt(i++)];\r\n const haveByte2 = i < input.length;\r\n const byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0;\r\n ++i;\r\n const haveByte3 = i < input.length;\r\n const byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n const haveByte4 = i < input.length;\r\n const byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) {\r\n throw Error();\r\n }\r\n const outByte1 = (byte1 << 2) | (byte2 >> 4);\r\n output.push(outByte1);\r\n if (byte3 !== 64) {\r\n const outByte2 = ((byte2 << 4) & 0xf0) | (byte3 >> 2);\r\n output.push(outByte2);\r\n if (byte4 !== 64) {\r\n const outByte3 = ((byte3 << 6) & 0xc0) | byte4;\r\n output.push(outByte3);\r\n }\r\n }\r\n }\r\n return output;\r\n },\r\n /**\r\n * Lazy static initialization function. Called before\r\n * accessing any of the static map variables.\r\n * @private\r\n */\r\n init_() {\r\n if (!this.byteToCharMap_) {\r\n this.byteToCharMap_ = {};\r\n this.charToByteMap_ = {};\r\n this.byteToCharMapWebSafe_ = {};\r\n this.charToByteMapWebSafe_ = {};\r\n // We want quick mappings back and forth, so we precompute two maps.\r\n for (let i = 0; i < this.ENCODED_VALS.length; i++) {\r\n this.byteToCharMap_[i] = this.ENCODED_VALS.charAt(i);\r\n this.charToByteMap_[this.byteToCharMap_[i]] = i;\r\n this.byteToCharMapWebSafe_[i] = this.ENCODED_VALS_WEBSAFE.charAt(i);\r\n this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i]] = i;\r\n // Be forgiving when decoding and correctly decode both encodings.\r\n if (i >= this.ENCODED_VALS_BASE.length) {\r\n this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i)] = i;\r\n this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i)] = i;\r\n }\r\n }\r\n }\r\n }\r\n};\r\n/**\r\n * URL-safe base64 encoding\r\n */\r\nconst base64Encode = function (str) {\r\n const utf8Bytes = stringToByteArray$1(str);\r\n return base64.encodeByteArray(utf8Bytes, true);\r\n};\r\n/**\r\n * URL-safe base64 encoding (without \".\" padding in the end).\r\n * e.g. Used in JSON Web Token (JWT) parts.\r\n */\r\nconst base64urlEncodeWithoutPadding = function (str) {\r\n // Use base64url encoding and remove padding in the end (dot characters).\r\n return base64Encode(str).replace(/\\./g, '');\r\n};\r\n/**\r\n * URL-safe base64 decoding\r\n *\r\n * NOTE: DO NOT use the global atob() function - it does NOT support the\r\n * base64Url variant encoding.\r\n *\r\n * @param str To be decoded\r\n * @return Decoded result, if possible\r\n */\r\nconst base64Decode = function (str) {\r\n try {\r\n return base64.decodeString(str, true);\r\n }\r\n catch (e) {\r\n console.error('base64Decode failed: ', e);\r\n }\r\n return null;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Do a deep-copy of basic JavaScript Objects or Arrays.\r\n */\r\nfunction deepCopy(value) {\r\n return deepExtend(undefined, value);\r\n}\r\n/**\r\n * Copy properties from source to target (recursively allows extension\r\n * of Objects and Arrays). Scalar values in the target are over-written.\r\n * If target is undefined, an object of the appropriate type will be created\r\n * (and returned).\r\n *\r\n * We recursively copy all child properties of plain Objects in the source- so\r\n * that namespace- like dictionaries are merged.\r\n *\r\n * Note that the target can be a function, in which case the properties in\r\n * the source Object are copied onto it as static properties of the Function.\r\n *\r\n * Note: we don't merge __proto__ to prevent prototype pollution\r\n */\r\nfunction deepExtend(target, source) {\r\n if (!(source instanceof Object)) {\r\n return source;\r\n }\r\n switch (source.constructor) {\r\n case Date:\r\n // Treat Dates like scalars; if the target date object had any child\r\n // properties - they will be lost!\r\n const dateValue = source;\r\n return new Date(dateValue.getTime());\r\n case Object:\r\n if (target === undefined) {\r\n target = {};\r\n }\r\n break;\r\n case Array:\r\n // Always copy the array source and overwrite the target.\r\n target = [];\r\n break;\r\n default:\r\n // Not a plain Object - treat it as a scalar.\r\n return source;\r\n }\r\n for (const prop in source) {\r\n // use isValidKey to guard against prototype pollution. See https://snyk.io/vuln/SNYK-JS-LODASH-450202\r\n if (!source.hasOwnProperty(prop) || !isValidKey(prop)) {\r\n continue;\r\n }\r\n target[prop] = deepExtend(target[prop], source[prop]);\r\n }\r\n return target;\r\n}\r\nfunction isValidKey(key) {\r\n return key !== '__proto__';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass Deferred {\r\n constructor() {\r\n this.reject = () => { };\r\n this.resolve = () => { };\r\n this.promise = new Promise((resolve, reject) => {\r\n this.resolve = resolve;\r\n this.reject = reject;\r\n });\r\n }\r\n /**\r\n * Our API internals are not promiseified and cannot because our callback APIs have subtle expectations around\r\n * invoking promises inline, which Promises are forbidden to do. This method accepts an optional node-style callback\r\n * and returns a node-style callback which will resolve or reject the Deferred's promise.\r\n */\r\n wrapCallback(callback) {\r\n return (error, value) => {\r\n if (error) {\r\n this.reject(error);\r\n }\r\n else {\r\n this.resolve(value);\r\n }\r\n if (typeof callback === 'function') {\r\n // Attaching noop handler just in case developer wasn't expecting\r\n // promises\r\n this.promise.catch(() => { });\r\n // Some of our callbacks don't expect a value and our own tests\r\n // assert that the parameter length is 1\r\n if (callback.length === 1) {\r\n callback(error);\r\n }\r\n else {\r\n callback(error, value);\r\n }\r\n }\r\n };\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction createMockUserToken(token, projectId) {\r\n if (token.uid) {\r\n throw new Error('The \"uid\" field is no longer supported by mockUserToken. Please use \"sub\" instead for Firebase Auth User ID.');\r\n }\r\n // Unsecured JWTs use \"none\" as the algorithm.\r\n const header = {\r\n alg: 'none',\r\n type: 'JWT'\r\n };\r\n const project = projectId || 'demo-project';\r\n const iat = token.iat || 0;\r\n const sub = token.sub || token.user_id;\r\n if (!sub) {\r\n throw new Error(\"mockUserToken must contain 'sub' or 'user_id' field!\");\r\n }\r\n const payload = Object.assign({ \r\n // Set all required fields to decent defaults\r\n iss: `https://securetoken.google.com/${project}`, aud: project, iat, exp: iat + 3600, auth_time: iat, sub, user_id: sub, firebase: {\r\n sign_in_provider: 'custom',\r\n identities: {}\r\n } }, token);\r\n // Unsecured JWTs use the empty string as a signature.\r\n const signature = '';\r\n return [\r\n base64urlEncodeWithoutPadding(JSON.stringify(header)),\r\n base64urlEncodeWithoutPadding(JSON.stringify(payload)),\r\n signature\r\n ].join('.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns navigator.userAgent string or '' if it's not defined.\r\n * @return user agent string\r\n */\r\nfunction getUA() {\r\n if (typeof navigator !== 'undefined' &&\r\n typeof navigator['userAgent'] === 'string') {\r\n return navigator['userAgent'];\r\n }\r\n else {\r\n return '';\r\n }\r\n}\r\n/**\r\n * Detect Cordova / PhoneGap / Ionic frameworks on a mobile device.\r\n *\r\n * Deliberately does not rely on checking `file://` URLs (as this fails PhoneGap\r\n * in the Ripple emulator) nor Cordova `onDeviceReady`, which would normally\r\n * wait for a callback.\r\n */\r\nfunction isMobileCordova() {\r\n return (typeof window !== 'undefined' &&\r\n // @ts-ignore Setting up an broadly applicable index signature for Window\r\n // just to deal with this case would probably be a bad idea.\r\n !!(window['cordova'] || window['phonegap'] || window['PhoneGap']) &&\r\n /ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(getUA()));\r\n}\r\n/**\r\n * Detect Node.js.\r\n *\r\n * @return true if Node.js environment is detected.\r\n */\r\n// Node detection logic from: https://github.com/iliakan/detect-node/\r\nfunction isNode() {\r\n try {\r\n return (Object.prototype.toString.call(global.process) === '[object process]');\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n}\r\n/**\r\n * Detect Browser Environment\r\n */\r\nfunction isBrowser() {\r\n return typeof self === 'object' && self.self === self;\r\n}\r\nfunction isBrowserExtension() {\r\n const runtime = typeof chrome === 'object'\r\n ? chrome.runtime\r\n : typeof browser === 'object'\r\n ? browser.runtime\r\n : undefined;\r\n return typeof runtime === 'object' && runtime.id !== undefined;\r\n}\r\n/**\r\n * Detect React Native.\r\n *\r\n * @return true if ReactNative environment is detected.\r\n */\r\nfunction isReactNative() {\r\n return (typeof navigator === 'object' && navigator['product'] === 'ReactNative');\r\n}\r\n/** Detects Electron apps. */\r\nfunction isElectron() {\r\n return getUA().indexOf('Electron/') >= 0;\r\n}\r\n/** Detects Internet Explorer. */\r\nfunction isIE() {\r\n const ua = getUA();\r\n return ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;\r\n}\r\n/** Detects Universal Windows Platform apps. */\r\nfunction isUWP() {\r\n return getUA().indexOf('MSAppHost/') >= 0;\r\n}\r\n/**\r\n * Detect whether the current SDK build is the Node version.\r\n *\r\n * @return true if it's the Node SDK build.\r\n */\r\nfunction isNodeSdk() {\r\n return CONSTANTS.NODE_CLIENT === true || CONSTANTS.NODE_ADMIN === true;\r\n}\r\n/** Returns true if we are running in Safari. */\r\nfunction isSafari() {\r\n return (!isNode() &&\r\n navigator.userAgent.includes('Safari') &&\r\n !navigator.userAgent.includes('Chrome'));\r\n}\r\n/**\r\n * This method checks if indexedDB is supported by current browser/service worker context\r\n * @return true if indexedDB is supported by current browser/service worker context\r\n */\r\nfunction isIndexedDBAvailable() {\r\n return typeof indexedDB === 'object';\r\n}\r\n/**\r\n * This method validates browser/sw context for indexedDB by opening a dummy indexedDB database and reject\r\n * if errors occur during the database open operation.\r\n *\r\n * @throws exception if current browser/sw context can't run idb.open (ex: Safari iframe, Firefox\r\n * private browsing)\r\n */\r\nfunction validateIndexedDBOpenable() {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n let preExist = true;\r\n const DB_CHECK_NAME = 'validate-browser-context-for-indexeddb-analytics-module';\r\n const request = self.indexedDB.open(DB_CHECK_NAME);\r\n request.onsuccess = () => {\r\n request.result.close();\r\n // delete database only when it doesn't pre-exist\r\n if (!preExist) {\r\n self.indexedDB.deleteDatabase(DB_CHECK_NAME);\r\n }\r\n resolve(true);\r\n };\r\n request.onupgradeneeded = () => {\r\n preExist = false;\r\n };\r\n request.onerror = () => {\r\n var _a;\r\n reject(((_a = request.error) === null || _a === void 0 ? void 0 : _a.message) || '');\r\n };\r\n }\r\n catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n/**\r\n *\r\n * This method checks whether cookie is enabled within current browser\r\n * @return true if cookie is enabled within current browser\r\n */\r\nfunction areCookiesEnabled() {\r\n if (typeof navigator === 'undefined' || !navigator.cookieEnabled) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n/**\r\n * Polyfill for `globalThis` object.\r\n * @returns the `globalThis` object for the given environment.\r\n */\r\nfunction getGlobal() {\r\n if (typeof self !== 'undefined') {\r\n return self;\r\n }\r\n if (typeof window !== 'undefined') {\r\n return window;\r\n }\r\n if (typeof global !== 'undefined') {\r\n return global;\r\n }\r\n throw new Error('Unable to locate global object.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Standardized Firebase Error.\r\n *\r\n * Usage:\r\n *\r\n * // Typescript string literals for type-safe codes\r\n * type Err =\r\n * 'unknown' |\r\n * 'object-not-found'\r\n * ;\r\n *\r\n * // Closure enum for type-safe error codes\r\n * // at-enum {string}\r\n * var Err = {\r\n * UNKNOWN: 'unknown',\r\n * OBJECT_NOT_FOUND: 'object-not-found',\r\n * }\r\n *\r\n * let errors: Map = {\r\n * 'generic-error': \"Unknown error\",\r\n * 'file-not-found': \"Could not find file: {$file}\",\r\n * };\r\n *\r\n * // Type-safe function - must pass a valid error code as param.\r\n * let error = new ErrorFactory('service', 'Service', errors);\r\n *\r\n * ...\r\n * throw error.create(Err.GENERIC);\r\n * ...\r\n * throw error.create(Err.FILE_NOT_FOUND, {'file': fileName});\r\n * ...\r\n * // Service: Could not file file: foo.txt (service/file-not-found).\r\n *\r\n * catch (e) {\r\n * assert(e.message === \"Could not find file: foo.txt.\");\r\n * if (e.code === 'service/file-not-found') {\r\n * console.log(\"Could not read file: \" + e['file']);\r\n * }\r\n * }\r\n */\r\nconst ERROR_NAME = 'FirebaseError';\r\n// Based on code from:\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types\r\nclass FirebaseError extends Error {\r\n constructor(\r\n /** The error code for this error. */\r\n code, message, \r\n /** Custom data for this error. */\r\n customData) {\r\n super(message);\r\n this.code = code;\r\n this.customData = customData;\r\n /** The custom name for all FirebaseErrors. */\r\n this.name = ERROR_NAME;\r\n // Fix For ES5\r\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n Object.setPrototypeOf(this, FirebaseError.prototype);\r\n // Maintains proper stack trace for where our error was thrown.\r\n // Only available on V8.\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, ErrorFactory.prototype.create);\r\n }\r\n }\r\n}\r\nclass ErrorFactory {\r\n constructor(service, serviceName, errors) {\r\n this.service = service;\r\n this.serviceName = serviceName;\r\n this.errors = errors;\r\n }\r\n create(code, ...data) {\r\n const customData = data[0] || {};\r\n const fullCode = `${this.service}/${code}`;\r\n const template = this.errors[code];\r\n const message = template ? replaceTemplate(template, customData) : 'Error';\r\n // Service Name: Error message (service/code).\r\n const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`;\r\n const error = new FirebaseError(fullCode, fullMessage, customData);\r\n return error;\r\n }\r\n}\r\nfunction replaceTemplate(template, data) {\r\n return template.replace(PATTERN, (_, key) => {\r\n const value = data[key];\r\n return value != null ? String(value) : `<${key}?>`;\r\n });\r\n}\r\nconst PATTERN = /\\{\\$([^}]+)}/g;\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Evaluates a JSON string into a javascript object.\r\n *\r\n * @param {string} str A string containing JSON.\r\n * @return {*} The javascript object representing the specified JSON.\r\n */\r\nfunction jsonEval(str) {\r\n return JSON.parse(str);\r\n}\r\n/**\r\n * Returns JSON representing a javascript object.\r\n * @param {*} data Javascript object to be stringified.\r\n * @return {string} The JSON contents of the object.\r\n */\r\nfunction stringify(data) {\r\n return JSON.stringify(data);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Decodes a Firebase auth. token into constituent parts.\r\n *\r\n * Notes:\r\n * - May return with invalid / incomplete claims if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst decode = function (token) {\r\n let header = {}, claims = {}, data = {}, signature = '';\r\n try {\r\n const parts = token.split('.');\r\n header = jsonEval(base64Decode(parts[0]) || '');\r\n claims = jsonEval(base64Decode(parts[1]) || '');\r\n signature = parts[2];\r\n data = claims['d'] || {};\r\n delete claims['d'];\r\n }\r\n catch (e) { }\r\n return {\r\n header,\r\n claims,\r\n data,\r\n signature\r\n };\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its time-based claims. Will return true if the\r\n * token is within the time window authorized by the 'nbf' (not-before) and 'iat' (issued-at) claims.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidTimestamp = function (token) {\r\n const claims = decode(token).claims;\r\n const now = Math.floor(new Date().getTime() / 1000);\r\n let validSince = 0, validUntil = 0;\r\n if (typeof claims === 'object') {\r\n if (claims.hasOwnProperty('nbf')) {\r\n validSince = claims['nbf'];\r\n }\r\n else if (claims.hasOwnProperty('iat')) {\r\n validSince = claims['iat'];\r\n }\r\n if (claims.hasOwnProperty('exp')) {\r\n validUntil = claims['exp'];\r\n }\r\n else {\r\n // token will expire after 24h by default\r\n validUntil = validSince + 86400;\r\n }\r\n }\r\n return (!!now &&\r\n !!validSince &&\r\n !!validUntil &&\r\n now >= validSince &&\r\n now <= validUntil);\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and returns its issued at time if valid, null otherwise.\r\n *\r\n * Notes:\r\n * - May return null if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst issuedAtTime = function (token) {\r\n const claims = decode(token).claims;\r\n if (typeof claims === 'object' && claims.hasOwnProperty('iat')) {\r\n return claims['iat'];\r\n }\r\n return null;\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its format. Expects a valid issued-at time.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidFormat = function (token) {\r\n const decoded = decode(token), claims = decoded.claims;\r\n return !!claims && typeof claims === 'object' && claims.hasOwnProperty('iat');\r\n};\r\n/**\r\n * Attempts to peer into an auth token and determine if it's an admin auth token by looking at the claims portion.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isAdmin = function (token) {\r\n const claims = decode(token).claims;\r\n return typeof claims === 'object' && claims['admin'] === true;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction contains(obj, key) {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n}\r\nfunction safeGet(obj, key) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return obj[key];\r\n }\r\n else {\r\n return undefined;\r\n }\r\n}\r\nfunction isEmpty(obj) {\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction map(obj, fn, contextObj) {\r\n const res = {};\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n res[key] = fn.call(contextObj, obj[key], key, obj);\r\n }\r\n }\r\n return res;\r\n}\r\n/**\r\n * Deep equal two objects. Support Arrays and Objects.\r\n */\r\nfunction deepEqual(a, b) {\r\n if (a === b) {\r\n return true;\r\n }\r\n const aKeys = Object.keys(a);\r\n const bKeys = Object.keys(b);\r\n for (const k of aKeys) {\r\n if (!bKeys.includes(k)) {\r\n return false;\r\n }\r\n const aProp = a[k];\r\n const bProp = b[k];\r\n if (isObject(aProp) && isObject(bProp)) {\r\n if (!deepEqual(aProp, bProp)) {\r\n return false;\r\n }\r\n }\r\n else if (aProp !== bProp) {\r\n return false;\r\n }\r\n }\r\n for (const k of bKeys) {\r\n if (!aKeys.includes(k)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction isObject(thing) {\r\n return thing !== null && typeof thing === 'object';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a querystring-formatted string (e.g. &arg=val&arg2=val2) from a\r\n * params object (e.g. {arg: 'val', arg2: 'val2'})\r\n * Note: You must prepend it with ? when adding it to a URL.\r\n */\r\nfunction querystring(querystringParams) {\r\n const params = [];\r\n for (const [key, value] of Object.entries(querystringParams)) {\r\n if (Array.isArray(value)) {\r\n value.forEach(arrayVal => {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(arrayVal));\r\n });\r\n }\r\n else {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\r\n }\r\n }\r\n return params.length ? '&' + params.join('&') : '';\r\n}\r\n/**\r\n * Decodes a querystring (e.g. ?arg=val&arg2=val2) into a params object\r\n * (e.g. {arg: 'val', arg2: 'val2'})\r\n */\r\nfunction querystringDecode(querystring) {\r\n const obj = {};\r\n const tokens = querystring.replace(/^\\?/, '').split('&');\r\n tokens.forEach(token => {\r\n if (token) {\r\n const [key, value] = token.split('=');\r\n obj[decodeURIComponent(key)] = decodeURIComponent(value);\r\n }\r\n });\r\n return obj;\r\n}\r\n/**\r\n * Extract the query string part of a URL, including the leading question mark (if present).\r\n */\r\nfunction extractQuerystring(url) {\r\n const queryStart = url.indexOf('?');\r\n if (!queryStart) {\r\n return '';\r\n }\r\n const fragmentStart = url.indexOf('#', queryStart);\r\n return url.substring(queryStart, fragmentStart > 0 ? fragmentStart : undefined);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview SHA-1 cryptographic hash.\r\n * Variable names follow the notation in FIPS PUB 180-3:\r\n * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf.\r\n *\r\n * Usage:\r\n * var sha1 = new sha1();\r\n * sha1.update(bytes);\r\n * var hash = sha1.digest();\r\n *\r\n * Performance:\r\n * Chrome 23: ~400 Mbit/s\r\n * Firefox 16: ~250 Mbit/s\r\n *\r\n */\r\n/**\r\n * SHA-1 cryptographic hash constructor.\r\n *\r\n * The properties declared here are discussed in the above algorithm document.\r\n * @constructor\r\n * @final\r\n * @struct\r\n */\r\nclass Sha1 {\r\n constructor() {\r\n /**\r\n * Holds the previous values of accumulated variables a-e in the compress_\r\n * function.\r\n * @private\r\n */\r\n this.chain_ = [];\r\n /**\r\n * A buffer holding the partially computed hash result.\r\n * @private\r\n */\r\n this.buf_ = [];\r\n /**\r\n * An array of 80 bytes, each a part of the message to be hashed. Referred to\r\n * as the message schedule in the docs.\r\n * @private\r\n */\r\n this.W_ = [];\r\n /**\r\n * Contains data needed to pad messages less than 64 bytes.\r\n * @private\r\n */\r\n this.pad_ = [];\r\n /**\r\n * @private {number}\r\n */\r\n this.inbuf_ = 0;\r\n /**\r\n * @private {number}\r\n */\r\n this.total_ = 0;\r\n this.blockSize = 512 / 8;\r\n this.pad_[0] = 128;\r\n for (let i = 1; i < this.blockSize; ++i) {\r\n this.pad_[i] = 0;\r\n }\r\n this.reset();\r\n }\r\n reset() {\r\n this.chain_[0] = 0x67452301;\r\n this.chain_[1] = 0xefcdab89;\r\n this.chain_[2] = 0x98badcfe;\r\n this.chain_[3] = 0x10325476;\r\n this.chain_[4] = 0xc3d2e1f0;\r\n this.inbuf_ = 0;\r\n this.total_ = 0;\r\n }\r\n /**\r\n * Internal compress helper function.\r\n * @param buf Block to compress.\r\n * @param offset Offset of the block in the buffer.\r\n * @private\r\n */\r\n compress_(buf, offset) {\r\n if (!offset) {\r\n offset = 0;\r\n }\r\n const W = this.W_;\r\n // get 16 big endian words\r\n if (typeof buf === 'string') {\r\n for (let i = 0; i < 16; i++) {\r\n // TODO(user): [bug 8140122] Recent versions of Safari for Mac OS and iOS\r\n // have a bug that turns the post-increment ++ operator into pre-increment\r\n // during JIT compilation. We have code that depends heavily on SHA-1 for\r\n // correctness and which is affected by this bug, so I've removed all uses\r\n // of post-increment ++ in which the result value is used. We can revert\r\n // this change once the Safari bug\r\n // (https://bugs.webkit.org/show_bug.cgi?id=109036) has been fixed and\r\n // most clients have been updated.\r\n W[i] =\r\n (buf.charCodeAt(offset) << 24) |\r\n (buf.charCodeAt(offset + 1) << 16) |\r\n (buf.charCodeAt(offset + 2) << 8) |\r\n buf.charCodeAt(offset + 3);\r\n offset += 4;\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < 16; i++) {\r\n W[i] =\r\n (buf[offset] << 24) |\r\n (buf[offset + 1] << 16) |\r\n (buf[offset + 2] << 8) |\r\n buf[offset + 3];\r\n offset += 4;\r\n }\r\n }\r\n // expand to 80 words\r\n for (let i = 16; i < 80; i++) {\r\n const t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\r\n W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff;\r\n }\r\n let a = this.chain_[0];\r\n let b = this.chain_[1];\r\n let c = this.chain_[2];\r\n let d = this.chain_[3];\r\n let e = this.chain_[4];\r\n let f, k;\r\n // TODO(user): Try to unroll this loop to speed up the computation.\r\n for (let i = 0; i < 80; i++) {\r\n if (i < 40) {\r\n if (i < 20) {\r\n f = d ^ (b & (c ^ d));\r\n k = 0x5a827999;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0x6ed9eba1;\r\n }\r\n }\r\n else {\r\n if (i < 60) {\r\n f = (b & c) | (d & (b | c));\r\n k = 0x8f1bbcdc;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0xca62c1d6;\r\n }\r\n }\r\n const t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff;\r\n e = d;\r\n d = c;\r\n c = ((b << 30) | (b >>> 2)) & 0xffffffff;\r\n b = a;\r\n a = t;\r\n }\r\n this.chain_[0] = (this.chain_[0] + a) & 0xffffffff;\r\n this.chain_[1] = (this.chain_[1] + b) & 0xffffffff;\r\n this.chain_[2] = (this.chain_[2] + c) & 0xffffffff;\r\n this.chain_[3] = (this.chain_[3] + d) & 0xffffffff;\r\n this.chain_[4] = (this.chain_[4] + e) & 0xffffffff;\r\n }\r\n update(bytes, length) {\r\n // TODO(johnlenz): tighten the function signature and remove this check\r\n if (bytes == null) {\r\n return;\r\n }\r\n if (length === undefined) {\r\n length = bytes.length;\r\n }\r\n const lengthMinusBlock = length - this.blockSize;\r\n let n = 0;\r\n // Using local instead of member variables gives ~5% speedup on Firefox 16.\r\n const buf = this.buf_;\r\n let inbuf = this.inbuf_;\r\n // The outer while loop should execute at most twice.\r\n while (n < length) {\r\n // When we have no data in the block to top up, we can directly process the\r\n // input buffer (assuming it contains sufficient data). This gives ~25%\r\n // speedup on Chrome 23 and ~15% speedup on Firefox 16, but requires that\r\n // the data is provided in large chunks (or in multiples of 64 bytes).\r\n if (inbuf === 0) {\r\n while (n <= lengthMinusBlock) {\r\n this.compress_(bytes, n);\r\n n += this.blockSize;\r\n }\r\n }\r\n if (typeof bytes === 'string') {\r\n while (n < length) {\r\n buf[inbuf] = bytes.charCodeAt(n);\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n while (n < length) {\r\n buf[inbuf] = bytes[n];\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n this.inbuf_ = inbuf;\r\n this.total_ += length;\r\n }\r\n /** @override */\r\n digest() {\r\n const digest = [];\r\n let totalBits = this.total_ * 8;\r\n // Add pad 0x80 0x00*.\r\n if (this.inbuf_ < 56) {\r\n this.update(this.pad_, 56 - this.inbuf_);\r\n }\r\n else {\r\n this.update(this.pad_, this.blockSize - (this.inbuf_ - 56));\r\n }\r\n // Add # bits.\r\n for (let i = this.blockSize - 1; i >= 56; i--) {\r\n this.buf_[i] = totalBits & 255;\r\n totalBits /= 256; // Don't use bit-shifting here!\r\n }\r\n this.compress_(this.buf_);\r\n let n = 0;\r\n for (let i = 0; i < 5; i++) {\r\n for (let j = 24; j >= 0; j -= 8) {\r\n digest[n] = (this.chain_[i] >> j) & 255;\r\n ++n;\r\n }\r\n }\r\n return digest;\r\n }\r\n}\n\n/**\r\n * Helper to make a Subscribe function (just like Promise helps make a\r\n * Thenable).\r\n *\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\nfunction createSubscribe(executor, onNoObservers) {\r\n const proxy = new ObserverProxy(executor, onNoObservers);\r\n return proxy.subscribe.bind(proxy);\r\n}\r\n/**\r\n * Implement fan-out for any number of Observers attached via a subscribe\r\n * function.\r\n */\r\nclass ObserverProxy {\r\n /**\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\n constructor(executor, onNoObservers) {\r\n this.observers = [];\r\n this.unsubscribes = [];\r\n this.observerCount = 0;\r\n // Micro-task scheduling by calling task.then().\r\n this.task = Promise.resolve();\r\n this.finalized = false;\r\n this.onNoObservers = onNoObservers;\r\n // Call the executor asynchronously so subscribers that are called\r\n // synchronously after the creation of the subscribe function\r\n // can still receive the very first value generated in the executor.\r\n this.task\r\n .then(() => {\r\n executor(this);\r\n })\r\n .catch(e => {\r\n this.error(e);\r\n });\r\n }\r\n next(value) {\r\n this.forEachObserver((observer) => {\r\n observer.next(value);\r\n });\r\n }\r\n error(error) {\r\n this.forEachObserver((observer) => {\r\n observer.error(error);\r\n });\r\n this.close(error);\r\n }\r\n complete() {\r\n this.forEachObserver((observer) => {\r\n observer.complete();\r\n });\r\n this.close();\r\n }\r\n /**\r\n * Subscribe function that can be used to add an Observer to the fan-out list.\r\n *\r\n * - We require that no event is sent to a subscriber sychronously to their\r\n * call to subscribe().\r\n */\r\n subscribe(nextOrObserver, error, complete) {\r\n let observer;\r\n if (nextOrObserver === undefined &&\r\n error === undefined &&\r\n complete === undefined) {\r\n throw new Error('Missing Observer.');\r\n }\r\n // Assemble an Observer object when passed as callback functions.\r\n if (implementsAnyMethods(nextOrObserver, [\r\n 'next',\r\n 'error',\r\n 'complete'\r\n ])) {\r\n observer = nextOrObserver;\r\n }\r\n else {\r\n observer = {\r\n next: nextOrObserver,\r\n error,\r\n complete\r\n };\r\n }\r\n if (observer.next === undefined) {\r\n observer.next = noop;\r\n }\r\n if (observer.error === undefined) {\r\n observer.error = noop;\r\n }\r\n if (observer.complete === undefined) {\r\n observer.complete = noop;\r\n }\r\n const unsub = this.unsubscribeOne.bind(this, this.observers.length);\r\n // Attempt to subscribe to a terminated Observable - we\r\n // just respond to the Observer with the final error or complete\r\n // event.\r\n if (this.finalized) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n try {\r\n if (this.finalError) {\r\n observer.error(this.finalError);\r\n }\r\n else {\r\n observer.complete();\r\n }\r\n }\r\n catch (e) {\r\n // nothing\r\n }\r\n return;\r\n });\r\n }\r\n this.observers.push(observer);\r\n return unsub;\r\n }\r\n // Unsubscribe is synchronous - we guarantee that no events are sent to\r\n // any unsubscribed Observer.\r\n unsubscribeOne(i) {\r\n if (this.observers === undefined || this.observers[i] === undefined) {\r\n return;\r\n }\r\n delete this.observers[i];\r\n this.observerCount -= 1;\r\n if (this.observerCount === 0 && this.onNoObservers !== undefined) {\r\n this.onNoObservers(this);\r\n }\r\n }\r\n forEachObserver(fn) {\r\n if (this.finalized) {\r\n // Already closed by previous event....just eat the additional values.\r\n return;\r\n }\r\n // Since sendOne calls asynchronously - there is no chance that\r\n // this.observers will become undefined.\r\n for (let i = 0; i < this.observers.length; i++) {\r\n this.sendOne(i, fn);\r\n }\r\n }\r\n // Call the Observer via one of it's callback function. We are careful to\r\n // confirm that the observe has not been unsubscribed since this asynchronous\r\n // function had been queued.\r\n sendOne(i, fn) {\r\n // Execute the callback asynchronously\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n if (this.observers !== undefined && this.observers[i] !== undefined) {\r\n try {\r\n fn(this.observers[i]);\r\n }\r\n catch (e) {\r\n // Ignore exceptions raised in Observers or missing methods of an\r\n // Observer.\r\n // Log error to console. b/31404806\r\n if (typeof console !== 'undefined' && console.error) {\r\n console.error(e);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n close(err) {\r\n if (this.finalized) {\r\n return;\r\n }\r\n this.finalized = true;\r\n if (err !== undefined) {\r\n this.finalError = err;\r\n }\r\n // Proxy is no longer needed - garbage collect references\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n this.observers = undefined;\r\n this.onNoObservers = undefined;\r\n });\r\n }\r\n}\r\n/** Turn synchronous function into one called asynchronously. */\r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\nfunction async(fn, onError) {\r\n return (...args) => {\r\n Promise.resolve(true)\r\n .then(() => {\r\n fn(...args);\r\n })\r\n .catch((error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n });\r\n };\r\n}\r\n/**\r\n * Return true if the object passed in implements any of the named methods.\r\n */\r\nfunction implementsAnyMethods(obj, methods) {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n for (const method of methods) {\r\n if (method in obj && typeof obj[method] === 'function') {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\nfunction noop() {\r\n // do nothing\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Check to make sure the appropriate number of arguments are provided for a public function.\r\n * Throws an error if it fails.\r\n *\r\n * @param fnName The function name\r\n * @param minCount The minimum number of arguments to allow for the function call\r\n * @param maxCount The maximum number of argument to allow for the function call\r\n * @param argCount The actual number of arguments provided.\r\n */\r\nconst validateArgCount = function (fnName, minCount, maxCount, argCount) {\r\n let argError;\r\n if (argCount < minCount) {\r\n argError = 'at least ' + minCount;\r\n }\r\n else if (argCount > maxCount) {\r\n argError = maxCount === 0 ? 'none' : 'no more than ' + maxCount;\r\n }\r\n if (argError) {\r\n const error = fnName +\r\n ' failed: Was called with ' +\r\n argCount +\r\n (argCount === 1 ? ' argument.' : ' arguments.') +\r\n ' Expects ' +\r\n argError +\r\n '.';\r\n throw new Error(error);\r\n }\r\n};\r\n/**\r\n * Generates a string to prefix an error message about failed argument validation\r\n *\r\n * @param fnName The function name\r\n * @param argName The name of the argument\r\n * @return The prefix to add to the error thrown for validation.\r\n */\r\nfunction errorPrefix(fnName, argName) {\r\n return `${fnName} failed: ${argName} argument `;\r\n}\r\n/**\r\n * @param fnName\r\n * @param argumentNumber\r\n * @param namespace\r\n * @param optional\r\n */\r\nfunction validateNamespace(fnName, namespace, optional) {\r\n if (optional && !namespace) {\r\n return;\r\n }\r\n if (typeof namespace !== 'string') {\r\n //TODO: I should do more validation here. We only allow certain chars in namespaces.\r\n throw new Error(errorPrefix(fnName, 'namespace') + 'must be a valid firebase namespace.');\r\n }\r\n}\r\nfunction validateCallback(fnName, argumentName, \r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\ncallback, optional) {\r\n if (optional && !callback) {\r\n return;\r\n }\r\n if (typeof callback !== 'function') {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid function.');\r\n }\r\n}\r\nfunction validateContextObject(fnName, argumentName, context, optional) {\r\n if (optional && !context) {\r\n return;\r\n }\r\n if (typeof context !== 'object' || context === null) {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid context object.');\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Code originally came from goog.crypt.stringToUtf8ByteArray, but for some reason they\r\n// automatically replaced '\\r\\n' with '\\n', and they didn't handle surrogate pairs,\r\n// so it's been modified.\r\n// Note that not all Unicode characters appear as single characters in JavaScript strings.\r\n// fromCharCode returns the UTF-16 encoding of a character - so some Unicode characters\r\n// use 2 characters in Javascript. All 4-byte UTF-8 characters begin with a first\r\n// character in the range 0xD800 - 0xDBFF (the first character of a so-called surrogate\r\n// pair).\r\n// See http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3\r\n/**\r\n * @param {string} str\r\n * @return {Array}\r\n */\r\nconst stringToByteArray = function (str) {\r\n const out = [];\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n let c = str.charCodeAt(i);\r\n // Is this the lead surrogate in a surrogate pair?\r\n if (c >= 0xd800 && c <= 0xdbff) {\r\n const high = c - 0xd800; // the high 10 bits.\r\n i++;\r\n assert(i < str.length, 'Surrogate pair missing trail surrogate.');\r\n const low = str.charCodeAt(i) - 0xdc00; // the low 10 bits.\r\n c = 0x10000 + (high << 10) + low;\r\n }\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if (c < 65536) {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Calculate length without actually converting; useful for doing cheaper validation.\r\n * @param {string} str\r\n * @return {number}\r\n */\r\nconst stringLength = function (str) {\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const c = str.charCodeAt(i);\r\n if (c < 128) {\r\n p++;\r\n }\r\n else if (c < 2048) {\r\n p += 2;\r\n }\r\n else if (c >= 0xd800 && c <= 0xdbff) {\r\n // Lead surrogate of a surrogate pair. The pair together will take 4 bytes to represent.\r\n p += 4;\r\n i++; // skip trail surrogate.\r\n }\r\n else {\r\n p += 3;\r\n }\r\n }\r\n return p;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The amount of milliseconds to exponentially increase.\r\n */\r\nconst DEFAULT_INTERVAL_MILLIS = 1000;\r\n/**\r\n * The factor to backoff by.\r\n * Should be a number greater than 1.\r\n */\r\nconst DEFAULT_BACKOFF_FACTOR = 2;\r\n/**\r\n * The maximum milliseconds to increase to.\r\n *\r\n *

Visible for testing\r\n */\r\nconst MAX_VALUE_MILLIS = 4 * 60 * 60 * 1000; // Four hours, like iOS and Android.\r\n/**\r\n * The percentage of backoff time to randomize by.\r\n * See\r\n * http://go/safe-client-behavior#step-1-determine-the-appropriate-retry-interval-to-handle-spike-traffic\r\n * for context.\r\n *\r\n *

Visible for testing\r\n */\r\nconst RANDOM_FACTOR = 0.5;\r\n/**\r\n * Based on the backoff method from\r\n * https://github.com/google/closure-library/blob/master/closure/goog/math/exponentialbackoff.js.\r\n * Extracted here so we don't need to pass metadata and a stateful ExponentialBackoff object around.\r\n */\r\nfunction calculateBackoffMillis(backoffCount, intervalMillis = DEFAULT_INTERVAL_MILLIS, backoffFactor = DEFAULT_BACKOFF_FACTOR) {\r\n // Calculates an exponentially increasing value.\r\n // Deviation: calculates value from count and a constant interval, so we only need to save value\r\n // and count to restore state.\r\n const currBaseValue = intervalMillis * Math.pow(backoffFactor, backoffCount);\r\n // A random \"fuzz\" to avoid waves of retries.\r\n // Deviation: randomFactor is required.\r\n const randomWait = Math.round(\r\n // A fraction of the backoff value to add/subtract.\r\n // Deviation: changes multiplication order to improve readability.\r\n RANDOM_FACTOR *\r\n currBaseValue *\r\n // A random float (rounded to int by Math.round above) in the range [-1, 1]. Determines\r\n // if we add or subtract.\r\n (Math.random() - 0.5) *\r\n 2);\r\n // Limits backoff to max to avoid effectively permanent backoff.\r\n return Math.min(MAX_VALUE_MILLIS, currBaseValue + randomWait);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provide English ordinal letters after a number\r\n */\r\nfunction ordinal(i) {\r\n if (!Number.isFinite(i)) {\r\n return `${i}`;\r\n }\r\n return i + indicator(i);\r\n}\r\nfunction indicator(i) {\r\n i = Math.abs(i);\r\n const cent = i % 100;\r\n if (cent >= 10 && cent <= 20) {\r\n return 'th';\r\n }\r\n const dec = i % 10;\r\n if (dec === 1) {\r\n return 'st';\r\n }\r\n if (dec === 2) {\r\n return 'nd';\r\n }\r\n if (dec === 3) {\r\n return 'rd';\r\n }\r\n return 'th';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction getModularInstance(service) {\r\n if (service && service._delegate) {\r\n return service._delegate;\r\n }\r\n else {\r\n return service;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @internal\r\n */\r\nfunction promisifyRequest(request, errorMessage) {\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = event => {\r\n resolve(event.target.result);\r\n };\r\n request.onerror = event => {\r\n var _a;\r\n reject(`${errorMessage}: ${(_a = event.target.error) === null || _a === void 0 ? void 0 : _a.message}`);\r\n };\r\n });\r\n}\r\n/**\r\n * @internal\r\n */\r\nclass DBWrapper {\r\n constructor(_db) {\r\n this._db = _db;\r\n this.objectStoreNames = this._db.objectStoreNames;\r\n }\r\n transaction(storeNames, mode = 'readonly') {\r\n return new TransactionWrapper(this._db.transaction.call(this._db, storeNames, mode));\r\n }\r\n createObjectStore(storeName, options) {\r\n return new ObjectStoreWrapper(this._db.createObjectStore(storeName, options));\r\n }\r\n close() {\r\n this._db.close();\r\n }\r\n}\r\n/**\r\n * @internal\r\n */\r\nclass TransactionWrapper {\r\n constructor(_transaction) {\r\n this._transaction = _transaction;\r\n this.complete = new Promise((resolve, reject) => {\r\n this._transaction.oncomplete = function () {\r\n resolve();\r\n };\r\n this._transaction.onerror = () => {\r\n reject(this._transaction.error);\r\n };\r\n this._transaction.onabort = () => {\r\n reject(this._transaction.error);\r\n };\r\n });\r\n }\r\n objectStore(storeName) {\r\n return new ObjectStoreWrapper(this._transaction.objectStore(storeName));\r\n }\r\n}\r\n/**\r\n * @internal\r\n */\r\nclass ObjectStoreWrapper {\r\n constructor(_store) {\r\n this._store = _store;\r\n }\r\n index(name) {\r\n return new IndexWrapper(this._store.index(name));\r\n }\r\n createIndex(name, keypath, options) {\r\n return new IndexWrapper(this._store.createIndex(name, keypath, options));\r\n }\r\n get(key) {\r\n const request = this._store.get(key);\r\n return promisifyRequest(request, 'Error reading from IndexedDB');\r\n }\r\n put(value, key) {\r\n const request = this._store.put(value, key);\r\n return promisifyRequest(request, 'Error writing to IndexedDB');\r\n }\r\n delete(key) {\r\n const request = this._store.delete(key);\r\n return promisifyRequest(request, 'Error deleting from IndexedDB');\r\n }\r\n clear() {\r\n const request = this._store.clear();\r\n return promisifyRequest(request, 'Error clearing IndexedDB object store');\r\n }\r\n}\r\n/**\r\n * @internal\r\n */\r\nclass IndexWrapper {\r\n constructor(_index) {\r\n this._index = _index;\r\n }\r\n get(key) {\r\n const request = this._index.get(key);\r\n return promisifyRequest(request, 'Error reading from IndexedDB');\r\n }\r\n}\r\n/**\r\n * @internal\r\n */\r\nfunction openDB(dbName, dbVersion, upgradeCallback) {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const request = indexedDB.open(dbName, dbVersion);\r\n request.onsuccess = event => {\r\n resolve(new DBWrapper(event.target.result));\r\n };\r\n request.onerror = event => {\r\n var _a;\r\n reject(`Error opening indexedDB: ${(_a = event.target.error) === null || _a === void 0 ? void 0 : _a.message}`);\r\n };\r\n request.onupgradeneeded = event => {\r\n upgradeCallback(new DBWrapper(request.result), event.oldVersion, event.newVersion, new TransactionWrapper(request.transaction));\r\n };\r\n }\r\n catch (e) {\r\n reject(`Error opening indexedDB: ${e.message}`);\r\n }\r\n });\r\n}\r\n/**\r\n * @internal\r\n */\r\nasync function deleteDB(dbName) {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const request = indexedDB.deleteDatabase(dbName);\r\n request.onsuccess = () => {\r\n resolve();\r\n };\r\n request.onerror = event => {\r\n var _a;\r\n reject(`Error deleting indexedDB database \"${dbName}\": ${(_a = event.target.error) === null || _a === void 0 ? void 0 : _a.message}`);\r\n };\r\n }\r\n catch (e) {\r\n reject(`Error deleting indexedDB database \"${dbName}\": ${e.message}`);\r\n }\r\n });\r\n}\n\nexport { CONSTANTS, DBWrapper, Deferred, ErrorFactory, FirebaseError, MAX_VALUE_MILLIS, RANDOM_FACTOR, Sha1, areCookiesEnabled, assert, assertionError, async, base64, base64Decode, base64Encode, base64urlEncodeWithoutPadding, calculateBackoffMillis, contains, createMockUserToken, createSubscribe, decode, deepCopy, deepEqual, deepExtend, deleteDB, errorPrefix, extractQuerystring, getGlobal, getModularInstance, getUA, isAdmin, isBrowser, isBrowserExtension, isElectron, isEmpty, isIE, isIndexedDBAvailable, isMobileCordova, isNode, isNodeSdk, isReactNative, isSafari, isUWP, isValidFormat, isValidTimestamp, issuedAtTime, jsonEval, map, openDB, ordinal, querystring, querystringDecode, safeGet, stringLength, stringToByteArray, stringify, validateArgCount, validateCallback, validateContextObject, validateIndexedDBOpenable, validateNamespace };\n//# sourceMappingURL=index.esm2017.js.map\n","import { Deferred } from '@firebase/util';\n\n/**\r\n * Component for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass Component {\r\n /**\r\n *\r\n * @param name The public service name, e.g. app, auth, firestore, database\r\n * @param instanceFactory Service factory responsible for creating the public interface\r\n * @param type whether the service provided by the component is public or private\r\n */\r\n constructor(name, instanceFactory, type) {\r\n this.name = name;\r\n this.instanceFactory = instanceFactory;\r\n this.type = type;\r\n this.multipleInstances = false;\r\n /**\r\n * Properties to be added to the service namespace\r\n */\r\n this.serviceProps = {};\r\n this.instantiationMode = \"LAZY\" /* LAZY */;\r\n this.onInstanceCreated = null;\r\n }\r\n setInstantiationMode(mode) {\r\n this.instantiationMode = mode;\r\n return this;\r\n }\r\n setMultipleInstances(multipleInstances) {\r\n this.multipleInstances = multipleInstances;\r\n return this;\r\n }\r\n setServiceProps(props) {\r\n this.serviceProps = props;\r\n return this;\r\n }\r\n setInstanceCreatedCallback(callback) {\r\n this.onInstanceCreated = callback;\r\n return this;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for instance for service name T, e.g. 'auth', 'auth-internal'\r\n * NameServiceMapping[T] is an alias for the type of the instance\r\n */\r\nclass Provider {\r\n constructor(name, container) {\r\n this.name = name;\r\n this.container = container;\r\n this.component = null;\r\n this.instances = new Map();\r\n this.instancesDeferred = new Map();\r\n this.instancesOptions = new Map();\r\n this.onInitCallbacks = new Map();\r\n }\r\n /**\r\n * @param identifier A provider can provide mulitple instances of a service\r\n * if this.component.multipleInstances is true.\r\n */\r\n get(identifier) {\r\n // if multipleInstances is not supported, use the default name\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n if (!this.instancesDeferred.has(normalizedIdentifier)) {\r\n const deferred = new Deferred();\r\n this.instancesDeferred.set(normalizedIdentifier, deferred);\r\n if (this.isInitialized(normalizedIdentifier) ||\r\n this.shouldAutoInitialize()) {\r\n // initialize the service if it can be auto-initialized\r\n try {\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n if (instance) {\r\n deferred.resolve(instance);\r\n }\r\n }\r\n catch (e) {\r\n // when the instance factory throws an exception during get(), it should not cause\r\n // a fatal error. We just return the unresolved promise in this case.\r\n }\r\n }\r\n }\r\n return this.instancesDeferred.get(normalizedIdentifier).promise;\r\n }\r\n getImmediate(options) {\r\n var _a;\r\n // if multipleInstances is not supported, use the default name\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(options === null || options === void 0 ? void 0 : options.identifier);\r\n const optional = (_a = options === null || options === void 0 ? void 0 : options.optional) !== null && _a !== void 0 ? _a : false;\r\n if (this.isInitialized(normalizedIdentifier) ||\r\n this.shouldAutoInitialize()) {\r\n try {\r\n return this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n }\r\n catch (e) {\r\n if (optional) {\r\n return null;\r\n }\r\n else {\r\n throw e;\r\n }\r\n }\r\n }\r\n else {\r\n // In case a component is not initialized and should/can not be auto-initialized at the moment, return null if the optional flag is set, or throw\r\n if (optional) {\r\n return null;\r\n }\r\n else {\r\n throw Error(`Service ${this.name} is not available`);\r\n }\r\n }\r\n }\r\n getComponent() {\r\n return this.component;\r\n }\r\n setComponent(component) {\r\n if (component.name !== this.name) {\r\n throw Error(`Mismatching Component ${component.name} for Provider ${this.name}.`);\r\n }\r\n if (this.component) {\r\n throw Error(`Component for ${this.name} has already been provided`);\r\n }\r\n this.component = component;\r\n // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)\r\n if (!this.shouldAutoInitialize()) {\r\n return;\r\n }\r\n // if the service is eager, initialize the default instance\r\n if (isComponentEager(component)) {\r\n try {\r\n this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });\r\n }\r\n catch (e) {\r\n // when the instance factory for an eager Component throws an exception during the eager\r\n // initialization, it should not cause a fatal error.\r\n // TODO: Investigate if we need to make it configurable, because some component may want to cause\r\n // a fatal error in this case?\r\n }\r\n }\r\n // Create service instances for the pending promises and resolve them\r\n // NOTE: if this.multipleInstances is false, only the default instance will be created\r\n // and all promises with resolve with it regardless of the identifier.\r\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n try {\r\n // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n instanceDeferred.resolve(instance);\r\n }\r\n catch (e) {\r\n // when the instance factory throws an exception, it should not cause\r\n // a fatal error. We just leave the promise unresolved.\r\n }\r\n }\r\n }\r\n clearInstance(identifier = DEFAULT_ENTRY_NAME) {\r\n this.instancesDeferred.delete(identifier);\r\n this.instancesOptions.delete(identifier);\r\n this.instances.delete(identifier);\r\n }\r\n // app.delete() will call this method on every provider to delete the services\r\n // TODO: should we mark the provider as deleted?\r\n async delete() {\r\n const services = Array.from(this.instances.values());\r\n await Promise.all([\r\n ...services\r\n .filter(service => 'INTERNAL' in service) // legacy services\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .map(service => service.INTERNAL.delete()),\r\n ...services\r\n .filter(service => '_delete' in service) // modularized services\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .map(service => service._delete())\r\n ]);\r\n }\r\n isComponentSet() {\r\n return this.component != null;\r\n }\r\n isInitialized(identifier = DEFAULT_ENTRY_NAME) {\r\n return this.instances.has(identifier);\r\n }\r\n getOptions(identifier = DEFAULT_ENTRY_NAME) {\r\n return this.instancesOptions.get(identifier) || {};\r\n }\r\n initialize(opts = {}) {\r\n const { options = {} } = opts;\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(opts.instanceIdentifier);\r\n if (this.isInitialized(normalizedIdentifier)) {\r\n throw Error(`${this.name}(${normalizedIdentifier}) has already been initialized`);\r\n }\r\n if (!this.isComponentSet()) {\r\n throw Error(`Component ${this.name} has not been registered yet`);\r\n }\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier,\r\n options\r\n });\r\n // resolve any pending promise waiting for the service instance\r\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n if (normalizedIdentifier === normalizedDeferredIdentifier) {\r\n instanceDeferred.resolve(instance);\r\n }\r\n }\r\n return instance;\r\n }\r\n /**\r\n *\r\n * @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().\r\n * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.\r\n *\r\n * @param identifier An optional instance identifier\r\n * @returns a function to unregister the callback\r\n */\r\n onInit(callback, identifier) {\r\n var _a;\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n const existingCallbacks = (_a = this.onInitCallbacks.get(normalizedIdentifier)) !== null && _a !== void 0 ? _a : new Set();\r\n existingCallbacks.add(callback);\r\n this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);\r\n const existingInstance = this.instances.get(normalizedIdentifier);\r\n if (existingInstance) {\r\n callback(existingInstance, normalizedIdentifier);\r\n }\r\n return () => {\r\n existingCallbacks.delete(callback);\r\n };\r\n }\r\n /**\r\n * Invoke onInit callbacks synchronously\r\n * @param instance the service instance`\r\n */\r\n invokeOnInitCallbacks(instance, identifier) {\r\n const callbacks = this.onInitCallbacks.get(identifier);\r\n if (!callbacks) {\r\n return;\r\n }\r\n for (const callback of callbacks) {\r\n try {\r\n callback(instance, identifier);\r\n }\r\n catch (_a) {\r\n // ignore errors in the onInit callback\r\n }\r\n }\r\n }\r\n getOrInitializeService({ instanceIdentifier, options = {} }) {\r\n let instance = this.instances.get(instanceIdentifier);\r\n if (!instance && this.component) {\r\n instance = this.component.instanceFactory(this.container, {\r\n instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),\r\n options\r\n });\r\n this.instances.set(instanceIdentifier, instance);\r\n this.instancesOptions.set(instanceIdentifier, options);\r\n /**\r\n * Invoke onInit listeners.\r\n * Note this.component.onInstanceCreated is different, which is used by the component creator,\r\n * while onInit listeners are registered by consumers of the provider.\r\n */\r\n this.invokeOnInitCallbacks(instance, instanceIdentifier);\r\n /**\r\n * Order is important\r\n * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which\r\n * makes `isInitialized()` return true.\r\n */\r\n if (this.component.onInstanceCreated) {\r\n try {\r\n this.component.onInstanceCreated(this.container, instanceIdentifier, instance);\r\n }\r\n catch (_a) {\r\n // ignore errors in the onInstanceCreatedCallback\r\n }\r\n }\r\n }\r\n return instance || null;\r\n }\r\n normalizeInstanceIdentifier(identifier = DEFAULT_ENTRY_NAME) {\r\n if (this.component) {\r\n return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;\r\n }\r\n else {\r\n return identifier; // assume multiple instances are supported before the component is provided.\r\n }\r\n }\r\n shouldAutoInitialize() {\r\n return (!!this.component &&\r\n this.component.instantiationMode !== \"EXPLICIT\" /* EXPLICIT */);\r\n }\r\n}\r\n// undefined should be passed to the service factory for the default instance\r\nfunction normalizeIdentifierForFactory(identifier) {\r\n return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;\r\n}\r\nfunction isComponentEager(component) {\r\n return component.instantiationMode === \"EAGER\" /* EAGER */;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass ComponentContainer {\r\n constructor(name) {\r\n this.name = name;\r\n this.providers = new Map();\r\n }\r\n /**\r\n *\r\n * @param component Component being added\r\n * @param overwrite When a component with the same name has already been registered,\r\n * if overwrite is true: overwrite the existing component with the new component and create a new\r\n * provider with the new component. It can be useful in tests where you want to use different mocks\r\n * for different tests.\r\n * if overwrite is false: throw an exception\r\n */\r\n addComponent(component) {\r\n const provider = this.getProvider(component.name);\r\n if (provider.isComponentSet()) {\r\n throw new Error(`Component ${component.name} has already been registered with ${this.name}`);\r\n }\r\n provider.setComponent(component);\r\n }\r\n addOrOverwriteComponent(component) {\r\n const provider = this.getProvider(component.name);\r\n if (provider.isComponentSet()) {\r\n // delete the existing provider from the container, so we can register the new component\r\n this.providers.delete(component.name);\r\n }\r\n this.addComponent(component);\r\n }\r\n /**\r\n * getProvider provides a type safe interface where it can only be called with a field name\r\n * present in NameServiceMapping interface.\r\n *\r\n * Firebase SDKs providing services should extend NameServiceMapping interface to register\r\n * themselves.\r\n */\r\n getProvider(name) {\r\n if (this.providers.has(name)) {\r\n return this.providers.get(name);\r\n }\r\n // create a Provider for a service that hasn't registered with Firebase\r\n const provider = new Provider(name, this);\r\n this.providers.set(name, provider);\r\n return provider;\r\n }\r\n getProviders() {\r\n return Array.from(this.providers.values());\r\n }\r\n}\n\nexport { Component, ComponentContainer, Provider };\n//# sourceMappingURL=index.esm2017.js.map\n","/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A container for all of the Logger instances\r\n */\r\nconst instances = [];\r\n/**\r\n * The JS SDK supports 5 log levels and also allows a user the ability to\r\n * silence the logs altogether.\r\n *\r\n * The order is a follows:\r\n * DEBUG < VERBOSE < INFO < WARN < ERROR\r\n *\r\n * All of the log types above the current log level will be captured (i.e. if\r\n * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and\r\n * `VERBOSE` logs will not)\r\n */\r\nvar LogLevel;\r\n(function (LogLevel) {\r\n LogLevel[LogLevel[\"DEBUG\"] = 0] = \"DEBUG\";\r\n LogLevel[LogLevel[\"VERBOSE\"] = 1] = \"VERBOSE\";\r\n LogLevel[LogLevel[\"INFO\"] = 2] = \"INFO\";\r\n LogLevel[LogLevel[\"WARN\"] = 3] = \"WARN\";\r\n LogLevel[LogLevel[\"ERROR\"] = 4] = \"ERROR\";\r\n LogLevel[LogLevel[\"SILENT\"] = 5] = \"SILENT\";\r\n})(LogLevel || (LogLevel = {}));\r\nconst levelStringToEnum = {\r\n 'debug': LogLevel.DEBUG,\r\n 'verbose': LogLevel.VERBOSE,\r\n 'info': LogLevel.INFO,\r\n 'warn': LogLevel.WARN,\r\n 'error': LogLevel.ERROR,\r\n 'silent': LogLevel.SILENT\r\n};\r\n/**\r\n * The default log level\r\n */\r\nconst defaultLogLevel = LogLevel.INFO;\r\n/**\r\n * By default, `console.debug` is not displayed in the developer console (in\r\n * chrome). To avoid forcing users to have to opt-in to these logs twice\r\n * (i.e. once for firebase, and once in the console), we are sending `DEBUG`\r\n * logs to the `console.log` function.\r\n */\r\nconst ConsoleMethod = {\r\n [LogLevel.DEBUG]: 'log',\r\n [LogLevel.VERBOSE]: 'log',\r\n [LogLevel.INFO]: 'info',\r\n [LogLevel.WARN]: 'warn',\r\n [LogLevel.ERROR]: 'error'\r\n};\r\n/**\r\n * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR\r\n * messages on to their corresponding console counterparts (if the log method\r\n * is supported by the current log level)\r\n */\r\nconst defaultLogHandler = (instance, logType, ...args) => {\r\n if (logType < instance.logLevel) {\r\n return;\r\n }\r\n const now = new Date().toISOString();\r\n const method = ConsoleMethod[logType];\r\n if (method) {\r\n console[method](`[${now}] ${instance.name}:`, ...args);\r\n }\r\n else {\r\n throw new Error(`Attempted to log a message with an invalid logType (value: ${logType})`);\r\n }\r\n};\r\nclass Logger {\r\n /**\r\n * Gives you an instance of a Logger to capture messages according to\r\n * Firebase's logging scheme.\r\n *\r\n * @param name The name that the logs will be associated with\r\n */\r\n constructor(name) {\r\n this.name = name;\r\n /**\r\n * The log level of the given Logger instance.\r\n */\r\n this._logLevel = defaultLogLevel;\r\n /**\r\n * The main (internal) log handler for the Logger instance.\r\n * Can be set to a new function in internal package code but not by user.\r\n */\r\n this._logHandler = defaultLogHandler;\r\n /**\r\n * The optional, additional, user-defined log handler for the Logger instance.\r\n */\r\n this._userLogHandler = null;\r\n /**\r\n * Capture the current instance for later use\r\n */\r\n instances.push(this);\r\n }\r\n get logLevel() {\r\n return this._logLevel;\r\n }\r\n set logLevel(val) {\r\n if (!(val in LogLevel)) {\r\n throw new TypeError(`Invalid value \"${val}\" assigned to \\`logLevel\\``);\r\n }\r\n this._logLevel = val;\r\n }\r\n // Workaround for setter/getter having to be the same type.\r\n setLogLevel(val) {\r\n this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val;\r\n }\r\n get logHandler() {\r\n return this._logHandler;\r\n }\r\n set logHandler(val) {\r\n if (typeof val !== 'function') {\r\n throw new TypeError('Value assigned to `logHandler` must be a function');\r\n }\r\n this._logHandler = val;\r\n }\r\n get userLogHandler() {\r\n return this._userLogHandler;\r\n }\r\n set userLogHandler(val) {\r\n this._userLogHandler = val;\r\n }\r\n /**\r\n * The functions below are all based on the `console` interface\r\n */\r\n debug(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args);\r\n this._logHandler(this, LogLevel.DEBUG, ...args);\r\n }\r\n log(...args) {\r\n this._userLogHandler &&\r\n this._userLogHandler(this, LogLevel.VERBOSE, ...args);\r\n this._logHandler(this, LogLevel.VERBOSE, ...args);\r\n }\r\n info(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args);\r\n this._logHandler(this, LogLevel.INFO, ...args);\r\n }\r\n warn(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args);\r\n this._logHandler(this, LogLevel.WARN, ...args);\r\n }\r\n error(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args);\r\n this._logHandler(this, LogLevel.ERROR, ...args);\r\n }\r\n}\r\nfunction setLogLevel(level) {\r\n instances.forEach(inst => {\r\n inst.setLogLevel(level);\r\n });\r\n}\r\nfunction setUserLogHandler(logCallback, options) {\r\n for (const instance of instances) {\r\n let customLogLevel = null;\r\n if (options && options.level) {\r\n customLogLevel = levelStringToEnum[options.level];\r\n }\r\n if (logCallback === null) {\r\n instance.userLogHandler = null;\r\n }\r\n else {\r\n instance.userLogHandler = (instance, level, ...args) => {\r\n const message = args\r\n .map(arg => {\r\n if (arg == null) {\r\n return null;\r\n }\r\n else if (typeof arg === 'string') {\r\n return arg;\r\n }\r\n else if (typeof arg === 'number' || typeof arg === 'boolean') {\r\n return arg.toString();\r\n }\r\n else if (arg instanceof Error) {\r\n return arg.message;\r\n }\r\n else {\r\n try {\r\n return JSON.stringify(arg);\r\n }\r\n catch (ignored) {\r\n return null;\r\n }\r\n }\r\n })\r\n .filter(arg => arg)\r\n .join(' ');\r\n if (level >= (customLogLevel !== null && customLogLevel !== void 0 ? customLogLevel : instance.logLevel)) {\r\n logCallback({\r\n level: LogLevel[level].toLowerCase(),\r\n message,\r\n args,\r\n type: instance.name\r\n });\r\n }\r\n };\r\n }\r\n }\r\n}\n\nexport { LogLevel, Logger, setLogLevel, setUserLogHandler };\n//# sourceMappingURL=index.esm2017.js.map\n","import { Component, ComponentContainer } from '@firebase/component';\nimport { Logger, setUserLogHandler, setLogLevel as setLogLevel$1 } from '@firebase/logger';\nimport { ErrorFactory, deepEqual, openDB, base64urlEncodeWithoutPadding, isIndexedDBAvailable, validateIndexedDBOpenable } from '@firebase/util';\nexport { FirebaseError } from '@firebase/util';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass PlatformLoggerServiceImpl {\r\n constructor(container) {\r\n this.container = container;\r\n }\r\n // In initial implementation, this will be called by installations on\r\n // auth token refresh, and installations will send this string.\r\n getPlatformInfoString() {\r\n const providers = this.container.getProviders();\r\n // Loop through providers and get library/version pairs from any that are\r\n // version components.\r\n return providers\r\n .map(provider => {\r\n if (isVersionServiceProvider(provider)) {\r\n const service = provider.getImmediate();\r\n return `${service.library}/${service.version}`;\r\n }\r\n else {\r\n return null;\r\n }\r\n })\r\n .filter(logString => logString)\r\n .join(' ');\r\n }\r\n}\r\n/**\r\n *\r\n * @param provider check if this provider provides a VersionService\r\n *\r\n * NOTE: Using Provider<'app-version'> is a hack to indicate that the provider\r\n * provides VersionService. The provider is not necessarily a 'app-version'\r\n * provider.\r\n */\r\nfunction isVersionServiceProvider(provider) {\r\n const component = provider.getComponent();\r\n return (component === null || component === void 0 ? void 0 : component.type) === \"VERSION\" /* VERSION */;\r\n}\n\nconst name$o = \"@firebase/app\";\nconst version$1 = \"0.7.21\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst logger = new Logger('@firebase/app');\n\nconst name$n = \"@firebase/app-compat\";\n\nconst name$m = \"@firebase/analytics-compat\";\n\nconst name$l = \"@firebase/analytics\";\n\nconst name$k = \"@firebase/app-check-compat\";\n\nconst name$j = \"@firebase/app-check\";\n\nconst name$i = \"@firebase/auth\";\n\nconst name$h = \"@firebase/auth-compat\";\n\nconst name$g = \"@firebase/database\";\n\nconst name$f = \"@firebase/database-compat\";\n\nconst name$e = \"@firebase/functions\";\n\nconst name$d = \"@firebase/functions-compat\";\n\nconst name$c = \"@firebase/installations\";\n\nconst name$b = \"@firebase/installations-compat\";\n\nconst name$a = \"@firebase/messaging\";\n\nconst name$9 = \"@firebase/messaging-compat\";\n\nconst name$8 = \"@firebase/performance\";\n\nconst name$7 = \"@firebase/performance-compat\";\n\nconst name$6 = \"@firebase/remote-config\";\n\nconst name$5 = \"@firebase/remote-config-compat\";\n\nconst name$4 = \"@firebase/storage\";\n\nconst name$3 = \"@firebase/storage-compat\";\n\nconst name$2 = \"@firebase/firestore\";\n\nconst name$1 = \"@firebase/firestore-compat\";\n\nconst name = \"firebase\";\nconst version = \"9.6.11\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The default app name\r\n *\r\n * @internal\r\n */\r\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\r\nconst PLATFORM_LOG_STRING = {\r\n [name$o]: 'fire-core',\r\n [name$n]: 'fire-core-compat',\r\n [name$l]: 'fire-analytics',\r\n [name$m]: 'fire-analytics-compat',\r\n [name$j]: 'fire-app-check',\r\n [name$k]: 'fire-app-check-compat',\r\n [name$i]: 'fire-auth',\r\n [name$h]: 'fire-auth-compat',\r\n [name$g]: 'fire-rtdb',\r\n [name$f]: 'fire-rtdb-compat',\r\n [name$e]: 'fire-fn',\r\n [name$d]: 'fire-fn-compat',\r\n [name$c]: 'fire-iid',\r\n [name$b]: 'fire-iid-compat',\r\n [name$a]: 'fire-fcm',\r\n [name$9]: 'fire-fcm-compat',\r\n [name$8]: 'fire-perf',\r\n [name$7]: 'fire-perf-compat',\r\n [name$6]: 'fire-rc',\r\n [name$5]: 'fire-rc-compat',\r\n [name$4]: 'fire-gcs',\r\n [name$3]: 'fire-gcs-compat',\r\n [name$2]: 'fire-fst',\r\n [name$1]: 'fire-fst-compat',\r\n 'fire-js': 'fire-js',\r\n [name]: 'fire-js-all'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @internal\r\n */\r\nconst _apps = new Map();\r\n/**\r\n * Registered components.\r\n *\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nconst _components = new Map();\r\n/**\r\n * @param component - the component being added to this app's container\r\n *\r\n * @internal\r\n */\r\nfunction _addComponent(app, component) {\r\n try {\r\n app.container.addComponent(component);\r\n }\r\n catch (e) {\r\n logger.debug(`Component ${component.name} failed to register with FirebaseApp ${app.name}`, e);\r\n }\r\n}\r\n/**\r\n *\r\n * @internal\r\n */\r\nfunction _addOrOverwriteComponent(app, component) {\r\n app.container.addOrOverwriteComponent(component);\r\n}\r\n/**\r\n *\r\n * @param component - the component to register\r\n * @returns whether or not the component is registered successfully\r\n *\r\n * @internal\r\n */\r\nfunction _registerComponent(component) {\r\n const componentName = component.name;\r\n if (_components.has(componentName)) {\r\n logger.debug(`There were multiple attempts to register component ${componentName}.`);\r\n return false;\r\n }\r\n _components.set(componentName, component);\r\n // add the component to existing app instances\r\n for (const app of _apps.values()) {\r\n _addComponent(app, component);\r\n }\r\n return true;\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n *\r\n * @returns the provider for the service with the matching name\r\n *\r\n * @internal\r\n */\r\nfunction _getProvider(app, name) {\r\n const heartbeatController = app.container\r\n .getProvider('heartbeat')\r\n .getImmediate({ optional: true });\r\n if (heartbeatController) {\r\n void heartbeatController.triggerHeartbeat();\r\n }\r\n return app.container.getProvider(name);\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n * @param instanceIdentifier - service instance identifier in case the service supports multiple instances\r\n *\r\n * @internal\r\n */\r\nfunction _removeServiceInstance(app, name, instanceIdentifier = DEFAULT_ENTRY_NAME) {\r\n _getProvider(app, name).clearInstance(instanceIdentifier);\r\n}\r\n/**\r\n * Test only\r\n *\r\n * @internal\r\n */\r\nfunction _clearComponents() {\r\n _components.clear();\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERRORS = {\r\n [\"no-app\" /* NO_APP */]: \"No Firebase App '{$appName}' has been created - \" +\r\n 'call Firebase App.initializeApp()',\r\n [\"bad-app-name\" /* BAD_APP_NAME */]: \"Illegal App name: '{$appName}\",\r\n [\"duplicate-app\" /* DUPLICATE_APP */]: \"Firebase App named '{$appName}' already exists with different options or config\",\r\n [\"app-deleted\" /* APP_DELETED */]: \"Firebase App named '{$appName}' already deleted\",\r\n [\"invalid-app-argument\" /* INVALID_APP_ARGUMENT */]: 'firebase.{$appName}() takes either no argument or a ' +\r\n 'Firebase App instance.',\r\n [\"invalid-log-argument\" /* INVALID_LOG_ARGUMENT */]: 'First argument to `onLog` must be null or a function.',\r\n [\"storage-open\" /* STORAGE_OPEN */]: 'Error thrown when opening storage. Original error: {$originalErrorMessage}.',\r\n [\"storage-get\" /* STORAGE_GET */]: 'Error thrown when reading from storage. Original error: {$originalErrorMessage}.',\r\n [\"storage-set\" /* STORAGE_WRITE */]: 'Error thrown when writing to storage. Original error: {$originalErrorMessage}.',\r\n [\"storage-delete\" /* STORAGE_DELETE */]: 'Error thrown when deleting from storage. Original error: {$originalErrorMessage}.'\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory('app', 'Firebase', ERRORS);\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass FirebaseAppImpl {\r\n constructor(options, config, container) {\r\n this._isDeleted = false;\r\n this._options = Object.assign({}, options);\r\n this._config = Object.assign({}, config);\r\n this._name = config.name;\r\n this._automaticDataCollectionEnabled =\r\n config.automaticDataCollectionEnabled;\r\n this._container = container;\r\n this.container.addComponent(new Component('app', () => this, \"PUBLIC\" /* PUBLIC */));\r\n }\r\n get automaticDataCollectionEnabled() {\r\n this.checkDestroyed();\r\n return this._automaticDataCollectionEnabled;\r\n }\r\n set automaticDataCollectionEnabled(val) {\r\n this.checkDestroyed();\r\n this._automaticDataCollectionEnabled = val;\r\n }\r\n get name() {\r\n this.checkDestroyed();\r\n return this._name;\r\n }\r\n get options() {\r\n this.checkDestroyed();\r\n return this._options;\r\n }\r\n get config() {\r\n this.checkDestroyed();\r\n return this._config;\r\n }\r\n get container() {\r\n return this._container;\r\n }\r\n get isDeleted() {\r\n return this._isDeleted;\r\n }\r\n set isDeleted(val) {\r\n this._isDeleted = val;\r\n }\r\n /**\r\n * This function will throw an Error if the App has already been deleted -\r\n * use before performing API actions on the App.\r\n */\r\n checkDestroyed() {\r\n if (this.isDeleted) {\r\n throw ERROR_FACTORY.create(\"app-deleted\" /* APP_DELETED */, { appName: this._name });\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The current SDK version.\r\n *\r\n * @public\r\n */\r\nconst SDK_VERSION = version;\r\nfunction initializeApp(options, rawConfig = {}) {\r\n if (typeof rawConfig !== 'object') {\r\n const name = rawConfig;\r\n rawConfig = { name };\r\n }\r\n const config = Object.assign({ name: DEFAULT_ENTRY_NAME, automaticDataCollectionEnabled: false }, rawConfig);\r\n const name = config.name;\r\n if (typeof name !== 'string' || !name) {\r\n throw ERROR_FACTORY.create(\"bad-app-name\" /* BAD_APP_NAME */, {\r\n appName: String(name)\r\n });\r\n }\r\n const existingApp = _apps.get(name);\r\n if (existingApp) {\r\n // return the existing app if options and config deep equal the ones in the existing app.\r\n if (deepEqual(options, existingApp.options) &&\r\n deepEqual(config, existingApp.config)) {\r\n return existingApp;\r\n }\r\n else {\r\n throw ERROR_FACTORY.create(\"duplicate-app\" /* DUPLICATE_APP */, { appName: name });\r\n }\r\n }\r\n const container = new ComponentContainer(name);\r\n for (const component of _components.values()) {\r\n container.addComponent(component);\r\n }\r\n const newApp = new FirebaseAppImpl(options, config, container);\r\n _apps.set(name, newApp);\r\n return newApp;\r\n}\r\n/**\r\n * Retrieves a {@link @firebase/app#FirebaseApp} instance.\r\n *\r\n * When called with no arguments, the default app is returned. When an app name\r\n * is provided, the app corresponding to that name is returned.\r\n *\r\n * An exception is thrown if the app being retrieved has not yet been\r\n * initialized.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return the default app\r\n * const app = getApp();\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return a named app\r\n * const otherApp = getApp(\"otherApp\");\r\n * ```\r\n *\r\n * @param name - Optional name of the app to return. If no name is\r\n * provided, the default is `\"[DEFAULT]\"`.\r\n *\r\n * @returns The app corresponding to the provided app name.\r\n * If no app name is provided, the default app is returned.\r\n *\r\n * @public\r\n */\r\nfunction getApp(name = DEFAULT_ENTRY_NAME) {\r\n const app = _apps.get(name);\r\n if (!app) {\r\n throw ERROR_FACTORY.create(\"no-app\" /* NO_APP */, { appName: name });\r\n }\r\n return app;\r\n}\r\n/**\r\n * A (read-only) array of all initialized apps.\r\n * @public\r\n */\r\nfunction getApps() {\r\n return Array.from(_apps.values());\r\n}\r\n/**\r\n * Renders this app unusable and frees the resources of all associated\r\n * services.\r\n *\r\n * @example\r\n * ```javascript\r\n * deleteApp(app)\r\n * .then(function() {\r\n * console.log(\"App deleted successfully\");\r\n * })\r\n * .catch(function(error) {\r\n * console.log(\"Error deleting app:\", error);\r\n * });\r\n * ```\r\n *\r\n * @public\r\n */\r\nasync function deleteApp(app) {\r\n const name = app.name;\r\n if (_apps.has(name)) {\r\n _apps.delete(name);\r\n await Promise.all(app.container\r\n .getProviders()\r\n .map(provider => provider.delete()));\r\n app.isDeleted = true;\r\n }\r\n}\r\n/**\r\n * Registers a library's name and version for platform logging purposes.\r\n * @param library - Name of 1p or 3p library (e.g. firestore, angularfire)\r\n * @param version - Current version of that library.\r\n * @param variant - Bundle variant, e.g., node, rn, etc.\r\n *\r\n * @public\r\n */\r\nfunction registerVersion(libraryKeyOrName, version, variant) {\r\n var _a;\r\n // TODO: We can use this check to whitelist strings when/if we set up\r\n // a good whitelist system.\r\n let library = (_a = PLATFORM_LOG_STRING[libraryKeyOrName]) !== null && _a !== void 0 ? _a : libraryKeyOrName;\r\n if (variant) {\r\n library += `-${variant}`;\r\n }\r\n const libraryMismatch = library.match(/\\s|\\//);\r\n const versionMismatch = version.match(/\\s|\\//);\r\n if (libraryMismatch || versionMismatch) {\r\n const warning = [\r\n `Unable to register library \"${library}\" with version \"${version}\":`\r\n ];\r\n if (libraryMismatch) {\r\n warning.push(`library name \"${library}\" contains illegal characters (whitespace or \"/\")`);\r\n }\r\n if (libraryMismatch && versionMismatch) {\r\n warning.push('and');\r\n }\r\n if (versionMismatch) {\r\n warning.push(`version name \"${version}\" contains illegal characters (whitespace or \"/\")`);\r\n }\r\n logger.warn(warning.join(' '));\r\n return;\r\n }\r\n _registerComponent(new Component(`${library}-version`, () => ({ library, version }), \"VERSION\" /* VERSION */));\r\n}\r\n/**\r\n * Sets log handler for all Firebase SDKs.\r\n * @param logCallback - An optional custom log handler that executes user code whenever\r\n * the Firebase SDK makes a logging call.\r\n *\r\n * @public\r\n */\r\nfunction onLog(logCallback, options) {\r\n if (logCallback !== null && typeof logCallback !== 'function') {\r\n throw ERROR_FACTORY.create(\"invalid-log-argument\" /* INVALID_LOG_ARGUMENT */);\r\n }\r\n setUserLogHandler(logCallback, options);\r\n}\r\n/**\r\n * Sets log level for all Firebase SDKs.\r\n *\r\n * All of the log types above the current log level are captured (i.e. if\r\n * you set the log level to `info`, errors are logged, but `debug` and\r\n * `verbose` logs are not).\r\n *\r\n * @public\r\n */\r\nfunction setLogLevel(logLevel) {\r\n setLogLevel$1(logLevel);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DB_NAME = 'firebase-heartbeat-database';\r\nconst DB_VERSION = 1;\r\nconst STORE_NAME = 'firebase-heartbeat-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DB_NAME, DB_VERSION, (db, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through\r\n // behavior is what we want, because if there are multiple versions between\r\n // the old version and the current version, we want ALL the migrations\r\n // that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n db.createObjectStore(STORE_NAME);\r\n }\r\n }).catch(e => {\r\n throw ERROR_FACTORY.create(\"storage-open\" /* STORAGE_OPEN */, {\r\n originalErrorMessage: e.message\r\n });\r\n });\r\n }\r\n return dbPromise;\r\n}\r\nasync function readHeartbeatsFromIndexedDB(app) {\r\n try {\r\n const db = await getDbPromise();\r\n return db\r\n .transaction(STORE_NAME)\r\n .objectStore(STORE_NAME)\r\n .get(computeKey(app));\r\n }\r\n catch (e) {\r\n throw ERROR_FACTORY.create(\"storage-get\" /* STORAGE_GET */, {\r\n originalErrorMessage: e.message\r\n });\r\n }\r\n}\r\nasync function writeHeartbeatsToIndexedDB(app, heartbeatObject) {\r\n try {\r\n const db = await getDbPromise();\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const objectStore = tx.objectStore(STORE_NAME);\r\n await objectStore.put(heartbeatObject, computeKey(app));\r\n return tx.complete;\r\n }\r\n catch (e) {\r\n throw ERROR_FACTORY.create(\"storage-set\" /* STORAGE_WRITE */, {\r\n originalErrorMessage: e.message\r\n });\r\n }\r\n}\r\nfunction computeKey(app) {\r\n return `${app.name}!${app.options.appId}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst MAX_HEADER_BYTES = 1024;\r\n// 30 days\r\nconst STORED_HEARTBEAT_RETENTION_MAX_MILLIS = 30 * 24 * 60 * 60 * 1000;\r\nclass HeartbeatServiceImpl {\r\n constructor(container) {\r\n this.container = container;\r\n /**\r\n * In-memory cache for heartbeats, used by getHeartbeatsHeader() to generate\r\n * the header string.\r\n * Stores one record per date. This will be consolidated into the standard\r\n * format of one record per user agent string before being sent as a header.\r\n * Populated from indexedDB when the controller is instantiated and should\r\n * be kept in sync with indexedDB.\r\n * Leave public for easier testing.\r\n */\r\n this._heartbeatsCache = null;\r\n const app = this.container.getProvider('app').getImmediate();\r\n this._storage = new HeartbeatStorageImpl(app);\r\n this._heartbeatsCachePromise = this._storage.read().then(result => {\r\n this._heartbeatsCache = result;\r\n return result;\r\n });\r\n }\r\n /**\r\n * Called to report a heartbeat. The function will generate\r\n * a HeartbeatsByUserAgent object, update heartbeatsCache, and persist it\r\n * to IndexedDB.\r\n * Note that we only store one heartbeat per day. So if a heartbeat for today is\r\n * already logged, subsequent calls to this function in the same day will be ignored.\r\n */\r\n async triggerHeartbeat() {\r\n const platformLogger = this.container\r\n .getProvider('platform-logger')\r\n .getImmediate();\r\n // This is the \"Firebase user agent\" string from the platform logger\r\n // service, not the browser user agent.\r\n const agent = platformLogger.getPlatformInfoString();\r\n const date = getUTCDateString();\r\n if (this._heartbeatsCache === null) {\r\n this._heartbeatsCache = await this._heartbeatsCachePromise;\r\n }\r\n // Do not store a heartbeat if one is already stored for this day\r\n // or if a header has already been sent today.\r\n if (this._heartbeatsCache.lastSentHeartbeatDate === date ||\r\n this._heartbeatsCache.heartbeats.some(singleDateHeartbeat => singleDateHeartbeat.date === date)) {\r\n return;\r\n }\r\n else {\r\n // There is no entry for this date. Create one.\r\n this._heartbeatsCache.heartbeats.push({ date, agent });\r\n }\r\n // Remove entries older than 30 days.\r\n this._heartbeatsCache.heartbeats = this._heartbeatsCache.heartbeats.filter(singleDateHeartbeat => {\r\n const hbTimestamp = new Date(singleDateHeartbeat.date).valueOf();\r\n const now = Date.now();\r\n return now - hbTimestamp <= STORED_HEARTBEAT_RETENTION_MAX_MILLIS;\r\n });\r\n return this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n /**\r\n * Returns a base64 encoded string which can be attached to the heartbeat-specific header directly.\r\n * It also clears all heartbeats from memory as well as in IndexedDB.\r\n *\r\n * NOTE: Consuming product SDKs should not send the header if this method\r\n * returns an empty string.\r\n */\r\n async getHeartbeatsHeader() {\r\n if (this._heartbeatsCache === null) {\r\n await this._heartbeatsCachePromise;\r\n }\r\n // If it's still null or the array is empty, there is no data to send.\r\n if (this._heartbeatsCache === null ||\r\n this._heartbeatsCache.heartbeats.length === 0) {\r\n return '';\r\n }\r\n const date = getUTCDateString();\r\n // Extract as many heartbeats from the cache as will fit under the size limit.\r\n const { heartbeatsToSend, unsentEntries } = extractHeartbeatsForHeader(this._heartbeatsCache.heartbeats);\r\n const headerString = base64urlEncodeWithoutPadding(JSON.stringify({ version: 2, heartbeats: heartbeatsToSend }));\r\n // Store last sent date to prevent another being logged/sent for the same day.\r\n this._heartbeatsCache.lastSentHeartbeatDate = date;\r\n if (unsentEntries.length > 0) {\r\n // Store any unsent entries if they exist.\r\n this._heartbeatsCache.heartbeats = unsentEntries;\r\n // This seems more likely than emptying the array (below) to lead to some odd state\r\n // since the cache isn't empty and this will be called again on the next request,\r\n // and is probably safest if we await it.\r\n await this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n else {\r\n this._heartbeatsCache.heartbeats = [];\r\n // Do not wait for this, to reduce latency.\r\n void this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n return headerString;\r\n }\r\n}\r\nfunction getUTCDateString() {\r\n const today = new Date();\r\n // Returns date format 'YYYY-MM-DD'\r\n return today.toISOString().substring(0, 10);\r\n}\r\nfunction extractHeartbeatsForHeader(heartbeatsCache, maxSize = MAX_HEADER_BYTES) {\r\n // Heartbeats grouped by user agent in the standard format to be sent in\r\n // the header.\r\n const heartbeatsToSend = [];\r\n // Single date format heartbeats that are not sent.\r\n let unsentEntries = heartbeatsCache.slice();\r\n for (const singleDateHeartbeat of heartbeatsCache) {\r\n // Look for an existing entry with the same user agent.\r\n const heartbeatEntry = heartbeatsToSend.find(hb => hb.agent === singleDateHeartbeat.agent);\r\n if (!heartbeatEntry) {\r\n // If no entry for this user agent exists, create one.\r\n heartbeatsToSend.push({\r\n agent: singleDateHeartbeat.agent,\r\n dates: [singleDateHeartbeat.date]\r\n });\r\n if (countBytes(heartbeatsToSend) > maxSize) {\r\n // If the header would exceed max size, remove the added heartbeat\r\n // entry and stop adding to the header.\r\n heartbeatsToSend.pop();\r\n break;\r\n }\r\n }\r\n else {\r\n heartbeatEntry.dates.push(singleDateHeartbeat.date);\r\n // If the header would exceed max size, remove the added date\r\n // and stop adding to the header.\r\n if (countBytes(heartbeatsToSend) > maxSize) {\r\n heartbeatEntry.dates.pop();\r\n break;\r\n }\r\n }\r\n // Pop unsent entry from queue. (Skipped if adding the entry exceeded\r\n // quota and the loop breaks early.)\r\n unsentEntries = unsentEntries.slice(1);\r\n }\r\n return {\r\n heartbeatsToSend,\r\n unsentEntries\r\n };\r\n}\r\nclass HeartbeatStorageImpl {\r\n constructor(app) {\r\n this.app = app;\r\n this._canUseIndexedDBPromise = this.runIndexedDBEnvironmentCheck();\r\n }\r\n async runIndexedDBEnvironmentCheck() {\r\n if (!isIndexedDBAvailable()) {\r\n return false;\r\n }\r\n else {\r\n return validateIndexedDBOpenable()\r\n .then(() => true)\r\n .catch(() => false);\r\n }\r\n }\r\n /**\r\n * Read all heartbeats.\r\n */\r\n async read() {\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return { heartbeats: [] };\r\n }\r\n else {\r\n const idbHeartbeatObject = await readHeartbeatsFromIndexedDB(this.app);\r\n return idbHeartbeatObject || { heartbeats: [] };\r\n }\r\n }\r\n // overwrite the storage with the provided heartbeats\r\n async overwrite(heartbeatsObject) {\r\n var _a;\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return;\r\n }\r\n else {\r\n const existingHeartbeatsObject = await this.read();\r\n return writeHeartbeatsToIndexedDB(this.app, {\r\n lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n heartbeats: heartbeatsObject.heartbeats\r\n });\r\n }\r\n }\r\n // add heartbeats\r\n async add(heartbeatsObject) {\r\n var _a;\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return;\r\n }\r\n else {\r\n const existingHeartbeatsObject = await this.read();\r\n return writeHeartbeatsToIndexedDB(this.app, {\r\n lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n heartbeats: [\r\n ...existingHeartbeatsObject.heartbeats,\r\n ...heartbeatsObject.heartbeats\r\n ]\r\n });\r\n }\r\n }\r\n}\r\n/**\r\n * Calculate bytes of a HeartbeatsByUserAgent array after being wrapped\r\n * in a platform logging header JSON object, stringified, and converted\r\n * to base 64.\r\n */\r\nfunction countBytes(heartbeatsCache) {\r\n // base64 has a restricted set of characters, all of which should be 1 byte.\r\n return base64urlEncodeWithoutPadding(\r\n // heartbeatsCache wrapper properties\r\n JSON.stringify({ version: 2, heartbeats: heartbeatsCache })).length;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction registerCoreComponents(variant) {\r\n _registerComponent(new Component('platform-logger', container => new PlatformLoggerServiceImpl(container), \"PRIVATE\" /* PRIVATE */));\r\n _registerComponent(new Component('heartbeat', container => new HeartbeatServiceImpl(container), \"PRIVATE\" /* PRIVATE */));\r\n // Register `app` package.\r\n registerVersion(name$o, version$1, variant);\r\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n registerVersion(name$o, version$1, 'esm2017');\r\n // Register platform SDK identifier (no version).\r\n registerVersion('fire-js', '');\r\n}\n\n/**\r\n * Firebase App\r\n *\r\n * @remarks This package coordinates the communication between the different Firebase components\r\n * @packageDocumentation\r\n */\r\nregisterCoreComponents('');\n\nexport { SDK_VERSION, DEFAULT_ENTRY_NAME as _DEFAULT_ENTRY_NAME, _addComponent, _addOrOverwriteComponent, _apps, _clearComponents, _components, _getProvider, _registerComponent, _removeServiceInstance, deleteApp, getApp, getApps, initializeApp, onLog, registerVersion, setLogLevel };\n//# sourceMappingURL=index.esm2017.js.map\n","import { registerVersion } from '@firebase/app';\nexport * from '@firebase/app';\n\nvar name = \"firebase\";\nvar version = \"9.6.11\";\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nregisterVersion(name, version, 'app');\n//# sourceMappingURL=index.esm.js.map\n","import { getApp, _getProvider, _registerComponent, registerVersion } from '@firebase/app';\nimport { Component } from '@firebase/component';\nimport { ErrorFactory, FirebaseError, openDB } from '@firebase/util';\n\nconst name = \"@firebase/installations\";\nconst version = \"0.5.8\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst PENDING_TIMEOUT_MS = 10000;\r\nconst PACKAGE_VERSION = `w:${version}`;\r\nconst INTERNAL_AUTH_VERSION = 'FIS_v2';\r\nconst INSTALLATIONS_API_URL = 'https://firebaseinstallations.googleapis.com/v1';\r\nconst TOKEN_EXPIRATION_BUFFER = 60 * 60 * 1000; // One hour\r\nconst SERVICE = 'installations';\r\nconst SERVICE_NAME = 'Installations';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERROR_DESCRIPTION_MAP = {\r\n [\"missing-app-config-values\" /* MISSING_APP_CONFIG_VALUES */]: 'Missing App configuration value: \"{$valueName}\"',\r\n [\"not-registered\" /* NOT_REGISTERED */]: 'Firebase Installation is not registered.',\r\n [\"installation-not-found\" /* INSTALLATION_NOT_FOUND */]: 'Firebase Installation not found.',\r\n [\"request-failed\" /* REQUEST_FAILED */]: '{$requestName} request failed with error \"{$serverCode} {$serverStatus}: {$serverMessage}\"',\r\n [\"app-offline\" /* APP_OFFLINE */]: 'Could not process request. Application offline.',\r\n [\"delete-pending-registration\" /* DELETE_PENDING_REGISTRATION */]: \"Can't delete installation while there is a pending registration request.\"\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory(SERVICE, SERVICE_NAME, ERROR_DESCRIPTION_MAP);\r\n/** Returns true if error is a FirebaseError that is based on an error from the server. */\r\nfunction isServerError(error) {\r\n return (error instanceof FirebaseError &&\r\n error.code.includes(\"request-failed\" /* REQUEST_FAILED */));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction getInstallationsEndpoint({ projectId }) {\r\n return `${INSTALLATIONS_API_URL}/projects/${projectId}/installations`;\r\n}\r\nfunction extractAuthTokenInfoFromResponse(response) {\r\n return {\r\n token: response.token,\r\n requestStatus: 2 /* COMPLETED */,\r\n expiresIn: getExpiresInFromResponseExpiresIn(response.expiresIn),\r\n creationTime: Date.now()\r\n };\r\n}\r\nasync function getErrorFromResponse(requestName, response) {\r\n const responseJson = await response.json();\r\n const errorData = responseJson.error;\r\n return ERROR_FACTORY.create(\"request-failed\" /* REQUEST_FAILED */, {\r\n requestName,\r\n serverCode: errorData.code,\r\n serverMessage: errorData.message,\r\n serverStatus: errorData.status\r\n });\r\n}\r\nfunction getHeaders({ apiKey }) {\r\n return new Headers({\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n 'x-goog-api-key': apiKey\r\n });\r\n}\r\nfunction getHeadersWithAuth(appConfig, { refreshToken }) {\r\n const headers = getHeaders(appConfig);\r\n headers.append('Authorization', getAuthorizationHeader(refreshToken));\r\n return headers;\r\n}\r\n/**\r\n * Calls the passed in fetch wrapper and returns the response.\r\n * If the returned response has a status of 5xx, re-runs the function once and\r\n * returns the response.\r\n */\r\nasync function retryIfServerError(fn) {\r\n const result = await fn();\r\n if (result.status >= 500 && result.status < 600) {\r\n // Internal Server Error. Retry request.\r\n return fn();\r\n }\r\n return result;\r\n}\r\nfunction getExpiresInFromResponseExpiresIn(responseExpiresIn) {\r\n // This works because the server will never respond with fractions of a second.\r\n return Number(responseExpiresIn.replace('s', '000'));\r\n}\r\nfunction getAuthorizationHeader(refreshToken) {\r\n return `${INTERNAL_AUTH_VERSION} ${refreshToken}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function createInstallationRequest({ appConfig, heartbeatServiceProvider }, { fid }) {\r\n const endpoint = getInstallationsEndpoint(appConfig);\r\n const headers = getHeaders(appConfig);\r\n // If heartbeat service exists, add the heartbeat string to the header.\r\n const heartbeatService = heartbeatServiceProvider.getImmediate({\r\n optional: true\r\n });\r\n if (heartbeatService) {\r\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\r\n if (heartbeatsHeader) {\r\n headers.append('x-firebase-client', heartbeatsHeader);\r\n }\r\n }\r\n const body = {\r\n fid,\r\n authVersion: INTERNAL_AUTH_VERSION,\r\n appId: appConfig.appId,\r\n sdkVersion: PACKAGE_VERSION\r\n };\r\n const request = {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n const response = await retryIfServerError(() => fetch(endpoint, request));\r\n if (response.ok) {\r\n const responseValue = await response.json();\r\n const registeredInstallationEntry = {\r\n fid: responseValue.fid || fid,\r\n registrationStatus: 2 /* COMPLETED */,\r\n refreshToken: responseValue.refreshToken,\r\n authToken: extractAuthTokenInfoFromResponse(responseValue.authToken)\r\n };\r\n return registeredInstallationEntry;\r\n }\r\n else {\r\n throw await getErrorFromResponse('Create Installation', response);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/** Returns a promise that resolves after given time passes. */\r\nfunction sleep(ms) {\r\n return new Promise(resolve => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction bufferToBase64UrlSafe(array) {\r\n const b64 = btoa(String.fromCharCode(...array));\r\n return b64.replace(/\\+/g, '-').replace(/\\//g, '_');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst VALID_FID_PATTERN = /^[cdef][\\w-]{21}$/;\r\nconst INVALID_FID = '';\r\n/**\r\n * Generates a new FID using random values from Web Crypto API.\r\n * Returns an empty string if FID generation fails for any reason.\r\n */\r\nfunction generateFid() {\r\n try {\r\n // A valid FID has exactly 22 base64 characters, which is 132 bits, or 16.5\r\n // bytes. our implementation generates a 17 byte array instead.\r\n const fidByteArray = new Uint8Array(17);\r\n const crypto = self.crypto || self.msCrypto;\r\n crypto.getRandomValues(fidByteArray);\r\n // Replace the first 4 random bits with the constant FID header of 0b0111.\r\n fidByteArray[0] = 0b01110000 + (fidByteArray[0] % 0b00010000);\r\n const fid = encode(fidByteArray);\r\n return VALID_FID_PATTERN.test(fid) ? fid : INVALID_FID;\r\n }\r\n catch (_a) {\r\n // FID generation errored\r\n return INVALID_FID;\r\n }\r\n}\r\n/** Converts a FID Uint8Array to a base64 string representation. */\r\nfunction encode(fidByteArray) {\r\n const b64String = bufferToBase64UrlSafe(fidByteArray);\r\n // Remove the 23rd character that was added because of the extra 4 bits at the\r\n // end of our 17 byte array, and the '=' padding.\r\n return b64String.substr(0, 22);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/** Returns a string key that can be used to identify the app. */\r\nfunction getKey(appConfig) {\r\n return `${appConfig.appName}!${appConfig.appId}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst fidChangeCallbacks = new Map();\r\n/**\r\n * Calls the onIdChange callbacks with the new FID value, and broadcasts the\r\n * change to other tabs.\r\n */\r\nfunction fidChanged(appConfig, fid) {\r\n const key = getKey(appConfig);\r\n callFidChangeCallbacks(key, fid);\r\n broadcastFidChange(key, fid);\r\n}\r\nfunction addCallback(appConfig, callback) {\r\n // Open the broadcast channel if it's not already open,\r\n // to be able to listen to change events from other tabs.\r\n getBroadcastChannel();\r\n const key = getKey(appConfig);\r\n let callbackSet = fidChangeCallbacks.get(key);\r\n if (!callbackSet) {\r\n callbackSet = new Set();\r\n fidChangeCallbacks.set(key, callbackSet);\r\n }\r\n callbackSet.add(callback);\r\n}\r\nfunction removeCallback(appConfig, callback) {\r\n const key = getKey(appConfig);\r\n const callbackSet = fidChangeCallbacks.get(key);\r\n if (!callbackSet) {\r\n return;\r\n }\r\n callbackSet.delete(callback);\r\n if (callbackSet.size === 0) {\r\n fidChangeCallbacks.delete(key);\r\n }\r\n // Close broadcast channel if there are no more callbacks.\r\n closeBroadcastChannel();\r\n}\r\nfunction callFidChangeCallbacks(key, fid) {\r\n const callbacks = fidChangeCallbacks.get(key);\r\n if (!callbacks) {\r\n return;\r\n }\r\n for (const callback of callbacks) {\r\n callback(fid);\r\n }\r\n}\r\nfunction broadcastFidChange(key, fid) {\r\n const channel = getBroadcastChannel();\r\n if (channel) {\r\n channel.postMessage({ key, fid });\r\n }\r\n closeBroadcastChannel();\r\n}\r\nlet broadcastChannel = null;\r\n/** Opens and returns a BroadcastChannel if it is supported by the browser. */\r\nfunction getBroadcastChannel() {\r\n if (!broadcastChannel && 'BroadcastChannel' in self) {\r\n broadcastChannel = new BroadcastChannel('[Firebase] FID Change');\r\n broadcastChannel.onmessage = e => {\r\n callFidChangeCallbacks(e.data.key, e.data.fid);\r\n };\r\n }\r\n return broadcastChannel;\r\n}\r\nfunction closeBroadcastChannel() {\r\n if (fidChangeCallbacks.size === 0 && broadcastChannel) {\r\n broadcastChannel.close();\r\n broadcastChannel = null;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DATABASE_NAME = 'firebase-installations-database';\r\nconst DATABASE_VERSION = 1;\r\nconst OBJECT_STORE_NAME = 'firebase-installations-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DATABASE_NAME, DATABASE_VERSION, (db, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through\r\n // behavior is what we want, because if there are multiple versions between\r\n // the old version and the current version, we want ALL the migrations\r\n // that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n db.createObjectStore(OBJECT_STORE_NAME);\r\n }\r\n });\r\n }\r\n return dbPromise;\r\n}\r\n/** Assigns or overwrites the record for the given key with the given value. */\r\nasync function set(appConfig, value) {\r\n const key = getKey(appConfig);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n const objectStore = tx.objectStore(OBJECT_STORE_NAME);\r\n const oldValue = (await objectStore.get(key));\r\n await objectStore.put(value, key);\r\n await tx.complete;\r\n if (!oldValue || oldValue.fid !== value.fid) {\r\n fidChanged(appConfig, value.fid);\r\n }\r\n return value;\r\n}\r\n/** Removes record(s) from the objectStore that match the given key. */\r\nasync function remove(appConfig) {\r\n const key = getKey(appConfig);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n await tx.objectStore(OBJECT_STORE_NAME).delete(key);\r\n await tx.complete;\r\n}\r\n/**\r\n * Atomically updates a record with the result of updateFn, which gets\r\n * called with the current value. If newValue is undefined, the record is\r\n * deleted instead.\r\n * @return Updated value\r\n */\r\nasync function update(appConfig, updateFn) {\r\n const key = getKey(appConfig);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n const store = tx.objectStore(OBJECT_STORE_NAME);\r\n const oldValue = (await store.get(key));\r\n const newValue = updateFn(oldValue);\r\n if (newValue === undefined) {\r\n await store.delete(key);\r\n }\r\n else {\r\n await store.put(newValue, key);\r\n }\r\n await tx.complete;\r\n if (newValue && (!oldValue || oldValue.fid !== newValue.fid)) {\r\n fidChanged(appConfig, newValue.fid);\r\n }\r\n return newValue;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Updates and returns the InstallationEntry from the database.\r\n * Also triggers a registration request if it is necessary and possible.\r\n */\r\nasync function getInstallationEntry(installations) {\r\n let registrationPromise;\r\n const installationEntry = await update(installations.appConfig, oldEntry => {\r\n const installationEntry = updateOrCreateInstallationEntry(oldEntry);\r\n const entryWithPromise = triggerRegistrationIfNecessary(installations, installationEntry);\r\n registrationPromise = entryWithPromise.registrationPromise;\r\n return entryWithPromise.installationEntry;\r\n });\r\n if (installationEntry.fid === INVALID_FID) {\r\n // FID generation failed. Waiting for the FID from the server.\r\n return { installationEntry: await registrationPromise };\r\n }\r\n return {\r\n installationEntry,\r\n registrationPromise\r\n };\r\n}\r\n/**\r\n * Creates a new Installation Entry if one does not exist.\r\n * Also clears timed out pending requests.\r\n */\r\nfunction updateOrCreateInstallationEntry(oldEntry) {\r\n const entry = oldEntry || {\r\n fid: generateFid(),\r\n registrationStatus: 0 /* NOT_STARTED */\r\n };\r\n return clearTimedOutRequest(entry);\r\n}\r\n/**\r\n * If the Firebase Installation is not registered yet, this will trigger the\r\n * registration and return an InProgressInstallationEntry.\r\n *\r\n * If registrationPromise does not exist, the installationEntry is guaranteed\r\n * to be registered.\r\n */\r\nfunction triggerRegistrationIfNecessary(installations, installationEntry) {\r\n if (installationEntry.registrationStatus === 0 /* NOT_STARTED */) {\r\n if (!navigator.onLine) {\r\n // Registration required but app is offline.\r\n const registrationPromiseWithError = Promise.reject(ERROR_FACTORY.create(\"app-offline\" /* APP_OFFLINE */));\r\n return {\r\n installationEntry,\r\n registrationPromise: registrationPromiseWithError\r\n };\r\n }\r\n // Try registering. Change status to IN_PROGRESS.\r\n const inProgressEntry = {\r\n fid: installationEntry.fid,\r\n registrationStatus: 1 /* IN_PROGRESS */,\r\n registrationTime: Date.now()\r\n };\r\n const registrationPromise = registerInstallation(installations, inProgressEntry);\r\n return { installationEntry: inProgressEntry, registrationPromise };\r\n }\r\n else if (installationEntry.registrationStatus === 1 /* IN_PROGRESS */) {\r\n return {\r\n installationEntry,\r\n registrationPromise: waitUntilFidRegistration(installations)\r\n };\r\n }\r\n else {\r\n return { installationEntry };\r\n }\r\n}\r\n/** This will be executed only once for each new Firebase Installation. */\r\nasync function registerInstallation(installations, installationEntry) {\r\n try {\r\n const registeredInstallationEntry = await createInstallationRequest(installations, installationEntry);\r\n return set(installations.appConfig, registeredInstallationEntry);\r\n }\r\n catch (e) {\r\n if (isServerError(e) && e.customData.serverCode === 409) {\r\n // Server returned a \"FID can not be used\" error.\r\n // Generate a new ID next time.\r\n await remove(installations.appConfig);\r\n }\r\n else {\r\n // Registration failed. Set FID as not registered.\r\n await set(installations.appConfig, {\r\n fid: installationEntry.fid,\r\n registrationStatus: 0 /* NOT_STARTED */\r\n });\r\n }\r\n throw e;\r\n }\r\n}\r\n/** Call if FID registration is pending in another request. */\r\nasync function waitUntilFidRegistration(installations) {\r\n // Unfortunately, there is no way of reliably observing when a value in\r\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\r\n // so we need to poll.\r\n let entry = await updateInstallationRequest(installations.appConfig);\r\n while (entry.registrationStatus === 1 /* IN_PROGRESS */) {\r\n // createInstallation request still in progress.\r\n await sleep(100);\r\n entry = await updateInstallationRequest(installations.appConfig);\r\n }\r\n if (entry.registrationStatus === 0 /* NOT_STARTED */) {\r\n // The request timed out or failed in a different call. Try again.\r\n const { installationEntry, registrationPromise } = await getInstallationEntry(installations);\r\n if (registrationPromise) {\r\n return registrationPromise;\r\n }\r\n else {\r\n // if there is no registrationPromise, entry is registered.\r\n return installationEntry;\r\n }\r\n }\r\n return entry;\r\n}\r\n/**\r\n * Called only if there is a CreateInstallation request in progress.\r\n *\r\n * Updates the InstallationEntry in the DB based on the status of the\r\n * CreateInstallation request.\r\n *\r\n * Returns the updated InstallationEntry.\r\n */\r\nfunction updateInstallationRequest(appConfig) {\r\n return update(appConfig, oldEntry => {\r\n if (!oldEntry) {\r\n throw ERROR_FACTORY.create(\"installation-not-found\" /* INSTALLATION_NOT_FOUND */);\r\n }\r\n return clearTimedOutRequest(oldEntry);\r\n });\r\n}\r\nfunction clearTimedOutRequest(entry) {\r\n if (hasInstallationRequestTimedOut(entry)) {\r\n return {\r\n fid: entry.fid,\r\n registrationStatus: 0 /* NOT_STARTED */\r\n };\r\n }\r\n return entry;\r\n}\r\nfunction hasInstallationRequestTimedOut(installationEntry) {\r\n return (installationEntry.registrationStatus === 1 /* IN_PROGRESS */ &&\r\n installationEntry.registrationTime + PENDING_TIMEOUT_MS < Date.now());\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function generateAuthTokenRequest({ appConfig, heartbeatServiceProvider }, installationEntry) {\r\n const endpoint = getGenerateAuthTokenEndpoint(appConfig, installationEntry);\r\n const headers = getHeadersWithAuth(appConfig, installationEntry);\r\n // If heartbeat service exists, add the heartbeat string to the header.\r\n const heartbeatService = heartbeatServiceProvider.getImmediate({\r\n optional: true\r\n });\r\n if (heartbeatService) {\r\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\r\n if (heartbeatsHeader) {\r\n headers.append('x-firebase-client', heartbeatsHeader);\r\n }\r\n }\r\n const body = {\r\n installation: {\r\n sdkVersion: PACKAGE_VERSION,\r\n appId: appConfig.appId\r\n }\r\n };\r\n const request = {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n const response = await retryIfServerError(() => fetch(endpoint, request));\r\n if (response.ok) {\r\n const responseValue = await response.json();\r\n const completedAuthToken = extractAuthTokenInfoFromResponse(responseValue);\r\n return completedAuthToken;\r\n }\r\n else {\r\n throw await getErrorFromResponse('Generate Auth Token', response);\r\n }\r\n}\r\nfunction getGenerateAuthTokenEndpoint(appConfig, { fid }) {\r\n return `${getInstallationsEndpoint(appConfig)}/${fid}/authTokens:generate`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a valid authentication token for the installation. Generates a new\r\n * token if one doesn't exist, is expired or about to expire.\r\n *\r\n * Should only be called if the Firebase Installation is registered.\r\n */\r\nasync function refreshAuthToken(installations, forceRefresh = false) {\r\n let tokenPromise;\r\n const entry = await update(installations.appConfig, oldEntry => {\r\n if (!isEntryRegistered(oldEntry)) {\r\n throw ERROR_FACTORY.create(\"not-registered\" /* NOT_REGISTERED */);\r\n }\r\n const oldAuthToken = oldEntry.authToken;\r\n if (!forceRefresh && isAuthTokenValid(oldAuthToken)) {\r\n // There is a valid token in the DB.\r\n return oldEntry;\r\n }\r\n else if (oldAuthToken.requestStatus === 1 /* IN_PROGRESS */) {\r\n // There already is a token request in progress.\r\n tokenPromise = waitUntilAuthTokenRequest(installations, forceRefresh);\r\n return oldEntry;\r\n }\r\n else {\r\n // No token or token expired.\r\n if (!navigator.onLine) {\r\n throw ERROR_FACTORY.create(\"app-offline\" /* APP_OFFLINE */);\r\n }\r\n const inProgressEntry = makeAuthTokenRequestInProgressEntry(oldEntry);\r\n tokenPromise = fetchAuthTokenFromServer(installations, inProgressEntry);\r\n return inProgressEntry;\r\n }\r\n });\r\n const authToken = tokenPromise\r\n ? await tokenPromise\r\n : entry.authToken;\r\n return authToken;\r\n}\r\n/**\r\n * Call only if FID is registered and Auth Token request is in progress.\r\n *\r\n * Waits until the current pending request finishes. If the request times out,\r\n * tries once in this thread as well.\r\n */\r\nasync function waitUntilAuthTokenRequest(installations, forceRefresh) {\r\n // Unfortunately, there is no way of reliably observing when a value in\r\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\r\n // so we need to poll.\r\n let entry = await updateAuthTokenRequest(installations.appConfig);\r\n while (entry.authToken.requestStatus === 1 /* IN_PROGRESS */) {\r\n // generateAuthToken still in progress.\r\n await sleep(100);\r\n entry = await updateAuthTokenRequest(installations.appConfig);\r\n }\r\n const authToken = entry.authToken;\r\n if (authToken.requestStatus === 0 /* NOT_STARTED */) {\r\n // The request timed out or failed in a different call. Try again.\r\n return refreshAuthToken(installations, forceRefresh);\r\n }\r\n else {\r\n return authToken;\r\n }\r\n}\r\n/**\r\n * Called only if there is a GenerateAuthToken request in progress.\r\n *\r\n * Updates the InstallationEntry in the DB based on the status of the\r\n * GenerateAuthToken request.\r\n *\r\n * Returns the updated InstallationEntry.\r\n */\r\nfunction updateAuthTokenRequest(appConfig) {\r\n return update(appConfig, oldEntry => {\r\n if (!isEntryRegistered(oldEntry)) {\r\n throw ERROR_FACTORY.create(\"not-registered\" /* NOT_REGISTERED */);\r\n }\r\n const oldAuthToken = oldEntry.authToken;\r\n if (hasAuthTokenRequestTimedOut(oldAuthToken)) {\r\n return Object.assign(Object.assign({}, oldEntry), { authToken: { requestStatus: 0 /* NOT_STARTED */ } });\r\n }\r\n return oldEntry;\r\n });\r\n}\r\nasync function fetchAuthTokenFromServer(installations, installationEntry) {\r\n try {\r\n const authToken = await generateAuthTokenRequest(installations, installationEntry);\r\n const updatedInstallationEntry = Object.assign(Object.assign({}, installationEntry), { authToken });\r\n await set(installations.appConfig, updatedInstallationEntry);\r\n return authToken;\r\n }\r\n catch (e) {\r\n if (isServerError(e) &&\r\n (e.customData.serverCode === 401 || e.customData.serverCode === 404)) {\r\n // Server returned a \"FID not found\" or a \"Invalid authentication\" error.\r\n // Generate a new ID next time.\r\n await remove(installations.appConfig);\r\n }\r\n else {\r\n const updatedInstallationEntry = Object.assign(Object.assign({}, installationEntry), { authToken: { requestStatus: 0 /* NOT_STARTED */ } });\r\n await set(installations.appConfig, updatedInstallationEntry);\r\n }\r\n throw e;\r\n }\r\n}\r\nfunction isEntryRegistered(installationEntry) {\r\n return (installationEntry !== undefined &&\r\n installationEntry.registrationStatus === 2 /* COMPLETED */);\r\n}\r\nfunction isAuthTokenValid(authToken) {\r\n return (authToken.requestStatus === 2 /* COMPLETED */ &&\r\n !isAuthTokenExpired(authToken));\r\n}\r\nfunction isAuthTokenExpired(authToken) {\r\n const now = Date.now();\r\n return (now < authToken.creationTime ||\r\n authToken.creationTime + authToken.expiresIn < now + TOKEN_EXPIRATION_BUFFER);\r\n}\r\n/** Returns an updated InstallationEntry with an InProgressAuthToken. */\r\nfunction makeAuthTokenRequestInProgressEntry(oldEntry) {\r\n const inProgressAuthToken = {\r\n requestStatus: 1 /* IN_PROGRESS */,\r\n requestTime: Date.now()\r\n };\r\n return Object.assign(Object.assign({}, oldEntry), { authToken: inProgressAuthToken });\r\n}\r\nfunction hasAuthTokenRequestTimedOut(authToken) {\r\n return (authToken.requestStatus === 1 /* IN_PROGRESS */ &&\r\n authToken.requestTime + PENDING_TIMEOUT_MS < Date.now());\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Creates a Firebase Installation if there isn't one for the app and\r\n * returns the Installation ID.\r\n * @param installations - The `Installations` instance.\r\n *\r\n * @public\r\n */\r\nasync function getId(installations) {\r\n const installationsImpl = installations;\r\n const { installationEntry, registrationPromise } = await getInstallationEntry(installationsImpl);\r\n if (registrationPromise) {\r\n registrationPromise.catch(console.error);\r\n }\r\n else {\r\n // If the installation is already registered, update the authentication\r\n // token if needed.\r\n refreshAuthToken(installationsImpl).catch(console.error);\r\n }\r\n return installationEntry.fid;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a Firebase Installations auth token, identifying the current\r\n * Firebase Installation.\r\n * @param installations - The `Installations` instance.\r\n * @param forceRefresh - Force refresh regardless of token expiration.\r\n *\r\n * @public\r\n */\r\nasync function getToken(installations, forceRefresh = false) {\r\n const installationsImpl = installations;\r\n await completeInstallationRegistration(installationsImpl);\r\n // At this point we either have a Registered Installation in the DB, or we've\r\n // already thrown an error.\r\n const authToken = await refreshAuthToken(installationsImpl, forceRefresh);\r\n return authToken.token;\r\n}\r\nasync function completeInstallationRegistration(installations) {\r\n const { registrationPromise } = await getInstallationEntry(installations);\r\n if (registrationPromise) {\r\n // A createInstallation request is in progress. Wait until it finishes.\r\n await registrationPromise;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function deleteInstallationRequest(appConfig, installationEntry) {\r\n const endpoint = getDeleteEndpoint(appConfig, installationEntry);\r\n const headers = getHeadersWithAuth(appConfig, installationEntry);\r\n const request = {\r\n method: 'DELETE',\r\n headers\r\n };\r\n const response = await retryIfServerError(() => fetch(endpoint, request));\r\n if (!response.ok) {\r\n throw await getErrorFromResponse('Delete Installation', response);\r\n }\r\n}\r\nfunction getDeleteEndpoint(appConfig, { fid }) {\r\n return `${getInstallationsEndpoint(appConfig)}/${fid}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Deletes the Firebase Installation and all associated data.\r\n * @param installations - The `Installations` instance.\r\n *\r\n * @public\r\n */\r\nasync function deleteInstallations(installations) {\r\n const { appConfig } = installations;\r\n const entry = await update(appConfig, oldEntry => {\r\n if (oldEntry && oldEntry.registrationStatus === 0 /* NOT_STARTED */) {\r\n // Delete the unregistered entry without sending a deleteInstallation request.\r\n return undefined;\r\n }\r\n return oldEntry;\r\n });\r\n if (entry) {\r\n if (entry.registrationStatus === 1 /* IN_PROGRESS */) {\r\n // Can't delete while trying to register.\r\n throw ERROR_FACTORY.create(\"delete-pending-registration\" /* DELETE_PENDING_REGISTRATION */);\r\n }\r\n else if (entry.registrationStatus === 2 /* COMPLETED */) {\r\n if (!navigator.onLine) {\r\n throw ERROR_FACTORY.create(\"app-offline\" /* APP_OFFLINE */);\r\n }\r\n else {\r\n await deleteInstallationRequest(appConfig, entry);\r\n await remove(appConfig);\r\n }\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Sets a new callback that will get called when Installation ID changes.\r\n * Returns an unsubscribe function that will remove the callback when called.\r\n * @param installations - The `Installations` instance.\r\n * @param callback - The callback function that is invoked when FID changes.\r\n * @returns A function that can be called to unsubscribe.\r\n *\r\n * @public\r\n */\r\nfunction onIdChange(installations, callback) {\r\n const { appConfig } = installations;\r\n addCallback(appConfig, callback);\r\n return () => {\r\n removeCallback(appConfig, callback);\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns an instance of {@link Installations} associated with the given\r\n * {@link @firebase/app#FirebaseApp} instance.\r\n * @param app - The {@link @firebase/app#FirebaseApp} instance.\r\n *\r\n * @public\r\n */\r\nfunction getInstallations(app = getApp()) {\r\n const installationsImpl = _getProvider(app, 'installations').getImmediate();\r\n return installationsImpl;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction extractAppConfig(app) {\r\n if (!app || !app.options) {\r\n throw getMissingValueError('App Configuration');\r\n }\r\n if (!app.name) {\r\n throw getMissingValueError('App Name');\r\n }\r\n // Required app config keys\r\n const configKeys = [\r\n 'projectId',\r\n 'apiKey',\r\n 'appId'\r\n ];\r\n for (const keyName of configKeys) {\r\n if (!app.options[keyName]) {\r\n throw getMissingValueError(keyName);\r\n }\r\n }\r\n return {\r\n appName: app.name,\r\n projectId: app.options.projectId,\r\n apiKey: app.options.apiKey,\r\n appId: app.options.appId\r\n };\r\n}\r\nfunction getMissingValueError(valueName) {\r\n return ERROR_FACTORY.create(\"missing-app-config-values\" /* MISSING_APP_CONFIG_VALUES */, {\r\n valueName\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst INSTALLATIONS_NAME = 'installations';\r\nconst INSTALLATIONS_NAME_INTERNAL = 'installations-internal';\r\nconst publicFactory = (container) => {\r\n const app = container.getProvider('app').getImmediate();\r\n // Throws if app isn't configured properly.\r\n const appConfig = extractAppConfig(app);\r\n const heartbeatServiceProvider = _getProvider(app, 'heartbeat');\r\n const installationsImpl = {\r\n app,\r\n appConfig,\r\n heartbeatServiceProvider,\r\n _delete: () => Promise.resolve()\r\n };\r\n return installationsImpl;\r\n};\r\nconst internalFactory = (container) => {\r\n const app = container.getProvider('app').getImmediate();\r\n // Internal FIS instance relies on public FIS instance.\r\n const installations = _getProvider(app, INSTALLATIONS_NAME).getImmediate();\r\n const installationsInternal = {\r\n getId: () => getId(installations),\r\n getToken: (forceRefresh) => getToken(installations, forceRefresh)\r\n };\r\n return installationsInternal;\r\n};\r\nfunction registerInstallations() {\r\n _registerComponent(new Component(INSTALLATIONS_NAME, publicFactory, \"PUBLIC\" /* PUBLIC */));\r\n _registerComponent(new Component(INSTALLATIONS_NAME_INTERNAL, internalFactory, \"PRIVATE\" /* PRIVATE */));\r\n}\n\n/**\r\n * Firebase Installations\r\n *\r\n * @packageDocumentation\r\n */\r\nregisterInstallations();\r\nregisterVersion(name, version);\r\n// BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\nregisterVersion(name, version, 'esm2017');\n\nexport { deleteInstallations, getId, getInstallations, getToken, onIdChange };\n//# sourceMappingURL=index.esm2017.js.map\n","import '@firebase/installations';\nimport { Component } from '@firebase/component';\nimport { openDB, deleteDB, ErrorFactory, validateIndexedDBOpenable, isIndexedDBAvailable, areCookiesEnabled, getModularInstance } from '@firebase/util';\nimport { _registerComponent, registerVersion, getApp, _getProvider } from '@firebase/app';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_SW_PATH = '/firebase-messaging-sw.js';\r\nconst DEFAULT_SW_SCOPE = '/firebase-cloud-messaging-push-scope';\r\nconst DEFAULT_VAPID_KEY = 'BDOU99-h67HcA6JeFXHbSNMu7e2yNNu3RzoMj8TM4W88jITfq7ZmPvIM1Iv-4_l2LxQcYwhqby2xGpWwzjfAnG4';\r\nconst ENDPOINT = 'https://fcmregistrations.googleapis.com/v1';\r\nconst CONSOLE_CAMPAIGN_ID = 'google.c.a.c_id';\r\nconst CONSOLE_CAMPAIGN_NAME = 'google.c.a.c_l';\r\nconst CONSOLE_CAMPAIGN_TIME = 'google.c.a.ts';\r\n/** Set to '1' if Analytics is enabled for the campaign */\r\nconst CONSOLE_CAMPAIGN_ANALYTICS_ENABLED = 'google.c.a.e';\r\nvar MessageType$1;\r\n(function (MessageType) {\r\n MessageType[MessageType[\"DATA_MESSAGE\"] = 1] = \"DATA_MESSAGE\";\r\n MessageType[MessageType[\"DISPLAY_NOTIFICATION\"] = 3] = \"DISPLAY_NOTIFICATION\";\r\n})(MessageType$1 || (MessageType$1 = {}));\n\n/**\r\n * @license\r\n * Copyright 2018 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except\r\n * in compliance with the License. You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software distributed under the License\r\n * is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r\n * or implied. See the License for the specific language governing permissions and limitations under\r\n * the License.\r\n */\r\nvar MessageType;\r\n(function (MessageType) {\r\n MessageType[\"PUSH_RECEIVED\"] = \"push-received\";\r\n MessageType[\"NOTIFICATION_CLICKED\"] = \"notification-clicked\";\r\n})(MessageType || (MessageType = {}));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction arrayToBase64(array) {\r\n const uint8Array = new Uint8Array(array);\r\n const base64String = btoa(String.fromCharCode(...uint8Array));\r\n return base64String.replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\r\n}\r\nfunction base64ToArray(base64String) {\r\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\r\n const base64 = (base64String + padding)\r\n .replace(/\\-/g, '+')\r\n .replace(/_/g, '/');\r\n const rawData = atob(base64);\r\n const outputArray = new Uint8Array(rawData.length);\r\n for (let i = 0; i < rawData.length; ++i) {\r\n outputArray[i] = rawData.charCodeAt(i);\r\n }\r\n return outputArray;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst OLD_DB_NAME = 'fcm_token_details_db';\r\n/**\r\n * The last DB version of 'fcm_token_details_db' was 4. This is one higher, so that the upgrade\r\n * callback is called for all versions of the old DB.\r\n */\r\nconst OLD_DB_VERSION = 5;\r\nconst OLD_OBJECT_STORE_NAME = 'fcm_token_object_Store';\r\nasync function migrateOldDatabase(senderId) {\r\n if ('databases' in indexedDB) {\r\n // indexedDb.databases() is an IndexedDB v3 API and does not exist in all browsers. TODO: Remove\r\n // typecast when it lands in TS types.\r\n const databases = await indexedDB.databases();\r\n const dbNames = databases.map(db => db.name);\r\n if (!dbNames.includes(OLD_DB_NAME)) {\r\n // old DB didn't exist, no need to open.\r\n return null;\r\n }\r\n }\r\n let tokenDetails = null;\r\n const db = await openDB(OLD_DB_NAME, OLD_DB_VERSION, async (db, oldVersion, newVersion, upgradeTransaction) => {\r\n var _a;\r\n if (oldVersion < 2) {\r\n // Database too old, skip migration.\r\n return;\r\n }\r\n if (!db.objectStoreNames.contains(OLD_OBJECT_STORE_NAME)) {\r\n // Database did not exist. Nothing to do.\r\n return;\r\n }\r\n const objectStore = upgradeTransaction.objectStore(OLD_OBJECT_STORE_NAME);\r\n const value = await objectStore.index('fcmSenderId').get(senderId);\r\n await objectStore.clear();\r\n if (!value) {\r\n // No entry in the database, nothing to migrate.\r\n return;\r\n }\r\n if (oldVersion === 2) {\r\n const oldDetails = value;\r\n if (!oldDetails.auth || !oldDetails.p256dh || !oldDetails.endpoint) {\r\n return;\r\n }\r\n tokenDetails = {\r\n token: oldDetails.fcmToken,\r\n createTime: (_a = oldDetails.createTime) !== null && _a !== void 0 ? _a : Date.now(),\r\n subscriptionOptions: {\r\n auth: oldDetails.auth,\r\n p256dh: oldDetails.p256dh,\r\n endpoint: oldDetails.endpoint,\r\n swScope: oldDetails.swScope,\r\n vapidKey: typeof oldDetails.vapidKey === 'string'\r\n ? oldDetails.vapidKey\r\n : arrayToBase64(oldDetails.vapidKey)\r\n }\r\n };\r\n }\r\n else if (oldVersion === 3) {\r\n const oldDetails = value;\r\n tokenDetails = {\r\n token: oldDetails.fcmToken,\r\n createTime: oldDetails.createTime,\r\n subscriptionOptions: {\r\n auth: arrayToBase64(oldDetails.auth),\r\n p256dh: arrayToBase64(oldDetails.p256dh),\r\n endpoint: oldDetails.endpoint,\r\n swScope: oldDetails.swScope,\r\n vapidKey: arrayToBase64(oldDetails.vapidKey)\r\n }\r\n };\r\n }\r\n else if (oldVersion === 4) {\r\n const oldDetails = value;\r\n tokenDetails = {\r\n token: oldDetails.fcmToken,\r\n createTime: oldDetails.createTime,\r\n subscriptionOptions: {\r\n auth: arrayToBase64(oldDetails.auth),\r\n p256dh: arrayToBase64(oldDetails.p256dh),\r\n endpoint: oldDetails.endpoint,\r\n swScope: oldDetails.swScope,\r\n vapidKey: arrayToBase64(oldDetails.vapidKey)\r\n }\r\n };\r\n }\r\n });\r\n db.close();\r\n // Delete all old databases.\r\n await deleteDB(OLD_DB_NAME);\r\n await deleteDB('fcm_vapid_details_db');\r\n await deleteDB('undefined');\r\n return checkTokenDetails(tokenDetails) ? tokenDetails : null;\r\n}\r\nfunction checkTokenDetails(tokenDetails) {\r\n if (!tokenDetails || !tokenDetails.subscriptionOptions) {\r\n return false;\r\n }\r\n const { subscriptionOptions } = tokenDetails;\r\n return (typeof tokenDetails.createTime === 'number' &&\r\n tokenDetails.createTime > 0 &&\r\n typeof tokenDetails.token === 'string' &&\r\n tokenDetails.token.length > 0 &&\r\n typeof subscriptionOptions.auth === 'string' &&\r\n subscriptionOptions.auth.length > 0 &&\r\n typeof subscriptionOptions.p256dh === 'string' &&\r\n subscriptionOptions.p256dh.length > 0 &&\r\n typeof subscriptionOptions.endpoint === 'string' &&\r\n subscriptionOptions.endpoint.length > 0 &&\r\n typeof subscriptionOptions.swScope === 'string' &&\r\n subscriptionOptions.swScope.length > 0 &&\r\n typeof subscriptionOptions.vapidKey === 'string' &&\r\n subscriptionOptions.vapidKey.length > 0);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Exported for tests.\r\nconst DATABASE_NAME = 'firebase-messaging-database';\r\nconst DATABASE_VERSION = 1;\r\nconst OBJECT_STORE_NAME = 'firebase-messaging-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DATABASE_NAME, DATABASE_VERSION, (upgradeDb, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through behavior is what we want,\r\n // because if there are multiple versions between the old version and the current version, we\r\n // want ALL the migrations that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n upgradeDb.createObjectStore(OBJECT_STORE_NAME);\r\n }\r\n });\r\n }\r\n return dbPromise;\r\n}\r\n/** Gets record(s) from the objectStore that match the given key. */\r\nasync function dbGet(firebaseDependencies) {\r\n const key = getKey(firebaseDependencies);\r\n const db = await getDbPromise();\r\n const tokenDetails = (await db\r\n .transaction(OBJECT_STORE_NAME)\r\n .objectStore(OBJECT_STORE_NAME)\r\n .get(key));\r\n if (tokenDetails) {\r\n return tokenDetails;\r\n }\r\n else {\r\n // Check if there is a tokenDetails object in the old DB.\r\n const oldTokenDetails = await migrateOldDatabase(firebaseDependencies.appConfig.senderId);\r\n if (oldTokenDetails) {\r\n await dbSet(firebaseDependencies, oldTokenDetails);\r\n return oldTokenDetails;\r\n }\r\n }\r\n}\r\n/** Assigns or overwrites the record for the given key with the given value. */\r\nasync function dbSet(firebaseDependencies, tokenDetails) {\r\n const key = getKey(firebaseDependencies);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n await tx.objectStore(OBJECT_STORE_NAME).put(tokenDetails, key);\r\n await tx.complete;\r\n return tokenDetails;\r\n}\r\n/** Removes record(s) from the objectStore that match the given key. */\r\nasync function dbRemove(firebaseDependencies) {\r\n const key = getKey(firebaseDependencies);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n await tx.objectStore(OBJECT_STORE_NAME).delete(key);\r\n await tx.complete;\r\n}\r\nfunction getKey({ appConfig }) {\r\n return appConfig.appId;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERROR_MAP = {\r\n [\"missing-app-config-values\" /* MISSING_APP_CONFIG_VALUES */]: 'Missing App configuration value: \"{$valueName}\"',\r\n [\"only-available-in-window\" /* AVAILABLE_IN_WINDOW */]: 'This method is available in a Window context.',\r\n [\"only-available-in-sw\" /* AVAILABLE_IN_SW */]: 'This method is available in a service worker context.',\r\n [\"permission-default\" /* PERMISSION_DEFAULT */]: 'The notification permission was not granted and dismissed instead.',\r\n [\"permission-blocked\" /* PERMISSION_BLOCKED */]: 'The notification permission was not granted and blocked instead.',\r\n [\"unsupported-browser\" /* UNSUPPORTED_BROWSER */]: \"This browser doesn't support the API's required to use the Firebase SDK.\",\r\n [\"indexed-db-unsupported\" /* INDEXED_DB_UNSUPPORTED */]: \"This browser doesn't support indexedDb.open() (ex. Safari iFrame, Firefox Private Browsing, etc)\",\r\n [\"failed-service-worker-registration\" /* FAILED_DEFAULT_REGISTRATION */]: 'We are unable to register the default service worker. {$browserErrorMessage}',\r\n [\"token-subscribe-failed\" /* TOKEN_SUBSCRIBE_FAILED */]: 'A problem occurred while subscribing the user to FCM: {$errorInfo}',\r\n [\"token-subscribe-no-token\" /* TOKEN_SUBSCRIBE_NO_TOKEN */]: 'FCM returned no token when subscribing the user to push.',\r\n [\"token-unsubscribe-failed\" /* TOKEN_UNSUBSCRIBE_FAILED */]: 'A problem occurred while unsubscribing the ' +\r\n 'user from FCM: {$errorInfo}',\r\n [\"token-update-failed\" /* TOKEN_UPDATE_FAILED */]: 'A problem occurred while updating the user from FCM: {$errorInfo}',\r\n [\"token-update-no-token\" /* TOKEN_UPDATE_NO_TOKEN */]: 'FCM returned no token when updating the user to push.',\r\n [\"use-sw-after-get-token\" /* USE_SW_AFTER_GET_TOKEN */]: 'The useServiceWorker() method may only be called once and must be ' +\r\n 'called before calling getToken() to ensure your service worker is used.',\r\n [\"invalid-sw-registration\" /* INVALID_SW_REGISTRATION */]: 'The input to useServiceWorker() must be a ServiceWorkerRegistration.',\r\n [\"invalid-bg-handler\" /* INVALID_BG_HANDLER */]: 'The input to setBackgroundMessageHandler() must be a function.',\r\n [\"invalid-vapid-key\" /* INVALID_VAPID_KEY */]: 'The public VAPID key must be a string.',\r\n [\"use-vapid-key-after-get-token\" /* USE_VAPID_KEY_AFTER_GET_TOKEN */]: 'The usePublicVapidKey() method may only be called once and must be ' +\r\n 'called before calling getToken() to ensure your VAPID key is used.'\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory('messaging', 'Messaging', ERROR_MAP);\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function requestGetToken(firebaseDependencies, subscriptionOptions) {\r\n const headers = await getHeaders(firebaseDependencies);\r\n const body = getBody(subscriptionOptions);\r\n const subscribeOptions = {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n let responseData;\r\n try {\r\n const response = await fetch(getEndpoint(firebaseDependencies.appConfig), subscribeOptions);\r\n responseData = await response.json();\r\n }\r\n catch (err) {\r\n throw ERROR_FACTORY.create(\"token-subscribe-failed\" /* TOKEN_SUBSCRIBE_FAILED */, {\r\n errorInfo: err\r\n });\r\n }\r\n if (responseData.error) {\r\n const message = responseData.error.message;\r\n throw ERROR_FACTORY.create(\"token-subscribe-failed\" /* TOKEN_SUBSCRIBE_FAILED */, {\r\n errorInfo: message\r\n });\r\n }\r\n if (!responseData.token) {\r\n throw ERROR_FACTORY.create(\"token-subscribe-no-token\" /* TOKEN_SUBSCRIBE_NO_TOKEN */);\r\n }\r\n return responseData.token;\r\n}\r\nasync function requestUpdateToken(firebaseDependencies, tokenDetails) {\r\n const headers = await getHeaders(firebaseDependencies);\r\n const body = getBody(tokenDetails.subscriptionOptions);\r\n const updateOptions = {\r\n method: 'PATCH',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n let responseData;\r\n try {\r\n const response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${tokenDetails.token}`, updateOptions);\r\n responseData = await response.json();\r\n }\r\n catch (err) {\r\n throw ERROR_FACTORY.create(\"token-update-failed\" /* TOKEN_UPDATE_FAILED */, {\r\n errorInfo: err\r\n });\r\n }\r\n if (responseData.error) {\r\n const message = responseData.error.message;\r\n throw ERROR_FACTORY.create(\"token-update-failed\" /* TOKEN_UPDATE_FAILED */, {\r\n errorInfo: message\r\n });\r\n }\r\n if (!responseData.token) {\r\n throw ERROR_FACTORY.create(\"token-update-no-token\" /* TOKEN_UPDATE_NO_TOKEN */);\r\n }\r\n return responseData.token;\r\n}\r\nasync function requestDeleteToken(firebaseDependencies, token) {\r\n const headers = await getHeaders(firebaseDependencies);\r\n const unsubscribeOptions = {\r\n method: 'DELETE',\r\n headers\r\n };\r\n try {\r\n const response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${token}`, unsubscribeOptions);\r\n const responseData = await response.json();\r\n if (responseData.error) {\r\n const message = responseData.error.message;\r\n throw ERROR_FACTORY.create(\"token-unsubscribe-failed\" /* TOKEN_UNSUBSCRIBE_FAILED */, {\r\n errorInfo: message\r\n });\r\n }\r\n }\r\n catch (err) {\r\n throw ERROR_FACTORY.create(\"token-unsubscribe-failed\" /* TOKEN_UNSUBSCRIBE_FAILED */, {\r\n errorInfo: err\r\n });\r\n }\r\n}\r\nfunction getEndpoint({ projectId }) {\r\n return `${ENDPOINT}/projects/${projectId}/registrations`;\r\n}\r\nasync function getHeaders({ appConfig, installations }) {\r\n const authToken = await installations.getToken();\r\n return new Headers({\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n 'x-goog-api-key': appConfig.apiKey,\r\n 'x-goog-firebase-installations-auth': `FIS ${authToken}`\r\n });\r\n}\r\nfunction getBody({ p256dh, auth, endpoint, vapidKey }) {\r\n const body = {\r\n web: {\r\n endpoint,\r\n auth,\r\n p256dh\r\n }\r\n };\r\n if (vapidKey !== DEFAULT_VAPID_KEY) {\r\n body.web.applicationPubKey = vapidKey;\r\n }\r\n return body;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// UpdateRegistration will be called once every week.\r\nconst TOKEN_EXPIRATION_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\r\nasync function getTokenInternal(messaging) {\r\n const pushSubscription = await getPushSubscription(messaging.swRegistration, messaging.vapidKey);\r\n const subscriptionOptions = {\r\n vapidKey: messaging.vapidKey,\r\n swScope: messaging.swRegistration.scope,\r\n endpoint: pushSubscription.endpoint,\r\n auth: arrayToBase64(pushSubscription.getKey('auth')),\r\n p256dh: arrayToBase64(pushSubscription.getKey('p256dh'))\r\n };\r\n const tokenDetails = await dbGet(messaging.firebaseDependencies);\r\n if (!tokenDetails) {\r\n // No token, get a new one.\r\n return getNewToken(messaging.firebaseDependencies, subscriptionOptions);\r\n }\r\n else if (!isTokenValid(tokenDetails.subscriptionOptions, subscriptionOptions)) {\r\n // Invalid token, get a new one.\r\n try {\r\n await requestDeleteToken(messaging.firebaseDependencies, tokenDetails.token);\r\n }\r\n catch (e) {\r\n // Suppress errors because of #2364\r\n console.warn(e);\r\n }\r\n return getNewToken(messaging.firebaseDependencies, subscriptionOptions);\r\n }\r\n else if (Date.now() >= tokenDetails.createTime + TOKEN_EXPIRATION_MS) {\r\n // Weekly token refresh\r\n return updateToken(messaging, {\r\n token: tokenDetails.token,\r\n createTime: Date.now(),\r\n subscriptionOptions\r\n });\r\n }\r\n else {\r\n // Valid token, nothing to do.\r\n return tokenDetails.token;\r\n }\r\n}\r\n/**\r\n * This method deletes the token from the database, unsubscribes the token from FCM, and unregisters\r\n * the push subscription if it exists.\r\n */\r\nasync function deleteTokenInternal(messaging) {\r\n const tokenDetails = await dbGet(messaging.firebaseDependencies);\r\n if (tokenDetails) {\r\n await requestDeleteToken(messaging.firebaseDependencies, tokenDetails.token);\r\n await dbRemove(messaging.firebaseDependencies);\r\n }\r\n // Unsubscribe from the push subscription.\r\n const pushSubscription = await messaging.swRegistration.pushManager.getSubscription();\r\n if (pushSubscription) {\r\n return pushSubscription.unsubscribe();\r\n }\r\n // If there's no SW, consider it a success.\r\n return true;\r\n}\r\nasync function updateToken(messaging, tokenDetails) {\r\n try {\r\n const updatedToken = await requestUpdateToken(messaging.firebaseDependencies, tokenDetails);\r\n const updatedTokenDetails = Object.assign(Object.assign({}, tokenDetails), { token: updatedToken, createTime: Date.now() });\r\n await dbSet(messaging.firebaseDependencies, updatedTokenDetails);\r\n return updatedToken;\r\n }\r\n catch (e) {\r\n await deleteTokenInternal(messaging);\r\n throw e;\r\n }\r\n}\r\nasync function getNewToken(firebaseDependencies, subscriptionOptions) {\r\n const token = await requestGetToken(firebaseDependencies, subscriptionOptions);\r\n const tokenDetails = {\r\n token,\r\n createTime: Date.now(),\r\n subscriptionOptions\r\n };\r\n await dbSet(firebaseDependencies, tokenDetails);\r\n return tokenDetails.token;\r\n}\r\n/**\r\n * Gets a PushSubscription for the current user.\r\n */\r\nasync function getPushSubscription(swRegistration, vapidKey) {\r\n const subscription = await swRegistration.pushManager.getSubscription();\r\n if (subscription) {\r\n return subscription;\r\n }\r\n return swRegistration.pushManager.subscribe({\r\n userVisibleOnly: true,\r\n // Chrome <= 75 doesn't support base64-encoded VAPID key. For backward compatibility, VAPID key\r\n // submitted to pushManager#subscribe must be of type Uint8Array.\r\n applicationServerKey: base64ToArray(vapidKey)\r\n });\r\n}\r\n/**\r\n * Checks if the saved tokenDetails object matches the configuration provided.\r\n */\r\nfunction isTokenValid(dbOptions, currentOptions) {\r\n const isVapidKeyEqual = currentOptions.vapidKey === dbOptions.vapidKey;\r\n const isEndpointEqual = currentOptions.endpoint === dbOptions.endpoint;\r\n const isAuthEqual = currentOptions.auth === dbOptions.auth;\r\n const isP256dhEqual = currentOptions.p256dh === dbOptions.p256dh;\r\n return isVapidKeyEqual && isEndpointEqual && isAuthEqual && isP256dhEqual;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction externalizePayload(internalPayload) {\r\n const payload = {\r\n from: internalPayload.from,\r\n // eslint-disable-next-line camelcase\r\n collapseKey: internalPayload.collapse_key,\r\n // eslint-disable-next-line camelcase\r\n messageId: internalPayload.fcmMessageId\r\n };\r\n propagateNotificationPayload(payload, internalPayload);\r\n propagateDataPayload(payload, internalPayload);\r\n propagateFcmOptions(payload, internalPayload);\r\n return payload;\r\n}\r\nfunction propagateNotificationPayload(payload, messagePayloadInternal) {\r\n if (!messagePayloadInternal.notification) {\r\n return;\r\n }\r\n payload.notification = {};\r\n const title = messagePayloadInternal.notification.title;\r\n if (!!title) {\r\n payload.notification.title = title;\r\n }\r\n const body = messagePayloadInternal.notification.body;\r\n if (!!body) {\r\n payload.notification.body = body;\r\n }\r\n const image = messagePayloadInternal.notification.image;\r\n if (!!image) {\r\n payload.notification.image = image;\r\n }\r\n}\r\nfunction propagateDataPayload(payload, messagePayloadInternal) {\r\n if (!messagePayloadInternal.data) {\r\n return;\r\n }\r\n payload.data = messagePayloadInternal.data;\r\n}\r\nfunction propagateFcmOptions(payload, messagePayloadInternal) {\r\n if (!messagePayloadInternal.fcmOptions) {\r\n return;\r\n }\r\n payload.fcmOptions = {};\r\n const link = messagePayloadInternal.fcmOptions.link;\r\n if (!!link) {\r\n payload.fcmOptions.link = link;\r\n }\r\n // eslint-disable-next-line camelcase\r\n const analyticsLabel = messagePayloadInternal.fcmOptions.analytics_label;\r\n if (!!analyticsLabel) {\r\n payload.fcmOptions.analyticsLabel = analyticsLabel;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction isConsoleMessage(data) {\r\n // This message has a campaign ID, meaning it was sent using the Firebase Console.\r\n return typeof data === 'object' && !!data && CONSOLE_CAMPAIGN_ID in data;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n_mergeStrings('hts/frbslgigp.ogepscmv/ieo/eaylg', 'tp:/ieaeogn-agolai.o/1frlglgc/o');\r\n_mergeStrings('AzSCbw63g1R0nCw85jG8', 'Iaya3yLKwmgvh7cF0q4');\r\nfunction _mergeStrings(s1, s2) {\r\n const resultArray = [];\r\n for (let i = 0; i < s1.length; i++) {\r\n resultArray.push(s1.charAt(i));\r\n if (i < s2.length) {\r\n resultArray.push(s2.charAt(i));\r\n }\r\n }\r\n return resultArray.join('');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction extractAppConfig(app) {\r\n if (!app || !app.options) {\r\n throw getMissingValueError('App Configuration Object');\r\n }\r\n if (!app.name) {\r\n throw getMissingValueError('App Name');\r\n }\r\n // Required app config keys\r\n const configKeys = [\r\n 'projectId',\r\n 'apiKey',\r\n 'appId',\r\n 'messagingSenderId'\r\n ];\r\n const { options } = app;\r\n for (const keyName of configKeys) {\r\n if (!options[keyName]) {\r\n throw getMissingValueError(keyName);\r\n }\r\n }\r\n return {\r\n appName: app.name,\r\n projectId: options.projectId,\r\n apiKey: options.apiKey,\r\n appId: options.appId,\r\n senderId: options.messagingSenderId\r\n };\r\n}\r\nfunction getMissingValueError(valueName) {\r\n return ERROR_FACTORY.create(\"missing-app-config-values\" /* MISSING_APP_CONFIG_VALUES */, {\r\n valueName\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass MessagingService {\r\n constructor(app, installations, analyticsProvider) {\r\n // logging is only done with end user consent. Default to false.\r\n this.deliveryMetricsExportedToBigQueryEnabled = false;\r\n this.onBackgroundMessageHandler = null;\r\n this.onMessageHandler = null;\r\n this.logEvents = [];\r\n this.isLogServiceStarted = false;\r\n const appConfig = extractAppConfig(app);\r\n this.firebaseDependencies = {\r\n app,\r\n appConfig,\r\n installations,\r\n analyticsProvider\r\n };\r\n }\r\n _delete() {\r\n return Promise.resolve();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function registerDefaultSw(messaging) {\r\n try {\r\n messaging.swRegistration = await navigator.serviceWorker.register(DEFAULT_SW_PATH, {\r\n scope: DEFAULT_SW_SCOPE\r\n });\r\n // The timing when browser updates sw when sw has an update is unreliable from experiment. It\r\n // leads to version conflict when the SDK upgrades to a newer version in the main page, but sw\r\n // is stuck with the old version. For example,\r\n // https://github.com/firebase/firebase-js-sdk/issues/2590 The following line reliably updates\r\n // sw if there was an update.\r\n messaging.swRegistration.update().catch(() => {\r\n /* it is non blocking and we don't care if it failed */\r\n });\r\n }\r\n catch (e) {\r\n throw ERROR_FACTORY.create(\"failed-service-worker-registration\" /* FAILED_DEFAULT_REGISTRATION */, {\r\n browserErrorMessage: e.message\r\n });\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function updateSwReg(messaging, swRegistration) {\r\n if (!swRegistration && !messaging.swRegistration) {\r\n await registerDefaultSw(messaging);\r\n }\r\n if (!swRegistration && !!messaging.swRegistration) {\r\n return;\r\n }\r\n if (!(swRegistration instanceof ServiceWorkerRegistration)) {\r\n throw ERROR_FACTORY.create(\"invalid-sw-registration\" /* INVALID_SW_REGISTRATION */);\r\n }\r\n messaging.swRegistration = swRegistration;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function updateVapidKey(messaging, vapidKey) {\r\n if (!!vapidKey) {\r\n messaging.vapidKey = vapidKey;\r\n }\r\n else if (!messaging.vapidKey) {\r\n messaging.vapidKey = DEFAULT_VAPID_KEY;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function getToken$1(messaging, options) {\r\n if (!navigator) {\r\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* AVAILABLE_IN_WINDOW */);\r\n }\r\n if (Notification.permission === 'default') {\r\n await Notification.requestPermission();\r\n }\r\n if (Notification.permission !== 'granted') {\r\n throw ERROR_FACTORY.create(\"permission-blocked\" /* PERMISSION_BLOCKED */);\r\n }\r\n await updateVapidKey(messaging, options === null || options === void 0 ? void 0 : options.vapidKey);\r\n await updateSwReg(messaging, options === null || options === void 0 ? void 0 : options.serviceWorkerRegistration);\r\n return getTokenInternal(messaging);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function logToScion(messaging, messageType, data) {\r\n const eventType = getEventType(messageType);\r\n const analytics = await messaging.firebaseDependencies.analyticsProvider.get();\r\n analytics.logEvent(eventType, {\r\n /* eslint-disable camelcase */\r\n message_id: data[CONSOLE_CAMPAIGN_ID],\r\n message_name: data[CONSOLE_CAMPAIGN_NAME],\r\n message_time: data[CONSOLE_CAMPAIGN_TIME],\r\n message_device_time: Math.floor(Date.now() / 1000)\r\n /* eslint-enable camelcase */\r\n });\r\n}\r\nfunction getEventType(messageType) {\r\n switch (messageType) {\r\n case MessageType.NOTIFICATION_CLICKED:\r\n return 'notification_open';\r\n case MessageType.PUSH_RECEIVED:\r\n return 'notification_foreground';\r\n default:\r\n throw new Error();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function messageEventListener(messaging, event) {\r\n const internalPayload = event.data;\r\n if (!internalPayload.isFirebaseMessaging) {\r\n return;\r\n }\r\n if (messaging.onMessageHandler &&\r\n internalPayload.messageType === MessageType.PUSH_RECEIVED) {\r\n if (typeof messaging.onMessageHandler === 'function') {\r\n messaging.onMessageHandler(externalizePayload(internalPayload));\r\n }\r\n else {\r\n messaging.onMessageHandler.next(externalizePayload(internalPayload));\r\n }\r\n }\r\n // Log to Scion if applicable\r\n const dataPayload = internalPayload.data;\r\n if (isConsoleMessage(dataPayload) &&\r\n dataPayload[CONSOLE_CAMPAIGN_ANALYTICS_ENABLED] === '1') {\r\n await logToScion(messaging, internalPayload.messageType, dataPayload);\r\n }\r\n}\n\nconst name = \"@firebase/messaging\";\nconst version = \"0.9.12\";\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst WindowMessagingFactory = (container) => {\r\n const messaging = new MessagingService(container.getProvider('app').getImmediate(), container.getProvider('installations-internal').getImmediate(), container.getProvider('analytics-internal'));\r\n navigator.serviceWorker.addEventListener('message', e => messageEventListener(messaging, e));\r\n return messaging;\r\n};\r\nconst WindowMessagingInternalFactory = (container) => {\r\n const messaging = container\r\n .getProvider('messaging')\r\n .getImmediate();\r\n const messagingInternal = {\r\n getToken: (options) => getToken$1(messaging, options)\r\n };\r\n return messagingInternal;\r\n};\r\nfunction registerMessagingInWindow() {\r\n _registerComponent(new Component('messaging', WindowMessagingFactory, \"PUBLIC\" /* PUBLIC */));\r\n _registerComponent(new Component('messaging-internal', WindowMessagingInternalFactory, \"PRIVATE\" /* PRIVATE */));\r\n registerVersion(name, version);\r\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n registerVersion(name, version, 'esm2017');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Checks if all required APIs exist in the browser.\r\n * @returns a Promise that resolves to a boolean.\r\n *\r\n * @public\r\n */\r\nasync function isWindowSupported() {\r\n try {\r\n // This throws if open() is unsupported, so adding it to the conditional\r\n // statement below can cause an uncaught error.\r\n await validateIndexedDBOpenable();\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n // firebase-js-sdk/issues/2393 reveals that idb#open in Safari iframe and Firefox private browsing\r\n // might be prohibited to run. In these contexts, an error would be thrown during the messaging\r\n // instantiating phase, informing the developers to import/call isSupported for special handling.\r\n return (typeof window !== 'undefined' &&\r\n isIndexedDBAvailable() &&\r\n areCookiesEnabled() &&\r\n 'serviceWorker' in navigator &&\r\n 'PushManager' in window &&\r\n 'Notification' in window &&\r\n 'fetch' in window &&\r\n ServiceWorkerRegistration.prototype.hasOwnProperty('showNotification') &&\r\n PushSubscription.prototype.hasOwnProperty('getKey'));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function deleteToken$1(messaging) {\r\n if (!navigator) {\r\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* AVAILABLE_IN_WINDOW */);\r\n }\r\n if (!messaging.swRegistration) {\r\n await registerDefaultSw(messaging);\r\n }\r\n return deleteTokenInternal(messaging);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction onMessage$1(messaging, nextOrObserver) {\r\n if (!navigator) {\r\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* AVAILABLE_IN_WINDOW */);\r\n }\r\n messaging.onMessageHandler = nextOrObserver;\r\n return () => {\r\n messaging.onMessageHandler = null;\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Retrieves a Firebase Cloud Messaging instance.\r\n *\r\n * @returns The Firebase Cloud Messaging instance associated with the provided firebase app.\r\n *\r\n * @public\r\n */\r\nfunction getMessagingInWindow(app = getApp()) {\r\n // Conscious decision to make this async check non-blocking during the messaging instance\r\n // initialization phase for performance consideration. An error would be thrown latter for\r\n // developer's information. Developers can then choose to import and call `isSupported` for\r\n // special handling.\r\n isWindowSupported().then(isSupported => {\r\n // If `isWindowSupported()` resolved, but returned false.\r\n if (!isSupported) {\r\n throw ERROR_FACTORY.create(\"unsupported-browser\" /* UNSUPPORTED_BROWSER */);\r\n }\r\n }, _ => {\r\n // If `isWindowSupported()` rejected.\r\n throw ERROR_FACTORY.create(\"indexed-db-unsupported\" /* INDEXED_DB_UNSUPPORTED */);\r\n });\r\n return _getProvider(getModularInstance(app), 'messaging').getImmediate();\r\n}\r\n/**\r\n * Subscribes the {@link Messaging} instance to push notifications. Returns an Firebase Cloud\r\n * Messaging registration token that can be used to send push messages to that {@link Messaging}\r\n * instance.\r\n *\r\n * If a notification permission isn't already granted, this method asks the user for permission. The\r\n * returned promise rejects if the user does not allow the app to show notifications.\r\n *\r\n * @param messaging - The {@link Messaging} instance.\r\n * @param options - Provides an optional vapid key and an optinoal service worker registration\r\n *\r\n * @returns The promise resolves with an FCM registration token.\r\n *\r\n * @public\r\n */\r\nasync function getToken(messaging, options) {\r\n messaging = getModularInstance(messaging);\r\n return getToken$1(messaging, options);\r\n}\r\n/**\r\n * Deletes the registration token associated with this {@link Messaging} instance and unsubscribes\r\n * the {@link Messaging} instance from the push subscription.\r\n *\r\n * @param messaging - The {@link Messaging} instance.\r\n *\r\n * @returns The promise resolves when the token has been successfully deleted.\r\n *\r\n * @public\r\n */\r\nfunction deleteToken(messaging) {\r\n messaging = getModularInstance(messaging);\r\n return deleteToken$1(messaging);\r\n}\r\n/**\r\n * When a push message is received and the user is currently on a page for your origin, the\r\n * message is passed to the page and an `onMessage()` event is dispatched with the payload of\r\n * the push message.\r\n *\r\n *\r\n * @param messaging - The {@link Messaging} instance.\r\n * @param nextOrObserver - This function, or observer object with `next` defined,\r\n * is called when a message is received and the user is currently viewing your page.\r\n * @returns To stop listening for messages execute this returned function.\r\n *\r\n * @public\r\n */\r\nfunction onMessage(messaging, nextOrObserver) {\r\n messaging = getModularInstance(messaging);\r\n return onMessage$1(messaging, nextOrObserver);\r\n}\n\n/**\r\n * Firebase Cloud Messaging\r\n *\r\n * @packageDocumentation\r\n */\r\nregisterMessagingInWindow();\n\nexport { deleteToken, getMessagingInWindow as getMessaging, getToken, isWindowSupported as isSupported, onMessage };\n//# sourceMappingURL=index.esm2017.js.map\n","const __WEBPACK_NAMESPACE_OBJECT__ = Tinode;","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Alert extends React.PureComponent {\n render() {\n return this.props.visible ?\n

\n
\n
{this.props.title}
\n
{this.props.content}
\n
\n {this.props.onReject ?\n \n :\n null\n }\n \n
\n
\n
\n :\n null;\n }\n};\n","// This is a generated file. Don't edit.\n\nexport const PACKAGE_VERSION = \"0.20.0-beta1\";\n","import { PACKAGE_VERSION } from './version.js';\n\n// Name of this application, used in the User-Agent.\nexport const APP_NAME = 'TinodeWeb/' + (PACKAGE_VERSION || '0.17');\n\n// API key. Use https://github.com/tinode/chat/tree/master/keygen to generate your own\nexport const API_KEY = 'AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K';\n\n// The array of possible hosts to connect to.\nexport const KNOWN_HOSTS = {hosted: 'web.tinode.co', local: 'localhost:6060'};\n\n// Default host name and port to connect to.\nexport const DEFAULT_HOST = KNOWN_HOSTS.hosted;\n\n// Enable console logging.\nexport const LOGGING_ENABLED = true;\n\n// Minimum time between two keypress notifications, milliseconds.\nexport const KEYPRESS_DELAY = 3_000;\n// Delay before sending a {note} for reciving a message, milliseconds.\nexport const RECEIVED_DELAY = 500;\n// Delay before sending a read notification, milliseconds.\nexport const READ_DELAY = 1000;\n\n// The default shortest allowed tag length. Matches the value on the server.\nexport const MIN_TAG_LENGTH = 2;\n// The default greatest allowed tag length. Matches the value on the server.\nexport const MAX_TAG_LENGTH = 96;\n// The default maximum number of tags allowed. Matches the value on the server.\nexport const MAX_TAG_COUNT = 16;\n\n// Access mode for P2P subscriptions initiated by the current user.\nexport const DEFAULT_P2P_ACCESS_MODE = 'JRWPS';\n// Access mode for new group topics created by the current user.\nexport const NEW_GRP_ACCESS_MODE = 'JRWPSAO';\n// Access mode for a channel.\nexport const CHANNEL_ACCESS_MODE = 'JR';\n\n// Access mode for no access.\nexport const NO_ACCESS_MODE = 'N';\n\n// Mediaquery breakpoint between desktop and mobile, in px. Should match the value\n// in @media (max-size: 640px) in base.css\nexport const MEDIA_BREAKPOINT = 640;\n// Size of css 'rem' unit in pixels. Default 1rem = 10pt = 13px.\nexport const REM_SIZE = 13;\n\n// Size of the avatar image: when image dimensions are greater or the image is not square, it's resized to\n// a square of this size or less.\nexport const AVATAR_SIZE = 384;\n\n// Maximum size of an avatar in bytes for sending in-band. Bigger avatars will be sent out of band (as uploads).\nexport const MAX_AVATAR_BYTES = 4096;\n\n// Size of the broken_image shown in MessagesView\nexport const BROKEN_IMAGE_SIZE = 32;\n\n// Number of chat messages to fetch in one call.\nexport const MESSAGES_PAGE = 24;\n\n// Default maximum in-band (included directly into the message) attachment size which fits into\n// a message of 256K in size. Used when the server-provided value is unavailable. The actual\n// binary size of the attachment should be smaller due to base64 encoding expansion and some overhead,\n// for instance 1024 bytes.\n// Increase this limit to a greater value in production, if desired. Also increase\n// max_message_size in the server config.\nexport const MAX_INBAND_ATTACHMENT_SIZE = 262_144;\n\n// Default absolute maximum attachment size to be used with the server = 8MB.\n// Used when the server-provided value is unavailable. Increase to something like 100MB in production.\nexport const MAX_EXTERN_ATTACHMENT_SIZE = 1 << 23;\n\n// Maximum allowed linear dimension (pixels) of an image sent inline. Larger images will be shrunk\n// to make the larger dimension fit under this size. You may want to adjust it to 1600 or\n// 2400 for production.\nexport const MAX_IMAGE_DIM = 1024;\n\n// Linear dimensions of image preview: shrink image under this size for previews.\nexport const IMAGE_PREVIEW_DIM = 64;\n\n// Linear dimensions of image thumbnail: shrink image under this size for thumbnails in reply quote previews.\nexport const IMAGE_THUMBNAIL_DIM = 36;\n\n// Maximum number of online users to be shown in a topic title bar. Others will be\n// hidden under \"+X more\"\nexport const MAX_ONLINE_IN_TOPIC = 4;\n\n// Maximum length of user name, topic title, and private comment.\nexport const MAX_TITLE_LENGTH = 60;\n// Maximum length of topic description.\nexport const MAX_TOPIC_DESCRIPTION_LENGTH = 360;\n// Maximum length of user name when displaying a video call.\nexport const MAX_PEER_TITLE_LENGTH = 20;\n\n// Length of message previews in chat list, in characters.\nexport const MESSAGE_PREVIEW_LENGTH = 80;\n\n// Length of a quote in quoted reply (for outgoing messages).\nexport const QUOTED_REPLY_LENGTH = 30;\n// Length of a preview of a forwarded message.\nexport const FORWARDED_PREVIEW_LENGTH = 84;\n\n// Minimum duration of an audio recording in milliseconds (2 sec).\nexport const MIN_DURATION = 2_000;\n// Maximum duration of an audio recording in milliseconds (10 min).\nexport const MAX_DURATION = 600_000;\n\n// Link for \"Contact Us\".\nexport const LINK_CONTACT_US = 'mailto:support@tinode.co';\n\n// Link to Privacy Policy.\nexport const LINK_PRIVACY_POLICY = 'https://tinode.co/privacy.html';\n\n// Link to Terms of Service.\nexport const LINK_TERMS_OF_SERVICE = 'https://tinode.co/terms.html';\n\n","// Context Menu: popup/dropdown menu.\nimport React from 'react';\nimport { injectIntl, defineMessages } from 'react-intl';\n\nimport { REM_SIZE } from '../config.js';\n\nconst messages = defineMessages({\n info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n clear_messages: {\n id: 'menu_item_clear_messages',\n defaultMessage: 'Clear messages',\n description: 'Delete all messages'\n },\n clear_for_all: {\n id: 'menu_item_clear_messages_for_all',\n defaultMessage: 'Clear for All',\n description: 'Delete all message(s) for all members'\n },\n delete: {\n id: 'menu_item_delete',\n defaultMessage: 'Delete',\n description: 'Delete selected messages'\n },\n delete_for_all: {\n id: 'menu_item_delete_for_all',\n defaultMessage: 'Delete for All',\n description: 'Delete selected message(s) for all members'\n },\n send_retry: {\n id: 'menu_item_send_retry',\n defaultMessage: 'Retry',\n description: 'Retry sending message'\n },\n mute: {\n id: 'menu_item_mute',\n defaultMessage: 'Mute',\n description: 'Turn off notifications'\n },\n unmute: {\n id: 'menu_item_unmute',\n defaultMessage: 'Unmute',\n description: 'Turn notifications on'\n },\n reply: {\n id: 'menu_item_reply',\n defaultMessage: 'Reply',\n description: 'Reply to message'\n },\n forward: {\n id: 'menu_item_forward',\n defaultMessage: 'Forward',\n description: 'Forward message'\n },\n topic_delete: {\n id: 'menu_item_delete_topic',\n defaultMessage: 'Delete',\n description: 'Delete entire topic'\n },\n topic_delete_warning: {\n id: 'topic_delete_warning',\n defaultMessage: 'Are you sure you want to delete this conversation? It cannot be undone.',\n description: 'Alert warning when deleting entire topic'\n },\n delete_messages_warning: {\n id: 'delete_messages_warning',\n defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',\n description: 'Alert dialog warning when hard-deleting all messages.'\n },\n unblock: {\n id: 'menu_item_unblock',\n defaultMessage: 'Unblock',\n description: 'Unblock topic or user'\n },\n // Generic string suitable for either topic or user.\n block: {\n id: 'menu_item_block',\n defaultMessage: 'Block',\n description: 'Block topic or user'\n },\n topic_block_warning: {\n id: 'topic_block_warning',\n defaultMessage: 'Are you sure you want to block this conversation?',\n description: 'Alert warning when blocking a topic.'\n },\n member_delete: {\n id: 'menu_item_member_delete',\n defaultMessage: 'Remove',\n description: 'Remove user from topic'\n },\n archive: {\n id: 'menu_item_archive_topic',\n defaultMessage: 'Archive',\n description: 'Move topic from the list of active chats to archive'\n },\n unarchive: {\n id: 'menu_item_restore_topic',\n defaultMessage: 'Restore',\n description: 'Restore topic from archive'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n clear_messages_warning: {\n id: 'clear_messages_warning',\n defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',\n description: 'Alert dialog warning when deleting all messages.'\n },\n});\n\nclass ContextMenu extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n const {formatMessage} = props.intl;\n\n this.handlePageClick = this.handlePageClick.bind(this);\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClick = this.handleClick.bind(this);\n\n // Preconfigured menu items.\n this.MenuItems = {\n 'topic_info': {\n id: 'topic_info',\n title: formatMessage(messages.info),\n handler: null\n },\n 'messages_clear': {\n id: 'messages_clear',\n title: formatMessage(messages.clear_messages),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.clear_messages), // title\n formatMessage(messages.clear_messages_warning), // content\n (() => { this.deleteMessages(true, false, params, errorHandler); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'messages_clear_hard': {\n id: 'messages_clear_hard',\n title: formatMessage(messages.clear_for_all),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.clear_for_all), // title\n formatMessage(message.delete_messages_warning), // content\n (() => { return this.deleteMessages(true, true, params, errorHandler); }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'message_delete': {\n id: 'message_delete',\n title: formatMessage(messages.delete),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, false, params, errorHandler);\n }\n },\n 'message_delete_hard': {\n id: 'message_delete_hard',\n title: formatMessage(messages.delete_for_all),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, true, params, errorHandler);\n }\n },\n 'menu_item_send_retry': {\n id: 'menu_item_send_retry',\n title: formatMessage(messages.send_retry),\n handler: (params, errorHandler) => {\n return this.retryMessage(params, errorHandler);\n }\n },\n 'menu_item_reply': {\n id: 'menu_item_reply',\n title: formatMessage(messages.reply),\n handler: (params, errorHandler) => {\n return this.replyToMessage(params, errorHandler);\n }\n },\n 'menu_item_forward': {\n id: 'menu_item_forward',\n title: formatMessage(messages.forward),\n handler: () => {} /* the action is taken directly in tinode-web */\n },\n 'topic_unmute': {\n id: 'topic_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'topic_mute': {\n id: 'topic_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'topic_unblock': {\n id: 'topic_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n 'topic_block': {\n id: 'topic_block',\n title: formatMessage(messages.block),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.block), // title\n formatMessage(messages.topic_block_warning), // content\n (() => {\n return this.topicPermissionSetter('-JP', params, errorHandler).then((ctrl) => {\n this.props.onTopicRemoved(params.topicName);\n return ctrl;\n });\n }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_delete': {\n id: 'topic_delete',\n title: formatMessage(messages.topic_delete),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.topic_delete), // title\n formatMessage(messages.topic_delete_warning), // content\n (() => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.delTopic(true).catch((err) => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_archive': {\n id: 'topic_archive',\n title: formatMessage(messages.archive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(true).catch((err) => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'topic_restore': {\n id: 'topic_restore',\n title: formatMessage(messages.unarchive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(false).catch((err) => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n // menu_item_edit_permissions is defined elsewhere.\n 'permissions': {\n id: 'permissions',\n title: formatMessage(messages.edit_permissions),\n handler: null\n },\n 'member_delete': {\n id: 'member_delete',\n title: formatMessage(messages.member_delete),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic || !params.user) {\n console.warn(\"Topic or user not found: '\" + params.topicName + \"', '\" + params.user + \"'\");\n return;\n }\n return topic.delSubscription(params.user).catch((err) => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'member_mute': {\n id: 'member_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'member_unmute': {\n id: 'member_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'member_block': {\n id: 'member_block',\n title: formatMessage(messages.block),\n handler: this.topicPermissionSetter.bind(this, '-JP')\n },\n 'member_unblock': {\n id: 'member_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n };\n }\n\n componentDidMount() {\n document.addEventListener('mousedown', this.handlePageClick, false);\n document.addEventListener('keyup', this.handleEscapeKey, false);\n }\n\n componentWillUnmount() {\n document.removeEventListener('mousedown', this.handlePageClick, false);\n document.removeEventListener('keyup', this.handleEscapeKey, false);\n }\n\n handlePageClick(e) {\n if (this.selfRef.current.contains(e.target)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n this.props.hide();\n }\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n let item = this.props.items[e.currentTarget.dataset.id];\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n\n if (!item) {\n console.error(\"Invalid menu item ID\", e.currentTarget.dataset.id);\n } else {\n this.props.onAction(\n item.id,\n item.handler(this.props.params, this.props.onError),\n this.props.params);\n }\n }\n\n // Menu Actions\n\n deleteMessages(all, hard, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n\n // We don't know if the message is still pending (e.g. attachment is being uploaded),\n // so try cancelling first. No harm if we can't cancel.\n // The message can be cancelled if transmission to the server has not\n // started yet or if the message send has failed.\n if (!all && topic.cancelSend(params.seq)) {\n return;\n }\n // Can't cancel. Delete instead.\n const promise = all ?\n topic.delMessagesAll(hard) :\n topic.delMessagesList([params.seq], hard);\n\n return promise.catch((err) => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Retries sending failed message.\n retryMessage(params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n // Remove the existing message entry.\n if (!topic || !topic.flushMessage(params.seq)) {\n return;\n }\n const msg = topic.createMessage(params.content, false);\n return topic.publishDraft(msg).catch((err) => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Function is used by context menu to set permissions.\n topicPermissionSetter(mode, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found\", params.topicName);\n return;\n }\n\n let result = topic.updateMode(params.user, mode);\n if (errorHandler) {\n result = result.catch((err) => {\n errorHandler(err.message, 'err');\n });\n }\n return result;\n }\n\n replyToMessage(params, errorHandler) {\n params.pickReply(params.seq, params.content, params.userFrom, params.userName, errorHandler);\n }\n\n render() {\n const menu = [];\n let count = 0;\n this.props.items.map((item) => {\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n if (item && item.title) {\n menu.push(\n item.title == '-' ?\n
  • \n :\n
  • {item.title}
  • \n );\n }\n count++;\n });\n\n // Ensure that menu is inside the app-container.\n const hSize = 12 * REM_SIZE;\n const vSize = REM_SIZE * (0.7 + menu.length * 2.5);\n const left = (this.props.bounds.right - this.props.clickAt.x < hSize) ?\n (this.props.clickAt.x - this.props.bounds.left - hSize) :\n (this.props.clickAt.x - this.props.bounds.left);\n const top = (this.props.bounds.bottom - this.props.clickAt.y < vSize) ?\n (this.props.clickAt.y - this.props.bounds.top - vSize) :\n (this.props.clickAt.y - this.props.bounds.top);\n\n const position = {\n left: left + 'px',\n top: top + 'px'\n };\n\n return (\n
      \n {menu}\n
    \n );\n }\n}\n\nexport default injectIntl(ContextMenu);\n","import React from 'react';\n\nconst icon_mapping = {'muted': 'notifications_off', 'banned': 'block', 'staff': 'verified_user'};\n\n/* Contact's labels: [you], or icons [muted], [blocked] */\nexport default class ContactBadges extends React.PureComponent {\n render() {\n let badges = null;\n if (this.props.badges && this.props.badges.length > 0) {\n badges = [];\n this.props.badges.map((b) => {\n const color = (b.color ? ' ' + b.color : '');\n if (b.icon) {\n badges.push({icon_mapping[b.icon] || b.icon});\n } else {\n badges.push({b.name});\n }\n });\n return <>{badges};\n }\n return null;\n }\n};\n","// Short representation of time in the past.\nexport function shortDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n if (then.getFullYear() == now.getFullYear()) {\n // Same year.\n if (then.getMonth() == now.getMonth() && then.getDate() == now.getDate()) {\n // Same month and day, show time only.\n return then.toLocaleTimeString(locale, {hour12: false, hour: '2-digit', minute: '2-digit'});\n }\n // Different month and/or day, show month day, time.\n return then.toLocaleDateString(locale,\n {hour12: false, month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'});\n }\n // Different year: just show the date.\n return then.toLocaleDateString(locale, {year: 'numeric', month: 'short', day: 'numeric'});\n}\n\n// Convert seconds to [hours:]minutes:seconds, i.e. 156 sec -> 2:36, 3756 sec -> 1:02:36.\n// If fixedMins is true, then minutes are represented by at least two digits.\nexport function secondsToTime(seconds, fixedMin) {\n let min = Math.floor(seconds / 60) | 0;\n let hours = Math.floor(min / 60) | 0;\n\n if (fixedMin || hours > 0) {\n min = min < 10 ? `0${min}` : min;\n }\n let sec = (seconds % 60) | 0;\n sec = sec < 10 ? `0${sec}` : sec;\n if (hours == 0) {\n return `${min}:${sec}`;\n }\n return `${hours}:${min}:${sec}`;\n}\n\n// Convert a number of bytes to human-readable format.\nexport function bytesToHumanSize(bytes) {\n if (!bytes || bytes == 0) {\n return '0 Bytes';\n }\n\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const bucket = Math.min(Math.floor(Math.log2(bytes) / 10) | 0, sizes.length-1);\n const count = bytes / Math.pow(1024, bucket);\n const round = bucket > 0 ? (count < 3 ? 2 : (count < 30 ? 1 : 0)) : 0;\n return count.toFixed(round) + ' ' + sizes[bucket];\n}\n\n// Shorten a file name to be under maxLength by clipping out the middle.\nexport function shortenFileName(filename, maxLength) {\n if (typeof filename != 'string') {\n return filename;\n }\n return filename.length > maxLength ?\n filename.slice(0, maxLength/2 - 1) + '…' + filename.slice(1 - maxLength/2) : filename;\n}\n\n// Get 32 bit integer hash value for a string. Ideally it should produce the same value\n// as Java's String#hash().\nfunction stringToColorHash(value) {\n let hash = 0;\n value = '' + value;\n for (let i = 0; i < value.length; i++) {\n hash = ((hash << 5) - hash) + value.charCodeAt(i);\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\n// User avatar letter color id.\nexport function letterTileColorId(userId) {\n return Math.abs(stringToColorHash(userId)) % 16;\n}\n\n// Converts user or topic ID to a CSS color class. Ideally it should produce the same color value as Java version.\n// params:\n// - {string} id: user or topic ID\n// - {boolean} light: light or dark version of the color.\n// - {boolean} fg: foreground (text) or background color.\nexport function idToColorClass(id, light, fg) {\n return (light ? 'lt-' : 'dk-') + (fg ? 'fg-' : 'bg-') + letterTileColorId(id);\n}\n","// Odds and ends\n\nimport { Tinode } from 'tinode-sdk';\n\n// Make shortcut icon appear with a green dot + show unread count in title.\nexport function updateFavicon(count) {\n const oldIcon = document.getElementById('shortcut-icon');\n const head = document.head || document.getElementsByTagName('head')[0];\n const newIcon = document.createElement('link');\n newIcon.type = 'image/png';\n newIcon.id = 'shortcut-icon';\n newIcon.rel = 'shortcut icon';\n newIcon.href = 'img/logo32x32' + (count > 0 ? 'a' : '') + '.png';\n if (oldIcon) {\n head.removeChild(oldIcon);\n }\n head.appendChild(newIcon);\n\n document.title = (count > 0 ? '('+count+') ' : '') + 'Tinode';\n}\n\n// Create theCard which represents user's or topic's \"public\" info.\nexport function theCard(fn, imageUrl, imageMimeType, note) {\n let card = null;\n fn = fn && fn.trim();\n note = note && note.trim();\n\n if (fn) {\n card = {\n fn: fn\n };\n }\n\n if (typeof note == 'string') {\n card = card || {};\n card.note = note ? note : Tinode.DEL_CHAR;\n }\n\n if (imageUrl) {\n card = card || {};\n let mimeType = imageMimeType;\n // Is this a data URL \"data:[][;base64],\"?\n const matches = /^data:(image\\/[-a-z0-9+.]+)?(;base64)?,/i.exec(imageUrl);\n if (matches) {\n mimeType = matches[1];\n card.photo = {\n data: imageUrl.substring(imageUrl.indexOf(',') + 1),\n ref: Tinode.DEL_CHAR\n };\n } else {\n card.photo = {\n data: Tinode.DEL_CHAR,\n ref: imageUrl\n };\n }\n card.photo.type = (mimeType || 'image/jpeg').substring('image/'.length);\n }\n\n return card;\n}\n\n// Deep-shallow compare two arrays: shallow compare each element.\nexport function arrayEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (!Array.isArray(a) || !Array.isArray(b)) {\n return false;\n }\n\n // Compare lengths first.\n if (a.length != b.length) {\n return false;\n }\n // Order of elements is ignored.\n a.sort();\n b.sort();\n for (let i = 0, l = a.length; i < l; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\n// Checks (loosely) if the given string is a phone. If so, returns the phone number in a format\n// as close to E.164 as possible.\nexport function asPhone(val) {\n val = val.trim();\n if (/^(?:\\+?(\\d{1,3}))?[- (.]*(\\d{3})[- ).]*(\\d{3})[- .]*(\\d{2})[- .]*(\\d{2})?$/.test(val)) {\n return val.replace(/[- ().]*/, '');\n }\n return null;\n}\n\n// Checks (loosely) if the given string is an email. If so returns the email.\nexport function asEmail(val) {\n val = val.trim();\n if (/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$/.test(val)) {\n return val;\n }\n return null;\n}\n\n// Checks if URL is a relative url, i.e. has no 'scheme://', including the case of missing scheme '//'.\n// The scheme is expected to be RFC-compliant, e.g. [a-z][a-z0-9+.-]*\n// example.html - ok\n// https:example.com - not ok.\n// http:/example.com - not ok.\n// ' ↲ https://example.com' - not ok. (↲ means carriage return)\nexport function isUrlRelative(url) {\n return url && !/^\\s*([a-z][a-z0-9+.-]*:|\\/\\/)/im.test(url);\n}\n\n// Ensure URL does not present an XSS risk. Optional allowedSchemes may contain an array of\n// strings with permitted URL schemes, such as ['ftp', 'ftps']; otherwise accept http and https only.\nexport function sanitizeUrl(url, allowedSchemes) {\n if (typeof url != 'string') {\n return url;\n }\n\n // Strip control characters and whitespace. They are not valid URL characters anyway.\n url = url.replace(/[^\\x20-\\x7E]/gmi, '').trim();\n\n // Relative URLs are safe.\n // Relative URL does not start with ':', abcd123: or '//'.\n if (!/^([a-z][a-z0-9+.-]*:|\\/\\/)/i.test(url)) {\n return url;\n }\n\n // Blob URLs are safe.\n if (/^blob:http/.test(url)) {\n return url;\n }\n\n // Absolute URL. Accept only safe schemes, or no scheme.\n const schemes = Array.isArray(allowedSchemes) ? allowedSchemes.join('|') : 'http|https';\n const re = new RegExp('^((' + schemes + '):|//)', 'i');\n if (!re.test(url)) {\n return null;\n }\n\n return url;\n}\n\n// Ensure URL is suitable as a source like field: the URL must be a relative URL or\n// have http:, https:, blob: or data: scheme.\n// In case of data: scheme, the URL must must be of the right MIME type such as 'data:{mimeMajor}/XXXX;base64,'.\nexport function sanitizeUrlForMime(url, mimeMajor) {\n if (!url) {\n return null;\n }\n\n const sanitizedUrl = sanitizeUrl(url);\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Is this a data: URL of the appropriate mime type?\n const re = new RegExp(`data:${mimeMajor}\\/[a-z0-9.-]+;base64,`, 'i');\n if (re.test(url.trim())) {\n return url;\n }\n\n return null;\n}\n\n// Given message's received status, return name and color of a delivery indicator icon.\nexport function deliveryMarker(received) {\n switch (received) {\n case Tinode.MESSAGE_STATUS_SENDING:\n return { name: 'access_time' }; // watch face\n case Tinode.MESSAGE_STATUS_FAILED:\n return { name: 'warning', color: 'danger-color' }; // yellow icon /!\\\n case Tinode.MESSAGE_STATUS_SENT:\n return { name: 'done' }; // checkmark\n case Tinode.MESSAGE_STATUS_RECEIVED:\n return { name: 'done_all' }; // double checkmark\n case Tinode.MESSAGE_STATUS_READ:\n return { name: 'done_all', color: 'blue' }; // blue double checkmark\n }\n return null;\n}\n\n// Wraps a promise to make it cancelable.\n// The parameter can be either a promise or an error. If it's an error, the wrapped promise is\n// created in a rejected state.\nexport function cancelablePromise(promise) {\n let hasCanceled = false;\n\n const wrappedPromise = promise instanceof Error ?\n Promise.reject(promise) :\n new Promise((resolve, reject) => {\n promise.then(\n result => hasCanceled ? reject({isCanceled: true}) : resolve(result),\n error => hasCanceled ? reject({isCanceled: true}) : reject(error)\n );\n });\n\n return {\n promise: wrappedPromise,\n cancel() {\n hasCanceled = true;\n },\n };\n};\n\n// Clips string to the specified length.\nexport function clipStr(str, length) {\n return str && str.substring(0, length);\n}\n","import React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { idToColorClass } from '../lib/strformat.js';\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nexport default class LetterTile extends React.PureComponent {\n render() {\n let avatar;\n if (this.props.avatar === true) {\n const isGroup = Tinode.isGroupTopicName(this.props.topic);\n const iconColor = idToColorClass(this.props.topic, isGroup);\n if (this.props.topic && this.props.title && this.props.title.trim()) {\n const letter = this.props.title.trim().charAt(0);\n const className = 'lettertile ' + iconColor + (this.props.deleted ? ' disabled' : '');\n avatar = (
    {letter}
    )\n } else {\n const className = 'material-icons ' + iconColor + (this.props.deleted ? ' disabled' : '');\n avatar = isGroup ? group : person;\n }\n } else if (this.props.avatar) {\n const url = this.props.tinode.authorizeURL(sanitizeUrlForMime(this.props.avatar, 'image'));\n // If avatar image is invalid, show a placeholder.\n const className = 'avatar' + (this.props.deleted ? ' deleted' : '');\n avatar = \"avatar\"{e.target.onerror = null; e.target.src=\"../img/broken_image.png\"}} />;\n } else {\n avatar = null;\n }\n return avatar;\n }\n}\n","// The counter of unread messages in the topic.\nimport React from 'react';\n\nexport default class UnreadBadge extends React.PureComponent {\n render() {\n return (this.props.count > 0 ?\n {this.props.count > 9 ? \"9+\" : this.props.count}\n : null);\n }\n};\n","// File and image helper functions.\n\n// Supported image MIME types and corresponding file extensions.\nexport const SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml'];\nexport const MIME_EXTENSIONS = ['jpg', 'gif', 'png', 'svg', 'svg'];\n\n// Get an URL from a theCard photo: either create a data: URL or return reference URL.\nexport function makeImageUrl(photo) {\n if (photo && typeof photo == 'object') {\n if (photo.ref) {\n return photo.ref\n }\n if (photo.data && photo.type) {\n const mime = photo.type.startsWith('image/') ? photo.type : ('image/' + photo.type);\n return 'data:' + mime + ';base64,' + photo.data;\n }\n }\n return null;\n}\n\n// Calculate linear dimensions for scaling image down to fit under a certain size.\n// Returns an object which contains destination sizes, source sizes, and offsets\n// into source (when making square images).\nexport function fitImageSize(width, height, maxWidth, maxHeight, forceSquare) {\n // Sanitize input\n width = width | 0;\n height = height | 0;\n maxWidth = maxWidth | 0;\n maxHeight = maxHeight | 0;\n\n if (width <= 0 || height <= 0 || maxWidth <= 0 || maxHeight <= 0) {\n return null;\n }\n\n if (forceSquare) {\n maxWidth = maxHeight = Math.min(maxWidth, maxHeight);\n }\n\n const scale = Math.min(\n Math.min(width, maxWidth) / width,\n Math.min(height, maxHeight) / height\n );\n\n const size = {\n dstWidth: (width * scale) | 0,\n dstHeight: (height * scale) | 0,\n };\n\n if (forceSquare) {\n // Also calculate parameters for making the image square.\n size.dstWidth = size.dstHeight = Math.min(size.dstWidth, size.dstHeight);\n size.srcWidth = size.srcHeight = Math.min(width, height);\n size.xoffset = ((width - size.srcWidth) / 2) | 0;\n size.yoffset = ((height - size.srcWidth) / 2) | 0;\n } else {\n size.xoffset = size.yoffset = 0;\n size.srcWidth = width;\n size.srcHeight = height;\n }\n return size;\n}\n\n// Ensure file's extension matches mime content type\nexport function fileNameForMime(fname, mime) {\n const idx = SUPPORTED_IMAGE_FORMATS.indexOf(mime);\n if (idx < 0 || !fname) {\n // Unknown mime or empty name.\n return fname;\n }\n const ext = MIME_EXTENSIONS[idx];\n\n const at = fname.lastIndexOf('.');\n if (at >= 0) {\n fname = fname.substring(0, at);\n }\n return fname + '.' + ext;\n}\n\n// Scale uploaded image to fit under certain dimensions and byte size, optionally constraining to a square.\n// Returns a promise which is resolven on success or rejected on failure.\nexport function imageScaled(fileOrBlob, maxWidth, maxHeight, maxSize, forceSquare) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = function(err) {\n reject(new Error(\"Image format unrecognized\"));\n }\n img.onload = async function() {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n // Calculate the desired image dimensions.\n const dim = fitImageSize(img.width, img.height, maxWidth, maxHeight, forceSquare);\n if (!dim) {\n reject(new Error(\"Invalid image\"));\n return;\n }\n let canvas = document.createElement('canvas');\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n\n const mime = SUPPORTED_IMAGE_FORMATS.includes(fileOrBlob.type) ? fileOrBlob.type : 'image/jpeg';\n // Generate blob to check size of the image.\n let blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n if (!blob) {\n reject(new Error(\"Unsupported image format\"));\n return;\n }\n // Ensure the image is not too large. Shrink the image keeping the aspect ratio.\n // Do nothing if maxsize is <= 0.\n while (maxSize > 0 && blob.length > maxSize) {\n dim.dstWidth = (dim.dstWidth * 0.70710678118) | 0;\n dim.dstHeight = (dim.dstHeight * 0.70710678118) | 0;\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n }\n\n canvas = null;\n resolve({mime: mime, blob: blob, width: dim.dstWidth, height: dim.dstHeight, name: fileNameForMime(fileOrBlob.name, mime)});\n };\n img.src = URL.createObjectURL(fileOrBlob);\n });\n}\n\n// Scale and crop image according to specified dimensions.\n// The coordinates are in unscaled image pixels, i.e. cut the rectangle first then scale it.\n// returns a promise.\nexport function imageCrop(mime, objURL, left, top, width, height, scale) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = (err) => {\n reject(new Error(\"Image format unrecognized\"));\n };\n img.onload = () => {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n let canvas = document.createElement('canvas');\n canvas.width = width * scale;\n canvas.height = height * scale;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, left, top, width, height, 0, 0, canvas.width, canvas.height);\n\n mime = SUPPORTED_IMAGE_FORMATS.includes(mime) ? mime : 'image/jpeg';\n // Generate blob to check size of the image.\n canvas.toBlob((blob) => {\n // Allow GC.\n canvas = null;\n if (blob) {\n resolve({mime: mime, blob: blob, width: width, height: height});\n } else {\n reject(new Error(\"Unsupported image format\"));\n }\n }, mime);\n };\n img.src = objURL;\n });\n}\n\n// Convert file to base64 string.\nexport function fileToBase64(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = (evt) => {\n reject(reader.error);\n };\n reader.onload = () => {\n resolve({mime: file.type, bits: reader.result.split(',')[1], name: file.name});\n };\n reader.readAsDataURL(file);\n });\n}\n\n// Convert Blob to base64 string. Returns a promise resolved with the base64 string and mime.\nexport function blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = () => {\n resolve({mime: blob.type, bits: reader.result.split(',')[1]});\n };\n reader.readAsDataURL(blob);\n });\n}\n\n// File pasted from the clipboard. It's either an inline image or a file attachment.\nexport function filePasted(event, onImageSuccess, onAttachmentSuccess, onError) {\n const items = (event.clipboardData || event.originalEvent.clipboardData || {}).items;\n if (!items || !items.length) {\n return false;\n }\n\n for (let i in items) {\n const item = items[i];\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (!file) {\n console.error(\"Failed to get file object from pasted file item\", item.kind, item.type);\n onError(\"Failed to get file object from pasted file item\");\n continue;\n }\n if (file.type && file.type.split('/')[0] == 'image') {\n onImageSuccess(file);\n } else {\n onAttachmentSuccess(file);\n }\n // Indicate that the pasted data contains a file.\n return true;\n }\n }\n // No file found.\n return false;\n}\n\n// Get mime type from data URL header.\nexport function getMimeType(header) {\n var mime = /^data:(image\\/[-+a-z0-9.]+);base64/.exec(header);\n return (mime && mime.length > 1) ? mime[1] : null;\n}\n\n// Given length of a binary object in bytes, calculate the length after\n// base64 encoding.\nexport function base64EncodedLen(n) {\n return Math.floor((n + 2) / 3) * 4;\n}\n\n// Given length of a base64-encoded object, calculate decoded size of the\n// pbject in bytes.\nexport function base64DecodedLen(n) {\n return Math.floor(n / 4) * 3;\n}\n\n// Re-encode string to standard base64 encoding with padding.\n// The string may be base64-URL encoded without the padding.\nexport function base64ReEncode(str) {\n if (str) {\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n try {\n str = btoa(atob(str));\n } catch(err) {\n console.error(\"Failed to base64 re-encode string.\", err);\n str = null;\n }\n }\n return str;\n}\n\n// Convert a base64 encoded string with the provided mime type into a Blob.\nexport function base64ToBlob(str, mime) {\n if (!str) {\n return null;\n }\n\n try {\n // Make blob.\n const bin = atob(str);\n const length = bin.length;\n const buf = new ArrayBuffer(length);\n const arr = new Uint8Array(buf);\n for (let i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n\n return new Blob([buf], { type: mime });\n } catch(err) {\n console.error(\"Failed to convert base64 to blob: \", err);\n }\n\n return null;\n}\n\nexport function intArrayToBase64(arr) {\n if (!Array.isArray(arr)) {\n return null;\n }\n try {\n let bin = '';\n new Uint8Array(arr).forEach(b => bin += String.fromCharCode(b));\n return window.btoa(bin);\n } catch (err) {}\n return null;\n}\n\nexport function base64ToIntArray(b64) {\n const arr = [];\n try {\n const bin = window.atob(b64);\n [...bin].forEach(c => {\n arr.push(c.charCodeAt(0));\n });\n return arr;\n } catch (err) {}\n return null;\n}\n","// Audio recorder widget.\n\nimport React from 'react';\n\nimport { secondsToTime } from '../lib/strformat';\nimport { base64ToIntArray } from '../lib/blob-helpers';\n\n// Make canvas bigger than the element size to reduce blurring.\nconst CANVAS_UPSCALING = 2.0;\n// Thickness of a visualization bar.\nconst LINE_WIDTH = 3 * CANVAS_UPSCALING;\n// Spacing between two visualization bars.\nconst SPACING = 2 * CANVAS_UPSCALING;\n// Color of histogram bars.\nconst BAR_COLOR = '#888A';\nconst BAR_COLOR_DARK = '#666C';\nconst THUMB_COLOR = '#444E';\n// Minimum number of amplitude bars to draw.\nconst MIN_PREVIEW_LENGTH = 16;\n\nexport default class AudioPlayer extends React.PureComponent {\n constructor(props) {\n super(props);\n\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n\n this.state = {\n canPlay: false,\n playing: false,\n currentTime: '0:00',\n duration: this.props.duration > 0 ? secondsToTime(this.props.duration / 1000) : '-:--',\n longMin: this.props.duration >= 600000,\n preview: preview\n };\n\n this.initAudio = this.initAudio.bind(this);\n this.initCanvas = this.initCanvas.bind(this);\n this.resampleBars = this.resampleBars.bind(this);\n this.visualize = this.visualize.bind(this);\n\n this.handlePlay = this.handlePlay.bind(this);\n this.handleSeek = this.handleSeek.bind(this);\n this.handleError = this.handleError.bind(this);\n\n this.audioPlayer = null;\n\n this.viewBuffer = [];\n this.canvasRef = React.createRef();\n }\n\n componentDidMount() {\n if (this.props.src) {\n this.initAudio();\n }\n\n this.initCanvas();\n }\n\n componentWillUnmount() {\n if (this.audioPlayer) {\n this.audioPlayer.oncanplay = null;\n this.audioPlayer.ontimeupdate = null;\n this.audioPlayer.onended = null;\n this.audioPlayer.pause();\n this.audioPlayer = null;\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.src != prevProps.src) {\n this.initAudio();\n }\n\n if (this.props.preview != prevProps.preview) {\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n this.setState({preview: preview}, this.initCanvas);\n }\n }\n\n initAudio() {\n this.audioPlayer = new Audio(this.props.src);\n this.audioPlayer.oncanplay = _ => this.setState({canPlay: true});\n this.audioPlayer.ontimeupdate = _ => this.setState({\n currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)\n });\n this.audioPlayer.onended = _ => {\n this.audioPlayer.currentTime = 0;\n this.setState({playing: false, currentTime: secondsToTime(0, this.state.longMin)})\n }\n }\n\n initCanvas() {\n // Force canvas aspect ratio to match one of the element + upscale canvas to reduce blurring.\n this.canvasRef.current.width = this.canvasRef.current.offsetWidth * CANVAS_UPSCALING;\n this.canvasRef.current.height = this.canvasRef.current.offsetHeight * CANVAS_UPSCALING;\n\n this.canvasContext = this.canvasRef.current.getContext('2d');\n this.canvasContext.lineCap = 'round';\n\n this.viewBuffer = this.resampleBars(this.state.preview);\n this.visualize();\n }\n\n // Draw amplitude of sound.\n visualize() {\n if (!this.canvasRef.current) {\n return;\n }\n\n const width = this.effectiveWidth;\n const height = this.canvasRef.current.height;\n\n this.canvasContext.lineWidth = LINE_WIDTH;\n\n const drawFrame = () => {\n if (!this.canvasRef.current || !this.audioPlayer) {\n // The component is unmounted.\n return;\n }\n\n this.canvasContext.clearRect(0, 0, this.canvasRef.current.width, height);\n\n if (this.viewBuffer) {\n if (this.state.playing) {\n window.requestAnimationFrame(drawFrame);\n }\n\n // Current playback position.\n const thumbAt = this.props.duration ?\n Math.max(0, Math.min(this.audioPlayer.currentTime * 1000 / this.props.duration, 1)) * (width - LINE_WIDTH * 2) : -1;\n\n // Draw amplitude bars.\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = BAR_COLOR_DARK;\n for (let i = 0; i < this.viewBuffer.length; i++) {\n let x = 1 + i * (LINE_WIDTH + SPACING) + LINE_WIDTH * 0.5;\n let y = this.viewBuffer[i] * height * 0.9;\n\n const color = x < thumbAt ? BAR_COLOR_DARK : BAR_COLOR;\n if (this.canvasContext.strokeStyle != color) {\n this.canvasContext.stroke();\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = color;\n }\n\n this.canvasContext.moveTo(x, (height - y) * 0.5);\n this.canvasContext.lineTo(x, height * 0.5 + y * 0.5);\n }\n // Actually draw the bars on canvas.\n this.canvasContext.stroke();\n\n // Draw thumb.\n if (this.props.duration) {\n this.canvasContext.beginPath();\n this.canvasContext.arc(thumbAt + LINE_WIDTH * 2, height * 0.5, LINE_WIDTH * 2, 0, 2 * Math.PI);\n this.canvasContext.fillStyle = THUMB_COLOR;\n this.canvasContext.fill();\n }\n }\n }\n\n drawFrame();\n }\n\n // Quick and dirty downsampling of the original preview bars into a smaller (or equal) number of bars we can display here.\n resampleBars(original) {\n const dstCount = ((this.canvasRef.current.width - SPACING) / (LINE_WIDTH + SPACING)) | 0;\n // Remove extra padding on the right due to fractional bar which is not drawn.\n this.effectiveWidth = dstCount * (LINE_WIDTH + SPACING) + SPACING;\n\n if (!Array.isArray(original) || original.length == 0) {\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n const factor = original.length / dstCount;\n let amps = [];\n let maxAmp = -1;\n for (let i=0; i 0) {\n return amps.map(a => a / maxAmp);\n }\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n handlePlay(e) {\n e.preventDefault();\n if (!this.state.canPlay) {\n return;\n }\n if (this.state.playing) {\n this.audioPlayer.pause();\n this.setState({playing: false});\n } else {\n this.audioPlayer.play();\n this.setState({playing: true}, this.visualize);\n }\n }\n\n handleError(err) {\n console.error(err);\n }\n\n handleSeek(e) {\n e.preventDefault();\n if (e.target && this.props.duration) {\n const rect = e.target.getBoundingClientRect();\n const offset = (e.clientX - rect.left) / this.effectiveWidth * CANVAS_UPSCALING;\n this.audioPlayer.currentTime = this.props.duration * offset / 1000;\n this.setState({currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)});\n if (!this.state.playing) {\n this.visualize();\n }\n }\n }\n\n render() {\n const playClass = 'material-icons' +\n (this.props.short ? '' : ' large') +\n (this.state.canPlay ? '' : ' disabled');\n const play = (\n {this.state.playing ? 'pause_circle' :\n (this.state.canPlay ? 'play_circle' : 'not_interested')}\n );\n return (
    {this.props.short ?\n <>\n \n {play}\n \n :\n <>\n {play}\n
    \n \n
    {this.state.currentTime}/{this.state.duration}
    \n
    \n \n }\n
    );\n }\n}\n","// Chat message describing a video or voice call.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\nexport default class CallMessage extends React.PureComponent {\n render() {\n const isCallDropped = ['declined', 'disconnected', 'missed'].includes(this.props.callState);\n const successClass = 'material-icons medium ' + (isCallDropped ? 'red' : 'green');\n const callIcon = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n const duration = isCallDropped ? (\n this.props.incoming ? (this.props.callState == 'declined' ?\n :\n \n ) :\n \n ) : {secondsToTime(this.props.duration / 1000)};\n return
    \n
    call
    \n
    \n
    {this.props.incoming ?\n :\n \n }
    \n
    {callIcon} {duration}
    \n
    \n
    ;\n }\n}\n","// The counter of unread messages in the topic.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\n// Props:\n// incoming: true | false.\n// success: true | false.\nexport default class CallStatus extends React.PureComponent {\n render() {\n const isCallDropped = ['declined', 'disconnected', 'missed'].includes(this.props.callState);\n const icon2 = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n const duration = isCallDropped ? (\n this.props.incoming ? (this.props.callState == 'declined' ?\n :\n \n ) :\n \n ) : {secondsToTime(this.props.duration / 1000)};\n return (\n <>\n
    \n call{icon2}\n
    {duration}\n \n );\n }\n};\n","// Image with a placeholder which is replaced when the promise is resolved.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class LazyImage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n src: 'img/placeholder.png',\n style: Object.assign({padding: '4px'}, this.props.style),\n className: this.props.className,\n alt: this.props.alt,\n onClick: this.props.onClick,\n };\n }\n\n componentDidMount() {\n // whenDone is a wrapper around an actual promise to be able to cancel it.\n this.props.whenDone\n .promise\n .then(data => this.setState({src: data.src, style: {...this.state.style, padding: 0}}))\n .catch(() => this.setState({src: 'img/broken_image.png'}));\n }\n\n componentWillUnmount() {\n this.props.whenDone.cancel();\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.whenDone != this.props.whenDone) {\n this.setState({src: 'img/placeholder.png', style: {...this.state.style, padding: '4px'}});\n this.props.whenDone\n .promise\n .then(data => this.setState({src: data.src, style: {...this.state.style, padding: 0}}))\n .catch(() => this.setState({src: 'img/broken_image.png'}));\n }\n }\n\n render() {\n return React.createElement('img', this.state);\n }\n};\n","// File uload/download progress indicator with a cancel inside.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class FileProgress extends React.PureComponent {\n render() {\n return (\n
    \n
    \n {this.props.progress < 0.999 ?\n {e.preventDefault(); this.props.onCancel();}}>\n close \n \n :\n \n }\n
    \n );\n }\n}\n","// Image view with progress bar and a cancel button.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport FileProgress from './file-progress.jsx';\n\nexport default class UploadingImage extends React.PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n return (\n
    \n {React.createElement('img', this.props)}\n
    \n \n
    \n
    \n );\n }\n};\n","import React from 'react';\nimport { defineMessages } from 'react-intl';\n\nimport { Drafty } from 'tinode-sdk';\n\nimport AudioPlayer from '../widgets/audio-player.jsx'\nimport CallMessage from '../widgets/call-message.jsx'\nimport CallStatus from '../widgets/call-status.jsx';\nimport LazyImage from '../widgets/lazy-image.jsx'\nimport UploadingImage from '../widgets/uploading-image.jsx'\n\nimport { IMAGE_THUMBNAIL_DIM, BROKEN_IMAGE_SIZE, REM_SIZE } from '../config.js';\nimport { base64ToBlob, blobToBase64, fitImageSize, imageScaled } from './blob-helpers.js';\nimport { idToColorClass, secondsToTime, shortenFileName } from './strformat.js';\nimport { cancelablePromise, sanitizeUrlForMime } from './utils.js';\n\nconst messages = defineMessages({\n drafty_form: {\n id: 'drafty_form',\n defaultMessage: 'Form: ',\n description: 'Comment for form in drafty'\n },\n drafty_attachment: {\n id: 'drafty_attachment',\n defaultMessage: 'Attachment',\n description: 'Comment for attachment in drafty'\n },\n drafty_image: {\n id: 'drafty_image',\n defaultMessage: 'Picture',\n description: 'Comment for embedded images in drafty'\n },\n drafty_unknown: {\n id: 'drafty_unknown',\n defaultMessage: 'Unsupported',\n description: 'Unsupported entity in drafty'\n }\n});\n\n// Additional processing of image data.\nfunction handleImageData(el, data, attr) {\n if (!data) {\n attr.src = 'img/broken_image.png';\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n };\n return el;\n }\n\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n this.viewportWidth > 0 ? Math.min(this.viewportWidth - REM_SIZE * 6.5, REM_SIZE * 34.5) :\n REM_SIZE * 34.5, REM_SIZE * 24, false) ||\n {dstWidth: BROKEN_IMAGE_SIZE, dstHeight: BROKEN_IMAGE_SIZE};\n attr.style = {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px',\n // Looks like a Chrome bug: broken image does not respect 'width' and 'height'.\n minWidth: dim.dstWidth + 'px',\n minHeight: dim.dstHeight + 'px'\n };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'image'));\n attr.alt = data.name;\n if (attr.src) {\n if (Math.max(data.width || 0, data.height || 0) > IMAGE_THUMBNAIL_DIM) {\n // Allow previews for large enough images.\n attr.onClick = this.onImagePreview;\n attr.className += ' image-clickable';\n }\n attr.loading = 'lazy';\n } else {\n attr.src = 'img/broken_image.png';\n }\n } else {\n // Use custom element instead of .\n el = UploadingImage;\n }\n\n return el;\n}\n\n// The main Drafty formatter: converts Drafty elements into React classes. 'this' is set by the caller.\n// 'this' must contain:\n// viewportWidth: this.props.viewportWidth;\n// authorizeURL: this.props.tinode.authorizeURL\n// onImagePreview: this.handleImagePreview\n// onFormButtonClick: this.handleFormButtonClick\n// onQuoteClick: this.handleQuoteClick (optional)\nexport function fullFormatter(style, data, values, key, stack) {\n if (stack.includes('QQ')) {\n return quoteFormatter.call(this, style, data, values, key);\n }\n\n if (!style) {\n // Unformatted.\n return values;\n }\n\n let el = Drafty.tagName(style);\n let attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch (style) {\n case 'AU':\n // Show audio player.\n if (attr.src) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'audio'));\n attr.duration = data.duration > 0 ? (data.duration | 0) : undefined;\n attr.preview = data.preview;\n attr.loading = 'lazy';\n }\n el = AudioPlayer;\n // Audio element cannot have content.\n values = null;\n break;\n case 'BR':\n values = null;\n break;\n case 'EX':\n // Ignore.\n break;\n case 'HL':\n // Highlighted text. Assign class name.\n attr.className = 'highlight';\n break;\n case 'HD':\n el = null;\n values = null;\n break;\n case 'IM':\n // Additional processing for images\n el = handleImageData.call(this, el, data, attr);\n // Image element cannot have content.\n values = null;\n break;\n case 'BN':\n // Button\n attr.onClick = this.onFormButtonClick;\n let inner = React.Children.map(values, (child) => {\n return typeof child == 'string' ? child : undefined;\n });\n if (!inner || inner.length == 0) {\n inner = [attr.name]\n }\n // Get text which will be sent back when the button is clicked.\n attr['data-title'] = inner.join('');\n break;\n case 'MN':\n // Mention\n attr.className = 'mention'\n if (data) {\n attr.className += ' ' + idToColorClass(data.val, false, true);\n }\n break;\n case 'FM':\n // Form\n attr.className = 'bot-form';\n break;\n case 'RW':\n // Form element formatting is dependent on element content.\n break;\n case 'QQ':\n // Quote/citation.\n attr.className = 'reply-quote'\n attr.onClick = this.onQuoteClick;\n break;\n case 'VC':\n el = CallMessage;\n // Video call messages do not have content.\n values = null;\n if (data) {\n attr.callState = data.state;\n attr.incoming = data.incoming;\n attr.duration = data.duration;\n }\n break;\n default:\n if (!el) {\n // Unknown element.\n el = React.Fragment;\n attr = {key: key};\n // Generate comment for unknown element.\n let body = values;\n if (!Array.isArray(values) || !values.join('').trim()) {\n body = [{this.formatMessage(messages.drafty_unknown)}];\n }\n values = [extension, ' '].concat(body);\n }\n break;\n }\n if (!el) {\n return values;\n }\n return React.createElement(el, attr, values);\n}\n\n// Converts Drafty object into a one-line preview. 'this' is set by the caller.\n// 'this' must contain:\n// formatMessage: this.props.intl.formatMessage\n// messages: formatjs messages defined with defineMessages.\nexport function previewFormatter(style, data, values, key) {\n if (!style) {\n // Unformatted.\n return values;\n }\n\n let el = Drafty.tagName(style);\n const attr = { key: key };\n switch (style) {\n case 'AU':\n // Voicemail as '[mic] 0:00'.\n el = React.Fragment;\n values = [mic, ' ', secondsToTime(data.duration/1000)];\n break;\n case 'BR':\n // Replace new line with a space.\n el = React.Fragment;\n values = [' '];\n break;\n case 'HL':\n // Make highlight less prominent in preview.\n attr.className = 'highlight preview';\n break;\n case 'LN':\n case 'MN':\n // Disable links in previews.\n el = 'span';\n break;\n case 'IM':\n // Replace image with '[icon] Image'.\n el = React.Fragment;\n values = [photo, ' ', this.formatMessage(messages.drafty_image)];\n break;\n case 'BN':\n el = 'span';\n attr.className = 'flat-button faux';\n break;\n case 'FM':\n el = React.Fragment;\n values = [dashboard,\n this.formatMessage(messages.drafty_form)].concat(' ', values || []);\n break;\n case 'RW':\n el = React.Fragment;\n break;\n case 'EX':\n if (data) {\n if (data.mime == 'application/json') {\n // Ignore JSON attachments: they are form response payloads.\n return null;\n }\n // Clear payload.\n delete data.val;\n delete data.ref;\n }\n el = React.Fragment;\n values = [attachment, ' ', this.formatMessage(messages.drafty_attachment)];\n break;\n case 'VC':\n el = CallStatus;\n if (data) {\n attr.callState = data.state;\n attr.incoming = data.incoming;\n attr.duration = data.duration;\n }\n values = null;\n break;\n case 'QQ':\n case 'HD':\n el = null;\n values = null;\n break;\n default:\n if (!el) {\n // Unknown element.\n el = React.Fragment;\n values = [extension, ' ', this.formatMessage(messages.drafty_unknown)];\n }\n break;\n }\n if (!el) {\n return values;\n }\n return React.createElement(el, attr, values);\n};\n\n// Converts Drafty object into a quoted reply. 'this' is set by the caller.\nfunction inlineImageAttr(attr, data) {\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n maxWidth: IMAGE_THUMBNAIL_DIM + 'px',\n maxHeight: IMAGE_THUMBNAIL_DIM + 'px',\n }\n attr.className = 'inline-image';\n attr.alt = this.formatMessage(messages.drafty_image);\n if (!data) {\n attr.src = 'img/broken_image.png';\n }\n attr.title = attr.alt;\n return attr;\n}\n\n// Displays a portion of Drafty within 'QQ' quotes. 'this' is set by the caller.\n// 'this' must contain:\n// formatMessage: this.props.intl.formatMessage\n// messages: formatjs messages defined with defineMessages.\n// authorizeURL: this.props.tinode.authorizeURL\n// onQuoteClick: this.handleQuoteClick (optional)\nfunction quoteFormatter(style, data, values, key) {\n if (['BR', 'EX', 'IM', 'MN'].includes(style)) {\n let el = Drafty.tagName(style);\n let attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch(style) {\n case 'BR':\n values = null;\n break;\n case 'IM':\n attr = inlineImageAttr.call(this, attr, data);\n values = [React.createElement('img', attr, null), ' ', attr.alt];\n el = React.Fragment;\n // Fragment attributes.\n attr = {key: key};\n break;\n case 'MN':\n el = 'span';\n attr.className = 'mention'\n if (data) {\n attr.className += ' ' + idToColorClass(data.val, false, true);\n }\n break;\n case 'EX':\n let fname;\n if (data) {\n if (data.mime == 'application/json') {\n // Ignore JSON attachments: they are form response payloads.\n return null;\n }\n fname = data.name;\n // Clear payload.\n delete data.val;\n delete data.ref;\n }\n el = React.Fragment;\n values = [attachment,\n shortenFileName(fname, 16) || this.formatMessage(messages.drafty_attachment)];\n break;\n }\n return React.createElement(el, attr, values);\n }\n return previewFormatter.call(this, style, data, values, key);\n}\n\n// Create image thumbnail suitable for inclusion in a quote.\nfunction quoteImage(data) {\n let promise;\n // Get the blob from the image data.\n if (data.val) {\n const blob = base64ToBlob(data.val, data.mime);\n if (!blob) {\n throw new Error(\"Invalid image\");\n }\n promise = Promise.resolve(blob);\n } else if (data.ref) {\n promise = fetch(this.authorizeURL(sanitizeUrlForMime(data.ref, 'image')))\n .then(evt => {\n if (evt.ok) {\n return evt.blob();\n } else {\n throw new Error(`Image fetch unsuccessful: ${evt.status} ${evt.statusText}`);\n }\n });\n } else {\n throw new Error(\"Missing image data\");\n }\n\n // Scale the blob.\n return promise\n .then(blob => {\n // Cut the square from the center of the image and shrink it.\n return imageScaled(blob, IMAGE_THUMBNAIL_DIM, IMAGE_THUMBNAIL_DIM, -1, true)\n }).then(scaled => {\n data.mime = scaled.mime;\n data.size = scaled.blob.size;\n data.width = scaled.width;\n data.height = scaled.height;\n delete data.ref;\n // Keeping the original file name, if provided: ex.data.name;\n\n data.src = URL.createObjectURL(scaled.blob);\n return blobToBase64(scaled.blob);\n }).then(b64 => {\n data.val = b64.bits;\n return data;\n }).catch(err => {\n delete data.val;\n delete data.src;\n data.width = IMAGE_THUMBNAIL_DIM;\n data.height = IMAGE_THUMBNAIL_DIM;\n // Rethrow.\n throw err;\n });\n}\n\n// Create a preview of a reply.\nexport function replyFormatter(style, data, values, key, stack) {\n if (style == 'IM') {\n const attr = inlineImageAttr.call(this, {key: key}, data);\n let loadedPromise;\n try {\n loadedPromise = cancelablePromise(quoteImage.call(this, data));\n } catch (error) {\n loadedPromise = cancelablePromise(error);\n }\n attr.whenDone = loadedPromise;\n values = [React.createElement(LazyImage, attr, null), ' ', attr.alt];\n return React.createElement(React.Fragment, {key: key}, values);\n } else if (style == 'QQ') {\n if (stack.includes('QQ')) {\n // Quote inside quote when forwarding a message.\n return React.createElement('span', {key: key},\n [format_quote, ' ']);\n }\n\n const attr = Drafty.attrValue('QQ', data) || {};\n attr.key = key;\n attr.className = 'reply-quote'\n return React.createElement(Drafty.tagName('QQ'), attr, values);\n }\n return quoteFormatter.call(this, style, data, values, key);\n}\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\n\nimport ContactBadges from './contact-badges.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport UnreadBadge from './unread-badge.jsx';\n\nimport { Drafty } from 'tinode-sdk';\n\nimport { previewFormatter } from '../lib/formatters.js';\nimport { deliveryMarker } from '../lib/utils.js';\n\nclass Contact extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.onSelected) {\n // Index this.props.index is used by GroupManager.\n this.props.onSelected(this.props.item, this.props.index);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({ topicName: this.props.item, y: e.pageY, x: e.pageX });\n }\n\n render() {\n let title = this.props.title;\n if (!title) {\n title = ;\n } else if (title.length > 30) {\n // FIXME: this is probably wrong for RTL languages.\n title = title.substring(0, 28) + '…';\n }\n const online = this.props.now ? 'online' : 'offline';\n const avatar = this.props.avatar ? this.props.avatar : true;\n const badges = this.props.badges ? this.props.badges.slice() : [];\n const icon_badges = [];\n if (this.props.isVerified) {\n icon_badges.push({icon: 'verified', color: 'verified-color'});\n }\n if (this.props.isStaff) {\n icon_badges.push({icon: 'staff', color: 'staff-color'});\n }\n if (this.props.isDangerous) {\n icon_badges.push({icon: 'dangerous', color: 'danger-color'});\n }\n if (this.props.acs) {\n if (this.props.showMode) {\n badges.push({name: this.props.acs.getMode(), key: 'mode'});\n }\n if (this.props.acs.isMuted()) {\n icon_badges.push({icon: 'muted'});\n }\n if (!this.props.acs.isJoiner()) {\n icon_badges.push({icon: 'banned'});\n }\n }\n\n // The this.props.preview contains alreay shortened Drafty or string.\n let preview;\n if (typeof this.props.preview == 'string') {\n preview = this.props.preview;\n } else if (Drafty.isValid(this.props.preview)) {\n preview = React.createElement(React.Fragment, null, Drafty.format(this.props.preview, previewFormatter,\n {formatMessage: this.props.intl.formatMessage, previewIsResponse: this.props.previewIsResponse}));\n } else if (this.props.preview) {\n preview =\n <>warning_amber \n \n ;\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n const titleClass = 'contact-title' + (this.props.deleted ? ' deleted' : '');\n\n return (\n
  • \n
    \n \n {this.props.deleted ? cancel :\n this.props.showOnline ? :\n (this.props.showCheckmark && this.props.selected) ?\n check_circle\n : null}\n
    \n
    \n
    {title}\n {this.props.isChannel ? \"channel\" : null}\n \n {!this.props.deleted ? : null}\n
    \n {this.props.showMode ?\n :\n this.props.small ? null :
    {marker}{preview || this.props.comment || '\\u00A0'}
    }\n
    \n {this.props.showContextMenu ?\n \n \n expand_more\n \n : null}\n
  • \n );\n }\n};\n\nexport default injectIntl(Contact);\n","// A panel included into a list of contacts with an action text.\nimport React from 'react';\nimport { injectIntl } from 'react-intl';\n\nclass ContactAction extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.onAction(this.props.action);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n
  • \n
    {formatMessage(this.props.title, this.props.values)}
    \n
  • \n );\n }\n};\n\nexport default injectIntl(ContactAction);\n","// ContactList: component for showing a list of contacts,\n// such as a list of group members in a group chat.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Contact from './contact.jsx';\nimport ContactAction from './contact-action.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nimport { MESSAGE_PREVIEW_LENGTH } from '../config.js';\n\nconst messages = defineMessages({\n badge_you: {\n id: 'badge_you',\n defaultMessage: 'you',\n description: 'Badge for indicating the current user'\n },\n badge_owner: {\n id: 'badge_owner',\n defaultMessage: 'owner',\n description: 'Badge for indicating the owner'\n }\n});\n\nclass ContactList extends React.Component {\n render() {\n const { formatMessage } = this.props.intl;\n const showCheckmark = Array.isArray(this.props.topicSelected);\n const contactNodes = [];\n let contactsCount = 0;\n if (this.props.contacts && this.props.contacts.length > 0) {\n this.props.contacts.map((c) => {\n if (c.action) {\n // Action item\n contactNodes.push(\n );\n } else {\n // Normal contact\n const key = this.props.showMode ? c.user : (c.topic || c.user);\n // If filter function is provided, filter out the items\n // which don't satisfy the condition.\n if (this.props.filterFunc && this.props.filter) {\n const filterOn = [key];\n if (c.private && c.private.comment) {\n filterOn.push(('' + c.private.comment).toLowerCase());\n }\n if (c.public && c.public.fn) {\n filterOn.push(('' + c.public.fn).toLowerCase());\n }\n if (!this.props.filterFunc(this.props.filter, filterOn)) {\n return;\n }\n }\n\n const isChannel = Tinode.isChannelTopicName(key);\n const selected = showCheckmark ?\n (this.props.topicSelected.indexOf(key) > -1) :\n (this.props.topicSelected === key);\n const badges = [];\n if (this.props.showMode) {\n if (key == this.props.myUserId) {\n badges.push({name: formatMessage(messages.badge_you), color: 'green'});\n }\n if (c.acs && c.acs.isOwner()) {\n badges.push({name: formatMessage(messages.badge_owner), color: 'blue'});\n }\n }\n\n const comment = Array.isArray(c.private) ?\n c.private.join(',') : (c.private ? c.private.comment : null);\n let preview;\n let forwarded;\n let previewIsResponse;\n let deliveryStatus;\n if (!this.props.showMode && c.latestMessage) {\n const msg = c.latestMessage(true);\n if (msg) {\n forwarded = msg.head ? msg.head.forwarded : null;\n deliveryStatus = msg._status || c.msgStatus(msg, true);\n previewIsResponse = msg.from != this.props.myUserId;\n if (msg.content) {\n preview = typeof msg.content == 'string' ?\n msg.content.substr(0, MESSAGE_PREVIEW_LENGTH) :\n Drafty.preview(msg.content, MESSAGE_PREVIEW_LENGTH);\n }\n }\n }\n\n contactNodes.push(\n \n );\n contactsCount ++;\n }\n }, this);\n }\n\n return (\n
    \n {contactsCount == 0 ?\n
    \n :\n null\n }\n {contactNodes.length > 0 ?\n
      \n {contactNodes}\n
    \n :\n null\n }\n
    \n );\n }\n};\n\nexport default injectIntl(ContactList);\n","import React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nexport default class SearchContacts extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n edited: false,\n search: ''\n };\n\n this.handleSearchChange = this.handleSearchChange.bind(this);\n this.handleSearch = this.handleSearch.bind(this);\n this.handleClear = this.handleClear.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentWillUnmount() {\n if (this.state.edited) {\n this.setState({search: '', edited: false});\n this.props.onSearchContacts(Tinode.DEL_CHAR);\n }\n }\n\n handleSearchChange(e) {\n this.setState({search: e.target.value});\n }\n\n handleSearch(e) {\n e.preventDefault();\n var query = this.state.search.trim();\n this.setState({edited: (query.length > 0)});\n this.props.onSearchContacts(query.length > 0 ? query : Tinode.DEL_CHAR);\n }\n\n handleClear(e) {\n e.preventDefault();\n if (this.state.edited) {\n this.props.onSearchContacts(Tinode.DEL_CHAR);\n }\n this.setState({search: '', edited: false});\n }\n\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleSearch(e);\n } else if (e.key === 'Escape') {\n this.handleClear();\n }\n }\n\n render() {\n return (\n
    \n
    \n search\n \n {this.state.search ?\n highlight_off\n :\n  }\n
    \n
    \n );\n }\n};\n","// Forward Menu: message forwarding popup/dropdown menu.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from './contact-list.jsx';\nimport SearchContacts from './search-contacts.jsx';\n\nexport default class ForwardDialog extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n query: null\n };\n\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClose = this.handleClose.bind(this);\n\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleContactSelected = this.handleContactSelected.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n // Not forwarding the message.\n this.props.hide(false);\n }\n }\n\n handleClose(e) {\n e.preventDefault();\n this.props.hide(false);\n }\n\n handleSearchContacts(query) {\n this.setState({ query: Tinode.isNullValue(query) ? null : query });\n this.props.onSearchContacts(query);\n }\n\n handleContactSelected(uid) {\n this.props.onTopicSelected(uid);\n this.props.hide(true);\n }\n\n render() {\n let contacts = this.state.query != null ? this.props.searchResults : this.props.contacts;\n // Filter out contacts without a 'W' or 'J' permissions as well as the current topic.\n contacts = contacts.filter((c) => {\n return (c.name != this.props.topicSelected) && c.acs.isJoiner() && c.acs.isWriter();\n });\n\n return (\n
    \n
    \n
    \n
    \n \n
    \n {\n (search_placeholder) => \n }\n {\n (not_found_placeholder) => \n }\n
    \n
    \n );\n }\n}\n","import React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst icon_mapping = {'staff': 'verified_user'};\n\nconst messages = defineMessages({\n badge_verified: {\n id: 'badge_verified',\n defaultMessage: 'Verified/official',\n description: 'Explanation of a verified account or topic badge'\n },\n badge_staff: {\n id: 'badge_staff',\n defaultMessage: 'Staff-managed',\n description: 'Explanation of a staff-managed account or topic badge'\n },\n badge_danger: {\n id: 'badge_danger',\n defaultMessage: 'Untrustworthy',\n description: 'Suspicious or untrustworthy account or topic badge'\n },\n});\n\n\n/* Trusted badges with labels: verified, staff, danger */\nclass BadgeList extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let badges = null;\n if (this.props.trustedBadges && this.props.trustedBadges.length > 0) {\n badges = [];\n this.props.trustedBadges.map((b) => {\n const comment = this.props.short ? null : formatMessage(messages['badge_' + b]);\n const style = 'material-icons ' + b + '-color';\n badges.push(
    {icon_mapping[b] || b} {comment}
    );\n });\n return <>{badges};\n }\n return null;\n }\n};\n\nexport default injectIntl(BadgeList);\n","// IncomingCall: displays Accept & Reject buttons for incoming calls.\nimport React from 'react';\n\nimport BadgeList from './badge-list.jsx';\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_TITLE_LENGTH, MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_INCOMING_RECEIVED } from '../constants.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { clipStr } from '../lib/utils.js'\n\nconst RING_SOUND = new Audio('audio/call-in.m4a');\n\nexport default class CallIncoming extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n topic: null,\n fullName: undefined,\n avatar: null,\n trustedBadges: [],\n previousMetaDesc: undefined,\n };\n\n this.resetDesc = this.resetDesc.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.handleRejectCall = this.handleRejectCall.bind(this);\n this.handleAcceptCall = this.handleAcceptCall.bind(this);\n this.ringTimer = null;\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n\n this.resetDesc(topic, this.props);\n if (this.props.callState == CALL_STATE_INCOMING_RECEIVED) {\n RING_SOUND.play();\n this.ringTimer = setInterval(() => RING_SOUND.play(), 2000);\n this.props.onRinging(this.props.topic, this.props.seq);\n }\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n this.resetDesc(topic, props);\n }\n }\n\n componentWillUnmount() {\n if (this.ringTimer != null) {\n clearInterval(this.ringTimer);\n RING_SOUND.pause();\n }\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.setState({topic: null});\n topic.onMetaDesc = this.previousMetaDesc;\n }\n\n resetDesc(topic, props) {\n const defacs = topic.getDefaultAccess() || {};\n const acs = topic.getAccessMode();\n const badges = [];\n if (topic.trusted) {\n for (const [key, val] of Object.entries(topic.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n }\n\n this.setState({\n fullName: clipStr(topic.public ? topic.public.fn : undefined, MAX_TITLE_LENGTH),\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n trustedBadges: badges,\n });\n }\n\n onMetaDesc(desc) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetDesc(topic, this.props);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n\n handleAcceptCall() {\n this.props.onAcceptCall(this.props.topic);\n }\n\n handleRejectCall() {\n this.props.onReject(this.props.topic, this.props.seq);\n this.props.onClose();\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    {clipStr(this.state.fullName, MAX_PEER_TITLE_LENGTH)}\n
    \n
    \n
    \n {this.props.callState == CALL_STATE_INCOMING_RECEIVED ?\n <>\n \n \n \n :\n null\n }\n
    \n
    \n
    \n );\n }\n};\n","// Video call states.\nexport const CALL_STATE_NONE = 0;\nexport const CALL_STATE_OUTGOING_INITATED = 1;\nexport const CALL_STATE_INCOMING_RECEIVED = 2;\nexport const CALL_STATE_IN_PROGRESS = 3;\n\n// Video call drafty headers representing call state.\nexport const CALL_HEAD_STARTED = 'started';\n","import React from 'react';\n\nexport default class LoadSpinner extends React.PureComponent {\n render() {\n const className = 'load-spinner-box' + (this.props.large ? ' large' : '')\n + (this.props.clear ? ' clear' : '') + (this.props.centered ? ' centered' : '');\n return (this.props.show ?\n
    : null);\n }\n}\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\nimport LoadSpinner from './load-spinner.jsx';\n\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nimport { AVATAR_SIZE } from '../config.js';\n\nexport default class AvatarUpload extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n source: props.avatar\n };\n\n this.handleFileReceived = this.handleFileReceived.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.avatar != prevProps.avatar) {\n this.setState({source: this.props.avatar});\n }\n }\n\n handleFileReceived(e) {\n const image = e.target.files[0];\n this.props.onImageUpdated(image.type, URL.createObjectURL(image), image.name);\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n render() {\n // Randomize id value in case more than one AvatarUpload is shown\n // at the same time.\n const randId = 'file-input-avatar-' + ('' + Math.random()).substring(0, 4);\n const className = 'avatar-upload' + (this.props.readOnly ? ' read-only' : '');\n return (\n
    \n {this.props.readOnly || !this.state.source ?\n null :\n {e.preventDefault(); this.props.onImageUpdated();}}>\n clear\n }\n {this.state.source ?\n :\n this.props.readOnly && this.props.uid ?\n
    \n \n
    \n :\n
    {AVATAR_SIZE}×{AVATAR_SIZE}
    }\n {this.props.readOnly ? null :\n }\n {this.props.readOnly ? null :\n }\n \n
    \n );\n }\n};\n","import React from 'react';\n\n/* BEGIN CheckBox: styled checkbox */\nexport default class CheckBox extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleChange = this.handleChange.bind(this);\n }\n\n handleChange() {\n this.props.onChange(this.props.name, !this.props.checked);\n }\n\n render() {\n return (\n this.props.onChange ? (\n this.props.checked === true ?\n check_box :\n this.props.checked === false ?\n check_box_outline_blank :\n indeterminate_check_box\n ) : (\n this.props.checked ?\n check_box :\n check_box_outline_blank\n )\n );\n }\n}\n/* END CheckBox */\n","// The X menu to be displayed in title bars.\nimport React from 'react';\n\nexport default class MenuCancel extends React.PureComponent {\n render() {\n return (\n {e.preventDefault(); this.props.onCancel();}}>\n close\n \n );\n }\n}\n","import React from 'react';\n\nimport MenuCancel from './menu-cancel.jsx';\n\nexport default class ErrorPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n show: false,\n };\n\n this.hide = this.hide.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.level !== this.props.level) {\n this.setState({\n show: !(!this.props.level)\n });\n }\n }\n\n hide() {\n this.setState({show: false});\n if (this.props.onClearError) {\n this.props.onClearError();\n }\n }\n\n render() {\n const icons = {err: 'error', warn: 'warning', info: 'info'}\n const level = icons[this.props.level] || '';\n const className = 'info-box ' + level;\n return (\n
    \n
    {level}
    \n \n {this.props.text}\n {this.props.action ?\n <>\n {e.preventDefault(); this.props.action();}}>\n {this.props.actionText}\n \n \n : null}\n \n
    \n
    \n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\n\nexport default class Chip extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel(this.props.topic, this.props.index);\n }\n\n render() {\n const title = this.props.title || this.props.topic;\n const className = this.props.invalid ? 'chip invalid' : 'chip';\n return (\n
    \n {this.props.noAvatar ?\n :\n
    \n \n
    \n }\n {title}\n {this.props.onCancel && !this.props.required ?\n ×\n : }\n
    \n );\n }\n};\n","import React from 'react';\n\nimport Chip from './chip.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n/* BEGIN ChipInput: group membership widget */\nexport default class ChipInput extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = ChipInput.deriveStateFromProps(props);\n this.state.input = '';\n this.state.focused = false;\n\n this.handleTextInput = this.handleTextInput.bind(this);\n this.removeChipAt = this.removeChipAt.bind(this);\n this.handleChipCancel = this.handleChipCancel.bind(this);\n this.handleFocusGained = this.handleFocusGained.bind(this);\n this.handleFocusLost = this.handleFocusLost.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n static deriveStateFromProps(props) {\n return {\n placeholder: props.chips ? '' : props.prompt,\n sortedChips: ChipInput.sortChips(props.chips, props.staticMembers),\n chipIndex: ChipInput.indexChips(props.chips)\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chips != this.props.chips ||\n prevProps.staticMembers != this.props.staticMembers ||\n prevProps.prompt != this.props.prompt) {\n this.setState(ChipInput.deriveStateFromProps(this.props));\n }\n if (!prevState || this.props.chips.length > prevState.sortedChips.length) {\n this.setState({input: ''});\n }\n }\n\n // Map chip index to user name\n static indexChips(chips) {\n const index = {};\n let count = 0;\n chips.map((item) => {\n index[item.user] = count;\n count ++;\n });\n return index;\n }\n\n // Have non-removable chips appear before all other chips.\n static sortChips(chips, keep) {\n const required = [];\n const normal = [];\n chips.map((item) => {\n if (keep && keep.includes(item.user)) {\n required.push(item);\n } else {\n normal.push(item);\n }\n });\n return required.concat(normal);\n }\n\n handleTextInput(e) {\n this.setState({input: e.target.value});\n if (this.props.filterFunc) {\n this.props.filterFunc(e.target.value);\n }\n }\n\n removeChipAt(idx) {\n const removed = this.state.sortedChips[idx];\n this.props.onChipRemoved(removed.user, this.state.chipIndex[removed.user]);\n }\n\n handleChipCancel(item, idx) {\n this.removeChipAt(idx);\n }\n\n handleFocusGained() {\n this.setState({focused: true});\n }\n\n handleFocusLost() {\n this.setState({focused: false});\n if (this.props.onFocusLost) {\n this.props.onFocusLost(this.state.input);\n }\n }\n\n handleKeyDown(e) {\n if (e.key === 'Backspace') {\n if (this.state.input.length == 0 && this.state.sortedChips.length > 0) {\n const at = this.state.sortedChips.length - 1;\n if (this.state.sortedChips[at].user !== this.props.staticMembers) {\n this.removeChipAt(at);\n }\n }\n } else if (e.key === 'Enter') {\n if (this.props.onEnter) {\n this.props.onEnter(this.state.input);\n }\n } else if (e.key === 'Escape') {\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n }\n\n render() {\n const chips = [];\n let count = 0;\n const staticMembers = this.props.staticMembers || [];\n this.state.sortedChips.map((item) => {\n chips.push(\n \n );\n count++;\n });\n const className = \"chip-input\" + (this.state.focused ? ' focused' : '');\n const autoFocus = !(this.props.tabIndex > 0);\n return (\n
    \n {chips}\n \n
    \n );\n }\n};\n","// GroupMembers: control for managing a list of group members.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\nimport ContactList from './contact-list.jsx';\n\nconst messages = defineMessages({\n no_contacts: {\n id: 'no_contacts',\n defaultMessage: 'You have no contacts :-(',\n description: 'Shown in ContactsView when the user has no contacts'\n },\n contacts_not_found_short: {\n id: 'contacts_not_found_short',\n defaultMessage: \"No contacts match ''{query}''\",\n description: 'Shown in ContactsView when search returned no results'\n }\n});\n\nclass GroupManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n // Array of topic members\n members: props.members,\n index: GroupManager.indexMembers(props.members),\n staticMembers: GroupManager.staticMembers(props.members, props.keepInitialMembers, props.requiredMember),\n contactFilter: '',\n noContactsMessage: props.intl.formatMessage(messages.no_contacts),\n selectedContacts: GroupManager.selectedContacts(props.members)\n };\n\n this.handleContactSelected = this.handleContactSelected.bind(this);\n this.handleMemberRemoved = this.handleMemberRemoved.bind(this);\n this.handleContactFilter = this.handleContactFilter.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static indexMembers(members) {\n let index = {};\n members.map((m) => {\n index[m.user] = {delta: 0, present: true}; // Delta: 0 unchanged, +1 added, -1 removed\n });\n return index;\n }\n\n static staticMembers(members, keepInitial, requiredMember) {\n let stat = [];\n members.map((m) => {\n if (keepInitial || m.user == requiredMember) {\n stat.push(m.user);\n }\n });\n return stat;\n }\n\n static selectedContacts(members) {\n let sel = [];\n members.map((m) => {\n sel.push(m.user);\n });\n return sel;\n }\n\n handleContactSelected(userId, index) {\n let status = this.state.index[userId];\n if (status) {\n if (status.present) {\n // Prevent duplicate members\n return;\n }\n status.delta += 1;\n status.present = true;\n } else {\n status = {delta: 1, present: true};\n }\n\n let m = this.state.members.slice();\n m.push(this.props.contacts[index]);\n\n const sel = GroupManager.selectedContacts(m);\n\n const i = this.state.index;\n i[userId] = status;\n\n this.setState({members: m, index: i, selectedContacts: sel});\n }\n\n handleMemberRemoved(userId, index) {\n const status = this.state.index[userId];\n if (!status || !status.present) {\n return;\n }\n status.present = false;\n status.delta -= 1;\n\n let m = this.state.members.slice();\n m.splice(index, 1);\n\n const sel = GroupManager.selectedContacts(m);\n\n const i = this.state.index;\n i[userId] = status;\n\n this.setState({members: m, index: i, selectedContacts: sel});\n }\n\n handleContactFilter(val) {\n const {formatMessage} = this.props.intl;\n const msg = !val ?\n formatMessage(messages.no_contacts) :\n formatMessage(messages.contacts_not_found_short, {query: val});\n\n this.setState({contactFilter: val, noContactsMessage: msg});\n }\n\n static doContactFiltering(filter, values) {\n if (filter) {\n for (let i=0; i= 0) {\n return true;\n }\n }\n return false;\n }\n return true;\n }\n\n handleSubmit() {\n var instance = this;\n var members = [];\n var added = [];\n var removed = [];\n\n var keys = Object.keys(this.state.index);\n keys.map(function(k) {\n if (instance.state.index[k].present) {\n members.push(k);\n }\n\n if (instance.state.index[k].delta > 0) {\n added.push(k);\n } else if (instance.state.index[k].delta < 0) {\n removed.push(k);\n }\n });\n this.props.onSubmit(members, added, removed);\n }\n\n handleCancel() {\n this.props.onCancel();\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n \n
    \n \n \n
    \n
    \n );\n }\n};\n\nexport default injectIntl(GroupManager);\n","// PermissionsEditor: Component for editing permissions\n// \nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport CheckBox from './checkbox.jsx';\nimport Contact from './contact.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n// Translatable permission names.\nconst messages = defineMessages({\n joiner: {\n id: 'permission_join',\n defaultMessage: \"Join ({val})\",\n description: 'Name of J permission'\n },\n reader: {\n id: 'permission_read',\n defaultMessage: \"Read ({val})\",\n description: 'Name of R permission'\n },\n writer: {\n id: 'permission_write',\n defaultMessage: \"Write ({val})\",\n description: 'Name of W permission'\n },\n preser: {\n id: 'permission_pres',\n defaultMessage: \"Get notified ({val})\",\n description: 'Name of P permission'\n },\n approver: {\n id: 'permission_admin',\n defaultMessage: \"Approve ({val})\",\n description: 'Name of A permission'\n },\n sharer: {\n id: 'permission_share',\n defaultMessage: \"Share ({val})\",\n description: 'Name of S permission'\n },\n deleter: {\n id: 'permission_delete',\n defaultMessage: \"Delete ({val})\",\n description: 'Name of D permission'\n },\n owner: {\n id: 'permission_owner',\n defaultMessage: \"Owner ({val})\",\n description: 'Name of O permission'\n }\n});\n\nclass PermissionsEditor extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n mode: (props.mode || '').replace('N', '')\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleChange(val) {\n let mode = this.state.mode;\n const idx = mode.indexOf(val);\n if (idx == -1) {\n mode += val;\n } else {\n mode = mode.replace(val, '');\n }\n this.setState({mode: mode});\n }\n\n handleSubmit() {\n // Normalize string, otherwise cannot check if mode has changed.\n const mode = (this.state.mode || 'N').split('').sort().join('');\n const before = (this.props.mode || 'N').split('').sort().join('')\n if (mode !== before) {\n this.props.onSubmit(mode);\n } else {\n this.props.onCancel();\n }\n }\n\n handleCancel() {\n this.props.onCancel();\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const all = 'JRWPASDO';\n const names = {\n 'J': formatMessage(messages.joiner, {val: 'J'}),\n 'R': formatMessage(messages.reader, {val: 'R'}),\n 'W': formatMessage(messages.writer, {val: 'W'}),\n 'P': formatMessage(messages.preser, {val: 'P'}),\n 'A': formatMessage(messages.approver, {val: 'A'}),\n 'S': formatMessage(messages.sharer, {val: 'S'}),\n 'D': formatMessage(messages.deleter, {val: 'D'}),\n 'O': formatMessage(messages.owner, {val: 'O'})\n };\n\n let skip = this.props.skip || '';\n let mode = this.state.mode;\n let compare = (this.props.compare || '').replace('N', '');\n let items = [];\n for (let i=0; i= 0 && mode.indexOf(c) < 0) {\n // Permission is marked as inactive: hide unchecked permissions, disable checked permissions\n continue;\n }\n items.push(\n \n {names[c]}\n {skip.indexOf(c) < 0 ?\n = 0)} onChange={this.handleChange}/>\n :\n = 0)} />\n }{this.props.compare ? \n = 0)}/>\n : null}\n \n );\n }\n\n return (\n
    \n {this.props.userTitle ?\n
    : null}\n \n \n {this.props.compare ?\n \n \n \n :\n null}\n \n {items}\n
    {this.props.modeTitle}{this.props.compareTitle}
    \n
    \n
    \n \n \n
    \n
    \n );\n }\n};\n\nexport default injectIntl(PermissionsEditor);\n","// Image zoom and crop widget.\n\nimport React from 'react';\n\nconst DEFAULT_MAX_ZOOM = 2.5;\n\nexport default class Cropper extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n // Coordinates of the top left corner of the image in container coordinates.\n panX: 0,\n panY: 0,\n // Origin of the zoom in image coordinates.\n originX: 0,\n originY: 0,\n // Zoom scale.\n zoom: 1,\n // Zoom min and max.\n minZoom: 0,\n maxZoom: DEFAULT_MAX_ZOOM,\n };\n\n // References to DOM elements for hooking up events and getting screen dimensions.\n // The transparent element which captures mouse moves (moves with the image).\n this.overlay = React.createRef();\n // The image cutout window or view port (static).\n this.cutout = React.createRef();\n // Scaled and translated image preview.\n this.preview = React.createRef();\n // The main container (static).\n this.boundingBox = React.createRef();\n\n // The original image width and height before any scaling.\n this.imageWidth = 0;\n this.imageHeight = 0;\n\n // Mouse position when dragging.\n this.mouseX = 0\n this.mouseY = 0;\n // Length of the previous mouse move when dragging.\n this.prevDistance = 0;\n\n // Bounding rectangles of static elements.\n this.cutoutRect = {};\n this.bBoxRect = {};\n // Center of the bounding box.\n this.originX = 0;\n this.originY = 0;\n\n this.initScaling = this.initScaling.bind(this);\n this.onZoom = this.onZoom.bind(this);\n this.handleZoom = this.handleZoom.bind(this);\n this.mouseDown = this.mouseDown.bind(this);\n this.mouseUp = this.mouseUp.bind(this);\n this.mouseMove = this.mouseMove.bind(this);\n this.mouseTouch = this.mouseTouch.bind(this);\n this.positionAll = this.positionAll.bind(this);\n this.translate = this.translate.bind(this);\n }\n\n componentDidMount() {\n this.overlay.current.addEventListener('mousedown', this.mouseDown, { passive: true });\n this.overlay.current.addEventListener('touchstart', this.mouseDown, { passive: true });\n\n // The rectangle position is in viewport coordinates.\n this.bBoxRect = this.boundingBox.current.getBoundingClientRect();\n // Center of the bounding box in container coordinates.\n this.originX = this.bBoxRect.width / 2;\n this.originY = this.bBoxRect.height / 2;\n\n // The rectangle position is in viewport coordinates.\n this.cutoutRect = this.cutout.current.getBoundingClientRect();\n }\n\n componentWillUnmount() {\n this.overlay.current.removeEventListener('mousedown', this.mouseDown);\n this.overlay.current.removeEventListener('touchstart', this.mouseDown);\n }\n\n // Position all elements.\n positionAll(panX, panY, zoom) {\n // Zoom origin in image preview coordinates.\n this.setState({\n panX: panX,\n panY: panY,\n zoom: zoom,\n originX: this.originX - panX,\n originY: this.originY - panY,\n });\n\n // Pass cut out coordinates to caller.\n const left = (this.originX - panX) * zoom - this.originX;\n const top = (this.originY - panY) * zoom - this.originY;\n this.props.onChange(\n (left + this.cutoutRect.left - this.bBoxRect.left) / zoom,\n (top + this.cutoutRect.top - this.bBoxRect.top) / zoom,\n this.cutoutRect.width / zoom,\n this.cutoutRect.height / zoom,\n zoom);\n }\n\n // Check if new location is within the limits.\n static checkBound(currPan, img, cutout, delta) {\n let nextDiff = Math.min(0, cutout[0] - img[0] - delta, img[1] - cutout[1] + delta);\n if (nextDiff == 0) {\n // Cutout is completely within the image.\n currPan += delta;\n } else if (Math.min(0, cutout[0] - img[0], img[1] - cutout[1]) < nextDiff) {\n // Cutout is outside of the range but closer to the bound.\n currPan += delta;\n }\n return currPan;\n }\n\n initScaling() {\n // Initialize components.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n this.imageWidth = imgRect.width;\n this.imageHeight = imgRect.height;\n\n // Set zoom slider's min and max values. Make sure the scaled image cannot be smaller than the cutout.\n const minZoom = Math.max(this.cutoutRect.width / imgRect.width, this.cutoutRect.height / imgRect.height);\n this.setState({\n minZoom: minZoom,\n maxZoom: Math.max(DEFAULT_MAX_ZOOM, minZoom + 1)\n });\n\n // Initial zoom level fills the bounding box at the smallest image dimension and overflows the largest, i.e. \"fill\" not \"fit\".\n const zoom = Math.max(this.bBoxRect.width / imgRect.width, this.bBoxRect.height / imgRect.height);\n // Converting from viewport coordinates to container, then panning.\n const panX = this.cutoutRect.left - this.bBoxRect.left -\n (imgRect.width - this.cutoutRect.width) / 2;\n const panY = this.cutoutRect.top - this.bBoxRect.top -\n (imgRect.height - this.cutoutRect.height) / 2;\n\n this.positionAll(panX, panY, zoom);\n }\n\n onZoom(e) {\n this.handleZoom(e.target.value);\n }\n\n handleZoom(zoom) {\n let panX = this.state.panX;\n let panY = this.state.panY;\n\n // Ensure that the image at the new zoom is not outside of the cutout boundaries.\n // Calculate image coordinates at the new zoom.\n const imgLeft = this.originX - (this.originX - panX) * zoom;\n const imgRight = imgLeft + this.imageWidth * zoom;\n // Cutout in the same coordinates as the image.\n const coLeft = this.cutoutRect.left - this.bBoxRect.left;\n const coRight = coLeft + this.cutoutRect.width;\n if (coLeft < imgLeft) {\n panX -= imgLeft - coLeft;\n } else if (coRight > imgRight) {\n panX += coRight - imgRight;\n }\n const imgTop = this.originY - (this.originY - panY) * zoom;\n const imgBottom = imgTop + this.imageHeight * zoom;\n const coTop = this.cutoutRect.top - this.bBoxRect.top;\n const coBottom = coTop + this.cutoutRect.height;\n if (coTop < imgTop) {\n panY -= imgTop - coTop;\n } else if (coBottom > imgBottom) {\n panY += coBottom - imgBottom;\n }\n\n this.positionAll(panX, panY, zoom);\n }\n\n mouseDown(e) {\n if (e.touches) {\n this.mouseX = e.touches[0].pageX;\n this.mouseY = e.touches[0].pageY;\n } else {\n this.mouseX = e.pageX;\n this.mouseY = e.pageY;\n }\n\n window.addEventListener('mousemove', this.mouseMove, { passive: false });\n window.addEventListener('touchmove', this.mouseTouch, { passive: false });\n window.addEventListener('mouseup', this.mouseUp, { passive: true });\n window.addEventListener('touchend', this.mouseUp, { passive: true });\n // Disable text selection in the entire document.\n document.body.style['userSelect'] = 'none';\n }\n\n // Perform image panning.\n translate(pageX, pageY) {\n const dX = pageX - this.mouseX;\n const dY = pageY - this.mouseY;\n\n this.mouseX = pageX;\n this.mouseY = pageY;\n\n // Make sure the image is within the cutout window.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n // Check if the new position is within the boundaries, and if not if it's closer to them.\n let panX = Cropper.checkBound(this.state.panX, [imgRect.left, imgRect.right],\n [this.cutoutRect.left, this.cutoutRect.right], dX);\n let panY = Cropper.checkBound(this.state.panY, [imgRect.top, imgRect.bottom],\n [this.cutoutRect.top, this.cutoutRect.bottom], dY);\n\n this.positionAll(panX, panY, this.state.zoom);\n }\n\n // Image panning.\n mouseMove(e) {\n e.preventDefault();\n this.translate(e.pageX, e.pageY);\n }\n\n mouseTouch(e) {\n e.preventDefault();\n\n if (e.touches.length == 1) {\n this.translate(e.touches[0].pageX, e.touches[0].pageY);\n return;\n }\n\n // Image zooming by pinching.\n const [touch0, touch1] = e.touches;\n const distance = Math.sqrt((touch0.pageX - touch1.pageX) * (touch0.pageX - touch1.pageX) +\n (touch0.pageY - touch1.pageY) * (touch0.pageY - touch1.pageY));\n\n if (!this.prevDistance) {\n this.prevDistance = distance / this.state.zoom;\n }\n\n let scale = (distance / this.prevDistance);\n this.handleZoom(Math.max(this.minZoom, Math.min(this.maxZoom, scale)));\n }\n\n mouseUp(e) {\n window.removeEventListener('mousemove', this.mouseMove);\n window.removeEventListener('touchmove', this.mouseTouch);\n window.removeEventListener('mouseup', this.mouseUp);\n window.removeEventListener('touchend', this.mouseUp);\n // Re-enable text selection.\n document.body.style['userSelect'] = '';\n\n this.positionAll(this.state.panX, this.state.panY, this.state.zoom);\n }\n\n render() {\n // transform3d: position and scale.\n const t3d = `translate3d(${this.state.panX}px, ${this.state.panY}px, 0) scale(${this.state.zoom})`;\n // transformOrigin: zoom origin.\n const orig = `${this.state.originX}px ${this.state.originY}px`;\n\n // Overlay position and size are exactly equal to the position and size of the transformed image\n // except it uses different coordinates.\n const overlay = {\n top: `${this.originY - this.state.originY * this.state.zoom}px`,\n left: `${this.originX - this.state.originX * this.state.zoom}px`,\n width: `${this.imageWidth * this.state.zoom}px`,\n height: `${this.imageHeight * this.state.zoom}px`\n };\n return (\n
    \n
    \n \"\"\n\n
    \n
    \n
    \n
    \n \n
    \n
    \n );\n }\n}\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport Cropper from './cropper.jsx';\nimport { imageCrop } from '../lib/blob-helpers.js';\n\nexport default class AvatarCrop extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n scale: 1\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleChange = this.handleChange.bind(this);\n }\n\n // Cut out in image coordinates and desired scale factor.\n handleChange(left, top, width, height, scale) {\n this.setState({\n left: left,\n top: top,\n width: width,\n height: height,\n scale: scale\n });\n }\n\n handleSubmit() {\n imageCrop(this.props.mime, this.props.avatar,\n this.state.left, this.state.top, this.state.width, this.state.height,\n this.state.scale)\n .then(img => {\n this.props.onSubmit(img.mime, img.blob, img.width, img.height);\n })\n .catch(err => {\n this.props.onError(err);\n });\n }\n\n render() {\n return (\n
    \n
    \n \n
    \n
    \n {this.props.onCancel ?\n \n : null}\n \n
    \n
    \n );\n }\n};\n","// Password with a visiblity toggle.\nimport React from 'react';\n\nexport default class VisiblePassword extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n value: this.props.value,\n visible: false\n };\n\n this.handleVisibility = this.handleVisibility.bind(this);\n this.handeTextChange = this.handeTextChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n }\n\n handeTextChange(e) {\n this.setState({value: e.target.value});\n if (this.props.onChange) {\n this.props.onChange(e);\n }\n }\n\n handleVisibility(e) {\n e.preventDefault();\n this.setState({visible: !this.state.visible});\n }\n\n handleKeyDown(e) {\n if (e.keyCode == 27) {\n // Escape pressed\n this.setState({value: this.props.value, visible: false});\n if (this.props.onFinished) {\n this.props.onFinished();\n }\n } else if (e.keyCode == 13) {\n // Enter pressed\n this.handleEditingFinished();\n }\n }\n\n handleEditingFinished(e) {\n if (e) {\n let currentTarget = e.currentTarget;\n setTimeout(() => {\n if (!currentTarget.contains(document.activeElement)) {\n if (this.props.onFinished) {\n this.props.onFinished(this.state.value);\n }\n }\n }, 0);\n } else if (this.props.onFinished) {\n this.props.onFinished(this.state.value.trim());\n }\n }\n\n render() {\n return (\n
    \n \n \n \n {this.state.visible ? 'visibility' : 'visibility_off'}\n \n \n
    \n );\n }\n}\n","// In-place text editor. Shows text with an icon which toggles it into an input field.\nimport React from 'react';\n\nimport VisiblePassword from './visible-password.jsx';\n\nexport default class InPlaceEdit extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n this.state = {\n active: props.active,\n initialValue: props.value || '',\n value: props.value || ''\n };\n\n this.handeTextChange = this.handeTextChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleStartEditing = this.handleStartEditing.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n this.handlePasswordFinished = this.handlePasswordFinished.bind(this);\n }\n\n componentDidUpdate(prevProps, prevState) {\n // If text has changed while in read mode, update text and discard changes.\n // Ignore update if in edit mode.\n const newValue = this.props.value || '';\n if (prevState.initialValue != newValue && !prevState.active) {\n this.setState({\n initialValue: newValue,\n value: newValue\n });\n }\n }\n\n handeTextChange(e) {\n this.setState({value: e.target.value || ''});\n }\n\n handleKeyDown(e) {\n if (e.keyCode === 27) {\n // Escape pressed\n this.setState({value: this.props.value, active: false});\n } else if (e.keyCode === 13) {\n // Enter pressed\n this.handleEditingFinished(e);\n }\n }\n\n handleStartEditing() {\n if (!this.props.readOnly) {\n this.setState({active: true}, () => {\n if (this.selfRef.current) {\n this.selfRef.current.focus();\n }\n });\n }\n }\n\n handleEditingFinished(event) {\n const value = this.state.value.trim();\n if (this.props.required && (!event.target.checkValidity() || !value)) {\n // Empty input\n this.setState({value: this.props.value, active: false});\n return;\n }\n this.setState({active: false});\n if ((value || this.props.value) && (value !== this.props.value)) {\n this.props.onFinished(value);\n }\n }\n\n handlePasswordFinished(value) {\n this.setState({active: false});\n if (value && (value !== this.props.value)) {\n this.props.onFinished(value);\n }\n }\n\n render() {\n if (!this.state.active) {\n let spanText = this.props.type == 'password' ? '••••••••' : this.state.value;\n let spanClass = 'in-place-edit' + (this.props.readOnly ? ' disabled' : '');\n if (!spanText) {\n spanText = this.props.placeholder;\n spanClass += ' placeholder';\n }\n if (!this.props.multiline || this.props.multiline == 1) {\n spanClass += ' short';\n }\n\n return (\n {spanText}\n );\n }\n\n let element;\n const attr = {};\n if (this.props.type == 'password') {\n element = VisiblePassword;\n attr.onFinished = this.handlePasswordFinished;\n } else {\n if (this.props.multiline > 1) {\n element = 'textarea';\n attr.rows = this.props.multiline;\n attr.className = 'inplace-edit';\n } else {\n element = 'input';\n attr.type = this.props.type || 'text';\n }\n attr.value = this.state.value;\n attr.onChange = this.handeTextChange;\n attr.onKeyDown = this.handleKeyDown;\n attr.onBlur = this.handleEditingFinished;\n }\n attr.placeholder = this.props.placeholder;\n attr.required = this.props.required ? 'required' : '';\n attr.autoComplete = this.props.autoComplete;\n attr.autoFocus = true;\n attr.ref = this.selfRef;\n\n return React.createElement(element, attr, null);\n }\n};\n","// TagManager: edit topic or user tags.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\n\nimport { MAX_TAG_COUNT, MAX_TAG_LENGTH, MIN_TAG_LENGTH } from '../config.js';\nimport { arrayEqual } from '../lib/utils.js';\n\nexport default class TagManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tags: this.props.tags || [],\n tagInput: '',\n activated: this.props.activated\n };\n\n this.handleTagInput = this.handleTagInput.bind(this);\n this.handleAddTag = this.handleAddTag.bind(this);\n this.handleRemoveTag = this.handleRemoveTag.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n const tags = nextProps.tags || [];\n if (!arrayEqual(tags, prevState.tags) && !prevState.activated) {\n return {tags: tags};\n }\n return null;\n }\n\n handleTagInput(text) {\n this.setState({tagInput: text});\n if (text.length > 0) {\n const last = text[text.length-1];\n if (text[0] == '\"') {\n // This is a quoted string.\n if (text.length > 1 && last == '\"') {\n this.handleAddTag(text.substring(1, text.length-1));\n }\n } else if (last == ',' || last == ' ' || last == ';' || last == '\"') {\n // User entered ',', ' ' or ';'\n this.handleAddTag(text.substring(0, text.length-1).trim());\n }\n }\n }\n\n handleAddTag(tag) {\n const maxTagCount = this.props.tinode.getServerParam('maxTagCount', MAX_TAG_COUNT);\n\n if (tag.length > 0 && this.state.tags.length < maxTagCount) {\n const tags = this.state.tags.slice(0);\n tags.push(tag);\n\n this.setState({tags: tags, tagInput: ''});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n return tags;\n }\n return this.state.tags;\n }\n\n handleRemoveTag(tag, index) {\n const tags = this.state.tags.slice(0);\n tags.splice(index, 1);\n this.setState({tags: tags});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n }\n\n handleSubmit() {\n // Add unprocessed input to tags, submit the list.\n this.props.onSubmit(this.handleAddTag(this.state.tagInput.trim()));\n this.setState({activated: false, tags: this.props.tags || []});\n }\n\n handleCancel() {\n this.setState({activated: false, tagInput: '', tags: this.props.tags || []});\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n\n render() {\n const minTagLength = this.props.tinode.getServerParam('minTagLength', MIN_TAG_LENGTH);\n const maxTagLength = this.props.tinode.getServerParam('maxTagLength', MAX_TAG_LENGTH);\n\n let tags = [];\n if (this.state.activated) {\n this.state.tags.map((tag) => {\n tags.push({user: tag, invalid: (tag.length < minTagLength || tag.length > maxTagLength)});\n });\n } else {\n this.state.tags.map((tag) => {\n tags.push({tag});\n });\n if (tags.length == 0) {\n tags = (\n \n \n \n );\n }\n }\n return (\n
    \n
    \n \n
    \n {this.state.activated ?\n
    \n {\n (add_tags_prompt) => \n }\n {this.props.onSubmit || this.props.onCancel ?\n
    \n \n \n
    \n : null}\n
    \n :\n \n }\n
    \n );\n }\n};\n","// Widget for editing topic description.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport AvatarCrop from './avatar-crop.jsx';\nimport AvatarUpload from './avatar-upload.jsx';\nimport InPlaceEdit from './in-place-edit.jsx';\nimport TagManager from './tag-manager.jsx';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE, MAX_TITLE_LENGTH,\n MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\nimport { arrayEqual, theCard } from '../lib/utils.js';\n\nexport default class TopicDescEdit extends React.Component {\n constructor(props) {\n super(props);\n\n const topic = this.props.tinode.getTopic(this.props.topic);\n const acs = topic.getAccessMode();\n this.state = {\n isMe: Tinode.isMeTopicName(this.props.topic),\n owner: acs && acs.isOwner(),\n fullName: topic.public ? topic.public.fn : undefined,\n private: topic.private ? topic.private.comment : null,\n description: topic.public ? topic.public.note : undefined,\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n tags: topic.tags() || [],\n newAvatar: null,\n newAvatarMime: null\n };\n\n this.previousOnTags = null;\n\n this.tnNewTags = this.tnNewTags.bind(this);\n this.handleFullNameUpdate = this.handleFullNameUpdate.bind(this);\n this.handleImageUpdated = this.handleImageUpdated.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handlePrivateUpdate = this.handlePrivateUpdate.bind(this);\n this.handleDescriptionUpdate = this.handleDescriptionUpdate.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n this.previousOnTags = topic.onTagsUpdated;\n topic.onTagsUpdated = this.tnNewTags;\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onTagsUpdated = this.previousOnTags;\n }\n\n tnNewTags(tags) {\n this.setState({tags: tags});\n }\n\n handleFullNameUpdate(fn) {\n fn = fn.trim().substring(0, MAX_TITLE_LENGTH);\n if (fn && this.state.fullName !== fn) {\n this.setState({fullName: fn});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(fn, null));\n }\n }\n\n handlePrivateUpdate(comment) {\n comment = comment.trim().substring(0, MAX_TITLE_LENGTH);\n if (this.state.private !== comment) {\n this.setState({private: comment});\n this.props.onUpdateTopicDesc(this.props.topic, null, comment || Tinode.DEL_CHAR);\n }\n }\n\n handleDescriptionUpdate(desc) {\n desc = desc.trim().substring(0, MAX_TOPIC_DESCRIPTION_LENGTH);\n if (desc) {\n this.setState({description: desc});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, null, null, desc));\n }\n }\n\n // AvatarUpload widget has changed the avatar: received a new file or deleted the avatar.\n handleImageUpdated(mime, img) {\n // This will show the AvatarCropView is img is not null.\n this.setState({newAvatar: img, newAvatarMime: mime});\n if (!img) {\n // Deleting the avatar.\n this.setState({avatar: null});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, Tinode.DEL_CHAR));\n }\n }\n\n // AvatarCropView calls this method when the user has cropped the image.\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({avatar: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = (image) => {\n let {mime, blob} = image;\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n\n this.setState({uploading: true});\n uploader.upload(blob)\n .then((url) => {\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, url));\n })\n .catch((err) => {\n this.props.onError(err, 'err');\n })\n .finally(() => {\n this.setState({uploading: false});\n });\n } else {\n this.setState({uploading: true});\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => {\n const du = makeImageUrl({data: b64.bits, type: mime});\n this.setState({source: du});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, du));\n this.setState({uploading: false});\n });\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n handleAvatarCropCancel(img) {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n handleTagsUpdated(tags) {\n // Check if tags have actually changed.\n if (arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n return;\n }\n this.props.onUpdateTags(tags);\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n const editable = this.state.isMe || this.state.owner;\n\n return (\n <>\n
    \n
    \n \n
    \n {this.state.isMe ?\n
    \n \n
    \n {\n (full_name_placeholder) => \n }\n
    \n
    \n :\n <>\n
    \n
    \n
    \n {\n (group_name_placeholder) => \n }\n
    \n
    \n
    \n
    \n \n
    \n
    \n {\n (private_placeholder) => \n }\n
    \n
    \n \n }\n {editable || this.state.description ?\n
    \n
    \n
    \n {\n (private_placeholder) => \n }\n
    \n
    \n : null\n }\n
    \n {editable ?\n <>\n
    \n {\n (title_tag_manager) => \n }\n \n : null\n }\n \n );\n }\n};\n","// View for editing topic (including 'me' topic) parameters.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport TopicDescEdit from '../widgets/topic-desc-edit.jsx';\n\nimport { arrayEqual, asEmail, asPhone } from '../lib/utils.js';\n\nexport default class TopicCommon extends React.Component {\n constructor(props) {\n super(props);\n\n const topic = this.props.tinode.getTopic(this.props.topic);\n const acs = topic.getAccessMode();\n this.state = {\n isMe: this.props.topic == 'me',\n owner: acs && acs.isOwner(),\n credentials: (topic.getCredentials ? topic.getCredentials() : null) || [],\n addCredActive: false,\n addCredInvalid: false,\n newCred: '',\n tags: []\n };\n\n this.previousTagsUpdated = undefined;\n\n this.onTagsUpdated = this.onTagsUpdated.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n this.tnCredsUpdated = this.tnCredsUpdated.bind(this);\n this.handleCredChange = this.handleCredChange.bind(this);\n this.handleCredKeyDown = this.handleCredKeyDown.bind(this);\n this.handleCredEntered = this.handleCredEntered.bind(this);\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n topic.onCredsUpdated = this.tnCredsUpdated;\n\n if (topic.onTagsUpdated != this.onTagsUpdated) {\n if (topic.getType() == 'grp') {\n this.previousTagsUpdated = topic.onTagsUpdated;\n topic.onTagsUpdated = this.onTagsUpdated;\n } else {\n this.previousTagsUpdated = undefined;\n }\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onCredsUpdated = undefined;\n topic.onTagsUpdated = this.previousTagsUpdated;\n }\n\n tnCredsUpdated(creds) {\n this.setState({credentials: creds || []});\n }\n\n handleCredChange(e) {\n this.setState({newCred: e.target.value, addCredInvalid: false});\n }\n\n handleCredKeyDown(e) {\n if (e.keyCode === 27) {\n // Escape pressed\n this.setState({newCred: '', addCredActive: false});\n } else if (e.keyCode === 13) {\n // Enter pressed\n this.handleCredEntered(e);\n }\n }\n\n handleCredEntered(e) {\n const value = this.state.newCred.trim();\n if (!value) {\n this.setState({addCredActive: false, addCredInvalid: false});\n return;\n }\n\n let val = asPhone(value);\n let method;\n if (val) {\n method = 'tel';\n } else {\n val = asEmail(value);\n if (val) {\n method = 'email';\n }\n }\n if (method) {\n this.props.onCredAdd(method, val);\n this.setState({addCredActive: false, newCred: ''});\n } else {\n this.setState({addCredInvalid: true});\n }\n }\n\n // Server informs that the tags have been updated.\n onTagsUpdated(tags) {\n this.setState({tags: tags});\n\n if (this.previousTagsUpdated && this.previousTagsUpdated != this.onTagsUpdated) {\n this.previousTagsUpdated(tags);\n }\n }\n\n // Request server to change tags.\n handleTagsUpdated(tags) {\n if (!arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n this.props.onTopicTagsUpdateRequest(this.props.topic, tags);\n }\n }\n\n render() {\n const credentials = [];\n if (this.state.isMe) {\n this.state.credentials.map((cred) => {\n credentials.push(\n \n );\n });\n }\n\n return (\n
    \n \n {this.state.isMe ?\n <>\n
    \n
    \n \n
    \n {credentials}\n {this.state.addCredActive ?\n \n : null}\n \n
    \n
    \n \n : null\n }\n
    \n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport InPlaceEdit from './in-place-edit.jsx';\n\nimport { NO_ACCESS_MODE } from '../config.js';\n\nconst messages = defineMessages({\n clear_messages: {\n id: 'action_clear_messages',\n defaultMessage: 'Clear Messages',\n description: 'Flat button [Clear Messages] (soft-delete messages)'\n },\n clear_messages_warning: {\n id: 'clear_messages_warning',\n defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',\n description: 'Alert dialog warning when deleting all messages.'\n },\n delete_messages: {\n id: 'action_delete_messages',\n defaultMessage: 'Clear Messages for All',\n description: 'Flat button [Clear for All] (hard-delete all messages)'\n },\n delete_messages_warning: {\n id: 'delete_messages_warning',\n defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',\n description: 'Alert dialog warning when hard-deleting all messages.'\n },\n topic_delete: {\n id: 'topic_delete',\n defaultMessage: 'Delete Conversation',\n description: 'Alert title when deleting the topic.'\n },\n topic_delete_warning: {\n id: 'topic_delete_warning',\n defaultMessage: 'Are you sure you want to delete this conversation? It cannot be undone.',\n description: 'Alert warning when deleting entire topic'\n },\n leave_chat: {\n id: 'action_leave_chat',\n defaultMessage: 'Leave Conversation',\n description: 'Flat button [Leave Conversation]'\n },\n leave_chat_warning: {\n id: 'leave_chat_warning',\n defaultMessage: 'Are you sure you want to leave this conversation?',\n description: 'Alert dialog warning when unsubscribing from a chat.'\n },\n block_contact: {\n id: 'action_block_contact',\n defaultMessage: \"Block Contact\",\n description: \"Flat button [Block Contact]\"\n },\n block_contact_warning: {\n id: 'block_contact_warning',\n defaultMessage: 'Are you sure you want to block this contact?',\n description: 'Alert dialog warning when blocking a contact.'\n },\n report_chat: {\n id: 'action_report_chat',\n defaultMessage: 'Report Conversation',\n description: 'Flat button [Report Group]'\n },\n report_chat_warning: {\n id: 'report_chat_warning',\n defaultMessage: 'Are you sure you want to block and report this conversation?',\n description: 'Alert dialog warning when reporting a conversation for abuse'\n },\n other_user: {\n id: 'label_other_user',\n defaultMessage: 'Other',\n description: 'Label for the other user when the user is unnamed'\n },\n});\n\nclass TopicSecurity extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleDeleteTopic = this.handleDeleteTopic.bind(this);\n this.handleDeleteMessages = this.handleDeleteMessages.bind(this);\n this.handleLeave = this.handleLeave.bind(this);\n this.handleBlock = this.handleBlock.bind(this);\n this.handleReport = this.handleReport.bind(this);\n }\n\n handleDeleteTopic(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.topic_delete), // title\n formatMessage(messages.topic_delete_warning), // content\n (() => { this.props.onDeleteTopic(this.props.topic); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleDeleteMessages(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(this.props.deleter ? messages.delete_messages : messages.clear_messages), // title\n formatMessage(this.props.deleter ? messages.delete_messages_warning : messages.clear_messages_warning), // content\n (() => { this.props.onDeleteMessages(this.props.topic); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleLeave(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.leave_chat), // title\n formatMessage(messages.leave_chat_warning), // content\n (() => { this.props.onLeaveTopic(this.props.topic); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleBlock(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.block_contact), // title\n formatMessage(messages.block_contact_warning), // content\n (() => { this.props.onBlockTopic(this.props.topic); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleReport(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.report_chat), // title\n formatMessage(messages.report_chat_warning), // content\n (_ => { this.props.onReportTopic(this.props.topic); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n
    \n \n
    \n
    \n {this.props.groupTopic ?\n <>\n
    \n {e.preventDefault(); this.props.onLaunchPermissionsEditor('want')}}>\n {this.props.access}\n \n
    \n {!this.props.channel ?\n
    \n
    \n \n
    \n
    \n
    Auth: {\n e.preventDefault();\n if (this.props.owner) {\n this.props.onLaunchPermissionsEditor('auth');\n }\n }}>{this.props.auth}\n
    \n
    Anon: {\n e.preventDefault();\n if (this.props.owner) {\n this.props.onLaunchPermissionsEditor('anon');\n }\n }}>{this.props.anon}\n
    \n
    \n
    \n :\n null\n }\n \n :\n
    \n
    \n \n
    \n
    \n
    \n {e.preventDefault(); this.props.onLaunchPermissionsEditor('want')}}>\n {this.props.access}\n \n
    \n
    {this.props.fullName ? this.props.fullName : formatMessage(messages.other_user)}:\n   {e.preventDefault(); this.props.onLaunchPermissionsEditor('given')}}>\n {this.props.modeGiven2}\n \n
    \n
    \n
    \n }\n
    \n
    \n );\n }\n};\n\nexport default injectIntl(TopicSecurity);\n","// InfoView: panel with topic/user info.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport BadgeList from '../widgets/badge-list.jsx';\nimport CheckBox from '../widgets/checkbox.jsx';\nimport ContactList from '../widgets/contact-list.jsx';\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupManager from '../widgets/group-manager.jsx';\nimport MenuCancel from '../widgets/menu-cancel.jsx';\nimport PermissionsEditor from '../widgets/permissions-editor.jsx';\nimport TopicCommon from '../widgets/topic-common.jsx';\nimport TopicSecurity from '../widgets/topic-security.jsx';\n\nimport { MAX_TITLE_LENGTH, MAX_TOPIC_DESCRIPTION_LENGTH, NO_ACCESS_MODE } from '../config.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { theCard, clipStr } from '../lib/utils.js';\n\nconst messages = defineMessages({\n info: {\n id: 'panel_title_info',\n description: 'Title for InfoView',\n defaultMessage: 'Info'\n },\n general: {\n id: 'panel_title_general',\n description: 'Title for TopicCommon.',\n defaultMessage: 'General'\n },\n security: {\n id: 'panel_title_security',\n description: 'Title for TopicSecirity and AccSecurity.',\n defaultMessage: 'Security'\n },\n members: {\n id: 'panel_title_members',\n description: 'Title for managing group members view.',\n defaultMessage: 'Members'\n },\n crop: {\n id: 'panel_title_crop',\n description: 'Title for AvatarCropView.',\n defaultMessage: 'Drag to Adjust'\n },\n perm_want: {\n id: 'requested_permissions',\n defaultMessage: 'Requested',\n description: 'Title for permissions'\n },\n perm_given: {\n id: 'granted_permissions',\n defaultMessage: 'Granted',\n description: 'Title for permissions'\n },\n perm_auth: {\n id: 'permissions_authenticated',\n defaultMessage: 'Authenticated',\n description: 'Title for editing default authenticated permissions'\n },\n perm_anon: {\n id: 'permissions_anonymous',\n defaultMessage: 'Anonymous',\n description: 'Title for editing default anonymous permissions'\n },\n perm_user: {\n id: 'permissions_user',\n defaultMessage: 'User\\'s Permissions',\n description: 'Title for editing user\\'s permissions'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n});\n\nclass InfoView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n topic: null,\n owner: false,\n admin: false,\n sharer: false,\n deleter: false,\n muted: false,\n address: null,\n groupTopic: undefined,\n channel: undefined,\n fullName: undefined,\n description: undefined,\n avatar: null,\n private: null,\n selectedContact: null,\n access: null,\n modeGiven: null,\n modeWant: null,\n modeGiven2: null, // P2P topic, the other user mode given\n modeWant2: null, // P2P topic, the other user mode want\n auth: null,\n anon: null,\n contactList: [],\n trustedBadges: [],\n previousMetaDesc: undefined,\n previousSubsUpdated: undefined,\n };\n\n this.resetSubs = this.resetSubs.bind(this);\n this.resetDesc = this.resetDesc.bind(this);\n this.resetTags = this.resetTags.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.onSubsUpdated = this.onSubsUpdated.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleMuted = this.handleMuted.bind(this);\n this.handleUnarchive = this.handleUnarchive.bind(this);\n this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);\n this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);\n this.handleShowAddMembers = this.handleShowAddMembers.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleMemberSelected = this.handleMemberSelected.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleBackNavigate = this.handleBackNavigate.bind(this);\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n\n this.previousSubsUpdated = topic.onSubsUpdated;\n topic.onSubsUpdated = this.onSubsUpdated;\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n this.resetDesc(topic, props);\n this.resetSubs(topic, props);\n this.resetTags(topic);\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.setState({topic: null});\n topic.onMetaDesc = this.previousMetaDesc;\n topic.onSubsUpdated = this.previousSubsUpdated;\n }\n\n resetSubs(topic, props) {\n const newState = {contactList: []};\n if (topic.getType() == 'p2p') {\n // Fetch the other party in the p2p conversation.\n // Topic may not be ready yet, so check if user is found.\n const user2 = topic.subscriber(props.topic);\n if (user2) {\n newState.modeGiven2 = user2.acs.getGiven();\n newState.modeWant2 = user2.acs.getWant();\n } else {\n newState.modeGiven2 = NO_ACCESS_MODE;\n newState.modeWant2 = NO_ACCESS_MODE;\n }\n } else {\n topic.subscribers((sub) => {\n newState.contactList.push(sub);\n }, this);\n }\n\n this.setState(newState);\n }\n\n resetDesc(topic, props) {\n const defacs = topic.getDefaultAccess() || {};\n const acs = topic.getAccessMode();\n\n const badges = [];\n if (topic.trusted) {\n for (const [key, val] of Object.entries(topic.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n }\n\n this.setState({\n owner: acs && acs.isOwner(),\n admin: acs && acs.isAdmin(),\n sharer: acs && acs.isSharer(),\n deleter: acs && acs.isDeleter(),\n muted: acs && acs.isMuted(),\n\n fullName: clipStr(topic.public && topic.public.fn, MAX_TITLE_LENGTH),\n description: clipStr(topic.public && topic.public.note, MAX_TOPIC_DESCRIPTION_LENGTH),\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n trustedBadges: badges,\n private: clipStr(topic.private && topic.private.comment, MAX_TITLE_LENGTH),\n archived: topic.isArchived(),\n address: topic.name,\n groupTopic: topic.isGroupType(),\n channel: topic.isChannelType() || topic.chan,\n access: acs ? acs.getMode() : undefined,\n modeGiven: acs ? acs.getGiven() : undefined,\n modeWant: acs ? acs.getWant() : undefined,\n auth: defacs.auth,\n anon: defacs.anon\n });\n }\n\n resetTags(topic) {\n if (topic.getType() != 'grp') {\n return;\n }\n\n const acs = topic.getAccessMode();\n if (acs && acs.isOwner()) {\n // Requesting tags: owner is editing the topic.\n topic.getMeta(topic.startMetaQuery().withTags().build());\n }\n }\n\n onMetaDesc(desc) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetDesc(topic, this.props);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n\n onSubsUpdated(subs) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetSubs(topic, this.props);\n\n if (this.previousSubsUpdated && this.previousSubsUpdated != this.onSubsUpdated) {\n this.previousSubsUpdated(subs);\n }\n }\n\n handleImageChanged(img) {\n this.setState({avatar: img});\n this.props.onTopicDescUpdate(this.props.topic, theCard(null, img || Tinode.DEL_CHAR), null);\n }\n\n handleMuted(ignored, checked) {\n this.setState({muted: checked});\n this.props.onChangePermissions(this.props.topic, checked ? '-P' : '+P');\n }\n\n handleUnarchive(ignored, ignored2) {\n this.props.onTopicUnArchive(this.props.topic);\n }\n\n handlePermissionsChanged(which, perm) {\n switch (which) {\n case 'auth':\n this.props.onTopicDescUpdateRequest(this.props.topic, null, null, {auth: perm});\n break;\n case 'anon':\n this.props.onTopicDescUpdateRequest(this.props.topic, null, null, {anon: perm});\n break;\n case 'mode':\n case 'want':\n this.props.onChangePermissions(this.props.topic, perm);\n break;\n case 'given':\n this.props.onChangePermissions(this.props.topic, perm, this.props.topic);\n break;\n case 'user':\n this.props.onChangePermissions(this.props.topic, perm, this.state.userPermissionsEdited);\n break;\n }\n\n this.handleBackNavigate();\n }\n\n handleLaunchPermissionsEditor(which, uid) {\n const {formatMessage} = this.props.intl;\n let toEdit, toCompare, toSkip, titleEdit, titleCompare, userTitle, userAvatar;\n switch (which) {\n case 'mode':\n toEdit = this.state.access;\n break;\n case 'want':\n toEdit = this.state.modeWant;\n toCompare = this.state.modeGiven;\n if (this.state.owner) {\n // Don't allow owner to unset 'O' permission. All other permissions are OK.\n toSkip = 'O';\n } else {\n // Allow accepting any of 'ASDO' permissions but don't allow asking for them.\n toSkip = Tinode.AccessMode.encode(Tinode.AccessMode.diff('ASDO', this.state.modeGiven));\n if (this.state.channel) {\n // Channels are read-only.\n toSkip += 'W';\n }\n }\n titleEdit = formatMessage(messages.perm_want);\n titleCompare = formatMessage(messages.perm_given);\n break;\n case 'given':\n toEdit = this.state.modeGiven2;\n toCompare = this.state.modeWant2;\n toSkip = this.state.groupTopic ? (this.state.owner ? '' : 'O') : 'ASDO';\n titleEdit = formatMessage(messages.perm_given);\n titleCompare = formatMessage(messages.perm_want);\n break;\n case 'auth':\n toEdit = this.state.auth;\n toSkip = 'O';\n break;\n case 'anon':\n toEdit = this.state.anon;\n toSkip = 'O';\n break;\n case 'user': {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n const user = topic.subscriber(uid);\n if (!user || !user.acs) {\n return;\n }\n toEdit = user.acs.getGiven();\n toCompare = user.acs.getWant();\n toSkip = this.state.owner ? '' : 'O';\n titleEdit = formatMessage(messages.perm_given);\n titleCompare = formatMessage(messages.perm_want);\n if (user.public) {\n userTitle = user.public.fn;\n userAvatar = user.public.photo;\n }\n break;\n }\n default:\n console.error(\"Unknown permission editing mode '\" + which + \"'\");\n return;\n }\n this.setState({\n userPermissionsEdited: uid,\n userPermissionsTitle: userTitle,\n userPermissionsAvatar: userAvatar,\n editedPermissions: toEdit,\n immutablePermissions: toCompare,\n editedPermissionsTitle: titleEdit,\n immutablePermissionsTitle: titleCompare,\n editedPermissionsSkipped: toSkip,\n });\n this.props.onNavigate(`perm/${which}`);\n }\n\n handleShowAddMembers(e) {\n e.preventDefault();\n this.props.onInitFind();\n this.props.onNavigate('members');\n }\n\n handleMemberUpdateRequest(members, added, removed) {\n this.props.onMemberUpdateRequest(this.props.topic, added, removed);\n this.props.onNavigate('info');\n }\n\n handleMemberSelected(uid) {\n this.setState({selectedContact: uid});\n }\n\n handleBackNavigate() {\n const args = (this.props.panel || 'info').split('/');\n if (args[0] == 'info') {\n this.props.onNavigate(null);\n } else if (args[0] == 'perm') {\n if (args[1] == 'user') {\n this.props.onNavigate('info');\n } else {\n this.props.onNavigate('security');\n }\n } else {\n this.props.onNavigate('info');\n }\n }\n\n handleContextMenu(params) {\n const {formatMessage} = this.props.intl;\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n const user = topic.subscriber(params.topicName);\n if (!user || !user.acs) {\n return;\n }\n\n const isMe = this.props.tinode.isMe(params.topicName);\n const menuItems = [\n {title: formatMessage(messages.edit_permissions), handler: () => {\n this.handleLaunchPermissionsEditor(isMe ? 'want' : 'user', params.topicName);\n }}\n ];\n if (!isMe) {\n menuItems.push('member_delete');\n }\n menuItems.push(user.acs.isMuted() ? 'member_unmute' : 'member_mute');\n if (!isMe) {\n menuItems.push(user.acs.isJoiner() ? 'member_block' : 'member_unblock');\n }\n this.props.showContextMenu({\n topicName: this.props.topic,\n x: params.x,\n y: params.y,\n user: params.topicName}, menuItems);\n }\n\n render() {\n const args = (this.props.panel || 'info').split('/');\n const view = args[0];\n args.shift();\n\n const {formatMessage} = this.props.intl;\n const panelTitle = formatMessage((view == 'perm' ? messages['perm_' + args[0]] : messages[view])\n || messages['info']);\n\n return (\n
    \n
    \n
    {panelTitle}
    \n
    \n \n
    \n
    \n {this.props.displayMobile ?\n : null}\n {view == 'members' ?\n \n :\n view == 'perm' && args.length > 0 ?\n this.handlePermissionsChanged(args[0], mode)}\n onCancel={this.handleBackNavigate} />\n :\n view == 'general' ?\n \n :\n view == 'security' ?\n \n :\n
    \n
    \n {e.preventDefault(); this.props.onNavigate('general');}}>\n edit \n \n \n
    \n \n
    \n
    \n
    \n
    {this.state.fullName}\n {this.state.channel ? \"channel\" : null}
    \n
    \n {this.state.private ?\n
    \n
    \n
    {this.state.private}
    \n
    \n : null\n }\n
    \n  \n {this.state.address}\n
    \n
    \n \n
    \n {this.state.description ?\n
    \n \n
    {this.state.description}
    \n
    : null}\n
    \n
    \n
    \n \n \n
    \n {this.state.archived ?\n
    \n \n \n
    \n :\n null\n }\n
    \n \n {this.state.groupTopic && this.state.sharer ?\n <>\n
    \n
    \n \n
    \n \n {\n (no_members) => \n }\n \n :\n null\n }\n
    \n }\n
    \n );\n }\n};\n\nexport default injectIntl(InfoView);\n","// CallPanel displays call in progress: local and remote viewports and controls.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\n\nimport { clipStr } from '../lib/utils.js'\n\nconst RING_SOUND = new Audio('audio/call-out.m4a');\nRING_SOUND.loop = true;\nconst CALL_ENDED_SOUND = new Audio('audio/call-end.m4a');\nCALL_ENDED_SOUND.loop = true;\n\nconst messages = defineMessages({\n already_in_call: {\n id: 'already_in_call',\n defaultMessage: 'You already in an ongoing call!',\n description: 'Error message when the user tried to accept a new call without finishing pervious one',\n }\n});\n\nclass CallPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n localStream: undefined,\n pc: undefined,\n\n previousOnInfo: undefined,\n waitingForPeer: false\n };\n\n this.localStreamConstraints = {\n audio: true,\n video: true\n };\n\n this.localRef = React.createRef();\n this.remoteRef = React.createRef();\n\n this.onInfo = this.onInfo.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n\n this.createPeerConnection = this.createPeerConnection.bind(this);\n\n this.handleNegotiationNeededEvent = this.handleNegotiationNeededEvent.bind(this);\n this.handleICECandidateEvent = this.handleICECandidateEvent.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n this.handleICEConnectionStateChangeEvent = this.handleICEConnectionStateChangeEvent.bind(this);\n this.handleSignalingStateChangeEvent = this.handleSignalingStateChangeEvent.bind(this);\n this.handleICEGatheringStateChangeEvent = this.handleICEGatheringStateChangeEvent.bind(this);\n this.handleTrackEvent = this.handleTrackEvent.bind(this);\n\n this.handleVideoOfferMsg = this.handleVideoOfferMsg.bind(this);\n this.handleVideoAnswerMsg = this.handleVideoAnswerMsg.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n\n this.reportError = this.reportError.bind(this);\n this.handleGetUserMediaError = this.handleGetUserMediaError.bind(this);\n\n this.stopTracks = this.stopTracks.bind(this);\n\n this.handleCloseClick = this.handleCloseClick.bind(this);\n this.handleToggleCameraClick = this.handleToggleCameraClick.bind(this);\n this.handleToggleMicClick = this.handleToggleMicClick.bind(this);\n this.toggleMedia = this.toggleMedia.bind(this);\n\n this.handleRemoteHangup = this.handleRemoteHangup.bind(this);\n this.handleVideoCallAccepted = this.handleVideoCallAccepted.bind(this);\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n this.previousOnInfo = topic.onInfo;\n topic.onInfo = this.onInfo;\n if ((this.props.callState == CALL_STATE_OUTGOING_INITATED ||\n this.props.callState == CALL_STATE_IN_PROGRESS) && this.localRef.current) {\n this.start();\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onInfo = this.previousOnInfo;\n this.stop();\n }\n\n handleVideoCallAccepted(info) {\n RING_SOUND.pause();\n const pc = this.createPeerConnection();\n const stream = this.state.localStream;\n stream.getTracks().forEach(track => {\n pc.addTrack(track, stream);\n });\n }\n\n onInfo(info) {\n if (info.what != 'call') {\n return;\n }\n switch (info.event) {\n case 'accept':\n this.handleVideoCallAccepted(info);\n break;\n case 'offer':\n this.handleVideoOfferMsg(info);\n break;\n case 'answer':\n this.handleVideoAnswerMsg(info);\n break;\n case 'ice-candidate':\n this.handleNewICECandidateMsg(info);\n break;\n case 'hang-up':\n this.handleRemoteHangup(info);\n break;\n }\n }\n\n start() {\n if (this.state.localStream) {\n this.props.onError(this.props.intl.formatMessage(messages.already_in_call));\n return;\n }\n\n if (this.props.callState == CALL_STATE_IN_PROGRESS) {\n // We apparently just accepted the call.\n this.props.onInvite(this.props.topic, this.props.seq, this.props.callState);\n return;\n }\n\n // This is an outgoing call waiting for the other side to pick up.\n // Start local video.\n navigator.mediaDevices.getUserMedia(this.localStreamConstraints)\n .then(stream => {\n this.setState({localStream: stream, waitingForPeer: true});\n this.localRef.current.srcObject = stream;\n\n RING_SOUND.play();\n\n // Send call invitation.\n this.props.onInvite(this.props.topic, this.props.seq, this.props.callState);\n })\n .catch(this.handleGetUserMediaError);\n }\n\n stop() {\n CALL_ENDED_SOUND.pause();\n CALL_ENDED_SOUND.currentTime = 0;\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n\n this.stopTracks(this.localRef.current);\n this.stopTracks(this.remoteRef.current);\n if (this.state.pc) {\n this.state.pc.ontrack = null;\n this.state.pc.onremovetrack = null;\n this.state.pc.onremovestream = null;\n this.state.pc.onicecandidate = null;\n this.state.pc.oniceconnectionstatechange = null;\n this.state.pc.onsignalingstatechange = null;\n this.state.pc.onicegatheringstatechange = null;\n this.state.pc.onnegotiationneeded = null;\n\n this.state.pc.close();\n }\n this.setState({pc: null, waitingForPeer: false});\n }\n\n stopTracks(el) {\n if (!el) {\n return;\n }\n let stream = el.srcObject;\n if (!stream) {\n return;\n }\n\n let tracks = stream.getTracks();\n if (tracks) {\n tracks.forEach(track => {\n track.stop();\n track.enabled = false;\n });\n }\n el.srcObject = null;\n el.src = '';\n }\n\n createPeerConnection() {\n const iceServers = this.props.tinode.getServerParam('iceServers', null);\n const pc = iceServers ? new RTCPeerConnection({iceServers: iceServers}) : new RTCPeerConnection();\n\n pc.onicecandidate = this.handleICECandidateEvent;\n pc.oniceconnectionstatechange = this.handleICEConnectionStateChangeEvent;\n pc.onicegatheringstatechange = this.handleICEGatheringStateChangeEvent;\n pc.onsignalingstatechange = this.handleSignalingStateChangeEvent;\n pc.onnegotiationneeded = this.handleNegotiationNeededEvent;\n pc.ontrack = this.handleTrackEvent;\n\n this.setState({pc: pc, waitingForPeer: false});\n return pc;\n }\n\n handleVideoAnswerMsg(info) {\n // Configure the remote description, which is the SDP payload\n // in 'info' message.\n const desc = new RTCSessionDescription(info.payload);\n this.state.pc.setRemoteDescription(desc).catch(this.reportError);\n }\n\n reportError(err) {\n this.props.onError(err.message, 'err');\n }\n\n handleNegotiationNeededEvent() {\n this.state.pc.createOffer().then(offer => {\n return this.state.pc.setLocalDescription(offer);\n })\n .then(_ => {\n this.props.onSendOffer(this.props.topic, this.props.seq, this.state.pc.localDescription.toJSON());\n })\n .catch(this.reportError);\n }\n\n handleICECandidateEvent(event) {\n if (event.candidate) {\n this.props.onIceCandidate(this.props.topic, this.props.seq, event.candidate.toJSON());\n }\n }\n\n handleNewICECandidateMsg(info) {\n const candidate = new RTCIceCandidate(info.payload);\n this.state.pc.addIceCandidate(candidate)\n .catch(this.reportError);\n }\n\n handleICEConnectionStateChangeEvent(event) {\n switch (this.state.pc.iceConnectionState) {\n case 'closed':\n case 'failed':\n this.handleCloseClick();\n break;\n }\n }\n\n handleSignalingStateChangeEvent(event) {\n if (this.state.pc.signalingState == 'closed') {\n this.handleCloseClick();\n }\n }\n\n handleICEGatheringStateChangeEvent(event) {\n console.log('ICE gathering change state: ', event);\n }\n\n handleTrackEvent(event) {\n // Remote video becomes available.\n this.remoteRef.current.srcObject = event.streams[0];\n // Make sure we display the title (peer's name) over the remote video.\n this.forceUpdate();\n }\n\n handleGetUserMediaError(e) {\n switch(e.name) {\n case 'NotFoundError':\n // Cannot start the call b/c no camera and/or microphone found.\n this.reportError(e.message);\n break;\n case 'SecurityError':\n case 'PermissionDeniedError':\n // Do nothing; this is the same as the user canceling the call.\n break;\n default:\n this.reportError(e.message);\n console.error('Error opening your camera and/or microphone: ' + e.message);\n break;\n }\n\n // Make sure we shut down our end of the RTCPeerConnection so we're\n // ready to try again.\n this.handleCloseClick();\n }\n\n handleVideoOfferMsg(info) {\n let localStream = null;\n const pc = this.createPeerConnection();\n const desc = new RTCSessionDescription(info.payload);\n\n pc.setRemoteDescription(desc).then(_ => {\n return navigator.mediaDevices.getUserMedia(this.localStreamConstraints);\n })\n .then(stream => {\n localStream = stream;\n this.localRef.current.srcObject = stream;\n this.setState({localStream: stream});\n\n localStream.getTracks().forEach(track => {\n pc.addTrack(track, localStream);\n });\n })\n .then(_ => {\n return pc.createAnswer();\n })\n .then(answer => {\n return pc.setLocalDescription(answer);\n })\n .then(_ => {\n this.props.onSendAnswer(this.props.topic, this.props.seq, pc.localDescription.toJSON());\n })\n .catch(this.handleGetUserMediaError);\n }\n\n // Call disconnected by remote.\n handleRemoteHangup() {\n if (!this.state.waitingForPeer) {\n // This is live call, just hang up.\n this.handleCloseClick();\n } else {\n // This is a call which is not yet connected.\n // Stop pulse animation.\n this.setState({waitingForPeer: false});\n // Change sound and wait a bit before ending it.\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n CALL_ENDED_SOUND.loop = true;\n CALL_ENDED_SOUND.play();\n setTimeout(_ => {\n this.handleCloseClick();\n }, 2000);\n }\n }\n\n handleCloseClick() {\n this.stop();\n this.props.onHangup(this.props.topic, this.props.seq);\n }\n\n // Mute/unmute audio/video (specified by kind).\n toggleMedia(kind) {\n const stream = this.state.localStream;\n stream.getTracks().forEach(track => {\n if (track.kind != kind) {\n return;\n }\n track.enabled = !track.enabled;\n });\n // Make sure we redraw the mute/unmute icons (e.g. mic -> mic_off).\n this.forceUpdate();\n }\n\n handleToggleCameraClick() {\n this.toggleMedia('video');\n }\n\n handleToggleMicClick() {\n this.toggleMedia('audio');\n }\n\n render() {\n const remoteActive = this.remoteRef.current && this.remoteRef.current.srcObject;\n const disabled = !(this.state.localStream && this.state.localStream.getTracks());\n const audioIcon = this.state.localStream && this.state.localStream.getAudioTracks()[0].enabled ? 'mic' : 'mic_off';\n const videoIcon = this.state.localStream && this.state.localStream.getVideoTracks()[0].enabled ? 'videocam' : 'videocam_off';\n const peerTitle = clipStr(this.props.title, MAX_PEER_TITLE_LENGTH);\n const pulseAnimation = this.state.waitingForPeer ? ' pulse' : '';\n\n return (\n <>\n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n \n {remoteActive ?\n
    {peerTitle}
    :\n
    \n
    \n \n
    \n
    {peerTitle}
    \n
    \n }\n
    \n
    \n
    \n \n \n \n
    \n
    \n \n );\n }\n};\n\nexport default injectIntl(CallPanel);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport FileProgress from './file-progress.jsx';\nimport { bytesToHumanSize } from '../lib/strformat.js';\nimport { isUrlRelative, sanitizeUrl } from '../lib/utils.js';\n\nexport default class Attachment extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n downloader: null,\n progress: 0\n };\n\n this.downloadFile = this.downloadFile.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n downloadFile(url, filename, mimetype) {\n if (!url) {\n this.props.onError(\"Invalid download URL '\" + url + \"'\");\n return;\n }\n\n const downloader = this.props.tinode.getLargeFileHelper();\n this.setState({downloader: downloader});\n downloader.download(url, filename, mimetype,\n (loaded) => {\n this.setState({progress: loaded / this.props.size});\n },\n (err) => {\n this.props.onError(err, 'err');\n }\n ).then(() => {\n this.setState({downloader: null, progress: 0});\n }).catch((err) => {\n if (err) {\n this.props.onError(\"Error downloading file: \" + err.message, 'err');\n }\n this.setState({downloader: null, progress: 0});\n });\n }\n\n handleCancel() {\n if (this.props.uploading) {\n this.props.onCancelUpload();\n } else if (this.state.downloader) {\n this.state.downloader.cancel();\n }\n }\n\n render() {\n let filename = this.props.filename || 'file_attachment';\n if (filename.length > 36) {\n filename = filename.substr(0, 16) + '...' + filename.substr(-16);\n }\n let size = this.props.size > 0 ?\n ({bytesToHumanSize(this.props.size)}) :\n null;\n\n // Detect if the download URL is relative or absolute.\n // If the URL is relative use LargeFileHelper to attach authentication\n // credentials to the request.\n let url, helperFunc;\n if (!this.props.uploading && !this.state.downloader && isUrlRelative(this.props.downloadUrl)) {\n // Relative URL. Use download helper.\n url = '#';\n helperFunc = (e) => {\n e.preventDefault();\n this.downloadFile(this.props.downloadUrl, this.props.filename, this.props.mimetype);\n };\n } else {\n url = sanitizeUrl(this.props.downloadUrl);\n helperFunc = null;\n }\n const downloadWidget = <>file_download ;\n return (\n
    \n
    insert_drive_file
    \n
    \n
    {filename} {size}
    \n {this.props.uploading || this.state.downloader ?\n \n :\n
    {url ?\n {downloadWidget}\n :\n {downloadWidget}\n }
    \n }\n
    \n
    \n );\n }\n};\n","// Received/read indicator.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { deliveryMarker } from '../lib/utils.js';\n\nconst messages = defineMessages({\n message_sending: {\n id: 'message_sending',\n defaultMessage: 'sending...',\n description: 'Message being sent, in place of time stamp'\n },\n message_sending_failed: {\n id: 'message_sending_failed',\n defaultMessage: 'failed',\n description: 'Failed to send message, in place of time stamp'\n }\n});\n\nclass ReceivedMarker extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let timestamp;\n if (this.props.received <= Tinode.MESSAGE_STATUS_SENDING) {\n timestamp = formatMessage(messages.message_sending);\n } else if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {\n timestamp = formatMessage(messages.message_sending_failed);\n } else {\n timestamp = this.props.timestamp.toLocaleTimeString(this.props.intl.locale, { timeStyle: 'short' });\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n\n return (\n \n {timestamp}{'\\u00a0'}{marker}\n \n );\n }\n};\n\nexport default injectIntl(ReceivedMarker);\n","// Single chat message bubble, sent or received.\n\nimport React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Attachment from './attachment.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport ReceivedMarker from './received-marker.jsx'\n\nimport { fullFormatter } from '../lib/formatters.js';\nimport { sanitizeUrl } from '../lib/utils.js';\n\nclass BaseChatMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n progress: 0\n };\n\n if (props.uploader) {\n props.uploader.onProgress = this.handleProgress.bind(this);\n }\n\n this.handleImagePreview = this.handleImagePreview.bind(this);\n this.handleFormButtonClick = this.handleFormButtonClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n\n this.formatterContext = {\n formatMessage: props.intl.formatMessage.bind(props.intl),\n viewportWidth: props.viewportWidth,\n authorizeURL: props.tinode.authorizeURL.bind(props.tinode),\n\n onImagePreview: this.handleImagePreview,\n onFormButtonClick: this.handleFormButtonClick,\n onQuoteClick: this.handleQuoteClick\n };\n }\n\n handleImagePreview(e) {\n e.preventDefault();\n this.props.onImagePreview({\n url: e.target.src,\n filename: e.target.title,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n\n handleFormButtonClick(e) {\n e.preventDefault();\n const data = {\n seq: this.props.seq\n };\n data.resp = {};\n if (e.target.dataset.name) {\n data.resp[e.target.dataset.name] = e.target.dataset.val ? e.target.dataset.val :\n e.target.dataset.val === undefined ? 1 : '' + e.target.dataset.val;\n }\n if (e.target.dataset.act == 'url') {\n data.ref = sanitizeUrl(e.target.dataset.ref) || 'about:blank';\n }\n const text = e.target.dataset.title || 'unknown';\n this.props.onFormResponse(e.target.dataset.act, text, data);\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const menuItems = [];\n if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {\n menuItems.push('menu_item_send_retry');\n }\n if (this.props.userIsWriter &&\n this.props.received > Tinode.MESSAGE_STATUS_FAILED &&\n this.props.received < Tinode.MESSAGE_STATUS_DEL_RANGE) {\n menuItems.push('menu_item_reply');\n }\n menuItems.push('menu_item_forward');\n\n this.props.showContextMenu({\n seq: this.props.seq,\n content: this.props.content,\n userFrom: this.props.userFrom,\n userName: this.props.userName,\n y: e.pageY,\n x: e.pageX,\n pickReply: this.props.pickReply\n }, menuItems);\n }\n\n handleProgress(ratio) {\n this.setState({progress: ratio});\n }\n\n handleCancelUpload() {\n this.props.onCancelUpload(this.props.seq, this.props.uploader);\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const replyToSeq = this.props.replyToSeq;\n if (replyToSeq) {\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n render() {\n const sideClass = this.props.sequence + ' ' + (this.props.response ? 'left' : 'right');\n const bubbleClass = (this.props.sequence == 'single' || this.props.sequence == 'last') ? 'bubble tip' : 'bubble';\n const avatar = this.props.userAvatar || true;\n const fullDisplay = (this.props.isGroup && this.props.response &&\n (this.props.sequence == 'single' || this.props.sequence == 'last'));\n\n let content = this.props.content;\n const attachments = [];\n if (this.props.mimeType == Drafty.getContentType() && Drafty.isValid(content)) {\n Drafty.attachments(content, (att, i) => {\n if (att.mime == 'application/json') {\n // Don't show json objects as attachments.\n // They are not meant for users.\n return;\n }\n attachments.push();\n }, this);\n const tree = Drafty.format(content, fullFormatter, this.formatterContext);\n content = React.createElement(React.Fragment, null, tree);\n } else if (this.props.deleted) {\n // Message represents a range of deleted messages.\n content = <>block \n \n \n } else if (typeof content != 'string') {\n content = <>warning_amber \n \n }\n\n return (\n
  • \n {this.props.isGroup && this.props.response ?\n
    \n {fullDisplay ?\n :\n null}\n
    :\n null}\n
    \n
    \n
    \n
    \n {content}\n {attachments}\n
    \n {this.props.timestamp ?\n \n : null}\n
    \n {this.props.showContextMenu ?\n \n \n expand_more\n \n : null\n }\n
    \n {fullDisplay ?\n
    \n {this.props.userName ||\n \n }\n
    \n : null\n }\n
    \n
  • \n );\n }\n};\n\nconst IntlChatMessage = injectIntl(BaseChatMessage);\nconst ChatMessage = React.forwardRef((props, ref) => );\n\nexport default ChatMessage;\n","// Audio recorder widget.\n\nimport React from 'react';\n\nimport AudioPlayer from './audio-player.jsx';\n// Workaround for https://bugs.chromium.org/p/chromium/issues/detail?id=642012\nimport fixWebmDuration from 'fix-webm-duration';\n\nimport { intArrayToBase64 } from '../lib/blob-helpers.js'\nimport { secondsToTime } from '../lib/strformat';\nimport { MAX_DURATION, MIN_DURATION } from '../config.js';\n\n// FFT resolution.\nconst BUFFER_SIZE = 256;\n// Make canvas bigger than the element size to reduce blurring.\nconst CANVAS_UPSCALING = 2.0;\n// Thickness of a visualization bar.\nconst LINE_WIDTH = 3 * CANVAS_UPSCALING;\n// Spacing between two visualization bars.\nconst SPACING = 2 * CANVAS_UPSCALING;\n// Duration represented by one visualization bar.\nconst MILLIS_PER_BAR = 100;\n// Color of histogram bars\nconst BAR_COLOR = '#BBBD';\n// Vertical scaling for visualization bars.\nconst BAR_SCALE = 64.0;\n// Number of bars in preview.\nconst VISUALIZATION_BARS = 96;\n// Maximum number of samples per bar.\nconst MAX_SAMPLES_PER_BAR = 10;\n\n// Recording format.\nconst AUDIO_MIME_TYPE = 'audio/webm';\n\nexport default class AudioRecorder extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n enabled: true,\n audioRecord: null,\n recording: true,\n paused: false,\n duration: '0:00',\n blobUrl: null,\n preview: null\n };\n\n this.visualize = this.visualize.bind(this);\n this.initMediaRecording = this.initMediaRecording.bind(this);\n this.initCanvas = this.initCanvas.bind(this);\n this.getRecording = this.getRecording.bind(this);\n this.cleanUp = this.cleanUp.bind(this);\n\n this.handleResume = this.handleResume.bind(this);\n this.handlePause = this.handlePause.bind(this);\n this.handleDelete = this.handleDelete.bind(this);\n this.handleDone = this.handleDone.bind(this);\n\n this.durationMillis = 0;\n this.startedOn = null;\n this.viewBuffer = [];\n this.canvasRef = React.createRef();\n }\n\n componentDidMount() {\n this.stream = null;\n this.mediaRecorder = null;\n this.audioContext = null;\n this.audioInput = null;\n this.analyser = null;\n\n this.audioChunks = [];\n\n // Start recorder right away.\n try {\n navigator.mediaDevices.getUserMedia({audio: true, video: false}).then(this.initMediaRecording, this.props.onError);\n } catch (err) {\n this.props.onError(err);\n }\n }\n\n componentWillUnmount() {\n this.startedOn = null;\n if (this.stream) {\n this.cleanUp();\n }\n }\n\n // Draw amplitude of sound.\n visualize() {\n this.initCanvas();\n\n const pcmData = new Uint8Array(this.analyser.frequencyBinCount);\n const width = this.canvasWidth;\n const height = this.canvasHeight;\n // Number of bars.\n const viewLength = (width / (LINE_WIDTH + SPACING)) | 0;\n // Duration of audio which fits onto the screen.\n const viewDuration = MILLIS_PER_BAR * viewLength;\n\n this.canvasContext.lineWidth = LINE_WIDTH;\n this.canvasContext.strokeStyle = BAR_COLOR;\n\n let prevBarCount = 0;\n let volume = 0.0;\n let countPerBar = 0;\n const drawFrame = () => {\n if (!this.startedOn) {\n return;\n }\n window.requestAnimationFrame(drawFrame);\n\n const duration = this.durationMillis + (Date.now() - this.startedOn);\n // Update record length timer.\n this.setState({duration: secondsToTime(duration / 1000)});\n\n // Check if record is too long.\n if (duration > MAX_DURATION) {\n this.startedOn = null;\n this.mediaRecorder.pause();\n this.durationMillis += Date.now() - this.startedOn;\n this.setState({enabled: false, recording: false, duration: secondsToTime(this.durationMillis / 1000)});\n }\n\n // Draw histogram.\n\n // Get current waveform and calculate its amplitude.\n this.analyser.getByteTimeDomainData(pcmData);\n let amp = 0.0;\n for (const amplitude of pcmData) {\n amp += (amplitude - 127) ** 2;\n }\n\n // Sum the amplitude.\n volume += Math.sqrt(amp/pcmData.length);\n countPerBar ++;\n\n let barCount = (duration / MILLIS_PER_BAR) | 0;\n // Shift of the histogram along x-axis to make scrolling smooth. No need to shift if recording is too short.\n const dx = viewDuration > duration ? 0 :\n (duration - MILLIS_PER_BAR * barCount) / MILLIS_PER_BAR * (LINE_WIDTH + SPACING);\n\n if (prevBarCount != barCount) {\n prevBarCount = barCount;\n // Add new amplitude visualization bar.\n this.viewBuffer.push(volume/countPerBar);\n volume = 0.0;\n countPerBar = 0;\n if (this.viewBuffer.length > viewLength) {\n // Keep at most 'viewLength' amplitude bars.\n this.viewBuffer.shift();\n }\n }\n\n // Clear canvas.\n this.canvasContext.clearRect(0, 0, width, height);\n\n // Draw amplitude bars.\n this.canvasContext.beginPath();\n for (let i = 0; i < this.viewBuffer.length; i++) {\n let x = i * (LINE_WIDTH + SPACING) - dx;\n let y = Math.min(this.viewBuffer[i] / BAR_SCALE, 0.9) * height;\n\n this.canvasContext.moveTo(x, (height - y) * 0.5);\n this.canvasContext.lineTo(x, height * 0.5 + y * 0.5);\n }\n // Actually draw the bars on canvas.\n this.canvasContext.stroke();\n }\n\n drawFrame();\n }\n\n handlePause(e) {\n e.preventDefault();\n this.mediaRecorder.pause();\n this.mediaRecorder.requestData();\n this.durationMillis += Date.now() - this.startedOn;\n this.startedOn = null;\n this.setState({recording: false});\n }\n\n handleResume(e) {\n e.preventDefault();\n if (this.state.enabled) {\n this.startedOn = Date.now();\n this.mediaRecorder.resume();\n this.setState({recording: true}, this.visualize);\n }\n }\n\n handleDelete(e) {\n e.preventDefault();\n this.durationMillis = 0;\n this.startedOn = null;\n this.mediaRecorder.stop();\n this.cleanUp();\n this.setState({recording: false});\n }\n\n handleDone(e) {\n e.preventDefault();\n this.setState({recording: false});\n if (this.startedOn) {\n this.durationMillis += Date.now() - this.startedOn;\n this.startedOn = null;\n }\n // Stop recording and return data.\n if (this.mediaRecorder) {\n this.mediaRecorder.stop();\n }\n }\n\n initCanvas() {\n this.canvasRef.current.width = this.canvasRef.current.offsetWidth * CANVAS_UPSCALING;\n this.canvasRef.current.height = this.canvasRef.current.offsetHeight * CANVAS_UPSCALING;\n\n this.canvasContext = this.canvasRef.current.getContext('2d');\n this.canvasContext.lineCap = 'round';\n // To reduce line blurring.\n this.canvasContext.translate(0.5, 0.5);\n this.canvasWidth = this.canvasRef.current.width;\n this.canvasHeight = this.canvasRef.current.height;\n }\n\n initMediaRecording(stream) {\n this.stream = stream;\n this.mediaRecorder = new MediaRecorder(stream, {mimeType: AUDIO_MIME_TYPE});\n\n // The following code is needed for visualization.\n this.audioContext = new AudioContext();\n this.audioInput = this.audioContext.createMediaStreamSource(stream);\n this.analyser = this.audioContext.createAnalyser();\n this.analyser.fftSize = BUFFER_SIZE;\n this.audioInput.connect(this.analyser);\n\n this.mediaRecorder.onstop = _ => {\n if (this.durationMillis > MIN_DURATION) {\n this.getRecording(this.mediaRecorder.mimeType, this.durationMillis)\n .then(result => this.props.onFinished(result.url, result.preview, this.durationMillis));\n } else {\n this.props.onDeleted();\n }\n this.cleanUp();\n }\n\n this.mediaRecorder.ondataavailable = (e) => {\n if (e.data.size > 0) {\n this.audioChunks.push(e.data);\n }\n\n if (this.mediaRecorder.state != 'inactive') {\n this.getRecording(this.mediaRecorder.mimeType).then(result => {\n this.setState({\n blobUrl: result.url,\n preview: result.preview\n });\n });\n }\n }\n\n this.durationMillis = 0;\n this.startedOn = Date.now();\n this.mediaRecorder.start();\n this.visualize();\n }\n\n // Obtain data in a form sutable for sending or playing back.\n // If duration is valid, apply fix for Chrome's WebM duration bug.\n getRecording(mimeType, duration) {\n let blob = new Blob(this.audioChunks, {type: mimeType || AUDIO_MIME_TYPE});\n return (duration > 0 ? fixWebmDuration(blob, duration, {logger: false}) : Promise.resolve(blob))\n .then(fixedBlob => { blob = fixedBlob; return fixedBlob.arrayBuffer(); })\n .then(arrayBuff => this.audioContext.decodeAudioData(arrayBuff))\n .then(decoded => this.createPreview(decoded))\n .then(preview => ({url: window.URL.createObjectURL(blob), preview: intArrayToBase64(preview)}));\n }\n\n // Preview must be calculated at the source: Chrome does not allow background AudioContext.\n createPreview(audio) {\n const data = audio.getChannelData(0);\n // Number of amplitude bars in preview.\n const viewLength = Math.min(data.length, VISUALIZATION_BARS);\n // The number of samples in each bar.\n const totalSPB = (data.length / viewLength) | 0;\n // Distance between samples: we are going to take just a fracton of samples.\n const samplingRate = Math.max(1, (totalSPB / MAX_SAMPLES_PER_BAR) | 0);\n\n let buffer = [];\n let max = -1;\n for (let i = 0; i < viewLength; i++) {\n let amplitude = 0;\n let count = 0;\n for (let j = 0; j < totalSPB; j += samplingRate) {\n amplitude += data[totalSPB * i + j] ** 2;\n count ++;\n }\n const val = Math.sqrt(amplitude / count);\n buffer.push(val);\n max = Math.max(max, val);\n }\n // Normalize amplitude to 0..100.\n if (max > 0) {\n buffer = buffer.map(a => (100 * a / max) | 0);\n }\n return buffer;\n }\n\n cleanUp() {\n this.audioInput.disconnect();\n this.stream.getTracks().forEach(track => track.stop());\n }\n\n render() {\n const resumeClass = 'material-icons ' + (this.state.enabled ? 'red' : 'gray');\n return (\n
    \n \n delete_outline\n \n {this.state.recording ?\n \n :\n \n }\n
    {this.state.duration}
    \n {this.state.recording ?\n \n pause_circle_outline\n :\n \n radio_button_checked\n \n }\n \n send\n \n
    \n );\n }\n}\n","// Send message form.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { Drafty } from 'tinode-sdk';\n\nimport AudioRecorder from './audio-recorder.jsx';\n\nimport { KEYPRESS_DELAY } from '../config.js';\nimport { filePasted } from '../lib/blob-helpers.js';\nimport { replyFormatter } from '../lib/formatters.js';\n\nconst messages = defineMessages({\n messaging_disabled: {\n id: 'messaging_disabled_prompt',\n defaultMessage: 'Messaging disabled',\n description: 'Prompt in SendMessage in read-only topic'\n },\n type_new_message: {\n id: 'new_message_prompt',\n defaultMessage: 'New message',\n description: 'Prompt in send message field'\n },\n add_image_caption: {\n id: 'image_caption_prompt',\n defaultMessage: 'Image caption',\n description: 'Prompt in SendMessage for attached image'\n },\n file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n cannot_initiate_upload: {\n id: 'cannot_initiate_file_upload',\n defaultMessage: 'Cannot initiate file upload.',\n description: 'Generic error messagewhen attachment fails'\n },\n});\n\nclass SendMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n quote: null,\n message: '',\n audioRec: false,\n audioAvailable: !!navigator.mediaDevices.getUserMedia,\n // Make initial keypress time as if it happened 5001 milliseconds in the past.\n keypressTimestamp: new Date().getTime() - KEYPRESS_DELAY - 1\n };\n\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n this.handleAttachImage = this.handleAttachImage.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachAudio = this.handleAttachAudio.bind(this);\n this.handleSend = this.handleSend.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleMessageTyping = this.handleMessageTyping.bind(this);\n\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n\n this.formatReply = this.formatReply.bind(this);\n }\n\n componentDidMount() {\n if (this.messageEditArea) {\n this.messageEditArea.addEventListener('paste', this.handlePasteEvent, false);\n }\n\n this.setState({quote: this.formatReply()});\n }\n\n componentWillUnmount() {\n if (this.messageEditArea) {\n this.messageEditArea.removeEventListener('paste', this.handlePasteEvent, false);\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.messageEditArea) {\n this.messageEditArea.focus();\n }\n\n if (prevProps.topicName != this.props.topicName) {\n this.setState({message: '', audioRec: false, quote: null});\n }\n if (prevProps.reply != this.props.reply) {\n this.setState({quote: this.formatReply()});\n }\n }\n\n formatReply() {\n return this.props.reply ?\n Drafty.format(this.props.reply.content, replyFormatter, {\n formatMessage: this.props.intl.formatMessage.bind(this.props.intl),\n authorizeURL: this.props.tinode.authorizeURL.bind(this.props.tinode)\n }) : null;\n }\n\n handlePasteEvent(e) {\n if (this.props.disabled) {\n return;\n }\n // FIXME: handle large files too.\n if (filePasted(e,\n file => { this.props.onAttachImage(file); },\n file => { this.props.onAttachFile(file); },\n this.props.onError)) {\n\n // If a file was pasted, don't paste base64 data into input field.\n e.preventDefault();\n }\n }\n\n handleAttachImage(e) {\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachImage(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleAttachFile(e) {\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachFile(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleAttachAudio(url, preview, duration) {\n this.setState({audioRec: false});\n this.props.onAttachAudio(url, preview, duration);\n }\n\n handleSend(e) {\n e.preventDefault();\n const message = this.state.message.trim();\n if (message || this.props.acceptBlank || this.props.noInput) {\n this.props.onSendMessage(message);\n this.setState({message: ''});\n }\n }\n\n /* Send on Enter key */\n handleKeyPress(e) {\n if (this.state.audioRec) {\n // Ignore key presses while audio is being recorded.\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n // Remove this if you don't want Enter to trigger send\n if (e.key === 'Enter') {\n // Have Shift-Enter insert a line break instead\n if (!e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n\n this.handleSend(e);\n }\n }\n }\n\n handleMessageTyping(e) {\n const newState = {message: e.target.value};\n if (this.props.onKeyPress) {\n const now = new Date().getTime();\n if (now - this.state.keypressTimestamp > KEYPRESS_DELAY) {\n this.props.onKeyPress();\n newState.keypressTimestamp = now;\n }\n }\n this.setState(newState);\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.reply && this.props.onQuoteClick) {\n const replyToSeq = this.props.reply.seq;\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n render() {\n const { formatMessage } = this.props.intl;\n const prompt = this.props.disabled ?\n formatMessage(messages.messaging_disabled) :\n (this.props.messagePrompt ?\n formatMessage(messages[this.props.messagePrompt]) :\n formatMessage(messages.type_new_message));\n\n const quote = this.state.quote ?\n () : null;\n const audioEnabled = this.state.audioAvailable && this.props.onAttachAudio;\n return (\n
    \n {!this.props.noInput ? quote : null}\n
    \n {!this.props.disabled ?\n <>\n {this.props.onAttachFile && !this.state.audioRec ?\n <>\n {e.preventDefault(); this.attachImage.click();}} title=\"Add image\">\n photo\n \n {e.preventDefault(); this.attachFile.click();}} title=\"Attach file\">\n attach_file\n \n \n :\n null}\n {this.props.noInput ?\n (quote ||
    ) :\n (this.state.audioRec ?\n this.setState({audioRec: false})}\n onFinished={this.handleAttachAudio}/> :\n