
    0h                     d   d Z ddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmc m	Z
 ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ dZi dddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6Zd7gd7d8gg d9d:gd:gd:d;gd;gd<Zd=d>d?d@dAd?d:dBd?dCd>d?gd=d>d?d@dAd?d:dDd?dCd>d?gd=d>d?d@dEd?d:dFd?dCd>d?gd=d>d?d@dGd?d:dFd?dCd>d?gd=dAd?d@dHd?d:dId?dCdAd?gd=dAd?d@dFd?d:dJd?dCdAd?gd=dAd?d@dKd?d:dLd?dCdAd?gd<ZdMdNdOdPdQdRZdSZddTZ	 	 	 	 ddUedVedWefdXZ 	 ddYe!dZed[e!fd\Z"	 	 	 	 	 	 dd]e!d^e!d_e#dUedVedWedZed`efdaZ$	 	 	 	 	 	 ddZedVedUedWed`ef
dbZ%dc Z&dde!fdeZ'df Z(	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddge!dWedheeee!f      dieeef   fdjZ) edkdl      	 	 	 	 	 	 	 	 ddm       Z* edndo      	 	 	 	 	 	 	 	 ddp       Z+ edqdr      	 	 	 	 	 	 	 	 dds       Z, edtdu      	 	 	 	 	 	 	 	 ddv       Z- edwdx      	 	 	 	 	 	 	 	 ddy       Z. edzd{      	 	 	 	 	 	 	 	 dd|       Z/ ed}d~      	 	 	 	 	 	 	 	 dd       Z0 ed      dd       Z1 ed      dd       Z2ejd                  j                   e2_         ejg                  d      e*_         ejg                  d      e+_         ejg                  d      e,_         ejg                  d      e-_         ejg                  d      e._         ejg                  d      e/_         ejg                  d      e0_         y)zResNet-RS models for TF-Keras.

Reference:
- [Revisiting ResNets: Improved Training and Scaling Strategies](
    https://arxiv.org/pdf/2103.07579.pdf)
    N)Callable)Dict)List)Union)backend)layers)imagenet_utils)training)
data_utils)layer_utils)keras_exportzGhttps://storage.googleapis.com/tensorflow/keras-applications/resnet_rs/zresnet-rs-101-i160.h5 544b3434d00efc199d66e9058c7f3379zresnet-rs-101-i160_notop.h5 82d5b90c5ce9d710da639d6216d0f979zresnet-rs-101-i192.h5 eb285be29ab42cf4835ff20a5e3b5d23zresnet-rs-101-i192_notop.h5 f9a0f6b85faa9c3db2b6e233c4eebb5bzresnet-rs-152-i192.h5 8d72a301ed8a6f11a47c4ced4396e338zresnet-rs-152-i192_notop.h5 5fbf7ac2155cb4d5a6180ee9e3aa8704zresnet-rs-152-i224.h5 31a46a92ab21b84193d0d71dd8c3d03bzresnet-rs-152-i224_notop.h5 dc8b2cba2005552eafa3167f00dc2133zresnet-rs-152-i256.h5 ba6271b99bdeb4e7a9b15c05964ef4adzresnet-rs-152-i256_notop.h5 fa79794252dbe47c89130f65349d654azresnet-rs-200-i256.h5 a76930b741884e09ce90fa7450747d5fzresnet-rs-200-i256_notop.h5 bbdb3994718dfc0d1cd45d7eff3f3d9czresnet-rs-270-i256.h5 20d575825ba26176b03cb51012a367a8zresnet-rs-270-i256_notop.h5 2c42ecb22e35f3e23d2f70babce0a2aazresnet-rs-350-i256.h5 f4a039dc3c421321b7fc240494574a68zresnet-rs-350-i256_notop.h5 6e44b55025bbdff8f51692a023143d66zresnet-rs-350-i320.h5 7ccb858cc738305e8ceb3c0140bee393 ab0c1f9079d2f85a9facbd2c88aa6079 ae0eb9bed39e64fc8d7e0db4018dc7e8 fe6217c32be8305b1889657172b98884 69d9d925319f00a8bdd4af23c04e4102 90daa68cd26c95aa6c5d25451e095529)zresnet-rs-350-i320_notop.h5zresnet-rs-420-i320.h5zresnet-rs-420-i320_notop.h5zresnet-rs-50-i160.h5zresnet-rs-50-i160_notop.h5      )r%         r'   i@  )2   e           ^    @      )input_filtersnum_repeats         i         $         5   H   ,   W   VarianceScalingg       @fan_outtruncated_normal)scalemodedistribution)
class_nameconfiga-  Instantiates the {name} architecture.

    Reference:
    [Revisiting ResNets: Improved Training and Scaling Strategies](
    https://arxiv.org/pdf/2103.07579.pdf)

    For image classification use cases, see
    [this page for detailed examples](
    https://keras.io/api/applications/#usage-examples-for-image-classification-models).

    For transfer learning use cases, make sure to read the
    [guide to transfer learning & fine-tuning](
    https://keras.io/guides/transfer_learning/).

    Note: each TF-Keras Application expects a specific kind of input
    preprocessing. For ResNetRs, by default input preprocessing is included as a
    part of the model (as a `Rescaling` layer), and thus
    `tf.keras.applications.resnet_rs.preprocess_input` is actually a
    pass-through function. In this use case, ResNetRS models expect their inputs
    to be float tensors of pixels with values in the [0-255] range.
    At the same time, preprocessing as a part of the model (i.e. `Rescaling`
    layer) can be disabled by setting `include_preprocessing` argument to False.
    With preprocessing disabled ResNetRS models expect their inputs to be float
    tensors of pixels with values in the [-1, 1] range.

    Args:
        depth: Depth of ResNet network.
        input_shape: optional shape tuple. It should have exactly 3 inputs
            channels, and width and height should be no smaller than 32.
            E.g. (200, 200, 3) would be one valid value.
        bn_momentum: Momentum parameter for Batch Normalization layers.
        bn_epsilon: Epsilon parameter for Batch Normalization layers.
        activation: activation function.
        se_ratio: Squeeze and Excitation layer ratio.
        dropout_rate: dropout rate before final classifier layer.
        drop_connect_rate: dropout rate at skip connections.
        include_top: whether to include the fully-connected layer at the top of
        the network.
        block_args: list of dicts, parameters to construct block modules.
        model_name: name of the model.
        pooling: optional pooling mode for feature extraction when `include_top`
            is `False`.
            - `None` means that the output of the model will be
                the 4D tensor output of the
                last convolutional layer.
            - `avg` means that global average pooling
                will be applied to the output of the
                last convolutional layer, and thus
                the output of the model will be a 2D tensor.
            - `max` means that global max pooling will
                be applied.
        weights: one of `None` (random initialization), `'imagenet'`
            (pre-training on ImageNet), or the path to the weights file to be
            loaded.  Note: one model can have multiple imagenet variants
            depending on input shape it was trained with. For input_shape
            224x224 pass `imagenet-i224` as argument. By default, highest input
            shape weights are downloaded.
        input_tensor: optional TF-Keras tensor (i.e. output of `layers.Input()`)
            to use as image input for the model.
        classes: optional number of classes to classify images into, only to be
            specified if `include_top` is True, and if no `weights` argument is
            specified.
        classifier_activation: A `str` or callable. The activation function to
            use on the "top" layer. Ignored unless `include_top=True`. Set
            `classifier_activation=None` to return the logits of the "top"
            layer.
        include_preprocessing: Boolean, whether to include the preprocessing
            layer (`Rescaling`) at the bottom of the network. Note: Input image
            is normalized by ImageNet mean and standard deviation.
            Defaults to `True`.

    Returns:
        A `keras.Model` instance.
c                 V     t        j                  d      }d|  fd}|S )z Conv2D block with fixed padding.conv_c           
          dkD  rt        |       }  t        j                  dk(  rdnddt              |       S )N   samevalidF)filterskernel_sizestridespaddinguse_biaskernel_initializername)fixed_paddingr   Conv2DCONV_KERNEL_INITIALIZER)inputsrM   rN   rS   rO   s    ]/var/www/html/engine/venv/lib/python3.12/site-packages/tf_keras/src/applications/resnet_rs.pyapplyz!Conv2DFixedPadding.<locals>.apply   sR    Q;"6;7F
v}}#%lF6
  	    r   get_uid)rM   rN   rO   rS   counterrY   s   ````  rX   Conv2DFixedPaddingr^      s.    |//'*wi  LrZ   bn_momentum
bn_epsilon
activationc                 V     t        j                  d      }d|  fd}|S )zResNet-D type STEM block.stem_c                    t        j                         dk(  rdnd} t        ddddz         |       } t        j                  |dz   	      |      } t        j
                  d
z         |      } t        ddddz         |      } t        j                  |dz   	      |      } t        j
                  dz         |      } t        ddddz         |      } t        j                  |dz   	      |      } t        j
                  dz         |      } t        ddddz         |      } t        j                  |dz   	      |      } t        j
                  dz         |      }|S )Nchannels_lastr0   rJ          _stem_conv_1rM   rN   rO   rS   _stem_batch_norm_1axismomentumepsilonrS   _stem_act_1rS   _stem_conv_2_stem_batch_norm_2_stem_act_2r/   _stem_conv_3_stem_batch_norm_3_stem_act_3_stem_conv_4_stem_batch_norm_4_stem_act_4)r   image_data_formatr^   r   BatchNormalization
Activation)rW   bn_axisxra   r`   r_   rS   s      rX   rY   zSTEM.<locals>.apply   s   002oE!1
Aqtn7L


F%% ,,	

  EFjtm/CDQG
Aqtn7L


F%% ,,	

  EFjtm/CDQG
Aqtn7L


F%% ,,	

  EFjtm/CDQG
Aqtn7L


F%% ,,	

  EFjtm/CDQGrZ   r[   )r_   r`   ra   rS   r]   rY   s   ````  rX   STEMr      s1     |//'*wi 2h LrZ   
in_filtersse_ratioexpand_ratioc                      t        j                         dk(  rdndt        j                  d      }d|  fd}|S )zSqueeze and Excitation block.re   r0   rJ   se_c                     t        j                  dz         |       }dk(  r|j                  d   ddf}ndd|j                  d   f} t        j                  |dz         |      }t	        dt        dz  z              } t        j                  |ddgddgt        ddd	d
z         |      } t        j                  dz  z  ddgddgt        ddddz         |      }t        j                  | |gdz         S )N_se_squeezerp   rJ   _se_reshaper4   rK   Trelu
_se_reduce)rM   rN   rO   rR   rP   rQ   ra   rS   sigmoid
_se_expand
_se_excite)	r   GlobalAveragePooling2DshapeReshapemaxintrU   rV   multiply)	rW   r~   se_shapenum_reduced_filtersr}   r   r   rS   r   s	       rX   rY   zSE.<locals>.apply1  s5   DF))tm/CDVLa<Q*H1aggbk*H?FNN8$*>?B!!Sa()B%CD	
FMM'AF6$	
 	
FMM AF6 $
  {1DEErZ   )r   rz   r\   )r   r   r   rS   r]   rY   r}   s   ````  @rX   SEr   (  sN     ,,./AaqG|//%(WI"F "FH LrZ   rM   rO   use_projectionsurvival_probabilityc	           	      j     t        j                  d      }	d|	  f	d}
|
S )z7Bottleneck block variant for residual networks with BN.block_0_c                 *  	 t        j                         dk(  rdnd}| }rdz  }dk(  r; t        j                  ddd	dz   	      |       } t	        |dd	d
z         |      }n t	        |d	d
z         |       } t        j
                  |	dz         |      } t	        dd	dz         |       } t        j
                  |	dz         |      } t        j                  	dz         |      } t	        d	dz         |      } t        j
                  |	dz         |      } t        j                  	dz         |      } t	        dz  dd	dz         |      } t        j
                  |	dz         |      }d
cxk  rdk  rn n t        
	dz         |      }r! t        j                  d	dz         |      } t        j                         ||g      } t        j                  	dz         |      S )Nre   r0   rJ   r4   rg   )rg   rg   rK   _projection_pooling)	pool_sizerO   rP   rS   _projection_convri   _projection_batch_normrk   _conv_1batch_norm_1_act_1rp   _conv_2_batch_norm_2_act_2_conv_3_batch_norm_3r   _se)r   rS   )NrJ   rJ   rJ   _drop)noise_shaperS   _output_act)
r   rz   r   AveragePooling2Dr^   r{   r|   r   DropoutAdd)rW   r}   shortcutfilters_outr~   ra   r`   r_   rM   rS   r   rO   r   r   s        rX   rY   zBottleneckBlock.<locals>.applyh  s   002oE!1!A+K!|622$"" 55	
 -' ! 22	
 -' !# 22	
 v00$"44	
 H
AD9<L


F%% &	

  @Fjth?B
	!	

 
F%% '	

  @Fjth?B
aKQy@P


F%% '	

  x!A7XD5LA!DA  $+G^ 	A FJJL!X'Gv  $2FGJJrZ   r[   )rM   rO   r   r_   r`   ra   r   r   rS   r]   rY   s   `````````  rX   BottleneckBlockr   X  s;     |//*-'#VK VKp LrZ   c	           	      j     t        j                  d      }	d|	  f	d}
|
S )z0Create one group of blocks for the ResNet model.block_group_c                    	  t        
d	dz   	      |       }t        d      D ]#  } t        dd	d| dz   	      |      }% |S )	NT	_block_0_)	rM   rO   r   r   r`   r_   ra   r   rS   rJ   F_block__)	rM   rO   r   r   ra   r`   r_   r   rS   )r   range)rW   r~   ira   r`   r_   rM   rS   r2   r   rO   r   s      rX   rY   zBlockGroup.<locals>.apply  s    

O!#!!5#

 
 q+& 	A
$!%%'%9gaSN*
 
A	 rZ   r[   )rM   rO   r2   r   r`   r_   ra   r   rS   r]   rY   s   `````````  rX   
BlockGroupr     s6     |//.1gY' : LrZ   c                 $    | t        |      z  |z  S )z@Get survival probability based on block number and initial rate.)float	init_rate	block_numtotal_blockss      rX   get_survival_probabilityr     s    uY'',66rZ   target_limitc                 b    t        j                         }|| k  rt        j                  |        yy)z9Increase default recursion limit to create larger models.N)sysgetrecursionlimitsetrecursionlimit)r   current_limits     rX   allow_bigger_recursionr     s+    ))+M|#l+ $rZ   c                 h    |dz
  }|dz  }||z
  } t        j                  ||f||ff      |       }|S )zKPad the input along the spatial dimensions independently of input
    size.rJ   rg   )rP   )r   ZeroPadding2D)rW   rN   	pad_totalpad_begpad_endpadded_inputss         rX   rT   rT     sV     aI1nG'!GF((7#gw%78M rZ   depth
block_argsclassifier_activationc                    t         |    }|dk(  rt        |      }| d| }|D cg c]  }d| 	 }}|h |dv s=t        j                  j                  j                  |      st        d|  d| d|       ||v r|r|dk7  rt        d	| d
|       t        j                  |ddt        j                         ||      }|t        j                  |      }n/t        j                  |      st        j                  ||      }n|}t        j                         dk(  rdnd}|}|rK||dz
     } t        j                  d      |      }|dk(  r" t        j                  g dg d|      |      } t!        |||      |      }|		t"        |    }	t%        |	      D ]P  \  }}t'        ||dz   t)        |	      dz         } t+        |d   ||dk(  rdnd|d   ||||d|dz    d 	      |      }R |rs t        j,                  d!"      |      }|dkD  r t        j.                  |d#"      |      }t        j0                  ||        t        j2                  ||d$%      |      }nC|d&k(  r t        j,                  d!"      |      }n!|d'k(  r t        j4                  d("      |      }|t7        j8                  |      }n|}t;        j<                  |||
"      }||v rc|j?                  d)      d*   }|
 d)| }|s|d+z  }| d,}t@        |z   } tC        jD                  || d-tF        |   .      }!|jI                  |!       |S ||jI                  |       |S c c}w )/a'  Build Resnet-RS model, given provided parameters.

    Args:
        depth: Depth of ResNet network.
        input_shape: optional shape tuple. It should have exactly 3 inputs
          channels, and width and height should be no smaller than 32. E.g.
          (200, 200, 3) would be one valid value.
        bn_momentum: Momentum parameter for Batch Normalization layers.
        bn_epsilon: Epsilon parameter for Batch Normalization layers.
        activation: activation function.
        se_ratio: Squeeze and Excitation layer ratio.
        dropout_rate: dropout rate before final classifier layer.
        drop_connect_rate: dropout rate at skip connections.
        include_top: whether to include the fully-connected layer at the top of
          the network.
        block_args: list of dicts, parameters to construct block modules.
        model_name: name of the model.
        pooling: optional pooling mode for feature extraction when `include_top`
          is `False`.
          - `None` means that the output of the model will be the 4D tensor
            output of the last convolutional layer.
          - `avg` means that global average pooling will be applied to the
            output of the last convolutional layer, and thus the output of the
            model will be a 2D tensor.
          - `max` means that global max pooling will be applied.
        weights: one of `None` (random initialization), `'imagenet'`
          (pre-training on ImageNet), or the path to the weights file to be
          loaded. Note- one model can have multiple imagenet variants depending
          on input shape it was trained with. For input_shape 224x224 pass
          `imagenet-i224` as argument. By default, highest input shape weights
          are downloaded.
        input_tensor: optional TF-Keras tensor (i.e. output of `layers.Input()`)
          to use as image input for the model.
        classes: optional number of classes to classify images into, only to be
          specified if `include_top` is True, and if no `weights` argument is
          specified.
        classifier_activation: A `str` or callable. The activation function to
          use on the "top" layer. Ignored unless `include_top=True`. Set
          `classifier_activation=None` to return the logits of the "top" layer.
        include_preprocessing: Boolean, whether to include the preprocessing
          layer (`Rescaling`) at the bottom of the network. Note - Input image
          is normalized by ImageNet mean and standard deviation.
          Defaults to `True`.


    Returns:
        A `tf.keras.Model` instance.

    Raises:
        ValueError: in case of invalid argument for `weights`, or invalid input
            shape.
        ValueError: if `classifier_activation` is not `softmax` or `None` when
            using a pretrained top layer.
    imagenetz-iz
imagenet-iNzThe `weights` argument should be either `None` (random initialization), `'imagenet'` (pre-training on ImageNet, with highest available input shape), or the path to the weights file to be loaded. For ResNetRSz- the following weight variants are available z% (default=highest). Received weights=  z-If using `weights` as `'imagenet'` or any of zH with `include_top` as true, `classes` should be 1000. Received classes=r&   rf   )default_sizemin_sizedata_formatrequire_flattenweights)r   )tensorr   re   r0   rJ   gp?)rB   )g
ףp=
?gv/?gCl?)gg٪?g.?gQ?)meanvariancerl   )r_   r`   ra   rg   r   r1   r   r2   r   r   )	rM   ra   rO   r2   r   r_   r`   r   rS   avg_poolrp   top_dropoutpredictions)ra   rS   avgr   max_pool-r   _notopz.h5models)fnameorigincache_subdir	file_hash)%DEPTH_TO_WEIGHT_VARIANTSr   tfiogfileexists
ValueErrorr	   obtain_input_shaper   rz   r   Inputis_keras_tensor	RescalingNormalizationr   
BLOCK_ARGS	enumerater   lenr   r   r   validate_activationDenseGlobalMaxPooling2Dr   get_source_inputsr
   ModelsplitBASE_WEIGHTS_URLr   get_fileWEIGHT_HASHESload_weights)"r   input_shaper_   r`   ra   r   dropout_ratedrop_connect_rateinclude_topr   
model_namepoolingr   input_tensorclassesr   include_preprocessingavailable_weight_variantsmax_input_shaper~   weights_allow_list	img_inputr}   num_channelsr   argsr   rW   modelweights_input_shapeweights_namefilenamedownload_urlweights_paths"                                     rX   ResNetRSr    s   T !9 ?*78 IR014MNqJqc*NN.'..."%%++2D2DW2M !' "+, -!!(	+
 	
 $$D$% &  'y*
 	
 !33--/#K LL{3	&&|4LLI$I,,./AaqGA"7Q;/-F9-a01$$*7 	A	J:			A
 &
Z( 47'!eZ1, 


J)!q&Qa]+#!!5a!eWA&

 
( :F))z:1=!@|-@CA**+@'J
FLL 5M

 e>--:>qAA:))z:1=A ..|< NN61:6E $$%mmC04$Q':&;<H$L"^3''(2!**!#H-	
 	<(
 L 
	7#L Os   Mz'keras.applications.resnet_rs.ResNetRS50zkeras.applications.ResNetRS50c                 0    t        d| dd||||||d|      S )zBuild ResNet-RS50 model.r(                 ?zresnet-rs-50r   r  r  r  r   r  r  r  r  r   r  r	  r  r  r   r  r  r  r  r   r	  s           rX   
ResNetRS50r    s5     !3!3 rZ   z(keras.applications.resnet_rs.ResNetRS101zkeras.applications.ResNetRS101c                 0    t        d| dd||||||d|      S )zBuild ResNet-RS101 model.r)   r  r  zresnet-rs-101r  r  r  s           rX   ResNetRS101r    5     !3"3 rZ   z(keras.applications.resnet_rs.ResNetRS152zkeras.applications.ResNetRS152c                 0    t        d| dd||||||d|      S )zBuild ResNet-RS152 model.r*   r  r  zresnet-rs-152r  r  r  s           rX   ResNetRS152r"    r   rZ   z(keras.applications.resnet_rs.ResNetRS200zkeras.applications.ResNetRS200c                 0    t        d| dd||||||d|      S )zBuild ResNet-RS200 model.r+   皙?r  zresnet-rs-200r  r  r  s           rX   ResNetRS200r%  ;  r   rZ   z(keras.applications.resnet_rs.ResNetRS270zkeras.applications.ResNetRS270c                 F    t        d       t        d| dd||||||d|      S )zBuild ResNet-RS-270 model.i  r,   r$  r  zresnet-rs-270r  r   r  r  s           rX   ResNetRS270r(  Y  s=     4 !3"3 rZ   z(keras.applications.resnet_rs.ResNetRS350zkeras.applications.ResNetRS350c                 F    t        d       t        d| dd||||||d|      S )zBuild ResNet-RS350 model.i  r-   r$  皙?zresnet-rs-350r  r'  r  s           rX   ResNetRS350r+  x  s=     4 !3"3 rZ   z(keras.applications.resnet_rs.ResNetRS420zkeras.applications.ResNetRS420c                 F    t        d       t        d| dd||||||d|      S )zBuild ResNet-RS420 model.i  r.   r*  r$  zresnet-rs-420)r   r  r  r  r   r  r  r  r  r   r  r	  r'  r  s           rX   ResNetRS420r-    s=     4 !3"3 rZ   z-keras.applications.resnet_rs.preprocess_inputc                     | S )a  A placeholder method for backward compatibility.

    The preprocessing logic has been included in the ResnetRS model
    implementation. Users are no longer required to call this method to
    normalize
    the input data. This method does nothing and only kept as a placeholder to
    align the API surface between old and new version of model.

    Args:
      x: A floating point `numpy.array` or a `tf.Tensor`.
      data_format: Optional data format of the image tensor/array. `None` means
        the global setting `tf.keras.backend.image_data_format()` is used
        (unless you changed it, it uses "channels_last").
        Defaults to `None`.

    Returns:
      Unchanged `numpy.array` or `tf.Tensor`.
     )r~   r   s     rX   preprocess_inputr0    s	    ( HrZ   z/keras.applications.resnet_rs.decode_predictionsc                 0    t        j                  | |      S )N)top)r	   decode_predictions)predsr2  s     rX   r3  r3    s    ,,U<<rZ   r  rp   r  r"  r%  r(  r+  r-  )N)r  h㈵>r   N)r  rJ   N)r  r5  r   r  皙?N)r  r5  r  r   r6  N)Nr  r5  r   r  r  g?TNz	resnet-rsNr   Nr   softmaxT)Tr   r   NNNr7  T)   )4__doc__r   typingr   r   r   r   tensorflow.compat.v2compatv2r   tf_keras.srcr   r   tf_keras.src.applicationsr	   tf_keras.src.enginer
   tf_keras.src.utilsr   r    tensorflow.python.util.tf_exportr   r   r   r   r   rV   BASE_DOCSTRINGr^   r   strr   r   r   boolr   r   r   r   rT   r  r  r  r"  r%  r(  r+  r-  r0  r3  formatr/  rZ   rX   <module>rG     s  "      ! !    4 ( ) * : N ?!#E ? "#E	
 ? "#E ? "#E ? "#E ? "#E ? "#E ?  "#E!" ?#$ $F?#E>"D-4 

s	


s
  Q/a0a0a0		 Q/a0b1a0	
 Q/a0b1a0	
 Q/b1b1a0	
 Q/b1b1a0	
 Q/b1b1a0	
 Q/b1b1a0	
K+
Z $* IX. 		??? ?F JN--$-;>-h "%	hhh h 	h
 h h h  h^ "%	- 	-
 - - -  -`7
, ," '+2;#PP
 P T#s(^$P  !h/!Pf -/N #6 .0P #6 .0P #6 .0P #6 .0P #8 .0P #8 .0P #8 => ?, ?@= A= ,>>FF  #***=
 $+++? $+++? $+++? $+++? $+++? $+++? rZ   