Experimento en acuario

Análisis de los resultados del experimento en acuario evaluando la interacción depredador-presa entre estadíos diferentes de Carcinus y Ovalipes.

Distribución de tallas

En primera instancia, se evalúa la distribución de tallas entre los diferentes tratamientos experimentales (juveniles y adultos), para ambas especies y en todas las combinaciones posibles.

Como se observa en la Fig. 1, la clasificación por “adulto” y “juvenil” corresponde con una marcada diferencia en el tamaño de los cangrejos, que es algo menor para la combinación de adultos de Carcinus vs juveniles de Ovalipes que para la alternativa. En la Tabla 1 muestra los valores medios, desvío estándar y número de individuos para cada una de las especies de las combinaciones.

Figura 1: Distribución de tallas para ambas especies de cangrejos en los tres experimentos entre los adultos (A) y juveniles (J) de Carcinus (C) y Ovalipes (O)

Tabla 1: Valores medios y desvío estándar de los tamaños por especie y experimento:

summarise() has grouped output by ‘Experiment’. You can override using the .groups argument.

Experiment species Media SD N
AO_AC Carcinus 71.58583 5.323602 12
AO_AC Ovalipes 75.67583 8.296952 12
AO_JC Carcinus 25.97833 3.223208 12
AO_JC Ovalipes 85.70750 4.327517 12
JO_AC Carcinus 72.04750 5.439833 12
JO_AC Ovalipes 32.86250 10.395314 12

Mortalidad

La mortalidad se consideró sumando aquellos casos en donde hubo mortalidad con consumo y un sólo caso en donde hubo mortalidad sin consumo. No se consideraron las presas subsecuentes en aquella combinación en la que se utilizó un mayor número de presas una vez consumida la primera.

Por el diseño experimental utilizado (en el que no hay una identificación a priori de la presa y depredador), una alternativa es asumir que el adulto es el depredador mientras que el juvenil es la presa. Bajo esta asunción, el tratamiento entre adultos no tiene sentido a menos que se decida algún criterio para establecer cuál de los dos individuos es la presa y cuál el depredador. Dado que no hubo interacciones entre adultos, este tratamiento será discutido por separado, mientras que los análisis sólo contemplarán los tratamientos entre adultos y juveniles.

La primera opción de análisis es realizar evaluar la independencia entre la especie depredadora y la mortalidad. Esto se puede realizar a través de una prueba exacta de Fisher, a partir de la tabla de contingencia (Tabla 2). De acuerdo a esta prueba (ver abajo), no existe una asociación entre la mortalidad observada y la especie a la que corresponde el individuo juvenil de la combinación.

Tabla 2: Tabla de contingencia de la mortalidad en función de la especie de cada juvenil:

Mortalidad Supervivencia
Carcinus 9 3
Ovalipes 10 2

Test de Fisher Prueba exacta de Fisher para independencia entre factores:

fisher.test(as.data.frame(fisher))

    Fisher's Exact Test for Count Data

data:  as.data.frame(fisher)
p-value = 1
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 0.04198917 6.69718598
sample estimates:
odds ratio 
 0.6128984 

Relación entre la mortalidad y la diferencia de tamaño de los cangrejos presa y depredador

Una de las preguntas que no responde la prueba exacta de Fisher es si existe una dependencia de la mortalidad con el tamaño de la presa y el depredador. Si bien los adultos y juveniles utilizados en las diferentes réplicas de cada tratamiento fueron similares, cabe preguntarse si las diferencias absolutas (Fig. 2) o relativas (Fig. 3) entre el depredador y la presa utilizados en cada réplica interfieren con la mortalidad observada.

Figura 2: Distribución de la diferencia absoluta (en mm) entre el depredador y la presa utilizado en cada una de las réplicas para las diferentes combinaciones. En el caso de la combinación entre adultos (AO_AC), la diferencia está calculada entre el individuo más grande y el más pequeño, independientemente de la especie.

Figura 3: Distribución de la diferencia relativa al cangrejo de mayor tamaño (en %) entre el depredador y la presa utilizado en cada una de las réplicas para las diferentes combinaciones. En el caso de la combinación entre adultos (AO_AC), la diferencia está calculada entre el individuo más grande y el más pequeño, independientemente de la especie.

Dado que existen ciertas diferencias en la diferencia de tallas utilizadas entre la combinación AO_JC y JO_AC, se plantea la duda de si estas diferencias podrían incidir en la mortalidad. Si se compara la diferencia de talla entre los tratamientos en que hubo mortalidad de los que no, se observa que no hay patrones detectables que indiquen un comportamiento dependiente del tamaño (Fig. 4).

Figura 4: Diferencia relativa de tamaño entre eldepredador y la presa en función de la mortalidad para las diferentes combinaciones. En el caso de la combinación entre adultos (AO_AC), la diferencia está calculada entre el individuo más grande y el más pequeño, independientemente de la especie.

Para evaluar si la diferencia relativa de tamaños entre la presa y el depredador puede influir en la mortalidad observada, se utilizó un modelo lineal generalizado con distribución binomial utilizando como variables predictoras i) la diferencia relativa de tamaño entre el depredador la presa y ii) la especie a la que pertenece el depredador. Así, este modelo permite además, evaluar si existen diferencias entre ambas especies en la mortalidad de la presa. Se excluyó la combinación adulto-adulto (AO_AC).

Resultados del modelo lineal generalizado:

mb3 <- glm(as.logical(Mortality)~Predador*Dif_porc, 
           family = "binomial",
           data = filter(diferencias, Experiment!="AO_AC"))
summary(mb3)

Call:
glm(formula = as.logical(Mortality) ~ Predador * Dif_porc, family = "binomial", 
    data = filter(diferencias, Experiment != "AO_AC"))

Coefficients:
                          Estimate Std. Error z value Pr(>|z|)
(Intercept)                0.77554    2.68362   0.289    0.773
PredadorOvalipes          11.57059   11.32288   1.022    0.307
Dif_porc                   0.01586    0.04999   0.317    0.751
PredadorOvalipes:Dif_porc -0.17599    0.16280  -1.081    0.280

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 24.564  on 23  degrees of freedom
Residual deviance: 23.089  on 20  degrees of freedom
AIC: 31.089

Number of Fisher Scoring iterations: 4
Anova(mb3)
Analysis of Deviance Table (Type II tests)

Response: as.logical(Mortality)
                  LR Chisq Df Pr(>Chisq)
Predador           0.14798  1     0.7005
Dif_porc           0.00155  1     0.9686
Predador:Dif_porc  1.21937  1     0.2695

Este modelo no detecta diferencias significativas en la mortalidad de la presa entre ambas especies de depredador (Chisq=0.148, p=0.701). Tampoco detecta diferenicas significativas asociadas a la diferencia de tamaño entre la presa y el depredador, para ninguna de ellas (Chisq=0.02, p=0.969). Este modelo muestra un buen ajuste de acuerdo a la prueba de Hosmer and Lemeshow (p=0.68):

library(ResourceSelection) 
hl3 <- hoslem.test(filter(diferencias, Experiment!="AO_AC")$Mortality, fitted(mb3), g=10)
hl3

    Hosmer and Lemeshow goodness of fit (GOF) test

data:  filter(diferencias, Experiment != "AO_AC")$Mortality, fitted(mb3)
X-squared = 5.6805, df = 8, p-value = 0.683

Latencia de depredación

Es el tiempo que demora el depredador (cualquiera sea la especie en este caso), en matar a su presa. En este caso está expresado en horas. Interesa conocer si existen diferenicas en la latencia de depredación entre ambas especies de depredadores (Figura 5).

Figura 5: Diferencia relativa de tamaño entre eldepredador y la presa en función de la mortalidad para las diferentes combinaciones. En el caso de la combinación entre adultos (AO_AC), la diferencia está calculada entre el individuo más grande y el más pequeño, independientemente de la especie.

GLMs

Para analizarlo se puede aplicar un modelo lineal generalizado (GLM) de distribución Poisson para variables discretas >0 (función de enlace logit).

Datos para tener en cuenta (válido tambien para ComPoisson del modelo siguiente):
  • La función de enlace de este modelo es la función logit.
  • Los supuestos del modelo son:
    1. Muestra aleatoria y observaciones independientes (en realidad no tiene que ver con el modelo sino con el diseño experimental).
    2. Relación media-varianza consistente con la distribución asumida (Poisson). Es decir que no exista sobre o subdispersión de los datos.
    3. Distribución aleatoria de los residuos estandarizados en fc. de los valores predichos.
    m1 <- glm(HUP ~ juvenile, 
              family = "poisson", 
              data = na.omit(datos))
    summary(m1)
    
    Call:
    glm(formula = HUP ~ juvenile, family = "poisson", data = na.omit(datos))
    
    Coefficients:
                     Estimate Std. Error z value Pr(>|z|)    
    (Intercept)       5.67218    0.01955  290.11   <2e-16 ***
    juvenileOvalipes -3.88042    0.13057  -29.72   <2e-16 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    (Dispersion parameter for poisson family taken to be 1)
    
        Null deviance: 3471.229  on 18  degrees of freedom
    Residual deviance:   59.153  on 17  degrees of freedom
    AIC: 165.13
    
    Number of Fisher Scoring iterations: 5

    Este modelo muestra un efecto significativo en la especie de cangrejo sobre la latencia de depredación, y tiene un gráfico aceptable de residuos estandarizados vs. valores predichos (Figura 6), cumpliendo con el supuesto 3, pero presenta sobredispersión (supuesto 3).

    Figura 6: Residuos estandarizados vs. valores predichos para el GLM con distribución Poisson.

    Análisis de dispersión Cálculo del coeficiente de dispersión. Debería ser cercano a 1 pero tiene un valor de 5.

    [1] 5.098624

    Una opción para tratar de salvar esta subdispersión es utilizar una distribución algo diferente de la de Poisson, que incorpora un coeficiente de dispersión permitiendo que sea diferente del esperado (1): la distribución de Conway-Maxwell Poisson (función de enlace log):

    library(glmmTMB)
    m3 <- glmmTMB(HUP~juvenile, 
                  family=compois,
                  data = na.omit(datos))
    summary(m3)
     Family: compois  ( log )
    Formula:          HUP ~ juvenile
    Data: na.omit(datos)
    
         AIC      BIC   logLik deviance df.resid 
       148.3    151.2    -71.2    142.3       16 
    
    
    Dispersion parameter for compois family (): 3.57 
    
    Conditional model:
                     Estimate Std. Error z value Pr(>|z|)    
    (Intercept)       5.67218    0.03685  153.92   <2e-16 ***
    juvenileOvalipes -3.88042    0.21542  -18.01   <2e-16 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    Anova(m3)
    Analysis of Deviance Table (Type II Wald chisquare tests)
    
    Response: HUP
              Chisq Df Pr(>Chisq)    
    juvenile 324.48  1  < 2.2e-16 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

    Para este modelo la variable especie sigue produciendo diferencias significativas en el valor de la latencia de depredación (z=-18.01, p<2e-16).

    Este modelo corrige la sobredispersión (incorpora un coeficiente de dispersión de 3.57). El gráfico de los residuos estandarizados en fc. de los valores predichos sigue siendo aceptable (Fig. 7)

    Figura 7: Residuos estandarizados vs. valores predichos para el GLM con distribución Comway-Maxwell Poisson.

    En conclusión, la estructura de datos hace que sea muy complejo utilizar modelos estadísticos para analizar el comportamiento de la variable, por la nula variabilidad en los datos asociados a uno de los dos niveles de un factor. La mejor alternativa (aunque no suficientemente buena) es el modelo CMP. Para estimar los valores esperados a partir del modelo se debe utilizar la función de enlace log: g(µ)=ln(µ)

    Entonces, la latencia de depredación, en horas, según este modelo para la combinación AO_JC (juveniles = Carcinus) está dada por la ecuación (E(Carcinus) = exp(B0)):

    exp(5.67218)
    [1] 290.6675

    Lo que equivale a 12.1 días.

    Por su parte, la latencia de depredación, en horas, según este modelo para la combinación JO_AC (juveniles = Ovalipes) está dada por la ecuación (E(Ovalipes) = exp(B0+B1)):

    exp(5.67218-3.88042)
    [1] 6.000003

    Lo que equivale a 0.25 días.

    Entonces, este modelo predice que la latencia es significativamente diferente entre ambas especies (p<2e-16), con un valor de 6 horas para los adultos de Carcinus vs los juveniles de Ovalipes y de 12.1 días para la otra combinación.

    Figura 8: Residuos estandarizados vs. valores predichos para el GLM con distribución Comway-Maxwell Poisson.

    Patrones de distribución y abundancia de Carcinus y Ovalipes en Golfo Nuevo.

    CPUE por especie

    La CPUE fue calculada como el número de cangrejos capturados por cada uno de los sistemas de trampas (conjunto de una trampa cilindrica y una rectangular) durante una hora de permanencia en el agua (1 UE = 1 ST*hr).

    kable(abundancia %>%
            group_by(Sitio, Especie) %>%
            summarise(Abundancia=sum(Abundancia),
                      CPUE=sum(CPUE)) %>%
            as.data.frame())
    `summarise()` has grouped output by 'Sitio'. You can override using the `.groups` argument.
    Sitio Especie Abundancia CPUE
    Avanzado Carcinus 466 26.3773585
    Avanzado Ovalipes 0 0.0000000
    Bañuls Carcinus 29 1.8125000
    Bañuls Ovalipes 6 0.3750000
    Casino Carcinus 118 6.9411765
    Casino Ovalipes 8 0.4705882
    Garipe Carcinus 7 0.3888889
    Garipe Ovalipes 0 0.0000000
    Kaiser Carcinus 302 18.8750000
    Kaiser Ovalipes 0 0.0000000
    Paraná Carcinus 177 10.6200000
    Paraná Ovalipes 9 0.5400000

    La primera pregunta que surge es si existe una diferencia en la captura de ambas especies en los distintos sitios (Figura 9). Para responder esta pregunta, se puede aplicar un modelo lineal generalizado utilizando la CPUE como variable respuesta y los factores “Especie”, “Sexo” y “Sitio” como predictores fijos, o alternativamente el factor “Sitio” como predictor aleatorio (si lo que interesa es tener una noción de la variabilidad en la abundancia de los cangrejos de acuerdo a los Sitios y no una respuesta para estos sitios en particular). Creo que esta segunda aproximación es la más consistente con el objetivo del trabajo. De acuerdo con este modelo y utilizando una distribución gamma, los Carcinus son significativamente más abundantes que los Ovalipes (Chisq = 26.53, p<0.0005), no existen diferencias significativas entre sexos para ambas especies (Chisq = 0.4733, p = 0.4915) y el factor “Sitio” explica un 50.9 % de la variación aleatoria en el CPUE.

    a1c <- glmer(CPUE ~ Especie*Sexo + (1|Sitio), 
                 family = Gamma,
                 data = subset(abundancia, CPUE!=0))
    
    summary (a1c)
    Generalized linear mixed model fit by maximum likelihood (Laplace
      Approximation) [glmerMod]
     Family: Gamma  ( inverse )
    Formula: CPUE ~ Especie * Sexo + (1 | Sitio)
       Data: subset(abundancia, CPUE != 0)
    
         AIC      BIC   logLik deviance df.resid 
        76.8     88.0    -32.4     64.8       42 
    
    Scaled residuals: 
        Min      1Q  Median      3Q     Max 
    -1.5127 -0.6796 -0.2909  0.4444  2.7809 
    
    Random effects:
     Groups   Name        Variance Std.Dev.
     Sitio    (Intercept) 0.3407   0.5837  
     Residual             0.3288   0.5734  
    Number of obs: 48, groups:  Sitio, 6
    
    Fixed effects:
                          Estimate Std. Error t value Pr(>|z|)   
    (Intercept)            1.26456    0.45746   2.764  0.00570 **
    EspecieOvalipes        9.26637    3.16593   2.927  0.00342 **
    SexoM                  0.06233    0.08787   0.709  0.47812   
    EspecieOvalipes:SexoM -3.14804    3.46199  -0.909  0.36318   
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    Correlation of Fixed Effects:
                (Intr) EspcOv SexoM 
    EspeciOvlps -0.005              
    SexoM       -0.122  0.013       
    EspcOvlp:SM -0.010 -0.913 -0.024
    Anova(a1c)
    Analysis of Deviance Table (Type II Wald chisquare tests)
    
    Response: CPUE
                   Chisq Df Pr(>Chisq)    
    Especie      26.5298  1  2.595e-07 ***
    Sexo          0.4733  1     0.4915    
    Especie:Sexo  0.8269  1     0.3632    
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

    Figura 9: Captura (CPUE) por especie por sitio.

    Distribución de sexos por especie

    En este caso, interesa conocer la distribución de sexos por sitio y por especie.

    Figura 10: Distribución de tallas por especie y por sexo.

    En el caso de Carcinus:

    En el caso de Carcinus, si se observó una diferencia significativa entre sexos para el CW (Chisq = 109.43, GL=1, p=2.2e-16). La contribución del sitio a la variabilidad observada en el CW fue, para esta especie, del 16%.

    b1c <- lmer(CW ~ Sexo + (1|Sitio), 
                data = subset(CW, CW!=0 & Especie=="Carcinus"))
    summary(b1c)
    Linear mixed model fit by REML ['lmerMod']
    Formula: CW ~ Sexo + (1 | Sitio)
       Data: subset(CW, CW != 0 & Especie == "Carcinus")
    
    REML criterion at convergence: 3889.9
    
    Scaled residuals: 
        Min      1Q  Median      3Q     Max 
    -3.1793 -0.6717  0.0534  0.6900  2.2864 
    
    Random effects:
     Groups   Name        Variance Std.Dev.
     Sitio    (Intercept) 12.84    3.584   
     Residual             69.60    8.343   
    Number of obs: 548, groups:  Sitio, 6
    
    Fixed effects:
                Estimate Std. Error t value
    (Intercept)  57.5402     1.6277   35.35
    SexoM         8.4487     0.8077   10.46
    
    Correlation of Fixed Effects:
          (Intr)
    SexoM -0.326
    Anova(b1c)
    Analysis of Deviance Table (Type II Wald chisquare tests)
    
    Response: CW
          Chisq Df Pr(>Chisq)    
    Sexo 109.43  1  < 2.2e-16 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

    En el caso de Ovalipes:

    La captura de Ovalipes fue mucho menor que la de Carcinus, por lo que la cantidad de datos para modelar es menor. A su vez, existen dos outliers (machos menores que 60 mm) que dificultan la aplicación de los modelos, pero que seguramente estén indiando la presencia de dos cohortes. El modelo resultante indica que no hay un efecto significativo del sexo sobre la talla de los cangrejos (probablemente inducido por los dos outliers) (Chisq=0.0556, GL=1, p=0.8137). Si se excluyen estos dos machos, el efecto sí es significativo (Chisq=24.087, GL=1, p=9.209e-07). En cuanto a la contribución del sitio a la variabilidad observada, el modelo completo reveló que fue del 35%, mientras que excluyendo los outliers fue del 64%.

    b1o <- lmer(CW ~ Sexo + (1|Sitio), 
                data = subset(CW, CW!=0 & Especie=="Ovalipes"))
    summary(b1o)
    Linear mixed model fit by REML ['lmerMod']
    Formula: CW ~ Sexo + (1 | Sitio)
       Data: subset(CW, CW != 0 & Especie == "Ovalipes")
    
    REML criterion at convergence: 364.5
    
    Scaled residuals: 
        Min      1Q  Median      3Q     Max 
    -2.6271 -0.2242  0.2181  0.3543  1.7715 
    
    Random effects:
     Groups   Name        Variance Std.Dev.
     Sitio    (Intercept)  98.68    9.934  
     Residual             183.78   13.557  
    Number of obs: 46, groups:  Sitio, 3
    
    Fixed effects:
                Estimate Std. Error t value
    (Intercept)   75.537      7.334  10.299
    SexoM         -1.210      5.132  -0.236
    
    Correlation of Fixed Effects:
          (Intr)
    SexoM -0.559
    Anova(b1o)
    Analysis of Deviance Table (Type II Wald chisquare tests)
    
    Response: CW
          Chisq Df Pr(>Chisq)
    Sexo 0.0556  1     0.8137
    LS0tDQp0aXRsZTogIkludGVyYWNjacOzbiBPdmFsaXBlcy1DYXJjaW51cyINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KIyBFeHBlcmltZW50byBlbiBhY3VhcmlvDQoNCkFuw6FsaXNpcyBkZSBsb3MgcmVzdWx0YWRvcyBkZWwgZXhwZXJpbWVudG8gZW4gYWN1YXJpbyBldmFsdWFuZG8gbGEgaW50ZXJhY2Npw7NuIGRlcHJlZGFkb3ItcHJlc2EgZW50cmUgZXN0YWTDrW9zIGRpZmVyZW50ZXMgZGUgKkNhcmNpbnVzKiB5ICpPdmFsaXBlcyouDQoNCiMjIERpc3RyaWJ1Y2nDs24gZGUgdGFsbGFzDQoNCkVuIHByaW1lcmEgaW5zdGFuY2lhLCBzZSBldmFsw7phIGxhIGRpc3RyaWJ1Y2nDs24gZGUgdGFsbGFzIGVudHJlIGxvcyBkaWZlcmVudGVzIHRyYXRhbWllbnRvcyBleHBlcmltZW50YWxlcyAoanV2ZW5pbGVzIHkgYWR1bHRvcyksIHBhcmEgYW1iYXMgZXNwZWNpZXMgeSBlbiB0b2RhcyBsYXMgY29tYmluYWNpb25lcyBwb3NpYmxlcy4NCg0KQ29tbyBzZSBvYnNlcnZhIGVuIGxhIEZpZy4gMSwgbGEgY2xhc2lmaWNhY2nDs24gcG9yICJhZHVsdG8iIHkgImp1dmVuaWwiIGNvcnJlc3BvbmRlIGNvbiB1bmEgbWFyY2FkYSBkaWZlcmVuY2lhIGVuIGVsIHRhbWHDsW8gZGUgbG9zIGNhbmdyZWpvcywgcXVlIGVzIGFsZ28gbWVub3IgcGFyYSBsYSBjb21iaW5hY2nDs24gZGUgYWR1bHRvcyBkZSAqQ2FyY2ludXMqIHZzIGp1dmVuaWxlcyBkZSAqT3ZhbGlwZXMqIHF1ZSBwYXJhIGxhIGFsdGVybmF0aXZhLiBFbiBsYSBUYWJsYSAxIG11ZXN0cmEgbG9zIHZhbG9yZXMgbWVkaW9zLCBkZXN2w61vIGVzdMOhbmRhciB5IG7Dum1lcm8gZGUgaW5kaXZpZHVvcyBwYXJhIGNhZGEgdW5hIGRlIGxhcyBlc3BlY2llcyBkZSBsYXMgY29tYmluYWNpb25lcy4NCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCmxpYnJhcnkoZ2dwbG90MikNCg0KZ2dwbG90KGRhdG9zKSArDQogIGdlb21fcG9pbnQoYWVzKHNwZWNpZXMsIHNpemUsIGNvbG9yID0gc3BlY2llcyksIHNob3cubGVnZW5kID0gRikrDQogIGZhY2V0X3dyYXAofkV4cGVyaW1lbnQpKw0KICB5bGltKDAsMTAwKSsNCiAgeGxhYigiRXNwZWNpZSIpKw0KICB5bGFiKCJBbmNobyBkZSBjYXBhcmF6w7NuIChtbSkiKSsNCiAgdGhlbWVfbGlnaHQoKQ0KYGBgDQoNCjxzdHJvbmc+RmlndXJhIDE6PC9zdHJvbmc+IERpc3RyaWJ1Y2nDs24gZGUgdGFsbGFzIHBhcmEgYW1iYXMgZXNwZWNpZXMgZGUgY2FuZ3Jlam9zIGVuIGxvcyB0cmVzIGV4cGVyaW1lbnRvcyBlbnRyZSBsb3MgYWR1bHRvcyAoQSkgeSBqdXZlbmlsZXMgKEopIGRlICpDYXJjaW51cyogKEMpIHkgKk92YWxpcGVzKiAoTykNCg0KPHN0cm9uZz5UYWJsYSAxOjwvc3Ryb25nPiBWYWxvcmVzIG1lZGlvcyB5IGRlc3bDrW8gZXN0w6FuZGFyIGRlIGxvcyB0YW1hw7FvcyBwb3IgZXNwZWNpZSB5IGV4cGVyaW1lbnRvOg0KDQpgYGB7ciBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShrbml0cikNCmthYmxlKGRhdG9zICU+JQ0KICAgICAgICBncm91cF9ieShFeHBlcmltZW50LCBzcGVjaWVzKSAlPiUNCiAgICAgICAgc3VtbWFyaXNlKE1lZGlhPW1lYW4oc2l6ZSksIFNEPXNkKHNpemUpLCBOPW4oKSkNCikNCmBgYA0KDQojIyBNb3J0YWxpZGFkDQoNCkxhIG1vcnRhbGlkYWQgc2UgY29uc2lkZXLDsyBzdW1hbmRvIGFxdWVsbG9zIGNhc29zIGVuIGRvbmRlIGh1Ym8gbW9ydGFsaWRhZCBjb24gY29uc3VtbyB5IHVuIHPDs2xvIGNhc28gZW4gZG9uZGUgaHVibyBtb3J0YWxpZGFkIHNpbiBjb25zdW1vLiBObyBzZSBjb25zaWRlcmFyb24gbGFzIHByZXNhcyBzdWJzZWN1ZW50ZXMgZW4gYXF1ZWxsYSBjb21iaW5hY2nDs24gZW4gbGEgcXVlIHNlIHV0aWxpesOzIHVuIG1heW9yIG7Dum1lcm8gZGUgcHJlc2FzIHVuYSB2ZXogY29uc3VtaWRhIGxhIHByaW1lcmEuIA0KDQpQb3IgZWwgZGlzZcOxbyBleHBlcmltZW50YWwgdXRpbGl6YWRvIChlbiBlbCBxdWUgbm8gaGF5IHVuYSBpZGVudGlmaWNhY2nDs24gKmEgcHJpb3JpKiBkZSBsYSBwcmVzYSB5IGRlcHJlZGFkb3IpLCB1bmEgYWx0ZXJuYXRpdmEgZXMgYXN1bWlyIHF1ZSBlbCBhZHVsdG8gZXMgZWwgZGVwcmVkYWRvciBtaWVudHJhcyBxdWUgZWwganV2ZW5pbCBlcyBsYSBwcmVzYS4gQmFqbyBlc3RhIGFzdW5jacOzbiwgZWwgdHJhdGFtaWVudG8gZW50cmUgYWR1bHRvcyBubyB0aWVuZSBzZW50aWRvIGEgbWVub3MgcXVlIHNlIGRlY2lkYSBhbGfDum4gY3JpdGVyaW8gcGFyYSBlc3RhYmxlY2VyIGN1w6FsIGRlIGxvcyBkb3MgaW5kaXZpZHVvcyBlcyBsYSBwcmVzYSB5IGN1w6FsIGVsIGRlcHJlZGFkb3IuIERhZG8gcXVlIG5vIGh1Ym8gaW50ZXJhY2Npb25lcyBlbnRyZSBhZHVsdG9zLCBlc3RlIHRyYXRhbWllbnRvIHNlcsOhIGRpc2N1dGlkbyBwb3Igc2VwYXJhZG8sIG1pZW50cmFzIHF1ZSBsb3MgYW7DoWxpc2lzIHPDs2xvIGNvbnRlbXBsYXLDoW4gbG9zIHRyYXRhbWllbnRvcyBlbnRyZSBhZHVsdG9zIHkganV2ZW5pbGVzLg0KDQpMYSBwcmltZXJhIG9wY2nDs24gZGUgYW7DoWxpc2lzIGVzIHJlYWxpemFyIGV2YWx1YXIgbGEgaW5kZXBlbmRlbmNpYSBlbnRyZSBsYSBlc3BlY2llIGRlcHJlZGFkb3JhIHkgbGEgbW9ydGFsaWRhZC4gRXN0byBzZSBwdWVkZSByZWFsaXphciBhIHRyYXbDqXMgZGUgdW5hIDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zpc2hlciUyN3NfZXhhY3RfdGVzdCI+cHJ1ZWJhIGV4YWN0YSBkZSBGaXNoZXI8L2E+LCBhIHBhcnRpciBkZSBsYSB0YWJsYSBkZSBjb250aW5nZW5jaWEgKFRhYmxhIDIpLiBEZSBhY3VlcmRvIGEgZXN0YSBwcnVlYmEgKHZlciBhYmFqbyksIG5vIGV4aXN0ZSB1bmEgYXNvY2lhY2nDs24gZW50cmUgbGEgbW9ydGFsaWRhZCBvYnNlcnZhZGEgeSBsYSBlc3BlY2llIGEgbGEgcXVlIGNvcnJlc3BvbmRlIGVsIGluZGl2aWR1byBqdXZlbmlsIGRlIGxhIGNvbWJpbmFjacOzbi4NCg0KDQo8c3Ryb25nPlRhYmxhIDI6PC9zdHJvbmc+IFRhYmxhIGRlIGNvbnRpbmdlbmNpYSBkZSBsYSBtb3J0YWxpZGFkIGVuIGZ1bmNpw7NuIGRlIGxhIGVzcGVjaWUgZGUgY2FkYSBqdXZlbmlsOg0KDQpgYGB7ciBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCmthYmxlKGZpc2hlcikNCmBgYA0KDQo8c3Ryb25nPlRlc3QgZGUgRmlzaGVyPC9zdHJvbmc+IFBydWViYSBleGFjdGEgZGUgRmlzaGVyIHBhcmEgaW5kZXBlbmRlbmNpYSBlbnRyZSBmYWN0b3JlczoNCg0KYGBge3J9DQpmaXNoZXIudGVzdChhcy5kYXRhLmZyYW1lKGZpc2hlcikpDQpgYGANCg0KIyMjIFJlbGFjacOzbiBlbnRyZSBsYSBtb3J0YWxpZGFkIHkgbGEgZGlmZXJlbmNpYSBkZSB0YW1hw7FvIGRlIGxvcyBjYW5ncmVqb3MgcHJlc2EgeSBkZXByZWRhZG9yDQoNClVuYSBkZSBsYXMgcHJlZ3VudGFzIHF1ZSBubyByZXNwb25kZSBsYSBwcnVlYmEgZXhhY3RhIGRlIEZpc2hlciBlcyBzaSBleGlzdGUgdW5hIGRlcGVuZGVuY2lhIGRlIGxhIG1vcnRhbGlkYWQgY29uIGVsIHRhbWHDsW8gZGUgbGEgcHJlc2EgeSBlbCBkZXByZWRhZG9yLiBTaSBiaWVuIGxvcyBhZHVsdG9zIHkganV2ZW5pbGVzIHV0aWxpemFkb3MgZW4gbGFzIGRpZmVyZW50ZXMgcsOpcGxpY2FzIGRlIGNhZGEgdHJhdGFtaWVudG8gZnVlcm9uIHNpbWlsYXJlcywgY2FiZSBwcmVndW50YXJzZSBzaSBsYXMgZGlmZXJlbmNpYXMgYWJzb2x1dGFzIChGaWcuIDIpIG8gcmVsYXRpdmFzIChGaWcuIDMpIGVudHJlIGVsIGRlcHJlZGFkb3IgeSBsYSBwcmVzYSB1dGlsaXphZG9zIGVuIGNhZGEgcsOpcGxpY2EgaW50ZXJmaWVyZW4gY29uIGxhIG1vcnRhbGlkYWQgb2JzZXJ2YWRhLg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KZ2dwbG90KGRpZmVyZW5jaWFzKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyhEaWZfYWJzb2x1dGEsIGZpbGwgPSBFeHBlcmltZW50KSwgc2hvdy5sZWdlbmQgPUYsIGJpbndpZHRoID0gMTApKw0KICBmYWNldF93cmFwKH5FeHBlcmltZW50KSsNCiAgeGxhYigiRGlmZXJlbmNpYSBhYnNvbHV0YSBlbiBlbCBhbmNobyBkZSBjYXBhcmF6w7NuIGVudHJlIGFtYm9zIGluZGl2aWR1b3MgKG1tKSIpKw0KICB5bGFiKCJGcmVjdWVuY2lhIikrDQogIHRoZW1lX2xpZ2h0KCkNCmBgYA0KDQo8c3Ryb25nPkZpZ3VyYSAyOjwvc3Ryb25nPiBEaXN0cmlidWNpw7NuIGRlIGxhIGRpZmVyZW5jaWEgYWJzb2x1dGEgKGVuIG1tKSBlbnRyZSBlbCBkZXByZWRhZG9yIHkgbGEgcHJlc2EgdXRpbGl6YWRvIGVuIGNhZGEgdW5hIGRlIGxhcyByw6lwbGljYXMgcGFyYSBsYXMgZGlmZXJlbnRlcyBjb21iaW5hY2lvbmVzLiBFbiBlbCBjYXNvIGRlIGxhIGNvbWJpbmFjacOzbiBlbnRyZSBhZHVsdG9zIChBT19BQyksIGxhIGRpZmVyZW5jaWEgZXN0w6EgY2FsY3VsYWRhIGVudHJlIGVsIGluZGl2aWR1byBtw6FzIGdyYW5kZSB5IGVsIG3DoXMgcGVxdWXDsW8sIGluZGVwZW5kaWVudGVtZW50ZSBkZSBsYSBlc3BlY2llLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCmdncGxvdChkaWZlcmVuY2lhcykgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoRGlmX3BvcmMsIGZpbGwgPSBFeHBlcmltZW50KSwgc2hvdy5sZWdlbmQgPUYsIGJpbndpZHRoID0gMTApKw0KICBmYWNldF93cmFwKH5FeHBlcmltZW50KSsNCiAgeGxhYigiRGlmZXJlbmNpYSByZWxhdGl2YSBlbiBlbCBhbmNobyBkZSBjYXBhcmF6w7NuIGVudHJlIGFtYm9zIGluZGl2aWR1b3MgKCUpIikrDQogIHlsYWIoIkZyZWN1ZW5jaWEiKSsNCiAgdGhlbWVfbGlnaHQoKQ0KYGBgDQoNCjxzdHJvbmc+RmlndXJhIDM6PC9zdHJvbmc+IERpc3RyaWJ1Y2nDs24gZGUgbGEgZGlmZXJlbmNpYSByZWxhdGl2YSBhbCBjYW5ncmVqbyBkZSBtYXlvciB0YW1hw7FvIChlbiAlKSBlbnRyZSBlbCBkZXByZWRhZG9yIHkgbGEgcHJlc2EgdXRpbGl6YWRvIGVuIGNhZGEgdW5hIGRlIGxhcyByw6lwbGljYXMgcGFyYSBsYXMgZGlmZXJlbnRlcyBjb21iaW5hY2lvbmVzLiBFbiBlbCBjYXNvIGRlIGxhIGNvbWJpbmFjacOzbiBlbnRyZSBhZHVsdG9zIChBT19BQyksIGxhIGRpZmVyZW5jaWEgZXN0w6EgY2FsY3VsYWRhIGVudHJlIGVsIGluZGl2aWR1byBtw6FzIGdyYW5kZSB5IGVsIG3DoXMgcGVxdWXDsW8sIGluZGVwZW5kaWVudGVtZW50ZSBkZSBsYSBlc3BlY2llLg0KDQpEYWRvIHF1ZSBleGlzdGVuIGNpZXJ0YXMgZGlmZXJlbmNpYXMgZW4gbGEgZGlmZXJlbmNpYSBkZSB0YWxsYXMgdXRpbGl6YWRhcyBlbnRyZSBsYSBjb21iaW5hY2nDs24gQU9fSkMgeSBKT19BQywgc2UgcGxhbnRlYSBsYSBkdWRhIGRlIHNpIGVzdGFzIGRpZmVyZW5jaWFzIHBvZHLDrWFuIGluY2lkaXIgZW4gbGEgbW9ydGFsaWRhZC4gU2kgc2UgY29tcGFyYSBsYSBkaWZlcmVuY2lhIGRlIHRhbGxhIGVudHJlIGxvcyB0cmF0YW1pZW50b3MgZW4gcXVlIGh1Ym8gbW9ydGFsaWRhZCBkZSBsb3MgcXVlIG5vLCBzZSBvYnNlcnZhIHF1ZSBubyBoYXkgcGF0cm9uZXMgZGV0ZWN0YWJsZXMgcXVlIGluZGlxdWVuIHVuIGNvbXBvcnRhbWllbnRvIGRlcGVuZGllbnRlIGRlbCB0YW1hw7FvIChGaWcuIDQpLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCmdncGxvdChkaWZlcmVuY2lhcykgKw0KICBnZW9tX3BvaW50KGFlcyhhcy5sb2dpY2FsKE1vcnRhbGl0eSksIERpZl9wb3JjLCBjb2xvciA9IGFzLmxvZ2ljYWwoTW9ydGFsaXR5KSksIHNob3cubGVnZW5kID1GKSsNCiAgZmFjZXRfd3JhcCh+RXhwZXJpbWVudCkrDQogIHhsYWIoIk1vcnRhbGlkYWQiKSsNCiAgeWxhYigiRGlmZXJlbmNpYSByZWxhdGl2YSBkZSB0YW1hw7FvIGVudHJlIGRlcHJlZGFkb3IgeSBwcmVzYSAoJSkiKSsNCiAgdGhlbWVfbGlnaHQoKQ0KYGBgDQoNCjxzdHJvbmc+RmlndXJhIDQ6PC9zdHJvbmc+IERpZmVyZW5jaWEgcmVsYXRpdmEgZGUgdGFtYcOxbyBlbnRyZSBlbGRlcHJlZGFkb3IgeSBsYSBwcmVzYSBlbiBmdW5jacOzbiBkZSBsYSBtb3J0YWxpZGFkIHBhcmEgbGFzIGRpZmVyZW50ZXMgY29tYmluYWNpb25lcy4gRW4gZWwgY2FzbyBkZSBsYSBjb21iaW5hY2nDs24gZW50cmUgYWR1bHRvcyAoQU9fQUMpLCBsYSBkaWZlcmVuY2lhIGVzdMOhIGNhbGN1bGFkYSBlbnRyZSBlbCBpbmRpdmlkdW8gbcOhcyBncmFuZGUgeSBlbCBtw6FzIHBlcXVlw7FvLCBpbmRlcGVuZGllbnRlbWVudGUgZGUgbGEgZXNwZWNpZS4NCg0KUGFyYSBldmFsdWFyIHNpIGxhIGRpZmVyZW5jaWEgcmVsYXRpdmEgZGUgdGFtYcOxb3MgZW50cmUgbGEgcHJlc2EgeSBlbCBkZXByZWRhZG9yIHB1ZWRlIGluZmx1aXIgZW4gbGEgbW9ydGFsaWRhZCBvYnNlcnZhZGEsIHNlIHV0aWxpesOzIHVuIG1vZGVsbyBsaW5lYWwgZ2VuZXJhbGl6YWRvIGNvbiBkaXN0cmlidWNpw7NuIGJpbm9taWFsIHV0aWxpemFuZG8gY29tbyB2YXJpYWJsZXMgcHJlZGljdG9yYXMgaSkgbGEgZGlmZXJlbmNpYSByZWxhdGl2YSBkZSB0YW1hw7FvIGVudHJlIGVsIGRlcHJlZGFkb3IgIGxhIHByZXNhIHkgaWkpIGxhIGVzcGVjaWUgYSBsYSBxdWUgcGVydGVuZWNlIGVsIGRlcHJlZGFkb3IuIEFzw60sIGVzdGUgbW9kZWxvIHBlcm1pdGUgYWRlbcOhcywgZXZhbHVhciBzaSBleGlzdGVuIGRpZmVyZW5jaWFzIGVudHJlIGFtYmFzIGVzcGVjaWVzIGVuIGxhIG1vcnRhbGlkYWQgZGUgbGEgcHJlc2EuIFNlIGV4Y2x1ecOzIGxhIGNvbWJpbmFjacOzbiBhZHVsdG8tYWR1bHRvIChBT19BQykuDQoNCjxzdHJvbmc+UmVzdWx0YWRvcyBkZWwgbW9kZWxvIGxpbmVhbCBnZW5lcmFsaXphZG86PC9zdHJvbmc+DQpgYGB7cn0NCm1iMyA8LSBnbG0oYXMubG9naWNhbChNb3J0YWxpdHkpflByZWRhZG9yKkRpZl9wb3JjLCANCiAgICAgICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwNCiAgICAgICAgICAgZGF0YSA9IGZpbHRlcihkaWZlcmVuY2lhcywgRXhwZXJpbWVudCE9IkFPX0FDIikpDQpzdW1tYXJ5KG1iMykNCkFub3ZhKG1iMykNCmBgYA0KDQpFc3RlIG1vZGVsbyBubyBkZXRlY3RhIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVuIGxhIG1vcnRhbGlkYWQgZGUgbGEgcHJlc2EgZW50cmUgYW1iYXMgZXNwZWNpZXMgZGUgZGVwcmVkYWRvciAoQ2hpc3E9MC4xNDgsIHA9MC43MDEpLiBUYW1wb2NvIGRldGVjdGEgZGlmZXJlbmljYXMgc2lnbmlmaWNhdGl2YXMgYXNvY2lhZGFzIGEgbGEgZGlmZXJlbmNpYSBkZSB0YW1hw7FvIGVudHJlIGxhIHByZXNhIHkgZWwgZGVwcmVkYWRvciwgcGFyYSBuaW5ndW5hIGRlIGVsbGFzIChDaGlzcT0wLjAyLCBwPTAuOTY5KS4gRXN0ZSBtb2RlbG8gbXVlc3RyYSB1biBidWVuIGFqdXN0ZSBkZSBhY3VlcmRvIGEgbGEgcHJ1ZWJhIGRlIEhvc21lciBhbmQgTGVtZXNob3cgKHA9MC42OCk6DQoNCmBgYHtyfQ0KbGlicmFyeShSZXNvdXJjZVNlbGVjdGlvbikgDQpobDMgPC0gaG9zbGVtLnRlc3QoZmlsdGVyKGRpZmVyZW5jaWFzLCBFeHBlcmltZW50IT0iQU9fQUMiKSRNb3J0YWxpdHksIGZpdHRlZChtYjMpLCBnPTEwKQ0KaGwzDQpgYGANCg0KDQojIyBMYXRlbmNpYSBkZSBkZXByZWRhY2nDs24NCkVzIGVsIHRpZW1wbyBxdWUgZGVtb3JhIGVsIGRlcHJlZGFkb3IgKGN1YWxxdWllcmEgc2VhIGxhIGVzcGVjaWUgZW4gZXN0ZSBjYXNvKSwgZW4gbWF0YXIgYSBzdSBwcmVzYS4gRW4gZXN0ZSBjYXNvIGVzdMOhIGV4cHJlc2FkbyBlbiBob3Jhcy4gSW50ZXJlc2EgY29ub2NlciBzaSBleGlzdGVuIGRpZmVyZW5pY2FzIGVuIGxhIGxhdGVuY2lhIGRlIGRlcHJlZGFjacOzbiBlbnRyZSBhbWJhcyBlc3BlY2llcyBkZSBkZXByZWRhZG9yZXMgKEZpZ3VyYSA1KS4NCg0KYGBge3IgZWNobz1GLCByZXN1bHRzPSdhc2lzJ30NCmdncGxvdChuYS5vbWl0KGRhdG9zKSkrDQogIGdlb21faGlzdG9ncmFtKGFlcyhIVVAsIGZpbGw9anV2ZW5pbGUpLCBiaW53aWR0aCA9IDI0KSsNCiAgeGxhYigiTGF0ZW5jaWEgZGUgZGVwcmVkYWNpw7NuIChkw61hcykiKSsNCiAgeWxhYigiRnJlY3VlbmNpYSBhYnNvbHV0YSIpKw0KICB0aGVtZV9saWdodCgpDQpgYGANCjxzdHJvbmc+RmlndXJhIDU6PC9zdHJvbmc+IERpZmVyZW5jaWEgcmVsYXRpdmEgZGUgdGFtYcOxbyBlbnRyZSBlbGRlcHJlZGFkb3IgeSBsYSBwcmVzYSBlbiBmdW5jacOzbiBkZSBsYSBtb3J0YWxpZGFkIHBhcmEgbGFzIGRpZmVyZW50ZXMgY29tYmluYWNpb25lcy4gRW4gZWwgY2FzbyBkZSBsYSBjb21iaW5hY2nDs24gZW50cmUgYWR1bHRvcyAoQU9fQUMpLCBsYSBkaWZlcmVuY2lhIGVzdMOhIGNhbGN1bGFkYSBlbnRyZSBlbCBpbmRpdmlkdW8gbcOhcyBncmFuZGUgeSBlbCBtw6FzIHBlcXVlw7FvLCBpbmRlcGVuZGllbnRlbWVudGUgZGUgbGEgZXNwZWNpZS4NCg0KIyMjIEdMTXMNCg0KUGFyYSBhbmFsaXphcmxvIHNlIHB1ZWRlIGFwbGljYXIgdW4gbW9kZWxvIGxpbmVhbCBnZW5lcmFsaXphZG8gKEdMTSkgZGUgZGlzdHJpYnVjacOzbiBQb2lzc29uIHBhcmEgdmFyaWFibGVzIGRpc2NyZXRhcyA+MCAoZnVuY2nDs24gZGUgZW5sYWNlICpsb2dpdCopLg0KDQpEYXRvcyBwYXJhIHRlbmVyIGVuIGN1ZW50YSAodsOhbGlkbyB0YW1iaWVuIHBhcmEgQ29tUG9pc3NvbiBkZWwgbW9kZWxvIHNpZ3VpZW50ZSk6IA0KPGxpPkxhIGZ1bmNpw7NuIGRlIGVubGFjZSBkZSBlc3RlIG1vZGVsbyBlcyBsYSBmdW5jacOzbiBsb2dpdC4gPC9saT4NCjxsaT5Mb3Mgc3VwdWVzdG9zIGRlbCBtb2RlbG8gc29uOjwvbGk+DQoxKSBNdWVzdHJhIGFsZWF0b3JpYSB5IG9ic2VydmFjaW9uZXMgaW5kZXBlbmRpZW50ZXMgKGVuIHJlYWxpZGFkIG5vIHRpZW5lIHF1ZSB2ZXIgY29uIGVsIG1vZGVsbyBzaW5vIGNvbiBlbCBkaXNlw7FvIGV4cGVyaW1lbnRhbCkuDQoyKSBSZWxhY2nDs24gbWVkaWEtdmFyaWFuemEgY29uc2lzdGVudGUgY29uIGxhIGRpc3RyaWJ1Y2nDs24gYXN1bWlkYSAoUG9pc3NvbikuIEVzIGRlY2lyIHF1ZSBubyBleGlzdGEgc29icmUgbyBzdWJkaXNwZXJzacOzbiBkZSBsb3MgZGF0b3MuDQozKSBEaXN0cmlidWNpw7NuIGFsZWF0b3JpYSBkZSBsb3MgcmVzaWR1b3MgZXN0YW5kYXJpemFkb3MgZW4gZmMuIGRlIGxvcyB2YWxvcmVzIHByZWRpY2hvcy4NCg0KYGBge3J9DQptMSA8LSBnbG0oSFVQIH4ganV2ZW5pbGUsIA0KICAgICAgICAgIGZhbWlseSA9ICJwb2lzc29uIiwgDQogICAgICAgICAgZGF0YSA9IG5hLm9taXQoZGF0b3MpKQ0Kc3VtbWFyeShtMSkNCmBgYA0KRXN0ZSBtb2RlbG8gbXVlc3RyYSB1biBlZmVjdG8gc2lnbmlmaWNhdGl2byBlbiBsYSBlc3BlY2llIGRlIGNhbmdyZWpvIHNvYnJlIGxhIGxhdGVuY2lhIGRlIGRlcHJlZGFjacOzbiwgeSB0aWVuZSB1biBncsOhZmljbyBhY2VwdGFibGUgZGUgcmVzaWR1b3MgZXN0YW5kYXJpemFkb3MgdnMuIHZhbG9yZXMgcHJlZGljaG9zIChGaWd1cmEgNiksIGN1bXBsaWVuZG8gY29uIGVsIHN1cHVlc3RvIDMsIHBlcm8gcHJlc2VudGEgc29icmVkaXNwZXJzacOzbiAoc3VwdWVzdG8gMykuDQoNCmBgYHtyIGVjaG89RiwgcmVzdWx0cz0nYXNpcyd9DQpnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChhZXMocHJlZGljdChtMSksIHJlc2lkdWFscyhtMSwgdHlwZSA9ICJwZWFyc29uIikpKSsNCiAgeWxhYigiUmVzaWR1b3MgZXN0YW5kYXJpemFkb3MiKSsNCiAgeGxhYiAoIlZhbG9yZXMgcHJlZGljaG9zIikrDQogIHRoZW1lX2xpZ2h0KCkNCmBgYA0KDQo8c3Ryb25nPkZpZ3VyYSA2Ojwvc3Ryb25nPiBSZXNpZHVvcyBlc3RhbmRhcml6YWRvcyB2cy4gdmFsb3JlcyBwcmVkaWNob3MgcGFyYSBlbCBHTE0gY29uIGRpc3RyaWJ1Y2nDs24gUG9pc3Nvbi4NCg0KPHN0cm9uZz5BbsOhbGlzaXMgZGUgZGlzcGVyc2nDs248L3N0cm9uZz4gQ8OhbGN1bG8gZGVsIGNvZWZpY2llbnRlIGRlIGRpc3BlcnNpw7NuLiBEZWJlcsOtYSBzZXIgY2VyY2FubyBhIDEgcGVybyB0aWVuZSB1biB2YWxvciBkZSA1Lg0KYGBge3IgZWNobz1GLCByZXN1bHRzPSdhc2lzJ30NCnN1bShyZXNpZChtMSwgdHlwZT0icGVhcnNvbiIpXjIvKG0xJGRmLnJlc2lkdWFsLTEpKQ0KYGBgDQoNClVuYSBvcGNpw7NuIHBhcmEgdHJhdGFyIGRlIHNhbHZhciBlc3RhIHN1YmRpc3BlcnNpw7NuIGVzIHV0aWxpemFyIHVuYSBkaXN0cmlidWNpw7NuIGFsZ28gZGlmZXJlbnRlIGRlIGxhIGRlIFBvaXNzb24sIHF1ZSBpbmNvcnBvcmEgdW4gY29lZmljaWVudGUgZGUgZGlzcGVyc2nDs24gcGVybWl0aWVuZG8gcXVlIHNlYSBkaWZlcmVudGUgZGVsIGVzcGVyYWRvICgxKTogbGEgZGlzdHJpYnVjacOzbiBkZSBDb253YXktTWF4d2VsbCBQb2lzc29uIChmdW5jacOzbiBkZSBlbmxhY2UgKmxvZyopOg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2xtbVRNQikNCm0zIDwtIGdsbW1UTUIoSFVQfmp1dmVuaWxlLCANCiAgICAgICAgICAgICAgZmFtaWx5PWNvbXBvaXMsDQogICAgICAgICAgICAgIGRhdGEgPSBuYS5vbWl0KGRhdG9zKSkNCnN1bW1hcnkobTMpDQpBbm92YShtMykNCmBgYA0KUGFyYSBlc3RlIG1vZGVsbyBsYSB2YXJpYWJsZSAqZXNwZWNpZSogc2lndWUgcHJvZHVjaWVuZG8gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW4gZWwgdmFsb3IgZGUgbGEgbGF0ZW5jaWEgZGUgZGVwcmVkYWNpw7NuICh6PS0xOC4wMSwgcDwyZS0xNikuDQoNCkVzdGUgbW9kZWxvIGNvcnJpZ2UgbGEgc29icmVkaXNwZXJzacOzbiAoaW5jb3Jwb3JhIHVuIGNvZWZpY2llbnRlIGRlIGRpc3BlcnNpw7NuIGRlIDMuNTcpLiBFbCBncsOhZmljbyBkZSBsb3MgcmVzaWR1b3MgZXN0YW5kYXJpemFkb3MgZW4gZmMuIGRlIGxvcyB2YWxvcmVzIHByZWRpY2hvcyBzaWd1ZSBzaWVuZG8gYWNlcHRhYmxlIChGaWcuIDcpDQoNCmBgYHtyIGVjaG89RiwgcmVzdWx0cz0nYXNpcyd9DQpnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChhZXMocHJlZGljdChtMyksIHJlc2lkdWFscyhtMywgdHlwZSA9ICJwZWFyc29uIikpKSsNCiAgeWxhYigiUmVzaWR1b3MgZXN0YW5kYXJpemFkb3MiKSsNCiAgeGxhYiAoIlZhbG9yZXMgcHJlZGljaG9zIikrDQogIHRoZW1lX2xpZ2h0KCkNCmBgYA0KPHN0cm9uZz5GaWd1cmEgNzo8L3N0cm9uZz4gUmVzaWR1b3MgZXN0YW5kYXJpemFkb3MgdnMuIHZhbG9yZXMgcHJlZGljaG9zIHBhcmEgZWwgR0xNIGNvbiBkaXN0cmlidWNpw7NuIENvbXdheS1NYXh3ZWxsIFBvaXNzb24uDQoNCkVuIGNvbmNsdXNpw7NuLCBsYSBlc3RydWN0dXJhIGRlIGRhdG9zIGhhY2UgcXVlIHNlYSBtdXkgY29tcGxlam8gdXRpbGl6YXIgbW9kZWxvcyBlc3RhZMOtc3RpY29zIHBhcmEgYW5hbGl6YXIgZWwgY29tcG9ydGFtaWVudG8gZGUgbGEgdmFyaWFibGUsIHBvciBsYSBudWxhIHZhcmlhYmlsaWRhZCBlbiBsb3MgZGF0b3MgYXNvY2lhZG9zIGEgdW5vIGRlIGxvcyBkb3Mgbml2ZWxlcyBkZSB1biBmYWN0b3IuIExhIG1lam9yIGFsdGVybmF0aXZhIChhdW5xdWUgbm8gc3VmaWNpZW50ZW1lbnRlIGJ1ZW5hKSBlcyBlbCBtb2RlbG8gQ01QLiBQYXJhIGVzdGltYXIgbG9zIHZhbG9yZXMgZXNwZXJhZG9zIGEgcGFydGlyIGRlbCBtb2RlbG8gc2UgZGViZSB1dGlsaXphciBsYSBmdW5jacOzbiBkZSBlbmxhY2UgKmxvZyo6IGcowrUpPWxuKMK1KQ0KDQpFbnRvbmNlcywgbGEgbGF0ZW5jaWEgZGUgZGVwcmVkYWNpw7NuLCBlbiBob3Jhcywgc2Vnw7puIGVzdGUgbW9kZWxvIHBhcmEgbGEgY29tYmluYWNpw7NuIEFPX0pDIChqdXZlbmlsZXMgPSAqQ2FyY2ludXMqKSBlc3TDoSBkYWRhIHBvciBsYSBlY3VhY2nDs24gKEUoQ2FyY2ludXMpID0gZXhwKEIwKSk6DQoNCmBgYHtyfQ0KZXhwKDUuNjcyMTgpDQpgYGANCkxvIHF1ZSBlcXVpdmFsZSBhIDEyLjEgZMOtYXMuDQoNClBvciBzdSBwYXJ0ZSwgbGEgbGF0ZW5jaWEgZGUgZGVwcmVkYWNpw7NuLCBlbiBob3Jhcywgc2Vnw7puIGVzdGUgbW9kZWxvIHBhcmEgbGEgY29tYmluYWNpw7NuIEpPX0FDIChqdXZlbmlsZXMgPSAqT3ZhbGlwZXMqKSBlc3TDoSBkYWRhIHBvciBsYSBlY3VhY2nDs24gKEUoT3ZhbGlwZXMpID0gZXhwKEIwK0IxKSk6DQoNCmBgYHtyfQ0KZXhwKDUuNjcyMTgtMy44ODA0MikNCmBgYA0KTG8gcXVlIGVxdWl2YWxlIGEgMC4yNSBkw61hcy4NCg0KRW50b25jZXMsIGVzdGUgbW9kZWxvIHByZWRpY2UgcXVlIGxhIGxhdGVuY2lhIGVzIHNpZ25pZmljYXRpdmFtZW50ZSBkaWZlcmVudGUgZW50cmUgYW1iYXMgZXNwZWNpZXMgKHA8MmUtMTYpLCBjb24gdW4gdmFsb3IgZGUgNiBob3JhcyBwYXJhIGxvcyBhZHVsdG9zIGRlICpDYXJjaW51cyogdnMgbG9zIGp1dmVuaWxlcyBkZSAqT3ZhbGlwZXMqIHkgZGUgMTIuMSBkw61hcyBwYXJhIGxhIG90cmEgY29tYmluYWNpw7NuLiANCg0KYGBge3IgZWNobz1GLCByZXN1bHRzPSdhc2lzJ30NCmdncGxvdChuYS5vbWl0KGRhdG9zKSkrDQogIGdlb21faGlzdG9ncmFtKGFlcyhIVVAsIGZpbGw9anV2ZW5pbGUpLCBiaW53aWR0aCA9IDI0KSsNCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD1leHAoNS42NzIxOC0zLjg4MDQyKSwgY29sb3IgPSAib3JhbmdlIiksIGx0eSA9IDIsIHNob3cubGVnZW5kID0gRikrDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9ZXhwKDUuNjcyMTgpLCBjb2xvciA9ICJibHVlIiksIGx0eT0yLCAgc2hvdy5sZWdlbmQgPSBGKSsNCiAgeGxhYigiUHJlZGF0aW9uIGxhdGVuY3kgdGltZSAoaG91cnMpIikrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB0aGVtZV9saWdodCgpDQpgYGANCjxzdHJvbmc+RmlndXJhIDg6PC9zdHJvbmc+IFJlc2lkdW9zIGVzdGFuZGFyaXphZG9zIHZzLiB2YWxvcmVzIHByZWRpY2hvcyBwYXJhIGVsIEdMTSBjb24gZGlzdHJpYnVjacOzbiBDb213YXktTWF4d2VsbCBQb2lzc29uLg0KDQojIFBhdHJvbmVzIGRlIGRpc3RyaWJ1Y2nDs24geSBhYnVuZGFuY2lhIGRlICpDYXJjaW51cyogeSAqT3ZhbGlwZXMqIGVuIEdvbGZvIE51ZXZvLg0KDQoNCiMjIENQVUUgcG9yIGVzcGVjaWUNCkxhIENQVUUgZnVlIGNhbGN1bGFkYSBjb21vIGVsIG7Dum1lcm8gZGUgY2FuZ3Jlam9zIGNhcHR1cmFkb3MgcG9yIGNhZGEgdW5vIGRlIGxvcyBzaXN0ZW1hcyBkZSB0cmFtcGFzIChjb25qdW50byBkZSB1bmEgdHJhbXBhIGNpbGluZHJpY2EgeSB1bmEgcmVjdGFuZ3VsYXIpIGR1cmFudGUgdW5hIGhvcmEgZGUgcGVybWFuZW5jaWEgZW4gZWwgYWd1YSAoMSBVRSA9IDEgU1QqaHIpLg0KDQpgYGB7cn0NCmthYmxlKGFidW5kYW5jaWEgJT4lDQogICAgICAgIGdyb3VwX2J5KFNpdGlvLCBFc3BlY2llKSAlPiUNCiAgICAgICAgc3VtbWFyaXNlKEFidW5kYW5jaWE9c3VtKEFidW5kYW5jaWEpLA0KICAgICAgICAgICAgICAgICAgQ1BVRT1zdW0oQ1BVRSkpICU+JQ0KICAgICAgICBhcy5kYXRhLmZyYW1lKCkpDQpgYGANCg0KTGEgcHJpbWVyYSBwcmVndW50YSBxdWUgc3VyZ2UgZXMgc2kgZXhpc3RlIHVuYSBkaWZlcmVuY2lhIGVuIGxhIGNhcHR1cmEgZGUgYW1iYXMgZXNwZWNpZXMgZW4gbG9zIGRpc3RpbnRvcyBzaXRpb3MgKEZpZ3VyYSA5KS4gDQpQYXJhIHJlc3BvbmRlciBlc3RhIHByZWd1bnRhLCBzZSBwdWVkZSBhcGxpY2FyIHVuIG1vZGVsbyBsaW5lYWwgZ2VuZXJhbGl6YWRvIHV0aWxpemFuZG8gbGEgQ1BVRSBjb21vIHZhcmlhYmxlIHJlc3B1ZXN0YSB5IGxvcyBmYWN0b3JlcyAiRXNwZWNpZSIsICJTZXhvIiB5ICJTaXRpbyIgY29tbyBwcmVkaWN0b3JlcyBmaWpvcywgbyBhbHRlcm5hdGl2YW1lbnRlIGVsIGZhY3RvciAiU2l0aW8iIGNvbW8gcHJlZGljdG9yIGFsZWF0b3JpbyAoc2kgbG8gcXVlIGludGVyZXNhIGVzIHRlbmVyIHVuYSBub2Npw7NuIGRlIGxhIHZhcmlhYmlsaWRhZCBlbiBsYSBhYnVuZGFuY2lhIGRlIGxvcyBjYW5ncmVqb3MgZGUgYWN1ZXJkbyBhIGxvcyBTaXRpb3MgeSBubyB1bmEgcmVzcHVlc3RhIHBhcmEgZXN0b3Mgc2l0aW9zIGVuIHBhcnRpY3VsYXIpLiBDcmVvIHF1ZSBlc3RhIHNlZ3VuZGEgYXByb3hpbWFjacOzbiBlcyBsYSBtw6FzIGNvbnNpc3RlbnRlIGNvbiBlbCBvYmpldGl2byBkZWwgdHJhYmFqby4NCkRlIGFjdWVyZG8gY29uIGVzdGUgbW9kZWxvIHkgdXRpbGl6YW5kbyB1bmEgZGlzdHJpYnVjacOzbiBnYW1tYSwgbG9zICpDYXJjaW51cyogc29uIHNpZ25pZmljYXRpdmFtZW50ZSBtw6FzIGFidW5kYW50ZXMgcXVlIGxvcyAqT3ZhbGlwZXMqIChDaGlzcSA9IDI2LjUzLCBwPDAuMDAwNSksIG5vIGV4aXN0ZW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgc2V4b3MgcGFyYSBhbWJhcyBlc3BlY2llcyAoQ2hpc3EgPSAwLjQ3MzMsIHAgPSAwLjQ5MTUpIHkgZWwgZmFjdG9yICJTaXRpbyIgZXhwbGljYSB1biA1MC45ICUgZGUgbGEgdmFyaWFjacOzbiBhbGVhdG9yaWEgZW4gZWwgQ1BVRS4gDQoNCmBgYHtyfQ0KYTFjIDwtIGdsbWVyKENQVUUgfiBFc3BlY2llKlNleG8gKyAoMXxTaXRpbyksIA0KICAgICAgICAgICAgIGZhbWlseSA9IEdhbW1hLA0KICAgICAgICAgICAgIGRhdGEgPSBzdWJzZXQoYWJ1bmRhbmNpYSwgQ1BVRSE9MCkpDQoNCnN1bW1hcnkgKGExYykNCkFub3ZhKGExYykNCmBgYA0KDQpgYGB7ciBlY2hvPUYsIHJlc3VsdHM9J2FzaXMnfQ0KZ2dwbG90KGRhdGEgPSBhYnVuZGFuY2lhKSsNCiAgZ2VvbV9jb2woYWVzKFNpdGlvLCBDUFVFLCBmaWxsID0gU2V4byksIHBvc2l0aW9uID0gJ3N0YWNrJykrDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gfkVzcGVjaWUsIG5yb3cgPSAxKSsNCiAgeWxhYigiQWJ1bmRhbmNlIChDUFVFKSIpKw0KICB4bGFiKCJTaXRpbyIpKw0KICB0aGVtZV9saWdodCgpDQpgYGANCjxzdHJvbmc+RmlndXJhIDk6PC9zdHJvbmc+IENhcHR1cmEgKENQVUUpIHBvciBlc3BlY2llIHBvciBzaXRpby4NCg0KIyMgRGlzdHJpYnVjacOzbiBkZSBzZXhvcyBwb3IgZXNwZWNpZQ0KRW4gZXN0ZSBjYXNvLCBpbnRlcmVzYSBjb25vY2VyIGxhIGRpc3RyaWJ1Y2nDs24gZGUgc2V4b3MgcG9yIHNpdGlvIHkgcG9yIGVzcGVjaWUuDQoNCmBgYHtyIGVjaG89RiwgcmVzdWx0cz0nYXNpcyd9DQpnZ3Bsb3QoZGF0YT1zdWJzZXQoQ1csIENXIT0wKSkrDQogIGdlb21faGlzdG9ncmFtKGFlcyhDVywgZmlsbD1TZXhvKSwgYmlud2lkdGggPSA1LCBwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICBmYWNldF93cmFwKGZhY2V0cyA9IH5Fc3BlY2llLCBuY29sID0gMSwgc2NhbGVzID0gImZyZWUiKSsNCiAgeWxhYigiQWJzb2x1dGUgZnJlcXVlbmN5IikrDQogIHhsYWIoIkNXIChtbSkiKSsNCiAgdGhlbWVfbGlnaHQoKQ0KYGBgDQo8c3Ryb25nPkZpZ3VyYSAxMDo8L3N0cm9uZz4gRGlzdHJpYnVjacOzbiBkZSB0YWxsYXMgcG9yIGVzcGVjaWUgeSBwb3Igc2V4by4NCg0KIyMjIEVuIGVsIGNhc28gZGUgKkNhcmNpbnVzKjoNCkVuIGVsIGNhc28gZGUgQ2FyY2ludXMsIHNpIHNlIG9ic2VydsOzIHVuYSBkaWZlcmVuY2lhIHNpZ25pZmljYXRpdmEgZW50cmUgc2V4b3MgcGFyYSBlbCBDVyAoQ2hpc3EgPSAxMDkuNDMsIEdMPTEsIHA9Mi4yZS0xNikuIExhIGNvbnRyaWJ1Y2nDs24gZGVsIHNpdGlvIGEgbGEgdmFyaWFiaWxpZGFkIG9ic2VydmFkYSBlbiBlbCBDVyBmdWUsIHBhcmEgZXN0YSBlc3BlY2llLCBkZWwgMTYlLg0KDQpgYGB7cn0NCmIxYyA8LSBsbWVyKENXIH4gU2V4byArICgxfFNpdGlvKSwgDQogICAgICAgICAgICBkYXRhID0gc3Vic2V0KENXLCBDVyE9MCAmIEVzcGVjaWU9PSJDYXJjaW51cyIpKQ0Kc3VtbWFyeShiMWMpDQpBbm92YShiMWMpDQpgYGANCiMjIyBFbiBlbCBjYXNvIGRlICpPdmFsaXBlcyo6DQpMYSBjYXB0dXJhIGRlIE92YWxpcGVzIGZ1ZSBtdWNobyBtZW5vciBxdWUgbGEgZGUgQ2FyY2ludXMsIHBvciBsbyBxdWUgbGEgY2FudGlkYWQgZGUgZGF0b3MgcGFyYSBtb2RlbGFyIGVzIG1lbm9yLiBBIHN1IHZleiwgZXhpc3RlbiBkb3Mgb3V0bGllcnMgKG1hY2hvcyBtZW5vcmVzIHF1ZSA2MCBtbSkgcXVlIGRpZmljdWx0YW4gbGEgYXBsaWNhY2nDs24gZGUgbG9zIG1vZGVsb3MsIHBlcm8gcXVlIHNlZ3VyYW1lbnRlIGVzdMOpbiBpbmRpYW5kbyBsYSBwcmVzZW5jaWEgZGUgZG9zIGNvaG9ydGVzLiBFbCBtb2RlbG8gcmVzdWx0YW50ZSBpbmRpY2EgcXVlIG5vIGhheSB1biBlZmVjdG8gc2lnbmlmaWNhdGl2byBkZWwgc2V4byBzb2JyZSBsYSB0YWxsYSBkZSBsb3MgY2FuZ3Jlam9zIChwcm9iYWJsZW1lbnRlIGluZHVjaWRvIHBvciBsb3MgZG9zIG91dGxpZXJzKSAoQ2hpc3E9MC4wNTU2LCBHTD0xLCBwPTAuODEzNykuIFNpIHNlIGV4Y2x1eWVuIGVzdG9zIGRvcyBtYWNob3MsIGVsIGVmZWN0byBzw60gZXMgc2lnbmlmaWNhdGl2byAoQ2hpc3E9MjQuMDg3LCBHTD0xLCBwPTkuMjA5ZS0wNykuIA0KRW4gY3VhbnRvIGEgbGEgY29udHJpYnVjacOzbiBkZWwgc2l0aW8gYSBsYSB2YXJpYWJpbGlkYWQgb2JzZXJ2YWRhLCBlbCBtb2RlbG8gY29tcGxldG8gcmV2ZWzDsyBxdWUgZnVlIGRlbCAzNSUsIG1pZW50cmFzIHF1ZSBleGNsdXllbmRvIGxvcyBvdXRsaWVycyBmdWUgZGVsIDY0JS4NCg0KYGBge3J9DQpiMW8gPC0gbG1lcihDVyB+IFNleG8gKyAoMXxTaXRpbyksIA0KICAgICAgICAgICAgZGF0YSA9IHN1YnNldChDVywgQ1chPTAgJiBFc3BlY2llPT0iT3ZhbGlwZXMiKSkNCnN1bW1hcnkoYjFvKQ0KQW5vdmEoYjFvKQ0KYGBgDQo=