usr/src/cmd/rad/mdb/rad.c
author David Powell <david.e.powell@oracle.com>
Tue, 23 Nov 2010 15:54:20 -0800
changeset 604 20d9acfeb7fb
parent 575 e5ca78dfe938
child 714 5f40c4b913c9
permissions -rw-r--r--
17421 name key order preservation 17422 rad dynamic namespace support 17423 rad kstat module
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
     1
/*
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
     2
 * CDDL HEADER START
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
     3
 *
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
     7
 *
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    11
 * and limitations under the License.
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    12
 *
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    18
 *
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    19
 * CDDL HEADER END
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    20
 */
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    21
/*
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    22
 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    23
 */
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    24
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    25
#include <sys/mdb_modapi.h>
604
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
    26
#include <sys/list_impl.h>
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
    27
#include <stddef.h>
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    28
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    29
#include "../rad_object.h"
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    30
#include "../rad_container.h"
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    31
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    32
static int
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    33
cmd_container(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    34
{
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    35
	if (!(flags & DCMD_ADDRSPEC)) {
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    36
		GElf_Sym sym;
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    37
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    38
		mdb_printf("Defaulting to rad_container_auth:\n");
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    39
		if (mdb_lookup_by_name("rad_container_auth", &sym) == -1) {
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    40
			mdb_warn("unable to find rad_container_auth\n");
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    41
			return (DCMD_ERR);
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    42
		}
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    43
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    44
		addr = sym.st_value;
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    45
	}
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    46
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    47
	if (mdb_pwalk_dcmd("instances", "instance", argc, argv, addr) == -1) {
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    48
		mdb_warn("couldn't walk 'instances'");
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    49
		return (DCMD_ERR);
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    50
	}
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    51
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    52
	return (DCMD_OK);
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    53
}
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    54
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    55
static int
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    56
cmd_instance(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    57
{
575
e5ca78dfe938 17085 add component prefixes to adr's method/attribute
David Powell <david.e.powell@oracle.com>
parents: 573
diff changeset
    58
	rad_instance_t inst;
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    59
	char str[200];
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    60
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    61
	if (DCMD_HDRSPEC(flags))
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    62
		mdb_printf("%<u>%?s %16s %s%</u>\n", "ADDR", "ID", "NAME");
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    63
575
e5ca78dfe938 17085 add component prefixes to adr's method/attribute
David Powell <david.e.powell@oracle.com>
parents: 573
diff changeset
    64
	if (mdb_vread(&inst, sizeof (rad_instance_t), addr) == -1) {
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    65
		mdb_warn("failed to read rad_instance_t at %p", addr);
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    66
		return (DCMD_ERR);
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    67
	}
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    68
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    69
	if (mdb_readstr(str, sizeof (str), (uintptr_t)inst.i_namestr) == -1) {
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    70
		str[0] = '\0';
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    71
		(void) strlcat(str, "*READ ERROR*", sizeof (str));
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    72
	}
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    73
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    74
	mdb_printf("%0?p %16llx %s\n", addr, inst.i_id, str);
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    75
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    76
	return (DCMD_OK);
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    77
}
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    78
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    79
typedef struct iwalk_data {
604
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
    80
	size_t	iwd_offset;
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
    81
	uintptr_t iwd_next;
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
    82
	uintptr_t iwd_start;
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    83
} iwalk_data_t;
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    84
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    85
static int
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    86
walk_instances_init(mdb_walk_state_t *wsp)
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    87
{
575
e5ca78dfe938 17085 add component prefixes to adr's method/attribute
David Powell <david.e.powell@oracle.com>
parents: 573
diff changeset
    88
	rad_container_t cont;
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    89
575
e5ca78dfe938 17085 add component prefixes to adr's method/attribute
David Powell <david.e.powell@oracle.com>
parents: 573
diff changeset
    90
	if (mdb_vread(&cont, sizeof (rad_container_t), wsp->walk_addr) == -1) {
e5ca78dfe938 17085 add component prefixes to adr's method/attribute
David Powell <david.e.powell@oracle.com>
parents: 573
diff changeset
    91
		mdb_warn("failed to read rad_container_t at %p",
e5ca78dfe938 17085 add component prefixes to adr's method/attribute
David Powell <david.e.powell@oracle.com>
parents: 573
diff changeset
    92
		    wsp->walk_addr);
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    93
		return (WALK_ERR);
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    94
	}
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
    95
604
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
    96
	if (cont.c_instances.list_offset != offsetof(rad_instance_t, i_cnode) ||
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
    97
	    cont.c_instances.list_size != sizeof (rad_instance_t)) {
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
    98
		mdb_warn("invalid/corrupt rad_container_t or "
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
    99
		    "mismatched mdb module\n");
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   100
		return (WALK_ERR);
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   101
	}
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   102
604
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   103
	/* Unfortunately, the list_t walker is buried in the genunix module */
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   104
	iwalk_data_t *data = mdb_alloc(sizeof (iwalk_data_t), UM_SLEEP | UM_GC);
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   105
	data->iwd_offset = cont.c_instances.list_offset;
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   106
	data->iwd_next = (uintptr_t)cont.c_instances.list_head.list_next;
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   107
	data->iwd_start =
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   108
	    wsp->walk_addr + offsetof(rad_container_t, c_instances.list_head);
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   109
	wsp->walk_data = data;
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   110
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   111
	return (WALK_NEXT);
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   112
}
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   113
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   114
static int
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   115
walk_instances_step(mdb_walk_state_t *wsp)
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   116
{
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   117
	iwalk_data_t *data = wsp->walk_data;
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   118
	uintptr_t addr;
575
e5ca78dfe938 17085 add component prefixes to adr's method/attribute
David Powell <david.e.powell@oracle.com>
parents: 573
diff changeset
   119
	rad_instance_t inst;
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   120
604
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   121
	if (data->iwd_next == data->iwd_start)
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   122
		return (WALK_DONE);
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   123
604
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   124
	addr = data->iwd_next - data->iwd_offset;
575
e5ca78dfe938 17085 add component prefixes to adr's method/attribute
David Powell <david.e.powell@oracle.com>
parents: 573
diff changeset
   125
	if (mdb_vread(&inst, sizeof (rad_instance_t), addr) == -1) {
e5ca78dfe938 17085 add component prefixes to adr's method/attribute
David Powell <david.e.powell@oracle.com>
parents: 573
diff changeset
   126
		mdb_warn("error reading rad_instance_t at %p, skipping\n",
e5ca78dfe938 17085 add component prefixes to adr's method/attribute
David Powell <david.e.powell@oracle.com>
parents: 573
diff changeset
   127
		    addr);
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   128
		return (WALK_NEXT);
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   129
	}
604
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   130
	data->iwd_next = (uintptr_t)inst.i_cnode.list_next;
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   131
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   132
	return (wsp->walk_callback(addr, &inst, wsp->walk_cbdata));
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   133
}
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   134
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   135
static const mdb_dcmd_t dcmds[] = {
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   136
	{ "container", NULL, "display contents of a rad_container_t",
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   137
	    cmd_container },
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   138
	{ "instance", NULL, "display a rad_instance_t", cmd_instance },
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   139
	{ NULL }
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   140
};
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   141
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   142
static const mdb_walker_t walkers[] = {
575
e5ca78dfe938 17085 add component prefixes to adr's method/attribute
David Powell <david.e.powell@oracle.com>
parents: 573
diff changeset
   143
	{ "instances", "walks the instances in a rad_container_t",
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   144
	    walk_instances_init, walk_instances_step },
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   145
	{ NULL }
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   146
};
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   147
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   148
static const mdb_modinfo_t modinfo = {
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   149
	MDB_API_VERSION, dcmds, walkers
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   150
};
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   151
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   152
const mdb_modinfo_t *
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   153
_mdb_init(void)
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   154
{
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   155
	return (&modinfo);
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents:
diff changeset
   156
}