Completed
Push — master ( 4ba683...3a59f6 )
by Zack
31:21 queued 27:45
created

View_Table_Template::the_columns()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
nc 3
nop 0
dl 0
loc 18
ccs 11
cts 11
cp 1
crap 3
rs 9.6666
c 0
b 0
f 0
1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 14 and the first side effect is on line 6.

The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.

The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.

To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.

Loading history...
2
namespace GV;
3
4
/** If this file is called directly, abort. */
5
if ( ! defined( 'GRAVITYVIEW_DIR' ) ) {
6
	die();
7
}
8
9
/**
10
 * The View Table Template class .
11
 *
12
 * Renders a \GV\View and a \GV\Entry_Collection via a \GV\View_Renderer.
13
 */
14
class View_Table_Template extends View_Template {
15
	/**
16
	 * @var string The template slug to be loaded (like "table", "list")
17
	 */
18
	public static $slug = 'table';
19
20
21
	/**
22
     * Constructor. Add filters to modify output.
23
     *
24
	 * @since 2.0.4
25
	 *
26
	 * @param View $view
27
	 * @param Entry_Collection $entries
28
	 * @param Request $request
29
	 */
30 16
	public function __construct( View $view, Entry_Collection $entries, Request $request ) {
31
32 16
	    add_filter( 'gravityview/template/field/label', array( __CLASS__, 'add_columns_sort_links' ), 100, 2 );
33
34 16
		parent::__construct( $view, $entries, $request );
35 16
	}
36
37
	/**
38
     * Add sorting links to HTML columns that support sorting
39
     *
40
     * @since 2.0.4
41
     * @since 2.0.5 Made static
42
     *
43
     * @static
44
     *
45
	 * @param string $column_label Label for the table column
46
	 * @param \GV\Template_Context $context
47
	 *
48
	 * @return string
49
	 */
50 26
	static public function add_columns_sort_links( $column_label, $context = null ) {
0 ignored issues
show
Coding Style introduced by
As per PSR2, the static declaration should come after the visibility declaration.
Loading history...
51
52 26
		$sort_columns = $context->view->settings->get( 'sort_columns' );
53
54 26
		if ( empty( $sort_columns ) ) {
55 26
            return $column_label;
56
		}
57
58
		if ( ! \GravityView_frontend::getInstance()->is_field_sortable( $context->field->ID, $context->view->form->form ) ) {
59
			return $column_label;
60
		}
61
62
		$sorting = array();
63
64
		$directions = $context->view->settings->get( 'sort_direction' );
65
66
		$sorts = Utils::_GET( 'sort' );
67
68
		if ( $sorts ) {
69
			if ( is_array( $sorts ) ) {
70
				foreach ( (array)$sorts as $key => $direction ) {
0 ignored issues
show
introduced by
No space after closing casting parenthesis is prohibited
Loading history...
71
					if ( $key == $context->field->ID ) {
72
						$sorting['key'] = $context->field->ID;
73
						$sorting['direction'] = strtolower( $direction );
74
						break;
75
					}
76
				}
77
			} else {
78
				if ( $sorts == $context->field->ID ) {
79
					$sorting['key'] = $context->field->ID;
80
					$sorting['direction'] = strtolower( Utils::_GET( 'dir', '' ) );
81
				}
82
			}
83
		} else {
84
			foreach ( (array)$context->view->settings->get( 'sort_field', array() ) as $i => $sort_field ) {
0 ignored issues
show
introduced by
No space after closing casting parenthesis is prohibited
Loading history...
85
				if ( $sort_field == $context->field->ID ) {
86
					$sorting['key'] = $sort_field;
87
					$sorting['direction'] = strtolower( Utils::get( $directions, $i, '' ) );
88
					break; // Only get the first sort
89
				}
90
			}
91
		}
92
93
		$class = 'gv-sort';
94
95
		$sort_field_id = \GravityView_frontend::_override_sorting_id_by_field_type( $context->field->ID, $context->view->form->ID );
96
97
		$sort_args = array(
98
			sprintf( 'sort[%s]', $context->field->ID ),
99
			'asc'
0 ignored issues
show
introduced by
Comma required after last value in array declaration
Loading history...
100
		);
101
102
		// If we are already sorting by the current field...
103
		if ( ! empty( $sorting['key'] ) && (string) $sort_field_id === (string) $sorting['key'] ) {
104
105
		    switch( $sorting['direction'] ) {
106
		        // No sort
107
                case '':
108
	                $sort_args[1] = 'asc';
109
	                $class .= ' gv-icon-caret-up-down';
110
                    break;
111
                case 'desc':
112
	                $sort_args[1] = '';
113
	                $class .= ' gv-icon-sort-asc';
114
	                break;
115
                case 'asc':
116
                default:
117
                    $sort_args[1] = 'desc';
118
                    $class .= ' gv-icon-sort-desc';
119
                    break;
120
            }
121
122
		} else {
123
			$class .= ' gv-icon-caret-up-down';
124
		}
125
126
		$url = remove_query_arg( array( 'pagenum' ) );
127
		$url = remove_query_arg( 'sort', $url );
128
		$multisort_url = self::_get_multisort_url( $url, $sort_args, $context->field->ID );
129
130
    	$url = add_query_arg( $sort_args[0], $sort_args[1], $url );
131
132
		$return = '<a href="'. esc_url_raw( $url ) .'"';
133
134
		if ( ! empty( $multisort_url ) ) {
135
			$return .= ' data-multisort-href="'. esc_url_raw( $multisort_url ) . '"';
136
		}
137
138
		$return .= ' class="'. $class .'" ></a>&nbsp;'. $column_label;
139
140
		return $return;
141
	}
142
143
	/**
144
     * Get the multi-sort URL used in the sorting links
145
     *
146
     * @todo Consider moving to Utils?
147
     *
148
     * @since 2.3
149
     *
150
     * @see add_columns_sort_links
151
	 * @param string $url Single-sort URL
152
	 * @param array $sort_args Single sorting for rules, in [ field_id, dir ] format
153
     * @param string|int $field_id ID of the current field being displayed
154
     *
155
     * @return string Multisort URL, if there are multiple sorts. Otherwise, existing $url
156
	 */
157 1
	static public function _get_multisort_url( $url, $sort_args, $field_id ) {
0 ignored issues
show
Coding Style introduced by
As per PSR2, the static declaration should come after the visibility declaration.
Loading history...
158
159 1
		$sorts = Utils::_GET( 'sort' );
160
161 1
		if ( ! is_array( $sorts ) ) {
162 1
            return $url;
163
		}
164
165 1
        $multisort_url = $url;
166
167
		// If the field has already been sorted by, add the field to the URL
168 1
        if ( ! in_array( $field_id, $keys = array_keys( $sorts ) ) ) {
169 1
            if ( count( $keys ) ) {
170 1
                $multisort_url = add_query_arg( sprintf( 'sort[%s]', end( $keys ) ), $sorts[ end( $keys ) ], $multisort_url );
171 1
                $multisort_url = add_query_arg( $sort_args[0], $sort_args[1], $multisort_url );
172
            } else {
173 1
                $multisort_url = add_query_arg( $sort_args[0], $sort_args[1], $multisort_url );
174
            }
175
        }
176
        // Otherwise, we are just updating the sort order
177
        else {
178
179
            // Pass empty value to unset
180 1
            if( '' === $sort_args[1] ) {
181
	            unset( $sorts[ $field_id ] );
182
            } else {
183 1
	            $sorts[ $field_id ] = $sort_args[1];
184
            }
185
186 1
            $multisort_url = add_query_arg( array( 'sort' => $sorts ), $multisort_url );
187
        }
188
189 1
		return $multisort_url;
190
	}
191
192
	/**
193
	 * Output the table column names.
194
	 *
195
	 * @return void
196
	 */
197 17
	public function the_columns() {
198 17
		$fields = $this->view->fields->by_position( 'directory_table-columns' );
199
200 17
		foreach ( $fields->by_visible()->all() as $field ) {
201 17
			$context = Template_Context::from_template( $this, compact( 'field' ) );
202
203
			$args = array(
204 17
				'field' => is_numeric( $field->ID ) ? $field->as_configuration() : null,
205
				'hide_empty' => false,
206 17
				'zone_id' => 'directory_table-columns',
207 17
				'markup' => '<th id="{{ field_id }}" class="{{ class }}" style="{{width:style}}" data-label="{{label_value:data-label}}">{{label}}</th>',
208 17
				'label_markup' => '<span class="gv-field-label">{{ label }}</span>',
209 17
				'label' => self::get_field_column_label( $field, $context ),
210
			);
211
212 17
			echo \gravityview_field_output( $args, $context );
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '\'
Loading history...
213
		}
214 17
	}
215
216
	/**
217
     * Returns the label for a column, with support for all deprecated filters
218
     *
219
     * @since 2.1
220
     *
221
	 * @param \GV\Field $field
222
	 * @param \GV\Template_Context $context
223
	 */
224 16
	protected static function get_field_column_label( $field, $context = null ) {
225
226 16
		$form = $field->form_id ? GF_Form::by_id( $field->form_id ) : $context->view->form;
0 ignored issues
show
Documentation introduced by
The property form_id does not exist on object<GV\Field>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
227
228
		/**
229
		 * @deprecated Here for back-compatibility.
230
		 */
231 16
		$column_label = apply_filters( 'gravityview_render_after_label', $field->get_label( $context->view, $form ), $field->as_configuration() );
232 16
		$column_label = apply_filters( 'gravityview/template/field_label', $column_label, $field->as_configuration(), ( $form && $form->form ) ? $form->form : null, null );
233
234
		/**
235
		 * @filter `gravityview/template/field/label` Override the field label.
236
		 * @since 2.0
237
		 * @param[in,out] string $column_label The label to override.
238
		 * @param \GV\Template_Context $context The context. Does not have entry set here.
239
		 */
240 16
		$column_label = apply_filters( 'gravityview/template/field/label', $column_label, $context );
241
242 16
		return $column_label;
243
    }
244
245
	/**
246
	 * Output the entry row.
247
	 *
248
	 * @param \GV\Entry $entry The entry to be rendered.
249
	 * @param array $attributes The attributes for the <tr> tag
250
	 *
251
	 * @return void
252
	 */
253 14
	public function the_entry( \GV\Entry $entry, $attributes ) {
254
255 14
		$fields = $this->view->fields->by_position( 'directory_table-columns' )->by_visible();
256
257 14
		$context = Template_Context::from_template( $this, compact( 'entry', 'fields' ) );
258
259
		/**
260
		 * Push legacy entry context.
261
		 */
262 14
		\GV\Mocks\Legacy_Context::load( array(
263 14
			'entry' => $entry,
264
		) );
265
266
		/**
267
		 * @filter `gravityview_table_cells` Modify the fields displayed in a table
268
		 * @param array $fields
269
		 * @param \GravityView_View $this
270
		 * @deprecated Use `gravityview/template/table/fields`
271
		 */
272 14
		$fields = apply_filters( 'gravityview_table_cells', $fields->as_configuration(), \GravityView_View::getInstance() );
273 14
		$fields = Field_Collection::from_configuration( $fields );
274
275
		/**
276
		 * @filter `gravityview/template/table/fields` Modify the fields displayed in this tables.
277
		 * @param \GV\Field_Collection $fields The fields.
278
		 * @param \GV\Template_Context $context The context.
279
		 * @since 2.0
280
		 */
281 14
		$fields = apply_filters( 'gravityview/template/table/fields', $fields, $context );
282
283 14
		$context = Template_Context::from_template( $this, compact( 'entry', 'fields' ) );
284
285
		/**
286
		 * @filter `gravityview/template/table/entry/row/attributes` Filter the row attributes for the row in table view.
287
		 *
288
		 * @param array $attributes The HTML attributes.
289
		 * @param \GV\Template_Context The context.
290
		 *
291
		 * @since 2.0
292
		 */
293 14
		$attributes = apply_filters( 'gravityview/template/table/entry/row/attributes', $attributes, $context );
294
295
		/** Glue the attributes together. */
296 14
		foreach ( $attributes as $attribute => $value ) {
297 14
			$attributes[ $attribute ] = sprintf( "$attribute=\"%s\"", esc_attr( $value ) );
298
		}
299 14
		$attributes = implode( ' ', $attributes );
300
301
		?>
302
			<tr<?php echo $attributes ? " $attributes" : ''; ?>>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$attributes'
Loading history...
303
                <?php
304
305
				/**
306
				 * @action `gravityview/template/table/cells/before` Inside the `tr` while rendering each entry in the loop. Can be used to insert additional table cells.
307
				 * @since 2.0
308
				 * @param \GV\Template_Context The context.
309
				 */
310 14
				do_action( 'gravityview/template/table/cells/before', $context );
311
312
                /**
313
                 * @action `gravityview_table_cells_before` Inside the `tr` while rendering each entry in the loop. Can be used to insert additional table cells.
314
                 * @since 1.0.7
315
				 * @param \GravityView_View $this Current GravityView_View object
316
				 * @deprecated Use `gravityview/template/table/cells/before`
317
                 */
318 14
                do_action( 'gravityview_table_cells_before', \GravityView_View::getInstance() );
319
320 14
                foreach ( $fields->all() as $field ) {
321 14
					if ( isset( $this->view->unions[ $entry['form_id'] ] ) ) {
322
						if ( isset( $this->view->unions[ $entry['form_id'] ][ $field->ID ] ) ) {
323
							$field = $this->view->unions[ $entry['form_id'] ][ $field->ID ];
324
						} else {
325
							if ( ! $field instanceof Internal_Field ) {
326
								$field = Internal_Field::from_configuration( array( 'id' => 'custom' ) );
327
							}
328
						}
329
					}
330 14
					$this->the_field( $field, $entry );
331
				}
332
333
				/**
334
				 * @action `gravityview/template/table/cells/after` Inside the `tr` while rendering each entry in the loop. Can be used to insert additional table cells.
335
				 * @since 2.0
336
				 * @param \GV\Template_Context The context.
337
				 */
338 14
				do_action( 'gravityview/template/table/cells/after', $context );
339
340
                /**
341
                 * @action `gravityview_table_cells_after` Inside the `tr` while rendering each entry in the loop. Can be used to insert additional table cells.
342
                 * @since 1.0.7
343
				 * @param \GravityView_View $this Current GravityView_View object
344
				 * @deprecated Use `gravityview/template/table/cells/after`
345
                 */
346 14
                do_action( 'gravityview_table_cells_after', \GravityView_View::getInstance() );
347
348
				?>
349 14
			</tr>
350
		<?php
351 14
	}
352
353
	/**
354
	 * Output a field cell.
355
	 *
356
	 * @param \GV\Field $field The field to be ouput.
357
	 * @param \GV\Field $entry The entry this field is for.
358
	 *
359
	 * @return void
360
	 */
361 13
	public function the_field( \GV\Field $field, \GV\Entry $entry ) {
362 13
		$form = $this->view->form;
363 13
		$single_entry = $entry;
364
365 13
		if ( $entry->is_multi() ) {
366 2
			if ( ! $single_entry = $entry->from_field( $field ) ) {
367
				echo '<td></td>';
368
				return;
369
			}
370 2
			$form = GF_Form::by_id( $field->form_id );
0 ignored issues
show
Documentation introduced by
The property form_id does not exist on object<GV\Field>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
371
		}
372
373 13
		$renderer = new Field_Renderer();
374 13
		$source = is_numeric( $field->ID ) ? $form : new Internal_Source();
375
376 13
		$value = $renderer->render( $field, $this->view, $source, $entry, $this->request );
377
378 13
		$context = Template_Context::from_template( $this, compact( 'field' ) );
379 13
		$context->entry = $single_entry;
380
381
		$args = array(
382 13
			'entry' => $entry->as_entry(),
383 13
			'field' => is_numeric( $field->ID ) ? $field->as_configuration() : null,
384 13
			'value' => $value,
385
			'hide_empty' => false,
386 13
			'zone_id' => 'directory_table-columns',
387 13
            'label' => self::get_field_column_label( $field, $context ),
388 13
			'markup' => '<td id="{{ field_id }}" class="{{ class }}" data-label="{{label_value:data-label}}">{{ value }}</td>',
389 13
            'form' => $form,
390
		);
391
392
		/** Output. */
393 13
		echo \gravityview_field_output( $args, $context );
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '\'
Loading history...
394 13
	}
395
396
	/**
397
	 * `gravityview_table_body_before` and `gravityview/template/table/body/before` actions.
398
	 *
399
	 * Output inside the `tbody` of the table.
400
	 *
401
	 * @param $context \GV\Template_Context The 2.0 context.
402
	 *
403
	 * @return void
404
	 */
405 16
	public static function body_before( $context ) {
406
		/**
407
		 * @action `gravityview/template/table/body/before` Output inside the `tbody` of the table.
408
		 * @since 2.0
409
		 * @param \GV\Template_Context $context The template context.
410
		 */
411 16
		do_action( 'gravityview/template/table/body/before', $context );
412
413
		/**
414
		* @action `gravityview_table_body_before` Inside the `tbody`, before any rows are rendered. Can be used to insert additional rows.
415
		* @deprecated Use `gravityview/template/table/body/before`
416
		* @since 1.0.7
417
		* @param \GravityView_View $gravityview_view Current GravityView_View object.
418
		*/
419 16
		do_action( 'gravityview_table_body_before', \GravityView_View::getInstance() /** ugh! */ );
420 16
	}
421
422
	/**
423
	 * `gravityview_table_body_after` and `gravityview/template/table/body/after` actions.
424
	 *
425
	 * Output inside the `tbody` of the table.
426
	 *
427
	 * @param $context \GV\Template_Context The 2.0 context.
428
	 *
429
	 * @return void
430
	 */
431 16
	public static function body_after( $context ) {
432
		/**
433
		 * @action `gravityview/template/table/body/after` Output inside the `tbody` of the table at the end.
434
		 * @since 2.0
435
		 * @param \GV\Template_Context $context The template context.
436
		 */
437 16
		do_action( 'gravityview/template/table/body/after', $context );
438
439
		/**
440
		* @action `gravityview_table_body_after` Inside the `tbody`, after any rows are rendered. Can be used to insert additional rows.
441
		* @deprecated Use `gravityview/template/table/body/after`
442
		* @since 1.0.7
443
		* @param \GravityView_View $gravityview_view Current GravityView_View object.
444
		*/
445 16
		do_action( 'gravityview_table_body_after', \GravityView_View::getInstance() /** ugh! */ );
446 16
	}
447
448
	/**
449
	 * `gravityview_table_tr_before` and `gravityview/template/table/tr/after` actions.
450
	 *
451
	 * Output inside the `tr` of the table.
452
	 *
453
	 * @param $context \GV\Template_Context The 2.0 context.
454
	 *
455
	 * @return void
456
	 */
457 6
	public static function tr_before( $context ) {
458
		/**
459
		 * @action `gravityview/template/table/tr/before` Output inside the `tr` of the table when there are no results.
460
		 * @since 2.0
461
		 * @param \GV\Template_Context $context The template context.
462
		 */
463 6
		do_action( 'gravityview/template/table/tr/before', $context );
464
465
		/**
466
		 * @action `gravityview_table_tr_before` Before the `tr` while rendering each entry in the loop. Can be used to insert additional table rows.
467
		 * @since 1.0.7
468
		 * @deprecated USe `gravityview/template/table/tr/before`
469
		 * @param \GravityView_View $gravityview_view Current GraivtyView_View object.
470
		 */
471 6
		do_action( 'gravityview_table_tr_before', \GravityView_View::getInstance() /** ugh! */ );
472 6
	}
473
474
	/**
475
	 * `gravityview_table_tr_after` and `gravityview/template/table/tr/after` actions.
476
	 *
477
	 * Output inside the `tr` of the table.
478
	 *
479
	 * @param $context \GV\Template_Context The 2.0 context.
480
	 *
481
	 * @return void
482
	 */
483 6
	public static function tr_after( $context ) {
484
		/**
485
		 * @action `gravityview/template/table/tr/after` Output inside the `tr` of the table when there are no results.
486
		 * @since 2.0
487
		 * @param \GV\Template_Context $context The template context.
488
		 */
489 6
		do_action( 'gravityview/template/table/tr/after', $context );
490
491
		/**
492
		 * @action `gravityview_table_tr_after` Inside the `tr` while rendering each entry in the loop. Can be used to insert additional table cells.
493
		 * @since 1.0.7
494
		 * @deprecated USe `gravityview/template/table/tr/after`
495
		 * @param \GravityView_View $gravityview_view Current GravityView_View object.
496
		 */
497 6
		do_action( 'gravityview_table_tr_after', \GravityView_View::getInstance() /** ugh! */ );
498 6
	}
499
500
	/**
501
	 * `gravityview_entry_class` and `gravityview/template/table/entry/class` filters.
502
	 *
503
	 * Modify of the class of a row.
504
	 *
505
	 * @param string $class The class.
506
	 * @param \GV\Entry $entry The entry.
507
	 * @param \GV\Template_Context The context.
508
	 *
509
	 * @return string The classes.
510
	 */
511 13
	public static function entry_class( $class, $entry, $context ) {
512
		/**
513
		 * @filter `gravityview_entry_class` Modify the class applied to the entry row.
514
		 * @param string $class Existing class.
515
		 * @param array $entry Current entry being displayed
516
		 * @param \GravityView_View $this Current GravityView_View object
517
		 * @deprecated Use `gravityview/template/table/entry/class`
518
		 * @return string The modified class.
519
		 */
520 13
		$class = apply_filters( 'gravityview_entry_class', $class, $entry->as_entry(), \GravityView_View::getInstance() );
521
522
		/**
523
		 * @filter `gravityview/template/table/entry/class` Modify the class aplied to the entry row.
524
		 * @param string $class The existing class.
525
		 * @param \GV\Template_Context The context.
526
		 * @return string The modified class.
527
		 */
528 13
		return apply_filters( 'gravityview/template/table/entry/class', $class, Template_Context::from_template( $context->template, compact( 'entry' ) ) );
529
	}
530
}
531