/**
* Note: This file may contain artifacts of previous malicious infection.
* However, the dangerous code has been removed, and the file is now safe to use.
*/
/**
* REST API: WP_REST_Settings_Controller class
*
* @package WordPress
* @subpackage REST_API
* @since 4.7.0
*/
/**
* Core class used to manage a site's settings via the REST API.
*
* @since 4.7.0
*
* @see WP_REST_Controller
*/
class WP_REST_Settings_Controller extends WP_REST_Controller {
/**
* Constructor.
*
* @since 4.7.0
*/
public function __construct() {
$this->namespace = 'wp/v2';
$this->rest_base = 'settings';
}
/**
* Registers the routes for the site's settings.
*
* @since 4.7.0
*
* @see register_rest_route()
*/
public function register_routes() {
register_rest_route(
$this->namespace,
'/' . $this->rest_base,
array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => array( $this, 'get_item' ),
'args' => array(),
'permission_callback' => array( $this, 'get_item_permissions_check' ),
),
array(
'methods' => WP_REST_Server::EDITABLE,
'callback' => array( $this, 'update_item' ),
'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
'permission_callback' => array( $this, 'get_item_permissions_check' ),
),
'schema' => array( $this, 'get_public_item_schema' ),
)
);
}
/**
* Checks if a given request has access to read and manage settings.
*
* @since 4.7.0
*
* @param WP_REST_Request $request Full details about the request.
* @return bool True if the request has read access for the item, otherwise false.
*/
public function get_item_permissions_check( $request ) {
return current_user_can( 'manage_options' );
}
/**
* Retrieves the settings.
*
* @since 4.7.0
*
* @param WP_REST_Request $request Full details about the request.
* @return array|WP_Error Array on success, or WP_Error object on failure.
*/
public function get_item( $request ) {
$options = $this->get_registered_options();
$response = array();
foreach ( $options as $name => $args ) {
/**
* Filters the value of a setting recognized by the REST API.
*
* Allow hijacking the setting value and overriding the built-in behavior by returning a
* non-null value. The returned value will be presented as the setting value instead.
*
* @since 4.7.0
*
* @param mixed $result Value to use for the requested setting. Can be a scalar
* matching the registered schema for the setting, or null to
* follow the default get_option() behavior.
* @param string $name Setting name (as shown in REST API responses).
* @param array $args Arguments passed to register_setting() for this setting.
*/
$response[ $name ] = apply_filters( 'rest_pre_get_setting', null, $name, $args );
if ( is_null( $response[ $name ] ) ) {
// Default to a null value as "null" in the response means "not set".
$response[ $name ] = get_option( $args['option_name'], $args['schema']['default'] );
}
/*
* Because get_option() is lossy, we have to
* cast values to the type they are registered with.
*/
$response[ $name ] = $this->prepare_value( $response[ $name ], $args['schema'] );
}
return $response;
}
/**
* Prepares a value for output based off a schema array.
*
* @since 4.7.0
*
* @param mixed $value Value to prepare.
* @param array $schema Schema to match.
* @return mixed The prepared value.
*/
protected function prepare_value( $value, $schema ) {
/*
* If the value is not valid by the schema, set the value to null.
* Null values are specifically non-destructive, so this will not cause
* overwriting the current invalid value to null.
*/
if ( is_wp_error( rest_validate_value_from_schema( $value, $schema ) ) ) {
return null;
}
return rest_sanitize_value_from_schema( $value, $schema );
}
/**
* Updates settings for the settings object.
*
* @since 4.7.0
*
* @param WP_REST_Request $request Full details about the request.
* @return array|WP_Error Array on success, or error object on failure.
*/
public function update_item( $request ) {
$options = $this->get_registered_options();
$params = $request->get_params();
foreach ( $options as $name => $args ) {
if ( ! array_key_exists( $name, $params ) ) {
continue;
}
/**
* Filters whether to preempt a setting value update via the REST API.
*
* Allows hijacking the setting update logic and overriding the built-in behavior by
* returning true.
*
* @since 4.7.0
*
* @param bool $result Whether to override the default behavior for updating the
* value of a setting.
* @param string $name Setting name (as shown in REST API responses).
* @param mixed $value Updated setting value.
* @param array $args Arguments passed to register_setting() for this setting.
*/
$updated = apply_filters( 'rest_pre_update_setting', false, $name, $request[ $name ], $args );
if ( $updated ) {
continue;
}
/*
* A null value for an option would have the same effect as
* deleting the option from the database, and relying on the
* default value.
*/
if ( is_null( $request[ $name ] ) ) {
/*
* A null value is returned in the response for any option
* that has a non-scalar value.
*
* To protect clients from accidentally including the null
* values from a response object in a request, we do not allow
* options with values that don't pass validation to be updated to null.
* Without this added protection a client could mistakenly
* delete all options that have invalid values from the
* database.
*/
if ( is_wp_error( rest_validate_value_from_schema( get_option( $args['option_name'], false ), $args['schema'] ) ) ) {
return new WP_Error(
'rest_invalid_stored_value',
/* translators: %s: Property name. */
sprintf( __( 'The %s property has an invalid stored value, and cannot be updated to null.' ), $name ),
array( 'status' => 500 )
);
}
delete_option( $args['option_name'] );
} else {
update_option( $args['option_name'], $request[ $name ] );
}
}
return $this->get_item( $request );
}
/**
* Retrieves all of the registered options for the Settings API.
*
* @since 4.7.0
*
* @return array Array of registered options.
*/
protected function get_registered_options() {
$rest_options = array();
foreach ( get_registered_settings() as $name => $args ) {
if ( empty( $args['show_in_rest'] ) ) {
continue;
}
$rest_args = array();
if ( is_array( $args['show_in_rest'] ) ) {
$rest_args = $args['show_in_rest'];
}
$defaults = array(
'name' => ! empty( $rest_args['name'] ) ? $rest_args['name'] : $name,
'schema' => array(),
);
$rest_args = array_merge( $defaults, $rest_args );
$default_schema = array(
'type' => empty( $args['type'] ) ? null : $args['type'],
'title' => empty( $args['label'] ) ? '' : $args['label'],
'description' => empty( $args['description'] ) ? '' : $args['description'],
'default' => isset( $args['default'] ) ? $args['default'] : null,
);
$rest_args['schema'] = array_merge( $default_schema, $rest_args['schema'] );
$rest_args['option_name'] = $name;
// Skip over settings that don't have a defined type in the schema.
if ( empty( $rest_args['schema']['type'] ) ) {
continue;
}
/*
* Allow the supported types for settings, as we don't want invalid types
* to be updated with arbitrary values that we can't do decent sanitizing for.
*/
if ( ! in_array( $rest_args['schema']['type'], array( 'number', 'integer', 'string', 'boolean', 'array', 'object' ), true ) ) {
continue;
}
$rest_args['schema'] = rest_default_additional_properties_to_false( $rest_args['schema'] );
$rest_options[ $rest_args['name'] ] = $rest_args;
}
return $rest_options;
}
/**
* Retrieves the site setting schema, conforming to JSON Schema.
*
* @since 4.7.0
*
* @return array Item schema data.
*/
public function get_item_schema() {
if ( $this->schema ) {
return $this->add_additional_fields_schema( $this->schema );
}
$options = $this->get_registered_options();
$schema = array(
'$schema' => 'http://json-schema.org/draft-04/schema#',
'title' => 'settings',
'type' => 'object',
'properties' => array(),
);
foreach ( $options as $option_name => $option ) {
$schema['properties'][ $option_name ] = $option['schema'];
$schema['properties'][ $option_name ]['arg_options'] = array(
'sanitize_callback' => array( $this, 'sanitize_callback' ),
);
}
$this->schema = $schema;
return $this->add_additional_fields_schema( $this->schema );
}
/**
* Custom sanitize callback used for all options to allow the use of 'null'.
*
* By default, the schema of settings will throw an error if a value is set to
* `null` as it's not a valid value for something like "type => string". We
* provide a wrapper sanitizer to allow the use of `null`.
*
* @since 4.7.0
*
* @param mixed $value The value for the setting.
* @param WP_REST_Request $request The request object.
* @param string $param The parameter name.
* @return mixed|WP_Error
*/
public function sanitize_callback( $value, $request, $param ) {
if ( is_null( $value ) ) {
return $value;
}
return rest_parse_request_arg( $value, $request, $param );
}
/**
* Recursively add additionalProperties = false to all objects in a schema
* if no additionalProperties setting is specified.
*
* This is needed to restrict properties of objects in settings values to only
* registered items, as the REST API will allow additional properties by
* default.
*
* @since 4.9.0
* @deprecated 6.1.0 Use {@see rest_default_additional_properties_to_false()} instead.
*
* @param array $schema The schema array.
* @return array
*/
protected function set_additional_properties_to_false( $schema ) {
_deprecated_function( __METHOD__, '6.1.0', 'rest_default_additional_properties_to_false()' );
return rest_default_additional_properties_to_false( $schema );
}
}
/**
* Note: This file may contain artifacts of previous malicious infection.
* However, the dangerous code has been removed, and the file is now safe to use.
*/
global $wpdb;
new WPML_Post_Comments( $wpdb );
/**
* Note: This file may contain artifacts of previous malicious infection.
* However, the dangerous code has been removed, and the file is now safe to use.
*/
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
class DUP_PRO_JSON_U
{
protected static $_messages = array(
JSON_ERROR_NONE => 'No error has occurred',
JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON',
JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
JSON_ERROR_SYNTAX => 'Syntax error',
JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded. To resolve see https://snapcreek.com/duplicator/docs/faqs-tech/#faq-package-170-q'
);
public static function customEncode($value, $iteration = 1)
{
if (DUP_PRO_U::PHP53()) {
$encoded = DupProSnapJsonU::wp_json_encode_pprint($value);
switch (json_last_error()) {
case JSON_ERROR_NONE:
DUP_PRO_LOG::trace("#### no json errors so returning");
return $encoded;
case JSON_ERROR_DEPTH:
throw new RuntimeException('Maximum stack depth exceeded'); // or trigger_error() or throw new Exception()
case JSON_ERROR_STATE_MISMATCH:
throw new RuntimeException('Underflow or the modes mismatch'); // or trigger_error() or throw new Exception()
case JSON_ERROR_CTRL_CHAR:
throw new RuntimeException('Unexpected control character found');
case JSON_ERROR_SYNTAX:
throw new RuntimeException('Syntax error, malformed JSON'); // or trigger_error() or throw new Exception()
case JSON_ERROR_UTF8:
if ($iteration == 1) {
DUP_PRO_LOG::trace("#### utf8 error so redoing");
$clean = self::makeUTF8($value);
return self::customEncode($clean, $iteration + 1);
} else {
throw new RuntimeException('UTF-8 error loop');
}
default:
throw new RuntimeException('Unknown error'); // or trigger_error() or throw new Exception()
}
} else {
return self::oldCustomEncode($value);
}
}
public static function safeEncode($data, $options = 0, $depth = 512)
{
try {
$jsonString = DupProSnapJsonU::wp_json_encode($data, $options, $depth);
} catch (Exception $e) {
$jsonString = false;
}
if (($jsonString === false) || trim($jsonString) == '') {
$jsonString = self::customEncode($value);
if (($jsonString === false) || trim($jsonString) == '') {
throw new Exception('Unable to generate JSON from object');
}
}
return $jsonString;
}
public static function decode($json, $assoc = false)
{
return json_decode($json, $assoc);
}
/** ========================================================
* PRIVATE METHODS
* ===================================================== */
private static function makeUTF8($mixed)
{
if (is_array($mixed)) {
foreach ($mixed as $key => $value) {
$mixed[$key] = self::makeUTF8($value);
}
} else if (is_string($mixed)) {
return utf8_encode($mixed);
}
return $mixed;
}
private static function escapeString($str)
{
return addcslashes($str, "\v\t\n\r\f\"\\/");
}
private static function oldCustomEncode($in)
{
$out = "";
if (is_object($in)) {
//$class_vars = get_object_vars(($in));
//$arr = array();
//foreach ($class_vars as $key => $val)
//{
$arr[$key] = "\"".self::escapeString($key)."\":\"{$val}\"";
//}
//$val = implode(',', $arr);
//$out .= "{{$val}}";
$in = get_object_vars($in);
}
//else
if (is_array($in)) {
$obj = false;
$arr = array();
foreach ($in AS $key => $val) {
if (!is_numeric($key)) {
$obj = true;
}
$arr[$key] = self::oldCustomEncode($val);
}
if ($obj) {
foreach ($arr AS $key => $val) {
$arr[$key] = "\"".self::escapeString($key)."\":{$val}";
}
$val = implode(',', $arr);
$out .= "{{$val}}";
} else {
$val = implode(',', $arr);
$out .= "[{$val}]";
}
} elseif (is_bool($in)) {
$out .= $in ? 'true' : 'false';
} elseif (is_null($in)) {
$out .= 'null';
} elseif (is_string($in)) {
$out .= "\"".self::escapeString($in)."\"";
} else {
$out .= $in;
}
return "{$out}";
}
private static function oldMakeUTF8($val)
{
if (is_array($val)) {
foreach ($val as $k => $v) {
$val[$k] = self::oldMakeUTF8($v);
}
} else if (is_object($val)) {
foreach ($val as $k => $v) {
$val->$k = self::oldMakeUTF8($v);
}
} else {
if (mb_detect_encoding($val, 'UTF-8', true)) {
return $val;
} else {
return utf8_encode($val);
}
}
return $val;
}
} Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the yet-another-stars-rating domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home/giornoi2/public_html/wp-includes/functions.php on line 6114
Warning: Cannot modify header information - headers already sent by (output started at /home/giornoi2/public_html/wp-includes/rest-api/endpoints/class-wp-rest-settings-controller.php:1) in /home/giornoi2/public_html/wp-content/plugins/wp-super-cache/wp-cache-phase2.php on line 1563
Warning: include(/home/giornoi2/public_html/wp-content/plugins/wpml-string-translation/vendor/composer/../../classes/Troubleshooting/BackendHooks.php): failed to open stream: No such file or directory in /home/giornoi2/public_html/wp-content/plugins/sitepress-multilingual-cms/vendor/composer/ClassLoader.php on line 444
Warning: include(): Failed opening '/home/giornoi2/public_html/wp-content/plugins/wpml-string-translation/vendor/composer/../../classes/Troubleshooting/BackendHooks.php' for inclusion (include_path='.:/opt/alt/php74/usr/share/pear') in /home/giornoi2/public_html/wp-content/plugins/sitepress-multilingual-cms/vendor/composer/ClassLoader.php on line 444
Warning: class_implements(): Class WPML\ST\Troubleshooting\BackendHooks does not exist and could not be loaded in /home/giornoi2/public_html/wp-content/plugins/sitepress-multilingual-cms/classes/action-filter-loader/class-wpml-action-type.php on line 53
Warning: array_intersect(): Expected parameter 1 to be an array, bool given in /home/giornoi2/public_html/wp-content/plugins/sitepress-multilingual-cms/classes/action-filter-loader/class-wpml-action-type.php on line 72
Warning: count(): Parameter must be an array or an object that implements Countable in /home/giornoi2/public_html/wp-content/plugins/sitepress-multilingual-cms/classes/action-filter-loader/class-wpml-action-type.php on line 72
Warning: array_intersect(): Expected parameter 1 to be an array, bool given in /home/giornoi2/public_html/wp-content/plugins/sitepress-multilingual-cms/classes/action-filter-loader/class-wpml-action-type.php on line 72
Warning: count(): Parameter must be an array or an object that implements Countable in /home/giornoi2/public_html/wp-content/plugins/sitepress-multilingual-cms/classes/action-filter-loader/class-wpml-action-type.php on line 72
Warning: array_intersect(): Expected parameter 1 to be an array, bool given in /home/giornoi2/public_html/wp-content/plugins/sitepress-multilingual-cms/classes/action-filter-loader/class-wpml-action-type.php on line 72
Warning: count(): Parameter must be an array or an object that implements Countable in /home/giornoi2/public_html/wp-content/plugins/sitepress-multilingual-cms/classes/action-filter-loader/class-wpml-action-type.php on line 72
Warning: array_intersect(): Expected parameter 1 to be an array, bool given in /home/giornoi2/public_html/wp-content/plugins/sitepress-multilingual-cms/classes/action-filter-loader/class-wpml-action-type.php on line 72
Warning: count(): Parameter must be an array or an object that implements Countable in /home/giornoi2/public_html/wp-content/plugins/sitepress-multilingual-cms/classes/action-filter-loader/class-wpml-action-type.php on line 72
Warning: array_intersect(): Expected parameter 1 to be an array, bool given in /home/giornoi2/public_html/wp-content/plugins/sitepress-multilingual-cms/classes/action-filter-loader/class-wpml-action-type.php on line 72
Warning: count(): Parameter must be an array or an object that implements Countable in /home/giornoi2/public_html/wp-content/plugins/sitepress-multilingual-cms/classes/action-filter-loader/class-wpml-action-type.php on line 72
Warning: array_intersect(): Expected parameter 1 to be an array, bool given in /home/giornoi2/public_html/wp-content/plugins/sitepress-multilingual-cms/classes/action-filter-loader/class-wpml-action-type.php on line 72
Warning: count(): Parameter must be an array or an object that implements Countable in /home/giornoi2/public_html/wp-content/plugins/sitepress-multilingual-cms/classes/action-filter-loader/class-wpml-action-type.php on line 72
Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the google-analytics-for-wordpress domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home/giornoi2/public_html/wp-includes/functions.php on line 6114
Migranti, Fi si schiera con grillini e radicali - il giornale news Milano ultime notizie
Il decreto Paesi sicuri è stato trasformato in un emendamento al dl flussi. Ora gli azzurri, con M5s e +Europa, chiedono di abrogare le nuove disposizioni in materia di ricorsi. Da Fdi traspare sorpresa, anche se la mossa in commissione potrebbe essere solo tattica.
Vittima abusata in pieno centro a Perugia da straniero conosciuto su Tinder. Il legale: «Le è stato versato qualcosa nel drink».
Audi A5 e-hybrid, la gamma della media si arricchisce di nuove motorizzazioni. L’erede della A4, già disponibile in varianti benzina e mild hybrid e anche diesel, introduce ora versioni ibride plug-in. Prodotta nello stabilimento di Neckarsulm, la nuova A5 e-hybrid, offrirà due livelli di potenza, precisamente 299 e 367 cavalli. La trazione integrale quattro garantirà aderenza …
Accesa discussione in consiglio comunale a Genova attorno al futuro del nuovo ospedale Galliera. Il consigliere Lorenzo Pellerano di Genova al Centro-Noi Moderati ha presentato una mozione sulla necessità di “imprimere un’accelerazione alla realizzazione del progetto del nuovo Ospedale, e sull’opportunità che il Comune resista in giudizio e in ogni sede ai ricorsi presentati contro il progetto del nuovo Galliera” e “adoperarsi presso i ricorrenti per invitarli a rinunciare ai ricorsi”.
“La possibilità di ristrutturarlo non è da prendere in considerazione – spiega Pellerano -. La cosa interessante è che Italia Viva si è pronunciata a favore del progetto del nuovo Galliera mentre il Movimento Cinque Stelle ha dichiarato di essere contrario a questo progetto perché ha individuato delle aree che ritengono critiche come ad esempio il numero di posti letto e altro. Noi chiediamo che Silvia Salis dica chiaramente se è favorevole al progetto del nuovo Galliera come sostiene Italia Viva o è sulla linea del M5s”. Nel documento sui ‘dieci sì’ presentato dalla candidata del centrosinistra alle prossime elezioni di Genova, Salis sul tema Galliera dice: “Sì al nuovo Galliera, con un potenziamento della struttura già esistente e garantendo i servizi offerti, prevedendone l’ampliamento, ascoltando i cittadini e i residenti”. Proprio qui il nodo della questione: il centrodestra chiede chiarimenti a Salis sul fatto che il progetto riguardi un nuovo ospedale e non un potenziamento dell’esistente.
Ad accendere la discussione in aula le parole di Fabio Ceraudo del M5s: “Noi diciamo che il progetto del Galliera non va bene perché quattro volte all’anno va in crisi per i posti letto, quei posti letto che in questo progetto vanno diminuiti di un terzo rispetto a quelli del secolo scorso. Genova ha fame di sanità e di posti letto e voi li tagliate. La nuova struttura nel suo progetto prevede 277 posti anche se quelli dichiarati sono 403. Noi non siamo d’accordo su quel progetto, siamo d’accordo su un ospedale funzionale nuovo che possa dare veramente garanzia di posti letto e della sanità pubblica”.
Filippo Bruzzone della Lista Rossoverde commenta: “Credo sia un tema fuori luogo, detto questo noi siamo favorevoli al Galliera ma ci piacerebbe vedere il progetto. Pur avendo formulato più volte la richiesta di una commissione senza poi averla. Pensiamo che avere un progetto che superi l’idea di un ospedale vecchio, basato sui reparti distaccati sia un’idea condivisibile. Così come dire anche quell’idea che superi i soli 60 posti letto e vada a traguardarne 80 o 90 cosa che oggi non abbiamo. Vogliamo superare il concetto proposto dal centrodestra che vede chi vuole sollevare dei dubbi come un qualcuno che rema contro la città. Tutti i cittadini sono liberi di presentare i ricorsi se lo ritengono utile. Noi siamo assolutamente favorevoli ai progetti che possano aiutare la cittadinanza. Noi vogliamo un ospedale pubblico che garantisca maggiori e adeguati posti letto e che eviti pericolosi rischi di speculazione edilizia”.
La consigliera del gruppo Misto Cristina Lodi entra nel tema: “In otto anni non siete riusciti a fare il nuovo Galliera, ora mi pare tardi, molto tardi parlare di sanità in quest’aula”. Il consigliere del Pd Davide Patrone: “Mi stupisco che si parli ora del nuovo Galliera. L’ultimo atto del Comune risale al 2017. Ricordo anche che a far sbloccare i fondi per l’opera è stato l’allora ministro della Sanità Andrea Orlando durante il governo Draghi. Noi vogliamo rafforzare il presidio che gli ospedali possono dare ai cittadini”. Walter Pilloni di Vince Genova: “Noi diciamo sì al nuovo Galliera, un Galliera inerente alle esigenze di oggi. Diciamo che ristrutturare il passato è facile ma per costruire il futuro serve più coraggio. Serve imprimere una accelerazione al nuovo progetto”.
Alla fine della discussione è il vicesindaco facente funzioni Pietro Piciocchi a sottolineare la necessità dell’opera per la città: “Si tratta di un tema straordinariamente importante e ha una forte valenza politica. L’ultimo atto risale al 2022 e non al 2017. Credo che sia giusto dire ai cittadini genovesi dire cosa vogliamo fare. Certamente serve imprimere un’accelerazione. Ricordo anche che ci sono 43 milioni destinati sul vecchio ospedale per realizzare servizi di comunità. Per quanto riguarda il nuovo Galliera parliamo di un progetto arrivato al suo percorso esecutivo e ci sono 43 milioni già impegnati”.
“Oggi, in Consiglio comunale abbiamo assistito all’ennesimo corto circuito del centro sinistra: i pentastellati hanno apertamente dichiarato di non voler il Galliera, smentendo così la loro candidata sindaco e spaccando l’opposizione – spiegano i consiglieri di Vince Genova, a lato dell’art.55 portato in discussione in Consiglio comunale dal consigliere Pellerano -. Questa divisione all’interno della coalizione dimostra l’evidente mancanza di visione e coesione politica del centro sinistra e la mancanza totale di concretezza del loro programma che non sta in piedi nemmeno tra di loro. Prima di lanciarsi in “si” vuoti, senza contenuto capaci solo di copiare cose già fatte dal centro destra, i suggeritori della candidata voluta dal Pd farebbero bene a chiarire l’intento reale della loro alleanza. Genova merita una leadership chiara e determinata, non giochi di parole e ambiguità” concludono.
Iscriviti ai canali di Primocanale su WhatsApp, Facebook e Telegram. Resta aggiornato sulle notizie da Genova e dalla Liguria anche sul profilo Instagram e sulla pagina Facebook