
    謜iu                        d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	m
Z
 ddlZddlmZmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZ dd	l m!Z! erdd
l"m#Z#  ejH                  e%      Z&e
d   Z' e	dd      Z( G d de      Z) G d de      Z* ee*jV                        e*_+        e*jV                  j                   8e*jV                  j                   jY                  ddd      e*jV                  _         yy)zH
Feature extraction saving/loading class for common feature extractors.
    N)UserDict)TYPE_CHECKINGAnyTypeVarUnion)create_repois_offline_mode   )custom_object_save)FEATURE_EXTRACTOR_NAMEPROCESSOR_NAMEPushToHubMixin
TensorType_is_tensor_or_array_like	copy_funcis_numpy_arrayis_torch_availableis_torch_deviceis_torch_dtypeloggingrequires_backendssafe_load_json_file)cached_file)SequenceFeatureExtractorr   SpecificFeatureExtractorTypeFeatureExtractionMixin)boundc            	            e Zd ZdZ	 	 	 ddeeef   dz  ddez  ez  dee   e	e   z  dz  f fdZ
dedefd	Zdefd
Zd Zd Zddeez  dz  fdZ	 	 ddeez  dz  dee   e	e   z  dz  fdZddZ xZS )BatchFeaturea  
    Holds the output of the [`~SequenceFeatureExtractor.pad`] and feature extractor specific `__call__` methods.

    This class is derived from a python dictionary and can be used as a dictionary.

    Args:
        data (`dict`, *optional*):
            Dictionary of lists/arrays/tensors returned by the __call__/pad methods ('input_values', 'attention_mask',
            etc.).
        tensor_type (`Union[None, str, TensorType]`, *optional*):
            You can give a tensor_type here to convert the lists of integers in PyTorch/Numpy Tensors at
            initialization.
        skip_tensor_conversion (`list[str]` or `set[str]`, *optional*):
            List or set of keys that should NOT be converted to tensors, even when `tensor_type` is specified.
    Ndatatensor_typeskip_tensor_conversionc                 V    t         |   |       || _        | j                  |       y )N)r!   )super__init__r"   convert_to_tensors)selfr    r!   r"   	__class__s       a/mnt/e/genesis-system/.venv/lib/python3.12/site-packages/transformers/feature_extraction_utils.pyr%   zBatchFeature.__init__K   s+     	&<#K8    itemreturnc                 V    t        |t              r| j                  |   S t        d      )z
        If the key is a string, returns the value of the dict associated to `key` ('input_values', 'attention_mask',
        etc.).
        zRIndexing with integers is not available when using Python based feature extractors)
isinstancestrr    KeyErrorr'   r+   s     r)   __getitem__zBatchFeature.__getitem__U   s(    
 dC 99T?"oppr*   c                 H    	 | j                   |   S # t        $ r t        w xY wN)r    r0   AttributeErrorr1   s     r)   __getattr__zBatchFeature.__getattr___   s*    	!99T?" 	!  	!s    !c                     d| j                   iS Nr    r    r'   s    r)   __getstate__zBatchFeature.__getstate__e   s    		""r*   c                 "    d|v r|d   | _         y y r8   r9   )r'   states     r)   __setstate__zBatchFeature.__setstate__h   s    U?fDI r*   c                     |yt        |t              st        |      }|t        j                  k(  r.t               st	        d      dd lfdj                  }|fS dfd	t        }|fS )NNNzMUnable to convert output to PyTorch tensors format, PyTorch is not installed.r   c                    j                  |       r| S t        | t        t        f      r3t	        |       dkD  r%j                  | d         rj                  |       S t        | t        t        f      rt	        |       dkD  rt        | d   t        j                        rt        j                  |       } n_t        | d   t        t        f      rFt	        | d         dkD  r5t        | d   d   t        j                        rt        j                  |       } t        | t        j                        rj                  |       S j                  |       S )Nr   )	is_tensorr.   listtuplelenstacknpndarrayarray
from_numpytensor)valuetorchs    r)   	as_tensorz5BatchFeature._get_is_as_tensor_fns.<locals>.as_tensory   s    ??5) L edE]3E
Q5??[`ab[cKd ;;u-- edE]3E
Q!%(BJJ7 ""58dE];aMA-&uQx{BJJ? "eRZZ0 ++E22 <<..r*   c                    t        | t        t        f      rt        | d   t        t        t        j                  f      r`| D cg c]  }t        |       }}t        t        |            dkD  r1|/ | D cg c]  }t        j                  |       c}t              } t        j                  | |      S c c}w c c}w )Nr   r
   )dtype)	r.   rC   rD   rG   rH   rE   setasarrayobject)rL   rP   val
value_lensrN   s       r)   rN   z5BatchFeature._get_is_as_tensor_fns.<locals>.as_tensor   s    edE]3
58dTY[][e[eMf8g6;!<s#c(!<J!<3z?+a/EM )e*Ls2::c?*LTZ [zz%u55	 "= +Ms   B77B<r4   )r.   r   PYTORCHr   ImportErrorrM   rB   r   )r'   r!   rB   rN   rM   s      @@r)   _get_is_as_tensor_fnsz"BatchFeature._get_is_as_tensor_fnsl   sy     +z2$[1K*,,,%'!"qrr/. I )##6 'I)##r*   c                    || S | j                  |      \  }}||n| j                  }| j                         D ].  \  }}|r||v rt        |      s	  ||      s ||      }|| |<   0 | S # t        $ rW}|dk(  rt        d| dt        |             |t        d| dt        |      j                   dt        |       d      |d}~ww xY w)	a8  
        Convert the inner content to tensors.

        Args:
            tensor_type (`str` or [`~utils.TensorType`], *optional*):
                The type of tensors to use. If `str`, should be one of the values of the enum [`~utils.TensorType`]. If
                `None`, no modification is done.
            skip_tensor_conversion (`list[str]` or `set[str]`, *optional*):
                List or set of keys that should NOT be converted to tensors, even when `tensor_type` is specified.

        Note:
            Values that don't have an array-like structure (e.g., strings, dicts, lists of strings) are
            automatically skipped and won't be converted to tensors. Ragged arrays (lists of arrays with
            different lengths) are still attempted, though they may raise errors during conversion.
        Noverflowing_valueszUnable to create tensor for 'z@' with overflowing values of different lengths. Original error: zUnable to convert output 'z	' (type: z) to tensor: z
You can try:
  1. Use padding=True to ensure all outputs have the same shape
  2. Set return_tensors=None to return Python objects instead of tensors)	rX   r"   itemsr   	Exception
ValueErrorr/   type__name__)	r'   r!   r"   rB   rN   keyrL   rK   es	            r)   r&   zBatchFeature.convert_to_tensors   s'   ( K#99+F	9&<&H"dNiNi 	
 **, 	JC%#1G*G ,E2 '&u-F &DI	4   ..$7u =++.q6(4  !0YtE{?S?S>TTabefgbhai j_ `
 s   A,,	C5ACCc                   	 t        | dg       ddl	j                  d      j                  dd      et              dkD  rWd   }t	        |      rnFt        |t              st        |      st        |t              r|nt        dt        |       d      	fd	| j                         D ci c]  \  }}| |       c}}| _        | S c c}}w )
a  
        Send all values to device by calling `v.to(*args, **kwargs)` (PyTorch only). This should support casting in
        different `dtypes` and sending the `BatchFeature` to a different `device`.

        Args:
            args (`Tuple`):
                Will be passed to the `to(...)` function of the tensors.
            kwargs (`Dict`, *optional*):
                Will be passed to the `to(...)` function of the tensors.
                To enable asynchronous data transfer, set the `non_blocking` flag in `kwargs` (defaults to `False`).

        Returns:
            [`BatchFeature`]: The same instance after modification.
        rM   r   Ndevicenon_blockingFz*Attempting to cast a BatchFeature to type z. This is not supported.c                 0   t        | j                        r#j                  |       r | j                  i S t        | j                        r| j                        S t        | t        t
        f      r t        |       fd| D              S | S )N)rc   rd   c              3   .   K   | ]  } |        y wr4    ).0r+   maybe_tos     r)   	<genexpr>z4BatchFeature.to.<locals>.maybe_to.<locals>.<genexpr>  s     <$x~<s   )r.   Tensoris_floating_pointtorC   rD   r^   )vargsrc   kwargsri   rd   rM   s    r)   ri   z!BatchFeature.to.<locals>.maybe_to   s    !U\\*u/F/Fq/IqttT,V,,Au||,1Ctt6tEEAe}-tAw<!<<<r*   )r   rM   getrE   r   r.   r/   r   intr]   r[   r    )
r'   ro   rp   argkrn   rc   ri   rd   rM   s
    ``   @@@@r)   rm   zBatchFeature.to   s     	$	*H%zz.%8>c$i!mq'Cc"C%)=CQTAU !#McRUhZWo!pqq	 	 15

=1Q^=	 >s   ?C)NNNr4   r@   )r,   r   )r_   
__module____qualname____doc__dictr/   r   r   rC   rQ   r%   r2   r6   r;   r>   rX   r&   rm   __classcell__)r(   s   @r)   r   r   :   s    $ '+/3>B	938nt#9 CZ*,9 !%S	CH 4t ;	9q q q! !#&0$z1AD1H 0$h 04>B7:%,7 !%S	CH 4t ;7r0r*   r   c                      e Zd ZdZdZd Ze	 	 	 	 	 ddee   de	e
j                  z  de	e
j                  z  dz  deded	e	ez  dz  d
e	defd       Zdde	e
j                  z  defdZede	e
j                  z  deee	ef   ee	ef   f   fd       Zedee	ef   ded ed ee	ef   f   f   fd       Zdee	ef   fdZede	e
j                  z  dd fd       Zde	fdZde	e
j                  z  fdZd Zedd       Zy)r   z
    This is a feature extraction mixin used to provide saving/loading functionality for sequential and audio feature
    extractors.
    Nc           
          |j                  dd       |j                         D ]  \  }}	 t        | ||        y# t        $ r%}t        j                  d| d| d|         |d}~ww xY w)z'Set elements of `kwargs` as attributes.processor_classNz
Can't set z with value z for )popr[   setattrr5   loggererror)r'   rp   r`   rL   errs        r)   r%   zFeatureExtractionMixin.__init__  ss     	

$d+ ,,. 	JCc5)	 " z#l5'tfMN	s   :	A( A##A(clspretrained_model_name_or_path	cache_dirforce_downloadlocal_files_onlytokenrevisionr,   c                     ||d<   ||d<   ||d<   ||d<   |||d<    | j                   |fi |\  }} | j                  |fi |S )a  
        Instantiate a type of [`~feature_extraction_utils.FeatureExtractionMixin`] from a feature extractor, *e.g.* a
        derived class of [`SequenceFeatureExtractor`].

        Args:
            pretrained_model_name_or_path (`str` or `os.PathLike`):
                This can be either:

                - a string, the *model id* of a pretrained feature_extractor hosted inside a model repo on
                  huggingface.co.
                - a path to a *directory* containing a feature extractor file saved using the
                  [`~feature_extraction_utils.FeatureExtractionMixin.save_pretrained`] method, e.g.,
                  `./my_model_directory/`.
                - a path or url to a saved feature extractor JSON *file*, e.g.,
                  `./my_model_directory/preprocessor_config.json`.
            cache_dir (`str` or `os.PathLike`, *optional*):
                Path to a directory in which a downloaded pretrained model feature extractor should be cached if the
                standard cache should not be used.
            force_download (`bool`, *optional*, defaults to `False`):
                Whether or not to force to (re-)download the feature extractor files and override the cached versions
                if they exist.
            proxies (`dict[str, str]`, *optional*):
                A dictionary of proxy servers to use by protocol or endpoint, e.g., `{'http': 'foo.bar:3128',
                'http://hostname': 'foo.bar:4012'}.` The proxies are used on each request.
            token (`str` or `bool`, *optional*):
                The token to use as HTTP bearer authorization for remote files. If `True`, or not specified, will use
                the token generated when running `hf auth login` (stored in `~/.huggingface`).
            revision (`str`, *optional*, defaults to `"main"`):
                The specific model version to use. It can be a branch name, a tag name, or a commit id, since we use a
                git-based system for storing models and other artifacts on huggingface.co, so `revision` can be any
                identifier allowed by git.


                <Tip>

                To test a pull request you made on the Hub, you can pass `revision="refs/pr/<pr_number>"`.

                </Tip>

            return_unused_kwargs (`bool`, *optional*, defaults to `False`):
                If `False`, then this function returns just the final feature extractor object. If `True`, then this
                functions returns a `Tuple(feature_extractor, unused_kwargs)` where *unused_kwargs* is a dictionary
                consisting of the key/value pairs whose keys are not feature extractor attributes: i.e., the part of
                `kwargs` which has not been used to update `feature_extractor` and is otherwise ignored.
            kwargs (`dict[str, Any]`, *optional*):
                The values in kwargs of any keys which are feature extractor attributes will be used to override the
                loaded values. Behavior concerning key/value pairs whose keys are *not* feature extractor attributes is
                controlled by the `return_unused_kwargs` keyword parameter.

        Returns:
            A feature extractor of type [`~feature_extraction_utils.FeatureExtractionMixin`].

        Examples:

        ```python
        # We can't instantiate directly the base class *FeatureExtractionMixin* nor *SequenceFeatureExtractor* so let's show the examples on a
        # derived class: *Wav2Vec2FeatureExtractor*
        feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained(
            "facebook/wav2vec2-base-960h"
        )  # Download feature_extraction_config from huggingface.co and cache.
        feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained(
            "./test/saved_model/"
        )  # E.g. feature_extractor (or model) was saved using *save_pretrained('./test/saved_model/')*
        feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained("./test/saved_model/preprocessor_config.json")
        feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained(
            "facebook/wav2vec2-base-960h", return_attention_mask=False, foo=False
        )
        assert feature_extractor.return_attention_mask is False
        feature_extractor, unused_kwargs = Wav2Vec2FeatureExtractor.from_pretrained(
            "facebook/wav2vec2-base-960h", return_attention_mask=False, foo=False, return_unused_kwargs=True
        )
        assert feature_extractor.return_attention_mask is False
        assert unused_kwargs == {"foo": False}
        ```r   r   r   r   r   )get_feature_extractor_dict	from_dict)	r   r   r   r   r   r   r   rp   feature_extractor_dicts	            r)   from_pretrainedz&FeatureExtractionMixin.from_pretrained  st    j ({#1 %5!"%z#F7O)G)G)GHe)pio)p&s}}3>v>>r*   save_directorypush_to_hubc           	         t         j                  j                  |      rt        d| d      t        j                  |d       |rw|j                  dd      }|j                  d|j                  t         j                  j                        d         }t        |fd	di|j                  }| j                  |      }| j                  t        | || 
       t         j                  j                  |t              }| j                  |       t         j#                  d|        |r%| j%                  ||j'                  d             |gS )az  
        Save a feature_extractor object to the directory `save_directory`, so that it can be re-loaded using the
        [`~feature_extraction_utils.FeatureExtractionMixin.from_pretrained`] class method.

        Args:
            save_directory (`str` or `os.PathLike`):
                Directory where the feature extractor JSON file will be saved (will be created if it does not exist).
            push_to_hub (`bool`, *optional*, defaults to `False`):
                Whether or not to push your model to the Hugging Face model hub after saving it. You can specify the
                repository you want to push to with `repo_id` (will default to the name of `save_directory` in your
                namespace).
            kwargs (`dict[str, Any]`, *optional*):
                Additional key word arguments passed along to the [`~utils.PushToHubMixin.push_to_hub`] method.
        zProvided path (z#) should be a directory, not a fileT)exist_okcommit_messageNrepo_idr   )configzFeature extractor saved in r   )r   r   )ospathisfileAssertionErrormakedirsr}   splitsepr   r   _get_files_timestamps_auto_classr   joinr   to_json_filer   info_upload_modified_filesrq   )r'   r   r   rp   r   r   files_timestampsoutput_feature_extractor_files           r)   save_pretrainedz&FeatureExtractionMixin.save_pretrained  s/    77>>.) ?>2BBe!fgg
NT2#ZZ(8$?NjjN,@,@,Mb,QRG!'CDCFCKKG#99.I 't^DA )+^E[(\%7812O1PQR'' -jj) (  ...r*   c                    |j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  d	d      }	|j                  d
d      }
|j                  dd      }d|d}|
|
|d<   t               r|st        j                  d       d}t	        |      }t
        j                  j                  |      }t
        j                  j                  |      r$t
        j                  j                  |t              }t
        j                  j                  |      r|}d}d}n7t        }	 t        |t        |||||||	|d      }t        |||||||||	|d      }d}|4t        |      }d|v sd|v r!|j!                  d|j!                  d            }||t        |      }|t        d| d| d d      |rt        j                  d|        ||fS t        j                  d d|        ||fS # t        $ r  t        $ r t        d| d| dt         d      w xY w)a6  
        From a `pretrained_model_name_or_path`, resolve to a dictionary of parameters, to be used for instantiating a
        feature extractor of type [`~feature_extraction_utils.FeatureExtractionMixin`] using `from_dict`.

        Parameters:
            pretrained_model_name_or_path (`str` or `os.PathLike`):
                The identifier of the pre-trained checkpoint from which we want the dictionary of parameters.

        Returns:
            `tuple[Dict, Dict]`: The dictionary(ies) that will be used to instantiate the feature extractor object.
        r   Nr   Fproxies	subfolderr   r   r   _from_pipeline
_from_autofeature extractor)	file_typefrom_auto_classusing_pipelinez+Offline mode: forcing local_files_only=TrueT)
filenamer   r   r   r   r   
user_agentr   r   %_raise_exceptions_for_missing_entriesz"Can't load feature extractor for 'z'. If you were trying to load it from 'https://huggingface.co/models', make sure you don't have a local directory with the same name. Otherwise, make sure 'z2' is the correct path to a directory containing a z filefeature_extractoraudio_processorzloading configuration file z from cache at )r}   r	   r   r   r/   r   r   isdirr   r   r   r   r   OSErrorr\   r   rq   )r   r   rp   r   r   r   r   r   r   r   from_pipeliner   r   is_localfeature_extractor_fileresolved_feature_extractor_fileresolved_processor_filer   processor_dicts                      r)   r   z1FeatureExtractionMixin.get_feature_extractor_dict  s    JJ{D1	$4e<**Y-JJ{D1	

7D)!::&8%@::j$/

#3T: **\59#6?[
$+8J'(%5KKEF#(+,I(J%77==!>?77==67%'WW\\2OQg%h"77>>78.K+&*#H%;"'*51+'#1#%5)%':?+' 3>13'#1#%5)%':?3/: "&".01HIN"n48I^8[)7););<OQ_QcQcduQv)w&*6;Q;Y%89X%Y"!)45R4S T55R4S T++A*B%I  KK56U5VWX &v--	 KK-.D-E_UtTuv &v--Q    89V8W X99V8W X//E.FeM s   ,0H7 7,I#r   c                    |j                  dd      }g }|j                         D ]   \  }}||v s|||<   |j                  |       " |D ]  }|j                  |d         | di |}t        j	                  d|        |r||fS |S )a	  
        Instantiates a type of [`~feature_extraction_utils.FeatureExtractionMixin`] from a Python dictionary of
        parameters.

        Args:
            feature_extractor_dict (`dict[str, Any]`):
                Dictionary that will be used to instantiate the feature extractor object. Such a dictionary can be
                retrieved from a pretrained checkpoint by leveraging the
                [`~feature_extraction_utils.FeatureExtractionMixin.to_dict`] method.
            kwargs (`dict[str, Any]`):
                Additional parameters from which to initialize the feature extractor object.

        Returns:
            [`~feature_extraction_utils.FeatureExtractionMixin`]: The feature extractor object instantiated from those
            parameters.
        return_unused_kwargsFNzFeature extractor rg   )r}   r[   appendr   r   )r   r   rp   r   	to_remover`   rL   r   s           r)   r   z FeatureExtractionMixin.from_dict!  s    (  &zz*@%H 	 ,,. 	&JC,,.3&s+  %	&  	"CJJsD!	"  9"89():(;<=$f,,$$r*   c                     t        j                  | j                        }| j                  j                  |d<   d|v r|d= d|v r|d= |S )z
        Serializes this instance to a Python dictionary. Returns:
            `dict[str, Any]`: Dictionary of all the attributes that make up this configuration instance.
        feature_extractor_typemel_filterswindow)copydeepcopy__dict__r(   r_   )r'   outputs     r)   to_dictzFeatureExtractionMixin.to_dictH  sP    
 t}}-+/>>+B+B'(F"}%vx r*   	json_filec                     t        |d      5 }|j                         }ddd       t        j                        } | di |S # 1 sw Y   &xY w)a  
        Instantiates a feature extractor of type [`~feature_extraction_utils.FeatureExtractionMixin`] from the path to
        a JSON file of parameters.

        Args:
            json_file (`str` or `os.PathLike`):
                Path to the JSON file containing the parameters.

        Returns:
            A feature extractor of type [`~feature_extraction_utils.FeatureExtractionMixin`]: The feature_extractor
            object instantiated from that JSON file.
        utf-8encodingNrg   )openreadjsonloads)r   r   readertextr   s        r)   from_json_filez%FeatureExtractionMixin.from_json_fileU  sN     )g. 	!&;;=D	!!%D!1,+,,	! 	!s   AAc                     | j                         }|j                         D ]3  \  }}t        |t        j                        s!|j                         ||<   5 t        j                  |dd      dz   S )z
        Serializes this instance to a JSON string.

        Returns:
            `str`: String containing all the attributes that make up this feature_extractor instance in JSON format.
           T)indent	sort_keys
)r   r[   r.   rG   rH   tolistr   dumps)r'   
dictionaryr`   rL   s       r)   to_json_stringz%FeatureExtractionMixin.to_json_stringh  sb     \\^
$**, 	1JC%,"',,.
3	1 zz*Q$?$FFr*   json_file_pathc                     t        |dd      5 }|j                  | j                                ddd       y# 1 sw Y   yxY w)z
        Save this instance to a JSON file.

        Args:
            json_file_path (`str` or `os.PathLike`):
                Path to the JSON file in which this feature_extractor instance's parameters will be saved.
        wr   r   N)r   writer   )r'   r   writers      r)   r   z#FeatureExtractionMixin.to_json_filew  s<     .#8 	0FLL,,./	0 	0 	0s	    8Ac                 T    | j                   j                   d| j                          S )N )r(   r_   r   r:   s    r)   __repr__zFeatureExtractionMixin.__repr__  s(    ..))*!D,?,?,A+BCCr*   c                     t        |t              s|j                  }ddlmc m} t        ||      st        | d      || _        y)a  
        Register this class with a given auto class. This should only be used for custom feature extractors as the ones
        in the library are already mapped with `AutoFeatureExtractor`.



        Args:
            auto_class (`str` or `type`, *optional*, defaults to `"AutoFeatureExtractor"`):
                The auto class to register this new feature extractor with.
        r   Nz is not a valid auto class.)	r.   r/   r_   transformers.models.automodelsautohasattrr]   r   )r   
auto_classauto_modules      r)   register_for_auto_classz.FeatureExtractionMixin.register_for_auto_class  sC     *c*#,,J66{J/
|+FGHH$r*   )NFFNmain)F)AutoFeatureExtractor)r_   ru   rv   rw   r   r%   classmethodr^   r   r/   r   PathLikeboolr   r   rD   rx   r   r   r   r   r   r   r   r   r   r   rg   r*   r)   r   r   
  s   
 K
  /3$!&#'^?./^?'*R[['8^? $t+^? 	^?
 ^? TzD ^? ^? 
&^? ^?@./cBKK.? ./d ./` o.,/"++,=o.	tCH~tCH~-	.o. o.b $%%)#s(^$%	'/GcSVh/W)XX	Y$% $%Lc3h  -sR[['8 -=U - -$G G	03+< 	0D % %r*   r   r   zfeature extractor file)rS   object_classobject_files)-rw   r   r   r   collectionsr   typingr   r   r   r   numpyrG   huggingface_hubr   r	   dynamic_module_utilsr   utilsr   r   r   r   r   r   r   r   r   r   r   r   r   	utils.hubr   !feature_extraction_sequence_utilsr   
get_loggerr_   r   PreTrainedFeatureExtractorr   r   r   r   formatrg   r*   r)   <module>r      s      	   5 5  8 4    # K 
		H	%"#=>   ''EMef M8 M`O%^ O%d &//E/Q/Q%R  "%%--91G1S1S1[1[1b1b"1GVn 2c 2&&. :r*   