a ,Nbv@s$ddlZddZGdddeZGdddeZGdd d eZGd d d eZGd d d eZGdddeZGdddeZ GdddeZ GdddeZ GdddeZ GdddeZ GdddeZGdddeZGdddeZGd d!d!eZGd"d#d#eZGd$d%d%eZGd&d'd'eZGd(d)d)eZGd*d+d+eZGd,d-d-eZGd.d/d/eZGd0d1d1eZGd2d3d3eZGd4d5d5eZGd6d7d7eZGd8d9d9eZGd:d;d;eZGdd?d?eZ Gd@dAdAeZ!GdBdCdCeZ"GdDdEdEeZ#GdFdGdGeZ$GdHdIdIeZ%GdJdKdKeZ&GdLdMdMeZ'GdNdOdOeZ(GdPdQdQeZ)GdRdSdSeZ*GdTdUdUeZ+GdVdWdWeZ,GdXdYdYeZ-GdZd[d[eZ.Gd\d]d]eZ/Gd^d_d_eZ0Gd`dadaeZ1GdbdcdceZ2GdddedeeZ3dS)fNcCs2t|tr&dddd|DdSt|SdS)z[ Get the representation of an object, with dedicated pprint-like format for lists. [z, css|]}t|ddVqdS)  N)_reprreplace).0er 3/usr/lib/python3.9/site-packages/pycparser/c_ast.py z_repr..z ]N) isinstancelistjoinrepr)objr r r rs rc@s8eZdZdZddZddZejdddddfd d ZdS) Noder c Cs|jjd}d}d}|jddD]f}||7}||7}||dtt||dddt|t|jj7}d }d dt|jj}q"||d 7}|S) z? Generates a python representation of the current node (N=rz  ,r)) __class____name__ __slots__rgetattrrlen)selfresultindent separatornamer r r __repr__"s : z Node.__repr__cCsdS)z3 A sequence of all children that are Nodes Nr rr r r children5sz Node.childrenrFNc sd|}|r4|dur4||jjd|dn||jjdjr|r~fddjD}dd d |D} n(fd djD} dd d | D} || |r|d j|dD]"\} } | j||d|||| dqdS)a Pretty print the Node and all its attributes and children (recursively) to a buffer. buf: Open IO buffer into which the Node is printed. offset: Initial offset (amount of leading spaces) attrnames: True if you want to see the attribute names in name=value pairs. False to only see the values. nodenames: True if you want to see the actual node names within their parents. showcoord: Do you want the coordinates of each Node to be displayed. rNz : z: csg|]}|t|fqSr rrnr%r r Xr zNode.show..z, css|]}d|VqdS)z%s=%sNr )rnvr r r r Yr zNode.show..csg|]}t|qSr r'r(r%r r r*[r css|]}d|VqdS)z%sNr )rvr r r r \r z (at %s)r)offset attrnames nodenames showcoord _my_node_name)writerr attr_namesrcoordr&show) rbufr.r/r0r1r2ZleadZnvlistZattrstrZvlistZ child_namechildr r%r r6:s.    z Node.show) r __module__ __qualname__rr$r&sysstdoutr6r r r r rsrc@s$eZdZdZdZddZddZdS) NodeVisitora- A base NodeVisitor class for visiting c_ast nodes. Subclass it and define your own visit_XXX methods, where XXX is the class name you want to visit with these methods. For example: class ConstantVisitor(NodeVisitor): def __init__(self): self.values = [] def visit_Constant(self, node): self.values.append(node.value) Creates a list of values of all the constant nodes encountered below the given node. To use it: cv = ConstantVisitor() cv.visit(node) Notes: * generic_visit() will be called for AST nodes for which no visit_XXX method was defined. * The children of nodes for which a visit_XXX was defined will not be visited - if you need this, call generic_visit() on the node. You can use: NodeVisitor.generic_visit(self, node) * Modeled after Python's own AST visiting facilities (the ast module of Python 3.0) NcCsZ|jduri|_|j|jjd}|durRd|jj}t|||j}||j|jj<||S)z Visit a node. NZvisit_) _method_cachegetrrr generic_visit)rnodeZvisitormethodr r r visits  zNodeVisitor.visitcCs|D]}||qdS)zy Called if no explicit visitor function exists for a node. Implements preorder visiting of the node. N)rC)rrAcr r r r@szNodeVisitor.generic_visit)rr9r:__doc__r>rCr@r r r r r=ms!r=c@s.eZdZdZd ddZddZddZd ZdS) ArrayDecl)typedim dim_qualsr5 __weakref__NcCs||_||_||_||_dSN)rGrHrIr5)rrGrHrIr5r r r __init__szArrayDecl.__init__cCs@g}|jdur|d|jf|jdur8|d|jft|S)NrGrH)rGappendrHtuplernodelistr r r r&szArrayDecl.childrenccs(|jdur|jV|jdur$|jVdSrK)rGrHr%r r r __iter__s  zArrayDecl.__iter__)rI)Nrr9r:rrLr&rQr4r r r r rFs  rFc@s.eZdZdZd ddZddZddZd ZdS) ArrayRef)r# subscriptr5rJNcCs||_||_||_dSrK)r#rTr5)rr#rTr5r r r rLszArrayRef.__init__cCs@g}|jdur|d|jf|jdur8|d|jft|S)Nr#rT)r#rMrTrNrOr r r r&szArrayRef.childrenccs(|jdur|jV|jdur$|jVdSrK)r#rTr%r r r rQs  zArrayRef.__iter__r )NrRr r r r rSs  rSc@s.eZdZdZd ddZddZddZd ZdS) Assignment)oplvaluervaluer5rJNcCs||_||_||_||_dSrK)rVrWrXr5)rrVrWrXr5r r r rLszAssignment.__init__cCs@g}|jdur|d|jf|jdur8|d|jft|S)NrWrX)rWrMrXrNrOr r r r&szAssignment.childrenccs(|jdur|jV|jdur$|jVdSrK)rWrXr%r r r rQs  zAssignment.__iter__rV)NrRr r r r rUs  rUc@s.eZdZdZd ddZddZddZd ZdS) BinaryOp)rVleftrightr5rJNcCs||_||_||_||_dSrK)rVr[r\r5)rrVr[r\r5r r r rLszBinaryOp.__init__cCs@g}|jdur|d|jf|jdur8|d|jft|S)Nr[r\)r[rMr\rNrOr r r r&szBinaryOp.childrenccs(|jdur|jV|jdur$|jVdSrK)r[r\r%r r r rQs  zBinaryOp.__iter__rY)NrRr r r r rZs  rZc@s.eZdZdZd ddZddZddZd ZdS) Breakr5rJNcCs ||_dSrKr5rr5r r r rLszBreak.__init__cCsdSNr r r%r r r r&szBreak.childrenccsdSrKr r%r r r rQszBreak.__iter__r )NrRr r r r r]s  r]c@s.eZdZdZd ddZddZddZd ZdS) Case)exprstmtsr5rJNcCs||_||_||_dSrK)rcrdr5)rrcrdr5r r r rLsz Case.__init__cCsPg}|jdur|d|jft|jp(gD]\}}|d||fq,t|S)Nrc stmts[%d])rcrM enumeraterdrNrrPir8r r r r&s z Case.childrenccs,|jdur|jV|jpgD] }|VqdSrK)rcrdrr8r r r rQs z Case.__iter__r )NrRr r r r rb s  rbc@s.eZdZdZd ddZddZddZd ZdS) Cast)to_typercr5rJNcCs||_||_||_dSrK)rkrcr5)rrkrcr5r r r rL$sz Cast.__init__cCs@g}|jdur|d|jf|jdur8|d|jft|S)Nrkrc)rkrMrcrNrOr r r r&)sz Cast.childrenccs(|jdur|jV|jdur$|jVdSrK)rkrcr%r r r rQ/s  z Cast.__iter__r )NrRr r r r rj"s  rjc@s.eZdZdZd ddZddZddZd ZdS) Compound) block_itemsr5rJNcCs||_||_dSrK)rmr5)rrmr5r r r rL9szCompound.__init__cCs6g}t|jpgD]\}}|d||fqt|S)Nzblock_items[%d])rfrmrMrNrgr r r r&=szCompound.childrenccs|jpgD] }|Vq dSrK)rmrir r r rQCszCompound.__iter__r )NrRr r r r rl7s  rlc@s.eZdZdZd ddZddZddZd ZdS) CompoundLiteral)rGinitr5rJNcCs||_||_||_dSrK)rGror5)rrGror5r r r rLKszCompoundLiteral.__init__cCs@g}|jdur|d|jf|jdur8|d|jft|S)NrGro)rGrMrorNrOr r r r&PszCompoundLiteral.childrenccs(|jdur|jV|jdur$|jVdSrK)rGror%r r r rQVs  zCompoundLiteral.__iter__r )NrRr r r r rnIs  rnc@s.eZdZdZd ddZddZddZd ZdS) Constant)rGvaluer5rJNcCs||_||_||_dSrK)rGrqr5)rrGrqr5r r r rL`szConstant.__init__cCs g}t|SrKrNrOr r r r&eszConstant.childrenccsdSrKr r%r r r rQiszConstant.__iter__)rGrq)NrRr r r r rp^s  rpc@s.eZdZdZd ddZddZddZd ZdS) Continuer^NcCs ||_dSrKr_r`r r r rLqszContinue.__init__cCsdSrar r%r r r r&tszContinue.childrenccsdSrKr r%r r r rQwszContinue.__iter__r )NrRr r r r rsos  rsc@s.eZdZdZd ddZddZddZd ZdS) Decl) r#qualsstoragefuncspecrGrobitsizer5rJNc Cs4||_||_||_||_||_||_||_||_dSrK)r#rurvrwrGrorxr5) rr#rurvrwrGrorxr5r r r rLsz Decl.__init__cCsZg}|jdur|d|jf|jdur8|d|jf|jdurR|d|jft|S)NrGrorx)rGrMrorxrNrOr r r r&s z Decl.childrenccs:|jdur|jV|jdur$|jV|jdur6|jVdSrK)rGrorxr%r r r rQs    z Decl.__iter__)r#rurvrw)NrRr r r r rt}s  rtc@s.eZdZdZd ddZddZddZd ZdS) DeclList)declsr5rJNcCs||_||_dSrK)rzr5)rrzr5r r r rLszDeclList.__init__cCs6g}t|jpgD]\}}|d||fqt|SNz decls[%d]rfrzrMrNrgr r r r&szDeclList.childrenccs|jpgD] }|Vq dSrKrzrir r r rQszDeclList.__iter__r )NrRr r r r rys  ryc@s.eZdZdZd ddZddZddZd ZdS) Default)rdr5rJNcCs||_||_dSrK)rdr5)rrdr5r r r rLszDefault.__init__cCs6g}t|jpgD]\}}|d||fqt|S)Nre)rfrdrMrNrgr r r r&szDefault.childrenccs|jpgD] }|Vq dSrK)rdrir r r rQszDefault.__iter__r )NrRr r r r r~s  r~c@s.eZdZdZd ddZddZddZd ZdS) DoWhilecondstmtr5rJNcCs||_||_||_dSrKrrr5rrrr5r r r rLszDoWhile.__init__cCs@g}|jdur|d|jf|jdur8|d|jft|SNrrrrMrrNrOr r r r&szDoWhile.childrenccs(|jdur|jV|jdur$|jVdSrKrrr%r r r rQs  zDoWhile.__iter__r )NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) EllipsisParamr^NcCs ||_dSrKr_r`r r r rLszEllipsisParam.__init__cCsdSrar r%r r r r&szEllipsisParam.childrenccsdSrKr r%r r r rQszEllipsisParam.__iter__r )NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) EmptyStatementr^NcCs ||_dSrKr_r`r r r rLszEmptyStatement.__init__cCsdSrar r%r r r r&szEmptyStatement.childrenccsdSrKr r%r r r rQszEmptyStatement.__iter__r )NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) Enum)r#valuesr5rJNcCs||_||_||_dSrK)r#rr5)rr#rr5r r r rLsz Enum.__init__cCs&g}|jdur|d|jft|S)Nr)rrMrNrOr r r r&sz Enum.childrenccs|jdur|jVdSrK)rr%r r r rQs z Enum.__iter__r#)NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) Enumerator)r#rqr5rJNcCs||_||_||_dSrK)r#rqr5)rr#rqr5r r r rLszEnumerator.__init__cCs&g}|jdur|d|jft|S)Nrq)rqrMrNrOr r r r&szEnumerator.childrenccs|jdur|jVdSrK)rqr%r r r rQ s zEnumerator.__iter__r)NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) EnumeratorList) enumeratorsr5rJNcCs||_||_dSrK)rr5)rrr5r r r rLszEnumeratorList.__init__cCs6g}t|jpgD]\}}|d||fqt|S)Nzenumerators[%d])rfrrMrNrgr r r r&szEnumeratorList.childrenccs|jpgD] }|Vq dSrK)rrir r r rQszEnumeratorList.__iter__r )NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) ExprListexprsr5rJNcCs||_||_dSrKrr5rrr5r r r rL'szExprList.__init__cCs6g}t|jpgD]\}}|d||fqt|SNz exprs[%d]rfrrMrNrgr r r r&+szExprList.childrenccs|jpgD] }|Vq dSrKrrir r r rQ1szExprList.__iter__r )NrRr r r r r%s  rc@s.eZdZdZd ddZddZddZd ZdS) FileAST)extr5rJNcCs||_||_dSrK)rr5)rrr5r r r rL9szFileAST.__init__cCs6g}t|jpgD]\}}|d||fqt|S)Nzext[%d])rfrrMrNrgr r r r&=szFileAST.childrenccs|jpgD] }|Vq dSrK)rrir r r rQCszFileAST.__iter__r )NrRr r r r r7s  rc@s.eZdZdZd ddZddZddZd ZdS) For)rornextrr5rJNcCs"||_||_||_||_||_dSrK)rorrrr5)rrorrrr5r r r rLKs z For.__init__cCstg}|jdur|d|jf|jdur8|d|jf|jdurR|d|jf|jdurl|d|jft|S)Nrorrr)rorMrrrrNrOr r r r&Rs z For.childrenccsL|jdur|jV|jdur$|jV|jdur6|jV|jdurH|jVdSrK)rorrrr%r r r rQZs    z For.__iter__r )NrRr r r r rIs   rc@s.eZdZdZd ddZddZddZd ZdS) FuncCall)r#argsr5rJNcCs||_||_||_dSrK)r#rr5)rr#rr5r r r rLhszFuncCall.__init__cCs@g}|jdur|d|jf|jdur8|d|jft|S)Nr#r)r#rMrrNrOr r r r&mszFuncCall.childrenccs(|jdur|jV|jdur$|jVdSrK)r#rr%r r r rQss  zFuncCall.__iter__r )NrRr r r r rfs  rc@s.eZdZdZd ddZddZddZd ZdS) FuncDecl)rrGr5rJNcCs||_||_||_dSrK)rrGr5)rrrGr5r r r rL}szFuncDecl.__init__cCs@g}|jdur|d|jf|jdur8|d|jft|S)NrrG)rrMrGrNrOr r r r&szFuncDecl.childrenccs(|jdur|jV|jdur$|jVdSrK)rrGr%r r r rQs  zFuncDecl.__iter__r )NrRr r r r r{s  rc@s.eZdZdZd ddZddZddZd ZdS) FuncDef)decl param_declsbodyr5rJNcCs||_||_||_||_dSrK)rrrr5)rrrrr5r r r rLszFuncDef.__init__cCsjg}|jdur|d|jf|jdur8|d|jft|jpBgD]\}}|d||fqFt|S)Nrrzparam_decls[%d])rrMrrfrrNrgr r r r&s zFuncDef.childrenccs>|jdur|jV|jdur$|jV|jp,gD] }|Vq.dSrK)rrrrir r r rQs   zFuncDef.__iter__r )NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) Gotor#r5rJNcCs||_||_dSrKr#r5rr#r5r r r rLsz Goto.__init__cCs g}t|SrKrrrOr r r r&sz Goto.childrenccsdSrKr r%r r r rQsz Goto.__iter__r)NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) IDrNcCs||_||_dSrKrrr r r rLsz ID.__init__cCs g}t|SrKrrrOr r r r&sz ID.childrenccsdSrKr r%r r r rQsz ID.__iter__r)NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) IdentifierType)namesr5rJNcCs||_||_dSrK)rr5)rrr5r r r rLszIdentifierType.__init__cCs g}t|SrKrrrOr r r r&szIdentifierType.childrenccsdSrKr r%r r r rQszIdentifierType.__iter__)r)NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) Ifriftrueiffalser5rJNcCs||_||_||_||_dSrKrrrr5rrrrr5r r r rLsz If.__init__cCsZg}|jdur|d|jf|jdur8|d|jf|jdurR|d|jft|SNrrrrrMrrrNrOr r r r&s z If.childrenccs:|jdur|jV|jdur$|jV|jdur6|jVdSrKrrrr%r r r rQs    z If.__iter__r )NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) InitListrNcCs||_||_dSrKrrr r r rLszInitList.__init__cCs6g}t|jpgD]\}}|d||fqt|Srrrgr r r r&szInitList.childrenccs|jpgD] }|Vq dSrKrrir r r rQszInitList.__iter__r )NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) Label)r#rr5rJNcCs||_||_||_dSrK)r#rr5)rr#rr5r r r rLszLabel.__init__cCs&g}|jdur|d|jft|S)Nr)rrMrNrOr r r r& szLabel.childrenccs|jdur|jVdSrK)rr%r r r rQs zLabel.__iter__r)NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) NamedInitializer)r#rcr5rJNcCs||_||_||_dSrK)r#rcr5)rr#rcr5r r r rLszNamedInitializer.__init__cCsPg}|jdur|d|jft|jp(gD]\}}|d||fq,t|S)Nrczname[%d])rcrMrfr#rNrgr r r r&s zNamedInitializer.childrenccs,|jdur|jV|jpgD] }|VqdSrK)rcr#rir r r rQ%s zNamedInitializer.__iter__r )NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) ParamList)paramsr5rJNcCs||_||_dSrK)rr5)rrr5r r r rL/szParamList.__init__cCs6g}t|jpgD]\}}|d||fqt|S)Nz params[%d])rfrrMrNrgr r r r&3szParamList.childrenccs|jpgD] }|Vq dSrK)rrir r r rQ9szParamList.__iter__r )NrRr r r r r-s  rc@s.eZdZdZd ddZddZddZd ZdS) PtrDecl)rurGr5rJNcCs||_||_||_dSrK)rurGr5)rrurGr5r r r rLAszPtrDecl.__init__cCs&g}|jdur|d|jft|SNrGrGrMrNrOr r r r&FszPtrDecl.childrenccs|jdur|jVdSrKrGr%r r r rQKs zPtrDecl.__iter__)ru)NrRr r r r r?s  rc@s.eZdZdZd ddZddZddZd ZdS) Return)rcr5rJNcCs||_||_dSrK)rcr5)rrcr5r r r rLSszReturn.__init__cCs&g}|jdur|d|jft|SNrcrcrMrNrOr r r r&WszReturn.childrenccs|jdur|jVdSrKrcr%r r r rQ\s zReturn.__iter__r )NrRr r r r rQs  rc@s.eZdZdZd ddZddZddZd ZdS) Structr#rzr5rJNcCs||_||_||_dSrKr#rzr5rr#rzr5r r r rLdszStruct.__init__cCs6g}t|jpgD]\}}|d||fqt|Sr{r|rgr r r r&iszStruct.childrenccs|jpgD] }|Vq dSrKr}rir r r rQoszStruct.__iter__r)NrRr r r r rbs  rc@s.eZdZdZd ddZddZddZd ZdS) StructRef)r#rGfieldr5rJNcCs||_||_||_||_dSrK)r#rGrr5)rr#rGrr5r r r rLwszStructRef.__init__cCs@g}|jdur|d|jf|jdur8|d|jft|S)Nr#r)r#rMrrNrOr r r r&}szStructRef.childrenccs(|jdur|jV|jdur$|jVdSrK)r#rr%r r r rQs  zStructRef.__iter__r)NrRr r r r rus  rc@s.eZdZdZd ddZddZddZd ZdS) SwitchrNcCs||_||_||_dSrKrrr r r rLszSwitch.__init__cCs@g}|jdur|d|jf|jdur8|d|jft|SrrrOr r r r&szSwitch.childrenccs(|jdur|jV|jdur$|jVdSrKrr%r r r rQs  zSwitch.__iter__r )NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) TernaryOprNcCs||_||_||_||_dSrKrrr r r rLszTernaryOp.__init__cCsZg}|jdur|d|jf|jdur8|d|jf|jdurR|d|jft|SrrrOr r r r&s zTernaryOp.childrenccs:|jdur|jV|jdur$|jV|jdur6|jVdSrKrr%r r r rQs    zTernaryOp.__iter__r )NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) TypeDecl)declnamerurGr5rJNcCs||_||_||_||_dSrK)rrurGr5)rrrurGr5r r r rLszTypeDecl.__init__cCs&g}|jdur|d|jft|SrrrOr r r r&szTypeDecl.childrenccs|jdur|jVdSrKrr%r r r rQs zTypeDecl.__iter__)rru)NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) Typedef)r#rurvrGr5rJNcCs"||_||_||_||_||_dSrK)r#rurvrGr5)rr#rurvrGr5r r r rLs zTypedef.__init__cCs&g}|jdur|d|jft|SrrrOr r r r&szTypedef.childrenccs|jdur|jVdSrKrr%r r r rQs zTypedef.__iter__)r#rurv)NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) Typename)r#rurGr5rJNcCs||_||_||_||_dSrK)r#rurGr5)rr#rurGr5r r r rLszTypename.__init__cCs&g}|jdur|d|jft|SrrrOr r r r&szTypename.childrenccs|jdur|jVdSrKrr%r r r rQs zTypename.__iter__)r#ru)NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) UnaryOp)rVrcr5rJNcCs||_||_||_dSrK)rVrcr5)rrVrcr5r r r rLszUnaryOp.__init__cCs&g}|jdur|d|jft|SrrrOr r r r&szUnaryOp.childrenccs|jdur|jVdSrKrr%r r r rQs zUnaryOp.__iter__rY)NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) UnionrNcCs||_||_||_dSrKrrr r r rLszUnion.__init__cCs6g}t|jpgD]\}}|d||fqt|Sr{r|rgr r r r& szUnion.childrenccs|jpgD] }|Vq dSrKr}rir r r rQszUnion.__iter__r)NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) WhilerNcCs||_||_||_dSrKrrr r r rLszWhile.__init__cCs@g}|jdur|d|jf|jdur8|d|jft|SrrrOr r r r&szWhile.childrenccs(|jdur|jV|jdur$|jVdSrKrr%r r r rQ%s  zWhile.__iter__r )NrRr r r r rs  rc@s.eZdZdZd ddZddZddZd ZdS) Pragma)stringr5rJNcCs||_||_dSrK)rr5)rrr5r r r rL/szPragma.__init__cCs g}t|SrKrrrOr r r r&3szPragma.childrenccsdSrKr r%r r r rQ7szPragma.__iter__)r)NrRr r r r r-s  r)4r;robjectrr=rFrSrUrZr]rbrjrlrnrprsrtryr~rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr r r r sd O: