Rebuilds livejs pages
							parent
							
								
									25da7331f0
								
							
						
					
					
						commit
						b971a76662
					
				| 
						 | 
					@ -8,68 +8,25 @@
 | 
				
			||||||
class Settings {
 | 
					class Settings {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Loads the config.js file from the Jitsi server.
 | 
					     * Loads javascript file the Jitsi server.
 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param string $jitsiUrl The base URL of the Jitsi server.
 | 
					 | 
				
			||||||
     * @param bool $raw Whether to return the full file (true) or only uncommented values (false).
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @return string The content of the config.js file or an error message.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public function getPlatformConfigjs($jitsiUrl, $raw = false) {
 | 
					 | 
				
			||||||
        // constructing the URL
 | 
					 | 
				
			||||||
        $configjsFile = $jitsiUrl . '/config.js';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // default content, if we can't get the file contents
 | 
					 | 
				
			||||||
        $platformConfigjs = "The file $configjsFile can't be loaded.";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // ssl options
 | 
					 | 
				
			||||||
        $contextOptions = [
 | 
					 | 
				
			||||||
            'ssl' => [
 | 
					 | 
				
			||||||
                'verify_peer'		=> true,
 | 
					 | 
				
			||||||
                'verify_peer_name'	=> true,
 | 
					 | 
				
			||||||
            ],
 | 
					 | 
				
			||||||
        ];
 | 
					 | 
				
			||||||
        $context = stream_context_create($contextOptions);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // get the file
 | 
					 | 
				
			||||||
        $fileContent = @file_get_contents($configjsFile, false, $context);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if ($fileContent !== false) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // when we need only uncommented values
 | 
					 | 
				
			||||||
            if ($raw === false) {
 | 
					 | 
				
			||||||
                // remove block comments
 | 
					 | 
				
			||||||
                $platformConfigjs = preg_replace('!/\*.*?\*/!s', '', $fileContent);
 | 
					 | 
				
			||||||
                // remove single-line comments
 | 
					 | 
				
			||||||
                $platformConfigjs = preg_replace('/\/\/[^\n]*/', '', $platformConfigjs);
 | 
					 | 
				
			||||||
                // remove empty lines
 | 
					 | 
				
			||||||
                $platformConfigjs = preg_replace('/^\s*[\r\n]/m', '', $platformConfigjs);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // when we need the full file as it is
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                $platformConfigjs = $fileContent;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return $platformConfigjs;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Loads the interface_config.js file from the Jitsi server.
 | 
					 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param string $jitsiUrl The base URL of the Jitsi server.
 | 
					     * @param string $jitsiUrl The base URL of the Jitsi server.
 | 
				
			||||||
 | 
					     * @param string $livejsFile The name of the remote js file to load.
 | 
				
			||||||
     * @param bool $raw Whether to return the full file (true) or only uncommented values (false).
 | 
					     * @param bool $raw Whether to return the full file (true) or only uncommented values (false).
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @return string The content of the interface_config.js file or an error message.
 | 
					     * @return string The content of the interface_config.js file or an error message.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public function getPlatformInterfaceConfigjs($jitsiUrl, $raw = false) {
 | 
					    public function getPlatformJsFile($jitsiUrl, $livejsFile, $raw = false) {
 | 
				
			||||||
        // constructing the URL
 | 
					        // constructing the URL
 | 
				
			||||||
        $interfaceConfigjsFile = $jitsiUrl . '/interface_config.js';
 | 
					        $jsFile = $jitsiUrl . '/' . $livejsFile;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // default content, if we can't get the file contents
 | 
					        // default content, if we can't get the file contents
 | 
				
			||||||
        $platformInterfaceConfigjs = "The file $interfaceConfigjsFile can't be loaded.";
 | 
					        $jsFileContent = "The file $livejsFile can't be loaded.";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Check if URL is valid
 | 
				
			||||||
 | 
					        if (!filter_var($jsFile, FILTER_VALIDATE_URL)) {
 | 
				
			||||||
 | 
					            return "Invalid URL: $jsFile";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // ssl options
 | 
					        // ssl options
 | 
				
			||||||
        $contextOptions = [
 | 
					        $contextOptions = [
 | 
				
			||||||
| 
						 | 
					@ -80,27 +37,60 @@ class Settings {
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
        $context = stream_context_create($contextOptions);
 | 
					        $context = stream_context_create($contextOptions);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Try to get headers first to check if file exists and wasn't redirected
 | 
				
			||||||
 | 
					        $headers = @get_headers($jsFile, 1);  // 1 to get headers as array
 | 
				
			||||||
 | 
					        if ($headers === false) {
 | 
				
			||||||
 | 
					            return "The file $livejsFile can't be loaded (connection error).";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Check for redirects
 | 
				
			||||||
 | 
					        $statusLine = $headers[0];
 | 
				
			||||||
 | 
					        if (strpos($statusLine, '301') !== false || strpos($statusLine, '302') !== false) {
 | 
				
			||||||
 | 
					            return "The file $livejsFile was redirected - this might indicate the file doesn't exist.";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Check if we got 200 OK
 | 
				
			||||||
 | 
					        if (strpos($statusLine, '200') === false) {
 | 
				
			||||||
 | 
					            return "The file $livejsFile can't be loaded (HTTP error: $statusLine).";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Check content type
 | 
				
			||||||
 | 
					        $contentType = isset($headers['Content-Type']) ? $headers['Content-Type'] : '';
 | 
				
			||||||
 | 
					        if (is_array($contentType)) {
 | 
				
			||||||
 | 
					            $contentType = end($contentType); // get last content-type in case of redirects
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (stripos($contentType, 'javascript') === false && stripos($contentType, 'text/plain') === false) {
 | 
				
			||||||
 | 
					            return "The file $livejsFile doesn't appear to be a JavaScript file (got $contentType).";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // get the file
 | 
					        // get the file
 | 
				
			||||||
        $fileContent = @file_get_contents($interfaceConfigjsFile, false, $context);
 | 
					        $fileContent = @file_get_contents($jsFile, false, $context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if ($fileContent !== false) {
 | 
					        if ($fileContent !== false) {
 | 
				
			||||||
 | 
					            // Quick validation of content
 | 
				
			||||||
 | 
					            $firstLine = strtolower(trim(substr($fileContent, 0, 100)));
 | 
				
			||||||
 | 
					            if (strpos($firstLine, '<!doctype html>') !== false || 
 | 
				
			||||||
 | 
					                strpos($firstLine, '<html') !== false || 
 | 
				
			||||||
 | 
					                strpos($firstLine, '<?xml') !== false) {
 | 
				
			||||||
 | 
					                return "The file $livejsFile appears to be HTML/XML content instead of JavaScript.";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // when we need only uncommented values
 | 
					            // when we need only uncommented values
 | 
				
			||||||
            if ($raw === false) {
 | 
					            if ($raw === false) {
 | 
				
			||||||
                // remove block comments
 | 
					                // remove block comments
 | 
				
			||||||
                $platformInterfaceConfigjs = preg_replace('!/\*.*?\*/!s', '', $fileContent);
 | 
					                $jsFileContent = preg_replace('!/\*.*?\*/!s', '', $fileContent);
 | 
				
			||||||
                // remove single-line comments
 | 
					                // remove single-line comments
 | 
				
			||||||
                $platformInterfaceConfigjs = preg_replace('/\/\/[^\n]*/', '', $platformInterfaceConfigjs);
 | 
					                $jsFileContent = preg_replace('/\/\/[^\n]*/', '', $jsFileContent);
 | 
				
			||||||
                // remove empty lines
 | 
					                // remove empty lines
 | 
				
			||||||
                $platformInterfaceConfigjs = preg_replace('/^\s*[\r\n]/m', '', $platformInterfaceConfigjs);
 | 
					                $jsFileContent = preg_replace('/^\s*[\r\n]/m', '', $jsFileContent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // when we need the full file as it is
 | 
					            // when we need the full file as it is
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                $platformInterfaceConfigjs = $fileContent;
 | 
					                $jsFileContent = $fileContent;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return $platformInterfaceConfigjs;
 | 
					        return $jsFileContent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,141 +1,19 @@
 | 
				
			||||||
<?php
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$action = $_REQUEST['action'] ?? '';
 | 
					$mode = $_REQUEST['mode'] ?? '';
 | 
				
			||||||
$agent = $_REQUEST['agent'] ?? '';
 | 
					$raw = ($mode === 'raw');
 | 
				
			||||||
 | 
					$livejsFile = $_REQUEST['item'] ?? '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require '../app/classes/settings.php';
 | 
					require '../app/classes/settings.php';
 | 
				
			||||||
require '../app/classes/agent.php';
 | 
					 | 
				
			||||||
require '../app/classes/conference.php';
 | 
					 | 
				
			||||||
require '../app/classes/host.php';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$settingsObject = new Settings();
 | 
					$settingsObject = new Settings();
 | 
				
			||||||
$agentObject = new Agent($dbWeb);
 | 
					 | 
				
			||||||
$hostObject = new Host($dbWeb);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// connect to Jilo database
 | 
					$livejsData = $settingsObject->getPlatformJsFile($platformDetails[0]['jitsi_url'], $item, $raw);
 | 
				
			||||||
//$response = connectDB($config, 'jilo', $platformDetails[0]['jilo_database'], $platform_id);
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//// if DB connection has error, display it and stop here
 | 
					 | 
				
			||||||
//if ($response['db'] === null) {
 | 
					 | 
				
			||||||
//    Messages::flash('ERROR', 'DEFAULT', $response['error']);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// otherwise if DB connection is OK, go on
 | 
					 | 
				
			||||||
//} else {
 | 
					 | 
				
			||||||
//    $db = $response['db'];
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//    $conferenceObject = new Conference($db);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    switch ($item) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case 'graphs':
 | 
					 | 
				
			||||||
            // Connect to Jilo database for log data
 | 
					 | 
				
			||||||
            $jilo_response = connectDB($config, 'jilo', $platformDetails[0]['jilo_database'], $platform_id);
 | 
					 | 
				
			||||||
            if ($jilo_response['db'] === null) {
 | 
					 | 
				
			||||||
                Messages::flash('ERROR', 'DEFAULT', $jilo_response['error']);
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            $jilo_db = $jilo_response['db'];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Get date range for the last 7 days
 | 
					 | 
				
			||||||
            $from_time = date('Y-m-d', strtotime('-7 days'));
 | 
					 | 
				
			||||||
            $until_time = date('Y-m-d');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Define graphs to show
 | 
					 | 
				
			||||||
            $graphs = [
 | 
					 | 
				
			||||||
                [
 | 
					 | 
				
			||||||
                    'graph_name' => 'conferences',
 | 
					 | 
				
			||||||
                    'graph_title' => 'Conferences in "' . htmlspecialchars($platformDetails[0]['name']) . '" over time',
 | 
					 | 
				
			||||||
                    'datasets' => []
 | 
					 | 
				
			||||||
                ],
 | 
					 | 
				
			||||||
                [
 | 
					 | 
				
			||||||
                    'graph_name' => 'participants',
 | 
					 | 
				
			||||||
                    'graph_title' => 'Participants in "' . htmlspecialchars($platformDetails[0]['name']) . '" over time',
 | 
					 | 
				
			||||||
                    'datasets' => []
 | 
					 | 
				
			||||||
                ]
 | 
					 | 
				
			||||||
            ];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Get Jitsi API data
 | 
					 | 
				
			||||||
            $conferences_api = $agentObject->getHistoricalData(
 | 
					 | 
				
			||||||
                $platform_id, 
 | 
					 | 
				
			||||||
                'jicofo',
 | 
					 | 
				
			||||||
                'conferences',
 | 
					 | 
				
			||||||
                $from_time,
 | 
					 | 
				
			||||||
                $until_time
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
            $graphs[0]['datasets'][] = [
 | 
					 | 
				
			||||||
                'data' => $conferences_api,
 | 
					 | 
				
			||||||
                'label' => 'Conferences from Jitsi API',
 | 
					 | 
				
			||||||
                'color' => 'rgba(75, 192, 192, 1)'
 | 
					 | 
				
			||||||
            ];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Get conference data from logs
 | 
					 | 
				
			||||||
            $conferences_logs = $conferenceObject->conferenceNumber(
 | 
					 | 
				
			||||||
                $from_time,
 | 
					 | 
				
			||||||
                $until_time
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
            $graphs[0]['datasets'][] = [
 | 
					 | 
				
			||||||
                'data' => $conferences_logs,
 | 
					 | 
				
			||||||
                'label' => 'Conferences from Logs',
 | 
					 | 
				
			||||||
                'color' => 'rgba(255, 99, 132, 1)'
 | 
					 | 
				
			||||||
            ];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Get participants data
 | 
					 | 
				
			||||||
            $participants_api = $agentObject->getHistoricalData(
 | 
					 | 
				
			||||||
                $platform_id, 
 | 
					 | 
				
			||||||
                'jicofo',
 | 
					 | 
				
			||||||
                'participants',
 | 
					 | 
				
			||||||
                $from_time,
 | 
					 | 
				
			||||||
                $until_time
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
            $graphs[1]['datasets'][] = [
 | 
					 | 
				
			||||||
                'data' => $participants_api,
 | 
					 | 
				
			||||||
                'label' => 'Participants from Jitsi API',
 | 
					 | 
				
			||||||
                'color' => 'rgba(75, 192, 192, 1)'
 | 
					 | 
				
			||||||
            ];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Prepare data for template
 | 
					 | 
				
			||||||
            $graph = $graphs;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // prepare the widget
 | 
					 | 
				
			||||||
            $widget['full'] = false;
 | 
					 | 
				
			||||||
            $widget['name'] = 'Graphs';
 | 
					 | 
				
			||||||
            $widget['title'] = 'Jitsi graphs';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Get any new messages
 | 
					// Get any new messages
 | 
				
			||||||
include '../app/includes/messages.php';
 | 
					include '../app/includes/messages.php';
 | 
				
			||||||
include '../app/includes/messages-show.php';
 | 
					include '../app/includes/messages-show.php';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Load the template
 | 
					// Load the template
 | 
				
			||||||
            include '../app/templates/graphs-combined.php';
 | 
					include '../app/templates/livejs.php';
 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case 'configjs':
 | 
					 | 
				
			||||||
            $mode = $_REQUEST['mode'] ?? '';
 | 
					 | 
				
			||||||
            $raw = ($mode === 'raw');
 | 
					 | 
				
			||||||
            $platformConfigjs = $settingsObject->getPlatformConfigjs($platformDetails[0]['jitsi_url'], $raw);
 | 
					 | 
				
			||||||
// Get any new messages
 | 
					 | 
				
			||||||
include '../app/includes/messages.php';
 | 
					 | 
				
			||||||
include '../app/includes/messages-show.php';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Load the template
 | 
					 | 
				
			||||||
            include '../app/templates/data-configjs.php';
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case 'interfaceconfigjs':
 | 
					 | 
				
			||||||
            $mode = $_REQUEST['mode'] ?? '';
 | 
					 | 
				
			||||||
            $raw = ($mode === 'raw');
 | 
					 | 
				
			||||||
            $platformInterfaceConfigjs = $settingsObject->getPlatformInterfaceConfigjs($platformDetails[0]['jitsi_url'], $raw);
 | 
					 | 
				
			||||||
// Get any new messages
 | 
					 | 
				
			||||||
include '../app/includes/messages.php';
 | 
					 | 
				
			||||||
include '../app/includes/messages-show.php';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Load the template
 | 
					 | 
				
			||||||
            include '../app/templates/data-interfaceconfigjs.php';
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        default:
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
?>
 | 
					?>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,39 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <!-- remote config "<?= htmlspecialchars($livejsFile) ?>" -->
 | 
				
			||||||
 | 
					                <div class="container-fluid mt-2">
 | 
				
			||||||
 | 
					                    <div class="row mb-4">
 | 
				
			||||||
 | 
					                        <div class="col-12 mb-4">
 | 
				
			||||||
 | 
					                            <h2 class="mb-0">Remote Jitsi config</h2>
 | 
				
			||||||
 | 
					                            <small>contents of the file "<strong><?= htmlspecialchars($livejsFile) ?></strong>"</small>
 | 
				
			||||||
 | 
					                        </div>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    <div class="row">
 | 
				
			||||||
 | 
					                        <div class="mb-4">
 | 
				
			||||||
 | 
					                            <div class="card mb-4">
 | 
				
			||||||
 | 
					                                <div class="card-header">
 | 
				
			||||||
 | 
					                                    <h5 class="mb-0">
 | 
				
			||||||
 | 
					                                        <i class="fas fa-file me-2 text-secondary"></i>
 | 
				
			||||||
 | 
					                                        <small><span class="text-muted"><?= htmlspecialchars($platformDetails[0]['jitsi_url']) ?>:</span> <?= htmlspecialchars($livejsFile) ?></small>
 | 
				
			||||||
 | 
					                                        <span class="card-text">
 | 
				
			||||||
 | 
					<?php if ($mode === 'raw') { ?>
 | 
				
			||||||
 | 
					                                            <span class="m-3"><a class="btn border btn-primary" href="<?= htmlspecialchars($app_root) ?>?platform=<?= htmlspecialchars($platform_id) ?>&page=livejs&item=<?= htmlspecialchars($livejsFile) ?>">view only active lines</a></span>
 | 
				
			||||||
 | 
					<?php } else { ?>
 | 
				
			||||||
 | 
					                                            <span class="m-3"><a class="btn border btn-secondary" href="<?= htmlspecialchars($app_root) ?>?platform=<?= htmlspecialchars($platform_id) ?>&page=livejs&item=<?= htmlspecialchars($livejsFile) ?>&mode=raw">view raw file contents</a></span>
 | 
				
			||||||
 | 
					<?php } ?>
 | 
				
			||||||
 | 
					                                        </span>
 | 
				
			||||||
 | 
					                                    </h5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                </div>
 | 
				
			||||||
 | 
					                                <div class="card-body">
 | 
				
			||||||
 | 
					                                    <pre class="results">
 | 
				
			||||||
 | 
					<?php
 | 
				
			||||||
 | 
					echo htmlspecialchars($livejsData);
 | 
				
			||||||
 | 
					?>
 | 
				
			||||||
 | 
					                                    </pre>
 | 
				
			||||||
 | 
					                                </div>
 | 
				
			||||||
 | 
					                            </div>
 | 
				
			||||||
 | 
					                        </div>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					                <!-- /remote config "<?= htmlspecialchars($livejsFile) ?>" -->
 | 
				
			||||||
		Loading…
	
		Reference in New Issue