usr/src/cmd/fm/eversholt/common/eftwrite.c
author esaxe
Fri, 11 Aug 2006 18:11:49 -0700
changeset 2538 b5894d78c55a
parent 0 68f95e015346
child 5609 6c18074bcfad
permissions -rw-r--r--
5016095 nightly should help determine what really changes from build to build 6404876 uses of __DATE__ / __TIME__ should be purged from ON 6404908 ON builds should employ a static globalization prefix
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
2538
b5894d78c55a 5016095 nightly should help determine what really changes from build to build
esaxe
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
b5894d78c55a 5016095 nightly should help determine what really changes from build to build
esaxe
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
2538
b5894d78c55a 5016095 nightly should help determine what really changes from build to build
esaxe
parents: 0
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 * eftwrite.c -- routines for writing .eft files
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
 * this module emits the table resulting from compilation of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
 * source files.  this code done nothing unless the -o option
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
 * was given on the command line.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <strings.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include "out.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include "stats.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include "stable.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include "lut.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include "tree.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include "eft.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include "eftwrite.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include "esclex.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include "version.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include "ptree.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
/* for uintX_t, htonl(), etc */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <netinet/in.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#include <inttypes.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
extern char Args[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
static struct stats *Outbytes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
static int Identlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
static int Dictlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
eftwrite_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	Outbytes = stats_new_counter("eftwrite.total", "bytes written", 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
ident_lencalc(const char *s, void *rhs, void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	Identlen += strlen(s) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
dict_lencalc(const char *s, void *rhs, void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	Dictlen += strlen(s) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
ident_printer(const char *s, void *rhs, void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	FILE *fp = (FILE *)arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	fwrite(s, strlen(s) + 1, 1, fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
dict_printer(const char *s, void *rhs, void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	FILE *fp = (FILE *)arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	fwrite(s, strlen(s) + 1, 1, fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
eftwrite(const char *fname)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	FILE *fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	FILE *tfp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	struct eftheader hdr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
#define	BUFLEN	8192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	char buf[BUFLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	int cc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	if ((tfp = tmpfile()) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
		out(O_DIE|O_SYS, "cannot create temporary file");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	/* XXX switch stdout to tfp temporarily */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	/* XXX for now */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	out_altfp(tfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	ptree(O_ALTFP, tree_root(NULL), 0, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	rewind(tfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	lut_walk(Ident, (lut_cb)ident_lencalc, (void *)0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	lut_walk(Dicts, (lut_cb)dict_lencalc, (void *)0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	bzero(&hdr, sizeof (hdr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	hdr.magic = EFT_HDR_MAGIC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	hdr.major = EFT_HDR_MAJOR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	hdr.minor = EFT_HDR_MINOR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	hdr.cmajor = VERSION_MAJOR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	hdr.cminor = VERSION_MINOR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	hdr.identlen = Identlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	hdr.dictlen = Dictlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	buf[BUFLEN - 1] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	(void) snprintf(hdr.comment, EFT_HDR_MAXCOMMENT,
2538
b5894d78c55a 5016095 nightly should help determine what really changes from build to build
esaxe
parents: 0
diff changeset
   133
	    "Built using esc-%d.%d\tArgs: \"%s\"\n", VERSION_MAJOR,
b5894d78c55a 5016095 nightly should help determine what really changes from build to build
esaxe
parents: 0
diff changeset
   134
	    VERSION_MINOR, Args);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	if ((fp = fopen(fname, "w")) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
		out(O_DIE|O_SYS, "can't open output file: %s", fname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	while ((cc = fread(buf, 1, BUFLEN, tfp)) > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
		char *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
		for (ptr = buf; ptr < &buf[cc]; ptr++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
			hdr.csum += (uint32_t)*ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	if (ferror(tfp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
		out(O_DIE|O_SYS, "fread on tmpfile");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	rewind(tfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	hdr.magic = htonl(hdr.magic);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	hdr.major = htons(hdr.major);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	hdr.minor = htons(hdr.minor);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	hdr.cmajor = htons(hdr.cmajor);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	hdr.cminor = htons(hdr.cminor);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	hdr.identlen = htonl(hdr.identlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	hdr.dictlen = htonl(hdr.dictlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	hdr.csum = htonl(hdr.csum);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	fwrite(&hdr, sizeof (hdr), 1, fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	if (ferror(fp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
		out(O_DIE|O_SYS, "%s: can't write header", fname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	stats_counter_add(Outbytes, sizeof (hdr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	lut_walk(Ident, (lut_cb)ident_printer, (void *)fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	stats_counter_add(Outbytes, Identlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	lut_walk(Dicts, (lut_cb)dict_printer, (void *)fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	stats_counter_add(Outbytes, Dictlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	while ((cc = fread(buf, 1, BUFLEN, tfp)) > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
		char *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
		for (ptr = buf; ptr < &buf[cc]; ptr++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
			*ptr = ~((unsigned char)*ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
		if (cc != fwrite(buf, 1, cc, fp) || ferror(fp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
			out(O_DIE|O_SYS, "fwrite on %s", fname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
		stats_counter_add(Outbytes, cc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	if (ferror(tfp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
		out(O_DIE|O_SYS, "fread on tmpfile");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	fclose(tfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	fclose(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
}