o ]Lb H@s.ddlmZmZmZddlZddlZddlZddlZddlZddl m Z dZ dZ dZ dZd Zd Zd Zd Zd ZdZdZdZdZdZe jrPeefZeZddZeZ neefZeZdZ!dZ"ddZ#ddZ$Gddde%Z&d.ddZ'Gdd d e%Z(Gd!d"d"e%Z)d#d$Z*d%d&Z+d'd(Z,d/d*d+Z-d/d,d-Z.dS)0)absolute_importdivisionprint_functionN)compat     cCst|dS)Nascii)strencode)irC/usr/lib/python3/dist-packages/hgext/fsmonitor/pywatchman/pybser.pytobytes<srss cCsxd|kr dkr dSd|krdkrdSd|kr#dkr$d Std |kr3td kr4d Std t|)z5Return the smallest size int that can store the valueiriiiillzCannot represent value: )long RuntimeErrorr)xrrr _int_sizeKsr#cCs&||}tjrt|tst|f}|SN)rPYTHON3 isinstancebytes)bufposretrrr_buf_posYs r+c@s4eZdZddZddZddZddZd d Zd S) _bser_buffercCs||_td|_|jdkr$ttttd|jdttt|_ dS|jdks+Jtttt d|jdt tt |_ dS)Ni rsrr) bser_versionctypescreate_string_bufferr(struct pack_intorlen EMPTY_HEADERwposEMPTY_HEADER_V2)selfversionrrr__init__bs  z_bser_buffer.__init__cCsNt|j|j|kr%t|jt|jdt|j|j|ks dSdS)Nr)r/sizeofr(r5resize)r7sizerrr ensure_sizetsz_bser_buffer.ensure_sizecCst|}|d}|||dkrtd|j|jt|n4|dkr-td|j|jt|n$|dkr=td|j|jt|n|dkrMtd|j|jt |nt d |j|7_dS) Nrs=cbrs=chrs=cirs=cqz Cannot represent this long value) r#r=r1r2r(r5 BSER_INT8 BSER_INT16 BSER_INT32 BSER_INT64r!)r7valr<to_writerrr append_longxs z_bser_buffer.append_longc Cst|tr |d}t|}t|}d||}|||dkr5tdt|d|j |j t t ||nL|dkrMtdt|d|j |j t t ||n4|dkretdt|d|j |j t t||n|d kr}td t|d|j |j t t||ntd |j |7_ dS) Nutf-8rr=ccbr-=cchr=ccir=ccqz"Cannot represent this string value)r&unicoderr3r#r=r1r2rr(r5BSER_BYTESTRINGr>r?r@rAr!)r7ss_lenr<rCrrr append_strings`        z_bser_buffer.append_stringc Cst|tr&d}|||rt}nt}td|j|j||j|7_dS|durDd}||td|j|jt |j|7_dSt|t t frR| |dSt|t r^||dSt|tr~d}||td|j|jt||j|7_dSt|tjr t|tjr t|}t|}d|}|||dkrtd|j|jtt|n7|dkrtd|j|jtt|n&|dkrtd |j|jtt|n|d krtd |j|jtt|ntd |j|7_tjr|}n|}|D]\}}||| |qdSt|tj!rt|tjrt|}t|}d|}|||dkrr?r@rAr!rr%items iteritemsappend_recursiveIterable BSER_ARRAY) r7rBneeded to_encodeval_lenr<r]kvrrrr^s                  z_bser_buffer.append_recursiveN)__name__ __module__ __qualname__r9r=rDrNr^rrrrr,as  3r,cCst|d}|||dkr|jtt}td|jd|n|jtt}td|jd|td|jd||jj d|jS)N)r8r=ir) r,r^r5r3r4r1r2r(r6raw)objr8 capabilitiesbser_bufobj_lenrrrdumps7s  rqc@s0eZdZdZddZddZddZdd Zd S) _BunserDict_keys_valuescCs||_||_dSr$rs)r7keysvaluesrrrr9Ks z_BunserDict.__init__cCs ||Sr$) __getitem__)r7namerrr __getattr__O z_BunserDict.__getattr__cCs^t|ttfr |j|S|dr|dd}z |j|j|WSty.td|w)Nst_rjz_BunserDict has no key %s) r&rTr ru startswithrtindex ValueErrorKeyError)r7keyrrrrxRs     z_BunserDict.__getitem__cCs t|jSr$)r3rt)r7rrr__len__^r{z_BunserDict.__len__N)rfrgrh __slots__r9rzrxrrrrrrrHs  rrc@sReZdZdddZeddZddZd d Zd d Zd dZ ddZ ddZ dS)BunserTNcCs:||_||_|durd|_dS|durd|_dS||_dS)Nstrictmutablevalue_encoding value_errors)r7rrrrrrr9cs   zBunser.__init__cCszt||}Wn tytdw|tkrd}d}n)|tkr%d}d}n |tkr.d}d}n|tkr7d}d }ntd t| d |ft |||d d }|||fS)Nz+Invalid bser int encoding, pos out of rangers=brjs=hrirOs=qz-Invalid bser int encoding 0x%s at position %srrr) r+ IndexErrorrr>r?r@rAbinasciihexlifydecoder1 unpack_from)r(r)int_typerafmtint_valrrr unser_intns0  zBunser.unser_intcCs@|||d\}}tt|d||d}|d||fS)Nrr-rrE)rr1rrrr7r(r)str_lenstr_valrrrunser_utf8_stringszBunser.unser_utf8_stringcCsT|||d\}}tt|d||d}|jdur$||j|j}|||fS)Nrr-r)rr1rrrrrrrrrunser_bytestrings   zBunser.unser_bytestringcCsV|||d\}}g}t|D]}|||\}}||q|js't|}||fSNr)rrangeloads_recursiveappendrtuple)r7r(r)arr_lenarr_arr_itemrrr unser_arrays  zBunser.unser_arrayc Cs|||d\}}|jri}ng}g}t|D]$}|||\}}|||\} }|jr2| ||<q|||| q|jsEt||}||fSr)rrrrrrrr) r7r(r)rprmrvvalsrrrBrrr unser_objects     zBunser.unser_objectcCst||d}|tkrtdt|jdd}|||d\}}|||\}}g}t|D]G}|jr6i} ng} tt|D])} t||t krN|d7}d} n| ||\} }|jrb|| } | | | <q>| | q>|jspt || } | | q.||fS)NrzExpect ARRAY to follow TEMPLATErE)rr) r+r`r!rrrrrr3 BSER_SKIPrrrr)r7r(r)val_type keys_bunserrvnitemsrrrmrkeyidxelerrrrunser_templates0     zBunser.unser_templatecCst||}|tks|tks|tks|tkr|||S|tkr0td||dd}||dfS|t kr:d|dfS|t krDd|dfS|t krNd|dfS|t krX| ||S|tkrb|||S|tkrl|||S|tkrv|||S|tkr|||Stdt|d) Ns=drrrOTFzunhandled bser opcode 0x%sr)r+r>r?r@rArrWr1rrQrRrSrKrBSER_UTF8STRINGrr`rr[r BSER_TEMPLATErrrrr)r7r(r)rrBrrrrs<           zBunser.loads_recursiveTNN) rfrgrhr9 staticmethodrrrrrrrrrrrrbs    "rcCs|ddtddkrd}d}t|d\}}n.|ddtddkrCt|dkr/tdd}td|dd}t|d\}}ntd||||fS)NrrrrzInvalid BSER headerI)r4rrr6r3rr1r)r(r.bser_capabilities expected_lenpos2rrr_pdu_info_helpers  rcCs&t|}|d|d|d|dfS)Nrrrrjrr(inforrrpdu_info srcCst|}|d|dS)Nrrjrrrrrpdu_lensrTcCs^t|}|d}|d}t|||kr td||t|ft|||d}|||dS)auDeserialize a BSER-encoded blob. @param buf: The buffer to deserialize. @type buf: bytes @param mutable: Whether to return mutable results. @type mutable: bool @param value_encoding: Optional codec to use to decode values. If unspecified or None, return values as bytestrings. @type value_encoding: str @param value_errors: Optional error handler for codec. 'strict' by default. The other most common argument is 'surrogateescape' on Python 3. If value_encoding is None, this is ignored. @type value_errors: str rrjz!bser data len %d != header len %drr)rr3rrr)r(rrrrrr)bunserrrrloadssrcCsddlm}|||||S)Nr)load)r)fprrrrrrrr<s r)rrr)/ __future__rrrrrXr/r1sysrrr`r[rKr>r?r@rArWrQrRrSrrrr%rr'rUrJrrTr r4r6r#r+objectr,rqrrrrrrrrrrrrsV  W %