PluginProbe
Forumax – AI Powered Advanced Community Forum Plugin / 2.4.2
Forumax – AI Powered Advanced Community Forum Plugin v2.4.2
2.4.4 2.4.3 2.4.2 2.4.1 2.4.0 trunk 1.0.8 1.1.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 1.3.1 1.3.2 1.3.3 1.4.0 1.4.1 2.0.0 2.1.0 All 29 releases
bbp-core / lib / bbpress / includes / admin / tools.php

tools.php in Forumax – AI Powered Advanced Community Forum Plugin 2.4.2, at lib/bbpress/includes/admin/tools.php

557 lines 20.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * bbPress Admin Tools Page
5 *
6 * @package bbPress
7 * @subpackage Administration
8 */
9
10 // Exit if accessed directly
11 defined( 'ABSPATH' ) || exit;
12
13 /**
14 * Output a bbPress specific tools box
15 *
16 * @since 2.6.0 bbPress (r6273)
17 */
18 function bbp_admin_tools_box() {
19
20 // Bail if user cannot access tools page
21 if ( ! current_user_can( 'bbp_tools_page' ) ) {
22 return;
23 }
24
25 // Get the tools pages
26 $links = array();
27 $tools = bbp_get_tools_admin_pages(); ?>
28
29 <div class="card">
30 <h3 class="title"><?php esc_html_e( 'Forums', 'bbpress' ) ?></h3>
31 <p><?php esc_html_e( 'bbPress provides the following tools to help you manage your forums:', 'bbpress' ); ?></p>
32
33 <?php
34
35 // Loop through tools and create links
36 foreach ( $tools as $tool ) {
37
38 // Skip if user cannot see this page
39 if ( ! current_user_can( $tool['cap'] ) ) {
40 continue;
41 }
42
43 // Add link to array
44 $links[] = sprintf( '<a href="%s">%s</a>', esc_url( add_query_arg( array( 'page' => $tool['page'] ), admin_url( 'tools.php' ) ) ), $tool['name'] );
45 }
46
47 // Output links
48 echo '<p class="bbp-tools-links">' . implode( ' &middot; ', $links ) . '</p>';
49
50 ?></div>
51
52 <?php
53 }
54
55 /**
56 * Register an admin area repair tool
57 *
58 * @since 2.6.0 bbPress (r5885)
59 *
60 * @param array $args
61 * @return
62 */
63 function bbp_register_repair_tool( $args = array() ) {
64
65 // Parse arguments
66 $r = bbp_parse_args( $args, array(
67 'id' => '',
68 'type' => '',
69 'title' => '',
70 'description' => '',
71 'callback' => '',
72 'priority' => 0,
73 'overhead' => 'low',
74 'version' => '',
75 'components' => array(),
76
77 // @todo
78 'success' => esc_html__( 'The repair was completed successfully', 'bbpress' ),
79 'failure' => esc_html__( 'The repair was not successful', 'bbpress' )
80 ), 'register_repair_tool' );
81
82 // Bail if missing required values
83 if ( empty( $r['id'] ) || empty( $r['priority'] ) || empty( $r['title'] ) || empty( $r['callback'] ) ) {
84 return;
85 }
86
87 // Add tool to the registered tools array
88 bbp_admin()->tools[ $r['id'] ] = array(
89 'type' => $r['type'],
90 'title' => $r['title'],
91 'description' => $r['description'],
92 'priority' => $r['priority'],
93 'callback' => $r['callback'],
94 'overhead' => $r['overhead'],
95 'components' => $r['components'],
96 'version' => $r['version'],
97
98 // @todo
99 'success' => $r['success'],
100 'failure' => $r['failure'],
101 );
102 }
103
104 /**
105 * Register the default repair tools
106 *
107 * @since 2.6.0 bbPress (r5885)
108 */
109 function bbp_register_default_repair_tools() {
110
111 // Topic meta
112 bbp_register_repair_tool( array(
113 'id' => 'bbp-sync-topic-meta',
114 'type' => 'repair',
115 'title' => esc_html__( 'Recalculate parent topic for each reply', 'bbpress' ),
116 'description' => esc_html__( 'Run this if replies appear in the wrong topics.', 'bbpress' ),
117 'callback' => 'bbp_admin_repair_topic_meta',
118 'priority' => 5,
119 'overhead' => 'low',
120 'components' => array( bbp_get_reply_post_type() )
121 ) );
122
123 // Forum meta
124 bbp_register_repair_tool( array(
125 'id' => 'bbp-sync-forum-meta',
126 'type' => 'repair',
127 'title' => esc_html__( 'Recalculate parent forum for each topic and reply', 'bbpress' ),
128 'description' => esc_html__( 'Run this if topics or replies appear in the wrong forums.', 'bbpress' ),
129 'callback' => 'bbp_admin_repair_forum_meta',
130 'priority' => 10,
131 'overhead' => 'low',
132 'components' => array( bbp_get_topic_post_type(), bbp_get_reply_post_type() )
133 ) );
134
135 // Forum visibility
136 bbp_register_repair_tool( array(
137 'id' => 'bbp-sync-forum-visibility',
138 'type' => 'repair',
139 'title' => esc_html__( 'Recalculate private and hidden forums', 'bbpress' ),
140 'description' => esc_html__( 'Run this if non-public forums are publicly visible.', 'bbpress' ),
141 'callback' => 'bbp_admin_repair_forum_visibility',
142 'priority' => 15,
143 'overhead' => 'low',
144 'components' => array( bbp_get_forum_post_type() )
145 ) );
146
147 // Sync all topics in all forums
148 bbp_register_repair_tool( array(
149 'id' => 'bbp-sync-all-topics-forums',
150 'type' => 'repair',
151 'title' => esc_html__( 'Recalculate last activity in each topic and forum', 'bbpress' ),
152 'description' => esc_html__( 'Run this if freshness appears incorrectly.', 'bbpress' ),
153 'callback' => 'bbp_admin_repair_freshness',
154 'priority' => 20,
155 'overhead' => 'high',
156 'components' => array( bbp_get_forum_post_type(), bbp_get_topic_post_type(), bbp_get_reply_post_type() )
157 ) );
158
159 // Sync all sticky topics in all forums
160 bbp_register_repair_tool( array(
161 'id' => 'bbp-sync-all-topics-sticky',
162 'type' => 'repair',
163 'title' => esc_html__( 'Recalculate sticky relationship of each topic', 'bbpress' ),
164 'description' => esc_html__( 'Run this if sticky topics appear incorrectly.', 'bbpress' ),
165 'callback' => 'bbp_admin_repair_sticky',
166 'priority' => 25,
167 'overhead' => 'low',
168 'components' => array( bbp_get_topic_post_type() )
169 ) );
170
171 // Sync all hierarchical reply positions
172 bbp_register_repair_tool( array(
173 'id' => 'bbp-sync-all-reply-positions',
174 'type' => 'repair',
175 'title' => esc_html__( 'Recalculate position of each reply in each topic', 'bbpress' ),
176 'description' => esc_html__( 'Run this if replies appear in the wrong order.', 'bbpress' ),
177 'callback' => 'bbp_admin_repair_reply_menu_order',
178 'priority' => 30,
179 'overhead' => 'high',
180 'components' => array( bbp_get_reply_post_type() )
181 ) );
182
183 // Sync all topic engagements for all users
184 bbp_register_repair_tool( array(
185 'id' => 'bbp-topic-engagements',
186 'type' => 'repair',
187 'title' => esc_html__( 'Recalculate engagements in each topic for each user', 'bbpress' ),
188 'description' => esc_html__( 'Run this if voices appear incorrectly.', 'bbpress' ),
189 'callback' => 'bbp_admin_repair_topic_voice_count',
190 'priority' => 35,
191 'overhead' => 'high',
192 'components' => array( bbp_get_topic_post_type(), bbp_get_user_rewrite_id() )
193 ) );
194
195 // Update closed topic counts
196 bbp_register_repair_tool( array(
197 'id' => 'bbp-sync-closed-topics',
198 'type' => 'repair',
199 'title' => esc_html__( 'Repair closed topic statuses', 'bbpress' ),
200 'description' => esc_html__( 'Run this if closed topics appear incorrectly.', 'bbpress' ),
201 'callback' => 'bbp_admin_repair_closed_topics',
202 'priority' => 40,
203 'overhead' => 'medium',
204 'components' => array( bbp_get_topic_post_type() )
205 ) );
206
207 // Count topics
208 bbp_register_repair_tool( array(
209 'id' => 'bbp-forum-topics',
210 'type' => 'repair',
211 'title' => esc_html__( 'Recount topics in each forum', 'bbpress' ),
212 'description' => esc_html__( 'Run this if the number of topics in any forums are incorrect.', 'bbpress' ),
213 'callback' => 'bbp_admin_repair_forum_topic_count',
214 'priority' => 45,
215 'overhead' => 'medium',
216 'components' => array( bbp_get_forum_post_type(), bbp_get_topic_post_type() )
217 ) );
218
219 // Count topic tags
220 bbp_register_repair_tool( array(
221 'id' => 'bbp-topic-tags',
222 'type' => 'repair',
223 'title' => esc_html__( 'Recount topics in each topic-tag', 'bbpress' ),
224 'description' => esc_html__( 'Run this if the number of topics in any topic-tags are incorrect.', 'bbpress' ),
225 'callback' => 'bbp_admin_repair_topic_tag_count',
226 'priority' => 50,
227 'overhead' => 'medium',
228 'components' => array( bbp_get_topic_post_type(), bbp_get_topic_tag_tax_id() )
229 ) );
230
231 // Count forum replies
232 bbp_register_repair_tool( array(
233 'id' => 'bbp-forum-replies',
234 'type' => 'repair',
235 'title' => esc_html__( 'Recount replies in each forum', 'bbpress' ),
236 'description' => esc_html__( 'Run this if the number of replies in any forums are incorrect.', 'bbpress' ),
237 'callback' => 'bbp_admin_repair_forum_reply_count',
238 'priority' => 55,
239 'overhead' => 'high',
240 'components' => array( bbp_get_forum_post_type(), bbp_get_reply_post_type() )
241 ) );
242
243 // Count non-published replies to each forum
244 bbp_register_repair_tool( array(
245 'id' => 'bbp-forum-hidden-replies',
246 'type' => 'repair',
247 'title' => esc_html__( 'Recount pending, spammed, and trashed replies in each forum', 'bbpress' ),
248 'description' => esc_html__( 'Run this if non-public replies display incorrectly in forums.', 'bbpress' ),
249 'callback' => 'bbp_admin_repair_forum_hidden_reply_count',
250 'priority' => 60,
251 'overhead' => 'high',
252 'components' => array( bbp_get_forum_post_type(), bbp_get_reply_post_type() )
253 ) );
254
255 // Count topic replies
256 bbp_register_repair_tool( array(
257 'id' => 'bbp-topic-replies',
258 'type' => 'repair',
259 'title' => esc_html__( 'Recount replies in each topic', 'bbpress' ),
260 'description' => esc_html__( 'Run this if the number of replies in any topics are incorrect.', 'bbpress' ),
261 'callback' => 'bbp_admin_repair_topic_reply_count',
262 'priority' => 65,
263 'overhead' => 'high',
264 'components' => array( bbp_get_topic_post_type(), bbp_get_reply_post_type() )
265 ) );
266
267 // Count non-published replies to each topic
268 bbp_register_repair_tool( array(
269 'id' => 'bbp-topic-hidden-replies',
270 'type' => 'repair',
271 'title' => esc_html__( 'Recount pending, spammed, and trashed replies in each topic', 'bbpress' ),
272 'description' => esc_html__( 'Run this if non-public replies display incorrectly in topics.', 'bbpress' ),
273 'callback' => 'bbp_admin_repair_topic_hidden_reply_count',
274 'priority' => 70,
275 'overhead' => 'high',
276 'components' => array( bbp_get_topic_post_type(), bbp_get_reply_post_type() )
277 ) );
278
279 // Recount topics for each user
280 bbp_register_repair_tool( array(
281 'id' => 'bbp-user-topics',
282 'type' => 'repair',
283 'title' => esc_html__( 'Recount topics for each user', 'bbpress' ),
284 'description' => esc_html__( 'Run this to get fresh topic counts for all users.', 'bbpress' ),
285 'callback' => 'bbp_admin_repair_user_topic_count',
286 'priority' => 75,
287 'overhead' => 'medium',
288 'components' => array( bbp_get_topic_post_type(), bbp_get_user_rewrite_id() )
289 ) );
290
291 // Recount topics for each user
292 bbp_register_repair_tool( array(
293 'id' => 'bbp-user-replies',
294 'type' => 'repair',
295 'title' => esc_html__( 'Recount replies for each user', 'bbpress' ),
296 'description' => esc_html__( 'Run this to get fresh reply counts for all users.', 'bbpress' ),
297 'callback' => 'bbp_admin_repair_user_reply_count',
298 'priority' => 80,
299 'overhead' => 'medium',
300 'components' => array( bbp_get_reply_post_type(), bbp_get_user_rewrite_id() )
301 ) );
302
303 // Remove unpublished topics from user favorites
304 bbp_register_repair_tool( array(
305 'id' => 'bbp-user-favorites',
306 'type' => 'repair',
307 'title' => esc_html__( 'Remove unpublished topics from user favorites', 'bbpress' ),
308 'description' => esc_html__( 'Run this to remove trashed or deleted topics from all user favorites.', 'bbpress' ),
309 'callback' => 'bbp_admin_repair_user_favorites',
310 'priority' => 85,
311 'overhead' => 'medium',
312 'components' => array( bbp_get_topic_post_type(), bbp_get_user_rewrite_id() )
313 ) );
314
315 // Remove unpublished topics from user subscriptions
316 bbp_register_repair_tool( array(
317 'id' => 'bbp-user-topic-subscriptions',
318 'type' => 'repair',
319 'title' => esc_html__( 'Remove unpublished topics from user subscriptions', 'bbpress' ),
320 'description' => esc_html__( 'Run this to remove trashed or deleted topics from all user subscriptions.', 'bbpress' ),
321 'callback' => 'bbp_admin_repair_user_topic_subscriptions',
322 'priority' => 90,
323 'overhead' => 'medium',
324 'components' => array( bbp_get_topic_post_type(), bbp_get_user_rewrite_id() )
325 ) );
326
327 // Remove unpublished forums from user subscriptions
328 bbp_register_repair_tool( array(
329 'id' => 'bbp-user-forum-subscriptions',
330 'type' => 'repair',
331 'title' => esc_html__( 'Remove unpublished forums from user subscriptions', 'bbpress' ),
332 'description' => esc_html__( 'Run this to remove trashed or deleted forums from all user subscriptions.', 'bbpress' ),
333 'callback' => 'bbp_admin_repair_user_forum_subscriptions',
334 'priority' => 95,
335 'overhead' => 'medium',
336 'components' => array( bbp_get_forum_post_type(), bbp_get_user_rewrite_id() )
337 ) );
338
339 // Remove unpublished forums from user subscriptions
340 bbp_register_repair_tool( array(
341 'id' => 'bbp-user-role-map',
342 'type' => 'repair',
343 'title' => esc_html__( 'Remap all users to default forum roles', 'bbpress' ),
344 'description' => esc_html__( 'Run this if users have issues accessing the forums.', 'bbpress' ),
345 'callback' => 'bbp_admin_repair_user_roles',
346 'priority' => 100,
347 'overhead' => 'low',
348 'components' => array( bbp_get_user_rewrite_id() )
349 ) );
350
351 // Migrate topic engagements to post-meta
352 bbp_register_repair_tool( array(
353 'id' => 'bbp-user-topic-engagements-move',
354 'type' => 'upgrade',
355 'title' => esc_html__( 'Upgrade user topic engagements', 'bbpress' ),
356 'description' => esc_html__( 'Copies engagements from user meta to topic meta.', 'bbpress' ),
357 'callback' => 'bbp_admin_upgrade_user_engagements',
358 'priority' => 105,
359 'version' => '2.6.0',
360 'overhead' => 'high',
361 'components' => array( bbp_get_user_rewrite_id(), bbp_get_user_engagements_rewrite_id() )
362 ) );
363
364 // Migrate favorites from user-meta to post-meta
365 bbp_register_repair_tool( array(
366 'id' => 'bbp-user-favorites-move',
367 'type' => 'upgrade',
368 'title' => esc_html__( 'Upgrade user topic favorites', 'bbpress' ),
369 'description' => esc_html__( 'Copies favorites from user meta to topic meta.', 'bbpress' ),
370 'callback' => 'bbp_admin_upgrade_user_favorites',
371 'priority' => 110,
372 'version' => '2.6.0',
373 'overhead' => 'high',
374 'components' => array( bbp_get_user_rewrite_id(), bbp_get_user_favorites_rewrite_id() )
375 ) );
376
377 // Migrate topic subscriptions from user-meta to post-meta
378 bbp_register_repair_tool( array(
379 'id' => 'bbp-user-topic-subscriptions-move',
380 'type' => 'upgrade',
381 'title' => esc_html__( 'Upgrade user topic subscriptions', 'bbpress' ),
382 'description' => esc_html__( 'Copies topic subscriptions from user meta to topic meta.', 'bbpress' ),
383 'callback' => 'bbp_admin_upgrade_user_topic_subscriptions',
384 'priority' => 115,
385 'version' => '2.6.0',
386 'overhead' => 'high',
387 'components' => array( bbp_get_user_rewrite_id(), bbp_get_user_subscriptions_rewrite_id() )
388 ) );
389
390 // Migrate forum subscriptions from user-meta to post-meta
391 bbp_register_repair_tool( array(
392 'id' => 'bbp-user-forum-subscriptions-move',
393 'type' => 'upgrade',
394 'title' => esc_html__( 'Upgrade user forum subscriptions', 'bbpress' ),
395 'description' => esc_html__( 'Copies forum subscriptions from user meta to forum meta.', 'bbpress' ),
396 'callback' => 'bbp_admin_upgrade_user_forum_subscriptions',
397 'priority' => 120,
398 'version' => '2.6.0',
399 'overhead' => 'high',
400 'components' => array( bbp_get_user_rewrite_id(), bbp_get_user_subscriptions_rewrite_id() )
401 ) );
402
403 // Remove favorites from user-meta
404 bbp_register_repair_tool( array(
405 'id' => 'bbp-user-favorites-delete',
406 'type' => 'upgrade',
407 'title' => esc_html__( 'Remove favorites from user-meta', 'bbpress' ),
408 'description' => esc_html__( 'Run this to delete old data (after confirming successful favorites upgrade)', 'bbpress' ),
409 'callback' => 'bbp_admin_upgrade_remove_favorites_from_usermeta',
410 'priority' => 125,
411 'version' => '2.6.1',
412 'overhead' => 'medium',
413 'components' => array( bbp_get_user_rewrite_id(), bbp_get_user_favorites_rewrite_id() )
414 ) );
415
416 // Remove topic subscriptions from user-meta
417 bbp_register_repair_tool( array(
418 'id' => 'bbp-user-topic-subscriptions-delete',
419 'type' => 'upgrade',
420 'title' => esc_html__( 'Remove topic subscriptions from user-meta', 'bbpress' ),
421 'description' => esc_html__( 'Run this to delete old data (after confirming successful topic subscriptions upgrade)', 'bbpress' ),
422 'callback' => 'bbp_admin_upgrade_remove_topic_subscriptions_from_usermeta',
423 'priority' => 130,
424 'version' => '2.6.1',
425 'overhead' => 'medium',
426 'components' => array( bbp_get_user_rewrite_id(), bbp_get_user_subscriptions_rewrite_id() )
427 ) );
428
429 // Remove forum subscriptions from user-meta
430 bbp_register_repair_tool( array(
431 'id' => 'bbp-user-forum-subscriptions-delete',
432 'type' => 'upgrade',
433 'title' => esc_html__( 'Remove forum subscriptions from user-meta', 'bbpress' ),
434 'description' => esc_html__( 'Run this to delete old data (after confirming successful forum subscriptions upgrade)', 'bbpress' ),
435 'callback' => 'bbp_admin_upgrade_remove_forum_subscriptions_from_usermeta',
436 'priority' => 135,
437 'version' => '2.6.1',
438 'overhead' => 'medium',
439 'components' => array( bbp_get_user_rewrite_id(), bbp_get_user_subscriptions_rewrite_id() )
440 ) );
441
442 // Sync all BuddyPress group forum relationships
443 bbp_register_repair_tool( array(
444 'id' => 'bbp-group-forums',
445 'type' => 'upgrade',
446 'title' => esc_html__( 'Upgrade BuddyPress Group Forum relationships', 'bbpress' ),
447 'description' => esc_html__( 'Run this if you just upgraded BuddyPress Forums from Legacy.', 'bbpress' ),
448 'callback' => 'bbp_admin_upgrade_group_forum_relationship',
449 'priority' => 140,
450 'version' => esc_html__( 'Any', 'bbpress' ),
451 'overhead' => 'low',
452 'components' => array( bbp_get_forum_post_type() )
453 ) );
454 }
455
456 /**
457 * Output the tabs in the admin area
458 *
459 * @since 2.1.0 bbPress (r3872)
460 *
461 * @param string $active_tab Name of the tab that is active
462 */
463 function bbp_tools_admin_tabs( $active_tab = '' ) {
464 echo bbp_get_tools_admin_tabs( $active_tab );
465 }
466
467 /**
468 * Output the tabs in the admin area
469 *
470 * @since 2.1.0 bbPress (r3872)
471 *
472 * @param string $active_tab Name of the tab that is active
473 */
474 function bbp_get_tools_admin_tabs( $active_tab = '' ) {
475
476 // Declare local variables
477 $tabs_html = '';
478 $idle_class = 'nav-tab';
479 $active_class = 'nav-tab nav-tab-active';
480
481 // Setup core admin tabs
482 $tabs = bbp_get_tools_admin_pages();
483
484 // Loop through tabs and build navigation
485 foreach ( $tabs as $tab ) {
486
487 // Skip if user cannot visit page
488 if ( ! current_user_can( $tab['cap'] ) ) {
489 continue;
490 }
491
492 // Setup tab HTML
493 $is_current = (bool) ( $tab['page'] === $active_tab );
494 $tab_class = $is_current ? $active_class : $idle_class;
495 $tab_url = add_query_arg( array( 'page' => $tab['page'] ), admin_url( 'tools.php' ) );
496
497 // Tab name is not escaped - may contain HTML
498 $tabs_html .= '<a href="' . esc_url( $tab_url ) . '" class="' . esc_attr( $tab_class ) . '">' . $tab['name'] . '</a>';
499 }
500
501 // Output the tabs
502 return $tabs_html;
503 }
504
505 /**
506 * Return possible tools pages
507 *
508 * @since 2.6.0 bbPress (r6273)
509 *
510 * @return array
511 */
512 function bbp_get_tools_admin_pages() {
513
514 // Get tools URL one time & use in each tab
515 $tools_url = admin_url( 'tools.php' );
516
517 // Filter & return
518 return (array) apply_filters( 'bbp_tools_admin_tabs', array(
519 array(
520 'page' => 'bbp-repair',
521 'func' => 'bbp_admin_repair_page',
522 'cap' => 'bbp_tools_repair_page',
523 'name' => bbp_maybe_append_pending_upgrade_count( esc_html__( 'Repair Forums', 'bbpress' ), 'repair' ),
524
525 // Deprecated 2.6.0
526 'href' => add_query_arg( array( 'page' => 'bbp-repair' ), $tools_url )
527 ),
528 array(
529 'page' => 'bbp-upgrade',
530 'func' => 'bbp_admin_upgrade_page',
531 'cap' => 'bbp_tools_upgrade_page',
532 'name' => bbp_maybe_append_pending_upgrade_count( esc_html__( 'Upgrade Forums', 'bbpress' ), 'upgrade' ),
533
534 // Deprecated 2.6.0
535 'href' => add_query_arg( array( 'page' => 'bbp-upgrade' ), $tools_url )
536 ),
537 array(
538 'page' => 'bbp-converter',
539 'func' => 'bbp_converter_settings_page',
540 'cap' => 'bbp_tools_import_page',
541 'name' => esc_html__( 'Import Forums', 'bbpress' ),
542
543 // Deprecated 2.6.0
544 'href' => add_query_arg( array( 'page' => 'bbp-converter' ), $tools_url )
545 ),
546 array(
547 'page' => 'bbp-reset',
548 'func' => 'bbp_admin_reset_page',
549 'cap' => 'bbp_tools_reset_page',
550 'name' => esc_html__( 'Reset Forums', 'bbpress' ),
551
552 // Deprecated 2.6.0
553 'href' => add_query_arg( array( 'page' => 'bbp-reset' ), $tools_url )
554 )
555 ) );
556 }
557