U
    '1eE…  ã                   @   s  d dl Z d dlZzd dlmZ W n   d dlmZ Y nX ze W n ek
rZ   eZY nX G dd„ dƒZG dd„ deƒZG dd	„ d	eƒZ	G d
d„ deƒZ
G dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG d d!„ d!ƒZd"d#„ ed$ƒD ƒZd%d#„ ed$ƒD ƒZed&ƒD ]Zd'e> ee< qled&d$ƒD ]:Zeed(  eed)  A eed*  A eed&  A ee< qŠed+ƒD ]Zeeee < qÎG d,d-„ d-ƒZG d.d/„ d/ƒZG d0d1„ d1ƒZdS )2é    N)Úzip_longest)Úizip_longestc                   @   s\   e Zd ZdZdZdZdd„ Zdd„ Zedd„ ƒZ	d	d
„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚQRNr   c                 C   s   | j r|   |¡st‚|| _d S ©N)ÚvalidÚ
ValueErrorÚdata©Úselfr   © r   úH/tmp/pip-unpacked-wheel-109iniqw/reportlab/graphics/barcode/qrencoder.pyÚ__init__*   s    zQR.__init__c                 C   s
   t | jƒS r   ©Úlenr   ©r
   r   r   r   Ú__len__/   s    z
QR.__len__c                 C   sF   | j d krdS tt| ƒt| j ƒƒ\}}|t| j ƒ t| j d |… ƒ S ©Nr   )ÚbitsÚdivmodr   Úsum)r
   ÚqÚrr   r   r   Ú	bitlength2   s    
zQR.bitlengthc                 C   sV   d|  k rdk r"n n
| j d S |dk r4| j d S |dk rF| j d S td| ƒ‚d S )Nr   é
   é   é   é)   é   zUnknown version: )Ú
lengthbitsr   )r
   Úverr   r   r   ÚgetLengthBits9   s    


zQR.getLengthBitsc                 C   s
   t | jƒS r   r   r   r   r   r   Ú	getLengthB   s    zQR.getLengthc                 C   s
   t | jƒS r   )Úreprr   r   r   r   r   Ú__repr__E   s    zQR.__repr__c                 C   s2   |  | jd¡ |  |¡}|r.|  t| jƒ|¡ d S )Né   ©ÚputÚmoder    r   r   ©r
   ÚbufferÚversionZlenbitsr   r   r   Úwrite_headerH   s    
zQR.write_headerc                 C   sŒ   |   ||¡ tt| jƒg| j Ž D ]d}d}d}t| jƒD ]@}|| d k	r8|t| jƒ9 }|| j || ¡7 }|| j	| 7 }q8| 
||¡ q"d S r   )r+   r   Úiterr   ÚgroupÚranger   ÚcharsÚindexr   r&   )r
   r)   r*   Úgr   ÚnÚir   r   r   ÚwriteN   s    zQR.write)Ú__name__Ú
__module__Ú__qualname__r   r   r-   r   r   Úpropertyr   r    r!   r#   r+   r4   r   r   r   r   r   %   s   
	r   c                   @   s,   e Zd Ze d¡jZdZdZdZ	dZ
dZdS )ÚQRNumberz[0-9]*$Ú
0123456789)r$   é   r;   r;   r   )r   é   é   N©r5   r6   r7   ÚreÚcompileÚmatchr   r/   r   r-   r'   r   r   r   r   r   r9   Z   s   r9   c                   @   s,   e Zd Ze d¡jZdZdZdZ	dZ
dZdS )Ú
QRAlphaNumz[-0-9A-Z $%*+./:]*$z-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:)é   é   r   )é	   é   é   Nr>   r   r   r   r   rB   b   s   rB   c                   @   s,   e Zd ZdZdZdZdZdd„ Zdd„ Zd	S )
Ú
QR8bitByte)é   r   r$   )rI   é   rJ   c                 C   s"   t |tƒr| d¡| _n|| _d S )Nzutf-8)Ú
isinstanceÚunicodeÚencoder   r	   r   r   r   r   p   s    
zQR8bitByte.__init__c                 C   s:   |   ||¡ | jD ]"}t|tƒr(t|ƒ}| |d¡ qd S )NrI   )r+   r   rK   ÚstrÚordr&   )r
   r)   r*   Úcr   r   r   r4   v   s
    

zQR8bitByte.writeN)	r5   r6   r7   r   r-   r'   r   r   r4   r   r   r   r   rH   j   s   rH   c                   @   s4   e Zd ZdZdZdZdZdd„ Zdd„ Zd	d
„ Z	dS )ÚQRKanji©rG   r   rI   ©rI   r   r<   c                 C   s2   z|   |¡| _W n tk
r,   tdƒ‚Y nX d S )NzNot valid kanji)Úunicode_to_qrkanjir   ÚUnicodeEncodeErrorr   r	   r   r   r   r   ƒ   s    zQRKanji.__init__c                 C   s`  g }t |ƒD ]L\}}z>| d¡}ztt|ƒ\}}W n tk
rP   |\}}Y nX W nb tk
r } ztd|||d |jd ƒ‚W 5 d }~X Y n( tk
r¶   td|||d dƒ‚Y nX |d> |B }d|  krØdkrþn n"|d8 }|d	@ d? d
 |d@  }nRd|  krdkr<n n"|d8 }|d	@ d? d
 |d@  }ntd|||d dƒ‚| |¡ q|S )Nz	shift-jisZqrkanjir   r$   úillegal multibyte sequencerI   i@  iüŸ  é ÿ  éÀ   éÿ   i@à  i¿ë  i@Á  ©	Ú	enumeraterM   ÚmaprO   Ú	TypeErrorrU   Úargsr   Úappend©r
   r   Úcodesr3   rP   ÚdÚer   r   r   rT   ‰   s4    
*ÿ
ÿzQRKanji.unicode_to_qrkanjic                 C   s(   |   ||¡ | jD ]}| |d¡ qd S ©NrG   ©r+   r   r&   ©r
   r)   r*   rb   r   r   r   r4   ¥   s    
zQRKanji.writeN)
r5   r6   r7   r   r-   r'   r   r   rT   r4   r   r   r   r   rQ   }   s   rQ   c                   @   s<   e Zd ZdZdZdZdZdd„ Zdd„ Zd	d
„ Z	dd„ Z
dS )ÚQRHanzirR   r   rG   rS   c                 C   s2   z|   |¡| _W n tk
r,   tdƒ‚Y nX d S )NzNot valid hanzi)Úunicode_to_qrhanzir   rU   r   r	   r   r   r   r   °   s    zQRHanzi.__init__c                 C   s`  g }t |ƒD ]L\}}z>| d¡}ztt|ƒ\}}W n tk
rP   |\}}Y nX W nb tk
r } ztd|||d |jd ƒ‚W 5 d }~X Y n( tk
r¶   td|||d dƒ‚Y nX |d> |B }d|  krØdkrþn n"|d8 }|d	@ d? d
 |d@  }nRd|  krdkr<n n"|d8 }|d	@ d? d
 |d@  }ntd|||d dƒ‚| |¡ q|S )NÚgb2312Zqrhanzir   r$   rV   rI   i¡¡  iþª  rW   é`   rY   i¡°  iþú  i¡¦  rZ   r`   r   r   r   rh   ¶   s4    
*ÿ
ÿzQRHanzi.unicode_to_qrhanzic                 C   s>   |  | jd¡ |  dd¡ |  |¡}|r:|  t| jƒ|¡ d S )Nr$   r   r%   r(   r   r   r   r+   Ò   s
    
zQRHanzi.write_headerc                 C   s(   |   ||¡ | jD ]}| |d¡ qd S rd   re   rf   r   r   r   r4   Ù   s    
zQRHanzi.writeN)r5   r6   r7   r   r-   r'   r   r   rh   r+   r4   r   r   r   r   rg   ª   s   rg   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚQRECIé   ©r   r   r   c                 C   s(   d|  k rdk sn t dƒ‚|| _d S )Nr   i?B zECI out of range)r   r   r	   r   r   r   r   ä   s    zQRECI.__init__c                 C   sd   |   ||¡ | jdkr&| | jd¡ n:| jdkrD| | jdB d¡ n| jdkr`| | jdB d¡ d S )	Né   rI   iÿ?  i €  rJ   iÿÿ i  À é   re   ©r
   r)   r*   r   r   r   r4   ê   s    


zQRECI.writeN©r5   r6   r7   r'   r   r   r4   r   r   r   r   rk   à   s   rk   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚQRStructAppendr;   rm   c                 C   sR   d|  k rdksn t dƒ‚d|  k r2dks<n t dƒ‚|| _|| _|| _d S )Nr   rJ   zpart out of range [1,16]ztotal out of range [1,16])r   ÚpartÚtotalÚparity)r
   rs   rt   ru   r   r   r   r   ÷   s    zQRStructAppend.__init__c                 C   s:   |   ||¡ | | jd¡ | | jd¡ | | jd¡ d S )Nr$   rI   )r+   r&   rs   rt   ru   rp   r   r   r   r4      s    zQRStructAppend.writeNrq   r   r   r   r   rr   ó   s   	rr   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚQRFNC1FirstrD   rm   c                 C   s   d S r   r   r   r   r   r   r   
  s    zQRFNC1First.__init__c                 C   s   |   ||¡ d S r   )r+   rp   r   r   r   r4     s    zQRFNC1First.writeNrq   r   r   r   r   rv     s   rv   c                   @   s(   e Zd Ze d¡jZdZdZdd„ Z	dS )ÚQRFNC1Secondz^([A-Za-z]|[0-9][0-9])$rE   rm   c                 C   sD   |   ||¡ | j}t|ƒdkr,t|ƒd }nt|ƒ}| |d¡ d S )Nr   éd   rI   )r+   r   r   rO   Úintr&   rf   r   r   r   r4     s    zQRFNC1Second.writeN)
r5   r6   r7   r?   r@   rA   r   r'   r   r4   r   r   r   r   rw     s   rw   c                   @   sx  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dddddddgdddddddgdddddddgdddddddgdddddddgdddddddgdddddddggZ
dd„ Zdd„ Zdd„ ZdddddgdddddgdddddgdddddgdddddggZdd„ Zdd„ Zdd„ Zdd„ ZdZd d!„ Zd"d#„ ZdZd$d%„ Zd&d'„ Zd(Zd)Zed*d+„ ƒZed,d-„ ƒZdS ).ÚQRCodec                 C   s(   || _ || _d | _d| _d | _g | _d S r   )r*   ÚerrorCorrectLevelÚmodulesÚmoduleCountÚ	dataCacheÚdataList)r
   r*   r{   r   r   r   r      s    zQRCode.__init__c              	   C   sd   t |tƒr|}n>ttttfD ],}z||ƒ}W  qNW q tk
rF   Y qX qt‚| j |¡ d | _	d S r   )
rK   r   r9   rB   rQ   rH   r   r   r_   r~   )r
   r   ZnewDataÚconvr   r   r   ÚaddData(  s    

zQRCode.addDatac                 C   s   | j | | S r   )r|   )r
   ÚrowÚcolr   r   r   ÚisDark8  s    zQRCode.isDarkc                 C   s   | j S r   ©r}   r   r   r   r   ÚgetModuleCount;  s    zQRCode.getModuleCountc                 C   st   t ddƒD ]d}t || j¡}tdd„ |D ƒƒ}d}| jD ]$}|d7 }|| |¡7 }||j7 }q8||d kr
 qpq
|S )Nr   é(   c                 s   s   | ]}|j V  qd S r   )Ú	dataCount)Ú.0Úblockr   r   r   Ú	<genexpr>B  s     z+QRCode.calculate_version.<locals>.<genexpr>r   r$   rI   )r.   Ú	QRRSBlockÚgetRSBlocksr{   r   r   r    r   )r
   r*   ÚrsBlocksÚtotalDataCountÚlengthr   r   r   r   Úcalculate_version>  s    
zQRCode.calculate_versionc                 C   s(   | j d kr|  ¡ | _ |  d|  ¡ ¡ d S )NF)r*   r‘   ÚmakeImplÚgetBestMaskPatternr   r   r   r   ÚmakeL  s    

zQRCode.makec                    s¼   ˆ j d d ˆ _‡ fdd„tˆ jƒD ƒˆ _ˆ  dd¡ ˆ  ˆ jd d¡ ˆ  dˆ jd ¡ ˆ  ¡  ˆ  ¡  ˆ  ||¡ ˆ j dkrŠˆ  |¡ ˆ j	d krªt
 ˆ j ˆ jˆ j¡ˆ _	ˆ  ˆ j	|¡ d S )Nr$   é   c                    s   g | ]}d gˆ j  ‘qS )Fr…   ©r‰   Úxr   r   r   Ú
<listcomp>S  s   ÿz#QRCode.makeImpl.<locals>.<listcomp>r   rl   )r*   r}   r.   r|   ÚsetupPositionProbePatternÚsetupPositionAdjustPatternÚsetupTimingPatternÚsetupTypeInfoÚsetupTypeNumberr~   rz   Ú
createDatar{   r   ÚmapData)r
   ÚtestÚmaskPatternr   r   r   r’   Q  s$    
ÿ


þzQRCode.makeImplTFc                 C   sè   |dkr`dgd | j |d  ||d …< |dkrHd| j |d  |d < q€d| j |d  |d < n dgd | j |d  ||d …< t| jƒD ]X\}}|| j ||  ||d …< |dkrÌd| j ||  |d < qŠd| j ||  |d < qŠd S )Nr   Frl   r   rI   )r|   r[   Ú_positionProbePattern)r
   r‚   rƒ   r   r   r   r   r   r™   m  s      z QRCode.setupPositionProbePatternc                 C   sH   d}d}t dƒD ]2}|  d|¡ t | ¡}|dks:||kr|}|}q|S )Nr   rI   T)r.   r’   ÚQRUtilÚgetLostPoint)r
   ZminLostPointÚpatternr3   Ú	lostPointr   r   r   r“     s    
zQRCode.getBestMaskPatternc                 C   s`   t d| jd ƒD ]}|d dk| j| d< qt t ddg¡| jd ¡| jd d| jd …< d S )NrI   r   r   rC   TFrJ   )r.   r}   r|   Ú	itertoolsÚisliceÚcycle)r
   r   r   r   r   r›   Š  s     ÿzQRCode.setupTimingPatternc                 C   s”   t  | j¡}| jd }t ||¡D ]l\}}|dkrF|dks"||krFq"n||krX|dkrXq"t| jƒD ]*\}}|| j|| d  |d |d …< qbq"d S )NrI   r   r;   )	r£   ÚgetPatternPositionr*   r}   r§   Úproductr[   Ú_positionAdjustPatternr|   )r
   ÚposÚmaxposr‚   rƒ   r   r   r   r   r   rš   ˜  s    
z!QRCode.setupPositionAdjustPatternc                 C   s    t  | j¡}tdƒD ]>}| o,||? d@ dk}|| j|d  |d | j d d < qtdƒD ]>}| ot||? d@ dk}|| j|d | j d d  |d < q\d S )Né   r   r;   rI   )r£   ÚgetBCHTypeNumberr*   r.   r|   r}   )r
   r    r   r3   Úmodr   r   r   r   £  s    &zQRCode.setupTypeNumberc                 C   s"  | j d> |B }t |¡}tdƒD ]f}| o8||? d@ dk}|dk rR|| j| d< q |dk rn|| j|d  d< q || j| jd |  d< q tdƒD ]v}| o¨||? d@ dk}|dk rÌ|| jd | j| d < q|dk rð|| jd d| d d < q|| jd d| d < q| | j| jd  d< d S )Nr;   é   r   rC   rI   rE   )r{   r£   ÚgetBCHTypeInfor.   r|   r}   )r
   r    r¡   r   r   r3   r±   r   r   r   rœ   ¬  s"    
zQRCode.setupTypeInfoc           
      c   s¤  t  t| jd ddƒtdddƒ¡}ttd| jd ƒƒtt  tdƒtd| jƒ¡ƒttd| jƒƒf}td	d
„ |D ƒƒ}t | j¡}t	t j 
dd
„ |D ƒ¡ƒ}| jd }|D ]ø}|| }}|dkrÂd}n|| jd krÖd}nd}|| D ]º}tdƒD ]¬}	||	 }	| jdkr@|dk r$|	| jd kr$qîn|dk r@|| jd kr@qî||kr|	|kr|dk rr|	dk s|	|ks|	dk rî|dk s||ksqî|	|fV  qîqâq¦d S )Nr   rC   éþÿÿÿrD   r   rE   rI   rl   c                 s   s   | ]}t t|ƒƒV  qd S r   )ÚlistÚreversed)r‰   r   r   r   r   r‹   Ê  s     z*QRCode._dataPosIterator.<locals>.<genexpr>c                 s   s,   | ]$}|d  |d ||d |d  fV  qdS )r   r   Nr   )r‰   Úpr   r   r   r‹   Í  s    rF   r   )r§   Úchainr.   r}   rµ   Útupler£   rª   r*   ÚsetÚfrom_iterable)
r
   ÚcolsZrowsZrrowsZpposr®   rƒ   Zrowidxr‚   rP   r   r   r   Ú_dataPosIteratorÄ  sL    
ÿþÿ


  ÿÿÿzQRCode._dataPosIteratorNc                 C   s   | j st|  ¡ ƒ| _ | j S r   )Ú_dataPosListrµ   r½   r   r   r   r   ÚdataPosIteratorç  s    zQRCode.dataPosIteratorc                 c   s&   |D ]}dD ]}t ||@ ƒV  qqd S )N)é€   é@   é    rJ   rI   r$   r   r   )Úbool)r
   r   ÚbyteÚbitr   r   r   Ú_dataBitIteratorì  s    zQRCode._dataBitIteratorc                 C   s    | j st|  |¡ƒ| _ t| j ƒS r   )Ú_dataBitListrµ   rÆ   r,   r	   r   r   r   ÚdataBitIteratoró  s    zQRCode.dataBitIteratorc                 C   sP   |   |¡}t |¡}t|  ¡ |ddD ]$\\}}}||||ƒA | j| |< q&d S )NF©Ú	fillvalue)rÈ   r£   ÚgetMaskr   r¿   r|   )r
   r   r¡   r   Úmaskrƒ   r‚   Zdarkr   r   r   rŸ   ø  s    


ÿzQRCode.mapDataéì   r•   c                 C   sò   t  | |¡}tƒ }|D ]}| || ¡ qd}|D ]}||j7 }q0| ¡ |d krhtd| ¡ |d f ƒ‚| ¡ d |d krˆ| dd¡ | ¡ d dkr¤| d¡ qˆ| ¡ |d kr¶qæ| t	j
d¡ | ¡ |d krÖqæ| t	jd¡ q¤t	 ||¡S )Nr   rI   zcode length overflow. (%d > %d)r$   F)rŒ   r   ÚQRBitBufferr4   rˆ   ÚgetLengthInBitsÚ	Exceptionr&   ÚputBitrz   ÚPAD0ÚPAD1ÚcreateBytes)r*   r{   r   rŽ   r)   r   r   rŠ   r   r   r   rž     s,    ÿzQRCode.createDatac                    sò   d}d}d}d}g }g }|D ]²}||j 7 }|j}	|j |	 }
t||	ƒ}t||
ƒ}| | j|||	 … ¡ ||	7 }t |
¡}t|d | ¡ d ƒ}| 	|¡‰ | ¡ d }ˆ  ¡ }| ‡ fdd„t
|| |ƒD ƒ¡ qdd„ t t|Ž t|Ž ¡D ƒ}|S )Nr   éÿÿÿÿr   c                    s"   g | ]}|d krˆ   |¡nd ‘qS )r   )Úget)r‰   r3   ©ZmodPolyr   r   r˜   5  s   ÿz&QRCode.createBytes.<locals>.<listcomp>c                 S   s"   g | ]}|D ]}|d k	r|‘qqS r   r   )r‰   Úddrb   r   r   r   r˜   8  s
      þ)Ú
totalCountrˆ   Úmaxr_   r)   r£   ÚgetErrorCorrectPolynomialÚQRPolynomialr!   r±   r.   r§   r¸   r   )r)   rŽ   ÚoffsetZ
maxDcCountZ
maxEcCountZtotalCodeCountZdcdataZecdatarŠ   ZdcCountZecCountZrsPolyZrawPolyZrLenZmLenr   r   r×   r   rÔ      s6    





ÿ

 ÿzQRCode.createBytes)r5   r6   r7   r   r   r„   r†   r‘   r”   r’   r¢   r™   r“   r›   r¬   rš   r   rœ   r½   r¾   r¿   rÆ   rÇ   rÈ   rŸ   rÒ   rÓ   Ústaticmethodrž   rÔ   r   r   r   r   rz     sP   ù
û	!
rz   c                   @   s   e Zd ZdZdZdZdZdS )ÚQRErrorCorrectLevelr   r   r;   r   N)r5   r6   r7   ÚLÚMÚQÚHr   r   r   r   rß   >  s   rß   c                   @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
ÚQRMaskPatternr   r   r   r;   r$   rD   rC   rl   N)r5   r6   r7   Z
PATTERN000Z
PATTERN001Z
PATTERN010Z
PATTERN011Z
PATTERN100Z
PATTERN101Z
PATTERN110Z
PATTERN111r   r   r   r   rä   D  s   rä   c                .   @   s¤  e Zd Zg ddgddgddgddgddgdddgddd	gddd
gdddgdddgdddgdddgddd
dgddddgddddgddddgddddgddddgddddgdddddgdddddgdddddgdddddgdddd d!gddddd"gddddd#gdddddd$gdddddd%gddd&dd'd(gddddd)d*gddd+dd,d-gddddd"d.gddddd#d/gdddddd%d0gdddd1dd2d3gdddddd4d5gdddd d!d6d7gddddd!d-d8gddddd"d.d9gg(Zd:Zd;Zd<Zed=d>„ ƒZed?d@„ ƒZ	edAdB„ ƒZ
edCdD„ ƒZdEdF„ dGdF„ dHdF„ dIdF„ dJdF„ dKdF„ dLdF„ dMdF„ dNœZedOdP„ ƒZedQdR„ ƒZedSdT„ ƒZedUdV„ ƒZedWdXdWdWdWdXdWdXdXdXdXgfdYdZ„ƒZed[d\„ ƒZed]d^„ ƒZd_S )`r£   rC   r¯   é   é   é   é"   é&   ro   é*   é.   é   é2   é6   rÂ   é:   é>   éB   é0   éF   éJ   éN   é8   éR   éV   éZ   éH   é^   éb   éf   éP   éj   éT   én   ér   év   éz   é~   é4   éh   é‚   él   é†   é<   ép   éŠ   éŽ   é’   é–   éL   rÀ   éš   é„   éž   éˆ   é¢   é¦   éª   i7  i%  iT  c                 C   sV   | d> }t  |¡t  t j¡ dkrD|t jt  |¡t  t j¡ > N }q| d> |B t jA S )Nr   r   )r£   ÚgetBCHDigitÚG15ÚG15_MASK©r   rb   r   r   r   r³   €  s    
ÿ
zQRUtil.getBCHTypeInfoc                 C   sP   | d> }t  |¡t  t j¡ dkrD|t jt  |¡t  t j¡ > N }q| d> |B S )Nr<   r   )r£   r  ÚG18r  r   r   r   r°   ˆ  s    
ÿ
zQRUtil.getBCHTypeNumberc                 C   s"   d}| dkr|d7 }| dL } q|S ©Nr   r   r   )r   Údigitr   r   r   r    s
    
zQRUtil.getBCHDigitc                 C   s   t j| d  S ©Nr   )r£   ÚPATTERN_POSITION_TABLE)r*   r   r   r   rª   ˜  s    zQRUtil.getPatternPositionc                 C   s   | | d dkS ©Nr   r   r   ©r3   Újr   r   r   Ú<lambda>  ó    zQRUtil.<lambda>c                 C   s   | d dkS r"  r   r#  r   r   r   r%  ž  r&  c                 C   s   |d dkS ©Nr;   r   r   r#  r   r   r   r%  Ÿ  r&  c                 C   s   | | d dkS r'  r   r#  r   r   r   r%     r&  c                 C   s   | d |d  d dkS ©Nr   r;   r   r   r#  r   r   r   r%  ¡  r&  c                 C   s   | | d | | d  dkS r(  r   r#  r   r   r   r%  ¢  r&  c                 C   s    | | d | | d  d dkS r(  r   r#  r   r   r   r%  £  r&  c                 C   s    | | d | | d  d dkS )Nr;   r   r   r   r#  r   r   r   r%  ¤  r&  )r   r   r   r;   r$   rD   rC   rl   c                 C   s
   | j | S r   )r¡   )Úclsr¡   r   r   r   rË   §  s    zQRUtil.getMaskc                 C   s8   t dgdƒ}t| ƒD ]}| t dt |¡gdƒ¡}q|S )Nr   r   )rÜ   r.   ÚmultiplyÚQRMathÚgexp)ZerrorCorrectLengthÚar3   r   r   r   rÛ   «  s    z QRUtil.getErrorCorrectPolynomialc                 C   sŠ   d}dg}d }|D ]\}|rjdd„ t ||ƒD ƒ}dd„ t||ddD ƒ}|t|ƒ7 }dd„ t||ddD ƒ}|}q|tdd„ |D ƒƒ7 }|S )Nr   c                 S   s   g | ]\}}||A ‘qS r   r   ©r‰   r-  Úbr   r   r   r˜   º  s     z-QRUtil.maskScoreRule1vert.<locals>.<listcomp>c                 S   s(   g | ] \}}|d kr|o"|d  d ‘qS ©r$   r;   r   r.  r   r   r   r˜   »  s    þrÉ   c                 S   s    g | ]\}}|rd n|d ‘qS )r   r   r   r.  r   r   r   r˜   ¿  s   ÿc                 S   s    g | ]}|d kr|d  d ‘qS r0  r   )r‰   r/  r   r   r   r˜   Ä  s      )Úzipr   r   )r)  r|   ÚscoreZ	lastCountÚlastRowr‚   ÚchangedZscoresr   r   r   ÚmaskScoreRule1vert²  s$    ÿÿÿzQRUtil.maskScoreRule1vertc           	      C   s   d}|d }|dd … D ]r}|d |d  }}t |dd … |dd … ƒD ]<\}}||  krn|  krn|krzn n|d7 }|| }}qH|}q|S )Nr   r   r;   )r1  )	r)  r|   r2  r3  r‚   ZlastCol0ZlastCol1Zcol0Zcol1r   r   r   ÚmaskScoreRule2Ç  s    ""zQRUtil.maskScoreRule2TFc                 C   sb   t |ƒ}d}|D ]L}d}t |ƒ| }||k r|||| … |krR|d7 }||7 }q$|d7 }q$q|S )Nr   r‡   r   )r   )r)  r|   r¥   Z
patternlenr2  r‚   r$  Zmaxjr   r   r   ÚmaskScoreRule3horÕ  s    
zQRUtil.maskScoreRule3horc                 C   s:   t |ƒd }tdd„ |D ƒƒ}dtd| | d ƒd  S )Nr   c                 s   s   | ]}t |ƒV  qd S r   )r   )r‰   r‚   r   r   r   r‹   ë  s     z(QRUtil.maskScoreRule4.<locals>.<genexpr>r   rx   rí   rD   )r   r   Úabs)r)  r|   Z	cellCountÚcountr   r   r   ÚmaskScoreRule4è  s    zQRUtil.maskScoreRule4c                 C   sp   d}||   |j¡7 }||   t|jŽ ¡7 }||  |j¡7 }||  |j¡7 }||  t|jŽ ¡7 }||  |j¡7 }|S r   )r5  r|   r1  r6  r7  r:  )r)  ZqrCoder¦   r   r   r   r¤   î  s    zQRUtil.getLostPointN)r5   r6   r7   r!  r  r  r  rÞ   r³   r°   r  rª   r¡   ÚclassmethodrË   rÛ   r5  r6  r7  r:  r¤   r   r   r   r   r£   N  s¢   






Ø+



ø



   ÿþ
r£   c                   @   s$   e Zd Zedd„ ƒZedd„ ƒZdS )r+  c                 C   s    | dk rt d|  d ƒ‚t|  S )Nr   zglog(ú))rÐ   Ú	LOG_TABLE©r2   r   r   r   Úglogþ  s    zQRMath.glogc                 C   s,   | dk r| d7 } q | dkr$| d8 } qt |  S )Nr   rY   é   )Ú	EXP_TABLEr>  r   r   r   r,    s
    

zQRMath.gexpN)r5   r6   r7   rÞ   r?  r,  r   r   r   r   r+  ý  s   
r+  c                 C   s   g | ]}|‘qS r   r   r–   r   r   r   r˜     s     r˜   r@  c                 C   s   g | ]}|‘qS r   r   r–   r   r   r   r˜     s     rI   r   r$   rD   rC   rY   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )rÜ   c                 C   sb   t |ƒdkr tt |ƒd | ƒ‚d}|t |ƒk rF|| dkrF|d7 }q$||d … dg|  | _d S )Nr   ú/r   )r   rÐ   Únum)r
   rC  ÚshiftrÝ   r   r   r   r     s    
zQRPolynomial.__init__c                 C   s
   | j | S r   )rC  )r
   r0   r   r   r   rÖ     s    zQRPolynomial.getc                 C   s
   t | jƒS r   )r   rC  r   r   r   r   r!   "  s    zQRPolynomial.getLengthc                 C   s~   dg|   ¡ |  ¡  d  }t|   ¡ ƒD ]L}t|  ¡ ƒD ]:}|||   t t |  |¡¡t | |¡¡ ¡N  < q6q&t|dƒS r  )r!   r.   r+  r,  r?  rÖ   rÜ   )r
   rc   rC  r3   r$  r   r   r   r*  %  s    ÿzQRPolynomial.multiplyc                    sv   |   ¡ |  ¡ k r| S t | jd ¡t |jd ¡ ‰ ‡ fdd„t| j|jƒD ƒ}|| j|  ¡ d … 7 }t|dƒ |¡S )Nr   c                    s(   g | ] \}}|t  t  |¡ˆ  ¡A ‘qS r   )r+  r,  r?  )r‰   ÚnnÚen©Zratior   r   r˜   1  s   ÿz$QRPolynomial.mod.<locals>.<listcomp>)r!   r+  r?  rC  r1  rÜ   r±   )r
   rc   rC  r   rG  r   r±   -  s     
ÿzQRPolynomial.modN)r5   r6   r7   r   rÖ   r!   r*  r±   r   r   r   r   rÜ     s
   rÜ   c                ¥   @   s*  e Zd Zdddgdddgdddgdddgdddgddd	gddd
gdddgdddgdddgdddgdddgdddgdddgdddgdddgdddgdddgddddddgddddddgddd gddd!gdddgdddgdd"d#gdd$d%gddd&dddgdd'ddd(d&gdd)d*gdd+d,dd-d'gdd(d.dd/dgdd(d&dd/dgdd0d1gd2d3d4dd5d6gdd4ddd6dgdd4ddd6dgddd dd7d8gdd8ddddgd9ddddd:gd9dddddgdd;d<gddddd<d=gddd
dd=d>gd2d4dd?d6dgdd1d@ddAdBgd9d3d4dd5d6gddCd:d9dDdEgdFdGd&dddgddHdIgd?d5d6dd+d,gd?dd:ddJdEgddddddgd2dKdLdd0d1gddMd(dNdOd/gdd4ddNd6dgdd4ddNd6dgdNdPd7ddQdRgdNdOd/dNdSdGgdNdTddFddgdd4dgdNdUd"ddVdWgdFdXdJd2dYdCgdddddd:gd2dJdddCdgddZdIdNd[dgd\dYdCdd]dDgddd
dd=d>gddGd&dddgdNd^d_dd`d)gdd8ddddgddd
dd=d>gddGd&dddgd2dadbddcddgd2ddddedJgddDdEddfd
gdd'ddd(d&gd2dZdIdNd[dgd2dd/dd dGgddTddNddgdddd\ddgddgd1ddKdAgdd dGgddd
d9d=d>gddCdd9dDdgddhdidFdjdkgddYdCgdFdTddddgdd6dgdd`d)dNdldUgdd]dDd&dmdfgddTdd&ddgddJdd&dCdgd9dndAddodpgd9dXdJd&dYdCgddTddddgdqdCdddDdgd?drdsddHdIgd?d]dDddmdfgdFdTdd
ddgd
dJdddCdgd\dcddddtdLgddYdCdd]dDgd	dd
d9d=d>gddCdddDdgd?dldUddudVgd
dXdJd2dYdCgd?dvd>ddTdgddJdd	dCdgd2dndAd\dodpgd2dXdJd>dYdCgddTdd%ddgddJdd%dCdgdFd0d1dFdndAgdEdXdJdFdYdCgddvd>d6dTdgddJdddCdgdNdKdLd\d0d1gdd]dDd\dmdfgddTddddgd>dJdddCdgddKdLd2d0d1gddYdCdwd]dDgdGdTddddgd>dJdd	dCdgddKdLgd\dYdCd>d]dDgd\dTddddgddJdddCdgddKdLdd0d1gd&dYdCdEd]dDgdwdTddddgddJddCdCdgddKdLd9d0d1gd&dYdCd>d]dDgddTddFddgd5dCdddDdgdd`d)dFdldUgdd]dDddmdfgd'dTdd&ddgd
dJdd/dCdgd9d`d)d&dldUgd9d]dDddmdfgdCdTdd\ddgddJddMdCdgddldUddudVgdwdYdCd&d]dDgd$dTdd\ddgddJddCdCdgddldUd.dudVgddYdCdd]dDgdfdTdd&ddgdGdJdddCdgd:dndAddodpgd(d]dDdFdmdfgddTdd
ddgd\dJdddCdgddodpd9dxdygd.d]dDd%dmdfgddTddddgd:dJdd-dCdgg Zdzd{„ Zed|d}„ ƒZed~d„ ƒZd€S )rŒ   r   ræ   é   rJ   rG   rE   é,   rè   rì   rå   ró   é7   r   é#   r•   rx   rþ   rí   rÂ   ro   r$   é   r
  r	  éC   é+   é!   r²   rF   r<   rø   éD   r   rü   rõ   é1   é   r=   é'   r‡   éy   éa   r  ré   é=   r¯   r   r  ét   r;   rï   é$   é;   é%   éW   éE   rC   é   ée   éQ   é3   é   rI   é\   éu   é]   rë   é/   é   rl   rê   é…   ék   é-   é‘   és   rÁ   rD   éA   ém   r  éX   rñ   rî   r  é{   éc   éI   rô   é‡   r  r   éK   r  éx   é—   é   éq   r  r  éG   rò   é   é‹   éo   éŒ   r  é˜   r  é“   é”   r  rç   r  rÿ   é   é™   é5   é   é•   éw   c                 C   s   || _ || _d S r   )rÙ   rˆ   )r
   rÙ   rˆ   r   r   r   r   0  s    zQRRSBlock.__init__c           
      C   s˜   t  | |¡}|d kr(td|  d | ƒ‚t|ƒd }g }t|ƒD ]R}||d d  }||d d  }||d d  }t|ƒD ]}	| t ||ƒ¡ q|q@|S )Nzbad rs block @ version:z/errorCorrectLevel:r;   r   r   r   )rŒ   ÚgetRsBlockTablerÐ   r   r.   r_   )
r*   r{   ZrsBlockr   rµ   r3   r9  rÙ   rˆ   r$  r   r   r   r   4  s     ÿÿzQRRSBlock.getRSBlocksc                 C   sˆ   |t jkr tj| d d d  S |t jkr@tj| d d d  S |t jkr`tj| d d d  S |t jkr€tj| d d d  S d S d S )Nr   r$   r   r   r;   )rß   rà   rŒ   ÚRS_BLOCK_TABLErá   râ   rã   )r*   r{   r   r   r   r†  D  s    



zQRRSBlock.getRsBlockTableN)r5   r6   r7   r‡  r   rÞ   r   r†  r   r   r   r   rŒ   7  sP  € Œ y
rŒ   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )rÎ   c                 C   s   g | _ d| _d S r   )r)   r   r   r   r   r   r   R  s    zQRBitBuffer.__init__c                 C   s   d  dd„ | jD ƒ¡S )NÚ.c                 S   s   g | ]}t |ƒ‘qS r   )rN   )r‰   r2   r   r   r   r˜   W  s     z(QRBitBuffer.__repr__.<locals>.<listcomp>)Újoinr)   r   r   r   r   r#   V  s    zQRBitBuffer.__repr__c                 C   s&   |d }| j | d|d  ? d@ dkS )NrI   rl   r   )r)   )r
   r0   ÚbufIndexr   r   r   rÖ   Y  s    zQRBitBuffer.getc                 C   s0   t |ƒD ]"}|  ||| d ? d@ dk¡ qd S r   )r.   rÑ   )r
   rC  r   r3   r   r   r   r&   ]  s    zQRBitBuffer.putc                 C   s   | j S r   )r   r   r   r   r   rÏ   a  s    zQRBitBuffer.getLengthInBitsc                 C   sV   | j d }t| jƒ|kr$| j d¡ |rD| j|  d| j d ? O  < |  j d7  _ d S )NrI   r   rÀ   r   )r   r   r)   r_   )r
   rÅ   rŠ  r   r   r   rÑ   d  s    
zQRBitBuffer.putBitN)	r5   r6   r7   r   r#   rÖ   r&   rÏ   rÑ   r   r   r   r   rÎ   Q  s   rÎ   )r?   r§   r   r   rL   Ú	NameErrorrN   r   r9   rB   rH   rQ   rg   rk   rr   rv   rw   rz   rß   rä   r£   r+  r.   rA  r=  r3   rÜ   rŒ   rÎ   r   r   r   r   Ú<module>   sX   
5-6  !
 0
ÿ
ÿ!  