
    gL                        d Z ddlmZ ddlmZ ddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZ	 ddlmZ ddlZdZdadadZd	 Zd
 Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(dZ)d Z* G d de+      Z,d Z-d Z.d Z/d Z0d  Z1d! Z2d" Z3d(d#Z4d$ Z5d)d%Z6e7d&k(  r e6ejp                  d'd        yy# e$ r 	 ddlmZ n# e$ r	 ddlmZ Y nw xY wY w xY w)*a8  
Basic tools for working with LMDB.

    copy: Consistent high speed backup an environment.
        %prog copy -e source.lmdb target.lmdb

    copyfd: Consistent high speed backup an environment to stdout.
        %prog copyfd -e source.lmdb > target.lmdb/data.mdb

    drop: Delete one or more sub-databases.
        %prog drop db1

    dump: Dump one or more databases to disk in 'cdbmake' format.
        Usage: dump [db1=file1.cdbmake db2=file2.cdbmake]

        If no databases are given, dumps the main database to 'main.cdbmake'.

    edit: Add/delete/replace values from a database.
        %prog edit --set key=value --set-file key=/path \
                   --add key=value --add-file key=/path/to/file \
                   --delete key

    get: Read one or more values from a database.
        %prog get [<key1> [<keyN> [..]]]

    readers: Display readers in the lock table
        %prog readers -e /path/to/db [-c]

        If -c is specified, clear stale readers.

    restore: Read one or more database from disk in 'cdbmake' format.
        %prog restore db1=file1.cdbmake db2=file2.cdbmake

        The special db name ":main:" may be used to indicate the main DB.

    rewrite: Re-create an environment using MDB_APPEND
        %prog rewrite -e src.lmdb -E dst.lmdb [<db1> [<dbN> ..]]

        If no databases are given, rewrites only the main database.

    shell: Open interactive console with ENV set to the open environment.

    stat: Print environment statistics.

    warm: Read environment into page cache sequentially.

    watch: Show live environment statistics
    )absolute_import)with_statementN)BytesIO)StringIOi   zutf-8c                 p     t               j                  dt              |       j                  t              S )zlGiven either a Python 2.x or 3.x str, return either a str (Python 2.x)
    or a bytes instance (Python 3.x).unicode)globalsgetstrencodeENCODING)ss    )lib/python3.12/site-packages/lmdb/tool.py	_to_bytesr   k   s)     )79==C(+228<<    c                 F    | t         j                  v xr t        |       dkD  S )zReturn ``True`` if the character `c` can be printed visibly and without
    adversely affecting printing position (e.g. newline).   )string	printableord)cs    r   isprintr   q   s"        0SVb[0r   c           	         t               }t        d      }t        |       D ]  \  }}t        j                  d   dk\  rt        |      }|dz  so|rE|j                  t        d             |j                  |       |j                  t        d             |j                  t        d|z               t        d      }|dz  s|j                  t        d	             |j                  t        d
t        |      fz               |t        |      rt        |      n
t        d      z  } dz  rpd|dz  z
  }|j                  t        d      |z         |j                  t        d	      |dz  z         |j                  t        d             |j                  |       |j                  t        d             |j                         j                  t              S )zQReturn a vaguely /usr/bin/xxd formatted representation of the bytestring
    `s`. r      r   z  
z%07x:    z%02x.   )r   r   	enumeratesysversion_infochrwriter   r   getvaluedecoder   )r   siopridxchneeds         r   xxdr-   w   sh    *C	2BQ<RA!#RBb		)D/*		"		)D/*IIi#./2BaIIin%		)Fc"gZ/01
wr{im	#>   RxS2X		)D/D()		)C.DAI./		)D/"		"IIio<<>  **r   c                  
   t        j                         } d| _        dt        j	                         z   | _        | j                  ddd       | j                  ddd	       | j                  d
dd       | j                  ddddd       | j                  dddd       | j                  ddd       | j                  dddd       | j                  dddd d!       | j                  d"dd#d$       | j                  d%      }|j                  d&dd'd()       | j                  d*      }|j                  d+d,d-       |j                  d.d,d/       |j                  d0d,d1       |j                  d2d,d/       |j                  d3d,d4       | j                  d5      }|j                  d6d7dd8       | j                  d9      }|j                  d:dd;       |j                  d<dd#d=       |j                  d>dd?d@       | S )ANzpython -mlmdbz%prog [options] <command>
z-ez--envzEnvironment file to open)helpz-dz--dbz Database to open (default: main)z-rz--readzOpen environment read-onlyz-Sz
--map_sizeint10z#Map size in megabytes (default: 10))typedefaultr/   z-sz--use-single-file
store_truez@The database was created as a single file and not a subdirectory)actionr/   z-Ez--target_envz$Target environment file for "dumpfd"z-xz--xxdzPrint values in xxd formatz-Mz	--max-dbs   zMaximum open DBs (default: 128)z--out-fd   z"copyfd" command target fdzOptions for "copy" commandz	--compactFz!Perform compaction while copying.)r5   r3   r/   zOptions for "edit" commandz--setappendzList of key=value pairs to set.z
--set-filez%List of key pairs to read from files.z--addzList of key=value pairs to add.z
--add-filez--deletez"List of key=value pairs to delete.zOptions for "readers" commandz-cz--cleanz"Clean stale readers? (default: no)zOptions for "watch" commandz--csvz(Generate CSV instead of terminal output.z
--intervalzInterval size (default: 1sec)z--window
   z!Average window size (default: 10))optparseOptionParserprog__doc__rstripusage
add_optionadd_option_group)parsergroups     r   make_parserrD      sv   ""$F!FK07>>3CCFL
dG*DE
dF)KL
dH+GH
dLud@  B
d/]  _
 dNA  C
dGL7  9
dKeS<  >
jua7  9##$@AE	[u=  ?##$@AE	WX;  =	\(A  C	WX;  =	\(A  C	Z>  @##$CDE	T9\>  @##$ABE	W\D  F	\q9  ;	ZeR=  ?Mr   c                 l    |r| |z  } t         j                  j                  d| d       t        d      )Nzlmdb.tool: r   r7   )r"   stderrr%   
SystemExit)fmtargss     r   dierJ      s-    tJJ#/0
Q-r   c           
      Z   | D ]  \  }}|j                  t        dt        |      t        |      fz               |j                  |       |j                  t        d             |j                  |       |j                  t        d              |j                  t        d             y )Nz+%d,%d:z->r   )r%   r   len)cursorfpkeyvalues       r   dump_cursor_to_fprQ      s{    
U
9C#e*'==>?

4!

4!  HHYt_r   c                    i }| D ]c  }|j                  d      \  }}}|st        d|       |dk(  rd }||v rt        d|       t        j                  |rt	        |      nd       |f||<   e |st        j                  d       df|d<   |S )N=z DB specification missing "=": %r:main:zDB specified twice: %rzmain.cdbmake)	partitionrJ   ENVopen_dbr   )rI   db_mapargdbnameseppaths         r   db_map_from_argsr]      s    FMM#.T2C8XFV(#.++6i&7tLdSv  KK-~>xMr   c                 6   t        |      dk7  rt        d       |d   }t        j                  j	                  |      rt        d|       t        j
                  |t        dd             t        d|d       t        j                  || j                  	       y )
Nr7   z,Please specify output directory (see --help)r   z#Output directory %r already exists.0755   zRunning copy to z....)compact)rL   rJ   osr\   existsmakedirsr0   printrV   copyra   )optsrI   
output_dirs      r   cmd_copyri      sm    
4yA~:;aJ	ww~~j!1:>KK
CN+	j
23HHZH.r   c                    |rt        d       	 t        j                  | j                  dd       t        j                  | j                         y # t        $ r1 t        j                         d   }t        d| j                  |       Y Yw xY w)Nz0"copyfd" command takes no arguments (see --help)wr   r7   zBad --out-fd %d: %s)	rJ   rb   fdopenout_fdOSErrorr"   exc_inforV   copyfd)rg   rI   es      r   
cmd_copyfdrr      sk    >?3
		$++sA&
 JJt{{	  3LLN1!4;;23s   !A 7B
	B
c                 N   t        |      }t        j                  d      5 }|j                         D ]O  \  }\  }}t	        |dt
              5 }t        d|d       |j                  |      }t        ||       d d d        Q 	 d d d        y # 1 sw Y   exY w# 1 sw Y   y xY w)NT)bufferswbzDumping to ...db)	r]   rV   beginitemsopenBUF_SIZEre   rM   rQ   )	rg   rI   rX   txnrZ   rx   r\   rN   rM   s	            r   cmd_dumpr~     s    d#F	4	 C"(,,.FJRdD(+rD23r*!&"- ,+ #1 
!	 ++ 
!	 s#   +B.B;
BBBB$c                    |j                   }t        j                  |d      fd}d}	 |dz  } |d      }|dk(  r	 |S |dk7  rt        d|       	 t	         |d      d      }t	         |d	      d      } |      }	 |d      dk7  rt        d|        |      }
t        |	      t        |
      z   ||z   k7  rt        d|        |d      dk7  rt        d|       | j                  |	|
|       # t
        $ r t        d
|       Y w xY w)Nr7   c                 :    dj                  t        |             S )Nr   )joiniter)r[   read1s    r   <lambda>z(restore_cursor_from_fp.<locals>.<lambda>  s    SXXd5#&67r   r      
   +z$bad or missing plus, line/record #%d   ,r9      :z&bad or missing length, line/record #%dr   s   ->z)bad or missing separator, line/record #%dz"short key or data, line/record #%dz bad line ending, line/record #%drw   )read	functoolspartialrJ   r0   
ValueErrorrL   put)r}   rN   rx   r   
read_untilrec_nrplusklendlenrO   datar   s              @r   restore_cursor_from_fpr     s%   77DdA&E7JF
!Aw5=. M- T\6?	Bz$',Dz$',D 4j7e;VDDzHs4y dTk24f=7e2F;Tb!3   	B8&A	Bs   $C3 3D
Dc                 T   |st        d       t        t        j                  t        t        |            }t        |      D ]Y  \  }}||   }|dk(  rt        d       t        d|d       t        j                  d      5 }|j                  |       d d d        [ y # 1 sw Y   fxY w)Nz3Must specify at least one sub-database (see --help)rT   zCannot drop main DBzDropping DB rv   Tr%   )	rJ   maprV   rW   r   r!   re   ry   drop)rg   rI   dbsr*   rx   namer}   s          r   cmd_dropr   5  s    AB
ckkC	40
2CS>RCy8%&T+,YYTY"cHHRL #" "
 #"s   BB'	c                     | j                   r!t        dt        j                         fz         t        t        j	                                y )NzCleaned %d stale entries.)cleanre   rV   reader_checkreadersrg   rI   s     r   cmd_readersr   C  s1    zz)S-=-=-?,AAB	#++-r   c                 N   t        |      }t        j                  dd      5 }|j                         D ]N  \  }\  }}t	        |dt
              5 }t        d|d       t        |||      }t        d||fz         d d d        P 	 d d d        y # 1 sw Y   dxY w# 1 sw Y   y xY w)NT)rt   r%   rbzRestoring from rv   zLoaded %d keys from %r)r]   rV   ry   rz   r{   r|   re   r   )	rg   rI   rX   r}   rZ   rx   r\   rN   counts	            r   cmd_restorer   I  s    d#F	4t	,"(,,.FJRdD(+r67.sB;.%>? ,+ #1 
-	,++ 
-	,s#   +B-B;
BBBB$c                 j    t        dt        |             D cg c]  }| |   | |dz
     z
   c}S c c}w )Nr7   )rangerL   )hstis     r   deltar   S  s8    +0CH+=>+=aSVc!a%j +=>>>s   0z
/sys/blockc                    t         j                  j                  t              sy t        j                  |       }|j
                  dz	  d|j
                  dz  fd}t        j                  t              D ]~  }t         j                  j                  t        |      } ||      }|r|c S t        j                  |      D ]2  }t         j                  j                  ||      } ||      }|s.|c c S   y )Nr`   :   c                 \   t         j                  j                  | d      }t         j                  j                  |      r`t	        |      5 }|j                         j                         k(  r)t         j                  j                  | d      cd d d        S 	 d d d        y y # 1 sw Y   y xY w)Ndevstat)rb   r\   r   rc   r{   r   strip)rootpathdpathrN   devss      r   maybez_find_diskstat.<locals>.maybe`  ss    Xu-77>>% e779??$,77<<&9 ,  !s   AB""B+)rb   r\   rc   	SYS_BLOCKr   st_devlistdirr   )r\   str   r   basepathstatpath	base2pathr   s          @r   _find_diskstatr   Z  s    77>>)$	Bii1nbii$&67D: 

9%77<<	40?OJJx(DXt4IY'H	 ) &r   c                       e Zd ZdZd Zd Zy)DiskStatter)readsreads_mergedsectors_readread_mswriteswrites_mergedsectors_writtenwrite_msio_countio_mstotal_msc                 D    t        |      | _        | j                          y N)r{   rN   refresh)selfr\   s     r   __init__zDiskStatter.__init__  s    t*r   c                       j                   j                  d       t               j                   fdt	         j                   j                         j                               D               y )Nr   c              3   X   K   | ]!  \  }}j                   |   t        |      f # y wr   )FIELDSr0   ).0r   r   r   s      r   	<genexpr>z&DiskStatter.refresh.<locals>.<genexpr>  s/      I&Gda  ;;q>3q62&Gs   '*)rN   seekvarsupdater!   r   split)r   s   `r   r   zDiskStatter.refresh  sL    QT
 I&/0D0D0F&GI 	Ir   N)__name__
__module____qualname__r   r   r    r   r   r   r   s  s    FIr   r   c                 ^    d d  fd}fd}ddfdfddfdfddfd	fd
d |fd      fddfdfd
d |fd      fddfdfd
d |fd      fddfdfdd|fdd ||      fddfdfdd |fd      fg}d t        t        j                               }|r*t        |      |d
d |fd       fd
d! |fd"      fgz  }d#}|D cg c]  \  }}}t	        |       }	}} j
                  rXt        j                  t        j                  t
        j                  $      }
|
j                  |D cg c]  \  }}}|
 c}}       d#}	 	 t        j                         t        j                         rj                          g }t        |      D ]?  \  }\  }}}| |       z  }|j                  |       t!        |	|   t	        |            |	|<   A  j
                  r
j                  |       n|t"        k7  s|t$        d%z
  z  spt        |      D ]=  \  }\  }}}t        j                  j'                  |j)                  |	|   d&z                ? t        j                  j'                  d'       t"        }t        |      D ]9  \  }}t        j                  j'                  |j)                  |	|   d&z                ; t        j                  j'                  d'       t+        j,                   j.                         |d&z  }c c}}w c c}}w # t0        $ r Y y w xY w)(Nc                 B     t        j                          fd}|S )Nc                     j                                 t              j                  kD  rj                          t              dk  ryt	        t                    t        t              dz
        z  } | j                  z  S )Nr7   r   )r8   rL   windowpopleftsumr   floatinterval)nfunchistoryrg   s    r   
windowfuncz-cmd_watch.<locals>.window.<locals>.windowfunc  sj    NN46"7|dkk)!7|q E'N#eCL1,<&==At}}$$r   )collectionsdeque)r   r   r   rg   s   ` @r   r   zcmd_watch.<locals>.window  s    ##%	% r   c                        d   d   z  dz  S )N	last_pgnopsize      0Ar   )infor   s   r   r   zcmd_watch.<locals>.<lambda>  s    T+&g6(Br   z%dDepthc                       d   S )Ndepthr   r   s   r   r   zcmd_watch.<locals>.<lambda>  s	    4=r   Branchc                       d   S )Nbranch_pagesr   r   s   r   r   zcmd_watch.<locals>.<lambda>  s
    D$8r   Leafc                       d   S N
leaf_pagesr   r   s   r   r   zcmd_watch.<locals>.<lambda>  s
    $|"4r   z%+dzLeaf/sc                       d   S r   r   r   s   r   r   zcmd_watch.<locals>.<lambda>  s
    4+=r   Oflowc                       d   S Noverflow_pagesr   r   s   r   r   zcmd_watch.<locals>.<lambda>  s    4(8#9r   zOflow/sc                       d   S r   r   r   s   r   r   zcmd_watch.<locals>.<lambda>  s    D1A,Br   Recsc                       d   S Nentriesr   r   s   r   r   zcmd_watch.<locals>.<lambda>  s	    $y/r   zRecs/sc                       d   S r  r   r   s   r   r   zcmd_watch.<locals>.<lambda>  s	    4	?r   Rdrsc                       d   S )Nnum_readersr   r   s   r   r   zcmd_watch.<locals>.<lambda>  s
    $}"5r   z%.2fEnvMbz%+.2fzEnvMb/sTxsc                       d   S N
last_txnidr   r	  s   r   r   zcmd_watch.<locals>.<lambda>  s
    l!3r   zTxs/sc                       d   S r  r   r	  s   r   r   zcmd_watch.<locals>.<lambda>  s
    $|*<r   zSctRd/sc                       j                   S r   )r   statters   r   r   zcmd_watch.<locals>.<lambda>  s    g.B.Br   zSctWr/sc                       j                   S r   )r   r  s   r   r   zcmd_watch.<locals>.<lambda>  s    g.E.Er   r   )quotingr   r7   r   )r   rV   r\   r   rL   csvwriterr"   stdout	QUOTE_ALLwriterowr   r   r   r!   r8   max_TERM_WIDTH_TERM_HEIGHTr%   rjusttimesleepr   KeyboardInterrupt)rg   rI   r   envmbcolsr   
term_width_headwidthsr  cntvalsr   rH   r   valr   r   r  s   `                @@@r   	cmd_watchr*    s   DD CE 
'01	(89	&45	(F#=>?	'9:	)V$BCD	&12	(F#:;<	&56	'5!	)VE]+	%34	'6"<=>D  Gchhj)Hh'Iv&BCDIv&EFG
 	

 J*./$JAtQc$i$F/xxCJJ>5*!T156
C88:D88:D!D(1$$$CtDFlC q	3s84q	 )8
 xx%,SL1<L5M09$,,Ct

((F1IM)BC 1@JJ$$T*!,J'oFAsJJ$$SYYvay1}%=> .

  &JJt}}%1HC3  0 6<  s   LL
F9L   	L,+L,c                    t         j                         }t         j                         }d}|d   |d   z  }t        j                  dt	        d|z              }t        j
                         }| j                  rt        | j                  d|      }nt        | j                  dz   d|      }|j                         |k  r%|j                  |       |j                         |k  r%t        d|d	z  d
t        j
                         |z
  z  fz         y )Ni   r   r   B r   z	/data.mdbzWarmed %.2fmb in %dmsr   i  )rV   r   r   arrayr   r  use_single_filer{   envtellreadintore   )	rg   rI   r   r   bufsizelast_offsetbuft0rN   s	            r   cmd_warmr7    s    88:D88:DGw-${"33K
++c9Vg%56
7C	B$((D'*$(([($8
'')k
!
C '')k
!	
!!4499;+;#<
=> ?r   c           	      `   | j                   st        d       t        j                         }t	        j
                  | j                   |d   dz  | j                  dddd      }g }|D ]W  }|dk(  rd n|}t        j                  t        |            }|j                  t        |            }|j                  |||f       Y |s6|j                  dt        j                  d       |j                  d       f       |D ]~  \  }}}t        d|d	       |j                  |d
      5 }	t        j                  |d      5 }
|
j                         D ]  \  }}|	j                  ||d        	 d d d        d d d         t        d       |j                  d       y # 1 sw Y   0xY w# 1 sw Y   xY w)Nz,Must specify target environment path with -Emap_sizer   FT)r9  max_dbssyncwritemap	map_asyncmetasyncrT   zWriting rv   )rx   r%   )rx   rt   )r8   z	Syncing..)
target_envrJ   rV   r   lmdbr{   r:  rW   r   r8   re   ry   rM   r   r;  )rg   rI   src_infor?  r   rY   r   src_dbdst_dbwtxnrtxnrO   rP   s                r   cmd_rewriterF    sp   ??:;xxzH4??$,Z$81$<#'<<e$(D$)	+J ChtCYt_-##IdO4

C()	  

Hckk$/1C1CD1IJK #ff'(t4fd3t"&++-JCHHS%H5 #0 4 54 !$ 
+OOD 43 54s$   #F$;-F)F$F!F$$F-	c                 p   t        |      dkD  }t        j                  dt              5 }|D ]r  }|j	                  t        |            }|t        |d       .|rt        |d       | j                  rt        t        |             _t        t        |             t 	 d d d        y # 1 sw Y   y xY w)Nr7   T)rt   rx   z	: missingr   )	rL   rV   ry   DBr
   r   re   r-   bytes)rg   rI   print_headerr}   rY   rP   s         r   cmd_getrK    s    t9q=L	4B	'3CGGIcN+E}s,-sn%xxc%j!eEl#  
(	'	's   A8B,,B5c                 @   |rt        d       t        j                  d      5 }|j                  t              }| j
                  xs g D ]=  }t        |      j                  t        d            \  }}}|j                  ||d       ? | j                  xs g D ];  }t        |      j                  t        d            \  }}}|j                  ||       = | j                  xs g D ]"  }|j                  t        |      t               $ | j                  xs g D ]`  }t        |      j                  t        d            \  }}}t        |d      5 }	|j                  ||	j                         d       d d d        b | j                  xs g D ]^  }t        |      j                  t        d            \  }}}t        |d      5 }	|j                  ||	j                                d d d        ` 	 d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)	Nz;Edit command only takes options, not arguments (see --help)Tr   rw   rS   F)	overwriter   )rJ   rV   ry   rM   rH  addr   rU   r   setdeleteadd_filer{   r   set_file)
rg   rI   r}   rM   elemrO   r$  rP   r\   rN   s
             r   cmd_editrT  #  s   IJ		#r"HHNND%dO55inEMCEJJsEUJ3 # HHNND%dO55inEMCEJJsE" # ;;$"$CJJy~"J- % MM'R'D$T?44Ys^DLCDdD!R

3	U
; "! (
 MM'R'D$T?44Ys^DLCDdD!R

3	* "! (% 
	 "!
 "!) 
	s=   D0H#G<7AH!H(
H<HHHHHc                 b    dd l }dd l}|j                  t                     j	                          y )Nr   )codereadlineInteractiveConsoler	   interact)rg   rI   rV  rW  s       r   	cmd_shellrZ  ?  s!    GI&//1r   c                     t        j                   t        j                                t        j                   t        j                                y r   )pprintrV   r   r   r   s     r   cmd_statr]  E  s&    
MM#((*
MM#((*r   c                     	 dd l }dd l}|j                  t        j                  j                         |j                  d      }t        j                  d|      \  }}||fS # t        $ r | cY S w xY w)Nr   1234hh)
fcntltermiosioctlr"   r  fileno
TIOCGWINSZstructunpack	Exception)r3   ra  rb  r   heightwidths         r   _get_term_widthrk  J  sd    KK

))+W-?-?HdA.f} s   AA   A.-A.c                      t               \  aay r   )rk  r  r  )rI   s    r   _on_sigwinchrm  U  s     / 1Kr   c           	         t               }|j                  |       \  }}|st        d       |j                  st        d       t	        j
                  |j                  |j                  dz  |j                   |j                  d|j                  dk(        a
|j                  r(t        j                  t        |j                              at        t         d      r(t!        j                   t         j"                  t$               t%                t'               j)                  d|d	   z         }|st        d
|d	           |||dd         y )Nz%Please specify a command (see --help)z"Please specify environment (--env)i   FREAD)r9  subdirr:  createreadonlySIGWINCHcmd_r   zNo such command: r7   )rD   
parse_argsrJ   r0  r@  r{   r9  r/  r:  r   rV   rx   rW   r   rH  hasattrsignalrs  rm  r	   r
   )argvrB   rg   rI   r   s        r   mainry  Z  s    ]F""4(JD$348801 ))DHHt}}w'>4K_K_G_ LLfATVC ww[[477+,vz"foo|4N9==$q')*DT!W./tABxr   __main__r7   ))P      r   )9r=   
__future__r   r   r.  r   r  r   r:   rb   r\  rw  r   rf  r"   r  ior   r   ImportError	cStringIOr@  r|   rV   rH  r   r   r   r-   rD   rJ   rQ   r]   ri   rr   r~   r   r   r   r   r   r   r   objectr   r*  r7  rF  rK  rT  rZ  r]  rk  rm  ry  r   rx  r   r   r   <module>r     sG  ./b ' %   
   	     
 &&  
	 =1+@.b&
/
."J@? 	 2I& I2Pf?&@$"+82
2
8 z!" y  &&& &%&&s6    C C,CC,C&#C,%C&&C,+C,