diff --git a/admin/class-agora-channels-list-table.php b/admin/class-agora-channels-list-table.php
index 107f53ed..82a70191 100644
--- a/admin/class-agora-channels-list-table.php
+++ b/admin/class-agora-channels-list-table.php
@@ -21,6 +21,17 @@ public static function define_columns() {
'title' => __( 'Title', 'agoraio' ),
'type' => __( 'Type', 'agoraio' ),
'shortcode' => __( 'Shortcode', 'agoraio' ),
+ //'recordings' => __( 'Recordings', 'agoraio' ),
+ 'date' => __( 'Date', 'agoraio' ),
+ );
+
+ return $columns;
+ }
+
+ public static function define_recordings_channels_columns() {
+ $columns = array(
+ 'title' => __( 'Channel Name', 'agoraio' ),
+ 'type' => __( 'Type', 'agoraio' ),
'date' => __( 'Date', 'agoraio' ),
);
@@ -62,6 +73,10 @@ protected function get_bulk_actions() {
$actions = array(
'delete' => __( 'Delete', 'agoraio' ),
);
+
+ if(isset($_GET['page']) && ($_GET['page'] == 'agoraio-recordings')){
+ $actions = array();
+ }
return $actions;
}
@@ -181,11 +196,14 @@ public static function record_count() {
function column_title( $item ) {
$title = '' . $item->title() . '';
+ if(isset($_GET['page']) && ($_GET['page'] == 'agoraio-recordings')){
+ $title = '' . $item->title() . '';
+ }
return $title;
}
protected function handle_row_actions( $item, $column_name, $primary ) {
- if ( $column_name !== $primary ) {
+ if ( $column_name !== $primary || ((isset($_GET['page']) && ($_GET['page'] == 'agoraio-recordings')))) {
return '';
}
@@ -251,6 +269,33 @@ public function column_type( $item ) {
return $item->type();
}
+ /* public function column_recordings( $item ){
+ $isrecordingSettingsDone = $item->isrecordingSettingsDone();
+ $recordingOptions = array(""=>"Type", "composite" => "Composite", "individual" => "Individual");
+ $output = 'Please fill recording settings details.';
+
+ // Show Recordings Shortcode if recording setting is done
+ if($isrecordingSettingsDone){
+ $recording_type = $item->getRecordingType();
+ ?>
+
+
+
+ shortcode('recording');
+ $output = "\n" . '';
+ }
+
+ return trim( $output );
+ } */
+
/**
* Render a column when no column specific method exists.
*
diff --git a/admin/class-wp-agora-io-admin.php b/admin/class-wp-agora-io-admin.php
index 8db52394..61bf8be7 100644
--- a/admin/class-wp-agora-io-admin.php
+++ b/admin/class-wp-agora-io-admin.php
@@ -33,6 +33,31 @@ public function __construct( $plugin_name, $version ) {
// add_filter('plugin_action_links_'.$name, array($this, 'plugin_add_settings_link') );
add_action('wp_ajax_save-agora-setting', array($this, 'saveAjaxSettings'));
+
+ add_action('wp_ajax_get_all_users_list', array($this, 'getAllUsersList'));
+ add_action('wp_ajax_run_recordings_shortcode', array($this, 'runRecordingShortcode'));
+ }
+
+ public function runRecordingShortcode(){
+ $shortcode = stripslashes(sanitize_text_field($_POST['shortcode']));
+ echo do_shortcode($shortcode);
+ wp_die();
+ }
+
+ public function getAllUsersList(){
+ $args = array('fields' => array( 'ID', 'display_name' ) );
+ $users = get_users($args);
+
+ $users_options = array(
+ 0 => __('Select', 'agoraio')
+ );
+
+ foreach($users as $user){
+ $users_options[$user->ID] = __($user->display_name, 'agoraio');
+ }
+
+ echo json_encode($users_options);
+ wp_die();
}
@@ -42,9 +67,13 @@ public function saveAjaxSettings() {
unset($_POST['action']);
$keys = array_keys($_POST);
$key = $keys[0];
- $value = sanitize_text_field( $_POST[$key] );
-
- $options = get_option($this->plugin_name);
+ if($key != 'global_colors'){
+ $value = sanitize_text_field( $_POST[$key] );
+ }else{
+ $value = $_POST[$key];
+ }
+
+ $options = sanitize_option($this->plugin_name, get_option($this->plugin_name));
$old_value = $options;
if (!$options) {
@@ -52,16 +81,19 @@ public function saveAjaxSettings() {
}
$options[$key] = $value;
- $r = false;
- if (!$old_value) {
- $r = add_option( $this->plugin_name, $options);
+ $r = false;
+ if (!$old_value) {
+ //echo '
|
+
+
+
@@ -368,6 +389,103 @@ class="agora-color-picker"
get_properties();
+ $ChatSupportloggedin = $props['chat_support_loggedin'];
+ ?>
+
+ get_properties();
@@ -395,6 +513,25 @@ function render_agoraio_channel_form_recording($channel) {
echo '';
}
+ agora_render_setting_row_select(
+ 'protoType',
+ __('Type ⓘ
+ For composite recording, we are playing m3u8 and mp4 for individual.
+ ', 'agoraio'),
+ array(
+ 'composite' => __('Composite', 'agoraio'),
+ 'individual' => __('Individual', 'agoraio')
+ ), $recording, '');
+
+ agora_render_setting_row_select(
+ 'recording_layout',
+ __('Layout', 'agoraio'),
+ array(
+ 1 => __('Best Fit', 'agoraio'),
+ 0 => __('Floating', 'agoraio'),
+ 2 => __('Vertical', 'agoraio')
+ ), $recording, '');
+
agora_render_setting_row('bucket', __('Bucket', 'agoraio'), $recording, '', 'text');
agora_render_setting_row('accessKey', __('Access Key', 'agoraio'), $recording, '', 'text');
diff --git a/admin/views/agora-admin-recording-listings.php b/admin/views/agora-admin-recording-listings.php
new file mode 100644
index 00000000..4c3e929c
--- /dev/null
+++ b/admin/views/agora-admin-recording-listings.php
@@ -0,0 +1,232 @@
+
+
+
+
+ Invalid Channel";
+ } else {
+ $channel_name = $channel->title(); ?>
+
+ Channel Name:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/admin/views/agora-admin-recordings.php b/admin/views/agora-admin-recordings.php
new file mode 100644
index 00000000..34e3aaa2
--- /dev/null
+++ b/admin/views/agora-admin-recordings.php
@@ -0,0 +1,15 @@
+
diff --git a/admin/views/agora-admin-settings.php b/admin/views/agora-admin-settings.php
index 63e0d079..0b4566ce 100644
--- a/admin/views/agora-admin-settings.php
+++ b/admin/views/agora-admin-settings.php
@@ -152,6 +152,8 @@
+
+
Chat Support
@@ -180,7 +182,252 @@
+
+
+ More Settings
+
+
+
+
+
+
+
+ Agora Chat for logged in users
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ UI Position Settings
+
+
+
+
+
+
+
+
+ Speakers
+
+
+ Chat
+
+
+ |
+
+
+
+
+
+ Speakers
+
+
+ Chat
+
+
+ |
+
+
+
+ Speakers
+
+
+ Chat
+
+
+ |
+
+
+
+ Speakers
+
+
+ Chat
+
+
+ |
+
+
+
+
+
+ Speakers
+
+
+ Chat
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/admin/views/parts/modal-layout-image.php b/admin/views/parts/modal-layout-image.php
new file mode 100644
index 00000000..fcecd445
--- /dev/null
+++ b/admin/views/parts/modal-layout-image.php
@@ -0,0 +1,22 @@
+
+
+
\ No newline at end of file
diff --git a/imgs/recordings/0-layout.png b/imgs/recordings/0-layout.png
new file mode 100644
index 00000000..5f738faa
Binary files /dev/null and b/imgs/recordings/0-layout.png differ
diff --git a/imgs/recordings/1-layout.png b/imgs/recordings/1-layout.png
new file mode 100644
index 00000000..7d1dbd4f
Binary files /dev/null and b/imgs/recordings/1-layout.png differ
diff --git a/imgs/recordings/2-layout.png b/imgs/recordings/2-layout.png
new file mode 100644
index 00000000..c0bbd430
Binary files /dev/null and b/imgs/recordings/2-layout.png differ
diff --git a/includes/class-wp-agora-cloud-recording.php b/includes/class-wp-agora-cloud-recording.php
index 218b27b0..6899bea9 100644
--- a/includes/class-wp-agora-cloud-recording.php
+++ b/includes/class-wp-agora-cloud-recording.php
@@ -12,6 +12,9 @@
define('AGORA_MIN_RAND_VALUE', 10000000);
define('AGORA_MAX_RAND_VALUE', 4294967295);
+error_reporting(E_ALL);
+ini_set('display_errors', '1');
+
class AgoraCloudRecording {
private $API_URL = 'https://api.agora.io/v1/apps/';
private $settings = null;
@@ -73,10 +76,28 @@ public function ajaxAgoraCloudRecording() {
private function acquire($data) {
$endpoint = $this->settings['appId']."/cloud_recording/acquire";
+
+ $channel = WP_Agora_Channel::get_instance($data['cid']);
+ $channelSettings = $channel->get_properties();
+ $recordingSettings = $channelSettings['recording'];
+
+
+ //To handle the file in mp4 format - For future reference
+ if($recordingSettings['protoType'] == 'individual'){
+ $clientRequest = new stdClass();
+ $clientRequest->scene = 2;
+ } else{
+ $clientRequest = json_decode("{}");
+ }
+
+
+ //$clientRequest = json_decode("{}");
+
$params = array(
'cname' => $data['cname'],
'uid' => $data['uid'],
- 'clientRequest' => json_decode("{}")
+ //'clientRequest' => json_decode("{}")
+ 'clientRequest' => $clientRequest
);
return $this->callAPI($endpoint, $params, 'POST');
}
@@ -93,21 +114,43 @@ private function updateLayout($data) {
if (!isset($data['recordingId']) ) {
return new WP_Error( 'data', "Incomplete data", $data );
}
+
+ $sid = $data['recordingId'];
+
+ $channel = WP_Agora_Channel::get_instance($data['cid']);
+ $channelSettings = $channel->get_properties();
+ $recordingSettings = $channelSettings['recording'];
- $endpointUL = $this->settings['appId'].'/cloud_recording/resourceid/' . $resourceId . '/sid/' . $sid. '/mode/mix/updateLayout';
+ if($recordingSettings['protoType'] != 'individual'){
+ $endpointUL = $this->settings['appId'].'/cloud_recording/resourceid/' . $resourceId . '/sid/' . $sid. '/mode/mix/updateLayout';
- $clientRequest = new stdClass();
- $clientRequest->mixedVideoLayout = 1; // best fit layout
- $clientRequest->backgroundColor = "#000000";
+ $mixedVideoLayout = 1; // best fit layout
- $params = array(
- 'cname' => $data['cname'],
- 'uid' => $data['uid'],
- 'clientRequest' => $clientRequest
- );
- // header('HTTP/1.1 500 Internal Server Error');
- // die("QUERY:".print_r($endpoint, true)." ");
- return $this->callAPI($endpointUL, $params, 'POST');
+ if($recordingSettings['recording_layout'] !=''){
+ $mixedVideoLayout = $recordingSettings['recording_layout'];
+ }
+
+ $clientRequest = new stdClass();
+ $clientRequest->mixedVideoLayout = (int)$mixedVideoLayout;
+
+ //In case of vertical layout, specify large screen UID
+ if($mixedVideoLayout == 2){
+ $clientRequest->maxResolutionUid = $data['maxResolutionUid'];
+ }
+
+ $clientRequest->backgroundColor = "#000000";
+
+ $params = array(
+ 'cname' => $data['cname'],
+ 'uid' => $data['uid'],
+ 'clientRequest' => $clientRequest
+ );
+ // header('HTTP/1.1 500 Internal Server Error');
+ // die("QUERY:".print_r($endpoint, true)." ");
+ return $this->callAPI($endpointUL, $params, 'POST');
+ } else {
+ return true;
+ }
}
private function queryRecording($data) {
@@ -138,10 +181,13 @@ private function queryRecording($data) {
private function startRecording($data) {
+ $currentUserId = $data['uid'];
+ $maxResolutionUid = $data['maxResolutionUid'];
+
$data['uid'] = ''.rand(AGORA_MIN_RAND_VALUE, AGORA_MAX_RAND_VALUE);
$resource = $this->acquire($data);
- // die("R:".print_r($resource, true)." ");
+ //die("R:".print_r($resource, true)." ");
$resourceId = $resource->resourceId;
$channel = WP_Agora_Channel::get_instance($data['cid']);
@@ -151,22 +197,48 @@ private function startRecording($data) {
return new WP_Error( 'data', "Storage Config not finished." );
}
+ $recordType = 'mix';
+ if($recordingSettings['protoType'] == 'individual'){
+ $recordType = 'individual';
+ } else {
+ $mixedVideoLayout = 1; // best fit layout
+ if($recordingSettings['recording_layout'] !=''){
+ $mixedVideoLayout = $recordingSettings['recording_layout'];
+ }
+ }
+
// $sid = $data['sid'];
- $endpoint = $this->settings['appId'].'/cloud_recording/resourceid/' . $resourceId . '/mode/mix/start';
+ $endpoint = $this->settings['appId'].'/cloud_recording/resourceid/' . $resourceId . '/mode/'.$recordType.'/start';
$clientRequest = new stdClass();
$clientRequest->recordingConfig = new stdClass();
$clientRequest->recordingConfig->channelType = 1; // 1 = broadcast, 0=Communication
- $clientRequest->recordingConfig->transcodingConfig = new stdClass();
- $clientRequest->recordingConfig->transcodingConfig->mixedVideoLayout = 1; // best fit layout
- $clientRequest->recordingConfig->transcodingConfig->backgroundColor = "#000000";
- $clientRequest->recordingConfig->transcodingConfig->width = 848;
- $clientRequest->recordingConfig->transcodingConfig->height = 480;
- $clientRequest->recordingConfig->transcodingConfig->bitrate = 930;
- $clientRequest->recordingConfig->transcodingConfig->fps = 30;
-
- // $clientRequest->recordingConfig->subscribeVideoUids
- // $clientRequest->recordingConfig->subscribeAudioUids
+
+ if($recordingSettings['protoType'] != 'individual'){
+ $clientRequest->recordingConfig->transcodingConfig = new stdClass();
+ $clientRequest->recordingConfig->transcodingConfig->mixedVideoLayout = (int)$mixedVideoLayout; // best fit layout
+
+ //In case of vertical layout, specify large screen UID
+ if($mixedVideoLayout == 2){
+ $clientRequest->recordingConfig->transcodingConfig->maxResolutionUid = $data['maxResolutionUid'];
+ }
+
+ $clientRequest->recordingConfig->transcodingConfig->backgroundColor = "#000000";
+ $clientRequest->recordingConfig->transcodingConfig->width = 848;
+ $clientRequest->recordingConfig->transcodingConfig->height = 480;
+ $clientRequest->recordingConfig->transcodingConfig->bitrate = 930;
+ $clientRequest->recordingConfig->transcodingConfig->fps = 30;
+ /*
+ //To handle the file in mp4 format - For future reference
+ $clientRequest->recordingFileConfig = new stdClass();
+ $clientRequest->recordingFileConfig->avFileType = ["hls", "mp4"];
+ */
+ } else{
+ //$clientRequest->recordingConfig->combinationPolicy = 'postpone_transcoding';
+ $clientRequest->recordingConfig->subscribeUidGroup = 0;
+ // $clientRequest->recordingConfig->subscribeVideoUids = ["1"];
+ // $clientRequest->recordingConfig->subscribeAudioUids = ["1"];
+ }
$clientRequest->storageConfig = new stdClass();
$clientRequest->storageConfig->vendor = intval($recordingSettings['vendor']);
$clientRequest->storageConfig->region = intval($recordingSettings['region']);
@@ -180,12 +252,24 @@ private function startRecording($data) {
$year = strtolower(date("Y", strtotime($t)));
$fixedTitle = str_replace('-', '', $channel->title());
- $folderName = $month.$day.$year.preg_replace('/\s+/', '', $fixedTitle);
- $clientRequest->storageConfig->fileNamePrefix = array( $folderName );
+ $dateFolderName = $month.$day.$year.preg_replace('/\s+/', '', $fixedTitle);
+ $dateFolderName = date("Ymd");
+ $timeFolderName = date("Hi", time());
+ $folderName = $data['cid'];
- $newToken = $this->parent->generateNewToken($data['cid'], $data['uid']);
+ //$clientRequest->storageConfig->fileNamePrefix = array( $folderName );
+ $clientRequest->storageConfig->fileNamePrefix = array($folderName, $dateFolderName, $timeFolderName, $recordingSettings['protoType']);
+
+ $newToken = $this->parent->generateNewToken($data['cid'], $data['uid'], 'RTC');
// die("".print_r($newToken, true)." ");
$clientRequest->token = $newToken;
+
+
+ //To handle the file in mp4 format - For future reference
+ if($recordingSettings['protoType'] == 'individual'){
+ $clientRequest->appsCollection = new stdClass();
+ $clientRequest->appsCollection->combinationPolicy = 'postpone_transcoding';
+ }
$params = array(
'cname' => $data['cname'],
@@ -215,8 +299,17 @@ private function stopRecording($data) {
return new WP_Error( 'data', "Incomplete data", $data );
}
+ $channel = WP_Agora_Channel::get_instance($data['cid']);
+ $channelSettings = $channel->get_properties();
+
+ $recordType = 'mix';
+ $recordingSettings = $channelSettings['recording'];
+ if($recordingSettings['protoType'] == 'individual'){
+ $recordType = 'individual';
+ }
+
$sid = $data['recordingId'];
- $endpoint = $this->settings['appId'].'/cloud_recording/resourceid/' . $resourceId . '/sid/' . $sid. '/mode/mix/stop';
+ $endpoint = $this->settings['appId'].'/cloud_recording/resourceid/' . $resourceId . '/sid/' . $sid. '/mode/'.$recordType.'/stop';
$params = array(
'cname' => $data['cname'],
diff --git a/includes/class-wp-agora-io-channel.php b/includes/class-wp-agora-io-channel.php
index c285bdb7..c3cf363b 100644
--- a/includes/class-wp-agora-io-channel.php
+++ b/includes/class-wp-agora-io-channel.php
@@ -47,7 +47,9 @@ class WP_Agora_Channel {
'region' => 0,
'bucket' => '',
'accessKey' => '',
- 'secretKey' => ''
+ 'secretKey' => '',
+ 'protoType' => '',
+ 'recording_layout' => ''
);
// private channel attrs
@@ -171,13 +173,72 @@ private function __construct( $post = null ) {
$recordingSettings = get_post_meta( $this->id, 'channel_recording_settings', true );
$channelType = get_post_meta( $this->id, 'channel_type', true );
$channelUserHost = get_post_meta( $this->id, 'channel_user_host', true );
+
+ if(get_post_meta( $this->id, 'ghost_mode', true )){
+ $GhostMode = get_post_meta( $this->id, 'ghost_mode', true );
+ }else{
+ $GhostMode = 0;
+ }
+
+ if(get_post_meta( $this->id, 'channel_layout', true )){
+ $channelLayout = get_post_meta( $this->id, 'channel_layout', true );
+ }else{
+ $channelLayout = 'grid';
+ }
+ if(get_post_meta( $this->id, 'chat_support_loggedin', true )){
+ $ChatSupportloggedin = get_post_meta( $this->id, 'chat_support_loggedin', true );
+ }else{
+ $ChatSupportloggedin = 0;
+ }
+ if(get_post_meta( $this->id, 'mute_all_users', true )){
+ $MuteAllUsers = get_post_meta( $this->id, 'mute_all_users', true );
+ }else{
+ $MuteAllUsers = 0;
+ }
+ if(get_post_meta( $this->id, 'chat_history', true )){
+ $ChatHistory = get_post_meta( $this->id, 'chat_history', true );
+ }else{
+ $ChatHistory = 0;
+ }
+ if(get_post_meta( $this->id, 'pre_call_video', true )){
+ $PreCallVideo = get_post_meta( $this->id, 'pre_call_video', true );
+ }else{
+ $PreCallVideo = 0;
+ }
+
+ if(get_post_meta( $this->id, 'admin_user', true)){
+ $admin_user = get_post_meta( $this->id, 'admin_user', true);
+ } else {
+ $admin_user = '';
+ }
+
+ if(get_post_meta( $this->id, 'admin_user_unmute_forcefully', true)){
+ $admin_user_unmute_forcefully = get_post_meta( $this->id, 'admin_user_unmute_forcefully', true);
+ } else {
+ $admin_user_unmute_forcefully = 0;
+ }
+
+ if(get_post_meta( $this->id, 'max_host_users', true)){
+ $max_host_users = get_post_meta( $this->id, 'max_host_users', true);
+ } else {
+ $max_host_users = '';
+ }
$this->properties = array(
'type' => $channelType,
'host' => $channelUserHost,
'settings' => $videoSettings,
'appearance' => $appearanceSettings,
- 'recording' => $recordingSettings
+ 'recording' => $recordingSettings,
+ 'chat_support_loggedin' => $ChatSupportloggedin,
+ 'ghost_mode' => $GhostMode,
+ 'channel_layout' => $channelLayout,
+ 'mute_all_users' => $MuteAllUsers,
+ 'chat_history' => $ChatHistory,
+ 'pre_call_video' => $PreCallVideo,
+ 'admin_user' => $admin_user,
+ 'admin_user_unmute_forcefully' => $admin_user_unmute_forcefully,
+ 'max_host_users' => $max_host_users
);
// $this->upgrade();
@@ -193,7 +254,16 @@ public function get_properties() {
'host' => array(),
'settings' => array_merge(self::$defaultVideoSettings),
'appearance' => array_merge(self::$defaultAppearanceSettings),
- 'recording' => array_merge(self::$defaultRecordingSettings)
+ 'recording' => array_merge(self::$defaultRecordingSettings),
+ 'chat_support_loggedin' => 0,
+ 'ghost_mode' => 0,
+ 'channel_layout' => 'grid',
+ 'mute_all_users' => 0,
+ 'chat_history' => 0,
+ 'pre_call_video' => 0,
+ 'admin_user_unmute_forcefully' => 0,
+ 'admin_user' => '',
+ 'max_host_users' => ''
) );
$properties = (array) apply_filters( 'agoraio_channel_properties', $properties, $this );
return $properties;
@@ -214,7 +284,7 @@ public function save( $args ) {
'post_title' => sanitize_text_field($args['post_title']),
) );
}
-
+
$videoSettings = array();
array_map(function($key) use ($args, &$videoSettings) {
$videoSettings[$key] = sanitize_text_field($args[$key]);
@@ -239,11 +309,20 @@ public function save( $args ) {
$recordingSettings[$key] = sanitize_text_field($args[$key]);
return $recordingSettings[$key];
}, array_keys(self::$defaultRecordingSettings));
-
+
update_post_meta($post_id, 'channel_video_settings', $videoSettings);
update_post_meta($post_id, 'channel_appearance_settings', $appearanceSettings);
update_post_meta($post_id, 'channel_recording_settings', $recordingSettings);
+ update_post_meta($post_id, 'chat_support_loggedin', sanitize_key($args['chat_support_loggedin']));
+ update_post_meta($post_id, 'ghost_mode', sanitize_key($args['ghost_mode']));
+ update_post_meta($post_id, 'channel_layout', sanitize_key($args['channel_layout']));
update_post_meta($post_id, 'channel_type', sanitize_key($args['type']));
+ update_post_meta($post_id, 'mute_all_users', sanitize_key($args['mute_all_users']));
+ update_post_meta($post_id, 'chat_history', sanitize_key($args['chat_history']));
+ update_post_meta($post_id, 'pre_call_video', sanitize_key($args['pre_call_video']));
+ update_post_meta($post_id, 'admin_user', sanitize_key($args['admin_user']));
+ update_post_meta($post_id, 'admin_user_unmute_forcefully', sanitize_key($args['admin_user_unmute_forcefully']));
+ update_post_meta($post_id, 'max_host_users', sanitize_key($args['max_host_users']));
if (isset($args['host'])) {
if (is_array($args['host'])) {
@@ -295,6 +374,51 @@ public function title() {
return $this->title;
}
+
+ public function ghostmode() {
+ return (int)$this->properties['ghost_mode'];
+ }
+ public function channellayout() {
+ return $this->properties['channel_layout'];
+ }
+ public function mute_all_users() {
+ return (int)$this->properties['mute_all_users'];
+ }
+
+ public function chat_history() {
+ return (int)$this->properties['chat_history'];
+ }
+
+ public function pre_call_video() {
+ return (int)$this->properties['pre_call_video'];
+ }
+
+ public function admin_user(){
+ return $this->properties['admin_user'];
+ }
+
+ public function admin_user_unmute_forcefully(){
+ return (int)$this->properties['admin_user_unmute_forcefully'];
+ }
+
+ public function max_host_users_limit(){
+ return (int)$this->properties['max_host_users'];
+ }
+
+ public function host_users(){
+ return json_encode(array_flip($this->properties['host']));
+ }
+
+ public function admin_user_config(){
+ //return $this->admin_user();
+ if($this->admin_user()!='' && $this->admin_user()==get_current_user_id()){
+ return json_encode(array('is_admin' => 1, 'can_unmute_forecefully' => $this->admin_user_unmute_forcefully()));
+ } else {
+ return json_encode(array('is_admin' => 0, 'can_unmute_forecefully' => 0));
+ }
+
+ }
+
public function type() {
return ucfirst( $this->properties['type'] );
}
@@ -328,12 +452,37 @@ public function set_locale( $locale ) {
}
}
- public function shortcode() {
- $type = $this->properties['type'];
- if($type==='broadcast') {
- return '[agora-broadcast channel_id="'.$this->id.'"]';
- } else if($type==='communication') {
- return '[agora-communication channel_id="'.$this->id.'"]';
+ public function isrecordingSettingsDone(){
+ //$this->properties['recording']['protoType']
+ $recordingSettings = $this->properties['recording'];
+
+ $response = true;
+
+ foreach($recordingSettings as $setting=>$value){
+ if($value == ''){
+ $response = false;
+ break;
+ }
+ }
+
+ return $response;
+ }
+
+ public function getRecordingType(){
+ return $this->properties['recording']['protoType'];
+ }
+
+ public function shortcode($type='') {
+ if($type == 'recording'){
+ $recording_type = $this->properties['recording']['protoType'];
+ return '[agora-recordings channel_id="'.$this->id.'" recording_type="'.$recording_type.'"]';
+ } else {
+ $type = $this->properties['type'];
+ if($type==='broadcast') {
+ return '[agora-broadcast channel_id="'.$this->id.'"]';
+ } else if($type==='communication') {
+ return '[agora-communication channel_id="'.$this->id.'"]';
+ }
}
}
diff --git a/public/class-wp-agora-io-public.php b/public/class-wp-agora-io-public.php
index c171c972..ce73ddb2 100755
--- a/public/class-wp-agora-io-public.php
+++ b/public/class-wp-agora-io-public.php
@@ -14,6 +14,8 @@ class WP_Agora_Public {
private $plugin_name;
public $version;
+ public static $recordings_regions = array();
+
private static $shortcodeRendered = array();
/**
@@ -24,11 +26,19 @@ public function __construct( $plugin_name, $version ) {
$this->plugin_name = $plugin_name;
$this->version = $version;
$this->settings = null;
+
+ self::$recordings_regions['qiniu'] = ['East China', 'North China', 'South China', 'North America'];
+ self::$recordings_regions['aws'] = ['US_EAST_1', 'US_EAST_2', 'US_WEST_1', 'US_WEST_2', 'EU_WEST_1', 'EU_WEST_2', 'EU_WEST_3', 'EU_CENTRAL_1', 'AP_SOUTHEAST_1', 'AP_SOUTHEAST_2', 'AP_NORTHEAST_1', 'AP_NORTHEAST_2', 'SA_EAST_1', 'CA_CENTRAL_1', 'AP_SOUTH_1', 'CN_NORTH_1', 'CN_NORTHWEST_1', 'US_GOV_WEST_1'];
+ self::$recordings_regions['alibaba'] = ['CN_Hangzhou', 'CN_Shanghai', 'CN_Qingdao', 'CN_Beijing', 'CN_Zhangjiakou', 'CN_Huhehaote', 'CN_Shenzhen', 'CN_Hongkong', 'US_West_1', 'US_East_1', 'AP_Southeast_1', 'AP_Southeast_2', 'AP_Southeast_3', 'AP_Southeast_5', 'AP_Northeast_1', 'AP_South_1', 'EU_Central_1', 'EU_West_1', 'EU_East_1'];
+
+ //self::$recordings_regions = (object) self::$recordings_regions;
// Declaration of shortcodes and widgets
add_shortcode( 'agora-communication', array($this, 'agoraCommunicationShortcode') );
add_shortcode( 'agora-broadcast', array($this, 'agoraBroadcastShortcode') );
+ add_shortcode( 'agora-recordings', array($this, 'agoraRecordingsList') );
+
$this->settings = get_option($this->plugin_name);
if (!$this->settings) {
$this->settings = array();
@@ -49,6 +59,35 @@ public function __construct( $plugin_name, $version ) {
add_action( 'wp_ajax_get_user_avatar', $userAvatarAjax );
add_action( 'wp_ajax_nopriv_get_user_avatar', $userAvatarAjax );
+ $globalColorsAjax = array($this, 'getglobalColors');
+ add_action( 'wp_ajax_get_global_colors', $globalColorsAjax );
+ add_action( 'wp_ajax_nopriv_get_global_colors', $globalColorsAjax );
+
+ /* Ajax to handle Chat File Upload */
+ $uploadChatFileAjax = array($this, 'uploadChatFile');
+ add_action( 'wp_ajax_upload_chat_file', $uploadChatFileAjax );
+ add_action( 'wp_ajax_nopriv_upload_chat_file', $uploadChatFileAjax );
+
+ /* Ajax to handle Chat History if it is enabled */
+ $saveChatAjax = array($this, 'saveChat');
+ add_action( 'wp_ajax_save_chat', $saveChatAjax );
+ add_action( 'wp_ajax_nopriv_save_chat', $saveChatAjax );
+
+ /* Ajax to handle get Chat History if it was saved */
+ $getChatsAjax = array($this, 'getChatsFromHistory');
+ add_action( 'wp_ajax_get_previous_chats', $getChatsAjax );
+ add_action( 'wp_ajax_nopriv_get_previous_chats', $getChatsAjax );
+
+ /* Ajax to handle when a Raise hand Request is accepted in Broadcast channel */
+ $loadHostViewAjax = array($this, 'load_host_view');
+ add_action('wp_ajax_load_host_view', $loadHostViewAjax);
+ add_action('wp_ajax_nopriv_load_host_view', $loadHostViewAjax);
+
+ /* Ajax to handle when a user is above the mentioned hosts limit in communication channel */
+ $loadAudienceViewAjax = array($this, 'load_audience_view');
+ add_action('wp_ajax_load_audience_view', $loadAudienceViewAjax);
+ add_action('wp_ajax_nopriv_load_audience_view', $loadAudienceViewAjax);
+
// Page Template loader for FullScreen
require_once plugin_dir_path(dirname( __FILE__ )) . 'public/class-wp-agora-page-template.php';
new WP_Agora_PageTemplate($this);
@@ -57,6 +96,171 @@ public function __construct( $plugin_name, $version ) {
require_once(__DIR__.'/../includes/token-server/RtmTokenBuilder.php');
}
+ public function getglobalColors() {
+ $agora_options = sanitize_option($this->plugin_name, get_option($this->plugin_name));
+
+ header('Content-Type: application/json');
+ echo json_encode(array( "global_colors" => $agora_options['global_colors'] ));
+
+ wp_die();
+ }
+
+ public function load_host_view(){
+ ob_start();
+
+ $page_title = sanitize_text_field($_POST['page_title']);
+
+ $channel_id = sanitize_text_field($_POST['channel_id']);
+ $channel = WP_Agora_Channel::get_instance($channel_id);
+ $agora = $this;
+
+ $instance = $agora->getShortcodeAttrs('agora-broadcast', []);
+ $current_user = wp_get_current_user();
+ $agoraUserScript = plugin_dir_url( dirname( __FILE__ ) ).'public/js/agora-broadcast-client.js';
+ ?>
+
+ getShortcodeAttrs('agora-communication', []);
+ $current_user = wp_get_current_user();
+ ?>
+
+
+
+ prefix . 'agora_io_chats';
+
+ $channel_id = sanitize_text_field($_POST['channel_id']);
+ $timezone = sanitize_text_field($_POST['timezone']);
+ $username = sanitize_text_field($_POST['username']);
+ $todayDate = sanitize_text_field($_POST['todayDate']);
+
+ $getChatsQuery = "SELECT * from $table_name where channel_id = '$channel_id'";
+ $results = $wpdb->get_results($getChatsQuery);
+ if(!empty($results)){
+ foreach($results as $result){
+ $dateInLocalTimezone = strtotime($this->convertToTimezone(date("Y-m-d H:i:s", $result->time), $timezone));
+ $result->time = date("Y-m-d h:i a", $dateInLocalTimezone);
+
+ /* If message date is equal to today's date the, return only time */
+ if(strtotime($todayDate) == strtotime(date("Y-m-d", $dateInLocalTimezone))){
+ $result->time = date("h:i a", $dateInLocalTimezone);
+ }
+ $result->isLocalMessage = false;
+ if((is_user_logged_in() && $result->user_id == get_current_user_id()) || ($username==$result->username)){
+ $result->isLocalMessage = true;
+ }
+ }
+ }
+ echo json_encode($results);
+ wp_die();
+ }
+
+ /* Function to save chat in the database if chat is enabled */
+ public function saveChat(){
+ global $wpdb;
+
+ $channel_id = sanitize_text_field($_POST['channel_id']);
+ $user_id = sanitize_text_field($_POST['uid']);
+ $username = sanitize_text_field($_POST['uname']);
+ $type = sanitize_text_field($_POST['type']);
+ $message = sanitize_text_field($_POST['msg']);
+ $time = strtotime(date("Y-m-d H:i:s"));
+ $created_on = date("Y-m-d H:i:s");
+
+ $table_name = $wpdb->prefix . 'agora_io_chats';
+
+ /* Create Chat History table if it doesn't exit */
+ $chat_history_table_sql = "CREATE TABLE IF NOT EXISTS $table_name (
+ id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ channel_id INT(255),
+ user_id INT NOT NULL DEFAULT 0,
+ username VARCHAR(255),
+ type VARCHAR(255) DEFAULT 'text',
+ time VARCHAR (255),
+ message TEXT,
+ created_on DATETIME
+ )";
+ $wpdb->query($chat_history_table_sql );
+
+ $saveChat_query = "INSERT INTO $table_name ( user_id, username, channel_id, type, message, time, created_on) VALUES ('$user_id', '$username', '$channel_id', '$type', '$message', '$time' ,'$created_on')";
+ $wpdb->query($saveChat_query);
+ wp_die();
+ }
+
+ public function uploadChatFile(){
+ $response = array(
+ 'fileURL' => '',
+ 'status' => 'err'
+ );
+ //$upload = 'err';
+ if(!empty($_FILES['file'])){
+
+ $channel_id = sanitize_text_field($_POST['channel_id']);
+
+ $targetDirURL = plugin_dir_url( dirname( __FILE__ ) ).'/uploads/'.$channel_id.'/';
+
+ // File upload configuration
+ $targetDirPath = plugin_dir_path( dirname( __FILE__ ) ).'/uploads/'.$channel_id.'/';
+ if (!file_exists($targetDirPath)) {
+ mkdir($targetDirPath);
+ }
+
+ $file = sanitize_file_name($_FILES['file']['name']);
+
+ /* Create unique name of file */
+ $fileName = pathinfo($file, PATHINFO_FILENAME);
+ $ext = pathinfo($file, PATHINFO_EXTENSION);
+ $newFileName = $fileName.'-'.uniqid().'.'.$ext;
+
+ $targetFilePath = $targetDirPath.$newFileName;
+
+ // Upload file to the server
+ if(move_uploaded_file($_FILES['file']['tmp_name'], $targetFilePath)){
+ //$upload = 'ok';
+ $response = array(
+ 'fileURL' => $targetDirURL.$newFileName,
+ 'status' => 'ok'
+ );
+ }
+ }
+ //echo $upload;
+ echo json_encode($response);
+ exit();
+ }
+
+ public function convertToTimezone($date, $currentTimezoneName){
+ $timezone_name = date_default_timezone_get();
+ $date = new DateTime($date, new DateTimeZone($timezone_name));
+ $date->setTimezone(new DateTimeZone($currentTimezoneName));
+ $date->format('Y-m-d H:i:s') . "\n";
+ return $date->format('Y-m-d H:i:s') . "\n";
+ }
+
public function getUserAvatar() {
$uid = isset($_POST['uid']) ? sanitize_key($_POST['uid']) : 0;
$avatar = get_avatar_data( $uid, array('size' => 168) );
@@ -157,6 +361,12 @@ public function agoraCommunicationShortcode( $atts ) {
return renderCommnicationShortcode( $this, $atts );
}
+ /** Get Agora Recordings List Shortcode shortcode **/
+ public function agoraRecordingsList( $atts ){
+ require_once(__DIR__.'/views/wp-agora-io-recordings.php');
+ return getRecordingsList($atts);
+ }
+
/** Render Agora Broadcast shortcode **/
public function agoraBroadcastShortcode( $atts ) {
require_once("shortcode-agora-broadcast.php");
@@ -171,7 +381,8 @@ public function enqueueShortcodeStyles($type) {
$fontawesome = plugin_dir_url( __FILE__ ) . 'css/fontawesome/css/all.min.css';
- wp_enqueue_script( 'AgoraSDK', plugin_dir_url( __FILE__ ).'js/agora/AgoraRTCSDK-3.2.1.100.js', array('jquery'), null );
+ //wp_enqueue_script( 'AgoraSDK', plugin_dir_url( __FILE__ ).'js/agora/AgoraRTCSDK-3.2.1.100.js', array('jquery'), null );
+ wp_enqueue_script( 'AgoraSDK', plugin_dir_url( __FILE__ ).'js/agora/AgoraRTCSDK-3.5.2.js', array('jquery'), null );
wp_enqueue_script( 'AgoraRTM', plugin_dir_url( __FILE__ ).'js/agora/agora-rtm-sdk-1.2.2.js', array('jquery'), null );
wp_enqueue_style( 'fontawesome', $fontawesome, array('bootstrap'), null, 'all' );
@@ -229,8 +440,22 @@ public function enqueue_styles() {
}
public function enqueue_scripts() {
+ /* Include JS file to handle audio error on autoplay */
+ wp_enqueue_script( $this->plugin_name.'-agora-stream-audioErr', plugin_dir_url( __FILE__ ) . 'js/agora-stream-audioErr.js', array( 'jquery' ), $this->version, false );
+
wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'js/wp-agora-io-public.js', array( 'jquery' ), $this->version, false );
+ /*Include JS file to handle pre-call device test if it was enabled */
+ $channelRef = WP_Agora_Channel::get_current();
+ if(isset($channelRef)){
+ $pre_call_test_enabled = $channelRef->pre_call_video();
+ if(isset($pre_call_test_enabled) && $pre_call_test_enabled){
+ wp_enqueue_script( $this->plugin_name.'-agora-deviceTest-js', plugin_dir_url( __FILE__ ) . 'js/wp-agora-io-device-test.js', array( 'jquery' ), $this->version, false );
+ }
+ }
+
+ wp_enqueue_script($this->plugin_name.'-hls-player-js', 'https://cdn.jsdelivr.net/npm/hls.js@latest', array( ), $this->version, false);
+
// add data before JS plugin
// useful to load dynamic settings and env vars
add_action( 'wp_footer', array($this, 'createPublicJSvars'), 1);
@@ -239,6 +464,7 @@ public function enqueue_scripts() {
// Create public JS Variables to pass to external script
public function createPublicJSvars () {
$vars = 'var ajax_url="'.admin_url( 'admin-ajax.php' ).'";';
+ $vars.= 'var page_title="'.get_the_title().'";';
// append here more settings vars
diff --git a/public/class-wp-agora-page-template.php b/public/class-wp-agora-page-template.php
index 5cfa4592..59b790a6 100644
--- a/public/class-wp-agora-page-template.php
+++ b/public/class-wp-agora-page-template.php
@@ -99,7 +99,8 @@ public function view_project_template( $template ) {
}
- wp_enqueue_script( 'AgoraSDK', plugin_dir_url( __FILE__ ).'js/agora/AgoraRTCSDK-3.2.1.100.js', array('jquery'), null );
+ //wp_enqueue_script( 'AgoraSDK', plugin_dir_url( __FILE__ ).'js/agora/AgoraRTCSDK-3.2.1.100.js', array('jquery'), null );
+ wp_enqueue_script( 'AgoraSDK', plugin_dir_url( __FILE__ ).'js/agora/AgoraRTCSDK-3.5.2.js', array('jquery'), null );
wp_enqueue_script( 'AgoraRTM', plugin_dir_url( __FILE__ ).'js/agora/agora-rtm-sdk-1.2.2.js', array('jquery'), null );
$bootstrap_css = plugin_dir_url( __FILE__ ) . 'js/bootstrap/bootstrap.min.css';
diff --git a/public/css/chat-fab.css b/public/css/chat-fab.css
index 37c265b5..94f140d1 100644
--- a/public/css/chat-fab.css
+++ b/public/css/chat-fab.css
@@ -1,23 +1,23 @@
.agora .chat {
- --remote-bgcolor: rgba(0, 0, 0, 0.06);
- --local-bgcolor: #42a5f5;
-
- width: 100%;
- font-size: 12px;
- line-height: 22px;
- font-weight: 500;
- -webkit-font-smoothing: antialiased;
- /* font-smoothing: antialiased; */
- -webkit-transition: all .2s ease-out;
- -webkit-transition: all .2s ease-in-out;
- transition: all .2s ease-in-out;
+ --remote-bgcolor: rgba(0, 0, 0, 0.06);
+ --local-bgcolor: #42a5f5;
+
+ width: 100%;
+ font-size: 12px;
+ line-height: 22px;
+ font-weight: 500;
+ -webkit-font-smoothing: antialiased;
+ /* font-smoothing: antialiased; */
+ -webkit-transition: all 0.2s ease-out;
+ -webkit-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
}
.agora .fabs {
width: 100%;
margin: 0;
}
-.agora-audience .fabs>.fab {
+.agora-audience .fabs > .fab {
position: absolute;
bottom: 0;
right: 0;
@@ -27,39 +27,39 @@
}
.agora .chat_header {
- font-size: 14px;
- font-weight: 600;
- color: #f4f4f4;
- padding: 8px 12px;
- background: #a3a3a3;
- border-top-left-radius: 3px;
- border-top-right-radius: 3px;
+ font-size: 14px;
+ font-weight: 600;
+ color: #f4f4f4;
+ padding: 8px 12px;
+ background: #a3a3a3;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
}
.agora .chat_header .right {
- float:right;
+ float: right;
cursor: pointer;
}
.agora .chat_fullscreen_loader {
- display: none;
- float: right;
- cursor: pointer;
- /* margin: 10px; */
- font-size: 20px;
- opacity: 0.5;
- padding: 20px;
- margin: -10px 10px;
+ display: none;
+ float: right;
+ cursor: pointer;
+ /* margin: 10px; */
+ font-size: 20px;
+ opacity: 0.5;
+ padding: 20px;
+ margin: -10px 10px;
}
.agora .chat.is-visible {
display: block;
opacity: 1;
- -webkit-animation: chatZoomIn .2s cubic-bezier(.42, 0, .58, 1);
- animation: chatZoomIn .2s cubic-bezier(.42, 0, .58, 1);
+ -webkit-animation: chatZoomIn 0.2s cubic-bezier(0.42, 0, 0.58, 1);
+ animation: chatZoomIn 0.2s cubic-bezier(0.42, 0, 0.58, 1);
}
-.agora .is-hide{
- opacity: 0
+.agora .is-hide {
+ opacity: 0;
}
.agora .chat_color {
@@ -72,17 +72,17 @@
}
.agora #chat-alert {
- position: absolute;
- top: -3px;
- right: -2px;
- font-size: 12px;
- color: white;
- transform: rotate(24deg);
- box-shadow: 0px 2px 4px #585858;
- background: #da4964;
- padding: 4px;
- border-radius: 50%;
- transition: opacity ease 1s;
+ position: absolute;
+ top: -3px;
+ right: -2px;
+ font-size: 12px;
+ color: white;
+ transform: rotate(24deg);
+ box-shadow: 0px 2px 4px #585858;
+ background: #da4964;
+ padding: 4px;
+ border-radius: 50%;
+ transition: opacity ease 1s;
}
.agora.agora-audience #chat-alert {
text-shadow: none;
@@ -95,21 +95,20 @@
display: inline-block;
text-align: center;
- overflow-y: auto;
-
+ overflow-y: auto;
}
-.agora #chat_body{
- height: 450px;
+.agora #chat_body {
+ height: 450px;
}
.agora .chat_body li,
.agora .chat_body p,
.agora .chat_body a {
- -webkit-animation: chatZoomIn .5s cubic-bezier(.42, 0, .58, 1);
- animation: chatZoomIn .5s cubic-bezier(.42, 0, .58, 1);
+ -webkit-animation: chatZoomIn 0.5s cubic-bezier(0.42, 0, 0.58, 1);
+ animation: chatZoomIn 0.5s cubic-bezier(0.42, 0, 0.58, 1);
}
.agora .chat_body p {
padding: 20px;
- color: #888
+ color: #888;
}
.agora .chat_body a {
width: 10%;
@@ -137,51 +136,61 @@
}
.agora .fab_field.non-user {
- display: block;
- justify-content: center;
- padding: 120px 15px;
+ /* display: block;
+ justify-content: center;
+ padding: 120px 15px; */
+ display: flex;
+ padding: 0 15px;
+ height: 250px;
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+}
+.agora .fab_field.non-user label {
+ width: 100%;
+}
+.agora .fab_field.non-user .error {
+ color: #d94964;
}
-.agora .fab_field.non-user label { width: 100%; }
-.agora .fab_field.non-user .error { color: #d94964; }
.agora .fab_field.non-user .btnIcon {
font-size: 13px;
- margin-top: 10px;
+ margin-top: 10px;
max-width: none;
}
.agora .fab_field.non-user .chat_enter_name {
- font-size: 14px;
- text-align: center;
- border: 2px solid rgba(0, 0, 0, 0.085);
+ font-size: 14px;
+ text-align: center;
+ border: 2px solid rgba(0, 0, 0, 0.085);
}
.agora .chat-msg-line {
- display: flex;
- flex-wrap: wrap;
+ display: flex;
+ flex-wrap: wrap;
}
.agora .chat-msg-line label {
- flex: 100%;
- margin-left: 11px;
- color: #aaaaaa;
+ flex: 100%;
+ margin-left: 11px;
+ color: #aaaaaa;
}
.agora .chat-msg-line.local label {
- text-align: right;
- margin-right: 20px;
+ text-align: right;
+ margin-right: 20px;
}
.agora .chat-msg-line label time {
- color: #bbc1d0;
- font-size: 95%;
+ color: #bbc1d0;
+ font-size: 95%;
}
.agora .chat-msg-line:first-child {
- margin-top: 15px;
+ margin-top: 15px;
}
.agora .chat-msg-line.local {
- justify-content: flex-end;
+ justify-content: flex-end;
}
.agora .chat-msg-line.chat-notify {
- text-align: center;
- display: block;
- color: #a2a2a2;
- font-weight: 600;
+ text-align: center;
+ display: block;
+ color: #a2a2a2;
+ font-weight: 600;
}
.agora .chat_field.chat_message {
@@ -193,57 +202,55 @@
min-height: 30px;
width: 80%;
}
-.agora .chat_category{
+.agora .chat_category {
text-align: left;
}
-.agora .chat_category{
+.agora .chat_category {
margin: 20px;
background: var(--remote-bgcolor);
padding: 10px;
}
-.agora .chat_category ul li{
- width: 80%;
- height: 30px;
- background: #fff;
- padding: 10px;
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
- margin-bottom: 10px;
- border-radius: 3px;
- border: 1px solid #e0e0e0;
- font-size: 13px;
- cursor: pointer;
- line-height: 30px;
- color: #888;
- text-align: center;
+.agora .chat_category ul li {
+ width: 80%;
+ height: 30px;
+ background: #fff;
+ padding: 10px;
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+ margin-bottom: 10px;
+ border-radius: 3px;
+ border: 1px solid #e0e0e0;
+ font-size: 13px;
+ cursor: pointer;
+ line-height: 30px;
+ color: #888;
+ text-align: center;
}
-.agora .chat_category li:hover{
- background: #83c76d;
- color: #fff;
+.agora .chat_category li:hover {
+ background: #83c76d;
+ color: #fff;
}
-.agora .chat_category li.active{
- background: #83c76d;
- color: #fff;
+.agora .chat_category li.active {
+ background: #83c76d;
+ color: #fff;
}
-
-.agora .tags{
- margin: 20px;
- bottom: 0px;
- display: block;
- width: 120%
+.agora .tags {
+ margin: 20px;
+ bottom: 0px;
+ display: block;
+ width: 120%;
}
-.agora .tags li{
- padding: 5px 10px;
- border-radius: 40px;
- border: 1px solid rgb(3, 117, 208);
- margin: 5px;
- display: inline-block;
- color: rgb(3, 117, 208);
- cursor: pointer;
-
+.agora .tags li {
+ padding: 5px 10px;
+ border-radius: 40px;
+ border: 1px solid rgb(3, 117, 208);
+ margin: 5px;
+ display: inline-block;
+ color: rgb(3, 117, 208);
+ cursor: pointer;
}
.agora .fab_field {
width: 100%;
@@ -258,7 +265,7 @@
position: absolute;
border-bottom-right-radius: 0px;
border-bottom-left-radius: 0px;
- z-index: 999;
+ z-index: 999;
}
.agora .fab_field a {
@@ -272,7 +279,7 @@
} */
.agora #fab_send {
- float: right;
+ float: right;
background: rgba(0, 0, 0, 0);
}
@@ -283,27 +290,27 @@
margin: 5px;
}
-.agora .fab_field .fab>i {
+.agora .fab_field .fab > i {
font-size: 1.6em;
line-height: 35px;
color: #bbb;
}
-.agora .fab_field .fab>i:hover {
+.agora .fab_field .fab > i:hover {
color: var(--local-bgcolor);
}
-
.agora .chat_converse {
position: relative;
- background: #fff;
- margin: 0;
- height: 300px;
- min-height: 0;
- font-size: 12px;
- line-height: 18px;
- overflow-y: auto;
- width: 100%;
- padding-bottom: 5px;
+ background: #fff;
+ margin: 0;
+ /* height: 300px; */
+ height: 200px;
+ min-height: 0;
+ font-size: 12px;
+ line-height: 18px;
+ overflow-y: auto;
+ width: 100%;
+ padding-bottom: 5px;
}
.agora .chat_list {
@@ -325,40 +332,49 @@
display: block;
word-wrap: break-word;
border-radius: 3px;
- -webkit-animation: chatZoomIn .5s cubic-bezier(.42, 0, .58, 1);
- animation: chatZoomIn .5s cubic-bezier(.42, 0, .58, 1);
+ -webkit-animation: chatZoomIn 0.5s cubic-bezier(0.42, 0, 0.58, 1);
+ animation: chatZoomIn 0.5s cubic-bezier(0.42, 0, 0.58, 1);
clear: both;
z-index: 999;
}
.agora .status {
- margin: 45px -50px 0 0;
- float: right;
- font-size: 11px;
- opacity: 0.3;
+ margin: 45px -50px 0 0;
+ float: right;
+ font-size: 11px;
+ opacity: 0.3;
}
.agora .status2 {
- margin: -10px 20px 0 0;
- float: right;
- display: block;
- font-size: 11px;
- opacity: 0.3;
+ margin: -10px 20px 0 0;
+ float: right;
+ display: block;
+ font-size: 11px;
+ opacity: 0.3;
}
.agora .chat .chat_converse .chat_msg_item .chat_avatar {
position: absolute;
top: 0;
}
-.agora .chat .chat_converse .chat_msg_item.chat_msg_item_remote_user .chat_avatar {
+.agora
+ .chat
+ .chat_converse
+ .chat_msg_item.chat_msg_item_remote_user
+ .chat_avatar {
left: -48px;
background: var(--remote-bgcolor);
}
-.agora .chat .chat_converse .chat_msg_item.chat_msg_item_local_user .chat_avatar {
+.agora
+ .chat
+ .chat_converse
+ .chat_msg_item.chat_msg_item_local_user
+ .chat_avatar {
right: -52px;
background: rgba(0, 0, 0, 0.6);
}
-.agora .chat .chat_converse .chat_msg_item .chat_avatar, .chat_avatar img{
+.agora .chat .chat_converse .chat_msg_item .chat_avatar,
+.chat_avatar img {
width: 35px;
height: 35px;
text-align: center;
@@ -366,7 +382,7 @@
}
.agora .chat .chat_converse .chat_msg_item.chat_msg_item_remote_user {
- margin-left: 56px;
+ margin-left: 56px;
background: var(--remote-bgcolor);
color: #666;
}
@@ -379,7 +395,7 @@
}
.agora .chat .chat_converse .chat_msg_item.chat_msg_item_remote_user:before {
- content: '';
+ content: "";
position: absolute;
top: 15px;
left: -12px;
@@ -388,10 +404,10 @@
border-right-color: var(--remote-bgcolor);
}
-.agora .chat_form .get-notified label{
- color: #077ad6;
- font-weight: 600;
- font-size: 11px;
+.agora .chat_form .get-notified label {
+ color: #077ad6;
+ font-weight: 600;
+ font-size: 11px;
}
.agora .chat input {
@@ -415,26 +431,26 @@
border: 1px solid #83c76d;
}
.agora .chat_form .get-notified i {
- background: #83c76d;
- width: 30px;
- height: 32px;
- font-size: 18px;
- color: #fff;
- line-height: 30px;
- font-weight: 600;
- text-align: center;
- margin: 2px 0 0 -30px;
- position: absolute;
- border-radius: 3px;
+ background: #83c76d;
+ width: 30px;
+ height: 32px;
+ font-size: 18px;
+ color: #fff;
+ line-height: 30px;
+ font-weight: 600;
+ text-align: center;
+ margin: 2px 0 0 -30px;
+ position: absolute;
+ border-radius: 3px;
}
.agora .chat_form .message_form {
margin: 10px 0 0 0;
}
-.agora .chat_form .message_form input{
+.agora .chat_form .message_form input {
margin: 5px 0 5px 0;
border: 1px solid #e0e0e0;
}
-.agora .chat_form .message_form textarea{
+.agora .chat_form .message_form textarea {
margin: 5px 0 5px 0;
border: 1px solid #e0e0e0;
position: relative;
@@ -452,25 +468,25 @@
padding: 5px;
border-radius: 3px;
}
-.agora .chat_form .message_form button{
- margin: 5px 0 5px 0;
- border: 1px solid #e0e0e0;
- position: relative;
- width: 95%;
- font-size: 12px;
- line-height: 20px;
- font-weight: 500;
- color: #fff;
- -webkit-font-smoothing: antialiased;
- /* font-smoothing: antialiased; */
- outline: none;
- background: #fff;
- display: inline-block;
- resize: none;
- padding: 5px;
- border-radius: 3px;
- background: #83c76d;
- cursor: pointer;
+.agora .chat_form .message_form button {
+ margin: 5px 0 5px 0;
+ border: 1px solid #e0e0e0;
+ position: relative;
+ width: 95%;
+ font-size: 12px;
+ line-height: 20px;
+ font-weight: 500;
+ color: #fff;
+ -webkit-font-smoothing: antialiased;
+ /* font-smoothing: antialiased; */
+ outline: none;
+ background: #fff;
+ display: inline-block;
+ resize: none;
+ padding: 5px;
+ border-radius: 3px;
+ background: #83c76d;
+ cursor: pointer;
}
.agora strong.chat_time {
padding: 0 1px 1px 0;
@@ -504,13 +520,13 @@
}
.agora .is-float {
- box-shadow: 0 0 6px rgba(0, 0, 0, .16), 0 6px 12px rgba(0, 0, 0, .32);
+ box-shadow: 0 0 6px rgba(0, 0, 0, 0.16), 0 6px 12px rgba(0, 0, 0, 0.32);
}
.agora .is-loading {
display: block;
- -webkit-animation: loadChat 1s cubic-bezier(0, .99, 1, 0.6) infinite;
- animation: loadChat 1s cubic-bezier(0, .99, 1, 0.6) infinite;
+ -webkit-animation: loadChat 1s cubic-bezier(0, 0.99, 1, 0.6) infinite;
+ animation: loadChat 1s cubic-bezier(0, 0.99, 1, 0.6) infinite;
}
/*Animation*/
@@ -518,7 +534,7 @@
0% {
-webkit-transform: scale(0);
transform: scale(0);
- opacity: 0.0;
+ opacity: 0;
}
100% {
-webkit-transform: scale(1);
@@ -531,7 +547,7 @@
0% {
-webkit-transform: scale(0);
transform: scale(0);
- opacity: 0.0;
+ opacity: 0;
}
100% {
-webkit-transform: scale(1);
@@ -544,7 +560,7 @@
0% {
-webkit-transform: scale(0);
transform: scale(0);
- opacity: 0.0;
+ opacity: 0;
}
50% {
-webkit-transform: scale(1.5);
@@ -562,7 +578,7 @@
0% {
-webkit-transform: scale(0);
transform: scale(0);
- opacity: 0.0;
+ opacity: 0;
}
50% {
-webkit-transform: scale(1.5);
@@ -580,8 +596,8 @@
/* SMARTPHONES LANDSCAPE */
@media only screen and (min-width: 480px) {
.agora .fabs {
- width: auto;
- margin: 1em;
+ /* width: auto;
+ margin: 1em;*/
}
.agora .chat {
width: 300px;
@@ -614,49 +630,106 @@
-ms-transform: scale(0);
/* webkit-transform: scale(0); */
-webkit-transform: scale(0);
- transform: scale(0);
+ transform: scale(0);
}
/*animation effect*/
.agora .ink.animate {
-webkit-animation: chatRipple 0.5s ease-in-out;
- animation: chatRipple 0.5s ease-in-out;
+ animation: chatRipple 0.5s ease-in-out;
}
@-webkit-keyframes chatRipple {
/*scale the element to 250% to safely cover the entire link and fade it out*/
-
+
100% {
opacity: 0;
-moz-transform: scale(5);
-ms-transform: scale(5);
webkit-transform: scale(5);
-webkit-transform: scale(5);
- transform: scale(5);
+ transform: scale(5);
}
}
@keyframes chatRipple {
/*scale the element to 250% to safely cover the entire link and fade it out*/
-
+
100% {
opacity: 0;
-moz-transform: scale(5);
-ms-transform: scale(5);
webkit-transform: scale(5);
-webkit-transform: scale(5);
- transform: scale(5);
+ transform: scale(5);
}
}
-.agora .chat ::-webkit-input-placeholder { /* Chrome */
+.agora .chat ::-webkit-input-placeholder {
+ /* Chrome */
color: #bbb;
}
-.agora .chat :-ms-input-placeholder { /* IE 10+ */
+.agora .chat :-ms-input-placeholder {
+ /* IE 10+ */
color: #bbb;
}
-.agora .chat ::-moz-placeholder { /* Firefox 19+ */
+.agora .chat ::-moz-placeholder {
+ /* Firefox 19+ */
color: #bbb;
}
-.agora .chat :-moz-placeholder { /* Firefox 4 - 18 */
+.agora .chat :-moz-placeholder {
+ /* Firefox 4 - 18 */
color: #bbb;
-}
\ No newline at end of file
+}
+/* chat position right */
+.fabs.fabs-chat-right {
+ right: 0;
+ top: 50%;
+ transform: translateY(-50%);
+ bottom: auto;
+ margin: 0;
+ /* height: 100%; */
+ position: absolute;
+ left: auto;
+ width: auto;
+}
+
+/* chat position left */
+.fabs.fabs-chat-left {
+ right: auto;
+ left: 0 !important;
+ top: 50%;
+ transform: translateY(-50%);
+ bottom: auto;
+ margin: 0;
+ /* height: 100%; */
+ position: absolute;
+ left: auto;
+ width: auto;
+}
+
+/*.agora-fullscreen .fabs.fabs-chat-left, .agora-fullscreen .fabs.fabs-chat-right{
+ top: auto;
+ transform: translateY(-150%);
+}*/
+
+/* chat position bottom */
+.fabs.fabs-chat-bottom {
+ width: auto;
+}
+
+/* chat position for audience */
+.chat_position {
+ position: absolute;
+ bottom: 0px;
+ right: 0px;
+ /* background: rgba(0, 0, 0, 0.5); */
+ width: 35px;
+ height: 35px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+#chatToggleBtn{
+ z-index: 2;
+}
diff --git a/public/css/raise-hand.css b/public/css/raise-hand.css
new file mode 100644
index 00000000..5abb7f07
--- /dev/null
+++ b/public/css/raise-hand.css
@@ -0,0 +1,4 @@
+.raise-hand-icon{
+ color: #FFFFFF;
+ cursor: pointer;
+}
\ No newline at end of file
diff --git a/public/css/wp-agora-styles.css b/public/css/wp-agora-styles.css
index 2e90781e..291e14a4 100644
--- a/public/css/wp-agora-styles.css
+++ b/public/css/wp-agora-styles.css
@@ -1,5 +1,7 @@
-*, ::after, ::before {
- box-sizing: border-box;
+*,
+::after,
+::before {
+ box-sizing: border-box;
}
.agora {
@@ -9,13 +11,13 @@
font-size: 14px;
position: relative;
line-height: 16px;
- font-family: Arial;
+ /* font-family: Arial;*/
background-color: var(--agora-background);
z-index: 10;
}
.agora .text-danger {
- color: #dc3545!important;
+ color: #dc3545 !important;
}
/* .agora-container.no-footer {
@@ -32,7 +34,7 @@
/* total 100vh - 32px of wp admin bar */
.admin-bar .agora-fullscreen .agora-container {
- height: calc(100vh - 32px)
+ height: calc(100vh - 32px);
}
.agora-container button {
@@ -66,16 +68,16 @@
grid-template-rows: 8vh 92vh;
}
-.agora .buttons-top{
+.agora .buttons-top {
display: flex;
justify-content: space-between;
- padding: 10px 16px
+ padding: 10px 16px;
}
-.agora .left-button{
+.agora .left-button {
display: inherit;
align-items: center;
}
-.agora .right-buttons{
+.agora .right-buttons {
display: inherit;
align-items: center;
}
@@ -83,16 +85,18 @@
color: #6c757e;
border: 1px solid #d7d7d7;
border-radius: 6px;
- padding: .5em 1em;
+ padding: 0.5em 1em;
background-color: #d7d7d7;
margin: 0;
}
-.agora .room-title .fas { color: #646161; }
+.agora .room-title .fas {
+ color: #646161;
+}
.agora .leave-meeting {
color: white;
border: 1px solid var(--red-bg-color);
border-radius: 5px;
- padding: .5em 1em;
+ padding: 0.5em 1em;
margin-left: 1em;
}
.agora .btn-danger,
@@ -112,7 +116,7 @@
.agora .icon-enlarge {
font-size: 20px;
color: #efefef;
- margin: .2em 1em;
+ margin: 0.2em 1em;
cursor: pointer;
}
@@ -140,14 +144,18 @@
margin: 0 auto;
display: none;
text-align: center;
+ max-height: 100%;
}
.agora .screen.sharescreen .no-video-overlay {
font-size: 1.8em;
}
.agora .screen.sharescreen .mute-overlay {
font-size: 1.2em;
- bottom: 8px;
- left: calc(50% - 10px);
+ /*bottom: 8px;
+ left: calc(50% - 10px);*/
+ left: 0;
+ bottom: 0;
+ padding: 5px;
}
.agora .screen {
@@ -157,9 +165,9 @@
}
.agora.agora-fullscreen .screen {
align-items: center;
- padding: 0 15px;
+ /* padding: 0 15px;*/
}
-.agora .screen-users{
+.agora .screen-users {
display: flex;
flex-wrap: wrap;
justify-content: center;
@@ -169,7 +177,7 @@
.agora .screen-users .user {
position: relative;
overflow: hidden;
- padding: 3px;
+ padding: 2px;
background-color: #111;
}
.screen-users .user video {
@@ -192,7 +200,9 @@
.agora .screen.sharescreen .screenshare-container {
width: 100%;
- height: 50vh;
+ /* height: 50vh; */
+ height: 100%;
+ position: relative;
}
/* screen with 1 user */
@@ -212,75 +222,93 @@
/* screeen with 2 users */
.agora .screen-users-2 .user {
- width: 49%;
+ width: 49.5%;
height: 45vh;
}
.agora-fullscreen .screen-users-2 .user {
- width: 50%;
+ width: 50% !important;
height: 69.5vh;
}
/* screen with 3-4 users */
.agora .screen-users-3 .user,
-.agora .screen-users-4 .user{
+.agora .screen-users-4 .user {
width: 50%;
height: 30vh;
}
.agora-fullscreen .screen-users-3 .user,
-.agora-fullscreen .screen-users-4 .user{
+.agora-fullscreen .screen-users-4 .user {
height: 36vh;
}
/* screen with 5 y 6 users */
-.agora .screen-users-5-6 .user{
+.agora .screen-users-5-6 .user {
width: 33%;
height: 25vh;
}
-.agora-fullscreen .screen-users-5-6 .user{
+.agora-fullscreen .screen-users-5-6 .user {
height: 37vh;
}
/* screen with 7 y 8 users */
-.agora .screen-users-7-9 .user{
- width: 33%;
+.agora .screen-users-7-9 .user {
+ width: 33% !important;
height: 20vh;
}
-.agora-fullscreen .screen-users-7-9 .user{
+.agora-fullscreen .screen-users-7-9 .user {
height: 25vh;
}
/* pantalla 10, 11 y 12*/
-.agora .screen-users-10-12 .user{
- width: 24.5%;
+.agora .screen-users-10-12 .user {
+ width: 24.5% !important;
height: 17vh;
}
-.agora-fullscreen .screen-users-10-12 .user{
+.agora-fullscreen .screen-users-10-12 .user {
height: 24vh;
}
-
.agora .modal,
-.agora .hidden { display: none }
+.agora .hidden {
+ display: none;
+}
.agora-footer {
background: var(--agora-background);
- display: flex;
+ /* display: flex; */
+ display: none;
justify-content: center;
align-items: center;
z-index: 2;
flex-direction: column;
- position: relative;
+ /* position: relative; */
+}
+.agora-fullscreen .agora-footer {
+ width: 100%;
+ position: fixed;
+ bottom: 0;
+}
+.agora .buttons-bottom {
+ margin: 1em 0.5em;
+ display: flex;
}
-.agora-fullscreen .agora-footer { width: 100%; position: fixed; bottom: 0; }
-.agora .buttons-bottom { margin: 1em .5em; display: flex; }
.agora .buttons-bottom .btn-group,
-.agora .buttons-bottom>.btn-with-title { margin: 0 7px; text-align: center; position: relative; display: grid;
- grid-template-columns: 1fr; grid-template-rows: 1fr; }
-.agora .buttons-bottom .btn-group { grid-template-columns: 1fr 0.65fr; }
+.agora .buttons-bottom > .btn-with-title {
+ margin: 0 7px;
+ text-align: center;
+ position: relative;
+ display: grid;
+ grid-template-columns: 1fr;
+ grid-template-rows: 1fr;
+}
+.agora .buttons-bottom .btn-group {
+ grid-template-columns: 1fr 0.65fr;
+}
/* override default styles of .show class in case other themes and plugins are doing it */
-.agora .buttons-bottom .btn-group.show {display: grid !important;}
-
+.agora .buttons-bottom .btn-group.show {
+ display: grid !important;
+}
.agora .btnIcon {
background: #6c757e;
@@ -292,7 +320,8 @@
padding: 8px 12px;
text-align: center;
user-select: none;
- transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out,
+ border-color 0.15s ease-in-out;
max-width: 40px;
margin: 0 auto;
position: static;
@@ -301,89 +330,93 @@
background-color: #8795a3;
}
.agora .btnIcon:focus {
-
}
.agora .fas {
- color: #efefef;
+ color: #efefef;
}
.agora-audience button .fas {
- color: #0096E6;
+ color: #0096e6;
}
.btn-group {
- position: relative;
+ position: relative;
}
-.btn-group>.btn-group:not(:last-child)>.btnIcon,
-.btn-group>.btnIcon:not(:last-child):not(.dropdown-toggle) {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- padding-right: 6px;
+.btn-group > .btn-group:not(:last-child) > .btnIcon,
+.btn-group > .btnIcon:not(:last-child):not(.dropdown-toggle) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ padding-right: 6px;
}
-.btn-group>.btnIcon:not(:first-child) {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
+.btn-group > .btnIcon:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.btn-group small.btn-title {
+ grid-column: 1 / span 2;
}
-.btn-group small.btn-title { grid-column: 1 / span 2; }
.agora .buttons-bottom small {
color: #808080;
}
-.agora .btnIcon.dropdown-toggle { padding: 8px; float: right; }
+.agora .btnIcon.dropdown-toggle {
+ padding: 8px;
+ float: right;
+}
.dropdown-toggle::after {
- display: inline-block;
- /* margin-left: .255em; */
- vertical-align: .255em;
- content: "";
- border-top: .22em solid;
- border-right: .22em solid transparent;
- border-bottom: 0;
- border-left: .22em solid transparent;
+ display: inline-block;
+ /* margin-left: .255em; */
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.22em solid;
+ border-right: 0.22em solid transparent;
+ border-bottom: 0;
+ border-left: 0.22em solid transparent;
}
.dropdown-menu.show {
- display: block;
+ display: block;
}
-.dropdown-menu[x-placement^=bottom],
-.dropdown-menu[x-placement^=left],
-.dropdown-menu[x-placement^=right],
-.dropdown-menu[x-placement^=top] {
- right: auto;
- bottom: auto;
+.dropdown-menu[x-placement^="bottom"],
+.dropdown-menu[x-placement^="left"],
+.dropdown-menu[x-placement^="right"],
+.dropdown-menu[x-placement^="top"] {
+ right: auto;
+ bottom: auto;
}
.dropdown-menu {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: 1000;
- display: none;
- min-width: 10rem;
- padding: .5rem 0;
- margin: .125rem 0 0;
- font-size: 1rem;
- color: #212529;
- text-align: left;
- list-style: none;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid rgba(0,0,0,.15);
- border-radius: .25rem;
- box-shadow: 2px 2px 10px -2px #7e7e7e;
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ min-width: 10rem;
+ padding: 0.5rem 0;
+ margin: 0.125rem 0 0;
+ font-size: 1rem;
+ color: #212529;
+ text-align: left;
+ list-style: none;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
+ box-shadow: 2px 2px 10px -2px #7e7e7e;
}
.dropdown-item:first-child {
- border-top-left-radius: calc(.25rem - 1px);
- border-top-right-radius: calc(.25rem - 1px);
+ border-top-left-radius: calc(0.25rem - 1px);
+ border-top-right-radius: calc(0.25rem - 1px);
}
.dropdown-item {
- display: block;
- width: 100%;
- padding: .25rem 1.5rem;
- clear: both;
- font-weight: 400;
- font-size: 16px;
- color: #212529;
- text-align: inherit;
- white-space: nowrap;
- background-color: transparent;
- border: 0;
- cursor: pointer;
+ display: block;
+ width: 100%;
+ padding: 0.5rem 1.5rem;
+ clear: both;
+ font-weight: 400;
+ font-size: 16px;
+ color: #212529;
+ text-align: inherit;
+ white-space: nowrap;
+ background-color: transparent;
+ border: 0;
+ cursor: pointer;
}
.btn-separator {
@@ -396,61 +429,80 @@
}
.spinner-border {
- display: inline-block;
- width: 1rem;
- height: 1rem;
- vertical-align: text-bottom;
- border: .25em solid currentColor;
- border-right-color: transparent;
- border-radius: 50%;
- -webkit-animation: spinner-border .75s linear infinite;
- animation: spinner-border .75s linear infinite;
+ display: inline-block;
+ width: 1rem;
+ height: 1rem;
+ vertical-align: text-bottom;
+ border: 0.25em solid currentColor;
+ border-right-color: transparent;
+ border-radius: 50%;
+ -webkit-animation: spinner-border 0.75s linear infinite;
+ animation: spinner-border 0.75s linear infinite;
}
@keyframes spinner-border {
- to { transform: rotate(360deg); }
+ to {
+ transform: rotate(360deg);
+ }
}
/*
* Boostrap Modal Styles
*/
.agora .modal-open .modal {
- overflow-x: hidden;
- overflow-y: auto;
+ overflow-x: hidden;
+ overflow-y: auto;
}
.agora .modal {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1050;
- display: none;
- width: 100%;
- overflow: hidden;
- outline: 0;
- padding-top: 68px;
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1050;
+ display: none;
+ width: 100%;
+ overflow: hidden;
+ outline: 0;
+ height: 100%;
+ bottom: 0;
+ right: 0;
+ background-color: rgba(0, 0, 0, 0.5);
+ /* padding-top: 68px;*/
}
.agora .fade:not(.show) {
- opacity: 0;
+ opacity: 0;
}
.agora .fade {
- transition: opacity .15s linear;
+ transition: opacity 0.15s linear;
}
.agora .modal-dialog {
- position: relative;
- width: auto;
- margin: 0 auto;
- pointer-events: none;
+ position: absolute;
+ width: 100%;
+ /* width: auto; */
+ margin: 0 auto;
+ pointer-events: none;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%) !important;
}
.agora .modal.show .modal-dialog {
- -webkit-transform: none;
- transform: none;
+ -webkit-transform: none;
+ transform: none;
}
.agora .modal.fade .modal-dialog {
- transition: -webkit-transform .3s ease-out;
- transition: transform .3s ease-out;
- transition: transform .3s ease-out,-webkit-transform .3s ease-out;
- -webkit-transform: translate(0,-35px);
- transform: translate(0,-35px);
+ transition: -webkit-transform 0.3s ease-out;
+ transition: transform 0.3s ease-out;
+ transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;
+ -webkit-transform: translate(0, -35px);
+ transform: translate(0, -35px);
+}
+
+/*agora full screen*/
+.agora.agora-communication.agora-fullscreen .speaker-view {
+ height: calc(100vh - 180px) !important;
}
+.agora.agora-communication.agora-fullscreen .speaker-view .main-screen {
+ height: 100%;
+}
+
@media (min-width: 576px) {
.modal-dialog {
max-width: 500px;
@@ -467,8 +519,8 @@
pointer-events: auto;
background-color: #fff;
background-clip: padding-box;
- border: 1px solid rgba(0,0,0,.2);
- border-radius: .3rem;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 0.3rem;
outline: 0;
}
.agora .modal-header {
@@ -478,16 +530,18 @@
align-items: flex-start;
-ms-flex-pack: justify;
justify-content: space-between;
- padding: 0 1rem 0;
+ /* padding: 0 1rem 0; */
+ padding: 1rem;
border-bottom: 1px solid #e9ecef;
- border-top-left-radius: .3rem;
- border-top-right-radius: .3rem;
+ border-top-left-radius: 0.3rem;
+ border-top-right-radius: 0.3rem;
}
.agora .modal-body {
position: relative;
-ms-flex: 1 1 auto;
flex: 1 1 auto;
- padding: 1rem 1rem 0.25rem;
+ /* padding: 1rem 1rem 0.25rem; */
+ padding: 1rem;
}
.agora .modal-footer {
display: -ms-flexbox;
@@ -498,14 +552,14 @@
justify-content: flex-end;
padding: 1rem;
border-top: 1px solid #e9ecef;
- border-bottom-right-radius: .3rem;
- border-bottom-left-radius: .3rem;
+ border-bottom-right-radius: 0.3rem;
+ border-bottom-left-radius: 0.3rem;
}
-.agora .modal-footer>:not(:last-child) {
- margin-right: .25rem;
+.agora .modal-footer > :not(:last-child) {
+ margin-right: 0.25rem;
}
.agora .modal .btn {
- padding: .5rem .7rem;
+ padding: 0.5rem 0.7rem;
cursor: pointer;
}
.agora .modal .btn.btn-primary {
@@ -518,23 +572,25 @@
border-color: #868c90;
}
.agora .close {
- float: right;
- font-size: 24px;
- font-weight: 700;
- line-height: 1;
- color: #000;
- text-shadow: 0 1px 0 #fff;
- opacity: .5;
+ float: right;
+ font-size: 24px;
+ font-weight: 700;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ opacity: 0.5;
}
.agora .close:hover {
- color: #000;
- text-decoration: none;
- background: transparent;
+ color: #000;
+ text-decoration: none;
+ background: transparent;
+}
+.agora .close:not(:disabled):not(.disabled) {
+ cursor: pointer;
}
-.agora .close:not(:disabled):not(.disabled) { cursor: pointer; }
.agora .close:not(:disabled):not(.disabled):focus,
.agora .close:not(:disabled):not(.disabled):hover {
- opacity: .75;
+ opacity: 0.75;
}
.agora button.close {
padding: 0;
@@ -546,11 +602,17 @@
}
.modal-header .close {
padding: 0.5rem;
- margin: .05rem 0 0;
+ margin: 0.05rem 0 0;
+}
+.modal-title .fas {
+ color: #8b8b8b;
+}
+.modal-backdrop.show {
+ opacity: 0.5;
+}
+.modal-backdrop {
+ display: none;
}
-.modal-title .fas { color: #8b8b8b; }
-.modal-backdrop.show { opacity: .5; }
-.modal-backdrop { display: none }
.modal .img-permissions {
margin: auto;
display: block;
@@ -564,67 +626,88 @@
* Bootstrap Toast Notifications
*/
.toast {
- -ms-flex-preferred-size: 350px;
- flex-basis: 350px;
- max-width: 350px;
- font-size: .875rem;
- background-color: rgba(255,255,255,.85);
- background-clip: padding-box;
- border: 1px solid rgba(0,0,0,.1);
- box-shadow: 0 0.25rem 0.75rem rgba(0,0,0,.1);
- opacity: 0;
- border-radius: .25rem;
+ -ms-flex-preferred-size: 350px;
+ flex-basis: 350px;
+ max-width: 350px;
+ font-size: 0.875rem;
+ background-color: rgba(255, 255, 255, 0.85);
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);
+ opacity: 0;
+ border-radius: 0.25rem;
}
.agora .toast {
position: absolute;
top: 88px;
left: 7px;
+ z-index: 1;
}
-.toast:not(:last-child) { margin-bottom: 0.75rem; }
+.toast:not(:last-child) {
+ margin-bottom: 0.75rem;
+}
-.toast.showing { opacity: 1; }
-.toast.show { display: block; opacity: 1; }
-.toast.hide { display: none; }
+.toast.showing {
+ opacity: 1;
+}
+.toast.show {
+ display: block;
+ opacity: 1;
+}
+.toast.hide {
+ display: none;
+}
.toast-header {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: center;
- align-items: center;
- padding: .25rem .75rem;
- color: #6c757d;
- background-color: rgba(255,255,255,.85);
- background-clip: padding-box;
- border-bottom: 1px solid rgba(0,0,0,.05);
- border-top-left-radius: calc(.25rem - 1px);
- border-top-right-radius: calc(.25rem - 1px);
-}
-.toast-body { padding: .75rem; }
-.agora .mr-auto, .agora .mx-auto { margin-right: auto!important; }
-.agora .ml-2, .agora .mx-2 { margin-left: .5rem!important; }
-.agora .mb-1, .agora .my-1 { margin-bottom: .25rem!important; }
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+ padding: 0.25rem 0.75rem;
+ color: #6c757d;
+ background-color: rgba(255, 255, 255, 0.85);
+ background-clip: padding-box;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+ border-top-left-radius: calc(0.25rem - 1px);
+ border-top-right-radius: calc(0.25rem - 1px);
+}
+.toast-body {
+ padding: 0.75rem;
+}
+.agora .mr-auto,
+.agora .mx-auto {
+ margin-right: auto !important;
+}
+.agora .ml-2,
+.agora .mx-2 {
+ margin-left: 0.5rem !important;
+}
+.agora .mb-1,
+.agora .my-1 {
+ margin-bottom: 0.25rem !important;
+}
/*
* Bootstrap Form Styles
*/
.form-group {
- margin-bottom: 1rem;
+ margin-bottom: 1rem;
}
.form-control {
- display: block;
- width: 100%;
- height: calc(1.75rem + 2px);
- padding: .375rem .75rem;
- font-size: 16px;
- font-weight: 400;
- line-height: 1.5;
- color: #495057;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid #ced4da;
- border-radius: .25rem;
- transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out;
+ display: block;
+ width: 100%;
+ height: calc(1.75rem + 2px);
+ padding: 0.375rem 0.75rem;
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #495057;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid #ced4da;
+ border-radius: 0.25rem;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
/*
@@ -652,14 +735,13 @@
width: 16px;
height: 16px;
vertical-align: text-bottom;
- border: .2em solid #da4964;
+ border: 0.2em solid #da4964;
border-right-color: transparent;
border-radius: 50%;
- -webkit-animation: spinner-border .75s linear infinite;
- animation: spinner-border .75s linear infinite;
+ -webkit-animation: spinner-border 0.75s linear infinite;
+ animation: spinner-border 0.75s linear infinite;
}
-
/*
* Audience Page styles
*/
@@ -709,12 +791,28 @@
position: absolute;
z-index: 1031;
}
-.agora .fabs .fas { cursor: pointer; }
-.agora .fabs .chat {
+.agora .fabs.raise-hand-icon-fabs {
position: absolute;
+ bottom: 20px;
+ left: 50%;
+ transform: translateX(-50%);
+ /* background: rgba(0, 0, 0, 0.5); */
+ padding: 10px;
+ border-radius: 10px;
+ right: unset;
+ z-index: 99;
+ width: auto;
+}
+
+.agora .fabs .fas {
+ cursor: pointer;
+}
+
+.agora .fabs .chat {
+ /* position: absolute;
right: 0;
- bottom: 0;
+ bottom: 0; */
display: none;
opacity: 0;
}
@@ -723,75 +821,632 @@
opacity: 0;
}
-.only-mobile { display: none !important; }
+.only-mobile {
+ display: none !important;
+}
/*
* Responsive Media Queries
*/
-@media screen and (max-width: 1023px){
- .agora .screen-users-10-12 .user{
- width: 22%;
+@media screen and (max-width: 1023px) {
+ .agora .screen-users-10-12 .user {
+ width: 22% !important;
}
}
-@media screen and (max-width:768px) {
- .agora { font-size: 13px; }
- .agora .screen { padding: 5px 0; }
- .agora .btn-separator { display: none }
- .agora.agora-communication .only-desktop { display: none !important; }
- .agora.agora-communication .only-mobile { display: block !important; }
+@media screen and (max-width: 768px) {
+ .agora {
+ font-size: 13px;
+ }
+ .agora .screen {
+ padding: 5px 0;
+ }
+ .agora .btn-separator {
+ display: none;
+ }
+ .agora.agora-communication .only-desktop {
+ display: none !important;
+ }
+ .agora.agora-communication .only-mobile {
+ display: block !important;
+ }
.agora .screen-users-2 .user {
- width: 46.5%;
+ width: 46.5% !important;
}
- .agora .screen-users-4 .user{
- width: 46%;
+ .agora .screen-users-4 .user {
+ width: 46% !important;
}
- .agora .screen-users-10-12 .user{
- width: 32%;
+ .agora .screen-users-10-12 .user {
+ width: 32% !important;
}
}
-@media screen and (max-width: 480px){
- .agora .buttons-botton { font-size: 25px; }
- .agora .screen-users { margin: 0; }
- .agora .screen-users .user { padding: 0.1em; }
- .agora .screen-users-1 .user { height: 70vh; }
+@media screen and (max-width: 480px) {
+ .agora .buttons-botton {
+ font-size: 25px;
+ }
+ .agora .screen-users {
+ margin: 0;
+ }
+ .agora .screen-users .user {
+ padding: 0.1em;
+ }
+ .agora .screen-users-1 .user {
+ height: 70vh;
+ }
.agora .screen-users-3 .user,
- .agora .screen-users-4 .user { width: 50%; height: 32vh; }
- .agora .screen-users-3 .user:last-child{ width: 100%; }
- .agora .screen-users-2 .user{
- width: 100%;
+ .agora .screen-users-4 .user {
+ width: 50% !important;
+ height: 32vh;
+ }
+ .agora .screen-users-3 .user:last-child {
+ width: 100% !important;
+ }
+ .agora .screen-users-2 .user {
+ width: 100% !important;
height: 32vh;
}
- .agora .screen-users-5-6 .user { height: 22vh; }
- .agora .screen-users-7-9 .user { width: 32%; height: 21vh; }
+ .agora .screen-users-5-6 .user {
+ height: 22vh;
+ }
+ .agora .screen-users-7-9 .user {
+ width: 32% !important;
+ height: 21vh;
+ }
- .agora-fullscreen .agora-container { height: 100vh; }
- .agora.agora-fullscreen .screen { padding: 0 5px; }
- .agora-fullscreen .screen-users-1 .user{ height: 78vh; }
- .agora-fullscreen .screen-users-2 .user{ height: 40vh; }
+ .agora-fullscreen .agora-container {
+ height: 100vh;
+ }
+ .agora.agora-fullscreen .screen {
+ padding: 0 5px;
+ }
+ .agora-fullscreen .screen-users-1 .user {
+ height: 78vh;
+ }
+ .agora-fullscreen .screen-users-2 .user {
+ height: 40vh;
+ }
.agora-fullscreen .screen-users-3 .user,
- .agora-fullscreen .screen-users-4 .user { height: 38vh; }
- .agora-fullscreen .screen-users-5-6 .user { width: 50%; height: 26vh; }
- .agora-fullscreen .screen-users-7-9 .user { width: 33%; height: 26vh; }
- .agora-fullscreen .screen-users-10-12 .user { width: 25%; height: 26vh; }
+ .agora-fullscreen .screen-users-4 .user {
+ height: 38vh;
+ }
+ .agora-fullscreen .screen-users-5-6 .user {
+ width: 50% !important;
+ height: 26vh;
+ }
+ .agora-fullscreen .screen-users-7-9 .user {
+ width: 33% !important;
+ height: 26vh;
+ }
+ .agora-fullscreen .screen-users-10-12 .user {
+ width: 25% !important;
+ height: 26vh;
+ }
}
@media screen and (max-width: 320px) {
- .agora .buttons-botton{
+ .agora .buttons-botton {
font-size: 18px;
}
}
@media screen and (max-height: 480px) {
- .agora .icon-cog{
+ .agora .icon-cog {
font-size: 16px;
}
- .agora .buttons-botton{
+ .agora .buttons-botton {
font-size: 18px;
}
- .agora .icon-enlarge{
+ .agora .icon-enlarge {
font-size: 16px;
margin-right: 1.5em;
}
- .agora .buttons-botton{
+ .agora .buttons-botton {
font-size: 20px;
}
}
+
+/*camera settings*/
+.action-buttons > button.click_to_join,
+#test_microphone_div > button {
+ width: 100%;
+ padding: 10px;
+ font-size: 15px;
+}
+
+.action-buttons {
+ margin-top: 15px;
+}
+#test-device-camera-list > select {
+ width: 100%;
+}
+.d-flex_align {
+ display: flex;
+ flex-direction: column;
+ margin-bottom: 15px;
+}
+.d-flex_align > span {
+ padding-bottom: 5px;
+ font-size: 16px;
+}
+
+button#exit-btn {
+ font-size: 16px;
+}
+/* Bigstep */
+
+/* Active Speaker */
+.activeSpeaker {
+ animation: myVoice 3s infinite;
+ border: 1px solid red;
+}
+@keyframes myVoice {
+ from {
+ border-color: #fff;
+ }
+ to {
+ border-color: #ff0000;
+ }
+}
+
+/*Ghost Mode */
+#big-no-video-stream .no-video-overlay {
+ position: absolute;
+ z-index: 3;
+ width: calc(100% - 0.4em);
+ top: 40%;
+ color: #cccccc;
+ font-size: 2.5em;
+ margin: 0 auto;
+ display: block;
+ text-align: center;
+}
+
+.agora.agora-audience #big-no-video-stream {
+ height: 65vh;
+}
+
+.agora #big-no-video-stream {
+ height: 50vh;
+}
+
+/* End Ghost Mode */
+
+/* Files in chat */
+.tmp_fileMsg {
+ position: absolute;
+ bottom: 0;
+}
+
+.chat-file-upload label {
+ cursor: pointer;
+}
+
+.chat-file-upload input[type="file"] {
+ display: none !important;
+}
+
+.chat-file-progress-bar {
+ background-color: #005aab;
+ height: 24px;
+}
+
+/* End files in chat */
+
+/****************video*mute*overlay*******************/
+.user .no-video-overlay,
+.screenshare-container .no-video-overlay
+ {
+ position: absolute;
+ z-index: 2;
+ width: calc(100%);
+ top: 0;
+ color: #cccccc;
+ font-size: 2.5em;
+ margin: 0 auto;
+ text-align: center;
+ align-items: center;
+ justify-content: center;
+ background-color: #607d8b;
+ height: 100%;
+}
+/*----------------need--to -add display-flex-in inline-css-----------------*/
+
+/****************mike*mute*overlay*end******************/
+/*.user .mute-overlay { position: absolute; z-index: 3; left: calc(50% - 14px); font-size: 1.5em; padding: 2px 0 0 2px; display: none; }*/
+.user .mute-overlay {
+ position: absolute;
+ z-index: 3;
+ left: 0;
+ font-size: 1em;
+ padding: 10px;
+ display: none;
+ background: rgba(0, 0, 0, 0.5);
+ bottom: 0;
+}
+
+/****************active*speaker*****************/
+.user-speraker,
+.user-speraker:before,
+.user-speraker:after {
+ border-radius: 50%;
+ width: 1.5em;
+ height: 1.5em;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+ -webkit-animation: load7 1.8s infinite ease-in-out;
+ animation: load7 1.8s infinite ease-in-out;
+}
+.user-speraker {
+ color: #ffffff;
+ font-size: 6px;
+ position: absolute;
+ text-indent: -9999em;
+ -webkit-transform: translateZ(0);
+ -ms-transform: translateZ(0);
+ transform: translateZ(0);
+ -webkit-animation-delay: -0.16s;
+ animation-delay: -0.16s;
+ z-index: 99;
+ left: 50%;
+ bottom: 7%;
+}
+.user-speraker:before,
+.user-speraker:after {
+ content: "";
+ position: absolute;
+ top: 0;
+}
+.user-speraker:before {
+ left: -3.5em;
+ -webkit-animation-delay: -0.32s;
+ animation-delay: -0.32s;
+}
+.user-speraker:after {
+ left: 3.5em;
+}
+@-webkit-keyframes load7 {
+ 0%,
+ 80%,
+ 100% {
+ box-shadow: 0 2.5em 0 -1.3em;
+ }
+ 40% {
+ box-shadow: 0 2.5em 0 0;
+ }
+}
+@keyframes load7 {
+ 0%,
+ 80%,
+ 100% {
+ box-shadow: 0 2.5em 0 -1.3em;
+ }
+ 40% {
+ box-shadow: 0 2.5em 0 0;
+ }
+}
+/****************active*speaker*end****************/
+/*-----------------------click-to-unmute----------------------------------*/
+.user .resume-userclick {
+ position: absolute;
+ z-index: 11;
+ cursor: pointer;
+ display: inline-block;
+ background-color: #00000047;
+ padding: 0.5rem 0.8rem;
+ border-radius: 25px;
+ left: 3%;
+ color: #fff;
+ top: 4%;
+ font-size: 0.7rem;
+ border: 0.4px solid #ffffff2e;
+}
+/*-----------------------click-to-unmute-ends---------------------------------*/
+.speaker-view {
+ display: flex !important;
+ justify-content: space-between;
+ height: 50vh !important;
+}
+.speaker-view .main-screen {
+ width: 100%;
+}
+.speaker-view .screen-users {
+ width: 20%;
+ display: block;
+ overflow-y: auto;
+ flex-direction: column;
+ height: 100%;
+ max-height: 100% !important;
+ justify-content: flex-start;
+}
+.speaker-view .screen-users .user {
+ width: 100%;
+ max-height: 200px !important;
+}
+.speaker-view .main-screen .user {
+ display: block !important;
+ height: 100%;
+ position: relative;
+}
+/*-----------------------chat----------------------------------*/
+.chat .fab_field.user {
+ align-items: center;
+}
+.chat .fab_field.user .chat_field {
+ line-height: 9px !important;
+}
+.chat .fab_field.user {
+ padding: 0 0.5rem 0 0.5rem !important;
+}
+.chat .tmp_fileMsg {
+ position: relative;
+ padding: 0.5rem;
+ background-color: #f8f8f8;
+ margin: 0.2rem;
+ margin-left: 0.5rem !important;
+ display: inline-block;
+}
+.chat .tmp_fileMsg .action a {
+ padding: 0.1rem 0.3rem;
+ background-color: #ff0000;
+ width: 21px;
+ justify-content: center;
+ align-items: center;
+ display: inline-flex;
+ margin-top: 0.2rem;
+ color: #fff !important;
+ border-radius: 2rem;
+ font-size: 0.6rem;
+}
+.agora .chat-msg-line.local label {
+ font-size: 1rem;
+ margin-left: 0.5rem !important;
+}
+.chat .tmp_fileMsg .action {
+ position: absolute;
+ right: -7px;
+ top: -14px;
+}
+.agora .chat .chat-msg-line label {
+ font-size: 1rem !important;
+}
+/*-----------------------chat-end---------------------------------*/
+
+/* */
+#main-screen-stream-section {
+ height: 100%;
+}
+
+.remote-stream-main-container {
+ width: 100%;
+ height: 100%;
+}
+
+/* Test Device */
+#test-device-section {
+ color: #ffffff;
+ width: 50%;
+ padding: 0 10px;
+}
+
+.test-device-volume-indicator {
+ display: none;
+}
+
+#test-device-progressBar {
+ width: 100%;
+ height: 8px;
+ background-color: #666666;
+ display: inline-block;
+}
+
+#test-device-myVolume {
+ width: 0%;
+ height: 100%;
+ background-color: #b4bb6b;
+ display: block;
+}
+
+.test-device-volumeScaleHolder {
+ padding: 0;
+ margin: 3px 0;
+}
+
+.remote-stream-controls {
+ position: absolute;
+ z-index: 10;
+ width: calc(100%);
+ /*top: 5%;*/
+ color: #cccccc;
+ font-size: 2.5em;
+ margin: 0 auto;
+ text-align: center;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ /*new added*/
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ display: flex;
+}
+
+.remote-stream-controls .mute-remote-audio-div > i,
+.remote-stream-controls .mute-remote-video-div > i {
+ font-size: 15px;
+}
+
+.remote-stream-controls .mute-remote-audio-div,
+.remote-stream-controls .mute-remote-video-div {
+ width: 30px;
+ height: 30px;
+ background-color: rgba(0, 0, 0, 0.5);
+ border-radius: 100%;
+ margin: 2px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ cursor: pointer;
+}
+.remote-stream-pin-control-section,
+.remote-stream-unpin-control-section {
+ position: absolute;
+ z-index: 50;
+ /* width: calc(100%); */
+ top: 0;
+ color: #fff;
+ font-size: 1.5em;
+ margin: 0 auto;
+ text-align: center;
+ align-items: center;
+ justify-content: center;
+ /* height: 100%; */
+}
+/*mutliple stream*/
+.speaker-view .screen-users .remote-stream-main-container {
+ height: 25%;
+}
+.speaker-view .screen-users .remote-stream-main-container .user {
+ max-height: unset;
+ height: 100%;
+ width: 100% !important;
+}
+
+/*pin unpin css*/
+.remote-pin-div {
+ position: absolute;
+ top: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ background-color: rgba(0, 0, 0, 0.5);
+ height: 30px;
+ width: 30px;
+ z-index: 9;
+ cursor: pointer;
+}
+.remote-pin-div > i {
+ font-size: 15px;
+}
+
+/* allow/reject button */
+
+.permission-confirmation-section .actions > button {
+ padding: 5px 15px;
+ font-size: 15px;
+ margin: 20px 5px;
+}
+.permission-text {
+ font-size: 18px;
+}
+.modal-header button.close {
+ background: transparent;
+}
+
+.raise-hand-requests > button {
+ padding: 2px 7px;
+}
+
+/* modal popup ui*/
+/* allow/reject button */
+
+.accept-raise-hand,
+.reject-raise-hand {
+ padding: 5px 15px;
+ font-size: 15px;
+ margin: 20px 5px 10px;
+}
+.user-details {
+ font-size: 17px;
+}
+
+/* left and right screen user */
+.screen.agora-screen-users-left.sharescreen,
+.screen.agora-screen-users-right.sharescreen {
+ display: flex;
+}
+.screen.agora-screen-users-left.sharescreen > .screen-users,
+.screen.agora-screen-users-right.sharescreen > .screen-users {
+ flex: 0 0 25%;
+ max-width: 25%;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ max-height: 338px;
+ height: 100%;
+}
+.screen.agora-screen-users-left.sharescreen > .screenshare-container,
+.screen.agora-screen-users-right.sharescreen > .screenshare-container {
+ flex: 0 0 75%;
+ max-width: 75%;
+}
+
+/* for right screen user */
+.screen.agora-screen-users-right.sharescreen {
+ flex-direction: row-reverse;
+}
+
+/* for bottom screen user */
+.screen.agora-screen-users-bottom.sharescreen {
+ display: flex;
+ flex-direction: column-reverse;
+}
+
+.button_accept_reject {
+ display: flex;
+ justify-content: flex-end;
+}
+
+.request-row {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+/* chat position left */
+.agora .fabs .chat.chat-bottom {
+ right: -14px;
+ bottom: -14px;
+}
+
+/* recording format */
+.agora_io_video_container:nth-child(4n + 4) {
+ padding-right: 0;
+}
+
+.agora_io_video_container {
+ flex: 0 0 25%;
+ max-width: 25%;
+ padding-right: 10px;
+ width: 100%;
+ margin-bottom: 10px;
+}
+.agora_io_video_recording_container {
+ display: flex;
+ flex-wrap: wrap;
+ max-width: 1200px !important;
+ margin: auto;
+ width: 100%;
+ /* background: green; */
+}
+.agora_io_video_container > video {
+ width: 100%;
+ height: 100%;
+}
+
+.raise-hand-requests > button {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.raise-hand-requests > button {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+.raise-hand-requests > button > i {
+ padding-right: 5px;
+}
+
+#raise-hand-requests-list{
+ max-height: 60vh;
+ overflow: scroll;
+}
\ No newline at end of file
diff --git a/public/js/agora-broadcast-client.js b/public/js/agora-broadcast-client.js
index 7a8d61bc..bff00a8f 100644
--- a/public/js/agora-broadcast-client.js
+++ b/public/js/agora-broadcast-client.js
@@ -16,8 +16,10 @@ window.localStreams = {
camera: {
camId: '',
micId: '',
- stream: {}
+ stream: {},
+ userDetails: {}
},
+ tmpCameraStream: {},
screen: {
id: "",
stream: {}
@@ -38,33 +40,44 @@ window.AGORA_BROADCAST_CLIENT = {
};
// join a channel
-function agoraJoinChannel() {
- window.AGORA_RTM_UTILS.setupRTM(window.agoraAppId, window.channelName);
+async function agoraJoinChannel() {
- window.agoraToken = window.AGORA_TOKEN_UTILS.agoraGenerateToken(); // rendered on PHP
var userId = window.userID || 0; // set to null to auto generate uid on successfull connection
-
- // set the role
- window.agoraClient.setClientRole(window.agoraCurrentRole, function() {
- AgoraRTC.Logger.info('Client role set as host.');
- }, function(e) {
- AgoraRTC.Logger.error('setClientRole failed', e);
- });
-
- window.agoraClient.join(window.agoraToken, window.channelName, userId, async function agoraClientJoin(uid) {
- await window.AGORA_RTM_UTILS.joinChannel(uid);
+ window.channel_type = 'broadcast';
+
+ if(window.pre_call_device_test_enabled){
+ let hasVideo = await detectWebcam();
+ await createTmpCameraStream(userId, hasVideo);
+ }
+ else{
+ window.AGORA_UTILS.setupAgoraListeners();
+ window.AGORA_RTM_UTILS.setupRTM(window.agoraAppId, window.channelName);
+
+ window.agoraToken = window.AGORA_TOKEN_UTILS.agoraGenerateToken(); // rendered on PHP
+ var userId = window.userID || 0; // set to null to auto generate uid on successfull connection
+
+ // set the role
+ window.agoraClient.setClientRole(window.agoraCurrentRole, function() {
+ AgoraRTC.Logger.info('Client role set as host.');
+ }, function(e) {
+ AgoraRTC.Logger.error('setClientRole failed', e);
+ });
- createCameraStream(uid, {});
- window.localStreams.uid = uid; // keep track of the stream uid
- AgoraRTC.Logger.info('User ' + uid + ' joined channel successfully');
-
- }, function(err) {
- AgoraRTC.Logger.error('[ERROR] : join channel failed', err);
- });
+ window.agoraClient.join(window.agoraToken, window.channelName, userId, async function agoraClientJoin(uid) {
+ await window.AGORA_RTM_UTILS.joinChannel(uid);
+
+ createCameraStream(uid, {});
+ window.localStreams.uid = uid; // keep track of the stream uid
+ AgoraRTC.Logger.info('User ' + uid + ' joined channel successfully');
+
+ }, function(err) {
+ AgoraRTC.Logger.error('[ERROR] : join channel failed', err);
+ });
- window.agoraClient.on('stream-published', function (evt) {
- AgoraRTC.Logger.info("Publish local stream successfully");
- });
+ window.agoraClient.on('stream-published', function (evt) {
+ AgoraRTC.Logger.info("Publish local stream successfully");
+ });
+ }
}
//camera validation
@@ -78,14 +91,29 @@ async function detectWebcam() {
// video streams for channel
async function createCameraStream(uid, deviceIds) {
+
+ window.channel_type = 'broadcast';
+
AgoraRTC.Logger.info('Creating stream with sources: ' + JSON.stringify(deviceIds));
const hasVideo = await detectWebcam()
- const localStream = AgoraRTC.createStream({
+
+ let streamSpec = {
streamID: uid,
audio: true,
video: hasVideo,
screen: false
- });
+ };
+
+ if(sessionStorage.getItem("microphoneId")!=null){
+ streamSpec.microphoneId = sessionStorage.getItem("microphoneId");
+ }
+
+ if(sessionStorage.getItem("cameraId")!=null){
+ streamSpec.cameraId = sessionStorage.getItem("cameraId");
+ }
+
+ const localStream = AgoraRTC.createStream(streamSpec);
+
localStream.setVideoProfile(window.cameraVideoProfile);
// The user has granted access to the camera and mic.
@@ -114,6 +142,7 @@ async function createCameraStream(uid, deviceIds) {
// window.AGORA_BROADCAST_UI.calculateVideoScreenSize();
AgoraRTC.Logger.info('getUserMedia successfully');
+ jQuery(".main-screen-stream-section").css('display', 'block');
localStream.play('full-screen-video'); // play the local stream on the main div
// publish local stream
@@ -129,8 +158,42 @@ async function createCameraStream(uid, deviceIds) {
window.agoraClient.publish(localStream, function (err) {
err && AgoraRTC.Logger.error('[ERROR] : publish local stream error: ' + err);
});
+
+ jQuery('body .agora-footer').css('display', 'flex');
window.localStreams.camera.stream = localStream; // keep track of the camera stream for later
+
+ /* Mute Audios and Videos Based on Mute All Users Settings */
+ if(window.mute_all_users_audio_video){
+ /* Mute if video is there and user has not unmuted their video - on Refresh (through session storage) */
+ if((localStream.getVideoTrack() && localStream.getVideoTrack().enabled) && (sessionStorage.getItem("muteVideo")!="0")){
+ jQuery("#video-btn").trigger('click');
+ }
+ /* Mute if audio is there and user has not unmuted their audio - on Refresh (through session storage) */
+ if((localStream.getAudioTrack() && localStream.getAudioTrack().enabled) && (sessionStorage.getItem("muteAudio")!="0")){
+ jQuery("#mic-btn").trigger('click');
+ }
+ } else { /* Mute Audios and Videos Based on Mute All Users Settings- Disabled */
+ /* If user has muted audio on Refresh (Check through session storage value) */
+ if(sessionStorage.getItem("muteAudio")=="1"){
+ jQuery("#mic-btn").trigger('click');
+ }
+ /* If user has muted video on Refresh (Check through session storage value) */
+ if(sessionStorage.getItem("muteVideo")=="1"){
+ jQuery("#video-btn").trigger('click');
+ }
+ }
+
+ window.AGORA_UTILS.agora_getUserAvatar(localStream.getId(), function getUserAvatar(avatarData) {
+ let userAvatar = '';
+ if (avatarData && avatarData.user && avatarData.avatar) {
+ userAvatar = avatarData.avatar
+ }
+ if(userAvatar!=''){
+ jQuery('body #no-local-video').html('')
+ }
+ window.localStreams.camera.userDetails = {avtar: userAvatar};
+ });
jQuery('#buttons-container').fadeIn();
}, function (err) {
@@ -327,4 +390,4 @@ function setupInjectStreamsListeners() {
});
}
-window.AGORA_UTILS.setupAgoraListeners();
+//window.AGORA_UTILS.setupAgoraListeners();
diff --git a/public/js/agora-communication-client.js b/public/js/agora-communication-client.js
index e3141bd8..9dcec6ce 100644
--- a/public/js/agora-communication-client.js
+++ b/public/js/agora-communication-client.js
@@ -5,7 +5,7 @@
var agoraClient = AgoraRTC.createClient({mode: 'rtc', codec: 'vp8'});
// stream references (keep track of active streams)
-window.remoteStreams = {}; // remote streams obj struct [id : stream]
+window.remoteStreams = {}; // remote streams obj struct [id : stream]
// keep track of streams
window.localStreams = {
@@ -13,8 +13,10 @@ window.localStreams = {
camera: {
camId: '',
micId: '',
- stream: {}
+ stream: {},
+ userDetails: {}
},
+ tmpCameraStream: {},
screen: {
id: "",
stream: {}
@@ -57,31 +59,40 @@ function initClientAndJoinChannel(agoraAppId, channelName) {
}
-window.AGORA_UTILS.setupAgoraListeners();
-
// join a channel
-function agoraJoinChannel(channelName, cb) {
- var token = window.AGORA_TOKEN_UTILS.agoraGenerateToken();
+async function agoraJoinChannel(channelName, cb) {
var userId = window.userID || 0; // set to null to auto generate uid on successfull connection
+ window.channel_type = 'communication';
-
- agoraClient.join(token, channelName, userId, async function(uid) {
- AgoraRTC.Logger.info("User " + uid + " join channel successfully");
- window.localStreams.camera.id = uid; // keep track of the stream uid
+ if(window.pre_call_device_test_enabled){
+ let hasVideo = await isVideoAvailable()
+ await createTmpCameraStream(userId, hasVideo);
+ } else{
+ window.AGORA_UTILS.setupAgoraListeners();
- try {
- await window.AGORA_RTM_UTILS.joinChannel(uid);
- await createCameraStream(uid);
- cb && cb(null)
- } catch(err) {
- AgoraRTC.Logger.error("[ERROR] : join channel failed", err);
- cb && cb(err)
- }
+ var token = window.AGORA_TOKEN_UTILS.agoraGenerateToken();
+ agoraClient.join(token, channelName, userId, async function(uid) {
+ AgoraRTC.Logger.info("User " + uid + " join channel successfully");
+ window.localStreams.camera.id = uid; // keep track of the stream uid
+
+ try {
+ if(!jQuery.isEmptyObject( window.localStreams.camera.stream )){
+ window.localStreams.camera.stream.stop();
+ }
+ await window.AGORA_RTM_UTILS.joinChannel(uid);
+ await createCameraStream(uid);
+ window.localStreams.uid = uid;
+ cb && cb(null)
+ } catch(err) {
+ AgoraRTC.Logger.error("[ERROR] : join channel failed", err);
+ cb && cb(err)
+ }
- }, function(err) {
- AgoraRTC.Logger.error("[ERROR] : join channel failed", err);
- cb && cb(err)
- });
+ }, function(err) {
+ AgoraRTC.Logger.error("[ERROR] : join channel failed", err);
+ cb && cb(err)
+ });
+ }
}
//camera validation
@@ -95,80 +106,156 @@ async function isVideoAvailable() {
// video streams for channel
function createCameraStream(uid, next) {
+
+ window.channel_type = 'communication';
+
async function runCameraStream(cb) {
- const hasVideo = await isVideoAvailable()
- const localStream = AgoraRTC.createStream({
- streamID: uid,
- audio: true,
- video: hasVideo,
- screen: false
- });
- localStream.setVideoProfile(window.cameraVideoProfile);
- localStream.on("accessAllowed", function() {
- if(window.devices.cameras.length === 0 && window.devices.mics.length === 0) {
- AgoraRTC.Logger.info('[DEBUG] : checking for cameras & mics');
- window.AGORA_UTILS.getCameraDevices();
- window.AGORA_UTILS.getMicDevices();
+
+ let canJoinAsHost = await window.AGORA_COMMUNICATION_UI.canJoinAsHost();
+ console.log("hlwcanJoinAsHost", canJoinAsHost)
+
+ if(canJoinAsHost){
+ const hasVideo = await isVideoAvailable()
+ let streamSpec = {
+ streamID: uid,
+ audio: true,
+ video: hasVideo,
+ screen: false
+ };
+
+ if(sessionStorage.getItem("microphoneId")!=null){
+ streamSpec.microphoneId = sessionStorage.getItem("microphoneId");
}
- AgoraRTC.Logger.info("accessAllowed");
- if(!hasVideo){
- const msg = {
- text: "USER_JOINED_WITHOUT_VIDEO**"+uid,
- messageType: "TEXT"
- }
- window.AGORA_RTM_UTILS.sendChannelMessage(msg)
+
+ if(sessionStorage.getItem("cameraId")!=null){
+ streamSpec.cameraId = sessionStorage.getItem("cameraId");
}
- });
- localStream.on("accessDenied", function() {
- // alert('denied!')
- })
+ const localStream = AgoraRTC.createStream(streamSpec);
- localStream.init(function initSuccess() {
- jQuery('#rejoin-container').hide();
- jQuery('#buttons-container').removeClass('hidden');
+ localStream.setVideoProfile(window.cameraVideoProfile);
+ localStream.on("accessAllowed", async function() {
+
+ /* To handle the case if user allows camera and microphone access at the same time */
+ let canJoinAsHost = await window.AGORA_COMMUNICATION_UI.canJoinAsHost();
+ console.log("hlwcanJoinAsHost", canJoinAsHost)
+
+ if(canJoinAsHost){
+ if(window.devices.cameras.length === 0 && window.devices.mics.length === 0) {
+ AgoraRTC.Logger.info('[DEBUG] : checking for cameras & mics');
+ window.AGORA_UTILS.getCameraDevices();
+ window.AGORA_UTILS.getMicDevices();
+ }
+ AgoraRTC.Logger.info("accessAllowed");
+ if(!hasVideo){
+ const msg = {
+ text: "USER_JOINED_WITHOUT_VIDEO**"+uid,
+ messageType: "TEXT"
+ }
+ window.AGORA_RTM_UTILS.sendChannelMessage(msg)
+ }
+ } else {
+ window.AGORA_COMMUNICATION_UI.joinAsAudience();
+ }
+ });
- var thisBtn = jQuery('#rejoin-btn');
- thisBtn.prop("disabled", false);
- thisBtn.find('.spinner-border').hide();
+ localStream.on("accessDenied", function() {
+ // alert('denied!')
+ })
- AgoraRTC.Logger.info("getUserMedia successfully");
- try {
- localStream.play('local-video'); // play the given stream within the local-video div
- // publish local stream
- agoraClient.publish(localStream, function (err) {
- AgoraRTC.Logger.error("[ERROR] : publish local stream error: " + err);
- });
-
- window.AGORA_COMMUNICATION_UI.enableUiControls(localStream); // move after testing
- window.localStreams.camera.stream = localStream; // keep track of the camera stream for later
+ localStream.init(async function initSuccess() {
+ jQuery('#rejoin-container').hide();
+ jQuery('#buttons-container').removeClass('hidden');
- cb && cb(null)
- } catch(ex) {
- // TODO: Show this error somewhere
- AgoraRTC.Logger.error('Stream error...', ex);
- agoraLeaveChannel();
- alert("Your video cannot be started!")
- cb && cb(ex)
- }
- }, function initError(err) {
- AgoraRTC.Logger.error("[ERROR] : getUserMedia failed", err);
+ var thisBtn = jQuery('#rejoin-btn');
+ thisBtn.prop("disabled", false);
+ thisBtn.find('.spinner-border').hide();
- if (err.msg==='NotAllowedError') {
+ AgoraRTC.Logger.info("getUserMedia successfully");
- const msg = {
- text: "USER_JOINED_WITHOUT_PERMISSIONS**"+uid,
- messageType:"TEXT"
- }
- window.AGORA_RTM_UTILS.sendChannelMessage(msg)
+ try {
+ jQuery(".main-screen-stream-section").css('display', 'block');
+
+ localStream.play('local-video'); // play the given stream within the local-video div
+
+ // publish local stream
+ window.agoraClient.publish(localStream, function (err) {
+ AgoraRTC.Logger.error("[ERROR] : publish local stream error: " + err);
+ });
+
+ showRaiseHandInCommunication();
+
+ window.AGORA_COMMUNICATION_UI.enableUiControls(localStream); // move after testing
+
+ jQuery('body .agora-footer').css('display', 'flex');
+
+ window.localStreams.camera.stream = localStream; // keep track of the camera stream for later
+
+ /* Mute Audios and Videos Based on Mute All Users Settings- Enabled */
+ if(window.mute_all_users_audio_video){
+ /* Mute if video is there and user has not unmuted their video - on Refresh (through session storage) */
+ if((localStream.getVideoTrack() && localStream.getVideoTrack().enabled) && (sessionStorage.getItem("muteVideo")!="0")){
+ jQuery("#video-btn").trigger('click');
+ }
+ /* Mute if audio is there and user has not unmuted their audio - on Refresh (through session storage) */
+ if((localStream.getAudioTrack() && localStream.getAudioTrack().enabled) && (sessionStorage.getItem("muteAudio")!="0")){
+ jQuery("#mic-btn").trigger('click');
+ }
+ }
+ else { /* Mute Audios and Videos Based on Mute All Users Settings- Disabled */
+ /* If user has muted audio on Refresh (Check through session storage value) */
+ if(sessionStorage.getItem("muteAudio")=="1"){
+ jQuery("#mic-btn").trigger('click');
+ }
+ /* If user has muted video on Refresh (Check through session storage value) */
+ if(sessionStorage.getItem("muteVideo")=="1"){
+ jQuery("#video-btn").trigger('click');
+ }
+ }
- window.AGORA_COMMUNICATION_UI.enableExit()
- window.AGORA_UTILS.showPermissionsModal()
- } else {
- cb && cb(err)
- }
+ // window.AGORA_COMMUNICATION_UI.enableUiControls(localStream); // move after testing
+ window.localStreams.camera.stream = localStream; // keep track of the camera stream for later
- });
+ window.AGORA_UTILS.agora_getUserAvatar(localStream.getId(), function getUserAvatar(avatarData) {
+ let userAvatar = '';
+ if (avatarData && avatarData.user && avatarData.avatar) {
+ userAvatar = avatarData.avatar
+ }
+ if(userAvatar!=''){
+ jQuery('body #no-local-video').html('')
+ }
+ window.localStreams.camera.userDetails = {avtar: userAvatar};
+ });
+
+ cb && cb(null)
+ } catch(ex) {
+ // TODO: Show this error somewhere
+ AgoraRTC.Logger.error('Stream error...', ex);
+ agoraLeaveChannel();
+ alert("Your video cannot be started!")
+ cb && cb(ex)
+ }
+ }, function initError(err) {
+ AgoraRTC.Logger.error("[ERROR] : getUserMedia failed", err);
+
+ if (err.msg==='NotAllowedError') {
+
+ const msg = {
+ text: "USER_JOINED_WITHOUT_PERMISSIONS**"+uid,
+ messageType:"TEXT"
+ }
+ window.AGORA_RTM_UTILS.sendChannelMessage(msg)
+
+ window.AGORA_COMMUNICATION_UI.enableExit()
+ window.AGORA_UTILS.showPermissionsModal()
+ } else {
+ cb && cb(err)
+ }
+
+ });
+ } else {
+ window.AGORA_COMMUNICATION_UI.joinAsAudience();
+ }
}
if (next) {
diff --git a/public/js/agora-rtm.js b/public/js/agora-rtm.js
index 6d2da9c0..5dd454fc 100644
--- a/public/js/agora-rtm.js
+++ b/public/js/agora-rtm.js
@@ -12,11 +12,11 @@ window.AGORA_RTM_UTILS = {
});
// event listener for receiving a peer-to-peer message.
- window.rtmClient.on('MessageFromPeer', (evt, peerId) => {
+ window.rtmClient.on('MessageFromPeer', (evt, senderId) => {
// console.log('Received RTM from peer:', evt)
const { text } = evt;
- // text: text of the received message; peerId: User ID of the sender.
- AgoraRTC.Logger.info('AgoraRTM peer msg from user ' + peerId + ' received: \n' + text);
+ // text: text of the received message; senderId: User ID of the sender.
+ AgoraRTC.Logger.info('AgoraRTM peer msg from user ' + senderId + ' received: \n' + text);
const processed = processRtmRequest(text);
if (!processed) {
const msgEvent = {detail:{senderId, text}};
@@ -54,6 +54,9 @@ window.AGORA_RTM_UTILS = {
})
window.rtmChannel.on('MemberLeft', memberId => {
+ if(window.isAdminUser){ //If current user is admin user and the peer leaves then update the raise hand requests object
+ removeRaiseHandReqContent(memberId);
+ }
updateUsersCount()
})
@@ -191,16 +194,19 @@ function processRtmRequest(value) {
// in case the screen stream is already shown in the layout, it's needed to udpate the layout:
if (window.remoteStreams[uid]) {
- // first remove the current screen stream from the normal users layout
- const screenStream = window.remoteStreams[uid];
- window.AGORA_UTILS.deleteRemoteStream(uid);
- screenStream.stop();
-
- const usersCount = Object.keys(window.remoteStreams).length + 1
- window.AGORA_UTILS.updateUsersCounter(usersCount);
-
- window.AGORA_SCREENSHARE_UTILS.addRemoteScreenshare(screenStream);
- window.screenshareClients[uid] = screenStream;
+ /*Add Streams to large view if there is no stream that is pinned in large screen */
+ if(window.pinnedUser==''){
+ // first remove the current screen stream from the normal users layout
+ const screenStream = window.remoteStreams[uid].stream;
+ window.AGORA_UTILS.deleteRemoteStream(uid);
+ screenStream.stop();
+
+ const usersCount = Object.keys(window.remoteStreams).length + 1
+ window.AGORA_UTILS.updateUsersCounter(usersCount);
+
+ window.AGORA_SCREENSHARE_UTILS.addRemoteScreenshare(screenStream);
+ window.screenshareClients[uid] = screenStream;
+ }
}
return true;
diff --git a/public/js/agora-stream-audioErr.js b/public/js/agora-stream-audioErr.js
new file mode 100644
index 00000000..41be7dcb
--- /dev/null
+++ b/public/js/agora-stream-audioErr.js
@@ -0,0 +1,14 @@
+function addAudioErrorGesture(streamID){
+ return 'Click to unmute ';
+}
+
+function resumeStream(e, streamID){
+ e.stopPropagation();
+ let index = Object.keys(window.remoteStreams).find(key => window.remoteStreams[key].stream.getId() === streamID);
+ window.remoteStreams[index].stream.resume().then(() => {
+ console.log("clickable", streamID);
+ handleGhostMode(streamID, 'remote');
+ handleMutedVideoBackgroundColor(streamID, 'remote');
+ jQuery("body #clickable_"+streamID).remove();
+ }).catch(console.warn);
+}
\ No newline at end of file
diff --git a/public/js/agora/AgoraRTCSDK-3.5.2.js b/public/js/agora/AgoraRTCSDK-3.5.2.js
new file mode 100644
index 00000000..87509ad2
--- /dev/null
+++ b/public/js/agora/AgoraRTCSDK-3.5.2.js
@@ -0,0 +1,14 @@
+/*! AgoraRTC|BUILD v3.5.2-0-g0d49ed1 */
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("AgoraRTC",[],t):"object"==typeof exports?exports.AgoraRTC=t():e.AgoraRTC=t()}(window,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=92)}([function(e,t,n){"use strict";n.r(t);var r,i=n(11),o=n.n(i),a=function(){var e=new Date;return e.toTimeString().split(" ")[0]+":"+e.getMilliseconds()},s=n(14),c=n(3),d=n(1),u=n(45),l=n.n(u),p=n(46),f=n.n(p),g=new Array(32).fill(void 0);function m(e){return g[e]}g.push(void 0,null,!0,!1);var h=g.length;function v(e){var t=m(e);return function(e){e<36||(g[e]=h,h=e)}(e),t}var E=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});E.decode();var S=null;function _(){return null!==S&&S.buffer===r.memory.buffer||(S=new Uint8Array(r.memory.buffer)),S}function y(e,t){return E.decode(_().subarray(e,e+t))}function R(e){h===g.length&&g.push(g.length+1);var t=h;return h=g[t],g[t]=e,t}var T=0,I=new TextEncoder("utf-8"),b="function"==typeof I.encodeInto?function(e,t){return I.encodeInto(e,t)}:function(e,t){var n=I.encode(e);return t.set(n),{read:e.length,written:n.length}};var A=null;function O(){return null!==A&&A.buffer===r.memory.buffer||(A=new Int32Array(r.memory.buffer)),A}var C=function(){function e(){l()(this,e)}return f()(e,[{key:"free",value:function(){var e=this.ptr;this.ptr=0,r.__wbg_signmanager_free(e)}},{key:"get_digest",value:function(e){return v(r.signmanager_get_digest(this.ptr,R(e)))}}],[{key:"__wrap",value:function(t){var n=Object.create(e.prototype);return n.ptr=t,n}},{key:"new",value:function(){var t=r.signmanager_new();return e.__wrap(t)}}]),e}(),N=!1,w=null;var L,D=0,k="free",M=[],P=[],U=0;(w?Promise.resolve(w):new Promise((function(e){N||r||function e(){var t={wbg:{}};t.wbg.__wbindgen_object_drop_ref=function(e){v(e)},t.wbg.__wbindgen_string_new=function(e,t){return R(y(e,t))},t.wbg.__wbindgen_string_get=function(e,t){var n=m(t),i="string"==typeof n?n:void 0,o=null==i?0:function(e,t,n){if(void 0===n){var r=I.encode(e),i=t(r.length);return _().subarray(i,i+r.length).set(r),T=r.length,i}for(var o=e.length,a=(i=t(o),_()),s=0;s127)break;a[i+s]=c}if(s!==o){0!==s&&(e=e.slice(s)),i=n(i,o,o=s+3*e.length);var d=_().subarray(i+s,i+o);s+=b(e,d).written}return T=s,i}(i,r.__wbindgen_malloc,r.__wbindgen_realloc),a=T;O()[e/4+1]=a,O()[e/4+0]=o},t.wbg.__wbindgen_throw=function(e,t){throw new Error(y(e,t))};for(var n=Uint8Array.from(atob("55ZBgM/2Bzm2JGhNn//ljJsSorhWUYE66a1Hf8O7pfQGR2zfol8qRP6CDhsi3iG7nFZu9stSyPq/qu2Rr2w8QkTGP6Gm2cg3J5qsQgq5bcHA9mDpGv/b24uEwsixZVl1eGkdV4SB/6ayw2v48hLmNA+w5UlnTCiWwerzESQPidpSUMbamXL3pU815EQm12GhhZ9aWzo568gdZvXevBc/WHfFKQSuTgWva4e4eSmW7UxpH8sY4HlDsCTMu0WwEB8B95XsZwOp3GLgfOQmJBw036DgIKU+XGn4KpIEq77WE/h6R7sZKsFUp+u+2cDnW7IPNe7xfd9areFo0EUh0/9K9CqxUkLqMB5hlgS1fwQHRzKPhQ7gALyc6HwMCPooS0M1NrzjdfH3vUn0PeQ1GBlnrnXgiu8TunfHg5TcbBfPEbxbyiiow1Np+VEBlHNh00PiAWyu024NHaPbDGfMtzu4WF02fgkh8Pxb7bCSpCZndjTytQgAzfZxk2bbe6NoHHFnsviqYzHVpxoPEk7icHRWcZC28d2muthq673KCMQay1fJcPqSTuYhWUZS5eylIguT33lP+TBbOWQI8KtCzBN5FzqILfKzRkzrJ3L192BUF8SILdwmriv10HU9ZlQAyQA1VdegnzOl/dYk2GGsB3724y7w/7aJLHJzEfwrfIzFd5CoAft7ct+zQW2G4Wm2kpoz6uJfgrNyykQgwCO6pkPy1ADrBUuJon9ySjhgcFru6AKa99wTlIhzBw3FKFt9Aa1/1KWWy7W1wAIGzRTs/7rLXRkKFjNqGVXBdoVNTpHFtfEFsuX0X98ISr0Bennlx0h2Yl/CGNb5Kc7i3bio1XJHX24avcMsEAwfdfskCki4/dkStn7QC97YJC3z+7gD84IiEEeGcnn7gHJyeALr0ssbqDUcKqxEyheyFs9FToJziLB+eYw6nMQLmYTrQyrg3b+3YBdgx7pzNEDSyz3tmaPaikwcLSyB/Igo6U/oP/fS2TZLtmN03m4iS76YrDJAgI+2W1GboabuixVcLdxm6SQ4CzUnHSPl1knhcGhW/+OcKa53tB5j5C4wEpiENv6T9PUu4K0YwtEAqFbd/eN2wVAYCKn/nlVA8uiESxCfgs0411mRFk4i1pixJLPP5AFPG9QFZnj6X19TqmhmIhl8D6Q1rOvPCqPZV/z04HjayX4qPzPzP/5NVilN/sHhQe7ulriGmU/3rj5QEuiOymsL7EdCQMc/4mXDPdVrDBfbt6dnv11oLYGmqOP1oSBj02FtsmYrMn9pRg7HJoCh86jAnzuOYn4tGnQ4gw/89sb64NAXcoIbTIjyiHBAQCCK2Yn4I/fNF10rkQlvSvkpqLG2eYpJmpWrcouNDEUtJFR607oNraLdmUKyLc1g7SNpS+ofp1FL6rua/HFSrb5kTF2Vcy2gl+6MACbFRChKoP/un7IbYJuOima/JWFZcs/MXokIx+ijuqjMtVKaYRTzNI5ncPa2y/EXTNdUUFpMhbE7sa39Uoh6Hci/viXy2KFTNbiw+BkWOPnyOr04LjIYKlJ8ud/KvjuvNUGQOHJvj6tpZJxj97tr0OrgZCAxSHGU5JQfqEd/U0QfzGM8Wh3zdsnd9LhoIIRJAtyA2PmjwJk4zTxeYlgwPqAVTU3+9bA1QD+jLZZ3Ffk3MRq+Ar2RT8YN6ASR4bItt3omBj0LJe0zeGY3OzfhljL6LA1m4+IUp+CzeWo0aEjnvRk3iCJeajgdC+NUGB5qh8PWKtBeC58woavnRjvRNphXS4b9M7Aymcfq26B2YY2lS+wLf763OnGJlVdV/srgyAUJJZjarxom4zrYy23kLFB8zFzWuwSMue5Xm1YWape91JGDuRLIctrJWU47/XfLm6Zgei4xOwq1RcjikGuaZtDwcFg9aKtO+JOGJsCjy9AiPnmt+rmdX83GsT3KtTETnLv6ZQcnGtmt4H8AjFgGYePdQc40cj8VAOV8NCLspyW5w63b3g37GXJrzjm9Fym3fh27psjo5RuTs7XCSrNENxKm9jCcXPqWxyuXJSn6dhdWnw5SAnUjixXviWS4HsnYjw4Xt4cSwkqCB9naLstVXt5D2HgG4fzHFNHvnETft0mrhU81IBDTSyNFdDvFEX8cifoc6FcNq7pzXlotl2ZS1FIzNXddZrdXpBNYZPV52gtCok6ePpUR/Y8jyJpE9P3q8dmFVivVGgmKTcBKMDDbzeOfl4MpOGBtBX/Lab/kzqG42sTyOyGUyOoFXYGMUWJ33GPI2KNa/mW8zVl+imshfbj7PiK1qRUn74KjAkH4wjKnu50AONYUaiveSdwnEc1zCjZSJ3dmBKSxhWAcO2PdHBg5m9+JCiPGCVfK9dzoM8Bm7xx9noJiqt4hNiVa5di1Fd1JRN4rnd1DbKglKpAVSoqvJPxmuyH56TFE4BQjhfKbDMZezQJqx+KXDiW1JWGeDYaPVBWPYeZX6STIzC/DjS7UFlqoKgGGAGP17x8wmMRE6O/axG5jDzloCGxCmrymT0ZGCh4g54O1iDYUtmJr7Bo1d+H9RQj2Y10BxcMkLFTIZVjm9e3vtIbeRx0OdXE1Ou37J/WeJZyPXn1fszvp/KonCqVnt862LrxfoB/0sF5gk4Y/f6LVneU5hun9/V1OVre9XrnDBhcVaQa9Ye6gs8sHW9HCNchaFbkUpxSiyxVEFZIlbejbjSPFlkYOLhtQHduwZWRHWA9akqykJNG3PKvOZAaJG5nWQq8+e4K0JF/AXTKIIr4J7zDt8ZR4xb9T2gxjl1nfqzidMRIY5B4rkw0oetta+j8rqkFpTEGA+hU/tw7bDtpkPYvCguwncnCjwULNFT9I9jXx3H4Ws3WWMCit29F7kGq2Ka+rU/MjnuP0lsXkoB1rr8LawHH5gaf8rajq/BhKrGTIfjDiZG5qz+L7SZBZsMSZZ9pM1QhKju+GTD9iC+9HlhfXMtj94gz8U4h7eGXziEO7lo7LwLL6/DVMrGbkv68JYUYhGz2yBm/8cbQEh5vhakbhmpv1K6XYM9rzdsd9bwYcYt3cfKE3m+/NrUa42+RpJBdFg7cAmxsZ7/0TMyVw6Aqu2gzldb2ag4iLrPNEyW1ywaJ2DXMgPi/sjnDzhuo+vIUrc86j4ZLhT4GAN6uqwbnXq5UDzX7TfuB48oMvvE1sK5q6owkdWfklgnC6pSBpK7wl+e3kuvaYnGRGJJMBQuVgWL1awHrVtfOTsSE1vc0ZdG+a/Jbza6pHbyfi5L7FXJAGdQTk0EP3VT54+F7RZ/MJ9fj56aMxzhJRwQJ6df3cM26qSc5bW/zP3PFXypTOBwzCvVtwGQzkGvDW7XGwgLbTNHDpQXOd2BQ5Zd9bjQqGg+S+kIqWZVZCqVLfyFPF9bEOHfPepL6nRDJUD2l5uRnXqeTvidaSIoqS1Fbc6mLPtYnbp6uuts6Qo8TbMzFuI7NuaPuKnQIyVu7vUGJ8jg1uVOjlMNKdVtLPr9/ZEKVZVj7lsFA+nm3zRjjr1DRKhr/wY1CI1iXKVTeQZ0i2PSnN99j4iVTSwNAYQLWWD+KyZ/xRLVxmZQPuSkLeKBRAkavxjWnIFQb1dn72wMSUdcB9cNCNJNdyTkrl44MRR+pUuiVrTAnTlzL33X32eEYwT+vn564yxFJLUDyIMNjJ0nx+GreKSOglI2et0kAwRHKYFclH9GVTiVlB0TWeUJGD+7JYogF7BizjTGyPOUEWQCguIEmtC4fHD5461T80Z3Mp7rhNTI+Cswuknr9hrIZmpRyFSrSrP8R4S1Cf34Tu4RNrDxpofVK9nGTklZPsYM6eiP29Lx264fsX9oLdYhq7vCwcrRMJ1a5d0QHXUYRV5IqTFBoUSpxkQ6IHHL8ckM4NCzwk8K0CA3pj5Jp2a9wZjfKq7R/eukzQFuhMxV2qgHf2E3t7/SA8N7sMvsmF0p3J96QRE3rA85ekH1q8nrBVujlIqahmL0Qto3+JxdqAfnKMCblQGSKVWZgWLMm82MG/9pjhdkMzG7C2GRLGMty2y8NhX1pZWHNbLOmvaC424LNz/Nl5tkPv7fVbCT2ItB+/dx3ZhVhmgSLd1zL+2PsNFmj7VGBruTttezlo1mDKErjY27nTswjf2fY/Uq8lPcVAgRpJM+m7jS/8dk8cdl7fkY7Tuj4TfiSe0tiNSoJgZwom4+9haoBQ65AifaB7pUiTc0MAXCvG+nDydkRIbKx5fL6gAlyMAnBbQf+Qh1naLfzzwLVTP0EEyoenW2W1zKqfMql5rwGlyCB9mSa2s25yHf4SDSBlgEVMJtplpRgegZvDakpWDKgx3UR4W7yKW+RD7bd7rEa/GQmA/q0RYAOIaXfO/2CgEUPtNhPS2uqy29lBYFPPv5SHQ0t/jRxQLBpe09ateAWKypt9TWS7Z5gynOePS5M2NC16AhF0Xz6s7DUjtI0xNho9Y6GK16J5V8HqHypV/OAz7+VBzTaiR57XGH4r62GoAiJqfWOM7okzKCeeSBnOIKPHtwgM0SQbvCvv7rmS6ZAacu4BbXZ5R9gOhdR9H3bi7lWLBNnqqLPIy0k6m4XBhtl40B6z/5AcJxjtKfwvIExl7VsQRqbW8gpPMsmJZfSp3uC35g1AkP+BJlju3RVoFZNo3JR18A5uc60NGD4zvzIdGTAOth4ZAZx0ZGQItHuNcLz/0CiavJdkjD65h4avf1vf7LFZ1uogJz6vLK3uDisXIBIGkXOlIpxTdjjjTQt6Khy50bYbXsG9JBrSUGhsBWpeRUnq2cZWOifhfueY95gFIDAu37oKR3FQ1YxGMg3UMq+L2VN2rtqodelSHof8SyYZVQWs7L0bjtgolId1tAAjHI7J1/+JIRXeUBjjaGGQAU+az9XFfiqn+VRAGG8JDdP/WmEqjhYpcy00LIBIBzCF9I9mbXCv8IX9fhPlI5NqWGO/v0ikpfn+hb5U16FcPYsx+xLb4la6nSbvrTDP5MthPyeLIIY7ZE/rNU4ajgPmI0/3RvD7WtEbo8UGPjnev55N2ELuFpEPzkNu9MzXqq8K0cWxk4lT2DQPi3rDO8x8i5jX7wWQi8e0neCMb0SUO67zRfaekZONGfaFl47LByciUuy5dhqxMPokhTE2WbzxqCyt/s2TqG66R0ocYHmzv9f7tJ+TES8NFyzL3fhNoZoW5IxWNE+stYWutd3LPwa7HKhhRAbl5uCEbEGjrUzTXwbzG0qvpmNtpnYnmKjzTaSAFNCxfw9edcjaxCiRKKIDd6GS/eDsGBgTvJexDfwGmVWm9jadZhee9jRFiZFtL6m7sY1oQa8F9ycxSuPANXCqWkApcaEfQLkt1yyfeRs5yC5O/6XGJ4TEtJmCTPJFRr95au20STIPgkoEF1mzZ+5ZRtWKUYuWJVZDwcA/lTy6oYp0/d0LGPRUXnXRm0qtIXQVdnoVhKZPeWACt9rujRL57MEDi2kHtfV/ucu+k03bN0fQlbalUJ0faY99GC6L8MO8MXTSmqDAxNSpqpIFPhgHgAg0YK/GZhlQjbQXE4tMDEDO9obNfp4W6m8fdznMesSSRINBG5FDf//DkT9pSRQsIdSg4VK7W7j2d2jsQUIyjJmbd/2zCTaqh0Yq0cH6mS/5g/cq3eGOiJbaCNo6oVwGURzXVAeVaGIfJFhd2A59sVp+rVfe1f8B6bVbCLIKgGUgpUokO0vTg6ouAxXGQKtveMhhBT83ukPIRZ02+qF1kvM+nNCVy8uzrB0+W9QIKbMio2m/7zW78xd5Tf9itocpLbRuNC5cuS/GyRGXw6fzFzjM1UITlQ5dlvoyYxuvb7ol4S1MyhkfMNZbif6/xic0wB3uSScez3oFTRbCHBd0cbJL3cLwfQjCBpGBrRVC7174qW4XWnw0eYGSSzTVSEDOlMaTUIGJO+s7/z8JxaZprcEsoB4+vt9/+uwtM/iyqLVPidu8ZTh+F1rsEWKwZhDAg/giVc6VzRq+DJCrhn81b/LYlLJOdgoAjID2VnwgU+mQhCL6KhgIqqiVraD25UIYEqxMcZ1aRcZvHa8x5gh5onPtsVcl53Xek9BOYqkyj64acX921zwqoY0lmNA81NE7BzVts3cwWDZ4Dk6uuzwtfJuJc7vVS+fdVDEg3ATwC9oG5/Vb1swTyzTsl2V4m+93bSQo5STFG5AruTDWTym6Lxtt4OrAeIVgdoyTJL+keHiHTNiL0/nO5oYwftSQK1aYBuA0e12t/FVN+LsCk0L/hfCCcke89LuP4d46qnFo3NLpHb+NFrvekXVT4GiZgMW2H0orIY0TpS15wlxVUaGCUo7YSN0yWDRU5+p41dCOs5/vXq1do7K+Byjj35/mPlQ+VEDqqF7OIBQrXfHgCXYPy8ye3Ih3io+tYA6nK0/2clIERrpA0AMHKLTGEO7q/IzIcOCwYN9W/ISH4v4uk9MhzNu7Fg2IPCq5CQF1GLuzQu+wNv2h94NIA2UJydawv5X2bHkZjv+kB/WQCYjxUNEU8ssUdxDZstpv2qNAHmI6BMD84olxMiwFdK5J80zc9x7de/cz3ZNIkkGIpMCZJqKKkaLVo1MLnR/h/hQeUvfqJmvkPeIre3EjnliNkKJKL0KNaupHzY7Eoztaj0cNOhJ5dxIRB2is3kLcSK1FZswRJR0B5OXX+Q4UlFIrhR10lIge3Fg5DnaGoZoOyFaaHztrdF251JubDsCZRDSWA0y6ysykO+h4jhXtuWF7D5Wp7B4Hx3EQvKsmPPZYcLevowjlWghHbRBEhwPI3bzjhNWXlqtym5ObYAeYxuHyvyYue2X4651f7Om3+m8KT7Y/JqLWXwgayCdzxHuJidti1ITuf/oXzeCfTRbG5ytXlDk/epX061W6BO074jI7nV518OkYtRJDnPqdDFAf0uWcATfk0h17+gP7GHjy0Rc0Ive9XmvA6gCkoMjNjMEA7GQ3xy7e12DzfNpIfND7GKKojMifTrvkDXrfa3o4wNYktY6/VlBdHtrcH9F7uMWICej/BjZXVX83WFGcVHx3nOXxSL59kE9bSmHc3Xp8iDbPuSG5GIRp3fTFHnmTzzGedl6al2gUbGFKtkC0jFNtKTk2rr8LEObiGgfCoSpTWknvAYDQBoj93s0KiRNPOqgY++Xka2cQiDwqUsLl8/i57YC/V6sy5/NvhViRRZgCzcyjNHGzZsYA5YMtUntyfC1gNFP7cL3AwVA+326NJI7MQJoxTqcHL/YhntsnYTR5R6GVVvFYIlW8Nv9qn3daoGXMz0MoAsXpCzbiHZ0XWkfw2qlJkmZjgQtMAEhHXNgokGRPfOprmtlvNZaNlGB1EjQTVX1Y4tCyJFZhdhID4CowB23uQF16NifyxH+DGnQrnxeklnG7UQV2BRVdr6ZEKZYv7Gj+PbpojzAskvbdtaFsataqPrLDoejjc6ZfPA5zA0iYcCvcNjzuy9SuT0uG8NWMTLv2OsImL++PQV1sifUENAwi4O3yBvzTy4J77B7mMBpjCYGXAyjFGFZL4eAazSmvZ8thJ0FFW+keLHL+ft1dQBKmXY6JatelGebcIC/PyLBHdfX9bRcauGg4xEO7mMl8AjlcPMczkPniNQpiQFqcDJYrFGoxMV2hskxMn0bRQT8Ajc6w6sQYkGl0CQUImPrGfie9dsk4mrCLMIFOqcm0WT8O8AiREEGmooBTO7WI0qk506NsV7ffvc0rVJERJKcyRyCmFZdTSn/SrBfjV7SXT3pQlgluoY4FBUCDDkzwBgjkrE1oFUA3ls+xVP10w5jjBIMwKBSQqRVAEDXw+Dyj+jH3ila8czULWsCKhWd4qGsMFN7++OGBAz9eXHjAO9m++mTXF6qiyG35Q+61yjYQKsBrjR4NNexrwVGqBwAZA6cr5mp8AhoyzPomJ6TLfWEJjEeRI3QsX5oQkNuyF7u650QFka+VjFeNRY6ALklleTW9I0v4ABKDCXTGkjv80vqVNk+FTL0bJK7ndSjjMJD7OBFIEywBPJFrxTdyzocmxEgG0zu1VDgsQuXITYCx1RRty89A/F+CdSAlbMlIkptCC0GrF/jFS8PAU+6TNV1eBqJrCr9BgH1mth8FtdfE7druR+xyZKn5idfUKzGW6ACGF4M61IRoSs9o6xmaj3dnAVQvFWUsMcR6MI3xTKJNyMxkhXhhvT0IxialnG7i/BBzXfMXYh5jl4BXzCSNlxU4+aboEgIDr48/+pfj8J3WcNccFfzV6eiX05qkNktmafoBcxrEsrM8WQV0VVSRybQyXPOqJ1yndwBI6BOGO9oGxGDAd+HcKaZlptCMJsR1Cp3m7F9HpBFSu/NYVj+WSDY7jWSFBlTBSCFyyPEUn8S9NmBVa+mwGVsz0Q+fxe23w1w6wVO7sVnZqRpmXJeXg72QFkl7Qda1lBzn/FW+rRwLvFxCsuad67Wmzab1RJdzPGsuq8AzW6tL+JiwW/VPUSBbBmV1+EjqQ28x1u9W5Eoy7zhsU8NT87CtNbZ0lPEpsoWMewxC80kPanfWPrQXmixWDXXz7uf1kBTr1J/iYuls7fUsyAChXjKcKOaCF4ySqkhMTGmjNqYiG5joBUi/SZpWvgxk28pyIPhf28YULINiqmbWPBKuTCLFruV7JfRgGM87XfNEFc7tgnYx503k/0UXJfpmjx6wKbKcvV5fqrctx+OrIn++TxRxSKlTScEIwd2vG5mg/p5wsQDpiD+X91XbkReKLB25Jvp/IJaJh715RXqBzwCwlY3URonyy+oZoTD8Ym8XMMv/dMllh0LCFZkZFn2gYcLG9iO+I5S/GyxwjajQLQtwH7o+n50vimC+ES8ePOpPDwlu4oG8KhS7NL/OTdIWPIHbSa6/9DfjOq9W66EpaK57R78PpEzVNLkTP2L6lllqDT6SDhIDIvQS3SQbxG96khXgvW/rME+tiXFXi+BC0udi9keyGlc3sLBN3CP3QXzswhBGTxvz2LmRMkU3rLuSkYR1Gzr7vj1VxTN1y1iciA0DswsPZ38eB6X10Uzk6HZqjzBK+EJ5osJJJ/s3b0MFRIWYlM15TPm1uzeOk1zQ96quClQLEZbpxmV/eAduIotXUYQZjWAkTulBJt7kw9uEnLo7OpZrf8k+0ZQP0agcOTLbfrekHji86Mxr7rTwve82mePKoAkkEthE45VI+f1VqpyWNW1kbBbVVfuatKt6MEKqyTUyxSFGHk81kY7CxkgMNexiikN0+IeiUNsfuktjfOAiMfDhbTe4rtxSEPvO4CCUGaktA58TGnSO8rHdCicmGkNrwWsnXgUWjhp8bllNcnQN10TbwxYPAwQKW/JJiYQadr4THXO+vWudiq3I47vqmEM/Ab3Dlq11Q7RmRWntYOEyESbTI8PZYwbtsmjcSwBtTAIHQ5h3I633h3FpOkT2c0PlMjzj0Q/OuqaTVt639fowVppqvSlNcK5KupBnrxfKHQK+SoKSuaO8PNMkYkbcEAc9F0I4uzPfRVP/q5QkvJVsVoJ8BEWW/q1+kivHEMQfb+J2NfJjSTG+WhjHjL8eqi7FgfVewxwmqG9IOnTkwDjAHUaJMIyhVkadW/+GQjLyNP4zyHcLAdWcB5zQ2kc/blAx2RKfG+ON3RfC+iQ5Th7V2i5abkoy0pjfyOwTjIvaq9slSCtoNGBZggBDOiWwau0CX4NAIThFyqu9VWCLr8TsqhQZvQP+xrywovGs6A079U7YBjhEXyQw4Q3rbQY1EQnxTPXNlHfn9vQnuhsJnzx6PZrCqry8fidPz2U1scmAMVPHxa/injIf+hDziEU02xWm9ou67OgebktON9V6wwVotoNOzVNJhiDBlHbktBwOjX1BlJHybLox5y/7NhR7uc8f85O6xdxueabhwtJjYcBzac56v6RbuI9IRvPzOnNbltj8Hh0ftwwhWyHAyiEat0oDSEVZ925jmxJKAqTo4/uHnkozgMDsnkzXPXBDJ1sDTawXy23mXuTJOYV6ZVWrervMaGGGQpgQjAnfP7KPZro+OKt/MpnoM0NeGQgIFAiH7dU7Nl1QbcMiwO6/5nIosJtrFB8w1kpqb6OjI9BgZHG1nzTMGA++HNrl4WQNcq3SajD4C9utQYAu/fETPFMMJeCDwHRCnPuRAlqJ5t0E5h3Wlh1Nw57LQ36kDjC3lS9w0a89eI8ym6BzEA25Cdz3LQAyz94Fvjqp7MyHrpm3PzmsV/tbSLF9NJBjFmzWPQ8Tfgvj3fi8dg78tXvEatqtUhLxsNp2VCU6IzSqafxWw93+Wk47skJv5qxM+tv7CrpYKvWLEylJNEXlh7GHm9UenNf2/szZOl+54P4ZWksh1r6+rphL68QYhmqW7DqKVrc2rjzPYcvFDmKtCGL/F62i3riMV9z+LoLnuVaMn4dtpNNFmQEQ4uEhDfLYU4x8G2OHCz7gnxLCa4zE4CFo9m/+ECmdzziVumHM/P00/BESH2rxUYMBL8/9NRG5fiskFJr4AO0qNUKUCgTRgEiFsTbGXtP4DTTzc8ZAmfNJuJQE5Kp7W7U7QZnBXKepfSHkYTEqgOhqo95Jw9i56kYGt4BWwX50mC27CCW92SVMl4tbUEhBDSB36zgztz5Zts0563Kjc34B+6ZUnMIk+BiQNvqSkZHnk3rHNSaYthO72IWLIxij0hcv7n228yc82FsQLK9jmptjY6estDfH3OSMaAj+poCLKwRFXvXWb6jwM9mG4nu1yug0Cc4L89w4EYek6dnV17VBfIxB2dmFFQdp0kqx3BM9gdMAr0KS7WLOSf3cn5eDItDLP2UW7MWaIR+GJ0EGcEL3ejBdu0to6vDh04JcRMNU55usmSn3jp74myzWE3azMIT96wr39F62c3G/ldGskbqTIMTk3gMg61vNBQ0cJSIxVdcgNb3xFDowwVyIqYz54F8Rqg0uQE4FIiUGZxJhND/AWhkukqIqLLZEpxj07kPBN6Zb2pWht/X5JrC8yJzPlvFhfJndQ4jcgjFyhvymr/a17uxTKHpKNWDEoL4nNa9/Prf7TYRw6Gyo6vcwYcUHk17SMb9aEdVnx24msNCDEKbj0OVzRaA3gFJeXZPObqJKvWqFlavGpxXnP+4ZYTl0Dmcri6vMdwX687ApG+ygiGHZDwNzU68F4JMPQ9JB45vLkCsE2w50QNP1kJZlI56dVGzfK1MyRqP4J6VshesfOT4hzR6MYq373IoONlLvENdYXN6pTxo5eRzQkwk2tZ1zmZqczCytqTEhpweKcBCCZ/FhizgLm8/x5ScBlO0wEXHZm90mpmL1gR/J2CUnz3wDU99YFFKqm01AZ8q2S5Fnh81CbD687c7K2OjWlZgdvEJA9M0JT3eKdIRd9GCx6g1TO5PWTE8OOphUDKdazyYnmMqFhFxfJ//cWJTsgYbol2a7Ob/Q69Fy3kb9K7aZLzH+Kl/uCzWnqTOrQonVL7LTFPr7wbTaepfAl5zSgMInjrGXY+Gspw+fCNgEU1zyC0Suum6VFyHBjdKWft7strrOXqOSQwxsYXp4F013mN9gZyu4Hc84A4dzIHN5UNXmxNn+vPjS82JM6klySWB9pLCzLBUgXiMDllaG6fT2PSBv/b+yaruyWBVcpsOKuEaQ37W3A3t9YFRcgB5rFMDjwOn3c0lfsg+5V+dBX2EmWLTSelNZkeq67CFnxaKtnlsAJRPBqYvoWVZcJKn0zSelrO2TwnailO7zgAHaMRmQYbXo9beBs16JWf7V8LjYGS/DYUKTTE1zKECC/pK1EKf6mxIgmV+mJ+Mc8h04qep+okIIEXaN351J3N0VUk7cEEaOLE1rFF3W4vqRcodPfbLqINF6QtTsfny1+O46J5ahlamZEyxglZtpjEkKd9yKDsgwnzqoAPN5o76IsI+FRaBc8u1qLBWxpKU615chTVegNFR5V4o1T2JGwVkueD6CjAhOplPnRyv8sauMnMy2wEMARR6AmCQ8S5ebL0nCEqjSztMoUyAEjQ6FDYqkGweu48DkBR5HjwlBloKVawYcDezxKBH8WWnMpJKZj1Ol+OHMmg5iq9xDswLx0iTNkujgatOkeRU0c/GmSSH+7GTTMLQJdj51l3EkojjEwWOjw8XBOm88GqC4bWPEE+U/5XYtZNJG/X4FYjgIvVd69RYVbMEMfPSKJ825e3XQ6RBesp/G+lkMk4VIxRakyUBPLO1u0UYnNG9ExAnPdOO0OfFvcPOL9rBJO8bR+q9Lp9/i+fH32KkaNR2WgoxQY3FY+rS2NUvtCOgZAaF9vny16WG/3zeUtRP9V28PcGivAHAwwCcRk0D0iohjAfgL/EKXJkr8gIFqbNq7lXUFRKqMbpBa182ol77SqJq1M5setGUJuSBKqYBYKdDZv3XdT/u6J5aKKkLvA5ez6PuWX0RT7kELSKDKfg9w9nwSmMmJHjbnr0blM2WvpiirR/nLid6SRN9+5KoLUb+pLw3QzD8JlS3X2q0m4BNRxfltr5KWqryOuuGDt6IOHSE8/zqGXMiTqgrUOfDH58NoWe0te4mFc1GxswvhZXWJZmaWaMJo2SBnuXa7+jIfFbnhNH74Z6jygwcqXsldYfI/Zh8BZbqTh2I7Hu44dilfbX8Uh18NVB3phRnTwpUonKquUs/iZXRnDFjtEmKg2YRQm2CP1FWRb/B92HqJlHT7Hs/Tpl3RrlxvkoskpNlW53/6Ujse0fkHLNeUm97TlDsaRXpfZkR1uWMTwhPv4oYM2Bv941R+c7nQ0yBdFNVQpZRkpejmIfjFrdQUA7DPwR69aq6Pzmk3IXarIMKG6R4MBdkB3j3HWxohnZLWpaNy/BMxS+84e4vPPfO/7+nLWVZsdpUY/nGDkQts0NGnRpZK/lW60tmncMoTepY5fMbow1GyKhqSXLbOZkz59l8DG9v9ZHPwA1roKz3MW/j2tN/U+lPQVYXTa6h1ePQkSWR2bp9OHmCCvT6s8v9PVG2ufK7dkbpY500gNx7fdArzH3yCjY33Fa5TbOuybLNdW8juJyJtikDn+5jMnMzIWP/+v12XkaXj195xk6eOKuvA5zeKk1i1PrSnmWA46Ca2ldgNqJ0rvLqM9X2EPn/QuMjLnLg0iVJ4H4r5S2PgpGdSdfVoiX/rBAq6yVDc30v8DOUae4oquSM0YDCIafLQ+hvEmB5b/f+QsTFtAR0zIVWeLyYbmrx3g9gHhVRfelCz9/exh19AGsyXcwuSaBiCzQIoctYvyhhkdCsC/cdZDce/1Fav35JQt+RJFAjiMRQhCdE4eS3SmfsREHe9LZa0ElOLhxxvs5uS/SnMYssyK9FxiucRjjOqfaIp2N8CmuNJqg3WvtMk+MlbAYeji9K94rx6U7nj9L1TGhVcAyz+Gb4sib21AW94HRzWbTrRKEkx5+KLE69Vc+8Cj1Vu2GkZ1AA2E4kaJ2aTjsEL2C0srAINXRAjnxwI3p5ED0NRYn9sT1iY9GPBJwhhd6WXEJ/Z44D0rufaDOA8dUj1SIqywRs2b7SjYcCYS8eefkwdWlpN0DvnecdwHVc3TqyCcUy7K2PMS2l2KZHzZfLCTCPaPq/NVc/Nlc5hVJoFvnNUpKWZcTsxVeHfH1mnELREECq9YES9v6FcvONCxXLQmf0k3S2dyNmsxbvlXM0u7lSqkx81md0rad3E33PPuPpDGM9UiBhSeJn3Sejmx+LdLCiZYcVxow59nCqrUmXGAbsR4O7wVQzyHdL6DX5s8k5BjHXlONz0PaIqS89xMhkYetMw6w7JZ5c/oJBH2jdZPbS6KbR0RpEe16BATLzU4QiHybxArrjBM8MKKP8Zz6MVbg/d8yb76U8nQzCK4Eqa5ombBm7/6xo2dR9O/ByfcU6qDu+efdLFAP4LiCr6C3aihDPjigUYuy0voLuX3Flevl7xXRtRZ4Vc48j2tgA7tK0wqv4OjLwCzZJn9lYIQuScQBEFMBjA6Vj8FTp4h3OphB6g0uA13nTnVLmKQ+zfELl+6znWX5nCWvbwak0t3q4qwWK3MAPKE2vqDEeCsFKvmJ2Ws+VOqnrA+ekCk9jaszBsZd71InADWijT4SHnyVmc55dv5ivXl1fED4vwNrxbiZHWeGinS3ImcoDAT1vGiLpP/D3NaiIPq9A2h5DT5SgaCVCh0JKu7DKsHjW9ZAACRxHgTSo5jrVWUJfGKweg2auQuittVidB+JaCdwYd0x9oJ4jyI5UygrB9Nzi2gbLVcCnpu+1ytsiWCbJb1Xxas8FhG/EX86taG6flZZauhaGnpRyfBB5ojGdsdPBVHEtb8R951oaNTvKXK7CddSeWaeOi2FIDPEhWhAk19RzuR9wSKEwvvi8nQFz649+fUlBMuDL7VmUBSsC1ExWwqY+uSdNKowEkpsBb+/KpWl6oGxymyR/e4uKjipBJrVPXg0nE2j6HL2JbCHNh01lV+/+6FUglhV8GTypzdvdfhYc7t0ZYtkyH/17wDakU7r1GAdUIXXmtxamhK2FdelBa4BPryblCC9gJG9htJue9LMrNS7mM6gbRA1xSFnWNsziDuGZeS3Dcu4bjsWaIebrgNnxpl/pLGxV5EtkFwDeh8fPyfPU8CZAM/Ljk3+Vi7jUtNZmZM8+f7d4wlUIkTHiAULRUKu0ODFIeyk20BiqLB7vvAT342SIDP+z5FPaa6Tjyqh/AsX2jFhbeIXKxDMb8fid0jHAWk6JKhswbtvtP6bDz+lYjvXIPwV1Y+nyft2uM8c1aUxmDHAUmZnJBvZXT43mxjXDHP05R1/dKfoExcgcYzv3wO5mazi7ugS01z6oUmByKtfQ6fA2+MQynPCoDHcp1eDtag/E3HQpHMWAgGkNh9wWR5Y48YG0W4CgvOrngI111j/x+MIuH5xFlVkxqptSjW+hnVbt9qxtXndEH5RtnxWfd9eP+kli/x3LU1WGsZVAkVElXD274LBGK0bMveEUbj/6EpnocEnvRSlglpE4GiAO5S4JdYb4uYd6oeK8vuZvTQaWMS3dEIJ2ssCxWz8DqYmc/b38ynz0DWCCeF1gCyipaLG2Kq9wqfHz3S6m7CS+H42nmDYAz2dYcx77M8purGOS5tQ4aykJXIDQBwHjIGSU+52M+1OV53rp4B3JbIXecQWEjfk9gkVoz8T6HJbIhFgm3quNMk+cIyRHlj/BdURXY8o7H7dBQfsdpLJhAsxS/1JtMkY8JoP4YdyOxzJY5x/+A9scOTXvPVoQAMqgmP899s6GvRtzNFGXLX7VHSnUj7VPO8K1qxaS/a/6v/YhRlUtNgnqnth3Jo/DKbdhdPn6HgB9YjU5GuN1uPyUXZJDZYfFwMfdqNPVoI8d1csoHMK5tquGoK060mIwBHMk3pFGqBosajr9g/5kBPrrtuIIEPFZnaAKSCQqLdeQq2B6Bs8WxD8+DfzGJ2nu0Xeb58spPoiHZAVV+I5lRUseUE0IA4E844UzFYADNYcLBW3zsP7aWzLnUZoQPuIDR3FX3bkM5mCunvXaPSi4PRkKnItEv8/OYiq8RSKQcaTwxX9YgdNbgPuXLwb5ARofv0Zj3WpHhNnlTq2Qu/lwvM3PUaqv8L7kpFqQR9aRaXfFanbLgbyxJ2kAx9oA1kRMyH3JXI06oQhRiZQ1LtWz+QKKxme0zAgI2q6/dmYApsA7WGeBae5+Y3eqkqDjXyS7Q+LzYgrM3EiqGHsibaKZKgFecxpGiMLXY5+kkuDKBdMkj2Bd8uTKI+aTWpu97gNp78fm891zYuT68sIEzE5JggpWjlWFSpzYayxvnOxJ3JYK/q8WbCy14KhtCFhdLOxCEAvyqXN3K+oP52ZzdxHiCAac5LX2TO5CTmkxp6zCT5JZDIBgnnmQU8GBowEvogfPni17fE1sljd55P2C4mWCNDr8l3hMH+4zpyZqp3iFbJx20nGtU+9LJozl0OxNrk/c0C9chEe+k4vUECnUaXbS8JqdnymqbZ1SCI+4+1BYMW4nzYKDLaqL3Nm08C/Ug7zNg2BuwhWepXrkqaRX58LCWLPDQyUzn369E1drtekeuNcI4SgdmyQZ/7xhXZ6sOKg9G/HEiJQsriRQThvHz4BhaFaXic4nlrz4LhUthGBLbnnB6tufJizYx4c6b2rY1E63pLDA8QdZsTOD7euNMku1a0T2nNQ9rOPBYPDyksaP+EmKTvqcgRycKMtzhHh37mAqVERuzIIMs/zXE9jGBpJBBWb8KCPZne6Sxw0+UFlY6/VeXJUHunHXY1csfc40Tw95XrkpLzxqX/LrsaYM7Y0UQ/Qe6PTjMQUXDseSMhYwHTXCohySQ+1fIjz/yjZWRFI1/a4d9eQzWLoGjz8O8ldPhzhpWFwwlaR0T1gpMP3VeHvDOx4RJocHJOSRQ+H4/nHJsiuXWDKowYZZW8Jk9vUiw2jExedn7glAsC/bgN1NrgIp1y+y3tmLd2V9x7yKVC+QK6MOFq19dlQflj350qUavBULMCTn0BvCRQY4q6VjniU6XHISUsaApCVoQeevAOuCUFcnwWfK+44XDo1qSpPF1wcnbH7N9aO+AzD212PgFlGkXlaQ3Gbfz9XIUMjulgGUREelr6IX+tR2K9H/yep959z5WLXlZ81Z8HCIV8CyU0JKYzkIeFqf6o2ywb2O73oRi7i8F6Vcn2zU1VWZpLfSXgTNkRtqM7r5s13UimLWtAVZs97rLcMRlwXzYp98ZnKvQLj/dpKn8nfNnU9V2Bp90frlQedeKt6zd4mPR53FKQ1J4r95n1G8ph0XG37DC9b185sWbnoyC4Q1iUvyy5IOxBrIqbqn/JSUWzdrlOiZGDJrU5IGuzUl5TaupUTIgFeLfT6uh0gIEJ5nZQ/8XjB0mmEZxTvocrU/BFoOaUvV/N48W3W/aQu5nR3KwsSByfSDAEq6qBqTVTkZtkaAd/1Rie2jkdRlZvxFMu0MGnLc0SHPII8eOz/bjfIhSQhAb38dSRcFmfRb+fpDrDHeazED6EHNayy0kESoRG+XFbJa6xWB6OlbwHVDwdO9Ka7bIOqLRHpZjwXmv/2DR9nu+2xwxE39cBHq/7Vv99HcvH8ZJeGmgHr8mBKQmOCTkvLkxf5k4FrqZuNpaRNhCB3puFuF5d2nnQbhgAaANLMCYAiGsJhX2bFM/r3BGhR/dkGPXeBQUJ4tTARQnVqA07mW/42Dv2k7Wa7hWU/wv7FTIWLwWyHX0Vqdg4BHrlJ7zh+b+T6fH+W3d53LS5rkXK5GIctMIttK+osfGYIvOD0BkkXBJR0EYUmteToIxpoaMVKZmCRC2BbmBLdUTIZiI1kVYKYnq9Q5xMGODu+6vCT2ofvYE0pmGbQ9Ln6wnBDYZUD/BL9rmiPn3n28Zs33OsHUQcLp2vjUEV5sOBLO2ScyescGu0N58y1q1NSNJuXCzI4fu4RWJtSIn3P3+9eAsMo/2NupFeaf70/usLGd2Z0F27EjLoIj+nmJ4/Q5edPFhVNpPURQrUzPALNNzEvx3e82rDtPpbZjugv7Abm2q2vMGwz5W+hGH0hkCzXdZhPFbLk0sR5vVhScLgAPdZIVZIjTuzwIKVuWmvpMr7Gwxgiglpy8ecfOAZcCpXRzG6lNuRB64D4G9AWD9vQi/crWV4Xq5VjJnRjQc3g4bJe+MmksjEctghn27n5i5PHZvW/gM0BsXzo8Pou6yOLnp49dGXpK/oLAbOdOel9h+kDqEtZunvsXa9EFomdl0QbDvk+H58SjszCVqVOXSgDpOdZjXWfZpFL6S/fd1Lq8FQS3LklgiNhdvE5GzgSO8uq3gtj8I2o+JzucnrUSrtoxa6IejmVQLGzF3rSCy3fdhBPhZnDdgctC89dRJ+PTfW4ga5WWAyaWspzFg5251FoByB8LUbD3AxhvV6M1ARNXRJ4NhPe2j9WOlu5I2KmCMGvGP5CbHAyZk3YhiuIdtDgOvre9Cz0yOWvHH5FpZQzqzyHE5XkTTFMU2JhG1nvne9SCi9zNvPnGj9h/bQXgpue78rpogXJl8oDSfMwz9fp4ocyOxEV1JCEslSsRvodEzPbUsMUYWDERNzR6f45Ku6EmW3qdD48dcFQtc9rr2wF3o85edZ/2SY0BSkOdQX1ahwPVBP554Q1Z4lbd0d/vrRCO5k3QBWOb3iML0vI4MRkiKwqt735Q2fkq0Xl1pI3nk4ll51cSEHOrFTctkxwLOiQl6HJh2q3iqHFmtOCSo0A4YLl+mllolm7FLpe/79gMoe7A5cbFPCbX9Z3GhI43FgBbWoq8pwaIoDlklRimVauOx355pv7v26P0MLrgiqWTOxJaIGO/UhHf7GSOm0r1O5m1sPYYn1bathmEkYfrQLiEWQ2/3IjunsIxgAmi6t4JsxalYxE4YyvD59EpzvswOjZUvSgkHwPZonVtaiMTLXnV3p0dKpCSSz38Kv8QbNFzqLbwbBBRUHw/nHSxNipNm5vtjfkuf06jWRwkctgu8wZqKwS/7IcGnFtmwnbJFPhpGcyV9GVFzCCG+TOeNgAWxOUPgmtLdD8JawVVDV+e3iR8kHuaZXIknncI/3uFnblTd2P/OdWvxl+9CXbqJb1CS8osg2fg/qaA9KvM3FQoZQ79JRZC/Upm90ABPCGzksTWJ7Xy9VHpnPZCgGzAVbJhmurq8tm24BjBvnm1GOKfotvCqXyIXFE1bYTRS1WtzgZrGWgR/oOUDnNgDPXqUfTmyFPfNCD9MX22hvuBans/Kl1DustiTunl9Kravj0NG1Ds5nkTqlQSYOfhgvRIowimmWAYWma55eqvaQL9GvHmuH/hIVB/tiN6s7yOW2iahReL8dNddIbMJ6BLVguJ4n1dnquV3ZNqi6V0H/Vn00j0cE80ERsZTgsHPJ0eUjxYik+eDtaEHnyAsYeR2AjRcGw=="),(function(e){return e.charCodeAt(0)})),i=new Uint8Array([177,156,215,89,13,111,230,1]),o=new Uint8Array(n.length),a=new Uint8Array(256),s=0;s<256;s++)a[s]=s;var c,d=0;for(s=0;s<256;s++){d=(d+a[s]+i[s%i.length])%256;var u=[a[d],a[s]];a[s]=u[0],a[d]=u[1]}s=0,d=0;for(var l=0;l<0+n.length;l++){d=(d+a[s=(s+1)%256])%256;var p=[a[d],a[s]];a[s]=p[0],a[d]=p[1],c=a[(a[s]+a[d])%256],l>=0&&(o[l-0]=n[l-0]^c)}return N=!0,new Promise((function(n){(function(e,t){return WebAssembly.instantiate(e,t)})(o.buffer,t).then((function(t){N=!1,r=t.instance.exports,e.__wbindgen_wasm_module=t.module,n()}))}))}().then((function(){w=C.new(),e(w)}))}))).then((function(e){L=e})),setInterval((function(){Object(c.getParameter)("UPLOAD_LOG")&&x.info("console log upload")}),9e5);var x=function(){var e,t,n,r,i,u,l=null,p=["DEBUG","INFO","WARNING","ERROR","NONE"],f=0,g=function(e,t,n){var r={};Array.isArray(e)||(e=[e]),e=e.map((function(e){return{log_item_id:D++,log_level:e.log_level,payload_str:e.payload}})),r={timestamp:Date.now(),sdk_version:c.VERSION,process_id:Object(d.getProcessId)(),payload:JSON.stringify(e)},L?r.hash=L.get_digest("".concat(r.payload).concat(r.process_id).concat(r.timestamp)):n&&n();try{var i=l,o=l||"https://".concat(Object(c.getParameter)("LOG_UPLOAD_SERVER"),"/upload/v2");Object(s.post)(o,r,(function(e){"OK"===e?t&&t(e):n&&n(e)}),(function(e){n&&n(e)}),i?{withCredentials:!0}:{withCredentials:!0,"Cache-Control":"no-cache, no-store",Pragma:"no-cache",Expires:"0"})}catch(e){n&&n(e)}},m=function(e,t){if(Object(c.getParameter)("UPLOAD_LOG"))try{t=Array.prototype.slice.call(t);var n="";t.forEach((function(e){"object"===o()(e)&&(e=JSON.stringify(e)),n=n+e+" "})),M.push({payload:n,log_level:e}),"free"===k&&function e(t){k="uploading",setTimeout((function(){g(t,(function(){U=0,0!==M.length?(P=M.length<10?M.splice(0,M.length):M.splice(0,10),e(P)):k="free"}),(function(){setTimeout((function(){e(P)}),U++<2?200:1e4)}))}),3e3)}(P=M.length<10?M.splice(0,M.length):M.splice(0,10))}catch(e){}};t=function(){for(var t=[0],n=0;n4?e=4:e<0&&(e=0),f=e},log:e=function(){var e=arguments[0],t=arguments;if(t[0]=a()+" Agora-SDK ["+(p[e]||"DEFAULT")+"]:",m(e,t),!(e1&&(e="EXECUTOR_INVOKE_".concat(m)),e)return A._sendApiInvoke(g({},E(),{success:!1,error:e},i&&{states:i()})),S&&c.default.info("".concat(r," onFailure"),e),u&&u(e);A._sendApiInvoke(g({},E(),{success:!0},p&&{result:t},{},i&&{states:i()})),S&&c.default.info("".concat(r," onSuccess")),u&&u(null,t)}},m._cachedItems=[],m._cacheInvokeReport=function(e){e.lts||(e.lts=Date.now()),m._cachedItems.push(e),m._cachedItems.length>50&&m._cachedItems.shift()},m._flushInvokeReport=function(e){if(m._cachedItems.length){var t=m._cachedItems;m._cachedItems=[],c.default.debug("Flush cached event reporting:",t.length),t.forEach((function(t,n){t.sid=e,setTimeout((function(){m._sendApiInvoke(t)}),5e3+500*n)}))}},m._sendApiInvoke=function(e){var t=e.tag,n=e.invokeId,r=e.sid,i=e.name,o=e.result,a=e.states,c=e.options,d=e.error,u=e.success,l=e.apiInvokeTime,p=e.lts,f=Object(s.getParameter)("NOT_REPORT_EVENT");if(!(t&&f instanceof Array&&-1!==f.indexOf(t)))if(m.list[r]){var h=m.list[r],v=h.startTime,E=h.cname,S=h.uid,_=h.cid,y=(p=p||Date.now())-v,R=p-l,T="";if(c)try{T=JSON.stringify(c)}catch(e){T=c.toString()}var I=g({invokeId:n,sid:r,cname:E,cid:_,lts:p,uid:S,success:u,elapse:y,apiName:i,execElapse:R},void 0!==c&&{options:T},{},void 0!==a&&{execStates:JSON.stringify(a)},{},void 0!==d&&{errorCode:JSON.stringify(d)},{},void 0!==o&&{execResult:JSON.stringify(o)});m.send({type:"ApiInvoke",data:I})}else m._cacheInvokeReport(arguments[0])},m.sendCache=[],m.sendTimer=null,m.send=function(e){if(e.data){var t=e.data;m._lastLts&&m._lastLts>=t.lts&&(t.lts=m._lastLts+1),m._lastLts=t.lts}if(m.sendCache.push(e),null===m.sendTimer)return function e(){m.sendTimer=setTimeout((function(){if(0!==m.sendCache.length){var t=m.sendCache.length<10?m.sendCache.splice(0,m.sendCache.length):m.sendCache.splice(0,10),n=m.list[t[0].data.sid].vid;return R.sendReportList(t,n),e()}m.sendTimer=null}),Object(s.getParameter)("EVENT_REPORT_SEND_INTERVAL"))}()},m)},function(e,t,n){"use strict";n.r(t),n.d(t,"checkValidObject",(function(){return s})),n.d(t,"checkValidString",(function(){return c})),n.d(t,"checkValidNumber",(function(){return d})),n.d(t,"checkValidArray",(function(){return u})),n.d(t,"checkValidFloatNumber",(function(){return l})),n.d(t,"checkValidBoolean",(function(){return p})),n.d(t,"checkValidEnum",(function(){return a})),n.d(t,"checkValidUID",(function(){return f})),n.d(t,"isValidString",(function(){return g})),n.d(t,"isValidNumber",(function(){return m})),n.d(t,"isValidBoolean",(function(){return v})),n.d(t,"isASCII",(function(){return _})),n.d(t,"isInteger",(function(){return y})),n.d(t,"isNumber",(function(){return R})),n.d(t,"isString",(function(){return T})),n.d(t,"isArray",(function(){return I})),n.d(t,"isEmpty",(function(){return b})),n.d(t,"isValidToken",(function(){return E})),n.d(t,"isValidChannelName",(function(){return S}));var r=n(11),i=n.n(r),o=n(10),a=function(e,t,n){for(var r=0;r=t&&e.length<=n},m=function(e,t,n){return y(e)&&e>=t&&e<=n},h=function(e,t,n){return R(e)&&e>=t&&e<=n},v=function(e){return"boolean"==typeof e},E=function(e){return g(e,1,2047)},S=function(e){return T(e)&&/^[a-zA-Z0-9 \!\#\$\%\&\(\)\+\-\:\;\<\=\.\>\?\@\[\]\^\_\{\}\|\~\,]{1,64}$/.test(e)},_=function(e){if("string"==typeof e){for(var t=0;t255)return!1}return!0}},y=function(e){return"number"==typeof e&&e%1==0},R=function(e){return"number"==typeof e},T=function(e){return"string"==typeof e},I=function(e){return e instanceof Array},b=function(e){return null==e}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.BUILD="v3.5.2-0-g0d49ed1";t.VERSION="3.5.2";var r=0*Date.now()+11499+86604+5615+6547+846;t.SUPPORT_RESOLUTION_LIST={"90p_1":[160,90,null,null,null,null],"120p_1":[160,120,15,15,30,65],"120p_3":[120,120,15,15,30,50],"120p_4":[212,120,null,null,null,null],"180p_1":[320,180,15,15,30,140],"180p_3":[180,180,15,15,30,100],"180p_4":[240,180,15,15,30,120],"240p_1":[320,240,15,15,40,200],"240p_3":[240,240,15,15,40,140],"240p_4":[424,240,15,15,40,220],"360p_1":[640,360,15,15,80,400],"360p_3":[360,360,15,15,80,260],"360p_4":[640,360,30,30,80,600],"360p_6":[360,360,30,30,80,400],"360p_7":[480,360,15,15,80,320],"360p_8":[480,360,30,30,80,490],"360p_9":[640,360,15,15,80,800],"360p_10":[640,360,24,24,80,800],"360p_11":[640,360,24,24,80,1e3],"480p_1":[640,480,15,15,100,500,1,5],"480p_2":[640,480,30,30,100,1e3,25,30],"480p_3":[480,480,15,15,100,400],"480p_4":[640,480,30,30,100,750],"480p_6":[480,480,30,30,100,600],"480p_8":[848,480,15,15,100,610],"480p_9":[848,480,30,30,100,930],"480p_10":[640,480,10,10,100,400],"720p_1":[1280,720,15,15,120,1130,1,5],"720p_2":[1280,720,30,30,120,2e3,25,30],"720p_3":[1280,720,30,30,120,1710],"720p_5":[960,720,15,15,120,910],"720p_6":[960,720,30,30,120,1380],"1080p_1":[1920,1080,15,15,120,2080,1,5],"1080p_2":[1920,1080,30,30,120,3e3,25,30],"1080p_3":[1920,1080,30,30,120,3150],"1080p_5":[1920,1080,60,60,120,4780],"1440p_1":[2560,1440,30,30,120,4850],"1440p_2":[2560,1440,60,60,120,7350],"4k_1":[3840,2160,30,30,120,8910],"4k_3":[3840,2160,60,60,120,13500]};t.AUDIO_PROFILE_SETTINGS={speech_low_quality:[!1,!1,!0,!0],speech_standard:[!1,!1,!0,!1],music_standard:[!1,!1,!1,!1],standard_stereo:[!1,!0,!1,!1],high_quality:[!0,!1,!1,!1],high_quality_stereo:[!0,!0,!1,!1],default:[!1,!1,!1,!1]};var i={AREA_SETTING:["NORTH_AMERICA","OVERSEA"],WEBCS_DOMAIN:["ap-web-1-oversea.agora.io","ap-web-1-north-america.agora.io"],WEBCS_DOMAIN_BACKUP_LIST:["ap-web-2-oversea.agora.io","ap-web-2-north-america.agora.io"],PROXY_CS:["proxy-ap-web-oversea.agora.io","proxy-ap-web-america.agora.io"],CDS_AP:["cds-ap-web-oversea.agora.io","cds-ap-web-america.agora.io","cds-ap-web-america2.agora.io"],ACCOUNT_REGISTER:["sua-ap-web-oversea.agora.io","sua-ap-web-america.agora.io","sua-ap-web-america2.agora.io"],UAP_AP:["uap-ap-web-oversea.agora.io","uap-ap-web-america.agora.io","uap-ap-web-america2.agora.io"],LOG_UPLOAD_SERVER:"logservice-oversea.agora.io",EVENT_REPORT_DOMAIN:"statscollector-1-oversea.agora.io",EVENT_REPORT_BACKUP_DOMAIN:"statscollector-2-oversea.agora.io",ENABLE_LIVE_SERVER_LIST:!1,LIVE_SERVER_LIST:[],ACCOUNT_REGISTER_RETRY_TIMEOUT:1,ACCOUNT_REGISTER_RETRY_RATIO:2,ACCOUNT_REGISTER_RETRY_TIMEOUT_MAX:6e4,ACCOUNT_REGISTER_RETRY_COUNT_MAX:1e5,AUDIO_CONTEXT:null,GATEWAY_DOMAINS:["edge.agora.io"],WEBCS_BACKUP_CONNECT_TIMEOUT:6e3,LIVESTREAMING_ALIGN:!0,HTTP_CONNECT_TIMEOUT:5e3,PLAYER_STATE_DEFER:2e3,SIGNAL_REQUEST_TIMEOUT:1e7,SIGNAL_REQUEST_WATCH_INTERVAL:1e3,REPORT_STATS:!0,REPORT_STATS_TIMEOUT:3e3,UPLOAD_LOG:!1,NOT_REPORT_EVENT:[],FILEPATH_LENMAX:255,SUBSCRIBE_TCC:!1,PING_PONG_TIME_OUT:10,DUALSTREAM_OPERATION_CHECK:!0,WEBSOCKET_TIMEOUT_MIN:1e4,EVENT_REPORT_SEND_INTERVAL:1e3,MEDIA_ELEMENT_EXISTS_DEPTH:3,CANDIDATE_TIMEOUT:2e3,SHIM_CANDIDATE:!1,LEAVE_MSG_TIMEOUT:2e3,TICKET_RENEW_TIMEOUT:828e5,LIVE_STREAMING_TIMEOUT:12e4,SHOW_REPORT_INVOKER_LOG:!1,STATS_FILTER:{transportId:!0,googTrackId:!0},FORCE_TURN:!1,TURN_ENABLE_TCP:!0,TURN_ENABLE_UDP:!0,FORCE_CHANGED_GATEWAY_FLAG:!1,JOIN_EXTEND:"",PUB_EXTEND:"",SUB_EXTEND:"",CHROME_NEW_STATS:!1,AP_BACKOFF_MAX_TIME:8,SET_DEFAULT_TURNSERVER:!0,TURN_SERVER_PASSWORD:r.toString(),PROXY_SERVER_TYPE2:"webnginx-proxy.agora.io",NGINX:"webrtc-cloud-proxy.agora.io",CR:!0,CRL:10,CRI:6,CUSTOMER_REPORT_TIMEOUT:5e3,LIVE_STREAMING_ADDRESS:""};i.AREA_SETTING=["CHINA","GLOBAL"],i.WEBCS_DOMAIN=["webrtc2-ap-web-1.agora.io","webrtc2-2.ap.sd-rtn.com"],i.WEBCS_DOMAIN_BACKUP_LIST=["webrtc2-ap-web-3.agora.io","webrtc2-4.ap.sd-rtn.com"],i.PROXY_CS=["ap-proxy-1.agora.io","ap-proxy-2.agora.io"],i.CDS_AP=["cds-ap-web-1.agora.io","cds-web-2.ap.sd-rtn.com","cds-ap-web-3.agora.io","cds-web-4.ap.sd-rtn.com"],i.ACCOUNT_REGISTER=["sua-ap-web-1.agora.io","sua-web-2.ap.sd-rtn.com","sua-ap-web-3.agora.io","sua-web-4.ap.sd-rtn.com"],i.UAP_AP=["uap-ap-web-1.agora.io","uap-web-2.ap.sd-rtn.com","uap-ap-web-3.agora.io","uap-web-4.ap.sd-rtn.com"],i.LOG_UPLOAD_SERVER="logservice.agora.io",i.EVENT_REPORT_DOMAIN="web-2.statscollector.sd-rtn.com",i.EVENT_REPORT_BACKUP_DOMAIN="web-3.statscollector.sd-rtn.com",i.GATEWAY_DOMAINS=["edge.agora.io","edge.sd-rtn.com"],i.NGINX="webrtc-cloud-proxy.sd-rtn.com";t.setParameter=function(e,t){return void 0!==i[e]&&(i[e]=t,!0)};t.getParameter=function(e){return void 0!==i[e]?i[e]:null}},function(e,t,n){"use strict";n.r(t),n.d(t,"getBrowserInfo",(function(){return E})),n.d(t,"getBrowserVersion",(function(){return p})),n.d(t,"getBrowserOS",(function(){return f})),n.d(t,"isChrome",(function(){return r})),n.d(t,"isSafari",(function(){return i})),n.d(t,"isFireFox",(function(){return a})),n.d(t,"isOpera",(function(){return s})),n.d(t,"isEdge",(function(){return o})),n.d(t,"isQQBrowser",(function(){return c})),n.d(t,"isWeChatBrowser",(function(){return d})),n.d(t,"isLegacyChrome",(function(){return m})),n.d(t,"isSupportedPC",(function(){return u})),n.d(t,"isSupportedMobile",(function(){return l})),n.d(t,"getChromeKernelVersion",(function(){return v})),n.d(t,"isChromeKernel",(function(){return g}));var r=function(){var e=E();return e.name&&"Chrome"===e.name},i=function(){var e=E();return e.name&&"Safari"===e.name},o=function(){var e=E();return e.name&&"Edge"===e.name},a=function(){var e=E();return e.name&&"Firefox"===e.name},s=function(){var e=E();return e.name&&"OPR"===e.name},c=function(){var e=E();return e.name&&"QQBrowser"===e.name},d=function(){var e=E();return e.name&&"MicroMessenger"===e.name},u=function(){var e=f();return"Linux"===e||"Mac OS X"===e||"Mac OS"===e||-1!==e.indexOf("Windows")},l=function(){var e=f();return"Android"===e||"iOS"===e},p=function(){return E().version},f=function(){return E().os},g=function(){return!!navigator.userAgent.match(/chrome\/[\d]./i)};function m(){return window.navigator.appVersion&&null!==window.navigator.appVersion.match(/Chrome\/([\w\W]*?)\./)&&window.navigator.appVersion.match(/Chrome\/([\w\W]*?)\./)[1]<=35}var h,v=function(){var e=navigator.userAgent.match(/chrome\/[\d]./i);return e&&e[0]&&e[0].split("/")[1]},E=(h=function(){var e,t=navigator.userAgent,n=t.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];"Chrome"===n[1]&&null!=(e=t.match(/(OPR(?=\/))\/?(\d+)/i))&&(n=e),"Safari"===n[1]&&null!=(e=t.match(/version\/(\d+)/i))&&(n[2]=e[1]),~t.toLowerCase().indexOf("qqbrowser")&&null!=(e=t.match(/(qqbrowser(?=\/))\/?(\d+)/i))&&(n=e),~t.toLowerCase().indexOf("micromessenger")&&null!=(e=t.match(/(micromessenger(?=\/))\/?(\d+)/i))&&(n=e),~t.toLowerCase().indexOf("edge")&&null!=(e=t.match(/(edge(?=\/))\/?(\d+)/i))&&(n=e),~t.toLowerCase().indexOf("trident")&&null!=(e=/\brv[ :]+(\d+)/g.exec(t)||[])&&(n=[null,"IE",e[1]]);var r=void 0,i=[{s:"Windows 10",r:/(Windows 10.0|Windows NT 10.0)/},{s:"Windows 8.1",r:/(Windows 8.1|Windows NT 6.3)/},{s:"Windows 8",r:/(Windows 8|Windows NT 6.2)/},{s:"Windows 7",r:/(Windows 7|Windows NT 6.1)/},{s:"Windows Vista",r:/Windows NT 6.0/},{s:"Windows Server 2003",r:/Windows NT 5.2/},{s:"Windows XP",r:/(Windows NT 5.1|Windows XP)/},{s:"Windows 2000",r:/(Windows NT 5.0|Windows 2000)/},{s:"Windows ME",r:/(Win 9x 4.90|Windows ME)/},{s:"Windows 98",r:/(Windows 98|Win98)/},{s:"Windows 95",r:/(Windows 95|Win95|Windows_95)/},{s:"Windows NT 4.0",r:/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},{s:"Windows CE",r:/Windows CE/},{s:"Windows 3.11",r:/Win16/},{s:"Android",r:/Android/},{s:"Open BSD",r:/OpenBSD/},{s:"Sun OS",r:/SunOS/},{s:"Linux",r:/(Linux|X11)/},{s:"iOS",r:/(iPhone|iPad|iPod)/},{s:"Mac OS X",r:/Mac OS X/},{s:"Mac OS",r:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},{s:"QNX",r:/QNX/},{s:"UNIX",r:/UNIX/},{s:"BeOS",r:/BeOS/},{s:"OS/2",r:/OS\/2/},{s:"Search Bot",r:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/}];for(var o in i){var a=i[o];if(a.r.test(navigator.userAgent)){r=a.s;break}}return{name:n[1],version:n[2],os:r}}(),function(){return h})},function(e,t,n){"use strict";n.r(t),n.d(t,"APErrorCode",(function(){return r})),n.d(t,"GatewayErrorCode",(function(){return i})),n.d(t,"StringUidErrorCode",(function(){return o})),n.d(t,"JOIN_GS_TRYNEXT_LIST",(function(){return a})),n.d(t,"JOIN_CS_RETRY_LIST",(function(){return s})),n.d(t,"JOIN_PROXY_RETRY_LIST",(function(){return c})),n.d(t,"INJECT_STREAM_STATUS",(function(){return d})),n.d(t,"WEBSOCKET_CLOSE_REASON",(function(){return u}));var r={1010100:"NO_FLAG_SET",1010101:"FLAG_SET_BUT_EMPTY",1010102:"INVALID_FALG_SET",2010005:"INVALID_VENDOR_KEY",2010007:"INVALID_CHANNEL_NAME",2010008:"INTERNAL_ERROR",2010009:"NO_AUTHORIZED",2010010:"DYNAMIC_KEY_TIMEOUT",2010011:"NO_ACTIVE_STATUS",2010013:"DYNAMIC_KEY_EXPIRED",2010014:"STATIC_USE_DYANMIC_KEY",2010015:"DYNAMIC_USE_STATIC_KEY",2010016:"USER_OVERLOAD",2010018:"FORBIDDEN_REGION",2010019:"CANNOT_MEET_AREA_DEMAND"},i={2e3:"ERR_NO_VOCS_AVAILABLE",2001:"ERR_NO_VOS_AVAILABLE",2002:"ERR_JOIN_CHANNEL_TIMEOUT",2003:"WARN_REPEAT_JOIN",2004:"ERR_JOIN_BY_MULTI_IP",2011:"ERR_NOT_JOINED",2012:"WARN_REPEAT_JOIN",2013:"ERR_INVALID_VENDOR_KEY",2014:"ERR_INVALID_CHANNEL_NAME",2015:"ERR_INVALID_STRINGUID",2016:"ERR_TOO_MANY_USERS",2017:"ERR_SET_CLIENT_ROLE_TIMEOUT",2018:"ERR_SET_CLIENT_ROLE_NO_PERMISSION",2019:"ERR_SET_CLIENT_ROLE_ALREADY_IN_USE",2020:"ERR_PUBLISH_REQUEST_INVALID",2021:"ERR_SUBSCRIBE_REQUEST_INVALID",2022:"ERR_NOT_SUPPORTED_MESSAGE",2023:"ERR_ILLEAGAL_PLUGIN",2028:"ILLEGAL_AES_PASSWORD",101:"ERR_INVALID_VENDOR_KEY",102:"ERR_INVALID_CHANNEL_NAME",103:"WARN_NO_AVAILABLE_CHANNEL",104:"WARN_LOOKUP_CHANNEL_TIMEOUT",105:"WARN_LOOKUP_CHANNEL_REJECTED",106:"WARN_OPEN_CHANNEL_TIMEOUT",107:"WARN_OPEN_CHANNEL_REJECTED",108:"WARN_REQUEST_DEFERRED",109:"ERR_DYNAMIC_KEY_TIMEOUT",110:"ERR_NO_AUTHORIZED",111:"ERR_VOM_SERVICE_UNAVAILABLE",112:"ERR_NO_CHANNEL_AVAILABLE_CODE",113:"ERR_TOO_MANY_USERS",114:"ERR_MASTER_VOCS_UNAVAILABLE",115:"ERR_INTERNAL_ERROR",116:"ERR_NO_ACTIVE_STATUS",117:"ERR_INVALID_UID",118:"ERR_DYNAMIC_KEY_EXPIRED",119:"ERR_STATIC_USE_DYANMIC_KE",120:"ERR_DYNAMIC_USE_STATIC_KE",2:"K_TIMESTAMP_EXPIRED",3:"K_CHANNEL_PERMISSION_INVALID",4:"K_CERTIFICATE_INVALID",5:"K_CHANNEL_NAME_EMPTY",6:"K_CHANNEL_NOT_FOUND",7:"K_TICKET_INVALID",8:"K_CHANNEL_CONFLICTED",9:"K_SERVICE_NOT_READY",10:"K_SERVICE_TOO_HEAVY",14:"K_UID_BANNED",15:"K_IP_BANNED",16:"K_CHANNEL_BANNED"},o={1:"ERROR_ILLEAGAL_APPID",2:"ERROR_ILLEAGAL_UID",3:"INTERNAL_SERVER_ERROR"},a=["ERR_NO_VOCS_AVAILABLE","ERR_NO_VOS_AVAILABLE","ERR_JOIN_CHANNEL_TIMEOUT","WARN_LOOKUP_CHANNEL_TIMEOUT","WARN_OPEN_CHANNEL_TIMEOUT","ERR_VOM_SERVICE_UNAVAILABLE","ERR_TOO_MANY_USERS","ERR_MASTER_VOCS_UNAVAILABLE","ERR_INTERNAL_ERROR"],s=["NO_SERVICE_AVAILABLE"],c=["NO_SERVICE_AVAILABLE","REQUEST_PROXY_SERVER_FAILED","REQUEST_PROXY_SERVER_TIME_OUT"],d={INJECT_STREAM_STATUS_START_SUCCESS:0,INJECT_STREAM_STATUS_START_ALREADY_EXISTS:1,INJECT_STREAM_STATUS_START_UNAUTHORIZED:2,INJECT_STREAM_STATUS_START_TIMEDOUT:3,INJECT_STREAM_STATUS_START_FAILED:4,INJECT_STREAM_STATUS_STOP_SUCCESS:5,INJECT_STREAM_STATUS_STOP_NOT_FOUND:6,INJECT_STREAM_STATUS_STOP_UNAUTHORIZED:7,INJECT_STREAM_STATUS_STOP_TIMEDOUT:8,INJECT_STREAM_STATUS_STOP_FAILED:9,INJECT_STREAM_STATUS_BROKEN:10},u={WS_DISCONNECT:"WS_DISCONNECT"};t.default={FAILED:"FAILED",INVALID_KEY:"INVALID_KEY",INVALID_CLIENT_MODE:"INVALID_CLIENT_MODE",INVALID_CLIENT_CODEC:"INVALID_CLIENT_CODEC",CLIENT_MODE_CODEC_MISMATCH:"CLIENT_MODE_CODEC_MISMATCH",WEB_API_NOT_SUPPORTED:"WEB_API_NOT_SUPPORTED",INVALID_PARAMETER:"INVALID_PARAMETER",NO_TRACK_IN_STREAM:"NO_TRACK_IN_STREAM",INVALID_OPERATION:"INVALID_OPERATION",INVALID_LOCAL_STREAM:"INVALID_LOCAL_STREAM",INVALID_REMOTE_STREAM:"INVALID_REMOTE_STREAM",INVALID_DYNAMIC_KEY:"INVALID_DYNAMIC_KEY",DYNAMIC_KEY_TIMEOUT:"DYNAMIC_KEY_TIMEOUT",NO_VOCS_AVAILABLE:"NO_VOCS_AVAILABLE",NO_VOS_AVAILABLE:"ERR_NO_VOS_AVAILABLE",JOIN_CHANNEL_TIMEOUT:"ERR_JOIN_CHANNEL_TIMEOUT",NO_AVAILABLE_CHANNEL:"NO_AVAILABLE_CHANNEL",LOOKUP_CHANNEL_TIMEOUT:"LOOKUP_CHANNEL_TIMEOUT",LOOKUP_CHANNEL_REJECTED:"LOOKUP_CHANNEL_REJECTED",OPEN_CHANNEL_TIMEOUT:"OPEN_CHANNEL_TIMEOUT",OPEN_CHANNEL_REJECTED:"OPEN_CHANNEL_REJECTED",REQUEST_DEFERRED:"REQUEST_DEFERRED",STREAM_ALREADY_PUBLISHED:"STREAM_ALREADY_PUBLISHED",STREAM_NOT_YET_PUBLISHED:"STREAM_NOT_YET_PUBLISHED",JOIN_TOO_FREQUENT:"JOIN_TOO_FREQUENT",SOCKET_ERROR:"SOCKET_ERROR",SOCKET_DISCONNECTED:"SOCKET_DISCONNECTED",PEERCONNECTION_FAILED:"PEERCONNECTION_FAILED",CONNECT_GATEWAY_ERROR:"CONNECT_GATEWAY_ERROR",SERVICE_NOT_AVAILABLE:"SERVICE_NOT_AVAILABLE",JOIN_CHANNEL_FAILED:"JOIN_CHANNEL_FAILED",PUBLISH_STREAM_FAILED:"PUBLISH_STREAM_FAILED",UNPUBLISH_STREAM_FAILED:"UNPUBLISH_STREAM_FAILED",SUBSCRIBE_STREAM_FAILED:"SUBSCRIBE_STREAM_FAILED",UNSUBSCRIBE_STREAM_FAILED:"UNSUBSCRIBE_STREAM_FAILED",NO_SUCH_REMOTE_STREAM:"NO_SUCH_REMOTE_STREAM",ERR_FAILED:"1",ERR_INVALID_VENDOR_KEY:"101",ERR_INVALID_CHANNEL_NAME:"102",WARN_NO_AVAILABLE_CHANNEL:"103",WARN_LOOKUP_CHANNEL_TIMEOUT:"104",WARN_LOOKUP_CHANNEL_REJECTED:"105",WARN_OPEN_CHANNEL_TIMEOUT:"106",WARN_OPEN_CHANNEL_REJECTED:"107",WARN_REQUEST_DEFERRED:"108",ERR_DYNAMIC_KEY_TIMEOUT:"109",ERR_INVALID_DYNAMIC_KEY:"110",ERR_NO_VOCS_AVAILABLE:"2000",ERR_NO_VOS_AVAILABLE:"2001",ERR_JOIN_CHANNEL_TIMEOUT:"2002",IOS_NOT_SUPPORT:"IOS_NOT_SUPPORT",WECHAT_NOT_SUPPORT:"WECHAT_NOT_SUPPORT",SHARING_SCREEN_NOT_SUPPORT:"SHARING_SCREEN_NOT_SUPPORT",STILL_ON_PUBLISHING:"STILL_ON_PUBLISHING",LOW_STREAM_ALREADY_PUBLISHED:"LOW_STREAM_ALREADY_PUBLISHED",LOW_STREAM_NOT_YET_PUBLISHED:"LOW_STREAM_ALREADY_PUBLISHED",HIGH_STREAM_NOT_VIDEO_TRACE:"HIGH_STREAM_NOT_VIDEO_TRACE",NOT_FIND_DEVICE_BY_LABEL:"NOT_FIND_DEVICE_BY_LABEL",ENABLE_DUALSTREAM_FAILED:"ENABLE_DUALSTREAM_FAILED",DISABLE_DUALSTREAM_FAILED:"DISABLE_DUALSTREAM_FAILED",PLAYER_NOT_FOUND:"PLAYER_NOT_FOUND",ELECTRON_NOT_SUPPORT_SHARING_SCREEN:"ELECTRON_NOT_SUPPORT_SHARING_SCREEN",BAD_ENVIRONMENT:"BAD_ENVIRONMENT",LOAD_AUDIO_FAILED:"LOAD_AUDIO_FAILED"}},function(e,t,n){"use strict";n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return i})),n.d(t,"c",(function(){return o}));n(0);var r=function(e,t,n){if(["End2EndDelay","TransportDelay","PacketLossRate","RecvLevel","RecvBitrate","CodecType","MuteState","TotalFreezeTime","TotalPlayDuration","RecordingLevel","SendLevel","SamplingRate","SendBitrate","CodecType","MuteState","End2EndDelay","TransportDelay","PacketLossRate","RecvBitrate","RecvResolutionWidth","RecvResolutionHeight","RenderResolutionHeight","RenderResolutionWidth","RenderFrameRate","TotalFreezeTime","TotalPlayDuration","TargetSendBitrate","SendFrameRate","SendFrameRate","SendBitrate","SendResolutionWidth","SendResolutionHeight","CaptureResolutionHeight","CaptureResolutionWidth","EncodeDelay","MuteState","TotalFreezeTime","TotalDuration","CaptureFrameRate","RTT","OutgoingAvailableBandwidth","Duration","UserCount","SendBytes","RecvBytes","SendBitrate","RecvBitrate","accessDelay","audioSendBytes","audioSendPackets","videoSendBytes","videoSendPackets","videoSendPacketsLost","videoSendFrameRate","audioSendPacketsLost","videoSendResolutionWidth","videoSendResolutionHeight","accessDelay","audioReceiveBytes","audioReceivePackets","audioReceivePacketsLost","videoReceiveBytes","videoReceivePackets","videoReceivePacketsLost","videoReceiveFrameRate","videoReceiveDecodeFrameRate","videoReceiveResolutionWidth","videoReceiveResolutionHeight","endToEndDelay","videoReceiveDelay","audioReceiveDelay","FirstFrameTime","VideoFreezeRate","AudioFreezeRate","RenderResolutionWidth","RenderResolutionHeight","VideoPublishDuration","AudioPublishDuration"].indexOf(t)>-1&&("string"==typeof n||isFinite(n)))return e[t]=""+n},i=function(e){var t={};return e.forEach((function(e){e.id&&e.type&&(-1===e.id.indexOf("send")&&-1===e.type.toLowerCase().indexOf("outbound")&&-1===e.id.indexOf("outbound_rtp")&&-1===e.id.indexOf("OutboundRTP")||("audio"===e.mediaType?(r(t,"audioSendBytes",e.bytesSent),r(t,"audioSendPackets",e.packetsSent),r(t,"audioSendPacketsLost",e.packetsLost)):(r(t,"videoSendBytes",e.bytesSent),r(t,"videoSendPackets",e.packetsSent),r(t,"videoSendPacketsLost",e.packetsLost),r(t,"videoSendFrameRate",e.googFrameRateSent),r(t,"videoSendResolutionWidth",e.googFrameWidthSent),r(t,"videoSendResolutionHeight",e.googFrameHeightSent))))})),t},o=function(e){var t={};return e.forEach((function(e){e.id&&e.type&&(-1===e.id.indexOf("recv")&&-1===e.type.toLowerCase().indexOf("inbound")&&-1===e.id.indexOf("inbound_rtp")&&-1===e.id.indexOf("inbound-rtp")&&-1===e.id.indexOf("InboundRTP")||("audio"===e.mediaType?(r(t,"audioReceiveBytes",e.bytesReceived),r(t,"audioReceivePackets",e.packetsReceived),r(t,"audioReceivePacketsLost",e.packetsLost)):(r(t,"videoReceiveBytes",e.bytesReceived),r(t,"videoReceivePacketsLost",e.packetsLost),r(t,"videoReceivePackets",e.packetsReceived),r(t,"videoReceiveFrameRate",e.googFrameRateReceived),r(t,"videoReceiveDecodeFrameRate",e.googFrameRateDecoded),r(t,"videoReceiveResolutionWidth",e.googFrameWidthReceived),r(t,"videoReceiveResolutionHeight",e.googFrameHeightReceived))))})),t}},function(e,t){function n(){return e.exports=n=Object.assign||function(e){for(var t=1;t0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=t.host.length?t.dispatchEvent(Object(m.d)({type:"recover"})):t.creatConnection()},t.replaceHost=function(e){t.host=e||t.host,t.hostIndex=0,t.creatConnection()},t.creatConnection=function(){t.needReconnect=!0,t.lts=(new Date).getTime(),t.connection=new WebSocket("wss://"+t.host[t.hostIndex]),t.connection.binaryType="arraybuffer",t.turnConfig={};var n=e.proxyServerType;if(t.connection.url&&3!==n){var r=t.connection.url.match(/wss\:\/\/([^:]+):(\d+)/),i=t.host[t.hostIndex].split(":"),o=t.connection.url.match(/h=([^:]+)&p=(\d+)/);r?(t.turnConfig.url=r[1],Object(y.getParameter)("TURN_ENABLE_TCP")&&(t.turnConfig.tcpport=parseInt(r[2])+30),Object(y.getParameter)("TURN_ENABLE_UDP")&&(t.turnConfig.udpport=parseInt(r[2])+30)):o?(t.turnConfig.url=o[1],Object(y.getParameter)("TURN_ENABLE_TCP")&&(t.turnConfig.tcpport=parseInt(o[2])+30),Object(y.getParameter)("TURN_ENABLE_UDP")&&(t.turnConfig.udpport=parseInt(o[2])+30)):i&&(t.turnConfig.url=i[0],Object(y.getParameter)("TURN_ENABLE_TCP")&&(t.turnConfig.tcpport=parseInt(i[1])+30),Object(y.getParameter)("TURN_ENABLE_UDP")&&(t.turnConfig.udpport=parseInt(i[1])+30))}t.connection.onopen=function(e){t.needReconnect=!0,t.isTimeout=!1,t.isInit=!1,t.sendbytes=0,t.recvbytes=0,t.startTime=Date.now(),Object(_.resetHTTPByetsCount)(),clearTimeout(t.timeoutCheck),t.dispatchEvent(Object(m.d)({type:"onopen",event:e,socket:t}))},t.connection.onmessage=function(e){if(e.data instanceof ArrayBuffer)t.dispatchEvent({type:"onBinaryData",data:e.data});else{t.recvbytes+=Object(S.lengthInUtf8Bytes)(e.data);var n=JSON.parse(e.data);t.lastMsgTime=Date.now(),n.hasOwnProperty("_id")?t.dispatchEvent(Object(m.d)({type:n._id,msg:n})):n.hasOwnProperty("_type")&&t.dispatchSocketEvent(Object(m.d)({type:n._type,msg:n._message}))}},t.connection.onclose=function(n){t.needReconnect?t.isTimeout||t.isInit?(v.default.debug("["+t.clientId+"] websockect connect timeout"),E.report.joinGateway(e.sid,{lts:t.lts,succ:!1,ec:"timeout",addr:t.connection.url}),t.connectNext()):(t.dispatchEvent(Object(m.d)({type:"disconnect",event:n})),t.requests&&t.requests instanceof Array&&(t.requests.map((function(e){e.callback("REQUEST_ABORT")})),t.requests=[])):(v.default.debug("["+t.clientId+"] websockect closeed"),h(e.onFailure,n),clearTimeout(t.timeoutCheck),t.dispatchEvent(Object(m.d)({type:"close",event:n})),t.connection.onopen=void 0,t.connection.onclose=void 0,t.connection.onerror=void 0,t.connection.onmessage=void 0,t.connection=void 0)},t.connection.onerror=function(e){};setTimeout((function(){t.connection&&t.connection.readyState!=WebSocket.OPEN&&(t.isTimeout=!0,t.connection.close())}),5e3)},t.creatConnection(),t.sendMessage=function(e,n){if(t.connection&&t.connection.readyState==WebSocket.OPEN){var r=JSON.stringify(e);t.sendbytes+=Object(S.lengthInUtf8Bytes)(r),t.connection.send(r)}else n({error:"Gateway not connected"})},t.disconnect=function(){t.needReconnect=!0,t.connection.close()},t.close=function(){t.needReconnect=!1,t.connection.onclose=void 0,t.connection.close(),clearInterval(t.requestTimer),t.requests&&t.requests instanceof Array&&(t.requests.map((function(e){e.callback("REQUEST_ABORT")})),t.requests=[])},t.sendSignalCommand=function(e,n){e._id="_request_"+t.requestID,t.requestID+=1,"publish_stats"!==e._type&&"subscribe_stats"!==e._type&&"publish_stats_low"!==e._type&&t.on(e._id,(function(r){r.msg&&n&&n(r.msg._result,r.msg.message),delete t.dispatcher.eventListeners[e._id]})),t.sendMessage(e,(function(e){e.reason="NOT_CONNECTED",n&&n(e.reason,e)}))},t.requests=[];var n=function(e){var n=t.requests.findIndex((function(t){return t.id===e.type}));if(n>=0)var r=t.requests.splice(n,1)[0];r&&t.dispatcher.eventListeners[e.type]?(delete t.dispatcher.eventListeners[e.type],e.msg&&r.callback&&r.callback(e.msg._result,e.msg._message)):v.default.warning("Detached Response",e.type,e.msg)},r=function(e){var n=this,r=t.requests.findIndex((function(e){return e.id===n.id}));r>=0&&(n=t.requests.splice(r,1)[0]),n&&t.dispatcher.eventListeners[e.type]?(delete t.dispatcher.eventListeners[e.type],e.reason="NOT_CONNECTED",n.callback&&n.callback(e.reason,e)):v.default.warning("handleSendError",n)};return t.sendRequest=function(e,i){e=f()({_id:"_request_"+t.requestID},e),t.requestID+=1;var o={id:e._id,timeoutCounter:0,stalledAt:Date.now(),message:e,callback:i};t.requests.push(o),t.addEventListener(e._id,n),t.sendMessage(e,r.bind(o))},t.checkRequestTimeout=function(){for(var e=Math.ceil(Object(y.getParameter)("SIGNAL_REQUEST_TIMEOUT")/Object(y.getParameter)("SIGNAL_REQUEST_WATCH_INTERVAL")),n=t.requests.length-1;n>=0;n--){var r=t.requests[n];r.timeoutCounter>=e?(t.requests.splice(n,1),v.default.error("Request Timeout",r.timeoutCounter,r.message),r.callback&&r.callback("TIMEOUT")):r.timeoutCounter++}},clearInterval(t.requestTimer),t.requestTimer=setInterval(t.checkRequestTimeout,Object(y.getParameter)("SIGNAL_REQUEST_WATCH_INTERVAL")),t.sendReport=function(e){t.sendMessage(e,(function(){}))},t},T=function(e,t){var n={connect:function(){t.host=e,n.signal=R(t),n.on=n.signal.on,n.dispatchEvent=n.signal.dispatchEvent,n.signal.on("onopen",(function(e){n.signal.onEvent=function(e){n.dispatchEvent(Object(m.d)({type:e.event,msg:e}))},n.dispatchEvent(Object(m.d)({type:"connect",msg:e}))})),n.signal.on("onError",(function(e){var t=e.msg;onError(t.code,"error")}))},getLastMsgTime:function(){return n.signal&&n.signal.lastMsgTime},getSendBytes:function(){return n.signal.getSendBytes()},getRecvBytes:function(){return n.signal.getRecvBytes()},getDuration:function(){return n.signal.getDuration()},disconnect:function(){n.signal.disconnect()},close:function(){n.signal.close()},getURL:function(){return n.signal.getURL()},reconnect:function(){n.signal.reconnect()},connectNext:function(){n.signal.connectNext()},replaceHost:function(e){n.signal.replaceHost(e)},emitSimpleMessage:function(e,t){n.signal.sendSignalCommand(e,t)},emitRequest:function(e,t){n.signal.sendRequest(e,t)},emitReport:function(e){n.signal.sendReport(e)}};return n.connect(),n},I=r(23),b=r(5),A=r(20),O=r(4),C={ERR_NO_VOCS_AVAILABLE:"tryNext",ERR_NO_VOS_AVAILABLE:"tryNext",ERR_JOIN_CHANNEL_TIMEOUT:"tryNext",WARN_REPEAT_JOIN:"quit",ERR_JOIN_BY_MULTI_IP:"recover",WARN_LOOKUP_CHANNEL_TIMEOUT:"tryNext",WARN_OPEN_CHANNEL_TIMEOUT:"tryNext",ERR_VOM_SERVICE_UNAVAILABLE:"tryNext",ERR_TOO_MANY_USERS:"tryNext",ERR_MASTER_VOCS_UNAVAILABLE:"tryNext",ERR_INTERNAL_ERROR:"tryNext",K_SERVICE_NOT_READY:"tryNext",K_SERVICE_TOO_HEAVY:"tryNext",notification_test_recover:"recover",notification_test_tryNext:"tryNext",notification_test_retry:"retry"},N={googActualEncBitrate:"A_aeb",googAvailableSendBandwidth:"A_asb",googRetransmitBitrate:"A_rb",googAvailableReceiveBandwidth:"A_arb",googTargetEncBitrate:"A_teb",googBucketDelay:"A_bd",googTransmitBitrate:"A_tb",googCodecName:"A_cn",bytesSent:"bytesSent",packetsLost:"packetsLost",packetsSent:"packetsSent",googAdaptationChanges:"A_ac",googAvgEncodeMs:"A_aem",googEncodeUsagePercent:"A_eup",googFirsReceived:"A_fr",googFrameHeightInput:"A_fhi",googFrameHeightSent:"A_fhs",googFrameRateInput:"A_fri",googFrameRateSent:"A_frs",googFrameWidthInput:"A_fwi",googFrameWidthSent:"A_fws",googNacksReceived:"A_nr",googPlisReceived:"A_pr",googRtt:"A_rtt",aecDivergentFilterFraction:"A_adff",audioInputLevel:"A_ail",googEchoCancellationReturnLoss:"A_ecrl",googEchoCancellationReturnLossEnhancement:"A_ecrle",googResidualEchoLikelihood:"A_rel",googResidualEchoLikelihoodRecentMax:"A_relrm",googTargetDelayMs:"A_tdm",bytesReceived:"bytesReceived",packetsReceived:"packetsReceived",googDecodeMs:"A_dm",googMaxDecodeMs:"A_mdm",googRenderDelayMs:"A_rdm",googFrameWidthReceived:"A_fwr",googFrameHeightReceived:"A_fhr",googFrameRateReceived:"A_frr",googFrameRateDecoded:"A_frd",googFrameRateOutput:"A_fro",googJitterBufferMs:"A_jbm",googCurrentDelayMs:"A_cdm",googMinPlayoutDelayMs:"A_mpdm",googNacksSent:"A_ns",googPlisSent:"A_ps",googFirsSent:"A_fs",audioOutputLevel:"A_aol",googAccelerateRate:"A_ar",googDecodingCNG:"A_dcng",googDecodingCTN:"A_dctn",googDecodingCTSG:"A_dctsg",googDecodingNormal:"A_dn",googDecodingPLC:"A_dplc",googDecodingPLCCNG:"A_dplccng",googExpandRate:"A_er",googJitterReceived:"A_jr",googPreemptiveExpandRate:"A_per",googPreferredJitterBufferMs:"A_pjbm",googSecondaryDecodedRate:"A_sdr",googSpeechExpandRate:"A_ser",uplink_fraction_lost:"B_ufl",uplink_cumulative_lost:"B_ucl",uplink_available_bandwidth:"B_uab",period_fir:"B_fir",access_delay:"B_acd",uplink_network_quality:"B_unq",downlink_network_quality:"B_dnq",pub_audio_lost_ratio_400ms:"B_palr4",pub_video_lost_ratio_400ms:"B_pvlr4",e2e_delay:"B_ed",audio_delay:"B_ad",video_delay:"B_vd",stream_type:"B_st",e2e_audio_lost_ratio_400ms:"B_ealr4",e2e_video_lost_ratio_400ms:"B_evlr4",downlink_estimate_bandwidth:"B_deb",peer_publish_audio_duration:"B_ppad",peer_publish_video_duration:"B_ppvd"},w={};for(var L in N){var D=N[L];w[D]&&v.default.error("Key Conflict: ".concat(D,": ").concat(N[D],"| ").concat(L)),w[D]=L}var k=function(e){return N[e]||e},M=function(e){return w[e]||e};var P=r(9),U=r.n(P),x=r(51),j=function t(n){var r=!1,i=function(e){return{_type:"control",_message:e}},a=function(e,t){var n={};return Object.keys(t).forEach((function(e){Object(y.getParameter)("STATS_FILTER")[e]||(n[k(e)]=t[e])})),{_type:"subscribe_related_stats",_message:{stream_type:"high",stream_id:e,stats:n}}},c=function(e){return{_type:"publish",_message:e}},u=function(e,t){var n={};return Object.keys(t).forEach((function(e){Object(y.getParameter)("STATS_FILTER")[e]||(n[k(e)]=t[e])})),{_type:"subscribe_stats",_message:{stream_id:e,stats:n}}},p=t.DISCONNECTED,_=t.CONNECTING,R=t.CONNECTED,N=t.DISCONNECTING,w=p,L=Object(m.b)(n);Object.defineProperty(L,"state",{set:function(e){var n=w;w=e,Object(A._setClientConnectionStateRecord)(L.clientId,e),e!==t.CONNECTED&&e!==t.DISCONNECTING&&(L.hasJoined=!1),n!==e&&L.dispatchEvent({type:"connection-state-change",prevState:t.connetionStateMap[n],curState:t.connetionStateMap[e]})},get:function(){return w}}),L.socket=void 0,L.state=p,L.mode=n.mode,L.role=n.role,L.codec=n.codec,L.config={},L.timers={},L.timer_counter={},L.localStreams={},L.remoteStreams={},L.remoteMuteState={},L.attemps=1,L.p2p_attemps=1,L.audioLevel={},L.activeSpeaker=void 0,L.reconnectMode="tryNext",L.rejoinAttempt=0,L.hasChangeBGPAddress=!1,L.traffic_stats={},L.clientId=n.clientId,L.pingpongCounter=0,L.hasInvokeLeave=!1,L.p2ps=new Map,L.liveStreams=new Map,L.injectLiveStreams=new Map,L.remoteStreamsInChannel=new Set,L.subscribeRequestId=new Map,L.publishRequestId=0,L.hasJoined=!1,L.isFirstSuccess=!0,L.peerPublishDurationMap=new Map,function(e){var t=h;e.makeRequest=function(n,r,i){if(void 0===e.socket)return v.default.debug("[".concat(e.clientId,"] No socket available")),void t(i,b.default.INVALID_OPERATION);try{e.socket.emitRequest(n,(function(e,t){var n;"success"===e?"function"==typeof r&&r(t):"function"==typeof i&&(n=t&&t.error_code&&b.GatewayErrorCode[t.error_code]?b.GatewayErrorCode[t.error_code]:t&&t.error_str?t.error_str:t&&t.error_code?"UNKNOW_ERROR_".concat(t.error_code):e,i(n,t))}))}catch(r){v.default.debug("[".concat(e.clientId,"] Socket emit message failed ").concat(JSON.stringify(n))),v.default.debug("[".concat(e.clientId,"] "),r),t(i,b.default.SOCKET_ERROR)}},e.makeReport=function(t){void 0===e.socket&&v.default.debug("[".concat(e.clientId,"] No socket available"));try{e.socket.emitReport(t)}catch(n){v.default.debug("[".concat(e.clientId,"] Socket emit report failed ").concat(JSON.stringify(t)))}}}(L),L.inChannelInfo={joinAt:null,duration:0},L._sendMessage=function(e,t){switch(e){case"SubscribeStats":L.makeReport(u.apply(void 0,l()(t)));break;case"SubscribeRelatedStats":L.makeReport(a.apply(void 0,l()(t)))}};var D=h;L.p2pCounter=Object(S.random)(1e5),L.generateP2PId=function(){return++L.p2pCounter},L.audioVolumeIndication={enabled:!1,sortedAudioVolumes:[],smooth:3,interval:2e3},L.remoteVideoStreamTypes={REMOTE_VIDEO_STREAM_HIGH:0,REMOTE_VIDEO_STREAM_LOW:1,REMOTE_VIDEO_STREAM_MEDIUM:2},L.streamFallbackTypes={STREAM_FALLBACK_OPTION_DISABLED:0,STREAM_FALLBACK_OPTION_VIDEO_STREAM_LOW:1,STREAM_FALLBACK_OPTION_AUDIO_ONLY:2},L.configPublisher=function(e){L.config=e},L.getGatewayInfo=function(e,t){L.makeRequest({_type:"gateway_info"},e,t)},L.setClientRole=function(e,t){v.default.debug("[".concat(L.clientId,"] setClientRole to ").concat(e));var n=E.report.reportApiInvoke(L.joinInfo.sid,{name:"_setClientRole",callback:t});L.makeRequest({_type:"set_client_role",_message:{role:e}},(function(){L.role=e,L.dispatchEvent({type:"client-role-changed",role:e}),n&&n(null,{role:e})}),(function(t,r){if(r&&r.code&&(t=b.GatewayErrorCode[r.code]||"UNKNOW_ERROR_"+r.code),"ERR_SET_CLIENT_ROLE_ALREADY_IN_USE"===t)return n&&n(null);v.default.error("set Client role error to "+e+": "+t),n&&n(t)}))},L.join=function(e,t,r,i){L.hasInvokeLeave=!1,e.useProxyServer&&(L.hasChangeBGPAddress=!0);var o=(new Date).getTime(),a=e.uid;if(L.inChannelInfo.joinAt&&(L.inChannelInfo.duration+=o-L.inChannelInfo.joinAt),L.inChannelInfo.joinAt=o,L.state!==_)return v.default.error("[".concat(L.clientId,"] GatewayClient.join Failed: state "),L.state),i&&i(b.default.INVALID_OPERATION),void E.report.joinGateway(e.sid,{lts:o,succ:!1,ec:b.default.INVALID_OPERATION,addr:null});if(null!=a&&parseInt(a)!==a)return v.default.error("[".concat(L.clientId,"] Input uid is invalid")),L.state=p,i&&i(b.default.INVALID_PARAMETER),void E.report.joinGateway(e.sid,{lts:o,succ:!1,ec:b.default.INVALID_PARAMETER,addr:null});var s=V.register(L,{uid:a,cname:e&&e.cname});if(s)return L.state=p,i&&i(s),void E.report.joinGateway(e.sid,{lts:o,succ:!1,ec:s,addr:null});L.joinInfo=f()({},e),L.uid=a,L.key=t,L.pingpongCounter=0,W(e,(function(t){if(e.useLocalAccessPoint)try{var s=L.socket.signal.connection.url.match(/wss\:\/\/([^:]+):(\d+)/)[1];Object(y.setParameter)("EVENT_REPORT_DOMAIN",s),Object(y.setParameter)("EVENT_REPORT_BACKUP_DOMAIN",s),Object(y.setParameter)("LOG_UPLOAD_SERVER","".concat(s,":6444"))}catch(e){v.default.debug("[".concat(L.clientId,"] LocalAccessPoint error: ").concat(e))}if(L.state===N||L.state===p)return i&&i("LEAVE_BEFORE_JOIN_SUCCESS");L.state=R,v.default.debug("[".concat(L.clientId,"] Connected to gateway server")),clearInterval(L.pingTimer),L.pingTimer=setInterval((function(){var e=Object(y.getParameter)("PING_PONG_TIME_OUT");if(++L.pingpongCounter>=e){var t=Date.now();L.socket&&v.default.warning("PINGPONG Timeout. Last Socket Message: ".concat(t-L.socket.getLastMsgTime(),"ms")),L.socket&&L.socket.getLastMsgTime()&&t-L.socket.getLastMsgTime()>Object(y.getParameter)("WEBSOCKET_TIMEOUT_MIN")&&(L.pingpongCounter=0,L.socket.close(),L.socket.dispatchEvent(Object(m.d)({type:"disconnect",event:{msg:"PING_PONG_TIME_OUT"}})))}var n=Date.now();L.makeRequest({_type:"ping"},(function(){L.pingpongCounter=0;var e=Date.now()-n;setTimeout((function(){Object(y.getParameter)("REPORT_STATS")&&L.makeRequest({_type:"ping_back",_message:{pingpongElapse:e}})}),1e3)}),(function(e,t){"TIMEOUT"!==e&&(v.default.error("Ping Error ".concat(e," ").concat(JSON.stringify(t))),t&&t.error_code&&L.socket&&L.socket.signal&&L.socket.signal.connection&&L.socket.signal.connection.readyState===WebSocket.OPEN&&(v.default.info("Disconnecting websocket connection"),L.socket.signal.connection.close()))}))}),3e3),L.makeRequest(function(e){var t=e.role,r=f()({},L.joinInfo.apResponse),i={session_id:L.joinInfo.sid,app_id:n.appId,channel_key:L.key,channel_name:L.joinInfo.cname,sdk_version:y.VERSION,browser:navigator.userAgent,process_id:Object(E.getProcessId)(),mode:L.mode,codec:L.codec,role:t,has_changed_gateway:Object(y.getParameter)("FORCE_CHANGED_GATEWAY_FLAG")||L.hasChangeBGPAddress,ap_response:r,optionalInfo:L.joinInfo.optionalInfo,extend:Object(y.getParameter)("JOIN_EXTEND"),details:{}};if(L.joinInfo.hasOwnProperty("stringUid")&&(i.string_uid=L.joinInfo.stringUid),L.joinInfo.aesmode&&L.joinInfo.aespassword&&(i.aes_mode=L.joinInfo.aesmode,i.aes_secret=Object(x.encryptAES)(L.joinInfo.aespassword,L.joinInfo.uid),i.aes_encrypt=!0),L.socket&&L.socket.signal&&L.socket.signal&&(r.addresses[L.socket.signal.hostIndex]&&(i.ap_response.ticket=r.addresses[L.socket.signal.hostIndex].ticket,delete r.addresses),Object(y.getParameter)("SET_DEFAULT_TURNSERVER")&&L.socket.signal.turnConfig)){var o={username:"test",credential:Object(y.getParameter)("TURN_SERVER_PASSWORD"),forceturn:Object(y.getParameter)("FORCE_TURN")};o.url=L.socket.signal.turnConfig.url,L.socket.signal.turnConfig.tcpport&&(o.tcpport=""+L.socket.signal.turnConfig.tcpport),L.socket.signal.turnConfig.udpport&&(o.udpport=""+L.socket.signal.turnConfig.udpport),!!L.joinInfo.turnServers.find((function(e){if(e.url===o.url)return!0}))||L.joinInfo.turnServers.push(o)}return 3===L.joinInfo.proxyServerType&&(i.plugin="web_cloud_proxy"),L.dispatchEvent({type:"join-message-hook",joinMessage:i}),{_type:"join",_message:i}}({role:L.role}),(function(t){if(E.report.joinGateway(e.sid,{lts:o,succ:!0,ec:null,vid:e.vid,addr:L.socket.getURL(),firstSuccess:L.isFirstSuccess}),L.joinSuccessLts=Date.now(),L.isFirstSuccess=!1,L.rejoinAttempt=0,L.hasJoined=!0,r&&r(t.uid),!0===t.return_vosip||!0===Object(y.getParameter)("ENABLE_LIVE_SERVER_LIST")){var n=null;try{n=L.socket.signal.connection.url}catch(e){v.default.debug("[".concat(L.clientId,"] Can not get gateway ip: ").concat(e))}n?Object(y.setParameter)("LIVE_SERVER_LIST",[n]):Object(y.setParameter)("LIVE_SERVER_LIST",[])}L.dispatchEvent({type:"join"}),clearInterval(L.timers.trafficStats),L.timers.trafficStats=setInterval((function(){L.makeRequest({_type:"traffic_stats"},(function(e){var t={};for(var n in e)t[M(n)]=e[n];if(t.peer_delay&&t.peer_delay.length){var r=[];t.peer_delay.forEach((function(e){var t={};for(var n in e)t[M(n)]=e[n];r.push(t)})),t.peer_delay=r}L.traffic_stats=t,L.traffic_stats.timestamp=Date.now();var i=L.joinInfo.stringUid,o=L.localStreams[a]||L.localStreams[i];o&&(o.traffic_stats={access_delay:t.access_delay}),t.peer_delay&&t.peer_delay.forEach((function(e){var n=L.remoteStreams[e.peer_uid];n&&(n.traffic_stats={access_delay:t.access_delay,e2e_delay:e.e2e_delay,audio_delay:e.audio_delay,video_delay:e.video_delay})})),L.dispatchEvent({type:"after-getTrafficStats",trafficStats:t})}))}),3e3)}),(function(t,n){if(v.default.error("[".concat(L.clientId,"] User join failed [").concat(t,"]")),"ERR_JOIN_BY_MULTI_IP"===t){try{E.report.joinGateway(e.sid,{lts:o,succ:!1,ec:"ERR_JOIN_BY_MULTI_IP",addr:L.socket.getURL()})}catch(e){}return L.dispatchEvent({type:"onMultiIP",option:n.option})}C[t]&&L.rejoinAttempt<4?L._doWithAction(C[t],r,i):i&&i(t),E.report.joinGateway(e.sid,{lts:o,succ:!1,ec:t,addr:L.socket&&L.socket.getURL()})}))}),(function(t){v.default.error("[".concat(L.clientId,"] User join failed [").concat(t,"]")),i&&i(t),E.report.joinGateway(e.sid,{lts:o,succ:!1,ec:t,addr:L.socket.getURL()})})),this.remoteMuteState={},L.resetAudioVolumeIndication()},L.leave=function(e,t){var n=V.unregister(L);switch(n&&v.default.debug("[".concat(L.clientId,"] "),n),L.p2ps.clear(),L.state){case p:return v.default.debug("[".concat(L.clientId,"] Client Already in DISCONNECTED status")),void D(e);case N:return v.default.debug("[".concat(L.clientId,"] Client Already in DISCONNECTING status")),void D(t,b.default.INVALID_OPERATION);case _:return L.socket&&L.socket.close(),L.socket=void 0,v.default.info("[".concat(L.clientId,"] Client connecting, Leave channel success")),L.state=p,e&&e()}for(var r in L.state=N,L.channelMediaConfig&&(L.channelMediaRelayController&&L.channelMediaRelayController.dispose(),L.channelMediaConfig,L.channelMediaRelayController=null),clearInterval(L.pingTimer),L.timers)L.timers.hasOwnProperty(r)&&clearInterval(L.timers[r]);for(var r in L.inChannelInfo.joinAt&&(L.inChannelInfo.duration+=Date.now()-L.inChannelInfo.joinAt,L.inChannelInfo.joinAt=null),L.hasJoined?L.makeRequest({_type:"leave"},(function(t){L.socket.close(),L.socket=void 0,v.default.info("[".concat(L.clientId,"] Leave channel success")),L.state=p,e&&e(t)}),(function(e){"TIMEOUT"!==e&&"REQUEST_ABORT"!==e&&(v.default.error("[".concat(L.clientId,"] Leave Channel Failed"),e),L.state=R,t&&t(e))})):(L.socket&&(L.socket.close(),L.socket=void 0),v.default.info("[".concat(L.clientId,"] Leave channel before joined")),L.state=p,e&&e()),L.localStreams)if(L.localStreams.hasOwnProperty(r)){var i=L.localStreams[r];delete L.localStreams[r],void 0!==i.pc&&(i.pc.close(),i.pc=void 0)}q()},L.publish=function(e,t,n,r){var o=(new Date).getTime(),a=!1;if(e.publishLTS=o,"object"!==d()(e)||null===e)return v.default.error("[".concat(L.clientId,"] Invalid local stream")),r&&r(b.default.INVALID_LOCAL_STREAM),void E.report.publish(L.joinInfo.sid,{lts:o,succ:!1,audio:!1,video:!1,screenshare:!1,audioName:"",videoName:"",screenName:"",ec:b.default.INVALID_LOCAL_STREAM});if(!e.stream&&void 0===e.url)return v.default.error("[".concat(L.clientId,"] Invalid local media stream")),r&&r(b.default.INVALID_LOCAL_STREAM),void E.report.publish(L.joinInfo.sid,{lts:o,succ:!1,audio:!1,video:!1,screenshare:!1,audioName:"",videoName:"",screenName:"",ec:b.default.INVALID_LOCAL_STREAM});if(L.state!==R)return v.default.error("[".concat(L.clientId,"] User is not in the session")),r&&r(b.default.INVALID_OPERATION),void E.report.publish(L.joinInfo.sid,{lts:o,succ:!1,audio:e.hasAudio(),video:e.hasVideo(),screenshare:e.hasScreen(),audioName:e.hasAudio()&&e.audioName,videoName:e.hasVideo()&&e.videoName,screenName:e.hasScreen()&&e.screenName,ec:b.default.INVALID_OPERATION});var s=e.getAttributes()||{};if(e.local&&void 0===L.localStreams[e.getId()]&&(e.hasAudio()||e.hasVideo()||e.hasScreen())){var u=L.generateP2PId();if(L.p2ps.set(u,e),e.p2pId=u,void 0!==e.url)G(c({state:"url",audio:e.hasAudio(),video:e.hasVideo(),attributes:e.getAttributes()},e.url),(function(t,n){"success"===t?(e.getUserId()!==n&&e.setUserId(n),L.localStreams[n]=e,e.onClose=function(){L.unpublish(e)}):v.default.error("[".concat(L.clientId,"] Publish local stream failed"),t)}));else{L.localStreams[e.getId()]=e,e.connectionSpec={callback:function(s){s||r&&r("CANNOT_GET_OFFER"),"motion"===e.optimizationMode&&e.pc.setRtpSenderParameters("maintain-framerate"),"detail"===e.optimizationMode&&e.pc.setRtpSenderParameters("maintain-resolution"),L.makeRequest(c({state:"offer",stream_type:1==t.streamType?"low":"high",p2p_id:u,sdp:s,audio:e.audio||e.screenAudio,video:e.screen||e.video,screen:e.screen,attributes:e.getAttributes(),dtx:e.DTX,hq:e.highQuality,lq:e.lowQuality,stereo:e.stereo,speech:e.speech,codec:L.codec,extend:Object(y.getParameter)("PUB_EXTEND")}),(function(t){e.getUserId()!==t.uid&&e.setUserId(t.uid),v.default.info("[".concat(L.clientId,"] Local stream published with uid"),t.uid),e.onClose=function(){L.unpublish(e)},e._onAudioUnmute=function(){L.makeReport(i({action:"unmute_local_audio",stream_id:e.getId()}))},e._onVideoUnmute=function(){L.makeReport(i({action:"unmute_local_video",stream_id:e.getId()}))},e._onAudioMute=function(){L.makeReport(i({action:"mute_local_audio",stream_id:e.getId()}))},e._onVideoMute=function(){L.makeReport(i({action:"mute_local_video",stream_id:e.getId()}))},e.getId()===e.getUserId()&&(e.isAudioOn()||e.hasAudio()&&(v.default.debug("[".concat(L.clientId,"] local stream audio mute")),e._onAudioMute()),e.isVideoOn()||(e.hasVideo()||e.hasScreen())&&(v.default.debug("[".concat(L.clientId,"] local stream video mute")),e._onVideoMute())),e.pc.oniceconnectionstatechange=function(t){if("failed"===t){if(null!=L.timers[e.getId()]&&(clearInterval(L.timers[e.getId()]),clearInterval(L.timers[e.getId()]+"_RelatedStats")),v.default.error("[".concat(L.clientId,"] Publisher connection is lost -- streamId: ").concat(e.getId(),", p2pId: ").concat(u)),L.p2ps.delete(u),v.default.debug("[".concat(L.clientId,"] publish p2p failed: "),L.p2ps),!a)return a=!0,E.report.publish(L.joinInfo.sid,{lts:o,succ:!1,audio:e.hasAudio(),video:e.hasVideo(),screenshare:e.hasScreen(),audioName:e.hasAudio()&&e.audioName,videoName:e.hasVideo()&&e.videoName,screenName:e.hasScreen()&&e.screenName,ec:b.default.PEERCONNECTION_FAILED,publishRequestid:L.publishRequestId||0,p2pid:u}),L.dispatchEvent(Object(m.a)({type:"pubP2PLost",stream:e})),r&&r(b.default.PEERCONNECTION_FAILED);L.dispatchEvent(Object(m.a)({type:"pubP2PLost",stream:e}))}else if("connected"===t&&(v.default.debug("[".concat(L.clientId,"] publish p2p connected: "),L.p2ps),e.getId()===e.getUserId()&&(e._isAudioMuted()?L.makeReport(i({action:"mute_local_audio",stream_id:e.getId()})):L.makeReport(i({action:"unmute_local_audio",stream_id:e.getId()})),e._isVideoMuted()?L.makeReport(i({action:"mute_local_video",stream_id:e.getId()})):L.makeReport(i({action:"unmute_local_video",stream_id:e.getId()}))),!a))return a=!0,E.report.publish(L.joinInfo.sid,{lts:o,succ:!0,audio:e.hasAudio(),video:e.hasVideo(),screenshare:e.hasScreen(),audioName:e.hasAudio()&&e.audioName,videoName:e.hasVideo()&&e.videoName,screenName:e.hasScreen()&&e.screenName,ec:null,publishRequestid:L.publishRequestId||0,p2pid:u}),n&&n()},e.pc.processSignalingMessage(t.sdp)}),(function(t,n){v.default.error("Publish Failed: ".concat(t)),E.report.publish(L.joinInfo.sid,{lts:o,succ:!1,audio:e.hasAudio(),video:e.hasVideo(),screenshare:e.hasScreen(),audioName:e.hasAudio()&&e.audioName,videoName:e.hasVideo()&&e.videoName,screenName:e.hasScreen()&&e.screenName,ec:t,publishRequestid:L.publishRequestId||0,p2pid:u}),"TIMEOUT"!=t&&(L.processPublishFailure(e),r&&r(t))}))},audio:e.hasAudio(),video:e.hasVideo(),screen:e.hasScreen(),optimizationMode:e.optimizationMode,isSubscriber:!1,stunServerUrl:L.stunServerUrl,turnServers:L.joinInfo.turnServers,maxAudioBW:s.maxAudioBW,minVideoBW:s.minVideoBW,maxVideoBW:s.maxVideoBW,mode:L.mode,codec:L.codec,isVideoMute:e.userMuteVideo||e.peerMuteVideo,isAudioMute:e.userMuteAudio||e.peerMuteAudio,maxFrameRate:e.attributes.maxFrameRate,agoraStream:e,clientId:L.clientId},e.pc=Object(I.a)(e.connectionSpec),e.pc.addStream(e.stream),v.default.debug("[".concat(L.clientId,"] PeerConnection add stream :"),e.stream),e.pc.onnegotiationneeded=function(n){"motion"===e.optimizationMode&&e.pc.setRtpSenderParameters("maintain-framerate"),"detail"===e.optimizationMode&&e.pc.setRtpSenderParameters("maintain-resolution");var r={state:"negotiation",stream_type:1===t.streamType?"low":"high",p2p_id:u,sdp:n};L.makeRequest(c(r),(function(t){v.default.debug("Negotating Stream ".concat(e.getId())),e.pc.processSignalingMessage(t.sdp)}),(function(e,t){v.default.error("Negotiation failed ".concat(e),t,r)}))},clearInterval(L.timers[e.getId()]),L.timers[e.getId()]=setInterval((function(){if(Object(y.getParameter)("REPORT_STATS")){var t=0;e&&e.pc&&e.pc.getStats&&e.pc.getStatsRate((function(n){n.forEach((function(n){if(n&&n.id&&!(/_recv$/.test(n.id)||/^time$/.test(n.id)||~n.type.toLowerCase().indexOf("inbound"))&&e.getUserId()){if(-1===n.id.indexOf("outbound_rtp")&&-1===n.id.indexOf("OutboundRTP")&&-1===n.type.toLowerCase().indexOf("outbound")||"video"!==n.mediaType||(n.googFrameWidthSent=e.videoWidth+"",n.googFrameHeightSent=e.videoHeight+""),"video"===n.mediaType)try{var r=e.stream.getVideoTracks()[0];n.A_vstd=r.enabled?"0":"1"}catch(e){}if("audio"===n.mediaType)try{var i=e.stream.getAudioTracks()[0];n.A_astd=i.enabled?"0":"1"}catch(e){}if(e.getId()==e.getUserId()){var o=200*t;t++,setTimeout((function(){var e=L.socket&&L.socket.getLastMsgTime()&&Date.now()-L.socket.getLastMsgTime();e>Object(y.getParameter)("REPORT_STATS_TIMEOUT")?v.default.debug("PublishStats report blocked by REPORT_STATS_TIMEOUT ".concat(e)):L.makeReport(function(e){var t={};return Object.keys(e).forEach((function(n){Object(y.getParameter)("STATS_FILTER")[n]||(t[k(n)]=e[n])})),{_type:"publish_stats",_message:{stream_type:"high",stats:t}}}(n))}),o)}else{o=200*t;t++,setTimeout((function(){var e=L.socket&&L.socket.getLastMsgTime()&&Date.now()-L.socket.getLastMsgTime();e>Object(y.getParameter)("REPORT_STATS_TIMEOUT")?v.default.debug("PublishStatsLow report blocked by REPORT_STATS_TIMEOUT ".concat(e)):L.makeReport(function(e){var t={};return Object.keys(e).forEach((function(n){Object(y.getParameter)("STATS_FILTER")[n]||(t[k(n)]=e[n])})),{_type:"publish_stats",_message:{stream_type:"low",stats:t}}}(n))}),o)}}}))}))}}),3e3);var l=function(){Object(y.getParameter)("REPORT_STATS")&&e&&e.pc&&e.pc.getVideoRelatedStats&&e.pc.getVideoRelatedStats((function(t){var n,r,i=L.socket&&L.socket.getLastMsgTime()&&Date.now()-L.socket.getLastMsgTime();i>Object(y.getParameter)("REPORT_STATS_TIMEOUT")?v.default.debug("PublishRelatedStats report blocked by REPORT_STATS_TIMEOUT ".concat(i)):e.getId()===e.getUserId()?L.makeReport((n=t,r={},Object.keys(n).forEach((function(e){Object(y.getParameter)("STATS_FILTER")[e]||(r[k(e)]=n[e])})),{_type:"publish_related_stats",_message:{stream_type:"high",stats:r}})):L.makeReport(function(e){var t={};return Object.keys(e).forEach((function(n){Object(y.getParameter)("STATS_FILTER")[n]||(t[k(n)]=e[n])})),{_type:"publish_related_stats",_message:{stream_type:"low",stats:t}}}(t))}))};l(),clearInterval(L.timers[e.getId()+"_RelatedStats"]),L.timers[e.getId()+"_RelatedStats"]=setInterval(l,1e3)}}},L.unpublish=function(e,t,n,r){if("object"!==d()(e)||null===e)return v.default.error("[".concat(L.clientId,"] Invalid local stream")),void D(r,b.default.INVALID_LOCAL_STREAM);if(L.state!==R)return v.default.error("[".concat(L.clientId,"] User not in the session")),void D(r,b.default.INVALID_OPERATION);if(null!=L.timers[e.getId()]&&(clearInterval(L.timers[e.getId()]),clearInterval(L.timers[e.getId()+"_RelatedStats"])),void 0!==L.socket)if(e.local&&void 0!==L.localStreams[e.getId()]){delete L.localStreams[e.getId()];var i={stream_id:e.getUserId(),stream_type:1===t.streamType?"low":"high"};L.makeRequest({_type:"unpublish",_message:i}),(e.hasAudio()||e.hasVideo()||e.hasScreen())&&void 0===e.url&&void 0!==e.pc&&(e.pc.close(),e.pc=void 0),e.onClose=void 0,e._onAudioMute=void 0,e._onAudioUnute=void 0,e._onVideoMute=void 0,e._onVideoUnmute=void 0,L.p2ps.delete(e.p2pId),n&&n()}else v.default.error("[".concat(L.clientId,"] Invalid local stream")),D(r,b.default.INVALID_LOCAL_STREAM);else v.default.error("[".concat(L.clientId,"] User not in the session")),D(r,b.default.INVALID_OPERATION)},L.subscribe=function(e,t,n){var r=(new Date).getTime();e.subscribeLTS=r;var o=!1;if(v.default.info("[".concat(L.clientId,"] Gatewayclient ").concat(L.uid," Subscribe ").concat(e.getId(),": ").concat(JSON.stringify(e.subscribeOptions))),"object"!==d()(e)||null===e)return v.default.error("[".concat(L.clientId,"] Invalid remote stream")),n&&n(b.default.INVALID_REMOTE_STREAM),void E.report.subscribe(L.joinInfo.sid,{lts:r,succ:!1,video:e.subscribeOptions&&e.subscribeOptions.video,audio:e.subscribeOptions&&e.subscribeOptions.audio,peerid:e.getId(),ec:b.default.INVALID_REMOTE_STREAM});if(L.state!==R&&(v.default.error("[".concat(L.clientId,"] User is not in the session")),!o))return o=!0,E.report.subscribe(L.joinInfo.sid,{lts:r,succ:!1,video:e.subscribeOptions&&e.subscribeOptions.video,audio:e.subscribeOptions&&e.subscribeOptions.audio,peerid:e.getId(),ec:b.default.INVALID_OPERATION}),n&&n(b.default.INVALID_OPERATION);if(!e.local&&L.remoteStreams.hasOwnProperty(e.getId()))if(e.hasAudio()||e.hasVideo()||e.hasScreen()){var s=L.generateP2PId();L.p2ps.set(s,e),e.p2pId=s,e.pc=Object(I.a)({callback:function(t){t||n&&n("CANNOT_GET_OFFER");var i={stream_id:e.getId(),audio:!e.subscribeOptions||e.subscribeOptions.audio,video:!e.subscribeOptions||e.subscribeOptions.video,codec:L.codec,p2p_id:s,sdp:t,tcc:Object(y.getParameter)("SUBSCRIBE_TCC"),extend:Object(y.getParameter)("SUB_EXTEND")};L.makeRequest({_type:"subscribe",_message:i},(function(t){e.pc.processSignalingMessage(t.sdp)}),(function(t,i){v.default.error("[".concat(L.clientId,"] Subscribe remote stream Failed: ").concat(t,", closing stream "),e.getId(),i),E.report.subscribe(L.joinInfo.sid,{lts:r,succ:!1,video:e.subscribeOptions&&e.subscribeOptions.video,audio:e.subscribeOptions&&e.subscribeOptions.audio,peerid:e.getId(),ec:t}),"TIMEOUT"!=t&&(L.processSubscribeFailure(e),n&&n(t))}))},nop2p:!0,audio:!0,video:!0,screen:e.hasScreen(),isSubscriber:!0,stunServerUrl:L.stunServerUrl,turnServers:L.joinInfo.turnServers,isVideoMute:e.userMuteVideo,isAudioMute:e.userMuteAudio,uid:e.getId(),agoraStream:e,clientId:L.clientId}),e.pc.onaddstream=function(t,n){if(e._onAudioUnmute=function(){L.makeReport(i({action:"unmute_remote_audio",stream_id:e.getId()}),(function(){}),(function(){}))},e._onAudioMute=function(){L.makeReport(i({action:"mute_remote_audio",stream_id:e.getId()}),(function(){}),(function(){}))},e._onVideoUnmute=function(){L.makeReport(i({action:"unmute_remote_video",stream_id:e.getId()}),(function(){}),(function(){}))},e._onVideoMute=function(){L.makeReport(i({action:"mute_remote_video",stream_id:e.getId()}),(function(){}),(function(){}))},"ontrack"===n&&"video"===t.track.kind||"onaddstream"===n){v.default.info("[".concat(L.clientId,"] Remote stream subscribed with uid "),e.getId());var r=L.remoteStreams[e.getId()];if(L.remoteStreams[e.getId()].stream="onaddstream"===n?t.stream:t.streams[0],L.remoteStreams[e.getId()].hasVideo()){if(Object(O.isFireFox)()||Object(O.isSafari)()){var o=L.remoteStreams[e.getId()].stream;Object(S.vsResHack)(o,(function(t,n){e.videoWidth=t,e.videoHeight=n}),(function(e){return v.default.warning("[".concat(L.clientId,"] vsResHack failed: ")+e)}))}}else{var a=L.remoteStreams[e.getId()];a.peerMuteVideo=!0,L._adjustPCMuteStatus(a)}r&&r.isPlaying()&&r.elementID&&(v.default.debug("[".concat(L.clientId,"] Reload Player ").concat(r.elementID," StreamId ").concat(r.getId())),e.audioOutput=r.audioOutput,r.stop(),e.play(r.elementID,r.playOptions)),delete e.audioLevelHelper;var s=Object(m.e)({type:"stream-subscribed",stream:L.remoteStreams[e.getId()]});L.dispatchEvent(s)}},clearInterval(L.timers[e.getId()]),L.timers[e.getId()]=setInterval((function(){if(Object(y.getParameter)("REPORT_STATS")){var t=0;e&&e.pc&&e.pc.getStats&&e.pc.getStatsRate((function(n){n.forEach((function(n){if(n&&n.id){if(/_send$/.test(n.id)||/^time$/.test(n.id)||/^bweforvideo$/.test(n.id))return;-1===n.id.indexOf("inbound_rtp")&&-1===n.id.indexOf("inbound-rtp")&&-1===n.type.toLowerCase().indexOf("inbound")||"video"!==n.mediaType||(n.googFrameWidthReceived=e.videoWidth+"",n.googFrameHeightReceived=e.videoHeight+"");var r=200*t;t++;var i=e.getId();setTimeout((function(){var t=L.socket&&L.socket.getLastMsgTime()&&Date.now()-L.socket.getLastMsgTime();if(t>Object(y.getParameter)("REPORT_STATS_TIMEOUT"))v.default.debug("SubscribeStats report blocked by REPORT_STATS_TIMEOUT ".concat(t));else{if("video"===n.mediaType)try{var r=e.stream.getVideoTracks()[0];n.A_vrtd=r.enabled?"0":"1",e.player&&e.player.freezeTimeCounterList.length>0&&(n.A_vrft=e.player.freezeTimeCounterList.splice(0,1)[0].toString())}catch(e){}if("audio"===n.mediaType)try{var o=e.stream.getAudioTracks()[0];n.A_artd=o.enabled?"0":"1"}catch(e){}L.makeReport(u(i,n))}}),r)}else;}))}))}}),3e3),clearInterval(L.timers[e.getId()+"_RelatedStats"]),L.timers[e.getId()+"_RelatedStats"]=setInterval((function(){if(Object(y.getParameter)("REPORT_STATS")&&e&&e.pc){var t=L.socket&&L.socket.getLastMsgTime()&&Date.now()-L.socket.getLastMsgTime();if(t>Object(y.getParameter)("REPORT_STATS_TIMEOUT"))return void v.default.debug("SubscribeRelatedStats report blocked by REPORT_STATS_TIMEOUT ".concat(t));e.pc.getVideoRelatedStats&&e.pc.getVideoRelatedStats((function(t){e.player&&(e.hasVideo()&&!e.peerMuteVideo&&(t.isFreeze=e.player.freezeCount>e.player.lastFreezeCount),e.player.lastFreezeCount=e.player.freezeCount),L.makeReport(a(e.getId(),t))})),e.pc.getAudioRelatedStats&&e.pc.getAudioRelatedStats((function(t){L.makeReport(a(e.getId(),t))}))}}),1e3),L.audioLevel[e.getId()]=0,clearInterval(L.timers[e.getId()+"audio"]),L.timers[e.getId()+"audio"]=setInterval((function(){L.hasListeners("active-speaker")&&e&&e.pc&&"established"===e.pc.state&&e.pc.getStats&&e.pc.getStats((function(t){t.forEach((function(t){if("audio"===t.mediaType){if(t.audioOutputLevel>5e3)for(var n in L.audioLevel[e.getId()]<20&&(L.audioLevel[e.getId()]+=1),L.audioLevel)n!==""+e.getId()&&L.audioLevel[n]>0&&(L.audioLevel[n]-=1);var r=Object.keys(L.audioLevel).sort((function(e,t){return L.audioLevel[t]-L.audioLevel[e]}));if(L.activeSpeaker!==r[0]){var i=Object(m.a)({type:"active-speaker",uid:r[0]});L.dispatchEvent(i),L.activeSpeaker=r[0],v.default.debug("[".concat(L.clientId,"] Update active speaker: ").concat(L.activeSpeaker))}}}))}),50)}),50),e.pc.oniceconnectionstatechange=function(i){if("failed"===i)null!=L.timers[e.getId()]&&(clearInterval(L.timers[e.getId()]),clearInterval(L.timers[e.getId()]+"audio")),v.default.error("[".concat(L.clientId,"] Subscriber connection is lost -- streamId: ").concat(e.getId(),", p2pId: ").concat(s)),v.default.debug("[".concat(L.clientId,"] subscribe p2p failed: "),L.p2ps),o||(o=!0,n&&n(b.default.PEERCONNECTION_FAILED),E.report.subscribe(L.joinInfo.sid,{lts:r,succ:!1,video:e.subscribeOptions&&e.subscribeOptions.video,audio:e.subscribeOptions&&e.subscribeOptions.audio,peerid:e.getId(),ec:b.default.PEERCONNECTION_FAILED,subscribeRequestid:L.subscribeRequestId.get(e.getId())||0,p2pid:s})),L.remoteStreams[e.getId()]&&L.p2ps.has(s)&&(L.p2ps.delete(s),L.dispatchEvent(Object(m.a)({type:"subP2PLost",stream:e})));else if("connected"===i&&(v.default.debug("[".concat(L.clientId,"] subscribe p2p connected: "),L.p2ps),!o)){o=!0,E.report.subscribe(L.joinInfo.sid,{lts:r,succ:!0,video:e.subscribeOptions&&e.subscribeOptions.video,audio:e.subscribeOptions&&e.subscribeOptions.audio,peerid:e.getId(),ec:null,subscribeRequestid:L.subscribeRequestId.get(e.getId())||0,p2pid:s}),L._adjustPCMuteStatus(e);var a=!1,c=!1,d=!1,u=setInterval((function(){a&&c||(e.pc?e.pc.getStats((function(t){t.forEach((function(t){if((-1!==t.id.indexOf("recv")||t.type&&-1!==t.type.toLowerCase().indexOf("inbound")||-1!==t.id.indexOf("inbound_rtp")||-1!==t.id.indexOf("inbound-rtp")||-1!==t.id.indexOf("InboundRTP"))&&"audio"===t.mediaType){if((t.googDecodingNormal>0||t.audioOutputLevel>0)&&!a){a=!0,L.dispatchEvent({type:"first-audio-frame-decode",stream:e}),a&&c&&clearInterval(u);var n=Date.now(),r=E.report.getSessionStartTime(L.joinInfo.sid);E.report.firstAudioDecode(L.joinInfo.sid,{peerid:e.uintId,uid:L.uid,elapse:n-r,subscribeElapse:n-e.subscribeLTS,subscribeRequestid:L.subscribeRequestId.get(e.getId())||0,p2pid:s})}if(parseInt(t.packetsReceived)>0&&!c){c=!0,L.dispatchEvent({type:"first-audio-packet-received",stream:e}),a&&c&&clearInterval(u);n=Date.now(),r=E.report.getSessionStartTime(L.joinInfo.sid);E.report.firstAudioReceived(L.joinInfo.sid,{peerid:e.uintId,uid:L.uid,elapse:n-r,subscribeElapse:n-e.subscribeLTS,subscribeRequestid:L.subscribeRequestId.get(e.getId())||0,p2pid:s})}}}))}),100):clearInterval(u))}),100),l=!1,p=!1,f=setInterval((function(){l&&p||(e.pc?e.pc.getStats((function(t){t.forEach((function(t){if((-1!==t.id.indexOf("recv")||t.type&&-1!==t.type.toLowerCase().indexOf("inbound")||-1!==t.id.indexOf("inbound_rtp")||-1!==t.id.indexOf("inbound-rtp")||-1!==t.id.indexOf("InboundRTP"))&&"video"===t.mediaType){if((t.framesDecoded>0||t.googFramesDecoded>0)&&!l){l=!0,L.dispatchEvent({type:"first-video-frame-decode",stream:e}),l&&p&&clearInterval(f);var n=Date.now(),r=E.report.getSessionStartTime(L.joinInfo.sid);e.firstFrameTime=(new Date).getTime()-e.subscribeLTS,E.report.firstVideoDecode(L.joinInfo.sid,{peerid:e.uintId,width:parseInt(t.googFrameWidthReceived)||0,height:parseInt(t.googFrameHeightReceived)||0,uid:L.uid,elapse:n-r,subscribeElapse:n-e.subscribeLTS,subscribeRequestid:L.subscribeRequestId.get(e.getId())||0,p2pid:s})}if(t.packetsReceived>0&&!p){p=!0,L.dispatchEvent({type:"first-video-packet-received",stream:e}),l&&p&&clearInterval(f);n=Date.now(),r=E.report.getSessionStartTime(L.joinInfo.sid);E.report.firstVideoReceived(L.joinInfo.sid,{peerid:e.uintId,uid:L.uid,elapse:n-r,subscribeElapse:n-e.subscribeLTS,subscribeRequestid:L.subscribeRequestId.get(e.getId())||0,p2pid:s})}}}))}),100):clearInterval(f))}),100),g=setInterval((function(){if(!d){var t=e.getId(),n=L.traffic_stats;if(n&&n.peer_delay){var r=n.peer_delay.find((function(e){return e.peer_uid==t}));if(r){if(d=!0,L.peerPublishDurationMap.get(e.getId()))return void clearInterval(g);var i=r.peer_publish_audio_duration,o=r.peer_publish_video_duration;if(void 0===i||void 0===o)return;L.peerPublishDurationMap.set(e.getId(),!0);var a=E.report.getSessionStartTime(L.joinInfo.sid),s=(i||o)+(Date.now()-n.timestamp),c=Date.now();E.report.peerPublishStatus({audiotag:i?1:-1,videotag:o?1:-1,lts:c,sid:L.joinInfo.sid,cname:L.joinInfo.cname,cid:L.joinInfo.cid,uid:L.joinInfo.uid,elapse:c-a,peer:e.uintId,peerPublishDuration:s,joinChannelSuccessElapse:c-L.joinSuccessLts,subscribeElapse:c-e.subscribeLTS}),clearInterval(g)}}}}),1e3);return e.sid=L.joinInfo.sid,t&&t()}}}else v.default.error("[".concat(L.clientId,"] Invalid remote stream")),o||(o=!0,n&&n(b.default.INVALID_REMOTE_STREAM),E.report.subscribe(L.joinInfo.sid,{lts:r,succ:!1,video:e.subscribeOptions&&e.subscribeOptions.video,audio:e.subscribeOptions&&e.subscribeOptions.audio,peerid:e.getId(),ec:b.default.INVALID_REMOTE_STREAM}));else v.default.error("[".concat(L.clientId,"] No such remote stream")),o||(o=!0,n&&n(b.default.NO_SUCH_REMOTE_STREAM),E.report.subscribe(L.joinInfo.sid,{lts:r,succ:!1,video:e.subscribeOptions&&e.subscribeOptions.video,audio:e.subscribeOptions&&e.subscribeOptions.audio,peerid:e.getId(),ec:b.default.NO_SUCH_REMOTE_STREAM}))},L.subscribeChange=function(e,t,n){var r=Date.now();v.default.info("[".concat(L.clientId,"] Gatewayclient ").concat(L.uid," SubscribeChange ").concat(e.getId(),": ").concat(JSON.stringify(e.subscribeOptions))),L._adjustPCMuteStatus(e);var i={stream_id:e.getId(),audio:e.subscribeOptions.audio,video:e.subscribeOptions.video};L.makeRequest({_type:"subscribe_change",_message:i},(function(n){var i=Object(m.e)({type:"stream-subscribe-changed",stream:L.remoteStreams[e.getId()]});E.report.subscribe(L.joinInfo.sid,{lts:r,succ:!0,video:e.subscribeOptions&&e.subscribeOptions.video,audio:e.subscribeOptions&&e.subscribeOptions.audio,peerid:e.getId(),ec:null,subscribeRequestid:L.subscribeRequestId.get(e.getId())||0,p2pid:L.p2ps.get(e.getId())}),L.dispatchEvent(i),t&&t()}),(function(t,r){v.default.error("[".concat(L.clientId,"] Subscribe Change Failed ").concat(e.getId()),t,r),n&&n(t,r)}))},L.processPublishFailure=function(e){e.publishLTS=null,e.p2pId&&L.p2ps.get(e.p2pId)===e&&L.p2ps.delete(e.p2pId),L.localStreams[e.getUserId()]===e&&delete L.localStreams[e.getUserId()],L.localStreams[e.getId()]===e&&delete L.localStreams[e.getId()],e.pc&&(e.pc.processSignalingMessage=function(){},e.pc.oniceconnectionstatechange=function(){},e.pc.close(),delete e.pc),delete e.onClose,delete e._onAudioUnmute,delete e._onVideoUnmute,delete e._onAudioMute,delete e._onVideoMute,delete e._onAudioUnmute},L.processSubscribeFailure=function(e){e.p2pId&&L.p2ps.get(e.p2pId)===e&&L.p2ps.delete(e.p2pId),e.pc&&(e.pc.onaddstream=function(){},e.pc.processSignalingMessage=function(){},e.pc.oniceconnectionstatechange=function(){},e.pc.close(),delete e.pc),delete e.onClose,delete e._onAudioUnmute,delete e._onVideoUnmute,delete e._onAudioMute,delete e._onVideoMute,delete e._onAudioUnmute},L._adjustPCMuteStatus=function(e){(v.default.debug("[".concat(L.clientId,"]: use _adjustPCMuteStatus: ").concat(e.getId())),v.default.debug("[".concat(L.clientId,"]: video: ").concat(e.video,", audio: ").concat(e.audio,", suboption: ").concat(JSON.stringify(e.subscribeOptions),",userMuteVideo: ").concat(e.userMuteVideo,", peerMuteVideo: ").concat(e.peerMuteVideo,", userMuteAudio: ").concat(e.userMuteAudio,", peerMuteAudio: ").concat(e.peerMuteAudio)),!e.local&&e.pc&&e.pc.peerConnection.getReceivers)&&e.pc.peerConnection.getReceivers().forEach((function(t){if(t&&t.track&&"audio"===t.track.kind){var n=!e.userMuteAudio&&!e.peerMuteAudio;e.subscribeOptions&&!e.subscribeOptions.audio&&(n=!1),v.default.debug("[".concat(L.clientId,"]: set receiver audio track: ").concat(n)),t.track.enabled=!!n}else if(t&&t.track&&"video"===t.track.kind){var r=!e.userMuteVideo&&!e.peerMuteVideo;e.subscribeOptions&&!e.subscribeOptions.video&&(r=!1),v.default.debug("[".concat(L.clientId,"]: set receiver video track: ").concat(r)),t.track.enabled=!!r}}))},L.unsubscribe=function(e,t,n){if("object"!==d()(e)||null===e)return v.default.error("[".concat(L.clientId,"] Invalid remote stream")),void D(n,b.default.INVALID_REMOTE_STREAM);if(L.state!==R)return v.default.error("[".concat(L.clientId,"] User is not in the session")),void D(n,b.default.INVALID_OPERATION);if(null!=L.timers[e.getId()]&&(clearInterval(L.timers[e.getId()]),clearInterval(L.timers[e.getId()]+"audio")),null!=L.audioLevel[e.getId()]&&delete L.audioLevel[e.getId()],null!=L.timer_counter[e.getId()]&&delete L.timer_counter[e.getId()],L.remoteStreams.hasOwnProperty(e.getId())){if(!L.socket)return v.default.error("[".concat(L.clientId,"] User is not in the session")),void D(n,b.default.INVALID_OPERATION);if(e.local)return v.default.error("[".concat(L.clientId,"] Invalid remote stream")),void D(n,b.default.INVALID_REMOTE_STREAM);e.close(),e.stop();var r={stream_id:e.getId()};L.makeRequest({_type:"unsubscribe",_message:r}),void 0!==e.pc&&(e.pc.close(),e.pc=void 0),e.onClose=void 0,e._onAudioMute=void 0,e._onAudioUnute=void 0,e._onVideoMute=void 0,e._onVideoUnmute=void 0,delete e.subscribeOptions,L.p2ps.delete(e.p2pId),v.default.info("[".concat(L.clientId,"] Unsubscribe stream success")),t&&t()}else D(n,b.default.NO_SUCH_REMOTE_STREAM)},L.setRemoteVideoStreamType=function(e,t){if(v.default.debug("[".concat(L.clientId,"] Switching remote video stream ").concat(e.getId()," to ").concat(t)),"object"===d()(e)&&null!==e)if(L.state===R){if(!e.local){switch(t){case L.remoteVideoStreamTypes.REMOTE_VIDEO_STREAM_HIGH:case L.remoteVideoStreamTypes.REMOTE_VIDEO_STREAM_LOW:case L.remoteVideoStreamTypes.REMOTE_VIDEO_STREAM_MEDIUM:break;default:return}var n={stream_id:e.getId(),stream_type:t};L.makeRequest({_type:"switch_video_stream",_message:n},(function(){v.default.debug("SwitchVideoStream Success ".concat(n.stream_id," ").concat(n.stream_type))}),(function(e,t){v.default.error("SwitchVideoStream Error ".concat(e," ").concat(n.stream_id," ").concat(n.stream_type),t)}))}}else v.default.error("[".concat(L.clientId,"] User is not in the session"));else v.default.error("[".concat(L.clientId,"] Invalid remote stream"))},L.renewToken=function(e,t,n){e?L.key?L.state!==R?(v.default.debug("[".concat(L.clientId,"] Client is not connected. Trying to rejoin")),L.key=e,L.rejoin(),t&&t()):(v.default.debug("[".concat(L.clientId,"] renewToken from ").concat(L.key," to ").concat(e)),L.key=e,L.makeRequest({_type:"renew_token",_message:{token:e}},t,n)):(v.default.error("[".concat(L.clientId,"] Client is previously joined without token")),n&&n(b.default.INVALID_PARAMETER)):(v.default.error("[".concat(L.clientId,"] Invalid Token ").concat(e)),n&&n(b.default.INVALID_PARAMETER))},L.setStreamFallbackOption=function(e,t){if(v.default.debug("[".concat(L.clientId,"] Set stream fallback option ").concat(e.getId()," to ").concat(t)),"object"===d()(e)&&null!==e)if(L.state===R){if(!e.local){switch(t){case L.streamFallbackTypes.STREAM_FALLBACK_OPTION_DISABLED:case L.streamFallbackTypes.STREAM_FALLBACK_OPTION_VIDEO_STREAM_LOW:case L.streamFallbackTypes.STREAM_FALLBACK_OPTION_AUDIO_ONLY:break;default:return}var n={stream_id:e.getId(),fallback_type:t};L.makeRequest({_type:"set_fallback_option",_message:n},(function(){v.default.debug("SetStreamFallbackOption success ".concat(n.stream_id," ").concat(t))}),(function(e,r){v.default.error("Failed to SetStreamFallbackOption ".concat(n.stream_id," ").concat(t," ").concat(e),r)}))}}else v.default.error("[".concat(L.clientId,"] User is not in the session"));else v.default.error("[".concat(L.clientId,"] Invalid remote stream"))},L.enableAudioVolumeIndicator=function(e,t){L.audioVolumeIndication.enabled=!0,L.audioVolumeIndication.interval=e,L.audioVolumeIndication.smooth=t,L.resetAudioVolumeIndication()},L.resetAudioVolumeIndication=function(){if(clearInterval(L.timers.audioVolumeIndication),clearInterval(L.timers.audioVolumeSampling),L.audioVolumeIndication.enabled&&L.audioVolumeIndication.interval){var e=Math.floor(1e3*L.audioVolumeIndication.smooth/100);clearInterval(L.timers.audioVolumeSampling),L.timers.audioVolumeSampling=setInterval((function(){L.audioVolumeSampling||(L.audioVolumeSampling={});var t={};for(var n in L.remoteStreams){var r=L.remoteStreams[n];if(r.stream&&r.hasAudio()){var i=r.getAudioLevel();i>0&&i<1&&(i*=100);var o=L.audioVolumeSampling[n]||[];for(o.push(i);o.length>e;)o.shift();t[n]=o}}L.audioVolumeSampling=t}),100),clearInterval(L.timers.audioVolumeIndication),L.timers.audioVolumeIndication=setInterval((function(){if(L.socket&&L.socket.signal&&L.socket.signal.connection&&L.socket.signal.connection.readyState===WebSocket.OPEN){var e=[];for(var t in L.remoteStreams)if(L.audioVolumeSampling&&L.audioVolumeSampling[t]){var n=L.audioVolumeSampling[t],r=0;n.forEach((function(e){r+=e}));var i={uid:t,level:Math.floor(r/n.length)};i.level&&e.push(i)}var o=e.sort((function(e,t){return e.level-t.level}));v.default.debug("[".concat(L.clientId,"] volume-indicator "),JSON.stringify(o)),L.audioVolumeIndication.sortedAudioVolumes=o;var a=Object(m.a)({type:"volume-indicator",attr:o});L.dispatchEvent(a)}}),L.audioVolumeIndication.interval)}},L.closeGateway=function(){v.default.debug("[".concat(L.clientId,"] close gateway")),L.state=p,L.socket.close(),B()},L.startChannelMediaRelay=function(){var e=s()(o.a.mark((function e(t){var n,r,i,a;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!L.channelMediaRelayController){e.next=2;break}throw new P.ChannelMediaError("RELAY_ALREADY_START","",P.CHANNEL_MEDIA_RELAY_ERROR.RELAY_ALREADY_START);case 2:return n=function(e){L.dispatchEvent({type:"channel-media-relay-event",code:e})},r=function(e,t,n){e===P.CHANNEL_MEDIA_RELAY_STATE.RELAY_STATE_FAILURE&&t===P.CHANNEL_MEDIA_RELAY_ERROR.SERVER_CONNECTION_LOST&&(L.channelMediaRelayController.dispose(),L.channelMediaRelayController=null),L.dispatchEvent({type:"channel-media-relay-state",state:e,code:t,data:n})},L.channelMediaRelayController=new U.a(L.joinInfo,L.clientId),L.channelMediaRelayController.on("event",n),L.channelMediaRelayController.on("state",r),e.prev=7,e.next=10,L.channelMediaRelayController.startChannelMediaRelay(t);case 10:e.next=22;break;case 12:throw e.prev=12,e.t0=e.catch(7),v.default.debug("[".concat(L.clientId,"] startChannelMediaRelay exception: ").concat(JSON.stringify(e.t0))),i=P.CHANNEL_MEDIA_RELAY_STATE.RELAY_STATE_FAILURE,a="",a=e.t0 instanceof P.ChannelMediaError?"SetSourceChannelStatus"===e.t0.data||e.t0.data&&e.t0.data.serverResponse&&"SetSourceChannel"===e.t0.data.serverResponse.command?"FAILED_JOIN_SRC":"SetDestChannelStatus"===e.t0.data||e.t0.data&&e.t0.data.serverResponse&&"SetDestChannel"===e.t0.data.serverResponse.command?"FAILED_JOIN_DEST":e.t0.data&&e.t0.data.serverResponse&&"StartPacketTransfer"===e.t0.data.serverResponse.command?"FAILED_PACKET_SENT_TO_DEST":e.t0.message===P.CHANNEL_MEDIA_ERROR.REQUEST_TIMEOUT||e.t0.message===P.CHANNEL_MEDIA_ERROR.WAIT_STATUS_TIMEOUT?"SERVER_NO_RESPONSE":e.t0.message===P.CHANNEL_MEDIA_ERROR.REQUEST_FAILED||e.t0.message===P.CHANNEL_MEDIA_ERROR.WAIT_STATUS_ERROR?"SERVER_ERROR_RESPONSE":e.t0.message===P.CHANNEL_MEDIA_ERROR.AP_REQUEST_TIMEOUT?"NO_RESOURCE_AVAILABLE":e.t0.message===P.CHANNEL_MEDIA_ERROR.WS_ABORT||e.t0.message===P.CHANNEL_MEDIA_ERROR.AP_REQUEST_ABORT?"OPERATION_ABORT":"INTERNAL_ERROR":"INTERNAL_ERROR",L.dispatchEvent({type:"channel-media-relay-state",state:i,code:P.CHANNEL_MEDIA_RELAY_ERROR[a]}),L.channelMediaRelayController&&(L.channelMediaRelayController.dispose(),L.channelMediaConfig=null,L.channelMediaRelayController=null),L.dispatchEvent({type:"channel-media-relay-state",state:P.CHANNEL_MEDIA_RELAY_STATE.RELAY_STATE_IDLE}),new P.ChannelMediaError(a,null,P.CHANNEL_MEDIA_RELAY_ERROR[a]);case 22:L.dispatchEvent({type:"channel-media-relay-state",state:P.CHANNEL_MEDIA_RELAY_STATE.RELAY_STATE_RUNNING,code:P.CHANNEL_MEDIA_RELAY_ERROR.RELAY_OK}),L.channelMediaConfig=t;case 24:case"end":return e.stop()}}),e,null,[[7,12]])})));return function(t){return e.apply(this,arguments)}}(),L.updateChannelMediaRelay=function(){var t=s()(o.a.mark((function t(n){var r,i;return o.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(L.channelMediaRelayController){t.next=2;break}throw new P.ChannelMediaError("RELAY_NOT_START",null,P.CHANNEL_MEDIA_RELAY_ERROR.RELAY_NOT_START);case 2:return t.prev=2,t.next=5,L.channelMediaRelayController.updateChannelMediaRelay(n);case 5:t.next=18;break;case 7:throw t.prev=7,t.t0=t.catch(2),v.default.debug("[".concat(L.clientId,"] updateChannelMediaRelay exception: ").concat(JSON.stringify(e))),r=P.CHANNEL_MEDIA_RELAY_STATE.RELAY_STATE_FAILURE,i="",i=e instanceof P.ChannelMediaError?e.message===P.CHANNEL_MEDIA_ERROR.REQUEST_TIMEOUT||e.message===P.CHANNEL_MEDIA_ERROR.WAIT_STATUS_TIMEOUT?"SERVER_NO_RESPONSE":e.message===P.CHANNEL_MEDIA_ERROR.REQUEST_FAILED||e.message===P.CHANNEL_MEDIA_ERROR.WAIT_STATUS_ERROR?"SERVER_ERROR_RESPONSE":e.message===P.CHANNEL_MEDIA_ERROR.WS_ABORT||e.message===P.CHANNEL_MEDIA_ERROR.AP_REQUEST_ABORT?"OPERATION_ABORT":"INTERNAL_ERROR":"INTERNAL_ERROR",L.dispatchEvent({type:"channel-media-relay-event",code:P.CHANNEL_MEDIA_RELAY_EVENT.PACKET_UPDATE_DEST_CHANNEL_REFUSED}),L.dispatchEvent({type:"channel-media-relay-state",state:r,code:P.CHANNEL_MEDIA_RELAY_ERROR[i]}),L.channelMediaRelayController&&(L.channelMediaRelayController.dispose(),L.channelMediaConfig=null,L.channelMediaRelayController=null),L.dispatchEvent({type:"channel-media-relay-state",state:P.CHANNEL_MEDIA_RELAY_STATE.RELAY_STATE_IDLE}),new P.ChannelMediaError(i,null,P.CHANNEL_MEDIA_RELAY_ERROR[i]);case 18:L.channelMediaConfig=n;case 19:case"end":return t.stop()}}),t,null,[[2,7]])})));return function(e){return t.apply(this,arguments)}}(),L.stopChannelMediaRelay=s()(o.a.mark((function t(){var n,r;return o.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(L.channelMediaRelayController){t.next=2;break}throw new P.ChannelMediaError("RELAY_NOT_START",null,P.CHANNEL_MEDIA_RELAY_ERROR.RELAY_NOT_START);case 2:return t.prev=2,t.next=5,L.channelMediaRelayController.stopChannelMediaRelay();case 5:t.next=17;break;case 7:throw t.prev=7,t.t0=t.catch(2),v.default.debug("[".concat(L.clientId,"] stopChannelMediaRelay exception: ").concat(JSON.stringify(e))),n=P.CHANNEL_MEDIA_RELAY_STATE.RELAY_STATE_FAILURE,r="",r=e instanceof P.ChannelMediaError?e.message===P.CHANNEL_MEDIA_ERROR.REQUEST_TIMEOUT||e.message===P.CHANNEL_MEDIA_ERROR.WAIT_STATUS_TIMEOUT?"SERVER_NO_RESPONSE":e.message===P.CHANNEL_MEDIA_ERROR.REQUEST_FAILED||e.message===P.CHANNEL_MEDIA_ERROR.WAIT_STATUS_ERROR?"SERVER_ERROR_RESPONSE":"INTERNAL_ERROR":"INTERNAL_ERROR",L.dispatchEvent({type:"channel-media-relay-state",state:n,code:P.CHANNEL_MEDIA_RELAY_ERROR[r]}),L.channelMediaRelayController&&(L.channelMediaRelayController.dispose(),L.channelMediaConfig=null,L.channelMediaRelayController=null),L.dispatchEvent({type:"channel-media-relay-state",state:P.CHANNEL_MEDIA_RELAY_STATE.RELAY_STATE_IDLE}),new P.ChannelMediaError(r,null,P.CHANNEL_MEDIA_RELAY_ERROR[r]);case 17:L.channelMediaConfig=null,L.channelMediaRelayController=null;case 19:case"end":return t.stop()}}),t,null,[[2,7]])}))),L.sendMetadata=function(e,t){L.makeRequest(function(e){return{_type:"send_metadata",_message:{session_id:L.joinInfo.sid,metadata:window.btoa(unescape(encodeURIComponent(e)))}}}(e),(function(){v.default.debug("[".concat(L.clientId,'] send metadata "').concat(e,'" success')),t&&t(null)}),(function(n){v.default.error("[".concat(L.clientId,'] send metadata "').concat(e,'" failed'),n),t&&t(n)}))},L._reportWebsocketCloseEvent=function(e,t){try{var n=E.report.getSessionStartTime(L.joinInfo.sid),r=Date.now();E.report.webSocketQuit({lts:r,sid:L.joinInfo.sid,cname:L.joinInfo.cname,cid:L.joinInfo.cid,uid:L.joinInfo.uid,elapse:r-n,succ:e,errorCode:t,ip:null})}catch(e){v.default.debug("[".concat(L.clientId,"]: _reportWebsocketCloseEvent exception, ").concat(e))}};var j=function(){v.default.debug("[".concat(L.clientId,"] Reconnect gateway")),L.state=p,L.socket.close(),B(),L.reconnectMode="recover",L.state=_,F()};L.recover=j;var B=function(){for(var e in L.dispatchEvent({type:"before-clear-connection"}),L.timers)L.timers.hasOwnProperty(e)&&clearInterval(L.timers[e]);for(var e in L.remoteStreams)if(L.remoteStreams.hasOwnProperty(e)){var t=L.remoteStreams[e],n=Object(m.a)({type:"stream-removed",uid:t.getId(),stream:t});L.dispatchEvent(n)}L.p2ps.clear(),q(),H(),clearInterval(L.pingTimer)};L.rejoin=function(){L.socket&&(clearInterval(L.pingTimer),L.socket.close(),L.socket=void 0),L.state=_,F()};var F=function(e,t){L.dispatchEvent(Object(m.a)({type:"rejoin-start"})),e=e||function(e){v.default.info("[".concat(L.clientId,"] User ").concat(e," is re-joined to ").concat(L.joinInfo.cname)),L.dispatchEvent(Object(m.a)({type:"rejoin"})),L.channelMediaConfig&&L.startChannelMediaRelay(L.channelMediaConfig).then((function(){v.default.debug("[".concat(L.clientId,"] restartChannelMediaRelay success"))})).catch((function(e){v.default.debug("[".concat(L.clientId,"] restartChannelMediaRelay failed: ").concat(JSON.stringify(e)))})),L.liveStreams&&L.liveStreams.size&&L.liveStreams.forEach((function(e,t){e&&L.setLiveTranscoding(L.transcoding),L.startLiveStreaming(t,e)})),L.injectLiveStreams&&L.injectLiveStreams.size&&L.injectLiveStreams.forEach((function(e,t){L.addInjectStreamUrl(t,e)}))},t=t||function(e){v.default.error("[".concat(L.clientId,"] Re-join to channel failed "),e),L.dispatchEvent(Object(m.e)({type:"error",reason:e}))},L.key?(++L.rejoinAttempt,L.join(L.joinInfo,L.key,e,t)):v.default.error("[".concat(L.clientId,"] Connection recover failed [Invalid channel key]"))},W=function(e,t,n){if(L.onConnect=t,L.socket){if(L.dispatchEvent({type:"reconnect"}),"retry"===L.reconnectMode)v.default.debug("[".concat(L.clientId,"] Retry current gateway")),L.socket.reconnect();else if("tryNext"===L.reconnectMode)v.default.debug("[".concat(L.clientId,"] Try next gateway")),L.socket.connectNext();else if("recover"===L.reconnectMode){v.default.debug("[".concat(L.clientId,"] Recover gateway")),v.default.debug("[".concat(L.clientId,"] Try to reconnect choose server and get gateway list again ")),L.reconnectingCS=!0;var i=L.joinInfo&&L.joinInfo.sid;0,Object(A.getGatewayList)(L.joinInfo,(function(e){v.default.debug("[".concat(L.clientId,"] session: ").concat(i," get gateway list success")),L.joinInfo.apResponse=e.res,L.reconnectingCS?L.socket.replaceHost(e.gateway_addr):v.default.debug("[".concat(L.clientId,"] session: ").concat(i," already leave"))}))}}else o=e.gatewayAddr,L.socket=T(o,{sid:L.joinInfo.sid,clientId:L.clientId,proxyServerType:L.joinInfo.proxyServerType}),L.socket.on("start-connection",(function(e){L.ticket=e&&e.msg&&e.msg.ticket})),L.socket.on("on_uplink_stats",(function(e){var t={};for(var n in e)t[M(n)]=e[n];if(L.OutgoingAvailableBandwidth=t.uplink_available_bandwidth,L.localStreams[L.uid]){var r=L.localStreams[L.uid].uplinkStats;r&&r.period_fir===t.period_fir||v.default.debug("[".concat(L.clientId,"]: Period fir change to: ").concat(t.period_fir)),L.localStreams[L.uid].uplinkStats=t}})),L.socket.on("connect",(function(){L.dispatchEvent({type:"connected"}),L.attemps=1,L.onConnect()})),L.socket.on("recover",(function(){L.state=_,v.default.debug("[".concat(L.clientId,"] Try to reconnect choose server and get gateway list again ")),L.reconnectingCS=!0;var e=L.joinInfo&&L.joinInfo.sid;Object(A.getGatewayList)(L.joinInfo,(function(t){v.default.debug("[".concat(L.clientId,"] session: ").concat(e," get gateway list success")),L.reconnectingCS?L.socket.replaceHost(t.gateway_addr):v.default.debug("[".concat(L.clientId,"] session: ").concat(e," already leave"))}))})),L.socket.on("disconnect",(function(e){if(v.default.debug("[".concat(L.clientId,"] Receive disconnect message")),L.state!==p){L.state=p,L._reportWebsocketCloseEvent(-1,b.WEBSOCKET_CLOSE_REASON.WS_DISCONNECT);var t=Object(m.e)({type:"error",reason:b.default.SOCKET_DISCONNECTED});if(L.dispatchEvent(t),0===L.p2ps.size?L.reconnectMode="tryNext":L.reconnectMode="retry",B(),L.channelMediaRelayController&&L.channelMediaRelayController.dispose(),L.channelMediaRelayController=null,1!=r){var n,i=(n=L.attemps,1e3*Math.min(30,Math.pow(2,n)-1));if(v.default.error("[".concat(L.clientId,"] Disconnect from server [").concat(JSON.stringify(e),"], attempt to recover [#").concat(L.attemps,"] after ").concat(i/1e3," seconds")),L.hasInvokeLeave)return v.default.debug("[".concat(L.clientId,"] No reconnection because Client.leave has been invoked")),void(L.hasInvokeLeave=!1);setTimeout((function(){L.attemps++,L.state=_,L.inChannelInfo&&Date.now()-L.inChannelInfo.joinAt>Object(y.getParameter)("TICKET_RENEW_TIMEOUT")?(v.default.debug("Recovering to renew ticket"),j()):F()}),i)}}})),L.socket.on("on_add_audio_stream",(function(e){if(v.default.info("[".concat(L.clientId,"] Newly added audio stream with uid ").concat(e.uid)),L.joinInfo.stringUid&&"string"!=typeof e.uid&&v.default.error("StringUID is Mixed with UintUID"),L.remoteStreamsInChannel.has(e.uid)||L.remoteStreamsInChannel.add(e.uid),void 0===L.remoteStreams[e.uid]){var t=Object(g.a)({streamID:e.uid,local:!1,audio:e.audio,video:e.video,uintUID:e.uint_id||e.uid});t.peerMuteVideo=!0,L.remoteStreams[e.uid]=t;var n=Object(m.e)({type:"stream-added",stream:t});L.dispatchEvent(n);var r=L.remoteMuteState[e.uid];if(r&&r.audio){n=Object(m.a)({type:"mute-audio",uid:e.uid});L.dispatchEvent(n)}if(r&&r.video){n=Object(m.a)({type:"mute-video",uid:e.uid});L.dispatchEvent(n)}}E.report.onAddAudioStream(L.joinInfo.sid,{peerid:e.uint_id||e.uid,uid:L.uid})})),L.socket.on("on_update_stream",(function(e){v.default.info("[".concat(L.clientId,"] on_update_stream:"),e);var t=L.remoteStreams[e.uid];if(L.joinInfo.stringUid&&"string"!=typeof e.uid&&v.default.error("StringUID is Mixed with UintUID"),t){t.audio=e.audio,t.video=e.video,t.screen=e.screen,t.pc&&L._adjustPCMuteStatus(t);var n=Object(m.e)({type:"stream-updated",stream:t});L.dispatchEvent(n)}else v.default.debug("[".concat(L.clientId,"] Ignoring onUpdateStream event before onAddStream for uid ").concat(e.uid));E.report.onUpdateStream(L.joinInfo.sid,{peerid:e.uint_id||e.uid,audio:e.audio,video:e.video,uid:L.uid})})),L.socket.on("on_add_video_stream",(function(e){if(v.default.info("[".concat(L.clientId,"] Newly added remote stream with uid ").concat(e.uid,".")),L.joinInfo.stringUid&&"string"!=typeof e.uid&&v.default.error("StringUID is Mixed with UintUID"),L.remoteStreamsInChannel.has(e.uid)||L.remoteStreamsInChannel.add(e.uid),void 0===L.remoteStreams[e.uid]){var t=Object(g.a)({streamID:e.uid,local:!1,audio:e.audio,video:e.video,uintUID:e.uint_id||e.uid});L.remoteStreams[e.uid]=t;var n=Object(m.e)({type:"stream-added",stream:t});L.dispatchEvent(n);var r=L.remoteMuteState[e.uid];if(r&&r.audio){n=Object(m.a)({type:"mute-audio",uid:e.uid});L.dispatchEvent(n)}if(r&&r.video){n=Object(m.a)({type:"mute-video",uid:e.uid});L.dispatchEvent(n)}}else{var i=L.remoteStreams[e.uid];if(i.video=!0,i.peerMuteVideo=!1,i.pc&&L._adjustPCMuteStatus(i),v.default.info("[".concat(L.clientId,"] Stream changed: enable video ").concat(e.uid)),void 0!==i.stream&&i.isPlaying()){var o=i.player.elementID;i.stop(),i.play(o,i.playOptions)}}E.report.onAddVideoStream(L.joinInfo.sid,{peerid:e.uint_id||e.uid,uid:L.uid})})),L.socket.on("on_remove_stream",(function(e){v.default.info("[".concat(L.clientId,"] on_remove_stream:"),e),L.remoteStreamsInChannel.has(e.uid)&&L.remoteStreamsInChannel.delete(e.uid);var t=L.remoteStreams[e.uid];if(t){delete L.remoteStreams[e.uid],delete L.remoteMuteState[e.uid];var n=Object(m.e)({type:"stream-removed",stream:t});L.dispatchEvent(n),t.close(),void 0!==t.pc&&(t.pc.close(),t.pc=void 0,L.p2ps.delete(t.p2pId)),E.report.onRemoveStream(L.joinInfo.sid,{peerid:e.uint_id||e.uid,uid:L.uid})}else v.default.error("ERROR stream ",e.uid," not found onRemoveStream ",e)})),L.socket.on("on_publish_stream",(function(e){v.default.info("[".concat(L.clientId,"] on_publish_stream:"),e);var t=L.localStreams[e.uid];L.dispatchEvent({type:"streamPublished",stream:t,proxy:e.proxy}),E.report.reportApiInvoke(L.joinInfo.sid,{name:"on_publish_stream",options:{proxy:e.proxy}})()})),L.socket.on("mute_audio",(function(e){v.default.info("[".concat(L.clientId,"] rcv peer mute audio: ").concat(e.uid)),L.remoteMuteState[e.uid]=L.remoteMuteState[e.uid]||{audio:!1,video:!1},L.remoteMuteState[e.uid].audio=!0;var t=Object(m.a)({type:"mute-audio",uid:e.uid}),n=L.remoteStreams[e.uid];n?(n.peerMuteAudio=!0,n.pc&&L._adjustPCMuteStatus(n),L.dispatchEvent(t)):v.default.debug("Ignoring event ".concat(e.type),e)})),L.socket.on("unmute_audio",(function(e){v.default.info("[".concat(L.clientId,"] rcv peer unmute audio: ").concat(e.uid)),L.remoteMuteState[e.uid]=L.remoteMuteState[e.uid]||{audio:!1,video:!1},L.remoteMuteState[e.uid].audio=!1;var t=Object(m.a)({type:"unmute-audio",uid:e.uid}),n=L.remoteStreams[e.uid];n?(n.peerMuteAudio=!1,n.pc&&L._adjustPCMuteStatus(n),L.dispatchEvent(t)):v.default.debug("Ignoring event ".concat(e.type),e)})),L.socket.on("mute_video",(function(e){v.default.info("[".concat(L.clientId,"] rcv peer mute video: ").concat(e.uid)),L.remoteMuteState[e.uid]=L.remoteMuteState[e.uid]||{audio:!1,video:!1},L.remoteMuteState[e.uid].video=!0;var t=Object(m.a)({type:"mute-video",uid:e.uid}),n=L.remoteStreams[e.uid];n?(n.peerMuteVideo=!0,n.player&&(n.player.peerVideoReady=!1),n.pc&&L._adjustPCMuteStatus(n),L.dispatchEvent(t)):v.default.debug("Ignoring event ".concat(e.type),e)})),L.socket.on("unmute_video",(function(e){v.default.info("[".concat(L.clientId,"] rcv peer unmute video: ").concat(e.uid)),L.remoteMuteState[e.uid]=L.remoteMuteState[e.uid]||{audio:!1,video:!1},L.remoteMuteState[e.uid].video=!1;var t=Object(m.a)({type:"unmute-video",uid:e.uid}),n=L.remoteStreams[e.uid];n?(n.peerMuteVideo=!1,n.pc&&L._adjustPCMuteStatus(n),L.dispatchEvent(t)):v.default.debug("Ignoring event ".concat(e.type),e)})),L.socket.on("on_crypt_error",(function(e){v.default.warning("[".concat(L.clientId,"] stream crypt error"));var t=Object(m.a)({type:"crypt-error",cryptType:e.crypt_type});L.dispatchEvent(t)})),L.socket.on("on_user_banned",(function(e){v.default.info("[".concat(L.clientId,"] user banned uid: ").concat(e.uid," error: ").concat(e.error_code));var t=Object(m.a)({type:"client-banned",uid:e.uid,attr:e.error_code});L.dispatchEvent(t),r=!0})),L.socket.on("on_stream_fallback_update",(function(e){v.default.info("[".concat(L.clientId,"] stream fallback peerId: ").concat(e.stream_id," type: ").concat(e.stream_type));var t=Object(m.a)({type:"stream-fallback",uid:e.stream_id,stream:e.stream_id,attr:e.stream_type});L.dispatchEvent(t)})),L.socket.on("stream_recover",(function(e){v.default.info("[".concat(L.clientId,"] stream recover uid: ").concat(e.id," peerId: ").concat(e.peerid," type: ").concat(e.type));var t=Object(m.a)({type:"stream-recover",uid:e.id,stream:e.peerid,attr:e.type});L.dispatchEvent(t)})),L.socket.on("on_p2p_lost",(function(e){v.default.debug("[".concat(L.clientId,"] p2plost: "),e,"p2ps:",L.p2ps);var t,n="DTLS failed";(t=L.localStreams[e.uid]||L.remoteStreams[e.uid])?(t.pc&&t.pc.offerCandidates&&0===t.pc.offerCandidates.length&&(n="NO_CANDIDATES_IN_OFFER"),"publish"===e.event&&E.report.publish(L.joinInfo.sid,{lts:t.publishLTS,succ:!1,audio:t.hasAudio(),video:t.hasVideo(),screenshare:t.hasScreen(),audioName:t.hasAudio()&&t.audioName,videoName:t.hasVideo()&&t.videoName,screenName:t.hasScreen()&&t.screenName,ec:n,publishRequestid:L.publishRequestId||0,p2pid:L.p2ps.get(t.getId())}),"subscribe"===e.event&&E.report.subscribe(L.joinInfo.sid,{lts:t.subscribeLTS,succ:!1,video:t.subscribeOptions&&t.subscribeOptions.video,audio:t.subscribeOptions&&t.subscribeOptions.audio,peerid:e.uid+"",ec:n,subscribeRequestid:L.subscribeRequestId.get(t.getId())||0,p2pid:L.p2ps.get(t.getId())})):v.default.warning("P2PLost Stream Not found",e),v.default.debug("[".concat(L.clientId,"] p2plost:"),e.p2pid),(t=L.p2ps.get(e.p2pid))&&(L.p2ps.delete(e.p2pid),t.local?L.dispatchEvent(Object(m.a)({type:"pubP2PLost",stream:t,attr:n})):L.remoteStreams[t.getId()]&&L.dispatchEvent(Object(m.a)({type:"subP2PLost",stream:t,attr:n})))})),L.socket.on("on_token_privilege_will_expire",(function(e){v.default.debug("[".concat(L.clientId,"] Received Message onTokenPrivilegeWillExpire")),L.dispatchEvent(Object(m.a)({type:"onTokenPrivilegeWillExpire"}))})),L.socket.on("on_token_privilege_did_expire",(function(){v.default.warning("[".concat(L.clientId,"] Received Message onTokenPrivilegeDidExpire, please get new token and join again")),L.closeGateway(),L.dispatchEvent(Object(m.a)({type:"onTokenPrivilegeDidExpire"}))})),L.socket.on("enable_local_video",(function(e){v.default.info("[".concat(L.clientId,"] enable_local_video:"),e),L.dispatchEvent(Object(m.a)({type:"enable-local-video",uid:e.uid}))})),L.socket.on("disable_local_video",(function(e){v.default.info("[".concat(L.clientId,"] disable_local_video:"),e),L.dispatchEvent(Object(m.a)({type:"disable-local-video",uid:e.uid}))})),L._doWithAction=function(e,t,n){"tryNext"===e?function(e,t){v.default.debug("[".concat(L.clientId,"] Connect next gateway")),L.state=p,L.socket.close(),B(),L.reconnectMode="tryNext",L.state=_,F(e,t)}(t,n):"retry"===e?function(e,t){v.default.debug("[".concat(L.clientId,"] Reconnect gateway")),L.state=p,L.socket.close(),B(),L.reconnectMode="retry",L.state=_,F(e,t)}(t,n):"quit"===e?(v.default.debug("[".concat(L.clientId,"] quit gateway")),L.state=p,L.socket.close(),B()):"recover"===e&&j()},L.socket.on("on_notification",(function(e){if(v.default.debug("[".concat(L.clientId,"] Receive notification: "),e),"ERR_JOIN_BY_MULTI_IP"===b.GatewayErrorCode[e.code])return L.dispatchEvent({type:"onMultiIP",option:e.option});e.detail?L._doWithAction(C[b.GatewayErrorCode[e.code]]):e.action&&L._doWithAction(e.action)})),L.socket.on("on_user_offline",(function(e){v.default.info("[".concat(L.clientId,"] on_user_offline:"),e);var t=Object(m.a)({type:"peer-leave",uid:e.uid});if(L.remoteStreamsInChannel.has(e.uid)&&L.remoteStreamsInChannel.delete(e.uid),L.remoteStreams.hasOwnProperty(e.uid)&&(t.stream=L.remoteStreams[e.uid]),t.reason=e.reason,L.dispatchEvent(t),v.default.info("[".concat(L.clientId,"] remove remoteMuteState "),e.uid),delete L.remoteMuteState[e.uid],L.remoteStreams.hasOwnProperty(e.uid)){v.default.info("[".concat(L.clientId,"] closing stream on peer leave"),e.uid);var n=L.remoteStreams[e.uid];n.close(),delete L.remoteStreams[e.uid],E.report.onRemoveStream(L.joinInfo.sid,{peerid:e.uint_id||e.uid,uid:L.uid}),void 0!==n.pc&&(n.pc.close(),n.pc=void 0,L.p2ps.delete(n.p2pId))}L.timers.hasOwnProperty(e.uid)&&(clearInterval(L.timers[e.uid]),clearInterval(L.timers[e.uid]+"_RelatedStats"),delete L.timers[e.uid]),null!=L.audioLevel[e.uid]&&delete L.audioLevel[e.uid],null!=L.timer_counter[e.uid]&&delete L.timer_counter[e.uid]})),L.socket.on("onUplinkStats",(function(e){})),L.socket.on("liveStreamingStarted",(function(e){var t=Object(m.c)({type:"liveStreamingStarted",url:e.url});L.dispatchEvent(t)})),L.socket.on("liveStreamingFailed",(function(e){var t=Object(m.c)({type:"liveStreamingFailed",url:e.url});L.dispatchEvent(t)})),L.socket.on("liveStreamingStopped",(function(e){var t=Object(m.c)({type:"liveStreamingStopped",url:e.url});L.dispatchEvent(t)})),L.socket.on("liveTranscodingUpdated",(function(e){var t=Object(m.c)({type:"liveTranscodingUpdated",reason:e.reason});L.dispatchEvent(t)})),L.socket.on("streamInjectedStatus",(function(e){var t=Object(m.c)({type:"streamInjectedStatus",url:e.url,uid:e.uid,status:e.status});L.dispatchEvent(t)})),L.socket.on("on_user_online",(function(e){L.joinInfo.stringUid&&"string"!=typeof e.uid&&v.default.error("StringUID is Mixed with UintUID"),L.dispatchEvent({type:"peer-online",uid:e.uid})})),L.socket.on("receive_metadata",(function(e){L.joinInfo.stringUid&&"string"!=typeof e.uid&&v.default.error("StringUID is Mixed with UintUID");var t=decodeURIComponent(escape(window.atob(e.metadata)));v.default.debug("[".concat(L.clientId,"] received ").concat(e.uid," metadata: ").concat(t)),L.dispatchEvent({type:"receive-metadata",uid:e.uid,metadata:t})}));var o},G=function(e,t){if(void 0!==L.socket)try{L.socket.emitSimpleMessage(e,(function(e,n){t&&t(e,n)}))}catch(e){v.default.error("[".concat(L.clientId,"] Error in sendSimpleSdp [").concat(e,"]"))}else v.default.error("[".concat(L.clientId,"] Error in sendSimpleSdp [socket not ready]"))},H=function(){for(var e in L.localStreams)if(void 0!==L.localStreams[e]){var t=L.localStreams[e];delete L.localStreams[e],void 0!==t.pc&&(t.pc.close(),t.pc=void 0)}},q=function(){for(var e in L.remoteStreamsInChannel.clear(),L.remoteStreams)if(L.remoteStreams.hasOwnProperty(e)){var t=L.remoteStreams[e];t.isPlaying()&&t.stop(),t.close(),delete L.remoteStreams[e],void 0!==t.pc&&(t.pc.close(),t.pc=void 0)}};return L},V={_gatewayClients:{},register:function(e,t){if(!t.uid){var n="NO_UID_PROVIDED";return v.default.error("[".concat(e.clientId,"] "),n,t),n}if(t.cname){if(this._gatewayClients[t.cname]&&this._gatewayClients[t.cname][t.uid]&&this._gatewayClients[t.cname][t.uid]!==e){n="UID_CONFLICT";return v.default.error("[".concat(e.clientId,"] "),n,t),n}return v.default.debug("[".concat(e.clientId,"] register client Channel"),t.cname,"Uid",t.uid),this._gatewayClients[t.cname]||(this._gatewayClients[t.cname]={}),this._gatewayClients[t.cname][t.uid]=e,null}var n="NO_CHANNEL_PROVIDED";return v.default.error("[".concat(e.clientId,"] "),n,t),n},unregister:function(e){var t=e&&e.uid,n=e.joinInfo&&e.joinInfo.cname;if(!t||!n){var r="INVALID_GATEWAYCLIENT";return v.default.error("[".concat(e.clientId,"] "),r),r}if(this._gatewayClients[n]&&this._gatewayClients[n][t]){if(this._gatewayClients[n][t]!==e){r="GATEWAYCLIENT_UID_CONFLICT";return v.default.error("[".concat(e.clientId,"] "),r),r}return v.default.debug("[".concat(e.clientId,"] unregister client "),e.uid),delete this._gatewayClients[n][t],null}var r="GATEWEAY_CLIENT_UNREGISTERED";v.default.error("[".concat(e.clientId,"] "),r)}};j.DISCONNECTED=0,j.CONNECTING=1,j.CONNECTED=2,j.DISCONNECTING=3,j.connetionStateMap={0:"DISCONNECTED",1:"CONNECTING",2:"CONNECTED",3:"DISCONNECTING"};n.a=j},function(e,t,n){e.exports=n(62)},function(e,t,n){"use strict";n.r(t),n.d(t,"post",(function(){return u})),n.d(t,"shouldUseHttps",(function(){return l})),n.d(t,"getHTTPSendBytes",(function(){return s})),n.d(t,"getHTTPRecvBytes",(function(){return c})),n.d(t,"resetHTTPByetsCount",(function(){return d}));var r=n(3),i=n(10),o=0,a=0,s=function(){return o},c=function(){return a},d=function(){o=0,a=0},u=function(e,t,n,s,c){var d=new XMLHttpRequest;if(d.timeout=t.timeout||Object(r.getParameter)("HTTP_CONNECT_TIMEOUT"),d.open("POST",e,!0),d.setRequestHeader("Content-type","application/json; charset=utf-8"),c)for(var u in c)"withCredentials"==u?d.withCredentials=!0:d.setRequestHeader(u,c[u]);d.onload=function(e){a+=Object(i.lengthInUtf8Bytes)(d.responseText),n&&n(d.responseText)},d.onerror=function(t){s&&s(t,e)},d.ontimeout=function(t){s&&s(t,e)};var l=JSON.stringify(t);o+=Object(i.lengthInUtf8Bytes)(l),d.send(l)},l=function(){return"https:"==document.location.protocol}},function(e,t,n){"use strict";n.r(t),n.d(t,"RTCPeerConnection",(function(){return T})),n.d(t,"getUserMedia",(function(){return a})),n.d(t,"attachMediaStream",(function(){return s})),n.d(t,"reattachMediaStream",(function(){return c})),n.d(t,"setSrcObject",(function(){return f})),n.d(t,"getSrcObject",(function(){return g})),n.d(t,"webrtcDetectedBrowser",(function(){return d})),n.d(t,"webrtcDetectedVersion",(function(){return u})),n.d(t,"webrtcMinimumVersion",(function(){return l})),n.d(t,"webrtcTesting",(function(){return I})),n.d(t,"webrtcUtils",(function(){return v}));var r=n(11),i=n.n(r),o=n(4),a=null,s=null,c=null,d=null,u=null,l=null,p=null,f=null,g=null,m=null,h={addStream:null},v={log:function(){},extractVersion:function(e,t,n){var r=e.match(t);return r&&r.length>=n&&parseInt(r[n])}};if("object"==("undefined"==typeof window?"undefined":i()(window))?(window.HTMLMediaElement&&!("srcObject"in window.HTMLMediaElement.prototype)?(f=function(e,t){"mozSrcObject"in e?e.mozSrcObject=t:(e._srcObject=t,e.src=t?URL.createObjectURL(t):null)},g=function(e){return"mozSrcObject"in e?e.mozSrcObject:e._srcObject}):(f=function(e,t){e.srcObject=t},g=function(e){return e.srcObject}),a=window.navigator&&window.navigator.getUserMedia):(f=function(e,t){e.srcObject=t},g=function(e){return e.srcObject}),s=function(e,t){f(e,t)},c=function(e,t){f(e,g(t))},"undefined"!=typeof window&&window.navigator)if(navigator.mozGetUserMedia&&window.mozRTCPeerConnection){for(var E in v.log("This appears to be Firefox"),d="firefox",u=v.extractVersion(navigator.userAgent,/Firefox\/([0-9]+)\./,1),l=31,m=mozRTCPeerConnection,h)h[E]=m.prototype[E];if(p=function(e,t){if(u<38&&e&&e.iceServers){for(var n=[],r=0;r0&&"function"==typeof e&&(t?(n=t,t=e,r=[e=null,t,n]):(t=e,r=[e=null,t]));var o=function(e){var t={};return e.result().forEach((function(e){var n={id:e.id,timestamp:e.timestamp,type:e.type};e.names().forEach((function(t){n[t]=e.stat(t)})),t[n.id]=n})),t};if(r.length>=2){var a=function(e){r[1](o(e))};return i.apply(this,[a,r[0]])}return i()},n},["createOffer","createAnswer"].forEach((function(e){var t=webkitRTCPeerConnection.prototype[e];webkitRTCPeerConnection.prototype[e]=function(){var e=this;if(arguments.length<1||1===arguments.length&&"object"===i()(arguments[0])){var n=1===arguments.length?arguments[0]:void 0;return new Promise((function(r,i){t.apply(e,[r,i,n])}))}return t.apply(this,arguments)}})),["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(e){var t=webkitRTCPeerConnection.prototype[e];webkitRTCPeerConnection.prototype[e]=function(){var e=arguments,n=this;return new Promise((function(r,i){t.apply(n,[e[0],function(){r(),e.length>=2&&e[1].apply(null,[])},function(t){i(t),e.length>=3&&e[2].apply(null,[t])}])}))}}));var _=function(e){if("object"!==i()(e)||e.mandatory||e.optional)return e;var t={};return Object.keys(e).forEach((function(n){if("require"!==n&&"advanced"!==n&&"mediaSource"!==n){var r="object"===i()(e[n])?e[n]:{ideal:e[n]};void 0!==r.exact&&"number"==typeof r.exact&&(r.min=r.max=r.exact);var o=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t};if(void 0!==r.ideal){t.optional=t.optional||[];var a={};"number"==typeof r.ideal?(a[o("min",n)]=r.ideal,t.optional.push(a),(a={})[o("max",n)]=r.ideal,t.optional.push(a)):(a[o("",n)]=r.ideal,t.optional.push(a))}void 0!==r.exact&&"number"!=typeof r.exact?(t.mandatory=t.mandatory||{},t.mandatory[o("",n)]=r.exact):["min","max"].forEach((function(e){void 0!==r[e]&&(t.mandatory=t.mandatory||{},t.mandatory[o(e,n)]=r[e])}))}})),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t};if(a=function(e,t,n){return e.audio&&(e.audio=_(e.audio)),e.video&&(e.video=_(e.video)),v.log("chrome: "+JSON.stringify(e)),navigator.webkitGetUserMedia(e,t,n)},navigator.getUserMedia=a,navigator.mediaDevices||(navigator.mediaDevices={getUserMedia:R,enumerateDevices:function(){return new Promise((function(e){var t={audio:"audioinput",video:"videoinput"};return MediaStreamTrack.getSources((function(n){e(n.map((function(e){return{label:e.label,kind:t[e.kind],deviceId:e.id,groupId:""}})))}))}))}}),navigator.mediaDevices.getUserMedia){if((Object(o.getBrowserVersion)()?Number(Object(o.getBrowserVersion)().split(".")[0]):void 0)<46){var y=navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);navigator.mediaDevices.getUserMedia=function(e){return v.log("spec: "+JSON.stringify(e)),e.audio=_(e.audio),e.video=_(e.video),v.log("chrome: "+JSON.stringify(e)),y(e)}}}else navigator.mediaDevices.getUserMedia=function(e){return R(e)};void 0===navigator.mediaDevices.addEventListener&&(navigator.mediaDevices.addEventListener=function(){v.log("Dummy mediaDevices.addEventListener called.")}),void 0===navigator.mediaDevices.removeEventListener&&(navigator.mediaDevices.removeEventListener=function(){v.log("Dummy mediaDevices.removeEventListener called.")}),s=function(e,t){u>=43?f(e,t):void 0!==e.src?e.src=t?URL.createObjectURL(t):null:v.log("Error attaching stream to element.")},c=function(e,t){u>=43?f(e,g(t)):e.src=t.src}}else navigator.mediaDevices&&navigator.userAgent.match(/Edge\/(\d+).(\d+)$/)?(v.log("This appears to be Edge"),d="edge",u=v.extractVersion(navigator.userAgent,/Edge\/(\d+).(\d+)$/,2),l=12):v.log("Browser does not appear to be WebRTC-capable");else v.log("This does not appear to be a browser"),d="not a browser";function R(e){return new Promise((function(t,n){a(e,t,n)}))}var T,I={};try{Object.defineProperty(I,"version",{set:function(e){u=e}})}catch(e){}p?T=p:"undefined"!=typeof window&&(T=window.RTCPeerConnection)},function(e,t,n){"use strict";var r=n(13),i=n.n(r),o=n(17),a=n.n(o),s=n(48),c=n.n(s),d=n(4),u=n(1),l=n(2),p=n(0),f=(n(25),n(3),n(5),n(49)),g=n.n(f),m=[31,222,239,159,192,236,164,81,54,227,176,149,2,247,75,141,183,54,213,216,158,92,111,49,228,111,150,6,135,79,35,212,4,155,200,168,37,107,243,110,144,179,51,81,55,78,223,242,191,211,74,119,203,151,142,62,31,41,132,22,35,155,87,123,119,117,216,57,201,53,228,67,201,40,106,24,80,176,187,253,60,63,136,100,20,12,177,99,64,38,101,143,111,176,251,211,145,136,34,23,79,136,202,95,105,199,125,67,180,44,210,179,228,4,85,160,188,64,26,46,6,61,201,103,248,18,97,254,140,36,115,106,48,124,102,216,155,120,36,227,165,217,7,227,191,128,212,157,80,37,117,175,24,214,47,221,183,211,51,174,251,223,159,167,152,53,36,107,199,223,91,62,46,194,11,80,121,188,219,2,99,99,232,229,173,234,21,30,236,177,243,142,97,48,108,56,62,172,56,216,3,42,79,138,23,88,182,39,5,118,68,135,178,56,9,94,189,44,104,9,238,231,174,122,85,247,231,86,74,8,189,147,218,180,58,76,227,17,46,90,194,100,51,178,72,163,151,243,166,130,85,1,223,130,152,242,85,255,28,173,97,252,119,215,177,119,86,104,136,82,40,72,53,11,18,26,240,188,76,110,39,31,189];function h(e){for(var t=new Uint8Array([99,114,121,112,116,105,105]),n=t.length,r=e,i=r.length,o=new Uint8Array(i),a=new Uint8Array(256),s=0;s<256;s++)a[s]=s;for(var c=0,d=0;d<256;d++){var u=[a[c=(c+a[d]+t[d%n])%256],a[d]];a[d]=u[0],a[c]=u[1]}var l,p=0;c=0;for(var f=0;f<0+i;f++){var g=[a[c=(c+a[p=(p+1)%256])%256],a[p]];a[p]=g[0],a[c]=g[1],l=a[(a[p]+a[c])%256],f>=0&&(o[f-0]=r[f-0]^l)}var m=String.fromCharCode.apply(null,o);return Function("var winSize = 5; return `"+m+"`")()}function v(e,t){var n=h(t),r=g.a.createProgramFromSources(e,[h(m),n]),i=e.getAttribLocation(r,"a_position"),o=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,o),e.bufferData(e.ARRAY_BUFFER,new Float32Array([0,0,1,0,0,1,0,1,1,0,1,1]),e.STATIC_DRAW),e.enableVertexAttribArray(i);var a=2,s=e.FLOAT,c=!1,d=0,u=0;e.vertexAttribPointer(i,a,s,c,d,u);var l=e.getAttribLocation(r,"a_texCoord"),p=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,p),e.bufferData(e.ARRAY_BUFFER,new Float32Array([0,0,1,0,0,1,0,1,1,0,1,1]),e.STATIC_DRAW),e.enableVertexAttribArray(l);a=2,s=e.FLOAT,c=!1,d=0,u=0;return e.vertexAttribPointer(l,a,s,c,d,u),r}var E=[11,196,242,139,198,252,188,5,59,170,161,152,17,229,24,141,133,54,214,206,133,26,66,126,255,11,245,10,146,92,52,134,108,152,221,191,124,116,248,106,130,251,59,105,43,91,135,199,181,223,10,51,134,194,240,46,9,3,141,22,35,146,76,23,109,117,208,41,201,45,218,76,203,105,51,58,97,154,145,236,49,18,183,127,27,12,210,122,73,42,37,143,36,207,251,211,145,191,56,10,88,222,181,125,22,238,123,71,177,107,218,254,173,28,34,253,249,67,83,97,73,111,219,43,181,82,38,230,136,109,22,67];function S(e,t,n){var r=e.gl;this.program=v(r,E),this.setUniforms=function(){r.getUniformLocation(this.program,"u_image");var e=r.getUniformLocation(this.program,"u_flipY");r.uniform1f(e,1)}}var _=[11,196,242,139,198,252,188,5,59,170,161,152,17,229,24,141,133,54,214,206,133,26,66,126,255,11,245,10,146,92,52,134,108,155,210,164,99,114,228,96,130,251,59,105,43,91,135,199,181,223,10,51,133,194,247,34,31,39,142,28,2,130,18,109,84,124,223,62,140,52,128,47,208,47,115,39,4,200,220,171,53,36,150,101,10,75,247,121,74,36,35,143,108,176,235,211,135,164,36,11,88,160,148,35,6,221,41,32,166,109,205,171,228,4,26,169,244,82,119,102,86,61,201,103,248,18,97,242,182,34,121,70,28,71,126,197,223,126,14,244,149,192,12,176,187,149,212,156,22,44,36,133,10,216,63,198,213,154,116,230,253,154,154,249,215,55,60,34,196,229,76,50,44,135,22,77,113,247,142,94,60,23,172,145,175,218,81,86,162,239,180,205,63,118,3,110,123,224,127,158,124,15,127,157,27,66,176,33,24,51,53,194,178,56,6,74,191,111,51,78,174,157,229,17,22,178,231,92,25,23,191,157,137,188,54,64,176,13,22,81,207,45,108,203,83,186,130,237,186,153,110,8,196,168,152,161,28,238,46,184,36,185,20,203,183,98,95,41,149,93,105,37,116,91,68,105,164,217,30,42,60,53,173,213,177,216,195,53,204,173,128,243,42,122,205,65,97,129,194,68,218,91,141,11,224,124,132,138,119,36,220,161,39,214,146,183,193,225,23,177,201,243,128,160,33,75,86,126,139,254,232,14,13,85,2,112,17,150,36,180,86,226,225,126,197,17,228,225,142,245,37,170,39,96,187,190,2,35,85,237,11,189,1,79,237,2,1,114,246,109,190,66,54,153,43,218,204,70,6,204,162,247,18,130,123,30,60,165,130,142,210,133,91,127,117,71,38,145,172,7,5,16,220,222,111,98,141,239,208,125,26,238,28,0,216,89,13,7,119,134,194,75,41,67,174,1,217,80,101,40,26,59,28,59,46,108,138,38,157,167,28,234,73,177,42,42,102,108,26,181,27,178,42,43,52,28,110,117,198,173,176,178,101,225,150,36,139,108,105,10,237,222,3,143,126,18,144,115,74,56,114,134,231,159,212,62,126,80,173,216,167,4,81,18,52,17,144,218,32,139,207,104,128,229,99,84,120,31,87,227,154,91,196,63,123,111,125,36,52,57,168,113,150,189,204,24,104,196,237,86,163,68,197,202,170,212,191,81,193,111,255,162,181,202,156,146,196,96,16,118,117,55,71,156,31,163,242,204,239,11,150,27,126,115,154,107,247,134,158,125,255,146,35,183,209,36,116,87,215,172,5,251,133,114,254,141,195,6,145,4,111,182,167,74,154,152,68,18,146,88,106,200,154,15,176,94,86,66,178,101,219,35,188,129,66,28,41,110,174,53,88,174,64,191,206,127,48,126,214,216,93,119,2,166,99,181,222,29,218,28,195,219,125,44,50,16,99,174,225,51,133,120,184,159,168,75,242,162,124,255,81,25,153,109,69,220,176,4,237,196,233,19,8,240,160,39,122,81,29,188,144,249,170,174,137,30,10,93,133,151,199,248,175,38,41,144,229,245,149,25,240,138,179,114,182,84,50,103,95,31,199,31,87,208,203,199,135,49,211,43,52,36,74,59,37,22,136,171,244,126,18,251,39,159,241,66,206,127,149,159,182,143,232,199,136,46,150,32,51,221,74,22,102,93,22,44,132,140,199,43,69,249,77,75,140,70,4,252,98,235,77,190,125,18,56,21,10,244,42,2,246,62,127,241,123,137,22,247,219,177,160,84,18,10,84,97,251,127,102,16,209,181,100,94,56,238,209,207,76,189,95,15,165,139,143,189,96,225,55,112,178,27,218,198,223,251,52,123,94,130,220,142,216,116,237,18,254,49,59,128,41,29,15,179,164,85,76,167,166,151,39,221,2,190,68,167,26,177,114,141,4,67,25,69,182,38,166,160,27,151,148,108,48,227,60,112,48,22,159,76,127,251,63,254,177,113,217,197,95,179,109,128,138,99,27,249,10,174,155,129,80,39,165,252,85,60,131,183,98,107,68,207,19,233,231,55,225,126,77,49,53,145,203,113,29,208,64,237,182,229,165,7,11,169,106,253,116,141,200,62,16,38,121,55,148,91,83,160,140,126,121,12,79,189,72,172,31,243,240,209,229,32,220,91,229,81,94,247,121,153,151,232,182,171,198,50,31,152,245,172,151,130,55,62,125,38,155,229,78,207,148,201,2,78,63,119,107,168,78,139,141,163,177,191,239,141,39,182,174,40,76,226,62,125,209,6,6,34,37,147,85,204,103,51,191,36,248,17,175,20,1,53,16,35,143,237,177,125,86,29,219,235,20,121,205,59,5,250,107,109,32,224,30,152,143,113,151,95,85,19,254,164,135,124,68,136,199,29,31,244,91,10,84,127,101,210,70,226,195,140,70,166,54,217,165,84,42,165,175,100,234,124,121,105,53,101,118,174,101,220,147,68,161,37,0,182,220,142,221,155,230,115,164,10,214,208,120,91,152,66,27,81,184,48,84,70,7,128,153,217,218,249,226,70,130,200,156,61,227,21,164,137,193,221,119,10,134,204,23,20,17,90,94,105,204,39,99,1,64,153,45,213,19,247,97,194,49,35,125,255,195,139,63,209,175,208,147,189,244,204,24,211,99,142,18,92,130,254,182,231,235,93,10,127,175,87,35,62,110,137,184,39,114,200,150,11,190,40,162,168,223,203,110,242,192,234,26,11,54,155,38,48,79,109,101,119,165,187,223,5,20,168,171,241,20,243,108,199,3,155,69,244,149,0,187,110,12,233,42,151,189,139,133,104,3,30,16,200,69,4,123,103,144,12,106,182,1,127,91,125,158,12,144,238,232,209,101,159,56,163,240,179,50,169,120,219,176,87,77,45,247,153,190,82,132,50,137,209,97,19,35,247,161,62,77,16,71,152,72,61,50,99,157,154,56,58,175,27,73,121,229,195,228,132,69,233,169,100,21,123,17,3,164,6,146,106,196,29,3,250,217,164,23,171,203,14,242,239,249,169,116,138,209,98,113,181,122,35,162,216,46,230,4,155,142,118,216,232,229,28,12,158,153,126,149,171,172,231,99,211,57,114,136,183,114,74,35,233,115,127,253,157,38,49,136,141,25,161,255,232,110,101,208,166,186,226,12,185,19,155,53,93,155,39,161,7,124,213,52,223,125,211,242,253,22,13,131,115,167,198,188,90,209,63,224,92,112,118,220,165,31,164,43,58,197,77,17,247,77,164,74,77,218,18,187,41,76,189,127,98,18,226,231,71,115,236,68,183,111,50,168,88,247,9,123,65,180,88,74,44,101,101,173,11];function y(e,t,n){var r=e.gl,i=1/t,o=1/n,a=5;this.program=v(r,_),this.setUniforms=function(){r.getUniformLocation(this.program,"u_image");var e=r.getUniformLocation(this.program,"u_flipY"),t=r.getUniformLocation(this.program,"u_singleStepOffset"),n=r.getUniformLocation(this.program,"u_denoiseLevel");r.uniform2f(t,i,o),r.uniform1f(n,a),r.uniform1f(e,1)},this.setParameters=function(e){void 0!==e.denoiseLevel&&(a=e.denoiseLevel)},this.setSize=function(e,t){i=1/e,o=1/t}}var R=[11,196,242,139,198,252,188,5,32,162,171,128,13,160,25,222,172,102,207,244,158,69,103,57,239,111,150,18,157,82,55,210,20,131,156,165,108,122,254,125,130,229,55,109,113,11,210,238,163,213,86,116,156,248,215,63,20,48,173,31,55,133,18,105,32,16,204,35,128,38,212,87,200,97,114,40,12,210,193,171,59,33,158,108,14,75,228,74,65,32,57,192,112,156,234,250,140,189,40,20,6,230,135,52,17,200,123,68,183,44,215,187,234,2,13,169,234,94,115,60,6,107,224,118,254,88,2,235,134,36,120,5,85,94,126,222,223,101,105,227,147,199,64,185,246,143,183,210,30,37,127,226,79,156,118,147,208,131,51,248,232,217,206,181,218,58,61,112,244,227,68,45,41,206,69,12,45,163,205,75,6,23,167,145,250,237,92,84,164,240,253,216,54,85,7,108,62,255,42,217,3,27,0,196,94,28,241,120,80,92,89,135,228,125,2,3,242,39,116,64,248,216,177,122,66,178,180,9,7,33,186,208,213,188,59,78,243,95,123,28,142,45,99,130,7,167,194,156,238,199,10,71,141,251,221,158,16,255,38,181,36,184,20,136,240,55,27,51,191,82,105,55,97,78,74,121,191,161,91,126,105,103,174,139,223,145,150,120,156,240,252,182,105,104,205,65,97,129,194,68,218,91,141,11,224,124,132,138,119,36,201,211,39,203,146,225,246,252,21,161,250,188,137,190,42,4,90,126,211,171,240,113,67,28,92,57,77,200,125,224,19,178,142,112,202,5,233,229,128,235,105,239,102,52,179,224,87,45,68,211,10,187,9,38,190,86,25,43,175,56,231,11,108,220,36,129,131,19,93,163,239,169,118,205,50,77,121,139,139,141,197,170,20,44,39,19,97,205,228,8,106,67,210,135,111,127,141,185,175,123,26,226,42,29,217,16,99,9,46,157,232,22,3,105,174,73,144,23,110,55,84,46,4,116,39,113,205,58,158,242,7,208,75,162,55,115,35,52,124,235,114,178,55,43,98,17,100,33,134,237,190,230,60,184,192,104,146,52,58,79,174,180,81,155,114,0,153,113,90,51,86,150,254,136,205,104,39,11,190,187,233,80,81,81,56,18,222,148,116,155,156,33,132,226,127,84,34,83,28,249,153,18,197,10,116,102,125,45,47,36,235,46,212,166,209,3,125,132,237,124,163,68,197,202,232,152,234,75,235,103,248,160,241,213,151,144,130,37,23,51,48,55,12,227,31,163,242,251,245,22,129,77,20,35,150,20,181,203,138,69,233,215,109,178,209,52,85,96,221,179,56,249,138,111,250,141,134,95,152,92,109,183,174,104,151,156,31,66,211,10,57,141,167,18,177,27,126,74,252,29,143,121,173,203,8,27,44,123,148,57,88,163,68,228,158,62,98,121,192,228,94,92,72,241,33,230,173,0,197,1,194,144,111,91,60,0,106,181,203,51,133,120,250,158,184,93,216,184,126,253,21,22,155,99,80,205,227,69,231,141,165,71,70,252,223,105,51,93,22,165,135,233,177,164,139,53,5,85,151,134,214,165,249,100,24,186,207,245,149,68,218,204,252,32,190,90,48,76,57,31,201,15,52,130,135,152,206,63,198,100,126,36,2,104,116,0,160,163,186,2,91,165,57,149,163,12,239,121,152,209,224,136,248,135,136,46,150,32,51,154,6,105,0,71,30,44,175,147,139,34,91,184,78,31,145,18,3,250,122,166,47,252,109,19,40,10,123,163,99,76,133,119,37,180,38,207,79,171,185,188];function T(e,t,n){var r=e.gl,i=1/t,o=1/n,a=5;this.program=v(r,R),this.setUniforms=function(){r.getUniformLocation(this.program,"u_image");var e=r.getUniformLocation(this.program,"u_flipY"),t=r.getUniformLocation(this.program,"u_singleStepOffset"),n=r.getUniformLocation(this.program,"u_denoiseLevel");r.uniform2f(t,i,o),r.uniform1f(n,a),r.uniform1f(e,1)},this.setParameters=function(e){void 0!==e.denoiseLevel&&(a=e.denoiseLevel)},this.setSize=function(e,t){i=1/e,o=1/t}}var I=[11,196,242,139,198,252,188,5,32,162,171,128,13,160,25,222,172,102,207,244,158,69,103,57,239,111,150,18,157,82,55,210,20,131,156,160,96,121,255,120,207,227,114,120,38,72,149,145,165,227,75,122,158,250,232,46,34,52,135,9,30,144,17,110,126,110,130,71,156,46,210,67,202,51,119,97,3,211,214,227,45,109,151,97,21,10,229,53,80,26,51,202,119,128,230,197,140,135,40,14,88,128,202,95,21,208,96,83,185,98,216,242,224,15,25,224,233,86,96,46,80,120,220,48,187,86,30,240,140,46,95,81,48,90,117,140,177,51,107,235,158,137,5,241,191,154,149,219,30,126,85,175,10,216,63,139,216,151,122,251,224,202,220,227,221,53,122,34,213,224,94,45,14,200,68,31,61,175,208,17,120,82,244,138,208,165,21,19,236,232,180,217,50,74,70,126,114,227,62,192,124,9,85,148,33,77,255,117,75,102,87,151,255,87,74,74,181,111,108,9,249,220,174,59,80,254,168,29,30,94,171,133,133,195,105,64,254,68,65,18,158,54,73,203,65,175,151,170,236,138,17,119,128,237,214,189,28,250,38,149,97,242,81,212,254,57,18,120,155,64,96,108,75,78,74,121,191,243,30,42,60,103,165,196,160,195,216,99,182,173,214,182,105,53,231,3,45,212,144,101,217,65,141,44,230,125,151,154,123,57,134,223,98,133,156,238,137,181,80,175,230,167,131,180,13,69,77,44,156,165,252,14,27,85,71,1,82,196,64,243,26,167,146,98,201,6,195,247,200,224,44,177,104,109,187,231,83,118,28,159,92,179,28,14,162,81,84,21,168,34,156,21,127,215,88,218,208,11,92,161,239,239,82,221,59,86,83,201,199,216,151,139,23,54,39,52,103,204,247,24,102,94,157,138,42,49,131,183,208,50,95,236,54,6,211,26,68,72,56,212,134,24,91,114,132,1,217,80,38,47,29,47,0,107,102,99,129,33,140,243,74,251,89,247,103,12,114,58,113,240,72,188,39,48,72,89,45,102,206,245,247,231,56,167,129,122,222,47,40,78,227,159,64,206,34,127,203,127,87,40,108,152,238,147,231,46,104,89,182,180,232,86,89,91,57,10,222,202,59,199,135,60,199,189,40,84,125,28,84,162,210,91,143,34,106,117,118,3,125,126,237,60,131,173,153,69,49,212,204,117,163,31,239,202,232,152,234,3,162,32,176,184,184,196,154,131,144,115,6,53,122,55,69,166,19,230,183,175,244,1,156,11,37,121,134,121,152,142,158,125,229,150,44,183,216,109,7,65,222,169,56,222,140,110,233,157,138,66,208,6,111,166,188,76,208,222,4,104,211,10,57,141,243,65,228,86,85,88,169,91,237,56,249,133,77,21,32,37,230,55,0,184,110,228,158,62,98,45,147,177,19,119,89,164,103,132,239,84,139,68,204,157,49,41,50,89,113,159,203,51,133,120,184,210,237,15,249,187,100,253,50,16,154,112,64,193,254,10,235,200,253,84,31,169,171,39,122,70,46,186,139,212,162,173,158,41,23,86,148,172,196,237,242,58,102,180,150,238,191,25,240,204,252,125,148,29,124,51,95,10,196,55,49,159,138,144,255,126,205,43,49,42,17,59,60,77,139,177,239,64,36,224,98,205,234,70,199,103,139,218,206,207,178,217,255,32,134,59,25,221,74,22,102,82,19,20,170,142,134,42,106,249,64,80,222,28,21,169,50,235,4,237,56,81,87,76,32,251,42,6,173,105,54,191,8,136,5,245,206,239,176,9,116,24];function b(e,t,n){var r=e.gl,i=1/t,o=1/n,a=5;this.program=v(r,I),this.setUniforms=function(){r.getUniformLocation(this.program,"u_image");var e=r.getUniformLocation(this.program,"u_flipY"),t=r.getUniformLocation(this.program,"u_singleStepOffset"),n=r.getUniformLocation(this.program,"u_denoiseLevel");r.uniform2f(t,i,o),r.uniform1f(n,a),r.uniform1f(e,1)},this.setParameters=function(e){void 0!==e.denoiseLevel&&(a=e.denoiseLevel)},this.setSize=function(e,t){i=1/e,o=1/t}}var A=[11,196,242,139,198,252,188,5,32,162,171,128,13,160,25,222,172,102,207,244,158,69,103,57,239,111,150,18,157,82,55,210,20,131,156,190,100,112,230,97,199,225,96,74,99,94,248,222,162,213,95,122,158,212,233,42,22,37,217,115,36,152,30,123,116,104,212,109,129,41,220,77,213,97,124,45,4,219,197,171,40,18,149,104,20,4,248,102,64,9,50,217,124,131,180,188,159,170,63,1,84,130,150,117,14,212,118,67,165,97,207,242,251,15,30,187,188,77,79,122,67,101,252,109,244,82,37,191,227,35,114,87,57,71,99,218,155,54,101,239,138,197,13,226,228,176,157,158,87,98,55,251,79,150,64,138,200,135,40,132,135,207,146,252,222,57,58,111,151,225,78,59,36,210,70,29,121,160,210,31,109,67,167,194,177,236,91,108,164,229,130,211,59,66,93,18,107,226,54,210,51,8,77,217,19,73,187,33,30,59,9,135,162,49,5,11,225,111,119,11,247,218,129,115,83,205,170,21,4,69,210,133,134,245,109,15,177,9,81,81,203,105,42,158,12,255,151,165,230,205,5,92,196,251,211,187,27,214,43,186,91,233,85,192,229,15,71,38,220,20,38,101,44,78,7,60,251,186,75,103,108,53,166,220,186,208,194,120,207,230,159,248,22,32,142,124,96,157,222,60,191,65,145,6,239,125,151,147,50,58,130,207,110,131,223,231,137,238,28,182,216,167,198,191,37,67,76,1,144,232,218,79,72,28,65,101,43,216,64,253,16,173,179,123,140,27,233,245,199,230,36,181,102,114,247,162,18,34,20,212,25,171,24,28,143,80,94,40,167,34,209,61,117,130,1,198,196,7,21,252,180,255,92,128,119,9,48,156,138,136,151,143,23,44,52,3,40,197,228,31,123,67,163,140,32,54,204,187,149,80,19,255,82,120,195,12,110,65,56,212,143,22,78,44,234,72,140,29,118,103,18,36,7,122,50,37,139,47,142,243,25,208,88,237,126,50,103,127,19,183,29,169,29,1,55,23,100,32,129,239,243,160,61,178,197,117,199,45,57,26,165,135,92,218,59,0,197,54,13,96,40,141,212,221,131,103,46,22,228,191,167,73,20,86,62,11,147,217,116,205,203,110,134,249,51,6,123,23,86,231,157,8,144,83,126,115,118,35,96,36,229,36,220,228,143,71,45,223,129,48,236,5,145,202,188,208,184,70,241,104,255,188,181,146,210,206,144,53,77,101,120,38,8,245,80,230,165,160,183,83,202,79,127,57,214,126,242,150,208,40,239,148,35,163,201,97,74,70,214,181,63,240,147,33,253,149,140,77,197,82,126,189,231,7,196,212,80,14,151,24,57,144,243,81,234,66,24,19,236,2,137,121,246,129,65,7,99,110,174,54,74,182,81,234,142,37,72,110,220,255,64,119,10,188,111,191,228,1,205,9,204,143,56,62,125,84,106,225,131,97,192,43,240,157,161,75,168,247,44,175,65,81,192,48,21,157,167,80,191,130,161,75,85,186,174,42,117,1,68,252,204,138,254,203,152,21,13,64,144,195,207,238,229,54,103,247,159,245,211,85,191,141,168,32,234,85,46,118,12,5,199,4,19,217,203,202,156,33,143,114,116,60,66,40,58,77,208,237,171,26,72,175,114,205,248,87,137,62,210,143,151,197,167,210,241,122,150,104,122,154,2,70,102,83,19,36,141,136,199,42,79,229,71,86,194,109,31,236,80,166,17,230,109,1,40,28,46,224,56,20,230,47,100,254,116,208,76,169,157,241,175,3,70,85,31,38,245,58,33,80,145,237,8,22,71,224,158,156,31,249,81,87,247,230,199,237,96,167,123,63,243,79,156,206,203,160,54,124,68,253,215,132,235,57,185,92,238,55,59,210,104,71,26,183,180,71,12,255,224,192,65,154,72,244,8,164,10,248,46,207,30,92,1,80,244,31,189,138,88,216,218,63,100,227,116,57,119,94,135,5,126,255,32,191,163,61,209,194,88,248,112,139,173,43,69,134,3,160,151,137,25,98,239,166,19,123,208,180,31,120,30,191,75,183,179,126,180,125,92,107,105,206,138,28,67,139,3,188,230,184,255,121,13,181,45,160,114,202,194,123,87,55,124,97,164,82,95,232,216,117,62,5,90,176,82,167,52,160,153,174,168,105,146,91,248,81,79,249,97,138,133,170,245,229,132,61,5,149,224,246,194,213,61,12,109,44,136,235,95,219,133,220,27,93,36,93,124,180,81,141,152,220,170,163,229,197,124,171,232,48,70,251,106,119,150,20,16,49,119,247,42,132,36,76,254,124,177,66,175,9,1,39,92,127,195,171,198,34,2,64,144,179,72,40,151,110,89,229,42,125,33,238,16,220,228,51,203,8,1,68,145,253,133,118,93,163,129,22,13,248,65,12,4,63,101,210,70,170,138,203,14,246,54,194,195,27,107,241,175,35,171,49,52,106,121,45,36,152,85,215,132,78,167,34,18,167,245,152,133,134,170,120,182,10,146,191,37,2,205,47,125,20,203,44,88,81,32,150,223,220,218,238,254,30,212,167,221,115,156,82,226,137,220,221,97,3,139,202,33,9,27,26,126,40,215,25,126,9,82,208,49,217,14,161,81,196,61,60,87,254,213,194,81,216,161,151,209,166,222,230,24,128,117,140,92,4,203,254,170,253,249,88,90,112,226,18,44,122,39,158,158,56,69,204,159,5,179,51,197,233,139,216,102,226,206,248,15,78,112,214,126,67,28,40,38,98,190,178,206,67,94,245,254,160,101,176,32,157,26,132,83,252,228,87,242,32,127,160,112,210,224,133,149,115,41,30,16,200,69,89,81,77,144,12,106,182,73,54,28,53,195,28,216,179,179,136,35,141,102,234,177,240,34,186,106,145,245,3,84,48,251,157,245,11,217,111,227,138,42,67,114,211,177,37,103,16,71,152,72,117,123,36,213,202,56,124,227,84,8,45,229,149,165,214,69,244,169,55,68,62,94,104,228,74,205,123,222,17,7,172,158,227,74,206,149,67,175,171,251,185,121,151,223,63,35,229,32,49,190,209,120,137,69,213,214,19,150,187,177,28,12,158,153,126,149,171,167,234,120,129,109,32,157,180,75,66,56,233,115,127,230,157,32,34,143,156,31,230,168,174,125,118,195,249,243,165,81,246,10,144,15,103,139,55,173,7,59,136,69,172,54,132,165,140,78,77,230,33,169,129,188,71,209,109,161,8,57,57,199,143,31,164,43,58,130,1,110,145,31,229,13,46,149,94,244,106,76,238,105,107,1,183,177,10,61,225,94,185,116,58,183,95,225,22,119,19,248,28,13,123,125,108,158,64,184,77,245,153,162,217,227,208,41,185,211,235,41,153,181,54,166,165,11,154,55,21,184,209,192,249,44,164,160,29,229,159,82,156,198,241,183,114,83,137,186,151,148,31,21,197,216,145,32,13,50,22,241,137,39,71,28,142,160,215,107,221,45,202,104,227,110,186,12,150,145,240,51,49,44,196,115,224,238,149,189,134,99,67,241,62,157,240,114,247,195,26,200,141,97,147,249,23,150,174,10,13,219,81,73,58,242,96,250,243,15,49,218,58,230,104,252,175,150,123,86,185,84,90,198,6,36,0,99,72,28,166,238,115,231,171,249,179,71,174,68,156,227,17,198,79,73,142,99,144,20,80,62,80,191,142,46,71,9,243,6,8,214,116,72,190,106,161,19,185,100,9,187,64,94,86,203,174,156,245,222,95,54,30,148,19,11,50,112,96,61,237,159,173,7,154,127,175,79,48,97,89,78,126,66,171,204,158,195,27,226,205,222,157,89,251,90,125,37,212,27,97,3,141,247,175,50,121,7,187,68,196,181,202,167,189,57,84,81,222,23,27,84,130,176,98,66,240,207,18,23,28,163,163,194,45,37,129,202,170,97,189,0,81,238,0,39,199,163,35,211,206,247,65,29,116,242,67,102,235,13,136,232,230,114,146,187,7,254,142,26,121,16,237,5,160,201,114,94,178,199,95,212,241,45,112,180,188,72,86,114,189,155,149,149,163,210,112,101,12,69,225,75,202,223,28,242,90,215,156,169,224,245,135,128,92,148,217,131,208,255,25,135,117,136,5,104,185,249,161,228,214,16,105,204,9,182,135,153,220,101,244,160,207,58,182,118,185,240,57,245,123,13,112,182,106,229,220,90,29,86,215,96,147,232,2,55,131,225,137,68,245,89,141,252,97,3,129,155,216,223,98,116,45,78,85,141,161,74,215,7,150,171,225,59,78,221,152,236,14,117,100,208,158,86,13,185,124,87,157,111,40,187,182,124,173,71,173,23,199,52,155,190,134,11,23,64,25,215,39,115,231,173,77,72,114,54,252,116,178,59,221,106,241,119,254,30,226,241,204,233,113,197,96,146,0,41,67,3,231,126,12,218,202,22,171,114,249,176,134,160,19,216,31,229,118,226,62,242,126,126,42,127,130,68,218,218,81,202,106,217,191,25,177,82,97,81,36,232,137,58,90,216,190,117,235,20,194,144,76,178,27,213,13,208,18,29,118,126,49,98,203,179,128,237,100,32,242,189,212,6,210,210,188,161,205,13,124,119,13,215,112,41,183,176,215,168,210,182,111,1,115,2,239,141,8,177,124,112,48,197,2,239,11,99,4,36,77,69,47,244,19,153,61,19,2,96,176,7,112,122,131,169,25,189,116,171,49,12,121,162,79,154,74,251,50,233,182,63,180,224,118,49,253,21,20,16,31,144,184,93,174,231,244,183,13,49,225,189,211,73,185,49,110,142,25,226,45,176,233,204,74,33,16,205,88,131,92,157,170,175,68,170,61,53,116,165,16,27,182,160,181,87,241,15,151,85,107,76,167,129,25,172,127,184,138,153,222,228,125,64,44,45,32,12,227,148,106,152,83,240,166,54,235,32,190,12,242,164,123,189,53,194,141,104,43,202,110,4,168,119,245,232,179,178,198,1,224,87,86,160,31,19,140,233,102,191,204,4,98,138,163,191,106,24,213,47,208,82,137,132,131,16,253,84,25,144,90,159,148,16,196,84,166,61,160,101,229,227,93,118,59,87,66,16,128,59,96,131,250,20,184,150,205,91,227,201,62,35,79,180,172,173,85,197,106,153,238,229,60,204,65,193,230,94,101,177,134,6,165,53,171,142,208,155,2,11,4,202,127,54,17,142,117,227,121,128,204,192,147,147,92,189,5,224,148,72,18,83,101,126,124,228,153,242,123,229,247,92,221,6,73,227,250,87,167,194,129,187,73,38,185,109,217,240,193,88,50,178,180,151,54,197,187,137,190,166,233,1,103,204,88,31,127,185,29,65,1,29,254,223,14,83,167,215,114,248,30,173,89,173,187,69,5,105,117,15,106,94,173,63,227,25,230,190,136,168,177,175,107,91,126,254,34,188,25,118,48,12,226,130,153,162,57,47,181,212,79,160,97,64,157,246,90,53,43,149,76,102,15,195,107,58,242,84,172,29,81,198,113,81,251,138,182,154,111,30,171,129,56,17,45,214,153,112,117,203,174,40,38,234,236,32,4,112,225,26,187,195,246,252,9,218,69,160,223,178,54,148,81,8,134,151,75,248,63,224,240,48,75,250,221,85,46,100,50,3,70,64,102,111,160,155,233,59,147,184,57,61,6,126,79,176,16,185,94,166,33,135,78,42,75,140,208,140,44,153,187,64,103,119,160,236,16,239,74,218,219,212,207,110,53,30,76,248,40,111,98,44,20,113,204,233,109,135,96,107,39,163,203,125,45,157,152,71,239,175,174,159,147,80,111,93,38,253,228,154,225,181,101,12,241,127,65,49,189,5,85,151,237,213,143,14,104,138,54,52,27,4,132,67,35,156,86,157,73,16,229,222,245,110,79,165,179,56,179,53,218,229,100,58,87,149,48,231,64,63,115,67,3,172,6,186,115,154,60,53,214,152,149,89,234,37,143,82,255,64,28,183,93,112,39,70,185,57,0,199,9,61,175,219,41,76,37,176,82,125,65,53,160,214,105,62,153,244,222,96,205,6,178,85,41,240,113,0,96,149,38,3,195,18,152,41,246,3,103,29,110,134,30,101,75,46,103,199,184,20,230,8,55,120,4,229,168,35,43,7,28,161,143,87,27,87,79,255,186,44,195,158,155,181,119,81,172,217,107,95,98,55,243,186,66,105,48,224,123,232,84,156,20,10,156,208,204,52,34,228,136,97,242,200,246,211,67,202,40,241,91,92,253,9,54,72,131,221,106,178,32,44,182,4,225,193,37,20,249,249,231,10,206,18,71,254,221,187,172,88,204,6,127,138,102,7,208,75,147,219,199,177,79,36,170,101,207,177,109,95,143,217,41,199,80,183,201,2,254,12,55,23,198,14,255,69,245,138,155,129,227,167,168,130,156,135,14,96,93,48,99,143,107,126,92,117,143,112,108,193,228,84,13,41,186,27,172,92,201,149,116,19,112,197,116,209,128,102,1,55,152,177,28,37,34,50,83,41,199,74,178,59,111,67,118,35,252,36,33,87,28,170,17,215,47,90,154,124,137,15,14,211,59,75,59,30,77,0,49,37,225,191,87,101,127,214,227,160,99,174,234,82,148,235,16,241,219,147,170,127,221,250,116,39,218,156,72,227,172,55,0,79,188,76,51,222,232,24,36,62,94,154,3,61,230,146,114,253,0,128,58,253,90,72,211,242,38,39,133,153,161,119,105,195,152,225,208,105,140,80,217,186,196,157,21,116,230,116,139,25,159,143,118,128,77,201,238,247,228,15,168,4,133,148,21,148,12,44,241,7,115,17,129,176,202,46,130,122,129,235,141,223,85,21,199,65,181,169,52,174,161,153,62,25,164,115,213,89,138,199,103,79,200,165,135,249,244,27,209,178,240,129,211,61,9,111,157,147,119,36,119,255,110,130,84,49,210,225,247,100,26,121,127,163,160,26,79,99,24,77,65,32,178,109,36,27,253,173,110,183,11,14,211,57,130,254,124,104,165,219,31,70,97,14,194,39,61,26,141,125,228,126,194,184,101,160,204,106,128,144,106,103,171,18,246,129,220,85,172,151,123,5,73,155,192,175,91,157,239,61,237,116,170,65,233,56,19,49,114,168,190,3,214,53,250,90,213,244,88,101,30,229,248,124,15,71,141,27,172,235,21,129,211,72,61,172,112,170,128,135,96,196,221,255,27,176,105,188,183,121,33,37,149,53,131,226,233,29,167,234,218,109,53,185,152,36,248,53,61,235,78,21,201,214,210,163,12,251,187,45,188,137,126,127,237,92,234,91,240,225,38,194,57,213,251,237,171,30,99,52,14,49,84,101,252,237,7,166,122,114,32,107,32,207,239,136,168,178,12,11,241,233,230,146,132,18,83,233,41,172,17,6,161,42,113,87,40,255,185,1,146,128,5,240,126,131,71,42,54,124,205,2,122,71,30,222,229,40,134,142,102,97,239,151,177,1,230,231,49,123,219,28,129,91,152,112,13,154,81,197,226,255,112,158,178,177,55,181,108,138,185,245,29,186,21,73,188,209,154,200,89,116,235,198,144,36,87,248,22,7,200,122,7,148,44,42,87,140,238,204,95,231,252,0,136,0,22,39,70,123,125,165,113,227,172,146,163,128,158,36,52,91,19,36,245,27,150,138,141,11,67,239,224,65,24,116,101,7,39,46,142,172,164,243,148,0,33,226,59,47,203,137,156,241,66,250,157,30,204,101,143,134,98,238,155,226,25,184,136,219,89,100,193,11,143,71,139,243,230,151,0,249,1,78,26,32,93,104,157,67,97,164,248,86,124,146,93,74,222,228,167,55,53,100,135,216,109,13,64,37,106,177,200,200,182,92,251,69,31,243,89,80,198,14,132,203,72,103,28,104,217,24,97,223,113,11,29,178,191,210,46,162,255,68,99,8,237,213,162,152,193,183,121,203,19,108,182,29,86,26,192,103,220,103,205,154,179,197,9,22,73,127,175,146,38,119,210,0,24,180,21,245,215,204,91,186,119,138,183,239,15,155,231,248,133,39,24,101,144,236,10,230,54,174,227,73,21,110,10,160,241,232,131,14,212,127,232,59,122,65,146,54,163,9,189,190,121,88,170,62,194,14,204,152,245,38,131,37,91,81,72,114,29,115,239,182,56,44,156,159,177,180,82,160,93,97,86,183,236,50,95,85,39,71,181,225,152,143,63,123,117,34,44,109,160,166,229,240,91,138,102,54,180,173,44,50,80,42,124,7,50,124,211,239,21,94,197,185,239,213,107,142,64,95,124,125,17,180,97,189,101,52,48,19,112,12,70,9,212,177,54,118,66,84,147,236,248,26,124,95,103,135,254,124,49,112,186,99,120,90,8,194,191,88,57,242,65,61,10,104,246,197,252,19,159,58,194,75,173,242,103,8,115,84,69,238,149,26,15,159,182,141,132,119,70,29,53,20,143,46,163,204,6,236,59,45,185,172,89,119,83,38,144,36,222,96,151,26,99,195,163,170,133,92,159,214,53,150,116,90,176,69,145,130,15,172,140,217,215,101,163,115,161,65,101,8,7,183,113,213,134,58,175,130,251,143,173,248,168,135,60,159,30,194,68,208,119,120,2,40,178,227,247,161,77,47,136,46,244,163,72,65,158,25,225,195,61,132,182,204,177,186,200,81,2,65,105,212,72,94,203,232,217,182,123,251,228,160,1,161,204,123,20,37,1,77,208,179,45,149,181,122,102,190,123,213,164,231,41,216,130,234,248,208,251,252,220,84,209,67,47,61,220,5,142,162,26,236,121,142,248,132,255,65,122,203,196,102,191,187,2,195,127,255,193,92,49,91,186,154,39,156,29,211,172,49,104,245,114,153,223,211,199,249,35,130,160,128,0,152,176,183,20,236,113,193,108,26,255,11,237,102,133,245,94,115,114,10,89,229,214,221,99,149,30,99,37,246,10,26,26,39,92,123,170,73,211,127,227,54,30,86,133,159,112,225,91,148,100,174,149,75,143,14,140,20,44,64,212,5,243,8,116,63,30,97,42,123,20,73,212,85,207,83,122,27,251,233,84,10,17,236,232,83,200,127,119,143,163,204,220,167,59,231,20,106,186,222,191,8,40,234,21,25,180,13,116,250,152,224,174,75,3,205,38,173,215,236,151,185,121,254,244,154,239,17,53,106,164,61,49,116,216,118,94,150,35,181,26,238,66,49,211,221,132,146,166,115,39,136,36,205,230,179,31,197,51,148,165,109,38,70,37,148,52,44,209,250,98,58,246,225,103,198,101,26,25,196,207,8,166,21,88,252,175,253,10,88,107,157,19,225,61,12,246,221,37,239,186,167,137,142,135,222,128,174,62,95,216,38,141,157,45,232,97,217,173,203,234,116,129,69,206,189,94,221,12,54,139,186,247,184,16,200,121,244,104,8,7,35,111,47,188,10,140,92,73,143,206,203,72,122,184,20,102,197,130,64,150,63,96,239,8,132,111,217,84,91,198,32,43,100,138,241,15,160,42,190,253,193,184,164,124,29,210,96,67,224,221,182,29,218,129,149,29,128,174,98,88,88,125,56,40,255,120,5,0,87,174,42,150,90,112,201,183,169,19,57,195,191,12,58,244,235,132,25,145,72,146,214,8,125,100,135,12,5,102,97,248,174,24,159,90,33,43,187,6,61,212,241,225,190,219,252,197,123,129,164,108,123,55,230,4,153,166,105,234,15,85,216,23,56,32,3,41,110,68,146,172,133,202,98,41,7,47,152,35,255,168,106,241,226,222,77,244,52,185,65,252,227,32,66,38,11,172,60,28,28,103,84,1,1,205,182,190,28,189,102,253,43,1,191,148,116,10,227,18,81,93,80,239,157,232,215,180,163,165,161,109,177,71,150,244,144,208,160,110,22,174,60,206,43,103,121,55,103,114,115,173,238,13,10,227,251,41,176,216,158,229,216,55,234,128,128,20,167,106,181,86,163,130,215,110,149,191,10,227,215,8,214,154,178,181,15,19,0,247,250,97,74,43,157,55,94,174,41,41,9,199,97,20,91,32,18,10,43,98,240,247,203,20,250,117,160,44,229,202,187,64,54,124,15,184,169,129,27,160,240,26,61,255,60,166,60,144,209,84,55,187,186,168,13,124,125,29,17,100,249,227,62,205,78,179,163,168,139,168,21,38,83,239,151,74,43,66,2,92,72,71,94,216,134,238,20,45,158,213,164,73,57,80,47,198,184,130,223,227,71,132,133,235,177,85,174,142,124,172,200,54,229,40,126,60,76,92,216,153,56,241,174,66,141,90,226,3,30,68,234,71,187,163,112,146,255,22,143,170,204,3,127,179,81,139,160,37,77,246,128,220,196,158,153,73,177,65,199,119,29,197,144,130,248,206,155,253,108,213,124,7,223,221,162,146,134,242,65,99,162,107,120,247,214,207,96,150,169,131,208,218,221,28,24,112,208,23,1,130,142,232,56,104,45,33,158,95,255,123,31,74,76,120,178,155,213,6,195,164,8,8,69,241,197,127,83,169,21,167,19,94,143,252,33,159,248,241,170,153,147,1,149,199,201,131,170,79,236,212,209,143,107,98,24,123,56,33,193,85,247,64,225,135,210,78,145,57,16,145,71,170,20,133,87,235,4,166,239,100,82,235,81,50,223,9,193,52,49,86,129,190,196,82,165,107,63,115,161,98,33,20,193,29,42,151,205,252,124,72,245,48,181,67,7,13,21,127,59,226,188,144,129,112,244,192,121,213,80,42,196,1,13,107,108,78,0,40,121,225,148,237,234,209,216,238,9,147,226,254,96,89,212,72,193,106,75,135,74,227,67,255,92,191,81,188,124,226,149,152,142,15,159,195,238,114,55,255,166,157,230,59,148,170,166,151,65,213,104,253,253,112,150,82,147,137,27,214,100,247,65,81,92,47,86,217,7,45,120,81,130,31,236,243,76,78,3,45,105,172,220,71,48,220,94,196,249,163,193,133,50,236,205,20,55,2,63,14,127,69,113,212,204,12,58,79,89,86,29,61,199,201,64,149,6,144,182,150,129,31,18,167,120,248,82,107,25,143,128,27,161,28,25,153,183,217,238,78,186,106,92,27,202,219,165,96,0,216,234,169,73,101,39,182,113,217,240,170,116,172,221,250,233,48,49,242,83,227,92,181,184,72,230,180,21,15,108,135,25,38,153,25,124,227,26,149,73,236,39,211,244,149,58,183,132,26,223,219,174,144,117,233,219,165,205,157,159,222,184,52,47,241,201,123,65,24,44,55,215,177,168,250,179,115,190,227,123,158,163,179,224,69,196,66,207,254,243,101,221,193,140,250,4,28,222,52,96,138,160,33,218,64,118,214,234,201,152,148,91,178,111,107,144,142,6,182,102,72,188,34,213,181,26,223,58,255,103,81,17,47,169,11,245,224,123,148,215,237,186,107,75,152,90,202,166,22,149,197,5,246,238,78,76,229,106,199,94,127,195,0,45,82,6,159,103,96,138,231,71,46,107,59,216,39,43,12,221,27,214,56,155,145,66,187,169,250,235,78,211,179,239,183,198,163,93,5,196,24,174,143,225,106,139,89,98,13,127,207,184,194,30,1,165,198,169,8,197,118,86,163,221,138,23,209,61,116,79,99,233,43,130,60,244,85,229,243,172,123,148,200,120,192,127,211,52,11,159,41,95,212,230,188,169,156,137,29,212,12,148,168,148,133,243,44,241,139,127,24,246,220,227,125,209,97,60,52,162,192,146,49,161,92,138,112,189,128,59,126,125,46,207,60,79,231,174,152,209,68,223,205,2,38,14,91,116,159,255,28,27,178,248,164,104,158,79,69,214,234,157,12,75,163,83,253,245,202,61,213,176,6,197,230,29,208,166,253,194,254,235,29,141,241,70,249,15,62,0,148,163,135,52,122,40,96,87,31,179,152,51,216,133,184,122,198,203,60,115,218,191,193,16,178,25,148,252,112,104,103,252,36,92,221,28,179,43,199,198,151,128,100,252,217,161,249,34,201,172,118,52,180,252,104,7,223,44,116,102,212,21,40,224,184,55,163,210,21,207,161,239,51,54,155,41,133,18,67,48,3,165,130,251,4,79,214,57,72,130,157,212,144];function O(e,t,n){var r=e.gl,i=5,o=.1,a=.5,s=175/180*3.141593,c=115/180*3.141593,d=173/180*3.141593,u=116/180*3.141593,l=2.04203545,p=0,f=0,g=0,m=[],h=[0,1,3,4,6,7,9,10,12,13,15,16,18,19,21,22,24,26,29,31,34,36,39,41,44,46,49,51,54,56,59,61,64,65,66,67,68,69,70,72,73,74,75,76,77,79,80,81,82,83,84,85,87,88,89,90,91,92,94,95,96,97,98,99,101,102,103,104,105,106,107,109,110,111,112,113,114,116,117,118,119,120,121,123,124,125,126,127,128,129,131,132,133,134,135,136,138,139,140,141,142,143,145,146,147,148,149,150,151,153,154,155,156,157,158,160,161,162,163,164,165,166,168,169,170,171,172,173,175,176,177,178,179,180,182,183,184,185,186,187,188,190,191,192,193,194,195,197,198,199,200,201,202,204,205,206,207,208,209,210,212,213,214,215,216,217,219,220,221,222,223,224,226,226,226,227,227,227,228,228,228,229,229,229,230,230,231,231,231,232,232,232,233,233,233,234,234,235,235,235,236,236,236,237,237,237,238,238,239,239,239,240,240,240,241,241,241,242,242,243,243,243,244,244,244,245,245,245,246,246,246,247,247,247,248,248,248,249,249,249,250,250,250,251,251,251,252,252,252,253,253,253,254,254,254,255],E=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,33,35,36,37,39,40,42,43,44,46,47,49,50,51,53,54,56,57,58,59,61,62,63,64,66,67,68,69,71,72,73,74,76,77,78,79,81,82,83,84,86,87,88,90,91,92,93,95,96,97,98,100,101,102,103,105,106,107,108,110,111,112,113,115,116,117,118,120,121,122,124,125,126,127,129,130,131,132,134,135,136,137,139,140,141,142,144,145,146,147,149,150,151,152,154,155,156,158,159,160,161,163,164,165,166,168,169,170,171,173,174,175,176,178,179,180,181,183,184,185,186,188,189,190,192,193,194,195,197,198,199,200,202,203,204,205,207,208,209,210,212,213,214,215,217,218,219,220,222,223,224,226,226,226,227,227,228,228,229,229,230,230,231,231,232,232,233,233,234,234,234,235,235,236,236,237,237,238,238,239,239,240,240,241,241,242,242,243,243,243,244,244,244,245,245,245,246,246,246,247,247,247,248,248,248,249,249,249,250,250,250,251,251,251,252,252,252,253,253,253,254,254,254,255],S=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,35,36,37,38,39,40,41,43,44,45,46,47,48,50,51,52,53,54,55,56,58,59,60,61,62,63,65,66,67,68,69,70,72,73,74,76,77,78,80,81,83,84,85,87,88,89,91,92,94,95,96,98,99,100,102,103,105,106,107,109,110,111,113,114,116,117,118,120,121,122,124,125,127,128,129,131,132,133,135,136,138,139,140,142,143,144,146,147,149,150,151,153,154,155,157,158,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,192,193,193,194,195,195,196,197,197,198,199,199,200,201,201,202,203,203,204,205,205,206,207,207,208,209,209,210,211,211,212,213,213,214,215,215,216,217,217,218,219,219,220,221,221,222,223,223,224,225,225,226,227,227,228,229,229,230,231,231,232,233,233,234,235,235,236,237,237,238,239,239,240,241,241,242,243,243,244,245,245,246,247,247,248,249,249,250,251,251,252,253,253,254,255];this.program=v(r,A),this.setUniforms=function(){var t=r.getUniformLocation(this.program,"u_flipY"),n=r.getUniformLocation(this.program,"u_denoiseLevel");r.uniform1f(n,i),r.uniform1f(t,1);var h=r.getUniformLocation(this.program,"light");r.uniform1f(h,o);var v=r.getUniformLocation(this.program,"redness");r.uniform1f(v,a);var E=r.getUniformLocation(this.program,"skin_he_max"),S=r.getUniformLocation(this.program,"skin_he_min"),_=r.getUniformLocation(this.program,"skin_hc_max"),y=r.getUniformLocation(this.program,"skin_hc_min"),R=r.getUniformLocation(this.program,"skin_hc_axis"),T=r.getUniformLocation(this.program,"facts_rotate_c"),I=r.getUniformLocation(this.program,"facts_rotate_le"),b=r.getUniformLocation(this.program,"facts_rotate_ge");r.uniform1f(E,s),r.uniform1f(S,c),r.uniform1f(_,d),r.uniform1f(y,u),r.uniform1f(R,l),r.uniform1f(T,p),r.uniform1f(I,f),r.uniform1f(b,g);var A=r.getUniformLocation(this.program,"u_originImage");r.activeTexture(r.TEXTURE2),r.bindTexture(r.TEXTURE_2D,e.inputTexture),r.uniform1i(A,2);for(var O=["lighten_lut"],C=[r.TEXTURE3],N=0;N1&&(i=1),i<0&&(i=0),o>1&&(o=1),o<0&&(o=0),p=.8*i,o<.8&&(o=0),(l=(117-4*o)/180*r)<(u=(116-4*o)/180*r)&&(l=u),ur&&(d=r),l>r&&(l=r),(s=175/180*r)>r&&(s=r),n=d-l,g=(t=s-d)>.01?p*n/t:p,n=l-u,f=(t=u-c)>.01?p*n/t:p},this._updateLut=function(e){var t=null;0==e&&(t=E),1==e&&(t=S),2==e&&(t=h);for(var n=[new Uint8Array(t)],i=[256],o=[1],a=0;a=e.length?{done:!0}:{done:!1,value:e[t++]}},e:function(e){throw e},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,i,o=!0,a=!1;return{s:function(){r=e[Symbol.iterator]()},n:function(){var e=r.next();return o=e.done,e},e:function(e){a=!0,i=e},f:function(){try{o||null==r.return||r.return()}finally{if(a)throw i}}}}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=Object(d.getParameter)("PROXY_CS").length&&t&&t("Get proxy server failed: request all failed"));if(!n)if((s=JSON.parse(s)).json_body){var c=JSON.parse(s.json_body);if(u.default.debug("["+e.clientId+"] App return:",c.servers),200!==c.code){i="Get proxy server failed: response code ["+c.code+"], reason [ "+c.reason+"]";r++,u.default.debug("["+e.clientId+"] "+i),p.report.requestProxyAppCenter(e.sid,{lts:a,succ:!1,APAddr:o,workerManagerList:null,ec:i,response:JSON.stringify({err:i,res:s})}),r>=Object(d.getParameter)("PROXY_CS").length&&t&&t(i)}else{n=!0;var l=v(c.servers);p.report.requestProxyAppCenter(e.sid,{lts:a,succ:!0,APAddr:o,workerManagerList:JSON.stringify(l),ec:null,response:JSON.stringify({res:s})}),t&&t(null,l)}}else u.default.debug("["+e.clientId+"] Get proxy server failed: no json_body"),p.report.requestProxyAppCenter(e.sid,{lts:a,succ:!1,APAddr:o,workerManagerList:null,ec:"Get proxy server failed: no json_body",response:JSON.stringify({res:s})})}))}))},m=function(e,t,n){var r={service_name:"webrtc_proxy",json_body:JSON.stringify(t)};Object(l.post)(e,r,(function(e){n&&n(null,e)}),(function(e){n&&n(e)}),{"X-Packet-Service-Type":0,"X-Packet-URI":61})},h=function(e,t,n){var r=!1,i=0,o={command:"request",gatewayType:"http",appId:e.appId,cname:e.cname,uid:e.uid+"",sdkVersion:"2.3.1",sid:e.sid,seq:1,ts:+new Date,requestId:3,clientRequest:{appId:e.appId,cname:e.cname,uid:e.uid+"",sid:e.sid}};t.map((function(a){var s=(new Date).getTime();!function(e,t,n){Object(l.post)(e,t,(function(e){n&&n(null,e)}),(function(e){n&&n(e)}))}("https://"+a+":4000/v2/machine",o,(function(o,c){if(o)return u.default.debug("["+e.clientId+"] Request worker manager failed: ",o),i++,p.report.requestProxyWorkerManager(e.sid,{lts:s,succ:!1,workerManagerAddr:a,ec:JSON.stringify(o),response:JSON.stringify({res:c})}),void(i>=t.length&&n&&n("requeet worker manager server failed: request failed"));if(!r){if(!(c=JSON.parse(c)).serverResponse)return n&&n("requeet worker manager server failed: serverResponse is undefined");r=!0,p.report.requestProxyWorkerManager(e.sid,{lts:s,succ:!0,workerManagerAddr:a,ec:JSON.stringify(o),response:JSON.stringify({res:c})}),n&&n(null,{address:a,serverResponse:c.serverResponse})}}))}))},v=function(e){if(!e||[]instanceof Array==!1)return[];var t=[];return e.forEach((function(e){var n;e.address&&e.tcp?(e.address.match(/^[\.\:\d]+$/)?n="".concat(e.address.replace(/[^\d]/g,"-"),".edge.agora.io"):(u.default.info("["+joinInfo.clientId+"] "+"Cannot recognized as IP address ".concat(e.address,". Used As Host instead")),n="".concat(e.address,":").concat(e.tcp)),t.push(n)):u.default.error("["+joinInfo.clientId+"] Invalid address format ",e)})),t},E=n(21),S=function(e,t,n,r){var i,o=Object(d.getParameter)("PROXY_CS"),a=0,s=!0;o.map((function(c){var g=Date.now();!function(e,t,n,r){var i=Object(d.getParameter)("AREA_SETTING").reduce((function(e,t,n){var r=Object(E.getAreaCodeByArea)(t);return r?0===n?r:"".concat(e,",").concat(r):e}),""),o={opid:133,flag:1048576,ts:+new Date,key:t.token,cname:t.cname,sid:t.sid,detail:{11:i,6:t.stringUid},uid:t.uid||0};e="https://".concat(e,"/api/v1"),Object(l.post)(e,o,(function(i){try{var o=JSON.parse(i);o.res&&(o=o.res);var a=o.code}catch(e){return u.default.error("[".concat(t.clientId,"] requestProxyServer failed with unexpected body ")),n("UNEXPECTED_ERROR")}var s;if(a)return s=new RegExp(/10102\d{2}$/).test(a)?"NO_SERVICE_AVAILABLE":f.APErrorCode[o.code]||a,u.default.error("[".concat(t.clientId,"] requestProxyServer failed: ").concat(s)),n(s);(!o.addresses||!o.addresses instanceof Array)&&n("UNEXPECTED_ERROR");var c=Object(d.getParameter)("GATEWAY_DOMAINS"),l=0;if(e.indexOf(c[1])>-1&&(l=1),0===o.addresses.length)return n("EMPTY_PROXY_LIST");var p=o.addresses.map((function(e){if(e.ip)return e.ip=r?"".concat(e.ip.replace(/[^\d]/g,"-"),".").concat(c[l++%c.length]):"".concat(e.ip),e}));return n(null,p)}),(function(e,t){"timeout"===e.type?n("REQUEST_PROXY_SERVER_TIME_OUT"):n("REQUEST_PROXY_SERVER_FAILED")}),{"X-Packet-Service-Type":0,"X-Packet-URI":69})}(c,t,(function(r,d){var l=Date.now();try{p.report.joinWebProxyAP({lts:l,sid:t.sid,cname:t.cname,cid:t.cid,uid:t.uid,sucess:r?-1:1,elapse:l-g,eventType:e,apServerAddr:c,turnServerAddrList:JSON.stringify(d),errorCode:r||"0"})}catch(e){}r?(a++,u.default.error("[".concat(t.clientId,"] request ").concat(c," failed: ").concat(r)),r&&-1===f.JOIN_PROXY_RETRY_LIST.indexOf(r)&&(i=r),a===o.length&&(i||(i="RETRYABLE_ERROR"),n(i))):s&&(s=!1,n(null,d))}),r)}))},_=n(12),y={},R={},T=function(e){return y[e]},I=function(e,t){R[e]=t},b=function(e,t,n,r,i){var o=(new Date).getTime(),a=t,s="";t.multiIP&&t.multiIP.gateway_ip&&(s={vocs_ip:[t.multiIP.uni_lbs_ip],vos_ip:[t.multiIP.gateway_ip]});var c=Object(d.getParameter)("AREA_SETTING").reduce((function(e,t,n){var r=Object(E.getAreaCodeByArea)(t);return r?0===n?r:"".concat(e,",").concat(r):e}),""),g={opid:133,flag:4096,ts:+new Date,key:t.token,cname:t.cname,sid:t.sid,detail:{6:t.stringUid,11:c},uid:t.uid||0};s&&(g.detail[5]=JSON.stringify(s)),Object(l.post)(e+"".concat(-1===e.indexOf("?")?"?":"&","action=wrtc_gateway"),g,(function(i){try{var s=JSON.parse(i);s.res&&(s=s.res);var c=s.code}catch(e){var l="requestChooseServer failed with unexpected body "+i;return u.default.error("["+a.clientId+"]",l),r(l)}if(c)return v=new RegExp(/10102\d{2}$/).test(c)?"NO_SERVICE_AVAILABLE":f.APErrorCode[s.code]||c,p.report.joinChooseServer(t.sid,{lts:o,succ:!1,csAddr:e,serverList:null,ec:v}),r("Get server node failed ["+v+"]",e,v);var g=[],m=Object(d.getParameter)("GATEWAY_DOMAINS"),h=0;if(e.indexOf(m[1])>-1&&(h=1),s.addresses.forEach((function(e){var t;e.ip&&e.port?(e.ip.match(/^[\.\:\d]+$/)?t="".concat(e.ip.replace(/[^\d]/g,"-"),".").concat(m[h++%m.length],":").concat(e.port):(u.default.info("["+a.clientId+"] "+"Cannot recognized as IP address ".concat(e.ip,". Used As Host instead")),t="".concat(e.ip,":").concat(e.port)),g.push(t)):u.default.error("["+a.clientId+"] Invalid address format ",e)})),!g.length){u.default.error("["+a.clientId+"] Empty Address response",s);var v="EMPTY_ADDRESS_RESPONSE";return p.report.joinChooseServer(t.sid,{lts:o,succ:!1,csAddr:e,serverList:null,ec:v}),r("Get server node failed ["+v+"]",e,v)}var E={gateway_addr:g,uid:s.uid,cid:s.cid,vid:s.detail&&s.detail[8],res:s,uni_lbs_ip:s.detail};return n(E,e)}),(function(e,n){"timeout"===e.type?(p.report.joinChooseServer(t.sid,{lts:o,succ:!1,csAddr:n,serverList:null,ec:"timeout"}),r("Connect choose server timeout",n)):(p.report.joinChooseServer(t.sid,{lts:o,succ:!1,csAddr:n,serverList:null,ec:"server_wrong"}),r("Connect choose server error",n))}),{"X-Packet-Service-Type":0,"X-Packet-URI":69})},A=function(e,t,n){var r=!1,i=null,o=1,a=1,s=e.clientId,c=function t(a,c){if(!r){var l=[];!function(e,t,n){for(var r,i=(new Date).getTime(),o=!1,a=0,s=Object(d.getParameter)("WEBCS_DOMAIN"),c=Object(d.getParameter)("WEBCS_DOMAIN_BACKUP_LIST"),l=function(n,r){var a;try{a=n.res.detail[8]}catch(t){u.default.debug("["+e.clientId+"] get vid failed",t)}if(o)p.report.joinChooseServer(e.sid,{lts:i,succ:!0,csAddr:r,serverList:n.gateway_addr,cid:n.cid+"",uid:n.uid+"",ec:null,vid:a},!1);else{if(clearTimeout(_),o=!0,e.proxyServer)for(var s=n.gateway_addr,c=0;c=l?l:2*o}))}},l=function n(){!function(e,t){g(e,(function(n,r){if(n)return t&&t(n);u.default.debug("["+e.clientId+"] getProxyServerList: ",r),h(e,r,t)}))}(e,(function(r,o){if(r){u.default.debug("["+e.clientId+"]",r),u.default.debug("["+e.clientId+"] Request proxy will be restart in "+a+"s"),i=setTimeout((function(){n()}),1e3*a),y[s]=i;var l=Object(d.getParameter)("AP_BACKOFF_MAX_TIME");a=a>=l?l:2*a}else{clearTimeout(i);var f=o.address;e.proxyServer=f;var g={mode:"manual",url:o.address,tcpport:o.serverResponse.tcpport||"3433",udpport:o.serverResponse.udpport||"3478",username:o.serverResponse.username||"test",credential:o.serverResponse.password||Object(d.getParameter)("TURN_SERVER_PASSWORD"),forceturn:!0};g.tcpport+="",g.udpport+="",e.turnServers=[],e.turnServers.push(g),p.report.setProxyServer(f),u.default.setProxyServer(f),c(f,t)}}))},m=function r(){S("proxy3",e,(function(o,l){if(o)return"RETRYABLE_ERROR"!==o?n&&n(o):(u.default.debug("["+e.clientId+"]",o),u.default.debug("["+e.clientId+"] Request proxy will be restart in "+a+"s"),i=setTimeout((function(){r()}),1e3*a),y[s]=i,void(a=a>=3600?3600:2*a));clearTimeout(i);var f=Object(d.getParameter)("NGINX");e.proxyServer=f,e.turnServers=[],l.map((function(t){var n={mode:"manual",url:t.ip,tcpport:"",udpport:t.port||"3478",username:t.username||"test",credential:t.password||Object(d.getParameter)("TURN_SERVER_PASSWORD"),forceturn:!0};n.tcpport+="",n.udpport+="",e.turnServers.push(n)})),p.report.setProxyServer(f),u.default.setProxyServer(f),c(f,t)}))};e.useProxyServer?1==e.proxyServerType?l():2==e.proxyServerType?function n(){!function(e,t){g(e,(function(n,r){return n?t&&t(n):(u.default.debug("["+e.clientId+"] getProxyServerList: ",r),t&&t(null,{address:r[0],serverResponse:{tcpport:"443",udpport:"3478",username:"test",password:"111111"}}))}))}(e,(function(r,o){if(r)return u.default.debug("["+e.clientId+"]",r),u.default.debug("["+e.clientId+"] Request proxy will be restart in "+a+"s"),i=setTimeout((function(){n()}),1e3*a),y[s]=i,void(a=a>=3600?3600:2*a);clearTimeout(i);var l=Object(d.getParameter)("PROXY_SERVER_TYPE2");e.proxyServer=l;var f={mode:"manual",url:o.address,tcpport:o.serverResponse.tcpport||"3433",udpport:o.serverResponse.udpport||"3478",username:o.serverResponse.username||"test",credential:o.serverResponse.password||"111111",forceturn:!0};f.tcpport+="",f.udpport+="",e.turnServers=[],e.turnServers.push(f),p.report.setProxyServer(l),u.default.setProxyServer(l),c(l,t)}))}():3==e.proxyServerType?m():4==e.proxyServerType?S("proxy4",e,(function(r,o){if(r)return"RETRYABLE_ERROR"!==r?n&&n(r):(u.default.debug("["+e.clientId+"]",r),u.default.debug("["+e.clientId+"] Request proxy will be restart in "+a+"s"),i=setTimeout((function(){m()}),1e3*a),y[s]=i,void(a=a>=3600?3600:2*a));clearTimeout(i);var l=Object(d.getParameter)("NGINX");e.proxyServer=l,e.turnServers=[],o.map((function(t){var n={mode:"manual",url:t.ip,tcpport:t.port||"443",udpport:"",username:t.username||"test",credential:t.password||Object(d.getParameter)("TURN_SERVER_PASSWORD"),forceturn:!1};n.tcpport+="",n.udpport+="",e.turnServers.push(n)})),p.report.setProxyServer(l),u.default.setProxyServer(l),c(l,t)})):5==e.proxyServerType?S("proxy5",e,(function(r,o){if(r)return"RETRYABLE_ERROR"!==r?n&&n(r):(u.default.debug("["+e.clientId+"]",r),u.default.debug("["+e.clientId+"] Request proxy will be restart in "+a+"s"),i=setTimeout((function(){m()}),1e3*a),y[s]=i,void(a=a>=3600?3600:2*a));clearTimeout(i);var l=Object(d.getParameter)("NGINX");e.proxyServer=l,e.turnServers=[],o.map((function(t){var n={mode:"manual",url:t.ip,tcpport:t.port||"443",udpport:"",username:t.username||"test",credential:t.password||Object(d.getParameter)("TURN_SERVER_PASSWORD"),forceturn:!1,useTurns:!0};n.tcpport+="",n.udpport+="",e.turnServers.push(n)})),p.report.setProxyServer(l),u.default.setProxyServer(l),c(l,t)}),!0):l():c(null,t)},O=function(e,t,n,r,i){var o=Date.now();r=r||t.stringUid;var a={sid:t.sid,opid:10,appid:t.appId,string_uid:r};return new Promise((function(i,s){Object(l.post)(e+"".concat(-1===e.indexOf("?")?"?":"&","action=stringuid"),a,(function(c){try{var d=JSON.parse(c),l=d.code}catch(i){var g="requestUserAccount failed with unexpected body "+c;return u.default.error("["+t.clientId+"]",g),s({retryable:!0,info:g,url:e,error:"UNEXPECTED_ERROR"}),n&&n.dispatchEvent({type:"error",reason:"USER_ACCOUNT_BODY_NOT_JSON"}),void p.report.reqUserAccount(a.sid,{lts:o,success:!1,serverAddress:e,stringUid:r,uid:null,extend:c,errorCode:"USER_ACCOUNT_BODY_NOT_JSON"})}if(l){var m=!1;return"INTERNAL_SERVER_ERROR"===(v=f.StringUidErrorCode[d.code%1e4]||"REQ_ACCOUNT_ERR_".concat(l))&&(m=!0),n&&n.dispatchEvent({type:"error",reason:v}),p.report.reqUserAccount(a.sid,{lts:o,success:!1,serverAddress:e,stringUid:r,uid:null,errorCode:v,extend:a}),s({retryable:m,info:g="Get String Uid Failed ["+v+"]",url:e,error:v})}var h=d.uid;if(!(h>0&&h ").concat(h),d);var v="INVALID_UINT_UID_".concat(h);return n&&n.dispatchEvent({type:"error",reason:v}),p.report.reqUserAccount(a.sid,{lts:o,success:!1,serverAddress:e,stringUid:r,uid:null,errorCode:v,extend:a}),s({retryable:!0,error:v,info:"Get String Uid failed ["+v+"]",url:e})}i({uid:h,url:e}),p.report.reqUserAccount(a.sid,{lts:o,success:!0,serverAddress:e,stringUid:r,uid:h,errorCode:null,extend:a})}),(function(e,t){if("timeout"===e.type){var i="USER_ACCOUNT_TIMEOUT";n&&n.dispatchEvent({type:"error",reason:i}),p.report.reqUserAccount(a.sid,{lts:o,success:!1,serverAddress:t,stringUid:r,uid:null,errorCode:i,extend:a}),s({retryable:!0,info:i,url:t,error:i})}else{var c="USER_ACCOUNT_SERVER_WRONG_".concat(e.type);n&&n.dispatchEvent({type:"error",reason:c}),p.report.reqUserAccount(a.sid,{lts:o,success:!1,serverAddress:t,stringUid:r,uid:null,errorCode:c,extend:a}),s({retryable:!0,info:c,url:t,error:c})}}),{"X-Packet-Service-Type":0,"X-Packet-URI":72})}))},C=function(e,t,n){Date.now();var r,o=Object(d.getParameter)("ACCOUNT_REGISTER"),s=!1,l=Object(d.getParameter)("ACCOUNT_REGISTER_RETRY_TIMEOUT"),p=null,f=null,g=new Promise(function(){var g=c()(a.a.mark((function c(g,m){var h,v,E;return a.a.wrap((function(c){for(;;)switch(c.prev=c.next){case 0:p=g,f=m,r=0;case 3:if(!(r |