1 What are Mediation and Moderation?

Mediation analysis tests a hypothetical causal chain where one variable X affects a second variable M and, in turn, that variable affects a third variable Y. Mediators describe the how or why of a (typically well-established) relationship between two other variables and are sometimes called intermediary variables since they often describe the process through which an effect occurs. This is also sometimes called an indirect effect. For instance, people with higher incomes tend to live longer but this effect is explained by the mediating influence of having access to better health care.

In R, this kind of analysis may be conducted in two ways: Baron & Kenny’s (1986) 4-step indirect effect method and the more recent mediation package (Tingley, Yamamoto, Hirose, Keele, & Imai, 2014). The Baron & Kelly method is among the original methods for testing for mediation but tends to have low statistical power. It is covered in this chapter because it provides a very clear approach to establishing relationships between variables and is still occassionally requested by reviewers. However, the mediation package method is highly recommended as a more flexible and statistically powerful approach.

Moderation analysis also allows you to test for the influence of a third variable, Z, on the relationship between variables X and Y. Rather than testing a causal link between these other variables, moderation tests for when or under what conditions an effect occurs. Moderators can stength, weaken, or reverse the nature of a relationship. For example, academic self-efficacy (confidence in own’s ability to do well in school) moderates the relationship between task importance and the amount of test anxiety a student feels (Nie, Lau, & Liau, 2011). Specifically, students with high self-efficacy experience less anxiety on important tests than students with low self-efficacy while all students feel relatively low anxiety for less important tests. Self-efficacy is considered a moderator in this case because it interacts with task importance, creating a different effect on test anxiety at different levels of task importance.

In general (and thus in R), moderation can be tested by interacting variables of interest (moderator with IV) and plotting the simple slopes of the interaction, if present. A variety of packages also include functions for testing moderation but as the underlying statistical approaches are the same, only the “by hand” approach is covered in detail in here.

Finally, this chapter will cover these basic mediation and moderation techniques only. For more complicated techniques, such as multiple mediation, moderated mediation, or mediated moderation please see the mediation package’s full documentation.

1.1 Getting Started

If necessary, review the Chapter on regression. Regression test assumptions may be tested with gvlma. You may load all the libraries below or load them as you go along. Review the help section of any packages you may be unfamiliar with ?(packagename).

library(mediation) #Mediation package
library(rockchalk) #Graphing simple slopes; moderation
library(multilevel) #Sobel Test
library(bda) #Another Sobel Test option
library(gvlma) #Testing Model Assumptions 
library(stargazer) #Handy regression tables

#Useful Help
?lm
?mediation 
## No documentation for 'mediation' in specified packages and libraries:
## you could try '??mediation'
?rockchalk
?stargazer

#Optional packages
library(QuantPsyc)
library(pequod)
?moderate.lm
?pequod
## No documentation for 'pequod' in specified packages and libraries:
## you could try '??pequod'

2 Mediation Analyses

Mediation tests whether the effects of X (the independent variable) on Y (the dependent variable) operate through a third variable, M (the mediator). In this way, mediators explain the causal relationship between two variables or “how” the relationship works, making it a very popular method in psychological research.

Both mediation and moderation assume that there is little to no measurement error in the mediator/moderator variable and that the DV did not CAUSE the mediator/moderator. If mediator error is likely to be high, researchers should collect multiple indicators of the construct and use SEM to estimate latent variables. The safest ways to make sure your mediator is not caused by your DV are to experimentally manipulate the variable or collect the measurement of your mediator before you introduce your IV.

Total Effect Model.

Total Effect Model.

Basic Mediation Model.

Basic Mediation Model.

c = the total effect of X on Y c = c’ + ab c’= the direct effect of X on Y after controlling for M; c’=c-ab
ab= indirect effect of X on Y

The above shows the standard mediation model. Perfect mediation occurs when the effect of X on Y decreases to 0 with M in the model. Partial mediation occurs when the effect of X on Y decreases by a nontrivial amount (the actual amount is up for debate) with M in the model.

2.1 Example Mediation Data

Set an appropriate working directory and generate the following data set.

In this example we’ll say we are interested in whether the number of hours since dawn (X) affect the subjective ratings of wakefulness (Y) 100 graduate students through the consumption of coffee (M).

Note that we are intentionally creating a mediation effect here (because statistics is always more fun if we have something to find) and we do so below by creating M so that it is related to X and Y so that it is related to M. This creates the causal chain for our analysis to parse.

#setwd("user location") #Working directory
set.seed(123) #Standardizes the numbers generated by rnorm; see Chapter 5
N <- 100 #Number of participants; graduate students
X <- rnorm(N, 175, 7) #IV; hours since dawn
M <- 0.7*X + rnorm(N, 0, 5) #Suspected mediator; coffee consumption 
Y <- 0.4*M + rnorm(N, 0, 5) #DV; wakefulness
Meddata <- data.frame(X, M, Y)

2.2 Method 1: Baron & Kenny

This is the original 4-step method used to describe a mediation effect. Steps 1 and 2 use basic linear regression while steps 3 and 4 use multiple regression. For help with regression, see Chapter 10.

The Steps: 1. Estimate the relationship between X on Y (hours since dawn on degree of wakefulness) -Path “c” must be significantly different from 0; must have a total effect between the IV & DV

  1. Estimate the relationship between X on M (hours since dawn on coffee consumption) -Path “a” must be significantly different from 0; IV and mediator must be related.

  2. Estimate the relationship between M on Y controlling for X (coffee consumption on wakefulness, controlling for hours since dawn) -Path “b” must be significantly different from 0; mediator and DV must be related. -The effect of X on Y decreases with the inclusion of M in the model

  3. Estimate the relationship between Y on X controlling for M (wakefulness on hours since dawn, controlling for coffee consumption) -Should be non-significant and nearly 0.

#1. Total Effect
fit <- lm(Y ~ X, data=Meddata)
summary(fit)
## 
## Call:
## lm(formula = Y ~ X, data = Meddata)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -10.917  -3.738  -0.259   2.910  12.540 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 19.88368   14.26371   1.394   0.1665  
## X            0.16899    0.08116   2.082   0.0399 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.16 on 98 degrees of freedom
## Multiple R-squared:  0.04237,    Adjusted R-squared:  0.0326 
## F-statistic: 4.336 on 1 and 98 DF,  p-value: 0.03993
#2. Path A (X on M)
fita <- lm(M ~ X, data=Meddata)
summary(fita)
## 
## Call:
## lm(formula = M ~ X, data = Meddata)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -9.5367 -3.4175 -0.4375  2.9032 16.4520 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  6.04494   13.41692   0.451    0.653    
## X            0.66252    0.07634   8.678 8.87e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.854 on 98 degrees of freedom
## Multiple R-squared:  0.4346, Adjusted R-squared:  0.4288 
## F-statistic: 75.31 on 1 and 98 DF,  p-value: 8.872e-14
#3. Path B (M on Y, controlling for X)
fitb <- lm(Y ~ M + X, data=Meddata)
summary(fitb)
## 
## Call:
## lm(formula = Y ~ M + X, data = Meddata)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -9.3651 -3.3037 -0.6222  3.1068 10.3991 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 17.32177   13.16216   1.316    0.191    
## M            0.42381    0.09899   4.281 4.37e-05 ***
## X           -0.11179    0.09949  -1.124    0.264    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.756 on 97 degrees of freedom
## Multiple R-squared:  0.1946, Adjusted R-squared:  0.1779 
## F-statistic: 11.72 on 2 and 97 DF,  p-value: 2.771e-05
#4. Reversed Path C (Y on X, controlling for M)
fitc <- lm(X ~ Y + M, data=Meddata)
summary(fitc)
## 
## Call:
## lm(formula = X ~ Y + M, data = Meddata)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -14.438  -2.573  -0.030   3.010  11.779 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 96.11234    9.27663  10.361  < 2e-16 ***
## Y           -0.11493    0.10229  -1.124    0.264    
## M            0.69619    0.08356   8.332 5.27e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.823 on 97 degrees of freedom
## Multiple R-squared:  0.4418, Adjusted R-squared:  0.4303 
## F-statistic: 38.39 on 2 and 97 DF,  p-value: 5.233e-13
#Summary Table
stargazer(fit, fita, fitb, fitc, type = "text", title = "Baron and Kenny Method")
## 
## Baron and Kenny Method
## =============================================================================================================
##                                                        Dependent variable:                                   
##                     -----------------------------------------------------------------------------------------
##                              Y                     M                      Y                      X           
##                             (1)                   (2)                    (3)                    (4)          
## -------------------------------------------------------------------------------------------------------------
## Y                                                                                              -0.115        
##                                                                                               (0.102)        
##                                                                                                              
## M                                                                      0.424***               0.696***       
##                                                                        (0.099)                (0.084)        
##                                                                                                              
## X                         0.169**               0.663***                -0.112                               
##                           (0.081)               (0.076)                (0.099)                               
##                                                                                                              
## Constant                   19.884                6.045                  17.322               96.112***       
##                           (14.264)              (13.417)               (13.162)               (9.277)        
##                                                                                                              
## -------------------------------------------------------------------------------------------------------------
## Observations                100                   100                    100                    100          
## R2                         0.042                 0.435                  0.195                  0.442         
## Adjusted R2                0.033                 0.429                  0.178                  0.430         
## Residual Std. Error   5.160 (df = 98)       4.854 (df = 98)        4.756 (df = 97)        4.823 (df = 97)    
## F Statistic         4.336** (df = 1; 98) 75.313*** (df = 1; 98) 11.715*** (df = 2; 97) 38.389*** (df = 2; 97)
## =============================================================================================================
## Note:                                                                             *p<0.1; **p<0.05; ***p<0.01

2.3 Interpreting Barron & Kenny Results

Here we find that our total effect model shows a significant positive relationship between hours since dawn (X) and wakefulness (Y). Our Path A model shows that hours since down (X) is also positively related to coffee consumption (M). Our Path B model then shows that coffee consumption (M) positively predicts wakefulness (Y) when controlling for hours since dawn (X). Finally, wakefulness (Y) does not predict hours since dawn (X) when controlling for coffee consumption (M).

Since the relationship between hours since dawn and wakefulness is no longer significant when controlling for coffee consumption, this suggests that coffee consumption does in fact mediate this relationship. However, this method alone does not allow for a formal test of the indirect effect so we don’t know if the change in this relationship is truly meaningful.

There are two primary methods for formally testing the significance of the indirect test: the Sobel test & bootstrapping (covered under the mediatation method).

#Sobel Test
library(multilevel)
?sobel
sobel(Meddata$X, Meddata$M, Meddata$Y)
## $`Mod1: Y~X`
##               Estimate Std. Error  t value   Pr(>|t|)
## (Intercept) 19.8836805 14.2637142 1.394004 0.16646905
## pred         0.1689931  0.0811601 2.082220 0.03992761
## 
## $`Mod2: Y~X+M`
##               Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept) 17.3217682 13.16215851  1.316028 1.912663e-01
## pred        -0.1117904  0.09949262 -1.123605 2.639537e-01
## med          0.4238113  0.09899469  4.281152 4.371472e-05
## 
## $`Mod3: M~X`
##              Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept) 6.0449365 13.41692114 0.4505457 6.533122e-01
## pred        0.6625203  0.07634187 8.6783345 8.871741e-14
## 
## $Indirect.Effect
## [1] 0.2807836
## 
## $SE
## [1] 0.07313234
## 
## $z.value
## [1] 3.83939
## 
## $N
## [1] 100
#or
library(bda)
mediation.test(M,X,Y)
##                Sobel       Aroian      Goodman
## z.value 3.8393902040 3.8190525305 3.8600562907
## p.value 0.0001233403 0.0001339652 0.0001133609

The Sobel Test uses a specialized t-test to determine if there is a significant reduction in the effect of X on Y when M is present. Using the sobel function of the multilevel package will show provide you with three of the basic models we ran before (Mod1 = Total Effect; Mod2 = Path B; and Mod3 = Path A) as well as an estimate of the indirect effect, the standard error of that effect, and the z-value for that effect. You can either use this value to calculate your p-value or run the mediation.test function from the bda package to receive a p-value for this estimate.

In this case, we can now confirm that the relationship between hours since dawn and feelings of wakefulness are significantly mediated by the consumption of coffee (z’ = 3.84, p < .001).

However, the Sobel Test is largely considered an outdated method since it assumes that the indirect effect (ab) is normally distributed and tends to only have adequate power with large sample sizes. Thus, again, it is highly recommended to use the mediation bootstrapping method instead.

2.4 Method 2: The Mediation Pacakge Method

This package uses the more recent bootstrapping method of Preacher & Hayes (2004) to address the power limitations of the Sobel Test. This method computes the point estimate of the indirect effect (ab) over a large number of random sample (typically 1000) so it does not assume that the data are normally distributed and is especially more suitable for small sample sizes than the Barron & Kenny method.

To run the mediate function, we will again need a model of our IV (hours since dawn), predicting our mediator (coffee consumption) like our Path A model above. We will also need a model of the direct effect of our IV (hours since dawn) on our DV (wakefulness), when controlling for our mediator (coffee consumption). When can then use mediate to repeatedly simulate a comparsion between these models and to test the signifcance of the indirect effect of coffee consumption.

#Mediate package
library(mediation)
?mediate
fitM <- lm(M ~ X,     data=Meddata) #IV on M; Hours since dawn predicting coffee consumption
fitY <- lm(Y ~ X + M, data=Meddata) #IV and M on DV; Hours since dawn and coffee predicting wakefulness
gvlma(fitM) #data is positively skewed; could log transform (see Chap. 10 on assumptions)
## 
## Call:
## lm(formula = M ~ X, data = Meddata)
## 
## Coefficients:
## (Intercept)            X  
##      6.0449       0.6625  
## 
## 
## ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
## USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
## Level of Significance =  0.05 
## 
## Call:
##  gvlma(x = fitM) 
## 
##                    Value p-value                   Decision
## Global Stat        8.833 0.06542    Assumptions acceptable.
## Skewness           6.314 0.01198 Assumptions NOT satisfied!
## Kurtosis           1.219 0.26949    Assumptions acceptable.
## Link Function      1.076 0.29959    Assumptions acceptable.
## Heteroscedasticity 0.223 0.63674    Assumptions acceptable.
gvlma(fitY)
## 
## Call:
## lm(formula = Y ~ X + M, data = Meddata)
## 
## Coefficients:
## (Intercept)            X            M  
##     17.3218      -0.1118       0.4238  
## 
## 
## ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
## USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
## Level of Significance =  0.05 
## 
## Call:
##  gvlma(x = fitY) 
## 
##                      Value p-value                Decision
## Global Stat        3.41844  0.4904 Assumptions acceptable.
## Skewness           1.85648  0.1730 Assumptions acceptable.
## Kurtosis           0.77788  0.3778 Assumptions acceptable.
## Link Function      0.71512  0.3977 Assumptions acceptable.
## Heteroscedasticity 0.06896  0.7929 Assumptions acceptable.
fitMed <- mediate(fitM, fitY, treat="X", mediator="M")
summary(fitMed)
## 
## Causal Mediation Analysis 
## 
## Quasi-Bayesian Confidence Intervals
## 
##                Estimate 95% CI Lower 95% CI Upper p-value    
## ACME             0.2808       0.1437         0.42  <2e-16 ***
## ADE             -0.1133      -0.3116         0.09   0.258    
## Total Effect     0.1674       0.0208         0.34   0.028 *  
## Prop. Mediated   1.6428       0.5631         8.44   0.028 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Sample Size Used: 100 
## 
## 
## Simulations: 1000
plot(fitMed)

#Bootstrap
fitMedBoot <- mediate(fitM, fitY, boot=TRUE, sims=999, treat="X", mediator="M")
summary(fitMedBoot)
## 
## Causal Mediation Analysis 
## 
## Nonparametric Bootstrap Confidence Intervals with the Percentile Method
## 
##                Estimate 95% CI Lower 95% CI Upper p-value    
## ACME             0.2808       0.1420         0.44  <2e-16 ***
## ADE             -0.1118      -0.3099         0.11   0.280    
## Total Effect     0.1690      -0.0112         0.35   0.066 .  
## Prop. Mediated   1.6615      -5.4019        11.54   0.066 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Sample Size Used: 100 
## 
## 
## Simulations: 999
plot(fitMedBoot)

2.5 Interpreting Mediation Results

The mediate function gives us our Average Causal Mediation Effects (ACME), our Average Direct Effects (ADE), our combined indirect and direct effects (Total Effect), and the ratio of these estimates (Prop. Mediated). The ACME here is the indirect effect of M (total effect - direct effect) and thus this value tells us if our mediation effect is significant.

In this case, our fitMed model again shows a signifcant affect of coffee consumption on the relationship between hours since dawn and feelings of wakefulness, (ACME = .28, p < .001) with no direct effect of hours since dawn (ADE = -0.11, p = .27) and significant total effect (p < .05).

We can then bootstrap this comparison to verify this result in fitMedBoot and again find a significant mediation effect (ACME = .28, p < .001) and no direct effect of hours since dawn (ADE = -0.11, p = .27). However, with increased power, this analysis no longer shows a significant total effect (p = .08).

3 Moderation Analyses

Moderation tests whether a variable (Z) affects the direction and/or strength of the relation between an IV (X) and a DV (Y). In other words, moderation tests for interactions that affect WHEN relationships between variables occur. Moderators are conceptually different from mediators (when versus how/why) but some variables may be a moderator or a mediator depending on your question. See the mediation package documentation for ways of testing more complicated mediated moderation/moderated mediation relationships.

Like mediation, moderation assumes that there is little to no measurement error in the moderator variable and that the DV did not CAUSE the moderator. If moderator error is likely to be high, researchers should collect multiple indicators of the construct and use SEM to estimate latent variables. The safest ways to make sure your moderator is not caused by your DV are to experimentally manipulate the variable or collect the measurement of your moderator before you introduce your IV.

Basic Moderation Model.

Basic Moderation Model.

3.1 Example Moderation Data

Set an appropriate working directory and generate the following data set.

In this example we’ll say we are interested in whether the relationship between the number of hours of sleep (X) a graduate student receives and the attention that they pay to this tutorial (Y) is influenced by their consumption of coffee (Z). Here we create the moderation effect by making our DV (Y) the product of levels of the IV (X) and our moderator (Z).

#setwd("location") #Working directory
set.seed(123)#Standardizes the numbers generated by rnorm; see Chapter 5
N  <- 100 #Number of participants; graduate students
X  <- abs(rnorm(N, 6, 4)) #IV; Hours of sleep
X1 <- abs(rnorm(N, 60, 30)) #Adding some systematic variance for our DV
Z  <- rnorm(N, 30, 8) #Moderator; Ounces of coffee consumed
Y  <- abs((-0.8*X) * (0.2*Z) - 0.5*X - 0.4*X1 + 10 + rnorm(N, 0, 3)) #DV; Attention Paid
Moddata <- data.frame(X, X1, Z, Y)

summary(Moddata)
##        X                X1                Z               Y          
##  Min.   : 0.195   Min.   :  1.597   Min.   :15.95   Min.   :  2.386  
##  1st Qu.: 4.025   1st Qu.: 35.967   1st Qu.:25.75   1st Qu.: 30.155  
##  Median : 6.247   Median : 53.225   Median :30.29   Median : 47.761  
##  Mean   : 6.483   Mean   : 56.806   Mean   :30.96   Mean   : 47.763  
##  3rd Qu.: 8.767   3rd Qu.: 74.035   3rd Qu.:36.11   3rd Qu.: 61.727  
##  Max.   :14.749   Max.   :157.231   Max.   :48.34   Max.   :136.947

3.2 Moderation Analysis

Moderation can be tested by looking for significant interactions between the moderating variable (Z) and the IV (X). Notably, it is important to mean center both your moderator and your IV to reduce multicolinearity and make interpretation easier. Centering can be done using the scale function, which subtracts the mean of a variable from each value in that variable. For more information on the use of centering, see ?scale and any number of statistical textbooks that cover regression (we recommend Cohen, 2008).

A number of packages in R can also be used to conduct and plot moderation analyses, including the moderate.lm function of the QuantPsyc package and the pequod package. However, it is simple to do this “by hand” using traditional multiple regression, as shown here, and the underlying analysis (interacting the moderator and the IV) in these packages is identical to this approach. The rockchalk package used here is one of many graphing and plotting packages available in R and was chosen because it was especially designed for use with regression analyses (unlike the more general graphing options described in Chapters 8 & 9).

#Centering Data
Xc    <- c(scale(X, center=TRUE, scale=FALSE)) #Centering IV; hours of sleep
Zc    <- c(scale(Z,  center=TRUE, scale=FALSE)) #Centering moderator; coffee consumption

#Moderation "By Hand"
library(gvlma)
fitMod <- lm(Y ~ Xc + Zc + Xc*Zc) #Model interacts IV & moderator
summary(fitMod)
## 
## Call:
## lm(formula = Y ~ Xc + Zc + Xc * Zc)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -21.466  -8.972  -0.233   6.180  38.051 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 48.54443    1.17286  41.390  < 2e-16 ***
## Xc           5.20812    0.34870  14.936  < 2e-16 ***
## Zc           1.10443    0.15537   7.108 2.08e-10 ***
## Xc:Zc        0.23384    0.04134   5.656 1.59e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 11.65 on 96 degrees of freedom
## Multiple R-squared:  0.7661, Adjusted R-squared:  0.7587 
## F-statistic: 104.8 on 3 and 96 DF,  p-value: < 2.2e-16
coef(summary(fitMod))
##               Estimate Std. Error   t value     Pr(>|t|)
## (Intercept) 48.5444271 1.17285613 41.389925 5.149708e-63
## Xc           5.2081205 0.34870152 14.935755 8.862490e-27
## Zc           1.1044337 0.15537153  7.108340 2.077645e-10
## Xc:Zc        0.2338362 0.04134056  5.656338 1.592946e-07
gvlma(fitMod) #data is positively skewed; could log transform (see Chap. 10)
## 
## Call:
## lm(formula = Y ~ Xc + Zc + Xc * Zc)
## 
## Coefficients:
## (Intercept)           Xc           Zc        Xc:Zc  
##     48.5444       5.2081       1.1044       0.2338  
## 
## 
## ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
## USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
## Level of Significance =  0.05 
## 
## Call:
##  gvlma(x = fitMod) 
## 
##                      Value p-value                   Decision
## Global Stat        7.68778 0.10371    Assumptions acceptable.
## Skewness           5.97432 0.01452 Assumptions NOT satisfied!
## Kurtosis           0.94082 0.33207    Assumptions acceptable.
## Link Function      0.73540 0.39114    Assumptions acceptable.
## Heteroscedasticity 0.03724 0.84698    Assumptions acceptable.
#Data Summary
library(stargazer)
stargazer(fitMod,type="text", title = "Sleep and Coffee on Attention")
## 
## Sleep and Coffee on Attention
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                                  Y             
## -----------------------------------------------
## Xc                           5.208***          
##                               (0.349)          
##                                                
## Zc                           1.104***          
##                               (0.155)          
##                                                
## Xc:Zc                        0.234***          
##                               (0.041)          
##                                                
## Constant                     48.544***         
##                               (1.173)          
##                                                
## -----------------------------------------------
## Observations                    100            
## R2                             0.766           
## Adjusted R2                    0.759           
## Residual Std. Error      11.647 (df = 96)      
## F Statistic           104.784*** (df = 3; 96)  
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01
#Plotting
library(rockchalk)
ps  <- plotSlopes(fitMod, plotx="Xc", modx="Zc", xlab = "Sleep", ylab = "Attention Paid", modxVals = "std.dev")

3.3 Interpreting Moderation Results

Results are presented similar to regular multiple regression results (see Chapter 10). Since we have significant interactions in this model, there is no need to interpret the separate main effects of either our IV or our moderator.

Our by hand model shows a significant interaction between hours slept and coffee consumption on attention paid to this tutorial (b = .23, SE = .04, p < .001). However, we’ll need to unpack this interaction visually to get a better idea of what this means.

The rockchalk function will automatically plot the simple slopes (1 SD above and 1 SD below the mean) of the moderating effect. This figure shows that those who drank less coffee (the black line) paid more attention with the more sleep that they got last night but paid less attention overall that average (the red line). Those who drank more coffee (the green line) paid more when they slept more as well and paid more attention than average. The difference in the slopes for those who drank more or less coffee shows that coffee consumption moderates the relationship between hours of sleep and attention paid.

4 References and Further Reading

Baron, R., & Kenny, D. (1986). The moderator-mediator variable distinction in social psychological research: Conceptual, strategic, and statistical considerations. Journal of Personality and Social Psychology, 51, 1173-1182.

Cohen, B. H. (2008). Explaining psychological statistics. John Wiley & Sons.

Imai, K., Keele, L., & Tingley, D. (2010). A general approach to causal mediation analysis. Psychological methods, 15(4), 309.

MacKinnon, D. P., Lockwood, C. M., Hoffman, J. M., West, S. G., & Sheets, V. (2002). A comparison of methods to test mediation and other intervening variable effects. Psychological methods, 7(1), 83.

Nie, Y., Lau, S., & Liau, A. K. (2011). Role of academic self-efficacy in moderating the relation between task importance and test anxiety. Learning and Individual Differences, 21(6), 736-741.

Tingley, D., Yamamoto, T., Hirose, K., Keele, L., & Imai, K. (2014). Mediation: R package for causal mediation analysis.

LS0tDQp0aXRsZTogJ0NoYXB0ZXIgMTQ6IE1lZGlhdGlvbiBhbmQgTW9kZXJhdGlvbicNCmF1dGhvcjogIkFseXNzYSBCbGFpciINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlDQogICAgZm9udHNpemU6IDhwdA0KICAgIHRvYzogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyBXaGF0IGFyZSBNZWRpYXRpb24gYW5kIE1vZGVyYXRpb24/DQoNCk1lZGlhdGlvbiBhbmFseXNpcyB0ZXN0cyBhIGh5cG90aGV0aWNhbCBjYXVzYWwgY2hhaW4gd2hlcmUgb25lIHZhcmlhYmxlIFggYWZmZWN0cyBhIHNlY29uZCB2YXJpYWJsZSBNIGFuZCwgaW4gdHVybiwgdGhhdCB2YXJpYWJsZSBhZmZlY3RzIGEgdGhpcmQgdmFyaWFibGUgWS4gTWVkaWF0b3JzIGRlc2NyaWJlIHRoZSBob3cgb3Igd2h5IG9mIGEgKHR5cGljYWxseSB3ZWxsLWVzdGFibGlzaGVkKSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gb3RoZXIgdmFyaWFibGVzIGFuZCBhcmUgc29tZXRpbWVzIGNhbGxlZCBpbnRlcm1lZGlhcnkgdmFyaWFibGVzIHNpbmNlIHRoZXkgb2Z0ZW4gZGVzY3JpYmUgdGhlIHByb2Nlc3MgdGhyb3VnaCB3aGljaCBhbiBlZmZlY3Qgb2NjdXJzLiBUaGlzIGlzIGFsc28gc29tZXRpbWVzIGNhbGxlZCBhbiBpbmRpcmVjdCBlZmZlY3QuIEZvciBpbnN0YW5jZSwgcGVvcGxlIHdpdGggaGlnaGVyIGluY29tZXMgdGVuZCB0byBsaXZlIGxvbmdlciBidXQgdGhpcyBlZmZlY3QgaXMgZXhwbGFpbmVkIGJ5IHRoZSBtZWRpYXRpbmcgaW5mbHVlbmNlIG9mIGhhdmluZyBhY2Nlc3MgdG8gYmV0dGVyIGhlYWx0aCBjYXJlLiAgIA0KDQpJbiBSLCB0aGlzIGtpbmQgb2YgYW5hbHlzaXMgbWF5IGJlIGNvbmR1Y3RlZCBpbiB0d28gd2F5czogQmFyb24gJiBLZW5ueSdzICgxOTg2KSA0LXN0ZXAgaW5kaXJlY3QgZWZmZWN0IG1ldGhvZCBhbmQgdGhlIG1vcmUgcmVjZW50ICptZWRpYXRpb24qIHBhY2thZ2UgKFRpbmdsZXksIFlhbWFtb3RvLCBIaXJvc2UsIEtlZWxlLCAmIEltYWksIDIwMTQpLiBUaGUgQmFyb24gJiBLZWxseSBtZXRob2QgaXMgYW1vbmcgdGhlIG9yaWdpbmFsIG1ldGhvZHMgZm9yIHRlc3RpbmcgZm9yIG1lZGlhdGlvbiBidXQgdGVuZHMgdG8gaGF2ZSBsb3cgc3RhdGlzdGljYWwgcG93ZXIuIEl0IGlzIGNvdmVyZWQgaW4gdGhpcyBjaGFwdGVyIGJlY2F1c2UgaXQgcHJvdmlkZXMgYSB2ZXJ5IGNsZWFyIGFwcHJvYWNoIHRvIGVzdGFibGlzaGluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4gdmFyaWFibGVzIGFuZCBpcyBzdGlsbCBvY2Nhc3Npb25hbGx5IHJlcXVlc3RlZCBieSByZXZpZXdlcnMuIEhvd2V2ZXIsIHRoZSAqbWVkaWF0aW9uKiBwYWNrYWdlIG1ldGhvZCBpcyBoaWdobHkgcmVjb21tZW5kZWQgYXMgYSBtb3JlIGZsZXhpYmxlIGFuZCBzdGF0aXN0aWNhbGx5IHBvd2VyZnVsIGFwcHJvYWNoLg0KDQpNb2RlcmF0aW9uIGFuYWx5c2lzIGFsc28gYWxsb3dzIHlvdSB0byB0ZXN0IGZvciB0aGUgaW5mbHVlbmNlIG9mIGEgdGhpcmQgdmFyaWFibGUsIFosIG9uIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB2YXJpYWJsZXMgWCBhbmQgWS4gUmF0aGVyIHRoYW4gdGVzdGluZyBhIGNhdXNhbCBsaW5rIGJldHdlZW4gdGhlc2Ugb3RoZXIgdmFyaWFibGVzLCBtb2RlcmF0aW9uIHRlc3RzIGZvciB3aGVuIG9yIHVuZGVyIHdoYXQgY29uZGl0aW9ucyBhbiBlZmZlY3Qgb2NjdXJzLiBNb2RlcmF0b3JzIGNhbiBzdGVuZ3RoLCB3ZWFrZW4sIG9yIHJldmVyc2UgdGhlIG5hdHVyZSBvZiBhIHJlbGF0aW9uc2hpcC4gRm9yIGV4YW1wbGUsIGFjYWRlbWljIHNlbGYtZWZmaWNhY3kgKGNvbmZpZGVuY2UgaW4gb3duJ3MgYWJpbGl0eSB0byBkbyB3ZWxsIGluIHNjaG9vbCkgbW9kZXJhdGVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0YXNrIGltcG9ydGFuY2UgYW5kIHRoZSBhbW91bnQgb2YgdGVzdCBhbnhpZXR5IGEgc3R1ZGVudCBmZWVscyAoTmllLCBMYXUsICYgTGlhdSwgMjAxMSkuIFNwZWNpZmljYWxseSwgc3R1ZGVudHMgd2l0aCBoaWdoIHNlbGYtZWZmaWNhY3kgZXhwZXJpZW5jZSBsZXNzIGFueGlldHkgb24gaW1wb3J0YW50IHRlc3RzIHRoYW4gc3R1ZGVudHMgd2l0aCBsb3cgc2VsZi1lZmZpY2FjeSB3aGlsZSBhbGwgc3R1ZGVudHMgZmVlbCByZWxhdGl2ZWx5IGxvdyBhbnhpZXR5IGZvciBsZXNzIGltcG9ydGFudCB0ZXN0cy4gU2VsZi1lZmZpY2FjeSBpcyBjb25zaWRlcmVkIGEgbW9kZXJhdG9yIGluIHRoaXMgY2FzZSBiZWNhdXNlIGl0IGludGVyYWN0cyB3aXRoIHRhc2sgaW1wb3J0YW5jZSwgY3JlYXRpbmcgYSBkaWZmZXJlbnQgZWZmZWN0IG9uIHRlc3QgYW54aWV0eSBhdCBkaWZmZXJlbnQgbGV2ZWxzIG9mIHRhc2sgaW1wb3J0YW5jZS4gICAgDQoNCkluIGdlbmVyYWwgKGFuZCB0aHVzIGluIFIpLCBtb2RlcmF0aW9uIGNhbiBiZSB0ZXN0ZWQgYnkgaW50ZXJhY3RpbmcgdmFyaWFibGVzIG9mIGludGVyZXN0IChtb2RlcmF0b3Igd2l0aCBJVikgYW5kIHBsb3R0aW5nIHRoZSBzaW1wbGUgc2xvcGVzIG9mIHRoZSBpbnRlcmFjdGlvbiwgaWYgcHJlc2VudC4gQSB2YXJpZXR5IG9mIHBhY2thZ2VzIGFsc28gaW5jbHVkZSBmdW5jdGlvbnMgZm9yIHRlc3RpbmcgbW9kZXJhdGlvbiBidXQgYXMgdGhlIHVuZGVybHlpbmcgc3RhdGlzdGljYWwgYXBwcm9hY2hlcyBhcmUgdGhlIHNhbWUsIG9ubHkgdGhlICJieSBoYW5kIiBhcHByb2FjaCBpcyBjb3ZlcmVkIGluIGRldGFpbCBpbiBoZXJlLiAgDQoNCkZpbmFsbHksIHRoaXMgY2hhcHRlciB3aWxsIGNvdmVyIHRoZXNlIGJhc2ljIG1lZGlhdGlvbiBhbmQgbW9kZXJhdGlvbiB0ZWNobmlxdWVzIG9ubHkuIEZvciBtb3JlIGNvbXBsaWNhdGVkIHRlY2huaXF1ZXMsIHN1Y2ggYXMgbXVsdGlwbGUgbWVkaWF0aW9uLCBtb2RlcmF0ZWQgbWVkaWF0aW9uLCBvciBtZWRpYXRlZCBtb2RlcmF0aW9uIHBsZWFzZSBzZWUgdGhlICptZWRpYXRpb24qIHBhY2thZ2UncyBmdWxsIGRvY3VtZW50YXRpb24uDQoNCg0KIyMgR2V0dGluZyBTdGFydGVkDQoNCklmIG5lY2Vzc2FyeSwgcmV2aWV3IHRoZSBDaGFwdGVyIG9uIHJlZ3Jlc3Npb24uDQpSZWdyZXNzaW9uIHRlc3QgYXNzdW1wdGlvbnMgbWF5IGJlIHRlc3RlZCB3aXRoICpndmxtYSouDQpZb3UgbWF5IGxvYWQgYWxsIHRoZSBsaWJyYXJpZXMgYmVsb3cgb3IgbG9hZCB0aGVtIGFzIHlvdSBnbyBhbG9uZy4gDQpSZXZpZXcgdGhlIGhlbHAgc2VjdGlvbiBvZiBhbnkgcGFja2FnZXMgeW91IG1heSBiZSB1bmZhbWlsaWFyIHdpdGggPyhwYWNrYWdlbmFtZSkuIA0KDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShtZWRpYXRpb24pICNNZWRpYXRpb24gcGFja2FnZQ0KbGlicmFyeShyb2NrY2hhbGspICNHcmFwaGluZyBzaW1wbGUgc2xvcGVzOyBtb2RlcmF0aW9uDQpsaWJyYXJ5KG11bHRpbGV2ZWwpICNTb2JlbCBUZXN0DQpsaWJyYXJ5KGJkYSkgI0Fub3RoZXIgU29iZWwgVGVzdCBvcHRpb24NCmxpYnJhcnkoZ3ZsbWEpICNUZXN0aW5nIE1vZGVsIEFzc3VtcHRpb25zIA0KbGlicmFyeShzdGFyZ2F6ZXIpICNIYW5keSByZWdyZXNzaW9uIHRhYmxlcw0KDQojVXNlZnVsIEhlbHANCj9sbQ0KP21lZGlhdGlvbiANCj9yb2NrY2hhbGsNCj9zdGFyZ2F6ZXINCg0KI09wdGlvbmFsIHBhY2thZ2VzDQpsaWJyYXJ5KFF1YW50UHN5YykNCmxpYnJhcnkocGVxdW9kKQ0KP21vZGVyYXRlLmxtDQo/cGVxdW9kDQoNCmBgYA0KDQoNCiMgTWVkaWF0aW9uIEFuYWx5c2VzDQoNCk1lZGlhdGlvbiB0ZXN0cyB3aGV0aGVyIHRoZSBlZmZlY3RzIG9mIFggKHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZSkgb24gWSAodGhlIGRlcGVuZGVudCB2YXJpYWJsZSkgb3BlcmF0ZSB0aHJvdWdoIGEgdGhpcmQgdmFyaWFibGUsIE0gKHRoZSBtZWRpYXRvcikuIEluIHRoaXMgd2F5LCBtZWRpYXRvcnMgZXhwbGFpbiB0aGUgY2F1c2FsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byB2YXJpYWJsZXMgb3IgImhvdyIgdGhlIHJlbGF0aW9uc2hpcCB3b3JrcywgbWFraW5nIGl0IGEgdmVyeSBwb3B1bGFyIG1ldGhvZCBpbiBwc3ljaG9sb2dpY2FsIHJlc2VhcmNoLiANCg0KQm90aCBtZWRpYXRpb24gYW5kIG1vZGVyYXRpb24gYXNzdW1lIHRoYXQgdGhlcmUgaXMgbGl0dGxlIHRvIG5vIG1lYXN1cmVtZW50IGVycm9yIGluIHRoZSBtZWRpYXRvci9tb2RlcmF0b3IgdmFyaWFibGUgYW5kIHRoYXQgdGhlIERWICoqZGlkIG5vdCBDQVVTRSoqIHRoZSBtZWRpYXRvci9tb2RlcmF0b3IuIElmIG1lZGlhdG9yIGVycm9yIGlzIGxpa2VseSB0byBiZSBoaWdoLCByZXNlYXJjaGVycyBzaG91bGQgY29sbGVjdCBtdWx0aXBsZSBpbmRpY2F0b3JzIG9mIHRoZSBjb25zdHJ1Y3QgYW5kIHVzZSBTRU0gdG8gZXN0aW1hdGUgbGF0ZW50IHZhcmlhYmxlcy4gVGhlIHNhZmVzdCB3YXlzIHRvIG1ha2Ugc3VyZSB5b3VyIG1lZGlhdG9yIGlzIG5vdCBjYXVzZWQgYnkgeW91ciBEViBhcmUgdG8gZXhwZXJpbWVudGFsbHkgbWFuaXB1bGF0ZSB0aGUgdmFyaWFibGUgb3IgY29sbGVjdCB0aGUgbWVhc3VyZW1lbnQgb2YgeW91ciBtZWRpYXRvciBiZWZvcmUgeW91IGludHJvZHVjZSB5b3VyIElWLiANCg0KDQohW1RvdGFsIEVmZmVjdCBNb2RlbC5dKGltYWdlc1x0b3RhbGVmZmVjdC5wbmcpDQoNCg0KIVtCYXNpYyBNZWRpYXRpb24gTW9kZWwuXShpbWFnZXNcbWVkaWF0aW9uLnBuZykNCg0KDQpjID0gdGhlIHRvdGFsIGVmZmVjdCBvZiBYIG9uIFkNCmMgPSBjJyArIGFiDQpjJz0gdGhlIGRpcmVjdCBlZmZlY3Qgb2YgWCBvbiBZIGFmdGVyIGNvbnRyb2xsaW5nIGZvciBNOyBjJz1jLWFiICANCmFiPSBpbmRpcmVjdCBlZmZlY3Qgb2YgWCBvbiBZDQoNClRoZSBhYm92ZSBzaG93cyB0aGUgc3RhbmRhcmQgbWVkaWF0aW9uIG1vZGVsLiBQZXJmZWN0IG1lZGlhdGlvbiBvY2N1cnMgd2hlbiB0aGUgZWZmZWN0IG9mIFggb24gWSBkZWNyZWFzZXMgdG8gMCB3aXRoIE0gaW4gdGhlIG1vZGVsLiBQYXJ0aWFsIG1lZGlhdGlvbiBvY2N1cnMgd2hlbiB0aGUgZWZmZWN0IG9mIFggb24gWSBkZWNyZWFzZXMgYnkgYSBub250cml2aWFsIGFtb3VudCAodGhlIGFjdHVhbCBhbW91bnQgaXMgdXAgZm9yIGRlYmF0ZSkgd2l0aCBNIGluIHRoZSBtb2RlbC4NCiAgDQojIyBFeGFtcGxlIE1lZGlhdGlvbiBEYXRhIA0KDQpTZXQgYW4gYXBwcm9wcmlhdGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgZGF0YSBzZXQuIA0KDQpJbiB0aGlzIGV4YW1wbGUgd2UnbGwgc2F5IHdlIGFyZSBpbnRlcmVzdGVkIGluIHdoZXRoZXIgdGhlIG51bWJlciBvZiBob3VycyBzaW5jZSBkYXduIChYKSBhZmZlY3QgdGhlIHN1YmplY3RpdmUgcmF0aW5ncyBvZiB3YWtlZnVsbmVzcyAoWSkgMTAwIGdyYWR1YXRlIHN0dWRlbnRzIHRocm91Z2ggdGhlIGNvbnN1bXB0aW9uIG9mIGNvZmZlZSAoTSkuIA0KDQpOb3RlIHRoYXQgd2UgYXJlIGludGVudGlvbmFsbHkgY3JlYXRpbmcgYSBtZWRpYXRpb24gZWZmZWN0IGhlcmUgKGJlY2F1c2Ugc3RhdGlzdGljcyBpcyBhbHdheXMgbW9yZSBmdW4gaWYgd2UgaGF2ZSBzb21ldGhpbmcgdG8gZmluZCkgYW5kIHdlIGRvIHNvIGJlbG93IGJ5IGNyZWF0aW5nIE0gc28gdGhhdCBpdCBpcyByZWxhdGVkIHRvIFggYW5kIFkgc28gdGhhdCBpdCBpcyByZWxhdGVkIHRvIE0uIFRoaXMgY3JlYXRlcyB0aGUgY2F1c2FsIGNoYWluIGZvciBvdXIgYW5hbHlzaXMgdG8gcGFyc2UuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KI3NldHdkKCJ1c2VyIGxvY2F0aW9uIikgI1dvcmtpbmcgZGlyZWN0b3J5DQpzZXQuc2VlZCgxMjMpICNTdGFuZGFyZGl6ZXMgdGhlIG51bWJlcnMgZ2VuZXJhdGVkIGJ5IHJub3JtOyBzZWUgQ2hhcHRlciA1DQpOIDwtIDEwMCAjTnVtYmVyIG9mIHBhcnRpY2lwYW50czsgZ3JhZHVhdGUgc3R1ZGVudHMNClggPC0gcm5vcm0oTiwgMTc1LCA3KSAjSVY7IGhvdXJzIHNpbmNlIGRhd24NCk0gPC0gMC43KlggKyBybm9ybShOLCAwLCA1KSAjU3VzcGVjdGVkIG1lZGlhdG9yOyBjb2ZmZWUgY29uc3VtcHRpb24gDQpZIDwtIDAuNCpNICsgcm5vcm0oTiwgMCwgNSkgI0RWOyB3YWtlZnVsbmVzcw0KTWVkZGF0YSA8LSBkYXRhLmZyYW1lKFgsIE0sIFkpDQoNCmBgYA0KDQojIyBNZXRob2QgMTogQmFyb24gJiBLZW5ueSANCg0KVGhpcyBpcyB0aGUgb3JpZ2luYWwgNC1zdGVwIG1ldGhvZCB1c2VkIHRvIGRlc2NyaWJlIGEgbWVkaWF0aW9uIGVmZmVjdC4gU3RlcHMgMSBhbmQgMiB1c2UgYmFzaWMgbGluZWFyIHJlZ3Jlc3Npb24gd2hpbGUgc3RlcHMgMyBhbmQgNCB1c2UgbXVsdGlwbGUgcmVncmVzc2lvbi4gRm9yIGhlbHAgd2l0aCByZWdyZXNzaW9uLCBzZWUgQ2hhcHRlciAxMC4NCg0KVGhlIFN0ZXBzOg0KMS4gRXN0aW1hdGUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFggb24gWSAoaG91cnMgc2luY2UgZGF3biBvbiBkZWdyZWUgb2Ygd2FrZWZ1bG5lc3MpDQogICAgLVBhdGggImMiIG11c3QgYmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSAwOyBtdXN0IGhhdmUgYSB0b3RhbCBlZmZlY3QgYmV0d2VlbiB0aGUgSVYgJiBEVg0KDQoyLiBFc3RpbWF0ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gWCBvbiBNIChob3VycyBzaW5jZSBkYXduIG9uIGNvZmZlZSBjb25zdW1wdGlvbikNCiAgICAtUGF0aCAiYSIgbXVzdCBiZSBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIDA7IElWIGFuZCBtZWRpYXRvciBtdXN0IGJlIHJlbGF0ZWQuDQoNCjMuIEVzdGltYXRlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBNIG9uIFkgY29udHJvbGxpbmcgZm9yIFggKGNvZmZlZSBjb25zdW1wdGlvbiBvbiB3YWtlZnVsbmVzcywgY29udHJvbGxpbmcgZm9yIGhvdXJzIHNpbmNlIGRhd24pDQogICAgLVBhdGggImIiIG11c3QgYmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSAwOyBtZWRpYXRvciBhbmQgRFYgbXVzdCBiZSByZWxhdGVkLg0KICAgIC1UaGUgZWZmZWN0IG9mIFggb24gWSBkZWNyZWFzZXMgd2l0aCB0aGUgaW5jbHVzaW9uIG9mIE0gaW4gdGhlIG1vZGVsDQoNCjQuIEVzdGltYXRlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBZIG9uIFggY29udHJvbGxpbmcgZm9yIE0gKHdha2VmdWxuZXNzIG9uIGhvdXJzIHNpbmNlIGRhd24sIGNvbnRyb2xsaW5nIGZvciBjb2ZmZWUgY29uc3VtcHRpb24pDQogICAgLVNob3VsZCBiZSBub24tc2lnbmlmaWNhbnQgYW5kIG5lYXJseSAwLg0KDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KIzEuIFRvdGFsIEVmZmVjdA0KZml0IDwtIGxtKFkgfiBYLCBkYXRhPU1lZGRhdGEpDQpzdW1tYXJ5KGZpdCkNCg0KIzIuIFBhdGggQSAoWCBvbiBNKQ0KZml0YSA8LSBsbShNIH4gWCwgZGF0YT1NZWRkYXRhKQ0Kc3VtbWFyeShmaXRhKQ0KDQojMy4gUGF0aCBCIChNIG9uIFksIGNvbnRyb2xsaW5nIGZvciBYKQ0KZml0YiA8LSBsbShZIH4gTSArIFgsIGRhdGE9TWVkZGF0YSkNCnN1bW1hcnkoZml0YikNCg0KIzQuIFJldmVyc2VkIFBhdGggQyAoWSBvbiBYLCBjb250cm9sbGluZyBmb3IgTSkNCmZpdGMgPC0gbG0oWCB+IFkgKyBNLCBkYXRhPU1lZGRhdGEpDQpzdW1tYXJ5KGZpdGMpDQoNCiNTdW1tYXJ5IFRhYmxlDQpzdGFyZ2F6ZXIoZml0LCBmaXRhLCBmaXRiLCBmaXRjLCB0eXBlID0gInRleHQiLCB0aXRsZSA9ICJCYXJvbiBhbmQgS2VubnkgTWV0aG9kIikNCg0KYGBgDQoNCg0KIyMgSW50ZXJwcmV0aW5nIEJhcnJvbiAmIEtlbm55IFJlc3VsdHMNCg0KSGVyZSB3ZSBmaW5kIHRoYXQgb3VyIHRvdGFsIGVmZmVjdCBtb2RlbCBzaG93cyBhIHNpZ25pZmljYW50IHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGhvdXJzIHNpbmNlIGRhd24gKFgpIGFuZCB3YWtlZnVsbmVzcyAoWSkuIE91ciBQYXRoIEEgbW9kZWwgc2hvd3MgdGhhdCBob3VycyBzaW5jZSBkb3duIChYKSBpcyBhbHNvIHBvc2l0aXZlbHkgcmVsYXRlZCB0byBjb2ZmZWUgY29uc3VtcHRpb24gKE0pLiBPdXIgUGF0aCBCIG1vZGVsIHRoZW4gc2hvd3MgdGhhdCBjb2ZmZWUgY29uc3VtcHRpb24gKE0pIHBvc2l0aXZlbHkgcHJlZGljdHMgd2FrZWZ1bG5lc3MgKFkpIHdoZW4gY29udHJvbGxpbmcgZm9yIGhvdXJzIHNpbmNlIGRhd24gKFgpLiBGaW5hbGx5LCB3YWtlZnVsbmVzcyAoWSkgZG9lcyBub3QgcHJlZGljdCBob3VycyBzaW5jZSBkYXduIChYKSB3aGVuIGNvbnRyb2xsaW5nIGZvciBjb2ZmZWUgY29uc3VtcHRpb24gKE0pLiANCg0KU2luY2UgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGhvdXJzIHNpbmNlIGRhd24gYW5kIHdha2VmdWxuZXNzIGlzIG5vIGxvbmdlciBzaWduaWZpY2FudCB3aGVuIGNvbnRyb2xsaW5nIGZvciBjb2ZmZWUgY29uc3VtcHRpb24sIHRoaXMgc3VnZ2VzdHMgdGhhdCBjb2ZmZWUgY29uc3VtcHRpb24gZG9lcyBpbiBmYWN0IG1lZGlhdGUgdGhpcyByZWxhdGlvbnNoaXAuIEhvd2V2ZXIsIHRoaXMgbWV0aG9kIGFsb25lIGRvZXMgbm90IGFsbG93IGZvciBhIGZvcm1hbCB0ZXN0IG9mIHRoZSBpbmRpcmVjdCBlZmZlY3Qgc28gd2UgZG9uJ3Qga25vdyBpZiB0aGUgY2hhbmdlIGluIHRoaXMgcmVsYXRpb25zaGlwIGlzIHRydWx5IG1lYW5pbmdmdWwuDQoNClRoZXJlIGFyZSB0d28gcHJpbWFyeSBtZXRob2RzIGZvciBmb3JtYWxseSB0ZXN0aW5nIHRoZSBzaWduaWZpY2FuY2Ugb2YgdGhlIGluZGlyZWN0IHRlc3Q6IHRoZSBTb2JlbCB0ZXN0ICYgYm9vdHN0cmFwcGluZyAoY292ZXJlZCB1bmRlciB0aGUgKm1lZGlhdGF0aW9uKiBtZXRob2QpLg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRX0NCiNTb2JlbCBUZXN0DQpsaWJyYXJ5KG11bHRpbGV2ZWwpDQo/c29iZWwNCnNvYmVsKE1lZGRhdGEkWCwgTWVkZGF0YSRNLCBNZWRkYXRhJFkpDQoNCiNvcg0KbGlicmFyeShiZGEpDQptZWRpYXRpb24udGVzdChNLFgsWSkNCmBgYA0KDQpUaGUgU29iZWwgVGVzdCB1c2VzIGEgc3BlY2lhbGl6ZWQgdC10ZXN0IHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIHNpZ25pZmljYW50IHJlZHVjdGlvbiBpbiB0aGUgZWZmZWN0IG9mIFggb24gWSB3aGVuIE0gaXMgcHJlc2VudC4gVXNpbmcgdGhlIHNvYmVsIGZ1bmN0aW9uIG9mIHRoZSAqbXVsdGlsZXZlbCogcGFja2FnZSB3aWxsIHNob3cgcHJvdmlkZSB5b3Ugd2l0aCB0aHJlZSBvZiB0aGUgYmFzaWMgbW9kZWxzIHdlIHJhbiBiZWZvcmUgKE1vZDEgPSBUb3RhbCBFZmZlY3Q7IE1vZDIgPSBQYXRoIEI7IGFuZCBNb2QzID0gUGF0aCBBKSBhcyB3ZWxsIGFzIGFuIGVzdGltYXRlIG9mIHRoZSBpbmRpcmVjdCBlZmZlY3QsIHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGF0IGVmZmVjdCwgYW5kIHRoZSB6LXZhbHVlIGZvciB0aGF0IGVmZmVjdC4gWW91IGNhbiBlaXRoZXIgdXNlIHRoaXMgdmFsdWUgdG8gY2FsY3VsYXRlIHlvdXIgcC12YWx1ZSBvciBydW4gdGhlIG1lZGlhdGlvbi50ZXN0IGZ1bmN0aW9uIGZyb20gdGhlICpiZGEqIHBhY2thZ2UgdG8gcmVjZWl2ZSBhIHAtdmFsdWUgZm9yIHRoaXMgZXN0aW1hdGUuIA0KDQpJbiB0aGlzIGNhc2UsIHdlIGNhbiBub3cgY29uZmlybSB0aGF0IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBob3VycyBzaW5jZSBkYXduIGFuZCBmZWVsaW5ncyBvZiB3YWtlZnVsbmVzcyBhcmUgc2lnbmlmaWNhbnRseSBtZWRpYXRlZCBieSB0aGUgY29uc3VtcHRpb24gb2YgY29mZmVlICh6JyA9IDMuODQsICpwKiA8IC4wMDEpLg0KDQpIb3dldmVyLCB0aGUgU29iZWwgVGVzdCBpcyBsYXJnZWx5IGNvbnNpZGVyZWQgYW4gb3V0ZGF0ZWQgbWV0aG9kIHNpbmNlIGl0IGFzc3VtZXMgdGhhdCB0aGUgaW5kaXJlY3QgZWZmZWN0IChhYikgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgYW5kIHRlbmRzIHRvIG9ubHkgaGF2ZSBhZGVxdWF0ZSBwb3dlciB3aXRoIGxhcmdlIHNhbXBsZSBzaXplcy4gVGh1cywgYWdhaW4sIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byB1c2UgdGhlICptZWRpYXRpb24qIGJvb3RzdHJhcHBpbmcgbWV0aG9kIGluc3RlYWQuDQoNCg0KIyMgTWV0aG9kIDI6IFRoZSAqTWVkaWF0aW9uKiBQYWNha2dlIE1ldGhvZA0KDQpUaGlzIHBhY2thZ2UgdXNlcyB0aGUgbW9yZSByZWNlbnQgYm9vdHN0cmFwcGluZyBtZXRob2Qgb2YgUHJlYWNoZXIgJiBIYXllcyAoMjAwNCkgdG8gYWRkcmVzcyB0aGUgcG93ZXIgbGltaXRhdGlvbnMgb2YgdGhlIFNvYmVsIFRlc3QuIFRoaXMgbWV0aG9kIGNvbXB1dGVzIHRoZSBwb2ludCBlc3RpbWF0ZSBvZiB0aGUgaW5kaXJlY3QgZWZmZWN0IChhYikgb3ZlciBhIGxhcmdlIG51bWJlciBvZiByYW5kb20gc2FtcGxlICh0eXBpY2FsbHkgMTAwMCkgc28gaXQgZG9lcyBub3QgYXNzdW1lIHRoYXQgdGhlIGRhdGEgYXJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGFuZCBpcyBlc3BlY2lhbGx5IG1vcmUgc3VpdGFibGUgZm9yIHNtYWxsIHNhbXBsZSBzaXplcyB0aGFuIHRoZSBCYXJyb24gJiBLZW5ueSBtZXRob2QuDQoNClRvIHJ1biB0aGUgKm1lZGlhdGUqIGZ1bmN0aW9uLCB3ZSB3aWxsIGFnYWluIG5lZWQgYSBtb2RlbCBvZiBvdXIgSVYgKGhvdXJzIHNpbmNlIGRhd24pLCBwcmVkaWN0aW5nIG91ciBtZWRpYXRvciAoY29mZmVlIGNvbnN1bXB0aW9uKSBsaWtlIG91ciBQYXRoIEEgbW9kZWwgYWJvdmUuIFdlIHdpbGwgYWxzbyBuZWVkIGEgbW9kZWwgb2YgdGhlIGRpcmVjdCBlZmZlY3Qgb2Ygb3VyIElWIChob3VycyBzaW5jZSBkYXduKSBvbiBvdXIgRFYgKHdha2VmdWxuZXNzKSwgd2hlbiBjb250cm9sbGluZyBmb3Igb3VyIG1lZGlhdG9yIChjb2ZmZWUgY29uc3VtcHRpb24pLiBXaGVuIGNhbiB0aGVuIHVzZSAqbWVkaWF0ZSogdG8gcmVwZWF0ZWRseSBzaW11bGF0ZSBhIGNvbXBhcnNpb24gYmV0d2VlbiB0aGVzZSBtb2RlbHMgYW5kIHRvIHRlc3QgdGhlIHNpZ25pZmNhbmNlIG9mIHRoZSBpbmRpcmVjdCBlZmZlY3Qgb2YgY29mZmVlIGNvbnN1bXB0aW9uLiANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9DQoNCiNNZWRpYXRlIHBhY2thZ2UNCmxpYnJhcnkobWVkaWF0aW9uKQ0KP21lZGlhdGUNCmZpdE0gPC0gbG0oTSB+IFgsICAgICBkYXRhPU1lZGRhdGEpICNJViBvbiBNOyBIb3VycyBzaW5jZSBkYXduIHByZWRpY3RpbmcgY29mZmVlIGNvbnN1bXB0aW9uDQpmaXRZIDwtIGxtKFkgfiBYICsgTSwgZGF0YT1NZWRkYXRhKSAjSVYgYW5kIE0gb24gRFY7IEhvdXJzIHNpbmNlIGRhd24gYW5kIGNvZmZlZSBwcmVkaWN0aW5nIHdha2VmdWxuZXNzDQpndmxtYShmaXRNKSAjZGF0YSBpcyBwb3NpdGl2ZWx5IHNrZXdlZDsgY291bGQgbG9nIHRyYW5zZm9ybSAoc2VlIENoYXAuIDEwIG9uIGFzc3VtcHRpb25zKQ0KZ3ZsbWEoZml0WSkNCmZpdE1lZCA8LSBtZWRpYXRlKGZpdE0sIGZpdFksIHRyZWF0PSJYIiwgbWVkaWF0b3I9Ik0iKQ0Kc3VtbWFyeShmaXRNZWQpDQpwbG90KGZpdE1lZCkNCg0KI0Jvb3RzdHJhcA0KZml0TWVkQm9vdCA8LSBtZWRpYXRlKGZpdE0sIGZpdFksIGJvb3Q9VFJVRSwgc2ltcz05OTksIHRyZWF0PSJYIiwgbWVkaWF0b3I9Ik0iKQ0Kc3VtbWFyeShmaXRNZWRCb290KQ0KDQpwbG90KGZpdE1lZEJvb3QpDQoNCmBgYA0KDQoNCg0KIyMgSW50ZXJwcmV0aW5nICpNZWRpYXRpb24qIFJlc3VsdHMNCg0KVGhlICptZWRpYXRlKiBmdW5jdGlvbiBnaXZlcyB1cyBvdXIgQXZlcmFnZSBDYXVzYWwgTWVkaWF0aW9uIEVmZmVjdHMgKEFDTUUpLCBvdXIgQXZlcmFnZSBEaXJlY3QgRWZmZWN0cyAoQURFKSwgb3VyIGNvbWJpbmVkIGluZGlyZWN0IGFuZCBkaXJlY3QgZWZmZWN0cyAoVG90YWwgRWZmZWN0KSwgYW5kIHRoZSByYXRpbyBvZiB0aGVzZSBlc3RpbWF0ZXMgKFByb3AuIE1lZGlhdGVkKS4gVGhlIEFDTUUgaGVyZSBpcyB0aGUgaW5kaXJlY3QgZWZmZWN0IG9mIE0gKHRvdGFsIGVmZmVjdCAtIGRpcmVjdCBlZmZlY3QpIGFuZCB0aHVzIHRoaXMgdmFsdWUgdGVsbHMgdXMgaWYgb3VyIG1lZGlhdGlvbiBlZmZlY3QgaXMgc2lnbmlmaWNhbnQuIA0KDQpJbiB0aGlzIGNhc2UsIG91ciAqKmZpdE1lZCoqIG1vZGVsIGFnYWluIHNob3dzIGEgc2lnbmlmY2FudCBhZmZlY3Qgb2YgY29mZmVlIGNvbnN1bXB0aW9uIG9uIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBob3VycyBzaW5jZSBkYXduIGFuZCBmZWVsaW5ncyBvZiB3YWtlZnVsbmVzcywgKEFDTUUgPSAuMjgsICpwKiA8IC4wMDEpIHdpdGggbm8gZGlyZWN0IGVmZmVjdCBvZiBob3VycyBzaW5jZSBkYXduIChBREUgPSAtMC4xMSwgKnAqID0gLjI3KSBhbmQgc2lnbmlmaWNhbnQgdG90YWwgZWZmZWN0ICgqcCogPCAuMDUpLiANCg0KV2UgY2FuIHRoZW4gYm9vdHN0cmFwIHRoaXMgY29tcGFyaXNvbiB0byB2ZXJpZnkgdGhpcyByZXN1bHQgaW4gKipmaXRNZWRCb290KiogYW5kIGFnYWluIGZpbmQgYSBzaWduaWZpY2FudCBtZWRpYXRpb24gZWZmZWN0IChBQ01FID0gLjI4LCAqcCogPCAuMDAxKSBhbmQgbm8gZGlyZWN0IGVmZmVjdCBvZiBob3VycyBzaW5jZSBkYXduIChBREUgPSAtMC4xMSwgKnAqID0gLjI3KS4gSG93ZXZlciwgd2l0aCBpbmNyZWFzZWQgcG93ZXIsIHRoaXMgYW5hbHlzaXMgbm8gbG9uZ2VyIHNob3dzIGEgc2lnbmlmaWNhbnQgdG90YWwgZWZmZWN0ICgqcCogPSAuMDgpLg0KDQoNCiMgTW9kZXJhdGlvbiBBbmFseXNlcw0KDQpNb2RlcmF0aW9uIHRlc3RzIHdoZXRoZXIgYSB2YXJpYWJsZSAoWikgYWZmZWN0cyB0aGUgZGlyZWN0aW9uIGFuZC9vciBzdHJlbmd0aCBvZiB0aGUgcmVsYXRpb24gYmV0d2VlbiBhbiBJViAoWCkgYW5kIGEgRFYgKFkpLiBJbiBvdGhlciB3b3JkcywgbW9kZXJhdGlvbiB0ZXN0cyBmb3IgaW50ZXJhY3Rpb25zIHRoYXQgYWZmZWN0IFdIRU4gcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHZhcmlhYmxlcyBvY2N1ci4gTW9kZXJhdG9ycyBhcmUgY29uY2VwdHVhbGx5IGRpZmZlcmVudCBmcm9tIG1lZGlhdG9ycyAod2hlbiB2ZXJzdXMgaG93L3doeSkgYnV0IHNvbWUgdmFyaWFibGVzIG1heSBiZSBhIG1vZGVyYXRvciBvciBhIG1lZGlhdG9yIGRlcGVuZGluZyBvbiB5b3VyIHF1ZXN0aW9uLiBTZWUgdGhlICptZWRpYXRpb24qIHBhY2thZ2UgZG9jdW1lbnRhdGlvbiBmb3Igd2F5cyBvZiB0ZXN0aW5nIG1vcmUgY29tcGxpY2F0ZWQgbWVkaWF0ZWQgbW9kZXJhdGlvbi9tb2RlcmF0ZWQgbWVkaWF0aW9uIHJlbGF0aW9uc2hpcHMuICANCg0KTGlrZSBtZWRpYXRpb24sIG1vZGVyYXRpb24gYXNzdW1lcyB0aGF0IHRoZXJlIGlzIGxpdHRsZSB0byBubyBtZWFzdXJlbWVudCBlcnJvciBpbiB0aGUgbW9kZXJhdG9yIHZhcmlhYmxlIGFuZCB0aGF0IHRoZSBEViBkaWQgbm90IENBVVNFIHRoZSBtb2RlcmF0b3IuIElmIG1vZGVyYXRvciBlcnJvciBpcyBsaWtlbHkgdG8gYmUgaGlnaCwgcmVzZWFyY2hlcnMgc2hvdWxkIGNvbGxlY3QgbXVsdGlwbGUgaW5kaWNhdG9ycyBvZiB0aGUgY29uc3RydWN0IGFuZCB1c2UgU0VNIHRvIGVzdGltYXRlIGxhdGVudCB2YXJpYWJsZXMuIFRoZSBzYWZlc3Qgd2F5cyB0byBtYWtlIHN1cmUgeW91ciBtb2RlcmF0b3IgaXMgbm90IGNhdXNlZCBieSB5b3VyIERWIGFyZSB0byBleHBlcmltZW50YWxseSBtYW5pcHVsYXRlIHRoZSB2YXJpYWJsZSBvciBjb2xsZWN0IHRoZSBtZWFzdXJlbWVudCBvZiB5b3VyIG1vZGVyYXRvciBiZWZvcmUgeW91IGludHJvZHVjZSB5b3VyIElWLiANCg0KIVtCYXNpYyBNb2RlcmF0aW9uIE1vZGVsLl0oaW1hZ2VzXG1vZGVyYXRpb24ucG5nKQ0KDQoNCiMjIEV4YW1wbGUgTW9kZXJhdGlvbiBEYXRhIA0KDQpTZXQgYW4gYXBwcm9wcmlhdGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgZGF0YSBzZXQuIA0KDQpJbiB0aGlzIGV4YW1wbGUgd2UnbGwgc2F5IHdlIGFyZSBpbnRlcmVzdGVkIGluIHdoZXRoZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgaG91cnMgb2Ygc2xlZXAgKFgpIGEgZ3JhZHVhdGUgc3R1ZGVudCByZWNlaXZlcyBhbmQgdGhlIGF0dGVudGlvbiB0aGF0IHRoZXkgcGF5IHRvIHRoaXMgdHV0b3JpYWwgKFkpIGlzIGluZmx1ZW5jZWQgYnkgdGhlaXIgY29uc3VtcHRpb24gb2YgY29mZmVlIChaKS4gSGVyZSB3ZSBjcmVhdGUgdGhlIG1vZGVyYXRpb24gZWZmZWN0IGJ5IG1ha2luZyBvdXIgRFYgKFkpIHRoZSBwcm9kdWN0IG9mIGxldmVscyBvZiB0aGUgSVYgKFgpIGFuZCBvdXIgbW9kZXJhdG9yIChaKS4gDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KI3NldHdkKCJsb2NhdGlvbiIpICNXb3JraW5nIGRpcmVjdG9yeQ0Kc2V0LnNlZWQoMTIzKSNTdGFuZGFyZGl6ZXMgdGhlIG51bWJlcnMgZ2VuZXJhdGVkIGJ5IHJub3JtOyBzZWUgQ2hhcHRlciA1DQpOICA8LSAxMDAgI051bWJlciBvZiBwYXJ0aWNpcGFudHM7IGdyYWR1YXRlIHN0dWRlbnRzDQpYICA8LSBhYnMocm5vcm0oTiwgNiwgNCkpICNJVjsgSG91cnMgb2Ygc2xlZXANClgxIDwtIGFicyhybm9ybShOLCA2MCwgMzApKSAjQWRkaW5nIHNvbWUgc3lzdGVtYXRpYyB2YXJpYW5jZSBmb3Igb3VyIERWDQpaICA8LSBybm9ybShOLCAzMCwgOCkgI01vZGVyYXRvcjsgT3VuY2VzIG9mIGNvZmZlZSBjb25zdW1lZA0KWSAgPC0gYWJzKCgtMC44KlgpICogKDAuMipaKSAtIDAuNSpYIC0gMC40KlgxICsgMTAgKyBybm9ybShOLCAwLCAzKSkgI0RWOyBBdHRlbnRpb24gUGFpZA0KTW9kZGF0YSA8LSBkYXRhLmZyYW1lKFgsIFgxLCBaLCBZKQ0KDQpzdW1tYXJ5KE1vZGRhdGEpDQpgYGANCg0KIyMgTW9kZXJhdGlvbiBBbmFseXNpcw0KDQpNb2RlcmF0aW9uIGNhbiBiZSB0ZXN0ZWQgYnkgbG9va2luZyBmb3Igc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhlIG1vZGVyYXRpbmcgdmFyaWFibGUgKFopIGFuZCB0aGUgSVYgKFgpLiBOb3RhYmx5LCBpdCBpcyBpbXBvcnRhbnQgdG8gbWVhbiBjZW50ZXIgYm90aCB5b3VyIG1vZGVyYXRvciBhbmQgeW91ciBJViB0byByZWR1Y2UgbXVsdGljb2xpbmVhcml0eSBhbmQgbWFrZSBpbnRlcnByZXRhdGlvbiBlYXNpZXIuIENlbnRlcmluZyBjYW4gYmUgZG9uZSB1c2luZyB0aGUgKnNjYWxlKiBmdW5jdGlvbiwgd2hpY2ggc3VidHJhY3RzIHRoZSBtZWFuIG9mIGEgdmFyaWFibGUgZnJvbSBlYWNoIHZhbHVlIGluIHRoYXQgdmFyaWFibGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSB1c2Ugb2YgY2VudGVyaW5nLCBzZWUgP3NjYWxlIGFuZCBhbnkgbnVtYmVyIG9mIHN0YXRpc3RpY2FsIHRleHRib29rcyB0aGF0IGNvdmVyIHJlZ3Jlc3Npb24gKHdlIHJlY29tbWVuZCBDb2hlbiwgMjAwOCkuIA0KDQpBIG51bWJlciBvZiBwYWNrYWdlcyBpbiBSIGNhbiBhbHNvIGJlIHVzZWQgdG8gY29uZHVjdCBhbmQgcGxvdCBtb2RlcmF0aW9uIGFuYWx5c2VzLCBpbmNsdWRpbmcgdGhlICptb2RlcmF0ZS5sbSogZnVuY3Rpb24gb2YgdGhlICpRdWFudFBzeWMqIHBhY2thZ2UgYW5kIHRoZSAqcGVxdW9kKiBwYWNrYWdlLiBIb3dldmVyLCBpdCBpcyBzaW1wbGUgdG8gZG8gdGhpcyAiYnkgaGFuZCIgdXNpbmcgdHJhZGl0aW9uYWwgbXVsdGlwbGUgcmVncmVzc2lvbiwgYXMgc2hvd24gaGVyZSwgYW5kIHRoZSB1bmRlcmx5aW5nIGFuYWx5c2lzIChpbnRlcmFjdGluZyB0aGUgbW9kZXJhdG9yIGFuZCB0aGUgSVYpIGluIHRoZXNlIHBhY2thZ2VzIGlzIGlkZW50aWNhbCB0byB0aGlzIGFwcHJvYWNoLiBUaGUgKnJvY2tjaGFsayogcGFja2FnZSB1c2VkIGhlcmUgaXMgb25lIG9mIG1hbnkgZ3JhcGhpbmcgYW5kIHBsb3R0aW5nIHBhY2thZ2VzIGF2YWlsYWJsZSBpbiBSIGFuZCB3YXMgY2hvc2VuIGJlY2F1c2UgaXQgd2FzIGVzcGVjaWFsbHkgZGVzaWduZWQgZm9yIHVzZSB3aXRoIHJlZ3Jlc3Npb24gYW5hbHlzZXMgKHVubGlrZSB0aGUgbW9yZSBnZW5lcmFsIGdyYXBoaW5nIG9wdGlvbnMgZGVzY3JpYmVkIGluIENoYXB0ZXJzIDggJiA5KS4NCg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRX0NCg0KI0NlbnRlcmluZyBEYXRhDQpYYyAgICA8LSBjKHNjYWxlKFgsIGNlbnRlcj1UUlVFLCBzY2FsZT1GQUxTRSkpICNDZW50ZXJpbmcgSVY7IGhvdXJzIG9mIHNsZWVwDQpaYyAgICA8LSBjKHNjYWxlKFosICBjZW50ZXI9VFJVRSwgc2NhbGU9RkFMU0UpKSAjQ2VudGVyaW5nIG1vZGVyYXRvcjsgY29mZmVlIGNvbnN1bXB0aW9uDQoNCiNNb2RlcmF0aW9uICJCeSBIYW5kIg0KbGlicmFyeShndmxtYSkNCmZpdE1vZCA8LSBsbShZIH4gWGMgKyBaYyArIFhjKlpjKSAjTW9kZWwgaW50ZXJhY3RzIElWICYgbW9kZXJhdG9yDQpzdW1tYXJ5KGZpdE1vZCkNCmNvZWYoc3VtbWFyeShmaXRNb2QpKQ0KZ3ZsbWEoZml0TW9kKSAjZGF0YSBpcyBwb3NpdGl2ZWx5IHNrZXdlZDsgY291bGQgbG9nIHRyYW5zZm9ybSAoc2VlIENoYXAuIDEwKQ0KDQojRGF0YSBTdW1tYXJ5DQpsaWJyYXJ5KHN0YXJnYXplcikNCnN0YXJnYXplcihmaXRNb2QsdHlwZT0idGV4dCIsIHRpdGxlID0gIlNsZWVwIGFuZCBDb2ZmZWUgb24gQXR0ZW50aW9uIikNCg0KI1Bsb3R0aW5nDQpsaWJyYXJ5KHJvY2tjaGFsaykNCnBzICA8LSBwbG90U2xvcGVzKGZpdE1vZCwgcGxvdHg9IlhjIiwgbW9keD0iWmMiLCB4bGFiID0gIlNsZWVwIiwgeWxhYiA9ICJBdHRlbnRpb24gUGFpZCIsIG1vZHhWYWxzID0gInN0ZC5kZXYiKQ0KDQoNCg0KDQpgYGANCg0KDQojIyBJbnRlcnByZXRpbmcgTW9kZXJhdGlvbiBSZXN1bHRzDQoNClJlc3VsdHMgYXJlIHByZXNlbnRlZCBzaW1pbGFyIHRvIHJlZ3VsYXIgbXVsdGlwbGUgcmVncmVzc2lvbiByZXN1bHRzIChzZWUgQ2hhcHRlciAxMCkuIFNpbmNlIHdlIGhhdmUgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb25zIGluIHRoaXMgbW9kZWwsIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW50ZXJwcmV0IHRoZSBzZXBhcmF0ZSBtYWluIGVmZmVjdHMgb2YgZWl0aGVyIG91ciBJViBvciBvdXIgbW9kZXJhdG9yLg0KDQpPdXIgYnkgaGFuZCBtb2RlbCBzaG93cyBhIHNpZ25pZmljYW50IGludGVyYWN0aW9uIGJldHdlZW4gaG91cnMgc2xlcHQgYW5kIGNvZmZlZSBjb25zdW1wdGlvbiBvbiBhdHRlbnRpb24gcGFpZCB0byB0aGlzIHR1dG9yaWFsIChiID0gLjIzLCBTRSA9IC4wNCwgKnAqIDwgLjAwMSkuIEhvd2V2ZXIsIHdlJ2xsIG5lZWQgdG8gdW5wYWNrIHRoaXMgaW50ZXJhY3Rpb24gdmlzdWFsbHkgdG8gZ2V0IGEgYmV0dGVyIGlkZWEgb2Ygd2hhdCB0aGlzIG1lYW5zLg0KDQpUaGUgKnJvY2tjaGFsayogZnVuY3Rpb24gd2lsbCBhdXRvbWF0aWNhbGx5IHBsb3QgdGhlIHNpbXBsZSBzbG9wZXMgKDEgU0QgYWJvdmUgYW5kIDEgU0QgYmVsb3cgdGhlIG1lYW4pIG9mIHRoZSBtb2RlcmF0aW5nIGVmZmVjdC4gVGhpcyBmaWd1cmUgc2hvd3MgdGhhdCB0aG9zZSB3aG8gZHJhbmsgbGVzcyBjb2ZmZWUgKHRoZSBibGFjayBsaW5lKSBwYWlkIG1vcmUgYXR0ZW50aW9uIHdpdGggdGhlIG1vcmUgc2xlZXAgdGhhdCB0aGV5IGdvdCBsYXN0IG5pZ2h0IGJ1dCBwYWlkIGxlc3MgYXR0ZW50aW9uIG92ZXJhbGwgdGhhdCBhdmVyYWdlICh0aGUgcmVkIGxpbmUpLiBUaG9zZSB3aG8gZHJhbmsgbW9yZSBjb2ZmZWUgKHRoZSBncmVlbiBsaW5lKSBwYWlkIG1vcmUgd2hlbiB0aGV5IHNsZXB0IG1vcmUgYXMgd2VsbCBhbmQgcGFpZCBtb3JlIGF0dGVudGlvbiB0aGFuIGF2ZXJhZ2UuIFRoZSBkaWZmZXJlbmNlIGluIHRoZSBzbG9wZXMgZm9yIHRob3NlIHdobyBkcmFuayBtb3JlIG9yIGxlc3MgY29mZmVlIHNob3dzIHRoYXQgY29mZmVlIGNvbnN1bXB0aW9uIG1vZGVyYXRlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gaG91cnMgb2Ygc2xlZXAgYW5kIGF0dGVudGlvbiBwYWlkLiAgDQoNCiANCiMgUmVmZXJlbmNlcyBhbmQgRnVydGhlciBSZWFkaW5nDQpCYXJvbiwgUi4sICYgS2VubnksIEQuICgxOTg2KS4gVGhlIG1vZGVyYXRvci1tZWRpYXRvciB2YXJpYWJsZSBkaXN0aW5jdGlvbiBpbiBzb2NpYWwgcHN5Y2hvbG9naWNhbCByZXNlYXJjaDogQ29uY2VwdHVhbCwgc3RyYXRlZ2ljLCBhbmQgc3RhdGlzdGljYWwgY29uc2lkZXJhdGlvbnMuIEpvdXJuYWwgb2YgUGVyc29uYWxpdHkgYW5kIFNvY2lhbCBQc3ljaG9sb2d5LCA1MSwgMTE3My0xMTgyLg0KDQpDb2hlbiwgQi4gSC4gKDIwMDgpLiBFeHBsYWluaW5nIHBzeWNob2xvZ2ljYWwgc3RhdGlzdGljcy4gSm9obiBXaWxleSAmIFNvbnMuDQoNCkltYWksIEsuLCBLZWVsZSwgTC4sICYgVGluZ2xleSwgRC4gKDIwMTApLiBBIGdlbmVyYWwgYXBwcm9hY2ggdG8gY2F1c2FsIG1lZGlhdGlvbiBhbmFseXNpcy4gUHN5Y2hvbG9naWNhbCBtZXRob2RzLCAxNSg0KSwgMzA5Lg0KDQpNYWNLaW5ub24sIEQuIFAuLCBMb2Nrd29vZCwgQy4gTS4sIEhvZmZtYW4sIEouIE0uLCBXZXN0LCBTLiBHLiwgJiBTaGVldHMsIFYuICgyMDAyKS4gQSBjb21wYXJpc29uIG9mIG1ldGhvZHMgdG8gdGVzdCBtZWRpYXRpb24gYW5kIG90aGVyIGludGVydmVuaW5nIHZhcmlhYmxlIGVmZmVjdHMuIFBzeWNob2xvZ2ljYWwgbWV0aG9kcywgNygxKSwgODMuDQoNCk5pZSwgWS4sIExhdSwgUy4sICYgTGlhdSwgQS4gSy4gKDIwMTEpLiBSb2xlIG9mIGFjYWRlbWljIHNlbGYtZWZmaWNhY3kgaW4gbW9kZXJhdGluZyB0aGUgcmVsYXRpb24gYmV0d2VlbiB0YXNrIGltcG9ydGFuY2UgYW5kIHRlc3QgYW54aWV0eS4gTGVhcm5pbmcgYW5kIEluZGl2aWR1YWwgRGlmZmVyZW5jZXMsIDIxKDYpLCA3MzYtNzQxLg0KDQpUaW5nbGV5LCBELiwgWWFtYW1vdG8sIFQuLCBIaXJvc2UsIEsuLCBLZWVsZSwgTC4sICYgSW1haSwgSy4gKDIwMTQpLiBNZWRpYXRpb246IFIgcGFja2FnZSBmb3IgY2F1c2FsIG1lZGlhdGlvbiBhbmFseXNpcy4NCg0KPHNjcmlwdD4NCiAgKGZ1bmN0aW9uKGkscyxvLGcscixhLG0pe2lbJ0dvb2dsZUFuYWx5dGljc09iamVjdCddPXI7aVtyXT1pW3JdfHxmdW5jdGlvbigpew0KICAoaVtyXS5xPWlbcl0ucXx8W10pLnB1c2goYXJndW1lbnRzKX0saVtyXS5sPTEqbmV3IERhdGUoKTthPXMuY3JlYXRlRWxlbWVudChvKSwNCiAgbT1zLmdldEVsZW1lbnRzQnlUYWdOYW1lKG8pWzBdO2EuYXN5bmM9MTthLnNyYz1nO20ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSxtKQ0KICB9KSh3aW5kb3csZG9jdW1lbnQsJ3NjcmlwdCcsJ2h0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2FuYWx5dGljcy5qcycsJ2dhJyk7DQoNCiAgZ2EoJ2NyZWF0ZScsICdVQS05ODg3ODc5My0xJywgJ2F1dG8nKTsNCiAgZ2EoJ3NlbmQnLCAncGFnZXZpZXcnKTsNCg0KPC9zY3JpcHQ+