This is the mail archive of the gcc-prs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: c++/7929: ICE on struct initialization


The following reply was made to PR c++/7929; it has been noted by GNATS.

From: Andreas Rottmann <a.rottmann@gmx.at>
To: Reichelt <reichelt@igpm.rwth-aachen.de>
Cc: gcc-gnats@gcc.gnu.org,  gcc-bugs@gcc.gnu.org
Subject: Re: c++/7929: ICE on struct initialization
Date: 30 Sep 2002 13:48:30 +0200

 --=-=-=
 
 Reichelt <reichelt@igpm.rwth-aachen.de> writes:
 
 > Hi,
 > 
 > it seems that your gcc installation is broken:
 > Your preprocessed file shows lots of lines like
 > 
 > # 6 "/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/string" 2 3
 > 
 > which refer to 2.95.4 instead of 3.2. In fact there is not a single line
 > referring to 3.2.
 > 
 Hmm, strange, must have messed up preprocessor output
 somehow. However, I have attached the g++-3.2 -E output, and this one
 has not a single '2.95' in it.
 
 > I cannot reproduce your bug on an i686 with a working installation of
 > gcc. The preprocessed file causes some error messages, but no ICE. 
 > 
 Hmm, I use g++ 3.2 from Debian unstable and always get this ICE on
 similiar struct inits...
 
 
 --=-=-=
 Content-Disposition: attachment; filename=ice.i
 Content-Description: preprocessor code
 
 # 1 "gcc-3.2-ICE.cc"
 # 1 "<built-in>"
 # 1 "<command line>"
 # 1 "gcc-3.2-ICE.cc"
 # 1 "/usr/include/c++/3.2/string" 1 3
 # 44 "/usr/include/c++/3.2/string" 3
 
 # 1 "/usr/include/c++/3.2/i386-linux/bits/c++config.h" 1 3
 # 34 "/usr/include/c++/3.2/i386-linux/bits/c++config.h" 3
 # 1 "/usr/include/c++/3.2/i386-linux/bits/os_defines.h" 1 3
 # 39 "/usr/include/c++/3.2/i386-linux/bits/os_defines.h" 3
 # 1 "/usr/include/features.h" 1 3
 # 283 "/usr/include/features.h" 3
 # 1 "/usr/include/sys/cdefs.h" 1 3
 # 284 "/usr/include/features.h" 2 3
 # 312 "/usr/include/features.h" 3
 # 1 "/usr/include/gnu/stubs.h" 1 3
 # 313 "/usr/include/features.h" 2 3
 # 40 "/usr/include/c++/3.2/i386-linux/bits/os_defines.h" 2 3
 # 35 "/usr/include/c++/3.2/i386-linux/bits/c++config.h" 2 3
 # 46 "/usr/include/c++/3.2/string" 2 3
 # 1 "/usr/include/c++/3.2/bits/stringfwd.h" 1 3
 # 43 "/usr/include/c++/3.2/bits/stringfwd.h" 3
 
 
 
 namespace std
 {
   template<class _CharT>
     struct char_traits;
 
   template<> struct char_traits<char>;
 
   template<> struct char_traits<wchar_t>;
 
 
   template<typename _Alloc>
     class allocator;
 
   template<typename _CharT, typename _Traits = char_traits<_CharT>,
            typename _Alloc = allocator<_CharT> >
     class basic_string;
 
   typedef basic_string<char> string;
   typedef basic_string<wchar_t> wstring;
 }
 # 47 "/usr/include/c++/3.2/string" 2 3
 # 1 "/usr/include/c++/3.2/bits/char_traits.h" 1 3
 # 44 "/usr/include/c++/3.2/bits/char_traits.h" 3
 
 # 1 "/usr/include/c++/3.2/cstring" 1 3
 # 48 "/usr/include/c++/3.2/cstring" 3
 
 # 1 "/usr/include/c++/3.2/cstddef" 1 3
 # 47 "/usr/include/c++/3.2/cstddef" 3
 
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 1 3
 # 147 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 3
 typedef int ptrdiff_t;
 # 201 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 3
 typedef unsigned int size_t;
 # 49 "/usr/include/c++/3.2/cstddef" 2 3
 
 namespace std
 {
   using ::ptrdiff_t;
   using ::size_t;
 }
 # 50 "/usr/include/c++/3.2/cstring" 2 3
 
 # 1 "/usr/include/string.h" 1 3
 # 28 "/usr/include/string.h" 3
 extern "C" {
 
 
 
 
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 1 3
 # 34 "/usr/include/string.h" 2 3
 
 
 
 extern void *memcpy (void *__restrict __dest,
                      __const void *__restrict __src, size_t __n) throw ();
 
 
 extern void *memmove (void *__dest, __const void *__src, size_t __n)
      throw ();
 
 
 
 
 
 extern void *memccpy (void *__restrict __dest, __const void *__restrict __src,
                       int __c, size_t __n)
      throw ();
 
 
 
 
 extern void *memset (void *__s, int __c, size_t __n) throw ();
 
 
 extern int memcmp (__const void *__s1, __const void *__s2, size_t __n)
      throw () __attribute__ ((__pure__));
 
 
 extern void *memchr (__const void *__s, int __c, size_t __n)
       throw () __attribute__ ((__pure__));
 
 
 
 
 extern void *rawmemchr (__const void *__s, int __c) throw () __attribute__ ((__pure__));
 
 
 extern void *memrchr (__const void *__s, int __c, size_t __n)
       throw () __attribute__ ((__pure__));
 
 
 
 
 extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
      throw ();
 
 extern char *strncpy (char *__restrict __dest,
                       __const char *__restrict __src, size_t __n) throw ();
 
 
 extern char *strcat (char *__restrict __dest, __const char *__restrict __src)
      throw ();
 
 extern char *strncat (char *__restrict __dest, __const char *__restrict __src,
                       size_t __n) throw ();
 
 
 extern int strcmp (__const char *__s1, __const char *__s2)
      throw () __attribute__ ((__pure__));
 
 extern int strncmp (__const char *__s1, __const char *__s2, size_t __n)
      throw () __attribute__ ((__pure__));
 
 
 extern int strcoll (__const char *__s1, __const char *__s2)
      throw () __attribute__ ((__pure__));
 
 extern size_t strxfrm (char *__restrict __dest,
                        __const char *__restrict __src, size_t __n) throw ();
 
 
 
 
 
 # 1 "/usr/include/xlocale.h" 1 3
 # 28 "/usr/include/xlocale.h" 3
 typedef struct __locale_struct
 {
 
   struct locale_data *__locales[13];
 
 
   const unsigned short int *__ctype_b;
   const int *__ctype_tolower;
   const int *__ctype_toupper;
 } *__locale_t;
 # 109 "/usr/include/string.h" 2 3
 
 
 extern int __strcoll_l (__const char *__s1, __const char *__s2, __locale_t __l)
      throw () __attribute__ ((__pure__));
 
 extern size_t __strxfrm_l (char *__dest, __const char *__src, size_t __n,
                            __locale_t __l) throw ();
 
 
 
 
 extern char *strdup (__const char *__s) throw () __attribute__ ((__malloc__));
 
 
 
 
 
 
 extern char *strndup (__const char *__string, size_t __n)
      throw () __attribute__ ((__malloc__));
 # 155 "/usr/include/string.h" 3
 extern char *strchr (__const char *__s, int __c) throw () __attribute__ ((__pure__));
 
 extern char *strrchr (__const char *__s, int __c) throw () __attribute__ ((__pure__));
 
 
 
 
 extern char *strchrnul (__const char *__s, int __c) throw () __attribute__ ((__pure__));
 
 
 
 
 extern size_t strcspn (__const char *__s, __const char *__reject)
      throw () __attribute__ ((__pure__));
 
 
 extern size_t strspn (__const char *__s, __const char *__accept)
      throw () __attribute__ ((__pure__));
 
 extern char *strpbrk (__const char *__s, __const char *__accept)
      throw () __attribute__ ((__pure__));
 
 extern char *strstr (__const char *__haystack, __const char *__needle)
      throw () __attribute__ ((__pure__));
 
 
 
 extern char *strcasestr (__const char *__haystack, __const char *__needle)
      throw () __attribute__ ((__pure__));
 
 
 
 extern char *strtok (char *__restrict __s, __const char *__restrict __delim)
      throw ();
 
 
 
 extern char *__strtok_r (char *__restrict __s,
                          __const char *__restrict __delim,
                          char **__restrict __save_ptr) throw ();
 
 extern char *strtok_r (char *__restrict __s, __const char *__restrict __delim,
                        char **__restrict __save_ptr) throw ();
 
 
 
 
 
 
 extern void *memmem (__const void *__haystack, size_t __haystacklen,
                      __const void *__needle, size_t __needlelen)
      throw () __attribute__ ((__pure__));
 
 
 
 extern void *__mempcpy (void *__restrict __dest,
                         __const void *__restrict __src, size_t __n) throw ();
 extern void *mempcpy (void *__restrict __dest,
                       __const void *__restrict __src, size_t __n) throw ();
 
 
 
 
 extern size_t strlen (__const char *__s) throw () __attribute__ ((__pure__));
 
 
 
 
 extern size_t strnlen (__const char *__string, size_t __maxlen)
      throw () __attribute__ ((__pure__));
 
 
 
 
 extern char *strerror (int __errnum) throw ();
 
 
 
 extern char *strerror_r (int __errnum, char *__buf, size_t __buflen) throw ();
 
 
 
 
 extern void __bzero (void *__s, size_t __n) throw ();
 
 
 
 extern void bcopy (__const void *__src, void *__dest, size_t __n) throw ();
 
 
 extern void bzero (void *__s, size_t __n) throw ();
 
 
 extern int bcmp (__const void *__s1, __const void *__s2, size_t __n)
      throw () __attribute__ ((__pure__));
 
 
 extern char *index (__const char *__s, int __c) throw () __attribute__ ((__pure__));
 
 
 extern char *rindex (__const char *__s, int __c) throw () __attribute__ ((__pure__));
 
 
 
 extern int ffs (int __i) throw () __attribute__ ((__const__));
 
 
 
 
 extern int ffsl (long int __l) throw () __attribute__ ((__const__));
 
 __extension__ extern int ffsll (long long int __ll)
      throw () __attribute__ ((__const__));
 
 
 
 
 extern int strcasecmp (__const char *__s1, __const char *__s2)
      throw () __attribute__ ((__pure__));
 
 
 extern int strncasecmp (__const char *__s1, __const char *__s2, size_t __n)
      throw () __attribute__ ((__pure__));
 
 
 
 
 
 extern int __strcasecmp_l (__const char *__s1, __const char *__s2,
                            __locale_t __loc) throw () __attribute__ ((__pure__));
 
 extern int __strncasecmp_l (__const char *__s1, __const char *__s2,
                             size_t __n, __locale_t __loc)
      throw () __attribute__ ((__pure__));
 
 
 
 
 
 extern char *strsep (char **__restrict __stringp,
                      __const char *__restrict __delim) throw ();
 
 
 
 
 extern int strverscmp (__const char *__s1, __const char *__s2)
      throw () __attribute__ ((__pure__));
 
 
 extern char *strsignal (int __sig) throw ();
 
 
 extern char *__stpcpy (char *__restrict __dest, __const char *__restrict __src)
      throw ();
 extern char *stpcpy (char *__restrict __dest, __const char *__restrict __src)
      throw ();
 
 
 
 extern char *__stpncpy (char *__restrict __dest,
                         __const char *__restrict __src, size_t __n) throw ();
 extern char *stpncpy (char *__restrict __dest,
                       __const char *__restrict __src, size_t __n) throw ();
 
 
 extern char *strfry (char *__string) throw ();
 
 
 extern void *memfrob (void *__s, size_t __n) throw ();
 
 
 
 
 
 
 extern char *basename (__const char *__filename) throw ();
 # 364 "/usr/include/string.h" 3
 }
 # 52 "/usr/include/c++/3.2/cstring" 2 3
 # 77 "/usr/include/c++/3.2/cstring" 3
 namespace std
 {
   using ::memcpy;
   using ::memmove;
   using ::strcpy;
   using ::strncpy;
   using ::strcat;
   using ::strncat;
   using ::memcmp;
   using ::strcmp;
   using ::strcoll;
   using ::strncmp;
   using ::strxfrm;
   using ::strcspn;
   using ::strspn;
   using ::strtok;
   using ::memset;
   using ::strerror;
   using ::strlen;
 
   using ::memchr;
 
   inline void*
   memchr(void* __p, int __c, size_t __n)
   { return memchr(const_cast<const void*>(__p), __c, __n); }
 
   using ::strchr;
 
   inline char*
   strchr(char* __s1, int __n)
   { return __builtin_strchr(const_cast<const char*>(__s1), __n); }
 
   using ::strpbrk;
 
   inline char*
   strpbrk(char* __s1, const char* __s2)
   { return __builtin_strpbrk(const_cast<const char*>(__s1), __s2); }
 
   using ::strrchr;
 
   inline char*
   strrchr(char* __s1, int __n)
   { return __builtin_strrchr(const_cast<const char*>(__s1), __n); }
 
   using ::strstr;
 
   inline char*
   strstr(char* __s1, const char* __s2)
   { return __builtin_strstr(const_cast<const char*>(__s1), __s2); }
 }
 # 46 "/usr/include/c++/3.2/bits/char_traits.h" 2 3
 # 1 "/usr/include/c++/3.2/bits/fpos.h" 1 3
 # 43 "/usr/include/c++/3.2/bits/fpos.h" 3
 
 # 1 "/usr/include/c++/3.2/i386-linux/bits/c++io.h" 1 3
 # 35 "/usr/include/c++/3.2/i386-linux/bits/c++io.h" 3
 # 1 "/usr/include/c++/3.2/cstdio" 1 3
 # 48 "/usr/include/c++/3.2/cstdio" 3
 
 
 
 
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 1 3
 # 39 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 3
 extern "C" {
 
 
 
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 1 3
 # 44 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 2 3
 
 # 1 "/usr/include/bits/types.h" 1 3
 # 29 "/usr/include/bits/types.h" 3
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 1 3
 # 30 "/usr/include/bits/types.h" 2 3
 
 
 typedef unsigned char __u_char;
 typedef unsigned short __u_short;
 typedef unsigned int __u_int;
 typedef unsigned long __u_long;
 
 __extension__ typedef unsigned long long int __u_quad_t;
 __extension__ typedef long long int __quad_t;
 # 49 "/usr/include/bits/types.h" 3
 typedef signed char __int8_t;
 typedef unsigned char __uint8_t;
 typedef signed short int __int16_t;
 typedef unsigned short int __uint16_t;
 typedef signed int __int32_t;
 typedef unsigned int __uint32_t;
 
 __extension__ typedef signed long long int __int64_t;
 __extension__ typedef unsigned long long int __uint64_t;
 
 typedef __quad_t *__qaddr_t;
 
 typedef __u_quad_t __dev_t;
 typedef __u_int __uid_t;
 typedef __u_int __gid_t;
 typedef __u_long __ino_t;
 typedef __u_int __mode_t;
 typedef __u_int __nlink_t;
 typedef long int __off_t;
 typedef __quad_t __loff_t;
 typedef int __pid_t;
 typedef int __ssize_t;
 typedef __u_long __rlim_t;
 typedef __u_quad_t __rlim64_t;
 typedef __u_int __id_t;
 
 typedef struct
   {
     int __val[2];
   } __fsid_t;
 
 
 typedef int __daddr_t;
 typedef char *__caddr_t;
 typedef long int __time_t;
 typedef unsigned int __useconds_t;
 typedef long int __suseconds_t;
 typedef long int __swblk_t;
 
 typedef long int __clock_t;
 
 
 typedef int __clockid_t;
 
 
 typedef int __timer_t;
 
 
 
 
 
 
 typedef int __key_t;
 
 
 typedef unsigned short int __ipc_pid_t;
 
 
 
 typedef long int __blksize_t;
 
 
 
 
 typedef long int __blkcnt_t;
 typedef __quad_t __blkcnt64_t;
 
 
 typedef __u_long __fsblkcnt_t;
 typedef __u_quad_t __fsblkcnt64_t;
 
 
 typedef __u_long __fsfilcnt_t;
 typedef __u_quad_t __fsfilcnt64_t;
 
 
 typedef __u_quad_t __ino64_t;
 
 
 typedef __loff_t __off64_t;
 
 
 typedef long int __t_scalar_t;
 typedef unsigned long int __t_uscalar_t;
 
 
 typedef int __intptr_t;
 
 
 typedef unsigned int __socklen_t;
 
 
 
 
 # 1 "/usr/include/bits/pthreadtypes.h" 1 3
 # 23 "/usr/include/bits/pthreadtypes.h" 3
 # 1 "/usr/include/bits/sched.h" 1 3
 # 68 "/usr/include/bits/sched.h" 3
 struct __sched_param
   {
     int __sched_priority;
   };
 # 24 "/usr/include/bits/pthreadtypes.h" 2 3
 
 typedef int __atomic_lock_t;
 
 
 struct _pthread_fastlock
 {
   long int __status;
   __atomic_lock_t __spinlock;
 
 };
 
 
 
 typedef struct _pthread_descr_struct *_pthread_descr;
 
 
 
 
 
 typedef struct __pthread_attr_s
 {
   int __detachstate;
   int __schedpolicy;
   struct __sched_param __schedparam;
   int __inheritsched;
   int __scope;
   size_t __guardsize;
   int __stackaddr_set;
   void *__stackaddr;
   size_t __stacksize;
 } pthread_attr_t;
 
 
 
 typedef struct
 {
   struct _pthread_fastlock __c_lock;
   _pthread_descr __c_waiting;
 } pthread_cond_t;
 
 
 
 typedef struct
 {
   int __dummy;
 } pthread_condattr_t;
 
 
 typedef unsigned int pthread_key_t;
 
 
 
 
 
 typedef struct
 {
   int __m_reserved;
   int __m_count;
   _pthread_descr __m_owner;
   int __m_kind;
   struct _pthread_fastlock __m_lock;
 } pthread_mutex_t;
 
 
 
 typedef struct
 {
   int __mutexkind;
 } pthread_mutexattr_t;
 
 
 
 typedef int pthread_once_t;
 
 
 
 
 typedef struct _pthread_rwlock_t
 {
   struct _pthread_fastlock __rw_lock;
   int __rw_readers;
   _pthread_descr __rw_writer;
   _pthread_descr __rw_read_waiting;
   _pthread_descr __rw_write_waiting;
   int __rw_kind;
   int __rw_pshared;
 } pthread_rwlock_t;
 
 
 
 typedef struct
 {
   int __lockkind;
   int __pshared;
 } pthread_rwlockattr_t;
 
 
 
 
 typedef volatile int pthread_spinlock_t;
 
 
 typedef struct {
   struct _pthread_fastlock __ba_lock;
   int __ba_required;
   int __ba_present;
   _pthread_descr __ba_waiting;
 } pthread_barrier_t;
 
 
 typedef struct {
   int __pshared;
 } pthread_barrierattr_t;
 
 
 
 
 
 typedef unsigned long int pthread_t;
 # 144 "/usr/include/bits/types.h" 2 3
 # 46 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 2 3
 # 54 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 3
 typedef struct _IO_FILE FILE;
 # 64 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 3
 typedef struct _IO_FILE __FILE;
 # 74 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 3
 # 1 "/usr/include/libio.h" 1 3
 # 32 "/usr/include/libio.h" 3
 # 1 "/usr/include/_G_config.h" 1 3
 # 14 "/usr/include/_G_config.h" 3
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 1 3
 # 321 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 3
 typedef unsigned int wint_t;
 # 15 "/usr/include/_G_config.h" 2 3
 # 24 "/usr/include/_G_config.h" 3
 # 1 "/usr/include/wchar.h" 1 3
 # 48 "/usr/include/wchar.h" 3
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 1 3
 # 49 "/usr/include/wchar.h" 2 3
 
 # 1 "/usr/include/bits/wchar.h" 1 3
 # 51 "/usr/include/wchar.h" 2 3
 # 67 "/usr/include/wchar.h" 3
 typedef struct
 {
   int __count;
   union
   {
     wint_t __wch;
     char __wchb[4];
   } __value;
 } __mbstate_t;
 # 25 "/usr/include/_G_config.h" 2 3
 
 typedef struct
 {
   __off_t __pos;
   __mbstate_t __state;
 } _G_fpos_t;
 typedef struct
 {
   __off64_t __pos;
   __mbstate_t __state;
 } _G_fpos64_t;
 # 44 "/usr/include/_G_config.h" 3
 # 1 "/usr/include/gconv.h" 1 3
 # 28 "/usr/include/gconv.h" 3
 # 1 "/usr/include/wchar.h" 1 3
 # 48 "/usr/include/wchar.h" 3
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 1 3
 # 49 "/usr/include/wchar.h" 2 3
 # 29 "/usr/include/gconv.h" 2 3
 
 
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 1 3
 # 32 "/usr/include/gconv.h" 2 3
 
 
 
 
 
 enum
 {
   __GCONV_OK = 0,
   __GCONV_NOCONV,
   __GCONV_NODB,
   __GCONV_NOMEM,
 
   __GCONV_EMPTY_INPUT,
   __GCONV_FULL_OUTPUT,
   __GCONV_ILLEGAL_INPUT,
   __GCONV_INCOMPLETE_INPUT,
 
   __GCONV_ILLEGAL_DESCRIPTOR,
   __GCONV_INTERNAL_ERROR
 };
 
 
 
 enum
 {
   __GCONV_IS_LAST = 0x0001,
   __GCONV_IGNORE_ERRORS = 0x0002
 };
 
 
 
 struct __gconv_step;
 struct __gconv_step_data;
 struct __gconv_loaded_object;
 struct __gconv_trans_data;
 
 
 
 typedef int (*__gconv_fct) (struct __gconv_step *, struct __gconv_step_data *,
                             __const unsigned char **, __const unsigned char *,
                             unsigned char **, size_t *, int, int);
 
 
 typedef int (*__gconv_init_fct) (struct __gconv_step *);
 typedef void (*__gconv_end_fct) (struct __gconv_step *);
 
 
 
 typedef int (*__gconv_trans_fct) (struct __gconv_step *,
                                   struct __gconv_step_data *, void *,
                                   __const unsigned char *,
                                   __const unsigned char **,
                                   __const unsigned char *, unsigned char **,
                                   size_t *);
 
 
 typedef int (*__gconv_trans_context_fct) (void *, __const unsigned char *,
                                           __const unsigned char *,
                                           unsigned char *, unsigned char *);
 
 
 typedef int (*__gconv_trans_query_fct) (__const char *, __const char ***,
                                         size_t *);
 
 
 typedef int (*__gconv_trans_init_fct) (void **, const char *);
 typedef void (*__gconv_trans_end_fct) (void *);
 
 struct __gconv_trans_data
 {
 
   __gconv_trans_fct __trans_fct;
   __gconv_trans_context_fct __trans_context_fct;
   __gconv_trans_end_fct __trans_end_fct;
   void *__data;
   struct __gconv_trans_data *__next;
 };
 
 
 
 struct __gconv_step
 {
   struct __gconv_loaded_object *__shlib_handle;
   __const char *__modname;
 
   int __counter;
 
   char *__from_name;
   char *__to_name;
 
   __gconv_fct __fct;
   __gconv_init_fct __init_fct;
   __gconv_end_fct __end_fct;
 
 
 
   int __min_needed_from;
   int __max_needed_from;
   int __min_needed_to;
   int __max_needed_to;
 
 
   int __stateful;
 
   void *__data;
 };
 
 
 
 struct __gconv_step_data
 {
   unsigned char *__outbuf;
   unsigned char *__outbufend;
 
 
 
   int __flags;
 
 
 
   int __invocation_counter;
 
 
 
   int __internal_use;
 
   __mbstate_t *__statep;
   __mbstate_t __state;
 
 
 
   struct __gconv_trans_data *__trans;
 };
 
 
 
 typedef struct __gconv_info
 {
   size_t __nsteps;
   struct __gconv_step *__steps;
   __extension__ struct __gconv_step_data __data [];
 } *__gconv_t;
 # 45 "/usr/include/_G_config.h" 2 3
 typedef union
 {
   struct __gconv_info __cd;
   struct
   {
     struct __gconv_info __cd;
     struct __gconv_step_data __data;
   } __combined;
 } _G_iconv_t;
 
 typedef int _G_int16_t __attribute__ ((__mode__ (__HI__)));
 typedef int _G_int32_t __attribute__ ((__mode__ (__SI__)));
 typedef unsigned int _G_uint16_t __attribute__ ((__mode__ (__HI__)));
 typedef unsigned int _G_uint32_t __attribute__ ((__mode__ (__SI__)));
 # 33 "/usr/include/libio.h" 2 3
 # 53 "/usr/include/libio.h" 3
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdarg.h" 1 3
 # 43 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdarg.h" 3
 typedef __builtin_va_list __gnuc_va_list;
 # 54 "/usr/include/libio.h" 2 3
 # 160 "/usr/include/libio.h" 3
 struct _IO_jump_t; struct _IO_FILE;
 # 170 "/usr/include/libio.h" 3
 typedef void _IO_lock_t;
 
 
 
 
 
 struct _IO_marker {
   struct _IO_marker *_next;
   struct _IO_FILE *_sbuf;
 
 
 
   int _pos;
 # 193 "/usr/include/libio.h" 3
 };
 
 
 enum __codecvt_result
 {
   __codecvt_ok,
   __codecvt_partial,
   __codecvt_error,
   __codecvt_noconv
 };
 
 
 
 
 struct _IO_codecvt
 {
   void (*__codecvt_destr) (struct _IO_codecvt *);
   enum __codecvt_result (*__codecvt_do_out) (struct _IO_codecvt *,
                                              __mbstate_t *,
                                              const wchar_t *,
                                              const wchar_t *,
                                              const wchar_t **, char *,
                                              char *, char **);
   enum __codecvt_result (*__codecvt_do_unshift) (struct _IO_codecvt *,
                                                  __mbstate_t *, char *,
                                                  char *, char **);
   enum __codecvt_result (*__codecvt_do_in) (struct _IO_codecvt *,
                                             __mbstate_t *,
                                             const char *, const char *,
                                             const char **, wchar_t *,
                                             wchar_t *, wchar_t **);
   int (*__codecvt_do_encoding) (struct _IO_codecvt *);
   int (*__codecvt_do_always_noconv) (struct _IO_codecvt *);
   int (*__codecvt_do_length) (struct _IO_codecvt *, __mbstate_t *,
                               const char *, const char *, size_t);
   int (*__codecvt_do_max_length) (struct _IO_codecvt *);
 
   _G_iconv_t __cd_in;
   _G_iconv_t __cd_out;
 };
 
 
 struct _IO_wide_data
 {
   wchar_t *_IO_read_ptr;
   wchar_t *_IO_read_end;
   wchar_t *_IO_read_base;
   wchar_t *_IO_write_base;
   wchar_t *_IO_write_ptr;
   wchar_t *_IO_write_end;
   wchar_t *_IO_buf_base;
   wchar_t *_IO_buf_end;
 
   wchar_t *_IO_save_base;
   wchar_t *_IO_backup_base;
 
   wchar_t *_IO_save_end;
 
   __mbstate_t _IO_state;
   __mbstate_t _IO_last_state;
   struct _IO_codecvt _codecvt;
 
   wchar_t _shortbuf[1];
 
   struct _IO_jump_t *_wide_vtable;
 };
 
 
 struct _IO_FILE {
   int _flags;
 
 
 
 
   char* _IO_read_ptr;
   char* _IO_read_end;
   char* _IO_read_base;
   char* _IO_write_base;
   char* _IO_write_ptr;
   char* _IO_write_end;
   char* _IO_buf_base;
   char* _IO_buf_end;
 
   char *_IO_save_base;
   char *_IO_backup_base;
   char *_IO_save_end;
 
   struct _IO_marker *_markers;
 
   struct _IO_FILE *_chain;
 
   int _fileno;
   int _blksize;
   __off_t _old_offset;
 
 
 
   unsigned short _cur_column;
   signed char _vtable_offset;
   char _shortbuf[1];
 
 
 
   _IO_lock_t *_lock;
 # 305 "/usr/include/libio.h" 3
   __off64_t _offset;
 
 
   struct _IO_codecvt *_codecvt;
   struct _IO_wide_data *_wide_data;
 
 
 
 
   int _mode;
 
   char _unused2[15 * sizeof (int) - 2 * sizeof (void *)];
 
 };
 
 
 
 
 
 struct _IO_FILE_plus;
 
 extern struct _IO_FILE_plus _IO_2_1_stdin_;
 extern struct _IO_FILE_plus _IO_2_1_stdout_;
 extern struct _IO_FILE_plus _IO_2_1_stderr_;
 # 344 "/usr/include/libio.h" 3
 typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes);
 
 
 
 
 
 
 
 typedef __ssize_t __io_write_fn (void *__cookie, __const char *__buf,
                                  size_t __n);
 
 
 
 
 
 
 
 typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w);
 
 
 typedef int __io_close_fn (void *__cookie);
 
 
 
 
 typedef __io_read_fn cookie_read_function_t;
 typedef __io_write_fn cookie_write_function_t;
 typedef __io_seek_fn cookie_seek_function_t;
 typedef __io_close_fn cookie_close_function_t;
 
 
 typedef struct
 {
   __io_read_fn *read;
   __io_write_fn *write;
   __io_seek_fn *seek;
   __io_close_fn *close;
 } _IO_cookie_io_functions_t;
 typedef _IO_cookie_io_functions_t cookie_io_functions_t;
 
 struct _IO_cookie_file;
 
 
 extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write,
                              void *__cookie, _IO_cookie_io_functions_t __fns);
 
 
 
 
 extern "C" {
 
 
 extern int __underflow (_IO_FILE *) throw ();
 extern int __uflow (_IO_FILE *) throw ();
 extern int __overflow (_IO_FILE *, int) throw ();
 extern wint_t __wunderflow (_IO_FILE *) throw ();
 extern wint_t __wuflow (_IO_FILE *) throw ();
 extern wint_t __woverflow (_IO_FILE *, wint_t) throw ();
 # 426 "/usr/include/libio.h" 3
 extern int _IO_getc (_IO_FILE *__fp) throw ();
 extern int _IO_putc (int __c, _IO_FILE *__fp) throw ();
 extern int _IO_feof (_IO_FILE *__fp) throw ();
 extern int _IO_ferror (_IO_FILE *__fp) throw ();
 
 extern int _IO_peekc_locked (_IO_FILE *__fp) throw ();
 
 
 
 
 
 extern void _IO_flockfile (_IO_FILE *) throw ();
 extern void _IO_funlockfile (_IO_FILE *) throw ();
 extern int _IO_ftrylockfile (_IO_FILE *) throw ();
 # 456 "/usr/include/libio.h" 3
 extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict,
                         __gnuc_va_list, int *__restrict) throw ();
 extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict,
                          __gnuc_va_list) throw ();
 extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t) throw ();
 extern size_t _IO_sgetn (_IO_FILE *, void *, size_t) throw ();
 
 extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int) throw ();
 extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int) throw ();
 
 extern void _IO_free_backup_area (_IO_FILE *) throw ();
 
 
 extern wint_t _IO_getwc (_IO_FILE *__fp) throw ();
 extern wint_t _IO_putwc (wchar_t __wc, _IO_FILE *__fp) throw ();
 extern int _IO_fwide (_IO_FILE *__fp, int __mode) throw ();
 # 505 "/usr/include/libio.h" 3
 extern int _IO_vfwscanf (_IO_FILE * __restrict, const wchar_t * __restrict,
                          __gnuc_va_list, int *__restrict) throw ();
 extern int _IO_vfwprintf (_IO_FILE *__restrict, const wchar_t *__restrict,
                           __gnuc_va_list) throw ();
 extern __ssize_t _IO_wpadn (_IO_FILE *, wint_t, __ssize_t) throw ();
 extern void _IO_free_wbackup_area (_IO_FILE *) throw ();
 
 
 
 }
 # 75 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 2 3
 
 
 
 
 typedef __gnuc_va_list __not_va_list__;
 # 89 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 3
 typedef _G_fpos_t fpos_t;
 
 
 
 
 typedef _G_fpos64_t fpos64_t;
 # 138 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 3
 # 1 "/usr/include/bits/stdio_lim.h" 1 3
 # 139 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 2 3
 
 
 
 extern FILE *stdin;
 extern FILE *stdout;
 extern FILE *stderr;
 
 
 
 
 
 
 extern int remove (__const char *__filename) throw ();
 
 extern int rename (__const char *__old, __const char *__new) throw ();
 
 
 
 
 extern FILE *tmpfile (void) throw ();
 # 167 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 3
 extern FILE *tmpfile64 (void) throw ();
 
 
 extern char *tmpnam (char *__s) throw ();
 
 
 
 
 extern char *tmpnam_r (char *__s) throw ();
 # 187 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 3
 extern char *tempnam (__const char *__dir, __const char *__pfx)
      throw () __attribute__ ((__malloc__));
 
 
 
 
 extern int fclose (FILE *__stream) throw ();
 
 extern int fflush (FILE *__stream) throw ();
 
 
 
 extern int fflush_unlocked (FILE *__stream) throw ();
 
 
 
 
 extern int fcloseall (void) throw ();
 
 
 
 
 
 extern FILE *fopen (__const char *__restrict __filename,
                     __const char *__restrict __modes) throw ();
 
 extern FILE *freopen (__const char *__restrict __filename,
                       __const char *__restrict __modes,
                       FILE *__restrict __stream) throw ();
 # 231 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 3
 extern FILE *fopen64 (__const char *__restrict __filename,
                       __const char *__restrict __modes) throw ();
 extern FILE *freopen64 (__const char *__restrict __filename,
                         __const char *__restrict __modes,
                         FILE *__restrict __stream) throw ();
 
 
 
 
 extern FILE *fdopen (int __fd, __const char *__modes) throw ();
 
 
 
 
 
 extern FILE *fopencookie (void *__restrict __magic_cookie,
                           __const char *__restrict __modes,
                           _IO_cookie_io_functions_t __io_funcs) throw ();
 
 
 extern FILE *fmemopen (void *__s, size_t __len, __const char *__modes) throw ();
 
 
 
 
 extern FILE *open_memstream (char **__restrict __bufloc,
                              size_t *__restrict __sizeloc) throw ();
 
 
 
 
 
 extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) throw ();
 
 
 
 extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf,
                     int __modes, size_t __n) throw ();
 
 
 
 
 extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf,
                        size_t __size) throw ();
 
 
 extern void setlinebuf (FILE *__stream) throw ();
 
 
 
 
 extern int fprintf (FILE *__restrict __stream,
                     __const char *__restrict __format, ...) throw ();
 
 extern int printf (__const char *__restrict __format, ...) throw ();
 
 extern int sprintf (char *__restrict __s,
                     __const char *__restrict __format, ...) throw ();
 
 
 extern int vfprintf (FILE *__restrict __s, __const char *__restrict __format,
                      __gnuc_va_list __arg) throw ();
 
 extern int vprintf (__const char *__restrict __format, __gnuc_va_list __arg)
      throw ();
 
 extern int vsprintf (char *__restrict __s, __const char *__restrict __format,
                      __gnuc_va_list __arg) throw ();
 
 
 
 extern int snprintf (char *__restrict __s, size_t __maxlen,
                      __const char *__restrict __format, ...)
      throw () __attribute__ ((__format__ (__printf__, 3, 4)));
 
 extern int vsnprintf (char *__restrict __s, size_t __maxlen,
                       __const char *__restrict __format, __gnuc_va_list __arg)
      throw () __attribute__ ((__format__ (__printf__, 3, 0)));
 
 
 
 
 
 extern int vasprintf (char **__restrict __ptr, __const char *__restrict __f,
                       __gnuc_va_list __arg)
      throw () __attribute__ ((__format__ (__printf__, 2, 0)));
 extern int __asprintf (char **__restrict __ptr,
                        __const char *__restrict __fmt, ...)
      throw () __attribute__ ((__format__ (__printf__, 2, 3)));
 extern int asprintf (char **__restrict __ptr,
                      __const char *__restrict __fmt, ...)
      throw () __attribute__ ((__format__ (__printf__, 2, 3)));
 
 
 extern int vdprintf (int __fd, __const char *__restrict __fmt,
                      __gnuc_va_list __arg)
      throw () __attribute__ ((__format__ (__printf__, 2, 0)));
 extern int dprintf (int __fd, __const char *__restrict __fmt, ...)
      throw () __attribute__ ((__format__ (__printf__, 2, 3)));
 
 
 
 
 extern int fscanf (FILE *__restrict __stream,
                    __const char *__restrict __format, ...) throw ();
 
 extern int scanf (__const char *__restrict __format, ...) throw ();
 
 extern int sscanf (__const char *__restrict __s,
                    __const char *__restrict __format, ...) throw ();
 
 
 
 extern int vfscanf (FILE *__restrict __s, __const char *__restrict __format,
                     __gnuc_va_list __arg)
      throw () __attribute__ ((__format__ (__scanf__, 2, 0)));
 
 
 extern int vscanf (__const char *__restrict __format, __gnuc_va_list __arg)
      throw () __attribute__ ((__format__ (__scanf__, 1, 0)));
 
 
 extern int vsscanf (__const char *__restrict __s,
                     __const char *__restrict __format, __gnuc_va_list __arg)
      throw () __attribute__ ((__format__ (__scanf__, 2, 0)));
 
 
 
 
 extern int fgetc (FILE *__stream) throw ();
 extern int getc (FILE *__stream) throw ();
 
 
 extern int getchar (void) throw ();
 
 
 
 
 
 
 
 extern int getc_unlocked (FILE *__stream) throw ();
 extern int getchar_unlocked (void) throw ();
 
 
 
 
 extern int fgetc_unlocked (FILE *__stream) throw ();
 
 
 
 
 extern int fputc (int __c, FILE *__stream) throw ();
 extern int putc (int __c, FILE *__stream) throw ();
 
 
 extern int putchar (int __c) throw ();
 
 
 
 
 
 
 
 extern int fputc_unlocked (int __c, FILE *__stream) throw ();
 
 
 
 
 extern int putc_unlocked (int __c, FILE *__stream) throw ();
 extern int putchar_unlocked (int __c) throw ();
 
 
 
 
 
 extern int getw (FILE *__stream) throw ();
 
 
 extern int putw (int __w, FILE *__stream) throw ();
 
 
 
 
 extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
      throw ();
 
 
 
 extern char *fgets_unlocked (char *__restrict __s, int __n,
                              FILE *__restrict __stream) throw ();
 
 
 
 
 extern char *gets (char *__s) throw ();
 # 435 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 3
 extern __ssize_t __getdelim (char **__restrict __lineptr,
                                size_t *__restrict __n, int __delimiter,
                                FILE *__restrict __stream) throw ();
 extern __ssize_t getdelim (char **__restrict __lineptr,
                              size_t *__restrict __n, int __delimiter,
                              FILE *__restrict __stream) throw ();
 
 
 extern __ssize_t getline (char **__restrict __lineptr,
                             size_t *__restrict __n,
                             FILE *__restrict __stream) throw ();
 
 
 
 
 extern int fputs (__const char *__restrict __s, FILE *__restrict __stream)
      throw ();
 
 
 
 extern int fputs_unlocked (__const char *__restrict __s,
                            FILE *__restrict __stream) throw ();
 
 
 
 extern int puts (__const char *__s) throw ();
 
 
 
 extern int ungetc (int __c, FILE *__stream) throw ();
 
 
 
 extern size_t fread (void *__restrict __ptr, size_t __size,
                      size_t __n, FILE *__restrict __stream) throw ();
 
 extern size_t fwrite (__const void *__restrict __ptr, size_t __size,
                       size_t __n, FILE *__restrict __s) throw ();
 
 
 
 extern size_t fread_unlocked (void *__restrict __ptr, size_t __size,
                               size_t __n, FILE *__restrict __stream) throw ();
 extern size_t fwrite_unlocked (__const void *__restrict __ptr, size_t __size,
                                size_t __n, FILE *__restrict __stream) throw ();
 
 
 
 
 extern int fseek (FILE *__stream, long int __off, int __whence) throw ();
 
 extern long int ftell (FILE *__stream) throw ();
 
 extern void rewind (FILE *__stream) throw ();
 # 498 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 3
 extern int fseeko (FILE *__stream, __off_t __off, int __whence) throw ();
 
 extern __off_t ftello (FILE *__stream) throw ();
 
 
 
 extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos)
      throw ();
 
 extern int fsetpos (FILE *__stream, __const fpos_t *__pos) throw ();
 # 532 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 3
 extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence) throw ();
 extern __off64_t ftello64 (FILE *__stream) throw ();
 extern int fgetpos64 (FILE *__restrict __stream, fpos64_t *__restrict __pos)
      throw ();
 extern int fsetpos64 (FILE *__stream, __const fpos64_t *__pos) throw ();
 
 
 
 extern void clearerr (FILE *__stream) throw ();
 
 extern int feof (FILE *__stream) throw ();
 
 extern int ferror (FILE *__stream) throw ();
 
 
 
 extern void clearerr_unlocked (FILE *__stream) throw ();
 extern int feof_unlocked (FILE *__stream) throw ();
 extern int ferror_unlocked (FILE *__stream) throw ();
 
 
 
 
 extern void perror (__const char *__s) throw ();
 
 
 
 
 
 # 1 "/usr/include/bits/sys_errlist.h" 1 3
 # 27 "/usr/include/bits/sys_errlist.h" 3
 extern int sys_nerr;
 extern __const char *__const sys_errlist[];
 
 
 extern int _sys_nerr;
 extern __const char *__const _sys_errlist[];
 # 562 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 2 3
 
 
 
 
 extern int fileno (FILE *__stream) throw ();
 
 
 
 
 extern int fileno_unlocked (FILE *__stream) throw ();
 
 
 
 
 
 
 extern FILE *popen (__const char *__command, __const char *__modes) throw ();
 
 
 extern int pclose (FILE *__stream) throw ();
 
 
 
 
 
 extern char *ctermid (char *__s) throw ();
 
 
 
 
 
 extern char *cuserid (char *__s) throw ();
 
 
 
 
 struct obstack;
 
 
 extern int obstack_printf (struct obstack *__restrict __obstack,
                            __const char *__restrict __format, ...) throw ();
 extern int obstack_vprintf (struct obstack *__restrict __obstack,
                             __const char *__restrict __format,
                             __gnuc_va_list __args) throw ();
 
 
 
 
 
 
 
 extern void flockfile (FILE *__stream) throw ();
 
 
 
 extern int ftrylockfile (FILE *__stream) throw ();
 
 
 extern void funlockfile (FILE *__stream) throw ();
 # 637 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdio.h" 3
 }
 # 53 "/usr/include/c++/3.2/cstdio" 2 3
 # 97 "/usr/include/c++/3.2/cstdio" 3
 namespace std
 {
   using ::FILE;
   using ::fpos_t;
 
   using ::clearerr;
   using ::fclose;
   using ::feof;
   using ::ferror;
   using ::fflush;
   using ::fgetc;
   using ::fgetpos;
   using ::fgets;
   using ::fopen;
   using ::fprintf;
   using ::fputc;
   using ::fputs;
   using ::fread;
   using ::freopen;
   using ::fscanf;
   using ::fseek;
   using ::fsetpos;
   using ::ftell;
   using ::fwrite;
   using ::getc;
   using ::getchar;
   using ::gets;
   using ::perror;
   using ::printf;
   using ::putc;
   using ::putchar;
   using ::puts;
   using ::remove;
   using ::rename;
   using ::rewind;
   using ::scanf;
   using ::setbuf;
   using ::setvbuf;
   using ::sprintf;
   using ::sscanf;
   using ::tmpfile;
   using ::tmpnam;
   using ::ungetc;
   using ::vfprintf;
   using ::vprintf;
   using ::vsprintf;
 }
 # 153 "/usr/include/c++/3.2/cstdio" 3
 namespace __gnu_cxx
 {
   using ::snprintf;
   using ::vfscanf;
   using ::vscanf;
   using ::vsnprintf;
   using ::vsscanf;
 }
 
 namespace std
 {
   using __gnu_cxx::snprintf;
   using __gnu_cxx::vfscanf;
   using __gnu_cxx::vscanf;
   using __gnu_cxx::vsnprintf;
   using __gnu_cxx::vsscanf;
 }
 # 36 "/usr/include/c++/3.2/i386-linux/bits/c++io.h" 2 3
 
 # 1 "/usr/include/c++/3.2/i386-linux/bits/gthr.h" 1 3
 # 98 "/usr/include/c++/3.2/i386-linux/bits/gthr.h" 3
 # 1 "/usr/include/c++/3.2/i386-linux/bits/gthr-default.h" 1 3
 # 37 "/usr/include/c++/3.2/i386-linux/bits/gthr-default.h" 3
 # 1 "/usr/include/pthread.h" 1 3
 # 20 "/usr/include/pthread.h" 3
 # 1 "/usr/include/sched.h" 1 3
 # 29 "/usr/include/sched.h" 3
 # 1 "/usr/include/time.h" 1 3
 # 106 "/usr/include/time.h" 3
 struct timespec
   {
     __time_t tv_sec;
     long int tv_nsec;
   };
 # 30 "/usr/include/sched.h" 2 3
 
 
 # 1 "/usr/include/bits/sched.h" 1 3
 # 47 "/usr/include/bits/sched.h" 3
 struct sched_param
   {
     int __sched_priority;
   };
 
 extern "C" {
 
 
 
 extern int clone (int (*__fn) (void *__arg), void *__child_stack,
                   int __flags, void *__arg) throw ();
 
 
 }
 # 33 "/usr/include/sched.h" 2 3
 
 
 
 
 extern "C" {
 
 
 extern int sched_setparam (__pid_t __pid, __const struct sched_param *__param)
      throw ();
 
 
 extern int sched_getparam (__pid_t __pid, struct sched_param *__param) throw ();
 
 
 extern int sched_setscheduler (__pid_t __pid, int __policy,
                                __const struct sched_param *__param) throw ();
 
 
 extern int sched_getscheduler (__pid_t __pid) throw ();
 
 
 extern int sched_yield (void) throw ();
 
 
 extern int sched_get_priority_max (int __algorithm) throw ();
 
 
 extern int sched_get_priority_min (int __algorithm) throw ();
 
 
 extern int sched_rr_get_interval (__pid_t __pid, struct timespec *__t) throw ();
 
 }
 # 21 "/usr/include/pthread.h" 2 3
 # 1 "/usr/include/time.h" 1 3
 # 30 "/usr/include/time.h" 3
 extern "C" {
 
 
 
 
 
 
 
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 1 3
 # 39 "/usr/include/time.h" 2 3
 
 
 
 # 1 "/usr/include/bits/time.h" 1 3
 # 43 "/usr/include/time.h" 2 3
 # 59 "/usr/include/time.h" 3
 typedef __clock_t clock_t;
 # 70 "/usr/include/time.h" 3
 typedef __time_t time_t;
 # 82 "/usr/include/time.h" 3
 typedef __clockid_t clockid_t;
 # 94 "/usr/include/time.h" 3
 typedef __timer_t timer_t;
 # 118 "/usr/include/time.h" 3
 struct tm
 {
   int tm_sec;
   int tm_min;
   int tm_hour;
   int tm_mday;
   int tm_mon;
   int tm_year;
   int tm_wday;
   int tm_yday;
   int tm_isdst;
 
 
   long int tm_gmtoff;
   __const char *tm_zone;
 
 
 
 
 };
 
 
 
 
 struct itimerspec
   {
     struct timespec it_interval;
     struct timespec it_value;
   };
 
 
 struct sigevent;
 
 
 
 
 
 typedef __pid_t pid_t;
 
 
 
 
 
 
 
 extern clock_t clock (void) throw ();
 
 
 extern time_t time (time_t *__timer) throw ();
 
 
 extern double difftime (time_t __time1, time_t __time0)
      throw () __attribute__ ((__const__));
 
 
 extern time_t mktime (struct tm *__tp) throw ();
 
 
 
 
 
 extern size_t strftime (char *__restrict __s, size_t __maxsize,
                         __const char *__restrict __format,
                         __const struct tm *__restrict __tp) throw ();
 
 
 
 
 extern char *strptime (__const char *__restrict __s,
                        __const char *__restrict __fmt, struct tm *__tp)
      throw ();
 
 
 
 
 
 extern struct tm *gmtime (__const time_t *__timer) throw ();
 
 
 
 extern struct tm *localtime (__const time_t *__timer) throw ();
 
 
 
 
 extern struct tm *gmtime_r (__const time_t *__restrict __timer,
                             struct tm *__restrict __tp) throw ();
 
 
 
 extern struct tm *localtime_r (__const time_t *__restrict __timer,
                                struct tm *__restrict __tp) throw ();
 
 
 
 
 extern char *asctime (__const struct tm *__tp) throw ();
 
 
 extern char *ctime (__const time_t *__timer) throw ();
 
 
 
 
 
 
 extern char *asctime_r (__const struct tm *__restrict __tp,
                         char *__restrict __buf) throw ();
 
 
 extern char *ctime_r (__const time_t *__restrict __timer,
                       char *__restrict __buf) throw ();
 
 
 
 
 extern char *__tzname[2];
 extern int __daylight;
 extern long int __timezone;
 
 
 
 
 extern char *tzname[2];
 
 
 
 extern void tzset (void) throw ();
 
 
 
 extern int daylight;
 extern long int timezone;
 
 
 
 
 
 extern int stime (__const time_t *__when) throw ();
 # 271 "/usr/include/time.h" 3
 extern time_t timegm (struct tm *__tp) throw ();
 
 
 extern time_t timelocal (struct tm *__tp) throw ();
 
 
 extern int dysize (int __year) throw () __attribute__ ((__const__));
 
 
 
 
 
 extern int nanosleep (__const struct timespec *__requested_time,
                       struct timespec *__remaining) throw ();
 
 
 
 extern int clock_getres (clockid_t __clock_id, struct timespec *__res) throw ();
 
 
 extern int clock_gettime (clockid_t __clock_id, struct timespec *__tp) throw ();
 
 
 extern int clock_settime (clockid_t __clock_id, __const struct timespec *__tp)
      throw ();
 
 
 
 extern int clock_nanosleep (clockid_t __clock_id, int __flags,
                             __const struct timespec *__req,
                             struct timespec *__rem) throw ();
 
 
 extern int clock_getcpuclockid (pid_t __pid, clockid_t *__clock_id) throw ();
 
 
 
 
 extern int timer_create (clockid_t __clock_id,
                          struct sigevent *__restrict __evp,
                          timer_t *__restrict __timerid) throw ();
 
 
 extern int timer_delete (timer_t __timerid) throw ();
 
 
 extern int timer_settime (timer_t __timerid, int __flags,
                           __const struct itimerspec *__restrict __value,
                           struct itimerspec *__restrict __ovalue) throw ();
 
 
 extern int timer_gettime (timer_t __timerid, struct itimerspec *__value)
      throw ();
 
 
 extern int timer_getoverrun (timer_t __timerid) throw ();
 # 342 "/usr/include/time.h" 3
 extern int getdate_err;
 
 
 
 
 
 extern struct tm *getdate (__const char *__string) throw ();
 # 357 "/usr/include/time.h" 3
 extern int getdate_r (__const char *__restrict __string,
                       struct tm *__restrict __resbufp) throw ();
 
 
 
 }
 # 22 "/usr/include/pthread.h" 2 3
 
 
 # 1 "/usr/include/signal.h" 1 3
 # 31 "/usr/include/signal.h" 3
 extern "C" {
 
 # 1 "/usr/include/bits/sigset.h" 1 3
 # 23 "/usr/include/bits/sigset.h" 3
 typedef int __sig_atomic_t;
 
 
 
 
 typedef struct
   {
     unsigned long int __val[(1024 / (8 * sizeof (unsigned long int)))];
   } __sigset_t;
 # 34 "/usr/include/signal.h" 2 3
 # 48 "/usr/include/signal.h" 3
 typedef __sigset_t sigset_t;
 # 371 "/usr/include/signal.h" 3
 }
 # 25 "/usr/include/pthread.h" 2 3
 # 1 "/usr/include/bits/pthreadtypes.h" 1 3
 # 26 "/usr/include/pthread.h" 2 3
 # 1 "/usr/include/bits/initspin.h" 1 3
 # 27 "/usr/include/pthread.h" 2 3
 
 
 extern "C" {
 # 59 "/usr/include/pthread.h" 3
 enum
 {
   PTHREAD_CREATE_JOINABLE,
 
   PTHREAD_CREATE_DETACHED
 
 };
 
 enum
 {
   PTHREAD_INHERIT_SCHED,
 
   PTHREAD_EXPLICIT_SCHED
 
 };
 
 enum
 {
   PTHREAD_SCOPE_SYSTEM,
 
   PTHREAD_SCOPE_PROCESS
 
 };
 
 enum
 {
   PTHREAD_MUTEX_TIMED_NP,
   PTHREAD_MUTEX_RECURSIVE_NP,
   PTHREAD_MUTEX_ERRORCHECK_NP,
   PTHREAD_MUTEX_ADAPTIVE_NP
 
   ,
   PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP,
   PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
   PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
   PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
 
 
 
   , PTHREAD_MUTEX_FAST_NP = PTHREAD_MUTEX_ADAPTIVE_NP
 
 };
 
 enum
 {
   PTHREAD_PROCESS_PRIVATE,
 
   PTHREAD_PROCESS_SHARED
 
 };
 
 
 enum
 {
   PTHREAD_RWLOCK_PREFER_READER_NP,
   PTHREAD_RWLOCK_PREFER_WRITER_NP,
   PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP,
   PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_WRITER_NP
 };
 # 131 "/usr/include/pthread.h" 3
 struct _pthread_cleanup_buffer
 {
   void (*__routine) (void *);
   void *__arg;
   int __canceltype;
   struct _pthread_cleanup_buffer *__prev;
 };
 
 
 
 enum
 {
   PTHREAD_CANCEL_ENABLE,
 
   PTHREAD_CANCEL_DISABLE
 
 };
 enum
 {
   PTHREAD_CANCEL_DEFERRED,
 
   PTHREAD_CANCEL_ASYNCHRONOUS
 
 };
 # 163 "/usr/include/pthread.h" 3
 extern int pthread_create (pthread_t *__restrict __thread,
                            __const pthread_attr_t *__restrict __attr,
                            void *(*__start_routine) (void *),
                            void *__restrict __arg) throw ();
 
 
 extern pthread_t pthread_self (void) throw ();
 
 
 extern int pthread_equal (pthread_t __thread1, pthread_t __thread2) throw ();
 
 
 extern void pthread_exit (void *__retval)
      throw () __attribute__ ((__noreturn__));
 
 
 
 
 extern int pthread_join (pthread_t __th, void **__thread_return) throw ();
 
 
 
 
 
 extern int pthread_detach (pthread_t __th) throw ();
 
 
 
 
 
 
 
 extern int pthread_attr_init (pthread_attr_t *__attr) throw ();
 
 
 extern int pthread_attr_destroy (pthread_attr_t *__attr) throw ();
 
 
 extern int pthread_attr_setdetachstate (pthread_attr_t *__attr,
                                         int __detachstate) throw ();
 
 
 extern int pthread_attr_getdetachstate (__const pthread_attr_t *__attr,
                                         int *__detachstate) throw ();
 
 
 extern int pthread_attr_setschedparam (pthread_attr_t *__restrict __attr,
                                        __const struct sched_param *__restrict
                                        __param) throw ();
 
 
 extern int pthread_attr_getschedparam (__const pthread_attr_t *__restrict
                                        __attr,
                                        struct sched_param *__restrict __param)
      throw ();
 
 
 extern int pthread_attr_setschedpolicy (pthread_attr_t *__attr, int __policy)
      throw ();
 
 
 extern int pthread_attr_getschedpolicy (__const pthread_attr_t *__restrict
                                         __attr, int *__restrict __policy)
      throw ();
 
 
 extern int pthread_attr_setinheritsched (pthread_attr_t *__attr,
                                          int __inherit) throw ();
 
 
 extern int pthread_attr_getinheritsched (__const pthread_attr_t *__restrict
                                          __attr, int *__restrict __inherit)
      throw ();
 
 
 extern int pthread_attr_setscope (pthread_attr_t *__attr, int __scope)
      throw ();
 
 
 extern int pthread_attr_getscope (__const pthread_attr_t *__restrict __attr,
                                   int *__restrict __scope) throw ();
 
 
 
 extern int pthread_attr_setguardsize (pthread_attr_t *__attr,
                                       size_t __guardsize) throw ();
 
 
 extern int pthread_attr_getguardsize (__const pthread_attr_t *__restrict
                                       __attr, size_t *__restrict __guardsize)
      throw ();
 
 
 
 
 
 
 extern int pthread_attr_setstackaddr (pthread_attr_t *__attr,
                                       void *__stackaddr) throw ();
 
 
 extern int pthread_attr_getstackaddr (__const pthread_attr_t *__restrict
                                       __attr, void **__restrict __stackaddr)
      throw ();
 
 
 
 
 
 extern int pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr,
                                   size_t __stacksize) throw ();
 
 
 extern int pthread_attr_getstack (__const pthread_attr_t *__restrict __attr,
                                   void **__restrict __stackaddr,
                                   size_t *__restrict __stacksize) throw ();
 
 
 
 
 
 extern int pthread_attr_setstacksize (pthread_attr_t *__attr,
                                       size_t __stacksize) throw ();
 
 
 extern int pthread_attr_getstacksize (__const pthread_attr_t *__restrict
                                       __attr, size_t *__restrict __stacksize)
      throw ();
 
 
 
 extern int pthread_getattr_np (pthread_t __th, pthread_attr_t *__attr) throw ();
 
 
 
 
 
 
 extern int pthread_setschedparam (pthread_t __target_thread, int __policy,
                                   __const struct sched_param *__param)
      throw ();
 
 
 extern int pthread_getschedparam (pthread_t __target_thread,
                                   int *__restrict __policy,
                                   struct sched_param *__restrict __param)
      throw ();
 
 
 
 extern int pthread_getconcurrency (void) throw ();
 
 
 extern int pthread_setconcurrency (int __level) throw ();
 
 
 
 
 
 
 
 extern int pthread_yield (void) throw ();
 
 
 
 
 
 
 extern int pthread_mutex_init (pthread_mutex_t *__restrict __mutex,
                                __const pthread_mutexattr_t *__restrict
                                __mutex_attr) throw ();
 
 
 extern int pthread_mutex_destroy (pthread_mutex_t *__mutex) throw ();
 
 
 extern int pthread_mutex_trylock (pthread_mutex_t *__mutex) throw ();
 
 
 extern int pthread_mutex_lock (pthread_mutex_t *__mutex) throw ();
 
 
 
 extern int pthread_mutex_timedlock (pthread_mutex_t *__restrict __mutex,
                                     __const struct timespec *__restrict
                                     __abstime) throw ();
 
 
 
 extern int pthread_mutex_unlock (pthread_mutex_t *__mutex) throw ();
 
 
 
 
 
 
 extern int pthread_mutexattr_init (pthread_mutexattr_t *__attr) throw ();
 
 
 extern int pthread_mutexattr_destroy (pthread_mutexattr_t *__attr) throw ();
 
 
 extern int pthread_mutexattr_getpshared (__const pthread_mutexattr_t *
                                          __restrict __attr,
                                          int *__restrict __pshared) throw ();
 
 
 extern int pthread_mutexattr_setpshared (pthread_mutexattr_t *__attr,
                                          int __pshared) throw ();
 
 
 
 
 
 extern int pthread_mutexattr_settype (pthread_mutexattr_t *__attr, int __kind)
      throw ();
 
 
 extern int pthread_mutexattr_gettype (__const pthread_mutexattr_t *__restrict
                                       __attr, int *__restrict __kind) throw ();
 
 
 
 
 
 
 
 extern int pthread_cond_init (pthread_cond_t *__restrict __cond,
                               __const pthread_condattr_t *__restrict
                               __cond_attr) throw ();
 
 
 extern int pthread_cond_destroy (pthread_cond_t *__cond) throw ();
 
 
 extern int pthread_cond_signal (pthread_cond_t *__cond) throw ();
 
 
 extern int pthread_cond_broadcast (pthread_cond_t *__cond) throw ();
 
 
 
 extern int pthread_cond_wait (pthread_cond_t *__restrict __cond,
                               pthread_mutex_t *__restrict __mutex) throw ();
 
 
 
 
 
 extern int pthread_cond_timedwait (pthread_cond_t *__restrict __cond,
                                    pthread_mutex_t *__restrict __mutex,
                                    __const struct timespec *__restrict
                                    __abstime) throw ();
 
 
 
 
 extern int pthread_condattr_init (pthread_condattr_t *__attr) throw ();
 
 
 extern int pthread_condattr_destroy (pthread_condattr_t *__attr) throw ();
 
 
 extern int pthread_condattr_getpshared (__const pthread_condattr_t *
                                         __restrict __attr,
                                         int *__restrict __pshared) throw ();
 
 
 extern int pthread_condattr_setpshared (pthread_condattr_t *__attr,
                                         int __pshared) throw ();
 
 
 
 
 
 
 
 extern int pthread_rwlock_init (pthread_rwlock_t *__restrict __rwlock,
                                 __const pthread_rwlockattr_t *__restrict
                                 __attr) throw ();
 
 
 extern int pthread_rwlock_destroy (pthread_rwlock_t *__rwlock) throw ();
 
 
 extern int pthread_rwlock_rdlock (pthread_rwlock_t *__rwlock) throw ();
 
 
 extern int pthread_rwlock_tryrdlock (pthread_rwlock_t *__rwlock) throw ();
 
 
 
 extern int pthread_rwlock_timedrdlock (pthread_rwlock_t *__restrict __rwlock,
                                        __const struct timespec *__restrict
                                        __abstime) throw ();
 
 
 
 extern int pthread_rwlock_wrlock (pthread_rwlock_t *__rwlock) throw ();
 
 
 extern int pthread_rwlock_trywrlock (pthread_rwlock_t *__rwlock) throw ();
 
 
 
 extern int pthread_rwlock_timedwrlock (pthread_rwlock_t *__restrict __rwlock,
                                        __const struct timespec *__restrict
                                        __abstime) throw ();
 
 
 
 extern int pthread_rwlock_unlock (pthread_rwlock_t *__rwlock) throw ();
 
 
 
 
 
 extern int pthread_rwlockattr_init (pthread_rwlockattr_t *__attr) throw ();
 
 
 extern int pthread_rwlockattr_destroy (pthread_rwlockattr_t *__attr) throw ();
 
 
 extern int pthread_rwlockattr_getpshared (__const pthread_rwlockattr_t *
                                           __restrict __attr,
                                           int *__restrict __pshared) throw ();
 
 
 extern int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *__attr,
                                           int __pshared) throw ();
 
 
 extern int pthread_rwlockattr_getkind_np (__const pthread_rwlockattr_t *__attr,
                                           int *__pref) throw ();
 
 
 extern int pthread_rwlockattr_setkind_np (pthread_rwlockattr_t *__attr,
                                           int __pref) throw ();
 # 509 "/usr/include/pthread.h" 3
 extern int pthread_spin_init (pthread_spinlock_t *__lock, int __pshared)
      throw ();
 
 
 extern int pthread_spin_destroy (pthread_spinlock_t *__lock) throw ();
 
 
 extern int pthread_spin_lock (pthread_spinlock_t *__lock) throw ();
 
 
 extern int pthread_spin_trylock (pthread_spinlock_t *__lock) throw ();
 
 
 extern int pthread_spin_unlock (pthread_spinlock_t *__lock) throw ();
 
 
 
 
 extern int pthread_barrier_init (pthread_barrier_t *__restrict __barrier,
                                  __const pthread_barrierattr_t *__restrict
                                  __attr, unsigned int __count) throw ();
 
 extern int pthread_barrier_destroy (pthread_barrier_t *__barrier) throw ();
 
 extern int pthread_barrierattr_init (pthread_barrierattr_t *__attr) throw ();
 
 extern int pthread_barrierattr_destroy (pthread_barrierattr_t *__attr) throw ();
 
 extern int pthread_barrierattr_getpshared (__const pthread_barrierattr_t *
                                            __restrict __attr,
                                            int *__restrict __pshared) throw ();
 
 extern int pthread_barrierattr_setpshared (pthread_barrierattr_t *__attr,
                                            int __pshared) throw ();
 
 extern int pthread_barrier_wait (pthread_barrier_t *__barrier) throw ();
 # 556 "/usr/include/pthread.h" 3
 extern int pthread_key_create (pthread_key_t *__key,
                                void (*__destr_function) (void *)) throw ();
 
 
 extern int pthread_key_delete (pthread_key_t __key) throw ();
 
 
 extern int pthread_setspecific (pthread_key_t __key,
                                 __const void *__pointer) throw ();
 
 
 extern void *pthread_getspecific (pthread_key_t __key) throw ();
 # 576 "/usr/include/pthread.h" 3
 extern int pthread_once (pthread_once_t *__once_control,
                          void (*__init_routine) (void)) throw ();
 
 
 
 
 
 
 extern int pthread_setcancelstate (int __state, int *__oldstate) throw ();
 
 
 
 extern int pthread_setcanceltype (int __type, int *__oldtype) throw ();
 
 
 extern int pthread_cancel (pthread_t __thread) throw ();
 
 
 
 
 extern void pthread_testcancel (void) throw ();
 # 610 "/usr/include/pthread.h" 3
 extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *__buffer,
                                    void (*__routine) (void *),
                                    void *__arg) throw ();
 
 
 
 
 
 
 
 extern void _pthread_cleanup_pop (struct _pthread_cleanup_buffer *__buffer,
                                   int __execute) throw ();
 # 631 "/usr/include/pthread.h" 3
 extern void _pthread_cleanup_push_defer (struct _pthread_cleanup_buffer *__buffer,
                                          void (*__routine) (void *),
                                          void *__arg) throw ();
 # 642 "/usr/include/pthread.h" 3
 extern void _pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *__buffer,
                                           int __execute) throw ();
 
 
 
 
 
 extern int pthread_getcpuclockid (pthread_t __thread_id,
                                   clockid_t *__clock_id) throw ();
 
 
 
 
 # 1 "/usr/include/bits/sigthread.h" 1 3
 # 31 "/usr/include/bits/sigthread.h" 3
 extern int pthread_sigmask (int __how,
                             __const __sigset_t *__restrict __newmask,
                             __sigset_t *__restrict __oldmask)throw ();
 
 
 extern int pthread_kill (pthread_t __thread, int __signo) throw ();
 # 656 "/usr/include/pthread.h" 2 3
 # 671 "/usr/include/pthread.h" 3
 extern int pthread_atfork (void (*__prepare) (void),
                            void (*__parent) (void),
                            void (*__child) (void)) throw ();
 
 
 
 
 extern void pthread_kill_other_threads_np (void) throw ();
 
 }
 # 38 "/usr/include/c++/3.2/i386-linux/bits/gthr-default.h" 2 3
 
 typedef pthread_key_t __gthread_key_t;
 typedef pthread_once_t __gthread_once_t;
 typedef pthread_mutex_t __gthread_mutex_t;
 
 
 
 
 
 
 #pragma weak pthread_once
 #pragma weak pthread_key_create
 #pragma weak pthread_key_delete
 #pragma weak pthread_getspecific
 #pragma weak pthread_setspecific
 #pragma weak pthread_create
 
 #pragma weak pthread_mutex_lock 
 #pragma weak pthread_mutex_trylock 
 #pragma weak pthread_mutex_unlock 
 # 80 "/usr/include/c++/3.2/i386-linux/bits/gthr-default.h" 3
 static inline int
 __gthread_active_p (void)
 {
   static void *const __gthread_active_ptr = (void *) &pthread_create;
   return __gthread_active_ptr != 0;
 }
 # 437 "/usr/include/c++/3.2/i386-linux/bits/gthr-default.h" 3
 static inline int
 __gthread_once (__gthread_once_t *once, void (*func) (void))
 {
   if (__gthread_active_p ())
     return pthread_once (once, func);
   else
     return -1;
 }
 
 static inline int
 __gthread_key_create (__gthread_key_t *key, void (*dtor) (void *))
 {
   return pthread_key_create (key, dtor);
 }
 
 static inline int
 __gthread_key_dtor (__gthread_key_t key, void *ptr)
 {
 
   if (ptr)
     return pthread_setspecific (key, 0);
   else
     return 0;
 }
 
 static inline int
 __gthread_key_delete (__gthread_key_t key)
 {
   return pthread_key_delete (key);
 }
 
 static inline void *
 __gthread_getspecific (__gthread_key_t key)
 {
   return pthread_getspecific (key);
 }
 
 static inline int
 __gthread_setspecific (__gthread_key_t key, const void *ptr)
 {
   return pthread_setspecific (key, ptr);
 }
 
 static inline int
 __gthread_mutex_lock (__gthread_mutex_t *mutex)
 {
   if (__gthread_active_p ())
     return pthread_mutex_lock (mutex);
   else
     return 0;
 }
 
 static inline int
 __gthread_mutex_trylock (__gthread_mutex_t *mutex)
 {
   if (__gthread_active_p ())
     return pthread_mutex_trylock (mutex);
   else
     return 0;
 }
 
 static inline int
 __gthread_mutex_unlock (__gthread_mutex_t *mutex)
 {
   if (__gthread_active_p ())
     return pthread_mutex_unlock (mutex);
   else
     return 0;
 }
 # 99 "/usr/include/c++/3.2/i386-linux/bits/gthr.h" 2 3
 # 38 "/usr/include/c++/3.2/i386-linux/bits/c++io.h" 2 3
 
 namespace std
 {
 
   typedef long streamoff;
   typedef ptrdiff_t streamsize;
 
   typedef ptrdiff_t wstreamsize;
 
   typedef fpos_t __c_streampos;
 
   typedef __gthread_mutex_t __c_lock;
 
 
   typedef FILE __c_file;
 
 
   struct __ios_flags
   {
     typedef short __int_type;
 
     static const __int_type _S_boolalpha = 0x0001;
     static const __int_type _S_dec = 0x0002;
     static const __int_type _S_fixed = 0x0004;
     static const __int_type _S_hex = 0x0008;
     static const __int_type _S_internal = 0x0010;
     static const __int_type _S_left = 0x0020;
     static const __int_type _S_oct = 0x0040;
     static const __int_type _S_right = 0x0080;
     static const __int_type _S_scientific = 0x0100;
     static const __int_type _S_showbase = 0x0200;
     static const __int_type _S_showpoint = 0x0400;
     static const __int_type _S_showpos = 0x0800;
     static const __int_type _S_skipws = 0x1000;
     static const __int_type _S_unitbuf = 0x2000;
     static const __int_type _S_uppercase = 0x4000;
     static const __int_type _S_adjustfield = 0x0020 | 0x0080 | 0x0010;
     static const __int_type _S_basefield = 0x0002 | 0x0040 | 0x0008;
     static const __int_type _S_floatfield = 0x0100 | 0x0004;
 
 
     static const __int_type _S_badbit = 0x01;
     static const __int_type _S_eofbit = 0x02;
     static const __int_type _S_failbit = 0x04;
 
 
     static const __int_type _S_app = 0x01;
     static const __int_type _S_ate = 0x02;
     static const __int_type _S_bin = 0x04;
     static const __int_type _S_in = 0x08;
     static const __int_type _S_out = 0x10;
     static const __int_type _S_trunc = 0x20;
   };
 }
 # 45 "/usr/include/c++/3.2/bits/fpos.h" 2 3
 # 1 "/usr/include/c++/3.2/cwchar" 1 3
 # 48 "/usr/include/c++/3.2/cwchar" 3
 
 
 
 # 1 "/usr/include/c++/3.2/ctime" 1 3
 # 48 "/usr/include/c++/3.2/ctime" 3
 # 64 "/usr/include/c++/3.2/ctime" 3
 namespace std
 {
   using ::clock_t;
   using ::time_t;
   using ::tm;
 
   using ::clock;
   using ::difftime;
   using ::mktime;
   using ::time;
   using ::asctime;
   using ::ctime;
   using ::gmtime;
   using ::localtime;
   using ::strftime;
 }
 # 52 "/usr/include/c++/3.2/cwchar" 2 3
 
 
 # 1 "/usr/include/wchar.h" 1 3
 # 40 "/usr/include/wchar.h" 3
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stdarg.h" 1 3
 # 41 "/usr/include/wchar.h" 2 3
 
 
 
 
 
 
 
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 1 3
 # 49 "/usr/include/wchar.h" 2 3
 # 85 "/usr/include/wchar.h" 3
 typedef __mbstate_t mbstate_t;
 # 105 "/usr/include/wchar.h" 3
 struct tm;
 
 
 extern "C" {
 
 
 extern wchar_t *wcscpy (wchar_t *__restrict __dest,
                         __const wchar_t *__restrict __src) throw ();
 
 extern wchar_t *wcsncpy (wchar_t *__restrict __dest,
                          __const wchar_t *__restrict __src, size_t __n)
      throw ();
 
 
 extern wchar_t *wcscat (wchar_t *__restrict __dest,
                         __const wchar_t *__restrict __src) throw ();
 
 extern wchar_t *wcsncat (wchar_t *__restrict __dest,
                          __const wchar_t *__restrict __src, size_t __n)
      throw ();
 
 
 extern int wcscmp (__const wchar_t *__s1, __const wchar_t *__s2)
      throw () __attribute__ ((__pure__));
 
 extern int wcsncmp (__const wchar_t *__s1, __const wchar_t *__s2, size_t __n)
      throw () __attribute__ ((__pure__));
 
 
 
 extern int wcscasecmp (__const wchar_t *__s1, __const wchar_t *__s2) throw ();
 
 
 extern int wcsncasecmp (__const wchar_t *__s1, __const wchar_t *__s2,
                         size_t __n) throw ();
 
 
 
 
 
 extern int __wcscasecmp_l (__const wchar_t *__s1, __const wchar_t *__s2,
                            __locale_t __loc) throw ();
 
 extern int __wcsncasecmp_l (__const wchar_t *__s1, __const wchar_t *__s2,
                             size_t __n, __locale_t __loc) throw ();
 
 
 
 
 extern int wcscoll (__const wchar_t *__s1, __const wchar_t *__s2) throw ();
 
 
 
 extern size_t wcsxfrm (wchar_t *__restrict __s1,
                        __const wchar_t *__restrict __s2, size_t __n) throw ();
 
 
 
 
 
 
 
 extern int __wcscoll_l (__const wchar_t *__s1, __const wchar_t *__s2,
                         __locale_t __loc) throw ();
 
 
 
 extern size_t __wcsxfrm_l (wchar_t *__s1, __const wchar_t *__s2,
                            size_t __n, __locale_t __loc) throw ();
 
 
 extern wchar_t *wcsdup (__const wchar_t *__s) throw () __attribute__ ((__malloc__));
 
 
 
 extern wchar_t *wcschr (__const wchar_t *__wcs, wchar_t __wc)
      throw () __attribute__ ((__pure__));
 
 extern wchar_t *wcsrchr (__const wchar_t *__wcs, wchar_t __wc)
      throw () __attribute__ ((__pure__));
 
 
 
 
 extern wchar_t *wcschrnul (__const wchar_t *__s, wchar_t __wc)
      throw () __attribute__ ((__pure__));
 
 
 
 
 extern size_t wcscspn (__const wchar_t *__wcs, __const wchar_t *__reject)
      throw () __attribute__ ((__pure__));
 
 
 extern size_t wcsspn (__const wchar_t *__wcs, __const wchar_t *__accept)
      throw () __attribute__ ((__pure__));
 
 extern wchar_t *wcspbrk (__const wchar_t *__wcs, __const wchar_t *__accept)
      throw () __attribute__ ((__pure__));
 
 extern wchar_t *wcsstr (__const wchar_t *__haystack, __const wchar_t *__needle)
      throw () __attribute__ ((__pure__));
 
 
 
 extern wchar_t *wcswcs (__const wchar_t *__haystack, __const wchar_t *__needle)
      throw () __attribute__ ((__pure__));
 
 
 
 extern wchar_t *wcstok (wchar_t *__restrict __s,
                         __const wchar_t *__restrict __delim,
                         wchar_t **__restrict __ptr) throw ();
 
 
 extern size_t wcslen (__const wchar_t *__s) throw () __attribute__ ((__pure__));
 
 
 
 extern size_t wcsnlen (__const wchar_t *__s, size_t __maxlen)
      throw () __attribute__ ((__pure__));
 
 
 
 
 extern wchar_t *wmemchr (__const wchar_t *__s, wchar_t __c, size_t __n)
      throw () __attribute__ ((__pure__));
 
 
 extern int wmemcmp (__const wchar_t *__restrict __s1,
                     __const wchar_t *__restrict __s2, size_t __n)
      throw () __attribute__ ((__pure__));
 
 
 extern wchar_t *wmemcpy (wchar_t *__restrict __s1,
                          __const wchar_t *__restrict __s2, size_t __n) throw ();
 
 
 
 extern wchar_t *wmemmove (wchar_t *__s1, __const wchar_t *__s2, size_t __n)
      throw ();
 
 
 extern wchar_t *wmemset (wchar_t *__s, wchar_t __c, size_t __n) throw ();
 
 
 
 
 extern wchar_t *wmempcpy (wchar_t *__restrict __s1,
                           __const wchar_t *__restrict __s2, size_t __n)
      throw ();
 
 
 
 
 
 extern wint_t btowc (int __c) throw ();
 
 
 
 extern int wctob (wint_t __c) throw ();
 
 
 
 extern int mbsinit (__const mbstate_t *__ps) throw () __attribute__ ((__pure__));
 
 
 
 extern size_t mbrtowc (wchar_t *__restrict __pwc,
                        __const char *__restrict __s, size_t __n,
                        mbstate_t *__p) throw ();
 
 
 extern size_t wcrtomb (char *__restrict __s, wchar_t __wc,
                        mbstate_t *__restrict __ps) throw ();
 
 
 extern size_t __mbrlen (__const char *__restrict __s, size_t __n,
                         mbstate_t *__restrict __ps) throw ();
 extern size_t mbrlen (__const char *__restrict __s, size_t __n,
                       mbstate_t *__restrict __ps) throw ();
 # 297 "/usr/include/wchar.h" 3
 extern size_t mbsrtowcs (wchar_t *__restrict __dst,
                          __const char **__restrict __src, size_t __len,
                          mbstate_t *__restrict __ps) throw ();
 
 
 
 extern size_t wcsrtombs (char *__restrict __dst,
                          __const wchar_t **__restrict __src, size_t __len,
                          mbstate_t *__restrict __ps) throw ();
 
 
 
 
 
 extern size_t mbsnrtowcs (wchar_t *__restrict __dst,
                           __const char **__restrict __src, size_t __nmc,
                           size_t __len, mbstate_t *__restrict __ps) throw ();
 
 
 
 extern size_t wcsnrtombs (char *__restrict __dst,
                           __const wchar_t **__restrict __src,
                           size_t __nwc, size_t __len,
                           mbstate_t *__restrict __ps) throw ();
 
 
 
 
 
 
 extern int wcwidth (wchar_t __c) throw ();
 
 
 
 extern int wcswidth (__const wchar_t *__s, size_t __n) throw ();
 
 
 
 
 
 extern double wcstod (__const wchar_t *__restrict __nptr,
                       wchar_t **__restrict __endptr) throw ();
 
 
 
 extern float wcstof (__const wchar_t *__restrict __nptr,
                      wchar_t **__restrict __endptr) throw ();
 extern long double wcstold (__const wchar_t *__restrict __nptr,
                             wchar_t **__restrict __endptr) throw ();
 
 
 
 
 
 extern long int wcstol (__const wchar_t *__restrict __nptr,
                         wchar_t **__restrict __endptr, int __base) throw ();
 
 
 
 extern unsigned long int wcstoul (__const wchar_t *__restrict __nptr,
                                   wchar_t **__restrict __endptr, int __base)
      throw ();
 
 
 
 
 __extension__
 extern long long int wcstoq (__const wchar_t *__restrict __nptr,
                              wchar_t **__restrict __endptr, int __base)
      throw ();
 
 
 
 __extension__
 extern unsigned long long int wcstouq (__const wchar_t *__restrict __nptr,
                                        wchar_t **__restrict __endptr,
                                        int __base) throw ();
 
 
 
 
 
 __extension__
 extern long long int wcstoll (__const wchar_t *__restrict __nptr,
                               wchar_t **__restrict __endptr, int __base)
      throw ();
 
 
 
 __extension__
 extern unsigned long long int wcstoull (__const wchar_t *__restrict __nptr,
                                         wchar_t **__restrict __endptr,
                                         int __base) throw ();
 # 410 "/usr/include/wchar.h" 3
 extern long int __wcstol_l (__const wchar_t *__restrict __nptr,
                             wchar_t **__restrict __endptr, int __base,
                             __locale_t __loc) throw ();
 
 extern unsigned long int __wcstoul_l (__const wchar_t *__restrict __nptr,
                                       wchar_t **__restrict __endptr,
                                       int __base, __locale_t __loc) throw ();
 
 __extension__
 extern long long int __wcstoll_l (__const wchar_t *__restrict __nptr,
                                   wchar_t **__restrict __endptr,
                                   int __base, __locale_t __loc) throw ();
 
 __extension__
 extern unsigned long long int __wcstoull_l (__const wchar_t *__restrict __nptr,
                                             wchar_t **__restrict __endptr,
                                             int __base, __locale_t __loc)
      throw ();
 
 extern double __wcstod_l (__const wchar_t *__restrict __nptr,
                           wchar_t **__restrict __endptr, __locale_t __loc)
      throw ();
 
 extern float __wcstof_l (__const wchar_t *__restrict __nptr,
                          wchar_t **__restrict __endptr, __locale_t __loc)
      throw ();
 
 extern long double __wcstold_l (__const wchar_t *__restrict __nptr,
                                 wchar_t **__restrict __endptr,
                                 __locale_t __loc) throw ();
 
 
 
 
 
 extern double __wcstod_internal (__const wchar_t *__restrict __nptr,
                                  wchar_t **__restrict __endptr, int __group)
      throw ();
 extern float __wcstof_internal (__const wchar_t *__restrict __nptr,
                                 wchar_t **__restrict __endptr, int __group)
      throw ();
 extern long double __wcstold_internal (__const wchar_t *__restrict __nptr,
                                        wchar_t **__restrict __endptr,
                                        int __group) throw ();
 
 
 extern long int __wcstol_internal (__const wchar_t *__restrict __nptr,
                                    wchar_t **__restrict __endptr,
                                    int __base, int __group) throw ();
 
 
 
 extern unsigned long int __wcstoul_internal (__const wchar_t *__restrict __npt,
                                              wchar_t **__restrict __endptr,
                                              int __base, int __group) throw ();
 
 
 
 __extension__
 extern long long int __wcstoll_internal (__const wchar_t *__restrict __nptr,
                                          wchar_t **__restrict __endptr,
                                          int __base, int __group) throw ();
 
 
 
 __extension__
 extern unsigned long long int __wcstoull_internal (__const wchar_t *
                                                    __restrict __nptr,
                                                    wchar_t **
                                                    __restrict __endptr,
                                                    int __base,
                                                    int __group) throw ();
 # 528 "/usr/include/wchar.h" 3
 extern wchar_t *wcpcpy (wchar_t *__dest, __const wchar_t *__src) throw ();
 
 
 
 extern wchar_t *wcpncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n)
      throw ();
 
 
 
 
 
 
 
 extern int fwide (__FILE *__fp, int __mode) throw ();
 
 
 
 extern int fwprintf (__FILE *__restrict __stream,
                      __const wchar_t *__restrict __format, ...)
      throw () ;
 
 extern int wprintf (__const wchar_t *__restrict __format, ...)
      throw () ;
 
 extern int swprintf (wchar_t *__restrict __s, size_t __n,
                      __const wchar_t *__restrict __format, ...)
      throw () ;
 
 
 extern int vfwprintf (__FILE *__restrict __s,
                       __const wchar_t *__restrict __format,
                       __gnuc_va_list __arg)
      throw () ;
 
 extern int vwprintf (__const wchar_t *__restrict __format,
                      __gnuc_va_list __arg)
      throw () ;
 
 
 extern int vswprintf (wchar_t *__restrict __s, size_t __n,
                       __const wchar_t *__restrict __format,
                       __gnuc_va_list __arg)
      throw () ;
 
 
 
 extern int fwscanf (__FILE *__restrict __stream,
                     __const wchar_t *__restrict __format, ...)
      throw () ;
 
 extern int wscanf (__const wchar_t *__restrict __format, ...)
      throw () ;
 
 extern int swscanf (__const wchar_t *__restrict __s,
                     __const wchar_t *__restrict __format, ...)
      throw () ;
 
 
 
 
 extern int vfwscanf (__FILE *__restrict __s,
                      __const wchar_t *__restrict __format,
                      __gnuc_va_list __arg)
      throw () ;
 
 extern int vwscanf (__const wchar_t *__restrict __format,
                     __gnuc_va_list __arg)
      throw () ;
 
 extern int vswscanf (__const wchar_t *__restrict __s,
                      __const wchar_t *__restrict __format,
                      __gnuc_va_list __arg)
      throw () ;
 
 
 
 
 extern wint_t fgetwc (__FILE *__stream) throw ();
 extern wint_t getwc (__FILE *__stream) throw ();
 
 
 extern wint_t getwchar (void) throw ();
 
 
 
 extern wint_t fputwc (wchar_t __wc, __FILE *__stream) throw ();
 extern wint_t putwc (wchar_t __wc, __FILE *__stream) throw ();
 
 
 extern wint_t putwchar (wchar_t __wc) throw ();
 
 
 
 
 extern wchar_t *fgetws (wchar_t *__restrict __ws, int __n,
                         __FILE *__restrict __stream) throw ();
 
 
 extern int fputws (__const wchar_t *__restrict __ws,
                    __FILE *__restrict __stream) throw ();
 
 
 
 extern wint_t ungetwc (wint_t __wc, __FILE *__stream) throw ();
 
 
 
 
 
 extern wint_t getwc_unlocked (__FILE *__stream) throw ();
 extern wint_t getwchar_unlocked (void) throw ();
 
 
 extern wint_t fgetwc_unlocked (__FILE *__stream) throw ();
 
 
 extern wint_t fputwc_unlocked (wchar_t __wc, __FILE *__stream) throw ();
 
 
 
 extern wint_t putwc_unlocked (wchar_t __wc, __FILE *__stream) throw ();
 extern wint_t putwchar_unlocked (wchar_t __wc) throw ();
 
 
 
 extern wchar_t *fgetws_unlocked (wchar_t *__restrict __ws, int __n,
                                  __FILE *__restrict __stream) throw ();
 
 
 extern int fputws_unlocked (__const wchar_t *__restrict __ws,
                             __FILE *__restrict __stream) throw ();
 
 
 
 
 
 
 extern size_t wcsftime (wchar_t *__restrict __s, size_t __maxsize,
                         __const wchar_t *__restrict __format,
                         __const struct tm *__restrict __tp) throw ();
 # 680 "/usr/include/wchar.h" 3
 }
 # 55 "/usr/include/c++/3.2/cwchar" 2 3
 # 69 "/usr/include/c++/3.2/cwchar" 3
 namespace std
 {
   using ::mbstate_t;
 }
 # 133 "/usr/include/c++/3.2/cwchar" 3
 namespace std
 {
   using ::wint_t;
 
   using ::btowc;
   using ::fgetwc;
   using ::fgetws;
   using ::fputwc;
   using ::fputws;
   using ::fwide;
   using ::fwprintf;
   using ::fwscanf;
   using ::getwc;
   using ::getwchar;
   using ::mbrlen;
   using ::mbrtowc;
   using ::mbsinit;
   using ::mbsrtowcs;
   using ::putwc;
   using ::putwchar;
   using ::swprintf;
   using ::swscanf;
   using ::ungetwc;
   using ::vfwprintf;
   using ::vfwscanf;
   using ::vswprintf;
   using ::vswscanf;
   using ::vwprintf;
   using ::vwscanf;
   using ::wcrtomb;
   using ::wcscat;
   using ::wcscmp;
   using ::wcscoll;
   using ::wcscpy;
   using ::wcscspn;
   using ::wcsftime;
   using ::wcslen;
   using ::wcsncat;
   using ::wcsncmp;
   using ::wcsncpy;
   using ::wcsrtombs;
   using ::wcsspn;
   using ::wcstod;
   using ::wcstof;
   using ::wcstok;
   using ::wcstol;
   using ::wcstoul;
   using ::wcsxfrm;
   using ::wctob;
   using ::wmemcmp;
   using ::wmemcpy;
   using ::wmemmove;
   using ::wmemset;
   using ::wprintf;
   using ::wscanf;
 
   using ::wcschr;
 
   inline wchar_t*
   wcschr(wchar_t* __p, wchar_t __c)
   { return wcschr(const_cast<const wchar_t*>(__p), __c); }
 
   using ::wcspbrk;
 
   inline wchar_t*
   wcspbrk(wchar_t* __s1, wchar_t* __s2)
   { return wcspbrk(const_cast<const wchar_t*>(__s1), __s2); }
 
   using ::wcsrchr;
 
   inline wchar_t*
   wcsrchr(wchar_t* __p, wchar_t __c)
   { return wcsrchr(const_cast<const wchar_t*>(__p), __c); }
 
   using ::wcsstr;
 
   inline wchar_t*
   wcsstr(wchar_t* __s1, wchar_t* __s2)
   { return wcsstr(const_cast<const wchar_t*>(__s1), __s2); }
 
   using ::wmemchr;
 
   inline wchar_t*
   wmemchr(wchar_t* __p, wchar_t __c, size_t __n)
   { return wmemchr(const_cast<const wchar_t*>(__p), __c, __n); }
 }
 
 
 
 
 
 
 
 namespace __gnu_cxx
 {
   using ::wcstold;
   using ::wcstoll;
   using ::wcstoull;
 }
 
 namespace std
 {
   using __gnu_cxx::wcstold;
   using __gnu_cxx::wcstoll;
   using __gnu_cxx::wcstoull;
 }
 # 46 "/usr/include/c++/3.2/bits/fpos.h" 2 3
 
 namespace std
 {
 
 
 
   template<typename _StateT>
     class fpos
     {
     public:
 
       typedef _StateT __state_type;
 
     private:
       streamoff _M_off;
       __state_type _M_st;
 
     public:
       __state_type
       state() const { return _M_st; }
 
       void
       state(__state_type __st) { _M_st = __st; }
 
 
 
       fpos(): _M_off(streamoff()), _M_st(__state_type()) { }
 
       fpos(streamoff __off, __state_type __st = __state_type())
       : _M_off(__off), _M_st(__st) { }
 
       operator streamoff() const { return _M_off; }
 
       fpos&
       operator+=(streamoff __off) { _M_off += __off; return *this; }
 
       fpos&
       operator-=(streamoff __off) { _M_off -= __off; return *this; }
 
       fpos
       operator+(streamoff __off)
       {
         fpos __t(*this);
         __t += __off;
         return __t;
       }
 
       fpos
       operator-(streamoff __off)
       {
         fpos __t(*this);
         __t -= __off;
         return __t;
       }
 
       bool
       operator==(const fpos& __pos) const
       { return _M_off == __pos._M_off; }
 
       bool
       operator!=(const fpos& __pos) const
       { return _M_off != __pos._M_off; }
 
       streamoff
       _M_position() const { return _M_off; }
 
       void
       _M_position(streamoff __off) { _M_off = __off; }
     };
 
 
   typedef fpos<mbstate_t> streampos;
 
   typedef fpos<mbstate_t> wstreampos;
 
 }
 # 47 "/usr/include/c++/3.2/bits/char_traits.h" 2 3
 
 namespace std
 {
 
 
 
   template<class _CharT>
     struct char_traits
     {
       typedef _CharT char_type;
 
       typedef unsigned long int_type;
       typedef streampos pos_type;
       typedef streamoff off_type;
       typedef mbstate_t state_type;
 
       static void
       assign(char_type& __c1, const char_type& __c2);
 
       static bool
       eq(const char_type& __c1, const char_type& __c2);
 
       static bool
       lt(const char_type& __c1, const char_type& __c2);
 
       static int
       compare(const char_type* __s1, const char_type* __s2, size_t __n);
 
       static size_t
       length(const char_type* __s);
 
       static const char_type*
       find(const char_type* __s, size_t __n, const char_type& __a);
 
       static char_type*
       move(char_type* __s1, const char_type* __s2, size_t __n);
 
       static char_type*
       copy(char_type* __s1, const char_type* __s2, size_t __n);
 
       static char_type*
       assign(char_type* __s, size_t __n, char_type __a);
 
       static char_type
       to_char_type(const int_type& __c);
 
       static int_type
       to_int_type(const char_type& __c);
 
       static bool
       eq_int_type(const int_type& __c1, const int_type& __c2);
 
       static int_type
       eof();
 
       static int_type
       not_eof(const int_type& __c);
     };
 
 
 
   template<>
     struct char_traits<char>
     {
       typedef char char_type;
       typedef int int_type;
       typedef streampos pos_type;
       typedef streamoff off_type;
       typedef mbstate_t state_type;
 
       static void
       assign(char_type& __c1, const char_type& __c2)
       { __c1 = __c2; }
 
       static bool
       eq(const char_type& __c1, const char_type& __c2)
       { return __c1 == __c2; }
 
       static bool
       lt(const char_type& __c1, const char_type& __c2)
       { return __c1 < __c2; }
 
       static int
       compare(const char_type* __s1, const char_type* __s2, size_t __n)
       { return memcmp(__s1, __s2, __n); }
 
       static size_t
       length(const char_type* __s)
       { return strlen(__s); }
 
       static const char_type*
       find(const char_type* __s, size_t __n, const char_type& __a)
       { return static_cast<const char_type*>(memchr(__s, __a, __n)); }
 
       static char_type*
       move(char_type* __s1, const char_type* __s2, size_t __n)
       { return static_cast<char_type*>(memmove(__s1, __s2, __n)); }
 
       static char_type*
       copy(char_type* __s1, const char_type* __s2, size_t __n)
       { return static_cast<char_type*>(memcpy(__s1, __s2, __n)); }
 
       static char_type*
       assign(char_type* __s, size_t __n, char_type __a)
       { return static_cast<char_type*>(memset(__s, __a, __n)); }
 
       static char_type
       to_char_type(const int_type& __c)
       { return static_cast<char_type>(__c); }
 
 
 
       static int_type
       to_int_type(const char_type& __c)
       { return static_cast<int_type>(static_cast<unsigned char>(__c)); }
 
       static bool
       eq_int_type(const int_type& __c1, const int_type& __c2)
       { return __c1 == __c2; }
 
       static int_type
       eof() { return static_cast<int_type>((-1)); }
 
       static int_type
       not_eof(const int_type& __c)
       { return (__c == eof()) ? 0 : __c; }
   };
 
 
 
   template<>
     struct char_traits<wchar_t>
     {
       typedef wchar_t char_type;
       typedef wint_t int_type;
       typedef streamoff off_type;
       typedef wstreampos pos_type;
       typedef mbstate_t state_type;
 
       static void
       assign(char_type& __c1, const char_type& __c2)
       { __c1 = __c2; }
 
       static bool
       eq(const char_type& __c1, const char_type& __c2)
       { return __c1 == __c2; }
 
       static bool
       lt(const char_type& __c1, const char_type& __c2)
       { return __c1 < __c2; }
 
       static int
       compare(const char_type* __s1, const char_type* __s2, size_t __n)
       { return wmemcmp(__s1, __s2, __n); }
 
       static size_t
       length(const char_type* __s)
       { return wcslen(__s); }
 
       static const char_type*
       find(const char_type* __s, size_t __n, const char_type& __a)
       { return wmemchr(__s, __a, __n); }
 
       static char_type*
       move(char_type* __s1, const char_type* __s2, int_type __n)
       { return wmemmove(__s1, __s2, __n); }
 
       static char_type*
       copy(char_type* __s1, const char_type* __s2, size_t __n)
       { return wmemcpy(__s1, __s2, __n); }
 
       static char_type*
       assign(char_type* __s, size_t __n, char_type __a)
       { return wmemset(__s, __a, __n); }
 
       static char_type
       to_char_type(const int_type& __c) { return char_type(__c); }
 
       static int_type
       to_int_type(const char_type& __c) { return int_type(__c); }
 
       static bool
       eq_int_type(const int_type& __c1, const int_type& __c2)
       { return __c1 == __c2; }
 
       static int_type
       eof() { return static_cast<int_type>((0xffffffffu)); }
 
       static int_type
       not_eof(const int_type& __c)
       { return eq_int_type(__c, eof()) ? 0 : __c; }
   };
 
 
   template<typename _CharT, typename _Traits>
     struct _Char_traits_match
     {
       _CharT _M_c;
       _Char_traits_match(_CharT const& __c) : _M_c(__c) { }
 
       bool
       operator()(_CharT const& __a) { return _Traits::eq(_M_c, __a); }
     };
 }
 # 48 "/usr/include/c++/3.2/string" 2 3
 # 1 "/usr/include/c++/3.2/memory" 1 3
 # 53 "/usr/include/c++/3.2/memory" 3
 
 # 1 "/usr/include/c++/3.2/bits/stl_algobase.h" 1 3
 # 66 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
 # 1 "/usr/include/c++/3.2/climits" 1 3
 # 48 "/usr/include/c++/3.2/climits" 3
 
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/limits.h" 1 3
 # 11 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/limits.h" 3
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/syslimits.h" 1 3
 
 
 
 
 
 
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/limits.h" 1 3
 # 132 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/limits.h" 3
 # 1 "/usr/include/limits.h" 1 3
 # 144 "/usr/include/limits.h" 3
 # 1 "/usr/include/bits/posix1_lim.h" 1 3
 # 126 "/usr/include/bits/posix1_lim.h" 3
 # 1 "/usr/include/bits/local_lim.h" 1 3
 # 36 "/usr/include/bits/local_lim.h" 3
 # 1 "/usr/include/linux/limits.h" 1 3
 # 37 "/usr/include/bits/local_lim.h" 2 3
 # 127 "/usr/include/bits/posix1_lim.h" 2 3
 # 145 "/usr/include/limits.h" 2 3
 
 
 
 # 1 "/usr/include/bits/posix2_lim.h" 1 3
 # 149 "/usr/include/limits.h" 2 3
 
 
 
 # 1 "/usr/include/bits/xopen_lim.h" 1 3
 # 34 "/usr/include/bits/xopen_lim.h" 3
 # 1 "/usr/include/bits/stdio_lim.h" 1 3
 # 35 "/usr/include/bits/xopen_lim.h" 2 3
 # 136 "/usr/include/bits/xopen_lim.h" 3
 # 1 "/usr/include/bits/wordsize.h" 1 3
 # 137 "/usr/include/bits/xopen_lim.h" 2 3
 # 153 "/usr/include/limits.h" 2 3
 # 133 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/limits.h" 2 3
 # 8 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/syslimits.h" 2 3
 # 12 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/limits.h" 2 3
 # 50 "/usr/include/c++/3.2/climits" 2 3
 # 67 "/usr/include/c++/3.2/bits/stl_algobase.h" 2 3
 # 1 "/usr/include/c++/3.2/cstdlib" 1 3
 # 48 "/usr/include/c++/3.2/cstdlib" 3
 
 
 
 
 # 1 "/usr/include/stdlib.h" 1 3
 # 33 "/usr/include/stdlib.h" 3
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 1 3
 # 34 "/usr/include/stdlib.h" 2 3
 
 extern "C" {
 
 
 
 
 
 
 # 1 "/usr/include/bits/waitflags.h" 1 3
 # 43 "/usr/include/stdlib.h" 2 3
 # 1 "/usr/include/bits/waitstatus.h" 1 3
 # 63 "/usr/include/bits/waitstatus.h" 3
 # 1 "/usr/include/endian.h" 1 3
 # 37 "/usr/include/endian.h" 3
 # 1 "/usr/include/bits/endian.h" 1 3
 # 38 "/usr/include/endian.h" 2 3
 # 64 "/usr/include/bits/waitstatus.h" 2 3
 
 union wait
   {
     int w_status;
     struct
       {
 
         unsigned int __w_termsig:7;
         unsigned int __w_coredump:1;
         unsigned int __w_retcode:8;
         unsigned int:16;
 
 
 
 
 
 
 
       } __wait_terminated;
     struct
       {
 
         unsigned int __w_stopval:8;
         unsigned int __w_stopsig:8;
         unsigned int:16;
 
 
 
 
 
 
       } __wait_stopped;
   };
 # 44 "/usr/include/stdlib.h" 2 3
 # 94 "/usr/include/stdlib.h" 3
 typedef struct
   {
     int quot;
     int rem;
   } div_t;
 
 
 
 typedef struct
   {
     long int quot;
     long int rem;
   } ldiv_t;
 
 
 
 
 
 __extension__ typedef struct
   {
     long long int quot;
     long long int rem;
   } lldiv_t;
 # 133 "/usr/include/stdlib.h" 3
 extern size_t __ctype_get_mb_cur_max (void) throw ();
 
 
 
 extern double atof (__const char *__nptr) throw () __attribute__ ((__pure__));
 
 extern int atoi (__const char *__nptr) throw () __attribute__ ((__pure__));
 
 extern long int atol (__const char *__nptr) throw () __attribute__ ((__pure__));
 
 
 
 __extension__ extern long long int atoll (__const char *__nptr)
      throw () __attribute__ ((__pure__));
 
 
 
 extern double strtod (__const char *__restrict __nptr,
                       char **__restrict __endptr) throw ();
 
 
 
 extern float strtof (__const char *__restrict __nptr,
                      char **__restrict __endptr) throw ();
 
 extern long double strtold (__const char *__restrict __nptr,
                             char **__restrict __endptr) throw ();
 
 
 
 extern long int strtol (__const char *__restrict __nptr,
                         char **__restrict __endptr, int __base) throw ();
 
 extern unsigned long int strtoul (__const char *__restrict __nptr,
                                   char **__restrict __endptr, int __base)
      throw ();
 
 
 
 __extension__
 extern long long int strtoq (__const char *__restrict __nptr,
                              char **__restrict __endptr, int __base) throw ();
 
 __extension__
 extern unsigned long long int strtouq (__const char *__restrict __nptr,
                                        char **__restrict __endptr, int __base)
      throw ();
 
 
 
 
 
 
 __extension__
 extern long long int strtoll (__const char *__restrict __nptr,
                               char **__restrict __endptr, int __base) throw ();
 
 __extension__
 extern unsigned long long int strtoull (__const char *__restrict __nptr,
                                         char **__restrict __endptr, int __base)
      throw ();
 # 215 "/usr/include/stdlib.h" 3
 extern long int __strtol_l (__const char *__restrict __nptr,
                             char **__restrict __endptr, int __base,
                             __locale_t __loc) throw ();
 
 extern unsigned long int __strtoul_l (__const char *__restrict __nptr,
                                       char **__restrict __endptr,
                                       int __base, __locale_t __loc) throw ();
 
 __extension__
 extern long long int __strtoll_l (__const char *__restrict __nptr,
                                   char **__restrict __endptr, int __base,
                                   __locale_t __loc) throw ();
 
 __extension__
 extern unsigned long long int __strtoull_l (__const char *__restrict __nptr,
                                             char **__restrict __endptr,
                                             int __base, __locale_t __loc)
      throw ();
 
 extern double __strtod_l (__const char *__restrict __nptr,
                           char **__restrict __endptr, __locale_t __loc)
      throw ();
 
 extern float __strtof_l (__const char *__restrict __nptr,
                          char **__restrict __endptr, __locale_t __loc) throw ();
 
 extern long double __strtold_l (__const char *__restrict __nptr,
                                 char **__restrict __endptr,
                                 __locale_t __loc) throw ();
 
 
 
 
 
 
 extern double __strtod_internal (__const char *__restrict __nptr,
                                  char **__restrict __endptr, int __group)
      throw ();
 extern float __strtof_internal (__const char *__restrict __nptr,
                                 char **__restrict __endptr, int __group)
      throw ();
 extern long double __strtold_internal (__const char *__restrict __nptr,
                                        char **__restrict __endptr,
                                        int __group) throw ();
 
 extern long int __strtol_internal (__const char *__restrict __nptr,
                                    char **__restrict __endptr,
                                    int __base, int __group) throw ();
 
 
 
 extern unsigned long int __strtoul_internal (__const char *__restrict __nptr,
                                              char **__restrict __endptr,
                                              int __base, int __group) throw ();
 
 
 
 
 __extension__
 extern long long int __strtoll_internal (__const char *__restrict __nptr,
                                          char **__restrict __endptr,
                                          int __base, int __group) throw ();
 
 
 
 __extension__
 extern unsigned long long int __strtoull_internal (__const char *
                                                    __restrict __nptr,
                                                    char **__restrict __endptr,
                                                    int __base, int __group)
      throw ();
 # 384 "/usr/include/stdlib.h" 3
 extern char *l64a (long int __n) throw ();
 
 
 extern long int a64l (__const char *__s) throw () __attribute__ ((__pure__));
 
 
 # 1 "/usr/include/sys/types.h" 1 3
 # 28 "/usr/include/sys/types.h" 3
 extern "C" {
 
 
 
 
 
 typedef __u_char u_char;
 typedef __u_short u_short;
 typedef __u_int u_int;
 typedef __u_long u_long;
 typedef __quad_t quad_t;
 typedef __u_quad_t u_quad_t;
 typedef __fsid_t fsid_t;
 
 
 
 
 typedef __loff_t loff_t;
 
 
 
 typedef __ino_t ino_t;
 
 
 
 
 
 
 typedef __ino64_t ino64_t;
 
 
 
 
 typedef __dev_t dev_t;
 
 
 
 
 typedef __gid_t gid_t;
 
 
 
 
 typedef __mode_t mode_t;
 
 
 
 
 typedef __nlink_t nlink_t;
 
 
 
 
 typedef __uid_t uid_t;
 
 
 
 
 
 typedef __off_t off_t;
 
 
 
 
 
 
 typedef __off64_t off64_t;
 # 104 "/usr/include/sys/types.h" 3
 typedef __id_t id_t;
 
 
 
 
 typedef __ssize_t ssize_t;
 
 
 
 
 
 typedef __daddr_t daddr_t;
 typedef __caddr_t caddr_t;
 
 
 
 
 
 typedef __key_t key_t;
 # 136 "/usr/include/sys/types.h" 3
 typedef __useconds_t useconds_t;
 
 
 
 typedef __suseconds_t suseconds_t;
 
 
 
 
 
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 1 3
 # 147 "/usr/include/sys/types.h" 2 3
 
 
 
 typedef unsigned long int ulong;
 typedef unsigned short int ushort;
 typedef unsigned int uint;
 # 190 "/usr/include/sys/types.h" 3
 typedef int int8_t __attribute__ ((__mode__ (__QI__)));
 typedef int int16_t __attribute__ ((__mode__ (__HI__)));
 typedef int int32_t __attribute__ ((__mode__ (__SI__)));
 typedef int int64_t __attribute__ ((__mode__ (__DI__)));
 
 
 typedef unsigned int u_int8_t __attribute__ ((__mode__ (__QI__)));
 typedef unsigned int u_int16_t __attribute__ ((__mode__ (__HI__)));
 typedef unsigned int u_int32_t __attribute__ ((__mode__ (__SI__)));
 typedef unsigned int u_int64_t __attribute__ ((__mode__ (__DI__)));
 
 typedef int register_t __attribute__ ((__mode__ (__word__)));
 # 215 "/usr/include/sys/types.h" 3
 # 1 "/usr/include/sys/select.h" 1 3
 # 31 "/usr/include/sys/select.h" 3
 # 1 "/usr/include/bits/select.h" 1 3
 # 32 "/usr/include/sys/select.h" 2 3
 
 
 # 1 "/usr/include/bits/sigset.h" 1 3
 # 35 "/usr/include/sys/select.h" 2 3
 # 46 "/usr/include/sys/select.h" 3
 # 1 "/usr/include/bits/time.h" 1 3
 # 67 "/usr/include/bits/time.h" 3
 struct timeval
   {
     __time_t tv_sec;
     __suseconds_t tv_usec;
   };
 # 47 "/usr/include/sys/select.h" 2 3
 # 55 "/usr/include/sys/select.h" 3
 typedef long int __fd_mask;
 
 
 
 
 
 
 
 typedef struct
   {
 
 
 
     __fd_mask fds_bits[1024 / (8 * sizeof (__fd_mask))];
 
 
 
 
 
   } fd_set;
 
 
 
 
 
 
 typedef __fd_mask fd_mask;
 # 95 "/usr/include/sys/select.h" 3
 extern "C" {
 
 
 
 
 
 
 extern int select (int __nfds, fd_set *__restrict __readfds,
                    fd_set *__restrict __writefds,
                    fd_set *__restrict __exceptfds,
                    struct timeval *__restrict __timeout) throw ();
 
 
 
 
 
 extern int pselect (int __nfds, fd_set *__restrict __readfds,
                     fd_set *__restrict __writefds,
                     fd_set *__restrict __exceptfds,
                     const struct timespec *__restrict __timeout,
                     const __sigset_t *__restrict __sigmask) throw ();
 
 
 }
 # 216 "/usr/include/sys/types.h" 2 3
 
 
 # 1 "/usr/include/sys/sysmacros.h" 1 3
 # 219 "/usr/include/sys/types.h" 2 3
 
 
 
 
 typedef __blksize_t blksize_t;
 
 
 
 
 
 
 typedef __blkcnt_t blkcnt_t;
 
 
 
 typedef __fsblkcnt_t fsblkcnt_t;
 
 
 
 typedef __fsfilcnt_t fsfilcnt_t;
 # 257 "/usr/include/sys/types.h" 3
 typedef __blkcnt64_t blkcnt64_t;
 typedef __fsblkcnt64_t fsblkcnt64_t;
 typedef __fsfilcnt64_t fsfilcnt64_t;
 
 
 }
 # 391 "/usr/include/stdlib.h" 2 3
 
 
 
 
 
 
 extern long int random (void) throw ();
 
 
 extern void srandom (unsigned int __seed) throw ();
 
 
 
 
 
 extern char *initstate (unsigned int __seed, char *__statebuf,
                         size_t __statelen) throw ();
 
 
 
 extern char *setstate (char *__statebuf) throw ();
 
 
 
 
 
 
 
 struct random_data
   {
     int32_t *fptr;
     int32_t *rptr;
     int32_t *state;
     int rand_type;
     int rand_deg;
     int rand_sep;
     int32_t *end_ptr;
   };
 
 extern int random_r (struct random_data *__restrict __buf,
                      int32_t *__restrict __result) throw ();
 
 extern int srandom_r (unsigned int __seed, struct random_data *__buf) throw ();
 
 extern int initstate_r (unsigned int __seed, char *__restrict __statebuf,
                         size_t __statelen,
                         struct random_data *__restrict __buf) throw ();
 
 extern int setstate_r (char *__restrict __statebuf,
                        struct random_data *__restrict __buf) throw ();
 
 
 
 
 
 extern int rand (void) throw ();
 
 extern void srand (unsigned int __seed) throw ();
 
 
 
 extern int rand_r (unsigned int *__seed) throw ();
 
 
 
 
 
 
 
 extern double drand48 (void) throw ();
 extern double erand48 (unsigned short int __xsubi[3]) throw ();
 
 
 extern long int lrand48 (void) throw ();
 extern long int nrand48 (unsigned short int __xsubi[3]) throw ();
 
 
 extern long int mrand48 (void) throw ();
 extern long int jrand48 (unsigned short int __xsubi[3]) throw ();
 
 
 extern void srand48 (long int __seedval) throw ();
 extern unsigned short int *seed48 (unsigned short int __seed16v[3]) throw ();
 extern void lcong48 (unsigned short int __param[7]) throw ();
 
 
 
 
 
 struct drand48_data
   {
     unsigned short int __x[3];
     unsigned short int __old_x[3];
     unsigned short int __c;
     unsigned short int __init;
     unsigned long long int __a;
   };
 
 
 extern int drand48_r (struct drand48_data *__restrict __buffer,
                       double *__restrict __result) throw ();
 extern int erand48_r (unsigned short int __xsubi[3],
                       struct drand48_data *__restrict __buffer,
                       double *__restrict __result) throw ();
 
 
 extern int lrand48_r (struct drand48_data *__restrict __buffer,
                       long int *__restrict __result) throw ();
 extern int nrand48_r (unsigned short int __xsubi[3],
                       struct drand48_data *__restrict __buffer,
                       long int *__restrict __result) throw ();
 
 
 extern int mrand48_r (struct drand48_data *__restrict __buffer,
                       long int *__restrict __result) throw ();
 extern int jrand48_r (unsigned short int __xsubi[3],
                       struct drand48_data *__restrict __buffer,
                       long int *__restrict __result) throw ();
 
 
 extern int srand48_r (long int __seedval, struct drand48_data *__buffer)
      throw ();
 
 extern int seed48_r (unsigned short int __seed16v[3],
                      struct drand48_data *__buffer) throw ();
 
 extern int lcong48_r (unsigned short int __param[7],
                       struct drand48_data *__buffer) throw ();
 # 527 "/usr/include/stdlib.h" 3
 extern void *malloc (size_t __size) throw () __attribute__ ((__malloc__));
 
 extern void *calloc (size_t __nmemb, size_t __size)
      throw () __attribute__ ((__malloc__));
 
 
 
 
 
 extern void *realloc (void *__ptr, size_t __size) throw () __attribute__ ((__malloc__));
 
 extern void free (void *__ptr) throw ();
 
 
 
 extern void cfree (void *__ptr) throw ();
 
 
 
 # 1 "/usr/include/alloca.h" 1 3
 # 25 "/usr/include/alloca.h" 3
 # 1 "/usr/lib/gcc-lib/i386-linux/3.2.1/include/stddef.h" 1 3
 # 26 "/usr/include/alloca.h" 2 3
 
 extern "C" {
 
 
 
 
 
 extern void *alloca (size_t __size) throw ();
 
 
 
 
 
 }
 # 547 "/usr/include/stdlib.h" 2 3
 
 
 
 
 extern void *valloc (size_t __size) throw () __attribute__ ((__malloc__));
 
 
 
 
 extern int posix_memalign (void **__memptr, size_t __alignment, size_t __size)
      throw () __attribute__ ((__malloc__));
 
 
 
 extern void abort (void) throw () __attribute__ ((__noreturn__));
 
 
 
 extern int atexit (void (*__func) (void)) throw ();
 
 
 
 
 extern int on_exit (void (*__func) (int __status, void *__arg), void *__arg)
      throw ();
 
 
 
 
 
 extern void exit (int __status) throw () __attribute__ ((__noreturn__));
 
 
 
 
 extern void _Exit (int __status) throw () __attribute__ ((__noreturn__));
 
 
 
 
 extern char *getenv (__const char *__name) throw ();
 
 
 
 extern char *__secure_getenv (__const char *__name) throw ();
 
 
 
 
 
 extern int putenv (char *__string) throw ();
 
 
 
 
 
 extern int setenv (__const char *__name, __const char *__value, int __replace)
      throw ();
 
 
 extern int unsetenv (__const char *__name) throw ();
 
 
 
 
 
 
 extern int clearenv (void) throw ();
 # 623 "/usr/include/stdlib.h" 3
 extern char *mktemp (char *__template) throw ();
 
 
 
 
 
 
 
 extern int mkstemp (char *__template) throw ();
 # 640 "/usr/include/stdlib.h" 3
 extern int mkstemp64 (char *__template) throw ();
 # 650 "/usr/include/stdlib.h" 3
 extern char *mkdtemp (char *__template) throw ();
 
 
 
 
 extern int system (__const char *__command) throw ();
 
 
 
 
 
 
 extern char *canonicalize_file_name (__const char *__name) throw ();
 # 672 "/usr/include/stdlib.h" 3
 extern char *realpath (__const char *__restrict __name,
                        char *__restrict __resolved) throw ();
 
 
 
 
 
 
 typedef int (*__compar_fn_t) (__const void *, __const void *);
 
 
 typedef __compar_fn_t comparison_fn_t;
 
 
 
 
 
 extern void *bsearch (__const void *__key, __const void *__base,
                       size_t __nmemb, size_t __size, __compar_fn_t __compar);
 
 
 
 extern void qsort (void *__base, size_t __nmemb, size_t __size,
                    __compar_fn_t __compar);
 
 
 
 extern int abs (int __x) throw () __attribute__ ((__const__));
 extern long int labs (long int __x) throw () __attribute__ ((__const__));
 
 __extension__ extern long long int llabs (long long int __x)
      throw () __attribute__ ((__const__));
 
 
 
 
 
 
 extern div_t div (int __numer, int __denom)
      throw () __attribute__ ((__const__));
 extern ldiv_t ldiv (long int __numer, long int __denom)
      throw () __attribute__ ((__const__));
 
 __extension__ extern lldiv_t lldiv (long long int __numer,
                                     long long int __denom)
      throw () __attribute__ ((__const__));
 # 728 "/usr/include/stdlib.h" 3
 extern char *ecvt (double __value, int __ndigit, int *__restrict __decpt,
                    int *__restrict __sign) throw ();
 
 
 
 
 extern char *fcvt (double __value, int __ndigit, int *__restrict __decpt,
                    int *__restrict __sign) throw ();
 
 
 
 
 extern char *gcvt (double __value, int __ndigit, char *__buf) throw ();
 
 
 
 
 extern char *qecvt (long double __value, int __ndigit,
                     int *__restrict __decpt, int *__restrict __sign) throw ();
 extern char *qfcvt (long double __value, int __ndigit,
                     int *__restrict __decpt, int *__restrict __sign) throw ();
 extern char *qgcvt (long double __value, int __ndigit, char *__buf) throw ();
 
 
 
 
 extern int ecvt_r (double __value, int __ndigit, int *__restrict __decpt,
                    int *__restrict __sign, char *__restrict __buf,
                    size_t __len) throw ();
 extern int fcvt_r (double __value, int __ndigit, int *__restrict __decpt,
                    int *__restrict __sign, char *__restrict __buf,
                    size_t __len) throw ();
 
 extern int qecvt_r (long double __value, int __ndigit,
                     int *__restrict __decpt, int *__restrict __sign,
                     char *__restrict __buf, size_t __len) throw ();
 extern int qfcvt_r (long double __value, int __ndigit,
                     int *__restrict __decpt, int *__restrict __sign,
                     char *__restrict __buf, size_t __len) throw ();
 
 
 
 
 
 
 extern int mblen (__const char *__s, size_t __n) throw ();
 
 
 extern int mbtowc (wchar_t *__restrict __pwc,
                    __const char *__restrict __s, size_t __n) throw ();
 
 
 extern int wctomb (char *__s, wchar_t __wchar) throw ();
 
 
 
 extern size_t mbstowcs (wchar_t *__restrict __pwcs,
                         __const char *__restrict __s, size_t __n) throw ();
 
 extern size_t wcstombs (char *__restrict __s,
                         __const wchar_t *__restrict __pwcs, size_t __n)
      throw ();
 
 
 
 
 
 
 
 extern int rpmatch (__const char *__response) throw ();
 # 808 "/usr/include/stdlib.h" 3
 extern int getsubopt (char **__restrict __optionp,
                       char *__const *__restrict __tokens,
                       char **__restrict __valuep) throw ();
 
 
 
 
 
 extern void setkey (__const char *__key) throw ();
 
 
 
 
 
 
 
 extern int posix_openpt (int __oflag) throw ();
 
 
 
 
 
 
 
 extern int grantpt (int __fd) throw ();
 
 
 
 extern int unlockpt (int __fd) throw ();
 
 
 
 
 extern char *ptsname (int __fd) throw ();
 
 
 
 
 
 
 extern int ptsname_r (int __fd, char *__buf, size_t __buflen) throw ();
 
 
 extern int getpt (void) throw ();
 
 
 
 
 
 
 extern int getloadavg (double __loadavg[], int __nelem) throw ();
 
 
 
 
 
 }
 # 53 "/usr/include/c++/3.2/cstdlib" 2 3
 # 84 "/usr/include/c++/3.2/cstdlib" 3
 namespace std
 {
   using ::div_t;
   using ::ldiv_t;
 
   using ::abort;
   using ::abs;
   using ::atexit;
   using ::atof;
   using ::atoi;
   using ::atol;
   using ::bsearch;
   using ::calloc;
   using ::div;
   using ::exit;
   using ::free;
   using ::getenv;
   using ::labs;
   using ::ldiv;
   using ::malloc;
   using ::mblen;
   using ::mbstowcs;
   using ::mbtowc;
   using ::qsort;
   using ::rand;
   using ::realloc;
   using ::srand;
   using ::strtod;
   using ::strtol;
   using ::strtoul;
   using ::system;
   using ::wcstombs;
   using ::wctomb;
 
   inline long
   abs(long __i) { return labs(__i); }
 
   inline ldiv_t
   div(long __i, long __j) { return ldiv(__i, __j); }
 }
 # 136 "/usr/include/c++/3.2/cstdlib" 3
 namespace __gnu_cxx
 {
   using ::lldiv_t;
   using ::_Exit;
 
   inline long long
   abs(long long __x) { return __x >= 0 ? __x : -__x; }
 
   inline long long
   llabs(long long __x) { return __x >= 0 ? __x : -__x; }
 
   inline lldiv_t
   div(long long __n, long long __d)
   { lldiv_t __q; __q.quot = __n / __d; __q.rem = __n % __d; return __q; }
 
   inline lldiv_t
   lldiv(long long __n, long long __d)
   { lldiv_t __q; __q.quot = __n / __d; __q.rem = __n % __d; return __q; }
 
   using ::atoll;
   using ::strtof;
   using ::strtoll;
   using ::strtoull;
   using ::strtold;
 }
 
 namespace std
 {
   using __gnu_cxx::lldiv_t;
   using __gnu_cxx::_Exit;
   using __gnu_cxx::abs;
   using __gnu_cxx::llabs;
   using __gnu_cxx::div;
   using __gnu_cxx::lldiv;
   using __gnu_cxx::atoll;
   using __gnu_cxx::strtof;
   using __gnu_cxx::strtoll;
   using __gnu_cxx::strtoull;
   using __gnu_cxx::strtold;
 }
 # 68 "/usr/include/c++/3.2/bits/stl_algobase.h" 2 3
 
 # 1 "/usr/include/c++/3.2/new" 1 3
 # 42 "/usr/include/c++/3.2/new" 3
 # 1 "/usr/include/c++/3.2/exception" 1 3
 # 40 "/usr/include/c++/3.2/exception" 3
 extern "C++" {
 
 namespace std
 {
 
 
 
 
 
 
   class exception
   {
   public:
     exception() throw() { }
     virtual ~exception() throw();
 
 
     virtual const char* what() const throw();
   };
 
 
 
   class bad_exception : public exception
   {
   public:
     bad_exception() throw() { }
 
 
     virtual ~bad_exception() throw();
   };
 
 
   typedef void (*terminate_handler) ();
 
   typedef void (*unexpected_handler) ();
 
 
   terminate_handler set_terminate(terminate_handler) throw();
 
 
   void terminate() __attribute__ ((__noreturn__));
 
 
   unexpected_handler set_unexpected(unexpected_handler) throw();
 
 
   void unexpected() __attribute__ ((__noreturn__));
 # 98 "/usr/include/c++/3.2/exception" 3
   bool uncaught_exception() throw();
 }
 
 namespace __gnu_cxx
 {
 # 111 "/usr/include/c++/3.2/exception" 3
   void __verbose_terminate_handler ();
 }
 
 }
 # 43 "/usr/include/c++/3.2/new" 2 3
 
 extern "C++" {
 
 namespace std
 {
 
 
   class bad_alloc : public exception
   {
   public:
     bad_alloc() throw() { }
 
 
     virtual ~bad_alloc() throw();
   };
 
   struct nothrow_t { };
   extern const nothrow_t nothrow;
 
 
   typedef void (*new_handler)();
 
   new_handler set_new_handler(new_handler) throw();
 }
 # 79 "/usr/include/c++/3.2/new" 3
 void* operator new(std::size_t) throw (std::bad_alloc);
 void* operator new[](std::size_t) throw (std::bad_alloc);
 void operator delete(void*) throw();
 void operator delete[](void*) throw();
 void* operator new(std::size_t, const std::nothrow_t&) throw();
 void* operator new[](std::size_t, const std::nothrow_t&) throw();
 void operator delete(void*, const std::nothrow_t&) throw();
 void operator delete[](void*, const std::nothrow_t&) throw();
 
 
 inline void* operator new(std::size_t, void* __p) throw() { return __p; }
 inline void* operator new[](std::size_t, void* __p) throw() { return __p; }
 
 
 inline void operator delete (void*, void*) throw() { };
 inline void operator delete[](void*, void*) throw() { };
 
 }
 # 70 "/usr/include/c++/3.2/bits/stl_algobase.h" 2 3
 # 1 "/usr/include/c++/3.2/iosfwd" 1 3
 # 43 "/usr/include/c++/3.2/iosfwd" 3
 
 
 
 
 # 1 "/usr/include/c++/3.2/bits/functexcept.h" 1 3
 # 34 "/usr/include/c++/3.2/bits/functexcept.h" 3
 # 1 "/usr/include/c++/3.2/exception_defines.h" 1 3
 # 35 "/usr/include/c++/3.2/bits/functexcept.h" 2 3
 
 namespace std
 {
 
   void
   __throw_bad_exception(void);
 
 
   void
   __throw_bad_alloc(void);
 
 
   void
   __throw_bad_cast(void);
 
   void
   __throw_bad_typeid(void);
 
 
   void
   __throw_logic_error(const char* __s);
 
   void
   __throw_domain_error(const char* __s);
 
   void
   __throw_invalid_argument(const char* __s);
 
   void
   __throw_length_error(const char* __s);
 
   void
   __throw_out_of_range(const char* __s);
 
   void
   __throw_runtime_error(const char* __s);
 
   void
   __throw_range_error(const char* __s);
 
   void
   __throw_overflow_error(const char* __s);
 
   void
   __throw_underflow_error(const char* __s);
 
 
   void
   __throw_ios_failure(const char* __s);
 }
 # 48 "/usr/include/c++/3.2/iosfwd" 2 3
 
 namespace std
 {
   template<typename _CharT, typename _Traits = char_traits<_CharT> >
     class basic_ios;
 
   template<typename _CharT, typename _Traits = char_traits<_CharT> >
     class basic_streambuf;
 
   template<typename _CharT, typename _Traits = char_traits<_CharT> >
     class basic_istream;
 
   template<typename _CharT, typename _Traits = char_traits<_CharT> >
     class basic_ostream;
 
   template<typename _CharT, typename _Traits = char_traits<_CharT> >
     class basic_iostream;
 
   template<typename _CharT, typename _Traits = char_traits<_CharT>,
             typename _Alloc = allocator<_CharT> >
     class basic_stringbuf;
 
   template<typename _CharT, typename _Traits = char_traits<_CharT>,
            typename _Alloc = allocator<_CharT> >
     class basic_istringstream;
 
   template<typename _CharT, typename _Traits = char_traits<_CharT>,
            typename _Alloc = allocator<_CharT> >
     class basic_ostringstream;
 
   template<typename _CharT, typename _Traits = char_traits<_CharT>,
            typename _Alloc = allocator<_CharT> >
     class basic_stringstream;
 
   template<typename _CharT, typename _Traits = char_traits<_CharT> >
     class basic_filebuf;
 
   template<typename _CharT, typename _Traits = char_traits<_CharT> >
     class basic_ifstream;
 
   template<typename _CharT, typename _Traits = char_traits<_CharT> >
     class basic_ofstream;
 
   template<typename _CharT, typename _Traits = char_traits<_CharT> >
     class basic_fstream;
 
   template<typename _CharT, typename _Traits = char_traits<_CharT> >
     class istreambuf_iterator;
 
   template<typename _CharT, typename _Traits = char_traits<_CharT> >
     class ostreambuf_iterator;
 
 
 
   class ios_base;
 
 
   typedef basic_ios<char> ios;
   typedef basic_streambuf<char> streambuf;
   typedef basic_istream<char> istream;
   typedef basic_ostream<char> ostream;
   typedef basic_iostream<char> iostream;
   typedef basic_stringbuf<char> stringbuf;
   typedef basic_istringstream<char> istringstream;
   typedef basic_ostringstream<char> ostringstream;
   typedef basic_stringstream<char> stringstream;
   typedef basic_filebuf<char> filebuf;
   typedef basic_ifstream<char> ifstream;
   typedef basic_ofstream<char> ofstream;
   typedef basic_fstream<char> fstream;
 
   typedef basic_ios<wchar_t> wios;
   typedef basic_streambuf<wchar_t> wstreambuf;
   typedef basic_istream<wchar_t> wistream;
   typedef basic_ostream<wchar_t> wostream;
   typedef basic_iostream<wchar_t> wiostream;
   typedef basic_stringbuf<wchar_t> wstringbuf;
   typedef basic_istringstream<wchar_t> wistringstream;
   typedef basic_ostringstream<wchar_t> wostringstream;
   typedef basic_stringstream<wchar_t> wstringstream;
   typedef basic_filebuf<wchar_t> wfilebuf;
   typedef basic_ifstream<wchar_t> wifstream;
   typedef basic_ofstream<wchar_t> wofstream;
   typedef basic_fstream<wchar_t> wfstream;
 }
 # 71 "/usr/include/c++/3.2/bits/stl_algobase.h" 2 3
 # 1 "/usr/include/c++/3.2/bits/stl_pair.h" 1 3
 # 64 "/usr/include/c++/3.2/bits/stl_pair.h" 3
 namespace std
 {
 
 
 template <class _T1, class _T2>
 struct pair {
   typedef _T1 first_type;
   typedef _T2 second_type;
 
   _T1 first;
   _T2 second;
 
 
 
 
   pair() : first(), second() {}
 
 
 
 
   pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) {}
 
 
   template <class _U1, class _U2>
   pair(const pair<_U1, _U2>& __p) : first(__p.first), second(__p.second) {}
 };
 
 
 template <class _T1, class _T2>
 inline bool operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
 {
   return __x.first == __y.first && __x.second == __y.second;
 }
 
 
 template <class _T1, class _T2>
 inline bool operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
 {
   return __x.first < __y.first ||
          (!(__y.first < __x.first) && __x.second < __y.second);
 }
 
 
 template <class _T1, class _T2>
 inline bool operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
   return !(__x == __y);
 }
 
 
 template <class _T1, class _T2>
 inline bool operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
   return __y < __x;
 }
 
 
 template <class _T1, class _T2>
 inline bool operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
   return !(__y < __x);
 }
 
 
 template <class _T1, class _T2>
 inline bool operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
   return !(__x < __y);
 }
 # 140 "/usr/include/c++/3.2/bits/stl_pair.h" 3
 template <class _T1, class _T2>
 
 
 inline pair<_T1, _T2> make_pair(_T1 __x, _T2 __y)
 
 
 
 {
   return pair<_T1, _T2>(__x, __y);
 }
 
 }
 # 72 "/usr/include/c++/3.2/bits/stl_algobase.h" 2 3
 # 1 "/usr/include/c++/3.2/bits/type_traits.h" 1 3
 # 53 "/usr/include/c++/3.2/bits/type_traits.h" 3
 # 90 "/usr/include/c++/3.2/bits/type_traits.h" 3
 struct __true_type {};
 struct __false_type {};
 
 template <class _Tp>
 struct __type_traits {
    typedef __true_type this_dummy_member_must_be_first;
 # 113 "/usr/include/c++/3.2/bits/type_traits.h" 3
    typedef __false_type has_trivial_default_constructor;
    typedef __false_type has_trivial_copy_constructor;
    typedef __false_type has_trivial_assignment_operator;
    typedef __false_type has_trivial_destructor;
    typedef __false_type is_POD_type;
 };
 
 
 
 
 template<> struct __type_traits<bool> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template<> struct __type_traits<char> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template<> struct __type_traits<signed char> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template<> struct __type_traits<unsigned char> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template<> struct __type_traits<wchar_t> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template<> struct __type_traits<short> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template<> struct __type_traits<unsigned short> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template<> struct __type_traits<int> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template<> struct __type_traits<unsigned int> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template<> struct __type_traits<long> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template<> struct __type_traits<unsigned long> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template<> struct __type_traits<long long> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template<> struct __type_traits<unsigned long long> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template<> struct __type_traits<float> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template<> struct __type_traits<double> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template<> struct __type_traits<long double> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 template <class _Tp>
 struct __type_traits<_Tp*> {
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_copy_constructor;
    typedef __true_type has_trivial_assignment_operator;
    typedef __true_type has_trivial_destructor;
    typedef __true_type is_POD_type;
 };
 
 
 
 
 
 template <class _Tp> struct _Is_integer {
   typedef __false_type _Integral;
 };
 
 template<> struct _Is_integer<bool> {
   typedef __true_type _Integral;
 };
 
 template<> struct _Is_integer<char> {
   typedef __true_type _Integral;
 };
 
 template<> struct _Is_integer<signed char> {
   typedef __true_type _Integral;
 };
 
 template<> struct _Is_integer<unsigned char> {
   typedef __true_type _Integral;
 };
 
 template<> struct _Is_integer<wchar_t> {
   typedef __true_type _Integral;
 };
 
 template<> struct _Is_integer<short> {
   typedef __true_type _Integral;
 };
 
 template<> struct _Is_integer<unsigned short> {
   typedef __true_type _Integral;
 };
 
 template<> struct _Is_integer<int> {
   typedef __true_type _Integral;
 };
 
 template<> struct _Is_integer<unsigned int> {
   typedef __true_type _Integral;
 };
 
 template<> struct _Is_integer<long> {
   typedef __true_type _Integral;
 };
 
 template<> struct _Is_integer<unsigned long> {
   typedef __true_type _Integral;
 };
 
 template<> struct _Is_integer<long long> {
   typedef __true_type _Integral;
 };
 
 template<> struct _Is_integer<unsigned long long> {
   typedef __true_type _Integral;
 };
 
 template<typename _Tp> struct _Is_normal_iterator {
    typedef __false_type _Normal;
 };
 
 
 namespace __gnu_cxx
 {
   template<typename _Iterator, typename _Container> class __normal_iterator;
 }
 
 template<typename _Iterator, typename _Container>
 struct _Is_normal_iterator< __gnu_cxx::__normal_iterator<_Iterator, _Container> > {
    typedef __true_type _Normal;
 };
 # 73 "/usr/include/c++/3.2/bits/stl_algobase.h" 2 3
 # 1 "/usr/include/c++/3.2/bits/stl_iterator_base_types.h" 1 3
 # 68 "/usr/include/c++/3.2/bits/stl_iterator_base_types.h" 3
 
 namespace std
 {
 # 80 "/usr/include/c++/3.2/bits/stl_iterator_base_types.h" 3
   struct input_iterator_tag {};
 
   struct output_iterator_tag {};
 
   struct forward_iterator_tag : public input_iterator_tag {};
 
   struct bidirectional_iterator_tag : public forward_iterator_tag {};
 
   struct random_access_iterator_tag : public bidirectional_iterator_tag {};
 # 100 "/usr/include/c++/3.2/bits/stl_iterator_base_types.h" 3
   template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t,
            typename _Pointer = _Tp*, typename _Reference = _Tp&>
     struct iterator {
 
       typedef _Category iterator_category;
 
       typedef _Tp value_type;
 
       typedef _Distance difference_type;
 
       typedef _Pointer pointer;
 
       typedef _Reference reference;
     };
 
 
 
 
 
 
 
   template<typename _Iterator>
     struct iterator_traits {
       typedef typename _Iterator::iterator_category iterator_category;
       typedef typename _Iterator::value_type value_type;
       typedef typename _Iterator::difference_type difference_type;
       typedef typename _Iterator::pointer pointer;
       typedef typename _Iterator::reference reference;
     };
 
   template<typename _Tp>
     struct iterator_traits<_Tp*> {
       typedef random_access_iterator_tag iterator_category;
       typedef _Tp value_type;
       typedef ptrdiff_t difference_type;
       typedef _Tp* pointer;
       typedef _Tp& reference;
     };
 
   template<typename _Tp>
     struct iterator_traits<const _Tp*> {
       typedef random_access_iterator_tag iterator_category;
       typedef _Tp value_type;
       typedef ptrdiff_t difference_type;
       typedef const _Tp* pointer;
       typedef const _Tp& reference;
     };
 
 
 
 
 
 
 
   template<typename _Iter>
     inline typename iterator_traits<_Iter>::iterator_category
     __iterator_category(const _Iter&)
     { return typename iterator_traits<_Iter>::iterator_category(); }
 
 }
 # 74 "/usr/include/c++/3.2/bits/stl_algobase.h" 2 3
 # 1 "/usr/include/c++/3.2/bits/stl_iterator_base_funcs.h" 1 3
 # 68 "/usr/include/c++/3.2/bits/stl_iterator_base_funcs.h" 3
 # 1 "/usr/include/c++/3.2/bits/concept_check.h" 1 3
 # 39 "/usr/include/c++/3.2/bits/concept_check.h" 3
 # 69 "/usr/include/c++/3.2/bits/stl_iterator_base_funcs.h" 2 3
 
 
 
 
 namespace std
 {
 template<typename _InputIterator>
   inline typename iterator_traits<_InputIterator>::difference_type
   __distance(_InputIterator __first, _InputIterator __last, input_iterator_tag)
   {
 
    
 
     typename iterator_traits<_InputIterator>::difference_type __n = 0;
     while (__first != __last) {
       ++__first; ++__n;
     }
     return __n;
   }
 
 template<typename _RandomAccessIterator>
   inline typename iterator_traits<_RandomAccessIterator>::difference_type
   __distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
              random_access_iterator_tag)
   {
 
    
     return __last - __first;
   }
 # 111 "/usr/include/c++/3.2/bits/stl_iterator_base_funcs.h" 3
 template<typename _InputIterator>
   inline typename iterator_traits<_InputIterator>::difference_type
   distance(_InputIterator __first, _InputIterator __last)
   {
 
     return __distance(__first, __last, __iterator_category(__first));
   }
 
 template<typename _InputIter, typename _Distance>
   inline void
   __advance(_InputIter& __i, _Distance __n, input_iterator_tag)
   {
 
    
     while (__n--) ++__i;
   }
 
 template<typename _BidirectionalIterator, typename _Distance>
   inline void
   __advance(_BidirectionalIterator& __i, _Distance __n,
             bidirectional_iterator_tag)
   {
 
    
 
     if (__n > 0)
       while (__n--) ++__i;
     else
       while (__n++) --__i;
   }
 
 template<typename _RandomAccessIterator, typename _Distance>
   inline void
   __advance(_RandomAccessIterator& __i, _Distance __n,
             random_access_iterator_tag)
   {
 
    
     __i += __n;
   }
 # 164 "/usr/include/c++/3.2/bits/stl_iterator_base_funcs.h" 3
 template<typename _InputIterator, typename _Distance>
   inline void
   advance(_InputIterator& __i, _Distance __n)
   {
 
     __advance(__i, __n, __iterator_category(__i));
   }
 
 }
 # 75 "/usr/include/c++/3.2/bits/stl_algobase.h" 2 3
 # 1 "/usr/include/c++/3.2/bits/stl_iterator.h" 1 3
 # 68 "/usr/include/c++/3.2/bits/stl_iterator.h" 3
 namespace std
 {
 # 89 "/usr/include/c++/3.2/bits/stl_iterator.h" 3
   template<typename _Iterator>
     class reverse_iterator
     : public iterator<typename iterator_traits<_Iterator>::iterator_category,
                       typename iterator_traits<_Iterator>::value_type,
                       typename iterator_traits<_Iterator>::difference_type,
                       typename iterator_traits<_Iterator>::pointer,
                       typename iterator_traits<_Iterator>::reference>
     {
     protected:
       _Iterator current;
 
     public:
       typedef _Iterator iterator_type;
       typedef typename iterator_traits<_Iterator>::difference_type
                                                                difference_type;
       typedef typename iterator_traits<_Iterator>::reference reference;
       typedef typename iterator_traits<_Iterator>::pointer pointer;
 
     public:
 
 
 
       reverse_iterator() { }
 
 
 
 
       explicit
       reverse_iterator(iterator_type __x) : current(__x) { }
 
 
 
 
       reverse_iterator(const reverse_iterator& __x)
       : current(__x.current) { }
 
 
 
 
 
       template<typename _Iter>
         reverse_iterator(const reverse_iterator<_Iter>& __x)
         : current(__x.base()) { }
 
 
 
 
       iterator_type
       base() const { return current; }
 
 
 
 
 
 
       reference
       operator*() const
       {
         _Iterator __tmp = current;
         return *--__tmp;
       }
 
 
 
 
 
 
       pointer
       operator->() const { return &(operator*()); }
 
 
 
 
 
 
       reverse_iterator&
       operator++()
       {
         --current;
         return *this;
       }
 
 
 
 
 
 
       reverse_iterator
       operator++(int)
       {
         reverse_iterator __tmp = *this;
         --current;
         return __tmp;
       }
 
 
 
 
 
 
       reverse_iterator&
       operator--()
       {
         ++current;
         return *this;
       }
 
 
 
 
 
 
       reverse_iterator operator--(int)
       {
         reverse_iterator __tmp = *this;
         ++current;
         return __tmp;
       }
 
 
 
 
 
 
       reverse_iterator
       operator+(difference_type __n) const
       { return reverse_iterator(current - __n); }
 
 
 
 
 
 
       reverse_iterator&
       operator+=(difference_type __n)
       {
         current -= __n;
         return *this;
       }
 
 
 
 
 
 
       reverse_iterator
       operator-(difference_type __n) const
       { return reverse_iterator(current + __n); }
 
 
 
 
 
 
       reverse_iterator&
       operator-=(difference_type __n)
       {
         current += __n;
         return *this;
       }
 
 
 
 
 
 
       reference
       operator[](difference_type __n) const { return *(*this + __n); }
     };
 # 269 "/usr/include/c++/3.2/bits/stl_iterator.h" 3
   template<typename _Iterator>
     inline bool
     operator==(const reverse_iterator<_Iterator>& __x,
                const reverse_iterator<_Iterator>& __y)
     { return __x.base() == __y.base(); }
 
   template<typename _Iterator>
     inline bool
     operator<(const reverse_iterator<_Iterator>& __x,
               const reverse_iterator<_Iterator>& __y)
     { return __y.base() < __x.base(); }
 
   template<typename _Iterator>
     inline bool
     operator!=(const reverse_iterator<_Iterator>& __x,
                const reverse_iterator<_Iterator>& __y)
     { return !(__x == __y); }
 
   template<typename _Iterator>
     inline bool
     operator>(const reverse_iterator<_Iterator>& __x,
               const reverse_iterator<_Iterator>& __y)
     { return __y < __x; }
 
   template<typename _Iterator>
     inline bool
     operator<=(const reverse_iterator<_Iterator>& __x,
                 const reverse_iterator<_Iterator>& __y)
     { return !(__y < __x); }
 
   template<typename _Iterator>
     inline bool
     operator>=(const reverse_iterator<_Iterator>& __x,
                const reverse_iterator<_Iterator>& __y)
     { return !(__x < __y); }
 
   template<typename _Iterator>
     inline typename reverse_iterator<_Iterator>::difference_type
     operator-(const reverse_iterator<_Iterator>& __x,
               const reverse_iterator<_Iterator>& __y)
     { return __y.base() - __x.base(); }
 
   template<typename _Iterator>
     inline reverse_iterator<_Iterator>
     operator+(typename reverse_iterator<_Iterator>::difference_type __n,
               const reverse_iterator<_Iterator>& __x)
     { return reverse_iterator<_Iterator>(__x.base() - __n); }
 # 327 "/usr/include/c++/3.2/bits/stl_iterator.h" 3
   template<typename _Container>
     class back_insert_iterator
     : public iterator<output_iterator_tag, void, void, void, void>
     {
     protected:
       _Container* container;
 
     public:
 
       typedef _Container container_type;
 
 
       explicit
       back_insert_iterator(_Container& __x) : container(&__x) { }
 # 353 "/usr/include/c++/3.2/bits/stl_iterator.h" 3
       back_insert_iterator&
       operator=(typename _Container::const_reference __value)
       {
         container->push_back(__value);
         return *this;
       }
 
 
       back_insert_iterator&
       operator*() { return *this; }
 
 
       back_insert_iterator&
       operator++() { return *this; }
 
 
       back_insert_iterator
       operator++(int) { return *this; }
     };
 # 384 "/usr/include/c++/3.2/bits/stl_iterator.h" 3
   template<typename _Container>
     inline back_insert_iterator<_Container>
     back_inserter(_Container& __x)
     { return back_insert_iterator<_Container>(__x); }
 # 397 "/usr/include/c++/3.2/bits/stl_iterator.h" 3
   template<typename _Container>
     class front_insert_iterator
     : public iterator<output_iterator_tag, void, void, void, void>
     {
     protected:
       _Container* container;
 
     public:
 
       typedef _Container container_type;
 
 
       explicit front_insert_iterator(_Container& __x) : container(&__x) { }
 # 422 "/usr/include/c++/3.2/bits/stl_iterator.h" 3
       front_insert_iterator&
       operator=(typename _Container::const_reference __value)
       {
         container->push_front(__value);
         return *this;
       }
 
 
       front_insert_iterator&
       operator*() { return *this; }
 
 
       front_insert_iterator&
       operator++() { return *this; }
 
 
       front_insert_iterator
       operator++(int) { return *this; }
     };
 # 453 "/usr/include/c++/3.2/bits/stl_iterator.h" 3
   template<typename _Container>
     inline front_insert_iterator<_Container>
     front_inserter(_Container& __x)
     { return front_insert_iterator<_Container>(__x); }
 # 470 "/usr/include/c++/3.2/bits/stl_iterator.h" 3
   template<typename _Container>
     class insert_iterator
     : public iterator<output_iterator_tag, void, void, void, void>
     {
     protected:
       _Container* container;
       typename _Container::iterator iter;
 
     public:
 
       typedef _Container container_type;
 
 
 
 
 
       insert_iterator(_Container& __x, typename _Container::iterator __i)
       : container(&__x), iter(__i) {}
 # 512 "/usr/include/c++/3.2/bits/stl_iterator.h" 3
       insert_iterator&
       operator=(const typename _Container::const_reference __value)
       {
         iter = container->insert(iter, __value);
         ++iter;
         return *this;
       }
 
 
       insert_iterator&
       operator*() { return *this; }
 
 
       insert_iterator&
       operator++() { return *this; }
 
 
       insert_iterator&
       operator++(int) { return *this; }
     };
 # 544 "/usr/include/c++/3.2/bits/stl_iterator.h" 3
   template<typename _Container, typename _Iterator>
     inline insert_iterator<_Container>
     inserter(_Container& __x, _Iterator __i)
     {
       return insert_iterator<_Container>(__x,
                                          typename _Container::iterator(__i));
     }
 }
 
 namespace __gnu_cxx
 {
 
 
 
 
 
 
 
   using std::iterator_traits;
   using std::iterator;
   template<typename _Iterator, typename _Container>
     class __normal_iterator
       : public iterator<typename iterator_traits<_Iterator>::iterator_category,
                         typename iterator_traits<_Iterator>::value_type,
                         typename iterator_traits<_Iterator>::difference_type,
                         typename iterator_traits<_Iterator>::pointer,
                         typename iterator_traits<_Iterator>::reference>
     {
     protected:
       _Iterator _M_current;
 
     public:
       typedef typename iterator_traits<_Iterator>::difference_type
                                                                difference_type;
       typedef typename iterator_traits<_Iterator>::reference reference;
       typedef typename iterator_traits<_Iterator>::pointer pointer;
 
       __normal_iterator() : _M_current(_Iterator()) { }
 
       explicit
       __normal_iterator(const _Iterator& __i) : _M_current(__i) { }
 
 
       template<typename _Iter>
       inline __normal_iterator(const __normal_iterator<_Iter, _Container>& __i)
         : _M_current(__i.base()) { }
 
 
       reference
       operator*() const { return *_M_current; }
 
       pointer
       operator->() const { return _M_current; }
 
       __normal_iterator&
       operator++() { ++_M_current; return *this; }
 
       __normal_iterator
       operator++(int) { return __normal_iterator(_M_current++); }
 
 
       __normal_iterator&
       operator--() { --_M_current; return *this; }
 
       __normal_iterator
       operator--(int) { return __normal_iterator(_M_current--); }
 
 
       reference
       operator[](const difference_type& __n) const
       { return _M_current[__n]; }
 
       __normal_iterator&
       operator+=(const difference_type& __n)
       { _M_current += __n; return *this; }
 
       __normal_iterator
       operator+(const difference_type& __n) const
       { return __normal_iterator(_M_current + __n); }
 
       __normal_iterator&
       operator-=(const difference_type& __n)
       { _M_current -= __n; return *this; }
 
       __normal_iterator
       operator-(const difference_type& __n) const
       { return __normal_iterator(_M_current - __n); }
 
       const _Iterator&
       base() const { return _M_current; }
     };
 # 645 "/usr/include/c++/3.2/bits/stl_iterator.h" 3
   template<typename _IteratorL, typename _IteratorR, typename _Container>
   inline bool
   operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
              const __normal_iterator<_IteratorR, _Container>& __rhs)
   { return __lhs.base() == __rhs.base(); }
 
   template<typename _Iterator, typename _Container>
   inline bool
   operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
              const __normal_iterator<_Iterator, _Container>& __rhs)
   { return __lhs.base() == __rhs.base(); }
 
   template<typename _IteratorL, typename _IteratorR, typename _Container>
   inline bool
   operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
              const __normal_iterator<_IteratorR, _Container>& __rhs)
   { return __lhs.base() != __rhs.base(); }
 
   template<typename _Iterator, typename _Container>
   inline bool
   operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
              const __normal_iterator<_Iterator, _Container>& __rhs)
   { return __lhs.base() != __rhs.base(); }
 
 
   template<typename _IteratorL, typename _IteratorR, typename _Container>
   inline bool
   operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
             const __normal_iterator<_IteratorR, _Container>& __rhs)
   { return __lhs.base() < __rhs.base(); }
 
   template<typename _Iterator, typename _Container>
   inline bool
   operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
              const __normal_iterator<_Iterator, _Container>& __rhs)
   { return __lhs.base() < __rhs.base(); }
 
   template<typename _IteratorL, typename _IteratorR, typename _Container>
   inline bool
   operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
             const __normal_iterator<_IteratorR, _Container>& __rhs)
   { return __lhs.base() > __rhs.base(); }
 
   template<typename _Iterator, typename _Container>
   inline bool
   operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
             const __normal_iterator<_Iterator, _Container>& __rhs)
   { return __lhs.base() > __rhs.base(); }
 
   template<typename _IteratorL, typename _IteratorR, typename _Container>
   inline bool
   operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
              const __normal_iterator<_IteratorR, _Container>& __rhs)
   { return __lhs.base() <= __rhs.base(); }
 
   template<typename _Iterator, typename _Container>
   inline bool
   operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
              const __normal_iterator<_Iterator, _Container>& __rhs)
   { return __lhs.base() <= __rhs.base(); }
 
   template<typename _IteratorL, typename _IteratorR, typename _Container>
   inline bool
   operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
              const __normal_iterator<_IteratorR, _Container>& __rhs)
   { return __lhs.base() >= __rhs.base(); }
 
   template<typename _Iterator, typename _Container>
   inline bool
   operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
              const __normal_iterator<_Iterator, _Container>& __rhs)
   { return __lhs.base() >= __rhs.base(); }
 
 
 
 
 
   template<typename _IteratorL, typename _IteratorR, typename _Container>
   inline typename __normal_iterator<_IteratorL, _Container>::difference_type
   operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
              const __normal_iterator<_IteratorR, _Container>& __rhs)
   { return __lhs.base() - __rhs.base(); }
 
   template<typename _Iterator, typename _Container>
   inline __normal_iterator<_Iterator, _Container>
   operator+(typename __normal_iterator<_Iterator, _Container>::difference_type __n,
             const __normal_iterator<_Iterator, _Container>& __i)
   { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
 }
 # 76 "/usr/include/c++/3.2/bits/stl_algobase.h" 2 3
 
 
 namespace std
 {
 # 91 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _ForwardIter1, typename _ForwardIter2>
     inline void
     iter_swap(_ForwardIter1 __a, _ForwardIter2 __b)
     {
       typedef typename iterator_traits<_ForwardIter1>::value_type _ValueType1;
       typedef typename iterator_traits<_ForwardIter2>::value_type _ValueType2;
 
 
      
      
      
      
 
       _ValueType1 __tmp = *__a;
       *__a = *__b;
       *__b = __tmp;
     }
 # 118 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _Tp>
     inline void
     swap(_Tp& __a, _Tp& __b)
     {
 
      
 
       _Tp __tmp = __a;
       __a = __b;
       __b = __tmp;
     }
 # 146 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _Tp>
     inline const _Tp&
     min(const _Tp& __a, const _Tp& __b)
     {
 
      
 
       if (__b < __a) return __b; return __a;
     }
 # 166 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _Tp>
     inline const _Tp&
     max(const _Tp& __a, const _Tp& __b)
     {
 
      
 
       if (__a < __b) return __b; return __a;
     }
 # 186 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _Tp, typename _Compare>
     inline const _Tp&
     min(const _Tp& __a, const _Tp& __b, _Compare __comp)
     {
 
       if (__comp(__b, __a)) return __b; return __a;
     }
 # 204 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _Tp, typename _Compare>
     inline const _Tp&
     max(const _Tp& __a, const _Tp& __b, _Compare __comp)
     {
 
       if (__comp(__a, __b)) return __b; return __a;
     }
 # 221 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _InputIter, typename _OutputIter>
     inline _OutputIter
     __copy(_InputIter __first, _InputIter __last,
            _OutputIter __result,
            input_iterator_tag)
     {
       for ( ; __first != __last; ++__result, ++__first)
         *__result = *__first;
       return __result;
     }
 
   template<typename _RandomAccessIter, typename _OutputIter>
     inline _OutputIter
     __copy(_RandomAccessIter __first, _RandomAccessIter __last,
            _OutputIter __result,
            random_access_iterator_tag)
     {
       typedef typename iterator_traits<_RandomAccessIter>::difference_type
           _Distance;
       for (_Distance __n = __last - __first; __n > 0; --__n) {
         *__result = *__first;
         ++__first;
         ++__result;
       }
       return __result;
     }
 
   template<typename _Tp>
     inline _Tp*
     __copy_trivial(const _Tp* __first, const _Tp* __last, _Tp* __result)
     {
       memmove(__result, __first, sizeof(_Tp) * (__last - __first));
       return __result + (__last - __first);
     }
 
   template<typename _InputIter, typename _OutputIter>
     inline _OutputIter
     __copy_aux2(_InputIter __first, _InputIter __last,
                 _OutputIter __result, __false_type)
     { return __copy(__first, __last, __result, __iterator_category(__first)); }
 
   template<typename _InputIter, typename _OutputIter>
     inline _OutputIter
     __copy_aux2(_InputIter __first, _InputIter __last,
                 _OutputIter __result, __true_type)
     { return __copy(__first, __last, __result, __iterator_category(__first)); }
 
   template<typename _Tp>
     inline _Tp*
     __copy_aux2(_Tp* __first, _Tp* __last,
                 _Tp* __result, __true_type)
     { return __copy_trivial(__first, __last, __result); }
 
   template<typename _Tp>
     inline _Tp*
     __copy_aux2(const _Tp* __first, const _Tp* __last,
                 _Tp* __result, __true_type)
     { return __copy_trivial(__first, __last, __result); }
 
   template<typename _InputIter, typename _OutputIter>
     inline _OutputIter
     __copy_ni2(_InputIter __first, _InputIter __last,
                _OutputIter __result, __true_type)
     {
       typedef typename iterator_traits<_InputIter>::value_type
           _ValueType;
       typedef typename __type_traits<_ValueType>::has_trivial_assignment_operator
           _Trivial;
       return _OutputIter(__copy_aux2(__first, __last,
                                      __result.base(),
                                      _Trivial()));
     }
 
   template<typename _InputIter, typename _OutputIter>
     inline _OutputIter
     __copy_ni2(_InputIter __first, _InputIter __last,
                _OutputIter __result, __false_type)
     {
       typedef typename iterator_traits<_InputIter>::value_type
           _ValueType;
       typedef typename __type_traits<_ValueType>::has_trivial_assignment_operator
           _Trivial;
       return __copy_aux2(__first, __last,
                          __result,
                          _Trivial());
     }
 
   template<typename _InputIter, typename _OutputIter>
     inline _OutputIter
     __copy_ni1(_InputIter __first, _InputIter __last,
                _OutputIter __result, __true_type)
     {
       typedef typename _Is_normal_iterator<_OutputIter>::_Normal __Normal;
       return __copy_ni2(__first.base(), __last.base(), __result, __Normal());
     }
 
   template<typename _InputIter, typename _OutputIter>
     inline _OutputIter
     __copy_ni1(_InputIter __first, _InputIter __last,
                _OutputIter __result, __false_type)
     {
       typedef typename _Is_normal_iterator<_OutputIter>::_Normal __Normal;
       return __copy_ni2(__first, __last, __result, __Normal());
     }
 # 339 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _InputIter, typename _OutputIter>
     inline _OutputIter
     copy(_InputIter __first, _InputIter __last, _OutputIter __result)
     {
 
      
      
 
 
        typedef typename _Is_normal_iterator<_InputIter>::_Normal __Normal;
        return __copy_ni1(__first, __last, __result, __Normal());
     }
 
 
 
 
   template<typename _BidirectionalIter1, typename _BidirectionalIter2>
     inline _BidirectionalIter2
     __copy_backward(_BidirectionalIter1 __first, _BidirectionalIter1 __last,
                     _BidirectionalIter2 __result,
                     bidirectional_iterator_tag)
     {
       while (__first != __last)
         *--__result = *--__last;
       return __result;
     }
 
   template<typename _RandomAccessIter, typename _BidirectionalIter>
     inline _BidirectionalIter
     __copy_backward(_RandomAccessIter __first, _RandomAccessIter __last,
                     _BidirectionalIter __result,
                     random_access_iterator_tag)
     {
       typename iterator_traits<_RandomAccessIter>::difference_type __n;
       for (__n = __last - __first; __n > 0; --__n)
         *--__result = *--__last;
       return __result;
     }
 
 
 
 
 
 
 
   template<typename _BidirectionalIter1, typename _BidirectionalIter2,
            typename _BoolType>
     struct __copy_backward_dispatch
     {
       static _BidirectionalIter2
       copy(_BidirectionalIter1 __first, _BidirectionalIter1 __last,
            _BidirectionalIter2 __result)
       {
         return __copy_backward(__first, __last,
                                __result,
                                __iterator_category(__first));
       }
     };
 
   template<typename _Tp>
     struct __copy_backward_dispatch<_Tp*, _Tp*, __true_type>
     {
       static _Tp*
       copy(const _Tp* __first, const _Tp* __last, _Tp* __result)
       {
         const ptrdiff_t _Num = __last - __first;
         memmove(__result - _Num, __first, sizeof(_Tp) * _Num);
         return __result - _Num;
       }
     };
 
   template<typename _Tp>
     struct __copy_backward_dispatch<const _Tp*, _Tp*, __true_type>
     {
       static _Tp*
       copy(const _Tp* __first, const _Tp* __last, _Tp* __result)
       {
         return __copy_backward_dispatch<_Tp*, _Tp*, __true_type>
           ::copy(__first, __last, __result);
       }
     };
 
   template<typename _BI1, typename _BI2>
     inline _BI2
     __copy_backward_aux(_BI1 __first, _BI1 __last, _BI2 __result)
     {
       typedef typename __type_traits<typename iterator_traits<_BI2>::value_type>
                             ::has_trivial_assignment_operator _Trivial;
       return __copy_backward_dispatch<_BI1, _BI2, _Trivial>
                   ::copy(__first, __last, __result);
     }
 
   template <typename _BI1, typename _BI2>
     inline _BI2
     __copy_backward_output_normal_iterator(_BI1 __first, _BI1 __last,
                                            _BI2 __result, __true_type)
     { return _BI2(__copy_backward_aux(__first, __last, __result.base())); }
 
   template <typename _BI1, typename _BI2>
     inline _BI2
     __copy_backward_output_normal_iterator(_BI1 __first, _BI1 __last,
                                            _BI2 __result, __false_type)
     { return __copy_backward_aux(__first, __last, __result); }
 
   template <typename _BI1, typename _BI2>
     inline _BI2
     __copy_backward_input_normal_iterator(_BI1 __first, _BI1 __last,
                                           _BI2 __result, __true_type)
     {
       typedef typename _Is_normal_iterator<_BI2>::_Normal __Normal;
       return __copy_backward_output_normal_iterator(__first.base(), __last.base(),
                                                     __result, __Normal());
     }
 
   template <typename _BI1, typename _BI2>
     inline _BI2
     __copy_backward_input_normal_iterator(_BI1 __first, _BI1 __last,
                                           _BI2 __result, __false_type)
     {
       typedef typename _Is_normal_iterator<_BI2>::_Normal __Normal;
       return __copy_backward_output_normal_iterator(__first, __last, __result,
                                                     __Normal());
     }
 # 477 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template <typename _BI1, typename _BI2>
     inline _BI2
     copy_backward(_BI1 __first, _BI1 __last, _BI2 __result)
     {
 
      
      
      
 
 
 
       typedef typename _Is_normal_iterator<_BI1>::_Normal __Normal;
       return __copy_backward_input_normal_iterator(__first, __last, __result,
                                                    __Normal());
     }
 # 509 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _ForwardIter, typename _Tp>
     void
     fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __value)
     {
 
      
 
       for ( ; __first != __last; ++__first)
         *__first = __value;
     }
 # 531 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _OutputIter, typename _Size, typename _Tp>
     _OutputIter
     fill_n(_OutputIter __first, _Size __n, const _Tp& __value)
     {
 
      
 
       for ( ; __n > 0; --__n, ++__first)
         *__first = __value;
       return __first;
     }
 
 
 
   inline void
   fill(unsigned char* __first, unsigned char* __last, const unsigned char& __c)
   {
     unsigned char __tmp = __c;
     memset(__first, __tmp, __last - __first);
   }
 
   inline void
   fill(signed char* __first, signed char* __last, const signed char& __c)
   {
     signed char __tmp = __c;
     memset(__first, static_cast<unsigned char>(__tmp), __last - __first);
   }
 
   inline void
   fill(char* __first, char* __last, const char& __c)
   {
     char __tmp = __c;
     memset(__first, static_cast<unsigned char>(__tmp), __last - __first);
   }
 
   template<typename _Size>
     inline unsigned char*
     fill_n(unsigned char* __first, _Size __n, const unsigned char& __c)
     {
       fill(__first, __first + __n, __c);
       return __first + __n;
     }
 
   template<typename _Size>
     inline signed char*
     fill_n(char* __first, _Size __n, const signed char& __c)
     {
       fill(__first, __first + __n, __c);
       return __first + __n;
     }
 
   template<typename _Size>
     inline char*
     fill_n(char* __first, _Size __n, const char& __c)
     {
       fill(__first, __first + __n, __c);
       return __first + __n;
     }
 # 606 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _InputIter1, typename _InputIter2>
     pair<_InputIter1, _InputIter2>
     mismatch(_InputIter1 __first1, _InputIter1 __last1,
              _InputIter2 __first2)
     {
 
      
      
      
 
      
 
 
       while (__first1 != __last1 && *__first1 == *__first2) {
         ++__first1;
         ++__first2;
       }
       return pair<_InputIter1, _InputIter2>(__first1, __first2);
     }
 # 640 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _InputIter1, typename _InputIter2, typename _BinaryPredicate>
     pair<_InputIter1, _InputIter2>
     mismatch(_InputIter1 __first1, _InputIter1 __last1,
              _InputIter2 __first2,
              _BinaryPredicate __binary_pred)
     {
 
      
      
 
       while (__first1 != __last1 && __binary_pred(*__first1, *__first2)) {
         ++__first1;
         ++__first2;
       }
       return pair<_InputIter1, _InputIter2>(__first1, __first2);
     }
 # 668 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _InputIter1, typename _InputIter2>
     inline bool
     equal(_InputIter1 __first1, _InputIter1 __last1,
           _InputIter2 __first2)
     {
 
      
      
      
 
 
 
       for ( ; __first1 != __last1; ++__first1, ++__first2)
         if (!(*__first1 == *__first2))
           return false;
       return true;
     }
 # 699 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _InputIter1, typename _InputIter2, typename _BinaryPredicate>
     inline bool
     equal(_InputIter1 __first1, _InputIter1 __last1,
           _InputIter2 __first2,
           _BinaryPredicate __binary_pred)
     {
 
      
      
 
       for ( ; __first1 != __last1; ++__first1, ++__first2)
         if (!__binary_pred(*__first1, *__first2))
           return false;
       return true;
     }
 # 732 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _InputIter1, typename _InputIter2>
     bool
     lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,
                             _InputIter2 __first2, _InputIter2 __last2)
     {
 
      
      
      
 
      
 
 
       for ( ; __first1 != __last1 && __first2 != __last2
             ; ++__first1, ++__first2) {
         if (*__first1 < *__first2)
           return true;
         if (*__first2 < *__first1)
           return false;
       }
       return __first1 == __last1 && __first2 != __last2;
     }
 # 767 "/usr/include/c++/3.2/bits/stl_algobase.h" 3
   template<typename _InputIter1, typename _InputIter2, typename _Compare>
     bool
     lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,
                             _InputIter2 __first2, _InputIter2 __last2,
                             _Compare __comp)
     {
 
      
      
 
       for ( ; __first1 != __last1 && __first2 != __last2
             ; ++__first1, ++__first2) {
         if (__comp(*__first1, *__first2))
           return true;
         if (__comp(*__first2, *__first1))
           return false;
       }
       return __first1 == __last1 && __first2 != __last2;
     }
 
   inline bool
   lexicographical_compare(const unsigned char* __first1, const unsigned char* __last1,
                           const unsigned char* __first2, const unsigned char* __last2)
   {
     const size_t __len1 = __last1 - __first1;
     const size_t __len2 = __last2 - __first2;
     const int __result = memcmp(__first1, __first2, min(__len1, __len2));
     return __result != 0 ? __result < 0 : __len1 < __len2;
   }
 
   inline bool
   lexicographical_compare(const char* __first1, const char* __last1,
                           const char* __first2, const char* __last2)
   {
 
     return lexicographical_compare((const signed char*) __first1,
                                    (const signed char*) __last1,
                                    (const signed char*) __first2,
                                    (const signed char*) __last2);
 
 
 
 
 
 
   }
 
 }
 # 55 "/usr/include/c++/3.2/memory" 2 3
 # 1 "/usr/include/c++/3.2/bits/stl_alloc.h" 1 3
 # 84 "/usr/include/c++/3.2/bits/stl_alloc.h" 3
 # 1 "/usr/include/c++/3.2/cassert" 1 3
 # 47 "/usr/include/c++/3.2/cassert" 3
 
 # 1 "/usr/include/assert.h" 1 3
 # 65 "/usr/include/assert.h" 3
 extern "C" {
 
 
 extern void __assert_fail (__const char *__assertion, __const char *__file,
                            unsigned int __line, __const char *__function)
      throw () __attribute__ ((__noreturn__));
 
 
 extern void __assert_perror_fail (int __errnum, __const char *__file,
                                   unsigned int __line,
                                   __const char *__function)
      throw () __attribute__ ((__noreturn__));
 
 
 
 
 extern void __assert (const char *__assertion, const char *__file, int __line)
      throw () __attribute__ ((__noreturn__));
 
 
 }
 # 49 "/usr/include/c++/3.2/cassert" 2 3
 # 85 "/usr/include/c++/3.2/bits/stl_alloc.h" 2 3
 # 1 "/usr/include/c++/3.2/bits/functexcept.h" 1 3
 # 34 "/usr/include/c++/3.2/bits/functexcept.h" 3
 # 1 "/usr/include/c++/3.2/exception_defines.h" 1 3
 # 35 "/usr/include/c++/3.2/bits/functexcept.h" 2 3
 
 namespace std
 {
 
   void
   __throw_bad_exception(void);
 
 
   void
   __throw_bad_alloc(void);
 
 
   void
   __throw_bad_cast(void);
 
   void
   __throw_bad_typeid(void);
 
 
   void
   __throw_logic_error(const char* __s);
 
   void
   __throw_domain_error(const char* __s);
 
   void
   __throw_invalid_argument(const char* __s);
 
   void
   __throw_length_error(const char* __s);
 
   void
   __throw_out_of_range(const char* __s);
 
   void
   __throw_runtime_error(const char* __s);
 
   void
   __throw_range_error(const char* __s);
 
   void
   __throw_overflow_error(const char* __s);
 
   void
   __throw_underflow_error(const char* __s);
 
 
   void
   __throw_ios_failure(const char* __s);
 }
 # 86 "/usr/include/c++/3.2/bits/stl_alloc.h" 2 3
 # 1 "/usr/include/c++/3.2/bits/stl_threads.h" 1 3
 # 54 "/usr/include/c++/3.2/bits/stl_threads.h" 3
 namespace std
 {
 
 
 
 
   struct _Refcount_Base
   {
 
     typedef size_t _RC_t;
 
 
     volatile _RC_t _M_ref_count;
 
 
     __gthread_mutex_t _M_ref_count_lock;
 
     _Refcount_Base(_RC_t __n) : _M_ref_count(__n)
     {
 
       __gthread_mutex_t __tmp = {0, 0, 0, PTHREAD_MUTEX_TIMED_NP, { 0, 0 }};
       _M_ref_count_lock = __tmp;
 
 
 
 
 
     }
 
     void
     _M_incr()
     {
       __gthread_mutex_lock(&_M_ref_count_lock);
       ++_M_ref_count;
       __gthread_mutex_unlock(&_M_ref_count_lock);
     }
 
     _RC_t
     _M_decr()
     {
       __gthread_mutex_lock(&_M_ref_count_lock);
       volatile _RC_t __tmp = --_M_ref_count;
       __gthread_mutex_unlock(&_M_ref_count_lock);
       return __tmp;
     }
   };
 # 109 "/usr/include/c++/3.2/bits/stl_threads.h" 3
   template<int __dummy>
     struct _Swap_lock_struct
     { static __gthread_mutex_t _S_swap_lock; };
 
   template<int __dummy>
     __gthread_mutex_t
     _Swap_lock_struct<__dummy>::_S_swap_lock = {0, 0, 0, PTHREAD_MUTEX_TIMED_NP, { 0, 0 }};
 
 
 
   inline unsigned long
   _Atomic_swap(unsigned long * __p, unsigned long __q)
   {
     __gthread_mutex_lock(&_Swap_lock_struct<0>::_S_swap_lock);
     unsigned long __result = *__p;
     *__p = __q;
     __gthread_mutex_unlock(&_Swap_lock_struct<0>::_S_swap_lock);
     return __result;
   }
 # 151 "/usr/include/c++/3.2/bits/stl_threads.h" 3
   struct _STL_mutex_lock
   {
 
 
 
 
 
     __gthread_mutex_t _M_lock;
 
     void
     _M_initialize()
     {
 # 184 "/usr/include/c++/3.2/bits/stl_threads.h" 3
     }
 
     void
     _M_acquire_lock()
     {
 
 
 
       __gthread_mutex_lock(&_M_lock);
     }
 
     void
     _M_release_lock()
     {
 
 
 
       __gthread_mutex_unlock(&_M_lock);
     }
   };
 # 220 "/usr/include/c++/3.2/bits/stl_threads.h" 3
   struct _STL_auto_lock
   {
     _STL_mutex_lock& _M_lock;
 
     _STL_auto_lock(_STL_mutex_lock& __lock) : _M_lock(__lock)
     { _M_lock._M_acquire_lock(); }
 
     ~_STL_auto_lock() { _M_lock._M_release_lock(); }
 
   private:
     void operator=(const _STL_auto_lock&);
     _STL_auto_lock(const _STL_auto_lock&);
   };
 
 }
 # 87 "/usr/include/c++/3.2/bits/stl_alloc.h" 2 3
 
 namespace std
 {
 # 98 "/usr/include/c++/3.2/bits/stl_alloc.h" 3
   class __new_alloc
   {
   public:
     static void*
     allocate(size_t __n)
     { return ::operator new(__n); }
 
     static void
     deallocate(void* __p, size_t)
     { ::operator delete(__p); }
   };
 # 121 "/usr/include/c++/3.2/bits/stl_alloc.h" 3
   template <int __inst>
     class __malloc_alloc_template
     {
     private:
       static void* _S_oom_malloc(size_t);
       static void* _S_oom_realloc(void*, size_t);
       static void (* __malloc_alloc_oom_handler)();
 
     public:
       static void*
       allocate(size_t __n)
       {
         void* __result = malloc(__n);
         if (0 == __result) __result = _S_oom_malloc(__n);
         return __result;
       }
 
       static void
       deallocate(void* __p, size_t )
       { free(__p); }
 
       static void*
       reallocate(void* __p, size_t , size_t __new_sz)
       {
         void* __result = realloc(__p, __new_sz);
         if (0 == __result) __result = _S_oom_realloc(__p, __new_sz);
         return __result;
       }
 
       static void (* __set_malloc_handler(void (*__f)()))()
       {
         void (* __old)() = __malloc_alloc_oom_handler;
         __malloc_alloc_oom_handler = __f;
         return(__old);
       }
     };
 
 
   template <int __inst>
     void (* __malloc_alloc_template<__inst>::__malloc_alloc_oom_handler)() = 0;
 
   template <int __inst>
     void*
     __malloc_alloc_template<__inst>::_S_oom_malloc(size_t __n)
     {
       void (* __my_malloc_handler)();
       void* __result;
 
       for (;;)
         {
           __my_malloc_handler = __malloc_alloc_oom_handler;
           if (0 == __my_malloc_handler)
             std::__throw_bad_alloc();
           (*__my_malloc_handler)();
           __result = malloc(__n);
           if (__result)
             return(__result);
         }
     }
 
   template <int __inst>
     void*
     __malloc_alloc_template<__inst>::_S_oom_realloc(void* __p, size_t __n)
     {
       void (* __my_malloc_handler)();
       void* __result;
 
       for (;;)
         {
           __my_malloc_handler = __malloc_alloc_oom_handler;
           if (0 == __my_malloc_handler)
             std::__throw_bad_alloc();
           (*__my_malloc_handler)();
           __result = realloc(__p, __n);
           if (__result)
             return(__result);
         }
     }
 
 
 
 
 
 
   typedef __new_alloc __mem_interface;
 # 219 "/usr/include/c++/3.2/bits/stl_alloc.h" 3
   template<class _Tp, class _Alloc>
   class __simple_alloc
   {
   public:
     static _Tp* allocate(size_t __n)
     { return 0 == __n ? 0 : (_Tp*) _Alloc::allocate(__n * sizeof (_Tp)); }
 
     static _Tp* allocate()
     { return (_Tp*) _Alloc::allocate(sizeof (_Tp)); }
 
     static void deallocate(_Tp* __p, size_t __n)
     { if (0 != __n) _Alloc::deallocate(__p, __n * sizeof (_Tp)); }
 
     static void deallocate(_Tp* __p)
     { _Alloc::deallocate(__p, sizeof (_Tp)); }
   };
 # 251 "/usr/include/c++/3.2/bits/stl_alloc.h" 3
   template <class _Alloc>
   class __debug_alloc
   {
   private:
     enum {_S_extra = 8};
 
 
   public:
 
     static void* allocate(size_t __n)
     {
       char* __result = (char*)_Alloc::allocate(__n + (int) _S_extra);
       *(size_t*)__result = __n;
       return __result + (int) _S_extra;
     }
 
     static void deallocate(void* __p, size_t __n)
     {
       char* __real_p = (char*)__p - (int) _S_extra;
       (static_cast<void> ((*(size_t*)__real_p == __n) ? 0 : (__assert_fail ("*(size_t*)__real_p == __n", "/usr/include/c++/3.2/bits/stl_alloc.h", 270, __PRETTY_FUNCTION__), 0)));
       _Alloc::deallocate(__real_p, __n + (int) _S_extra);
     }
 
     static void* reallocate(void* __p, size_t __old_sz, size_t __new_sz)
     {
       char* __real_p = (char*)__p - (int) _S_extra;
       (static_cast<void> ((*(size_t*)__real_p == __old_sz) ? 0 : (__assert_fail ("*(size_t*)__real_p == __old_sz", "/usr/include/c++/3.2/bits/stl_alloc.h", 277, __PRETTY_FUNCTION__), 0)));
       char* __result = (char*)
         _Alloc::reallocate(__real_p, __old_sz + (int) _S_extra,
                                      __new_sz + (int) _S_extra);
       *(size_t*)__result = __new_sz;
       return __result + (int) _S_extra;
     }
   };
 # 324 "/usr/include/c++/3.2/bits/stl_alloc.h" 3
 template<bool __threads, int __inst>
   class __default_alloc_template
   {
   private:
     enum {_ALIGN = 8};
     enum {_MAX_BYTES = 128};
     enum {_NFREELISTS = _MAX_BYTES / _ALIGN};
 
     union _Obj
     {
       union _Obj* _M_free_list_link;
       char _M_client_data[1];
     };
 
     static _Obj* volatile _S_free_list[_NFREELISTS];
 
 
     static char* _S_start_free;
     static char* _S_end_free;
     static size_t _S_heap_size;
 
     static _STL_mutex_lock _S_node_allocator_lock;
 
     static size_t
     _S_round_up(size_t __bytes)
     { return (((__bytes) + (size_t) _ALIGN-1) & ~((size_t) _ALIGN - 1)); }
 
     static size_t
     _S_freelist_index(size_t __bytes)
     { return (((__bytes) + (size_t)_ALIGN-1)/(size_t)_ALIGN - 1); }
 
 
 
     static void*
     _S_refill(size_t __n);
 
 
 
     static char*
     _S_chunk_alloc(size_t __size, int& __nobjs);
 
 
 
     class _Lock
     {
     public:
       _Lock() { if (__threads) _S_node_allocator_lock._M_acquire_lock(); }
       ~_Lock() { if (__threads) _S_node_allocator_lock._M_release_lock(); }
     } __attribute__ ((__unused__));
     friend class _Lock;
 
   public:
 
     static void*
     allocate(size_t __n)
     {
       void* __ret = 0;
 
       if (__n > (size_t) _MAX_BYTES)
         __ret = __mem_interface::allocate(__n);
       else
         {
           _Obj* volatile* __my_free_list = _S_free_list
             + _S_freelist_index(__n);
 
 
 
           _Lock __lock_instance;
           _Obj* __restrict__ __result = *__my_free_list;
           if (__result == 0)
             __ret = _S_refill(_S_round_up(__n));
           else
             {
               *__my_free_list = __result -> _M_free_list_link;
               __ret = __result;
             }
         }
       return __ret;
     };
 
 
     static void
     deallocate(void* __p, size_t __n)
     {
       if (__n > (size_t) _MAX_BYTES)
         __mem_interface::deallocate(__p, __n);
       else
         {
           _Obj* volatile* __my_free_list
             = _S_free_list + _S_freelist_index(__n);
           _Obj* __q = (_Obj*)__p;
 
 
 
           _Lock __lock_instance;
           __q -> _M_free_list_link = *__my_free_list;
           *__my_free_list = __q;
         }
     }
 
     static void*
     reallocate(void* __p, size_t __old_sz, size_t __new_sz);
   };
 
 
   template<bool __threads, int __inst>
     inline bool
     operator==(const __default_alloc_template<__threads, __inst>&,
                const __default_alloc_template<__threads, __inst>&)
     { return true; }
 
   template<bool __threads, int __inst>
     inline bool
     operator!=(const __default_alloc_template<__threads, __inst>&,
                const __default_alloc_template<__threads, __inst>&)
     { return false; }
 
 
 
 
 
   template<bool __threads, int __inst>
     char*
     __default_alloc_template<__threads, __inst>::_S_chunk_alloc(size_t __size,
                                                                 int& __nobjs)
     {
       char* __result;
       size_t __total_bytes = __size * __nobjs;
       size_t __bytes_left = _S_end_free - _S_start_free;
 
       if (__bytes_left >= __total_bytes)
       {
         __result = _S_start_free;
         _S_start_free += __total_bytes;
         return(__result);
       }
       else if (__bytes_left >= __size)
         {
           __nobjs = (int)(__bytes_left/__size);
           __total_bytes = __size * __nobjs;
           __result = _S_start_free;
           _S_start_free += __total_bytes;
           return(__result);
         }
       else
         {
           size_t __bytes_to_get =
             2 * __total_bytes + _S_round_up(_S_heap_size >> 4);
 
           if (__bytes_left > 0)
             {
               _Obj* volatile* __my_free_list =
                 _S_free_list + _S_freelist_index(__bytes_left);
 
               ((_Obj*)_S_start_free) -> _M_free_list_link = *__my_free_list;
               *__my_free_list = (_Obj*)_S_start_free;
             }
           _S_start_free = (char*) __mem_interface::allocate(__bytes_to_get);
           if (0 == _S_start_free)
             {
               size_t __i;
               _Obj* volatile* __my_free_list;
               _Obj* __p;
 
 
 
               __i = __size;
               for (; __i <= (size_t) _MAX_BYTES; __i += (size_t) _ALIGN)
                 {
                   __my_free_list = _S_free_list + _S_freelist_index(__i);
                   __p = *__my_free_list;
                   if (0 != __p)
                     {
                       *__my_free_list = __p -> _M_free_list_link;
                       _S_start_free = (char*)__p;
                       _S_end_free = _S_start_free + __i;
                       return(_S_chunk_alloc(__size, __nobjs));
 
 
                     }
                 }
               _S_end_free = 0;
               _S_start_free = (char*)__mem_interface::allocate(__bytes_to_get);
 
 
             }
           _S_heap_size += __bytes_to_get;
           _S_end_free = _S_start_free + __bytes_to_get;
           return(_S_chunk_alloc(__size, __nobjs));
         }
     }
 
 
 
 
 
   template<bool __threads, int __inst>
     void*
     __default_alloc_template<__threads, __inst>::_S_refill(size_t __n)
     {
       int __nobjs = 20;
       char* __chunk = _S_chunk_alloc(__n, __nobjs);
       _Obj* volatile* __my_free_list;
       _Obj* __result;
       _Obj* __current_obj;
       _Obj* __next_obj;
       int __i;
 
       if (1 == __nobjs) return(__chunk);
       __my_free_list = _S_free_list + _S_freelist_index(__n);
 
 
       __result = (_Obj*)__chunk;
       *__my_free_list = __next_obj = (_Obj*)(__chunk + __n);
       for (__i = 1; ; __i++) {
         __current_obj = __next_obj;
         __next_obj = (_Obj*)((char*)__next_obj + __n);
         if (__nobjs - 1 == __i) {
           __current_obj -> _M_free_list_link = 0;
           break;
         } else {
           __current_obj -> _M_free_list_link = __next_obj;
         }
       }
       return(__result);
     }
 
 
   template<bool threads, int inst>
     void*
     __default_alloc_template<threads, inst>::reallocate(void* __p,
                                                         size_t __old_sz,
                                                         size_t __new_sz)
     {
       void* __result;
       size_t __copy_sz;
 
       if (__old_sz > (size_t) _MAX_BYTES && __new_sz > (size_t) _MAX_BYTES) {
         return(realloc(__p, __new_sz));
       }
       if (_S_round_up(__old_sz) == _S_round_up(__new_sz)) return(__p);
       __result = allocate(__new_sz);
       __copy_sz = __new_sz > __old_sz? __old_sz : __new_sz;
       memcpy(__result, __p, __copy_sz);
       deallocate(__p, __old_sz);
       return(__result);
     }
 
   template<bool __threads, int __inst>
   _STL_mutex_lock
   __default_alloc_template<__threads, __inst>::_S_node_allocator_lock
   = { {0, 0, 0, PTHREAD_MUTEX_TIMED_NP, { 0, 0 }} };
 
   template<bool __threads, int __inst>
   char* __default_alloc_template<__threads, __inst>::_S_start_free = 0;
 
   template<bool __threads, int __inst>
   char* __default_alloc_template<__threads, __inst>::_S_end_free = 0;
 
   template<bool __threads, int __inst>
   size_t __default_alloc_template<__threads, __inst>::_S_heap_size = 0;
 
   template<bool __threads, int __inst>
   typename __default_alloc_template<__threads, __inst>::_Obj* volatile
   __default_alloc_template<__threads, __inst>::_S_free_list[_NFREELISTS];
 
   typedef __default_alloc_template<true, 0> __alloc;
   typedef __default_alloc_template<false, 0> __single_client_alloc;
 # 613 "/usr/include/c++/3.2/bits/stl_alloc.h" 3
 template <class _Tp>
 class allocator
 {
   typedef __alloc _Alloc;
 public:
   typedef size_t size_type;
   typedef ptrdiff_t difference_type;
   typedef _Tp* pointer;
   typedef const _Tp* const_pointer;
   typedef _Tp& reference;
   typedef const _Tp& const_reference;
   typedef _Tp value_type;
 
   template <class _Tp1> struct rebind {
     typedef allocator<_Tp1> other;
   };
 
   allocator() throw() {}
   allocator(const allocator&) throw() {}
   template <class _Tp1> allocator(const allocator<_Tp1>&) throw() {}
   ~allocator() throw() {}
 
   pointer address(reference __x) const { return &__x; }
   const_pointer address(const_reference __x) const { return &__x; }
 
 
 
   _Tp* allocate(size_type __n, const void* = 0) {
     return __n != 0 ? static_cast<_Tp*>(_Alloc::allocate(__n * sizeof(_Tp)))
                     : 0;
   }
 
 
   void deallocate(pointer __p, size_type __n)
     { _Alloc::deallocate(__p, __n * sizeof(_Tp)); }
 
   size_type max_size() const throw()
     { return size_t(-1) / sizeof(_Tp); }
 
   void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); }
   void destroy(pointer __p) { __p->~_Tp(); }
 };
 
 template<>
 class allocator<void> {
 public:
   typedef size_t size_type;
   typedef ptrdiff_t difference_type;
   typedef void* pointer;
   typedef const void* const_pointer;
   typedef void value_type;
 
   template <class _Tp1> struct rebind {
     typedef allocator<_Tp1> other;
   };
 };
 
 
 template <class _T1, class _T2>
 inline bool operator==(const allocator<_T1>&, const allocator<_T2>&)
 {
   return true;
 }
 
 template <class _T1, class _T2>
 inline bool operator!=(const allocator<_T1>&, const allocator<_T2>&)
 {
   return false;
 }
 # 695 "/usr/include/c++/3.2/bits/stl_alloc.h" 3
 template <class _Tp, class _Alloc>
 struct __allocator
 {
   _Alloc __underlying_alloc;
 
   typedef size_t size_type;
   typedef ptrdiff_t difference_type;
   typedef _Tp* pointer;
   typedef const _Tp* const_pointer;
   typedef _Tp& reference;
   typedef const _Tp& const_reference;
   typedef _Tp value_type;
 
   template <class _Tp1> struct rebind {
     typedef __allocator<_Tp1, _Alloc> other;
   };
 
   __allocator() throw() {}
   __allocator(const __allocator& __a) throw()
     : __underlying_alloc(__a.__underlying_alloc) {}
   template <class _Tp1>
   __allocator(const __allocator<_Tp1, _Alloc>& __a) throw()
     : __underlying_alloc(__a.__underlying_alloc) {}
   ~__allocator() throw() {}
 
   pointer address(reference __x) const { return &__x; }
   const_pointer address(const_reference __x) const { return &__x; }
 
 
   _Tp* allocate(size_type __n, const void* = 0) {
     return __n != 0
         ? static_cast<_Tp*>(__underlying_alloc.allocate(__n * sizeof(_Tp)))
         : 0;
   }
 
 
   void deallocate(pointer __p, size_type __n)
     { __underlying_alloc.deallocate(__p, __n * sizeof(_Tp)); }
 
   size_type max_size() const throw()
     { return size_t(-1) / sizeof(_Tp); }
 
   void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); }
   void destroy(pointer __p) { __p->~_Tp(); }
 };
 
 template <class _Alloc>
 class __allocator<void, _Alloc> {
   typedef size_t size_type;
   typedef ptrdiff_t difference_type;
   typedef void* pointer;
   typedef const void* const_pointer;
   typedef void value_type;
 
   template <class _Tp1> struct rebind {
     typedef __allocator<_Tp1, _Alloc> other;
   };
 };
 
 template <class _Tp, class _Alloc>
 inline bool operator==(const __allocator<_Tp, _Alloc>& __a1,
                        const __allocator<_Tp, _Alloc>& __a2)
 {
   return __a1.__underlying_alloc == __a2.__underlying_alloc;
 }
 
 template <class _Tp, class _Alloc>
 inline bool operator!=(const __allocator<_Tp, _Alloc>& __a1,
                        const __allocator<_Tp, _Alloc>& __a2)
 {
   return __a1.__underlying_alloc != __a2.__underlying_alloc;
 }
 
 
 
 
 
 
 
 template <int inst>
 inline bool operator==(const __malloc_alloc_template<inst>&,
                        const __malloc_alloc_template<inst>&)
 {
   return true;
 }
 
 template <int __inst>
 inline bool operator!=(const __malloc_alloc_template<__inst>&,
                        const __malloc_alloc_template<__inst>&)
 {
   return false;
 }
 
 template <class _Alloc>
 inline bool operator==(const __debug_alloc<_Alloc>&,
                        const __debug_alloc<_Alloc>&) {
   return true;
 }
 
 template <class _Alloc>
 inline bool operator!=(const __debug_alloc<_Alloc>&,
                        const __debug_alloc<_Alloc>&) {
   return false;
 }
 # 840 "/usr/include/c++/3.2/bits/stl_alloc.h" 3
 template <class _Tp, class _Allocator>
 struct _Alloc_traits
 {
   static const bool _S_instanceless = false;
   typedef typename _Allocator::template rebind<_Tp>::other allocator_type;
 };
 
 template <class _Tp, class _Allocator>
 const bool _Alloc_traits<_Tp, _Allocator>::_S_instanceless;
 
 
 template <class _Tp, class _Tp1>
 struct _Alloc_traits<_Tp, allocator<_Tp1> >
 {
   static const bool _S_instanceless = true;
   typedef __simple_alloc<_Tp, __alloc> _Alloc_type;
   typedef allocator<_Tp> allocator_type;
 };
 
 
 
 
 template <class _Tp, int __inst>
 struct _Alloc_traits<_Tp, __malloc_alloc_template<__inst> >
 {
   static const bool _S_instanceless = true;
   typedef __simple_alloc<_Tp, __malloc_alloc_template<__inst> > _Alloc_type;
   typedef __allocator<_Tp, __malloc_alloc_template<__inst> > allocator_type;
 };
 
 
 template <class _Tp, bool __threads, int __inst>
 struct _Alloc_traits<_Tp, __default_alloc_template<__threads, __inst> >
 {
   static const bool _S_instanceless = true;
   typedef __simple_alloc<_Tp, __default_alloc_template<__threads, __inst> >
           _Alloc_type;
   typedef __allocator<_Tp, __default_alloc_template<__threads, __inst> >
           allocator_type;
 };
 
 
 template <class _Tp, class _Alloc>
 struct _Alloc_traits<_Tp, __debug_alloc<_Alloc> >
 {
   static const bool _S_instanceless = true;
   typedef __simple_alloc<_Tp, __debug_alloc<_Alloc> > _Alloc_type;
   typedef __allocator<_Tp, __debug_alloc<_Alloc> > allocator_type;
 };
 
 
 
 
 template <class _Tp, class _Tp1, int __inst>
 struct _Alloc_traits<_Tp,
                      __allocator<_Tp1, __malloc_alloc_template<__inst> > >
 {
   static const bool _S_instanceless = true;
   typedef __simple_alloc<_Tp, __malloc_alloc_template<__inst> > _Alloc_type;
   typedef __allocator<_Tp, __malloc_alloc_template<__inst> > allocator_type;
 };
 
 
 template <class _Tp, class _Tp1, bool __thr, int __inst>
 struct _Alloc_traits<_Tp,
                       __allocator<_Tp1,
                                   __default_alloc_template<__thr, __inst> > >
 {
   static const bool _S_instanceless = true;
   typedef __simple_alloc<_Tp, __default_alloc_template<__thr,__inst> >
           _Alloc_type;
   typedef __allocator<_Tp, __default_alloc_template<__thr,__inst> >
           allocator_type;
 };
 
 
 template <class _Tp, class _Tp1, class _Alloc>
 struct _Alloc_traits<_Tp, __allocator<_Tp1, __debug_alloc<_Alloc> > >
 {
   static const bool _S_instanceless = true;
   typedef __simple_alloc<_Tp, __debug_alloc<_Alloc> > _Alloc_type;
   typedef __allocator<_Tp, __debug_alloc<_Alloc> > allocator_type;
 };
 
 
 
 
 
   extern template class allocator<char>;
   extern template class allocator<wchar_t>;
 
 
 
   extern template class __default_alloc_template<true, 0>;
 
 }
 # 56 "/usr/include/c++/3.2/memory" 2 3
 # 1 "/usr/include/c++/3.2/bits/stl_construct.h" 1 3
 # 67 "/usr/include/c++/3.2/bits/stl_construct.h" 3
 namespace std
 {
 
 
 
 
 
 
   template <class _T1, class _T2>
     inline void
     _Construct(_T1* __p, const _T2& __value)
     { new (static_cast<void*>(__p)) _T1(__value); }
 
 
 
 
 
 
 
   template <class _T1>
     inline void
     _Construct(_T1* __p)
     { new (static_cast<void*>(__p)) _T1(); }
 # 98 "/usr/include/c++/3.2/bits/stl_construct.h" 3
   template <class _ForwardIterator>
     inline void
     __destroy_aux(_ForwardIterator __first, _ForwardIterator __last, __false_type)
     { for ( ; __first != __last; ++__first) _Destroy(&*__first); }
 # 112 "/usr/include/c++/3.2/bits/stl_construct.h" 3
   template <class _ForwardIterator>
     inline void
     __destroy_aux(_ForwardIterator, _ForwardIterator, __true_type)
     { }
 
 
 
 
 
 
   template <class _Tp>
     inline void
     _Destroy(_Tp* __pointer)
     { __pointer->~_Tp(); }
 # 134 "/usr/include/c++/3.2/bits/stl_construct.h" 3
   template <class _ForwardIterator>
     inline void
     _Destroy(_ForwardIterator __first, _ForwardIterator __last)
     {
       typedef typename iterator_traits<_ForwardIterator>::value_type
                        _Value_type;
       typedef typename __type_traits<_Value_type>::has_trivial_destructor
                        _Has_trivial_destructor;
 
       __destroy_aux(__first, __last, _Has_trivial_destructor());
     }
 }
 # 57 "/usr/include/c++/3.2/memory" 2 3
 
 # 1 "/usr/include/c++/3.2/bits/stl_uninitialized.h" 1 3
 # 66 "/usr/include/c++/3.2/bits/stl_uninitialized.h" 3
 namespace std
 {
 
 
 
   template<typename _InputIter, typename _ForwardIter>
     inline _ForwardIter
     __uninitialized_copy_aux(_InputIter __first, _InputIter __last,
                              _ForwardIter __result,
                              __true_type)
     { return copy(__first, __last, __result); }
 
   template<typename _InputIter, typename _ForwardIter>
     _ForwardIter
     __uninitialized_copy_aux(_InputIter __first, _InputIter __last,
                              _ForwardIter __result,
                              __false_type)
     {
       _ForwardIter __cur = __result;
       try {
         for ( ; __first != __last; ++__first, ++__cur)
           _Construct(&*__cur, *__first);
         return __cur;
       }
       catch(...)
         {
           _Destroy(__result, __cur);
           throw;
         }
     }
 # 106 "/usr/include/c++/3.2/bits/stl_uninitialized.h" 3
   template<typename _InputIter, typename _ForwardIter>
     inline _ForwardIter
     uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result)
     {
       typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
       typedef typename __type_traits<_ValueType>::is_POD_type _Is_POD;
       return __uninitialized_copy_aux(__first, __last, __result, _Is_POD());
     }
 
   inline char*
   uninitialized_copy(const char* __first, const char* __last, char* __result)
   {
     memmove(__result, __first, __last - __first);
     return __result + (__last - __first);
   }
 
   inline wchar_t*
   uninitialized_copy(const wchar_t* __first, const wchar_t* __last,
                      wchar_t* __result)
   {
     memmove(__result, __first, sizeof(wchar_t) * (__last - __first));
     return __result + (__last - __first);
   }
 
 
 
   template<typename _ForwardIter, typename _Tp>
     inline void
     __uninitialized_fill_aux(_ForwardIter __first, _ForwardIter __last,
                              const _Tp& __x, __true_type)
     { fill(__first, __last, __x); }
 
   template<typename _ForwardIter, typename _Tp>
     void
     __uninitialized_fill_aux(_ForwardIter __first, _ForwardIter __last,
                              const _Tp& __x, __false_type)
     {
       _ForwardIter __cur = __first;
       try {
         for ( ; __cur != __last; ++__cur)
           _Construct(&*__cur, __x);
       }
       catch(...)
         {
           _Destroy(__first, __cur);
           throw;
         }
     }
 # 164 "/usr/include/c++/3.2/bits/stl_uninitialized.h" 3
   template<typename _ForwardIter, typename _Tp>
     inline void
     uninitialized_fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __x)
     {
       typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
       typedef typename __type_traits<_ValueType>::is_POD_type _Is_POD;
       __uninitialized_fill_aux(__first, __last, __x, _Is_POD());
     }
 
 
 
   template<typename _ForwardIter, typename _Size, typename _Tp>
     inline _ForwardIter
     __uninitialized_fill_n_aux(_ForwardIter __first, _Size __n,
                                const _Tp& __x, __true_type)
     {
       return fill_n(__first, __n, __x);
     }
 
   template<typename _ForwardIter, typename _Size, typename _Tp>
     _ForwardIter
     __uninitialized_fill_n_aux(_ForwardIter __first, _Size __n,
                                const _Tp& __x, __false_type)
     {
       _ForwardIter __cur = __first;
       try {
         for ( ; __n > 0; --__n, ++__cur)
           _Construct(&*__cur, __x);
         return __cur;
       }
       catch(...)
         {
           _Destroy(__first, __cur);
           throw;
         }
     }
 # 210 "/usr/include/c++/3.2/bits/stl_uninitialized.h" 3
   template<typename _ForwardIter, typename _Size, typename _Tp>
     inline _ForwardIter
     uninitialized_fill_n(_ForwardIter __first, _Size __n, const _Tp& __x)
     {
       typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
       typedef typename __type_traits<_ValueType>::is_POD_type _Is_POD;
       return __uninitialized_fill_n_aux(__first, __n, __x, _Is_POD());
     }
 # 227 "/usr/include/c++/3.2/bits/stl_uninitialized.h" 3
   template<typename _InputIter1, typename _InputIter2, typename _ForwardIter>
     inline _ForwardIter
     __uninitialized_copy_copy(_InputIter1 __first1, _InputIter1 __last1,
                               _InputIter2 __first2, _InputIter2 __last2,
                               _ForwardIter __result)
     {
       _ForwardIter __mid = uninitialized_copy(__first1, __last1, __result);
       try {
         return uninitialized_copy(__first2, __last2, __mid);
       }
       catch(...)
         {
           _Destroy(__result, __mid);
           throw;
         }
     }
 
 
 
 
   template<typename _ForwardIter, typename _Tp, typename _InputIter>
     inline _ForwardIter
     __uninitialized_fill_copy(_ForwardIter __result, _ForwardIter __mid,
                               const _Tp& __x,
                               _InputIter __first, _InputIter __last)
     {
       uninitialized_fill(__result, __mid, __x);
       try {
         return uninitialized_copy(__first, __last, __mid);
       }
       catch(...)
         {
           _Destroy(__result, __mid);
           throw;
         }
     }
 
 
 
 
   template<typename _InputIter, typename _ForwardIter, typename _Tp>
     inline void
     __uninitialized_copy_fill(_InputIter __first1, _InputIter __last1,
                               _ForwardIter __first2, _ForwardIter __last2,
                               const _Tp& __x)
     {
       _ForwardIter __mid2 = uninitialized_copy(__first1, __last1, __first2);
       try {
         uninitialized_fill(__mid2, __last2, __x);
       }
       catch(...)
         {
           _Destroy(__first2, __mid2);
           throw;
         }
     }
 
 }
 # 59 "/usr/include/c++/3.2/memory" 2 3
 # 1 "/usr/include/c++/3.2/bits/stl_raw_storage_iter.h" 1 3
 # 64 "/usr/include/c++/3.2/bits/stl_raw_storage_iter.h" 3
 namespace std
 {
 
 
 
 
   template <class _ForwardIterator, class _Tp>
   class raw_storage_iterator
     : public iterator<output_iterator_tag, void, void, void, void>
     {
     protected:
       _ForwardIterator _M_iter;
 
     public:
       explicit
       raw_storage_iterator(_ForwardIterator __x) : _M_iter(__x) {}
 
       raw_storage_iterator&
       operator*() { return *this; }
 
       raw_storage_iterator&
       operator=(const _Tp& __element)
       {
         _Construct(&*_M_iter, __element);
         return *this;
       }
 
       raw_storage_iterator<_ForwardIterator, _Tp>&
       operator++()
       {
         ++_M_iter;
         return *this;
       }
 
       raw_storage_iterator<_ForwardIterator, _Tp>
       operator++(int)
       {
         raw_storage_iterator<_ForwardIterator, _Tp> __tmp = *this;
         ++_M_iter;
         return __tmp;
       }
     };
 }
 # 60 "/usr/include/c++/3.2/memory" 2 3
 
 
 
 
 namespace std
 {
 # 74 "/usr/include/c++/3.2/memory" 3
 template <typename _Tp>
 pair<_Tp*, ptrdiff_t>
 __get_temporary_buffer(ptrdiff_t __len, _Tp*)
 {
   if (__len > ptrdiff_t(2147483647 / sizeof(_Tp)))
     __len = 2147483647 / sizeof(_Tp);
 
   while (__len > 0) {
     _Tp* __tmp = (_Tp*) std::malloc((std::size_t)__len * sizeof(_Tp));
     if (__tmp != 0)
       return pair<_Tp*, ptrdiff_t>(__tmp, __len);
     __len /= 2;
   }
 
   return pair<_Tp*, ptrdiff_t>((_Tp*)0, 0);
 }
 # 106 "/usr/include/c++/3.2/memory" 3
 template<typename _Tp>
   inline pair<_Tp*,ptrdiff_t>
   get_temporary_buffer(ptrdiff_t __len)
   {
     return __get_temporary_buffer(__len, (_Tp*) 0);
   }
 # 120 "/usr/include/c++/3.2/memory" 3
 template<typename _Tp>
   void
   return_temporary_buffer(_Tp* __p)
   {
     std::free(__p);
   }
 # 135 "/usr/include/c++/3.2/memory" 3
 template<typename _Tp1>
   struct auto_ptr_ref
 {
    _Tp1* _M_ptr;
 
    explicit
    auto_ptr_ref(_Tp1* __p)
    : _M_ptr(__p) {}
 };
 # 175 "/usr/include/c++/3.2/memory" 3
 template<typename _Tp>
   class auto_ptr
 {
 private:
   _Tp* _M_ptr;
 
 public:
 
   typedef _Tp element_type;
 
 
 
 
 
 
 
   explicit
   auto_ptr(element_type* __p = 0) throw()
   : _M_ptr(__p) { }
 # 202 "/usr/include/c++/3.2/memory" 3
   auto_ptr(auto_ptr& __a) throw()
   : _M_ptr(__a.release()) { }
 # 214 "/usr/include/c++/3.2/memory" 3
   template<typename _Tp1>
     auto_ptr(auto_ptr<_Tp1>& __a) throw()
     : _M_ptr(__a.release()) { }
 # 226 "/usr/include/c++/3.2/memory" 3
   auto_ptr&
   operator=(auto_ptr& __a) throw()
     {
       reset(__a.release());
       return *this;
     }
 # 243 "/usr/include/c++/3.2/memory" 3
   template <typename _Tp1>
     auto_ptr&
     operator=(auto_ptr<_Tp1>& __a) throw()
     {
       reset(__a.release());
       return *this;
     }
 # 263 "/usr/include/c++/3.2/memory" 3
   ~auto_ptr() { delete _M_ptr; }
 # 273 "/usr/include/c++/3.2/memory" 3
   element_type&
   operator*() const throw() { return *_M_ptr; }
 
 
 
 
 
 
 
   element_type*
   operator->() const throw() { return _M_ptr; }
 # 295 "/usr/include/c++/3.2/memory" 3
   element_type*
   get() const throw() { return _M_ptr; }
 # 309 "/usr/include/c++/3.2/memory" 3
   element_type*
   release() throw()
     {
       element_type* __tmp = _M_ptr;
       _M_ptr = 0;
       return __tmp;
     }
 # 324 "/usr/include/c++/3.2/memory" 3
   void
   reset(element_type* __p = 0) throw()
     {
       if (__p != _M_ptr)
         {
           delete _M_ptr;
           _M_ptr = __p;
         }
     }
 # 345 "/usr/include/c++/3.2/memory" 3
   auto_ptr(auto_ptr_ref<element_type> __ref) throw()
     : _M_ptr(__ref._M_ptr) {}
 
   auto_ptr&
   operator=(auto_ptr_ref<element_type> __ref) throw()
     {
       if (__ref._M_ptr != this->get())
         {
           delete _M_ptr;
           _M_ptr = __ref._M_ptr;
         }
       return *this;
     }
 
   template<typename _Tp1>
     operator auto_ptr_ref<_Tp1>() throw()
       { return auto_ptr_ref<_Tp1>(this->release()); }
 
   template<typename _Tp1>
     operator auto_ptr<_Tp1>() throw()
       { return auto_ptr<_Tp1>(this->release()); }
 
 };
 
 }
 # 49 "/usr/include/c++/3.2/string" 2 3
 
 
 
 # 1 "/usr/include/c++/3.2/bits/stl_function.h" 1 3
 # 64 "/usr/include/c++/3.2/bits/stl_function.h" 3
 namespace std
 {
 # 101 "/usr/include/c++/3.2/bits/stl_function.h" 3
 template <class _Arg, class _Result>
 struct unary_function {
   typedef _Arg argument_type;
   typedef _Result result_type;
 };
 
 
 
 
 template <class _Arg1, class _Arg2, class _Result>
 struct binary_function {
   typedef _Arg1 first_argument_type;
   typedef _Arg2 second_argument_type;
   typedef _Result result_type;
 };
 # 127 "/usr/include/c++/3.2/bits/stl_function.h" 3
 template <class _Tp>
 struct plus : public binary_function<_Tp,_Tp,_Tp> {
   _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x + __y; }
 };
 
 
 template <class _Tp>
 struct minus : public binary_function<_Tp,_Tp,_Tp> {
   _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x - __y; }
 };
 
 
 template <class _Tp>
 struct multiplies : public binary_function<_Tp,_Tp,_Tp> {
   _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x * __y; }
 };
 
 
 template <class _Tp>
 struct divides : public binary_function<_Tp,_Tp,_Tp> {
   _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x / __y; }
 };
 
 
 template <class _Tp>
 struct modulus : public binary_function<_Tp,_Tp,_Tp>
 {
   _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x % __y; }
 };
 
 
 template <class _Tp>
 struct negate : public unary_function<_Tp,_Tp>
 {
   _Tp operator()(const _Tp& __x) const { return -__x; }
 };
 # 173 "/usr/include/c++/3.2/bits/stl_function.h" 3
 template <class _Tp>
 struct equal_to : public binary_function<_Tp,_Tp,bool>
 {
   bool operator()(const _Tp& __x, const _Tp& __y) const { return __x == __y; }
 };
 
 
 template <class _Tp>
 struct not_equal_to : public binary_function<_Tp,_Tp,bool>
 {
   bool operator()(const _Tp& __x, const _Tp& __y) const { return __x != __y; }
 };
 
 
 template <class _Tp>
 struct greater : public binary_function<_Tp,_Tp,bool>
 {
   bool operator()(const _Tp& __x, const _Tp& __y) const { return __x > __y; }
 };
 
 
 template <class _Tp>
 struct less : public binary_function<_Tp,_Tp,bool>
 {
   bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; }
 };
 
 
 template <class _Tp>
 struct greater_equal : public binary_function<_Tp,_Tp,bool>
 {
   bool operator()(const _Tp& __x, const _Tp& __y) const { return __x >= __y; }
 };
 
 
 template <class _Tp>
 struct less_equal : public binary_function<_Tp,_Tp,bool>
 {
   bool operator()(const _Tp& __x, const _Tp& __y) const { return __x <= __y; }
 };
 # 222 "/usr/include/c++/3.2/bits/stl_function.h" 3
 template <class _Tp>
 struct logical_and : public binary_function<_Tp,_Tp,bool>
 {
   bool operator()(const _Tp& __x, const _Tp& __y) const { return __x && __y; }
 };
 
 
 template <class _Tp>
 struct logical_or : public binary_function<_Tp,_Tp,bool>
 {
   bool operator()(const _Tp& __x, const _Tp& __y) const { return __x || __y; }
 };
 
 
 template <class _Tp>
 struct logical_not : public unary_function<_Tp,bool>
 {
   bool operator()(const _Tp& __x) const { return !__x; }
 };
 # 271 "/usr/include/c++/3.2/bits/stl_function.h" 3
 template <class _Predicate>
 class unary_negate
   : public unary_function<typename _Predicate::argument_type, bool> {
 protected:
   _Predicate _M_pred;
 public:
   explicit unary_negate(const _Predicate& __x) : _M_pred(__x) {}
   bool operator()(const typename _Predicate::argument_type& __x) const {
     return !_M_pred(__x);
   }
 };
 
 
 template <class _Predicate>
 inline unary_negate<_Predicate>
 not1(const _Predicate& __pred)
 {
   return unary_negate<_Predicate>(__pred);
 }
 
 
 template <class _Predicate>
 class binary_negate
   : public binary_function<typename _Predicate::first_argument_type,
                            typename _Predicate::second_argument_type,
                            bool> {
 protected:
   _Predicate _M_pred;
 public:
   explicit binary_negate(const _Predicate& __x) : _M_pred(__x) {}
   bool operator()(const typename _Predicate::first_argument_type& __x,
                   const typename _Predicate::second_argument_type& __y) const
   {
     return !_M_pred(__x, __y);
   }
 };
 
 
 template <class _Predicate>
 inline binary_negate<_Predicate>
 not2(const _Predicate& __pred)
 {
   return binary_negate<_Predicate>(__pred);
 }
 # 349 "/usr/include/c++/3.2/bits/stl_function.h" 3
 template <class _Operation>
 class binder1st
   : public unary_function<typename _Operation::second_argument_type,
                           typename _Operation::result_type> {
 protected:
   _Operation op;
   typename _Operation::first_argument_type value;
 public:
   binder1st(const _Operation& __x,
             const typename _Operation::first_argument_type& __y)
       : op(__x), value(__y) {}
   typename _Operation::result_type
   operator()(const typename _Operation::second_argument_type& __x) const {
     return op(value, __x);
   }
 
 
   typename _Operation::result_type
   operator()(typename _Operation::second_argument_type& __x) const {
     return op(value, __x);
   }
 
 };
 
 
 template <class _Operation, class _Tp>
 inline binder1st<_Operation>
 bind1st(const _Operation& __fn, const _Tp& __x)
 {
   typedef typename _Operation::first_argument_type _Arg1_type;
   return binder1st<_Operation>(__fn, _Arg1_type(__x));
 }
 
 
 template <class _Operation>
 class binder2nd
   : public unary_function<typename _Operation::first_argument_type,
                           typename _Operation::result_type> {
 protected:
   _Operation op;
   typename _Operation::second_argument_type value;
 public:
   binder2nd(const _Operation& __x,
             const typename _Operation::second_argument_type& __y)
       : op(__x), value(__y) {}
   typename _Operation::result_type
   operator()(const typename _Operation::first_argument_type& __x) const {
     return op(__x, value);
   }
 
 
   typename _Operation::result_type
   operator()(typename _Operation::first_argument_type& __x) const {
     return op(__x, value);
   }
 
 };
 
 
 template <class _Operation, class _Tp>
 inline binder2nd<_Operation>
 bind2nd(const _Operation& __fn, const _Tp& __x)
 {
   typedef typename _Operation::second_argument_type _Arg2_type;
   return binder2nd<_Operation>(__fn, _Arg2_type(__x));
 }
 # 438 "/usr/include/c++/3.2/bits/stl_function.h" 3
 template <class _Arg, class _Result>
 class pointer_to_unary_function : public unary_function<_Arg, _Result> {
 protected:
   _Result (*_M_ptr)(_Arg);
 public:
   pointer_to_unary_function() {}
   explicit pointer_to_unary_function(_Result (*__x)(_Arg)) : _M_ptr(__x) {}
   _Result operator()(_Arg __x) const { return _M_ptr(__x); }
 };
 
 
 template <class _Arg, class _Result>
 inline pointer_to_unary_function<_Arg, _Result> ptr_fun(_Result (*__x)(_Arg))
 {
   return pointer_to_unary_function<_Arg, _Result>(__x);
 }
 
 
 template <class _Arg1, class _Arg2, class _Result>
 class pointer_to_binary_function :
   public binary_function<_Arg1,_Arg2,_Result> {
 protected:
     _Result (*_M_ptr)(_Arg1, _Arg2);
 public:
     pointer_to_binary_function() {}
     explicit pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
       : _M_ptr(__x) {}
     _Result operator()(_Arg1 __x, _Arg2 __y) const {
       return _M_ptr(__x, __y);
     }
 };
 
 
 template <class _Arg1, class _Arg2, class _Result>
 inline pointer_to_binary_function<_Arg1,_Arg2,_Result>
 ptr_fun(_Result (*__x)(_Arg1, _Arg2)) {
   return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__x);
 }
 
 
 template <class _Tp>
 struct _Identity : public unary_function<_Tp,_Tp> {
   _Tp& operator()(_Tp& __x) const { return __x; }
   const _Tp& operator()(const _Tp& __x) const { return __x; }
 };
 
 template <class _Pair>
 struct _Select1st : public unary_function<_Pair, typename _Pair::first_type> {
   typename _Pair::first_type& operator()(_Pair& __x) const {
     return __x.first;
   }
   const typename _Pair::first_type& operator()(const _Pair& __x) const {
     return __x.first;
   }
 };
 
 template <class _Pair>
 struct _Select2nd : public unary_function<_Pair, typename _Pair::second_type>
 {
   typename _Pair::second_type& operator()(_Pair& __x) const {
     return __x.second;
   }
   const typename _Pair::second_type& operator()(const _Pair& __x) const {
     return __x.second;
   }
 };
 # 528 "/usr/include/c++/3.2/bits/stl_function.h" 3
 template <class _Ret, class _Tp>
 class mem_fun_t : public unary_function<_Tp*,_Ret> {
 public:
   explicit mem_fun_t(_Ret (_Tp::*__pf)()) : _M_f(__pf) {}
   _Ret operator()(_Tp* __p) const { return (__p->*_M_f)(); }
 private:
   _Ret (_Tp::*_M_f)();
 };
 
 
 template <class _Ret, class _Tp>
 class const_mem_fun_t : public unary_function<const _Tp*,_Ret> {
 public:
   explicit const_mem_fun_t(_Ret (_Tp::*__pf)() const) : _M_f(__pf) {}
   _Ret operator()(const _Tp* __p) const { return (__p->*_M_f)(); }
 private:
   _Ret (_Tp::*_M_f)() const;
 };
 
 
 template <class _Ret, class _Tp>
 class mem_fun_ref_t : public unary_function<_Tp,_Ret> {
 public:
   explicit mem_fun_ref_t(_Ret (_Tp::*__pf)()) : _M_f(__pf) {}
   _Ret operator()(_Tp& __r) const { return (__r.*_M_f)(); }
 private:
   _Ret (_Tp::*_M_f)();
 };
 
 
 template <class _Ret, class _Tp>
 class const_mem_fun_ref_t : public unary_function<_Tp,_Ret> {
 public:
   explicit const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const) : _M_f(__pf) {}
   _Ret operator()(const _Tp& __r) const { return (__r.*_M_f)(); }
 private:
   _Ret (_Tp::*_M_f)() const;
 };
 
 
 template <class _Ret, class _Tp, class _Arg>
 class mem_fun1_t : public binary_function<_Tp*,_Arg,_Ret> {
 public:
   explicit mem_fun1_t(_Ret (_Tp::*__pf)(_Arg)) : _M_f(__pf) {}
   _Ret operator()(_Tp* __p, _Arg __x) const { return (__p->*_M_f)(__x); }
 private:
   _Ret (_Tp::*_M_f)(_Arg);
 };
 
 
 template <class _Ret, class _Tp, class _Arg>
 class const_mem_fun1_t : public binary_function<const _Tp*,_Arg,_Ret> {
 public:
   explicit const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const) : _M_f(__pf) {}
   _Ret operator()(const _Tp* __p, _Arg __x) const
     { return (__p->*_M_f)(__x); }
 private:
   _Ret (_Tp::*_M_f)(_Arg) const;
 };
 
 
 template <class _Ret, class _Tp, class _Arg>
 class mem_fun1_ref_t : public binary_function<_Tp,_Arg,_Ret> {
 public:
   explicit mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg)) : _M_f(__pf) {}
   _Ret operator()(_Tp& __r, _Arg __x) const { return (__r.*_M_f)(__x); }
 private:
   _Ret (_Tp::*_M_f)(_Arg);
 };
 
 
 template <class _Ret, class _Tp, class _Arg>
 class const_mem_fun1_ref_t : public binary_function<_Tp,_Arg,_Ret> {
 public:
   explicit const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const) : _M_f(__pf) {}
   _Ret operator()(const _Tp& __r, _Arg __x) const { return (__r.*_M_f)(__x); }
 private:
   _Ret (_Tp::*_M_f)(_Arg) const;
 };
 
 
 template <class _Tp>
 class mem_fun_t<void, _Tp> : public unary_function<_Tp*,void> {
 public:
   explicit mem_fun_t(void (_Tp::*__pf)()) : _M_f(__pf) {}
   void operator()(_Tp* __p) const { (__p->*_M_f)(); }
 private:
   void (_Tp::*_M_f)();
 };
 
 
 template <class _Tp>
 class const_mem_fun_t<void, _Tp> : public unary_function<const _Tp*,void> {
 public:
   explicit const_mem_fun_t(void (_Tp::*__pf)() const) : _M_f(__pf) {}
   void operator()(const _Tp* __p) const { (__p->*_M_f)(); }
 private:
   void (_Tp::*_M_f)() const;
 };
 
 
 template <class _Tp>
 class mem_fun_ref_t<void, _Tp> : public unary_function<_Tp,void> {
 public:
   explicit mem_fun_ref_t(void (_Tp::*__pf)()) : _M_f(__pf) {}
   void operator()(_Tp& __r) const { (__r.*_M_f)(); }
 private:
   void (_Tp::*_M_f)();
 };
 
 
 template <class _Tp>
 class const_mem_fun_ref_t<void, _Tp> : public unary_function<_Tp,void> {
 public:
   explicit const_mem_fun_ref_t(void (_Tp::*__pf)() const) : _M_f(__pf) {}
   void operator()(const _Tp& __r) const { (__r.*_M_f)(); }
 private:
   void (_Tp::*_M_f)() const;
 };
 
 
 template <class _Tp, class _Arg>
 class mem_fun1_t<void, _Tp, _Arg> : public binary_function<_Tp*,_Arg,void> {
 public:
   explicit mem_fun1_t(void (_Tp::*__pf)(_Arg)) : _M_f(__pf) {}
   void operator()(_Tp* __p, _Arg __x) const { (__p->*_M_f)(__x); }
 private:
   void (_Tp::*_M_f)(_Arg);
 };
 
 
 template <class _Tp, class _Arg>
 class const_mem_fun1_t<void, _Tp, _Arg>
   : public binary_function<const _Tp*,_Arg,void> {
 public:
   explicit const_mem_fun1_t(void (_Tp::*__pf)(_Arg) const) : _M_f(__pf) {}
   void operator()(const _Tp* __p, _Arg __x) const { (__p->*_M_f)(__x); }
 private:
   void (_Tp::*_M_f)(_Arg) const;
 };
 
 
 template <class _Tp, class _Arg>
 class mem_fun1_ref_t<void, _Tp, _Arg>
   : public binary_function<_Tp,_Arg,void> {
 public:
   explicit mem_fun1_ref_t(void (_Tp::*__pf)(_Arg)) : _M_f(__pf) {}
   void operator()(_Tp& __r, _Arg __x) const { (__r.*_M_f)(__x); }
 private:
   void (_Tp::*_M_f)(_Arg);
 };
 
 
 template <class _Tp, class _Arg>
 class const_mem_fun1_ref_t<void, _Tp, _Arg>
   : public binary_function<_Tp,_Arg,void> {
 public:
   explicit const_mem_fun1_ref_t(void (_Tp::*__pf)(_Arg) const) : _M_f(__pf) {}
   void operator()(const _Tp& __r, _Arg __x) const { (__r.*_M_f)(__x); }
 private:
   void (_Tp::*_M_f)(_Arg) const;
 };
 
 
 
 
 
 template <class _Ret, class _Tp>
 inline mem_fun_t<_Ret,_Tp> mem_fun(_Ret (_Tp::*__f)())
   { return mem_fun_t<_Ret,_Tp>(__f); }
 
 template <class _Ret, class _Tp>
 inline const_mem_fun_t<_Ret,_Tp> mem_fun(_Ret (_Tp::*__f)() const)
   { return const_mem_fun_t<_Ret,_Tp>(__f); }
 
 template <class _Ret, class _Tp>
 inline mem_fun_ref_t<_Ret,_Tp> mem_fun_ref(_Ret (_Tp::*__f)())
   { return mem_fun_ref_t<_Ret,_Tp>(__f); }
 
 template <class _Ret, class _Tp>
 inline const_mem_fun_ref_t<_Ret,_Tp> mem_fun_ref(_Ret (_Tp::*__f)() const)
   { return const_mem_fun_ref_t<_Ret,_Tp>(__f); }
 
 template <class _Ret, class _Tp, class _Arg>
 inline mem_fun1_t<_Ret,_Tp,_Arg> mem_fun(_Ret (_Tp::*__f)(_Arg))
   { return mem_fun1_t<_Ret,_Tp,_Arg>(__f); }
 
 template <class _Ret, class _Tp, class _Arg>
 inline const_mem_fun1_t<_Ret,_Tp,_Arg> mem_fun(_Ret (_Tp::*__f)(_Arg) const)
   { return const_mem_fun1_t<_Ret,_Tp,_Arg>(__f); }
 
 template <class _Ret, class _Tp, class _Arg>
 inline mem_fun1_ref_t<_Ret,_Tp,_Arg> mem_fun_ref(_Ret (_Tp::*__f)(_Arg))
   { return mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f); }
 
 template <class _Ret, class _Tp, class _Arg>
 inline const_mem_fun1_ref_t<_Ret,_Tp,_Arg>
 mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const)
   { return const_mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f); }
 
 
 
 }
 # 53 "/usr/include/c++/3.2/string" 2 3
 # 1 "/usr/include/c++/3.2/bits/basic_string.h" 1 3
 # 44 "/usr/include/c++/3.2/bits/basic_string.h" 3
 
 # 1 "/usr/include/c++/3.2/i386-linux/bits/atomicity.h" 1 3
 # 33 "/usr/include/c++/3.2/i386-linux/bits/atomicity.h" 3
 typedef int _Atomic_word;
 
 static inline _Atomic_word
 __attribute__ ((__unused__))
 __exchange_and_add (volatile _Atomic_word *__mem, int __val)
 {
   register _Atomic_word __result;
   __asm__ __volatile__ ("lock; xaddl %0,%2"
                         : "=r" (__result)
                         : "0" (__val), "m" (*__mem)
                         : "memory");
   return __result;
 }
 
 static inline void
 __attribute__ ((__unused__))
 __atomic_add (volatile _Atomic_word* __mem, int __val)
 {
   __asm__ __volatile__ ("lock; addl %0,%1"
                         : : "ir" (__val), "m" (*__mem) : "memory");
 }
 # 46 "/usr/include/c++/3.2/bits/basic_string.h" 2 3
 
 namespace std
 {
 # 88 "/usr/include/c++/3.2/bits/basic_string.h" 3
   template<typename _CharT, typename _Traits, typename _Alloc>
     class basic_string
     {
 
     public:
       typedef _Traits traits_type;
       typedef typename _Traits::char_type value_type;
       typedef _Alloc allocator_type;
       typedef typename _Alloc::size_type size_type;
       typedef typename _Alloc::difference_type difference_type;
       typedef typename _Alloc::reference reference;
       typedef typename _Alloc::const_reference const_reference;
       typedef typename _Alloc::pointer pointer;
       typedef typename _Alloc::const_pointer const_pointer;
       typedef __gnu_cxx::__normal_iterator<pointer, basic_string> iterator;
       typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
                                                             const_iterator;
       typedef reverse_iterator<const_iterator> const_reverse_iterator;
       typedef reverse_iterator<iterator> reverse_iterator;
 
     private:
 # 123 "/usr/include/c++/3.2/bits/basic_string.h" 3
       struct _Rep
       {
 
         typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
 # 141 "/usr/include/c++/3.2/bits/basic_string.h" 3
         static const size_type _S_max_size;
         static const _CharT _S_terminal;
 
         size_type _M_length;
         size_type _M_capacity;
         _Atomic_word _M_references;
 
         bool
         _M_is_leaked() const
         { return _M_references < 0; }
 
         bool
         _M_is_shared() const
         { return _M_references > 0; }
 
         void
         _M_set_leaked()
         { _M_references = -1; }
 
         void
         _M_set_sharable()
         { _M_references = 0; }
 
         _CharT*
         _M_refdata() throw()
         { return reinterpret_cast<_CharT*>(this + 1); }
 
         _CharT&
         operator[](size_t __s) throw()
         { return _M_refdata() [__s]; }
 
         _CharT*
         _M_grab(const _Alloc& __alloc1, const _Alloc& __alloc2)
         {
           return (!_M_is_leaked() && __alloc1 == __alloc2)
                   ? _M_refcopy() : _M_clone(__alloc1);
         }
 
 
         static _Rep*
         _S_create(size_t, const _Alloc&);
 
         void
         _M_dispose(const _Alloc& __a)
         {
           if (__exchange_and_add(&_M_references, -1) <= 0)
             _M_destroy(__a);
         }
 
         void
         _M_destroy(const _Alloc&) throw();
 
         _CharT*
         _M_refcopy() throw()
         {
           __atomic_add(&_M_references, 1);
           return _M_refdata();
         }
 
         _CharT*
         _M_clone(const _Alloc&, size_type __res = 0);
       };
 
 
       struct _Alloc_hider : _Alloc
       {
         _Alloc_hider(_CharT* __dat, const _Alloc& __a)
         : _Alloc(__a), _M_p(__dat) { }
 
         _CharT* _M_p;
       };
 
     public:
 
 
 
       static const size_type npos = static_cast<size_type>(-1);
 
     private:
 
       mutable _Alloc_hider _M_dataplus;
 
 
 
       static size_type _S_empty_rep_storage[(sizeof(_Rep) + sizeof(_CharT) + sizeof(size_type) - 1)/sizeof(size_type)];
 
       _CharT*
       _M_data() const
       { return _M_dataplus._M_p; }
 
       _CharT*
       _M_data(_CharT* __p)
       { return (_M_dataplus._M_p = __p); }
 
       _Rep*
       _M_rep() const
       { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
 
 
 
       iterator
       _M_ibegin() const { return iterator(_M_data()); }
 
       iterator
       _M_iend() const { return iterator(_M_data() + this->size()); }
 
       void
       _M_leak()
       {
         if (!_M_rep()->_M_is_leaked())
           _M_leak_hard();
       }
 
       iterator
       _M_check(size_type __pos) const
       {
         if (__pos > this->size())
           __throw_out_of_range("basic_string::_M_check");
         return _M_ibegin() + __pos;
       }
 
 
       iterator
       _M_fold(size_type __pos, size_type __off) const
       {
         bool __testoff = __off < this->size() - __pos;
         size_type __newoff = __testoff ? __off : this->size() - __pos;
         return (_M_ibegin() + __pos + __newoff);
       }
 
 
 
       template<class _Iterator>
         static void
         _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
         {
           for (; __k1 != __k2; ++__k1, ++__p)
             traits_type::assign(*__p, *__k1);
         }
 
       static void
       _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2)
       { _S_copy_chars(__p, __k1.base(), __k2.base()); }
 
       static void
       _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
       { _S_copy_chars(__p, __k1.base(), __k2.base()); }
 
       static void
       _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2)
       { traits_type::copy(__p, __k1, __k2 - __k1); }
 
       static void
       _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
       { traits_type::copy(__p, __k1, __k2 - __k1); }
 
       void
       _M_mutate(size_type __pos, size_type __len1, size_type __len2);
 
       void
       _M_leak_hard();
 
       static _Rep&
       _S_empty_rep()
       { return *reinterpret_cast<_Rep*>(&_S_empty_rep_storage); }
 
     public:
 
 
 
 
       inline
       basic_string();
 
       explicit
       basic_string(const _Alloc& __a);
 
 
       basic_string(const basic_string& __str);
       basic_string(const basic_string& __str, size_type __pos,
                    size_type __n = npos);
       basic_string(const basic_string& __str, size_type __pos,
                    size_type __n, const _Alloc& __a);
 
       basic_string(const _CharT* __s, size_type __n,
                    const _Alloc& __a = _Alloc());
       basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
       basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc());
 
       template<class _InputIterator>
         basic_string(_InputIterator __beg, _InputIterator __end,
                      const _Alloc& __a = _Alloc());
 
       ~basic_string()
       { _M_rep()->_M_dispose(this->get_allocator()); }
 
       basic_string&
       operator=(const basic_string& __str) { return this->assign(__str); }
 
       basic_string&
       operator=(const _CharT* __s) { return this->assign(__s); }
 
       basic_string&
       operator=(_CharT __c) { return this->assign(1, __c); }
 
 
       iterator
       begin()
       {
         _M_leak();
         return iterator(_M_data());
       }
 
       const_iterator
       begin() const
       { return const_iterator(_M_data()); }
 
       iterator
       end()
       {
          _M_leak();
          return iterator(_M_data() + this->size());
       }
 
       const_iterator
       end() const
       { return const_iterator(_M_data() + this->size()); }
 
       reverse_iterator
       rbegin()
       { return reverse_iterator(this->end()); }
 
       const_reverse_iterator
       rbegin() const
       { return const_reverse_iterator(this->end()); }
 
       reverse_iterator
       rend()
       { return reverse_iterator(this->begin()); }
 
       const_reverse_iterator
       rend() const
       { return const_reverse_iterator(this->begin()); }
 
     public:
 
       size_type
       size() const { return _M_rep()->_M_length; }
 
       size_type
       length() const { return _M_rep()->_M_length; }
 
       size_type
       max_size() const { return _Rep::_S_max_size; }
 
       void
       resize(size_type __n, _CharT __c);
 
       void
       resize(size_type __n) { this->resize(__n, _CharT()); }
 
       size_type
       capacity() const { return _M_rep()->_M_capacity; }
 
       void
       reserve(size_type __res_arg = 0);
 
       void
       clear() { _M_mutate(0, this->size(), 0); }
 
       bool
       empty() const { return this->size() == 0; }
 
 
       const_reference
       operator[] (size_type __pos) const
       { return _M_data()[__pos]; }
 
       reference
       operator[](size_type __pos)
       {
         _M_leak();
         return _M_data()[__pos];
       }
 
       const_reference
       at(size_type __n) const
       {
         if (__n >= this->size())
           __throw_out_of_range("basic_string::at");
         return _M_data()[__n];
       }
 
       reference
       at(size_type __n)
       {
         if (__n >= size())
           __throw_out_of_range("basic_string::at");
         _M_leak();
         return _M_data()[__n];
       }
 
 
       basic_string&
       operator+=(const basic_string& __str) { return this->append(__str); }
 
       basic_string&
       operator+=(const _CharT* __s) { return this->append(__s); }
 
       basic_string&
       operator+=(_CharT __c) { return this->append(size_type(1), __c); }
 
       basic_string&
       append(const basic_string& __str);
 
       basic_string&
       append(const basic_string& __str, size_type __pos, size_type __n);
 
       basic_string&
       append(const _CharT* __s, size_type __n);
 
       basic_string&
       append(const _CharT* __s)
       { return this->append(__s, traits_type::length(__s)); }
 
       basic_string&
       append(size_type __n, _CharT __c);
 
       template<class _InputIterator>
         basic_string&
         append(_InputIterator __first, _InputIterator __last)
         { return this->replace(_M_iend(), _M_iend(), __first, __last); }
 
       void
       push_back(_CharT __c)
       { this->replace(_M_iend(), _M_iend(), 1, __c); }
 
       basic_string&
       assign(const basic_string& __str);
 
       basic_string&
       assign(const basic_string& __str, size_type __pos, size_type __n)
       {
         const size_type __strsize = __str.size();
         if (__pos > __strsize)
           __throw_out_of_range("basic_string::assign");
         const bool __testn = __n < __strsize - __pos;
         const size_type __newsize = __testn ? __n : __strsize - __pos;
         return this->assign(__str._M_data() + __pos, __newsize);
       }
 
       basic_string&
       assign(const _CharT* __s, size_type __n)
       {
         if (__n > this->max_size())
           __throw_length_error("basic_string::assign");
         if (_M_rep()->_M_is_shared() || less<const _CharT*>()(__s, _M_data())
             || less<const _CharT*>()(_M_data() + this->size(), __s))
           return _M_replace_safe(_M_ibegin(), _M_iend(), __s, __s + __n);
         else
           {
 
             const size_type __pos = __s - _M_data();
             if (__pos >= __n)
               traits_type::copy(_M_data(), __s, __n);
             else if (__pos)
               traits_type::move(_M_data(), __s, __n);
             _M_rep()->_M_length = __n;
             _M_data()[__n] = _Rep::_S_terminal;
             return *this;
           }
       }
 
       basic_string&
       assign(const _CharT* __s)
       { return this->assign(__s, traits_type::length(__s)); }
 
       basic_string&
       assign(size_type __n, _CharT __c)
       { return this->replace(_M_ibegin(), _M_iend(), __n, __c); }
 
       template<class _InputIterator>
         basic_string&
         assign(_InputIterator __first, _InputIterator __last)
         { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
 
       void
       insert(iterator __p, size_type __n, _CharT __c)
       { this->replace(__p, __p, __n, __c); }
 
       template<class _InputIterator>
         void insert(iterator __p, _InputIterator __beg, _InputIterator __end)
         { this->replace(__p, __p, __beg, __end); }
 
       basic_string&
       insert(size_type __pos1, const basic_string& __str)
       { return this->insert(__pos1, __str, 0, __str.size()); }
 
       basic_string&
       insert(size_type __pos1, const basic_string& __str,
              size_type __pos2, size_type __n)
       {
         const size_type __strsize = __str.size();
         if (__pos2 > __strsize)
           __throw_out_of_range("basic_string::insert");
         const bool __testn = __n < __strsize - __pos2;
         const size_type __newsize = __testn ? __n : __strsize - __pos2;
         return this->insert(__pos1, __str._M_data() + __pos2, __newsize);
       }
 
       basic_string&
       insert(size_type __pos, const _CharT* __s, size_type __n)
       {
         const size_type __size = this->size();
         if (__pos > __size)
           __throw_out_of_range("basic_string::insert");
         if (__size > this->max_size() - __n)
           __throw_length_error("basic_string::insert");
         if (_M_rep()->_M_is_shared() || less<const _CharT*>()(__s, _M_data())
             || less<const _CharT*>()(_M_data() + __size, __s))
           return _M_replace_safe(_M_ibegin() + __pos, _M_ibegin() + __pos,
                                  __s, __s + __n);
         else
           {
 
 
 
             const size_type __off = __s - _M_data();
             _M_mutate(__pos, 0, __n);
             __s = _M_data() + __off;
             _CharT* __p = _M_data() + __pos;
             if (__s + __n <= __p)
               traits_type::copy(__p, __s, __n);
             else if (__s >= __p)
               traits_type::copy(__p, __s + __n, __n);
             else
               {
                 traits_type::copy(__p, __s, __p - __s);
                 traits_type::copy(__p + (__p - __s), __p + __n, __n - (__p - __s));
               }
             return *this;
           }
        }
 
       basic_string&
       insert(size_type __pos, const _CharT* __s)
       { return this->insert(__pos, __s, traits_type::length(__s)); }
 
       basic_string&
       insert(size_type __pos, size_type __n, _CharT __c)
       {
         this->insert(_M_check(__pos), __n, __c);
         return *this;
       }
 
       iterator
       insert(iterator __p, _CharT __c = _CharT())
       {
         size_type __pos = __p - _M_ibegin();
         this->insert(_M_check(__pos), size_type(1), __c);
         _M_rep()->_M_set_leaked();
         return this->_M_ibegin() + __pos;
       }
 
       basic_string&
       erase(size_type __pos = 0, size_type __n = npos)
       {
         return this->replace(_M_check(__pos), _M_fold(__pos, __n),
                              _M_data(), _M_data());
       }
 
       iterator
       erase(iterator __position)
       {
         size_type __i = __position - _M_ibegin();
         this->replace(__position, __position + 1, _M_data(), _M_data());
         _M_rep()->_M_set_leaked();
         return _M_ibegin() + __i;
       }
 
       iterator
       erase(iterator __first, iterator __last)
       {
         size_type __i = __first - _M_ibegin();
         this->replace(__first, __last, _M_data(), _M_data());
         _M_rep()->_M_set_leaked();
        return _M_ibegin() + __i;
       }
 
       basic_string&
       replace(size_type __pos, size_type __n, const basic_string& __str)
       { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
 
       basic_string&
       replace(size_type __pos1, size_type __n1, const basic_string& __str,
               size_type __pos2, size_type __n2);
 
       basic_string&
       replace(size_type __pos, size_type __n1, const _CharT* __s,
               size_type __n2)
       {
         const size_type __size = this->size();
         if (__pos > __size)
           __throw_out_of_range("basic_string::replace");
         const bool __testn1 = __n1 < __size - __pos;
         const size_type __foldn1 = __testn1 ? __n1 : __size - __pos;
         if (__size - __foldn1 > this->max_size() - __n2)
           __throw_length_error("basic_string::replace");
         if (_M_rep()->_M_is_shared() || less<const _CharT*>()(__s, _M_data())
             || less<const _CharT*>()(_M_data() + __size, __s))
           return _M_replace_safe(_M_ibegin() + __pos,
                                  _M_ibegin() + __pos + __foldn1, __s, __s + __n2);
 
         else return
                _M_replace(_M_ibegin() + __pos, _M_ibegin() + __pos + __foldn1,
                           __s, __s + __n2,
                           typename iterator_traits<const _CharT*>::iterator_category());
       }
 
       basic_string&
       replace(size_type __pos, size_type __n1, const _CharT* __s)
       { return this->replace(__pos, __n1, __s, traits_type::length(__s)); }
 
       basic_string&
       replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
       { return this->replace(_M_check(__pos), _M_fold(__pos, __n1), __n2, __c); }
 
       basic_string&
       replace(iterator __i1, iterator __i2, const basic_string& __str)
       { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
 
       basic_string&
       replace(iterator __i1, iterator __i2,
                            const _CharT* __s, size_type __n)
       { return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n); }
 
       basic_string&
       replace(iterator __i1, iterator __i2, const _CharT* __s)
       { return this->replace(__i1, __i2, __s, traits_type::length(__s)); }
 
       basic_string&
       replace(iterator __i1, iterator __i2, size_type __n, _CharT __c);
 
       template<class _InputIterator>
         basic_string&
         replace(iterator __i1, iterator __i2,
                 _InputIterator __k1, _InputIterator __k2)
         { return _M_replace(__i1, __i2, __k1, __k2,
              typename iterator_traits<_InputIterator>::iterator_category()); }
 
 
 
       basic_string&
       replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
         { return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
                                __k1, __k2 - __k1); }
 
       basic_string&
       replace(iterator __i1, iterator __i2, const _CharT* __k1, const _CharT* __k2)
         { return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
                                __k1, __k2 - __k1); }
 
       basic_string&
       replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
         { return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
                                __k1.base(), __k2 - __k1);
         }
 
       basic_string&
       replace(iterator __i1, iterator __i2, const_iterator __k1, const_iterator __k2)
         { return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
                                __k1.base(), __k2 - __k1);
         }
 
     private:
       template<class _InputIterator>
         basic_string&
         _M_replace(iterator __i1, iterator __i2, _InputIterator __k1,
                    _InputIterator __k2, input_iterator_tag);
 
       template<class _ForwardIterator>
         basic_string&
         _M_replace_safe(iterator __i1, iterator __i2, _ForwardIterator __k1,
                    _ForwardIterator __k2);
 
 
 
       template<class _InIter>
         static _CharT*
         _S_construct_aux(_InIter __beg, _InIter __end, const _Alloc& __a,
                          __false_type)
         {
           typedef typename iterator_traits<_InIter>::iterator_category _Tag;
           return _S_construct(__beg, __end, __a, _Tag());
         }
 
       template<class _InIter>
         static _CharT*
         _S_construct_aux(_InIter __beg, _InIter __end, const _Alloc& __a,
                          __true_type)
         {
           return _S_construct(static_cast<size_type>(__beg),
                               static_cast<value_type>(__end), __a);
         }
 
       template<class _InIter>
         static _CharT*
         _S_construct(_InIter __beg, _InIter __end, const _Alloc& __a)
         {
           typedef typename _Is_integer<_InIter>::_Integral _Integral;
           return _S_construct_aux(__beg, __end, __a, _Integral());
         }
 
 
       template<class _InIter>
         static _CharT*
          _S_construct(_InIter __beg, _InIter __end, const _Alloc& __a,
                       input_iterator_tag);
 
 
 
       template<class _FwdIter>
         static _CharT*
         _S_construct(_FwdIter __beg, _FwdIter __end, const _Alloc& __a,
                      forward_iterator_tag);
 
       static _CharT*
       _S_construct(size_type __req, _CharT __c, const _Alloc& __a);
 
     public:
 
       size_type
       copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
 
       void
       swap(basic_string<_CharT, _Traits, _Alloc>& __s);
 
 
       const _CharT*
       c_str() const
       {
 
         size_type __n = this->size();
         traits_type::assign(_M_data()[__n], _Rep::_S_terminal);
         return _M_data();
       }
 
       const _CharT*
       data() const { return _M_data(); }
 
       allocator_type
       get_allocator() const { return _M_dataplus; }
 
       size_type
       find(const _CharT* __s, size_type __pos, size_type __n) const;
 
       size_type
       find(const basic_string& __str, size_type __pos = 0) const
       { return this->find(__str.data(), __pos, __str.size()); }
 
       size_type
       find(const _CharT* __s, size_type __pos = 0) const
       { return this->find(__s, __pos, traits_type::length(__s)); }
 
       size_type
       find(_CharT __c, size_type __pos = 0) const;
 
       size_type
       rfind(const basic_string& __str, size_type __pos = npos) const
       { return this->rfind(__str.data(), __pos, __str.size()); }
 
       size_type
       rfind(const _CharT* __s, size_type __pos, size_type __n) const;
 
       size_type
       rfind(const _CharT* __s, size_type __pos = npos) const
       { return this->rfind(__s, __pos, traits_type::length(__s)); }
 
       size_type
       rfind(_CharT __c, size_type __pos = npos) const;
 
       size_type
       find_first_of(const basic_string& __str, size_type __pos = 0) const
       { return this->find_first_of(__str.data(), __pos, __str.size()); }
 
       size_type
       find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
 
       size_type
       find_first_of(const _CharT* __s, size_type __pos = 0) const
       { return this->find_first_of(__s, __pos, traits_type::length(__s)); }
 
       size_type
       find_first_of(_CharT __c, size_type __pos = 0) const
       { return this->find(__c, __pos); }
 
       size_type
       find_last_of(const basic_string& __str, size_type __pos = npos) const
       { return this->find_last_of(__str.data(), __pos, __str.size()); }
 
       size_type
       find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
 
       size_type
       find_last_of(const _CharT* __s, size_type __pos = npos) const
       { return this->find_last_of(__s, __pos, traits_type::length(__s)); }
 
       size_type
       find_last_of(_CharT __c, size_type __pos = npos) const
       { return this->rfind(__c, __pos); }
 
       size_type
       find_first_not_of(const basic_string& __str, size_type __pos = 0) const
       { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
 
       size_type
       find_first_not_of(const _CharT* __s, size_type __pos,
                         size_type __n) const;
 
       size_type
       find_first_not_of(const _CharT* __s, size_type __pos = 0) const
       { return this->find_first_not_of(__s, __pos, traits_type::length(__s)); }
 
       size_type
       find_first_not_of(_CharT __c, size_type __pos = 0) const;
 
       size_type
       find_last_not_of(const basic_string& __str, size_type __pos = npos) const
       { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
 
       size_type
       find_last_not_of(const _CharT* __s, size_type __pos,
                        size_type __n) const;
       size_type
       find_last_not_of(const _CharT* __s, size_type __pos = npos) const
       { return this->find_last_not_of(__s, __pos, traits_type::length(__s)); }
 
       size_type
       find_last_not_of(_CharT __c, size_type __pos = npos) const;
 
       basic_string
       substr(size_type __pos = 0, size_type __n = npos) const
       {
         if (__pos > this->size())
           __throw_out_of_range("basic_string::substr");
         return basic_string(*this, __pos, __n);
       }
 
       int
       compare(const basic_string& __str) const
       {
         size_type __size = this->size();
         size_type __osize = __str.size();
         size_type __len = min(__size, __osize);
 
         int __r = traits_type::compare(_M_data(), __str.data(), __len);
         if (!__r)
           __r = __size - __osize;
         return __r;
       }
 
       int
       compare(size_type __pos, size_type __n, const basic_string& __str) const;
 
       int
       compare(size_type __pos1, size_type __n1, const basic_string& __str,
               size_type __pos2, size_type __n2) const;
 
       int
       compare(const _CharT* __s) const;
 
 
 
       int
       compare(size_type __pos, size_type __n1, const _CharT* __s) const;
 
       int
       compare(size_type __pos, size_type __n1, const _CharT* __s,
               size_type __n2) const;
   };
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline basic_string<_CharT, _Traits, _Alloc>::
     basic_string()
     : _M_dataplus(_S_empty_rep()._M_refcopy(), _Alloc()) { }
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>
     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
     {
       basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
       __str.append(__rhs);
       return __str;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT,_Traits,_Alloc>
     operator+(const _CharT* __lhs,
               const basic_string<_CharT,_Traits,_Alloc>& __rhs);
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT,_Traits,_Alloc>
     operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs);
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline basic_string<_CharT, _Traits, _Alloc>
     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
              const _CharT* __rhs)
     {
       basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
       __str.append(__rhs);
       return __str;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline basic_string<_CharT, _Traits, _Alloc>
     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
     {
       typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
       typedef typename __string_type::size_type __size_type;
       __string_type __str(__lhs);
       __str.append(__size_type(1), __rhs);
       return __str;
     }
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
     { return __lhs.compare(__rhs) == 0; }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator==(const _CharT* __lhs,
                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
     { return __rhs.compare(__lhs) == 0; }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
                const _CharT* __rhs)
     { return __lhs.compare(__rhs) == 0; }
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
     { return __rhs.compare(__lhs) != 0; }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator!=(const _CharT* __lhs,
                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
     { return __rhs.compare(__lhs) != 0; }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
                const _CharT* __rhs)
     { return __lhs.compare(__rhs) != 0; }
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
     { return __lhs.compare(__rhs) < 0; }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
               const _CharT* __rhs)
     { return __lhs.compare(__rhs) < 0; }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator<(const _CharT* __lhs,
               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
     { return __rhs.compare(__lhs) > 0; }
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
     { return __lhs.compare(__rhs) > 0; }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
               const _CharT* __rhs)
     { return __lhs.compare(__rhs) > 0; }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator>(const _CharT* __lhs,
               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
     { return __rhs.compare(__lhs) < 0; }
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
     { return __lhs.compare(__rhs) <= 0; }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
                const _CharT* __rhs)
     { return __lhs.compare(__rhs) <= 0; }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator<=(const _CharT* __lhs,
                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
   { return __rhs.compare(__lhs) >= 0; }
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
     { return __lhs.compare(__rhs) >= 0; }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
                const _CharT* __rhs)
     { return __lhs.compare(__rhs) >= 0; }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline bool
     operator>=(const _CharT* __lhs,
              const basic_string<_CharT, _Traits, _Alloc>& __rhs)
     { return __rhs.compare(__lhs) <= 0; }
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline void
     swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,
          basic_string<_CharT, _Traits, _Alloc>& __rhs)
     { __lhs.swap(__rhs); }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_istream<_CharT, _Traits>&
     operator>>(basic_istream<_CharT, _Traits>& __is,
                basic_string<_CharT, _Traits, _Alloc>& __str);
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_ostream<_CharT, _Traits>&
     operator<<(basic_ostream<_CharT, _Traits>& __os,
                const basic_string<_CharT, _Traits, _Alloc>& __str);
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_istream<_CharT,_Traits>&
     getline(basic_istream<_CharT, _Traits>& __is,
             basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     inline basic_istream<_CharT,_Traits>&
     getline(basic_istream<_CharT, _Traits>& __is,
             basic_string<_CharT, _Traits, _Alloc>& __str);
 }
 # 54 "/usr/include/c++/3.2/string" 2 3
 
 
 # 1 "/usr/include/c++/3.2/algorithm" 1 3
 # 65 "/usr/include/c++/3.2/algorithm" 3
 
 
 
 
 # 1 "/usr/include/c++/3.2/bits/stl_algo.h" 1 3
 # 64 "/usr/include/c++/3.2/bits/stl_algo.h" 3
 # 1 "/usr/include/c++/3.2/bits/stl_heap.h" 1 3
 # 63 "/usr/include/c++/3.2/bits/stl_heap.h" 3
 namespace std
 {
 
 
 
   template<typename _RandomAccessIterator, typename _Distance, typename _Tp>
     void
     __push_heap(_RandomAccessIterator __first,
                 _Distance __holeIndex, _Distance __topIndex, _Tp __value)
     {
       _Distance __parent = (__holeIndex - 1) / 2;
       while (__holeIndex > __topIndex && *(__first + __parent) < __value) {
         *(__first + __holeIndex) = *(__first + __parent);
         __holeIndex = __parent;
         __parent = (__holeIndex - 1) / 2;
       }
       *(__first + __holeIndex) = __value;
     }
 
   template<typename _RandomAccessIterator>
     inline void
     push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
     {
       typedef typename iterator_traits<_RandomAccessIterator>::value_type
           _ValueType;
       typedef typename iterator_traits<_RandomAccessIterator>::difference_type
           _DistanceType;
 
 
      
 
      
 
       __push_heap(__first, _DistanceType((__last - __first) - 1), _DistanceType(0),
                   _ValueType(*(__last - 1)));
     }
 
   template<typename _RandomAccessIterator, typename _Distance, typename _Tp,
             typename _Compare>
     void
     __push_heap(_RandomAccessIterator __first, _Distance __holeIndex,
                 _Distance __topIndex, _Tp __value, _Compare __comp)
     {
       _Distance __parent = (__holeIndex - 1) / 2;
       while (__holeIndex > __topIndex && __comp(*(__first + __parent), __value)) {
         *(__first + __holeIndex) = *(__first + __parent);
         __holeIndex = __parent;
         __parent = (__holeIndex - 1) / 2;
       }
       *(__first + __holeIndex) = __value;
     }
 
   template<typename _RandomAccessIterator, typename _Compare>
     inline void
     push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
               _Compare __comp)
     {
       typedef typename iterator_traits<_RandomAccessIterator>::value_type
           _ValueType;
       typedef typename iterator_traits<_RandomAccessIterator>::difference_type
           _DistanceType;
 
 
      
 
 
       __push_heap(__first, _DistanceType((__last - __first) - 1), _DistanceType(0),
                   _ValueType(*(__last - 1)), __comp);
     }
 
   template<typename _RandomAccessIterator, typename _Distance, typename _Tp>
     void
     __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
                   _Distance __len, _Tp __value)
     {
       _Distance __topIndex = __holeIndex;
       _Distance __secondChild = 2 * __holeIndex + 2;
       while (__secondChild < __len) {
         if (*(__first + __secondChild) < *(__first + (__secondChild - 1)))
           __secondChild--;
         *(__first + __holeIndex) = *(__first + __secondChild);
         __holeIndex = __secondChild;
         __secondChild = 2 * (__secondChild + 1);
       }
       if (__secondChild == __len) {
         *(__first + __holeIndex) = *(__first + (__secondChild - 1));
         __holeIndex = __secondChild - 1;
       }
       __push_heap(__first, __holeIndex, __topIndex, __value);
     }
 
   template<typename _RandomAccessIterator, typename _Tp>
     inline void
     __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
                _RandomAccessIterator __result, _Tp __value)
     {
       typedef typename iterator_traits<_RandomAccessIterator>::difference_type _Distance;
       *__result = *__first;
       __adjust_heap(__first, _Distance(0), _Distance(__last - __first), __value);
     }
 
   template<typename _RandomAccessIterator>
     inline void
     pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
     {
       typedef typename iterator_traits<_RandomAccessIterator>::value_type _ValueType;
 
 
      
 
      
 
       __pop_heap(__first, __last - 1, __last - 1, _ValueType(*(__last - 1)));
     }
 
   template<typename _RandomAccessIterator, typename _Distance,
            typename _Tp, typename _Compare>
     void
     __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
                   _Distance __len, _Tp __value, _Compare __comp)
     {
       _Distance __topIndex = __holeIndex;
       _Distance __secondChild = 2 * __holeIndex + 2;
       while (__secondChild < __len) {
         if (__comp(*(__first + __secondChild), *(__first + (__secondChild - 1))))
           __secondChild--;
         *(__first + __holeIndex) = *(__first + __secondChild);
         __holeIndex = __secondChild;
         __secondChild = 2 * (__secondChild + 1);
       }
       if (__secondChild == __len) {
         *(__first + __holeIndex) = *(__first + (__secondChild - 1));
         __holeIndex = __secondChild - 1;
       }
       __push_heap(__first, __holeIndex, __topIndex, __value, __comp);
     }
 
   template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
     inline void
     __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
                _RandomAccessIterator __result, _Tp __value, _Compare __comp)
     {
       typedef typename iterator_traits<_RandomAccessIterator>::difference_type _Distance;
       *__result = *__first;
       __adjust_heap(__first, _Distance(0), _Distance(__last - __first),
                     __value, __comp);
     }
 
   template<typename _RandomAccessIterator, typename _Compare>
     inline void
     pop_heap(_RandomAccessIterator __first,
              _RandomAccessIterator __last, _Compare __comp)
     {
 
      
 
 
       typedef typename iterator_traits<_RandomAccessIterator>::value_type _ValueType;
       __pop_heap(__first, __last - 1, __last - 1, _ValueType(*(__last - 1)), __comp);
     }
 
   template<typename _RandomAccessIterator>
     void
     make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
     {
       typedef typename iterator_traits<_RandomAccessIterator>::value_type
           _ValueType;
       typedef typename iterator_traits<_RandomAccessIterator>::difference_type
           _DistanceType;
 
 
      
 
      
 
       if (__last - __first < 2) return;
       _DistanceType __len = __last - __first;
       _DistanceType __parent = (__len - 2)/2;
 
       while (true) {
         __adjust_heap(__first, __parent, __len, _ValueType(*(__first + __parent)));
         if (__parent == 0) return;
         __parent--;
       }
     }
 
   template<typename _RandomAccessIterator, typename _Compare>
     inline void
     make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
               _Compare __comp)
     {
       typedef typename iterator_traits<_RandomAccessIterator>::value_type
           _ValueType;
       typedef typename iterator_traits<_RandomAccessIterator>::difference_type
           _DistanceType;
 
 
      
 
 
       if (__last - __first < 2) return;
       _DistanceType __len = __last - __first;
       _DistanceType __parent = (__len - 2)/2;
 
       while (true) {
         __adjust_heap(__first, __parent, __len,
                       _ValueType(*(__first + __parent)), __comp);
         if (__parent == 0) return;
         __parent--;
       }
     }
 
   template<typename _RandomAccessIterator>
     void
     sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
     {
 
      
 
      
 
 
       while (__last - __first > 1)
         pop_heap(__first, __last--);
     }
 
   template<typename _RandomAccessIterator, typename _Compare>
     void
     sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
               _Compare __comp)
     {
 
      
 
 
       while (__last - __first > 1)
         pop_heap(__first, __last--, __comp);
     }
 
 }
 # 65 "/usr/include/c++/3.2/bits/stl_algo.h" 2 3
 # 1 "/usr/include/c++/3.2/bits/stl_tempbuf.h" 1 3
 # 64 "/usr/include/c++/3.2/bits/stl_tempbuf.h" 3
 namespace std
 {
 # 74 "/usr/include/c++/3.2/bits/stl_tempbuf.h" 3
 template <class _ForwardIterator, class _Tp>
   class _Temporary_buffer
 {
 
  
 
   ptrdiff_t _M_original_len;
   ptrdiff_t _M_len;
   _Tp* _M_buffer;
 
 
   void _M_allocate_buffer() {
     _M_original_len = _M_len;
     _M_buffer = 0;
 
     if (_M_len > (ptrdiff_t)(2147483647 / sizeof(_Tp)))
       _M_len = 2147483647 / sizeof(_Tp);
 
     while (_M_len > 0) {
       _M_buffer = (_Tp*) malloc(_M_len * sizeof(_Tp));
       if (_M_buffer)
         break;
       _M_len /= 2;
     }
   }
 
   void _M_initialize_buffer(const _Tp&, __true_type) {}
   void _M_initialize_buffer(const _Tp& val, __false_type) {
     uninitialized_fill_n(_M_buffer, _M_len, val);
   }
 
 public:
 
   ptrdiff_t size() const { return _M_len; }
 
   ptrdiff_t requested_size() const { return _M_original_len; }
 
   _Tp* begin() { return _M_buffer; }
 
   _Tp* end() { return _M_buffer + _M_len; }
 
   _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last) {
 
     typedef typename __type_traits<_Tp>::has_trivial_default_constructor
             _Trivial;
 
     try {
       _M_len = distance(__first, __last);
       _M_allocate_buffer();
       if (_M_len > 0)
         _M_initialize_buffer(*__first, _Trivial());
     }
     catch(...)
       {
         free(_M_buffer);
         _M_buffer = 0;
         _M_len = 0;
         throw;
       }
   }
 
   ~_Temporary_buffer() {
     _Destroy(_M_buffer, _M_buffer + _M_len);
     free(_M_buffer);
   }
 
 private:
 
   _Temporary_buffer(const _Temporary_buffer&) {}
   void operator=(const _Temporary_buffer&) {}
 };
 
 }
 # 66 "/usr/include/c++/3.2/bits/stl_algo.h" 2 3
 
 
 
 namespace std
 {
 # 84 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _Tp>
   inline const _Tp&
     __median(const _Tp& __a, const _Tp& __b, const _Tp& __c)
     {
 
      
       if (__a < __b)
         if (__b < __c)
           return __b;
         else if (__a < __c)
           return __c;
         else
           return __a;
       else if (__a < __c)
         return __a;
       else if (__b < __c)
         return __c;
       else
         return __b;
     }
 # 118 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _Tp, typename _Compare>
     inline const _Tp&
     __median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp)
     {
 
      
       if (__comp(__a, __b))
         if (__comp(__b, __c))
           return __b;
         else if (__comp(__a, __c))
           return __c;
         else
           return __a;
       else if (__comp(__a, __c))
         return __a;
       else if (__comp(__b, __c))
         return __c;
       else
         return __b;
     }
 # 150 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _Function>
     _Function
     for_each(_InputIter __first, _InputIter __last, _Function __f)
     {
 
      
       for ( ; __first != __last; ++__first)
         __f(*__first);
       return __f;
     }
 
 
 
 
 
 
   template<typename _InputIter, typename _Tp>
     inline _InputIter
     find(_InputIter __first, _InputIter __last,
          const _Tp& __val,
          input_iterator_tag)
     {
       while (__first != __last && !(*__first == __val))
         ++__first;
       return __first;
     }
 
 
 
 
 
 
   template<typename _InputIter, typename _Predicate>
     inline _InputIter
     find_if(_InputIter __first, _InputIter __last,
             _Predicate __pred,
             input_iterator_tag)
     {
       while (__first != __last && !__pred(*__first))
         ++__first;
       return __first;
     }
 
 
 
 
 
 
   template<typename _RandomAccessIter, typename _Tp>
     _RandomAccessIter
     find(_RandomAccessIter __first, _RandomAccessIter __last,
          const _Tp& __val,
          random_access_iterator_tag)
     {
       typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
         = (__last - __first) >> 2;
 
       for ( ; __trip_count > 0 ; --__trip_count) {
         if (*__first == __val) return __first;
         ++__first;
 
         if (*__first == __val) return __first;
         ++__first;
 
         if (*__first == __val) return __first;
         ++__first;
 
         if (*__first == __val) return __first;
         ++__first;
       }
 
       switch(__last - __first) {
       case 3:
         if (*__first == __val) return __first;
         ++__first;
       case 2:
         if (*__first == __val) return __first;
         ++__first;
       case 1:
         if (*__first == __val) return __first;
         ++__first;
       case 0:
       default:
         return __last;
       }
     }
 
 
 
 
 
 
   template<typename _RandomAccessIter, typename _Predicate>
     _RandomAccessIter
     find_if(_RandomAccessIter __first, _RandomAccessIter __last,
             _Predicate __pred,
             random_access_iterator_tag)
     {
       typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
         = (__last - __first) >> 2;
 
       for ( ; __trip_count > 0 ; --__trip_count) {
         if (__pred(*__first)) return __first;
         ++__first;
 
         if (__pred(*__first)) return __first;
         ++__first;
 
         if (__pred(*__first)) return __first;
         ++__first;
 
         if (__pred(*__first)) return __first;
         ++__first;
       }
 
       switch(__last - __first) {
       case 3:
         if (__pred(*__first)) return __first;
         ++__first;
       case 2:
         if (__pred(*__first)) return __first;
         ++__first;
       case 1:
         if (__pred(*__first)) return __first;
         ++__first;
       case 0:
       default:
         return __last;
       }
     }
 # 289 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _Tp>
     inline _InputIter
     find(_InputIter __first, _InputIter __last,
          const _Tp& __val)
     {
 
      
      
 
       return find(__first, __last, __val, __iterator_category(__first));
     }
 # 309 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _Predicate>
     inline _InputIter
     find_if(_InputIter __first, _InputIter __last,
             _Predicate __pred)
     {
 
      
      
 
       return find_if(__first, __last, __pred, __iterator_category(__first));
     }
 # 329 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter>
     _ForwardIter
     adjacent_find(_ForwardIter __first, _ForwardIter __last)
     {
 
      
      
 
       if (__first == __last)
         return __last;
       _ForwardIter __next = __first;
       while(++__next != __last) {
         if (*__first == *__next)
           return __first;
         __first = __next;
       }
       return __last;
     }
 # 358 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _BinaryPredicate>
     _ForwardIter
     adjacent_find(_ForwardIter __first, _ForwardIter __last,
                   _BinaryPredicate __binary_pred)
     {
 
      
      
 
 
       if (__first == __last)
         return __last;
       _ForwardIter __next = __first;
       while(++__next != __last) {
         if (__binary_pred(*__first, *__next))
           return __first;
         __first = __next;
       }
       return __last;
     }
 # 387 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _Tp>
     typename iterator_traits<_InputIter>::difference_type
     count(_InputIter __first, _InputIter __last, const _Tp& __value)
     {
 
      
      
 
      
       typename iterator_traits<_InputIter>::difference_type __n = 0;
       for ( ; __first != __last; ++__first)
         if (*__first == __value)
           ++__n;
       return __n;
     }
 # 411 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _Predicate>
     typename iterator_traits<_InputIter>::difference_type
     count_if(_InputIter __first, _InputIter __last, _Predicate __pred)
     {
 
      
      
 
       typename iterator_traits<_InputIter>::difference_type __n = 0;
       for ( ; __first != __last; ++__first)
         if (__pred(*__first))
           ++__n;
       return __n;
     }
 # 450 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter1, typename _ForwardIter2>
     _ForwardIter1
     search(_ForwardIter1 __first1, _ForwardIter1 __last1,
            _ForwardIter2 __first2, _ForwardIter2 __last2)
     {
 
      
      
      
 
 
 
 
       if (__first1 == __last1 || __first2 == __last2)
         return __first1;
 
 
       _ForwardIter2 __tmp(__first2);
       ++__tmp;
       if (__tmp == __last2)
         return find(__first1, __last1, *__first2);
 
 
 
       _ForwardIter2 __p1, __p;
 
       __p1 = __first2; ++__p1;
 
       _ForwardIter1 __current = __first1;
 
       while (__first1 != __last1) {
         __first1 = find(__first1, __last1, *__first2);
         if (__first1 == __last1)
           return __last1;
 
         __p = __p1;
         __current = __first1;
         if (++__current == __last1)
           return __last1;
 
         while (*__current == *__p) {
           if (++__p == __last2)
             return __first1;
           if (++__current == __last1)
             return __last1;
         }
 
         ++__first1;
       }
       return __first1;
     }
 # 522 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter1, typename _ForwardIter2, typename _BinaryPred>
     _ForwardIter1
     search(_ForwardIter1 __first1, _ForwardIter1 __last1,
            _ForwardIter2 __first2, _ForwardIter2 __last2,
            _BinaryPred __predicate)
     {
 
      
      
      
 
 
 
 
       if (__first1 == __last1 || __first2 == __last2)
         return __first1;
 
 
       _ForwardIter2 __tmp(__first2);
       ++__tmp;
       if (__tmp == __last2) {
         while (__first1 != __last1 && !__predicate(*__first1, *__first2))
           ++__first1;
         return __first1;
       }
 
 
 
       _ForwardIter2 __p1, __p;
 
       __p1 = __first2; ++__p1;
 
       _ForwardIter1 __current = __first1;
 
       while (__first1 != __last1) {
         while (__first1 != __last1) {
           if (__predicate(*__first1, *__first2))
             break;
           ++__first1;
         }
         while (__first1 != __last1 && !__predicate(*__first1, *__first2))
           ++__first1;
         if (__first1 == __last1)
           return __last1;
 
         __p = __p1;
         __current = __first1;
         if (++__current == __last1) return __last1;
 
         while (__predicate(*__current, *__p)) {
           if (++__p == __last2)
             return __first1;
           if (++__current == __last1)
             return __last1;
         }
 
         ++__first1;
       }
       return __first1;
     }
 # 596 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Integer, typename _Tp>
     _ForwardIter
     search_n(_ForwardIter __first, _ForwardIter __last,
              _Integer __count, const _Tp& __val)
     {
 
      
      
 
      
 
       if (__count <= 0)
         return __first;
       else {
         __first = find(__first, __last, __val);
         while (__first != __last) {
           _Integer __n = __count - 1;
           _ForwardIter __i = __first;
           ++__i;
           while (__i != __last && __n != 0 && *__i == __val) {
             ++__i;
             --__n;
           }
           if (__n == 0)
             return __first;
           else
             __first = find(__i, __last, __val);
         }
         return __last;
       }
     }
 # 643 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Integer, typename _Tp,
            typename _BinaryPred>
     _ForwardIter
     search_n(_ForwardIter __first, _ForwardIter __last,
              _Integer __count, const _Tp& __val,
              _BinaryPred __binary_pred)
     {
 
      
      
 
 
       if (__count <= 0)
         return __first;
       else {
         while (__first != __last) {
           if (__binary_pred(*__first, __val))
             break;
           ++__first;
         }
         while (__first != __last) {
           _Integer __n = __count - 1;
           _ForwardIter __i = __first;
           ++__i;
           while (__i != __last && __n != 0 && __binary_pred(*__i, __val)) {
             ++__i;
             --__n;
           }
           if (__n == 0)
             return __first;
           else {
             while (__i != __last) {
               if (__binary_pred(*__i, __val))
                 break;
               ++__i;
             }
             __first = __i;
           }
         }
         return __last;
       }
     }
 # 697 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter1, typename _ForwardIter2>
     _ForwardIter2
     swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1,
                 _ForwardIter2 __first2)
     {
 
      
      
      
 
 
      
 
 
 
       for ( ; __first1 != __last1; ++__first1, ++__first2)
         iter_swap(__first1, __first2);
       return __first2;
     }
 # 732 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _OutputIter, typename _UnaryOperation>
     _OutputIter
     transform(_InputIter __first, _InputIter __last,
               _OutputIter __result, _UnaryOperation __unary_op)
     {
 
      
      
 
 
 
       for ( ; __first != __last; ++__first, ++__result)
         *__result = __unary_op(*__first);
       return __result;
     }
 # 765 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
            typename _BinaryOperation>
     _OutputIter
     transform(_InputIter1 __first1, _InputIter1 __last1,
               _InputIter2 __first2, _OutputIter __result,
               _BinaryOperation __binary_op)
     {
 
      
      
      
 
 
 
       for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
         *__result = __binary_op(*__first1, *__first2);
       return __result;
     }
 # 796 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Tp>
     void
     replace(_ForwardIter __first, _ForwardIter __last,
             const _Tp& __old_value, const _Tp& __new_value)
     {
 
      
      
 
      
 
 
       for ( ; __first != __last; ++__first)
         if (*__first == __old_value)
           *__first = __new_value;
     }
 # 825 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Predicate, typename _Tp>
     void
     replace_if(_ForwardIter __first, _ForwardIter __last,
                _Predicate __pred, const _Tp& __new_value)
     {
 
      
      
 
      
 
 
       for ( ; __first != __last; ++__first)
         if (__pred(*__first))
           *__first = __new_value;
     }
 # 856 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _OutputIter, typename _Tp>
     _OutputIter
     replace_copy(_InputIter __first, _InputIter __last,
                  _OutputIter __result,
                  const _Tp& __old_value, const _Tp& __new_value)
     {
 
      
      
 
      
 
 
       for ( ; __first != __last; ++__first, ++__result)
         *__result = *__first == __old_value ? __new_value : *__first;
       return __result;
     }
 # 888 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _OutputIter, typename _Predicate,
            typename _Tp>
     _OutputIter
     replace_copy_if(_InputIter __first, _InputIter __last,
                     _OutputIter __result,
                     _Predicate __pred, const _Tp& __new_value)
     {
 
      
      
 
      
 
 
       for ( ; __first != __last; ++__first, ++__result)
         *__result = __pred(*__first) ? __new_value : *__first;
       return __result;
     }
 # 918 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Generator>
     void
     generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen)
     {
 
      
      
 
 
       for ( ; __first != __last; ++__first)
         *__first = __gen();
     }
 # 942 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _OutputIter, typename _Size, typename _Generator>
     _OutputIter
     generate_n(_OutputIter __first, _Size __n, _Generator __gen)
     {
 
      
 
 
 
       for ( ; __n > 0; --__n, ++__first)
         *__first = __gen();
       return __first;
     }
 # 969 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _OutputIter, typename _Tp>
     _OutputIter
     remove_copy(_InputIter __first, _InputIter __last,
                 _OutputIter __result, const _Tp& __value)
     {
 
      
      
 
      
 
 
       for ( ; __first != __last; ++__first)
         if (!(*__first == __value)) {
           *__result = *__first;
           ++__result;
         }
       return __result;
     }
 # 1003 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _OutputIter, typename _Predicate>
     _OutputIter
     remove_copy_if(_InputIter __first, _InputIter __last,
                    _OutputIter __result, _Predicate __pred)
     {
 
      
      
 
      
 
 
       for ( ; __first != __last; ++__first)
         if (!__pred(*__first)) {
           *__result = *__first;
           ++__result;
         }
       return __result;
     }
 # 1039 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Tp>
     _ForwardIter
     remove(_ForwardIter __first, _ForwardIter __last,
            const _Tp& __value)
     {
 
      
      
 
      
 
 
       __first = find(__first, __last, __value);
       _ForwardIter __i = __first;
       return __first == __last ? __first
                                : remove_copy(++__i, __last, __first, __value);
     }
 # 1073 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Predicate>
     _ForwardIter
     remove_if(_ForwardIter __first, _ForwardIter __last,
               _Predicate __pred)
     {
 
      
      
 
 
       __first = find_if(__first, __last, __pred);
       _ForwardIter __i = __first;
       return __first == __last ? __first
                                : remove_copy_if(++__i, __last, __first, __pred);
     }
 
 
 
 
 
 
 
   template<typename _InputIter, typename _OutputIter>
     _OutputIter
     __unique_copy(_InputIter __first, _InputIter __last,
                   _OutputIter __result,
                   output_iterator_tag)
     {
 
       typename iterator_traits<_InputIter>::value_type __value = *__first;
       *__result = __value;
       while (++__first != __last)
         if (!(__value == *__first)) {
           __value = *__first;
           *++__result = __value;
         }
       return ++__result;
     }
 
 
 
 
 
 
 
   template<typename _InputIter, typename _ForwardIter>
     _ForwardIter
     __unique_copy(_InputIter __first, _InputIter __last,
                   _ForwardIter __result,
                   forward_iterator_tag)
     {
 
       *__result = *__first;
       while (++__first != __last)
         if (!(*__result == *__first))
           *++__result = *__first;
       return ++__result;
     }
 # 1145 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _OutputIter>
     inline _OutputIter
     unique_copy(_InputIter __first, _InputIter __last,
                 _OutputIter __result)
     {
 
      
      
 
      
 
 
       typedef typename iterator_traits<_OutputIter>::iterator_category _IterType;
 
       if (__first == __last) return __result;
       return __unique_copy(__first, __last, __result, _IterType());
     }
 # 1170 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _OutputIter, typename _BinaryPredicate>
     _OutputIter
     __unique_copy(_InputIter __first, _InputIter __last,
                   _OutputIter __result,
                   _BinaryPredicate __binary_pred,
                   output_iterator_tag)
     {
 
      
 
 
 
       typename iterator_traits<_InputIter>::value_type __value = *__first;
       *__result = __value;
       while (++__first != __last)
         if (!__binary_pred(__value, *__first)) {
           __value = *__first;
           *++__result = __value;
         }
       return ++__result;
     }
 # 1199 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _ForwardIter, typename _BinaryPredicate>
     _ForwardIter
     __unique_copy(_InputIter __first, _InputIter __last,
                   _ForwardIter __result,
                   _BinaryPredicate __binary_pred,
                   forward_iterator_tag)
     {
 
      
 
 
 
       *__result = *__first;
       while (++__first != __last)
         if (!__binary_pred(*__result, *__first)) *++__result = *__first;
       return ++__result;
     }
 # 1232 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _OutputIter, typename _BinaryPredicate>
     inline _OutputIter
     unique_copy(_InputIter __first, _InputIter __last,
                 _OutputIter __result,
                 _BinaryPredicate __binary_pred)
     {
 
      
      
 
 
       typedef typename iterator_traits<_OutputIter>::iterator_category _IterType;
 
       if (__first == __last) return __result;
       return __unique_copy(__first, __last,
 __result, __binary_pred, _IterType());
     }
 # 1263 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter>
     _ForwardIter
     unique(_ForwardIter __first, _ForwardIter __last)
     {
 
          
          
 
 
           __first = adjacent_find(__first, __last);
           return unique_copy(__first, __last, __first);
     }
 # 1290 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _BinaryPredicate>
     _ForwardIter
     unique(_ForwardIter __first, _ForwardIter __last,
            _BinaryPredicate __binary_pred)
     {
 
      
      
 
 
 
       __first = adjacent_find(__first, __last, __binary_pred);
       return unique_copy(__first, __last, __first, __binary_pred);
     }
 
 
 
 
 
 
 
   template<typename _BidirectionalIter>
     void
     __reverse(_BidirectionalIter __first, _BidirectionalIter __last,
                           bidirectional_iterator_tag)
     {
           while (true)
             if (__first == __last || __first == --__last)
                   return;
             else
                   iter_swap(__first++, __last);
     }
 
 
 
 
 
 
 
   template<typename _RandomAccessIter>
     void
     __reverse(_RandomAccessIter __first, _RandomAccessIter __last,
                           random_access_iterator_tag)
     {
           while (__first < __last)
             iter_swap(__first++, --__last);
     }
 # 1349 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _BidirectionalIter>
     inline void
     reverse(_BidirectionalIter __first, _BidirectionalIter __last)
     {
 
          
 
           __reverse(__first, __last, __iterator_category(__first));
     }
 # 1374 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _BidirectionalIter, typename _OutputIter>
     _OutputIter
     reverse_copy(_BidirectionalIter __first, _BidirectionalIter __last,
                              _OutputIter __result)
     {
 
      
      
 
 
       while (__first != __last) {
         --__last;
         *__result = *__last;
         ++__result;
       }
       return __result;
     }
 # 1399 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _EuclideanRingElement>
     _EuclideanRingElement
     __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
     {
       while (__n != 0) {
         _EuclideanRingElement __t = __m % __n;
         __m = __n;
         __n = __t;
       }
       return __m;
     }
 
 
 
 
 
 
   template<typename _ForwardIter>
     void
     __rotate(_ForwardIter __first,
              _ForwardIter __middle,
              _ForwardIter __last,
               forward_iterator_tag)
     {
       if ((__first == __middle) || (__last == __middle))
         return;
 
       _ForwardIter __first2 = __middle;
       do {
         swap(*__first++, *__first2++);
         if (__first == __middle)
           __middle = __first2;
       } while (__first2 != __last);
 
       __first2 = __middle;
 
       while (__first2 != __last) {
         swap(*__first++, *__first2++);
         if (__first == __middle)
           __middle = __first2;
         else if (__first2 == __last)
           __first2 = __middle;
       }
     }
 
 
 
 
 
 
   template<typename _BidirectionalIter>
     void
     __rotate(_BidirectionalIter __first,
              _BidirectionalIter __middle,
              _BidirectionalIter __last,
               bidirectional_iterator_tag)
     {
 
      
 
 
       if ((__first == __middle) || (__last == __middle))
         return;
 
       __reverse(__first, __middle, bidirectional_iterator_tag());
       __reverse(__middle, __last, bidirectional_iterator_tag());
 
       while (__first != __middle && __middle != __last)
         swap (*__first++, *--__last);
 
       if (__first == __middle) {
         __reverse(__middle, __last, bidirectional_iterator_tag());
       }
       else {
         __reverse(__first, __middle, bidirectional_iterator_tag());
       }
     }
 
 
 
 
 
 
   template<typename _RandomAccessIter>
     void
     __rotate(_RandomAccessIter __first,
              _RandomAccessIter __middle,
              _RandomAccessIter __last,
              random_access_iterator_tag)
     {
 
      
 
 
       if ((__first == __middle) || (__last == __middle))
         return;
 
       typedef typename iterator_traits<_RandomAccessIter>::difference_type _Distance;
       typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
 
       _Distance __n = __last - __first;
       _Distance __k = __middle - __first;
       _Distance __l = __n - __k;
 
       if (__k == __l) {
         swap_ranges(__first, __middle, __middle);
         return;
       }
 
       _Distance __d = __gcd(__n, __k);
 
       for (_Distance __i = 0; __i < __d; __i++) {
         _ValueType __tmp = *__first;
         _RandomAccessIter __p = __first;
 
         if (__k < __l) {
           for (_Distance __j = 0; __j < __l/__d; __j++) {
             if (__p > __first + __l) {
               *__p = *(__p - __l);
               __p -= __l;
             }
 
             *__p = *(__p + __k);
             __p += __k;
           }
         }
 
         else {
           for (_Distance __j = 0; __j < __k/__d - 1; __j ++) {
             if (__p < __last - __k) {
               *__p = *(__p + __k);
               __p += __k;
             }
 
             *__p = * (__p - __l);
             __p -= __l;
           }
         }
 
         *__p = __tmp;
         ++__first;
       }
     }
 # 1561 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter>
     inline void
     rotate(_ForwardIter __first, _ForwardIter __middle, _ForwardIter __last)
     {
 
      
 
       typedef typename iterator_traits<_ForwardIter>::iterator_category _IterType;
       __rotate(__first, __middle, __last, _IterType());
     }
 # 1589 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _OutputIter>
     _OutputIter
     rotate_copy(_ForwardIter __first, _ForwardIter __middle,
                 _ForwardIter __last, _OutputIter __result)
     {
 
      
      
 
 
       return copy(__first, __middle, copy(__middle, __last, __result));
     }
 # 1612 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _Distance>
     inline _Distance
     __random_number(_Distance __n)
     {
 
       return lrand48() % __n;
 
 
 
     }
 # 1634 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _RandomAccessIter>
     inline void
     random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last)
     {
 
      
 
 
       if (__first == __last) return;
       for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
         iter_swap(__i, __first + __random_number((__i - __first) + 1));
     }
 # 1660 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _RandomAccessIter, typename _RandomNumberGenerator>
     void
     random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
                    _RandomNumberGenerator& __rand)
     {
 
      
 
 
       if (__first == __last) return;
       for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
         iter_swap(__i, __first + __rand((__i - __first) + 1));
     }
 
 
 
 
 
 
 
   template<typename _ForwardIter, typename _Predicate>
     _ForwardIter
     __partition(_ForwardIter __first, _ForwardIter __last,
                 _Predicate __pred,
                 forward_iterator_tag)
     {
       if (__first == __last) return __first;
 
       while (__pred(*__first))
         if (++__first == __last) return __first;
 
       _ForwardIter __next = __first;
 
       while (++__next != __last)
         if (__pred(*__next)) {
           swap(*__first, *__next);
           ++__first;
         }
 
       return __first;
     }
 
 
 
 
 
 
   template<typename _BidirectionalIter, typename _Predicate>
     _BidirectionalIter
     __partition(_BidirectionalIter __first, _BidirectionalIter __last,
                 _Predicate __pred,
                 bidirectional_iterator_tag)
     {
       while (true) {
         while (true)
           if (__first == __last)
             return __first;
           else if (__pred(*__first))
             ++__first;
           else
             break;
         --__last;
         while (true)
           if (__first == __last)
             return __first;
           else if (!__pred(*__last))
             --__last;
           else
             break;
         iter_swap(__first, __last);
         ++__first;
       }
     }
 # 1748 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Predicate>
     inline _ForwardIter
     partition(_ForwardIter __first, _ForwardIter __last,
               _Predicate __pred)
     {
 
      
      
 
 
       return __partition(__first, __last, __pred, __iterator_category(__first));
     }
 
 
 
 
 
 
 
   template<typename _ForwardIter, typename _Predicate, typename _Distance>
     _ForwardIter
     __inplace_stable_partition(_ForwardIter __first, _ForwardIter __last,
                                _Predicate __pred, _Distance __len)
     {
       if (__len == 1)
         return __pred(*__first) ? __last : __first;
       _ForwardIter __middle = __first;
       advance(__middle, __len / 2);
       _ForwardIter __begin = __inplace_stable_partition(__first, __middle,
                                                         __pred,
                                                         __len / 2);
       _ForwardIter __end = __inplace_stable_partition(__middle, __last,
                                                       __pred,
                                                       __len - __len / 2);
       rotate(__begin, __middle, __end);
       advance(__begin, distance(__middle, __end));
       return __begin;
     }
 
 
 
 
 
 
   template<typename _ForwardIter, typename _Pointer, typename _Predicate,
            typename _Distance>
     _ForwardIter
     __stable_partition_adaptive(_ForwardIter __first, _ForwardIter __last,
                                 _Predicate __pred, _Distance __len,
                                 _Pointer __buffer,
                                 _Distance __buffer_size)
     {
       if (__len <= __buffer_size) {
         _ForwardIter __result1 = __first;
         _Pointer __result2 = __buffer;
         for ( ; __first != __last ; ++__first)
           if (__pred(*__first)) {
             *__result1 = *__first;
             ++__result1;
           }
           else {
             *__result2 = *__first;
             ++__result2;
           }
         copy(__buffer, __result2, __result1);
         return __result1;
       }
       else {
         _ForwardIter __middle = __first;
         advance(__middle, __len / 2);
         _ForwardIter __begin = __stable_partition_adaptive(__first, __middle,
                                                            __pred,
                                                            __len / 2,
                                                            __buffer, __buffer_size);
         _ForwardIter __end = __stable_partition_adaptive( __middle, __last,
                                                           __pred,
                                                           __len - __len / 2,
                                                           __buffer, __buffer_size);
         rotate(__begin, __middle, __end);
         advance(__begin, distance(__middle, __end));
         return __begin;
       }
     }
 # 1848 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Predicate>
     _ForwardIter
     stable_partition(_ForwardIter __first, _ForwardIter __last,
                      _Predicate __pred)
     {
 
      
      
 
 
       if (__first == __last)
         return __first;
       else
       {
         typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
         typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
 
         _Temporary_buffer<_ForwardIter, _ValueType> __buf(__first, __last);
         if (__buf.size() > 0)
           return __stable_partition_adaptive(__first, __last, __pred,
                                              _DistanceType(__buf.requested_size()),
                                              __buf.begin(), __buf.size());
         else
           return __inplace_stable_partition(__first, __last, __pred,
                                             _DistanceType(__buf.requested_size()));
       }
     }
 
 
 
 
 
 
   template<typename _RandomAccessIter, typename _Tp>
     _RandomAccessIter
     __unguarded_partition(_RandomAccessIter __first, _RandomAccessIter __last,
                           _Tp __pivot)
     {
       while (true) {
         while (*__first < __pivot)
           ++__first;
         --__last;
         while (__pivot < *__last)
           --__last;
         if (!(__first < __last))
           return __first;
         iter_swap(__first, __last);
         ++__first;
       }
     }
 
 
 
 
 
 
   template<typename _RandomAccessIter, typename _Tp, typename _Compare>
     _RandomAccessIter
     __unguarded_partition(_RandomAccessIter __first, _RandomAccessIter __last,
                           _Tp __pivot, _Compare __comp)
     {
       while (true) {
         while (__comp(*__first, __pivot))
           ++__first;
         --__last;
         while (__comp(__pivot, *__last))
           --__last;
         if (!(__first < __last))
           return __first;
         iter_swap(__first, __last);
         ++__first;
       }
     }
 # 1929 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   enum { _M_threshold = 16 };
 
 
 
 
 
 
   template<typename _RandomAccessIter, typename _Tp>
     void
     __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val)
     {
       _RandomAccessIter __next = __last;
       --__next;
       while (__val < *__next) {
         *__last = *__next;
         __last = __next;
         --__next;
       }
       *__last = __val;
     }
 
 
 
 
 
 
   template<typename _RandomAccessIter, typename _Tp, typename _Compare>
     void
     __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val, _Compare __comp)
     {
       _RandomAccessIter __next = __last;
       --__next;
       while (__comp(__val, *__next)) {
         *__last = *__next;
         __last = __next;
         --__next;
       }
       *__last = __val;
     }
 
 
 
 
 
 
   template<typename _RandomAccessIter>
     void
     __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last)
     {
       if (__first == __last) return;
 
       for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
       {
         typename iterator_traits<_RandomAccessIter>::value_type __val = *__i;
         if (__val < *__first) {
           copy_backward(__first, __i, __i + 1);
           *__first = __val;
         }
         else
           __unguarded_linear_insert(__i, __val);
       }
     }
 
 
 
 
 
 
   template<typename _RandomAccessIter, typename _Compare>
     void
     __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
                      _Compare __comp)
     {
       if (__first == __last) return;
 
       for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
       {
         typename iterator_traits<_RandomAccessIter>::value_type __val = *__i;
         if (__comp(__val, *__first)) {
           copy_backward(__first, __i, __i + 1);
           *__first = __val;
         }
         else
           __unguarded_linear_insert(__i, __val, __comp);
       }
     }
 
 
 
 
 
 
   template<typename _RandomAccessIter>
     inline void
     __unguarded_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last)
     {
       typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
 
       for (_RandomAccessIter __i = __first; __i != __last; ++__i)
         __unguarded_linear_insert(__i, _ValueType(*__i));
     }
 
 
 
 
 
 
   template<typename _RandomAccessIter, typename _Compare>
     inline void
     __unguarded_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
                                _Compare __comp)
     {
       typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
 
       for (_RandomAccessIter __i = __first; __i != __last; ++__i)
         __unguarded_linear_insert(__i, _ValueType(*__i), __comp);
     }
 
 
 
 
 
 
   template<typename _RandomAccessIter>
     void
     __final_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last)
     {
       if (__last - __first > _M_threshold) {
         __insertion_sort(__first, __first + _M_threshold);
         __unguarded_insertion_sort(__first + _M_threshold, __last);
       }
       else
         __insertion_sort(__first, __last);
     }
 
 
 
 
 
 
   template<typename _RandomAccessIter, typename _Compare>
     void
     __final_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
                            _Compare __comp)
     {
       if (__last - __first > _M_threshold) {
         __insertion_sort(__first, __first + _M_threshold, __comp);
         __unguarded_insertion_sort(__first + _M_threshold, __last, __comp);
       }
       else
         __insertion_sort(__first, __last, __comp);
     }
 
 
 
 
 
 
   template<typename _Size>
     inline _Size
     __lg(_Size __n)
     {
       _Size __k;
       for (__k = 0; __n != 1; __n >>= 1) ++__k;
       return __k;
     }
 
 
 
 
 
 
   template<typename _RandomAccessIter, typename _Size>
     void
     __introsort_loop(_RandomAccessIter __first, _RandomAccessIter __last,
                      _Size __depth_limit)
     {
       typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
 
       while (__last - __first > _M_threshold) {
         if (__depth_limit == 0) {
           partial_sort(__first, __last, __last);
           return;
         }
         --__depth_limit;
         _RandomAccessIter __cut =
           __unguarded_partition(__first, __last,
                                 _ValueType(__median(*__first,
                                                     *(__first + (__last - __first)/2),
                                                     *(__last - 1))));
         __introsort_loop(__cut, __last, __depth_limit);
         __last = __cut;
       }
     }
 
 
 
 
 
 
   template<typename _RandomAccessIter, typename _Size, typename _Compare>
     void
     __introsort_loop(_RandomAccessIter __first, _RandomAccessIter __last,
                      _Size __depth_limit, _Compare __comp)
     {
       typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
 
       while (__last - __first > _M_threshold) {
         if (__depth_limit == 0) {
           partial_sort(__first, __last, __last, __comp);
           return;
         }
         --__depth_limit;
         _RandomAccessIter __cut =
           __unguarded_partition(__first, __last,
                                 _ValueType(__median(*__first,
                                                     *(__first + (__last - __first)/2),
                                                     *(__last - 1), __comp)),
            __comp);
         __introsort_loop(__cut, __last, __depth_limit, __comp);
         __last = __cut;
       }
     }
 # 2166 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _RandomAccessIter>
     inline void
     sort(_RandomAccessIter __first, _RandomAccessIter __last)
     {
       typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
 
 
      
 
      
 
       if (__first != __last) {
         __introsort_loop(__first, __last, __lg(__last - __first) * 2);
         __final_insertion_sort(__first, __last);
       }
     }
 # 2197 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _RandomAccessIter, typename _Compare>
     inline void
     sort(_RandomAccessIter __first, _RandomAccessIter __last, _Compare __comp)
     {
       typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
 
 
      
 
      
 
       if (__first != __last) {
         __introsort_loop(__first, __last, __lg(__last - __first) * 2, __comp);
         __final_insertion_sort(__first, __last, __comp);
       }
     }
 
 
 
 
 
 
 
   template<typename _RandomAccessIter>
     void
     __inplace_stable_sort(_RandomAccessIter __first, _RandomAccessIter __last)
     {
       if (__last - __first < 15) {
         __insertion_sort(__first, __last);
         return;
       }
       _RandomAccessIter __middle = __first + (__last - __first) / 2;
       __inplace_stable_sort(__first, __middle);
       __inplace_stable_sort(__middle, __last);
       __merge_without_buffer(__first, __middle, __last,
                              __middle - __first,
                              __last - __middle);
     }
 
 
 
 
 
 
   template<typename _RandomAccessIter, typename _Compare>
     void
     __inplace_stable_sort(_RandomAccessIter __first, _RandomAccessIter __last,
                           _Compare __comp)
     {
       if (__last - __first < 15) {
         __insertion_sort(__first, __last, __comp);
         return;
       }
       _RandomAccessIter __middle = __first + (__last - __first) / 2;
       __inplace_stable_sort(__first, __middle, __comp);
       __inplace_stable_sort(__middle, __last, __comp);
       __merge_without_buffer(__first, __middle, __last,
                              __middle - __first,
                              __last - __middle,
                              __comp);
     }
 
   template<typename _RandomAccessIter1, typename _RandomAccessIter2,
            typename _Distance>
     void
     __merge_sort_loop(_RandomAccessIter1 __first, _RandomAccessIter1 __last,
                       _RandomAccessIter2 __result, _Distance __step_size)
     {
       _Distance __two_step = 2 * __step_size;
 
       while (__last - __first >= __two_step) {
         __result = merge(__first, __first + __step_size,
                          __first + __step_size, __first + __two_step,
                          __result);
         __first += __two_step;
       }
 
       __step_size = min(_Distance(__last - __first), __step_size);
       merge(__first, __first + __step_size, __first + __step_size, __last,
             __result);
     }
 
   template<typename _RandomAccessIter1, typename _RandomAccessIter2,
            typename _Distance, typename _Compare>
     void
     __merge_sort_loop(_RandomAccessIter1 __first, _RandomAccessIter1 __last,
                       _RandomAccessIter2 __result, _Distance __step_size,
                       _Compare __comp)
     {
       _Distance __two_step = 2 * __step_size;
 
       while (__last - __first >= __two_step) {
         __result = merge(__first, __first + __step_size,
                          __first + __step_size, __first + __two_step,
                          __result,
                          __comp);
         __first += __two_step;
       }
       __step_size = min(_Distance(__last - __first), __step_size);
 
       merge(__first, __first + __step_size,
             __first + __step_size, __last,
             __result,
             __comp);
     }
 
   enum { _M_chunk_size = 7 };
 
   template<typename _RandomAccessIter, typename _Distance>
     void
     __chunk_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
                            _Distance __chunk_size)
     {
       while (__last - __first >= __chunk_size) {
         __insertion_sort(__first, __first + __chunk_size);
         __first += __chunk_size;
       }
       __insertion_sort(__first, __last);
     }
 
   template<typename _RandomAccessIter, typename _Distance, typename _Compare>
     void
     __chunk_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
                            _Distance __chunk_size, _Compare __comp)
     {
       while (__last - __first >= __chunk_size) {
         __insertion_sort(__first, __first + __chunk_size, __comp);
         __first += __chunk_size;
       }
       __insertion_sort(__first, __last, __comp);
     }
 
   template<typename _RandomAccessIter, typename _Pointer>
     void
     __merge_sort_with_buffer(_RandomAccessIter __first, _RandomAccessIter __last,
                              _Pointer __buffer)
     {
       typedef typename iterator_traits<_RandomAccessIter>::difference_type _Distance;
 
       _Distance __len = __last - __first;
       _Pointer __buffer_last = __buffer + __len;
 
       _Distance __step_size = _M_chunk_size;
       __chunk_insertion_sort(__first, __last, __step_size);
 
       while (__step_size < __len) {
         __merge_sort_loop(__first, __last, __buffer, __step_size);
         __step_size *= 2;
         __merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
         __step_size *= 2;
       }
     }
 
   template<typename _RandomAccessIter, typename _Pointer, typename _Compare>
     void
     __merge_sort_with_buffer(_RandomAccessIter __first, _RandomAccessIter __last,
                              _Pointer __buffer, _Compare __comp)
     {
       typedef typename iterator_traits<_RandomAccessIter>::difference_type _Distance;
 
       _Distance __len = __last - __first;
       _Pointer __buffer_last = __buffer + __len;
 
       _Distance __step_size = _M_chunk_size;
       __chunk_insertion_sort(__first, __last, __step_size, __comp);
 
       while (__step_size < __len) {
         __merge_sort_loop(__first, __last, __buffer, __step_size, __comp);
         __step_size *= 2;
         __merge_sort_loop(__buffer, __buffer_last, __first, __step_size, __comp);
         __step_size *= 2;
       }
     }
 
   template<typename _RandomAccessIter, typename _Pointer, typename _Distance>
     void
     __stable_sort_adaptive(_RandomAccessIter __first, _RandomAccessIter __last,
                            _Pointer __buffer, _Distance __buffer_size)
     {
       _Distance __len = (__last - __first + 1) / 2;
       _RandomAccessIter __middle = __first + __len;
       if (__len > __buffer_size) {
         __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size);
         __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size);
       }
       else {
         __merge_sort_with_buffer(__first, __middle, __buffer);
         __merge_sort_with_buffer(__middle, __last, __buffer);
       }
       __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),
                        _Distance(__last - __middle), __buffer, __buffer_size);
     }
 
   template<typename _RandomAccessIter, typename _Pointer, typename _Distance,
            typename _Compare>
     void
     __stable_sort_adaptive(_RandomAccessIter __first, _RandomAccessIter __last,
                            _Pointer __buffer, _Distance __buffer_size,
                            _Compare __comp)
     {
       _Distance __len = (__last - __first + 1) / 2;
       _RandomAccessIter __middle = __first + __len;
       if (__len > __buffer_size) {
         __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size,
                                __comp);
         __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size,
                                __comp);
       }
       else {
         __merge_sort_with_buffer(__first, __middle, __buffer, __comp);
         __merge_sort_with_buffer(__middle, __last, __buffer, __comp);
       }
       __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),
                        _Distance(__last - __middle), __buffer, __buffer_size,
                        __comp);
     }
 # 2430 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _RandomAccessIter>
     inline void
     stable_sort(_RandomAccessIter __first, _RandomAccessIter __last)
     {
       typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
       typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
 
 
      
 
      
 
       _Temporary_buffer<_RandomAccessIter, _ValueType> buf(__first, __last);
       if (buf.begin() == 0)
         __inplace_stable_sort(__first, __last);
       else
         __stable_sort_adaptive(__first, __last, buf.begin(), _DistanceType(buf.size()));
     }
 # 2466 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _RandomAccessIter, typename _Compare>
     inline void
     stable_sort(_RandomAccessIter __first, _RandomAccessIter __last, _Compare __comp)
     {
       typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
       typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
 
 
      
 
      
 
 
       _Temporary_buffer<_RandomAccessIter, _ValueType> buf(__first, __last);
       if (buf.begin() == 0)
         __inplace_stable_sort(__first, __last, __comp);
       else
         __stable_sort_adaptive(__first, __last, buf.begin(), _DistanceType(buf.size()),
                                __comp);
     }
 # 2502 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _RandomAccessIter>
     void
     partial_sort(_RandomAccessIter __first,
                  _RandomAccessIter __middle,
                  _RandomAccessIter __last)
     {
       typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
 
 
      
 
      
 
       make_heap(__first, __middle);
       for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
         if (*__i < *__first)
           __pop_heap(__first, __middle, __i, _ValueType(*__i));
       sort_heap(__first, __middle);
     }
 # 2540 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _RandomAccessIter, typename _Compare>
     void
     partial_sort(_RandomAccessIter __first,
                  _RandomAccessIter __middle,
                  _RandomAccessIter __last,
                  _Compare __comp)
     {
       typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
 
 
      
 
      
 
 
       make_heap(__first, __middle, __comp);
       for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
         if (__comp(*__i, *__first))
           __pop_heap(__first, __middle, __i, _ValueType(*__i), __comp);
       sort_heap(__first, __middle, __comp);
     }
 # 2579 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _RandomAccessIter>
     _RandomAccessIter
     partial_sort_copy(_InputIter __first, _InputIter __last,
                       _RandomAccessIter __result_first,
                       _RandomAccessIter __result_last)
     {
       typedef typename iterator_traits<_InputIter>::value_type _InputValueType;
       typedef typename iterator_traits<_RandomAccessIter>::value_type _OutputValueType;
       typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
 
 
      
      
      
      
 
       if (__result_first == __result_last) return __result_last;
       _RandomAccessIter __result_real_last = __result_first;
       while(__first != __last && __result_real_last != __result_last) {
         *__result_real_last = *__first;
         ++__result_real_last;
         ++__first;
       }
       make_heap(__result_first, __result_real_last);
       while (__first != __last) {
         if (*__first < *__result_first)
           __adjust_heap(__result_first, _DistanceType(0),
                         _DistanceType(__result_real_last - __result_first),
                         _InputValueType(*__first));
         ++__first;
       }
       sort_heap(__result_first, __result_real_last);
       return __result_real_last;
     }
 # 2633 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter, typename _RandomAccessIter, typename _Compare>
     _RandomAccessIter
     partial_sort_copy(_InputIter __first, _InputIter __last,
                       _RandomAccessIter __result_first,
                       _RandomAccessIter __result_last,
                       _Compare __comp)
     {
       typedef typename iterator_traits<_InputIter>::value_type _InputValueType;
       typedef typename iterator_traits<_RandomAccessIter>::value_type _OutputValueType;
       typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
 
 
      
      
      
      
 
 
       if (__result_first == __result_last) return __result_last;
       _RandomAccessIter __result_real_last = __result_first;
       while(__first != __last && __result_real_last != __result_last) {
         *__result_real_last = *__first;
         ++__result_real_last;
         ++__first;
       }
       make_heap(__result_first, __result_real_last, __comp);
       while (__first != __last) {
         if (__comp(*__first, *__result_first))
           __adjust_heap(__result_first, _DistanceType(0),
                         _DistanceType(__result_real_last - __result_first),
                         _InputValueType(*__first),
                         __comp);
         ++__first;
       }
       sort_heap(__result_first, __result_real_last, __comp);
       return __result_real_last;
     }
 # 2686 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _RandomAccessIter>
     void
     nth_element(_RandomAccessIter __first,
                 _RandomAccessIter __nth,
                 _RandomAccessIter __last)
     {
       typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
 
 
      
      
 
       while (__last - __first > 3) {
         _RandomAccessIter __cut =
           __unguarded_partition(__first, __last,
                                 _ValueType(__median(*__first,
                                                     *(__first + (__last - __first)/2),
                                                     *(__last - 1))));
         if (__cut <= __nth)
           __first = __cut;
         else
           __last = __cut;
       }
       __insertion_sort(__first, __last);
     }
 # 2728 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _RandomAccessIter, typename _Compare>
     void
     nth_element(_RandomAccessIter __first,
                 _RandomAccessIter __nth,
                 _RandomAccessIter __last,
                             _Compare __comp)
     {
       typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
 
 
      
      
 
 
       while (__last - __first > 3) {
         _RandomAccessIter __cut =
           __unguarded_partition(__first, __last,
                                 _ValueType(__median(*__first,
                                                     *(__first + (__last - __first)/2),
                                                     *(__last - 1),
                                                     __comp)),
                                 __comp);
         if (__cut <= __nth)
           __first = __cut;
         else
           __last = __cut;
       }
       __insertion_sort(__first, __last, __comp);
     }
 # 2768 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Tp>
     _ForwardIter
     lower_bound(_ForwardIter __first, _ForwardIter __last, const _Tp& __val)
     {
       typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
       typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
 
 
 
 
 
 
      
      
      
 
       _DistanceType __len = distance(__first, __last);
       _DistanceType __half;
       _ForwardIter __middle;
 
       while (__len > 0) {
         __half = __len >> 1;
         __middle = __first;
         advance(__middle, __half);
         if (*__middle < __val) {
           __first = __middle;
           ++__first;
           __len = __len - __half - 1;
         }
         else
           __len = __half;
       }
       return __first;
     }
 # 2816 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Tp, typename _Compare>
     _ForwardIter
     lower_bound(_ForwardIter __first, _ForwardIter __last,
                 const _Tp& __val, _Compare __comp)
     {
       typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
       typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
 
 
      
      
 
       _DistanceType __len = distance(__first, __last);
       _DistanceType __half;
       _ForwardIter __middle;
 
       while (__len > 0) {
         __half = __len >> 1;
         __middle = __first;
         advance(__middle, __half);
         if (__comp(*__middle, __val)) {
           __first = __middle;
           ++__first;
           __len = __len - __half - 1;
         }
         else
           __len = __half;
       }
       return __first;
     }
 # 2856 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Tp>
     _ForwardIter
     upper_bound(_ForwardIter __first, _ForwardIter __last, const _Tp& __val)
     {
       typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
       typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
 
 
 
      
      
      
 
       _DistanceType __len = distance(__first, __last);
       _DistanceType __half;
       _ForwardIter __middle;
 
       while (__len > 0) {
         __half = __len >> 1;
         __middle = __first;
         advance(__middle, __half);
         if (__val < *__middle)
           __len = __half;
         else {
           __first = __middle;
           ++__first;
           __len = __len - __half - 1;
         }
       }
       return __first;
     }
 # 2901 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Tp, typename _Compare>
     _ForwardIter
     upper_bound(_ForwardIter __first, _ForwardIter __last,
                 const _Tp& __val, _Compare __comp)
     {
       typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
       typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
 
 
      
      
 
       _DistanceType __len = distance(__first, __last);
       _DistanceType __half;
       _ForwardIter __middle;
 
       while (__len > 0) {
         __half = __len >> 1;
         __middle = __first;
         advance(__middle, __half);
         if (__comp(__val, *__middle))
           __len = __half;
         else {
           __first = __middle;
           ++__first;
           __len = __len - __half - 1;
         }
       }
       return __first;
     }
 # 2948 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Tp>
     pair<_ForwardIter, _ForwardIter>
     equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val)
     {
       typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
       typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
 
 
 
      
      
      
 
       _DistanceType __len = distance(__first, __last);
       _DistanceType __half;
       _ForwardIter __middle, __left, __right;
 
       while (__len > 0) {
         __half = __len >> 1;
         __middle = __first;
         advance(__middle, __half);
         if (*__middle < __val) {
           __first = __middle;
           ++__first;
           __len = __len - __half - 1;
         }
         else if (__val < *__middle)
           __len = __half;
         else {
           __left = lower_bound(__first, __middle, __val);
           advance(__first, __len);
           __right = upper_bound(++__middle, __first, __val);
           return pair<_ForwardIter, _ForwardIter>(__left, __right);
         }
       }
       return pair<_ForwardIter, _ForwardIter>(__first, __first);
     }
 # 3003 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Tp, typename _Compare>
     pair<_ForwardIter, _ForwardIter>
     equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
                 _Compare __comp)
     {
       typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
       typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
 
 
      
      
      
 
       _DistanceType __len = distance(__first, __last);
       _DistanceType __half;
       _ForwardIter __middle, __left, __right;
 
       while (__len > 0) {
         __half = __len >> 1;
         __middle = __first;
         advance(__middle, __half);
         if (__comp(*__middle, __val)) {
           __first = __middle;
           ++__first;
           __len = __len - __half - 1;
         }
         else if (__comp(__val, *__middle))
           __len = __half;
         else {
           __left = lower_bound(__first, __middle, __val, __comp);
           advance(__first, __len);
           __right = upper_bound(++__middle, __first, __val, __comp);
           return pair<_ForwardIter, _ForwardIter>(__left, __right);
         }
       }
       return pair<_ForwardIter, _ForwardIter>(__first, __first);
     }
 # 3052 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Tp>
     bool
     binary_search(_ForwardIter __first, _ForwardIter __last,
                   const _Tp& __val)
     {
 
 
      
      
 
      
 
       _ForwardIter __i = lower_bound(__first, __last, __val);
       return __i != __last && !(__val < *__i);
     }
 # 3083 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter, typename _Tp, typename _Compare>
     bool
     binary_search(_ForwardIter __first, _ForwardIter __last,
                   const _Tp& __val, _Compare __comp)
     {
 
      
      
 
      
 
 
       _ForwardIter __i = lower_bound(__first, __last, __val, __comp);
       return __i != __last && !__comp(__val, *__i);
     }
 # 3115 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
     _OutputIter
     merge(_InputIter1 __first1, _InputIter1 __last1,
           _InputIter2 __first2, _InputIter2 __last2,
           _OutputIter __result)
     {
 
      
      
      
 
      
 
 
      
 
 
       while (__first1 != __last1 && __first2 != __last2) {
         if (*__first2 < *__first1) {
           *__result = *__first2;
           ++__first2;
         }
         else {
           *__result = *__first1;
           ++__first1;
         }
         ++__result;
       }
       return copy(__first2, __last2, copy(__first1, __last1, __result));
     }
 # 3166 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
            typename _Compare>
     _OutputIter
     merge(_InputIter1 __first1, _InputIter1 __last1,
           _InputIter2 __first2, _InputIter2 __last2,
           _OutputIter __result, _Compare __comp)
     {
 
      
      
      
 
 
      
 
      
 
 
 
       while (__first1 != __last1 && __first2 != __last2) {
         if (__comp(*__first2, *__first1)) {
           *__result = *__first2;
           ++__first2;
         }
         else {
           *__result = *__first1;
           ++__first1;
         }
         ++__result;
       }
       return copy(__first2, __last2, copy(__first1, __last1, __result));
     }
 
 
 
 
 
 
   template<typename _BidirectionalIter, typename _Distance>
     void
     __merge_without_buffer(_BidirectionalIter __first,
                            _BidirectionalIter __middle,
                            _BidirectionalIter __last,
                            _Distance __len1, _Distance __len2)
     {
       if (__len1 == 0 || __len2 == 0)
         return;
       if (__len1 + __len2 == 2) {
         if (*__middle < *__first)
               iter_swap(__first, __middle);
         return;
       }
       _BidirectionalIter __first_cut = __first;
       _BidirectionalIter __second_cut = __middle;
       _Distance __len11 = 0;
       _Distance __len22 = 0;
       if (__len1 > __len2) {
         __len11 = __len1 / 2;
         advance(__first_cut, __len11);
         __second_cut = lower_bound(__middle, __last, *__first_cut);
         __len22 = distance(__middle, __second_cut);
       }
       else {
         __len22 = __len2 / 2;
         advance(__second_cut, __len22);
         __first_cut = upper_bound(__first, __middle, *__second_cut);
         __len11 = distance(__first, __first_cut);
       }
       rotate(__first_cut, __middle, __second_cut);
       _BidirectionalIter __new_middle = __first_cut;
       advance(__new_middle, distance(__middle, __second_cut));
       __merge_without_buffer(__first, __first_cut, __new_middle,
                              __len11, __len22);
       __merge_without_buffer(__new_middle, __second_cut, __last,
                              __len1 - __len11, __len2 - __len22);
     }
 
 
 
 
 
 
   template<typename _BidirectionalIter, typename _Distance, typename _Compare>
     void
     __merge_without_buffer(_BidirectionalIter __first,
                            _BidirectionalIter __middle,
                            _BidirectionalIter __last,
                            _Distance __len1, _Distance __len2,
                            _Compare __comp)
     {
       if (__len1 == 0 || __len2 == 0)
         return;
       if (__len1 + __len2 == 2) {
         if (__comp(*__middle, *__first))
               iter_swap(__first, __middle);
         return;
       }
       _BidirectionalIter __first_cut = __first;
       _BidirectionalIter __second_cut = __middle;
       _Distance __len11 = 0;
       _Distance __len22 = 0;
       if (__len1 > __len2) {
         __len11 = __len1 / 2;
         advance(__first_cut, __len11);
         __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
         __len22 = distance(__middle, __second_cut);
       }
       else {
         __len22 = __len2 / 2;
         advance(__second_cut, __len22);
         __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
         __len11 = distance(__first, __first_cut);
       }
       rotate(__first_cut, __middle, __second_cut);
       _BidirectionalIter __new_middle = __first_cut;
       advance(__new_middle, distance(__middle, __second_cut));
       __merge_without_buffer(__first, __first_cut, __new_middle,
                              __len11, __len22, __comp);
       __merge_without_buffer(__new_middle, __second_cut, __last,
                              __len1 - __len11, __len2 - __len22, __comp);
     }
 
 
 
 
 
 
   template<typename _BidirectionalIter1, typename _BidirectionalIter2,
            typename _Distance>
     _BidirectionalIter1
     __rotate_adaptive(_BidirectionalIter1 __first,
                       _BidirectionalIter1 __middle,
                       _BidirectionalIter1 __last,
                       _Distance __len1, _Distance __len2,
                       _BidirectionalIter2 __buffer,
                       _Distance __buffer_size)
     {
       _BidirectionalIter2 __buffer_end;
       if (__len1 > __len2 && __len2 <= __buffer_size) {
         __buffer_end = copy(__middle, __last, __buffer);
         copy_backward(__first, __middle, __last);
         return copy(__buffer, __buffer_end, __first);
       }
       else if (__len1 <= __buffer_size) {
         __buffer_end = copy(__first, __middle, __buffer);
         copy(__middle, __last, __first);
         return copy_backward(__buffer, __buffer_end, __last);
       }
       else {
         rotate(__first, __middle, __last);
         advance(__first, distance(__middle, __last));
         return __first;
       }
     }
 
 
 
 
 
 
   template<typename _BidirectionalIter1, typename _BidirectionalIter2,
            typename _BidirectionalIter3>
     _BidirectionalIter3
     __merge_backward(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
                      _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
                      _BidirectionalIter3 __result)
     {
       if (__first1 == __last1)
         return copy_backward(__first2, __last2, __result);
       if (__first2 == __last2)
         return copy_backward(__first1, __last1, __result);
       --__last1;
       --__last2;
       while (true) {
         if (*__last2 < *__last1) {
           *--__result = *__last1;
           if (__first1 == __last1)
             return copy_backward(__first2, ++__last2, __result);
           --__last1;
         }
         else {
           *--__result = *__last2;
           if (__first2 == __last2)
             return copy_backward(__first1, ++__last1, __result);
           --__last2;
         }
       }
     }
 
 
 
 
 
 
   template<typename _BidirectionalIter1, typename _BidirectionalIter2,
            typename _BidirectionalIter3, typename _Compare>
     _BidirectionalIter3
     __merge_backward(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
                      _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
                      _BidirectionalIter3 __result,
                      _Compare __comp)
     {
       if (__first1 == __last1)
         return copy_backward(__first2, __last2, __result);
       if (__first2 == __last2)
         return copy_backward(__first1, __last1, __result);
       --__last1;
       --__last2;
       while (true) {
         if (__comp(*__last2, *__last1)) {
           *--__result = *__last1;
           if (__first1 == __last1)
             return copy_backward(__first2, ++__last2, __result);
           --__last1;
         }
         else {
           *--__result = *__last2;
           if (__first2 == __last2)
             return copy_backward(__first1, ++__last1, __result);
           --__last2;
         }
       }
     }
 
 
 
 
 
 
   template<typename _BidirectionalIter, typename _Distance, typename _Pointer>
     void
     __merge_adaptive(_BidirectionalIter __first,
                      _BidirectionalIter __middle,
                      _BidirectionalIter __last,
                      _Distance __len1, _Distance __len2,
                      _Pointer __buffer, _Distance __buffer_size)
     {
           if (__len1 <= __len2 && __len1 <= __buffer_size) {
             _Pointer __buffer_end = copy(__first, __middle, __buffer);
             merge(__buffer, __buffer_end, __middle, __last, __first);
           }
           else if (__len2 <= __buffer_size) {
             _Pointer __buffer_end = copy(__middle, __last, __buffer);
             __merge_backward(__first, __middle, __buffer, __buffer_end, __last);
           }
           else {
             _BidirectionalIter __first_cut = __first;
             _BidirectionalIter __second_cut = __middle;
             _Distance __len11 = 0;
             _Distance __len22 = 0;
             if (__len1 > __len2) {
                   __len11 = __len1 / 2;
                   advance(__first_cut, __len11);
                   __second_cut = lower_bound(__middle, __last, *__first_cut);
                   __len22 = distance(__middle, __second_cut);
             }
             else {
                   __len22 = __len2 / 2;
                   advance(__second_cut, __len22);
                   __first_cut = upper_bound(__first, __middle, *__second_cut);
                   __len11 = distance(__first, __first_cut);
             }
             _BidirectionalIter __new_middle =
                   __rotate_adaptive(__first_cut, __middle, __second_cut,
                                     __len1 - __len11, __len22, __buffer,
                                     __buffer_size);
             __merge_adaptive(__first, __first_cut, __new_middle, __len11,
                              __len22, __buffer, __buffer_size);
             __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
                              __len2 - __len22, __buffer, __buffer_size);
           }
     }
 
 
 
 
 
 
   template<typename _BidirectionalIter, typename _Distance, typename _Pointer,
            typename _Compare>
     void
     __merge_adaptive(_BidirectionalIter __first,
                      _BidirectionalIter __middle,
                      _BidirectionalIter __last,
                      _Distance __len1, _Distance __len2,
                      _Pointer __buffer, _Distance __buffer_size,
                      _Compare __comp)
     {
           if (__len1 <= __len2 && __len1 <= __buffer_size) {
             _Pointer __buffer_end = copy(__first, __middle, __buffer);
             merge(__buffer, __buffer_end, __middle, __last, __first, __comp);
           }
           else if (__len2 <= __buffer_size) {
             _Pointer __buffer_end = copy(__middle, __last, __buffer);
             __merge_backward(__first, __middle, __buffer, __buffer_end, __last,
                                              __comp);
           }
           else {
             _BidirectionalIter __first_cut = __first;
             _BidirectionalIter __second_cut = __middle;
             _Distance __len11 = 0;
             _Distance __len22 = 0;
             if (__len1 > __len2) {
                   __len11 = __len1 / 2;
                   advance(__first_cut, __len11);
                   __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
                   __len22 = distance(__middle, __second_cut);
             }
             else {
                   __len22 = __len2 / 2;
                   advance(__second_cut, __len22);
                   __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
                   __len11 = distance(__first, __first_cut);
             }
             _BidirectionalIter __new_middle =
                   __rotate_adaptive(__first_cut, __middle, __second_cut,
                                     __len1 - __len11, __len22, __buffer,
                                     __buffer_size);
             __merge_adaptive(__first, __first_cut, __new_middle, __len11,
                              __len22, __buffer, __buffer_size, __comp);
             __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
                              __len2 - __len22, __buffer, __buffer_size, __comp);
           }
     }
 # 3508 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _BidirectionalIter>
     void
     inplace_merge(_BidirectionalIter __first,
                   _BidirectionalIter __middle,
                   _BidirectionalIter __last)
     {
       typedef typename iterator_traits<_BidirectionalIter>::value_type
           _ValueType;
       typedef typename iterator_traits<_BidirectionalIter>::difference_type
           _DistanceType;
 
 
      
 
      
 
       if (__first == __middle || __middle == __last)
         return;
 
       _DistanceType __len1 = distance(__first, __middle);
       _DistanceType __len2 = distance(__middle, __last);
 
       _Temporary_buffer<_BidirectionalIter, _ValueType> __buf(__first, __last);
       if (__buf.begin() == 0)
         __merge_without_buffer(__first, __middle, __last, __len1, __len2);
       else
         __merge_adaptive(__first, __middle, __last, __len1, __len2,
                          __buf.begin(), _DistanceType(__buf.size()));
     }
 # 3559 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _BidirectionalIter, typename _Compare>
     void
     inplace_merge(_BidirectionalIter __first,
                   _BidirectionalIter __middle,
                   _BidirectionalIter __last,
                   _Compare __comp)
     {
       typedef typename iterator_traits<_BidirectionalIter>::value_type
           _ValueType;
       typedef typename iterator_traits<_BidirectionalIter>::difference_type
           _DistanceType;
 
 
      
 
      
 
 
       if (__first == __middle || __middle == __last)
         return;
 
       _DistanceType __len1 = distance(__first, __middle);
       _DistanceType __len2 = distance(__middle, __last);
 
       _Temporary_buffer<_BidirectionalIter, _ValueType> __buf(__first, __last);
       if (__buf.begin() == 0)
         __merge_without_buffer(__first, __middle, __last, __len1, __len2, __comp);
       else
         __merge_adaptive(__first, __middle, __last, __len1, __len2,
                          __buf.begin(), _DistanceType(__buf.size()),
                          __comp);
     }
 
 
 
 
 
 
   template<typename _InputIter1, typename _InputIter2>
     bool
     includes(_InputIter1 __first1, _InputIter1 __last1,
              _InputIter2 __first2, _InputIter2 __last2)
     {
 
      
      
      
 
 
      
 
 
       while (__first1 != __last1 && __first2 != __last2)
         if (*__first2 < *__first1)
           return false;
         else if(*__first1 < *__first2)
           ++__first1;
         else
           ++__first1, ++__first2;
 
       return __first2 == __last2;
     }
 
   template<typename _InputIter1, typename _InputIter2, typename _Compare>
     bool
     includes(_InputIter1 __first1, _InputIter1 __last1,
              _InputIter2 __first2, _InputIter2 __last2, _Compare __comp)
     {
 
      
      
      
 
 
      
 
 
 
       while (__first1 != __last1 && __first2 != __last2)
         if (__comp(*__first2, *__first1))
           return false;
         else if(__comp(*__first1, *__first2))
           ++__first1;
         else
           ++__first1, ++__first2;
 
       return __first2 == __last2;
     }
 
   template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
     _OutputIter
     set_union(_InputIter1 __first1, _InputIter1 __last1,
               _InputIter2 __first2, _InputIter2 __last2,
               _OutputIter __result)
     {
 
      
      
      
 
      
 
 
      
 
 
       while (__first1 != __last1 && __first2 != __last2) {
         if (*__first1 < *__first2) {
           *__result = *__first1;
           ++__first1;
         }
         else if (*__first2 < *__first1) {
           *__result = *__first2;
           ++__first2;
         }
         else {
           *__result = *__first1;
           ++__first1;
           ++__first2;
         }
         ++__result;
       }
       return copy(__first2, __last2, copy(__first1, __last1, __result));
     }
 
   template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
            typename _Compare>
     _OutputIter
     set_union(_InputIter1 __first1, _InputIter1 __last1,
               _InputIter2 __first2, _InputIter2 __last2,
               _OutputIter __result, _Compare __comp)
     {
 
      
      
      
 
 
      
 
      
 
 
 
       while (__first1 != __last1 && __first2 != __last2) {
         if (__comp(*__first1, *__first2)) {
           *__result = *__first1;
           ++__first1;
         }
         else if (__comp(*__first2, *__first1)) {
           *__result = *__first2;
           ++__first2;
         }
         else {
           *__result = *__first1;
           ++__first1;
           ++__first2;
         }
         ++__result;
       }
       return copy(__first2, __last2, copy(__first1, __last1, __result));
     }
 
   template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
     _OutputIter
     set_intersection(_InputIter1 __first1, _InputIter1 __last1,
                      _InputIter2 __first2, _InputIter2 __last2,
                      _OutputIter __result)
     {
 
      
      
      
 
      
 
 
      
 
 
       while (__first1 != __last1 && __first2 != __last2)
         if (*__first1 < *__first2)
           ++__first1;
         else if (*__first2 < *__first1)
           ++__first2;
         else {
           *__result = *__first1;
           ++__first1;
           ++__first2;
           ++__result;
         }
       return __result;
     }
 
   template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
            typename _Compare>
     _OutputIter
     set_intersection(_InputIter1 __first1, _InputIter1 __last1,
                      _InputIter2 __first2, _InputIter2 __last2,
                      _OutputIter __result, _Compare __comp)
     {
 
      
      
      
 
 
      
 
      
 
 
 
       while (__first1 != __last1 && __first2 != __last2)
         if (__comp(*__first1, *__first2))
           ++__first1;
         else if (__comp(*__first2, *__first1))
           ++__first2;
         else {
           *__result = *__first1;
           ++__first1;
           ++__first2;
           ++__result;
         }
       return __result;
     }
 
   template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
     _OutputIter
     set_difference(_InputIter1 __first1, _InputIter1 __last1,
                    _InputIter2 __first2, _InputIter2 __last2,
                    _OutputIter __result)
     {
 
      
      
      
 
      
 
 
      
 
 
       while (__first1 != __last1 && __first2 != __last2)
         if (*__first1 < *__first2) {
           *__result = *__first1;
           ++__first1;
           ++__result;
         }
         else if (*__first2 < *__first1)
           ++__first2;
         else {
           ++__first1;
           ++__first2;
         }
       return copy(__first1, __last1, __result);
     }
 
   template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
            typename _Compare>
     _OutputIter
     set_difference(_InputIter1 __first1, _InputIter1 __last1,
                    _InputIter2 __first2, _InputIter2 __last2,
                    _OutputIter __result, _Compare __comp)
     {
 
      
      
      
 
 
      
 
      
 
 
 
       while (__first1 != __last1 && __first2 != __last2)
         if (__comp(*__first1, *__first2)) {
           *__result = *__first1;
           ++__first1;
           ++__result;
         }
         else if (__comp(*__first2, *__first1))
           ++__first2;
         else {
           ++__first1;
           ++__first2;
         }
       return copy(__first1, __last1, __result);
     }
 
   template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
     _OutputIter
     set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
                              _InputIter2 __first2, _InputIter2 __last2,
                              _OutputIter __result)
     {
 
      
      
      
 
      
 
 
      
 
 
       while (__first1 != __last1 && __first2 != __last2)
         if (*__first1 < *__first2) {
           *__result = *__first1;
           ++__first1;
           ++__result;
         }
         else if (*__first2 < *__first1) {
           *__result = *__first2;
           ++__first2;
           ++__result;
         }
         else {
           ++__first1;
           ++__first2;
         }
       return copy(__first2, __last2, copy(__first1, __last1, __result));
     }
 
   template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
            typename _Compare>
     _OutputIter
     set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
                              _InputIter2 __first2, _InputIter2 __last2,
                              _OutputIter __result,
                              _Compare __comp)
     {
 
      
      
      
 
 
      
 
      
 
 
 
       while (__first1 != __last1 && __first2 != __last2)
         if (__comp(*__first1, *__first2)) {
           *__result = *__first1;
           ++__first1;
           ++__result;
         }
         else if (__comp(*__first2, *__first1)) {
           *__result = *__first2;
           ++__first2;
           ++__result;
         }
         else {
           ++__first1;
           ++__first2;
         }
       return copy(__first2, __last2, copy(__first1, __last1, __result));
     }
 
 
 
 
   template<typename _ForwardIter>
     _ForwardIter
     max_element(_ForwardIter __first, _ForwardIter __last)
     {
 
      
      
 
 
       if (__first == __last) return __first;
       _ForwardIter __result = __first;
       while (++__first != __last)
         if (*__result < *__first)
           __result = __first;
       return __result;
     }
 
   template<typename _ForwardIter, typename _Compare>
     _ForwardIter
     max_element(_ForwardIter __first, _ForwardIter __last,
                 _Compare __comp)
     {
 
      
      
 
 
 
       if (__first == __last) return __first;
       _ForwardIter __result = __first;
       while (++__first != __last)
         if (__comp(*__result, *__first)) __result = __first;
       return __result;
     }
 
   template<typename _ForwardIter>
     _ForwardIter
     min_element(_ForwardIter __first, _ForwardIter __last)
     {
 
      
      
 
 
       if (__first == __last) return __first;
       _ForwardIter __result = __first;
       while (++__first != __last)
         if (*__first < *__result)
           __result = __first;
       return __result;
     }
 
   template<typename _ForwardIter, typename _Compare>
     _ForwardIter
     min_element(_ForwardIter __first, _ForwardIter __last,
                 _Compare __comp)
     {
 
      
      
 
 
 
       if (__first == __last) return __first;
       _ForwardIter __result = __first;
       while (++__first != __last)
         if (__comp(*__first, *__result))
           __result = __first;
       return __result;
     }
 
 
 
 
   template<typename _BidirectionalIter>
     bool
     next_permutation(_BidirectionalIter __first, _BidirectionalIter __last)
     {
 
      
      
 
 
       if (__first == __last)
         return false;
       _BidirectionalIter __i = __first;
       ++__i;
       if (__i == __last)
         return false;
       __i = __last;
       --__i;
 
       for(;;) {
         _BidirectionalIter __ii = __i;
         --__i;
         if (*__i < *__ii) {
           _BidirectionalIter __j = __last;
           while (!(*__i < *--__j))
             {}
           iter_swap(__i, __j);
           reverse(__ii, __last);
           return true;
         }
         if (__i == __first) {
           reverse(__first, __last);
           return false;
         }
       }
     }
 
   template<typename _BidirectionalIter, typename _Compare>
     bool
     next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
                      _Compare __comp)
     {
 
      
      
 
 
 
       if (__first == __last)
         return false;
       _BidirectionalIter __i = __first;
       ++__i;
       if (__i == __last)
         return false;
       __i = __last;
       --__i;
 
       for(;;) {
         _BidirectionalIter __ii = __i;
         --__i;
         if (__comp(*__i, *__ii)) {
           _BidirectionalIter __j = __last;
           while (!__comp(*__i, *--__j))
             {}
           iter_swap(__i, __j);
           reverse(__ii, __last);
           return true;
         }
         if (__i == __first) {
           reverse(__first, __last);
           return false;
         }
       }
     }
 
   template<typename _BidirectionalIter>
     bool
     prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last)
     {
 
      
      
 
 
       if (__first == __last)
         return false;
       _BidirectionalIter __i = __first;
       ++__i;
       if (__i == __last)
         return false;
       __i = __last;
       --__i;
 
       for(;;) {
         _BidirectionalIter __ii = __i;
         --__i;
         if (*__ii < *__i) {
           _BidirectionalIter __j = __last;
           while (!(*--__j < *__i))
             {}
           iter_swap(__i, __j);
           reverse(__ii, __last);
           return true;
         }
         if (__i == __first) {
           reverse(__first, __last);
           return false;
         }
       }
     }
 
   template<typename _BidirectionalIter, typename _Compare>
     bool
     prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
                      _Compare __comp)
     {
 
      
      
 
 
 
       if (__first == __last)
         return false;
       _BidirectionalIter __i = __first;
       ++__i;
       if (__i == __last)
         return false;
       __i = __last;
       --__i;
 
       for(;;) {
         _BidirectionalIter __ii = __i;
         --__i;
         if (__comp(*__ii, *__i)) {
           _BidirectionalIter __j = __last;
           while (!__comp(*--__j, *__i))
             {}
           iter_swap(__i, __j);
           reverse(__ii, __last);
           return true;
         }
         if (__i == __first) {
           reverse(__first, __last);
           return false;
         }
       }
     }
 
 
 
   template<typename _InputIter, typename _ForwardIter>
     _InputIter
     find_first_of(_InputIter __first1, _InputIter __last1,
                   _ForwardIter __first2, _ForwardIter __last2)
     {
 
      
      
      
 
 
 
       for ( ; __first1 != __last1; ++__first1)
         for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
           if (*__first1 == *__iter)
             return __first1;
       return __last1;
     }
 
   template<typename _InputIter, typename _ForwardIter, typename _BinaryPredicate>
     _InputIter
     find_first_of(_InputIter __first1, _InputIter __last1,
                   _ForwardIter __first2, _ForwardIter __last2,
                   _BinaryPredicate __comp)
     {
 
      
      
      
 
 
      
 
 
 
       for ( ; __first1 != __last1; ++__first1)
         for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
           if (__comp(*__first1, *__iter))
             return __first1;
       return __last1;
     }
 # 4201 "/usr/include/c++/3.2/bits/stl_algo.h" 3
   template<typename _ForwardIter1, typename _ForwardIter2>
     _ForwardIter1
     __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
                _ForwardIter2 __first2, _ForwardIter2 __last2,
                forward_iterator_tag, forward_iterator_tag)
     {
       if (__first2 == __last2)
         return __last1;
       else {
         _ForwardIter1 __result = __last1;
         while (1) {
           _ForwardIter1 __new_result
             = search(__first1, __last1, __first2, __last2);
           if (__new_result == __last1)
             return __result;
           else {
             __result = __new_result;
             __first1 = __new_result;
             ++__first1;
           }
         }
       }
     }
 
   template<typename _ForwardIter1, typename _ForwardIter2,
            typename _BinaryPredicate>
     _ForwardIter1
     __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
                _ForwardIter2 __first2, _ForwardIter2 __last2,
                forward_iterator_tag, forward_iterator_tag,
                _BinaryPredicate __comp)
     {
       if (__first2 == __last2)
         return __last1;
       else {
         _ForwardIter1 __result = __last1;
         while (1) {
           _ForwardIter1 __new_result
             = search(__first1, __last1, __first2, __last2, __comp);
           if (__new_result == __last1)
             return __result;
           else {
             __result = __new_result;
             __first1 = __new_result;
             ++__first1;
           }
         }
       }
     }
 
 
   template<typename _BidirectionalIter1, typename _BidirectionalIter2>
     _BidirectionalIter1
     __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
                _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
                bidirectional_iterator_tag, bidirectional_iterator_tag)
     {
 
      
      
 
       typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
       typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
 
       _RevIter1 __rlast1(__first1);
       _RevIter2 __rlast2(__first2);
       _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
                                    _RevIter2(__last2), __rlast2);
 
       if (__rresult == __rlast1)
         return __last1;
       else {
         _BidirectionalIter1 __result = __rresult.base();
         advance(__result, -distance(__first2, __last2));
         return __result;
       }
     }
 
   template<typename _BidirectionalIter1, typename _BidirectionalIter2,
            typename _BinaryPredicate>
     _BidirectionalIter1
     __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
                _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
                bidirectional_iterator_tag, bidirectional_iterator_tag,
                _BinaryPredicate __comp)
     {
 
      
      
 
       typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
       typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
 
       _RevIter1 __rlast1(__first1);
       _RevIter2 __rlast2(__first2);
       _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
                                    _RevIter2(__last2), __rlast2,
                                    __comp);
 
       if (__rresult == __rlast1)
         return __last1;
       else {
         _BidirectionalIter1 __result = __rresult.base();
         advance(__result, -distance(__first2, __last2));
         return __result;
       }
     }
 
 
 
   template<typename _ForwardIter1, typename _ForwardIter2>
     inline _ForwardIter1
     find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
              _ForwardIter2 __first2, _ForwardIter2 __last2)
     {
 
      
      
      
 
 
 
       return __find_end(__first1, __last1, __first2, __last2,
                         __iterator_category(__first1),
                         __iterator_category(__first2));
     }
 
   template<typename _ForwardIter1, typename _ForwardIter2,
            typename _BinaryPredicate>
     inline _ForwardIter1
     find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
              _ForwardIter2 __first2, _ForwardIter2 __last2,
              _BinaryPredicate __comp)
     {
 
      
      
      
 
 
 
       return __find_end(__first1, __last1, __first2, __last2,
                         __iterator_category(__first1),
                         __iterator_category(__first2),
                         __comp);
     }
 
 }
 # 70 "/usr/include/c++/3.2/algorithm" 2 3
 # 57 "/usr/include/c++/3.2/string" 2 3
 # 1 "/usr/include/c++/3.2/bits/basic_string.tcc" 1 3
 # 45 "/usr/include/c++/3.2/bits/basic_string.tcc" 3
 
 namespace std
 {
   template<typename _CharT, typename _Traits, typename _Alloc>
     const typename basic_string<_CharT, _Traits, _Alloc>::size_type
     basic_string<_CharT, _Traits, _Alloc>::
     _Rep::_S_max_size = (((npos - sizeof(_Rep))/sizeof(_CharT)) - 1) / 4;
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     const _CharT
     basic_string<_CharT, _Traits, _Alloc>::
     _Rep::_S_terminal = _CharT();
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     const typename basic_string<_CharT, _Traits, _Alloc>::size_type
     basic_string<_CharT, _Traits, _Alloc>::npos;
 
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     typename basic_string<_CharT, _Traits, _Alloc>::size_type
     basic_string<_CharT, _Traits, _Alloc>::_S_empty_rep_storage[
     (sizeof(_Rep) + sizeof(_CharT) + sizeof(size_type) - 1)/sizeof(size_type)];
 
 
 
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     template<typename _InIter>
       _CharT*
       basic_string<_CharT, _Traits, _Alloc>::
       _S_construct(_InIter __beg, _InIter __end, const _Alloc& __a,
                    input_iterator_tag)
       {
         if (__beg == __end && __a == _Alloc())
           return _S_empty_rep()._M_refcopy();
 
         _CharT __buf[100];
         size_type __i = 0;
         while (__beg != __end && __i < sizeof(__buf) / sizeof(_CharT))
           {
             __buf[__i++] = *__beg;
             ++__beg;
           }
         _Rep* __r = _Rep::_S_create(__i, __a);
         traits_type::copy(__r->_M_refdata(), __buf, __i);
         __r->_M_length = __i;
         try
           {
 
 
 
             for (;;)
               {
                 _CharT* __p = __r->_M_refdata() + __r->_M_length;
                 _CharT* __last = __r->_M_refdata() + __r->_M_capacity;
                 for (;;)
                   {
                     if (__beg == __end)
                       {
                         __r->_M_length = __p - __r->_M_refdata();
                         *__p = _Rep::_S_terminal;
                         return __r->_M_refdata();
                       }
                     if (__p == __last)
                       break;
                     *__p++ = *__beg;
                     ++__beg;
                   }
 
                 size_type __len = __p - __r->_M_refdata();
                 _Rep* __another = _Rep::_S_create(__len + 1, __a);
                 traits_type::copy(__another->_M_refdata(),
                                   __r->_M_refdata(), __len);
                 __r->_M_destroy(__a);
                 __r = __another;
                 __r->_M_length = __len;
               }
           }
         catch(...)
           {
             __r->_M_destroy(__a);
             throw;
           }
         return 0;
       }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     template <class _InIter>
       _CharT*
       basic_string<_CharT, _Traits, _Alloc>::
       _S_construct(_InIter __beg, _InIter __end, const _Alloc& __a,
                    forward_iterator_tag)
       {
         size_type __dnew = static_cast<size_type>(distance(__beg, __end));
 
 
         if (__builtin_expect(__beg == _InIter(), 0))
           __throw_logic_error("attempt to create string with null pointer");
 
         if (__beg == __end && __a == _Alloc())
           return _S_empty_rep()._M_refcopy();
 
 
         _Rep* __r = _Rep::_S_create(__dnew, __a);
         try
           { _S_copy_chars(__r->_M_refdata(), __beg, __end); }
         catch(...)
           {
             __r->_M_destroy(__a);
             throw;
           }
         __r->_M_length = __dnew;
 
         __r->_M_refdata()[__dnew] = _Rep::_S_terminal;
         return __r->_M_refdata();
       }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     _CharT*
     basic_string<_CharT, _Traits, _Alloc>::
     _S_construct(size_type __n, _CharT __c, const _Alloc& __a)
     {
       if (__n == 0 && __a == _Alloc())
         return _S_empty_rep()._M_refcopy();
 
 
       _Rep* __r = _Rep::_S_create(__n, __a);
       try
         {
           if (__n)
             traits_type::assign(__r->_M_refdata(), __n, __c);
         }
       catch(...)
         {
           __r->_M_destroy(__a);
           throw;
         }
       __r->_M_length = __n;
       __r->_M_refdata()[__n] = _Rep::_S_terminal;
       return __r->_M_refdata();
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>::
     basic_string(const basic_string& __str)
     : _M_dataplus(__str._M_rep()->_M_grab(_Alloc(), __str.get_allocator()),
                  __str.get_allocator())
     { }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>::
     basic_string(const _Alloc& __a)
     : _M_dataplus(_S_construct(size_type(), _CharT(), __a), __a)
     { }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>::
     basic_string(const basic_string& __str, size_type __pos, size_type __n)
     : _M_dataplus(_S_construct(__str._M_check(__pos),
                                __str._M_fold(__pos, __n), _Alloc()), _Alloc())
     { }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>::
     basic_string(const basic_string& __str, size_type __pos,
                  size_type __n, const _Alloc& __a)
     : _M_dataplus(_S_construct(__str._M_check(__pos),
                                __str._M_fold(__pos, __n), __a), __a)
     { }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>::
     basic_string(const _CharT* __s, size_type __n, const _Alloc& __a)
     : _M_dataplus(_S_construct(__s, __s + __n, __a), __a)
     { }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>::
     basic_string(const _CharT* __s, const _Alloc& __a)
     : _M_dataplus(_S_construct(__s, __s ? __s + traits_type::length(__s) : 0,
                                __a), __a)
     { }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>::
     basic_string(size_type __n, _CharT __c, const _Alloc& __a)
     : _M_dataplus(_S_construct(__n, __c, __a), __a)
     { }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     template<typename _InputIter>
     basic_string<_CharT, _Traits, _Alloc>::
     basic_string(_InputIter __beg, _InputIter __end, const _Alloc& __a)
     : _M_dataplus(_S_construct(__beg, __end, __a), __a)
     { }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>&
     basic_string<_CharT, _Traits, _Alloc>::assign(const basic_string& __str)
     {
       if (_M_rep() != __str._M_rep())
         {
 
           allocator_type __a = this->get_allocator();
           _CharT* __tmp = __str._M_rep()->_M_grab(__a, __str.get_allocator());
           _M_rep()->_M_dispose(__a);
           _M_data(__tmp);
         }
       return *this;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     void
     basic_string<_CharT, _Traits, _Alloc>::_Rep::
     _M_destroy(const _Alloc& __a) throw ()
     {
       size_type __size = sizeof(_Rep) + (_M_capacity + 1) * sizeof(_CharT);
       _Raw_bytes_alloc(__a).deallocate(reinterpret_cast<char*>(this), __size);
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     void
     basic_string<_CharT, _Traits, _Alloc>::_M_leak_hard()
     {
       if (_M_rep()->_M_is_shared())
         _M_mutate(0, 0, 0);
       _M_rep()->_M_set_leaked();
     }
 
 
 
 
 
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     void
     basic_string<_CharT, _Traits, _Alloc>::
     _M_mutate(size_type __pos, size_type __len1, size_type __len2)
     {
       size_type __old_size = this->size();
       const size_type __new_size = __old_size + __len2 - __len1;
       const _CharT* __src = _M_data() + __pos + __len1;
       const size_type __how_much = __old_size - __pos - __len1;
 
       if (_M_rep()->_M_is_shared() || __new_size > capacity())
         {
 
           allocator_type __a = get_allocator();
 
 
           const size_type __pagesize = 4096;
           const size_type __malloc_header_size = 4 * sizeof (void*);
 
           const size_type __page_capacity = (__pagesize - __malloc_header_size
                                              - sizeof(_Rep) - sizeof(_CharT))
                                              / sizeof(_CharT);
           _Rep* __r;
           if (__new_size > capacity() && __new_size > __page_capacity)
 
             __r = _Rep::_S_create(__new_size > 2*capacity() ?
                                   __new_size : 2*capacity(), __a);
           else
             __r = _Rep::_S_create(__new_size, __a);
           try
             {
               if (__pos)
                 traits_type::copy(__r->_M_refdata(), _M_data(), __pos);
               if (__how_much)
                 traits_type::copy(__r->_M_refdata() + __pos + __len2,
                                   __src, __how_much);
             }
           catch(...)
             {
               __r->_M_dispose(get_allocator());
               throw;
             }
           _M_rep()->_M_dispose(__a);
           _M_data(__r->_M_refdata());
       }
       else if (__how_much && __len1 != __len2)
         {
 
           traits_type::move(_M_data() + __pos + __len2, __src, __how_much);
         }
       _M_rep()->_M_set_sharable();
       _M_rep()->_M_length = __new_size;
       _M_data()[__new_size] = _Rep::_S_terminal;
 
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     void
     basic_string<_CharT, _Traits, _Alloc>::reserve(size_type __res)
     {
       if (__res > this->capacity() || _M_rep()->_M_is_shared())
         {
           if (__res > this->max_size())
             __throw_length_error("basic_string::reserve");
 
           if (__res < this->size())
             __res = this->size();
           allocator_type __a = get_allocator();
           _CharT* __tmp = _M_rep()->_M_clone(__a, __res - this->size());
           _M_rep()->_M_dispose(__a);
           _M_data(__tmp);
         }
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     void basic_string<_CharT, _Traits, _Alloc>::swap(basic_string& __s)
     {
       if (_M_rep()->_M_is_leaked())
         _M_rep()->_M_set_sharable();
       if (__s._M_rep()->_M_is_leaked())
         __s._M_rep()->_M_set_sharable();
       if (this->get_allocator() == __s.get_allocator())
         {
           _CharT* __tmp = _M_data();
           _M_data(__s._M_data());
           __s._M_data(__tmp);
         }
 
       else
         {
           basic_string __tmp1(_M_ibegin(), _M_iend(), __s.get_allocator());
           basic_string __tmp2(__s._M_ibegin(), __s._M_iend(),
                               this->get_allocator());
           *this = __tmp2;
           __s = __tmp1;
         }
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     typename basic_string<_CharT, _Traits, _Alloc>::_Rep*
     basic_string<_CharT, _Traits, _Alloc>::_Rep::
     _S_create(size_t __capacity, const _Alloc& __alloc)
     {
       typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
 
 
       if (__capacity > _S_max_size)
 
 
 
         __throw_length_error("basic_string::_S_create");
 
 
 
 
       size_t __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
 # 421 "/usr/include/c++/3.2/bits/basic_string.tcc" 3
       const size_t __pagesize = 4096;
       const size_t __subpagesize = 128;
       const size_t __malloc_header_size = 4 * sizeof (void*);
       if ((__size + __malloc_header_size) > __pagesize)
         {
           size_t __extra =
             (__pagesize - ((__size + __malloc_header_size) % __pagesize))
             % __pagesize;
           __capacity += __extra / sizeof(_CharT);
           __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
         }
       else if (__size > __subpagesize)
         {
           size_t __extra =
             (__subpagesize - ((__size + __malloc_header_size) % __subpagesize))
             % __subpagesize;
           __capacity += __extra / sizeof(_CharT);
           __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
         }
 
 
 
       void* __place = _Raw_bytes_alloc(__alloc).allocate(__size);
       _Rep *__p = new (__place) _Rep;
       __p->_M_capacity = __capacity;
       __p->_M_set_sharable();
       __p->_M_length = 0;
       return __p;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     _CharT*
     basic_string<_CharT, _Traits, _Alloc>::_Rep::
     _M_clone(const _Alloc& __alloc, size_type __res)
     {
 
       const size_type __requested_cap = _M_length + __res;
 
       const size_type __pagesize = 4096;
       const size_type __malloc_header_size = 4 * sizeof (void*);
 
       const size_type __page_capacity =
         (__pagesize - __malloc_header_size - sizeof(_Rep) - sizeof(_CharT))
         / sizeof(_CharT);
       _Rep* __r;
       if (__requested_cap > _M_capacity && __requested_cap > __page_capacity)
 
         __r = _Rep::_S_create(__requested_cap > 2*_M_capacity ?
                               __requested_cap : 2*_M_capacity, __alloc);
       else
         __r = _Rep::_S_create(__requested_cap, __alloc);
 
       if (_M_length)
         {
           try
             { traits_type::copy(__r->_M_refdata(), _M_refdata(), _M_length); }
           catch(...)
             {
               __r->_M_destroy(__alloc);
               throw;
             }
         }
       __r->_M_length = _M_length;
       return __r->_M_refdata();
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     void
     basic_string<_CharT, _Traits, _Alloc>::resize(size_type __n, _CharT __c)
     {
       if (__n > max_size())
         __throw_length_error("basic_string::resize");
       size_type __size = this->size();
       if (__size < __n)
         this->append(__n - __size, __c);
       else if (__n < __size)
         this->erase(__n);
 
     }
 
 
 
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     template<typename _InputIter>
       basic_string<_CharT, _Traits, _Alloc>&
       basic_string<_CharT, _Traits, _Alloc>::
       _M_replace(iterator __i1, iterator __i2, _InputIter __k1,
                  _InputIter __k2, input_iterator_tag)
       {
 
         basic_string __s(__k1, __k2);
         return _M_replace_safe(__i1, __i2, __s._M_ibegin(), __s._M_iend());
       }
 
 
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     template<typename _ForwardIter>
       basic_string<_CharT, _Traits, _Alloc>&
       basic_string<_CharT, _Traits, _Alloc>::
       _M_replace_safe(iterator __i1, iterator __i2, _ForwardIter __k1,
                       _ForwardIter __k2)
       {
         size_type __dnew = static_cast<size_type>(distance(__k1, __k2));
         size_type __dold = __i2 - __i1;
         size_type __dmax = this->max_size();
 
         if (__dmax <= __dnew)
           __throw_length_error("basic_string::_M_replace");
         size_type __off = __i1 - _M_ibegin();
         _M_mutate(__off, __dold, __dnew);
 
 
         if (__dnew)
           _S_copy_chars(_M_data() + __off, __k1, __k2);
 
         return *this;
       }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>&
     basic_string<_CharT, _Traits, _Alloc>::
     replace(size_type __pos1, size_type __n1, const basic_string& __str,
             size_type __pos2, size_type __n2)
     {
       const size_type __strsize = __str.size();
       if (__pos2 > __strsize)
         __throw_out_of_range("basic_string::replace");
       const bool __testn2 = __n2 < __strsize - __pos2;
       const size_type __foldn2 = __testn2 ? __n2 : __strsize - __pos2;
       return this->replace(__pos1, __n1,
                            __str._M_data() + __pos2, __foldn2);
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>&
     basic_string<_CharT, _Traits, _Alloc>::
     append(const basic_string& __str)
     {
 
 
 
       size_type __size = __str.size();
       size_type __len = __size + this->size();
       if (__len > this->capacity())
         this->reserve(__len);
       return _M_replace_safe(_M_iend(), _M_iend(), __str._M_ibegin(),
                              __str._M_iend());
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>&
     basic_string<_CharT, _Traits, _Alloc>::
     append(const basic_string& __str, size_type __pos, size_type __n)
     {
 
 
 
       size_type __len = min(__str.size() - __pos, __n) + this->size();
       if (__len > this->capacity())
         this->reserve(__len);
       return _M_replace_safe(_M_iend(), _M_iend(), __str._M_check(__pos),
                              __str._M_fold(__pos, __n));
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>&
     basic_string<_CharT, _Traits, _Alloc>::
     append(const _CharT* __s, size_type __n)
     {
       size_type __len = __n + this->size();
       if (__len > this->capacity())
         this->reserve(__len);
       return _M_replace_safe(_M_iend(), _M_iend(), __s, __s + __n);
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>&
     basic_string<_CharT, _Traits, _Alloc>::
     append(size_type __n, _CharT __c)
     {
       size_type __len = __n + this->size();
       if (__len > this->capacity())
         this->reserve(__len);
        return this->replace(_M_iend(), _M_iend(), __n, __c);
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>
     operator+(const _CharT* __lhs,
               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
     {
       typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
       typedef typename __string_type::size_type __size_type;
       __size_type __len = _Traits::length(__lhs);
       __string_type __str;
       __str.reserve(__len + __rhs.size());
       __str.append(__lhs, __lhs + __len);
       __str.append(__rhs);
       return __str;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>
     operator+(_CharT __lhs, const basic_string<_CharT, _Traits, _Alloc>& __rhs)
     {
       typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
       typedef typename __string_type::size_type __size_type;
       __string_type __str;
       __size_type __len = __rhs.size();
       __str.reserve(__len + 1);
       __str.append(__size_type(1), __lhs);
       __str.append(__rhs);
       return __str;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>&
     basic_string<_CharT, _Traits, _Alloc>::
     replace(iterator __i1, iterator __i2, size_type __n2, _CharT __c)
     {
       size_type __n1 = __i2 - __i1;
       size_type __off1 = __i1 - _M_ibegin();
       if (max_size() - (this->size() - __n1) <= __n2)
         __throw_length_error("basic_string::replace");
       _M_mutate (__off1, __n1, __n2);
 
       if (__n2)
         traits_type::assign(_M_data() + __off1, __n2, __c);
       return *this;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     typename basic_string<_CharT, _Traits, _Alloc>::size_type
     basic_string<_CharT, _Traits, _Alloc>::
     copy(_CharT* __s, size_type __n, size_type __pos) const
     {
       if (__pos > this->size())
         __throw_out_of_range("basic_string::copy");
 
       if (__n > this->size() - __pos)
         __n = this->size() - __pos;
 
       traits_type::copy(__s, _M_data() + __pos, __n);
 
       return __n;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     typename basic_string<_CharT, _Traits, _Alloc>::size_type
     basic_string<_CharT, _Traits, _Alloc>::
     find(const _CharT* __s, size_type __pos, size_type __n) const
     {
       size_type __size = this->size();
       size_t __xpos = __pos;
       const _CharT* __data = _M_data();
       for (; __xpos + __n <= __size; ++__xpos)
         if (traits_type::compare(__data + __xpos, __s, __n) == 0)
           return __xpos;
       return npos;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     typename basic_string<_CharT, _Traits, _Alloc>::size_type
     basic_string<_CharT, _Traits, _Alloc>::
     find(_CharT __c, size_type __pos) const
     {
       size_type __size = this->size();
       size_type __ret = npos;
       if (__pos < __size)
         {
           const _CharT* __data = _M_data();
           size_type __n = __size - __pos;
           const _CharT* __p = traits_type::find(__data + __pos, __n, __c);
           if (__p)
             __ret = __p - __data;
         }
       return __ret;
     }
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     typename basic_string<_CharT, _Traits, _Alloc>::size_type
     basic_string<_CharT, _Traits, _Alloc>::
     rfind(const _CharT* __s, size_type __pos, size_type __n) const
     {
       size_type __size = this->size();
       if (__n <= __size)
         {
           __pos = std::min(__size - __n, __pos);
           const _CharT* __data = _M_data();
           do
             {
               if (traits_type::compare(__data + __pos, __s, __n) == 0)
                 return __pos;
             }
           while (__pos-- > 0);
         }
       return npos;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     typename basic_string<_CharT, _Traits, _Alloc>::size_type
     basic_string<_CharT, _Traits, _Alloc>::
     rfind(_CharT __c, size_type __pos) const
     {
       size_type __size = this->size();
       if (__size)
         {
           size_t __xpos = __size - 1;
           if (__xpos > __pos)
             __xpos = __pos;
 
           for (++__xpos; __xpos-- > 0; )
             if (traits_type::eq(_M_data()[__xpos], __c))
               return __xpos;
         }
       return npos;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     typename basic_string<_CharT, _Traits, _Alloc>::size_type
     basic_string<_CharT, _Traits, _Alloc>::
     find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
     {
       for (; __n && __pos < this->size(); ++__pos)
         {
           const _CharT* __p = traits_type::find(__s, __n, _M_data()[__pos]);
           if (__p)
             return __pos;
         }
       return npos;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     typename basic_string<_CharT, _Traits, _Alloc>::size_type
     basic_string<_CharT, _Traits, _Alloc>::
     find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
     {
       size_type __size = this->size();
       if (__size && __n)
         {
           if (--__size > __pos)
             __size = __pos;
           do
             {
               if (traits_type::find(__s, __n, _M_data()[__size]))
                 return __size;
             }
           while (__size-- != 0);
         }
       return npos;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     typename basic_string<_CharT, _Traits, _Alloc>::size_type
     basic_string<_CharT, _Traits, _Alloc>::
     find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
     {
       size_t __xpos = __pos;
       for (; __xpos < this->size(); ++__xpos)
         if (!traits_type::find(__s, __n, _M_data()[__xpos]))
           return __xpos;
       return npos;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     typename basic_string<_CharT, _Traits, _Alloc>::size_type
     basic_string<_CharT, _Traits, _Alloc>::
     find_first_not_of(_CharT __c, size_type __pos) const
     {
       size_t __xpos = __pos;
       for (; __xpos < this->size(); ++__xpos)
         if (!traits_type::eq(_M_data()[__xpos], __c))
           return __xpos;
       return npos;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     typename basic_string<_CharT, _Traits, _Alloc>::size_type
     basic_string<_CharT, _Traits, _Alloc>::
     find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
     {
       size_type __size = this->size();
       if (__size)
         {
           if (--__size > __pos)
             __size = __pos;
           do
             {
               if (!traits_type::find(__s, __n, _M_data()[__size]))
                 return __size;
             }
           while (__size--);
         }
       return npos;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     typename basic_string<_CharT, _Traits, _Alloc>::size_type
     basic_string<_CharT, _Traits, _Alloc>::
     find_last_not_of(_CharT __c, size_type __pos) const
     {
       size_type __size = this->size();
       if (__size)
         {
           if (--__size > __pos)
             __size = __pos;
           do
             {
               if (!traits_type::eq(_M_data()[__size], __c))
                 return __size;
             }
           while (__size--);
         }
       return npos;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     int
     basic_string<_CharT, _Traits, _Alloc>::
     compare(size_type __pos, size_type __n, const basic_string& __str) const
     {
       size_type __size = this->size();
       size_type __osize = __str.size();
       if (__pos > __size)
         __throw_out_of_range("basic_string::compare");
 
       size_type __rsize= min(__size - __pos, __n);
       size_type __len = min(__rsize, __osize);
       int __r = traits_type::compare(_M_data() + __pos, __str.data(), __len);
       if (!__r)
         __r = __rsize - __osize;
       return __r;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     int
     basic_string<_CharT, _Traits, _Alloc>::
     compare(size_type __pos1, size_type __n1, const basic_string& __str,
             size_type __pos2, size_type __n2) const
     {
       size_type __size = this->size();
       size_type __osize = __str.size();
       if (__pos1 > __size || __pos2 > __osize)
         __throw_out_of_range("basic_string::compare");
 
       size_type __rsize = min(__size - __pos1, __n1);
       size_type __rosize = min(__osize - __pos2, __n2);
       size_type __len = min(__rsize, __rosize);
       int __r = traits_type::compare(_M_data() + __pos1,
                                      __str.data() + __pos2, __len);
       if (!__r)
         __r = __rsize - __rosize;
       return __r;
     }
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     int
     basic_string<_CharT, _Traits, _Alloc>::
     compare(const _CharT* __s) const
     {
       size_type __size = this->size();
       int __r = traits_type::compare(_M_data(), __s, __size);
       if (!__r)
         __r = __size - traits_type::length(__s);
       return __r;
     }
 
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     int
     basic_string <_CharT, _Traits, _Alloc>::
     compare(size_type __pos, size_type __n1, const _CharT* __s) const
     {
       size_type __size = this->size();
       if (__pos > __size)
         __throw_out_of_range("basic_string::compare");
 
       size_type __osize = traits_type::length(__s);
       size_type __rsize = min(__size - __pos, __n1);
       size_type __len = min(__rsize, __osize);
       int __r = traits_type::compare(_M_data() + __pos, __s, __len);
       if (!__r)
         __r = __rsize - __osize;
       return __r;
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     int
     basic_string <_CharT, _Traits, _Alloc>::
     compare(size_type __pos, size_type __n1, const _CharT* __s,
             size_type __n2) const
     {
       size_type __size = this->size();
       if (__pos > __size)
         __throw_out_of_range("basic_string::compare");
 
       size_type __osize = min(traits_type::length(__s), __n2);
       size_type __rsize = min(__size - __pos, __n1);
       size_type __len = min(__rsize, __osize);
       int __r = traits_type::compare(_M_data() + __pos, __s, __len);
       if (!__r)
         __r = __rsize - __osize;
       return __r;
     }
 
   template <class _CharT, class _Traits, class _Alloc>
     void
     _S_string_copy(const basic_string<_CharT, _Traits, _Alloc>& __str,
                    _CharT* __buf, typename _Alloc::size_type __bufsiz)
     {
       typedef typename _Alloc::size_type size_type;
       size_type __strsize = __str.size();
       size_type __bytes = min(__strsize, __bufsiz - 1);
       _Traits::copy(__buf, __str.data(), __bytes);
       __buf[__bytes] = _CharT();
     }
 
 
 
 
   extern template class basic_string<char>;
   extern template
     basic_istream<char>&
     operator>>(basic_istream<char>&, string&);
   extern template
     basic_ostream<char>&
     operator<<(basic_ostream<char>&, const string&);
   extern template
     basic_istream<char>&
     getline(basic_istream<char>&, string&, char);
   extern template
     basic_istream<char>&
     getline(basic_istream<char>&, string&);
 
   extern template class basic_string<wchar_t>;
   extern template
     basic_istream<wchar_t>&
     operator>>(basic_istream<wchar_t>&, wstring&);
   extern template
     basic_ostream<wchar_t>&
     operator<<(basic_ostream<wchar_t>&, const wstring&);
   extern template
     basic_istream<wchar_t>&
     getline(basic_istream<wchar_t>&, wstring&, wchar_t);
   extern template
     basic_istream<wchar_t>&
     getline(basic_istream<wchar_t>&, wstring&);
 }
 # 58 "/usr/include/c++/3.2/string" 2 3
 # 2 "gcc-3.2-ICE.cc" 2
 
 struct Bar
 {
     std::string str;
 };
 
 int main()
 {
   Bar bar = { "hello" };
 }
 
 --=-=-=
 
 
 Regards, Andy
 -- 
 Andreas Rottmann         | Dru@ICQ        | 118634484@ICQ | a.rottmann@gmx.at
 http://www.8ung.at/rotty | GnuPG Key: http://www.8ung.at/rotty/gpg.asc
 Fingerprint              | DFB4 4EB4 78A4 5EEE 6219  F228 F92F CFC5 01FD 5B62
 
 --=-=-=--


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]