관리-도구
편집 파일: util.cpython-39.opt-1.pyc
a �����g�g�a����������������������@���s���d�dl�mZ�d�dl�mZ�d�dl�mZ�ddlmZmZ�d�dlmZm Z �d�dl Z d�dlZd�dlZd�dl Zd�dlZd�dlZd�dlZd�dlZd�dlZd�dlZd�dlZd�dlZd�dlZd�dlZd�dlZd�dlZd�dlZd�dlZd�dlZd�dlZd�dlZe� d�Z!e �"��j#d k�re �"��j#ndZ$e$�%��Z&d d��Z'dbdd �Z(dcdd�Z)dd��Z*dd��Z+dd��Z,dd��Z-dd��Z.dd��Z/dd��Z0dd ��Z1d!d"��Z2d#d$��Z3d%d&��Z4d'd(��Z5d)d*��Z6d+d,��Z7d-d.��Z8d/d0��Z9d1d2��Z:d3d4��Z;d5d6��Z<d7d8��Z=d9d:��Z>d;d<��Z?d=d>��Z@d?d@��ZAdAdB��ZBdCdD��ZCdddFdG�ZDdHdIejEfdJdK�ZFdLdM��ZGdNdO��ZHdPdQ��ZIdRdS��ZJG�dTdU��dUeK�ZLG�dVdW��dWeM�ZNG�dXdY��dYeO�ZPdZd[��ZQd\d]��ZRd^d_��ZSG�d`da��da�ZTdS�)e�����)�print_function)�absolute_import)�unicode_literals����)�PY3� basestring)�_�ucdN�dnfZyumc�����������������C���s����t�|�dg���t�|�dg���t�|�dg���t��}|D�]�}||v�r<q.|�|��tjj�|�d�}|�d�rp|�j�|��q.|r�|dv�r�|�j�|��q.|� d�r�|�j �|dd ����q.|�j�|��q.d S�) a��� Categorize :param values list into packages, groups and filenames :param namespace: argparse.Namespace, where specs will be stored :param values: list of specs, whether packages ('foo') or groups/modules ('@bar') or filenames ('*.rmp', 'http://*', ...) To access packages use: specs.pkg_specs, to access groups use: specs.grp_specs, to access filenames use: specs.filenames � filenames� grp_specs� pkg_specsr���z.rpm)�http�ftp�file�https�@r���N)�setattr�set�addr ����pycomp�urlparse�endswithr����append� startswithr���r ���)� namespace�valuesZtmp_set�valueZschemes��r����,/usr/lib/python3.9/site-packages/dnf/util.py�_parse_specs9���s ���� r ���c�������������� ���C���s����|d�u�rt�j���}t�j�|�||�}t|jg�}|�d|��|���g}zt jj �t j�|�d��W�nD�t y��}�z,|jr�tt|���t�t|���W�Y�d�}~n d�}~0�0�|jS�)Nr���T)r ����callbackZNullDownloadProgress�repoZRemoteRPMPayload�sumZ download_size�startZ_librepo_target�libdnfZ PackageTargetZdownloadPackagesZVectorPPackageTarget�RuntimeError�strict�IOError�str�logger�errorZ local_path)�url�confZprogressZploadZest_remote_size�targets�er���r���r����_urlopen_progressY���s���� $r0����w+bc�������������� ���K���s����t�rd|vr|�dd��tj|fi�|��}z<|rD|j�|�|�����n tjj � |rV|jnd|�|�����W�n0�ty��}�zt t|���W�Y�d}~n d}~0�0�|�d��|S�)z| Open the specified absolute url, return a file object which respects proxy setting even for non-repo downloads �b�encodingzutf-8Nr���)r���� setdefault�tempfileZNamedTemporaryFileZ_repoZdownloadUrl�filenor%���r"���Z DownloaderZdownloadURLZ_configr&���r(���r)����seek)r,���r-���r"����mode�kwargs�for/���r���r���r����_urlopenh���s����$" r;���c�����������������C���s ���|���|�r|�d�t|����}�|�S��N)r����len)�s�rr���r���r����rtrim|���s���� r@���c�������������������C���s���t����dkS��Nr���)�os�geteuidr���r���r���r���� am_i_root����s����rD���c�����������������C���s*���t��|��D�]}t�j�|�|�}t|��q dS�)zBRemove all files and dirs under `path` Also see rm_rf() N)rB����listdir�path�join�rm_rf)rF����entryZcontained_pathr���r���r���� clear_dir����s����rJ���c�������������� ���C���sX���zt�j|�dd��W�n@�tyR�}�z(|jtjks:t�j�|��s>|�W�Y�d�}~n d�}~0�0�d�S�)Ni���)r8���)rB����makedirs�OSError�errnoZEEXISTrF����isdir)Zdnamer/���r���r���r���� ensure_dir����s ����rO���c�����������������C���sD���g�}|�}t�j�|�\}}|s2|s$|s@|�d|��q@|�d|��q|S�)z` Split path by path separators. Use os.path.join() to join the path back to string. r���)rB���rF����split�insert)rF����result�head�tailr���r���r���� split_path����s����rU���c�����������������C���s4���zt�|��}W�n�ty*���t�t|���}Y�n0�|dkS�rA���)r=���� TypeError�list)�iterable�lr���r���r����empty����s ����rZ���c�����������������C���s,���t�|��}z t|�W�S��ty&���Y�dS�0�dS�)zFReturns the first item from an iterable or None if it has no elements.N��iter�next� StopIteration�rX����itr���r���r����first����s ���� ra���c�����������������C���s6���t�|��}ztdd��|D���W�S��ty0���Y�d�S�0�d�S�)Nc�����������������s���s���|�]}|d�ur|V��qd�S�r<���r���)�.0�itemr���r���r���� <genexpr>���������z!first_not_none.<locals>.<genexpr>r[���r_���r���r���r����first_not_none����s ����rf���c�����������������C���s���t�����t|���S�r<���)�time�file_timestamp��fnr���r���r����file_age����s����rk���c�����������������C���s���t��|��jS�r<���)rB����stat�st_mtimeri���r���r���r���rh�������s����rh���c�������������������C���s8���zt��t����d�W�S��ty2���dt�����Y�S�0�d�S�)Nr���zUID: %s)�pwd�getpwuidrB���rC����KeyErrorr���r���r���r����get_effective_login����s����rq���c�����������������C���s(���|D�]}|���|�}�|�du�r|��S�q|�S�)z!Like dict.get() for nested dicts.N)�get)Zdct�keysZ not_found�kr���r���r����get_in����s ���� ru���c��������������������s�����fdd�}t��||g�g�f�S�)Nc��������������������s���|�t���|�����|��|�S�r<���)�boolr���)Zaccrc���ri���r���r����splitter����s����z!group_by_filter.<locals>.splitter)� functools�reduce)rj���rX���rw���r���ri���r����group_by_filter����s����rz���c�����������������c���s"���|D�]}||�r|�V��|V��qdS�)z/Insert an item into an iterable by a condition.Nr���)rc���rX���� conditionZ original_itemr���r���r���� insert_if����s����r|���c�����������������C���s*���zt�|���W�n�ty ���Y�dS�0�dS�dS�)z&Test whether an iterator is exhausted.TFN)r]���r^���)�iteratorr���r���r����is_exhausted����s ����r~���c�����������������C���s*���t�|��r|�g}�t|�t�o(tdd��|�D���S�)Nc�����������������s���s���|�]}t�|�t�d��@�V��qdS�)z*[?N)r���)rb����pr���r���r���rd�������re���z"is_glob_pattern.<locals>.<genexpr>)�is_string_type� isinstancerW����any)�patternr���r���r����is_glob_pattern����s����r����c�����������������C���s���t�rt|�t�S�t|�t�S�d�S�r<���)r���r����r)���r���)�objr���r���r���r��������s���� r����c��������������������s�����fdd�}|S�)z�Decorator to get lazy attribute initialization. Composes with @property. Force reinitialization by deleting the <attrname>. c��������������������s������fdd�}|S�)Nc��������������������s<���zt�|����W�S��ty6����|��}t|���|��|�Y�S�0�d�S�r<���)�getattr�AttributeErrorr���)r�����val)�attrnamerj���r���r���� cached_getter���s����z6lazyattr.<locals>.get_decorated.<locals>.cached_getterr���)rj���r�����r����ri���r���� get_decorated����s����zlazyattr.<locals>.get_decoratedr���)r����r����r���r����r����lazyattr����s���� r����c�����������������G���s���t�t|�g|�R����S�)z�Like functools.map(), but return a list instead of an iterator. This means all side effects of fn take place even without iterating the result. �rW����map)rj����seqr���r���r����mapall��s����r����c�����������������C���s8���t��dt��|���}tjjs4t���d�}|r4|�|�}|S�)z6Convert time into locale aware datetime string object.z%cr���) rg����strftime� localtimer ���r���r����locale� getlocale�decode)Z timestamp�tZcurrent_locale_settingr���r���r����normalize_time��s���� r����c��������������� ���C���s����zxd}�dd��t��|��D��}t|�dkrt|d�}td�|�|���&}|���}t|�dkW��d����W�S�1�sj0����Y��W�dS��ttfy����Y�dS�0�dS�)z�Decide whether we are on line power. Returns True if we are on line power, False if not, None if it can not be decided. z/sys/class/power_supplyc�����������������S���s���g�|�]}|��d��r|�qS�)ZAC)r���)rb���Znoder���r���r���� <listcomp>&��re���zon_ac_power.<locals>.<listcomp>r���z{}/{}/onliner���N) rB���rE���r=����open�format�read�intr(���� ValueError)Z ps_folderZac_nodesZac_nodeZ ac_status�datar���r���r����on_ac_power��s����,r����c������������������C���s����zddl�}�W�n�ty ���Y�dS�0�z0|����}|�dd�}|��|d�}|�dd�}W�n�|�jyh���Y�dS�0�|dkrvdS�|dv�r�dS�|d v�r�d S�td|��dS�)z�Decide whether we are on metered connection. Returns: True: if on metered connection False: if not None: if it can not be decided r���Nzorg.freedesktop.NetworkManagerz/org/freedesktop/NetworkManagerzorg.freedesktop.DBus.PropertiesZMetered)r�������T)��������Fz&Unknown value for metered property: %r)�dbus�ImportErrorZ SystemBusZ get_objectZ InterfaceZGetZ DBusExceptionr����)r����Zbus�proxyZifaceZmeteredr���r���r����on_metered_connection1��s(�����r����c�����������������C���s&���t��|�\}}tj�|�|�t|�|�fS�)z�Use a predicate to partition entries into false entries and true entries. Credit: Python library itertools' documentation. )� itertools�teer ���r����filterfalse�filter)ZpredrX����t1�t2r���r���r���� partitionN��s����r����c�����������������C���s&���zt��|���W�n�ty ���Y�n0�d�S�r<���)�shutil�rmtreerL����rF���r���r���r���rH���W��s����rH���c�����������������#���sB���t�������fdd�}t��|�|�}||�V��||�}|s6q>|V��q(dS�)z�Split an iterable into tuples by a condition. Inserts a separator before each item which meets the condition and then cuts the iterable by these separators. c��������������������s���t�t���fdd�|���S�)Nc��������������������s���|���kS�r<���r���)r/����� separatorr���r����<lambda>g��re���z4split_by.<locals>.next_subsequence.<locals>.<lambda>)�tupler����� takewhile)r`���r����r���r����next_subsequencef��s����z"split_by.<locals>.next_subsequenceN)�objectr|���)rX���r{���r����ZmarkedZsubsequencer���r����r����split_by]��s���� r����c�����������������C���s���|���|�r|�t|�d���S�d�S�r<���)r���r=���)r>����prefixr���r���r����strip_prefixu��s���� r����Fc�����������������C���sL���|st��|�t�j�rt��|�d�S�t|�d���W�d����n1�s>0����Y��dS�)z{Create an empty file if it doesn't exist or bump it's timestamps. If no_create is True only bumps the timestamps. N�a)rB����access�F_OK�utimer����)rF���Z no_creater���r���r����touch{��s����r�����write��c�������������� ���C���s����zh|�dkr|��|��nP|�dkr(|����n>|�dkrD|��|��|����n"|�dkrZt||d��ntd|����W�n@�ty��}�z(t�d�t|�j t |����W�Y�d�}~n d�}~0�0�d�S�)Nr�����flushZwrite_flush�print)r���zUnsupported type: z{}: {})r����r����r����r����r(���r*����criticalr�����type�__name__r ���)�tp�msg�outr/���r���r���r����_terminal_messenger���s���� r����c�����������������C���sj���d}t�|��dk}t|�dd�D�]H\}}|rB|dtd��d|��7�}n|dtd��d�7�}|d�|�7�}q|S�) z� Format string about problems in resolve :param resolve_problems: list with list of strings (output of goal.problem_rules()) :return: string r����r���)r$���z ZProblemz %d: z: z - )r=���� enumerater���rG���)Zresolve_problemsr����Zcount_problems�iZrsr���r���r����_format_resolve_problems���s����r����c�����������������C���sX���|�����d�}|����d�ur4|����dkr4||����d�7�}||�����d�|�����d�|�����S�)N�-�0�:�.)�N�E�V�R�A)�teZnevrar���r���r���� _te_nevra���s����r����c�������������� ���C���s����t��d��|�D�]@}|���}d�}|d�ur,|j}d�t|�|||����}t��|��q|D�]2}d�t|�|j|j|j |j |����}t��|��qTd�S�)NzLogging transaction elementsz@RPM element: '{}', Key(): '{}', Key state: '{}', Failed() '{}': z^SWDB element: '{}', State: '{}', Action: '{}', From repo: '{}', Reason: '{}', Get reason: '{}')r*����debug�Key�stater����r�����Failedr)����actionZ from_repo�reasonZ get_reason)�rpm_transaction�swdb_transaction�rpm_el�tsiZ tsi_stater����r���r���r����_log_rpm_trans_with_swdb���s ���� ��r����c����������� ������C���sH��t�jjt�jjt�jjt�jjt�jjh}dd��|D��}d}d}|�D�]�}t|�}|���}|d�u�sbt |d�s�|D�]4} | j t�jjkrzqf| j|vr�qft | �|krf| }�q�qf|d�u�s�t |d�s�t�td��|���d}q<|���r�t�jj|_ d}q<t�jj|_ q<|D�].}|j t�jjkr�t�td��t |����d}q�|�r4t�td���|�rDt|�|��d�S�) Nc�����������������S���s���g�|�]}|�qS�r���r���)rb���r����r���r���r���r�������re���z-_sync_rpm_trans_with_swdb.<locals>.<listcomp>F�pkgz%TransactionItem not found for key: {}Tz)TransactionSWDBItem not found for key: {}z#Errors occurred during transaction.)r%����transactionZ TransactionItemAction_DOWNGRADEDZTransactionItemAction_OBSOLETED�TransactionItemAction_REMOVEZTransactionItemAction_UPGRADEDZ!TransactionItemAction_REINSTALLEDr����r�����hasattrr����ZTransactionItemState_UNKNOWNr����r)���r*���r����r���r����r�����TransactionItemState_ERRORZTransactionItemState_DONEr����r����) r����r����Zrevert_actionsZ cached_tsiZel_not_foundr+���r����Zte_nevrar����Z tsi_candidater���r���r����_sync_rpm_trans_with_swdb���sJ����� r����c�������������������@���s$���e�Zd�Zdd��Zdd��Zdd��ZdS�)�tmpdirc�����������������C���s���dt�jj�}tj|d�|�_d�S�)Nz%s-)r����)r ����constZPREFIXr5���ZmkdtemprF���)�selfr����r���r���r����__init__���s����ztmpdir.__init__c�����������������C���s���|�j�S�r<���r�����r����r���r���r���� __enter__���s����ztmpdir.__enter__c�����������������C���s���t�|�j��d�S�r<���)rH���rF���)r�����exc_type� exc_value� tracebackr���r���r����__exit__���s����ztmpdir.__exit__N)r����� __module__�__qualname__r����r����r����r���r���r���r���r�������s���r����c�����������������������s(���e�Zd�ZdZ��fdd�Zdd��Z���ZS�)�Bunchz�Dictionary with attribute accessing syntax. In DNF, prefer using this over dnf.yum.misc.GenericHolder. Credit: Alex Martelli, Doug Hudgeon c��������������������s ���t�t|��j|i�|���|�|�_d�S�r<���)�superr����r�����__dict__)r�����args�kwds�� __class__r���r���r�������s����zBunch.__init__c�����������������C���s���t�|��S�r<���)�idr����r���r���r����__hash__��s����zBunch.__hash__)r����r����r�����__doc__r����r����� __classcell__r���r���r����r���r�������s���r����c�����������������������s,���e�Zd�Z��fdd�Zdd��Zdd��Z���ZS�)� MultiCallListc��������������������s���t�t|������|��|��d�S�r<���)r����r��r�����extend)r����rX���r����r���r���r������s����zMultiCallList.__init__c��������������������s������fdd�}|S�)Nc���������������������s�������fdd�}t�t|���S�)Nc��������������������s���t�|���}|��i����S�r<���)r����)�v�method)r����r9����whatr���r���� call_what ��s���� z8MultiCallList.__getattr__.<locals>.fn.<locals>.call_whatr����)r����r9���r���r����r��)r����r9���r���rj�����s����z%MultiCallList.__getattr__.<locals>.fnr���)r����r��rj���r���r��r����__getattr__��s����zMultiCallList.__getattr__c��������������������s������fdd�}t�t||���S�)Nc��������������������s���t�|������d�S�r<���)r���)rc����r����r��r���r����setter��s����z)MultiCallList.__setattr__.<locals>.setterr����)r����r��r����r��r���r ��r����__setattr__��s����zMultiCallList.__setattr__)r����r����r����r����r ��r��r��r���r���r����r���r����s���r��c�������������� ���C���sh��t�g�g�g�g�g�g�g�g�g�g�g�d��}|�D��]<}|jtjjkrF|j�|��q$|jtjjkrb|j �|��q$|jtjj kr�|jtjjkr�|j �|��nD|jtjjkr�|j�|��n(|jtjjkr�|j�|��n|j�|��q$|jtjjkr�|j�|��q$|jtjjk�rH|jtjjk�r|j�|��n*|jtjjk�r:|j�|��n|j�|��q$|jtjjkr$|j�|��q$|S�)N)� downgraded�erased�erased_clean� erased_dep� installed�installed_group� installed_dep�installed_weak�reinstalled�upgraded�failed)r����r����r%���r����r����r��r���r����ZTransactionItemAction_DOWNGRADEr ��ZTransactionItemAction_INSTALLr����ZTransactionItemReason_GROUPr��Z TransactionItemReason_DEPENDENCYr��Z%TransactionItemReason_WEAK_DEPENDENCYr��r��ZTransactionItemAction_REINSTALLr��r����ZTransactionItemReason_CLEANr��r��r��ZTransactionItemAction_UPGRADEr��)r����r2���r����r���r���r����_make_lists��sJ����� r��c�������������� ������s������fdd�}t�j�|�}��jd|d�\}}|�|�}g�}td�|jftd�|jftd�|j|j �|j �|j�ftd�|jftd �|ftd �|j |j�|j�ftd�|jffD�]&\} } |�|| t| t�|�d����q�|S�) al��Returns a human-readable summary of the results of the transaction. :param action_callback: function generating output for specific action. It takes two parameters - action as a string and list of affected packages for this action :return: a list of lines containing a human-readable summary of the results of the transaction c��������������������s����|�j�|j�k|�j�|j�k��}|dkr$|S�tj|�j�|�j|�j|�j|�jd�}tj|j�|j|j|j|jd�}|�|��j�}|dkrz|S�|�j|jk|�j|jk��S�)z�Compares two transaction items or packages by nevra. Used as a fallback when tsi does not contain package object. r���)�name�epoch�version�release�arch) r���hawkeyZNEVRAr��r��r��r��Zevr_cmpZsack)Zitem1Zitem2�retZnevra1Znevra2��baser���r����_tsi_or_pkg_nevra_cmpP��s������z7_post_transaction_output.<locals>._tsi_or_pkg_nevra_cmpF)Zreport_problemsr����ZUpgradedZ DowngradedZ InstalledZReinstalledZSkippedZRemovedr����)�key)r ����utilr��Z_skipped_packages�unionr���r��r ��r��r��r��r��r��r��r��r��r��r���sortedrx���� cmp_to_key)r!��r����Zaction_callbackr"��Z list_bunchZskipped_conflictsZskipped_brokenZskippedr����r����Ztsisr���r ��r����_post_transaction_outputF��s:���� � ��� ����r(��c�����������������C���s���|�r|�S�t�d�S�)Nz<name-unset>)r���)Z input_namer���r���r����_name_unset_wrappery��s����r)��c�������������������@���sd���e�Zd�ZdZdZdd��Zedd���Zedd���Z d d ��Z dd��Zed d���Zedd���Z dd��ZdS�)�_BootcSystemz/usri���c�����������������C���s^���|�����sttd���dd�l}||�_|�dd��ddlm}�||�_|�jj � ��|�_|�j���|�_ d�S�)NzNot running on a bootc system.r����OSTreez1.0)r+��)�is_bootc_systemr&���r����giZ_giZrequire_versionZ gi.repositoryr+���_OSTreeZSysrootZnew_defaultZ_sysrootZrequire_booted_deployment�_booted_deployment)r����r-��r+��r���r���r���r�������s����z_BootcSystem.__init__c������������������C���s���d}�t�j�|��S�)zYReturns true is the system is managed as an immutable container, false otherwise.z/run/ostree-booted)rB���rF����isfile)Z ostree_bootedr���r���r���r,�����s����z_BootcSystem.is_bootc_systemc�����������������C���s���t��|�jt�j�S�)z-Returns true if and only if /usr is writable.)rB���r�����usr�W_OK)�clsr���r���r����is_writable���s����z_BootcSystem.is_writablec�����������������C���s ���|�j����S�r<���)r/��Zget_unlockedr����r���r���r����_get_unlocked_state���s����z _BootcSystem._get_unlocked_statec�����������������C���s���|�����|�jjjkS�)z�Returns true if and only if the bootc system is unlocked in a transient state, i.e. a overlayfs is mounted as read-only on /usr. Changes can be made to the overlayfs by remounting /usr as read/write in a private mount namespace.)r5��r.���DeploymentUnlockedState� TRANSIENTr����r���r���r����is_unlocked_transient���s����z"_BootcSystem.is_unlocked_transientc�������������� ���C���s����t��d��}|�|�j�dkr"td��dddd|�jg}ztj|dd�}|����W�nT�t yv���t j�t d �|d����Y�n,�tjy����t j�t d |�j|j���Y�n0�d�S�)Nr���z!Failed to unshare mount namespaceZmountz--options-source=disablez-oz remount,rwT��textz%s: command not found.z$Failed to mount %s as read/write: %s)�ctypesZCDLLZunshare�CLONE_NEWNSrL���r1��� subprocess�run�check_returncode�FileNotFoundErrorr ���� exceptions�Errorr����CalledProcessError�stderr)r3��ZlibcZ mount_command�completed_processr���r���r����_set_up_mountns���s���� z_BootcSystem._set_up_mountnsc������������������C���sx���g�d�}�zt�j|�dd�}|����W�nP�tyL���tj�td�|�d����Y�n(�t�jyr���tj�td|j ���Y�n0�d�S�)N)ZostreeZadminZunlockz--transientTr9��z.%s: command not found. Is this a bootc system?r���zFailed to unlock system: %s) r=��r>��r?��r@��r ���rA��rB��r���rC��rD��)Zunlock_commandrE��r���r���r����_unlock���s����z_BootcSystem._unlockc�����������������C���s����|�����}|�jjj|�jjj|�jjj|�jjjf}||vrFttd�|j ���|�jjj|�jjjf}||v�rdn6||�jjjkr�|�� ���|�����n||�jjjkr�|�����dS�)z+Set up a writable overlay on bootc systems.z"Unhandled bootc unlocked state: %sN)r5��r.��r6��ZNONEZDEVELOPMENTr7��ZHOTFIXr����r���Z value_nickrG��rF��)r����Zbootc_unlocked_stateZvalid_bootc_unlocked_statesZwritable_unlocked_statesr���r���r���� make_writable���s&������ z_BootcSystem.make_writableN)r����r����r����r1��r<��r�����staticmethodr,���classmethodr4��r5��r8��rF��rG��rH��r���r���r���r���r*��~��s��� r*��)N)NNr1���)F)UZ __future__r���r���r���r���r���r���Zdnf.i18nr���r ����argparser;��r ���Zdnf.callbackZ dnf.constZ dnf.pycomprM���rx���r��r����r����ZloggingrB���rn���r����r=���sysr5���rg���Zlibdnf.repor%���Zlibdnf.transactionZ getLoggerr*����ArgumentParser�progZ MAIN_PROG�upperZMAIN_PROG_UPPERr ���r0���r;���r@���rD���rJ���rO���rU���rZ���ra���rf���rk���rh���rq���ru���rz���r|���r~���r����r����r����r����r����r����r����r����rH���r����r����r�����stdoutr����r����r����r����r����r����r�����dictr����rW���r��r��r(��r)��r*��r���r���r���r����<module>���s���� (-3