§
    ¸QDb‚¬  ã                   ó0  — d dl 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mZmZ d dlmZ ddgZd	 ej        d
¦  «        fd ej        d¦  «        fd ej        d¦  «        fd ej        d¦  «        fd ej        d¦  «        fd ej        d¦  «        fd ej        d¦  «        fd ej        d¦  «        fd ej        d¦  «        fd ej        d¦  «        fd ej        d¦  «        fd ej        d ¦  «        fgZi ZeD ]\  ZZeee                     ¦   «         <   Œd!d"d#d$d%d&d'œZ ej        d(¦  «        Z ej        d)¦  «        Z ej        d*¦  «        Z ej        d+ej        ¦  «        Zd,„ Zd-„ Zd.„ Z G d/„ d¦  «        Z d0„ Z!dS )1é    Né   )ÚparseDeviceID)Úxmldriverprefs)Ú_debugprintÚset_debugprint_fn)ÚreduceÚppdMakeModelSplitÚPPDsÚHPzhdeskjet|dj[ 0-9]?|laserjet|lj|color laserjet|color lj|designjet|officejet|oj|photosmart|ps |psc|edgelineÚEpsonzstylus|aculaserÚApplez.stylewriter|imagewriter|deskwriter|laserwriterÚCanonz%pixus|pixma|selphy|imagerunner|bj|lbpÚBrotherz
hl|dcp|mfcÚXeroxz/docuprint|docupage|phaser|workcentre|homecentreÚLexmarkzoptra|(:color )?jetprinterúKONICA MINOLTAzmagicolor|pageworks|pageproÚKyocerazfs-|km-|taskalfaÚRicohÚaficioÚOceÚ
varioprintÚOkizokipage|microlineÚDeskJetÚLaserJetÚ	OfficeJetzColor LaserJetÚ
PhotoSmartÚ )ÚdjÚljÚojzcolor ljzps zhp Ú
turboprintz! v(?:er\.)?\d(?:\d*\.\d+)?(?: |$)zn,| hpijs| foomatic/| - | w/| \(| postscript| ps| pdf| pxl| zjs| zxs| pcl3| printer|_bt| pcl| ufr ii| br-scriptz series| all-in-onec                 ó€  — |                       ¦   «          d}d}|                      ¦   «         }t          D ] \  }}|                     |¦  «        r|}| } nŒ!|�€t                               |¦  «        rû|                      d¦  «        }|dk    r3|                      d¦  «        }||k    r| |dz   |…         } n
| d|…         } 	 |                      dd¦  «        \  }}n#  | }d}Y nxY wt          j
        d	d
|¦  «        }t          j
        dd
|¦  «        }t          j
        d	d
|¦  «        }t          j
        dd
|¦  «        }t          j
        dd|¦  «        }t          j
        dd|¦  «        }d}nÒ|                     d¦  «        rd}| dd…         }n°|                     d¦  «        rd}| dd…         }nŽ|                     d¦  «        rd}| dd…         }nl|                     d¦  «        rd}| dd…         }nJ|                     d¦  «        rd}| dd…         }n(d}	 |                      d
d¦  «        \  }}n#  | }d}Y nxY w|                     ¦   «         }	|r||	                     d¦  «        r|	                     d ¦  «        rd!}d"}	nM|	                     d#¦  «        r|	                     d$¦  «        rd}d%}	nt                               |	¦  «        }|r|}|                     ¦   «         }
|
                     d&¦  «        }|dk    rDt                               |
¦  «        }|r(|                     ¦   «         }|
d|…         }
|d|…         }t"                               |
¦  «        }|r(|                     ¦   «         }|
d|…         }
|d|…         }t$                               d|d¬'¦  «        \  }}|r|                     ¦   «         }
|	d"k    rdt(                               ¦   «         D ]J\  }}|
                     |¦  «        r0||t-          |¦  «        d…         z   }|                     ¦   «         }
 nŒK|                      ¦   «         }||fS )(zö
    Split a ppd-make-and-model string into a canonical make and model pair.

    @type ppd_make_and_model: string
    @param ppd_make_and_model: IPP ppd-make-and-model attribute
    @return: a string pair representing the make and the model
    NFz TurboPrintéÿÿÿÿé   Ú_r   r   z(?<=[a-z])(?=[0-9])ú z(?<=[a-z])(?=[A-Z])z JetÚJetzPhoto Smartr   Tzkonica minolta r   é   zlexmark international r   é   zkyocera mita r   é   zkyocera é   zfuji xerox z
Fuji Xeroxé   ÚhewlettÚpackardr   ÚhpÚkonicaÚminoltazkonica minoltaz v)Úcount)ÚstripÚlowerÚ_MFR_BY_RANGEÚmatchÚ_RE_turboprintÚsearchÚfindÚrfindÚsplitÚreÚsubÚ
startswithÚendswithÚ_MFR_NAMES_BY_LOWERÚgetÚ_RE_version_numbersÚstartÚ_RE_ignore_suffixÚ_RE_ignore_seriesÚsubnÚ_HP_MODEL_BY_NAMEÚitemsÚlen)Úppd_make_and_modelÚmakeÚcleanup_makeÚlÚmfrÚregexpÚmodelÚtÚt2ÚmakelÚmodellÚvÚvmatchÚvstartÚsuffixÚsuffixstartÚnÚnameÚfullnames                      ú2/usr/lib/python3/dist-packages/cupshelpers/ppds.pyr	   r	   w   s·  € ð ×ÒÑÔÐØ€DØ€LØ× Ò Ñ#Ô#€AÝ$ð ð ‰ˆˆVØ�<Š<˜ÑÔð 	ØˆDØ&ˆEØˆEð	ð �|�×-Ò-¨qÑ1Ô1€|Ø×#Ò# ]Ñ3Ô3ˆØ�Š7ˆ7Ø#×)Ò)¨=Ñ9Ô9ˆBØ�BŠwˆwØ%7¸¸B¹¸r¸	Ô%BÐ"Ð"à%7¸¸¸Ô%;Ð"ð	Ø,×2Ò2°3¸Ñ:Ô:‰KˆD�%�%øð	Ø%ˆDØˆEˆEˆEøøøÝŒvÐ-¨s°DÑ9Ô9ˆÝŒvÐ-¨s°DÑ9Ô9ˆÝ”Ð.°°UÑ;Ô;ˆÝ”Ð.°°UÑ;Ô;ˆÝ”˜ ¨Ñ.Ô.ˆÝ”˜¨°eÑ<Ô<ˆØˆˆð 
�ŠÐ(Ñ	)Ô	)ð ØˆØ" 2 3 3Ô'ˆˆØ	
�ŠÐ/Ñ	0Ô	0ð ØˆØ" 2 3 3Ô'ˆˆØ	
�Š�Ñ	'Ô	'ð ØˆØ" 2 3 3Ô'ˆˆØ	
�Š�zÑ	"Ô	"ð ØˆØ" 1 2 2Ô&ˆˆØ	
�Š�}Ñ	%Ô	%ð ØˆØ" 2 3 3Ô'ˆˆð ˆð	Ø,×2Ò2°3¸Ñ:Ô:‰KˆD�%�%øð	Ø%ˆDØˆEˆEˆEøøøð �JŠJ‰MŒM€EØð Ø×Ò˜iÑ(Ô(ð 	Ø�NŠN˜IÑ&Ô&ð	àˆDØˆEˆEØ×Ò Ñ)Ô)ð 	Ø�nŠn˜iÑ(Ô(ð	à#ˆDØ$ˆEˆEõ &×)Ò)¨5Ñ1Ô1ˆCØð Ø�ð �[Š[‰^Œ^€FØ�Š�TÑÔ€AØˆB‚w€wõ %×+Ò+¨VÑ4Ô4ˆØð 	#à—\’\‘_”_ˆFØ˜G˜V˜G”_ˆFØ˜'˜6˜'”NˆEå×%Ò% vÑ.Ô.€FØð $Ø—l’l‘o”oˆØ˜˜˜Ô%ˆØ�l�{�lÔ#ˆõ #×'Ò'¨¨U¸!Ð'Ñ<Ô<�J€UˆAØð  Ø—’‘”ˆà�‚}€}Ý/×5Ò5Ñ8Ô8ð 	ð 	‰NˆD�(Ø× Ò  $Ñ'Ô'ð Ø  5­¨d©¬¨¨Ô#5Ñ5�ØŸš™œ�Ø�ðð
 �KŠK‰NŒN€EØ�%ˆ=Ðs   ÃC ÃC#ÈH4 È4H<c                 ó¢  — |                       ¦   «                              ¦   «         }d}d}d}d}|}d}t          t          |¦  «        ¦  «        D ]}||                              ¦   «         r||k    r|r|dz  }|}n,||                              ¦   «         r||k    r|r|dz  }|}n|}||                              ¦   «         r|||         z  }d}Œ€|S )a  
    This function normalizes manufacturer and model names for comparing.
    The string is turned to lower case and leading and trailing white
    space is removed. After that each sequence of non-alphanumeric
    characters (including white space) is replaced by a single space and
    also at each change between letters and numbers a single space is added.
    This makes the comparison only done by alphanumeric characters and the
    words formed from them. So mostly two strings which sound the same when
    you pronounce them are considered equal. Printer manufacturers do not
    market two models whose names sound the same but differ only by
    upper/lower case, spaces, dashes, ..., but in printer drivers names can
    be easily supplied with these details of the name written in the wrong
    way, especially if the IEEE-1284 device ID of the printer is not known.
    This way we get a very reliable matching of printer model names.
    Examples:
    - Epson PM-A820 -> epson pm a 820
    - Epson PM A820 -> epson pm a 820
    - HP PhotoSmart C 8100 -> hp photosmart c 8100
    - hp Photosmart C8100  -> hp photosmart c 8100

    @type strin: string that can be the make or the model
    @return: a normalized lowercase string in which punctuations have been replaced with spaces.
    r   r   r   é   Fr&   T)r3   r4   ÚrangerI   ÚisalphaÚisdigitÚisalnum)	ÚstrinÚlstrinÚ
normalizedÚBLANKÚALPHAÚDIGITÚlastcharÚ
alnumfoundÚis	            r]   Ú	normalizerm   û   s  € ð0 �[Š[‰^Œ^×!Ò!Ñ$Ô$€FØ€Jà
€EØ
€EØ
€EØ€Hà€JÝ•C˜‘L”LÑ!Ô!ð ð ˆØ�!Œ9×ÒÑÔð 		Ø˜5Ò Ð  ZÐ Ø˜cÑ!�
ØˆHˆHØ�AŒY×ÒÑ!Ô!ð 	Ø˜5Ò Ð  ZÐ Ø˜cÑ!�
ØˆHˆHàˆHà�!Œ9×ÒÑÔð 	Ø˜& œ)Ñ#ˆJØˆJøàÐó    c                 ó@   — t          | t          ¦  «        r| d         S | S )z{If we don't know whether getPPDs() or getPPDs2() was used, this
    function can unwrap an item from a list in either case.r   )Ú
isinstanceÚlist)Úxs    r]   Ú
_singletonrs   .  s$   € õ �1•dÑÔð Ø�ŒtˆØ€Hrn   c            
       ó   — e Zd ZdZdZdZdZdZej	        j
        Z
ej	        j        Zej	        j        Zej	        j        Zej	        j        Ze
eeeeeeeeeiZdd„Zd„ Zd	„ Zd
„ Zd„ Zd„ Z	 	 	 	 dd„Z	 	 	 dd„Z	 	 	 	 dd„Zd„ Zdd„Zd„ Zd„ ZdS )r
   a\  
    This class is for handling the list of PPDs returned by CUPS.  It
    indexes by PPD name and device ID, filters by natural language so
    that foreign-language PPDs are not included, and sorts by driver
    type.  If an exactly-matching PPD is not available, it can
    substitute with a PPD for a similar model or for a generic driver.
    r   r   r_   é   Nc                 ó¶  — |                      ¦   «         | _        d| _        d| _        t	          j        ¦   «         | _        t	          j        ¦   «         | _        |€Lt          j
                             d¦  «        }|€+ddlm} t          j                             |j        d¦  «        }	 t          j                             |d¦  «        }t	          j        |¦  «        \  }}| j                             |¦  «         | j                             |¦  «         n:# t&          $ r-}t)          d|›d|›�¦  «         d| _        d| _        Y d}~nd}~ww xY w|�|d	k    s|d
k    rd}|                     d¦  «        }	|	dk    r|d|	…         }
n|}
g }| j                             ¦   «         D ]V\  }}	 t/          |d         ¦  «        }n# t0          $ r Y Œ(w xY w|dk    rŒ3||k    rŒ:||
k    rŒA|                     |¦  «         ŒW|D ]
}| j        |= Œd| j        v rJt/          | j        d         d         ¦  «        }|                     d¦  «        sd|z   | j        d         d<   dS dS dS )a%  
        @type ppds: dict
        @param ppds: dict of PPDs as returned by cups.Connection.getPPDs()
        or cups.Connection.getPPDs2()

        @type language: string
	@param language: language name, as given by the first element
        of the pair returned by locale.getlocale()
        NÚCUPSHELPERS_XMLDIRr   )ÚconfigÚcupshelperszpreferreddrivers.xmlzError loading ú: ÚCÚPOSIXÚen_USr%   r#   zppd-natural-languageÚenÚrawúppd-make-and-modelzGeneric )ÚcopyÚppdsÚmakesÚidsr   ÚDriverTypesÚdrivertypesÚPreferenceOrderÚ	preforderÚosÚenvironrA   r   rx   ÚpathÚjoinÚ
sysconfdirÚPreferredDriversÚloadÚ	ExceptionÚprintr9   rH   rs   ÚKeyErrorÚappendr>   )Úselfr‚   ÚlanguageÚxml_dirrx   Úxmlfiler†   ÚpreferenceorderÚeÚuÚshort_languageÚ	to_removeÚppdnameÚppddictÚnatural_languageÚ	makemodels                   r]   Ú__init__zPPDs.__init__P  sÁ  € ð —I’I‘L”LˆŒ	ØˆŒ
ØˆŒå)Ô5Ñ8Ô8ˆÔÝ'Ô7Ñ:Ô:ˆŒØˆ?Ý”j—n’nÐ&:Ñ;Ô;ˆGØˆØ$Ð$Ð$Ð$Ð$Ð$Ýœ'Ÿ,š,¨Ô(9¸=ÑIÔI�ð		"Ý”g—l’l GÐ-CÑDÔDˆGåÔ/°Ñ9Ô9ñ +ˆ[˜/àÔ×!Ò! ;Ñ/Ô/Ð/ØŒN×Ò Ñ1Ô1Ð1Ð1øÝð 	"ð 	"ð 	"ÝˆE¨G¨G¨G°Q°QÐ7Ñ8Ô8Ð8Ø#ˆDÔØ!ˆDŒNˆNˆNˆNˆNˆNøøøøð	"øøøð
 ÐØ˜ŠOˆOØ˜ÒÐØˆHà�MŠM˜3ÑÔˆØ�Š7ˆ7Ø% b q bœ\ˆNˆNà%ˆNàˆ	Ø $¤	§¢Ñ 2Ô 2ð 	'ð 	'ÑˆG�WðÝ#-¨wÐ7MÔ/NÑ#OÔ#OÐ Ð øÝð ð ð Ø�ðøøøð   4Ò'Ð'ð à 8Ò+Ð+Øà >Ò1Ð1Øà×Ò˜gÑ&Ô&Ð&Ð&à ð 	#ð 	#ˆGØ”	˜'Ð"Ð"ð
 �D”IÐÐÝ" D¤I¨eÔ$4Ð5IÔ$JÑKÔKˆIØ×'Ò'¨Ñ4Ô4ð PØ9CÀiÑ9O�”	˜%Ô Ð!5Ñ6Ð6Ð6ð ÐðPð Ps+   Â'A+D Ä
E
Ä#EÅE
Æ&F<Æ<
G	ÇG	c                 ó4  — |                       ¦   «          t          | j                             ¦   «         ¦  «        }|                     t
          j        ¬¦  «         	 |                     d¦  «         |                     dd¦  «         n# t          $ r Y nw xY w|S )zb
	@returns: a list of strings representing makes, sorted according
        to the current locale
	©ÚkeyÚGenericr   )
Ú_init_makesrq   rƒ   ÚkeysÚsortÚlocaleÚstrxfrmÚremoveÚinsertÚ
ValueError)r”   Ú
makes_lists     r]   ÚgetMakeszPPDs.getMakes›  s�   € ð
 	×ÒÑÔÐÝ˜$œ*Ÿ/š/Ñ,Ô,Ñ-Ô-ˆ
Ø�Š�Vœ^ˆÑ,Ô,Ð,ð	à×Ò˜yÑ)Ô)Ð)Ø×Ò˜q )Ñ,Ô,Ð,Ð,øÝð 	ð 	ð 	ØˆDð	øøøàÐs   Á+B Â
BÂBc                 ó  — |                       ¦   «          	 t          | j        |                              ¦   «         ¦  «        }n# t          $ r g cY S w xY wd„ }|                     t          j        |¦  «        ¬¦  «         |S )zS
	@returns: a list of strings representing models, sorted using
	cups.modelSort()
	c                 óh   — t          | ¦  «        }t          |¦  «        }t          j        ||¦  «        S ©N)rm   ÚcupsÚ	modelSort)ÚaÚbÚfirstÚseconds       r]   Úcompare_modelsz&PPDs.getModels.<locals>.compare_models¶  s*   € Ý˜q‘M”MˆEÝ ‘]”]ˆFÝ”> %¨Ñ0Ô0Ð0rn   r£   )r¦   rq   rƒ   r§   r’   r¨   Ú	functoolsÚ
cmp_to_key)r”   rK   Úmodels_listr¹   s       r]   Ú	getModelszPPDs.getModels«  sš   € ð
 	×ÒÑÔÐð	Ý˜tœz¨$Ô/×4Ò4Ñ7Ô7Ñ8Ô8ˆKˆKøÝð 	ð 	ð 	ØˆIˆIˆIð	øøøð	1ð 	1ð 	1ð 	×Ò�YÔ1°.ÑAÔAÐÑBÔBÐBØÐs   –,A ÁAÁAc                 óv   — |                       ¦   «          	 | j        |         |         S # t          $ r i cY S w xY w)zí
	Obtain a list of PPDs that are suitable for use with a
        particular printer model, given its make and model name.

	@returns: a dict, indexed by ppd-name, of dicts representing
        PPDs (as given by cups.Connection.getPPDs)
	©r¦   rƒ   r’   )r”   rK   rP   s      r]   ÚgetInfoFromModelzPPDs.getInfoFromModel½  sQ   € ð 	×ÒÑÔÐð	Ø”:˜dÔ# EÔ*Ð*øÝð 	ð 	ð 	ØˆIˆIˆIð	øøøs   –) ©8·8c                 ó   — | j         |         S )zM
	@returns: a dict representing a PPD, as given by
	cups.Connection.getPPDs
	)r‚   )r”   r�   s     r]   ÚgetInfoFromPPDNamezPPDs.getInfoFromPPDNameË  s   € ð
 Œy˜Ô!Ð!rn   c                 óV   — | j                              |t          j        j        ¦  «        S r²   )Ú_fit_to_statusrA   r   Ú
DriverTypeÚFIT_NONE)r”   Úfits     r]   ÚgetStatusFromFitzPPDs.getStatusFromFitÒ  s!   € ØÔ"×&Ò&¨­^Ô-FÔ-OÑPÔPÐPrn   c                 óð  — |€g }|€g }|€i }| j         rÄ| j        r½i }|D ]}| j        |         ||<   Œ| j                             | j         ||¦  «        }t	          dt          |¦  «        z  ¦  «         | j                              |||¦  «        }	t	          dt          |	¦  «        z  ¦  «         d„ |	D ¦   «         }t	          dt          |¦  «        z  ¦  «         t          ¦   «         }
|D ]0}|                     d¦  «        \  }}}|
 	                    |¦  «         Œ1|
r[g }|D ]4}|                     d¦  «        \  }}}||
v r| 
                    |¦  «         Œ5|r |D ]}||vr| 
                    |¦  «         Œ|}|S )a`  

	Sort a list of PPD names by preferred driver type.

	@param ppdnamelist: PPD names
	@type ppdnamelist: string list
        @param downloadedfiles: Filenames from packages downloaded
        @type downloadedfiles: string list
        @param make_and_model: device-make-and-model name
        @type make_and_model: string
        @param devid: Device ID dict
        @type devid: dict indexed by Device ID field name, of strings;
        except for CMD field which must be a string list
        @param fit: Driver fit string for each PPD name
        @type fit: dict of PPD name:fit
	@returns: string list
	Nz9Valid driver types for this printer in priority order: %sz5PPDs with assigned driver types in priority order: %sc                 ó   — g | ]
}|d          ‘ŒS ©r   © )Ú.0Útyp_names     r]   ú
<listcomp>z2PPDs.orderPPDNamesByPreference.<locals>.<listcomp>ÿ  s   € ÐCÐCÐC¨8˜8 Aœ;ÐCÐCÐCrn   z(Resulting PPD list in priority order: %sú/)r†   rˆ   r‚   Úget_ordered_typesr   ÚreprÚget_ordered_ppdnamesÚsetÚ
rpartitionÚaddr“   )r”   ÚppdnamelistÚdownloadedfilesÚmake_and_modelÚdevidrÇ   r‚   r�   ÚorderedtypesÚorderedppdsÚdownloadedfnamesÚdownloadedfiler‹   ÚslashÚfnameÚdownloadedppdnamesÚppdfnames                    r]   ÚorderPPDNamesByPreferencezPPDs.orderPPDNamesByPreferenceÕ  sû  € ð* ÐØˆKàÐ"Ø ˆOàˆ;ØˆCàÔð 	X ¤ð 	XØˆDØ&ð 3ð 3�Ø $¤	¨'Ô 2��W‘�àœ>×;Ò;¸TÔ=MØ=KØ=BñDô DˆLõ ÐSÕVZÐ[gÑVhÔVhÑhÑiÔiÐiØÔ*×?Ò?ÀØAEÀsñLô LˆKåÐOÕRVÐWbÑRcÔRcÑcÑdÔdÐdØCÐC°{ÐCÑCÔCˆKÝÐBÅTÈ+ÑEVÔEVÑVÑWÔWÐWõ ™5œ5ÐØ-ð 	)ð 	)ˆNØ#1×#<Ò#<¸cÑ#BÔ#BÑ ˆT�5˜%Ø× Ò  %Ñ(Ô(Ð(Ð(àð 	1à!#ÐØ&ð 8ð 8�Ø*1×*<Ò*<¸cÑ*BÔ*BÑ'��u˜hØÐ/Ð/Ð/Ø&×-Ò-¨wÑ7Ô7Ð7øð "ð 1Ø*ð <ð <�GØÐ&8Ð8Ð8Ø*×1Ò1°7Ñ;Ô;Ð;øà0�àÐrn   r   c                 ó\  — t          d|›d|›�¦  «         |}|}|                      ¦   «          |€g }i }	|                     ¦   «         }
|                     ¦   «         }d}	 | j        |
         |         D ]}| j        |	|<   Œd}n# t
          $ r Y nw xY w|
dk    r|	 | j        d         |         D ]}| j        |	|<   Œt          d| j        d         |         z  ¦  «         t          d	|›d
|›d�¦  «         t          d¦  «         d}n# t
          $ r Y nw xY wt          d¦  «         d}|                      ¦   «          d}|
dk    r0t          |¦  «        \  }}t          |¦  «        }
t          |¦  «        }t          d|
z  ¦  «         t          d|z  ¦  «         ddddœ}|
| j	        v r| j	        |
         }n8|
|v r4||
         }|| j	        v r#|}|}
t          d|
z  ¦  «         | j	        |
         }t          d|z  ¦  «         |��y| j
        |         }| j        t          |¦  «                 }|
ddfD ]U}|                     |dz   ¦  «        r;|t          |¦  «        dz   d…         }t          |¦  «        }t          d|z  ¦  «         ŒV|| j        |
         v rJ||         }||                              ¦   «         D ]&}| j        |	|<   t          |	|         ›d|›�¦  «         Œ'nžt          |dz   |z   ¦  «        \  }}t          |¦  «        }t          d|z  ¦  «         || j        |
         v rV||         }t          ||                              ¦   «         ¦  «        D ]&}| j        |	|<   t          |	|         ›d|›�¦  «         Œ'|	sJ|rH|                      ||¦  «        \  }}|| j        k    r$|D ]!}||	|<   t          |	|         ›d|›�¦  «         Œ"|r|t%          |¦  «        t          k    r|                     d¦  «        }t          d¦  «         |                      |¦  «        }|r)|D ]&}| j        |	|<   t          |	|         ›d|›�¦  «         Œ'|rC|                     d¦  «        s¸|                     d¦  «        s£|                     d¦  «        rd|vrŠt-          ¦   «         }|	                     ¦   «         D ],}|                     d ¦  «        r|                     |¦  «         Œ-t          |¦  «        d!k    rt          d"|z  ¦  «         |D ]}|	|= Œt-          ¦   «         }|�r¼t          |¦  «        d!k    �r¨t-          ¦   «         }t-          ¦   «         }|	                     ¦   «         D ]Ñ}d}| j        |         } t3          |                      d#¦  «        ¦  «        }!|!rt7          |!¦  «        }"|"d$         }|sD|                     d%¦  «        d&k    r+t3          |                      d'¦  «        ¦  «        }#|#d(k    rd)g}|sŒ•d}$|D ]
}%|%|v rd}$ nŒ|$r|                     |¦  «         Œ¼|                     |¦  «         ŒÒ|D ]7}|	|         | j        k    r$| j        |	|<   t          | j        d*|z  z   ¦  «         Œ8t          |¦  «        t          d+„ |	                     ¦   «         D ¦   «         ¦  «        k     rt          d,|z  ¦  «         |D ]}|	|= Œnt          d-|z  d.z   ¦  «         |	sÑd/d0g}&d}'|&D ]ƒ}(t          d1|(z  ¦  «         |(d2z   })| j                             ¦   «         D ]:}*|*                     |(¦  «        s|*                     |)¦  «        r| j        |	|*<   d}' nŒ;|'r nt          d3|(z  ¦  «         Œ„|'sCt          d4¦  «         | j        |	t          | j                             ¦   «         ¦  «        d!         <   |s‡tA          j!        d5d6tE          |¦  «        ¬7¦  «        }+	 tG          d8„ |¦  «        },n# tH          $ r d},Y nw xY wd9|›d
|›d�}-|,r|-d:|,z  z  }-|r|-d;|z  z  }-t          d<|+z  ¦  «         t          |-¦  «         |	S )=a9  
	Obtain a best-effort PPD match for an IEEE 1284 Device ID.

	@param mfg: MFG or MANUFACTURER field
	@type mfg: string
	@param mdl: MDL or MODEL field
	@type mdl: string
	@param description: DES or DESCRIPTION field, optional
	@type description: string
	@param commandsets: CMD or COMMANDSET field, optional
	@type commandsets: string
	@param uri: device URI, optional (only needed for debugging)
	@type uri: string
        @param make_and_model: device-make-and-model string
        @type make_and_model: string
	@returns: a dict of fit (string) indexed by PPD name
	ú
r&   NFTúhewlett-packardr/   z&**** Incorrect IEEE 1284 Device ID: %sz**** Actual ID is MFG:z;MDL:ú;z4**** Please report a bug against the HPLIP componentzTrying make/model namesr   zmfgl: %szmdll: %sÚlexmarkzkyocera mita)ræ   zlexmark internationalÚkyocerazremapped mfgl: %szmake: %sr   zunprefixed mdll: %srz   zre-split mdll: %sú,zChecking CMD fieldzipp:zipps:Údnssdz._ippzdriverless:r   z$Removed %s due to non-IPP connectionúppd-device-idÚCMDú:r#   zppd-typeÚ
postscriptÚ
POSTSCRIPTz: %sc                 ó$   — g | ]\  }}|d k    ¯|‘ŒS )ÚgenericrÌ   )rÍ   ÚdÚms      r]   rÏ   z0PPDs.getPPDNamesFromDeviceID.<locals>.<listcomp>ö  s,   € ð $7ð $7ð $7©&¨1¨aØ'(¨I¢~ ~ð %&Ø'5 ~ ~rn   zRemoved %s due to CMD mis-matchzNot removing %s z3due to CMD mis-match as it would leave nothing goodztextonly.ppdzpostscript.ppdz'%s' fallbackz.gzzFallback '%s' not availablez#No fallback available; choosing anyz
//[^@]*@/?z//)ÚpatternÚreplÚstringc                 ó   — | dz   |z   S )Nrê   rÌ   ©rr   Úys     r]   ú<lambda>z.PPDs.getPPDNamesFromDeviceID.<locals>.<lambda>  s   € ¨1¨s©7°A©:€ rn   zMFG:zCMD:%s;zDES:%s;zNo ID match for device %s:)%r   Ú	_init_idsr4   r„   Ú	FIT_EXACTr’   r¦   r	   rm   Úlmakesrƒ   Úlmodelsr>   rI   r§   rq   Ú_findBestMatchPPDsrÆ   Útyper;   Ú_getPPDNameFromCommandSetÚFIT_GENERICrÔ   rÖ   r‚   rs   rA   r   r9   ÚFIT_EXACT_CMDrH   r?   r<   r=   Ústrr   Ú	TypeError).r”   ÚmfgÚmdlÚdescriptionÚcommandsetsÚurirÙ   Úorig_mfgÚorig_mdlrÇ   ÚmfglÚmdllÚ
id_matchedÚeachÚmdlsrK   ÚmfgreplÚrmfgÚmdlslÚprefixrP   Úmfg2Úmdl2Úmdl2lÚsr‚   rò   ÚdriverÚfailedr�   Ú	exact_cmdÚppd_cmd_fieldÚppdÚppd_device_idÚppd_device_id_dictÚppd_typeÚusableÚpdlÚ	fallbacksÚfoundÚfallbackÚ
fallbackgzÚppdpathÚsanitised_uriÚcmdÚids.                                                 r]   ÚgetPPDNamesFromDeviceIDzPPDs.getPPDNamesFromDeviceID  s
  € õ( 	ˆ # # # s sÐ+Ñ,Ô,Ð,ØˆØˆØ�ŠÑÔÐàÐØˆKð ˆð
 �yŠy‰|Œ|ˆØ�yŠy‰|Œ|ˆàˆ
ð	Øœ œ tÔ,ð +ð +�Ø œN��D‘	�	ØˆJˆJøÝð 	ð 	ð 	ØˆDð	øøøð Ð$Ò$Ð$ð	Ø œH TœN¨4Ô0ð /ð /�DØ $¤�C˜‘I�IÝÐEØ!œX dœ^¨DÔ1ñ2ñ 3ô 3ð 3å�À3À3À3ÈÈÈÐLÑMÔMÐMÝÐSÑTÔTÐTØ!�
�
øÝð ð ð Ø�ðøøøõ 	Ð.Ñ/Ô/Ð/ØˆØ×ÒÑÔÐØˆØ�2Š:ˆ:Ý*¨CÑ0Ô0‰JˆS�#Ý˜c‘?”?ˆDÝ˜c‘?”?ˆDå�Z $Ñ&Ñ'Ô'Ð'Ý�Z $Ñ&Ñ'Ô'Ð'Ø&*Ø,5Ø,ð.ð .ˆð �4”;ÐÐà”;˜tÔ$ˆDˆDØ�Wˆ_ˆ_Ø˜4”=ˆDØ�t”{Ð"Ð"Ø�Ø�åÐ0°4Ñ7Ñ8Ô8Ð8Ø”{ 4Ô(�å�Z $Ñ&Ñ'Ô'Ð'ØÑØ”:˜dÔ#ˆDØ”L¥¨4¡¤Ô1ˆEð  Ð!2°DÐ9ð ?ð ?�Ø—?’? F¨S¡LÑ1Ô1ð ?Ø�c 6™lœl¨QÑ.Ð/Ð/Ô0�CÝ$ c™?œ?�DÝÐ!6¸Ñ!=Ñ>Ô>Ð>øà�t”| DÔ)Ð)Ð)Ø˜dœ�Ø  œK×,Ò,Ñ/Ô/ð ?ð ?�DØ $¤�C˜‘IÝ¨S°¬Y¨Y¨Y¸¸Ð!=Ñ>Ô>Ð>Ð>ð?õ  1°#¸±)¸c±/ÑBÔB‘��tÝ! 4Ñ(Ô(�ÝÐ0°5Ñ8Ñ9Ô9Ð9Ø˜DœL¨Ô.Ð.Ð.Ø! %œL�EÝ $ T¨%¤[×%5Ò%5Ñ%8Ô%8Ñ 9Ô 9ð Cð C˜Ø$(¤N˜˜D™	Ý#°°T´°°¸D¸DÐ%AÑBÔBÐBÐBàð 	?�tð 	?Ø×/Ò/°°sÑ;Ô;‰IˆQ�Ø�D”MÒ!Ð!Ø ð ?ð ?�DØ !�C˜‘IÝ¨S°¬Y¨Y¨Y¸¸Ð!=Ñ>Ô>Ð>Ð>àð 		CÝ�[Ñ!Ô!¥TÒ)Ð)Ø)×/Ò/°Ñ5Ô5�åÐ-Ñ.Ô.Ð.Ø×4Ò4°kÑBÔBˆGØð CØ%ð Cð C�FØ"&Ô"2�C˜‘KÝ¨S°¬[¨[¨[¸&¸&Ð!AÑBÔBÐBÐBð
 ð 	Ø—’ Ñ'Ô'ð	à—’ Ñ(Ô(ð	ð —.’. Ñ)Ô)ð	ð ˜S�.�.Ý‘U”UˆFØŸ8š8™;œ;ð )ð )�Ø×&Ò& }Ñ5Ô5ð )Ø—J’J Ñ(Ô(Ð(øÝ�F‘”˜a’�ÝÐCÀfÑLÑMÔMÐMØ"ð "ð "�DØ˜D˜	˜	Ý‘U”UˆFð0 ñ 6	3�#˜{Ñ+Ô+¨aÒ/Ñ/Ý‘U”UˆFÝ™œˆIØŸ8š8™;œ;ð ")ð ")�Ø $�Ø”i Ô(�Ý *¨C¯GªG°_Ñ,EÔ,EÑ FÔ F�Ø ð >Ý)6¸Ñ)FÔ)FÐ&Ø$6°uÔ$=�Mà%ð 
7ð
 —L’L #Ñ&Ô&¨"Ò,Ð,õ  *¨3¯7ª7°JÑ+?Ô+?Ñ@Ô@�HØ <Ò/Ð/Ø)5¨˜à$ð ð à�Ø(ð ð �CØ˜kÐ)Ð)Ø!%˜Ø˜ð *ð ð )Ø—M’M 7Ñ+Ô+Ð+Ð+à—J’J Ñ(Ô(Ð(Ð(ð "ð Eð E�Ø�t”9 ¤Ò.Ð.Ø $Ô 2�C˜‘IÝ Ô!3°f¸t±mÑ!CÑDÔDÐDøå�F‰|Œ|�cð $7ð $7°C·I²I±L´Lð $7ñ $7ô $7ñ 8ô 8ò 8ð 8åÐ>ÀÑGÑHÔHÐHØ"ð "ð "�DØ˜D˜	˜	ð"õ Ð/°&Ñ8ð2ñ2ñ 3ô 3ð 3ð ð 	@Ø'Ð)9Ð:ˆIØˆEØ%ð Gð G�Ý˜_¨xÑ7Ñ8Ô8Ð8Ø%¨Ñ-�
Ø#œyŸ~š~Ñ0Ô0ð ð �GØ×(Ò(¨(Ñ3Ô3ð Ø×(Ò(¨*Ñ5Ô5ðà'+¤}˜˜G™Ø $˜Ø˜ð	ð ð Ø�EåÐ:¸XÑEÑFÔFÐFÐFàð @ÝÐBÑCÔCÐCØ26´-�•D˜œŸšÑ*Ô*Ñ+Ô+¨AÔ.Ñ/àð 	ÝœF¨L¸tÝ+.°©9¬9ð6ñ 6ô 6ˆMðÝÐ5Ð5°{ÑCÔC��øÝð ð ð Ø���ðøøøøà%- X X¨x¨x¨xÐ8ˆBØð &Ø�i #‘oÑ%�Øð .Ø�i +Ñ-Ñ-�åÐ5¸ÑEÑFÔFÐFÝ˜ÑÔÐàˆ
s7   Á"B Â
BÂBÂA*D Ä
DÄDß
_ ß_+ß*_+c                 óŒ  — |€g }|€g }|                       ||||||¦  «        }||||dœ}	|                      t          |                     ¦   «         ¦  «        |||	|¦  «        }
t	          dt          |
¦  «        z  ¦  «         |                      ||
d                  ¦  «        }t	          d|
d         |fz  ¦  «         ||
d         fS )a¤  
	Obtain a best-effort PPD match for an IEEE 1284 Device ID.
	The status is one of:

	  - L{STATUS_SUCCESS}: the match was successful, and an exact
            match was found

	  - L{STATUS_MODEL_MISMATCH}: a similar match was found, but
            the model name does not exactly match

	  - L{STATUS_GENERIC_DRIVER}: no match was found, but a
            generic driver is available that can drive this device
            according to its command set list

	  - L{STATUS_NO_DRIVER}: no match was found at all, and the
            returned PPD name is a last resort

	@param mfg: MFG or MANUFACTURER field
	@type mfg: string
	@param mdl: MDL or MODEL field
	@type mdl: string
	@param description: DES or DESCRIPTION field, optional
	@type description: string
	@param commandsets: CMD or COMMANDSET field, optional
	@type commandsets: string
	@param uri: device URI, optional (only needed for debugging)
	@type uri: string
        @param downloadedfiles: filenames from downloaded packages
        @type downloadedfiles: string list
        @param make_and_model: device-make-and-model string
        @type make_and_model: string
	@returns: an integer,string pair of (status,ppd-name)
	N)ÚMFGÚMDLÚDESrí   zFound PPDs: %sr   zUsing %s (status: %d))r-  rã   rq   r§   r   r  rÈ   )r”   r  r  r	  r
  r  rØ   rÙ   rÇ   rÚ   r×   Ústatuss               r]   ÚgetPPDNameFromDeviceIDzPPDs.getPPDNameFromDeviceID(  só   € ðL ÐØˆKàÐ"Ø ˆOà×*Ò*¨C°°kØ,7¸Ø,:ñ<ô <ˆð  SØ$Ø$ð'ð 'ˆð ×4Ò4µd¸3¿8º8¹;¼;Ñ6GÔ6GØ6EØ6DØ6;¸SñBô Bˆõ 	Ð%­¨[Ñ(9Ô(9Ñ9Ñ:Ô:Ð:à×&Ò&¨¨K¸¬NÔ(;Ñ<Ô<ˆÝÐ,°¸A´ÀÐ/GÑGÑHÔHÐHØ˜ AœÐ'Ð'rn   c                 óŒ  ‡— t          d¦  «         |                     ¦   «         }|                     d¦  «        r|dd…         }|dd…         }d}d}t          ‰                     ¦   «         ¦  «        }d„ |D ¦   «         }|                     ||f¦  «         |                     t          j        d„ ¦  «        ¬¦  «         | 	                    ||f¦  «        }||d	z
           g}	|d	z   t          |¦  «        k     rR|	                     ||d	z            ¦  «         t          |	d         d         d
z   |z   d
z   |	d	         d         z   ¦  «         n!t          |	d         d         d
z   |z   ¦  «         |	D ]ƒ\  }
}t          j                             ||g¦  «        }t          |¦  «        |k    rJt          ‰|
                              ¦   «         ¦  «        }t          |¦  «        }t          d|
|fz  ¦  «         Œ„|r=|t          |¦  «        dz  k    r'|}|t          |¦  «        k    r	| j        }�n| j        }�n| j        }d}|                     t          j        t"          j        ¦  «        ¬¦  «         ˆfd„|D ¦   «         }d}|                     d¦  «        D ]K}|€|}d}t)          t          |¦  «        ¦  «        D ] }||                              ¦   «         rd} nŒ!|r|} nŒLd}d}d}t)          t          |¦  «        ¦  «        D ]4}||                              ¦   «         r|dk    r|}|}|d	z  }Œ,|dk    r nŒ5|d	z  }d}|dk    �rt-          |||…         ¦  «        }|d|…         dz   ||d…         z   }t          d|||fz  ¦  «         d}d}d}||k     r¦t/          d|¦  «        }|||z  |z  z  }t          d|||fz  ¦  «         |D ]^\  }}|                     d¦  «        D ]}|                     ¦   «         |k    rd} nŒ|r#t          |                     ¦   «         ¦  «        } nŒ_|rn|d	z  }|dk     rn||k     °¦|r	|}| j        }||fS )z|
        Find the best-matching PPDs based on the MDL Device ID.
        This function could be made a lot smarter.
        zTrying best matchz seriesNiùÿÿÿr   c                 ó:   — g | ]}||                      ¦   «         f‘ŒS rÌ   ©r4   ©rÍ   rr   s     r]   rÏ   z+PPDs._findBestMatchPPDs.<locals>.<listcomp>z  s$   € Ð6Ð6Ð6¨�a˜Ÿš™œ�^Ð6Ð6Ð6rn   c                 óD   — t          j        | d         |d         ¦  «        S )Nr   )r³   r´   rù   s     r]   rû   z)PPDs._findBestMatchPPDs.<locals>.<lambda>|  s   € ½d¼nÈQÈqÌTÐSTÐUVÔSWÑ>XÔ>X€ rn   r£   r   z <= z%s: match length %dr_   c                 óH   •— g | ]}|                      ¦   «         ‰|         f‘ŒS rÌ   r6  )rÍ   rr   r  s     €r]   rÏ   z+PPDs._findBestMatchPPDs.<locals>.<listcomp>Ÿ  s*   ø€ Ð@Ð@Ð@°!˜Ÿš™œ T¨!¤WÐ-Ð@Ð@Ð@rn   r&   FTr#   z%dz'Searching for model ID '%s', '%s' %% %dé
   z#Ignoring %d of %d digits, trying %s)r   r4   r?   rq   r§   r“   r¨   rº   r»   ÚindexrI   r‰   r‹   Úcommonprefixrý   Ú	FIT_CLOSErÆ   r³   r´   r;   r`   rb   ÚintÚpow)r”   r  r  r  Úbest_mdlÚbest_matchlenÚmdlnamesÚ	mdlnameslrl   Ú
candidatesÚ	candidateÚ
candidatelr  r×   rÇ   ÚmdlitemsÚmodelidÚwordÚhave_digitsÚdigitsÚdigits_startÚ
digits_endÚmodelnumberÚmodelpatternÚignore_digitsr&  Údivr[   r‚   s    `                           r]   r   zPPDs._findBestMatchPPDsi  s?  ø€ õ 	Ð(Ñ)Ô)Ð)Ø�yŠy‰|Œ|ˆØ�=Š=˜)Ñ$Ô$ð 	à˜˜˜”9ˆDØ�c�r�c”(ˆCØˆØˆÝ˜Ÿ	š	™œÑ%Ô%ˆð 7Ð6¨XÐ6Ñ6Ô6ˆ	Ø×Ò˜3 ˜+Ñ&Ô&Ð&Ø�Š�IÔ0Ð1XÐ1XÑYÔYˆÑZÔZÐZØ�OŠO˜c 4˜[Ñ)Ô)ˆØ  A¡Ô&Ð'ˆ
Øˆq‰5•3˜	‘?”?Ò"Ð"Ø×Ò˜y¨¨Q©Ô/Ñ0Ô0Ð0Ý˜ Aœ qÔ)¨FÑ2°SÑ8¸6ÑAØ" 1œ aÔ(ñ)ñ *ô *ð *ð *õ ˜ Aœ qÔ)¨FÑ2°SÑ8Ñ9Ô9Ð9ð (2ð 	Qð 	QÑ#ˆY˜
Ý”W×)Ò)¨J¸Ð+=Ñ>Ô>ˆFÝ�F‰|Œ|˜mÒ+Ð+Ý  Y¤× 4Ò 4Ñ 7Ô 7Ñ8Ô8�Ý # V¡¤�ÝÐ2°iÀÐ5OÑOÑPÔPÐPøð ð N	)˜­¨d©¬°a©Ò8Ð8Ø"ˆKØ¥ T¡
¤
Ò*Ð*Ø”n�‘à”n�‘à”-ˆCØˆKð �MŠM�yÔ3µD´NÑCÔCˆMÑDÔDÐDØ@Ð@Ð@Ð@°xÐ@Ñ@Ô@ˆHØˆGØŸ
š
 CÑ(Ô(ð ð �Ø�?Ø"�Gà#�Ý¥ T¡
¤
Ñ+Ô+ð ð �AØ˜A”w—’Ñ)Ô)ð Ø&*˜Ø˜ðð ð Ø"�GØ�Eðð ˆFØˆLØˆJÝ�C ™MœMÑ*Ô*ð ð �Ø˜1”:×%Ò%Ñ(Ô(ð Ø# rÒ)Ð)Ø'(˜Ø!"�JØ˜a‘K�F�FØ! RÒ'Ð'Ø�Eð (à˜!‰OˆJØˆKØ˜Šz‰zÝ! 7¨<¸
Ð+BÔ#CÑDÔD�Ø '¨¨¨Ô 6¸Ñ =Ø '¨
¨¨Ô 4ñ!5�åÐFØ% |°[ÐAñBñ Cô Cð Cà !�Ø�Ø�Ø# fÒ,Ð,Ý˜r =Ñ1Ô1�CØ*¨{¸SÑ/@ÀCÑ.GÑH�GÝÐ!FØ"/°¸Ð!Añ"Bñ Cô Cð Cð )1ð "ð "™˜˜tØ$(§J¢J°Ñ$4Ô$4ð &ð &˜DØ#Ÿzšz™}œ}°Ò7Ð7Ø(, Ø % ð  8ð !ð "Ý'+¨D¯IªI©L¬LÑ'9Ô'9˜HØ!˜Eð"ð ð Øà! QÑ&�MØ ’z�zØð+ $ fÒ,Ð,ð. ð )Ø"*�KØœ.�Cà�[Ð!Ð!rn   c                 óº  ‡ ‡— |€g }	 ‰                       ¦   «          ‰ j        d         Šn# t          $ r Y dS w xY wˆˆ fd„}d„ |D ¦   «         }d|v sd|v sd|v r |d¦  «        S d	|v sd
|v sd|v sd|v r |dd¦  «        S d|v r |dd¦  «        S d|v r |dd¦  «        S d|v sd|v r |dd¦  «        S d|v r |dd¦  «        S d|v sd|v sd|v r |d¦  «        S dS )zfReturn ppd-name list or None, given a list of strings representing
        the command sets supported.Nr¥   c                  ób   •— | D ]*}‰                      ‰|¦  «        \  }}|‰j        k    r|c S Œ+d S r²   )r   rý   )rD  rP   r  r‚   Úmodelsr”   s       €€r]   rA   z+PPDs._getPPDNameFromCommandSet.<locals>.getï  sK   ø€ Ø#ð  ð  �Ø ×3Ò3°V¸UÑCÔC‘	��DØ˜œÒ&Ð&Ø�K�K�Kð 'à�4rn   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS rÌ   r6  r7  s     r]   rÏ   z2PPDs._getPPDNameFromCommandSet.<locals>.<listcomp>ö  s    € Ð3Ð3Ð3 !�1—7’7‘:”:Ð3Ð3Ð3rn   rï   Úpostscript2zpostscript level 2 emulationÚ
PostScriptÚpclxlzpcl-xlÚpcl6zpcl 6 emulationzPCL 6/PCL XLz	PCL LaserÚpcl5ezPCL 5eÚpcl5czPCL 5cÚpcl5zpcl 5 emulationzPCL 5ÚpclzPCL 3Úescpl2zesc/p2Úescp2ezESC/P Dot Matrixr¿   )r”   r
  rA   ÚcmdsetsrT  s   `   @r]   r  zPPDs._getPPDNameFromCommandSetâ  s­  øø€ ð ÐØˆKð	Ø×ÒÑÔÐØ”Z 	Ô*ˆFˆFøÝð 	ð 	ð 	Ø�4�4ð	øøøð	ð 	ð 	ð 	ð 	ð 	ð 4Ð3 {Ð3Ñ3Ô3ˆØ˜WÐ$Ð$¨-¸7Ð*BÐ*BØ+¨wÐ6Ð6Ø�3˜Ñ%Ô%Ð%Ø˜'Ð!Ð! x°7Ð':Ð':Ø˜Ð Ð Ð&7¸7Ð&BÐ&BØ�3˜¨Ñ4Ô4Ð4Ø˜ÐÐØ�3˜ +Ñ.Ô.Ð.Ø˜ÐÐØ�3˜ +Ñ.Ô.Ð.Ø˜ÐÐÐ%6¸'Ð%AÐ%AØ�3˜ Ñ-Ô-Ð-Ø�gÐÐØ�3˜ Ñ-Ô-Ð-Ø˜7Ð"Ð"¨°GÐ(;Ð(;Ø˜7Ð"Ð"Ø�3Ð*Ñ+Ô+Ð+Øˆts   ˆ!* ª
8·8c                 óÈ  — | j         rd S t          j        ¦   «         }i }i }i }i }| j                             ¦   «         D �]“\  }}t	          |d         ¦  «        }t          |¦  «        }	t          |	g¦  «        }
|                     dg ¦  «        }t          |t          ¦  «        s|g}t          d„ |D ¦   «         ¦  «        }|�rt          |¦  «        dk    rt          ¦   «         }t	          |                     dd¦  «        ¦  «                             ¦   «         }|r|dz  }t          |¦  «        }|D ]”}|                     d¦  «        r/|                     d	¦  «        r|dt          |¦  «        dz
  …         }|sŒIt          |¦  «        }|                     |¦  «        s||z   }|
                     t          |¦  «        ¦  «         Œ•|
D ]\  }}t          |¦  «        }t          |¦  «        }||vr|||<   i ||<   i ||<   n||         }|||         vr|||         |<   i ||         |<   n||         |         }|||         |         |<   Œ€|	|
v r|
                     |	¦  «         |
ro|	\  }}||v r)||                              |t          ¦   «         ¦  «        }ni ||<   t          ¦   «         }|                     d
„ |
D ¦   «         ¦  «        }|||         |<   �Œ•|                     ¦   «         D ]¿\  }}t          |¦  «        }||         }|                     ¦   «         D ]Ž\  }}||                              t          |¦  «        ¦  «        }|sŒ0||         |         }|D ]M}||                              t          |¦  «        ¦  «        }||         |         }|                     |¦  «         ŒNŒ�ŒÀ|| _         || _        || _        t+          dt          j        ¦   «         |z
  z  ¦  «         d S )Nr€   zppd-productc                 ó<   — g | ]}|                      d ¦  «        ¯|‘ŒS )ú()r>   r7  s     r]   rÏ   z$PPDs._init_makes.<locals>.<listcomp>$  s)   € Ð OÐ OÐ O q¸A¿LºLÈ#Ñ<NÔ<NÐ O Ð OÐ OÐ Orn   r   zppd-maker   r&   rc  ú)c                 ó   — g | ]
}|d          ‘ŒS rË   rÌ   r7  s     r]   rÏ   z$PPDs._init_makes.<locals>.<listcomp>^  s   € Ð'KÐ'KÐ'K°¨¨!¬Ð'KÐ'KÐ'Krn   zinit_makes: %.3fs)rƒ   Útimer‚   rH   rs   r	   rÔ   rA   rp   rq   rI   Úrstriprm   r>   r?   rÖ   r«   ÚunionÚupdaterþ   rÿ   r   )r”   Útstartrƒ   rþ   rÿ   Úaliasesr�   rž   rJ   Úppd_mm_splitÚppd_makes_and_modelsÚppd_productsrK   ÚlmakeÚppd_productÚlprodrP   ÚlmodelrT  Ú	main_makeÚ
modelnamesÚ
main_modelÚ	main_ppdsÚ	eachmodelÚ
this_modelr‚   s                             r]   r¦   zPPDs._init_makes
  s`  € ØŒ:ð 	ØˆFå”‘”ˆØˆØˆØˆØˆØ $¤	§¢Ñ 2Ô 2ð L	.ñ L	.ÑˆG�Wå!+¨WÐ5IÔ-JÑ!KÔ!KÐÝ,Ð.@ÑAÔAˆLÝ#&¨ ~Ñ#6Ô#6Ð ð #Ÿ;š;¨°rÑ:Ô:ˆLÝ˜|­TÑ2Ô2ð .Ø ,˜~�ÝÐ OÐ O¨LÐ OÑ OÔ OÑPÔPˆLØñ Oõ ˜Ñ%Ô%¨Ò*Ð*Ý#&¡5¤5�Lå! 7§;¢;°
¸BÑ#?Ô#?Ñ@Ô@×GÒGÑJÔJ�Øð  Ø˜C‘K�DÝ! 4Ñ(Ô(�Ø#/ð Oð O�Kà#×.Ò.°Ñ4Ô4ð KØ#×,Ò,¨cÑ2Ô2ðKà&1°!µC¸Ñ4EÔ4EÈÑ4IÐ2IÔ&J˜à&ð !Ø õ & {Ñ3Ô3�EØ ×+Ò+¨UÑ3Ô3ð 9Ø&*¨[Ñ&8˜à(×,Ò,Õ.?ÀÑ.MÔ.MÑNÔNÐNÐNð  4ð 6ð 6‘��eÝ! 4Ñ(Ô(�Ý" EÑ*Ô*�Ø Ð&Ð&Ø$(�F˜5‘MØ%'�G˜E‘NØ"$�E˜$‘K�Kà! %œ=�Dà ¨¤Ð/Ð/Ø-2�G˜E”N 6Ñ*Ø)+�E˜$”K Ñ&Ð&à# EœN¨6Ô2�Eà.5��d”˜EÔ" 7Ñ+Ð+ð Ð3Ð3Ð3Ø$×+Ò+¨\Ñ:Ô:Ð:à#ð 	.Ø ,‘��uØ˜7�?�?Ø$ Tœ]×.Ò.°µs±u´uÑ=Ô=�F�Fà$&�G˜D‘MÝ ™UœU�FàŸšÐ'KÐ'KÐ6JÐ'KÑ'KÔ'KÑLÔL�Ø'-�˜”˜eÑ$ùð $ŸMšMÑ,Ô,ð 	,ð 	,‰LˆD�&Ý˜tÑ$Ô$ˆEØ˜uœˆIØ%+§\¢\¡_¤_ð 
,ð 
,Ñ!��zØ$ Uœ^×/Ò/µ¸EÑ1BÔ1BÑCÔC�
Ø!ð Øà! )Ô,¨ZÔ8�	à!+ð ,ð ,�IØ!(¨¤×!3Ò!3µYÀ	Ñ5JÔ5JÑ!KÔ!K�JØ  Ô+¨JÔ7�DØ—K’K Ñ+Ô+Ð+Ð+ð,ð
,ð ˆŒ
ØˆŒØˆŒÝÐ(­D¬I©L¬L¸6Ñ,AÑBÑCÔCÐCÐCÐCrn   c                 ó  — | j         rd S i }| j                             ¦   «         D ]Û\  }}t          |                     d¦  «        ¦  «        }|sŒ*t          |¦  «        }|d                              ¦   «         }|d                              ¦   «         }d}t          |¦  «        dk    rd}t          |¦  «        dk    rd}|rŒœ||vri ||<   |||         vrg ||         |<   ||         |                              |¦  «         ŒÜ|| _         d S )Nrì   r/  r0  Fr   T)	r„   r‚   rH   rs   rA   r   r4   rI   r“   )	r”   r„   r�   rž   r,  Úid_dictÚlmfgÚlmdlÚbads	            r]   rü   zPPDs._init_idsw  s!  € ØŒ8ð 	ØˆFàˆØ $¤	§¢Ñ 2Ô 2ð 	-ð 	-ÑˆG�WÝ˜WŸ[š[¨/Ñ:Ô:Ñ;Ô;ˆBØð Øå# RÑ(Ô(ˆGØ˜5”>×'Ò'Ñ*Ô*ˆDØ˜5”>×'Ò'Ñ*Ô*ˆDàˆCÝ�D‰zŒz˜QŠˆØ�Ý�D‰zŒz˜QŠˆØ�Øð Øà˜3ˆˆØ��D‘	à˜3˜tœ9Ð$Ð$Ø"$��D”	˜$‘à�ŒI�dŒO×"Ò" GÑ,Ô,Ð,Ð,àˆŒˆˆrn   )NN)NNNNN)r   NNN)r   NNNNr²   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚSTATUS_SUCCESSÚSTATUS_MODEL_MISMATCHÚSTATUS_GENERIC_DRIVERÚSTATUS_NO_DRIVERr   rÅ   r  rý   r=  r  rÆ   rÄ   r¡   r¯   r½   rÀ   rÂ   rÈ   rã   r-  r3  r   r  r¦   rü   rÌ   rn   r]   r
   r
   5  s¸  € € € € € ðð ð €NØÐØÐØÐà"Ô-Ô;€MØÔ)Ô3€IØÔ)Ô3€IØ Ô+Ô7€KØÔ(Ô1€Hà$ nØ  .Ø Ð"7Ø"Ð$9ØÐ!1ð	4€NðIPð IPð IPð IPðVð ð ð ð ð ð$ð ð ð"ð "ð "ðQð Qð Qð 6:Ø37Ø26Ø37ðDð Dð Dð DðL >@Ø7;Ø04ðKð Kð Kð KðZ =?Ø6:Ø04Ø/3ð?(ð ?(ð ?(ð ?(ðBw"ð w"ð w"ðr&ð &ð &ð &ðPkDð kDð kDðZð ð ð ð rn   c                  ó$   — t          d¦  «         d S )NzBusage: ppds.py [--deviceid] [--list-models] [--list-ids] [--debug])r‘   rÌ   rn   r]   Ú
_show_helpr‡  —  s   € Ý	ÐOÑPÔPÐPÐPÐPrn   )"r³   ry   r   r   r   Ú	itertoolsr÷   rf  r©   Úos.pathr‰   rº   r<   r   r   r   Ú__all__Úcompiler5   r@   rN   rO   r4   rG   r7   rB   rD   ÚIrE   r	   rm   rs   r
   r‡  rÌ   rn   r]   ú<module>r�     s  ðð. €€€Ø &Ð &Ð &Ð &Ð &Ð &Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø 	€	€	€	Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø Ð Ð Ð Ð Ð àØð€ð
 
ˆ:ˆ2Œ:ð "ñ #ô #ð $ð ˆjˆbŒjÐ*Ñ+Ô+Ð,ØˆjˆbŒjð (ñ )ô )ð *ð ˆjˆbŒjð  ñ !ô !ð "ð �
�”
˜<Ñ(Ô(Ð)ØˆjˆbŒjð 'ñ (ô (ð )ð
 �
�”
Ð7Ñ8Ô8Ð9Ø�z�r”zð #-ñ .ô .ð /ð �
�”
ð 'ñ (ô (ð )ð ˆjˆbŒj˜Ñ"Ô"Ð#Ø
ˆJˆBŒJ�|Ñ$Ô$Ð%Ø
ˆJˆBŒJÐ*Ñ+Ô+Ð,ðS*€ðX Ð Ø ð ,ð ,�K€CˆØ(+Ð˜Ÿ	š	™œÑ%Ð%ð Ø
Ø
Ø ØØðð Ð ð �”˜\Ñ*Ô*€Ø �b”jÐ"FÑGÔGÐ Ø�B”Jð !.ñ "ô "Ð ð& �B”JÐ 5°r´tÑ<Ô<Ð ðBð Bð BðH1ð 1ð 1ðfð ð ð`ð `ð `ð `ð `ñ `ô `ð `ðDQð Qð Qð Qð Qrn   