PluginProbe ʕ •ᴥ•ʔ
Brevo – Email, SMS, Web Push, Chat, and more. / 3.2.5
Brevo – Email, SMS, Web Push, Chat, and more. v3.2.5
2.9.13 2.9.14 2.9.15 2.9.16 2.9.17 2.9.18 2.9.4 2.9.5 2.9.6 2.9.7 2.9.8 2.9.9 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.9 3.1.0 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.2 3.1.20 3.1.21 3.1.22 3.1.23 3.1.24 3.1.25 3.1.26 3.1.27 3.1.28 3.1.29 3.1.3 3.1.30 3.1.31 3.1.32 3.1.33 3.1.34 3.1.35 3.1.36 3.1.37 3.1.38 3.1.39 3.1.4 3.1.40 3.1.41 3.1.42 3.1.43 3.1.44 3.1.45 3.1.46 3.1.47 3.1.48 3.1.49 3.1.5 3.1.50 3.1.51 3.1.52 3.1.53 3.1.54 3.1.55 3.1.56 3.1.57 3.1.58 3.1.59 3.1.6 3.1.60 3.1.61 3.1.62 3.1.63 3.1.64 3.1.65 3.1.66 3.1.67 3.1.68 3.1.69 3.1.7 3.1.70 3.1.71 3.1.72 3.1.73 3.1.74 3.1.75 3.1.76 3.1.77 3.1.78 3.1.79 3.1.8 3.1.80 3.1.81 3.1.82 3.1.83 3.1.84 3.1.85 3.1.86 3.1.87 3.1.88 3.1.89 3.1.9 3.1.90 3.1.91 3.1.92 3.1.93 3.1.94 3.1.95 3.1.96 3.1.97 3.1.98 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 trunk 1.0 1.5 2.0.8 2.9.10 2.9.11 2.9.12
mailin / model / model-forms.php
mailin / model Last commit date
index.php 11 years ago model-contacts.php 5 years ago model-forms.php 2 years ago model-lang.php 5 years ago model-users.php 1 year ago
model-forms.php
463 lines
1 <?php
2 /**
3 * Model class <i>SIB_Forms</i> represents forms
4 *
5 * @package SIB_Forms
6 */
7
8 if ( ! class_exists( 'SIB_Forms' ) ) {
9 /**
10 * Class SIB_Forms
11 *
12 * @package SIB_Forms
13 */
14 class SIB_Forms {
15
16 /**
17 * Tab table name
18 */
19 const TABLE_NAME = 'sib_model_forms';
20 const DEFAULT_FORM_HTML_PATH = '../form/default-form.html';
21 const DEFAULT_FORM_CSS_PATH = '../form/css/default-form.css';
22 const DEFAULT_FORM_MESSAGE_CSS_PATH = '../form/css/default-form-message.css';
23
24 /** Create Table */
25 public static function createTable() {
26 global $wpdb;
27 $table_name = $wpdb->prefix . self::TABLE_NAME;
28
29 //Check if table exists
30 $table_check_query = 'SHOW TABLES LIKE ' . "'" . $table_name . "'" . ';';
31 $wpdb->query($table_check_query);
32
33 //table doesnot exist
34 if (empty($wpdb->last_result)) {
35 // create list table.
36 $query =
37 'CREATE TABLE IF NOT EXISTS ' . $table_name . ' (
38 `id` int(20) NOT NULL AUTO_INCREMENT,
39 `title` varchar(120) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
40 `html` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci,
41 `css` longtext,
42 `dependTheme` int(1) NOT NULL DEFAULT 1,
43 `listID` longtext,
44 `templateID` int(20) NOT NULL DEFAULT -1,
45 `confirmID` int(20) NOT NULL DEFAULT -1,
46 `isDopt` int(1) NOT NULL DEFAULT 0,
47 `isOpt` int(1) NOT NULL DEFAULT 0,
48 `redirectInEmail` varchar(255),
49 `redirectInForm` varchar(255),
50 `successMsg` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
51 `errorMsg` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
52 `existMsg` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
53 `invalidMsg` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
54 `requiredMsg` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
55 `attributes` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci,
56 `date` DATE NOT NULL,
57 `isDefault` int(1) NOT NULL DEFAULT 0,
58 `gCaptcha` int(1) NOT NULL DEFAULT 0,
59 `gCaptcha_secret` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
60 `gCaptcha_site` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
61 `selectCaptchaType` int(1) NOT NULL DEFAULT 0,
62 `cCaptchaType` int(1) NOT NULL DEFAULT 0,
63 `cCaptcha_secret` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
64 `cCaptcha_site` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
65 `cCaptchaStyle` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
66 `termAccept` int(1) NOT NULL DEFAULT 0,
67 `termsURL` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
68 PRIMARY KEY (`id`)
69 );';
70 $wpdb->query($query);
71
72 // create default form.
73 $rows = $wpdb->get_results('SELECT * FROM '. $wpdb->prefix . self::TABLE_NAME );
74 if (count( $rows ) == 0 )
75 {
76 self::createDefaultForm();
77 }
78
79 } else {
80 // check if select captcha type fields exist
81 $selectCaptchaType = 'selectCaptchaType';
82 $result = $wpdb->query( $wpdb->prepare( "SHOW COLUMNS FROM `$table_name` LIKE %s ", $selectCaptchaType ) ); // db call ok; no-cache ok.
83 $queryExecuted = false;
84 if ( empty( $result ) ) {
85 $alter_query = "ALTER TABLE " . $table_name . "
86 ADD COLUMN selectCaptchaType int(1) NOT NULL DEFAULT 0 After gCaptcha_site,
87 ADD COLUMN cCaptchaType int(1) NOT NULL DEFAULT 0 After selectCaptchaType,
88 ADD COLUMN cCaptchaStyle varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci AFTER cCaptchaType,
89 ADD COLUMN cCaptcha_secret varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci AFTER cCaptchaStyle,
90 ADD COLUMN cCaptcha_site varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci AFTER cCaptcha_secret;
91 ";
92 $wpdb->query( $alter_query );
93 $queryExecuted = true;
94 }
95
96 if ($queryExecuted == false) {
97 // check if only the cCaptchaStyle type fields exist
98 $cCaptchaStyle = 'cCaptchaStyle';
99 $result = $wpdb->query( $wpdb->prepare( "SHOW COLUMNS FROM `$table_name` LIKE %s ", $cCaptchaStyle ) ); // db call ok; no-cache ok.
100
101 if ( empty( $result ) ) {
102 $alter_query = "ALTER TABLE " . $table_name . "
103 ADD COLUMN cCaptchaStyle varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci AFTER cCaptcha_site;
104 ";
105 $wpdb->query( $alter_query );
106 }
107 }
108 }
109 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
110 }
111
112 /**
113 * Remove table
114 */
115 public static function removeTable() {
116 global $wpdb;
117 $query = 'DROP TABLE IF EXISTS ' . $wpdb->prefix . self::TABLE_NAME . ';';
118 $wpdb->query( $query ); // db call ok; no-cache ok.
119 }
120
121 /**
122 * Add columns for old versions
123 */
124 public static function alterTable() {
125 global $wpdb;
126 // add columns -gCaptcha, gCaptcha_secret.
127 $table_name = $wpdb->prefix . self::TABLE_NAME;
128
129 // check if gCaptcha fields exist
130 $gCaptcha = 'gCaptcha';
131 $result = $wpdb->query( $wpdb->prepare( "SHOW COLUMNS FROM `$table_name` LIKE %s ", $gCaptcha ) ); // db call ok; no-cache ok.
132
133 if ( empty( $result ) ) {
134 $alter_query = 'ALTER TABLE ' . $table_name . '
135 ADD COLUMN gCaptcha int(1) not NULL DEFAULT 0,
136 ADD COLUMN gCaptcha_secret varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
137 ADD COLUMN gCaptcha_site varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci';
138 $ret = $wpdb->query( $alter_query );
139 }
140
141 // add columns -termAccept, termsURL : version 2.9.0
142 $check_query = 'SHOW COLUMNS FROM `' . $table_name . "` LIKE 'termAccept';";
143 $result = $wpdb->query( $check_query );
144 if ( empty( $result ) ) {
145 $alter_query = 'ALTER TABLE ' . $table_name . '
146 ADD COLUMN termAccept int(1) not NULL DEFAULT 1,
147 ADD COLUMN termsURL varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci';
148 $ret = $wpdb->query( $alter_query );
149 }
150 // add columns - confirmID : version 2.9.0
151 $check_query = 'SHOW COLUMNS FROM `' . $table_name . "` LIKE 'confirmID';";
152 $result = $wpdb->query( $check_query );
153 if ( empty( $result ) ) {
154 $alter_query = 'ALTER TABLE ' . $table_name . '
155 ADD COLUMN confirmID int(20) not NULL DEFAULT -1';
156 $ret = $wpdb->query( $alter_query );
157 }
158 // add columns - requiredMsg : version 2.9.3
159 $check_query = 'SHOW COLUMNS FROM `' . $table_name . "` LIKE 'requiredMsg';";
160 $result = $wpdb->query( $check_query );
161 if ( empty( $result ) ) {
162 $alter_query = 'ALTER TABLE ' . $table_name . '
163 ADD COLUMN requiredMsg varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci';
164 $ret = $wpdb->query( $alter_query );
165 }
166 }
167
168 /**
169 * Get form data
170 *
171 * @param string $frmID - form ID.
172 * @return array|null|object|void
173 */
174 public static function getForm( $frmID = 'new' ) {
175 global $wpdb;
176 if ( 'new' == $frmID ) {
177 // default form.
178 $formData = self::getDefaultForm();
179 $list = maybe_serialize( array( SIB_API_Manager::get_default_list_id() ) );
180 $results = array(
181 'title' => '',
182 'html' => $formData['html'],// phpcs:ignore
183 'css' => $formData['css'],
184 'listID' => $list,
185 'dependTheme' => '1',
186 'templateID' => '-1',
187 'confirmID' => '-1',
188 'isOpt' => '0',
189 'isDopt' => '0',
190 'redirectInEmail' => '',
191 'redirectInForm' => '',
192 'date' => date( 'Y-m-d' ),
193 'successMsg' => $formData['successMsg'],
194 'errorMsg' => $formData['errorMsg'],
195 'existMsg' => $formData['existMsg'],
196 'invalidMsg' => $formData['invalidMsg'],
197 'requiredMsg' => $formData['requiredMsg'],
198 'attributes' => 'email,NAME',
199 );
200 } else {
201 $query = $wpdb->prepare('SELECT * from ' . $wpdb->prefix . self::TABLE_NAME . ' where id = %d',array(esc_sql($frmID)));
202 $results = $wpdb->get_row( $query, ARRAY_A ); // db call ok; no-cache ok.
203 }
204
205 if ( is_array( $results ) && count( $results ) > 0 ) {
206 $listIDs = maybe_unserialize( $results['listID'] );
207 $results['listID'] = $listIDs;
208 return $results;
209 }
210 return array();
211 }
212
213 /**
214 * Get all forms
215 */
216 public static function getForms() {
217 global $wpdb;
218
219 $query = 'select * from ' . $wpdb->prefix . self::TABLE_NAME . ';';
220 $results = $wpdb->get_results( $query, ARRAY_A ); // db call ok; no-cache ok.
221
222 if ( is_array( $results ) && count( $results ) > 0 ) {
223 // add list names field to display form table.
224 foreach ( $results as $key => $form ) {
225 if ( SIB_Forms_Lang::check_form_trans( $form['id'] ) == true ) {
226 unset( $results[ $key ] );
227 continue;
228 }
229 $listIDs = maybe_unserialize( $form['listID'] );
230 $listIDs = !empty($listIDs) ? $listIDs : array();
231 // get names form id array.
232 $lists = SIB_API_Manager::get_lists(); // pair of id and name.
233
234 $listNames = array();
235 foreach ( $lists as $list ) {
236 if ( in_array( $list['id'], $listIDs ) ) {
237 $listNames[] = $list['name'];
238 }
239 }
240 $results[ $key ]['listName'] = implode( ',', $listNames );
241 $results[ $key ]['listID'] = $listIDs;
242 }
243 return $results;
244 }
245 return array();
246
247 }
248
249 /**
250 * Add new form
251 *
252 * @param array $formData - form data.
253 * @return null|string
254 */
255 public static function addForm( $formData ) {
256 global $wpdb;
257
258 $current_date = date( 'Y-m-d' );
259
260 global $wpdb;
261
262 global $wpdb;
263 $query = 'INSERT INTO ' . $wpdb->prefix . self::TABLE_NAME.' (title,html,css,dependTheme,listID,templateID,confirmID,isOpt,isDopt,redirectInEmail,redirectInForm,successMsg,errorMsg,existMsg,invalidMsg,requiredMsg,attributes,date,gCaptcha,gCaptcha_secret,gCaptcha_site,termAccept,termsURL, selectCaptchaType, cCaptchaType, cCaptcha_secret,cCaptcha_site, cCaptchaStyle) VALUES ';
264 $query .= ' (%s, %s, %s, %d, %s, %d, %d, %d, %d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s, %s, %d, %s, %d, %d,%s, %s, %s)';
265
266 $query = $wpdb->prepare($query,array($formData['title'],$formData['html'],$formData['css'],$formData['dependTheme'],$formData['listID'],
267 $formData['templateID'],$formData['confirmID'],$formData['isOpt'],$formData['isDopt'],$formData['redirectInEmail'],$formData['redirectInForm'],
268 $formData['successMsg'],$formData['errorMsg'],$formData['existMsg'],$formData['invalidMsg'],$formData['requiredMsg'],$formData['attributes'],$current_date,$formData['gcaptcha'],$formData['gcaptcha_secret'] ,$formData['gcaptcha_site'],$formData['termAccept'],$formData['termsURL'], $formData['selectCaptchaType'], $formData['cCaptchaType'], $formData['ccaptcha_secret'], $formData['ccaptcha_site'], $formData['cCaptchaStyle']));
269
270 $wpdb->query( $query ); // db call ok; no-cache ok.
271 $index = $wpdb->get_var( 'SELECT LAST_INSERT_ID();' ); // db call ok; no-cache ok.
272 return $index;
273 }
274
275 /**
276 * Update form
277 *
278 * @param int $formID - form ID.
279 * @param array $formData - form data.
280 * @return bool
281 */
282 public static function updateForm( $formID, $formData ) {
283 global $wpdb;
284
285 $current_date = date( 'Y-m-d' );
286
287 global $wpdb;
288
289 $query = 'UPDATE ' . $wpdb->prefix . self::TABLE_NAME ;
290 $query .= " set title = %s, html = %s, css = %s, dependTheme = %d, listID = %s, templateID = %d, confirmID = %d, isOpt = %d, isDopt = %d, redirectInEmail = %s, redirectInForm = %s, successMsg = %s, errorMsg = %s, existMsg = %s, invalidMsg = %s, requiredMsg = %s, attributes = %s, date = %s, gCaptcha = %d, gCaptcha_secret = %s, gCaptcha_site = %s, termAccept = %d, termsURL = %s, selectCaptchaType = %d, cCaptcha_secret = %s, cCaptcha_site = %s, cCaptchaType = %d, cCaptchaStyle = %s";
291 $query .= ' where id= %d';
292
293 $query = $wpdb->prepare( $query ,array($formData['title'],$formData['html'],$formData['css'],$formData['dependTheme'],$formData['listID'],
294 $formData['templateID'],$formData['confirmID'],$formData['isOpt'],$formData['isDopt'],$formData['redirectInEmail'],$formData['redirectInForm'],
295 $formData['successMsg'],$formData['errorMsg'],$formData['existMsg'],$formData['invalidMsg'],$formData['requiredMsg'],$formData['attributes'],$current_date,$formData['gcaptcha'],$formData['gcaptcha_secret'] ,$formData['gcaptcha_site'],$formData['termAccept'],$formData['termsURL'],$formData['selectCaptchaType'],$formData['ccaptcha_secret'] ,$formData['ccaptcha_site'], $formData['cCaptchaType'],$formData['cCaptchaStyle'], esc_sql($formID)));
296
297 $wpdb->query( $query ); // db call ok; no-cache ok.
298
299 return true;
300 }
301
302 /**
303 * Remove form
304 *
305 * @param int $id - target form id.
306 */
307 public static function deleteForm( $id ) {
308 global $wpdb;
309
310 $wpdb->delete(
311 $wpdb->prefix . self::TABLE_NAME,
312 array(
313 'id' => $id,
314 )
315 ); // db call ok; no-cache ok.
316 }
317
318 /** Clear forms data */
319 public static function removeAllForms() {
320 global $wpdb;
321 $wpdb->query( 'TRUNCATE TABLE ' . $wpdb->prefix . self::TABLE_NAME ); // db call ok; no-cache ok.
322 return true;
323 }
324
325 /** Create default form */
326 public static function createDefaultForm() {
327 $formData = self::getDefaultForm();
328 // phpcs:ignore
329 $html = $formData['html'];
330 $css = $formData['css'];
331 $list = maybe_serialize( array( SIB_API_Manager::get_default_list_id() ) );
332 $current_date = date( 'Y-m-d' );
333 $attributes = 'email,NAME';
334 global $wpdb;
335 $query = 'INSERT INTO ' . $wpdb->prefix . self::TABLE_NAME . ' ';
336 $deafult_form_name = esc_attr( __( 'Default Form', 'mailin' ) );
337 $query .= '(title,html,css,listID,dependTheme,successMsg,errorMsg,existMsg,invalidMsg,requiredMsg,attributes,date,isDefault) ';
338 $query .= "VALUES ('{$deafult_form_name}','{$html}','{$css}','{$list}','1','{$formData['successMsg']}','{$formData['errorMsg']}','{$formData['existMsg']}','{$formData['invalidMsg']}','{$formData['requiredMsg']}','{$attributes}','{$current_date}','1')";
339 $wpdb->query( $query ); // db call ok; no-cache ok.
340 }
341
342 /** Get default form data */
343 public static function getDefaultForm() {
344
345 $html = wp_kses(self::get_default_form_html(), SIB_Manager::SIB_ATTRIBUTE);
346 $css = wp_kses(self::get_default_css_html(), SIB_Manager::SIB_ATTRIBUTE);
347
348 $result = array(
349 'html' => $html,
350 'css' => $css,
351 'successMsg' => esc_attr( __( 'Thank you, you have successfully registered !', 'mailin' ) ),
352 'errorMsg' => esc_attr( __( 'Something wrong occured', 'mailin' ) ),
353 'existMsg' => esc_attr( __( 'You have already registered', 'mailin' ) ),
354 'invalidMsg' => esc_attr( __( 'Your email address is invalid', 'mailin' ) ),
355 'requiredMsg' => esc_attr(__('Please fill out this field', 'mailin'))
356 );
357 return $result;
358 }
359
360 /** Get Default css */
361 public static function getDefaultMessageCss() {
362 $css = file_get_contents(__DIR__ . '/' . self::DEFAULT_FORM_MESSAGE_CSS_PATH) ?: '';
363 return wp_kses($css, SIB_Manager::SIB_ATTRIBUTE);
364 }
365
366 /**
367 * Get form data of old version
368 * We suppose that the clients have got own setting values for form.
369 * If the client have default setting only then it will be return error.
370 * This function will be removed after next version
371 */
372 public static function get_old_form() {
373 // create form from old version.
374 $form_settings = get_option( 'sib_subscription_option' );
375 $html = $form_settings['sib_form_html'];
376 $avail_atts = $form_settings['available_attributes'];
377
378 $signup_settings = get_option( 'sib_signup_option' );
379 $is_confirm_email = 'yes' == $signup_settings['is_confirm_email'] ? 1 : 0;
380 $is_double_optin = 'yes' == $signup_settings['is_double_optin'] ? 1 : 0;
381 $redirect_url = $signup_settings['redirect_url'];
382 $redirect_url_click = $signup_settings['redirect_url_click'];
383 $template_id = 1 == $is_confirm_email ? $signup_settings['template_id'] : $signup_settings['doubleoptin_template_id'];
384
385 $confirmMsg = get_option( 'sib_confirm_option' );
386
387 $homeSetting = get_option( 'sib_home_option' );
388 $sib_list = maybe_serialize( array( (string) $homeSetting['list_id'] ) );
389
390 $formData = array(
391 'title' => 'Old Form',
392 'html' => $html,
393 'css' => '',
394 'dependTheme' => '1',
395 'listID' => $sib_list,
396 'templateID' => $template_id,
397 'isOpt' => $is_confirm_email,
398 'isDopt' => $is_double_optin,
399 'redirectInEmail' => $redirect_url,
400 'redirectInForm' => $redirect_url_click,
401 'successMsg' => $confirmMsg['alert_success_message'],
402 'errorMsg' => $confirmMsg['alert_error_message'],
403 'existMsg' => $confirmMsg['alert_exist_subscriber'],
404 'invalidMsg' => $confirmMsg['alert_invalid_email'],
405 'attributes' => 'email,' . implode( ',', $avail_atts ),
406 );
407
408 return $formData;
409 }
410
411 /**
412 * Add prefix to the table
413 */
414 public static function add_prefix() {
415 global $wpdb;
416 if (self::forms_table_exists()) {
417 $query = 'ALTER TABLE ' . self::TABLE_NAME . ' RENAME TO ' . $wpdb->prefix . self::TABLE_NAME . ';';
418 $wpdb->query( $query ); // db call ok; no-cache ok.
419 }
420 }
421
422 /**
423 * Change datatype of attribute column
424 */
425 public static function modify_datatype() {
426 global $wpdb;
427 if (self::forms_table_exists()) {
428 $tableStructure = $wpdb->get_results( "DESC " . $wpdb->prefix . self::TABLE_NAME );
429 foreach ($tableStructure as $key => $value)
430 {
431 if($value->Field == "attributes" && $value->Type == "varchar(255)")
432 $wpdb->query("ALTER TABLE ". $wpdb->prefix . self::TABLE_NAME." MODIFY ".$value->Field." TEXT DEFAULT NULL");
433 }
434 }
435 }
436
437 /**
438 * @return bool
439 */
440 public static function forms_table_exists()
441 {
442 global $wpdb;
443 return $wpdb->get_var( "SHOW TABLES LIKE '" . self::TABLE_NAME . "'" ) == self::TABLE_NAME;
444 }
445
446 /**
447 * @return string
448 */
449 public static function get_default_form_html()
450 {
451 return file_get_contents(__DIR__ . '/' . self::DEFAULT_FORM_HTML_PATH) ?: '';
452 }
453
454 /**
455 * @return string
456 */
457 public static function get_default_css_html()
458 {
459 return file_get_contents(__DIR__ . '/' . self::DEFAULT_FORM_CSS_PATH) ?: '';
460 }
461 }
462 }
463