diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..641d1b3 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,19 @@ +# Change Log + +## [v2.0.0](https://github.com/UdelaRInterior/ansible-role-jitsi-meet/tree/v2.0.0) + +### Second version of the role, designed for Jitsi Meet v2.X + +* Default Nginx web server, custom settings are maintained from a variable (`jitsi_meet_configure_nginx`). + +* Now the installation of `jitsi-meet` from apt recommends the installation of a turnserver, a feature that can cause various problems with nginx configurations. Added `jitsi_meet_install_recommends` variable to influence this behavior. + +* Using `present` instead `latest` when installing packages. + +* Various improvements and simplifications of tasks that are no longer necessary. + +## [v1.0.0](https://github.com/UdelaRInterior/ansible-role-jitsi-meet/tree/v1.0.0) + +### First version of the role, designed for Jitsi Meet v1.X + +* Jetty default web server, with option to install and configure Nginx from a variable. diff --git a/README.md b/README.md index 940493c..cc3cecb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ jitsi-meet ========= +[![Galaxy](https://img.shields.io/badge/galaxy-UdelaRInterior.jitsi_meet-blue.svg)](https://galaxy.ansible.com/udelarinterior/jitsi_meet) + Installs and configures the [Jitsi Meet] videoconferencing software. @@ -21,33 +23,77 @@ Role Variables -------------- ```yaml -# It allows you to specify the installation of jitsi meet creating and configuring -# self-signed HTTPS certificates, which can then be replaced by Let's Encrypt certificates -jitsi_meet_cert_choice: "Generate a new self-signed certificate (You will later get a chance to obtain a Let's encrypt certificate)" +######################################## +###### most important variables ######## +# and that you must adapt to your case # +######################################## # Without SSL, "localhost" is the correct default. If SSL info is provided, # then we'll need a real domain name. Using Ansible's inferred FQDN, but you # can set the variable value explicitly if you use a shorter hostname # If automatic Nginx configuration is disabled, also use FQDN, since presumably # another role will manage the vhost config. -jitsi_meet_server_name: "{{ inventory_hostname if (jitsi_meet_configure_nginx) else ansible_fqdn if (not jitsi_meet_configure_nginx) else 'localhost' }}" +jitsi_meet_server_name: "{{ ansible_fqdn | default('localhost') }}" + +# Note from official documentation: +# The installer will check if Nginx or Apache is present (in that order) and configure +# a virtualhost within the web server it finds to serve Jitsi Meet. If none of the above +# is found it then defaults to Nginx. If you are already running Nginx on port 443 on +# the same machine you better skip the turnserver configuration as it will conflict with +# your current port 443, so use the command apt install --no-install-recommends jitsi-meet +jitsi_meet_install_recommends: no + +# If (jitsi_meet_install_recommends == no), there won't be turnserver installed and available +jitsi_meet_use_stun_turn: 'false' + +# The STUN servers that will be used in the peer to peer connections +jitsi_meet_stun_servers: + - 'stun:meet-jit-si-turnrelay.jitsi.net:443' + # - 'stun:{{ jitsi_meet_server_name }}:443' + +# Configure nginx and jitsi-meet to listening also IPv6 +jitsi_meet_ipv6_enable: true + +# It allows you to specify the installation of jitsi meet creating and configuring +# self-signed HTTPS certificates, which can then be replaced by Let's Encrypt certificates +jitsi_meet_cert_choice: "Generate a new self-signed certificate (You will later get a chance to obtain a Let's encrypt certificate)" +# Due to the behavior of the Jitsi installer scripts, it is recommended to keep this value, even if you +# plan to use your own generated certificates (for example). with certbot. You can do it from this role -# The default cert files are /var/lib/prosody/localhost.{crt,key} # NOT setting them here, because empty strings for custom certs will # cause the custom Nginx config tasks to be skipped. jitsi_meet_ssl_cert_path: '' jitsi_meet_ssl_key_path: '' +############# +### NGINX ### +# This role will automatically configure a nginx vhost for use with jitsi-meet. +# If you prefer to manage web vhosts via a separate role, set this to false. +jitsi_meet_configure_nginx: true + + + +########################################### +# other useful variables to customize the # +# installation, but less frequently used # +########################################### + +# The Debian package installation of jitsi-meet will generate secrets for the components. +# The role will read the config file and preserve the secrets even while templating. +# If you wish to generate your own secrets and use those, override these vars, but make +# sure to store the secrets securely, e.g. with ansible-vault or credstash. +jitsi_meet_videobridge_secret: '' +jitsi_meet_jicofo_secret: '' +jitsi_meet_jicofo_password: '' + +################## +### APT things ### # List of packages that need to be installed before jitsi meet jitsi_meet_base_packages: - apt-transport-https - - default-jre-headless - debconf - debconf-utils -# Only "anonymous" auth is supported, which lets anyone use the videoconference server. -jitsi_meet_authentication: anonymous - # Whether to use nightly builds of the Jitsi Meet components. jitsi_meet_use_nightly_apt_repo: false @@ -60,28 +106,64 @@ jitsi_meet_apt_repos: jitsi_meet_apt_key_url: 'https://download.jitsi.org/jitsi-key.gpg.key' jitsi_meet_apt_key_id: '66A9CD0595D6AFA247290D3BEF8B479E2DC1389C' -# The Debian package installation of jitsi-meet will generate secrets for the components. -# The role will read the config file and preserve the secrets even while templating. -# If you wish to generate your own secrets and use those, override these vars, but make -# sure to store the secrets securely, e.g. with ansible-vault or credstash. -jitsi_meet_videobridge_secret: '' -jitsi_meet_jicofo_secret: '' -jitsi_meet_jicofo_password: '' +# These debconf settings represent answers to interactive prompts during installation +# of the jitsi-meet deb package. If you use custom SSL certs, you may have to set more options. +jitsi_meet_debconf_settings: + - name: jitsi-meet + question: jitsi-meet/jvb-serve + value: "false" + vtype: boolean + - name: jitsi-meet-prosody + question: jitsi-meet-prosody/jvb-hostname + value: "{{ jitsi_meet_server_name }}" + vtype: string + - name: jitsi-videobridge + question: jitsi-videobridge/jvb-hostname + value: "{{ jitsi_meet_server_name }}" + vtype: string + - name: jitsi-meet-web-config + question: jitsi-meet/cert-choice + value: "{{ jitsi_meet_cert_choice }}" + vtype: select + - name: jitsi-meet-web-config + question: jitsi-meet/cert-path-key + value: "{{ jitsi_meet_ssl_key_path }}" + vtype: string + - name: jitsi-meet-web-config + question: jitsi-meet/cert-path-crt + value: "{{ jitsi_meet_ssl_cert_path }}" + vtype: string + +####################### +### Server firewall ### +# This role will automatically install configure ufw with jitsi-meet port holes. +# If you're managing a firewall elsewise, set this to false, and ufw will be skipped. +jitsi_meet_configure_firewall: true + +############## +### Jicofo ### # Default auth information, used in multiple service templates. jitsi_meet_jicofo_user: focus jitsi_meet_jicofo_port: 5347 - # The Jitsi components use the standard Java log levels, see: # https://docs.oracle.com/javase/7/docs/api/java/util/logging/Level.html # When using log aggregation for jitsi-meet components, set to "WARNING". jitsi_meet_jicofo_loglevel: INFO + +################### +### Videobridge ### # The default config file at /etc/jitsi/videobridge/config claims the default port # for JVB is "5275", but the manual install guide references "5347". # https://github.com/jitsi/jitsi-meet/blob/master/doc/manual-install.md jitsi_meet_videobridge_port: 5347 - jitsi_meet_videobridge_loglevel: INFO + +############ +### Meet ### +# Only "anonymous" auth is supported, which lets anyone use the videoconference server. +jitsi_meet_authentication: anonymous + # A recent privacy-friendly addition, see here for details: # https://github.com/jitsi/jitsi-meet/issues/422 # https://github.com/jitsi/jitsi-meet/pull/427 @@ -103,36 +185,17 @@ jitsi_meet_desktop_sharing_firefox_ext_id: 'null' jitsi_meet_desktop_sharing_firefox_disabled: 'false' jitsi_meet_desktop_sharing_firefox_max_version_ext_required: '-1' -# These debconf settings represent answers to interactive prompts during installation -# of the jitsi-meet deb package. If you use custom SSL certs, you may have to set more options. -jitsi_meet_debconf_settings: - - name: jitsi-meet - question: jitsi-meet/cert-choice - value: "{{ jitsi_meet_cert_choice }}" - vtype: string - - name: jitsi-meet - question: jitsi-meet/jvb-serve - value: "true" - vtype: boolean - - name: jitsi-meet-prosody - question: jitsi-meet-prosody/jvb-hostname - value: "{{ jitsi_meet_server_name }}" - vtype: string - - name: jitsi-videobridge - question: jitsi-videobridge/jvb-hostname - value: "{{ jitsi_meet_server_name }}" - vtype: string - -# Role will automatically install configure ufw with jitsi-meet port holes. -# If you're managing a firewall elsewise, set this to false, and ufw will be skipped. -jitsi_meet_configure_firewall: true - -# Role will automatically install nginx and configure a vhost for use with jitsi-meet. -# If you prefer to manage web vhosts via a separate role, set this to false. -jitsi_meet_configure_nginx: true +################### +### SIP gateway ### +jitsi_meet_configure_sip_gateway: false +jitsi_meet_jigasi_account: sipnumber@sip-provider.name +jitsi_meet_jigasi_password: fdi49fndKjhe3 +jitsi_meet_jigasi_jicofo_sip_template: jicofo_sip-communicator.properties.j2 +jitsi_meet_jigasi_videobridge_sip_template: videobridge_sip-communicator.properties.j2 -# UI customization +######################## +### UI customization ### jitsi_meet_customize_the_ui: false jitsi_meet_lang: 'en' @@ -140,17 +203,23 @@ jitsi_meet_appname: 'My app name' jitsi_meet_org_link: 'https://link-to-my-organization.com' jitsi_meet_welcomepage_title: 'Secure, fully featured, and completely free video conferencing' jitsi_meet_welcomepage_description: 'Go ahead, video chat with the whole team. In fact, invite everyone you know. __app__ is a fully encrypted, 100% open source video conferencing solution that you can use all day, every day, for free — with no account needed.' -jitsi_meet_welcomepage_enterRoom: 'Start a new meeting' -jitsi_meet_welcomepage_recentListEmpty: 'Your recent list is currently empty. Chat with your team and you will find all your recent meetings here.' + +# By default it is an empty string because the CSS file is a bundled file for +# the entire site, and it change very frequently with each release. It will be +# replaced only if you have a custom CSS file and indicate its path in this variable +jitsi_meet_css_file: '' +jitsi_meet_welcome_page_additions_file: welcomePageAdditionalContent.html.j2 + +jitsi_meet_favicon_file: images/favicon.ico +jitsi_meet_logo_file: images/jitsilogo.png +jitsi_meet_watermark_file: images/watermark.png + jitsi_meet_default_background: '#474747' jitsi_meet_disable_video_background: 'false' jitsi_meet_default_remote_display_name: 'Fellow Jitster' jitsi_meet_default_local_display_name: 'me' jitsi_meet_generate_roomnames_on_welcome_page: 'true' jitsi_meet_lang_detection: 'false' # Allow i18n to detect the system language -jitsi_meet_favicon_file: images/favicon.ico -jitsi_meet_logo_file: images/jitsilogo.png -jitsi_meet_watermark_file: images/watermark.png ``` Screen sharing @@ -195,7 +264,7 @@ Including an example of how to use your role (for instance, with variables passe - "{{ jitsi_meet_server_name }}" certbot_create_standalone_stop_services: [] - - role: ansible-role-jitsi-meet + - role: udelarinterior.jitsi_meet jitsi_meet_ssl_cert_path: "/etc/letsencrypt/live/{{ jitsi_meet_server_name }}/fullchain.pem" jitsi_meet_ssl_key_path: "/etc/letsencrypt/live/{{ jitsi_meet_server_name }}/privkey.pem" become: yes @@ -242,3 +311,4 @@ Author Information [Molecule]: http://molecule.readthedocs.org/en/master/ [ServerSpec]: http://serverspec.org/ [Jidesha]: https://github.com/jitsi/jidesha + diff --git a/defaults/main.yml b/defaults/main.yml index 0bbcdc5..6aecec0 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -1,34 +1,76 @@ --- -# It allows you to specify the installation of jitsi meet creating and configuring -# self-signed HTTPS certificates, which can then be replaced by Let's Encrypt certificates -jitsi_meet_cert_choice: "Generate a new self-signed certificate (You will later get a chance to obtain a Let's encrypt certificate)" +######################################## +###### most important variables ######## +# and that you must adapt to your case # +######################################## # Without SSL, "localhost" is the correct default. If SSL info is provided, # then we'll need a real domain name. Using Ansible's inferred FQDN, but you # can set the variable value explicitly if you use a shorter hostname # If automatic Nginx configuration is disabled, also use FQDN, since presumably # another role will manage the vhost config. -jitsi_meet_server_name: "{{ inventory_hostname if (jitsi_meet_configure_nginx) else ansible_fqdn if (not jitsi_meet_configure_nginx) else 'localhost' }}" +jitsi_meet_server_name: "{{ ansible_fqdn | default('localhost') }}" + +# Note from official documentation: +# The installer will check if Nginx or Apache is present (in that order) and configure +# a virtualhost within the web server it finds to serve Jitsi Meet. If none of the above +# is found it then defaults to Nginx. If you are already running Nginx on port 443 on +# the same machine you better skip the turnserver configuration as it will conflict with +# your current port 443, so use the command apt install --no-install-recommends jitsi-meet +jitsi_meet_install_recommends: no +# If (jitsi_meet_install_recommends == no), there won't be turnserver installed and available +jitsi_meet_use_stun_turn: 'false' + +# The STUN servers that will be used in the peer to peer connections +jitsi_meet_stun_servers: + - 'stun:meet-jit-si-turnrelay.jitsi.net:443' + # - 'stun:{{ jitsi_meet_server_name }}:443' + +# Configure nginx and jitsi-meet to listening also IPv6 +jitsi_meet_ipv6_enable: true + +# It allows you to specify the installation of jitsi meet creating and configuring +# self-signed HTTPS certificates, which can then be replaced by Let's Encrypt certificates +jitsi_meet_cert_choice: "Generate a new self-signed certificate (You will later get a chance to obtain a Let's encrypt certificate)" +# Due to the behavior of the Jitsi installer scripts, it is recommended to keep this value, even if you +# plan to use your own generated certificates (for example). with certbot. You can do it from this role -# The default cert files are /var/lib/prosody/localhost.{crt,key} # NOT setting them here, because empty strings for custom certs will # cause the custom Nginx config tasks to be skipped. jitsi_meet_ssl_cert_path: '' jitsi_meet_ssl_key_path: '' +############# +### NGINX ### +# This role will automatically configure a nginx vhost for use with jitsi-meet. +# If you prefer to manage web vhosts via a separate role, set this to false. +jitsi_meet_configure_nginx: true + + + +########################################### +# other useful variables to customize the # +# installation, but less frequently used # +########################################### + +# The Debian package installation of jitsi-meet will generate secrets for the components. +# The role will read the config file and preserve the secrets even while templating. +# If you wish to generate your own secrets and use those, override these vars, but make +# sure to store the secrets securely, e.g. with ansible-vault or credstash. +jitsi_meet_videobridge_secret: '' +jitsi_meet_jicofo_secret: '' +jitsi_meet_jicofo_password: '' + +################## +### APT things ### # List of packages that need to be installed before jitsi meet jitsi_meet_base_packages: - apt-transport-https - - default-jre-headless - debconf - debconf-utils - -# Only "anonymous" auth is supported, which lets anyone use the videoconference server. -jitsi_meet_authentication: anonymous - # Whether to use nightly builds of the Jitsi Meet components. jitsi_meet_use_nightly_apt_repo: false @@ -38,32 +80,67 @@ jitsi_meet_apt_repos: unstable: repo_url: 'deb https://download.jitsi.org unstable/' - jitsi_meet_apt_key_url: 'https://download.jitsi.org/jitsi-key.gpg.key' jitsi_meet_apt_key_id: '66A9CD0595D6AFA247290D3BEF8B479E2DC1389C' -# The Debian package installation of jitsi-meet will generate secrets for the components. -# The role will read the config file and preserve the secrets even while templating. -# If you wish to generate your own secrets and use those, override these vars, but make -# sure to store the secrets securely, e.g. with ansible-vault or credstash. -jitsi_meet_videobridge_secret: '' -jitsi_meet_jicofo_secret: '' -jitsi_meet_jicofo_password: '' +# These debconf settings represent answers to interactive prompts during installation +# of the jitsi-meet deb package. If you use custom SSL certs, you may have to set more options. +jitsi_meet_debconf_settings: + - name: jitsi-meet + question: jitsi-meet/jvb-serve + value: "false" + vtype: boolean + - name: jitsi-meet-prosody + question: jitsi-meet-prosody/jvb-hostname + value: "{{ jitsi_meet_server_name }}" + vtype: string + - name: jitsi-videobridge + question: jitsi-videobridge/jvb-hostname + value: "{{ jitsi_meet_server_name }}" + vtype: string + - name: jitsi-meet-web-config + question: jitsi-meet/cert-choice + value: "{{ jitsi_meet_cert_choice }}" + vtype: select + - name: jitsi-meet-web-config + question: jitsi-meet/cert-path-key + value: "{{ jitsi_meet_ssl_key_path }}" + vtype: string + - name: jitsi-meet-web-config + question: jitsi-meet/cert-path-crt + value: "{{ jitsi_meet_ssl_cert_path }}" + vtype: string + +####################### +### Server firewall ### +# This role will automatically install configure ufw with jitsi-meet port holes. +# If you're managing a firewall elsewise, set this to false, and ufw will be skipped. +jitsi_meet_configure_firewall: true + +############## +### Jicofo ### # Default auth information, used in multiple service templates. jitsi_meet_jicofo_user: focus jitsi_meet_jicofo_port: 5347 - # The Jitsi components use the standard Java log levels, see: # https://docs.oracle.com/javase/7/docs/api/java/util/logging/Level.html # When using log aggregation for jitsi-meet components, set to "WARNING". jitsi_meet_jicofo_loglevel: INFO + +################### +### Videobridge ### # The default config file at /etc/jitsi/videobridge/config claims the default port # for JVB is "5275", but the manual install guide references "5347". # https://github.com/jitsi/jitsi-meet/blob/master/doc/manual-install.md jitsi_meet_videobridge_port: 5347 - jitsi_meet_videobridge_loglevel: INFO + +############ +### Meet ### +# Only "anonymous" auth is supported, which lets anyone use the videoconference server. +jitsi_meet_authentication: anonymous + # A recent privacy-friendly addition, see here for details: # https://github.com/jitsi/jitsi-meet/issues/422 # https://github.com/jitsi/jitsi-meet/pull/427 @@ -85,37 +162,17 @@ jitsi_meet_desktop_sharing_firefox_ext_id: 'null' jitsi_meet_desktop_sharing_firefox_disabled: 'false' jitsi_meet_desktop_sharing_firefox_max_version_ext_required: '-1' -# These debconf settings represent answers to interactive prompts during installation -# of the jitsi-meet deb package. If you use custom SSL certs, you may have to set more options. -jitsi_meet_debconf_settings: - - name: jitsi-meet - question: jitsi-meet/cert-choice - value: "{{ jitsi_meet_cert_choice }}" - vtype: string - - name: jitsi-meet - question: jitsi-meet/jvb-serve - value: "true" - vtype: boolean - - name: jitsi-meet-prosody - question: jitsi-meet-prosody/jvb-hostname - value: "{{ jitsi_meet_server_name }}" - vtype: string - - name: jitsi-videobridge - question: jitsi-videobridge/jvb-hostname - value: "{{ jitsi_meet_server_name }}" - vtype: string - -# Role will automatically install configure ufw with jitsi-meet port holes. -# If you're managing a firewall elsewise, set this to false, and ufw will be skipped. -jitsi_meet_configure_firewall: true - -# Role will automatically install nginx and configure a vhost for use with jitsi-meet. -# If you prefer to manage web vhosts via a separate role, set this to false. -jitsi_meet_configure_nginx: true - +################### +### SIP gateway ### +jitsi_meet_configure_sip_gateway: false +jitsi_meet_jigasi_account: sipnumber@sip-provider.name +jitsi_meet_jigasi_password: fdi49fndKjhe3 +jitsi_meet_jigasi_jicofo_sip_template: jicofo_sip-communicator.properties.j2 +jitsi_meet_jigasi_videobridge_sip_template: videobridge_sip-communicator.properties.j2 -# UI customization +######################## +### UI customization ### jitsi_meet_customize_the_ui: false jitsi_meet_lang: 'en' @@ -123,8 +180,16 @@ jitsi_meet_appname: 'My app name' jitsi_meet_org_link: 'https://link-to-my-organization.com' jitsi_meet_welcomepage_title: 'Secure, fully featured, and completely free video conferencing' jitsi_meet_welcomepage_description: 'Go ahead, video chat with the whole team. In fact, invite everyone you know. __app__ is a fully encrypted, 100% open source video conferencing solution that you can use all day, every day, for free — with no account needed.' -jitsi_meet_welcomepage_enterRoom: 'Start a new meeting' -jitsi_meet_welcomepage_recentListEmpty: 'Your recent list is currently empty. Chat with your team and you will find all your recent meetings here.' + +# By default it is an empty string because the CSS file is a bundled file for +# the entire site, and it change very frequently with each release. It will be +# replaced only if you have a custom CSS file and indicate its path in this variable +jitsi_meet_css_file: '' +jitsi_meet_welcome_page_additions_file: welcomePageAdditionalContent.html.j2 + +jitsi_meet_favicon_file: images/favicon.ico +jitsi_meet_logo_file: images/jitsilogo.png +jitsi_meet_watermark_file: images/watermark.png jitsi_meet_default_background: '#474747' jitsi_meet_disable_video_background: 'false' @@ -132,7 +197,3 @@ jitsi_meet_default_remote_display_name: 'Fellow Jitster' jitsi_meet_default_local_display_name: 'me' jitsi_meet_generate_roomnames_on_welcome_page: 'true' jitsi_meet_lang_detection: 'false' # Allow i18n to detect the system language - -jitsi_meet_favicon_file: images/favicon.ico -jitsi_meet_logo_file: images/jitsilogo.png -jitsi_meet_watermark_file: images/watermark.png diff --git a/examples/use-letsencrypt-certs.yml b/examples/use-letsencrypt-certs.yml deleted file mode 100644 index eb8c648..0000000 --- a/examples/use-letsencrypt-certs.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -- name: Configure jitsi-meet server. - hosts: jitsi - vars: - # Change this to match the DNS entry for your host IP. - jitsi_meet_server_name: meet.example.com - roles: - - role: thefinn93.letsencrypt - become: yes - letsencrypt_email: "webmaster@{{ jitsi_meet_server_name }}" - letsencrypt_cert_domains: - - "{{ jitsi_meet_server_name }}" - tags: letsencrypt - - - role: ansible-role-jitsi-meet - jitsi_meet_ssl_cert_path: "/etc/letsencrypt/live/{{ jitsi_meet_server_name }}/fullchain.pem" - jitsi_meet_ssl_key_path: "/etc/letsencrypt/live/{{ jitsi_meet_server_name }}/privkey.pem" - become: yes - tags: jitsi diff --git a/handlers/main.yml b/handlers/main.yml index 109d95e..dd4bf99 100644 --- a/handlers/main.yml +++ b/handlers/main.yml @@ -1,49 +1,25 @@ --- -# handlers file for jitsi-meet -- name: stop nginx - listen: "restart nginx" - service: - name: nginx - state: stopped -- name: stop prosody - listen: "restart prosody" +- name: restart jitsi-videobridge service: - name: prosody - state: stopped + name: jitsi-videobridge2 + state: restarted -- name: stop jicofo - listen: "restart jicofo" +- name: restart jicofo service: name: jicofo - state: stopped - -- name: stop jitsi-videobridge - listen: "restart jitsi-videobridge" - service: - name: jitsi-videobridge - state: stopped - -- name: start nginx service - listen: "restart nginx" - service: - name: nginx - state: started + state: restarted -- name: start prosody service - listen: "restart prosody" +- name: restart prosody service: name: prosody state: restarted -- name: start jicofo service - listen: "restart jicofo" +- name: restart nginx service: - name: jicofo - state: started + name: nginx + state: restarted -- name: start jitsi-videobridge serevice - listen: "restart jitsi-videobridge" - service: - name: jitsi-videobridge - state: started +- name: reload systemctl + systemd: + daemon_reload: yes \ No newline at end of file diff --git a/meta/main.yml b/meta/main.yml index 14227e8..5a2c83d 100644 --- a/meta/main.yml +++ b/meta/main.yml @@ -16,6 +16,10 @@ galaxy_info: versions: - jessie - stretch + - buster + - name: Ubuntu + versions: + - bionic galaxy_tags: - system - webconference diff --git a/requirements.yml b/requirements.yml deleted file mode 100644 index b9da91a..0000000 --- a/requirements.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -- src: https://github.com/thefinn93/ansible-letsencrypt - name: thefinn93.letsencrypt \ No newline at end of file diff --git a/tasks/browser_extensions.yml b/tasks/browser_extensions.yml index 962ae7e..fcb57a1 100644 --- a/tasks/browser_extensions.yml +++ b/tasks/browser_extensions.yml @@ -1,5 +1,7 @@ --- + - name: Copy Chrome web browser extension. + # Build your own with https://github.com/jitsi/jidesha copy: src: "{{ jitsi_meet_desktop_sharing_chrome_extension_filename }}" dest: "/usr/share/jitsi-meet/{{ jitsi_meet_desktop_sharing_chrome_extension_filename | basename }}" diff --git a/tasks/clean_up_default_configs.yml b/tasks/clean_up_default_configs.yml index 57c125e..d7d20bb 100644 --- a/tasks/clean_up_default_configs.yml +++ b/tasks/clean_up_default_configs.yml @@ -1,4 +1,5 @@ --- + - name: Remove default localhost Jitsi Meet config file. file: path: /etc/jitsi/meet/localhost-config.js diff --git a/tasks/dynamic_vars.yml b/tasks/dynamic_vars.yml index 8ca8c01..7a19df9 100644 --- a/tasks/dynamic_vars.yml +++ b/tasks/dynamic_vars.yml @@ -1,4 +1,5 @@ --- + - name: Read Jitsi Videobridge secret var. command: > perl -lane '/^JVB_SECRET=(.*)$/ && print $1' @@ -26,7 +27,7 @@ failed_when: jitsi_meet_jicofo_secret_result.rc != 0 or not jitsi_meet_jicofo_secret_result.stdout -- name: Set fact for Jitsi Videobridge secret var. +- name: Set fact for Jicofo secret var. set_fact: jitsi_meet_jicofo_secret: "{{ jitsi_meet_jicofo_secret_result.stdout }}" # Permit custom secrets in the template; only set the var if no custom secret is declared. @@ -43,7 +44,7 @@ failed_when: jitsi_meet_jicofo_password_result.rc != 0 or not jitsi_meet_jicofo_password_result.stdout -- name: Set fact for Jitsi user auth password var. +- name: Set fact for Jicofo user auth password var. set_fact: jitsi_meet_jicofo_password: "{{ jitsi_meet_jicofo_password_result.stdout }}" # Permit custom secrets in the template; only set the var if no custom secret is declared. diff --git a/tasks/jicofo.yml b/tasks/jicofo.yml index a5dcaf6..9399ed9 100644 --- a/tasks/jicofo.yml +++ b/tasks/jicofo.yml @@ -1,4 +1,5 @@ --- + - name: Copy Jicofo config file. template: dest: /etc/jitsi/jicofo/config @@ -8,15 +9,6 @@ mode: "0644" notify: restart jicofo -- name: Copy Jitsi Videobridge config file. - template: - dest: /etc/jitsi/videobridge/config - src: videobridge_config.j2 - owner: root - group: root - mode: "0644" - notify: restart jitsi-videobridge - - name: Set Jicofo log level. lineinfile: dest: /etc/jitsi/jicofo/logging.properties diff --git a/tasks/jitsi_meet.yml b/tasks/jitsi_meet.yml index aed561d..3c9d91f 100644 --- a/tasks/jitsi_meet.yml +++ b/tasks/jitsi_meet.yml @@ -12,27 +12,3 @@ - restart jitsi-videobridge - restart jicofo - restart prosody - -- name: Set jitsi-videobridge log level. - lineinfile: - dest: /etc/jitsi/videobridge/logging.properties - regexp: '^\.level' - line: ".level={{ jitsi_meet_videobridge_loglevel }}" - state: present - notify: restart jitsi-videobridge - -- name: Create directory for SIP communicator settings. - file: - state: directory - # Hard-coding homedir path and username because they're configured via - # the jitsi-meet postinst scripts, so these values must match. - path: /usr/share/jitsi-videobridge/.sip-communicator - owner: jvb - notify: restart jitsi-videobridge - -- name: Write SIP communicator settings. - copy: - dest: /usr/share/jitsi-videobridge/.sip-communicator/sip-communicator.properties - content: "org.jitsi.impl.neomedia.transform.srtp.SRTPCryptoContext.checkReplay=false" - owner: jvb - notify: restart jitsi-videobridge diff --git a/tasks/main.yml b/tasks/main.yml index 4a1fc9b..46ec320 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -1,31 +1,36 @@ --- + - include: packages.yml # Read Jitsi Meet config files and extract secrets for use in template configs. # Import to run these tasks after package installation, but before config tasks. - include: dynamic_vars.yml -- include: prosody.yml - - include: jitsi_meet.yml - include: jicofo.yml -- include: nginx.yml - when: jitsi_meet_configure_nginx +- include: sip_gateway.yml + when: jitsi_meet_configure_sip_gateway | bool -- include: clean_up_default_configs.yml - when: (jitsi_meet_ssl_cert_path and - jitsi_meet_ssl_key_path) or - not jitsi_meet_configure_nginx +- include: videobridge.yml +- include: nginx.yml + when: jitsi_meet_configure_nginx | bool - include: ufw.yml - when: jitsi_meet_configure_firewall + when: jitsi_meet_configure_firewall | bool + +- include: clean_up_default_configs.yml + when: jitsi_meet_server_name != 'localhost' + + # Official recommended tweaks +- include: systemd.yml - include: ui_customization.yml - when: jitsi_meet_customize_the_ui + when: jitsi_meet_customize_the_ui | bool # Placing the browser extensions last so the associated debugging tasks # that display URLs are visible near the end of the play. + # Build your own with https://github.com/jitsi/jidesha - include: browser_extensions.yml \ No newline at end of file diff --git a/tasks/nginx.yml b/tasks/nginx.yml index 2bdbcd8..d188b2c 100644 --- a/tasks/nginx.yml +++ b/tasks/nginx.yml @@ -1,4 +1,5 @@ --- + - name: Copy Nginx config for Jitsi Meet domain. template: dest: "/etc/nginx/sites-available/{{ jitsi_meet_server_name }}.conf" diff --git a/tasks/packages.yml b/tasks/packages.yml index 74e3775..41667b2 100644 --- a/tasks/packages.yml +++ b/tasks/packages.yml @@ -1,4 +1,5 @@ --- + - name: Install base apt packages. apt: name: "{{ jitsi_meet_base_packages }}" @@ -6,12 +7,6 @@ update_cache: yes cache_valid_time: 3600 -- name: Install Nginx if it was indicated. - apt: - name: nginx - state: latest - when: jitsi_meet_configure_nginx - # Prior versions of the role were writing to this file, let's # clean it up and use a generalized filename for configuring the apt repo, # regardless of whether stable or unstable is used. @@ -37,6 +32,7 @@ state: "{{ 'present' if jitsi_strategy == item.key else 'absent' }}" # Ansible will automatically add the ".list" suffix. filename: /etc/apt/sources.list.d/jitsi_meet + update_cache: yes with_dict: "{{ jitsi_meet_apt_repos }}" - name: Set debconf options for jitsi-meet. @@ -50,6 +46,5 @@ - name: Install Jitsi Meet apt: name: jitsi-meet - state: latest - update_cache: yes - cache_valid_time: 3600 \ No newline at end of file + state: present + install_recommends: "{{ jitsi_meet_install_recommends }}" diff --git a/tasks/prosody.yml b/tasks/prosody.yml deleted file mode 100644 index c43d289..0000000 --- a/tasks/prosody.yml +++ /dev/null @@ -1,41 +0,0 @@ ---- -- name: Copy Prosody config template. - template: - src: prosody_config.j2 - dest: "/etc/prosody/conf.avail/{{ jitsi_meet_server_name }}.cfg.lua" - owner: root - group: root - mode: "0644" - # Simply syntax check for validation, doesn't catch config errors. - validate: "luac -p %s" - notify: restart prosody - -- name: Symlink Prosody config by domain name. - file: - path: "/etc/prosody/conf.d/{{ jitsi_meet_server_name }}.cfg.lua" - state: link - src: "/etc/prosody/conf.avail/{{ jitsi_meet_server_name }}.cfg.lua" - notify: restart prosody - -- name: Register jicofo agent with Prosody service. - command: > - prosodyctl register focus auth.{{ jitsi_meet_server_name }} {{ jitsi_meet_jicofo_password }} - args: - # Yes, prosody actually URL-escapes the directory name for some reason. - # Must hardcode the escaping in the prefix, since the replace filter only - # applies to the server name var, not the concatenated string. - creates: /var/lib/prosody/{{ 'auth%2e'+jitsi_meet_server_name | replace('.', '%2e') }}/accounts/focus.dat - notify: - - restart jicofo - - restart prosody - -- name: Generate SSL keypair for Prosody service. - shell: | - set -o pipefail - yes '' | prosodyctl cert generate {{ jitsi_meet_server_name }} - args: - creates: /var/lib/prosody/{{ jitsi_meet_server_name }}.crt - executable: /bin/bash - notify: - - restart jicofo - - restart prosody diff --git a/tasks/sip_gateway.yml b/tasks/sip_gateway.yml new file mode 100644 index 0000000..ebc267b --- /dev/null +++ b/tasks/sip_gateway.yml @@ -0,0 +1,37 @@ +--- + +- name: Install jigasi + apt: + name: jigasi + state: present + +- name: Set debconf options for jigasi + debconf: + name: "{{ item.name }}" + question: "{{ item.question }}" + value: "{{ item.value }}" + vtype: "{{ item.vtype }}" + with_items: + - name: jigasi + question: jigasi/sip-account + value: "{{ jitsi_meet_jigasi_account }}" + vtype: string + - name: jigasi + question: jigasi/sip-password + value: "{{ jitsi_meet_jigasi_password }}" + vtype: string + +- name: jicofo sip-communicator properties + become: yes + template: + src: "{{ jitsi_meet_jigasi_jicofo_sip_template }}" + dest: /etc/jitsi/jicofo/sip-communicator.properties + mode: 0644 + notify: restart jicofo + +- name: Add videobridge sip-communicator config + template: + src: "{{ jitsi_meet_jigasi_videobridge_sip_template }}" + dest: /etc/jitsi/videobridge/sip-communicator.properties + mode: 0644 + notify: restart jitsi-videobridge \ No newline at end of file diff --git a/tasks/systemd.yml b/tasks/systemd.yml new file mode 100644 index 0000000..520425f --- /dev/null +++ b/tasks/systemd.yml @@ -0,0 +1,22 @@ +--- + +- name: set DefaultLimitNPROC=65000 + replace: + path: /etc/systemd/system.conf + regexp: '#DefaultLimitNPROC=$' + replace: 'DefaultLimitNPROC=65000' + notify: reload systemctl + +- name: set DefaultTasksMax=65000 + replace: + path: /etc/systemd/system.conf + regexp: '#DefaultTasksMax=$' + replace: 'DefaultTasksMax=65000' + notify: reload systemctl + +- name: set DefaultLimitNOFILE=65000 + replace: + path: /etc/systemd/system.conf + regexp: '#DefaultLimitNOFILE=$' + replace: 'DefaultLimitNOFILE=65000' + notify: reload systemctl \ No newline at end of file diff --git a/tasks/ufw.yml b/tasks/ufw.yml index f0fb223..21f521e 100644 --- a/tasks/ufw.yml +++ b/tasks/ufw.yml @@ -1,4 +1,5 @@ --- + - name: Install ufw package. apt: name: ufw diff --git a/tasks/ui_customization.yml b/tasks/ui_customization.yml index 8f705a9..3f07c17 100644 --- a/tasks/ui_customization.yml +++ b/tasks/ui_customization.yml @@ -1,4 +1,5 @@ --- + - name: Application configuration file template: dest: "/usr/share/jitsi-meet/interface_config.js" @@ -7,10 +8,10 @@ group: root mode: "0644" notify: - - restart nginx - restart jitsi-videobridge - restart jicofo - restart prosody + - restart nginx - name: Title configuration file template: @@ -20,18 +21,22 @@ group: root mode: "0644" -- name: Customizing the welcome page from language files (Very improvable) - blockinfile: - path: "/usr/share/jitsi-meet/lang/main-{{ jitsi_meet_lang }}.json" - insertafter: '"welcomepage": {' - block: | - "title": "{{ jitsi_meet_welcomepage_title }}", - "appDescription": "{{ jitsi_meet_welcomepage_description }}", - "enterRoomTitle": "{{ jitsi_meet_welcomepage_enterRoom }}", - "recentListEmpty": "{{ jitsi_meet_welcomepage_recentListEmpty }}", - marker: '"_comment": "{mark} ANSIBLE MANAGED BLOCK",' - backup: yes - when: jitsi_meet_lang != 'en' # There is no language file for 'en'. Is directly used main.json +- name: Welcome Page Additions + template: + src: "{{ jitsi_meet_welcome_page_additions_file }}" + dest: /usr/share/jitsi-meet/static/welcomePageAdditionalContent.html + owner: root + group: root + mode: "0644" + +- name: Site CSS + template: + src: "{{ jitsi_meet_css_file }}" + dest: /usr/share/jitsi-meet/css/all.css + owner: root + group: root + mode: "0644" + when: jitsi_meet_css_file | length > 0 - name: Replace watermark for a customized one copy: diff --git a/tasks/videobridge.yml b/tasks/videobridge.yml new file mode 100644 index 0000000..51a0296 --- /dev/null +++ b/tasks/videobridge.yml @@ -0,0 +1,18 @@ +--- + +- name: Copy Jitsi Videobridge config file. + template: + src: videobridge_config.j2 + dest: /etc/jitsi/videobridge/config + owner: root + group: root + mode: "0644" + notify: restart jitsi-videobridge + +- name: Set jitsi-videobridge log level. + lineinfile: + dest: /etc/jitsi/videobridge/logging.properties + regexp: '^\.level' + line: ".level={{ jitsi_meet_videobridge_loglevel }}" + state: present + notify: restart jitsi-videobridge diff --git a/templates/all.css.j2 b/templates/all.css.j2 new file mode 100644 index 0000000..97be2ed --- /dev/null +++ b/templates/all.css.j2 @@ -0,0 +1,15 @@ +@charset "UTF-8";h1,h2,h4{line-height:1.25}blockquote,h6,q,small{color:#707070}.inlay-filmstrip-only__container,.inlay-filmstrip-only__content>.button-control,.inlay-filmstrip-only__icon{align-self:center}.iti-flag{height:15px;box-shadow:0 0 1px 0 #888;background-image:url(../images/flags.png);background-repeat:no-repeat;background-color:#DBDBDB;background-position:20px 0;width:20px}.iti-flag.be{width:18px}.iti-flag.ch{width:15px}.iti-flag.mc{width:19px}.iti-flag.ne{width:18px}.iti-flag.np{background-color:transparent;width:13px}.iti-flag.us-id,.iti-flag.us-nd{width:19px}.iti-flag.us-ri{width:16px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2 / 1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.iti-flag{background-image:url(../images/flags@2x.png);background-size:6812px 15px}}.iti-flag.ac{height:10px;background-position:0 0}.iti-flag.ad{height:14px;background-position:-22px 0}.iti-flag.ae{height:10px;background-position:-44px 0}.iti-flag.af{height:14px;background-position:-66px 0}.iti-flag.ag{height:14px;background-position:-88px 0}.iti-flag.ai{height:10px;background-position:-110px 0}.iti-flag.al{height:15px;background-position:-132px 0}.iti-flag.am{height:10px;background-position:-154px 0}.iti-flag.ao{height:14px;background-position:-176px 0}.iti-flag.aq{height:14px;background-position:-198px 0}.iti-flag.ar{height:13px;background-position:-220px 0}.iti-flag.as{height:10px;background-position:-242px 0}.iti-flag.at{height:14px;background-position:-264px 0}.iti-flag.au{height:10px;background-position:-286px 0}.iti-flag.aw{height:14px;background-position:-308px 0}.iti-flag.ax{height:13px;background-position:-330px 0}.iti-flag.az{height:10px;background-position:-352px 0}.iti-flag.ba{height:10px;background-position:-374px 0}.iti-flag.bb{height:14px;background-position:-396px 0}.iti-flag.bd{height:12px;background-position:-418px 0}.iti-flag.be{height:15px;background-position:-440px 0}.iti-flag.bf{height:14px;background-position:-460px 0}.iti-flag.bg{height:12px;background-position:-482px 0}.iti-flag.bh{height:12px;background-position:-504px 0}.iti-flag.bi{height:12px;background-position:-526px 0}.iti-flag.bj{height:14px;background-position:-548px 0}.iti-flag.bl{height:14px;background-position:-570px 0}.iti-flag.bm{height:10px;background-position:-592px 0}.iti-flag.bn{height:10px;background-position:-614px 0}.iti-flag.bo{height:14px;background-position:-636px 0}.iti-flag.bq{height:14px;background-position:-658px 0}.iti-flag.br{height:14px;background-position:-680px 0}.iti-flag.bs{height:10px;background-position:-702px 0}.iti-flag.bt{height:14px;background-position:-724px 0}.iti-flag.bv{height:15px;background-position:-746px 0}.iti-flag.bw{height:14px;background-position:-768px 0}.iti-flag.by{height:10px;background-position:-790px 0}.iti-flag.bz{height:14px;background-position:-812px 0}.iti-flag.ca{height:10px;background-position:-834px 0}.iti-flag.cc{height:10px;background-position:-856px 0}.iti-flag.cd{height:15px;background-position:-878px 0}.iti-flag.cf{height:14px;background-position:-900px 0}.iti-flag.cg{height:14px;background-position:-922px 0}.iti-flag.ch{height:15px;background-position:-944px 0}.iti-flag.ci{height:14px;background-position:-961px 0}.iti-flag.ck{height:10px;background-position:-983px 0}.iti-flag.cl{height:14px;background-position:-1005px 0}.iti-flag.cm{height:14px;background-position:-1027px 0}.iti-flag.cn{height:14px;background-position:-1049px 0}.iti-flag.co{height:14px;background-position:-1071px 0}.iti-flag.cp{height:14px;background-position:-1093px 0}.iti-flag.cr{height:12px;background-position:-1115px 0}.iti-flag.cu{height:10px;background-position:-1137px 0}.iti-flag.cv{height:12px;background-position:-1159px 0}.iti-flag.cw{height:14px;background-position:-1181px 0}.iti-flag.cx{height:10px;background-position:-1203px 0}.iti-flag.cy{height:13px;background-position:-1225px 0}.iti-flag.cz{height:14px;background-position:-1247px 0}.iti-flag.de{height:12px;background-position:-1269px 0}.iti-flag.dg{height:10px;background-position:-1291px 0}.iti-flag.dj{height:14px;background-position:-1313px 0}.iti-flag.dk{height:15px;background-position:-1335px 0}.iti-flag.dm{height:10px;background-position:-1357px 0}.iti-flag.do{height:13px;background-position:-1379px 0}.iti-flag.dz{height:14px;background-position:-1401px 0}.iti-flag.ea{height:14px;background-position:-1423px 0}.iti-flag.ec{height:14px;background-position:-1445px 0}.iti-flag.ee{height:13px;background-position:-1467px 0}.iti-flag.eg{height:14px;background-position:-1489px 0}.iti-flag.eh{height:10px;background-position:-1511px 0}.iti-flag.er{height:10px;background-position:-1533px 0}.iti-flag.es{height:14px;background-position:-1555px 0}.iti-flag.et{height:10px;background-position:-1577px 0}.iti-flag.eu{height:14px;background-position:-1599px 0}.iti-flag.fi{height:12px;background-position:-1621px 0}.iti-flag.fj{height:10px;background-position:-1643px 0}.iti-flag.fk{height:10px;background-position:-1665px 0}.iti-flag.fm{height:11px;background-position:-1687px 0}.iti-flag.fo{height:15px;background-position:-1709px 0}.iti-flag.fr{height:14px;background-position:-1731px 0}.iti-flag.ga{height:15px;background-position:-1753px 0}.iti-flag.gb-eng{height:12px;background-position:-1775px 0}.iti-flag.gb-nir{height:10px;background-position:-1797px 0}.iti-flag.gb-sct{height:12px;background-position:-1819px 0}.iti-flag.gb-wls{height:14px;background-position:-1841px 0}.iti-flag.gb{height:10px;background-position:-1863px 0}.iti-flag.gd{height:12px;background-position:-1885px 0}.iti-flag.ge{height:14px;background-position:-1907px 0}.iti-flag.gf{height:14px;background-position:-1929px 0}.iti-flag.gg{height:14px;background-position:-1951px 0}.iti-flag.gh{height:14px;background-position:-1973px 0}.iti-flag.gi{height:10px;background-position:-1995px 0}.iti-flag.gl{height:14px;background-position:-2017px 0}.iti-flag.gm{height:14px;background-position:-2039px 0}.iti-flag.gn{height:14px;background-position:-2061px 0}.iti-flag.gp{height:14px;background-position:-2083px 0}.iti-flag.gq{height:14px;background-position:-2105px 0}.iti-flag.gr{height:14px;background-position:-2127px 0}.iti-flag.gs{height:10px;background-position:-2149px 0}.iti-flag.gt{height:13px;background-position:-2171px 0}.iti-flag.gu{height:11px;background-position:-2193px 0}.iti-flag.gw{height:10px;background-position:-2215px 0}.iti-flag.gy{height:12px;background-position:-2237px 0}.iti-flag.hk{height:14px;background-position:-2259px 0}.iti-flag.hm{height:10px;background-position:-2281px 0}.iti-flag.hn{height:10px;background-position:-2303px 0}.iti-flag.hr{height:10px;background-position:-2325px 0}.iti-flag.ht{height:12px;background-position:-2347px 0}.iti-flag.hu{height:10px;background-position:-2369px 0}.iti-flag.ic{height:14px;background-position:-2391px 0}.iti-flag.id{height:14px;background-position:-2413px 0}.iti-flag.ie{height:10px;background-position:-2435px 0}.iti-flag.il{height:15px;background-position:-2457px 0}.iti-flag.im{height:10px;background-position:-2479px 0}.iti-flag.in{height:14px;background-position:-2501px 0}.iti-flag.io{height:10px;background-position:-2523px 0}.iti-flag.iq{height:14px;background-position:-2545px 0}.iti-flag.ir{height:12px;background-position:-2567px 0}.iti-flag.is{height:15px;background-position:-2589px 0}.iti-flag.it{height:14px;background-position:-2611px 0}.iti-flag.je{height:12px;background-position:-2633px 0}.iti-flag.jm{height:10px;background-position:-2655px 0}.iti-flag.jo{height:10px;background-position:-2677px 0}.iti-flag.jp{height:14px;background-position:-2699px 0}.iti-flag.ke{height:14px;background-position:-2721px 0}.iti-flag.kg{height:12px;background-position:-2743px 0}.iti-flag.kh{height:13px;background-position:-2765px 0}.iti-flag.ki{height:10px;background-position:-2787px 0}.iti-flag.km{height:12px;background-position:-2809px 0}.iti-flag.kn{height:14px;background-position:-2831px 0}.iti-flag.kp{height:10px;background-position:-2853px 0}.iti-flag.kr{height:14px;background-position:-2875px 0}.iti-flag.kw{height:10px;background-position:-2897px 0}.iti-flag.ky{height:10px;background-position:-2919px 0}.iti-flag.kz{height:10px;background-position:-2941px 0}.iti-flag.la{height:14px;background-position:-2963px 0}.iti-flag.lb{height:14px;background-position:-2985px 0}.iti-flag.lc{height:10px;background-position:-3007px 0}.iti-flag.li{height:12px;background-position:-3029px 0}.iti-flag.lk{height:10px;background-position:-3051px 0}.iti-flag.lr{height:11px;background-position:-3073px 0}.iti-flag.ls{height:14px;background-position:-3095px 0}.iti-flag.lt{height:12px;background-position:-3117px 0}.iti-flag.lu{height:12px;background-position:-3139px 0}.iti-flag.lv{height:10px;background-position:-3161px 0}.iti-flag.ly{height:10px;background-position:-3183px 0}.iti-flag.ma{height:14px;background-position:-3205px 0}.iti-flag.mc{height:15px;background-position:-3227px 0}.iti-flag.md{height:10px;background-position:-3248px 0}.iti-flag.me{height:10px;background-position:-3270px 0}.iti-flag.mf{height:14px;background-position:-3292px 0}.iti-flag.mg{height:14px;background-position:-3314px 0}.iti-flag.mh{height:11px;background-position:-3336px 0}.iti-flag.mk{height:10px;background-position:-3358px 0}.iti-flag.ml{height:14px;background-position:-3380px 0}.iti-flag.mm{height:14px;background-position:-3402px 0}.iti-flag.mn{height:10px;background-position:-3424px 0}.iti-flag.mo{height:14px;background-position:-3446px 0}.iti-flag.mp{height:10px;background-position:-3468px 0}.iti-flag.mq{height:14px;background-position:-3490px 0}.iti-flag.mr{height:14px;background-position:-3512px 0}.iti-flag.ms{height:10px;background-position:-3534px 0}.iti-flag.mt{height:14px;background-position:-3556px 0}.iti-flag.mu{height:14px;background-position:-3578px 0}.iti-flag.mv{height:14px;background-position:-3600px 0}.iti-flag.mw{height:14px;background-position:-3622px 0}.iti-flag.mx{height:12px;background-position:-3644px 0}.iti-flag.my{height:10px;background-position:-3666px 0}.iti-flag.mz{height:14px;background-position:-3688px 0}.iti-flag.na{height:14px;background-position:-3710px 0}.iti-flag.nc{height:10px;background-position:-3732px 0}.iti-flag.ne{height:15px;background-position:-3754px 0}.iti-flag.nf{height:10px;background-position:-3774px 0}.iti-flag.ng{height:10px;background-position:-3796px 0}.iti-flag.ni{height:12px;background-position:-3818px 0}.iti-flag.nl{height:14px;background-position:-3840px 0}.iti-flag.no{height:15px;background-position:-3862px 0}.iti-flag.np{height:15px;background-position:-3884px 0}.iti-flag.nr{height:10px;background-position:-3899px 0}.iti-flag.nu{height:10px;background-position:-3921px 0}.iti-flag.nz{height:10px;background-position:-3943px 0}.iti-flag.om{height:10px;background-position:-3965px 0}.iti-flag.pa{height:14px;background-position:-3987px 0}.iti-flag.pe{height:14px;background-position:-4009px 0}.iti-flag.pf{height:14px;background-position:-4031px 0}.iti-flag.pg{height:15px;background-position:-4053px 0}.iti-flag.ph{height:10px;background-position:-4075px 0}.iti-flag.pk{height:14px;background-position:-4097px 0}.iti-flag.pl{height:13px;background-position:-4119px 0}.iti-flag.pm{height:14px;background-position:-4141px 0}.iti-flag.pn{height:10px;background-position:-4163px 0}.iti-flag.pr{height:14px;background-position:-4185px 0}.iti-flag.ps{height:10px;background-position:-4207px 0}.iti-flag.pt{height:14px;background-position:-4229px 0}.iti-flag.pw{height:13px;background-position:-4251px 0}.iti-flag.py{height:11px;background-position:-4273px 0}.iti-flag.qa{height:8px;background-position:-4295px 0}.iti-flag.re{height:14px;background-position:-4317px 0}.iti-flag.ro{height:14px;background-position:-4339px 0}.iti-flag.rs{height:14px;background-position:-4361px 0}.iti-flag.ru{height:14px;background-position:-4383px 0}.iti-flag.rw{height:14px;background-position:-4405px 0}.iti-flag.sa{height:14px;background-position:-4427px 0}.iti-flag.sb{height:10px;background-position:-4449px 0}.iti-flag.sc{height:10px;background-position:-4471px 0}.iti-flag.sd{height:10px;background-position:-4493px 0}.iti-flag.se{height:13px;background-position:-4515px 0}.iti-flag.sg{height:14px;background-position:-4537px 0}.iti-flag.sh{height:10px;background-position:-4559px 0}.iti-flag.si{height:10px;background-position:-4581px 0}.iti-flag.sj{height:15px;background-position:-4603px 0}.iti-flag.sk{height:14px;background-position:-4625px 0}.iti-flag.sl{height:14px;background-position:-4647px 0}.iti-flag.sm{height:15px;background-position:-4669px 0}.iti-flag.sn{height:14px;background-position:-4691px 0}.iti-flag.so{height:14px;background-position:-4713px 0}.iti-flag.sr{height:14px;background-position:-4735px 0}.iti-flag.ss{height:10px;background-position:-4757px 0}.iti-flag.st{height:10px;background-position:-4779px 0}.iti-flag.sv{height:12px;background-position:-4801px 0}.iti-flag.sx{height:14px;background-position:-4823px 0}.iti-flag.sy{height:14px;background-position:-4845px 0}.iti-flag.sz{height:14px;background-position:-4867px 0}.iti-flag.ta{height:10px;background-position:-4889px 0}.iti-flag.tc{height:10px;background-position:-4911px 0}.iti-flag.td{height:14px;background-position:-4933px 0}.iti-flag.tf{height:14px;background-position:-4955px 0}.iti-flag.tg{height:13px;background-position:-4977px 0}.iti-flag.th{height:14px;background-position:-4999px 0}.iti-flag.tj{height:10px;background-position:-5021px 0}.iti-flag.tk{height:10px;background-position:-5043px 0}.iti-flag.tl{height:10px;background-position:-5065px 0}.iti-flag.tm{height:14px;background-position:-5087px 0}.iti-flag.tn{height:14px;background-position:-5109px 0}.iti-flag.to{height:10px;background-position:-5131px 0}.iti-flag.tr{height:14px;background-position:-5153px 0}.iti-flag.tt{height:12px;background-position:-5175px 0}.iti-flag.tv{height:10px;background-position:-5197px 0}.iti-flag.tw{height:14px;background-position:-5219px 0}.iti-flag.tz{height:14px;background-position:-5241px 0}.iti-flag.ua{height:14px;background-position:-5263px 0}.iti-flag.ug{height:14px;background-position:-5285px 0}.iti-flag.um{height:11px;background-position:-5307px 0}.iti-flag.us-ak{height:14px;background-position:-5329px 0}.iti-flag.us-al{height:14px;background-position:-5351px 0}.iti-flag.us-ar{height:14px;background-position:-5373px 0}.iti-flag.us-az{height:14px;background-position:-5395px 0}.iti-flag.us-ca{height:14px;background-position:-5417px 0}.iti-flag.us-co{height:14px;background-position:-5439px 0}.iti-flag.us-ct{height:15px;background-position:-5461px 0}.iti-flag.us-de{height:14px;background-position:-5483px 0}.iti-flag.us-fl{height:14px;background-position:-5505px 0}.iti-flag.us-ga{height:14px;background-position:-5527px 0}.iti-flag.us-hi{height:10px;background-position:-5549px 0}.iti-flag.us-ia{height:14px;background-position:-5571px 0}.iti-flag.us-id{height:15px;background-position:-5593px 0}.iti-flag.us-il{height:12px;background-position:-5614px 0}.iti-flag.us-in{height:14px;background-position:-5636px 0}.iti-flag.us-ks{height:12px;background-position:-5658px 0}.iti-flag.us-ky{height:11px;background-position:-5680px 0}.iti-flag.us-la{height:13px;background-position:-5702px 0}.iti-flag.us-ma{height:12px;background-position:-5724px 0}.iti-flag.us-md{height:14px;background-position:-5746px 0}.iti-flag.us-me{height:14px;background-position:-5768px 0}.iti-flag.us-mi{height:14px;background-position:-5790px 0}.iti-flag.us-mn{height:13px;background-position:-5812px 0}.iti-flag.us-mo{height:12px;background-position:-5834px 0}.iti-flag.us-ms{height:14px;background-position:-5856px 0}.iti-flag.us-mt{height:14px;background-position:-5878px 0}.iti-flag.us-nc{height:14px;background-position:-5900px 0}.iti-flag.us-nd{height:15px;background-position:-5922px 0}.iti-flag.us-ne{height:12px;background-position:-5943px 0}.iti-flag.us-nh{height:14px;background-position:-5965px 0}.iti-flag.us-nj{height:14px;background-position:-5987px 0}.iti-flag.us-nm{height:14px;background-position:-6009px 0}.iti-flag.us-nv{height:14px;background-position:-6031px 0}.iti-flag.us-ny{height:10px;background-position:-6053px 0}.iti-flag.us-oh{height:13px;background-position:-6075px 0}.iti-flag.us-ok{height:14px;background-position:-6097px 0}.iti-flag.us-or{height:12px;background-position:-6119px 0}.iti-flag.us-pa{height:14px;background-position:-6141px 0}.iti-flag.us-ri{height:15px;background-position:-6163px 0}.iti-flag.us-sc{height:14px;background-position:-6181px 0}.iti-flag.us-sd{height:13px;background-position:-6203px 0}.iti-flag.us-tn{height:12px;background-position:-6225px 0}.iti-flag.us-tx{height:14px;background-position:-6247px 0}.iti-flag.us-ut{height:12px;background-position:-6269px 0}.iti-flag.us-va{height:14px;background-position:-6291px 0}.iti-flag.us-vt{height:12px;background-position:-6313px 0}.iti-flag.us-wa{height:12px;background-position:-6335px 0}.iti-flag.us-wi{height:14px;background-position:-6357px 0}.iti-flag.us-wv{height:11px;background-position:-6379px 0}.iti-flag.us-wy{height:14px;background-position:-6401px 0}.iti-flag.us{height:11px;background-position:-6423px 0}.iti-flag.uy{height:14px;background-position:-6445px 0}.iti-flag.uz{height:10px;background-position:-6467px 0}.iti-flag.va{width:15px;height:15px;background-position:-6489px 0}.iti-flag.vc{height:14px;background-position:-6506px 0}.iti-flag.ve{height:14px;background-position:-6528px 0}.iti-flag.vg{height:10px;background-position:-6550px 0}.iti-flag.vi{height:14px;background-position:-6572px 0}.iti-flag.vn{height:14px;background-position:-6594px 0}.iti-flag.vu{height:12px;background-position:-6616px 0}.iti-flag.wf{height:14px;background-position:-6638px 0}.iti-flag.ws{height:10px;background-position:-6660px 0}.iti-flag.xk{height:15px;background-position:-6682px 0}.iti-flag.ye{height:14px;background-position:-6704px 0}.iti-flag.yt{height:14px;background-position:-6726px 0}.iti-flag.za{height:14px;background-position:-6748px 0}.iti-flag.zm{height:14px;background-position:-6770px 0}.iti-flag.zw{height:10px;background-position:-6792px 0}body,html{width:100%;height:100%}body,div,fieldset,form,h1,h2,h3,h4,h5,h6,html,img,p,pre{margin:0;padding:0}fieldset,img{border:0}@-moz-document url-prefix(){img{font-size:0}img:-moz-broken{font-size:inherit}}details,main,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}input[type=button],input[type=submit],input[type=reset]{-webkit-appearance:button}[lang|=en]{font-family:Arial,sans-serif}[lang|=ja]{font-family:"Hiragino Kaku Gothic Pro","ヒラギノ角ゴ Pro W3","メイリオ",Meiryo,"MS Pゴシック",Verdana,Arial,sans-serif}blockquote,dl,h1,h2,h3,h4,h5,h6,ol,p,pre,ul{margin:10px 0 0}h1,h2,h3{font-weight:400;margin:30px 0 0;color:#333;text-transform:none}blockquote:first-child,dl:first-child,h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child,ol:first-child,p:first-child,pre:first-child,ul:first-child{margin-top:0}h1{font-size:32px}h2{font-size:24px}h3{font-size:20px;line-height:1.5}h4,h5,h6{font-weight:700;margin:20px 0 0}h4{font-size:16px;text-transform:none}h5{color:#333;font-size:14px;line-height:1.42857143;text-transform:none}body,h6,small{font-size:12px}h6{line-height:1.66666667;text-transform:uppercase}blockquote>cite,h1+h2,h2+h3,h3+h4,h4+h5,h5+h6{margin-top:10px}small{line-height:1.33333333333333}code,kbd{font-family:monospace}address,cite,dfn,var{font-style:italic}cite:before{content:"\2014 \2009"}blockquote{border-left:1px solid #ccc;margin-left:19px;padding:10px 20px}blockquote>cite{display:block}body,p{margin:0}q:before{content:open-quote}q:after{content:close-quote}abbr{border-bottom:1px #707070 dotted;cursor:help}.jitsi-icon.gray svg,.modal-dialog-form .cjJUnw,button,input[type=button],input[type=submit],input[type=reset],select{cursor:pointer}a{color:#3572b0;text-decoration:none}a:active,a:focus,a:hover{text-decoration:underline}.cjMOOK{bottom:calc(calc(40px + 24px))!important}.mIBKA:first-child{animation:cbfRuT 0s!important;-webkit-animation:cbfRuT 0s!important}.modal-dialog-form .cksvax[data-role=droplistContent]{border:1px solid #455166}.videocontainer .tOoji{background:0 0}.toolbox-button-wth-dialog .eYJELv{max-height:initial}*{-webkit-user-select:none;user-select:none}input,textarea{-webkit-user-select:text;user-select:text}body{line-height:1.42857142857143;font-weight:400;overflow:hidden;color:#F1F1F1;background:#474747}.filmstrip-only #react>.ckAJgx,body.filmstrip-only{background:0 0}.jitsi-icon svg{fill:#fff}.jitsi-icon.gray svg{fill:#5E6D7A}.always-on-top-toolbox .toolbox-button:nth-child(2) svg,.filmstrip-toolbox .toolbox-button:nth-child(1) svg{fill:#bf2117}body,button,input,keygen,select,textarea{font-family:-apple-system,BlinkMacSystemFont,open_sanslight,"Helvetica Neue",Helvetica,Arial,sans-serif!important}#nowebrtc{display:none}.watermark,button,form{display:block}button,input,select,textarea{margin:0;vertical-align:baseline;font-size:1em}textarea{word-wrap:break-word;line-height:1.5em}input[type=text],input[type=password],textarea{outline:0;resize:none}button{color:#FFF;background-color:#44A5FF;border-radius:4px}button.no-icon{padding:0 1em}.watermark{position:absolute;top:15;width:186px;height:74px;background-size:contain;background-repeat:no-repeat;z-index:2}.leftwatermark{left:32px;top:32px;background-image:url(../images/watermark.png);background-position:center left}.rightwatermark{right:32px;top:32px;background-position:center right}.poweredby{position:absolute;left:25;bottom:7;font-size:11pt;color:rgba(255,255,255,.5);text-decoration:none;z-index:100}.connected{color:#21B9FC;font-size:12px}.disconnected,.lastN{color:#a3a3a3;font-size:12px}.aui-blanket{background:#000;transition:opacity .2s,visibility .2s;transition-delay:.1s;visibility:visible}#inviteLinkRef{-webkit-user-select:text;user-select:text}::-webkit-scrollbar{background:0 0;width:7px;height:7px}::-webkit-scrollbar-button{display:none}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-track-piece{background:0 0}::-webkit-scrollbar-thumb{background:rgba(0,0,0,.5);border-radius:4px}.flip-x{transform:scaleX(-1)}.hidden{display:none}.hide{display:none!important}.invisible{visibility:hidden}.show{display:block!important}.show-inline{display:inline-block!important}.show-flex{display:-webkit-box!important;display:-moz-box!important;display:-ms-flexbox!important;display:-webkit-flex!important;display:flex!important}.overlay__container,.overlay__container-light{top:0;left:0;width:100%;height:100%;position:fixed;z-index:1016;background:#474747}.overlay__container-light.filmstrip-only,.overlay__container.filmstrip-only{background-color:rgba(0,0,0,.8)}.overlay__container-light{background-color:rgba(71,71,71,.7)}.overlay__container-light.filmstrip-only{background-color:rgba(0,0,0,.2)}.overlay__content{position:absolute;margin:0 auto;height:100%;width:56%;left:50%;-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);-webkit-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%)}.overlay__content.filmstrip-only{left:0;width:100%;-moz-transform:none;-ms-transform:none;-webkit-transform:none;-o-transform:none;transform:none}.overlay__content_bottom{position:absolute;bottom:0}.overlay__policy{position:absolute;bottom:24px;width:100%}.inlay{margin-top:14%;-webkit-border-radius:4px;border-radius:4px;padding:40px 38px 44px;color:#fff;background:#7a7a7a;text-align:center}.inlay__title{margin:17px 0;padding-bottom:17px;color:#fff!important;font-size:21px;letter-spacing:.3px;border-bottom:1px solid #fff}.inlay__text{color:#fff!important;display:block;margin-top:22px;font-size:16px}.inlay__icon{margin:0 10px;font-size:50px}.inlay-filmstrip-only{background-color:#fff;color:#474747;margin-left:20px;margin-right:20px;margin-top:20px;bottom:30px;position:absolute;display:flex;max-height:120px;height:80%;right:0;border-radius:4px;overflow:hidden}.inlay-filmstrip-only__content{padding:20px;display:flex;justify-content:center;position:relative}.inlay-filmstrip-only__content>#reloadProgressBar{position:absolute;left:0;bottom:0;margin-bottom:0;width:100%;border-radius:0}.inlay-filmstrip-only__title{font-size:18px;font-weight:600}.inlay-filmstrip-only__text{margin-top:10px;font-size:14px;font-weight:600}.inlay-filmstrip-only__icon{font-size:50px;color:#fff;opacity:.6}.inlay-filmstrip-only__icon-container{text-align:center;display:flex;justify-content:center;position:absolute;width:100%;height:100%;top:0}.inlay-filmstrip-only__avatar-container{height:100%;position:relative}.inlay-filmstrip-only__avatar-container>img{height:100%}.inlay-filmstrip-only__icon-background{background:#000;opacity:.6;position:absolute;width:100%;height:100%;top:0}.reload_overlay_title{display:block;font-size:16px;line-height:20px}.reload_overlay_text{display:block;font-size:12px;line-height:30px}#reloadProgressBar{background:#e9e9e9;border-radius:3px;height:5px;margin:5px auto;overflow:hidden;width:180px}#reloadProgressBar .progress-indicator-fill{background:#0074E0;height:100%;transition:width .5s}.always-on-top-toolbox,.filmstrip-toolbox{background-color:rgba(22,38,55,.8);border-radius:3px;display:flex;z-index:350}.always-on-top-toolbox .toolbox-icon,.filmstrip-toolbox .toolbox-icon{cursor:pointer;padding:7px}.always-on-top-toolbox .toolbox-icon.toggled,.filmstrip-toolbox .toolbox-icon.toggled{background:#0e1423}.always-on-top-toolbox .toolbox-icon.disabled,.filmstrip-toolbox .toolbox-icon.disabled{cursor:initial}.always-on-top-toolbox{flex-direction:row;left:50%;position:absolute;top:10px;transform:translateX(-50%)}.always-on-top-toolbox .toolbox-button:first-child .toolbox-icon{border-top-left-radius:3px;border-bottom-left-radius:3px}.always-on-top-toolbox .toolbox-button:last-child .toolbox-icon{border-top-right-radius:3px;border-bottom-right-radius:3px}.filmstrip-toolbox{flex-direction:column}.filmstrip-toolbox .toolbox-button .toolbox-icon{border-radius:3px}.desktop-picker-pane{height:320px;overflow-x:hidden;overflow-y:auto;width:100%}.desktop-picker-pane.source-type-screen .desktop-picker-source{margin-left:auto;margin-right:auto;width:50%}.desktop-picker-pane.source-type-screen .desktop-source-preview-thumbnail{width:100%}.desktop-picker-pane.source-type-screen .desktop-source-preview-label{display:none}.desktop-picker-pane.source-type-window .desktop-picker-source{display:inline-block;width:30%}.desktop-picker-pane-spinner{justify-content:center;display:flex;height:100%;align-items:center}.desktop-picker-source{margin-top:10px;text-align:center}.desktop-picker-source.is-selected .desktop-source-preview-image-container{background:rgba(255,255,255,.3);border-radius:4px}.desktop-source-preview-label{margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.desktop-source-preview-thumbnail{box-shadow:5px 5px 5px grey;height:auto;max-width:100%}.desktop-source-preview-image-container{padding:10px}.device-selection .device-selectors{font-size:14px}.device-selection .device-selectors>div{display:block;margin-bottom:4px}.device-selection .device-selectors .device-selector-icon{align-self:center;color:inherit;font-size:20px;margin-left:3px}.device-selection .device-selectors .device-selector-label{margin-bottom:1px}.device-selection .device-selectors .device-selector-trigger{background-color:#0E1624;border:1px solid #455166;border-radius:5px;display:flex;height:2.3em;justify-content:space-between;line-height:2.3em;overflow:hidden;padding:0 8px}.device-selection .device-selectors .device-selector-trigger-disabled .device-selector-trigger{color:#a5adba;cursor:default}.device-selection .device-selectors .device-selector-trigger-text{overflow:hidden;margin-left:8px;text-overflow:ellipsis;white-space:nowrap;width:100%}.device-selection .device-selection-column{box-sizing:border-box;display:inline-block;vertical-align:top}.device-selection .device-selection-column.column-selectors{margin-left:15px;width:45%}.device-selection .device-selection-column.column-video{width:50%}.device-selection .device-selection-video-container{border-radius:3px;margin-bottom:5px}.device-selection .device-selection-video-container .video-input-preview{margin-top:2px;position:relative}.device-selection .device-selection-video-container .video-input-preview>video{border-radius:3px}.device-selection .device-selection-video-container .video-input-preview .video-input-preview-error{color:#fff;display:none;left:0;position:absolute;right:0;text-align:center;top:50%}.device-selection .device-selection-video-container .video-input-preview.video-preview-has-error{background:#000}.device-selection .device-selection-video-container .video-input-preview.video-preview-has-error .video-input-preview-error{display:block}.device-selection .device-selection-video-container .video-input-preview .video-input-preview-display{height:auto;overflow:hidden;width:100%}.device-selection .audio-output-preview{font-size:14px}.device-selection .audio-output-preview a{color:#2684FF;cursor:pointer;text-decoration:none}.device-selection .audio-output-preview a:hover{color:#B3D4FF}.device-selection .audio-input-preview{background:#1B2638;border-radius:5px;height:8px}.device-selection .audio-input-preview .audio-input-preview-level{background:#4C9AFF;border-radius:5px;height:100%;-webkit-transition:width .1s ease-in-out;-moz-transition:width .1s ease-in-out;-o-transition:width .1s ease-in-out;transition:width .1s ease-in-out}.dialog{box-sizing:border-box;height:auto;min-height:131px;overflow:visible;visibility:visible;width:400px}.dialog h1,.dialog h2,.dialog h3,.dialog h4,.dialog h5,.dialog h6{color:#eceef1}.dialog .aui-dialog2-footer,.dialog .aui-dialog2-header{background-color:#253858;border:none}.dialog .aui-dialog2-header,.dialog .form-control:not(:last-child){border-bottom:1px solid #253858}.dialog .aui-dialog2-header{border-radius:5px 5px 0 0;box-sizing:border-box;color:#333;display:table;font-weight:400;height:4.83333em;margin-top:-69px;padding:0 20px;width:100%}.dialog .aui-dialog2-header h2{font-size:1.66667em;font-weight:400;color:#eceef1}.dialog .aui-dialog2-header-main{display:table-cell;padding-right:0;max-width:400px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.dialog .aui-dialog2-footer{border-top:1px solid #253858;border-radius:0 0 5px 5px;box-sizing:border-box;height:51px;overflow:hidden;padding:10px 20px;width:100%}.dialog .aui-dialog2-footer:empty{height:5px;padding:0}.dialog .aui-dialog2-content{background-color:#253858;box-sizing:border-box;color:#eceef1;font-size:1.16667em;overflow:auto;max-height:100%;padding:20px}.dialog .aui-dialog2-content h3,.dialog .aui-dialog2-content p,.dialog .aui-dialog2-content span{font-weight:400}.dialog .aui-dialog2-content:last-child{border-bottom-right-radius:5px;border-bottom-left-radius:5px}.dialog .aui-dialog2-content:first-child{border-top-right-radius:5px;border-top-left-radius:5px}.dialog .aui-hide{display:none}.dialog .input-control{background-color:#344563;color:#eceef1}@media all and (max-width:420px){.aui-dialog2-small .aui-dialog2-content{height:100%}}.modal-dialog-form{margin-top:5px!important}.modal-dialog-form .input-control{background:#fafbfc;border:1px solid #f4f5f7;color:inherit}.modal-dialog-form-error{margin-bottom:8px}.modal-dialog-footer{font-size:14px}.inline-dialog-error{margin-top:16px}.inline-dialog-error-text{color:#344563;margin-bottom:8px;text-align:center}.inline-dialog-error-button{display:block;margin:16px auto 0}@-webkit-keyframes shake-rotate{0%{-webkit-transform:scale(1) rotate(0);transform:scale(1) rotate(0)}50%{-webkit-transform:scale(.8) rotate(-5deg);transform:scale(.8) rotate(-5deg)}to{-webkit-transform:scale(1) rotate(3deg);transform:scale(1) rotate(3deg)}}@keyframes shake-rotate{0%{-webkit-transform:scale(1) rotate(0);transform:scale(1) rotate(0)}50%{-webkit-transform:scale(.8) rotate(-5deg);transform:scale(.8) rotate(-5deg)}to{-webkit-transform:scale(1) rotate(3deg);transform:scale(1) rotate(3deg)}}.shake-rotate{display:inline-block;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:shake-rotate;animation-name:shake-rotate;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.feedback-dialog .details textarea{min-height:100px}.feedback-dialog .input-control{background-color:#fff;color:#333}.feedback-dialog .input-control::-webkit-input-placeholder{color:#777}.feedback-dialog .input-control::-moz-placeholder{color:#777}.feedback-dialog .input-control:-ms-input-placeholder{color:#777}.feedback-dialog .rating{line-height:1.2;margin-top:10px;text-align:center}.feedback-dialog .rating .star-label{font-size:14px;height:16px}.feedback-dialog .rating .star-btn{color:inherit;cursor:pointer;display:inline-block;font-size:34px;outline:0;position:relative;text-decoration:none;-moz-transition:all .2s ease;-o-transition:all .2s ease;-webkit-transition:all .2s ease;transition:all .2s ease}.feedback-dialog .rating .star-btn.active,.feedback-dialog .rating .star-btn.starHover,.feedback-dialog .rating .star-btn:hover{color:#36B37E}.info-dialog{cursor:default;display:flex;font-size:14px}.info-dialog .info-dialog-action-link{display:inline-block;line-height:1.5em}.info-dialog .info-dialog-action-link a{cursor:pointer;vertical-align:middle}.info-dialog .info-dialog-action-link:before{color:#489afe;content:'\2022';font-size:1.5em;padding:0 10px;vertical-align:middle}.info-dialog .info-dialog-action-link:first-child:before{content:'';padding:0}.info-dialog .info-dialog-action-links{font-weight:700;margin-top:10px;white-space:nowrap}.info-dialog .info-dialog-action-separator{display:inline-block}.info-dialog .info-dialog-copy-element{opacity:0;pointer-events:none;position:absolute;-webkit-user-select:text;user-select:text}.info-dialog .info-dialog-dial-in .conference-id,.info-dialog .info-dialog-dial-in .phone-number,.info-dialog .info-password-local{user-select:text}.info-dialog .info-dialog-column{margin-right:10px;overflow:hidden}.info-dialog .info-dialog-column a,.info-dialog .info-dialog-column a:active,.info-dialog .info-dialog-column a:focus,.info-dialog .info-dialog-column a:hover{text-decoration:none}.info-dialog .info-dialog-conference-url,.info-dialog .info-dialog-live-stream-url{width:max-content;width:-moz-max-content;width:-webkit-max-content;word-break:break-all;max-width:400px;display:flex;align-items:center}.info-dialog .info-dialog-dial-in{word-break:break-all}.info-dialog .info-dialog-icon{color:#6453C0;font-size:16px;min-width:30px}.info-dialog .info-dialog-url-text,.info-dialog .info-dialog-url-text:hover{color:inherit;cursor:inherit}.info-dialog .info-dialog-url-icon{display:inline-block;margin-left:5px}.info-dialog .info-dialog-url-icon svg{cursor:pointer}.info-dialog .info-dialog-title{font-weight:700;margin-bottom:10px}.info-dialog .info-dialog-password,.info-dialog .info-password,.info-dialog .info-password-form{align-items:baseline;display:flex}.info-dialog .info-label{font-weight:700}.info-dialog .info-password-field{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.info-dialog .info-password-none,.info-dialog .info-password-remote{opacity:.5}.info-dialog .info-password-input{background-color:transparent;border:none;color:inherit;padding-left:0}.dial-in-numbers-list{margin-top:20px;font-size:12px;line-height:24px;border-collapse:collapse}.dial-in-numbers-list thead{text-align:left}.dial-in-numbers-list tr{border-bottom:1px solid #d1dbe8}.dial-in-numbers-list .flag-cell{vertical-align:top;width:30px}.dial-in-numbers-list .flag{display:block;margin:5px 5px 0}.dial-in-page,.settings-pane,.settings-pane .calendar-tab,.settings-pane .more-tab,.settings-pane .profile-edit{display:flex;width:100%}.dial-in-numbers-list .country{font-weight:700;vertical-align:top;padding:0 20px 0 0}.dial-in-numbers-list ul{padding:0}.dial-in-numbers-list .numbers-list{list-style:none;padding:0 20px 0 0}.dial-in-numbers-list .toll-free-list{font-weight:700;list-style:none;vertical-align:top}.dial-in-numbers-list li.toll-free:empty:before{content:'.';visibility:hidden}.dial-in-page{align-items:center;box-sizing:border-box;flex-direction:column;font-size:12px;max-height:100%;overflow:auto;padding:15pt;position:absolute;transform:translateY(-50%);top:50%}.dial-in-page .dial-in-conference-id{text-align:center;min-width:200px;margin-top:40px}.dial-in-page .dial-in-conference-name,.dial-in-page .dial-in-conference-pin{font-size:18px}.dial-in-page .dial-in-conference-description{margin:12px}.settings-pane .calendar-tab,.settings-pane .calendar-tab-sign-in,.settings-pane .device-selection{margin-top:20px}.dial-in-page *,.info-dialog *{user-select:text;-moz-user-select:text;-webkit-user-select:text}.dial-in-page .info-dialog-url-text-unselectable,.info-dialog .info-dialog-url-text-unselectable{user-select:none;-moz-user-select:none;-webkit-user-select:none}.settings-pane.profile-pane{flex-direction:column}.settings-pane .auth-name{margin-bottom:4px}.settings-pane .mock-atlaskit-label{color:#56637A;font-size:12px;font-weight:600;line-height:1.33;padding:20px 0 4px}.settings-pane .profile-edit-field,.settings-pane .settings-sub-pane{flex:1}.settings-pane .profile-edit-field{margin-right:20px}.settings-pane .language-settings{max-width:50%}.settings-pane .calendar-tab{align-items:center;flex-direction:column;font-size:14px;min-height:100px;text-align:center}#videoconference_page,#videospace{min-height:100%}.settings-pane .sign-out-cta{margin-bottom:20px}.speaker-stats{list-style:none;padding:0;width:100%;font-weight:500}.speaker-stats .speaker-stats-item__status-dot{position:relative;display:block;width:9px;height:9px;border-radius:50%;margin:0 auto}.speaker-stats .speaker-stats-item__status-dot.status-active{background:green}.speaker-stats .speaker-stats-item__status-dot.status-inactive{background:gray}.speaker-stats .status-user-left{color:#a7a7a7}.speaker-stats .speaker-stats-item__name,.speaker-stats .speaker-stats-item__status,.speaker-stats .speaker-stats-item__time{display:inline-block;margin:5px 0;vertical-align:middle}.speaker-stats .speaker-stats-item__status{width:5%}.speaker-stats .speaker-stats-item__name{width:40%}.speaker-stats .speaker-stats-item__time{width:55%}.speaker-stats .speaker-stats-item__name,.speaker-stats .speaker-stats-item__time{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.video-quality-dialog .hide-warning{height:0;visibility:hidden}.video-quality-dialog .video-quality-dialog-title{margin-bottom:10px}.video-quality-dialog .video-quality-dialog-contents{align-items:center;display:flex;flex-direction:column;padding:10px;min-width:250px}.video-quality-dialog .video-quality-dialog-contents .video-quality-dialog-slider-container{width:100%;text-align:center}.video-quality-dialog .video-quality-dialog-contents .video-quality-dialog-slider{width:calc(100% - 5px)}.video-quality-dialog .video-quality-dialog-contents .video-quality-dialog-slider::-ms-track{height:15px;border-radius:10px;background:#0e1624}.video-quality-dialog .video-quality-dialog-contents .video-quality-dialog-slider::-moz-range-track{height:15px;border-radius:10px;background:#0e1624}.video-quality-dialog .video-quality-dialog-contents .video-quality-dialog-slider::-webkit-slider-runnable-track{height:15px;border-radius:10px;background:#0e1624}.video-quality-dialog .video-quality-dialog-contents .video-quality-dialog-slider::-ms-thumb{top:50%;border:none;position:relative;opacity:0}.video-quality-dialog .video-quality-dialog-contents .video-quality-dialog-slider::-moz-range-thumb{top:50%;border:none;position:relative;opacity:0}.video-quality-dialog .video-quality-dialog-contents .video-quality-dialog-slider::-webkit-slider-thumb{top:50%;border:none;position:relative;opacity:0}.video-quality-dialog .video-quality-dialog-contents .video-quality-dialog-labels{box-sizing:border-box;display:flex;margin-top:5px;position:relative;width:90%}.video-quality-dialog .video-quality-dialog-contents .video-quality-dialog-label-container{position:absolute;text-align:center;transform:translate(-50%,0)}.video-quality-dialog .video-quality-dialog-contents .video-quality-dialog-label-container::before{content:'';border-radius:50%;left:0;height:6px;margin:0 auto;pointer-events:none;position:absolute;right:0;top:-16px;width:6px}.video-quality-dialog .video-quality-dialog-contents .video-quality-dialog-label-container.active{color:#4C9AFF}.video-quality-dialog .video-quality-dialog-contents .video-quality-dialog-label-container.active::before{background:#4C9AFF;height:12px;top:-19px;width:12px}.video-quality-dialog .video-quality-dialog-contents .video-quality-dialog-label-container:first-child{position:relative}.video-quality-dialog .video-quality-dialog-contents .video-quality-dialog-label{display:table-caption;word-spacing:unset}.video-quality-dialog.video-not-supported .video-quality-dialog-labels{color:gray}.video-quality-dialog.video-not-supported .video-quality-dialog-slider::-ms-track{background:rgba(14,22,36,.1)}.video-quality-dialog.video-not-supported .video-quality-dialog-slider::-moz-range-track{background:rgba(14,22,36,.1)}.video-quality-dialog.video-not-supported .video-quality-dialog-slider::-webkit-slider-runnable-track{background:rgba(14,22,36,.1)}.modal-dialog-form .video-quality-dialog-title{display:none}#videoResolutionLabel{z-index:4}.large-video-labels{display:flex;position:absolute;top:30px;right:30px;transition:right .5s;z-index:3}.large-video-labels .circular-label{color:#fff;font-weight:700;margin-left:8px;opacity:.8;background:#B8C7E0}.large-video-labels .circular-label.file,.large-video-labels .circular-label.local-rec{background:#FF5630}.large-video-labels .circular-label.stream{background:#0065FF}.large-video-labels .recording-label.center-message{background:rgba(0,0,0,.5);bottom:50%;display:block;left:50%;padding:10px;position:fixed;transform:translate(-50%,-50%);z-index:1010}.circular-label{background:rgba(0,0,0,.5);border-radius:50%;box-sizing:border-box;cursor:default;font-size:13px;height:40px;line-height:40px;text-align:center;min-width:40px}.localrec-participant-stats{list-style:none;padding:0;width:100%;font-weight:500}.localrec-participant-stats .localrec-participant-stats-item__status-dot{position:relative;display:block;width:9px;height:9px;border-radius:50%;margin:0 auto}.localrec-participant-stats .localrec-participant-stats-item__status-dot.status-on{background:green}.localrec-participant-stats .localrec-participant-stats-item__status-dot.status-off{background:gray}.localrec-participant-stats .localrec-participant-stats-item__status-dot.status-unknown{background:#b8860b}.localrec-participant-stats .localrec-participant-stats-item__status-dot.status-error{background:#8b0000}.localrec-participant-stats .localrec-participant-stats-item__name,.localrec-participant-stats .localrec-participant-stats-item__sessionid,.localrec-participant-stats .localrec-participant-stats-item__status{display:inline-block;margin:5px 0;vertical-align:middle}.localrec-participant-stats .localrec-participant-stats-item__status{width:5%}.localrec-participant-stats .localrec-participant-stats-item__name{width:40%}.localrec-participant-stats .localrec-participant-stats-item__sessionid{width:55%}.localrec-participant-stats .localrec-participant-stats-item__name,.localrec-participant-stats .localrec-participant-stats-item__sessionid{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.localrec-control-info-label{font-weight:700}.localrec-control-info-label:after{content:' '}.localrec-control-action-link{display:inline-block;line-height:1.5em}.localrec-control-action-link a{cursor:pointer;vertical-align:middle}.localrec-control-action-link:before{color:#489afe;content:'\2022';font-size:1.5em;padding:0 10px;vertical-align:middle}.localrec-control-action-link:first-child:before{content:'';padding:0}.localrec-control-action-links{font-weight:700;margin-top:10px;white-space:nowrap}#videospace{display:block;height:100%;width:100%;position:absolute;top:0;left:0;right:0;overflow:hidden}#largeVideoBackgroundContainer,.large-video-background{height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}#largeVideoBackgroundContainer #largeVideoBackground,.large-video-background #largeVideoBackground{min-height:100%;min-width:100%}#largeVideoBackgroundContainer{filter:blur(40px)}.videocontainer{position:relative;text-align:center}.videocontainer__background{position:absolute;top:0;left:0;background-color:#000;border-radius:4px;width:100%;height:100%}.videocontainer__toolbar,.videocontainer__toptoolbar{position:absolute;left:0;z-index:10;width:100%;box-sizing:border-box;pointer-events:none}.videocontainer__toolbar *,.videocontainer__toptoolbar *{pointer-events:auto}.videocontainer__toolbar .indicator-container,.videocontainer__toptoolbar .indicator-container{display:inline-block;float:left;pointer-events:all}.videocontainer__toolbar{bottom:0;height:22px;padding:0 5px}.videocontainer__toptoolbar{top:0;padding-bottom:0;text-align:left}.videocontainer__toptoolbar .indicator{margin-left:5px;margin-top:5px}.videocontainer__toptoolbar .indicator-container:nth-child(1) .indicator{margin-left:5px}.videocontainer__toptoolbar .indicator-container{display:inline-block;vertical-align:top}.participants-count-icon,.popupmenu__icon,.popupmenu__text,.subject-text{vertical-align:middle}.videocontainer__toptoolbar .indicator-container .popover-trigger{display:inline-block}.videocontainer__toptoolbar .connection-indicator,.videocontainer__toptoolbar .indicator{position:relative;font-size:8px;text-align:center;line-height:22px;padding:0;width:22px;height:22px;border-radius:50%;box-sizing:border-box;z-index:3;background:#165ecc;color:#fff;border:2px solid #fff}.videocontainer__toptoolbar .connection-indicator .indicatoricon,.videocontainer__toptoolbar .indicator .indicatoricon{top:50%;left:50%;position:absolute;-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.videocontainer__toptoolbar .connection-indicator .connection,.videocontainer__toptoolbar .indicator .connection{position:relative;display:inline-block;margin:0 auto;left:0;-moz-transform:translate(0,-50%);-ms-transform:translate(0,-50%);-webkit-transform:translate(0,-50%);-o-transform:translate(0,-50%);transform:translate(0,-50%)}.videocontainer__toptoolbar .connection-indicator .connection_empty,.videocontainer__toptoolbar .connection-indicator .connection_lost,.videocontainer__toptoolbar .indicator .connection_empty,.videocontainer__toptoolbar .indicator .connection_lost{color:#8B8B8B;overflow:hidden}.videocontainer__toptoolbar .connection-indicator .connection_full,.videocontainer__toptoolbar .indicator .connection_full{position:absolute;top:0;left:0;color:#FFF;overflow:hidden}.videocontainer__toptoolbar .connection-indicator .connection_ninja,.videocontainer__toptoolbar .indicator .connection_ninja{font-size:1.5em}.videocontainer__toptoolbar .connection-indicator .icon-gsm-bars,.videocontainer__toptoolbar .indicator .icon-gsm-bars{cursor:pointer;font-size:1em}.videocontainer__toptoolbar .hide-connection-indicator{display:none}.videocontainer__hoverOverlay{background:rgba(0,0,0,.6);border-radius:4px;position:absolute;top:0;left:0;width:100%;height:100%;visibility:hidden;z-index:2}#localVideoWrapper{display:inline-block}.flipVideoX{transform:scale(-1,1);-moz-transform:scale(-1,1);-webkit-transform:scale(-1,1);-o-transform:scale(-1,1)}#localVideoWrapper object,#localVideoWrapper video{border-radius:4px!important;cursor:hand;object-fit:cover}#largeVideo,#largeVideoContainer,#largeVideoWrapper{overflow:hidden;text-align:center}#largeVideoContainer{height:100%;width:100%}#largeVideoWrapper{box-shadow:0 0 20px -2px #444}#largeVideo,#largeVideoWrapper{object-fit:cover}#etherpad,#largeVideoWrapper,#largeVideoWrapper>object,#largeVideoWrapper>video,#localVideoWrapper,#localVideoWrapper object,#localVideoWrapper video,#sharedVideo,.videocontainer>object,.videocontainer>video{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}#etherpad{text-align:center;z-index:0}#alwaysOnTop .displayname,.videocontainer .displayname,.videocontainer .editdisplayname{display:inline-block;position:absolute;left:10%;width:80%;top:50%;-moz-transform:translateY(-40%);-ms-transform:translateY(-40%);-webkit-transform:translateY(-40%);-o-transform:translateY(-40%);transform:translateY(-40%);color:#fff;text-align:center;text-overflow:ellipsis;font-size:12px;font-weight:100;overflow:hidden;white-space:nowrap;line-height:22px;z-index:2}#alwaysOnTop .displayname{font-size:15px;position:inherit;width:100%;left:0;top:0;margin-top:10px}.videocontainer .editdisplayname{outline:0;border:none;background:0 0;box-shadow:none;padding:0;height:auto}#localVideoContainer .displayname:hover{cursor:text}.videocontainer .displayname{pointer-events:none;padding:0 3px}#localDisplayName{pointer-events:auto!important}.videocontainer>a.displayname{display:inline-block;position:absolute;color:#FFF;bottom:0;right:0;padding:3px 5px;font-size:9pt;cursor:pointer;z-index:2}.videocontainer .toolbar-icon{font-size:8pt;text-align:center;text-shadow:0 1px 0 rgba(255,255,255,.3),0 -1px 0 rgba(0,0,0,.7);color:#FFF;width:12px;line-height:22px;height:22px;padding:0;border:0;margin:0 5px 0 0}.toolbar-icon>div{height:22px;display:flex;flex-direction:column;justify-content:center}.moderator-icon{display:inline-block}.moderator-icon.right{float:right;margin:0 0 0 5px}.moderator-icon .toolbar-icon{margin:0}.raisehandindicator{background:#D6D61E}.connection-indicator{background:#165ecc}.connection-indicator.status-high{background:green}.connection-indicator.status-med{background:#FFD740}.connection-indicator.status-lost{background:gray}.connection-indicator.status-low{background:#BF2117}.connection-indicator.status-other{background:#165ecc}.remote-video-menu-trigger,.remotevideomenu{display:inline-block;position:absolute;top:0;right:0;z-index:2;width:18px;height:13px;color:#FFF;font-size:10pt;margin-right:initial}.remote-video-menu-trigger>i,.remotevideomenu>i{cursor:hand}.remote-video-menu-trigger{margin-top:7px}.videocontainer>.audioindicator-container,.videocontainer>span.audioindicator{position:absolute;display:inline-block;left:6px;top:50%;margin-top:-17px;width:6px;height:35px;z-index:2;border:none}.videocontainer>.audioindicator-container .audiodot-bottom,.videocontainer>.audioindicator-container .audiodot-middle,.videocontainer>.audioindicator-container .audiodot-top,.videocontainer>span.audioindicator .audiodot-bottom,.videocontainer>span.audioindicator .audiodot-middle,.videocontainer>span.audioindicator .audiodot-top{opacity:0;display:inline-block;width:5px;height:5px;border-radius:50%;background:rgba(9,36,77,.9);margin:1px 0;transition:opacity .25s ease-in-out;-moz-transition:opacity .25s ease-in-out}.videocontainer>.audioindicator-container span.audiodot-bottom::after,.videocontainer>.audioindicator-container span.audiodot-middle::after,.videocontainer>.audioindicator-container span.audiodot-top::after,.videocontainer>span.audioindicator span.audiodot-bottom::after,.videocontainer>span.audioindicator span.audiodot-middle::after,.videocontainer>span.audioindicator span.audiodot-top::after{content:"";display:inline-block;width:5px;height:5px;border-radius:50%;-webkit-filter:blur(.5px);filter:blur(.5px);background:#44A5FF}#reloadPresentation{display:none;position:absolute;color:#FFF;top:0;right:0;padding:10px;font-size:11pt;cursor:pointer;background:rgba(0,0,0,.3);border-radius:5px;background-clip:padding-box;-webkit-border-radius:5px;-webkit-background-clip:padding-box;z-index:20}.audiolevel{display:inline-block;position:absolute;z-index:0;border-radius:1px;pointer-events:none}#dominantSpeaker{visibility:hidden;width:300px;height:300px;margin:auto;position:relative;top:50%;transform:translateY(-50%)}#mixedstream{display:none!important}#dominantSpeakerAvatarContainer,.dynamic-shadow{width:200px;height:200px}#dominantSpeakerAvatarContainer{top:50px;margin:auto;position:relative;overflow:hidden;visibility:inherit}.dynamic-shadow{border-radius:50%;position:absolute;top:50%;left:50%;margin:-100px 0 0 -100px;transition:box-shadow .3s ease}.avatar-container{max-width:60px;max-height:60px;top:50%;left:50%;position:absolute;-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:flex;justify-content:center;height:50%;width:auto;overflow:hidden}.chat-message-group .chatmessage-wrapper,.chatmessage{max-width:100%}.avatar-container .userAvatar,.sharedVideoAvatar{left:0;top:0;position:absolute}.avatar-container .userAvatar{height:100%;object-fit:cover;width:100%}#videoNotAvailableScreen{text-align:center}#videoNotAvailableScreen #avatarContainer{border-radius:50%;display:inline-block;height:50vh;margin-top:25vh;overflow:hidden;width:50vh}#videoNotAvailableScreen #avatarContainer #avatar,.sharedVideoAvatar{height:100%;width:100%;object-fit:cover}.videoMessageFilter{-webkit-filter:grayscale(.5) opacity(.8);filter:grayscale(.5) opacity(.8)}#remoteConnectionMessage,#remotePresenceMessage{position:absolute;width:auto;z-index:2;font-weight:600;font-size:14px;text-align:center;color:#FFF;left:50%;transform:translate(-50%,0)}.presence-label,.subject{width:100%;pointer-events:none;text-align:center;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#remoteConnectionMessage,#remotePresenceMessage .presence-label{opacity:.8;text-shadow:0 0 1px rgba(0,0,0,.3),0 1px 1px rgba(0,0,0,.3),1px 0 1px rgba(0,0,0,.3),0 0 1px rgba(0,0,0,.3);background:rgba(0,0,0,.5);border-radius:5px;padding:5px 10px}#remoteConnectionMessage{display:none}.display-avatar-with-name .avatar-container,.display-avatar-with-name .displayNameContainer,.display-avatar-with-name .videocontainer__hoverOverlay{visibility:visible}.display-avatar-with-name video,.display-name-on-black .avatar-container{visibility:hidden}.display-name-on-black .displayNameContainer{visibility:visible}.display-name-on-black .videocontainer__hoverOverlay{visibility:hidden}.display-name-on-black video{opacity:.2;visibility:visible}.display-video .avatar-container,.display-video .displayNameContainer,.display-video .videocontainer__hoverOverlay{visibility:hidden}.display-video video{visibility:visible}.display-name-on-video .avatar-container{visibility:hidden}.display-avatar-only .avatar-container,.display-name-on-video .displayNameContainer,.display-name-on-video .videocontainer__hoverOverlay,.display-name-on-video video{visibility:visible}.display-avatar-only .displayNameContainer,.display-avatar-only .videocontainer__hoverOverlay,.display-avatar-only video{visibility:hidden}.presence-label{color:#fff;font-size:12px;font-weight:100;left:0;margin:0 auto;right:0;top:calc(50% + 30px)}.notice{position:absolute;left:50%;z-index:3;margin-top:6px;-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);-webkit-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%)}.notice__message{background-color:#000;color:#fff;padding:3px;border-radius:5px}.subject{top:-120px;transition:top .3s ease-in;height:95px;position:absolute;padding:25px 140px 0;font-size:17px;color:#fff;z-index:10;box-sizing:border-box;background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.live-stream-dialog .broadcast-dropdown,.live-stream-dialog .broadcast-dropdown-trigger,.popupmenu{text-align:left}.subject.visible{top:0}.subject-conference-timer{display:block;font-size:15px;opacity:.6}.participants-count{background:#fff;border-radius:4px;color:#5e6d7a;cursor:pointer;display:inline-block;font-size:13px;line-height:20px;margin-left:16px;padding:4px 8px;pointer-events:auto}.participants-count-number{margin-right:8px;vertical-align:middle}.participants-count-icon{background:url(../images/user-groups.svg) no-repeat;display:inline-block;height:16px;width:16px}.popupmenu{min-width:75px;padding:0;width:180px;white-space:nowrap}.popupmenu__item{list-style-type:none;height:35px}.popupmenu__contents,.popupmenu__link{display:block;box-sizing:border-box;text-decoration:none;height:100%;font-size:9pt;width:100%;cursor:pointer;padding:0 5px;color:#fff!important}.popupmenu__contents:hover,.popupmenu__link:hover{background-color:rgba(255,255,255,.1);color:#fff!important}.popupmenu__contents.disabled,.popupmenu__link.disabled{pointer-events:none}.popupmenu__text{display:inline-block}.popupmenu__link i{cursor:pointer}.popupmenu__contents{display:flex}.popupmenu__contents .popupmenu__slider_container{position:relative;width:100%}.popupmenu__contents .popupmenu__slider_container .popupmenu__slider{position:absolute;top:50%;transform:translate(0,-50%);width:100%}.popupmenu__contents .popupmenu__slider_container .popupmenu__slider::-webkit-slider-runnable-track{background-color:#0376da}.popupmenu__contents .popupmenu__slider_container .popupmenu__slider::-moz-range-track{background-color:#0376da}.popupmenu__contents .popupmenu__slider_container .popupmenu__slider::-ms-fill-lower{background-color:#0376da}.popupmenu__icon{position:relative;display:inline-block;min-width:20px;height:100%;padding-right:10px}.popupmenu__icon>*{top:50%;left:50%;position:absolute;-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.popupmenu .icon-kick,.popupmenu .icon-play,.popupmenu .icon-stop{font-size:8pt}ul.popupmenu{margin:-16px -24px}span.remotevideomenu:hover ul.popupmenu,ul.popupmenu:hover{display:block!important}.recordingSpinner{vertical-align:top}.recording-dialog{flex:0;flex-direction:column}.recording-dialog .recording-header{display:flex;flex:0;flex-direction:row;justify-content:space-between;padding-top:32px}.recording-dialog .recording-header .recording-title{display:inline-flex;align-items:center;font-size:16px;margin-left:16px}.recording-dialog .recording-header-line{border-top:1px solid #5e6d7a}.recording-dialog .recording-switch-disabled{opacity:.5}.recording-dialog .recording-icon-container{display:inline-flex;align-items:center}.recording-dialog .recording-icon{width:32px;height:32px;object-fit:contain}.recording-dialog .recording-switch{margin-left:auto}.recording-dialog .authorization-panel{display:flex;flex-direction:column;margin:0 40px 10px;padding-bottom:10px}.recording-dialog .authorization-panel .logged-in-panel{padding:10px}.live-stream-dialog{font-size:14px}.live-stream-dialog .form-footer{display:flex;margin-top:5px;text-align:right}.live-stream-dialog .live-stream-cta a{cursor:pointer}.live-stream-dialog .google-api{margin-top:10px;min-height:36px;text-align:center;width:100%}.live-stream-dialog .google-error{color:#c61600}.live-stream-dialog .google-panel{align-items:center;border-bottom:2px solid rgba(0,0,0,.3);display:flex;flex-direction:column;padding-bottom:10px}.live-stream-dialog .helper-link{cursor:pointer;display:inline-block;flex-shrink:0;margin-left:auto}.live-stream-dialog .warning-text{color:#FFD740;font-size:12px}div.loginmenu{position:absolute;margin:0;padding:5px;top:40px;left:20px}a.disabled{color:gray!important;pointer-events:none}.loginmenu.extendedToolbarPopup{top:20px;left:40px}#sideToolbarContainer{background-color:rgba(22,38,55,.8);box-sizing:border-box;color:#FFF;display:flex;flex-direction:column;height:calc(100% - calc(40px + 24px));left:-375px;overflow:hidden;position:absolute;top:0;transition:left .5s;width:375px;z-index:300}#sideToolbarContainer.slideInExt{left:0}#chatconversation{box-sizing:border-box;flex:1;font-size:10pt;line-height:20px;overflow:auto;padding:16px;text-align:left;width:375px;word-wrap:break-word}#chatconversation a{display:block}#chatconversation a:link{color:#b8b8b8}#chatconversation a:visited{color:#fff}#chatconversation a:hover{color:#d5d5d5}#chatconversation a:active{color:#000}#chatconversation::-webkit-scrollbar{background:#06a5df;width:7px}#chatconversation::-webkit-scrollbar-button{display:none}#chatconversation::-webkit-scrollbar-track{background:#000}#chatconversation::-webkit-scrollbar-track-piece{background:#000}#chatconversation::-webkit-scrollbar-thumb{background:#06a5df;border-radius:4px}#chat-recipient{align-items:center;background-color:#99454d;display:flex;flex-direction:row;font-weight:100;padding:10px}#chat-recipient span{color:#fff;display:flex;flex:1}#chat-recipient div svg{cursor:pointer;fill:#fff}.chat-header{background-color:rgba(42,58,75,.9);height:70px;position:relative;width:100%;z-index:1}.chat-header .chat-close{align-items:center;bottom:8px;color:#fff;cursor:pointer;display:flex;font-size:18px;height:40px;justify-content:center;line-height:15px;padding:4px;position:absolute;right:5px;width:40px}.chat-header .chat-close:hover{color:rgba(255,255,255,.8)}#chat-input{border-top:1px solid #A4B8D1;display:flex;padding:5px 10px}#chat-input *{background-color:transparent}.remoteuser{color:#B8C7E0}.usrmsg-form{flex:1}#usermsg{border:0;border-radius:0;box-shadow:none;color:#fff;font-size:15px;padding:10px;overflow-y:auto;resize:none;width:100%;word-break:break-word}#usermsg:hover{border:0;box-shadow:none}#nickname{text-align:center;color:#9d9d9d;font-size:18px;margin-top:30px;left:5px;right:5px}.sideToolbarContainer *{-webkit-user-select:text;user-select:text}.sideToolbarContainer .display-name{font-size:13px;font-weight:700;margin-bottom:5px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.chatmessage{background-color:#566572;border-radius:0 6px 6px;box-sizing:border-box;color:#fff;margin-top:3px;position:relative}.chatmessage.localuser{background-color:#0462b2;border-radius:6px 0 6px 6px}.chatmessage .usermessage{white-space:pre-wrap}.chatmessage.error{border-radius:0}.chatmessage.error .display-name,.chatmessage.error .timestamp{display:none}.chatmessage.error .usermessage{color:red;padding:0}.chatmessage .privatemessagenotice{font-size:11px;font-weight:100}.chatmessage .messagecontent{margin:5px 10px;max-width:100%;overflow:hidden}.smiley{font-size:14pt}#smileys,#smileysContainer .smiley{font-size:20pt}#smileys{margin:auto;cursor:pointer}#smileys img{width:22px;padding:2px}#smileysarea{display:flex;max-height:150px;min-height:35px;overflow:hidden}.smiley-input{display:flex;position:relative}.smileys-panel{bottom:100%;box-sizing:border-box;background-color:rgba(0,0,0,.6)!important;height:auto;max-height:0;overflow:hidden;position:absolute;width:375px;transition:max-height .3s}.smileys-panel.show-smileys{max-height:500%}.smileys-panel #smileysContainer{background-color:rgba(22,38,55,.8);border-bottom:1px solid;border-top:1px solid}.smileyContainer{width:40px;height:36px;display:inline-block;text-align:center}.smileyContainer:hover{background-color:rgba(255,255,255,.2);border-radius:5px;cursor:pointer}#usermsg::-webkit-scrollbar-track-piece{background:#3a3a3a}.chat-message-group{display:flex;flex-direction:column}.chat-message-group.error .display-name,.chat-message-group.local .display-name{display:none}.chat-message-group.local{align-items:flex-end}.chat-message-group.local .chatmessage{background-color:#0462b2;border-radius:6px 0 6px 6px}.chat-message-group.local .chatmessage.privatemessage{background-color:#99454d}.chat-message-group.local .timestamp{text-align:right}.chat-message-group.error .chatmessage{background-color:#d77976;border-radius:0;font-weight:100}.chat-message-group .chatmessage-wrapper .replywrapper{display:flex;flex-direction:row;align-items:center}.chat-message-group .chatmessage-wrapper .replywrapper .messageactions{align-self:stretch;border-left:1px solid #ad6970;display:flex;flex-direction:column;justify-content:center;padding:5px}.chat-message-group .chatmessage-wrapper .replywrapper .messageactions .toolbox-icon{cursor:pointer}.chat-message-group .chatmessage{background-color:#566572;border-radius:0 6px 6px;display:inline-block;margin-top:3px;color:#fff}.chat-message-group .chatmessage.privatemessage{background-color:#99454d}.ringing{display:block;left:0;top:0;width:100%;height:100%;position:fixed;z-index:300;background-color:rgba(40,52,71,.95)}.ringing.solidBG{background:#474747}.ringing__content{position:absolute;width:400px;height:250px;left:50%;top:50%;margin-left:-200px;margin-top:-125px;text-align:center;font-weight:400;color:#FFF}.ringing__avatar{width:128px;height:128px;border-radius:50%;border:2px solid #1B2638}.ringing__status{margin-top:15px;font-size:14px;line-height:20px}.ringing__name{font-size:24px;line-height:32px}body.welcome-page{background:inherit;overflow:auto}.welcome{background-image:linear-gradient(-90deg,#1251AE 0,#0074FF 50%,#1251AE 100%);display:flex;flex-direction:column;font-family:inherit;justify-content:space-between;min-height:100vh;position:relative}.welcome .header{background-image:none;background-position:none;background-repeat:none;background-size:none;padding-bottom:0;align-items:center;display:flex;flex-direction:column;min-height:fit-content;overflow:hidden;position:relative;text-align:center}.welcome .header .header-text{display:flex;flex-direction:column;margin-top:109px;margin-bottom:35px;max-width:calc(100% - 40px);width:650px;z-index:2}.welcome .header .header-text-title{color:#fff;font-size:2.5rem;font-weight:500;line-height:1.18;margin-bottom:16px;opacity:1}.welcome .header .header-text-description{display:inherit;color:#fff;font-size:1rem;font-weight:400;line-height:24px;margin-bottom:20px;align-self:inherit}.welcome .header #enter_room{display:flex;align-items:center;max-width:calc(100% - 40px);width:680px;z-index:2;background-color:#fff;padding:25px 30px;border-radius:0}.welcome .header #enter_room .enter-room-input-container{width:100%;padding:0 8px 5px 0;text-align:left;color:#253858;height:fit-content;border-width:0 0 2px;border-style:solid;border-image:linear-gradient(to right,#dee1e6,#fff) 1}.welcome .header #enter_room .enter-room-input-container .enter-room-title{display:inherit;font-size:18px;font-weight:700;padding-bottom:5px}.welcome .header #enter_room .enter-room-input-container .enter-room-input{border:none;display:inline-block;width:100%;font-size:14px}.welcome .header #enter_room .enter-room-input-container ::placeholder{color:#253858}.welcome .header .tab-container{font-size:16px;position:relative;text-align:left;min-height:354px;width:710px;background:#75A7E7;display:flex;flex-direction:column}.welcome .header .tab-container .tab-content{display:inherit;margin:5px 0;overflow:hidden;flex-grow:1;position:relative}.welcome .header .tab-container .tab-content>*{position:absolute}.welcome .header .tab-container .tab-buttons{font-size:18px;color:#FFF;display:flex;flex-grow:0;flex-direction:row;min-height:54px;width:100%}.welcome .header .tab-container .tab-buttons .tab{display:block;text-align:center;background:rgba(9,30,66,.37);height:55px;line-height:54px;flex-grow:1;cursor:pointer}.welcome .header .tab-container .tab-buttons .tab.selected,.welcome .header .tab-container .tab-buttons .tab:hover{background:rgba(9,30,66,.71)}.welcome .header .tab-container .tab-buttons .tab:last-child{margin-left:1px}.welcome .welcome-page-button{width:51px;min-width:inherit;height:35px;font-size:14px;font-weight:inherit;background:#0074E0;border-radius:4px;color:#FFF;text-align:center;vertical-align:middle;line-height:35px;cursor:pointer}.welcome .welcome-page-settings{color:#fff;position:absolute;top:32px;right:32px;z-index:2}.welcome .welcome-page-settings *{cursor:pointer;font-size:32px}.welcome .welcome-watermark{position:absolute;width:100%;height:100%}.badge-round{background-color:#165ECC;border-radius:50%;box-sizing:border-box;color:#FFF;font-family:-apple-system,BlinkMacSystemFont,open_sanslight,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:9px;font-weight:700;line-height:13px;min-width:13px;overflow:hidden;text-align:center;text-overflow:ellipsis;vertical-align:middle}.new-toolbox{bottom:calc((40px * 2) * -1);left:0;position:absolute;right:0;transition:bottom .3s ease-in;width:100%}.new-toolbox.visible,.new-toolbox.visible .toolbox-background{bottom:0}.new-toolbox.no-buttons{display:none}.new-toolbox .toolbox-background{background-image:linear-gradient(to top,rgba(0,0,0,.6),rgba(0,0,0,0));transition:bottom .3s ease-in;height:160px;width:100%;bottom:-160px;pointer-events:none;position:absolute;z-index:4}.new-toolbox .toolbox-content{box-sizing:border-box;display:flex;justify-content:space-between;margin-left:auto;margin-right:auto;padding:20px 16px;position:relative;width:100%;z-index:350}.new-toolbox .toolbox-content .button-group-center,.new-toolbox .toolbox-content .button-group-left,.new-toolbox .toolbox-content .button-group-right{display:flex;width:33%}.new-toolbox .toolbox-content .button-group-center{justify-content:center}.new-toolbox .toolbox-content .button-group-center .toolbox-button .toolbox-icon{background-color:#fff;border-radius:50%;border:1px solid #d1dbe8;margin:0 4px;width:38px;height:38px}.new-toolbox .toolbox-content .button-group-center .toolbox-button .toolbox-icon:hover{background-color:#daebfa;border:1px solid #daebfa}.new-toolbox .toolbox-content .button-group-center .toolbox-button .toolbox-icon.toggled{background:#2a3a4b;border:1px solid #5e6d7a}.new-toolbox .toolbox-content .button-group-center .toolbox-button .toolbox-icon.toggled svg{fill:#fff}.new-toolbox .toolbox-content .button-group-center .toolbox-button .toolbox-icon.toggled:hover{background-color:#5e6d7a}.disabled .new-toolbox .toolbox-content .button-group-center .toolbox-button .toolbox-icon,.new-toolbox .toolbox-content .button-group-center .toolbox-button .toolbox-icon.disabled{cursor:initial;color:#fff;background-color:#a4b8d1}.new-toolbox .toolbox-content .button-group-center .toolbox-button .toolbox-icon svg{fill:#5e6d7a}.new-toolbox .toolbox-content .button-group-center .toolbox-button:nth-child(2) .toolbox-icon{background-color:#bf2117;border:1px solid #bf2117;width:40px;height:40px}.new-toolbox .toolbox-content .button-group-center .toolbox-button:nth-child(2) .toolbox-icon:hover{background-color:#bf2117}.new-toolbox .toolbox-content .button-group-center .toolbox-button:nth-child(2) .toolbox-icon svg{fill:#fff}.new-toolbox .toolbox-content .button-group-right{justify-content:flex-end}.new-toolbox .toolbox-content .overflow-menu{font-size:1.2em;list-style-type:none;background-color:initial;margin:-16px -24px;padding:4px 0}.new-toolbox .toolbox-content .overflow-menu .overflow-menu-item{align-items:center;color:#B8C7E0;cursor:pointer;display:flex;font-size:14px;height:22px;padding:5px 12px}.new-toolbox .toolbox-content .overflow-menu .overflow-menu-item div{display:flex;flex-direction:row;align-items:center}.new-toolbox .toolbox-content .overflow-menu .overflow-menu-item:hover{background-color:#313D52;color:#B8C7E0}.new-toolbox .toolbox-content .overflow-menu .overflow-menu-item.unclickable{cursor:default}.new-toolbox .toolbox-content .overflow-menu .overflow-menu-item.unclickable:hover{background:inherit}.new-toolbox .toolbox-content .overflow-menu .overflow-menu-item.disabled{cursor:initial;color:#3b475c}.new-toolbox .toolbox-content .overflow-menu .beta-tag{background:#B8C7E0;border-radius:2px;color:initial;font-size:11px;font-weight:700;margin-left:8px;padding:0 6px}.new-toolbox .toolbox-content .overflow-menu .overflow-menu-item-icon{margin-right:10px}.new-toolbox .toolbox-content .overflow-menu .overflow-menu-item-icon i{display:inline;font-size:24px}.new-toolbox .toolbox-content .overflow-menu .overflow-menu-item-icon i:hover{background-color:initial}.new-toolbox .toolbox-content .overflow-menu .overflow-menu-item-icon img{max-width:24px;max-height:24px}.new-toolbox .toolbox-content .overflow-menu .overflow-menu-item-icon svg{fill:#B8C7E0!important}.new-toolbox .toolbox-content .overflow-menu .profile-text{max-width:150px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.new-toolbox .toolbox-content .toolbox-button{color:#FFF;cursor:pointer;display:inline-block;line-height:40px;margin:0 8px;text-align:center}.new-toolbox .toolbox-content .toolbar-button-with-badge{position:relative}.new-toolbox .toolbox-content .toolbar-button-with-badge .badge-round{bottom:-5px;font-size:12px;line-height:20px;min-width:20px;pointer-events:none;position:absolute;right:-5px}.new-toolbox .toolbox-content .toolbox-button-wth-dialog{display:inline-block}.new-toolbox .toolbox-content .toolbox-icon{display:flex;border-radius:5px;flex-direction:column;font-size:24px;height:40px;justify-content:center;width:40px}.new-toolbox .toolbox-content .toolbox-icon.toggled,.new-toolbox .toolbox-content .toolbox-icon:hover{background:rgba(255,255,255,.15)}.new-toolbox .toolbox-content .toolbox-icon.disabled{cursor:initial!important;background-color:#a4b8d1!important}.new-toolbox .toolbox-content .toolbox-icon.disabled svg{fill:#fff!important}.fadeIn{opacity:1;-moz-transition:all .3s ease-in;-o-transition:all .3s ease-in;-webkit-transition:all .3s ease-in;transition:all .3s ease-in}.fadeOut{opacity:0;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;-webkit-transition:all .3s ease-out;transition:all .3s ease-out}/*! + * jQuery contextMenu - Plugin for simple contextMenu handling + * + * Version: v2.1.1 + * + * Authors: Björn Brala (SWIS.nl), Rodney Rehm, Addy Osmani (patches for FF) + * Web: http://swisnl.github.io/jQuery-contextMenu/ + * + * Copyright (c) 2011-2016 SWIS BV and contributors + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * + * Date: 2016-02-28T09:53:18.890Z + */@font-face{font-family:context-menu-icons;font-style:normal;font-weight:400;src:url(font/context-menu-icons.eot?2qmzf);src:url(font/context-menu-icons.eot?2qmzf#iefix) format("embedded-opentype"),url(font/context-menu-icons.woff2?2qmzf) format("woff2"),url(font/context-menu-icons.woff?2qmzf) format("woff"),url(font/context-menu-icons.ttf?2qmzf) format("truetype")}.context-menu-icon:before{position:absolute;top:50%;left:0;width:28px;font-family:context-menu-icons;font-size:16px;font-style:normal;font-weight:400;line-height:1;color:#2980b9;text-align:center;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.context-menu-icon-add:before{content:""}.context-menu-icon-copy:before{content:""}.context-menu-icon-cut:before{content:""}.context-menu-icon-delete:before{content:""}.context-menu-icon-edit:before{content:""}.context-menu-icon-paste:before{content:""}.context-menu-icon-quit:before{content:""}.context-menu-icon.context-menu-hover:before{color:#fff}.context-menu-list{position:absolute;display:inline-block;min-width:180px;max-width:360px;padding:4px 0;margin:5px;font-family:inherit;font-size:inherit;list-style-type:none;background:#fff;border:1px solid #bebebe;border-radius:4px;-webkit-box-shadow:0 2px 5px rgba(0,0,0,.5);box-shadow:0 2px 5px rgba(0,0,0,.5)}.context-menu-item{position:relative;padding:3px 28px;color:#2f2f2f;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff}.context-menu-separator{padding:0;margin:5px 0;border-bottom:1px solid #e6e6e6}.context-menu-item>label>input,.context-menu-item>label>textarea{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.context-menu-item.context-menu-hover{color:#fff;cursor:pointer;background-color:#2980b9}.context-menu-item.context-menu-disabled{background-color:#fff;color:#626262}.context-menu-input.context-menu-hover,.context-menu-item.context-menu-disabled.context-menu-hover{cursor:default;background-color:#eee}.context-menu-submenu:after{position:absolute;top:50%;right:8px;z-index:1;width:0;height:0;content:'';border-color:transparent transparent transparent #2f2f2f;border-style:solid;border-width:4px 0 4px 4px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%)}.context-menu-item.context-menu-input{padding:5px 10px}.context-menu-input>label>*{vertical-align:top}.context-menu-input>label>input[type=checkbox],.context-menu-input>label>input[type=radio]{position:relative;top:3px}.context-menu-input>label,.context-menu-input>label>input[type=text],.context-menu-input>label>select,.context-menu-input>label>textarea{display:block;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.context-menu-input>label>textarea{height:100px}.context-menu-item>.context-menu-list{top:5px;right:-5px;display:none}.context-menu-item.context-menu-visible>.context-menu-list{display:block}.context-menu-accesskey{text-decoration:underline}.shortcuts-list{list-style-type:none;padding:0}.shortcuts-list__item{display:flex;justify-content:space-between;margin-bottom:.5em}.filmstrip__toolbar,.form-control__container{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex}.redirectPageMessage{width:30%;margin:20% auto;text-align:center;font-size:24px}.redirectPageMessage .thanks-msg{border-bottom:1px solid #FFF;padding-left:30px;padding-right:30px}.redirectPageMessage .thanks-msg p{margin:30px auto;font-size:24px;line-height:24px}.redirectPageMessage .hint-msg p{margin:26px auto;font-weight:600;font-size:16px;line-height:18px}.redirectPageMessage .hint-msg p .hint-msg__holder{font-weight:200}.redirectPageMessage .hint-msg .happy-software{width:120px;height:86px;margin:0 auto;background:0 0}.form-control{padding:16px 0}.form-control:first-child{padding-top:0}.form-control:last-child{padding-bottom:0}.form-control__text{margin:8px 0;font-size:1em}.form-control__label{font-size:1em;font-weight:400}.form-control__em{color:#f29424}.form-control__container{position:relative;width:100%;margin-top:5px;margin-bottom:5px;display:flex}.form-control__container .button-control{margin:1px 0 1px 10px}.form-control__right{position:absolute;right:0}input:read-only{color:#a7a7a7}.helper-link,.link{cursor:pointer;color:#489afe;-moz-transition:color .1s ease-out;-o-transition:color .1s ease-out;-webkit-transition:color .1s ease-out;transition:color .1s ease-out}.helper-link:hover,.link:hover{color:#287ade;text-decoration:underline;-moz-transition:color .1s ease-in;-o-transition:color .1s ease-in;-webkit-transition:color .1s ease-in;transition:color .1s ease-in}.helper-link{font-size:12px}.button-control{box-sizing:border-box;display:inline-block;border:1px solid transparent;vertical-align:baseline;height:30px;min-width:60px;padding:4px 10px;margin:0 0 0 10px;line-height:1.5em;outline:0;background-color:transparent;float:right;font-size:14px;color:#eceef1;font-weight:400;-moz-transition:background-color .1s ease-out;-o-transition:background-color .1s ease-out;-webkit-transition:background-color .1s ease-out;transition:background-color .1s ease-out}.button-control[disabled]{color:#666;cursor:default}.button-control_full-width{margin:0;width:100%}.button-control:hover{border:1px solid transparent;background-color:#2c4062;-moz-transition:background-color .1s ease-in;-o-transition:background-color .1s ease-in;-webkit-transition:background-color .1s ease-in;transition:background-color .1s ease-in}.button-control:active{-webkit-box-shadow:inset 0 0 1px #192d4f;-moz-box-shadow:inset 0 0 1px #192d4f;box-shadow:inset 0 0 1px #192d4f}.button-control_light{color:#2b3d5c;background-color:#f5f5f5;border:1px solid #ccc}.button-control_light:hover{border:1px solid #999;background-color:#e9e9e9}.button-control_link,.button-control_link:hover{background-color:transparent}.button-control_link{color:#0090e8}.button-control_overlay{color:#FFF;background-color:#0074E0;border-radius:2px;border:none}.button-control_overlay:hover{background-color:#3572b0;border:none}.button-control_primary{background-color:#3572b0;border:1px solid #3572b0;color:#FFF!important;font-weight:400}.button-control_primary:hover{border:1px solid #2a67a5;background-color:#2a67a5}.button-control_primary[disabled]{color:#FFF}.button-control_close{color:#777}.button-control_submit{color:#489afe}.button-control_submit:hover{color:#287ade}.button-control_center{float:none!important}.input-control{-moz-transition:all .2s ease-in;-o-transition:all .2s ease-in;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;display:inline-block;width:100%;padding:5px 7px;border-radius:4px;line-height:32px;height:32px;text-align:left;margin-bottom:8px}.input-control:last-child{margin-bottom:inherit}.input-control::selection{background-color:#ccc}.input-control.error{color:#c61600;border-color:#c61600}::-webkit-input-placeholder{color:#a7a7a7}::-moz-placeholder{color:#a7a7a7}:-moz-placeholder{color:#a7a7a7}:-ms-input-placeholder{color:#a7a7a7}input[type=range]{-webkit-appearance:none;background:0 0}input[type=range]:focus{outline:0}input[type=range]::-webkit-slider-runnable-track{background:#474747;border:none;border-radius:3px;cursor:pointer;height:6px;width:100%}input[type=range]::-moz-range-track{background:#474747;border:none;border-radius:3px;cursor:pointer;height:6px;width:100%}input[type=range]::-ms-track{background:#474747;border:none;border-radius:3px;cursor:pointer;height:6px;width:100%}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:#fff;border:1px solid #3572b0;border-radius:50%;box-shadow:0 0 1px #3572b0;cursor:pointer;height:14px;margin-top:-4px;width:14px}input[type=range]::-moz-range-thumb{-webkit-appearance:none;background:#fff;border:1px solid #3572b0;border-radius:50%;box-shadow:0 0 1px #3572b0;cursor:pointer;height:14px;margin-top:-4px;width:14px}input[type=range]::-ms-thumb{-webkit-appearance:none;background:#fff;border:1px solid #3572b0;border-radius:50%;box-shadow:0 0 1px #3572b0;cursor:pointer;height:14px;margin-top:-4px;width:14px}.connection-info,.connection-info>table{font-size:12px;font-weight:400}.connection-info td{padding:2px 0}.connection-info{margin:-15px}.connection-info>table{white-space:nowrap}.connection-info td:nth-child(n-1){padding-left:5px}.connection-info__download,.connection-info__icon,.connection-info__upload{margin-right:2px}.connection-info__status{font-weight:700}.connection-info .showmore{display:block;margin:10px auto;text-align:center;width:90px}.select2-container.aui-select2-container{background-color:transparent!important;margin-top:2px}.select2-container.aui-select2-container a.select2-choice{height:28px!important;line-height:18px!important;width:100%!important;background-color:#FFF!important;border-color:#FFF!important;color:#333!important;text-shadow:none!important;font-size:12px!important;margin:0 auto!important}.select2-container.aui-select2-container a.select2-choice:after{border-top-color:#333}.select2-container.aui-select2-container.select2-dropdown-open a.select2-choice{background-color:#f2f2f2!important;border-color:#f2f2f2!important}.select2-drop.aui-select2-drop.aui-style-default{z-index:901;background-color:#f2f2f2;border-color:#f2f2f2}.select2-drop.aui-select2-drop.aui-style-default .select2-results{background-color:#f2f2f2;border-color:#f2f2f2}.select2-drop.aui-select2-drop.aui-style-default .select2-results::-webkit-scrollbar{background-color:transparent}.select2-drop.aui-select2-drop.aui-style-default .select2-results::-webkit-scrollbar-track{background-color:transparent}.select2-drop.aui-select2-drop.aui-style-default .select2-results::-webkit-scrollbar-track-piece{background-color:transparent}.select2-drop.aui-select2-drop.aui-style-default .select2-results::-webkit-scrollbar-thumb{background-color:#ccc}.select2-drop.aui-select2-drop.aui-style-default .select2-results .select2-result.select2-highlighted{background-color:#ccc}.select2-drop.aui-select2-drop.aui-style-default .select2-results .select2-result .select2-result-label{font-size:12px;color:#333!important;line-height:20px}.select2-drop-mask{z-index:900}.error_page{width:60%;margin:20% auto;text-align:center}.error_page h2{font-size:36px}.error_page__message{font-size:24px;margin-top:20px}.policy__logo{display:block;width:200px;height:50px;margin:30px auto 0}.policy__text{text-align:center;font-size:14px;line-height:21px;font-weight:300}.popover-mousemove-padding-bottom{bottom:-15px;height:20px;position:absolute;right:0;width:100%}.popover-mousemove-padding-left,.popover-mousemove-padding-right{height:100%;position:absolute;top:0;width:40px}.popover-mousemove-padding-left{left:-20px}.popover-mousemove-padding-right{right:-20px}.popover-mouse-padding-top{height:30px;position:absolute;right:0;top:-25px;width:100%}.popover{background-color:initial;border-radius:3px;margin:-16px -24px;padding:16px 24px}.filmstrip__toolbar{display:flex;flex-direction:column-reverse;flex-wrap:nowrap;position:relative;width:17px}.filmstrip__toolbar button{font-size:14px;line-height:1.2;text-align:center;background:0 0;opacity:.7;height:auto;width:100%;padding:0;margin:0;border:none;outline:0;-webkit-appearance:none}.filmstrip__toolbar button:hover{opacity:1}.horizontal-filmstrip .filmstrip.hide-videos .remote-videos-container,.vertical-filmstrip .filmstrip.hide-videos .remote-videos-container{opacity:0;pointer-events:none}.filmstrip__toolbar button i{cursor:pointer}.horizontal-filmstrip .filmstrip,.horizontal-filmstrip .filmstrip__videos,.vertical-filmstrip .filmstrip,.vertical-filmstrip .filmstrip .filmstrip__videos{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-direction:row-reverse;flex-wrap:nowrap;justify-content:flex-start}.horizontal-filmstrip .filmstrip{bottom:0;right:0;padding:10px 5px;transition:bottom .3s;z-index:5;box-sizing:border-box;width:100%;position:fixed}.horizontal-filmstrip .filmstrip.reduce-height{bottom:calc(calc(40px + 24px) + 7px)}.horizontal-filmstrip .filmstrip__videos{position:relative;padding:0;bottom:0;width:auto;overflow:visible!important}.horizontal-filmstrip .filmstrip__videos#remoteVideos{border:2px solid transparent;transition:bottom 2s;flex-grow:1;min-height:0;min-width:0}.horizontal-filmstrip .filmstrip__videos#filmstripLocalVideo{align-self:flex-end;display:block;margin-bottom:8px}.horizontal-filmstrip .filmstrip__videos.hidden{bottom:calc(-196px - calc(40px + 24px))}.horizontal-filmstrip .filmstrip__videos .remote-videos-container{display:flex}.horizontal-filmstrip .filmstrip__videos-filmstripOnly{margin-top:auto;margin-bottom:auto}.horizontal-filmstrip .filmstrip__videos-filmstripOnly .filmstrip__videos#filmstripLocalVideo{bottom:0}.horizontal-filmstrip .filmstrip .remote-videos-container{transition:opacity 1s}.horizontal-filmstrip .filmstrip #filmstripRemoteVideos{min-height:0;min-width:0;display:flex;flex:1;width:auto;justify-content:flex-end;flex-direction:row}.horizontal-filmstrip .filmstrip #filmstripRemoteVideos #filmstripRemoteVideosContainer{flex-direction:row-reverse;padding:1px 0;overflow-y:hidden;overflow-x:scroll}.horizontal-filmstrip .filmstrip .videocontainer{margin-bottom:10px}@-moz-document url-prefix(){.horizontal-filmstrip #remoteVideos #filmstripRemoteVideos #filmstripRemoteVideosContainer{flex-direction:row}}@supports (-ms-ime-align:auto){.horizontal-filmstrip #remoteVideos #filmstripRemoteVideos #filmstripRemoteVideosContainer{flex-direction:row}}.filmstrip__videos .videocontainer{display:inline-block;position:relative;background-size:contain;border:2px solid transparent;border-radius:4px;margin:0 2px}.filmstrip__videos .videocontainer.videoContainerFocused,.filmstrip__videos .videocontainer:hover{cursor:hand}.filmstrip__videos .videocontainer.videoContainerFocused{border:2px solid #165ECC;box-shadow:inset 0 0 3px #165ECC,0 0 3px #165ECC}.filmstrip__videos .videocontainer .remotevideomenu>.icon-menu{display:none}.filmstrip__videos .videocontainer:hover:not(.videoContainerFocused):not(.active-speaker){cursor:hand;border:2px solid rgba(22,94,204,.4);box-shadow:inset 0 0 3px rgba(22,94,204,.4),0 0 3px rgba(22,94,204,.4)}.filmstrip__videos .videocontainer:hover:not(.videoContainerFocused):not(.active-speaker) .remotevideomenu>.icon-menu{display:inline-block}.filmstrip__videos .videocontainer>video{cursor:hand;border-radius:4px;object-fit:cover;overflow:hidden}.filmstrip__videos .videocontainer .presence-label{position:absolute;z-index:3}.tile-view .active-speaker{box-shadow:0 0 5px 3px #165ECC}.tile-view #filmstripRemoteVideos{align-items:center;display:flex;flex-direction:column;height:100vh;width:100vw;box-sizing:border-box;overflow-x:hidden;overflow-y:auto}.tile-view .filmstrip__videos .videocontainer:hover:not(.active-speaker),.tile-view .filmstrip__videos .videocontainer:not(.active-speaker){border:none;box-shadow:none}.tile-view #remoteVideos{height:100%!important;width:100%}.tile-view .filmstrip{align-items:center;display:flex;height:100%;justify-content:center;left:0;position:fixed;top:0;width:100%;z-index:5}.tile-view .filmstrip__videos.hidden{display:block}.tile-view #filmstripRemoteVideosContainer{align-content:center;align-items:center;box-sizing:border-box;display:flex;flex-wrap:wrap;height:100vh;justify-content:center;padding:100px 0}.tile-view #filmstripRemoteVideosContainer .videocontainer{border:0;box-sizing:border-box;display:block;margin:5px}.tile-view #filmstripRemoteVideosContainer video{object-fit:contain}.tile-view .has-overflow#filmstripRemoteVideosContainer{align-content:baseline}.tile-view .has-overflow .videocontainer{align-self:baseline}.tile-view .has-overflow #localVideoContainer{margin-bottom:100px!important}.tile-view .avatar-container{max-height:initial;max-width:initial}.tile-view #dominantSpeaker,.tile-view #filmstripLocalVideoThumbnail,.tile-view #largeVideoElementsContainer,.tile-view #sharedVideo,.tile-view .filmstrip__toolbar{display:none}.tile-view #remoteConnectionMessage,.tile-view .watermark{z-index:6}.tile-view #largeVideoElementsContainer,.tile-view #remoteConnectionMessage,.tile-view #remotePresenceMessage{display:none!important}.tile-view #largeVideoContainer{background-color:#474747!important}.tile-view .remotevideomenu,.tile-view .videocontainer__toptoolbar{z-index:auto}.vertical-filmstrip .filmstrip{align-items:flex-end;bottom:0;box-sizing:border-box;display:flex;flex-direction:column-reverse;height:100%;width:100%;padding:20px 5px 10px;position:fixed;top:0;transition:height .3s ease-in;right:0;z-index:5}.vertical-filmstrip .filmstrip.reduce-height{height:calc(100% - calc(40px + 24px))}.vertical-filmstrip .filmstrip .filmstrip__videos{bottom:0;padding:0;position:relative;right:0;width:auto}.vertical-filmstrip .filmstrip .filmstrip__videos.hidden{bottom:auto;right:-196px}.vertical-filmstrip .filmstrip .filmstrip__videos#remoteVideos{border:2px solid transparent;padding-left:0;transition:right 2s;width:100%}.vertical-filmstrip .filmstrip #filmstripLocalVideo{align-self:initial;bottom:5px;display:flex;flex-direction:column-reverse;height:auto;justify-content:flex-start}.vertical-filmstrip .filmstrip #filmstripLocalVideo #filmstripLocalVideoThumbnail{width:calc(100% - 15px)}.vertical-filmstrip .filmstrip #filmstripLocalVideo #filmstripLocalVideoThumbnail .videocontainer{height:0;width:100%}.vertical-filmstrip .filmstrip #filmstripLocalVideo,.vertical-filmstrip .filmstrip #filmstripRemoteVideos{padding:0}.vertical-filmstrip .filmstrip #filmstripRemoteVideos{min-height:0;min-width:0;display:flex;flex:1;flex-direction:column-reverse;height:auto;overflow-x:hidden;overflow-y:scroll}.vertical-filmstrip .filmstrip #filmstripRemoteVideos #filmstripRemoteVideosContainer{min-height:0;min-width:0;flex-direction:column-reverse;overflow:visible;width:calc(100% - 8px)}.vertical-filmstrip .filmstrip #filmstripRemoteVideos #filmstripRemoteVideosContainer .videocontainer{height:0;width:100%}.vertical-filmstrip .filmstrip #remoteVideos{min-height:0;min-width:0;flex-direction:column;flex-grow:1}.vertical-filmstrip .filmstrip .remote-videos-container{display:flex;transition:opacity 1s}.vertical-filmstrip .filmstrip .hide-scrollbar#filmstripRemoteVideos{margin-right:7px}.vertical-filmstrip .filmstrip .hide-scrollbar#filmstripRemoteVideos::-webkit-scrollbar{display:none}.filmstrip-only .vertical-filmstrip .filmstrip{flex-direction:row-reverse}.filmstrip-only .vertical-filmstrip .filmstrip__videos-filmstripOnly{margin-top:auto;margin-bottom:auto;height:100%}.filmstrip-only .vertical-filmstrip .filmstrip__videos#filmstripLocalVideo{bottom:0}@-moz-document url-prefix(){.vertical-filmstrip #remoteVideos #filmstripRemoteVideos #filmstripRemoteVideosContainer{flex-direction:column;width:calc(100% - 15px)}}@supports (-ms-ime-align:auto){.vertical-filmstrip #remoteVideos #filmstripRemoteVideos #filmstripRemoteVideosContainer{flex-direction:column}}.vertical-filmstrip .filmstrip__toolbar{transform:rotate(-90deg)}.vertical-filmstrip #etherpad,.vertical-filmstrip #sharedvideo{text-align:left}.vertical-filmstrip .filmstrip__videos .videocontainer .videocontainer__toolbar{pointer-events:none;text-align:right}.vertical-filmstrip .filmstrip__videos .videocontainer .videocontainer__toolbar>div{pointer-events:none}.vertical-filmstrip .filmstrip__videos .videocontainer .videocontainer__toolbar .right{float:none;margin:auto}.vertical-filmstrip .filmstrip__videos .videocontainer .videocontainer__toolbar .toolbar-icon{pointer-events:all}.vertical-filmstrip .filmstrip__videos .videocontainer .connection-indicator,.vertical-filmstrip .filmstrip__videos .videocontainer .indicator-icon-container,.vertical-filmstrip .filmstrip__videos .videocontainer .remote-video-menu-trigger{transform:translate3d(0,0,0)}.vertical-filmstrip .filmstrip__videos .videocontainer .indicator-icon-container{display:inline-block}.vertical-filmstrip .filmstrip__videos .videocontainer .indicator-container{float:none}.vertical-filmstrip .filmstrip__videos .videocontainer .remote-video-menu-trigger,.vertical-filmstrip .filmstrip__videos .videocontainer .remotevideomenu{bottom:0;left:0;top:auto;right:auto}.vertical-filmstrip .filmstrip__videos .videocontainer .remote-video-menu-trigger{margin-bottom:7px;margin-left:initial}.vertical-filmstrip .large-video-labels.with-filmstrip{right:150px}.vertical-filmstrip .large-video-labels.with-filmstrip.opening{transition:.9s;transition-timing-function:ease-in-out}.vertical-filmstrip .large-video-labels.without-filmstrip{transition:1.2s ease-in-out;transition-delay:.1s}.unsupported-desktop-browser{top:50%;left:50%;position:absolute;-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:block;text-align:center}.unsupported-desktop-browser__title{color:#fff;font-weight:300;font-size:24px;letter-spacing:1px}.unsupported-desktop-browser__description,.unsupported-desktop-browser__description_small{color:rgba(255,255,255,.7);font-size:21px;font-weight:300;letter-spacing:1px;margin-top:16px}.unsupported-desktop-browser__description_small{font-size:17px}.unsupported-desktop-browser__link{color:#489afe;-moz-transition:color .1s ease-out;-o-transition:color .1s ease-out;-webkit-transition:color .1s ease-out;transition:color .1s ease-out}.unsupported-desktop-browser__link:hover{color:#287ade;cursor:pointer;text-decoration:none;-moz-transition:color .1s ease-in;-o-transition:color .1s ease-in;-webkit-transition:color .1s ease-in;transition:color .1s ease-in}.modal-dialog-form .add-people-form-wrap .error,.modal-dialog-form .add-people-form-wrap .error a{padding-left:5px}.modal-dialog-form .add-people-form-wrap .add-telephone-icon{display:flex;height:28px;transform:scaleX(-1);width:28px}.modal-dialog-form .add-people-form-wrap .add-telephone-icon i{line-height:28px;margin:auto}.modal-dialog-form .add-people-form-wrap .footer-text-wrap{display:flex}.modal-dialog-form .add-people-form-wrap .footer-telephone-icon{display:flex;transform:scaleX(-1);padding-left:10px}.modal-dialog-form .add-people-form-wrap .footer-telephone-icon i{line-height:20px;margin:auto}.autocomplete-error{min-width:260px}.deep-linking-desktop{background-color:#fff;width:100%;height:100%;display:flex;flex-flow:column}.deep-linking-desktop .header{width:100%;height:55px;background-color:#f1f2f5;padding-top:15px;padding-left:50px;display:flex;flex-flow:row;flex:0 0 55px}.deep-linking-desktop .header .logo{height:40px}.deep-linking-desktop .content{padding-top:40px;padding-bottom:40px;left:0;right:0;display:flex;width:100%;height:100%;flex-flow:row}.deep-linking-desktop .content .leftColumn{left:0;width:50%;min-height:156px;display:flex;flex-flow:column}.deep-linking-desktop .content .leftColumn .leftColumnContent{padding:20px;display:flex;flex-flow:column;height:100%}.deep-linking-desktop .content .leftColumn .leftColumnContent .image{background-image:url(../images/deep-linking-image.png);background-repeat:no-repeat;background-position:center;background-size:contain;height:100%;width:100%}.deep-linking-desktop .content .rightColumn{top:0;width:50%;min-height:156px;display:flex;flex-flow:row;align-items:center}.deep-linking-desktop .content .rightColumn .rightColumnContent{display:flex;flex-flow:column;padding:20px 20px 20px 60px}.deep-linking-desktop .content .rightColumn .rightColumnContent .title{color:#1c2946}.deep-linking-desktop .content .rightColumn .rightColumnContent .description{color:#606a80;margin-top:8px}.deep-linking-desktop .content .rightColumn .rightColumnContent .buttons{margin-top:16px}.deep-linking-mobile{background-color:#fff;height:100vh;overflow:auto;position:relative;width:100vw}.deep-linking-mobile .header{width:100%;height:70px;background-color:#f1f2f5;text-align:center}.deep-linking-mobile .header .logo{margin-top:15px;margin-left:auto;margin-right:auto;height:40px}.deep-linking-mobile a{text-decoration:none;color:inherit}.deep-linking-mobile__body{color:#4a4a4a;margin:auto;max-width:40em;padding:35px 0 40px;text-align:center;width:90%}.deep-linking-mobile__body a:active{text-decoration:none}.deep-linking-mobile__body .image{max-width:80%}.deep-linking-mobile__text{font-weight:bolder;padding:10px 10px 0}.deep-linking-mobile .deep-linking-dial-in,.deep-linking-mobile__text{font-size:1em;line-height:1.38095em;margin-bottom:.65em}.deep-linking-mobile .deep-linking-dial-in_small,.deep-linking-mobile__text_small{font-size:1.5em;margin-bottom:1em;margin-top:1.16667em}.deep-linking-mobile .deep-linking-dial-in_small strong,.deep-linking-mobile__text_small strong{font-size:1.16667em}.deep-linking-mobile .deep-linking-dial-in table,.deep-linking-mobile__text table{font-size:1em}.deep-linking-mobile .deep-linking-dial-in .dial-in-conference-id,.deep-linking-mobile__text .dial-in-conference-id{margin:10px 0;padding:inherit;background-color:inherit;border-radius:inherit}.deep-linking-mobile__button,.deep-linking-mobile__button:active{background-color:rgba(9,30,66,.04)}.deep-linking-mobile .deep-linking-dial-in .dial-in-conference-name,.deep-linking-mobile__text .dial-in-conference-name{font-size:inherit;line-height:inherit;margin-bottom:none;font-weight:inherit}.deep-linking-mobile .deep-linking-dial-in .dial-in-conference-description,.deep-linking-mobile__text .dial-in-conference-description{font-size:.8em;line-height:inherit;margin-bottom:none}.deep-linking-mobile .deep-linking-dial-in .dial-in-conference-pin,.deep-linking-mobile__text .dial-in-conference-pin{font-size:inherit;line-height:inherit}.deep-linking-mobile__button,.deep-linking-mobile__href{line-height:2.28571em;max-width:300px;font-size:inherit;width:auto}.deep-linking-mobile .deep-linking-dial-in .toll-free-list,.deep-linking-mobile__text .toll-free-list{min-width:80px}.deep-linking-mobile .deep-linking-dial-in .numbers-list,.deep-linking-mobile__text .numbers-list{min-width:150px}.deep-linking-mobile .deep-linking-dial-in li.toll-free:empty:before,.deep-linking-mobile__text li.toll-free:empty:before{content:'.';visibility:hidden}.deep-linking-mobile__href{height:2.2857142857142856em;margin:18px auto 20px;font-weight:bolder}.deep-linking-mobile__button{border:0;height:2.28571em;margin:18px auto 10px;padding:0 10px;-webkit-border-radius:3px;border-radius:3px;background-clip:padding-box;color:#505F79;font-weight:700}.deep-linking-mobile__button_primary{background-color:#0052CC;color:#FFF;border-radius:inherit}.deep-linking-mobile__button_primary:active{background-color:#0052CC}.deep-linking-mobile .deep-linking-dial-in{display:none}.deep-linking-mobile .deep-linking-dial-in.has-numbers{align-items:center;display:flex;flex-direction:column}.deep-linking-mobile .deep-linking-dial-in .dial-in-numbers-list{color:#4a4a4a;padding-left:20px}.deep-linking-mobile .deep-linking-dial-in .dial-in-numbers-body{vertical-align:top}.no-mobile-app{margin:30% auto 0;max-width:25em;text-align:center;width:auto}.no-mobile-app__title{border-bottom:1px solid #fff;color:#fff;font-weight:400;letter-spacing:.5px;padding-bottom:.70833em}.no-mobile-app__description{font-size:17px;font-weight:300;letter-spacing:1px;margin-top:1em}.transcription-subtitles{bottom:10%;font-size:16px;font-weight:1000;left:50%;max-width:50vw;opacity:.8;pointer-events:none;position:absolute;text-shadow:0 0 1px rgba(0,0,0,.3),0 1px 1px rgba(0,0,0,.3),1px 0 1px rgba(0,0,0,.3),0 0 1px rgba(0,0,0,.3);transform:translateX(-50%);z-index:6}.transcription-subtitles span{background:#000}.meetings-list{font-size:14px;color:#253858;line-height:20px;text-align:left;text-overflow:ellipsis;display:flex;flex-direction:column;position:relative;width:100%;height:100%;overflow:auto}.meetings-list .meetings-list-empty{text-align:center;align-items:center;justify-content:center;display:flex;flex-grow:1;flex-direction:column}.meetings-list .meetings-list-empty .description{font-size:16px;padding:20px}.meetings-list .button{background:#0074E0;border-radius:4px;color:#FFF;display:flex;justify-content:center;align-items:center;padding:5px 10px;cursor:pointer}.meetings-list .calendar-action-buttons .button{margin:0 10px}.meetings-list .item{background:rgba(255,255,255,.5);box-sizing:border-box;margin-top:5px;min-height:92px;width:100%;word-break:break-word;display:flex;flex-direction:row;text-align:left}.meetings-list .item:first-child{margin-top:0}.meetings-list .item .left-column{display:flex;flex-direction:column;width:140px;flex-grow:0;padding-left:30px;padding-top:25px}.meetings-list .item .left-column .date{font-weight:700;padding-bottom:5px}.meetings-list .item .right-column{display:flex;flex-direction:column;flex-grow:1;padding-left:30px;padding-top:25px}.meetings-list .item .right-column .title{font-size:16px;font-weight:700;padding-bottom:5px}.meetings-list .item .actions{display:flex;align-items:center;justify-content:center;flex-grow:0;padding-right:30px}.meetings-list .item.with-click-handler{cursor:pointer}.meetings-list .item.with-click-handler:hover{background-color:#75A7E7}.meetings-list .item .add-button{width:30px;height:30px;padding:0}.meetings-list .item i{cursor:inherit}.meetings-list .item .join-button{display:none}.meetings-list .item:hover .join-button{display:block}.navigate-section-section-header,.navigate-section-tile-body,.navigate-section-tile-title{width:100%;font-size:14px;line-height:20px;color:#fff;text-align:left;font-family:open_sanslight,Helvetica,sans-serif}.navigate-section-tile-body,.navigate-section-tile-title{overflow:hidden;text-overflow:ellipsis;float:left}.navigate-section-list-tile{background-color:#1754A9;border-radius:4px;box-sizing:border-box;display:inline-flex;margin-bottom:8px;margin-right:8px;min-height:100px;padding:16px;width:100%}.navigate-section-list-tile.with-click-handler{cursor:pointer}.navigate-section-list-tile.with-click-handler:hover{background-color:#1a5dbb}.navigate-section-list-tile i{cursor:inherit}.navigate-section-list-tile .element-after{display:flex;align-items:center;justify-content:center}.navigate-section-list-tile .join-button{display:none}.navigate-section-list-tile:hover .join-button{display:block}.navigate-section-tile-body{font-weight:400;line-height:24px}.navigate-section-list-tile-info{flex:1;word-break:break-word}.navigate-section-tile-title{font-weight:700;line-height:24px}.navigate-section-section-header{font-weight:700;margin-bottom:16px;display:block}.navigate-section-list{position:relative;margin-top:36px;margin-bottom:36px;width:100%}.navigate-section-list-empty{text-align:center}.google-sign-in{background-color:#4285f4;border-radius:2px;cursor:pointer;display:inline-flex;font-family:Roboto,arial,sans-serif;font-size:14px;padding:1px}.google-sign-in .google-cta{color:#fff;display:inline-block;line-height:32px;margin:0 15px}.google-sign-in .google-logo{background-color:#fff;border-radius:2px;display:inline-block;padding:8px;height:18px;width:18px}.microsoft-sign-in{align-items:center;background:#FFF;border:1px solid #8C8C8C;box-sizing:border-box;cursor:pointer;display:inline-flex;font-family:Segoe UI,Roboto,arial,sans-serif;height:41px;padding:12px}.microsoft-sign-in .microsoft-cta{display:inline-block;color:#5E5E5E;font-size:15px;line-height:41px}.microsoft-sign-in .microsoft-logo{display:inline-block;margin-right:12px}.avatar{background-color:#AAA;border-radius:50%;color:rgba(255,255,255,.6);font-weight:100;object-fit:cover}.avatar.avatar-small{height:28px!important;width:28px!important}.avatar.avatar-xsmall{height:16px!important;width:16px!important}.avatar .jitsi-icon{transform:translateY(50%)}.avatar-foreign{align-items:center;bottom:0;display:flex;font-size:40pt;justify-content:center;left:0;position:absolute;right:0;top:0}.avatar-svg{height:100%;width:100%}.defaultAvatar{opacity:.6}.avatar-badge{position:relative}.avatar-badge-available::after,.avatar-badge-away::after,.avatar-badge-busy::after,.avatar-badge-idle::after{border-radius:50%;content:'';display:block;height:35%;position:absolute;width:35%;bottom:0}.avatar-badge-available::after{background-color:#6eb005}.avatar-badge-away::after{background-color:#fac914}.avatar-badge-busy::after{background-color:#e9001b}.avatar-badge-idle::after{background-color:#acacac}.chrome-extension-banner{position:fixed;width:406px;height:128px;background:#FFF;box-shadow:0 2px 48px rgba(0,0,0,.25);border-radius:4px;z-index:1000;float:right;display:flex;flex-direction:column;padding:20px;top:80px;right:16px}.chrome-extension-banner__pos_in_meeting{top:10px;right:10px}.chrome-extension-banner__container{display:flex;justify-content:space-between;margin-bottom:16px}.chrome-extension-banner__checkbox-label,.chrome-extension-banner__text-container{line-height:18px;align-items:center;font-size:14px;letter-spacing:-.006em;display:flex}.chrome-extension-banner__button-container{display:flex}.chrome-extension-banner__checkbox-container{display:flex;margin-left:45px;margin-top:16px}.chrome-extension-banner__checkbox-label{color:#1C2025}.chrome-extension-banner__icon-container{display:flex;background:url(../images/chromeLogo.svg) no-repeat;width:27px;height:27px}.chrome-extension-banner__text-container{color:#151531;width:329px}.chrome-extension-banner__close-container{display:flex;width:12px;height:12px}.chrome-extension-banner__gray-close-icon{fill:#5E6D7A;width:12px;height:12px;cursor:pointer}.chrome-extension-banner__button-open-url{background:#0A57EB;border-radius:24px;margin-left:45px;width:236px;height:40px;cursor:pointer}.chrome-extension-banner__button-text{font-weight:600;font-size:14px;line-height:40px;text-align:center;letter-spacing:-.006em;color:#FFF}.settings-button-container{position:relative}.settings-button-container .toolbox-icon{align-items:center;cursor:pointer;display:flex;background-color:#fff;border-radius:50%;border:1px solid #d1dbe8;justify-content:center;width:38px;height:38px}.settings-button-container .toolbox-icon:hover{background-color:#daebfa;border:1px solid #daebfa}.settings-button-container .toolbox-icon.toggled{background:#2a3a4b;border:1px solid #5e6d7a}.settings-button-container .toolbox-icon.toggled svg{fill:#fff}.settings-button-container .toolbox-icon.toggled:hover{background-color:#5e6d7a}.disabled .settings-button-container .toolbox-icon,.settings-button-container .toolbox-icon.disabled{cursor:initial;color:#fff;background-color:#a4b8d1}.settings-button-container .toolbox-icon svg{fill:#5e6d7a}.settings-button-small-icon{background:#FFF;border:1px solid rgba(0,0,0,.2);border-radius:50%;bottom:0;box-shadow:0 1px 4px rgba(0,0,0,.25);cursor:pointer;height:16px;position:absolute;text-align:center;right:4px;width:16px}.audio-preview-microphone,.audio-preview-speaker{position:relative}.settings-button-small-icon>svg{margin-top:5px}.settings-button-small-icon--disabled{background-color:#a4b8d1;cursor:default}.settings-button-small-icon--hovered{bottom:-1px;height:20px;right:2px;width:20px}.settings-button-small-icon--hovered>svg{margin-top:6px}.jitsi-icon.metr{display:inline-block}.jitsi-icon.metr>svg{fill:#4E5E6C;width:38px}.jitsi-icon.metr--disabled>svg{fill:#4E5E6C}.metr-l-0 rect:first-child,.metr-l-1 rect:nth-child(-n+2),.metr-l-2 rect:nth-child(-n+3),.metr-l-3 rect:nth-child(-n+4),.metr-l-4 rect:nth-child(-n+5),.metr-l-5 rect:nth-child(-n+6),.metr-l-6 rect:nth-child(-n+7),.metr-l-7 rect:nth-child(-n+8){fill:#31B76A}.audio-preview-content{font-size:15px;line-height:24px;max-height:456px;overflow:auto;width:328px}.audio-preview-header{color:#fff;display:flex;padding:16px}.audio-preview-header-icon{display:inline-block}.audio-preview-header-text{font-weight:700;margin-left:8px}.audio-preview-entry{align-items:center;color:#fff;cursor:pointer;display:flex;padding:12px 0;margin-left:48px}.audio-preview-icon,.audio-preview-speaker:hover .audio-preview-test-button{display:inline-block}.audio-preview-entry--selected{background:rgba(28,32,37,.5);cursor:initial;margin-left:0;padding-left:21px}.audio-preview-entry-text{color:#fff;font-size:15px;display:inline-block;line-height:24px;text-overflow:ellipsis;max-width:213px;overflow:hidden;white-space:nowrap}.audio-preview-speaker:hover .audio-preview-entry{background:rgba(255,255,255,.2);margin-left:0;padding-left:48px}.audio-preview-speaker:hover .audio-preview-entry--selected{padding-left:21px}.audio-preview-speaker .audio-preview-entry-text{max-width:256px}.audio-preview-icon{border-radius:50%;width:14px}.audio-preview-icon svg{fill:#1C2025}.audio-preview-icon--check{background:#31B76A;margin-right:13px}.audio-preview-icon--exclamation{margin-left:6px}.audio-preview-icon--exclamation svg{fill:#E54B4B}.audio-preview-test-button{display:none;background:#FFF;border:1px solid #D1DBE8;border-radius:3px;color:#1C2025;cursor:pointer;font-weight:600;font-size:15px;line-height:24px;padding:4px 16px;position:absolute;right:16px;top:8px}.audio-preview-meter-mic{position:absolute;right:16px;top:18px}.audio-preview>div>div:nth-child(2)>div>div{outline:0;padding:0}.video-preview{max-height:290px;overflow:auto}.video-preview-entry{cursor:pointer;height:135px;margin-bottom:16px;position:relative;width:240px}.video-preview-entry:last-child{margin-bottom:0}.video-preview-entry--selected{border:3px solid #31B76A;cursor:default;height:129px;width:234px}.video-preview-video{height:100%;object-fit:cover;width:100%}.video-preview-overlay{background:rgba(42,58,75,.6);height:100%;position:absolute;width:100%;z-index:1}.video-preview-error{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;width:100%}.video-preview-label{color:#fff;font-size:13px;line-height:20px;overflow:hidden;padding:8px;position:absolute;text-align:center;text-overflow:ellipsis;width:220px;z-index:2}.video-preview>div>div:nth-child(2)>div>div{outline:0;padding:16px} \ No newline at end of file diff --git a/templates/interface_config.js.j2 b/templates/interface_config.js.j2 index 237ee40..9b804ec 100644 --- a/templates/interface_config.js.j2 +++ b/templates/interface_config.js.j2 @@ -27,8 +27,10 @@ var interfaceConfig = { SHOW_DEEP_LINKING_IMAGE: false, GENERATE_ROOMNAMES_ON_WELCOME_PAGE: {{ jitsi_meet_generate_roomnames_on_welcome_page }}, DISPLAY_WELCOME_PAGE_CONTENT: true, + DISPLAY_WELCOME_PAGE_TOOLBAR_ADDITIONAL_CONTENT: false, APP_NAME: '{{ jitsi_meet_appname }}', NATIVE_APP_NAME: '{{ jitsi_meet_appname }}', + PROVIDER_NAME: 'Jitsi', LANG_DETECTION: {{ jitsi_meet_lang_detection }}, // Allow i18n to detect the system language INVITATION_POWERED_BY: true, @@ -49,7 +51,7 @@ var interfaceConfig = { 'fodeviceselection', 'hangup', 'profile', 'info', 'chat', 'recording', 'livestreaming', 'etherpad', 'sharedvideo', 'settings', 'raisehand', 'videoquality', 'filmstrip', 'invite', 'feedback', 'stats', 'shortcuts', - 'tileview' + 'tileview', 'videobackgroundblur', 'download', 'help', 'mute-everyone' ], SETTINGS_SECTIONS: [ 'devices', 'language', 'moderator', 'profile', 'calendar' ], @@ -72,6 +74,7 @@ var interfaceConfig = { // A html text to be shown to guests on the close page, false disables it CLOSE_PAGE_GUEST_HINT: false, + SHOW_PROMOTIONAL_CLOSE_PAGE: false, RANDOM_AVATAR_URL_PREFIX: false, RANDOM_AVATAR_URL_SUFFIX: false, FILM_STRIP_MAX_HEIGHT: 120, @@ -125,7 +128,7 @@ var interfaceConfig = { * If indicated some of the error dialogs may point to the support URL for * help. */ - SUPPORT_URL: 'https://github.com/jitsi/jitsi-meet/issues/new', + SUPPORT_URL: 'https://community.jitsi.org/', /** * Whether the connection indicator icon should hide itself based on @@ -171,7 +174,49 @@ var interfaceConfig = { * * @type {boolean} */ - RECENT_LIST_ENABLED: true + RECENT_LIST_ENABLED: true, + + // Names of browsers which should show a warning stating the current browser + // has a suboptimal experience. Browsers which are not listed as optimal or + // unsupported are considered suboptimal. Valid values are: + // chrome, chromium, edge, electron, firefox, nwjs, opera, safari + OPTIMAL_BROWSERS: [ 'chrome', 'chromium', 'firefox', 'nwjs', 'electron' ], + + // Browsers, in addition to those which do not fully support WebRTC, that + // are not supported and should show the unsupported browser page. + UNSUPPORTED_BROWSERS: [], + + /** + * A UX mode where the last screen share participant is automatically + * pinned. Valid values are the string "remote-only" so remote participants + * get pinned but not local, otherwise any truthy value for all participants, + * and any falsy value to disable the feature. + * + * Note: this mode is experimental and subject to breakage. + */ + AUTO_PIN_LATEST_SCREEN_SHARE: 'remote-only', + + /** + * If true, presence status: busy, calling, connected etc. is not displayed. + */ + DISABLE_PRESENCE_STATUS: false, + + /** + * If true, notifications regarding joining/leaving are no longer displayed. + */ + DISABLE_JOIN_LEAVE_NOTIFICATIONS: false, + + /** + * Decides whether the chrome extension banner should be rendered on the landing page and during the meeting. + * If this is set to false, the banner will not be rendered at all. If set to true, the check for extension(s) + * being already installed is done before rendering. + */ + SHOW_CHROME_EXTENSION_BANNER: false + + /** + * When enabled, the kick participant button will not be presented for users without a JWT + */ + // HIDE_KICK_BUTTON_FOR_GUESTS: false /** * How many columns the tile view can expand to. The respected range is @@ -192,7 +237,25 @@ var interfaceConfig = { /** * Specify mobile app scheme for opening the app from the mobile browser. */ - // APP_SCHEME: 'org.jitsi.meet' + // APP_SCHEME: 'org.jitsi.meet', + + /** + * Specify the Android app package name. + */ + // ANDROID_APP_PACKAGE: 'org.jitsi.meet', + + /** + * Override the behavior of some notifications to remain displayed until + * explicitly dismissed through a user action. The value is how long, in + * milliseconds, those notifications should remain displayed. + */ + // ENFORCE_NOTIFICATION_AUTO_DISMISS_TIMEOUT: 15000, + // List of undocumented settings + /** + INDICATOR_FONT_SIZES + MOBILE_DYNAMIC_LINK + PHONE_NUMBER_REGEX + */ }; /* eslint-enable no-unused-vars, no-var, max-len */ diff --git a/templates/jicofo_sip-communicator.properties.j2 b/templates/jicofo_sip-communicator.properties.j2 new file mode 100644 index 0000000..7f61f7d --- /dev/null +++ b/templates/jicofo_sip-communicator.properties.j2 @@ -0,0 +1,2 @@ +org.jitsi.jicofo.BRIDGE_MUC=JvbBrewery@internal.auth.{{ jitsi_meet_server_name }} +org.jitsi.jicofo.ALWAYS_TRUST_MODE_ENABLED=true diff --git a/templates/jitsi_meet_config.js.j2 b/templates/jitsi_meet_config.js.j2 index 03c8883..b23dddf 100644 --- a/templates/jitsi_meet_config.js.j2 +++ b/templates/jitsi_meet_config.js.j2 @@ -41,6 +41,9 @@ var config = { // BOSH URL. FIXME: use XEP-0156 to discover it. bosh: '//{{ jitsi_meet_server_name }}/http-bind', + // Websocket URL + // websocket: 'wss://{{ jitsi_meet_server_name }}/xmpp-websocket', + // The name of client node advertised in XEP-0115 'c' stanza clientNode: 'http://{{ jitsi_meet_server_name }}/jitsimeet', @@ -75,30 +78,53 @@ var config = { // Media // + // Disables the auto-play behavior of *all* newly created video element. + // This is useful when the client runs on a host with limited resources. + // noAutoPlayVideo: false + // Audio // Disable measuring of audio levels. // disableAudioLevels: false, + // audioLevelsInterval: 200, + + // Enabling this will run the lib-jitsi-meet no audio detection module which + // will notify the user if the current selected microphone has no audio + // input and will suggest another valid device if one is present. + enableNoAudioDetection: true, + + // Enabling this will run the lib-jitsi-meet noise detection module which will + // notify the user if there is noise, other than voice, coming from the current + // selected microphone. The purpose it to let the user know that the input could + // be potentially unpleasant for other meeting participants. + enableNoisyMicDetection: true, + + // Start the conference in audio only mode (no video is being received nor // sent). // startAudioOnly: false, // Every participant after the Nth will start audio muted. - // startAudioMuted: 10, + startAudioMuted: 3, // Start calls with audio muted. Unlike the option above, this one is only // applied locally. FIXME: having these 2 options is confusing. // startWithAudioMuted: false, + // Enabling it (with #params) will disable local audio output of remote + // participants and to enable it back a reload is needed. + // startSilent: false + + // Video // Sets the preferred resolution (height) for local video. Defaults to 720. - resolution: 480, + resolution: 480, // w3c spec-compliant video constraints to use for video capture. Currently // used by browsers that return true from lib-jitsi-meet's - // util#browser#usesNewGumFlow. The constraints are independency from + // util#browser#usesNewGumFlow. The constraints are independent from // this config's resolution value. Defaults to requesting an ideal aspect // ratio of 16:9 with an ideal resolution of 720. constraints: { @@ -120,10 +146,6 @@ var config = { // are requested again. // enableLayerSuspension: false, - // Suspend sending video if bandwidth estimation is too low. This may cause - // problems with audio playback. Disabled until these are fixed. - disableSuspendVideo: true, - // Every participant after the Nth will start video muted. // startVideoMuted: 10, @@ -135,14 +157,12 @@ var config = { // Note that it's not recommended to do this because simulcast is not // supported when using H.264. For 1-to-1 calls this setting is enabled by // default and can be toggled in the p2p section. - preferH264: true, + // preferH264: true, // If set to true, disable H.264 video codec by stripping it out of the // SDP. // disableH264: false, - - // Desktop sharing // The ID of the jidesha extension for Chrome. @@ -177,7 +197,21 @@ var config = { // Enable the dropbox integration. // dropbox: { // appKey: '' // Specify your app key here. + // // A URL to redirect the user to, after authenticating + // // by default uses: + // // 'https://template.interior.edu.uy/static/oauth.html' + // redirectURI: + // 'https://template.interior.edu.uy/subfolder/static/oauth.html' // }, + // When integrations like dropbox are enabled only that will be shown, + // by enabling fileRecordingsServiceEnabled, we show both the integrations + // and the generic recording service (its configuration and storage type + // depends on jibri configuration) + // fileRecordingsServiceEnabled: false, + // Whether to show the possibility to share file recording with other people + // (e.g. meeting participants), based on the actual implementation + // on the backend. + // fileRecordingsServiceSharingEnabled: false, // Whether to enable live streaming or not. // liveStreamingEnabled: false, @@ -186,6 +220,10 @@ var config = { // subtitles and buttons can be configured) // transcribingEnabled: false, + // Enables automatic turning on captions when recording is started + // autoCaptionOnRecord: false, + + // Misc // Default value for the channel "last N" attribute. -1 for unlimited. @@ -212,10 +250,10 @@ var config = { // minParticipants: 2, // Use XEP-0215 to fetch STUN and TURN servers. - // useStunTurn: true, + useStunTurn: {{ jitsi_meet_use_stun_turn }}, // Enable IPv6 support. - // useIPv6: true, + {% if(not jitsi_meet_ipv6_enable) %}// {% endif%}useIPv6: true, // Enables / disables a data communication channel with the Videobridge. // Values can be 'datachannel', 'websocket', true (treat it as @@ -244,13 +282,20 @@ var config = { // disable1On1Mode: false, // Default language for the user interface. - defaultLanguage: '{{ jitsi_meet_lang }}', + defaultLanguage: '{{ jitsi_meet_lang | default('en') }}', // If true all users without a token will be considered guests and all users // with token will be considered non-guests. Only guests will be allowed to // edit their profile. enableUserRolesBasedOnToken: false, + // Enable lock room for all moderators, even when userRolesBasedOnToken is enabled and participants are guests. + // lockRoomGuestEnabled: false, + + // When enabled the password used for locking a room is restricted to up to the number of digits specified + // roomPasswordNumberOfDigits: 10, + // default: roomPasswordNumberOfDigits: false, + // Whether or not some features are checked based on token. // enableFeaturesBasedOnToken: false, @@ -271,17 +316,20 @@ var config = { // estimation tests. // gatherStats: false, + // The interval at which PeerConnection.getStats() is called. Defaults to 10000 + // pcStatsInterval: 10000, + // To enable sending statistics to callstats.io you must provide the // Application ID and Secret. // callStatsID: '', // callStatsSecret: '', - // enables callstatsUsername to be reported as statsId and used - // by callstats as repoted remote id - // enableStatsID: false - // enables sending participants display name to callstats - // enableDisplayNameInStats: false + // enableDisplayNameInStats: false, + + // enables sending participants email if available to callstats and other analytics + // enableEmailInStats: false, + // Privacy // @@ -305,13 +353,15 @@ var config = { enabled: true, // Use XEP-0215 to fetch STUN and TURN servers. - // useStunTurn: true, + useStunTurn: {{ jitsi_meet_use_stun_turn }}, // The STUN servers that will be used in the peer to peer connections stunServers: [ - { urls: 'stun:stun.l.google.com:19302' }, - { urls: 'stun:stun1.l.google.com:19302' }, - { urls: 'stun:stun2.l.google.com:19302' } + +{% for stun_server in jitsi_meet_stun_servers %} + { urls: '{{ stun_server }}' }, +{% endfor %} + ], // Sets the ICE transport policy for the p2p connection. At the time @@ -335,14 +385,19 @@ var config = { // backToP2PDelay: 5 }, - // A list of scripts to load as lib-jitsi-meet "analytics handlers". - // analyticsScriptUrls: [ - // "libs/analytics-ga.js", // google-analytics - // "https://example.com/my-custom-analytics.js" - // ], + analytics: { + // The Google Analytics Tracking ID: + // googleAnalyticsTrackingId: 'your-tracking-id-UA-123456-1' - // The Google Analytics Tracking ID - // googleAnalyticsTrackingId = 'your-tracking-id-here-UA-123456-1', + // The Amplitude APP Key: + // amplitudeAPPKey: '' + + // Array of script URLs to load as lib-jitsi-meet "analytics handlers". + // scriptURLs: [ + // "libs/analytics-ga.min.js", // google-analytics + // "https://example.com/my-custom-analytics.js" + // ], + }, // Information about the jitsi-meet instance we are connecting to, including // the user region as seen by the server. @@ -350,7 +405,24 @@ var config = { // shard: "shard1", // region: "europe", // userRegion: "asia" - } + }, + + // Decides whether the start/stop recording audio notifications should play on record. + // disableRecordAudioNotification: false, + + // Information for the chrome extension banner + // chromeExtensionBanner: { + // // The chrome extension to be installed address + // url: 'https://chrome.google.com/webstore/detail/jitsi-meetings/kglhbbefdnlheedjiejgomgmfplipfeb', + + // // Extensions info which allows checking if they are installed or not + // chromeExtensionsInfo: [ + // { + // id: 'kglhbbefdnlheedjiejgomgmfplipfeb', + // path: 'jitsi-logo-48x48.png' + // } + // ] + // }, // Local Recording // @@ -368,7 +440,7 @@ var config = { // format: 'flac' // - // } + // }, // Options related to end-to-end (participant to participant) ping. @@ -381,7 +453,41 @@ var config = { // // with the measured RTT will be sent. Defaults to 60000, set // // to <= 0 to disable. // analyticsInterval: 60000, - // } + // }, + + // If set, will attempt to use the provided video input device label when + // triggering a screenshare, instead of proceeding through the normal flow + // for obtaining a desktop stream. + // NOTE: This option is experimental and is currently intended for internal + // use only. + // _desktopSharingSourceDevice: 'sample-id-or-label', + + // If true, any checks to handoff to another application will be prevented + // and instead the app will continue to display in the current browser. + // disableDeepLinking: false, + + // A property to disable the right click context menu for localVideo + // the menu has option to flip the locally seen video for local presentations + // disableLocalVideoFlip: false, + + // Deployment specific URLs. + // deploymentUrls: { + // // If specified a 'Help' button will be displayed in the overflow menu with a link to the specified URL for + // // user documentation. + // userDocumentationURL: 'https://docs.example.com/video-meetings.html', + // // If specified a 'Download our apps' button will be displayed in the overflow menu with a link + // // to the specified URL for an app download page. + // downloadAppsUrl: 'https://docs.example.com/our-apps.html' + // }, + + // Options related to the remote participant menu. + // remoteVideoMenu: { + // // If set to true the 'Kick out' button will be disabled. + // disableKick: true + // }, + + // If set to true all muting operations of remote participants will be disabled. + // disableRemoteMute: true, // List of undocumented settings used in jitsi-meet /** @@ -397,12 +503,10 @@ var config = { dialOutCodesUrl disableRemoteControl displayJids - enableLocalVideoFlip etherpad_base externalConnectUrl firefox_fake_device googleApiApplicationClientID - googleApiIOSClientID iAmRecorder iAmSipGateway microsoftApiApplicationClientID @@ -435,6 +539,13 @@ var config = { startBitrate */ + + // Allow all above example options to include a trailing comma and + // prevent fear when commenting out the last value. + makeJsonParserHappy: 'even if last key had a trailing comma' + + // no configuration value should follow this line. + }; /* eslint-enable no-unused-vars, no-var */ diff --git a/templates/jitsi_meet_nginx.conf.j2 b/templates/jitsi_meet_nginx.conf.j2 index 694efa4..3337ae2 100644 --- a/templates/jitsi_meet_nginx.conf.j2 +++ b/templates/jitsi_meet_nginx.conf.j2 @@ -2,44 +2,117 @@ server_names_hash_bucket_size 64; server { listen 80; - #listen [::]:80 ipv6only=off; +{% if(jitsi_meet_ipv6_enable) %} + listen [::]:80; +{% endif %} server_name {{ jitsi_meet_server_name }}; - return 301 https://$host$request_uri; + + location ^~ /.well-known/acme-challenge/ { + default_type "text/plain"; + root /usr/share/jitsi-meet; + } + location = /.well-known/acme-challenge/ { + return 404; + } + location / { + return 301 https://$host$request_uri; + } } server { - listen 443 ssl; - #listen [::]:443 ssl ipv6only=off; + listen {{ '4444 http2' if(jitsi_meet_install_recommends) else '443'}} ssl; +{% if(jitsi_meet_ipv6_enable) %} + listen [::]:{{ '4444 http2' if(jitsi_meet_install_recommends) else '443'}} ssl; +{% endif %} server_name {{ jitsi_meet_server_name }}; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED"; - {% if (jitsi_meet_ssl_cert_path == '' and jitsi_meet_ssl_key_path == '') %}#{% endif %} add_header Strict-Transport-Security "max-age=31536000"; + {% if (jitsi_meet_ssl_cert_path == '' and jitsi_meet_ssl_key_path == '') %}# {% endif %}add_header Strict-Transport-Security "max-age=31536000"; ssl_certificate {{ jitsi_meet_ssl_cert_path }}; ssl_certificate_key {{ jitsi_meet_ssl_key_path }}; root /usr/share/jitsi-meet; + + # ssi on with javascript for multidomain variables in config.js + ssi on; + ssi_types application/x-javascript application/javascript; + index index.html index.htm; error_page 404 /static/404.html; - location /config.js { + location = /config.js { alias /etc/jitsi/meet/{{ jitsi_meet_server_name }}-config.js; } - location ~ ^/([a-zA-Z0-9=\?]+)$ { - rewrite ^/(.*)$ / break; + location = /external_api.js { + alias /usr/share/jitsi-meet/libs/external_api.min.js; } - location / { - ssi on; + #ensure all static content can always be found first + location ~ ^/(libs|css|static|images|fonts|lang|sounds|connection_optimization|.well-known)/(.*)$ + { + add_header 'Access-Control-Allow-Origin' '*'; + alias /usr/share/jitsi-meet/$1/$2; } # BOSH - location /http-bind { + location = /http-bind { proxy_pass http://localhost:5280/http-bind; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $http_host; } + + # xmpp websockets + location = /xmpp-websocket { + proxy_pass http://127.0.0.1:5280/xmpp-websocket?prefix=$prefix&$args; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $http_host; + tcp_nodelay on; + } + + location ~ ^/([^/?&:'"]+)$ { + try_files $uri @root_path; + } + + location @root_path { + rewrite ^/(.*)$ / break; + } + + location ~ ^/([^/?&:'"]+)/config.js$ + { + set $subdomain "$1."; + set $subdir "$1/"; + + alias /etc/jitsi/meet/{{ jitsi_meet_server_name }}-config.js; + } + + #Anything that didn't match above, and isn't a real file, assume it's a room name and redirect to / + location ~ ^/([^/?&:'"]+)/(.*)$ { + set $subdomain "$1."; + set $subdir "$1/"; + rewrite ^/([^/?&:'"]+)/(.*)$ /$2; + } + + # BOSH for subdomains + location ~ ^/([^/?&:'"]+)/http-bind { + set $subdomain "$1."; + set $subdir "$1/"; + set $prefix "$1"; + + rewrite ^/(.*)$ /http-bind; + } + + # websockets for subdomains + location ~ ^/([^/?&:'"]+)/xmpp-websocket { + set $subdomain "$1."; + set $subdir "$1/"; + set $prefix "$1"; + + rewrite ^/(.*)$ /xmpp-websocket; + } } diff --git a/templates/prosody_config.j2 b/templates/prosody_config.j2 deleted file mode 100644 index 23d1dba..0000000 --- a/templates/prosody_config.j2 +++ /dev/null @@ -1,25 +0,0 @@ -VirtualHost "{{ jitsi_meet_server_name }}" - authentication = "{{ jitsi_meet_authentication }}" - ssl = { - key = "/var/lib/prosody/{{ jitsi_meet_server_name }}.key"; - certificate = "/var/lib/prosody/{{ jitsi_meet_server_name }}.crt"; - } - - modules_enabled = { - "bosh"; - "pubsub"; - "ping"; - } - -VirtualHost "auth.{{ jitsi_meet_server_name }}" - authentication = "internal_plain" - -Component "conference.{{ jitsi_meet_server_name }}" "muc" - -admins = { "focus@auth.{{ jitsi_meet_server_name }}" } - -Component "jitsi-videobridge.{{ jitsi_meet_server_name }}" - component_secret = "{{ jitsi_meet_videobridge_secret }}" - -Component "focus.{{ jitsi_meet_server_name }}" - component_secret = "{{ jitsi_meet_jicofo_secret }}" diff --git a/templates/prosody_focus_auth.j2 b/templates/prosody_focus_auth.j2 deleted file mode 100644 index 27d1b90..0000000 --- a/templates/prosody_focus_auth.j2 +++ /dev/null @@ -1,3 +0,0 @@ -return { - ["password"] = "{{ jitsi_meet_jicofo_password }}"; -}; diff --git a/templates/videobridge_config.j2 b/templates/videobridge_config.j2 index 8fce24a..525d8d6 100644 --- a/templates/videobridge_config.j2 +++ b/templates/videobridge_config.j2 @@ -13,7 +13,7 @@ JVB_PORT={{ jitsi_meet_videobridge_port }} JVB_SECRET={{ jitsi_meet_videobridge_secret }} # extra options to pass to the JVB daemon -JVB_OPTS="" +JVB_OPTS="--apis=rest," # adds java system props that are passed to jvb (default are for home and logging config file) diff --git a/templates/videobridge_sip-communicator.properties.j2 b/templates/videobridge_sip-communicator.properties.j2 new file mode 100644 index 0000000..4b5f8d4 --- /dev/null +++ b/templates/videobridge_sip-communicator.properties.j2 @@ -0,0 +1,12 @@ +org.ice4j.ice.harvest.DISABLE_AWS_HARVESTER=true +org.ice4j.ice.harvest.STUN_MAPPING_HARVESTER_ADDRESSES=meet-jit-si-turnrelay.jitsi.net:443 +org.jitsi.videobridge.AUTHORIZED_SOURCE_REGEXP=focus@auth.{{ jitsi_meet_server_name }}/.* +org.jitsi.videobridge.ENABLE_STATISTICS=true +org.jitsi.videobridge.STATISTICS_TRANSPORT=muc +org.jitsi.videobridge.xmpp.user.shard.HOSTNAME=localhost +org.jitsi.videobridge.xmpp.user.shard.DOMAIN=auth.{{ jitsi_meet_server_name }} +org.jitsi.videobridge.xmpp.user.shard.USERNAME=jvb +org.jitsi.videobridge.xmpp.user.shard.PASSWORD={{ jitsi_meet_videobridge_secret }} +org.jitsi.videobridge.xmpp.user.shard.MUC_JIDS=JvbBrewery@internal.auth.{{ jitsi_meet_server_name }} +org.jitsi.videobridge.xmpp.user.shard.MUC_NICKNAME=52eaf948-9d6c-436f-bf63-80f7a31444c2 + diff --git a/templates/welcomePageAdditionalContent.html.j2 b/templates/welcomePageAdditionalContent.html.j2 new file mode 100644 index 0000000..250c0c9 --- /dev/null +++ b/templates/welcomePageAdditionalContent.html.j2 @@ -0,0 +1 @@ + \ No newline at end of file