Code initially Written October 15, 2018; finalized on May 5, 2021, and edited for reviewers on March 30, 2022 This contains the R script and results for analysis of mobbing behavior in the lark bunting dataset. There are three major sections. 1) How repeatable are mob-related behaviors, 2) Mobber perspecive - Relationships between traits and fitness with acting as a mobber, 3) Victim perspective - Relationships between traits and fitenss with being a mob victim.

This analysis accompanies the paper published in Behavioral Ecology and Sociobiology by Bruce E. Lyon and Alexis S. Chaine entitled “Mobbing for matings: dynamics, plumage correlates, and fitness impacts of conspicuous group extra-pair behaviors in the lark bunting” (contact: ; Department of Ecology and Evolutionary Biology, University of California, Santa Cruz, CA 95060, USA;Station d’Ecologie Théorique et Expérimentale du CNRS (UAR2029), 2 route du CNRS, 09200 Moulis, France and Toulouse School of Economics, Institute for Advanced Studies in Toulouse, 31000, Toulouse, France)

1 R details and packages used

1.0.1 Load packages

Code to load all of the packages listed above

#Load packages and dataset
Warning messages:
1: package ‘lmerTest’ was built under R version 4.0.4 
2: package ‘lme4’ was built under R version 4.0.4 
library(lme4) #for glmer
library(rptR) #for repeatability
library(lmerTest) #to get p-values from glmer.
library(dplyr) #to manipulate data, center variables
library(sjPlot) #for plotting output of GLMER
library(ggplot2) #for plotting output of GLMER
library(MASS) #to run negative bionomials if quasipoisson does not work in a glmer
library(AER) #to run overdispersion test on glm using dispersiontest(model) function
library(blmeco) #run overdispersion test on glmer using dispersion_glmer(model) function

#create function following BOLKER github from March 1, 2022: https://bbolker.github.io/mixedmodels-misc/glmmFAQ.html#overdispersion

overdisp_fun <- function(model) {
rdf <- df.residual(model)
rp <- residuals(model,type="pearson")
Pearson.chisq <- sum(rp^2)
prat <- Pearson.chisq/rdf
pval <- pchisq(Pearson.chisq, df=rdf, lower.tail=FALSE)
c(chisq=Pearson.chisq,ratio=prat,rdf=rdf,p=pval)
}

library(rmarkdown) #to output the results into word

#set options for not stopping analyses for errors:
knitr::opts_chunk$set(error = FALSE)
#knitr::opts_chunk$set(warning = FALSE)

1.0.2 Load dataset, calculate relative fitness, and create subset databases for specific analyses

#Import male centered dataset
dat<-read.csv("C:/Pyrenees/AlexisLabFiles/Papers n Manuscripts/LKBU_Mobs/MalesForMobs_Export_2.csv",header=T)

#convert to standard data-frame format because dplyr includes classes (tables?) in the dataframe which causes problems in some analyses
dat <- as.data.frame(dat)
#str(dat) #check to make sure that structure is correct


write.csv(dat, "C:/Pyrenees/AlexisLabFiles/Papers n Manuscripts/LKBU_Mobs/MalesForMobs_Export_Final.csv") #exports dataset to have a copy in csv format


#view data headers
#names(dat)



#Import female centered dataset
dat_F<-read.csv("C:/Pyrenees/AlexisLabFiles/Papers n Manuscripts/LKBU_Mobs/FemaleTraits_Vs_Mob_EP.csv",header=T)

#convert to standard data-frame format because dplyr includes classes (tables?) in the dataframe which causes problems in some analyses
dat_F <- as.data.frame(dat_F)
#str(dat_F) #check to make sure that structure is correct


write.csv(dat_F, "C:/Pyrenees/AlexisLabFiles/Papers n Manuscripts/LKBU_Mobs/MalesForMobs_Females_Export_Final.csv") #exports dataset to have a copy in csv format


#view data headers
#names(dat_F)

1.0.3 create subsetting datasets used in particular analyses (using filter from dplyr)

Obs30MinDatsub_F2 <- filter(dat_F, Total.time.min=>30)
Error: unexpected '>' in "Obs30MinDatsub_F2 <- filter(dat_F, Total.time.min=>"

1.0.4 Check distributions

#with(dat, hist(number.obs.was.mobber))
#with(dat, hist(number.victims))
#with(dat, hist(Number.observations.victim.mobbed))
#with(dat, hist(EP.Tot.P.0.15))
#with(dat, hist(X1st.egg.date))
#with(dat, hist(Julian.capture.date))
#with(dat, hist(N.EP.chick.home.0.15))
#with(dat, hist(WP.Tot.P.0.15.fledge))

3 B) MOBBER PERSPECTIVE

Do plumage and morphology relate to mobbing behavior and fitness?

4 3) Does plumage color of a mobber relate to his mobbing behavior?

4.1 3) Does male plumage relate to the number of vicitims he mobs? [Fig 2b; TABLE S2]

NVictimsPlumage <- with(dat, glmer(number.victims ~  BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition  + (1|Year) + (1|Band.Number), family = poisson))
Model failed to converge with max|grad| = 0.00975192 (tol = 0.002, component 1)
summary(NVictimsPlumage)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
 Family: poisson  ( log )
Formula: number.victims ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing +  
    percent.nr + rump + wp.z.average + Condition + (1 | Year) +      (1 | Band.Number)

     AIC      BIC   logLik deviance df.resid 
  1003.5   1042.7   -491.7    983.5      363 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.3459 -0.6949 -0.4308  0.4243  2.7802 

Random effects:
 Groups      Name        Variance Std.Dev.
 Band.Number (Intercept) 0.48540  0.6967  
 Year        (Intercept) 0.07453  0.2730  
Number of obs: 373, groups:  Band.Number, 305; Year, 5

Fixed effects:
                   Estimate Std. Error z value Pr(>|z|)    
(Intercept)        -0.46198    0.15586  -2.964 0.003035 ** 
BeakSize.PC1       -0.03563    0.06962  -0.512 0.608757    
BodySize.PC2        0.18593    0.07178   2.590 0.009585 ** 
body.color.no.wing  0.07969    0.07536   1.057 0.290307    
percent.nr          0.34621    0.09197   3.765 0.000167 ***
rump               -0.12769    0.08103  -1.576 0.115048    
wp.z.average       -0.03972    0.07195  -0.552 0.580891    
Condition           0.04946    0.02863   1.727 0.084095 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) BS.PC1 BS.PC2 bdy... prcnt. rump   wp.z.v
BeakSiz.PC1 -0.019                                          
BodySiz.PC2 -0.062  0.111                                   
bdy.clr.n.w -0.012 -0.097 -0.055                            
percent.nr  -0.111 -0.019 -0.061 -0.271                     
rump         0.057 -0.057  0.068  0.084 -0.461              
wp.z.averag  0.004 -0.072 -0.140 -0.130 -0.031  0.023       
Condition   -0.021 -0.070  0.044 -0.042  0.003 -0.030 -0.007
optimizer (Nelder_Mead) convergence code: 0 (OK)
Model failed to converge with max|grad| = 0.00975192 (tol = 0.002, component 1)
anova(NVictimsPlumage)
Analysis of Variance Table
                   npar  Sum Sq Mean Sq F value
BeakSize.PC1          1  0.1157  0.1157  0.1157
BodySize.PC2          1  8.5135  8.5135  8.5135
body.color.no.wing    1  4.7810  4.7810  4.7810
percent.nr            1 11.9505 11.9505 11.9505
rump                  1  2.3111  2.3111  2.3111
wp.z.average          1  0.2928  0.2928  0.2928
Condition             1  3.0028  3.0028  3.0028
#check residual distribution
#qqnorm(residuals(NVictimsPlumage))
#qqline(residuals(NVictimsPlumage))

#remove random effects
NVictimsPlumage1 <- with(dat, glmer(number.victims ~  BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition  + (1|Band.Number), family = poisson))

NVictimsPlumage2 <- with(dat, glmer(number.victims ~  BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition  + (1|Year), family = poisson))

NVictimsPlumage3 <- with(dat, glm(number.victims ~  BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition, family = poisson))

#compare AIC of models with different combinations of random effects
AIC(NVictimsPlumage)
[1] 1003.465
AIC(NVictimsPlumage1)
[1] 1010.499
AIC(NVictimsPlumage2)
[1] 1054.717
AIC(NVictimsPlumage3)
[1] 1073.092
#test for overdispersion of poisson models
dispersion_glmer(NVictimsPlumage)
[1] 1.016808
overdisp_fun(NVictimsPlumage)
      chisq       ratio         rdf           p 
221.9645840   0.6114727 363.0000000   1.0000000 

5 4) Are the number of times a bird was seen mobing depend on things like how present they were on the site?

5.1 4a) Do number of victims increase with number of mobs? Analysis shown includes birds seen even if not seen mobbing.

#Spearman analysis was used in the manuscript as the rho value is more intuitive than estimates from the GLMM; all analyses show the same pattern, though.
with(dat, cor.test(number.victims, number.obs.was.mobber, method = c("spearman"))) 
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  number.victims and number.obs.was.mobber
S = 175854, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.9804642 

5.2 4b) Do number of victims increase with number of mobs? Analysis only including birds seen mobbing at least once.

#Spearman analysis was used in the manuscript as the rho value is more intuitive than estimates from the GLMM; all analyses show the same pattern, though.
with(Mobs1Datsub, cor.test(number.victims, number.obs.was.mobber, method = c("spearman")))
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  number.victims and number.obs.was.mobber
S = 56236, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.7838155 

5.3 4c) Does nesting date influence mob observations - maybe because birds only mob after they get their own nest?

#Spearman analysis was used in the manuscript as the rho value is more intuitive than estimates from the GLMM; all analyses show the same pattern, though.
with(dat, cor.test(number.obs.was.mobber, X1st.egg.date, method = c("spearman")))
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  number.obs.was.mobber and X1st.egg.date
S = 1646612, p-value = 3.079e-05
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
-0.2922754 

5.4 4d) Does number of mob victims predict EP chicks (0.15 level)

#Spearman analysis was used in the manuscript as the rho value is more intuitive than estimates from the GLMM; all analyses show the same pattern, though.
with(dat, cor.test(EP.Tot.P.0.15, number.victims, method = c("spearman")))

6 5) Does plumage predict EP fitness (#EP chicks sired; #EP nests)

6.1 5) Does plumage predict the number of EP chicks (paternity assignment at 0.15 level) [Fig2a; TABLE S1]

EPChicks15.Plumage <- with(dat, glmer(EP.Tot.P.0.15 ~  BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition + (1|Year) + (1|Band.Number), family = poisson))
Model failed to converge with max|grad| = 0.00355843 (tol = 0.002, component 1)
#summary(EPChicks15.Plumage)
#anova(EPChicks15.Plumage)
#qqnorm(residuals(EPChicks15.Plumage))
#qqline(residuals(EPChicks15.Plumage))

#Model does not converge

#without year - best model
EPChicks15.PlumageA <- with(dat, glmer(EP.Tot.P.0.15 ~  BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition  + (1|Band.Number), family = poisson))
Model failed to converge with max|grad| = 0.010729 (tol = 0.002, component 1)
summary(EPChicks15.PlumageA)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
 Family: poisson  ( log )
Formula: EP.Tot.P.0.15 ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing +  
    percent.nr + rump + wp.z.average + Condition + (1 | Band.Number)

     AIC      BIC   logLik deviance df.resid 
   514.1    549.4   -248.1    496.1      364 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.3888 -0.3064 -0.2450 -0.1777  2.3130 

Random effects:
 Groups      Name        Variance Std.Dev.
 Band.Number (Intercept) 2.539    1.593   
Number of obs: 373, groups:  Band.Number, 305

Fixed effects:
                   Estimate Std. Error z value Pr(>|z|)    
(Intercept)        -2.49148    0.30513  -8.165  3.2e-16 ***
BeakSize.PC1        0.09229    0.14288   0.646  0.51832    
BodySize.PC2       -0.02475    0.13432  -0.184  0.85379    
body.color.no.wing -0.04002    0.15388  -0.260  0.79481    
percent.nr          0.57681    0.19037   3.030  0.00245 ** 
rump               -0.17658    0.15730  -1.123  0.26162    
wp.z.average       -0.31710    0.14499  -2.187  0.02874 *  
Condition          -0.05501    0.06083  -0.904  0.36580    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) BS.PC1 BS.PC2 bdy... prcnt. rump   wp.z.v
BeakSiz.PC1 -0.153                                          
BodySiz.PC2  0.046  0.030                                   
bdy.clr.n.w  0.065 -0.108 -0.034                            
percent.nr  -0.301 -0.006 -0.087 -0.204                     
rump         0.150 -0.038  0.024  0.053 -0.517              
wp.z.averag  0.234 -0.105 -0.181 -0.127 -0.152  0.088       
Condition    0.151  0.022  0.065 -0.089 -0.050  0.001  0.011
optimizer (Nelder_Mead) convergence code: 0 (OK)
Model failed to converge with max|grad| = 0.010729 (tol = 0.002, component 1)
anova(EPChicks15.PlumageA)
Analysis of Variance Table
                   npar Sum Sq Mean Sq F value
BeakSize.PC1          1 0.2963  0.2963  0.2963
BodySize.PC2          1 0.1157  0.1157  0.1157
body.color.no.wing    1 0.0080  0.0080  0.0080
percent.nr            1 5.6163  5.6163  5.6163
rump                  1 0.7519  0.7519  0.7519
wp.z.average          1 4.1424  4.1424  4.1424
Condition             1 0.6503  0.6503  0.6503
#qqnorm(residuals(EPChicks15.PlumageA))
#qqline(residuals(EPChicks15.PlumageA))

#without ID
EPChicks15.PlumageB <- with(dat, glmer(EP.Tot.P.0.15 ~  BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition  + (1|Year), family = poisson))

#No random effects
EPChicks15.PlumageC <- with(dat, glm(EP.Tot.P.0.15 ~  BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition, family = poisson))

AIC(EPChicks15.Plumage)
[1] 516.121
AIC(EPChicks15.PlumageA)
[1] 514.1211
AIC(EPChicks15.PlumageB)
[1] 579.8071
AIC(EPChicks15.PlumageC)
[1] 579.1551
#test for overdispersion of poisson models
dispersion_glmer(EPChicks15.PlumageA)
[1] 0.7587689
overdisp_fun(EPChicks15.PlumageA)
      chisq       ratio         rdf           p 
114.1937422   0.3137191 364.0000000   1.0000000 

7 6) Does plumage predict EP fitness above its effects on mobbing. So add mobbing effort as covariate

covariates are number obs for total EPY and number victims for total EPNests#

7.1 6) Does plumage impact EP Chicks (paternity assignement at 0.15 level) when controlling for effort? [Fig 2c; TABLE S3]

EPChicks15.Plumage.Effort <- with(dat, glmer(EP.Tot.P.0.15 ~  BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition  + number.obs.was.mobber + (1|Year) + (1|Band.Number), family = poisson))
Model failed to converge with max|grad| = 0.0629605 (tol = 0.002, component 1)
#summary(EPChicks15.Plumage.Effort)
#anova(EPChicks15.Plumage.Effort)
#qqnorm(residuals(EPChicks15.Plumage.Effort))
#qqline(residuals(EPChicks15.Plumage.Effort))


EPChicks15.Plumage.Effort1 <- with(dat, glmer(EP.Tot.P.0.15 ~  BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition  + number.obs.was.mobber + (1|Band.Number), family = poisson))
Model failed to converge with max|grad| = 0.017055 (tol = 0.002, component 1)
summary(EPChicks15.Plumage.Effort1)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
 Family: poisson  ( log )
Formula: EP.Tot.P.0.15 ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing +  
    percent.nr + rump + wp.z.average + Condition + number.obs.was.mobber +      (1 | Band.Number)

     AIC      BIC   logLik deviance df.resid 
   506.6    545.8   -243.3    486.6      363 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.2759 -0.3391 -0.2737 -0.1977  4.6442 

Random effects:
 Groups      Name        Variance Std.Dev.
 Band.Number (Intercept) 1.787    1.337   
Number of obs: 373, groups:  Band.Number, 305

Fixed effects:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)           -2.41594    0.27372  -8.826  < 2e-16 ***
BeakSize.PC1           0.06818    0.13227   0.515  0.60622    
BodySize.PC2          -0.08504    0.13215  -0.643  0.51993    
body.color.no.wing    -0.02560    0.14620  -0.175  0.86099    
percent.nr             0.48121    0.18029   2.669  0.00761 ** 
rump                  -0.21282    0.15495  -1.373  0.16962    
wp.z.average          -0.36032    0.13828  -2.606  0.00917 ** 
Condition             -0.06247    0.05750  -1.086  0.27730    
number.obs.was.mobber  0.07647    0.02395   3.193  0.00141 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) BS.PC1 BS.PC2 bdy... prcnt. rump   wp.z.v Condtn
BeakSiz.PC1 -0.098                                                 
BodySiz.PC2  0.050  0.043                                          
bdy.clr.n.w  0.058 -0.116 -0.045                                   
percent.nr  -0.310  0.002 -0.066 -0.227                            
rump         0.225 -0.035  0.073  0.086 -0.528                     
wp.z.averag  0.311 -0.089 -0.151 -0.103 -0.144  0.138              
Condition    0.169  0.025  0.058 -0.054 -0.054  0.019  0.027       
nmbr.bs.ws. -0.021 -0.022 -0.179  0.034 -0.148 -0.066 -0.119 -0.034
optimizer (Nelder_Mead) convergence code: 0 (OK)
Model failed to converge with max|grad| = 0.017055 (tol = 0.002, component 1)
anova(EPChicks15.Plumage.Effort1)
Analysis of Variance Table
                      npar  Sum Sq Mean Sq F value
BeakSize.PC1             1  0.1835  0.1835  0.1835
BodySize.PC2             1  0.0011  0.0011  0.0011
body.color.no.wing       1  0.0231  0.0231  0.0231
percent.nr               1  6.4047  6.4047  6.4047
rump                     1  0.4497  0.4497  0.4497
wp.z.average             1  3.3960  3.3960  3.3960
Condition                1  0.5858  0.5858  0.5858
number.obs.was.mobber    1 10.2675 10.2675 10.2675
#qqnorm(residuals(EPChicks15.Plumage.Effort1))
#qqline(residuals(EPChicks15.Plumage.Effort1))

EPChicks15.Plumage.Effort2 <- with(dat, glmer(EP.Tot.P.0.15 ~  BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition  + number.obs.was.mobber + (1|Year), family = poisson))

EPChicks15.Plumage.Effort3 <- with(dat, glm(EP.Tot.P.0.15 ~  BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition  + number.obs.was.mobber, family = poisson))

#Without year is best model

AIC(EPChicks15.Plumage.Effort)
[1] 508.6268
AIC(EPChicks15.Plumage.Effort1)
[1] 506.6213
AIC(EPChicks15.Plumage.Effort2)
[1] 535.0355
AIC(EPChicks15.Plumage.Effort3)
[1] 533.0679
#test for overdispersion of poisson models
dispersion_glmer(EPChicks15.Plumage.Effort1)
[1] 0.7804036
overdisp_fun(EPChicks15.Plumage.Effort1)
      chisq       ratio         rdf           p 
158.0567842   0.4354181 363.0000000   1.0000000 

8 7) Are there costs of mobbing via trade-offs between mobbing effort and increased extra-pair young at home?

8.0.0.1 7) Are there trade-offs between number of mobs and proportion of EP chicks at home (paternity assignement at 0.15)?

###Using proportion of EP chicks in own nest with “cbind(N.EP, N.WP)” to account for differences in numbers of chicks observed per nest since a larger sample gives a more reliable proportion gives the same result.

NMobs.NestEPChicks15 <- with(dat, glmer(cbind(N.EP.chick.home.0.15, total.genotyped-N.EP.chick.home.0.15) ~ number.obs.was.mobber + (1|Year) + (1|Band.Number), family = binomial))
boundary (singular) fit: see ?isSingular
#summary(NMobs.NestEPChicks15)
#anova(NMobs.NestEPChicks15)
#qqnorm(residuals(NMobs.NestEPChicks15))
#qqline(residuals(NMobs.NestEPChicks15))

#remove random effects
NMobs.NestEPChicks15a <- with(dat, glmer(cbind(N.EP.chick.home.0.15, total.genotyped-N.EP.chick.home.0.15) ~ number.obs.was.mobber + (1|Band.Number), family = binomial))
summary(NMobs.NestEPChicks15a)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
 Family: binomial  ( logit )
Formula: cbind(N.EP.chick.home.0.15, total.genotyped - N.EP.chick.home.0.15) ~  
    number.obs.was.mobber + (1 | Band.Number)

     AIC      BIC   logLik deviance df.resid 
   331.6    340.1   -162.8    325.6      123 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.3602 -0.6259 -0.3236  0.4491  2.0661 

Random effects:
 Groups      Name        Variance Std.Dev.
 Band.Number (Intercept) 2.078    1.441   
Number of obs: 126, groups:  Band.Number, 108

Fixed effects:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)           -1.48336    0.25059  -5.920 3.23e-09 ***
number.obs.was.mobber -0.03046    0.03307  -0.921    0.357    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
nmbr.bs.ws. -0.337
anova(NMobs.NestEPChicks15a)
Analysis of Variance Table
                      npar Sum Sq Mean Sq F value
number.obs.was.mobber    1 0.8932  0.8932  0.8932
NMobs.NestEPChicks15b <- with(dat, glmer(cbind(N.EP.chick.home.0.15, total.genotyped-N.EP.chick.home.0.15) ~ number.obs.was.mobber + (1|Year), family = binomial))
boundary (singular) fit: see ?isSingular
NMobs.NestEPChicks15c <- with(dat, glm(cbind(N.EP.chick.home.0.15, total.genotyped-N.EP.chick.home.0.15) ~ number.obs.was.mobber, family = binomial))

#qqnorm(residuals(NMobs.NestEPChicks15c))
#qqline(residuals(NMobs.NestEPChicks15c))


#model with only male ID is best and no longer has a singularity

AIC(NMobs.NestEPChicks15)
[1] 333.5933
AIC(NMobs.NestEPChicks15a)
[1] 331.5933
AIC(NMobs.NestEPChicks15b)
[1] 360.9208
AIC(NMobs.NestEPChicks15c)
[1] 358.9208

9 8) Are there costs of mobbing via trade-offs between mobbing effort and the number of within pair chicks fledged at home?

Focused on number fledged as the cost may not just be in terms of proportion sired, but also other forms of parental care. Did not account for number of chicks in nest - but we don’t want a proportion of chicks that are within pair (analysis above)

9.1 8) Is there a trade-off between mobbing effort and number of within pair chicks that actually fledged (paternity assignement at 0.15)

NMobs.NumberOwnWPChicks15 <- with(dat, glmer(WP.Tot.P.0.15.fledge ~ number.obs.was.mobber + (1|Year) + (1|Band.Number), family = poisson))
boundary (singular) fit: see ?isSingular
#summary(NMobs.NumberOwnWPChicks15)
#anova(NMobs.NumberOwnWPChicks15)
#qqnorm(residuals(NMobs.NumberOwnWPChicks15))
#qqline(residuals(NMobs.NumberOwnWPChicks15))

#remove random effects
NMobs.NumberOwnWPChicks15a <- with(dat, glmer(WP.Tot.P.0.15.fledge ~ number.obs.was.mobber + (1|Band.Number), family = poisson))
summary(NMobs.NumberOwnWPChicks15a)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
 Family: poisson  ( log )
Formula: WP.Tot.P.0.15.fledge ~ number.obs.was.mobber + (1 | Band.Number)

     AIC      BIC   logLik deviance df.resid 
   615.3    624.5   -304.7    609.3      155 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.4675 -1.0342  0.1923  0.7525  2.0469 

Random effects:
 Groups      Name        Variance Std.Dev.
 Band.Number (Intercept) 0.3537   0.5947  
Number of obs: 158, groups:  Band.Number, 135

Fixed effects:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)            0.44560    0.10225   4.358 1.31e-05 ***
number.obs.was.mobber  0.02186    0.01440   1.518    0.129    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
nmbr.bs.ws. -0.409
anova(NMobs.NumberOwnWPChicks15a)
Analysis of Variance Table
                      npar Sum Sq Mean Sq F value
number.obs.was.mobber    1 2.2811  2.2811  2.2811
#qqnorm(residuals(NMobs.NumberOwnWPChicks15a))
#qqline(residuals(NMobs.NumberOwnWPChicks15a))

NMobs.NumberOwnWPChicks15b <- with(dat, glmer(WP.Tot.P.0.15.fledge ~ number.obs.was.mobber + (1|Year), family = poisson))

NMobs.NumberOwnWPChicks15c <- with(dat, glm(WP.Tot.P.0.15.fledge ~ number.obs.was.mobber, family = poisson))

#model without year is best

AIC(NMobs.NumberOwnWPChicks15)
[1] 617.3087
AIC(NMobs.NumberOwnWPChicks15a)
[1] 615.3087
AIC(NMobs.NumberOwnWPChicks15b)
[1] 637.4011
AIC(NMobs.NumberOwnWPChicks15c)
[1] 635.4351
#test for overdispersion of poisson models
dispersion_glmer(NMobs.NumberOwnWPChicks15a)
[1] 1.228281
overdisp_fun(NMobs.NumberOwnWPChicks15a)
      chisq       ratio         rdf           p 
123.3341891   0.7957044 155.0000000   0.9712481 

10 9) Are mobbers more often mated or unmated males? In other words, is it a compliment to within pair fitness, a best of a bad job, or just everyone does it.

10.1 9) Do mated vs unmated males mob more (number of times seen in mob) BEL USED A FISHERS EXACT TEST in JMP

#Fisher's Exact test considering if males joined a mob at least once or never for mated and unmated males. Values for each category were gathered in the Excel sheet and transcribed here.
MatedMobber <- as.table(rbind(c(140, 53), c(93, 92)))
dimnames(MatedMobber) <- list(
  mobber = c("mobber", "not_mobber"),
  mated = c("mated", "unmated")
)
MatedMobber
            mated
mobber       mated unmated
  mobber       140      53
  not_mobber    93      92
# fisher's exact test
fisher.test(MatedMobber)

    Fisher's Exact Test for Count Data

data:  MatedMobber
p-value = 8.835e-06
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 1.667138 4.104847
sample estimates:
odds ratio 
  2.606245 
#could run models that account for time the bird could have been seen if mated males were around longer and the result is the same as without taking into account the time they were observable - or maybe even more striking. The full model has a singular fit, but removing random effects solves this.
NMobs.MatedUnmatedA <- with(dat, lmer(number.obs.was.mobber ~ Mate.vs.Unmate + Julian.capture.date + (1|Band.Number)))
summary(NMobs.MatedUnmatedA)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: number.obs.was.mobber ~ Mate.vs.Unmate + Julian.capture.date +      (1 | Band.Number)

REML criterion at convergence: 1990.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.2833 -0.4743 -0.2484  0.1158  6.8193 

Random effects:
 Groups      Name        Variance Std.Dev.
 Band.Number (Intercept)  0.9384  0.9687  
 Residual                10.2307  3.1986  
Number of obs: 378, groups:  Band.Number, 309

Fixed effects:
                       Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)             8.20936    1.55575 374.88078   5.277 2.23e-07 ***
Mate.vs.Unmateunmated  -2.15506    0.35829 373.48241  -6.015 4.29e-09 ***
Julian.capture.date    -0.03681    0.01016 374.26448  -3.623 0.000332 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) Mt.v.U
Mt.vs.Unmtn -0.229       
Jln.cptr.dt -0.990  0.143
anova(NMobs.MatedUnmatedA)
Type III Analysis of Variance Table with Satterthwaite's method
                    Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Mate.vs.Unmate      370.13  370.13     1 373.48  36.178 4.294e-09 ***
Julian.capture.date 134.28  134.28     1 374.26  13.125 0.0003315 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#qqnorm(residuals(NMobs.MatedUnmatedA))
#qqline(residuals(NMobs.MatedUnmatedA))
plot_model(NMobs.MatedUnmatedA, type = "pred")
$Mate.vs.Unmate

$Julian.capture.date

11 C) VICTIM PERSPECTIVE

Is plumage related to being a victim?

We removed individuals followed less than 3 times for number of observations or 30min for total number of mobbers, although this may not be needed if we add number of obs in as a covariate.

12 10) Do male traits predict his vulnerability to mobbing?

in many of these we use subset data for birds that were seen more than 30min total (Obs30MinDatsub) in the Total.time.min column

13 12) Do female traits predict his vulnerability to mobbing?

in many of these we use subset data for birds that were seen more than 30min total (Obs30MinDatsub) in the Total.time.min column

14 THIS IS THE END…MY FRIEND!

LS0tDQp0aXRsZTogIlIgUmVzdWx0cyBmb3IgTW9iIFBhcGVyIHdpdGggQiBMeW9uIg0Kb3V0cHV0Og0KICB3b3JkX2RvY3VtZW50Og0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICB0b2M6IHllcw0KICBodG1sX25vdGVib29rOg0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIHRvYzogeWVzDQogIHBkZl9kb2N1bWVudDoNCiAgICBmaWdfaGVpZ2h0OiA0DQogICAgZmlnX3dpZHRoOiA0DQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KICAgIGtlZXBfdGV4OiB5ZXMNCiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6IGNlcnVsZWFuDQogICAgdG9jOiB5ZXMNCmVkaXRvcl9vcHRpb25zOg0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KKioqQ29kZSBpbml0aWFsbHkgV3JpdHRlbiBPY3RvYmVyIDE1LCAyMDE4OyBmaW5hbGl6ZWQgb24gTWF5IDUsIDIwMjEsIGFuZCBlZGl0ZWQgZm9yIHJldmlld2VycyBvbiBNYXJjaCAzMCwgMjAyMioqKg0KVGhpcyBjb250YWlucyB0aGUgUiBzY3JpcHQgYW5kIHJlc3VsdHMgZm9yIGFuYWx5c2lzIG9mIG1vYmJpbmcgYmVoYXZpb3IgaW4gdGhlIGxhcmsgYnVudGluZyBkYXRhc2V0LiBUaGVyZSBhcmUgdGhyZWUgbWFqb3Igc2VjdGlvbnMuIDEpIEhvdyByZXBlYXRhYmxlIGFyZSBtb2ItcmVsYXRlZCBiZWhhdmlvcnMsIDIpIE1vYmJlciBwZXJzcGVjaXZlIC0gUmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRyYWl0cyBhbmQgZml0bmVzcyB3aXRoIGFjdGluZyBhcyBhIG1vYmJlciwgMykgVmljdGltIHBlcnNwZWN0aXZlIC0gUmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRyYWl0cyBhbmQgZml0ZW5zcyB3aXRoIGJlaW5nIGEgbW9iIHZpY3RpbS4NCg0KVGhpcyBhbmFseXNpcyBhY2NvbXBhbmllcyB0aGUgcGFwZXIgcHVibGlzaGVkIGluIEJlaGF2aW9yYWwgRWNvbG9neSBhbmQgU29jaW9iaW9sb2d5IGJ5IEJydWNlIEUuIEx5b24gYW5kIEFsZXhpcyBTLiBDaGFpbmUgZW50aXRsZWQgIk1vYmJpbmcgZm9yIG1hdGluZ3M6IGR5bmFtaWNzLCBwbHVtYWdlIGNvcnJlbGF0ZXMsIGFuZCBmaXRuZXNzIGltcGFjdHMgb2YgY29uc3BpY3VvdXMgZ3JvdXAgZXh0cmEtcGFpciBiZWhhdmlvcnMgaW4gdGhlIGxhcmsgYnVudGluZyIgKGNvbnRhY3Q6IGJlbHlvbkB1Y3NjLmVkdTsgRGVwYXJ0bWVudCBvZiBFY29sb2d5IGFuZCBFdm9sdXRpb25hcnkgQmlvbG9neSwgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBTYW50YSBDcnV6LCBDQSA5NTA2MCwgVVNBO1N0YXRpb24gZOKAmUVjb2xvZ2llIFRow6lvcmlxdWUgZXQgRXhww6lyaW1lbnRhbGUgZHUgQ05SUyAoVUFSMjAyOSksIDIgcm91dGUgZHUgQ05SUywgMDkyMDAgTW91bGlzLCBGcmFuY2UgYW5kIFRvdWxvdXNlIFNjaG9vbCBvZiBFY29ub21pY3MsIEluc3RpdHV0ZSBmb3IgQWR2YW5jZWQgU3R1ZGllcyBpbiBUb3Vsb3VzZSwgMzEwMDAsIFRvdWxvdXNlLCBGcmFuY2UpDQoNCg0KDQojIFIgZGV0YWlscyBhbmQgcGFja2FnZXMgdXNlZA0KICAqIEZpbGUgY3JlYXRpb24gZGF0ZTogYHIgU3lzLkRhdGUoKWANCiAgKiBgciBSLnZlcnNpb24uc3RyaW5nYA0KICANCiMjIyBMb2FkIHBhY2thZ2VzDQpDb2RlIHRvIGxvYWQgYWxsIG9mIHRoZSBwYWNrYWdlcyBsaXN0ZWQgYWJvdmUNCmBgYHtyLCAsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQojTG9hZCBwYWNrYWdlcyBhbmQgZGF0YXNldA0KbGlicmFyeShsbWU0KSAjZm9yIGdsbWVyDQpsaWJyYXJ5KHJwdFIpICNmb3IgcmVwZWF0YWJpbGl0eQ0KbGlicmFyeShsbWVyVGVzdCkgI3RvIGdldCBwLXZhbHVlcyBmcm9tIGdsbWVyLg0KbGlicmFyeShkcGx5cikgI3RvIG1hbmlwdWxhdGUgZGF0YSwgY2VudGVyIHZhcmlhYmxlcw0KbGlicmFyeShzalBsb3QpICNmb3IgcGxvdHRpbmcgb3V0cHV0IG9mIEdMTUVSDQpsaWJyYXJ5KGdncGxvdDIpICNmb3IgcGxvdHRpbmcgb3V0cHV0IG9mIEdMTUVSDQpsaWJyYXJ5KE1BU1MpICN0byBydW4gbmVnYXRpdmUgYmlvbm9taWFscyBpZiBxdWFzaXBvaXNzb24gZG9lcyBub3Qgd29yayBpbiBhIGdsbWVyDQpsaWJyYXJ5KEFFUikgI3RvIHJ1biBvdmVyZGlzcGVyc2lvbiB0ZXN0IG9uIGdsbSB1c2luZyBkaXNwZXJzaW9udGVzdChtb2RlbCkgZnVuY3Rpb24NCmxpYnJhcnkoYmxtZWNvKSAjcnVuIG92ZXJkaXNwZXJzaW9uIHRlc3Qgb24gZ2xtZXIgdXNpbmcgZGlzcGVyc2lvbl9nbG1lcihtb2RlbCkgZnVuY3Rpb24NCg0KI2NyZWF0ZSBmdW5jdGlvbiBmb2xsb3dpbmcgQk9MS0VSIGdpdGh1YiBmcm9tIE1hcmNoIDEsIDIwMjI6IGh0dHBzOi8vYmJvbGtlci5naXRodWIuaW8vbWl4ZWRtb2RlbHMtbWlzYy9nbG1tRkFRLmh0bWwjb3ZlcmRpc3BlcnNpb24NCg0Kb3ZlcmRpc3BfZnVuIDwtIGZ1bmN0aW9uKG1vZGVsKSB7DQpyZGYgPC0gZGYucmVzaWR1YWwobW9kZWwpDQpycCA8LSByZXNpZHVhbHMobW9kZWwsdHlwZT0icGVhcnNvbiIpDQpQZWFyc29uLmNoaXNxIDwtIHN1bShycF4yKQ0KcHJhdCA8LSBQZWFyc29uLmNoaXNxL3JkZg0KcHZhbCA8LSBwY2hpc3EoUGVhcnNvbi5jaGlzcSwgZGY9cmRmLCBsb3dlci50YWlsPUZBTFNFKQ0KYyhjaGlzcT1QZWFyc29uLmNoaXNxLHJhdGlvPXByYXQscmRmPXJkZixwPXB2YWwpDQp9DQoNCmxpYnJhcnkocm1hcmtkb3duKSAjdG8gb3V0cHV0IHRoZSByZXN1bHRzIGludG8gd29yZA0KDQojc2V0IG9wdGlvbnMgZm9yIG5vdCBzdG9wcGluZyBhbmFseXNlcyBmb3IgZXJyb3JzOg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yID0gRkFMU0UpDQoja25pdHI6Om9wdHNfY2h1bmskc2V0KHdhcm5pbmcgPSBGQUxTRSkNCmBgYA0KDQojIyMgTG9hZCBkYXRhc2V0LCBjYWxjdWxhdGUgcmVsYXRpdmUgZml0bmVzcywgYW5kIGNyZWF0ZSBzdWJzZXQgZGF0YWJhc2VzIGZvciBzcGVjaWZpYyBhbmFseXNlcw0KYGBge3J9DQojSW1wb3J0IG1hbGUgY2VudGVyZWQgZGF0YXNldA0KZGF0PC1yZWFkLmNzdigiQzovUHlyZW5lZXMvQWxleGlzTGFiRmlsZXMvUGFwZXJzIG4gTWFudXNjcmlwdHMvTEtCVV9Nb2JzL01hbGVzRm9yTW9ic19FeHBvcnRfMi5jc3YiLGhlYWRlcj1UKQ0KDQojY29udmVydCB0byBzdGFuZGFyZCBkYXRhLWZyYW1lIGZvcm1hdCBiZWNhdXNlIGRwbHlyIGluY2x1ZGVzIGNsYXNzZXMgKHRhYmxlcz8pIGluIHRoZSBkYXRhZnJhbWUgd2hpY2ggY2F1c2VzIHByb2JsZW1zIGluIHNvbWUgYW5hbHlzZXMNCmRhdCA8LSBhcy5kYXRhLmZyYW1lKGRhdCkNCiNzdHIoZGF0KSAjY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgc3RydWN0dXJlIGlzIGNvcnJlY3QNCg0KDQojd3JpdGUuY3N2KGRhdCwgIkM6L1B5cmVuZWVzL0FsZXhpc0xhYkZpbGVzL1BhcGVycyBuIE1hbnVzY3JpcHRzL0xLQlVfTW9icy9NYWxlc0Zvck1vYnNfRXhwb3J0X0ZpbmFsLmNzdiIpICNleHBvcnRzIGRhdGFzZXQgdG8gaGF2ZSBhIGNvcHkgaW4gY3N2IGZvcm1hdA0KDQoNCiN2aWV3IGRhdGEgaGVhZGVycw0KI25hbWVzKGRhdCkNCg0KDQoNCiNJbXBvcnQgZmVtYWxlIGNlbnRlcmVkIGRhdGFzZXQNCmRhdF9GPC1yZWFkLmNzdigiQzovUHlyZW5lZXMvQWxleGlzTGFiRmlsZXMvUGFwZXJzIG4gTWFudXNjcmlwdHMvTEtCVV9Nb2JzL0ZlbWFsZVRyYWl0c19Wc19Nb2JfRVAuY3N2IixoZWFkZXI9VCkNCg0KI2NvbnZlcnQgdG8gc3RhbmRhcmQgZGF0YS1mcmFtZSBmb3JtYXQgYmVjYXVzZSBkcGx5ciBpbmNsdWRlcyBjbGFzc2VzICh0YWJsZXM/KSBpbiB0aGUgZGF0YWZyYW1lIHdoaWNoIGNhdXNlcyBwcm9ibGVtcyBpbiBzb21lIGFuYWx5c2VzDQpkYXRfRiA8LSBhcy5kYXRhLmZyYW1lKGRhdF9GKQ0KI3N0cihkYXRfRikgI2NoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHN0cnVjdHVyZSBpcyBjb3JyZWN0DQoNCg0KI3dyaXRlLmNzdihkYXRfRiwgIkM6L1B5cmVuZWVzL0FsZXhpc0xhYkZpbGVzL1BhcGVycyBuIE1hbnVzY3JpcHRzL0xLQlVfTW9icy9NYWxlc0Zvck1vYnNfRmVtYWxlc19FeHBvcnRfRmluYWwuY3N2IikgI2V4cG9ydHMgZGF0YXNldCB0byBoYXZlIGEgY29weSBpbiBjc3YgZm9ybWF0DQoNCg0KI3ZpZXcgZGF0YSBoZWFkZXJzDQojbmFtZXMoZGF0X0YpDQpgYGANCg0KIyMjIGNyZWF0ZSBzdWJzZXR0aW5nIGRhdGFzZXRzIHVzZWQgaW4gcGFydGljdWxhciBhbmFseXNlcyAodXNpbmcgZmlsdGVyIGZyb20gZHBseXIpDQpgYGB7cn0NCiNzdWJzZXQgaW5jbHVkaW5nIG9ubHkgbWFsZXMgc2VlbiBtb2JiaW5nIGF0IGxlYXN0IG9uY2Ugb3IgdGhhdCBnb3QgRVAgZml0bmVzcyBmb3IgRVAgZml0bmVzcyBhbmFseXNlcw0KRVAgPC0gZmlsdGVyKGRhdCwgbnVtYmVyLm9icy53YXMubW9iYmVyPjAgfCBFUC5Ub3QuUC4wLjE1PjApDQoNCiMjI3N1YnNldCBvYnNlcnZhdGlvbnMgZm9yIGNhc2VzIHdpdGggYXQgbGVhc3QgMzAgbWludXRlcyBmb3IgdmljdGltIGFuYWx5c2VzDQpPYnMzME1pbkRhdHN1YiA8LSBmaWx0ZXIoZGF0LCBUb3RhbC50aW1lLm1pbj4zMCkNCg0KIyMjc3Vic2V0IGRhdGEgdG8gaW5jbHVkZSBvbmx5IG1hbGVzIHNlZW4gbW9iYmluZyBtb3JlIHRoYW4gb25lIHRpbWUNCk1vYnMxRGF0c3ViIDwtIGZpbHRlcihkYXQsIG51bWJlci5vYnMud2FzLm1vYmJlcj4xKQ0KDQojIyNzdWJzZXQgb2JzZXJ2YXRpb25zIGZvciBjYXNlcyB3aXRoIGF0IGxlYXN0IDMwIG1pbnV0ZXMgZm9yIGZlbWFsZSB2aWN0aW0gYW5hbHlzZXMNCk9iczMwTWluRGF0c3ViX0YgPC0gZmlsdGVyKGRhdF9GLCBUb3RhbC50aW1lLm1pbj49MzApDQpgYGANCg0KIyMjIENoZWNrIGRpc3RyaWJ1dGlvbnMNCmBgYHtyfSAgDQojd2l0aChkYXQsIGhpc3QobnVtYmVyLm9icy53YXMubW9iYmVyKSkNCiN3aXRoKGRhdCwgaGlzdChudW1iZXIudmljdGltcykpDQojd2l0aChkYXQsIGhpc3QoTnVtYmVyLm9ic2VydmF0aW9ucy52aWN0aW0ubW9iYmVkKSkNCiN3aXRoKGRhdCwgaGlzdChFUC5Ub3QuUC4wLjE1KSkNCiN3aXRoKGRhdCwgaGlzdChYMXN0LmVnZy5kYXRlKSkNCiN3aXRoKGRhdCwgaGlzdChKdWxpYW4uY2FwdHVyZS5kYXRlKSkNCiN3aXRoKGRhdCwgaGlzdChOLkVQLmNoaWNrLmhvbWUuMC4xNSkpDQojd2l0aChkYXQsIGhpc3QoV1AuVG90LlAuMC4xNS5mbGVkZ2UpKQ0KYGBgDQoNCg0KIyBBKSBSZXBlYXRhYmlsaXR5IG9mIGJlaGF2aW9ycyByZWxhdGVkIHRvIG1vYnMgZm9yIG1hbGVzIHdobyByZXR1cm5lZCBpbiBtdWx0aXBsZSB5ZWFycw0KDQpXZSB1c2UgdGhlIHJwclIgcGFja2FnZSB3aWNoIHJ1bnMgcmVwZWF0YWJpbGl0eSBhbmFseXNpcyBvbiBkaWZmZXJlbnQgZGlzdHJpYnV0aW9ucyBhbmQgd2hpY2ggYWxsb3dzIHlvdSB0byBmaXQgY292YXJpYXRlcyAoZS5nLiB0b3RhbCBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zKS4gQ29uZmlkZW5jZSBpbnRlcnZhbHMgYXJlIG9idGFpbmVkIGJ5IGJvb3RzdHJhcC4NCg0KVEhFU0UgUFJPRFVDRSBFUlJPUlMgKFNJTkdVTEFSIEZJVCkgSU4gUjMuNSBhbmQgbGF0ZXIgQlVUIE5PVCBJTiBSMy4zDQpBbHNvLCBhbGwgbW9iYmVyIHJlcGVhdGFiaWxpdGllcyB3ZXJlIHRyaWVkIHdpdGggYSBkYXRhc2V0IHJlc3RyaWN0ZWQgdG8gbWF0ZWQgbWFsZXMgb25seSwgYnV0IHRoaXMgcmVtb3ZlcyBhIGxhcmdlIG51bWJlciBvZiByZXBlYXQgbWFsZXMgYXMgd2VsbCBhcyBiaXJkcyBzZWVuIGluIG1vYnMgYW5kIG5vdCBtYXRlZCAoaS5lLiBhbW9uZyBpbmRpdmlkdWFsIHZhcmlhbmNlKS4gUmVzdWx0cyBjaGFuZ2UgYSBsb3QsIGJ1dCBzZWVtIGxlc3Mgcm9idXN0IGJlY2F1c2Ugb2YgdGhlIGVsaW1pbmF0aW9uIG9mIGEgbGFyZ2UgbnVtYmVyIG9mIHJldHVybmluZyBpbmRpdmlkdWFscy4gQXMgc3VjaCwgdGhlIGZpbmFsIGFuYWx5c2lzIGluY2x1ZGVzIGFsbCBtYWxlcyBvYnNlcnZlZCBtb3JlIHRoYW4gb25jZSBvbiBzaXRlIChub3QgaW5jbHVkaW5nIGNhcHR1cmUpLg0KDQojIyAxKSBSZXBlYXRhYmlsaXR5IG9mIHRoZSBudW1iZXIgb2YgbW9icyBhbiBpbmRpdmlkdWFsIHBhcnRpY2lwYXRlZCBpbi4gKHBvaXNzb24gZGlzdHJpYnV0aW9uKSAoaW5jbHVkZXMgemVyb3MpDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KbW9iTnJlcCA8LSB3aXRoKGRhdCwgcnB0UG9pc3NvbihudW1iZXIub2JzLndhcy5tb2JiZXIgfiAoMXxCYW5kLk51bWJlciksIGdybmFtZT1jKCJCYW5kLk51bWJlciIpLCBkYXQsIG5ib290PTEwMDAsIG5wZXJtdXQ9MCkpDQptb2JOcmVwDQpgYGANCg0KIyMgMikgUmVwZWF0YWJpbGl0eSBvZiB0aGUgbnVtYmVyIG9mIG1vYiB2aWN0aW1zLiAocG9pc3NvbikNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KTlZpY3RpbXNSZXAgPC0gd2l0aChkYXQsIHJwdFBvaXNzb24obnVtYmVyLnZpY3RpbXMgfiAoMXxCYW5kLk51bWJlciksIGdybmFtZT1jKCJCYW5kLk51bWJlciIpLCBkYXQsIG5ib290PTEwMDAsIG5wZXJtdXQ9MCkpDQpOVmljdGltc1JlcA0KYGBgDQoNCg0KDQoNCg0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCkZvciBhbmFseXNlcyB0aGF0IGZvY3VzIG9uIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtYWxlIHRyYWl0cyBhbmQgYmVoYXZpb3JzIG9yIGZpdG5lc3MgbWVhc3VyZXM6DQpBbGwgbWFsZSB0cmFpdHMgYXJlIHN0YW5kYXJkaXplZCB2YXJpYWJsZXMgKGkuZS4gbWVhbj0wLCBzZD0xKS4gT3RoZXIgdmFyaWFibGVzIGxpa2UgZGF0ZSwgbnVtYmVyIG9mIG1vYnMgYXR0ZW5kZWQsIG51bWJlciBvZiB2aWN0aW1zLCBldGMuLi4gYXJlIG5vdCBzdGFuZGFyZGl6ZWQgYXMgdGhlIGdvYWwgd2FzIG5vdCBuZWNlc3NhcmlseSB0byBsb29rIGF0IHNlbGVjdGlvbiBncmFkaWVudHMgcGVyIHNlLg0KDQpNdWx0aXBsZSByZWdyZXNzaW9ucyBpbmNsdWRlZCBtYWxlIElEIGFzIGEgcmFuZG9tIGVmZmVjdCAoc2luY2Ugc29tZSBtYWxlcyByZXR1cm4pIGFuZCB5ZWFyIGFzIGEgcmFuZG9tIGVmZmVjdCAoc2luY2UgeWVhcnMgbWF5IGRpZmZlciBpbiB0aGUgb2NjdXJyZW5jZSBhbmQgaW50ZW5zaXR5IG9mIG1vYnMpLiBIb3dldmVyIGluIHNvbWUgY2FzZXMgcmFuZG9tIGVmZmVjdHMgY29udHJpYnV0ZWQgbGl0dGxlIHRvIHRoZSBvdmVyYWxsIG1vZGVsIGFuZCBjb3VsZCBjYXVzZSBzaW5ndWxhcml0aWVzIGluIHRoZSBtb2RlbHMgKHN1Z2dlc3RpdmUgb2Ygb3ZlcnBhcmFtZXRlcml6YXRpb24pLiBXZSB0aGVyZWZvcmUgY29tcGFyZWQgbW9kZWxzIHdpdGggYm90aCByYW5kb20gZWZmZWN0cywgd2l0aCBhIHNpbmdsZSByYW5kb20gZWZmZWN0LCBhbmQgd2l0aCBubyByYW5kb20gZWZmZWN0cyBhbmQgdXNlZCB0aGUgbW9kZWwgd2l0aCB0aGUgbG93ZXN0IEFJQyAoaW4gYWxsIGNhc2VzIGRlbHRhLUFJQz4yKSBhcyBzdWdnZXN0ZWQgYnkgWnV1ciBldCBhbCAyMDA5LiBXZSB1c2UgdGhpcyBzaW1wbGlmaWVkIG1vZGVsIGluIGVhY2ggYW5hbHlzaXMgYXMgdGhlIGZpbmFsIG1vZGVsLiBJbiB0aGUgbW9kZWwgb3V0cHV0LCB5b3Ugd2lsbCBmaW5kIHRoZSBBSUMgb2YgZWFjaCBtb2RlbCBhdCB0aGUgYm90dG9tIGFuZCB0aGUgcmVzdWx0cyBwcmludGVkIGFyZSBvbmx5IGZvciB0aGUgYmVzdCBtb2RlbC4NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQoNCg0KIyBCKSBNT0JCRVIgUEVSU1BFQ1RJVkUNCkRvIHBsdW1hZ2UgYW5kIG1vcnBob2xvZ3kgcmVsYXRlIHRvIG1vYmJpbmcgYmVoYXZpb3IgYW5kIGZpdG5lc3M/IA0KDQoNCiMgMykgRG9lcyBwbHVtYWdlIGNvbG9yIG9mIGEgbW9iYmVyIHJlbGF0ZSB0byBoaXMgbW9iYmluZyBiZWhhdmlvcj8NCg0KIyMgMykgRG9lcyBtYWxlIHBsdW1hZ2UgcmVsYXRlIHRvIHRoZSBudW1iZXIgb2YgdmljaXRpbXMgaGUgbW9icz8gW0ZpZyAyYjsgVEFCTEUgUzJdDQpgYGB7ciwgd2FybmluZz1UUlVFLCBtZXNzYWdlPVRSVUV9DQpOVmljdGltc1BsdW1hZ2UgPC0gd2l0aChkYXQsIGdsbWVyKG51bWJlci52aWN0aW1zIH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uICArICgxfFllYXIpICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCnN1bW1hcnkoTlZpY3RpbXNQbHVtYWdlKQ0KYW5vdmEoTlZpY3RpbXNQbHVtYWdlKQ0KI2NoZWNrIHJlc2lkdWFsIGRpc3RyaWJ1dGlvbg0KI3Fxbm9ybShyZXNpZHVhbHMoTlZpY3RpbXNQbHVtYWdlKSkNCiNxcWxpbmUocmVzaWR1YWxzKE5WaWN0aW1zUGx1bWFnZSkpDQoNCiNyZW1vdmUgcmFuZG9tIGVmZmVjdHMNCk5WaWN0aW1zUGx1bWFnZTEgPC0gd2l0aChkYXQsIGdsbWVyKG51bWJlci52aWN0aW1zIH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uICArICgxfEJhbmQuTnVtYmVyKSwgZmFtaWx5ID0gcG9pc3NvbikpDQoNCk5WaWN0aW1zUGx1bWFnZTIgPC0gd2l0aChkYXQsIGdsbWVyKG51bWJlci52aWN0aW1zIH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uICArICgxfFllYXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCg0KTlZpY3RpbXNQbHVtYWdlMyA8LSB3aXRoKGRhdCwgZ2xtKG51bWJlci52aWN0aW1zIH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uLCBmYW1pbHkgPSBwb2lzc29uKSkNCg0KI2NvbXBhcmUgQUlDIG9mIG1vZGVscyB3aXRoIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2YgcmFuZG9tIGVmZmVjdHMNCkFJQyhOVmljdGltc1BsdW1hZ2UpDQpBSUMoTlZpY3RpbXNQbHVtYWdlMSkNCkFJQyhOVmljdGltc1BsdW1hZ2UyKQ0KQUlDKE5WaWN0aW1zUGx1bWFnZTMpDQoNCiN0ZXN0IGZvciBvdmVyZGlzcGVyc2lvbiBvZiBwb2lzc29uIG1vZGVscw0KZGlzcGVyc2lvbl9nbG1lcihOVmljdGltc1BsdW1hZ2UpDQpvdmVyZGlzcF9mdW4oTlZpY3RpbXNQbHVtYWdlKQ0KYGBgDQoNCg0KDQoNCiMgNCkgQXJlIHRoZSBudW1iZXIgb2YgdGltZXMgYSBiaXJkIHdhcyBzZWVuIG1vYmluZyBkZXBlbmQgb24gdGhpbmdzIGxpa2UgaG93IHByZXNlbnQgdGhleSB3ZXJlIG9uIHRoZSBzaXRlPw0KDQojIyA0YSkgRG8gbnVtYmVyIG9mIHZpY3RpbXMgaW5jcmVhc2Ugd2l0aCBudW1iZXIgb2YgbW9icz8gQW5hbHlzaXMgc2hvd24gaW5jbHVkZXMgYmlyZHMgc2VlbiBldmVuIGlmIG5vdCBzZWVuIG1vYmJpbmcuDQpgYGB7ciwgd2FybmluZz1UUlVFLCBtZXNzYWdlPVRSVUV9DQojU3BlYXJtYW4gYW5hbHlzaXMgd2FzIHVzZWQgaW4gdGhlIG1hbnVzY3JpcHQgYXMgdGhlIHJobyB2YWx1ZSBpcyBtb3JlIGludHVpdGl2ZSB0aGFuIGVzdGltYXRlcyBmcm9tIHRoZSBHTE1NOyBhbGwgYW5hbHlzZXMgc2hvdyB0aGUgc2FtZSBwYXR0ZXJuLCB0aG91Z2guDQp3aXRoKGRhdCwgY29yLnRlc3QobnVtYmVyLnZpY3RpbXMsIG51bWJlci5vYnMud2FzLm1vYmJlciwgbWV0aG9kID0gYygic3BlYXJtYW4iKSkpIA0KYGBgDQoNCiMjIDRiKSBEbyBudW1iZXIgb2YgdmljdGltcyBpbmNyZWFzZSB3aXRoIG51bWJlciBvZiBtb2JzPyBBbmFseXNpcyBvbmx5IGluY2x1ZGluZyBiaXJkcyBzZWVuIG1vYmJpbmcgYXQgbGVhc3Qgb25jZS4NCmBgYHtyLCB3YXJuaW5nPVRSVUUsIG1lc3NhZ2U9VFJVRX0NCiNTcGVhcm1hbiBhbmFseXNpcyB3YXMgdXNlZCBpbiB0aGUgbWFudXNjcmlwdCBhcyB0aGUgcmhvIHZhbHVlIGlzIG1vcmUgaW50dWl0aXZlIHRoYW4gZXN0aW1hdGVzIGZyb20gdGhlIEdMTU07IGFsbCBhbmFseXNlcyBzaG93IHRoZSBzYW1lIHBhdHRlcm4sIHRob3VnaC4NCndpdGgoTW9iczFEYXRzdWIsIGNvci50ZXN0KG51bWJlci52aWN0aW1zLCBudW1iZXIub2JzLndhcy5tb2JiZXIsIG1ldGhvZCA9IGMoInNwZWFybWFuIikpKQ0KYGBgDQoNCiMjIDRjKSBEb2VzIG5lc3RpbmcgZGF0ZSBpbmZsdWVuY2UgbW9iIG9ic2VydmF0aW9ucyAtIG1heWJlIGJlY2F1c2UgYmlyZHMgb25seSBtb2IgYWZ0ZXIgdGhleSBnZXQgdGhlaXIgb3duIG5lc3Q/DQpgYGB7ciwgd2FybmluZz1UUlVFLCBtZXNzYWdlPVRSVUV9DQojU3BlYXJtYW4gYW5hbHlzaXMgd2FzIHVzZWQgaW4gdGhlIG1hbnVzY3JpcHQgYXMgdGhlIHJobyB2YWx1ZSBpcyBtb3JlIGludHVpdGl2ZSB0aGFuIGVzdGltYXRlcyBmcm9tIHRoZSBHTE1NOyBhbGwgYW5hbHlzZXMgc2hvdyB0aGUgc2FtZSBwYXR0ZXJuLCB0aG91Z2guDQp3aXRoKGRhdCwgY29yLnRlc3QobnVtYmVyLm9icy53YXMubW9iYmVyLCBYMXN0LmVnZy5kYXRlLCBtZXRob2QgPSBjKCJzcGVhcm1hbiIpKSkNCmBgYA0KDQojIyA0ZCkgRG9lcyBudW1iZXIgb2YgbW9iIHZpY3RpbXMgcHJlZGljdCBFUCBjaGlja3MgKDAuMTUgbGV2ZWwpDQpgYGB7ciwgd2FybmluZz1UUlVFLCBtZXNzYWdlPVRSVUUsIHJlc3VsdHM9ImhpZGUifQ0KI1NwZWFybWFuIGFuYWx5c2lzIHdhcyB1c2VkIGluIHRoZSBtYW51c2NyaXB0IGFzIHRoZSByaG8gdmFsdWUgaXMgbW9yZSBpbnR1aXRpdmUgdGhhbiBlc3RpbWF0ZXMgZnJvbSB0aGUgR0xNTTsgYWxsIGFuYWx5c2VzIHNob3cgdGhlIHNhbWUgcGF0dGVybiwgdGhvdWdoLg0Kd2l0aChkYXQsIGNvci50ZXN0KEVQLlRvdC5QLjAuMTUsIG51bWJlci52aWN0aW1zLCBtZXRob2QgPSBjKCJzcGVhcm1hbiIpKSkNCmBgYA0KDQoNCg0KIyA1KSBEb2VzIHBsdW1hZ2UgcHJlZGljdCBFUCBmaXRuZXNzICgjRVAgY2hpY2tzIHNpcmVkOyAjRVAgbmVzdHMpDQoNCiMjIDUpIERvZXMgcGx1bWFnZSBwcmVkaWN0IHRoZSBudW1iZXIgb2YgRVAgY2hpY2tzIChwYXRlcm5pdHkgYXNzaWdubWVudCBhdCAwLjE1IGxldmVsKSAgW0ZpZzJhOyBUQUJMRSBTMV0NCmBgYHtyLCB3YXJuaW5nPVRSVUUsIG1lc3NhZ2U9VFJVRX0NCkVQQ2hpY2tzMTUuUGx1bWFnZSA8LSB3aXRoKGRhdCwgZ2xtZXIoRVAuVG90LlAuMC4xNSB+ICBCZWFrU2l6ZS5QQzEgKyBCb2R5U2l6ZS5QQzIgKyBib2R5LmNvbG9yLm5vLndpbmcgKyBwZXJjZW50Lm5yICsgcnVtcCArIHdwLnouYXZlcmFnZSArIENvbmRpdGlvbiArICgxfFllYXIpICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCiNzdW1tYXJ5KEVQQ2hpY2tzMTUuUGx1bWFnZSkNCiNhbm92YShFUENoaWNrczE1LlBsdW1hZ2UpDQojcXFub3JtKHJlc2lkdWFscyhFUENoaWNrczE1LlBsdW1hZ2UpKQ0KI3FxbGluZShyZXNpZHVhbHMoRVBDaGlja3MxNS5QbHVtYWdlKSkNCg0KI01vZGVsIGRvZXMgbm90IGNvbnZlcmdlDQoNCiN3aXRob3V0IHllYXIgLSBiZXN0IG1vZGVsDQpFUENoaWNrczE1LlBsdW1hZ2VBIDwtIHdpdGgoZGF0LCBnbG1lcihFUC5Ub3QuUC4wLjE1IH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uICArICgxfEJhbmQuTnVtYmVyKSwgZmFtaWx5ID0gcG9pc3NvbikpDQpzdW1tYXJ5KEVQQ2hpY2tzMTUuUGx1bWFnZUEpDQphbm92YShFUENoaWNrczE1LlBsdW1hZ2VBKQ0KI3Fxbm9ybShyZXNpZHVhbHMoRVBDaGlja3MxNS5QbHVtYWdlQSkpDQojcXFsaW5lKHJlc2lkdWFscyhFUENoaWNrczE1LlBsdW1hZ2VBKSkNCg0KI3dpdGhvdXQgSUQNCkVQQ2hpY2tzMTUuUGx1bWFnZUIgPC0gd2l0aChkYXQsIGdsbWVyKEVQLlRvdC5QLjAuMTUgfiAgQmVha1NpemUuUEMxICsgQm9keVNpemUuUEMyICsgYm9keS5jb2xvci5uby53aW5nICsgcGVyY2VudC5uciArIHJ1bXAgKyB3cC56LmF2ZXJhZ2UgKyBDb25kaXRpb24gICsgKDF8WWVhciksIGZhbWlseSA9IHBvaXNzb24pKQ0KDQojTm8gcmFuZG9tIGVmZmVjdHMNCkVQQ2hpY2tzMTUuUGx1bWFnZUMgPC0gd2l0aChkYXQsIGdsbShFUC5Ub3QuUC4wLjE1IH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uLCBmYW1pbHkgPSBwb2lzc29uKSkNCg0KQUlDKEVQQ2hpY2tzMTUuUGx1bWFnZSkNCkFJQyhFUENoaWNrczE1LlBsdW1hZ2VBKQ0KQUlDKEVQQ2hpY2tzMTUuUGx1bWFnZUIpDQpBSUMoRVBDaGlja3MxNS5QbHVtYWdlQykNCg0KI3Rlc3QgZm9yIG92ZXJkaXNwZXJzaW9uIG9mIHBvaXNzb24gbW9kZWxzDQpkaXNwZXJzaW9uX2dsbWVyKEVQQ2hpY2tzMTUuUGx1bWFnZUEpDQpvdmVyZGlzcF9mdW4oRVBDaGlja3MxNS5QbHVtYWdlQSkNCmBgYA0KDQoNCiMgNikgRG9lcyBwbHVtYWdlIHByZWRpY3QgRVAgZml0bmVzcyBhYm92ZSBpdHMgZWZmZWN0cyBvbiBtb2JiaW5nLiBTbyBhZGQgbW9iYmluZyBlZmZvcnQgYXMgY292YXJpYXRlDQpjb3ZhcmlhdGVzIGFyZSBudW1iZXIgb2JzIGZvciB0b3RhbCBFUFkgYW5kIG51bWJlciB2aWN0aW1zIGZvciB0b3RhbCBFUE5lc3RzIw0KDQojIyA2KSBEb2VzIHBsdW1hZ2UgaW1wYWN0IEVQIENoaWNrcyAocGF0ZXJuaXR5IGFzc2lnbmVtZW50IGF0IDAuMTUgbGV2ZWwpIHdoZW4gY29udHJvbGxpbmcgZm9yIGVmZm9ydD8gW0ZpZyAyYzsgVEFCTEUgUzNdDQpgYGB7ciwgd2FybmluZz1UUlVFLCBtZXNzYWdlPVRSVUV9DQpFUENoaWNrczE1LlBsdW1hZ2UuRWZmb3J0IDwtIHdpdGgoZGF0LCBnbG1lcihFUC5Ub3QuUC4wLjE1IH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uICArIG51bWJlci5vYnMud2FzLm1vYmJlciArICgxfFllYXIpICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCiNzdW1tYXJ5KEVQQ2hpY2tzMTUuUGx1bWFnZS5FZmZvcnQpDQojYW5vdmEoRVBDaGlja3MxNS5QbHVtYWdlLkVmZm9ydCkNCiNxcW5vcm0ocmVzaWR1YWxzKEVQQ2hpY2tzMTUuUGx1bWFnZS5FZmZvcnQpKQ0KI3FxbGluZShyZXNpZHVhbHMoRVBDaGlja3MxNS5QbHVtYWdlLkVmZm9ydCkpDQoNCg0KRVBDaGlja3MxNS5QbHVtYWdlLkVmZm9ydDEgPC0gd2l0aChkYXQsIGdsbWVyKEVQLlRvdC5QLjAuMTUgfiAgQmVha1NpemUuUEMxICsgQm9keVNpemUuUEMyICsgYm9keS5jb2xvci5uby53aW5nICsgcGVyY2VudC5uciArIHJ1bXAgKyB3cC56LmF2ZXJhZ2UgKyBDb25kaXRpb24gICsgbnVtYmVyLm9icy53YXMubW9iYmVyICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCnN1bW1hcnkoRVBDaGlja3MxNS5QbHVtYWdlLkVmZm9ydDEpDQphbm92YShFUENoaWNrczE1LlBsdW1hZ2UuRWZmb3J0MSkNCiNxcW5vcm0ocmVzaWR1YWxzKEVQQ2hpY2tzMTUuUGx1bWFnZS5FZmZvcnQxKSkNCiNxcWxpbmUocmVzaWR1YWxzKEVQQ2hpY2tzMTUuUGx1bWFnZS5FZmZvcnQxKSkNCg0KRVBDaGlja3MxNS5QbHVtYWdlLkVmZm9ydDIgPC0gd2l0aChkYXQsIGdsbWVyKEVQLlRvdC5QLjAuMTUgfiAgQmVha1NpemUuUEMxICsgQm9keVNpemUuUEMyICsgYm9keS5jb2xvci5uby53aW5nICsgcGVyY2VudC5uciArIHJ1bXAgKyB3cC56LmF2ZXJhZ2UgKyBDb25kaXRpb24gICsgbnVtYmVyLm9icy53YXMubW9iYmVyICsgKDF8WWVhciksIGZhbWlseSA9IHBvaXNzb24pKQ0KDQpFUENoaWNrczE1LlBsdW1hZ2UuRWZmb3J0MyA8LSB3aXRoKGRhdCwgZ2xtKEVQLlRvdC5QLjAuMTUgfiAgQmVha1NpemUuUEMxICsgQm9keVNpemUuUEMyICsgYm9keS5jb2xvci5uby53aW5nICsgcGVyY2VudC5uciArIHJ1bXAgKyB3cC56LmF2ZXJhZ2UgKyBDb25kaXRpb24gICsgbnVtYmVyLm9icy53YXMubW9iYmVyLCBmYW1pbHkgPSBwb2lzc29uKSkNCg0KI1dpdGhvdXQgeWVhciBpcyBiZXN0IG1vZGVsDQoNCkFJQyhFUENoaWNrczE1LlBsdW1hZ2UuRWZmb3J0KQ0KQUlDKEVQQ2hpY2tzMTUuUGx1bWFnZS5FZmZvcnQxKQ0KQUlDKEVQQ2hpY2tzMTUuUGx1bWFnZS5FZmZvcnQyKQ0KQUlDKEVQQ2hpY2tzMTUuUGx1bWFnZS5FZmZvcnQzKQ0KDQojdGVzdCBmb3Igb3ZlcmRpc3BlcnNpb24gb2YgcG9pc3NvbiBtb2RlbHMNCmRpc3BlcnNpb25fZ2xtZXIoRVBDaGlja3MxNS5QbHVtYWdlLkVmZm9ydDEpDQpvdmVyZGlzcF9mdW4oRVBDaGlja3MxNS5QbHVtYWdlLkVmZm9ydDEpDQpgYGANCg0KDQoNCg0KIyA3KSBBcmUgdGhlcmUgY29zdHMgb2YgbW9iYmluZyB2aWEgdHJhZGUtb2ZmcyBiZXR3ZWVuIG1vYmJpbmcgZWZmb3J0IGFuZCBpbmNyZWFzZWQgZXh0cmEtcGFpciB5b3VuZyBhdCBob21lPw0KDQojIyMjIDcpIEFyZSB0aGVyZSB0cmFkZS1vZmZzIGJldHdlZW4gbnVtYmVyIG9mIG1vYnMgYW5kIHByb3BvcnRpb24gb2YgRVAgY2hpY2tzIGF0IGhvbWUgKHBhdGVybml0eSBhc3NpZ25lbWVudCBhdCAwLjE1KT8gDQojIyNVc2luZyBwcm9wb3J0aW9uIG9mIEVQIGNoaWNrcyBpbiBvd24gbmVzdCB3aXRoICJjYmluZChOLkVQLCBOLldQKSIgdG8gYWNjb3VudCBmb3IgZGlmZmVyZW5jZXMgaW4gbnVtYmVycyBvZiBjaGlja3Mgb2JzZXJ2ZWQgcGVyIG5lc3Qgc2luY2UgYSBsYXJnZXIgc2FtcGxlIGdpdmVzIGEgbW9yZSByZWxpYWJsZSBwcm9wb3J0aW9uIGdpdmVzIHRoZSBzYW1lIHJlc3VsdC4NCg0KYGBge3IsIHdhcm5pbmc9VFJVRSwgbWVzc2FnZT1UUlVFfQ0KTk1vYnMuTmVzdEVQQ2hpY2tzMTUgPC0gd2l0aChkYXQsIGdsbWVyKGNiaW5kKE4uRVAuY2hpY2suaG9tZS4wLjE1LCB0b3RhbC5nZW5vdHlwZWQtTi5FUC5jaGljay5ob21lLjAuMTUpIH4gbnVtYmVyLm9icy53YXMubW9iYmVyICsgKDF8WWVhcikgKyAoMXxCYW5kLk51bWJlciksIGZhbWlseSA9IGJpbm9taWFsKSkNCiNzdW1tYXJ5KE5Nb2JzLk5lc3RFUENoaWNrczE1KQ0KI2Fub3ZhKE5Nb2JzLk5lc3RFUENoaWNrczE1KQ0KI3Fxbm9ybShyZXNpZHVhbHMoTk1vYnMuTmVzdEVQQ2hpY2tzMTUpKQ0KI3FxbGluZShyZXNpZHVhbHMoTk1vYnMuTmVzdEVQQ2hpY2tzMTUpKQ0KDQojcmVtb3ZlIHJhbmRvbSBlZmZlY3RzDQpOTW9icy5OZXN0RVBDaGlja3MxNWEgPC0gd2l0aChkYXQsIGdsbWVyKGNiaW5kKE4uRVAuY2hpY2suaG9tZS4wLjE1LCB0b3RhbC5nZW5vdHlwZWQtTi5FUC5jaGljay5ob21lLjAuMTUpIH4gbnVtYmVyLm9icy53YXMubW9iYmVyICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBiaW5vbWlhbCkpDQpzdW1tYXJ5KE5Nb2JzLk5lc3RFUENoaWNrczE1YSkNCmFub3ZhKE5Nb2JzLk5lc3RFUENoaWNrczE1YSkNCg0KTk1vYnMuTmVzdEVQQ2hpY2tzMTViIDwtIHdpdGgoZGF0LCBnbG1lcihjYmluZChOLkVQLmNoaWNrLmhvbWUuMC4xNSwgdG90YWwuZ2Vub3R5cGVkLU4uRVAuY2hpY2suaG9tZS4wLjE1KSB+IG51bWJlci5vYnMud2FzLm1vYmJlciArICgxfFllYXIpLCBmYW1pbHkgPSBiaW5vbWlhbCkpDQoNCk5Nb2JzLk5lc3RFUENoaWNrczE1YyA8LSB3aXRoKGRhdCwgZ2xtKGNiaW5kKE4uRVAuY2hpY2suaG9tZS4wLjE1LCB0b3RhbC5nZW5vdHlwZWQtTi5FUC5jaGljay5ob21lLjAuMTUpIH4gbnVtYmVyLm9icy53YXMubW9iYmVyLCBmYW1pbHkgPSBiaW5vbWlhbCkpDQoNCiNxcW5vcm0ocmVzaWR1YWxzKE5Nb2JzLk5lc3RFUENoaWNrczE1YykpDQojcXFsaW5lKHJlc2lkdWFscyhOTW9icy5OZXN0RVBDaGlja3MxNWMpKQ0KDQoNCiNtb2RlbCB3aXRoIG9ubHkgbWFsZSBJRCBpcyBiZXN0IGFuZCBubyBsb25nZXIgaGFzIGEgc2luZ3VsYXJpdHkNCg0KQUlDKE5Nb2JzLk5lc3RFUENoaWNrczE1KQ0KQUlDKE5Nb2JzLk5lc3RFUENoaWNrczE1YSkNCkFJQyhOTW9icy5OZXN0RVBDaGlja3MxNWIpDQpBSUMoTk1vYnMuTmVzdEVQQ2hpY2tzMTVjKQ0KYGBgDQoNCg0KIyA4KSBBcmUgdGhlcmUgY29zdHMgb2YgbW9iYmluZyB2aWEgdHJhZGUtb2ZmcyBiZXR3ZWVuIG1vYmJpbmcgZWZmb3J0IGFuZCB0aGUgbnVtYmVyIG9mIHdpdGhpbiBwYWlyIGNoaWNrcyBmbGVkZ2VkIGF0IGhvbWU/DQpGb2N1c2VkIG9uIG51bWJlciBmbGVkZ2VkIGFzIHRoZSBjb3N0IG1heSBub3QganVzdCBiZSBpbiB0ZXJtcyBvZiBwcm9wb3J0aW9uIHNpcmVkLCBidXQgYWxzbyBvdGhlciBmb3JtcyBvZiBwYXJlbnRhbCBjYXJlLiBEaWQgbm90IGFjY291bnQgZm9yIG51bWJlciBvZiBjaGlja3MgaW4gbmVzdCAtIGJ1dCB3ZSBkb24ndCB3YW50IGEgcHJvcG9ydGlvbiBvZiBjaGlja3MgdGhhdCBhcmUgd2l0aGluIHBhaXIgKGFuYWx5c2lzIGFib3ZlKQ0KDQojIyA4KSBJcyB0aGVyZSBhIHRyYWRlLW9mZiBiZXR3ZWVuIG1vYmJpbmcgZWZmb3J0IGFuZCBudW1iZXIgb2Ygd2l0aGluIHBhaXIgY2hpY2tzIHRoYXQgYWN0dWFsbHkgZmxlZGdlZCAocGF0ZXJuaXR5IGFzc2lnbmVtZW50IGF0IDAuMTUpDQpgYGB7ciwgd2FybmluZz1UUlVFLCBtZXNzYWdlPVRSVUV9DQpOTW9icy5OdW1iZXJPd25XUENoaWNrczE1IDwtIHdpdGgoZGF0LCBnbG1lcihXUC5Ub3QuUC4wLjE1LmZsZWRnZSB+IG51bWJlci5vYnMud2FzLm1vYmJlciArICgxfFllYXIpICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCiNzdW1tYXJ5KE5Nb2JzLk51bWJlck93bldQQ2hpY2tzMTUpDQojYW5vdmEoTk1vYnMuTnVtYmVyT3duV1BDaGlja3MxNSkNCiNxcW5vcm0ocmVzaWR1YWxzKE5Nb2JzLk51bWJlck93bldQQ2hpY2tzMTUpKQ0KI3FxbGluZShyZXNpZHVhbHMoTk1vYnMuTnVtYmVyT3duV1BDaGlja3MxNSkpDQoNCiNyZW1vdmUgcmFuZG9tIGVmZmVjdHMNCk5Nb2JzLk51bWJlck93bldQQ2hpY2tzMTVhIDwtIHdpdGgoZGF0LCBnbG1lcihXUC5Ub3QuUC4wLjE1LmZsZWRnZSB+IG51bWJlci5vYnMud2FzLm1vYmJlciArICgxfEJhbmQuTnVtYmVyKSwgZmFtaWx5ID0gcG9pc3NvbikpDQpzdW1tYXJ5KE5Nb2JzLk51bWJlck93bldQQ2hpY2tzMTVhKQ0KYW5vdmEoTk1vYnMuTnVtYmVyT3duV1BDaGlja3MxNWEpDQojcXFub3JtKHJlc2lkdWFscyhOTW9icy5OdW1iZXJPd25XUENoaWNrczE1YSkpDQojcXFsaW5lKHJlc2lkdWFscyhOTW9icy5OdW1iZXJPd25XUENoaWNrczE1YSkpDQoNCk5Nb2JzLk51bWJlck93bldQQ2hpY2tzMTViIDwtIHdpdGgoZGF0LCBnbG1lcihXUC5Ub3QuUC4wLjE1LmZsZWRnZSB+IG51bWJlci5vYnMud2FzLm1vYmJlciArICgxfFllYXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCg0KTk1vYnMuTnVtYmVyT3duV1BDaGlja3MxNWMgPC0gd2l0aChkYXQsIGdsbShXUC5Ub3QuUC4wLjE1LmZsZWRnZSB+IG51bWJlci5vYnMud2FzLm1vYmJlciwgZmFtaWx5ID0gcG9pc3NvbikpDQoNCiNtb2RlbCB3aXRob3V0IHllYXIgaXMgYmVzdA0KDQpBSUMoTk1vYnMuTnVtYmVyT3duV1BDaGlja3MxNSkNCkFJQyhOTW9icy5OdW1iZXJPd25XUENoaWNrczE1YSkNCkFJQyhOTW9icy5OdW1iZXJPd25XUENoaWNrczE1YikNCkFJQyhOTW9icy5OdW1iZXJPd25XUENoaWNrczE1YykNCg0KI3Rlc3QgZm9yIG92ZXJkaXNwZXJzaW9uIG9mIHBvaXNzb24gbW9kZWxzDQpkaXNwZXJzaW9uX2dsbWVyKE5Nb2JzLk51bWJlck93bldQQ2hpY2tzMTVhKQ0Kb3ZlcmRpc3BfZnVuKE5Nb2JzLk51bWJlck93bldQQ2hpY2tzMTVhKQ0KYGBgDQoNCg0KIyA5KSBBcmUgbW9iYmVycyBtb3JlIG9mdGVuIG1hdGVkIG9yIHVubWF0ZWQgbWFsZXM/IEluIG90aGVyIHdvcmRzLCBpcyBpdCBhIGNvbXBsaW1lbnQgdG8gd2l0aGluIHBhaXIgZml0bmVzcywgYSBiZXN0IG9mIGEgYmFkIGpvYiwgb3IganVzdCBldmVyeW9uZSBkb2VzIGl0Lg0KDQojIyA5KSBEbyBtYXRlZCB2cyB1bm1hdGVkIG1hbGVzIG1vYiBtb3JlIChudW1iZXIgb2YgdGltZXMgc2VlbiBpbiBtb2IpIEJFTCBVU0VEIEEgRklTSEVSUyBFWEFDVCBURVNUIGluIEpNUA0KYGBge3IsIHdhcm5pbmc9VFJVRSwgbWVzc2FnZT1UUlVFfQ0KI0Zpc2hlcidzIEV4YWN0IHRlc3QgY29uc2lkZXJpbmcgaWYgbWFsZXMgam9pbmVkIGEgbW9iIGF0IGxlYXN0IG9uY2Ugb3IgbmV2ZXIgZm9yIG1hdGVkIGFuZCB1bm1hdGVkIG1hbGVzLiBWYWx1ZXMgZm9yIGVhY2ggY2F0ZWdvcnkgd2VyZSBnYXRoZXJlZCBpbiB0aGUgRXhjZWwgc2hlZXQgYW5kIHRyYW5zY3JpYmVkIGhlcmUuDQpNYXRlZE1vYmJlciA8LSBhcy50YWJsZShyYmluZChjKDE0MCwgNTMpLCBjKDkzLCA5MikpKQ0KZGltbmFtZXMoTWF0ZWRNb2JiZXIpIDwtIGxpc3QoDQogIG1vYmJlciA9IGMoIm1vYmJlciIsICJub3RfbW9iYmVyIiksDQogIG1hdGVkID0gYygibWF0ZWQiLCAidW5tYXRlZCIpDQopDQpNYXRlZE1vYmJlcg0KIyBmaXNoZXIncyBleGFjdCB0ZXN0DQpmaXNoZXIudGVzdChNYXRlZE1vYmJlcikNCg0KDQojY291bGQgcnVuIG1vZGVscyB0aGF0IGFjY291bnQgZm9yIHRpbWUgdGhlIGJpcmQgY291bGQgaGF2ZSBiZWVuIHNlZW4gaWYgbWF0ZWQgbWFsZXMgd2VyZSBhcm91bmQgbG9uZ2VyIGFuZCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIHdpdGhvdXQgdGFraW5nIGludG8gYWNjb3VudCB0aGUgdGltZSB0aGV5IHdlcmUgb2JzZXJ2YWJsZSAtIG9yIG1heWJlIGV2ZW4gbW9yZSBzdHJpa2luZy4gVGhlIGZ1bGwgbW9kZWwgaGFzIGEgc2luZ3VsYXIgZml0LCBidXQgcmVtb3ZpbmcgcmFuZG9tIGVmZmVjdHMgc29sdmVzIHRoaXMuDQpOTW9icy5NYXRlZFVubWF0ZWRBIDwtIHdpdGgoZGF0LCBsbWVyKG51bWJlci5vYnMud2FzLm1vYmJlciB+IE1hdGUudnMuVW5tYXRlICsgSnVsaWFuLmNhcHR1cmUuZGF0ZSArICgxfEJhbmQuTnVtYmVyKSkpDQpzdW1tYXJ5KE5Nb2JzLk1hdGVkVW5tYXRlZEEpDQphbm92YShOTW9icy5NYXRlZFVubWF0ZWRBKQ0KI3Fxbm9ybShyZXNpZHVhbHMoTk1vYnMuTWF0ZWRVbm1hdGVkQSkpDQojcXFsaW5lKHJlc2lkdWFscyhOTW9icy5NYXRlZFVubWF0ZWRBKSkNCnBsb3RfbW9kZWwoTk1vYnMuTWF0ZWRVbm1hdGVkQSwgdHlwZSA9ICJwcmVkIikNCmBgYA0KDQoNCg0KDQojIEMpIFZJQ1RJTSBQRVJTUEVDVElWRQ0KSXMgcGx1bWFnZSByZWxhdGVkIHRvIGJlaW5nIGEgdmljdGltPw0KDQpXZSByZW1vdmVkIGluZGl2aWR1YWxzIGZvbGxvd2VkIGxlc3MgdGhhbiAzIHRpbWVzIGZvciBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIG9yIDMwbWluIGZvciB0b3RhbCBudW1iZXIgb2YgbW9iYmVycywgYWx0aG91Z2ggdGhpcyBtYXkgbm90IGJlIG5lZWRlZCBpZiB3ZSBhZGQgbnVtYmVyIG9mIG9icyBpbiBhcyBhIGNvdmFyaWF0ZS4NCg0KDQojIDEwKSBEbyBtYWxlIHRyYWl0cyBwcmVkaWN0IGhpcyB2dWxuZXJhYmlsaXR5IHRvIG1vYmJpbmc/DQppbiBtYW55IG9mIHRoZXNlIHdlIHVzZSBzdWJzZXQgZGF0YSBmb3IgYmlyZHMgdGhhdCB3ZXJlIHNlZW4gbW9yZSB0aGFuIDMwbWluIHRvdGFsIChPYnMzME1pbkRhdHN1YikgaW4gdGhlIFRvdGFsLnRpbWUubWluIGNvbHVtbg0KDQojIyAxMCkgSXMgcGx1bWFnZSByZWxhdGVkIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgbW9iYmVycyB0aGF0IGEgbWFsZSBnZXRzPyBbRmlnIDZhOyBUQUJMRSBTNF0NCmBgYHtyLCB3YXJuaW5nPVRSVUUsIG1lc3NhZ2U9VFJVRX0NClRvdE1vYmJlcnMuUGx1bWFnZSA8LSB3aXRoKE9iczMwTWluRGF0c3ViLCBnbG1lcihUb3RhbC5kaWZmZXJlbnQubW9iYmVycyB+ICBCZWFrU2l6ZS5QQzEgKyBCb2R5U2l6ZS5QQzIgKyBib2R5LmNvbG9yLm5vLndpbmcgKyBwZXJjZW50Lm5yICsgcnVtcCArIHdwLnouYXZlcmFnZSArIENvbmRpdGlvbiAgKyAoMXxZZWFyKSArICgxfEJhbmQuTnVtYmVyKSwgZmFtaWx5ID0gcG9pc3NvbikpDQojc3VtbWFyeShUb3RNb2JiZXJzLlBsdW1hZ2UpDQojYW5vdmEoVG90TW9iYmVycy5QbHVtYWdlKQ0KI3Fxbm9ybShyZXNpZHVhbHMoVG90TW9iYmVycy5QbHVtYWdlKSkNCiNxcWxpbmUocmVzaWR1YWxzKFRvdE1vYmJlcnMuUGx1bWFnZSkpDQoNCiNyZW1vdmUgcmFuZG9tIGVmZmVjdHMgZm9yIHNpbmd1bGFyIGZpdC4NClRvdE1vYmJlcnMuUGx1bWFnZTEgPC0gd2l0aChPYnMzME1pbkRhdHN1YiwgZ2xtZXIoVG90YWwuZGlmZmVyZW50Lm1vYmJlcnMgfiAgQmVha1NpemUuUEMxICsgQm9keVNpemUuUEMyICsgYm9keS5jb2xvci5uby53aW5nICsgcGVyY2VudC5uciArIHJ1bXAgKyB3cC56LmF2ZXJhZ2UgKyBDb25kaXRpb24gICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCnN1bW1hcnkoVG90TW9iYmVycy5QbHVtYWdlMSkNCmFub3ZhKFRvdE1vYmJlcnMuUGx1bWFnZTEpDQoNClRvdE1vYmJlcnMuUGx1bWFnZTIgPC0gd2l0aChPYnMzME1pbkRhdHN1YiwgZ2xtZXIoVG90YWwuZGlmZmVyZW50Lm1vYmJlcnMgfiAgQmVha1NpemUuUEMxICsgQm9keVNpemUuUEMyICsgYm9keS5jb2xvci5uby53aW5nICsgcGVyY2VudC5uciArIHJ1bXAgKyB3cC56LmF2ZXJhZ2UgKyBDb25kaXRpb24gICsgKDF8WWVhciksIGZhbWlseSA9IHBvaXNzb24pKQ0KDQpUb3RNb2JiZXJzLlBsdW1hZ2UzIDwtIHdpdGgoT2JzMzBNaW5EYXRzdWIsIGdsbShUb3RhbC5kaWZmZXJlbnQubW9iYmVycyB+ICBCZWFrU2l6ZS5QQzEgKyBCb2R5U2l6ZS5QQzIgKyBib2R5LmNvbG9yLm5vLndpbmcgKyBwZXJjZW50Lm5yICsgcnVtcCArIHdwLnouYXZlcmFnZSArIENvbmRpdGlvbiAsIGZhbWlseSA9IHBvaXNzb24pKQ0Kc3VtbWFyeShUb3RNb2JiZXJzLlBsdW1hZ2UzKQ0KYW5vdmEoVG90TW9iYmVycy5QbHVtYWdlMykNCiNxcW5vcm0ocmVzaWR1YWxzKFRvdE1vYmJlcnMuUGx1bWFnZTMpKQ0KI3FxbGluZShyZXNpZHVhbHMoVG90TW9iYmVycy5QbHVtYWdlMykpDQoNCiNtb2RlbCB3aXRoIG5vIHJhbmRvbSBlZmZlY3RzIGhhcyBiZXN0IEFJQw0KDQpBSUMoVG90TW9iYmVycy5QbHVtYWdlKQ0KQUlDKFRvdE1vYmJlcnMuUGx1bWFnZTEpDQpBSUMoVG90TW9iYmVycy5QbHVtYWdlMikNCkFJQyhUb3RNb2JiZXJzLlBsdW1hZ2UzKQ0KDQojdGVzdCBmb3Igb3ZlcmRpc3BlcnNpb24gb2YgcG9pc3NvbiBtb2RlbHMNCmRpc3BlcnNpb25fZ2xtZXIoVG90TW9iYmVycy5QbHVtYWdlMikgI2NoZWNrIGZvciBnbG1lciB0aGF0IGhhcyB2ZXJ5IGNsb3NlIHRvIHRoZSBzYW1lIEFJQyBhcyB0aGUgYmVzdCBtb2RlbA0Kb3ZlcmRpc3BfZnVuKFRvdE1vYmJlcnMuUGx1bWFnZTIpICNjaGVjayBmb3IgZ2xtZXIgdGhhdCBoYXMgdmVyeSBjbG9zZSB0byB0aGUgc2FtZSBBSUMgYXMgdGhlIGJlc3QgbW9kZWwNCmRpc3BlcnNpb250ZXN0KFRvdE1vYmJlcnMuUGx1bWFnZTMpICNiZXN0IG1vZGVsIGlzIGdsbQ0KYGBgDQoNCg0KIzExKSBEbyBtYWxlIHRyYWl0cyBwcmVkaWN0IGV4dHJhIHBhaXIgcGF0ZXJuaXR5IGluIGhpcyBvd24gbmVzdD8gDQoNCg0KIyMgMTEpIERvZXMgYSBtYWxlJ3MgcGx1bWFnZSBwcmVkaWN0IHRoZSBwcm9wb3J0aW9uIG9mIGV4dHJhIHBhaXIgY2hpY2tzIChwYXRlcm5pdHkgYXNzaWduZW1lbnQgYXQgMC4xNSkgaW4gaGlzIG5lc3Q/IFVzaW5nIGEgY2JpbmQgZnVuY3Rpb24gdG8gbGluayBudW1iZXIgRVAgdnMgbnVtYmVyIFdQIGluIHRoZSBuZXN0IGFzIHRoZSBhY2N1cmFjeSBvZiBlc3RpbWF0ZXMgb2YgZXh0cmEtcGFpciBwYXRlcm5pdHkgZGVwZW5kcyBpbiBwYXJ0IG9uIG51bWJlciBvZiBjaGlja3Mgd2UgY2FuIGdlbm90eXBlLiBbRmlnIDZiOyBUQUJMRSBTNV0NCmBgYHtyLCB3YXJuaW5nPVRSVUUsIG1lc3NhZ2U9VFJVRX0NCk5FUENoaWNrczE1LlBsdW1hZ2UgPC0gd2l0aChkYXQsIGdsbWVyKGNiaW5kKE4uRVAuY2hpY2suaG9tZS4wLjE1LCB0b3RhbC5nZW5vdHlwZWQtTi5FUC5jaGljay5ob21lLjAuMTUpIH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uICArICgxfFllYXIpICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBiaW5vbWlhbCkpDQojc3VtbWFyeShORVBDaGlja3MxNS5QbHVtYWdlKQ0KI2Fub3ZhKE5FUENoaWNrczE1LlBsdW1hZ2UpDQojcXFub3JtKHJlc2lkdWFscyhORVBDaGlja3MxNS5QbHVtYWdlKSkNCiNxcWxpbmUocmVzaWR1YWxzKE5FUENoaWNrczE1LlBsdW1hZ2UpKQ0KDQojc2luZ3VsYXIgZml0LCBzbyByZW1vdmUgcmFuZG9tIGVmZmVjdHMuIE1vZGVsIHdpdGhvdXQgeWVhciBpcyBiZXN0IGZpdCwgYnV0IHN0aWxsIHNpbmd1bGFyLiBNb2RlbCB3aXRoIG5vIHJhbmRvbSBlZmZlY3RzIGRvZXMgbm90IGhhdmUgYSBzaW5ndWxhcml0eSAoYnV0IGlzIG5vdCBsb3dlc3QgQUlDKSAtIGFsbCBtb2RlbHMgZ2l2ZSB0aGUgc2FtZSByZXN1bHQuDQpORVBDaGlja3MxNS5QbHVtYWdlMSA8LSB3aXRoKGRhdCwgZ2xtZXIoY2JpbmQoTi5FUC5jaGljay5ob21lLjAuMTUsIHRvdGFsLmdlbm90eXBlZC1OLkVQLmNoaWNrLmhvbWUuMC4xNSkgfiAgQmVha1NpemUuUEMxICsgQm9keVNpemUuUEMyICsgYm9keS5jb2xvci5uby53aW5nICsgcGVyY2VudC5uciArIHJ1bXAgKyB3cC56LmF2ZXJhZ2UgKyBDb25kaXRpb24gICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBiaW5vbWlhbCkpDQpzdW1tYXJ5KE5FUENoaWNrczE1LlBsdW1hZ2UxKQ0KYW5vdmEoTkVQQ2hpY2tzMTUuUGx1bWFnZTEpDQojcXFub3JtKHJlc2lkdWFscyhORVBDaGlja3MxNS5QbHVtYWdlMSkpDQojcXFsaW5lKHJlc2lkdWFscyhORVBDaGlja3MxNS5QbHVtYWdlMSkpDQoNCk5FUENoaWNrczE1LlBsdW1hZ2UyIDwtIHdpdGgoZGF0LCBnbG1lcihjYmluZChOLkVQLmNoaWNrLmhvbWUuMC4xNSwgdG90YWwuZ2Vub3R5cGVkLU4uRVAuY2hpY2suaG9tZS4wLjE1KSB+ICBCZWFrU2l6ZS5QQzEgKyBCb2R5U2l6ZS5QQzIgKyBib2R5LmNvbG9yLm5vLndpbmcgKyBwZXJjZW50Lm5yICsgcnVtcCArIHdwLnouYXZlcmFnZSArIENvbmRpdGlvbiAgKyAoMXxZZWFyKSwgZmFtaWx5ID0gYmlub21pYWwpKQ0KDQpORVBDaGlja3MxNS5QbHVtYWdlMyA8LSB3aXRoKGRhdCwgZ2xtKGNiaW5kKE4uRVAuY2hpY2suaG9tZS4wLjE1LCB0b3RhbC5nZW5vdHlwZWQtTi5FUC5jaGljay5ob21lLjAuMTUpIH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uICwgZmFtaWx5ID0gYmlub21pYWwpKQ0KDQpBSUMoTkVQQ2hpY2tzMTUuUGx1bWFnZSkNCkFJQyhORVBDaGlja3MxNS5QbHVtYWdlMSkNCkFJQyhORVBDaGlja3MxNS5QbHVtYWdlMikNCkFJQyhORVBDaGlja3MxNS5QbHVtYWdlMykNCg0KI0FsbCBtb2RlbHMgc2hvdyBhIHNpbmd1bGFyaXR5IGFzIG5vdGhpbmcgaXMgc2lnbmlmaWNhbnQsIHNvIHdlIGp1c3QgZ28gd2l0aCB0aGUgbW9kZWwgdGhhdCBoYXMgdGhlIGxvd2VzdCBBSUMuDQpgYGANCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpGb3IgYW5hbHlzZXMgdGhhdCBmb2N1cyBvbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZmVtYWxlIHRyYWl0cyBhbmQgaWYgc2hlIHdhcyBtb2JiZWQgb3IgaGFkIEVQIGZpdG5lc3MgaW4gaGVyIG5lc3QuIFRoZSBpZGVhIGlzIHRvIGdldCBhdCBpZiBmZW1hbGVzIGhhdmUgY29udHJvbCBvdmVyIEVQIGFzIGhlciBtYXRlJ3MgdHJhaXRzIGRvIG5vdCBwcmVkaWN0IGlmIHRoZXkgd2lsbCBoYXZlIEVQIGluIHRoZSBuZXN0Lg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIDEyKSBEbyBmZW1hbGUgdHJhaXRzIHByZWRpY3QgaGlzIHZ1bG5lcmFiaWxpdHkgdG8gbW9iYmluZz8NCmluIG1hbnkgb2YgdGhlc2Ugd2UgdXNlIHN1YnNldCBkYXRhIGZvciBiaXJkcyB0aGF0IHdlcmUgc2VlbiBtb3JlIHRoYW4gMzBtaW4gdG90YWwgKE9iczMwTWluRGF0c3ViKSBpbiB0aGUgVG90YWwudGltZS5taW4gY29sdW1uDQoNCiMjIDEyYSkgSXMgZmVtYWxlIGJvZHkgc2l6ZSByZWxhdGVkIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgbW9iYmVycyB0aGF0IGEgZmVtYWxlIGdldHM/IFtGaWcgNmM7IFRBQkxFIFM2XQ0KYGBge3IsIHdhcm5pbmc9VFJVRSwgbWVzc2FnZT1UUlVFfQ0KVG90TW9iYmVyczMwLlBsdW1hZ2VGIDwtIHdpdGgoT2JzMzBNaW5EYXRzdWJfRiwgZ2xtZXIoVG90YWwuZGlmZmVyZW50Lm1vYmJlcnMgfiAgQmVha1NpemVfUENfRiArIEJvZHlTaXplX1BDMl9GICsgQ29uZGl0aW9uX0YgICAgKyAoMXxZZWFyKSArICgxfEZfYmFuZC5udW1iZXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCg0KDQojcmVtb3ZlIHJhbmRvbSBlZmZlY3RzIGZvciBzaW5ndWxhciBmaXQuDQpUb3RNb2JiZXJzMzAuUGx1bWFnZUYxIDwtIHdpdGgoT2JzMzBNaW5EYXRzdWJfRiwgZ2xtZXIoVG90YWwuZGlmZmVyZW50Lm1vYmJlcnMgfiAgQmVha1NpemVfUENfRiArIEJvZHlTaXplX1BDMl9GICsgQ29uZGl0aW9uX0YgICsgKDF8Rl9iYW5kLm51bWJlciksIGZhbWlseSA9IHBvaXNzb24pKQ0Kc3VtbWFyeShUb3RNb2JiZXJzMzAuUGx1bWFnZUYxKQ0KYW5vdmEoVG90TW9iYmVyczMwLlBsdW1hZ2VGMSkNCiNxcW5vcm0ocmVzaWR1YWxzKFRvdE1vYmJlcnMzMC5QbHVtYWdlRjEpKQ0KI3FxbGluZShyZXNpZHVhbHMoVG90TW9iYmVyczMwLlBsdW1hZ2VGMSkpDQoNClRvdE1vYmJlcnMzMC5QbHVtYWdlRjIgPC0gd2l0aChPYnMzME1pbkRhdHN1Yl9GLCBnbG1lcihUb3RhbC5kaWZmZXJlbnQubW9iYmVycyB+ICBCZWFrU2l6ZV9QQ19GICsgQm9keVNpemVfUEMyX0YgKyBDb25kaXRpb25fRiAgKyAoMXxZZWFyKSwgZmFtaWx5ID0gcG9pc3NvbikpDQoNClRvdE1vYmJlcnMzMC5QbHVtYWdlRjMgPC0gd2l0aChPYnMzME1pbkRhdHN1Yl9GLCBnbG0oVG90YWwuZGlmZmVyZW50Lm1vYmJlcnMgfiAgQmVha1NpemVfUENfRiArQm9keVNpemVfUEMyX0YgKyBDb25kaXRpb25fRiwgZmFtaWx5ID0gcG9pc3NvbikpDQoNCg0KDQojbW9kZWwgd2l0aCBmZW1hbGUgSUQgYXMgYSByYW5kb20gZWZmZWN0IGhhcyBiZXN0IEFJQw0KDQpBSUMoVG90TW9iYmVyczMwLlBsdW1hZ2VGKQ0KQUlDKFRvdE1vYmJlcnMzMC5QbHVtYWdlRjEpDQpBSUMoVG90TW9iYmVyczMwLlBsdW1hZ2VGMikNCkFJQyhUb3RNb2JiZXJzMzAuUGx1bWFnZUYzKQ0KDQojdGVzdCBmb3Igb3ZlcmRpc3BlcnNpb24gb2YgcG9pc3NvbiBtb2RlbHMNCmRpc3BlcnNpb25fZ2xtZXIoVG90TW9iYmVyczMwLlBsdW1hZ2VGMSkNCm92ZXJkaXNwX2Z1bihUb3RNb2JiZXJzMzAuUGx1bWFnZUYxKQ0KYGBgDQoNCiMxMykgRG8gZmVtYWxlIHRyYWl0cyBwcmVkaWN0IGV4dHJhIHBhaXIgcGF0ZXJuaXR5IGluIGhlciBuZXN0PyANCg0KDQojIyAxMykgRG9lcyBhIGZlbWFsZSdzIGJvZHkgc2l6ZSB0cmFpdHMgcHJlZGljdCB0aGUgcHJvcG9ydGlvbiBvZiBleHRyYSBwYWlyIGNoaWNrcyAocGF0ZXJuaXR5IGFzc2lnbmVtZW50IGF0IDAuMTUpIGluIGhlciBuZXN0PyBVc2luZyBhIGNiaW5kIGZ1bmN0aW9uIHRvIGxpbmsgbnVtYmVyIEVQIHZzIG51bWJlciBXUCBpbiB0aGUgbmVzdCBhcyB0aGUgYWNjdXJhY3kgb2YgZXN0aW1hdGVzIG9mIGV4dHJhLXBhaXIgcGF0ZXJuaXR5IGRlcGVuZHMgaW4gcGFydCBvbiBudW1iZXIgb2YgY2hpY2tzIHdlIGNhbiBnZW5vdHlwZS4gW0ZpZyA2ZDsgVEFCTEUgUzddDQpgYGB7ciwgd2FybmluZz1UUlVFLCBtZXNzYWdlPVRSVUV9DQpORVBDaGlja3MxNS5QbHVtYWdlRiA8LSB3aXRoKGRhdF9GLCBnbG1lcihjYmluZChOLkVQLmNoaWNrLmhvbWUuMC4xNSwgTi5XUC5jaGljay5ob21lLjAuMTUpIH4gIEJlYWtTaXplX1BDX0YgKyBCb2R5U2l6ZV9QQzJfRiArIENvbmRpdGlvbl9GICArICgxfEZfYmFuZC5udW1iZXIpICsgKDF8WWVhciksIGZhbWlseSA9IGJpbm9taWFsKSkNCiNzdW1tYXJ5KE5FUENoaWNrczE1LlBsdW1hZ2VGKQ0KI2Fub3ZhKE5FUENoaWNrczE1LlBsdW1hZ2VGKQ0KI3Fxbm9ybShyZXNpZHVhbHMoTkVQQ2hpY2tzMTUuUGx1bWFnZUYpKQ0KI3FxbGluZShyZXNpZHVhbHMoTkVQQ2hpY2tzMTUuUGx1bWFnZUYpKQ0KDQojTG93ZXN0IEFJQyBpcyBtb2RlbCB3aXRoIGp1c3QgZmVtYWxlIGJhbmQgbnVtYmVyDQpORVBDaGlja3MxNS5QbHVtYWdlRjEgPC0gd2l0aChkYXRfRiwgZ2xtZXIoY2JpbmQoTi5FUC5jaGljay5ob21lLjAuMTUsIE4uV1AuY2hpY2suaG9tZS4wLjE1KSB+ICBCZWFrU2l6ZV9QQ19GICsgQm9keVNpemVfUEMyX0YgKyBDb25kaXRpb25fRiAgKyAoMXxGX2JhbmQubnVtYmVyKSwgZmFtaWx5ID0gYmlub21pYWwpKQ0Kc3VtbWFyeShORVBDaGlja3MxNS5QbHVtYWdlRjEpDQphbm92YShORVBDaGlja3MxNS5QbHVtYWdlRjEpDQojcXFub3JtKHJlc2lkdWFscyhORVBDaGlja3MxNS5QbHVtYWdlRjEpKQ0KI3FxbGluZShyZXNpZHVhbHMoTkVQQ2hpY2tzMTUuUGx1bWFnZUYxKSkNCg0KTkVQQ2hpY2tzMTUuUGx1bWFnZUYyIDwtIHdpdGgoZGF0X0YsIGdsbWVyKGNiaW5kKE4uRVAuY2hpY2suaG9tZS4wLjE1LCBOLldQLmNoaWNrLmhvbWUuMC4xNSkgfiAgQmVha1NpemVfUENfRiArIEJvZHlTaXplX1BDMl9GICsgQ29uZGl0aW9uX0YgICsgKDF8WWVhciksIGZhbWlseSA9IGJpbm9taWFsKSkNCg0KTkVQQ2hpY2tzMTUuUGx1bWFnZUYzIDwtIHdpdGgoZGF0X0YsIGdsbShjYmluZChOLkVQLmNoaWNrLmhvbWUuMC4xNSwgTi5XUC5jaGljay5ob21lLjAuMTUpIH4gIEJlYWtTaXplX1BDX0YgKyBCb2R5U2l6ZV9QQzJfRiArIENvbmRpdGlvbl9GLCBmYW1pbHkgPSBiaW5vbWlhbCkpDQoNCkFJQyhORVBDaGlja3MxNS5QbHVtYWdlRikNCkFJQyhORVBDaGlja3MxNS5QbHVtYWdlRjEpDQpBSUMoTkVQQ2hpY2tzMTUuUGx1bWFnZUYyKQ0KQUlDKE5FUENoaWNrczE1LlBsdW1hZ2VGMykNCg0KI1F1aWNrIHBsb3QgdG8gc2VlIHdoYXQgdGhlIGZlbWFsZSBib2R5IHNpemUgcGF0dGVybiBsb29rcyBsaWtlLg0KZ2dwbG90KGRhdF9GLCBhZXMoeD1Cb2R5U2l6ZV9QQzJfRiwgeT1OLkVQLmNoaWNrLmhvbWUuMC4xNS8odG90YWwuZ2Vub3R5cGVkKSkpICsgDQogIGdlb21fcG9pbnQoYWxwaGE9LjUpICsNCiAgc3RhdF9zbW9vdGgobWV0aG9kPSJnbG0iLCBzZT1GQUxTRSwgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseT1iaW5vbWlhbCkpDQoNCmBgYA0KDQoNCg0KDQojIFRISVMgSVMgVEhFIEVORC4uLk1ZIEZSSUVORCE=