How To Draw A Moderation Graph
Basics
The following chapter will include:
- Basic information about interactions and unproblematic slopes
- Background to plotting interactions in R
- A real-life example
- Code to simulate data set
- Continuous 10 Continuous Regression: code and interpretation
- Nominal X Continuous Regression: code and interpretation
- Nominal Ten Nominal Regression: code and translation
What is an interaction?
Interaction: When the outcome of one independent variable differs based on the level or magnitude of another independent variable
- y = A + B + A*B
- y = dependent variable
- A = independent variable
- B = independent variabile
- A*B = interaction between A and B
For more than data about interactions in regression:
Click hither for Jaccard & Turrisi 2003 Interaction Effects in Multiple Regression
What is a simple slope?
-
A simple gradient is a regression line at one level of a predictor variable
-
Recollect of simple slopes as the visualization of an interaction
How exercise we plot these things in R?…
Interaction Plotting Packages
When running a regression in R, it is probable that yous will be interested in interactions. The following packages and functions are good places to start, merely the following chapter is going to teach y'all how to make custom interaction plots.
- lm() office: your basic regression role that volition give you interaction terms
- stargazer package, stargazer() function: pretty summary of regression results
- rockchalk package, plotSlopes() part: quick and bones graph of simple slopes
Why can't nosotros merely apply these packages?…
Benefits of Custom Interaction Plots
Using effects and ggplot2
- Total control over what you're plotting (i.e. x level of x variable)
- More accurate calculations of mean/error/etc.
- Can enter in own values for conviction intervals, standard error confined, etc.
- Can customize every aspect of the graphs (color, size of text, data points)
We go from "quick & muddied" uncomplicated slope plots to "pretty & customizable" graphs
The Packages You Need
If you lot don't already have these packages installed, use the following functions to exercise so:
#install.packages("auto") #An extremely useful/in-depth regression parcel #install.packages("stargazer") #Produces easy to read regression results (like to what you get in SPSS) #install.packages("furnishings") #We will utilize this to create our interactions #install.packages("ggplot2") #Our incredibly powerful and versatile graphing package **Ane final thing before we get started…*
If the words "interaction" or "linear model" are sounding a little foreign, check out Chapter 12 for an awesome regression refresher!!
Continuous x Continuous Regression
IQ and Work Ethic as Predictors of GPA
For all the examples in this chapter, nosotros are really going to simulate our own information. This eliminates the need for downloading a data set / calling in data.
Simulate your data
library(car) #Even though nosotros already installed "car", we have to tell R we want it to load this package for us to utilize #You can choose whatsoever # yous want for the seed; this is for randomization of your data set ready.seed(150) #Permit's brand our data set up will take 250 participants (north), perchance college students! north <- 250 #Uniform distribution of work ethic (X) from 1-5 (one = poor work ethic, 5 = nifty work ethic) X <- rnorm(n, 2.75, .75) #Nosotros want a normal distribution of IQ (Z) #I fixed the mean of IQ to xv and then that the regression equation works realistically, SD = fifteen Z <- rnorm(n, 15, fifteen) #We then create Y using a regression equation (calculation a flake of random dissonance) Y <- .7*X + .3*Z + two.5*X*Z + rnorm(n, sd = 5) #This code is hither and then that Y (GPA) is capped at iv.0 (the logical max for GPA) Y = (Y - min(Y)) / (max(Y) - min(Y))*4 #Finally, we put our data together with the information.frame() function GPA.Data <- data.frame(GPA=Y, Piece of work.Ethic=X, IQ=Z) Center your independent variables
Why exercise we centre our variables?
- To avoid problems of multicollinearity! When a model has multicollinearity, it doesn't know which term to give the variance to ("You gave me 3 lines that are the aforementioned!" - angry model)
- When we heart our IVs, the center of each IV represents the hateful
- When you interact X * Z, you are adding a new predictor (XZ) that strongly correlates with X and Z
- If you center your variables, yous volition at present have a U-shaped interaction that is orthogonal to X and Z
- Exceptions: Don't center physical information or when there is a true, meaningful 0
GPA.Data$IQ.C <- scale(GPA.Information$IQ, middle = TRUE, scale = FALSE)[,] GPA.Data$Work.Ethic.C <- scale(GPA.Data$Work.Ethic, centre = True, calibration = Fake)[,] Run your regression models
Employ lm() function to run model with and without interaction
- Additive effects = +
- Multiplicative (interaction) effects = *
Use stargazer() to become a pretty, user-friendly chart of your results
GPA.Model.i <- lm(GPA~IQ.C+Piece of work.Ethic.C, GPA.Data) GPA.Model.ii <- lm (GPA~IQ.C*Work.Ethic.C, GPA.Information) library(stargazer) stargazer(GPA.Model.one, GPA.Model.2,type="html", cavalcade.labels = c("Main Effects", "Interaction"), intercept.lesser = FALSE, single.row=Imitation, notes.append = Fake, header=Fake) | Dependent variable: | ||
| GPA | ||
| Chief Effects | Interaction | |
| (ane) | (two) | |
| Constant | 2.054*** | ii.054*** |
| (0.008) | (0.002) | |
| IQ.C | 0.041*** | 0.040*** |
| (0.001) | (0.0001) | |
| Work.Ethic.C | 0.199*** | 0.202*** |
| (0.012) | (0.002) | |
| IQ.C:Work.Ethic.C | 0.014*** | |
| (0.0002) | ||
| Observations | 250 | 250 |
| Rii | 0.959 | 0.998 |
| Adapted R2 | 0.959 | 0.998 |
| Residuum Std. Fault | 0.134 (df = 247) | 0.026 (df = 246) |
| F Statistic | 2,888.028*** (df = 2; 247) | 51,713.400*** (df = iii; 246) |
| Note: | p<0.ane; p<0.05; p<0.01 | |
Plot your interaction
When nosotros are plotting the simple slopes of a continuous IV X continuous IV, we accept to specify what levels of each we want to examine. There are iii methods for choosing levels: hand picking, quantiles, standard deviation
For the next 3 methods, we are going to specify the centered Work Ethic IV to range from -ii.5 to two.five, increasing by .5, but for the centered IQ Four, nosotros will prove three different theoretical means to choose our levels.
Plotting simple slopes: Paw Picking
- Hand picking is useful if you take specific predictions in your information fix
- If you are working with IQ, a drug, or age - numbers are relevant and are useful to selection!
- For our instance, let's become with -fifteen, 0, 15 for our centered IQ (ane SD above and below hateful)
- c() will give you the exact values and seq() volition give y'all a range from a to b, increasing by c
library(effects) #Run the interaction Inter.HandPick <- result('IQ.C*Work.Ethic.C', GPA.Model.two, xlevels=list(IQ.C = c(-xv, 0, fifteen), Work.Ethic.C = c(-1.1, 0, i.one)), se=TRUE, confidence.level=.95, typical=mean) #Put information in information frame Inter.HandPick <- as.information.frame(Inter.HandPick) #Check out what the "head" (first 6 rows) of your data looks similar head(Inter.HandPick) ## IQ.C Work.Ethic.C fit se lower upper ## 1 -15 -1.i 1.464610 0.004670705 i.455410 i.473809 ## ii 0 -1.one 1.831723 0.003040883 1.825734 1.837713 ## 3 15 -1.1 2.198836 0.004717661 2.189544 2.208129 ## 4 -xv 0.0 1.460340 0.002350381 1.455711 1.464970 ## v 0 0.0 2.054450 0.001663308 ii.051174 2.057726 ## 6 15 0.0 ii.648560 0.002348376 two.643934 two.653185 #Create a factor of the IQ variable used in the interaction Inter.HandPick$IQ <- gene(Inter.HandPick$IQ.C, levels=c(-15, 0, xv), labels=c("1 SD Below Population Mean", "Population Mean", "one SD In a higher place Population Mean")) #Create a factor of the Work Ethic variable used in the interaction Inter.HandPick$Work.Ethic <- factor(Inter.HandPick$Work.Ethic.C, levels=c(-1.one, 0, ane.1), labels=c("Poor Worker", "Average Worker", "Hard Worker")) library(ggplot2) Plot.HandPick<-ggplot(data=Inter.HandPick, aes(x=Piece of work.Ethic, y=fit, group=IQ))+ geom_line(size=two, aes(colour=IQ))+ ylim(0,4)+ ylab("GPA")+ xlab("Piece of work Ethic")+ ggtitle("Paw Picked Plot") Plot.HandPick
#In R, you have to "phone call for" your graphs later yous make them in guild to see them #Lawmaking to save plot to your reckoner #ggsave("Plot.1.png", Plot.1,width = 5, top = 5, units = "in") Interpretation of Mitt Picked Plot
This plot here is an example of pretty much the simplest yous can get with ggplot. These are the default settings with respect to all artful elements. As we become through this chapter, I volition give you bits of lawmaking that will help you make your graph prettier, more colorful, or better suited for publishing.
For fifty-fifty more ggplot fun, refer to Affiliate x or this awesome ggplot Cheat Sheet
In terms of what this graph is telling us, we tin visualize the fact that for smart people (1 SD above the population mean (not adamant by our data prepare), as their piece of work ethic increases, then does their GPA. A similar blueprint is seen for people with average IQs, though the result is not nearly equally stiff. For people one SD beneath the population mean on IQ, every bit their work ethic increases, information technology appears equally though their GPA really decreases. Interesting! Maybe they get more confused with the cloth? Who knows!
Plotting simple slopes: Quantile
- Let'southward apply levels that are based on quantiles (bins based on probability)
- Yous can enquire for as many or equally few quantiles as you want
- Non-parametric; based on probability and does not assume normality of 4
- For this example, let's inquire for v quantiles and have them rounded to 2 decimal points
#Make your new IQ variable that asks for quantiles IQ.Quantile <- quantile(GPA.Information$IQ.C, probs=c(0,.25,.fifty,.75,ane)) IQ.Quantile <- circular(IQ.Quantile, ii) IQ.Quantile ## 0% 25% 50% 75% 100% ## -46.38 -nine.94 -1.10 x.threescore 36.48 library(effects) #Run your interaction Inter.Quantile <- effect('IQ.C*Work.Ethic.C', GPA.Model.2, xlevels=list(IQ.C = c(-35.44, -9.78, -0.04, nine.89, 41.90), Work.Ethic.C = c(-i.1, 0, 1.1)), se=Truthful, confidence.level=.95, typical=hateful) #Put data into data frame Inter.Quantile <- as.data.frame(Inter.Quantile) #Create factors of the different variables in your interaction: Inter.Quantile$IQ<-factor(Inter.Quantile$IQ.C, levels=c(-35.44, -9.78, -0.04, ix.89, 41.90), labels=c("0%", "25%", "50%", "75%", "100%")) Inter.Quantile$Work.Ethic<-factor(Inter.Quantile$Piece of work.Ethic.C, levels=c(-1.1, 0, one.ane), labels=c("Poor Worker", "Average Worker", "Difficult Worker")) FUN WITH FONTS
install.packages(extrafont)
I did not include this package upward forepart, as it is totally optional! If you desire to play around with different font options, install this package and load it
After installation/loading, you will want to run the following lawmaking: font_import()
This code tin take a few minutes to run, which is why I have not included it in the coded section of this chapter.
The last function you will need is: fonts() You will get a list of all the fonts attainable to y'all in R
library(extrafont) #font_import() # run this line of coded here to install fonts library(ggplot2) Plot.Quantile<-ggplot(data=Inter.Quantile, aes(x=Work.Ethic, y=fit, group=IQ))+ geom_line(size=2, aes(color=IQ))+ ylab("GPA")+ xlab("Work Ethic")+ scale_color_manual(values=c("#42c5f4","#54f284","#f45dcc", "#ff9d35","#d7afff"))+ #custom color coding theme_bw()+ #deleting the grey background theme(text = element_text(family unit="Impact", size=xiv, colour="blackness"))+ #changing font! ggtitle("Quantile Plot") #adding a championship! Plot.Quantile
Interpretation of Quantile Plot
So to recap the codes we learned in this plot, we now know how to modify fonts, go rid of the grayness groundwork, add together a title, and choose custom colors!
You may exist wondering where I got these funky letter/number combinations that translate into colors. If you google "html color picker", you can copy the color code of any color your centre desires! Pretty keen!!
Now, in terms of what we're learning from this graph - nosotros tin see the interaction effects a lot more clearly. It seems as though all people in the 25th percentile or higher are experiencing some degreee of a positive relationship between work ethic and GPA. As piece of work ethic and IQ increase, so does GPA! Unfortunately, for this group below the 25th percentile, there is a pretty clear negative relationship indicating that is their work ethic increases, their GPA actually decreases. Not skilful!
Plotting uncomplicated slopes: Standard Deviation
- Lastly, allow's choose our levels based on the standard departure of the data
- Nosotros can select values based on the mean and SD of our data
- For this example, we will practice iii values: M - 1SD, M, M + 1SD, where M = mean
- Once once more, nosotros are going to round off these values at 2 decimal points with **round()
- Note: because we have centered our data, M = 0 & retrieve, centering doesn't modify our SD
- Some other note: since we "mitt picked" what we know to be the traditional hateful and SD for IQ, these levels should wait very similar to our kickoff simple slopes graph!
#Create our new variable for IQ based on the actual hateful/standard deviation in our data set IQ.SD <- c(mean(GPA.Data$IQ.C)-sd(GPA.Data$IQ.C), mean(GPA.Data$IQ.C), hateful(GPA.Data$IQ.C)+sd(GPA.Information$IQ.C)) IQ.SD <- circular(IQ.SD, 2) IQ.SD ## [1] -15.29 0.00 15.29 # Note: the mean is 0 because nosotros mean centered our data, pregnant we said, make # the mean of our information = 0! Also, we meet that our standard deviations are pretty # darn shut to the expected population standard deviations. Keep in listen that # this is imitation data, and most information in the real world volition not produce such # "typical" information Inter.SD <- consequence(c("IQ.C*Work.Ethic.C"), GPA.Model.2, xlevels=list(IQ.C=c(-14.75, 0, 14.75), Work.Ethic.C=c(-1.1, 0, i.one))) # put data in data frame Inter.SD <- as.data.frame(Inter.SD) # Create factors of the different variables in your interaction Inter.SD$IQ<-gene(Inter.SD$IQ.C, levels=c(-14.75, 0, fourteen.75), labels=c("1 SD Below Mean", "Mean", "1 SD Above Mean")) Inter.SD$Work.Ethic<-factor(Inter.SD$Work.Ethic.C, levels=c(-ane.ane, 0, 1.1), labels=c("Poor Worker", "Average Worker", "Hard Worker")) # Plot this bad male child! Plot.SD<-ggplot(data=Inter.SD, aes(ten=Work.Ethic, y=fit, grouping=IQ))+ geom_line(size=ane, aes(colour=IQ))+ #Tin accommodate the thickness of your lines geom_point(aes(colour = IQ), size=2)+ #Tin can adjust the size of your points geom_ribbon(aes(ymin=fit-se, ymax=fit+se),fill="greyness",alpha=.6)+ #Can adjust your mistake bars ylim(0,4)+ #Puts a limit on the y-axis ylab("GPA")+ #Adds a label to the y-centrality xlab("Work Ethic")+ #Adds a label to the x-axis ggtitle("Standard Deviation Plot")+ #Championship theme_bw()+ #Removes the grayness groundwork theme(console.grid.major=element_blank(), panel.grid.pocket-size=element_blank(), legend.key = element_blank())+ #Removes the lines scale_fill_grey() Plot.SD
Interpretation of SD plot
** Note - the error confined in this graph are very hard to see, because nosotros take very picayune error in our fake data set. For a full APA way graph, mistake bars would be expected.
Continuous ten Chiselled Regression
IQ x Gender (Male/Female person) every bit predictors of GPA
Now that we take gone through one full case of regression interactions, the next two sections should exist a bit easier. This upcoming section is going to expect at how you would run/plot a regression with 1 continuous predictor variable and 1 chiselled predictor variable.
Going off of our last example, allow'due south say we now want to investigate how piece of work ethic interacts with gender (as a categorical variable). Things get slightly trickier… Allow'due south cheque it out!
#Once once more, nosotros are going to brainstorm by simulating our data #Remember, your seed tin can be fix to annihilation! set.seed(140) #Staying with 250 participants for consistency's sake Northward <- 250 #Uniform distribution of piece of work ethic (X) from 1-v (one = poor work ethic, 5 = slap-up piece of work ethic) X <- rnorm(north, 2.75, .75) #Our newest variable, G, is a binary variable (0,i) for gender #We are asking the computer to create a dataset of 0s and 1s and telephone call it variable 1000 G <- sample(rep(c(0,1),N),N,replace = Fake) #This is our equation to create Y Y <- .7*X + .iii*G + 2*10*Yard + rnorm(n, sd = 5) #Gotta cap our Y variable at 4 (because it is GPA) Y = (Y - min(Y)) / (max(Y) - min(Y))*iv #Finally, let's put all our variables into a information frame #This is basically telling the computer "put all these variables I just fabricated into one data set" GPA.Data.2<-data.frame(GPA=Y, Work.Ethic=Ten, Gender=Thou) #Don't forget to center our continuous variable! GPA.Data.2$Work.Ethic.C <- scale(GPA.Information$Work.Ethic, center = TRUE, scale = Faux)[,] Dummy Coding
Here is where things get a little unlike..
What is Dummy Coding?
- It is the near common and basic way to analyze categorical variables in regression
- Every variable has a baseline/reference grouping that other "levels" go compared to
- R dummy codes automatically when it detects factor variables
- The question we are asking is: "how much does each group deviate from the reference?"
In this particular case, since in that location are merely two levels of the variable Gender (male person and female), it is quite a simple dummy code of 0, i. All males in the data set are assigned a 0 and all females are assigned a 1.
Previously, I wrote that R dummy codes automatically. While we get the 0s and 1s automatically, it is far more intuitive to rename our gene to something that makes more sense.
- Nosotros are creating a new variable, called Gender.F, where F stands for gene
- This variable now has levels with words, instead of merely 0s and 1s
- Notation: it is very of import that your labels are spelled right (or that you lot consistently spell your labels incorrectly) because you lot will be entering in these exact labels again when you create your interactions
GPA.Data.2$Gender.F <- factor(GPA.Information.2$Gender, level=c(0,ane), labels=c("Male person","Female")) Run your regression models
Utilize lm() function to run model with and without interaction
- Additive furnishings = +
- Multiplicative (interaction) effects = *
Use stargazer() to visualize your results
GPA.two.Model.1 <- lm(GPA~Work.Ethic.C+Gender.F, GPA.Data.ii) GPA.ii.Model.2 <- lm(GPA~Work.Ethic.C*Gender.F, GPA.Information.2) library(stargazer) stargazer(GPA.2.Model.1, GPA.2.Model.ii,type="html", column.labels = c("Master Effects", "Interaction"), intercept.bottom = Simulated, single.row=Imitation, notes.suspend = Imitation, header=FALSE) | Dependent variable: | ||
| GPA | ||
| Master Effects | Interaction | |
| (1) | (two) | |
| Constant | i.540*** | 1.539*** |
| (0.063) | (0.063) | |
| Work.Ethic.C | 0.136** | 0.175** |
| (0.060) | (0.081) | |
| Gender.FFemale | 0.570*** | 0.570*** |
| (0.087) | (0.087) | |
| Work.Ethic.C:Gender.FFemale | -0.087 | |
| (0.122) | ||
| Observations | 250 | 250 |
| R2 | 0.161 | 0.163 |
| Adjusted R2 | 0.154 | 0.153 |
| Residual Std. Error | 0.685 (df = 247) | 0.686 (df = 246) |
| F Statistic | 23.740*** (df = 2; 247) | xv.965*** (df = 3; 246) |
| Note: | p<0.ane; p<0.05; p<0.01 | |
Permit's go right into creating our interaction!
Go on in mind, we already turned Gender into a Factor with labeled levels, so nosotros tin can refer to the actual names of the levels (instead of numbers)
library(effects) #Our interaction Inter.GPA.2 <- effect('Work.Ethic.C*Gender.F', GPA.two.Model.2, xlevels=list(Work.Ethic.C = c(-1.1, 0, one.ane)), se=TRUE, conviction.level=.95, typical=mean) #Put information in information frame Inter.GPA.2<-as.data.frame(Inter.GPA.2) #Create factors of the interaction variables Inter.GPA.2$Piece of work.Ethic<-factor(Inter.GPA.2$Work.Ethic.C, levels=c(-i.1, 0, 1.ane), labels=c("Poor Worker", "Average Worker", "Hard Worker")) Inter.GPA.2$Gender<-factor(Inter.GPA.two$Gender.F, levels=c("Male", "Female")) #Note: when I create this Gender factor, I will no longer use ".F" so I don't accept to rename my legend in my plot library(ggplot2) #Plot information technology upwards! Plot.GPA.2<-ggplot(data=Inter.GPA.two, aes(10=Work.Ethic, y=fit, group=Gender))+ coord_cartesian(ylim = c(0,iv))+ #For ylim, specify the range of your DV (in our case, 0-4) geom_line(size=ii, aes(color=Gender))+ ylab("GPA")+ xlab("Piece of work Ethic")+ ggtitle("Work Ethic and Gender as Predictors of GPA")+ theme_bw()+ theme(panel.grid.major=element_blank(), panel.grid.pocket-size=element_blank())+ scale_fill_grey() Plot.GPA.2
#### Interpretation of Continuous ten Categorial Interaction Plot As you tin run across, at that place is not much of an interaction, which we would expect after seeing that our interaction result was insignificant.
Categorical x Categorical Regression
Tutors and Gender as Predictors of GPA
For the final example of the chapter, nosotros are going to await at plotting interactions with two categorical predictors. We know that students differ in their access to/use of tutoring and it would exist interesting to see how Gender interacts with tutoring services.
Students in this written report either accept:
- No Tutor
- Grouping Tutor
- Private Tutor
Data simulation
#Set up simulation set.seed(244) North <- 250 Q <- sample(rep(c(-1,0,i),N),N,supplant = Imitation) #Q = Tutor Status G <- sample(rep(c(0,1),N*three/2),N,supplant = Simulated) #Grand = Gender #Our equation to create Y Y <- .five*Q + .25*Thou + 2.5*Q*G+ 1 + rnorm(N, sd=2) #Put a cap on our Y Y = (Y - min(Y)) / (max(Y) - min(Y))*4 #Build our data frame GPA.Data.3<-data.frame(GPA=Y,Tutor=Q,Gender=Grand) Dummy coding
Similar to the last example, we are going to now create factors with dummy codes. This fourth dimension, however,we need to do this for BOTH predictor variables (gender & tutor) because nosotros take 2 categorical variables.
GPA.Data.3$Tutor.F <- gene(GPA.Data.three$Tutor, level=c(-1,0,1), labels=c("No Tutor", "Grouping Tutor", "Private Tutor")) GPA.Information.three$Gender.F <- factor(GPA.Data.3$Gender, level=c(0,1), labels=c("Male person", "Female")) Run your regression
In one case once more, we look at both our master effects model & interaction model and use stargazer to compare the two models.
GPA.three.Model.1<-lm(GPA ~ Tutor.F+Gender.F, data = GPA.Data.3) GPA.3.Model.ii<-lm(GPA ~ Tutor.F*Gender.F, data = GPA.Data.three) stargazer(GPA.3.Model.1, GPA.iii.Model.ii,type="html", column.labels = c("Principal Effects", "Interaction"), intercept.bottom = FALSE, single.row=TRUE, notes.append = Faux, omit.stat=c("ser"), star.cutoffs = c(0.05, 0.01, 0.001), header=FALSE) | Dependent variable: | ||
| GPA | ||
| Main Furnishings | Interaction | |
| (1) | (ii) | |
| Constant | ane.500*** (0.076) | 1.739*** (0.081) |
| Tutor.FGroup Tutor | 0.421*** (0.099) | 0.285* (0.127) |
| Tutor.FPrivate Tutor | 0.970*** (0.095) | 0.407*** (0.116) |
| Gender.FFemale | 0.120 (0.079) | -0.467*** (0.127) |
| Tutor.FGroup Tutor:Gender.FFemale | 0.410* (0.180) | |
| Tutor.FPrivate Tutor:Gender.FFemale | ane.250*** (0.173) | |
| Observations | 250 | 250 |
| Rii | 0.309 | 0.436 |
| Adjusted R2 | 0.301 | 0.424 |
| F Statistic | 36.721*** (df = 3; 246) | 37.693*** (df = 5; 244) |
| Note: | p<0.05; p<0.01; p<0.001 | |
Now for the interaction plot!
#The Interaction Inter.GPA.iii <- outcome('Tutor.F*Gender.F', GPA.iii.Model.2, se=Truthful) #Data Frame Inter.GPA.3.DF<-as.information.frame(Inter.GPA.3) # Relable them to put them back in lodge Inter.GPA.3.DF$Tutor.F <- cistron(Inter.GPA.3.DF$Tutor, level=c("No Tutor", "Group Tutor", "Private Tutor"), labels=c("No Tutor", "Group Tutor", "Private Tutor")) Inter.GPA.iii.DF$Gender.F <- factor(Inter.GPA.3.DF$Gender, level=c("Male", "Female"), labels=c("Male", "Female")) #Create plot Plot.GPA.3<-ggplot(data=Inter.GPA.3.DF, aes(x=Tutor.F, y=fit, group=Gender.F))+ geom_line(size=2, aes(color=Gender.F))+ geom_ribbon(aes(ymin=fit-se, ymax=fit+se,fill up=Gender.F),blastoff=.2)+ ylab("GPA")+ xlab("Tutor")+ ggtitle("Tutors and Gender as GPA Predictors")+ theme_bw()+ theme(text = element_text(size=12), legend.text = element_text(size=12), legend.direction = "horizontal", console.grid.major = element_blank(), panel.filigree.minor = element_blank(), legend.position="top") Plot.GPA.iii
A terminal piddling note… There are definitely easier ways to brand plots in R, just I want to evidence you with this last instance the difference between using effects/ggplot and simpler lawmaking. I will say, information technology is helpful to utilise these simple codes every bit you are working through your analysis to visualize your data, but in terms of publishing your data, ggplot volition give y'all the quality yous need!!
plot(Inter.GPA.three, multiline = Truthful)
LS0tDQp0aXRsZTogJ0NoYXB0ZXIgMTM6IFBsb3R0aW5nIFJlZ3Jlc3Npb24gSW50ZXJhY3Rpb25zJw0KYXV0aG9yOiAiQ2FsbGllIFNpbHZlciINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBmb250c2l6ZTogOHB0DQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6IGNlcnVsZWFuDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IG5vDQoNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMgQmFzaWNzIA0KVGhlIGZvbGxvd2luZyBjaGFwdGVyIHdpbGwgaW5jbHVkZToNCg0KLSBCYXNpYyBpbmZvcm1hdGlvbiBhYm91dCBpbnRlcmFjdGlvbnMgYW5kIHNpbXBsZSBzbG9wZXMgDQotIEJhY2tncm91bmQgdG8gcGxvdHRpbmcgaW50ZXJhY3Rpb25zIGluIFIgDQotIEEgcmVhbC1saWZlIGV4YW1wbGUgDQotIENvZGUgdG8gc2ltdWxhdGUgZGF0YSBzZXQgIA0KLSBDb250aW51b3VzIFggQ29udGludW91cyBSZWdyZXNzaW9uOiBjb2RlIGFuZCBpbnRlcnByZXRhdGlvbiANCi0gTm9taW5hbCBYIENvbnRpbnVvdXMgUmVncmVzc2lvbjogY29kZSBhbmQgaW50ZXJwcmV0YXRpb24gDQotIE5vbWluYWwgWCBOb21pbmFsIFJlZ3Jlc3Npb246IGNvZGUgYW5kIHRyYW5zbGF0aW9uIA0KDQojIyBXaGF0IGlzIGFuIGludGVyYWN0aW9uPw0KKipJbnRlcmFjdGlvbjoqKiBXaGVuIHRoZSBlZmZlY3Qgb2Ygb25lIGluZGVwZW5kZW50IHZhcmlhYmxlIGRpZmZlcnMgYmFzZWQgb24gdGhlIGxldmVsIG9yIG1hZ25pdHVkZSBvZiBhbm90aGVyIGluZGVwZW5kZW50IHZhcmlhYmxlIA0KDQoqICp5KiA9IEEgKyBCICsgQSpCIA0KICAgICsgKioqeSoqKiA9IGRlcGVuZGVudCB2YXJpYWJsZSANCiAgICArICoqQSoqID0gaW5kZXBlbmRlbnQgdmFyaWFibGUgDQogICAgKyAqKkIqKiA9IGluZGVwZW5kZW50IHZhcmlhYmlsZSANCiAgICArICoqQSoqKioqQioqID0gaW50ZXJhY3Rpb24gYmV0d2VlbiBBIGFuZCBCIA0KICAgIA0KRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaW50ZXJhY3Rpb25zIGluIHJlZ3Jlc3Npb246ICAgICAgDQpbQ2xpY2sgaGVyZV0oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS91cmw/c2E9dCZyY3Q9aiZxPSZlc3JjPXMmc291cmNlPXdlYiZjZD0zJnZlZD0wYWhVS0V3aUZyc3EzOFlqVEFoVUJVQ1lLSFE5QkRlQVFGZ2dzTUFJJnVybD1odHRwcyUzQSUyRiUyRnd3dy5yZXNlYXJjaGdhdGUubmV0JTJGZmlsZS5Qb3N0RmlsZUxvYWRlci5odG1sJTNGaWQlM0Q1NTVlM2VmNjVmN2Y3MTBjN2E4YjQ1YTMlMjZhc3NldEtleSUzREFTJTI1M0EyNzM3ODE1Mzk0NDI2ODglMjU0MDE0NDIyODYwMTMyMDYmdXNnPUFGUWpDTkdBSFZ0Rm5RTDNQanAtbGZCQm1jQ2JGNnZwa2cmc2lnMj1QbjJMQUJITXJWNE94dDBxcGNuT2dRJmNhZD1yamEpIGZvcg0KKkphY2NhcmQgJiBUdXJyaXNpIDIwMDMgKiBJbnRlcmFjdGlvbiBFZmZlY3RzIGluIE11bHRpcGxlIFJlZ3Jlc3Npb24NCg0KIyMgV2hhdCBpcyBhIHNpbXBsZSBzbG9wZT8NCg0KLSBBIHNpbXBsZSBzbG9wZSBpcyBhIHJlZ3Jlc3Npb24gbGluZSBhdCBvbmUgbGV2ZWwgb2YgYSBwcmVkaWN0b3IgdmFyaWFibGUgDQoNCi0gVGhpbmsgb2Ygc2ltcGxlIHNsb3BlcyBhcyB0aGUgdmlzdWFsaXphdGlvbiBvZiBhbiBpbnRlcmFjdGlvbiANCg0KKipIb3cgZG8gd2UgcGxvdCB0aGVzZSB0aGluZ3MgaW4gUj8uLi4qKiANCg0KIyMgSW50ZXJhY3Rpb24gUGxvdHRpbmcgUGFja2FnZXMgDQpXaGVuIHJ1bm5pbmcgYSByZWdyZXNzaW9uIGluIFIsIGl0IGlzIGxpa2VseSB0aGF0IHlvdSB3aWxsIGJlIGludGVyZXN0ZWQgaW4gaW50ZXJhY3Rpb25zLiBUaGUgZm9sbG93aW5nIHBhY2thZ2VzIGFuZCBmdW5jdGlvbnMgYXJlIGdvb2QgcGxhY2VzIHRvIHN0YXJ0LCBidXQgdGhlIGZvbGxvd2luZyBjaGFwdGVyIGlzIGdvaW5nIHRvIHRlYWNoIHlvdSBob3cgdG8gbWFrZSBjdXN0b20gaW50ZXJhY3Rpb24gcGxvdHMuIA0KDQoqICoqbG0oKSBmdW5jdGlvbjoqKiB5b3VyIGJhc2ljIHJlZ3Jlc3Npb24gZnVuY3Rpb24gdGhhdCB3aWxsIGdpdmUgeW91IGludGVyYWN0aW9uIHRlcm1zIA0KKiAqKnN0YXJnYXplciBwYWNrYWdlLCBzdGFyZ2F6ZXIoKSBmdW5jdGlvbjoqKiBwcmV0dHkgc3VtbWFyeSBvZiByZWdyZXNzaW9uIHJlc3VsdHMgDQoqICoqcm9ja2NoYWxrIHBhY2thZ2UsIHBsb3RTbG9wZXMoKSBmdW5jdGlvbjoqKiBxdWljayBhbmQgYmFzaWMgZ3JhcGggb2Ygc2ltcGxlIHNsb3Blcw0KDQoqKldoeSBjYW4ndCB3ZSBqdXN0IHVzZSB0aGVzZSBwYWNrYWdlcz8uLi4qKiANCg0KIyMgQmVuZWZpdHMgb2YgQ3VzdG9tIEludGVyYWN0aW9uIFBsb3RzIA0KIyMjIyBVc2luZyAqKmVmZmVjdHMqKiBhbmQgKipnZ3Bsb3QyKioNCg0KLSBGdWxsIGNvbnRyb2wgb3ZlciB3aGF0IHlvdSdyZSBwbG90dGluZyAoaS5lLiB4IGxldmVsIG9mIHggdmFyaWFibGUpDQotIE1vcmUgYWNjdXJhdGUgY2FsY3VsYXRpb25zIG9mIG1lYW4vZXJyb3IvZXRjLg0KLSBDYW4gZW50ZXIgaW4gb3duIHZhbHVlcyBmb3IgY29uZmlkZW5jZSBpbnRlcnZhbHMsIHN0YW5kYXJkIGVycm9yIGJhcnMsIGV0Yy4NCi0gQ2FuIGN1c3RvbWl6ZSBldmVyeSBhc3BlY3Qgb2YgdGhlIGdyYXBocyAoY29sb3IsIHNpemUgb2YgdGV4dCwgZGF0YSBwb2ludHMpDQoNCldlIGdvIGZyb20gInF1aWNrICYgZGlydHkiIHNpbXBsZSBzbG9wZSBwbG90cyB0byAicHJldHR5ICYgY3VzdG9taXphYmxlIiBncmFwaHMNCg0KIyMgVGhlIFBhY2thZ2VzIFlvdSBOZWVkDQoNCklmIHlvdSBkb24ndCBhbHJlYWR5IGhhdmUgdGhlc2UgcGFja2FnZXMgaW5zdGFsbGVkLCB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgdG8gZG8gc286IA0KYGBgIHtyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPVRSVUV9DQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJjYXIiKSAjQW4gZXh0cmVtZWx5IHVzZWZ1bC9pbi1kZXB0aCByZWdyZXNzaW9uIHBhY2thZ2UgDQojaW5zdGFsbC5wYWNrYWdlcygic3RhcmdhemVyIikgI1Byb2R1Y2VzIGVhc3kgdG8gcmVhZCByZWdyZXNzaW9uIHJlc3VsdHMgKHNpbWlsYXIgdG8gd2hhdCB5b3UgZ2V0IGluIFNQU1MpDQojaW5zdGFsbC5wYWNrYWdlcygiZWZmZWN0cyIpICNXZSB3aWxsIHVzZSB0aGlzIHRvIGNyZWF0ZSBvdXIgaW50ZXJhY3Rpb25zIA0KI2luc3RhbGwucGFja2FnZXMoImdncGxvdDIiKSAjT3VyIGluY3JlZGlibHkgcG93ZXJmdWwgYW5kIHZlcnNhdGlsZSBncmFwaGluZyBwYWNrYWdlIA0KDQpgYGANCioqT25lIGxhc3QgdGhpbmcgYmVmb3JlIHdlIGdldCBzdGFydGVkLi4uKiANCg0KSWYgdGhlIHdvcmRzICJpbnRlcmFjdGlvbiIgb3IgImxpbmVhciBtb2RlbCIgYXJlIHNvdW5kaW5nIGEgbGl0dGxlIGZvcmVpZ24sIGNoZWNrIG91dCBbQ2hhcHRlciAxMl0oaHR0cDovL2FkZW1vcy5wZW9wbGUudWljLmVkdS9DaGFwdGVyMTIuaHRtbCkgZm9yIGFuIGF3ZXNvbWUgcmVncmVzc2lvbiByZWZyZXNoZXIhIQ0KDQojIENvbnRpbnVvdXMgeCBDb250aW51b3VzIFJlZ3Jlc3Npb24NCioqSVEgYW5kIFdvcmsgRXRoaWMgYXMgUHJlZGljdG9ycyBvZiBHUEEqKg0KDQpGb3IgYWxsIHRoZSBleGFtcGxlcyBpbiB0aGlzIGNoYXB0ZXIsIHdlIGFyZSBhY3R1YWxseSBnb2luZyB0byBzaW11bGF0ZSBvdXIgb3duIGRhdGEuIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgZG93bmxvYWRpbmcgYSBkYXRhIHNldCAvIGNhbGxpbmcgaW4gZGF0YS4gDQoNCiMjIFNpbXVsYXRlIHlvdXIgZGF0YSANCiAgDQpgYGAge3IsIG1lc3NhZ2U9RkFMU0UsIGVjaG89VFJVRX0NCmxpYnJhcnkoY2FyKSAjRXZlbiB0aG91Z2ggd2UgYWxyZWFkeSBpbnN0YWxsZWQgImNhciIsIHdlIGhhdmUgdG8gdGVsbCBSIHdlIHdhbnQgaXQgdG8gbG9hZCB0aGlzIHBhY2thZ2UgZm9yIHVzIHRvIHVzZSAJDQojWW91IGNhbiBjaG9vc2Ugd2hhdGV2ZXIgIyB5b3Ugd2FudCBmb3IgdGhlIHNlZWQ7IHRoaXMgaXMgZm9yIHJhbmRvbWl6YXRpb24gb2YgeW91ciBkYXRhIHNldA0Kc2V0LnNlZWQoMTUwKQ0KI0xldCdzIG1ha2Ugb3VyIGRhdGEgc2V0IHdpbGwgaGF2ZSAyNTAgcGFydGljaXBhbnRzIChuKSwgcGVyaGFwcyBjb2xsZWdlIHN0dWRlbnRzISAgICAgDQpuIDwtIDI1MAkNCiNVbmlmb3JtIGRpc3RyaWJ1dGlvbiBvZiB3b3JrIGV0aGljIChYKSBmcm9tIDEtNSAoMSA9IHBvb3Igd29yayBldGhpYywgNSA9IGdyZWF0IHdvcmsgZXRoaWMpIA0KWCA8LSBybm9ybShuLCAyLjc1LCAuNzUpCQ0KI1dlIHdhbnQgYSBub3JtYWwgZGlzdHJpYnV0aW9uIG9mIElRIChaKQ0KI0kgZml4ZWQgdGhlIG1lYW4gb2YgSVEgdG8gMTUgc28gdGhhdCB0aGUgcmVncmVzc2lvbiBlcXVhdGlvbiB3b3JrcyByZWFsaXN0aWNhbGx5LCBTRCA9IDE1IA0KWiA8LSBybm9ybShuLCAxNSwgMTUpCQ0KI1dlIHRoZW4gY3JlYXRlIFkgdXNpbmcgYSByZWdyZXNzaW9uIGVxdWF0aW9uIChhZGRpbmcgYSBiaXQgb2YgcmFuZG9tIG5vaXNlKSAgICANClkgPC0gLjcqWCArIC4zKlogKyAyLjUqWCpaICsgcm5vcm0obiwgc2QgPSA1KQ0KI1RoaXMgY29kZSBpcyBoZXJlIHNvIHRoYXQgWSAoR1BBKSBpcyBjYXBwZWQgYXQgNC4wICh0aGUgbG9naWNhbCBtYXggZm9yIEdQQSkNClkgPSAoWSAtIG1pbihZKSkgLyAobWF4KFkpIC0gbWluKFkpKSo0DQojRmluYWxseSwgd2UgcHV0IG91ciBkYXRhIHRvZ2V0aGVyIHdpdGggdGhlIGRhdGEuZnJhbWUoKSBmdW5jdGlvbiANCkdQQS5EYXRhIDwtIGRhdGEuZnJhbWUoR1BBPVksIFdvcmsuRXRoaWM9WCwgSVE9WikJDQpgYGANCg0KIyMgQ2VudGVyIHlvdXIgaW5kZXBlbmRlbnQgdmFyaWFibGVzIA0KKipXaHkgZG8gd2UgY2VudGVyIG91ciB2YXJpYWJsZXM/KioNCg0KLSBUbyBhdm9pZCBwcm9ibGVtcyBvZiBtdWx0aWNvbGxpbmVhcml0eSEgV2hlbiBhIG1vZGVsIGhhcyBtdWx0aWNvbGxpbmVhcml0eSwgaXQgZG9lc24ndCBrbm93IHdoaWNoIHRlcm0gdG8gZ2l2ZSB0aGUgdmFyaWFuY2UgdG8gKCJZb3UgZ2F2ZSBtZSAzIGxpbmVzIHRoYXQgYXJlIHRoZSBzYW1lISIgLSBhbmdyeSBtb2RlbCkNCi0gV2hlbiB3ZSBjZW50ZXIgb3VyIElWcywgdGhlIGNlbnRlciBvZiBlYWNoIElWIHJlcHJlc2VudHMgdGhlIG1lYW4gDQotIFdoZW4geW91IGludGVyYWN0IFggKiBaLCB5b3UgYXJlIGFkZGluZyBhIG5ldyBwcmVkaWN0b3IgKFhaKSB0aGF0IHN0cm9uZ2x5IGNvcnJlbGF0ZXMgd2l0aCBYIGFuZCBaIA0KLSBJZiB5b3UgY2VudGVyIHlvdXIgdmFyaWFibGVzLCB5b3Ugd2lsbCBub3cgaGF2ZSBhIFUtc2hhcGVkIGludGVyYWN0aW9uIHRoYXQgaXMgb3J0aG9nb25hbCB0byBYIGFuZCBaDQotICoqRXhjZXB0aW9uczoqKiBEb24ndCBjZW50ZXIgcGh5c2ljYWwgZGF0YSBvciB3aGVuIHRoZXJlIGlzIGEgdHJ1ZSwgbWVhbmluZ2Z1bCAwIA0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVjaG89VFJVRX0NCkdQQS5EYXRhJElRLkMgPC0gc2NhbGUoR1BBLkRhdGEkSVEsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gRkFMU0UpWyxdDQpHUEEuRGF0YSRXb3JrLkV0aGljLkMgPC0gc2NhbGUoR1BBLkRhdGEkV29yay5FdGhpYywgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBGQUxTRSlbLF0NCmBgYA0KIyMgUnVuIHlvdXIgcmVncmVzc2lvbiBtb2RlbHMgDQpVc2UgKipsbSgpIGZ1bmN0aW9uKiogdG8gcnVuIG1vZGVsIHdpdGggYW5kIHdpdGhvdXQgaW50ZXJhY3Rpb24NCg0KLSBBZGRpdGl2ZSBlZmZlY3RzID0gKyANCi0gTXVsdGlwbGljYXRpdmUgKGludGVyYWN0aW9uKSBlZmZlY3RzID0gKiANCg0KVXNlICoqc3RhcmdhemVyKCkqKiB0byBnZXQgYSBwcmV0dHksIHVzZXItZnJpZW5kbHkgY2hhcnQgb2YgeW91ciByZXN1bHRzDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPVRSVUUscmVzdWx0cz0nYXNpcyd9DQpHUEEuTW9kZWwuMSA8LSBsbShHUEF+SVEuQytXb3JrLkV0aGljLkMsIEdQQS5EYXRhKQ0KR1BBLk1vZGVsLjIgPC0gbG0gKEdQQX5JUS5DKldvcmsuRXRoaWMuQywgR1BBLkRhdGEpDQoNCmxpYnJhcnkoc3RhcmdhemVyKQ0Kc3RhcmdhemVyKEdQQS5Nb2RlbC4xLCBHUEEuTW9kZWwuMix0eXBlPSJodG1sIiwJDQogICAgICAgICAgY29sdW1uLmxhYmVscyA9IGMoIk1haW4gRWZmZWN0cyIsICJJbnRlcmFjdGlvbiIpLAkNCiAgICAgICAgICBpbnRlcmNlcHQuYm90dG9tID0gRkFMU0UsCQ0KICAgICAgICAgIHNpbmdsZS5yb3c9RkFMU0UsIAkNCiAgICAgICAgICBub3Rlcy5hcHBlbmQgPSBGQUxTRSwJDQogICAgICAgICAgaGVhZGVyPUZBTFNFKQkNCmBgYA0KDQojIyBQbG90IHlvdXIgaW50ZXJhY3Rpb24gDQpXaGVuIHdlIGFyZSBwbG90dGluZyB0aGUgc2ltcGxlIHNsb3BlcyBvZiBhIGNvbnRpbnVvdXMgSVYgWCBjb250aW51b3VzIElWLCB3ZSBoYXZlIHRvIHNwZWNpZnkgd2hhdCBsZXZlbHMgb2YgZWFjaCB3ZSB3YW50IHRvIGV4YW1pbmUuIFRoZXJlIGFyZSAzIG1ldGhvZHMgZm9yIGNob29zaW5nIGxldmVsczogKipoYW5kIHBpY2tpbmcsIHF1YW50aWxlcywgc3RhbmRhcmQgZGV2aWF0aW9uKioNCg0KRm9yIHRoZSBuZXh0IDMgbWV0aG9kcywgd2UgYXJlIGdvaW5nIHRvIHNwZWNpZnkgdGhlIGNlbnRlcmVkIFdvcmsgRXRoaWMgSVYgdG8gcmFuZ2UgZnJvbSAtMi41IHRvIDIuNSwgaW5jcmVhc2luZyBieSAuNSwgYnV0IGZvciB0aGUgY2VudGVyZWQgSVEgSVYsIHdlIHdpbGwgc2hvdyAzIGRpZmZlcmVudCB0aGVvcmV0aWNhbCB3YXlzIHRvIGNob29zZSBvdXIgbGV2ZWxzLiANCg0KIyMjIFBsb3R0aW5nIHNpbXBsZSBzbG9wZXM6IEhhbmQgUGlja2luZw0KDQotIEhhbmQgcGlja2luZyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgc3BlY2lmaWMgcHJlZGljdGlvbnMgaW4geW91ciBkYXRhIHNldCANCi0gSWYgeW91IGFyZSB3b3JraW5nIHdpdGggSVEsIGEgZHJ1Zywgb3IgYWdlIC0gbnVtYmVycyBhcmUgcmVsZXZhbnQgYW5kIGFyZSB1c2VmdWwgdG8gcGljayEgDQotIEZvciBvdXIgZXhhbXBsZSwgbGV0J3MgZ28gd2l0aCAtMTUsIDAsIDE1IGZvciBvdXIgY2VudGVyZWQgSVEgKDEgU0QgYWJvdmUgYW5kIGJlbG93IG1lYW4pIA0KLSAqKmMoKSoqIHdpbGwgZ2l2ZSB5b3UgdGhlIGV4YWN0IHZhbHVlcyBhbmQgKipzZXEoKSoqIHdpbGwgZ2l2ZSB5b3UgYSByYW5nZSBmcm9tIGEgdG8gYiwgaW5jcmVhc2luZyBieSBjIA0KDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPVRSVUV9DQpsaWJyYXJ5KGVmZmVjdHMpDQojUnVuIHRoZSBpbnRlcmFjdGlvbiANCkludGVyLkhhbmRQaWNrIDwtIGVmZmVjdCgnSVEuQypXb3JrLkV0aGljLkMnLCBHUEEuTW9kZWwuMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bGV2ZWxzPWxpc3QoSVEuQyA9IGMoLTE1LCAwLCAxNSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yay5FdGhpYy5DID0gYygtMS4xLCAwLCAxLjEpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZT1UUlVFLCBjb25maWRlbmNlLmxldmVsPS45NSwgdHlwaWNhbD1tZWFuKQ0KDQojUHV0IGRhdGEgaW4gZGF0YSBmcmFtZSANCkludGVyLkhhbmRQaWNrIDwtIGFzLmRhdGEuZnJhbWUoSW50ZXIuSGFuZFBpY2spDQoNCiNDaGVjayBvdXQgd2hhdCB0aGUgImhlYWQiIChmaXJzdCA2IHJvd3MpIG9mIHlvdXIgZGF0YSBsb29rcyBsaWtlDQpoZWFkKEludGVyLkhhbmRQaWNrKQ0KICANCiNDcmVhdGUgYSBmYWN0b3Igb2YgdGhlIElRIHZhcmlhYmxlIHVzZWQgaW4gdGhlIGludGVyYWN0aW9uICAgICAgICAgICAgICAgICAgIA0KSW50ZXIuSGFuZFBpY2skSVEgPC0gZmFjdG9yKEludGVyLkhhbmRQaWNrJElRLkMsDQogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWMoLTE1LCAwLCAxNSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIjEgU0QgQmVsb3cgUG9wdWxhdGlvbiBNZWFuIiwgIlBvcHVsYXRpb24gTWVhbiIsICIxIFNEIEFib3ZlIFBvcHVsYXRpb24gTWVhbiIpKQ0KICAgICAgICAgICAgICAgICAgICAgDQojQ3JlYXRlIGEgZmFjdG9yIG9mIHRoZSBXb3JrIEV0aGljIHZhcmlhYmxlIHVzZWQgaW4gdGhlIGludGVyYWN0aW9uIA0KSW50ZXIuSGFuZFBpY2skV29yay5FdGhpYyA8LSBmYWN0b3IoSW50ZXIuSGFuZFBpY2skV29yay5FdGhpYy5DLA0KICAgICAgICAgICAgICBsZXZlbHM9YygtMS4xLCAwLCAxLjEpLA0KICAgICAgICAgICAgICBsYWJlbHM9YygiUG9vciBXb3JrZXIiLCAiQXZlcmFnZSBXb3JrZXIiLCAiSGFyZCBXb3JrZXIiKSkNCg0KbGlicmFyeShnZ3Bsb3QyKSAgICAgICAgICAgICAgICANClBsb3QuSGFuZFBpY2s8LWdncGxvdChkYXRhPUludGVyLkhhbmRQaWNrLCBhZXMoeD1Xb3JrLkV0aGljLCB5PWZpdCwgZ3JvdXA9SVEpKSsNCiAgICAgIGdlb21fbGluZShzaXplPTIsIGFlcyhjb2xvcj1JUSkpKw0KICAgICAgeWxpbSgwLDQpKw0KICAgICAgeWxhYigiR1BBIikrDQogICAgICB4bGFiKCJXb3JrIEV0aGljIikrDQogICAgICBnZ3RpdGxlKCJIYW5kIFBpY2tlZCBQbG90IikNCg0KDQpQbG90LkhhbmRQaWNrIA0KI0luIFIsIHlvdSBoYXZlIHRvICJjYWxsIGZvciIgeW91ciBncmFwaHMgYWZ0ZXIgeW91IG1ha2UgdGhlbSBpbiBvcmRlciB0byBzZWUgdGhlbQ0KICAgICAgICAgICAgICAgIA0KI0NvZGUgdG8gc2F2ZSBwbG90IHRvIHlvdXIgY29tcHV0ZXIgDQojZ2dzYXZlKCJQbG90LjEucG5nIiwgUGxvdC4xLHdpZHRoID0gNSwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAiaW4iKQ0KYGBgDQoNCiMjIyMgSW50ZXJwcmV0YXRpb24gb2YgSGFuZCBQaWNrZWQgUGxvdA0KVGhpcyBwbG90IGhlcmUgaXMgYW4gZXhhbXBsZSBvZiBwcmV0dHkgbXVjaCB0aGUgc2ltcGxlc3QgeW91IGNhbiBnZXQgd2l0aCBnZ3Bsb3QuIFRoZXNlIGFyZSB0aGUgZGVmYXVsdCBzZXR0aW5ncyB3aXRoIHJlc3BlY3QgdG8gYWxsIGFlc3RoZXRpYyBlbGVtZW50cy4gQXMgd2UgZ28gdGhyb3VnaCB0aGlzIGNoYXB0ZXIsIEkgd2lsbCBnaXZlIHlvdSBiaXRzIG9mIGNvZGUgdGhhdCB3aWxsIGhlbHAgeW91IG1ha2UgeW91ciBncmFwaCBwcmV0dGllciwgbW9yZSBjb2xvcmZ1bCwgb3IgYmV0dGVyIHN1aXRlZCBmb3IgcHVibGlzaGluZy4NCg0KRm9yIGV2ZW4gbW9yZSAqKmdncGxvdCoqIGZ1biwgcmVmZXIgdG8gW0NoYXB0ZXIgMTBdKGh0dHA6Ly9hZGVtb3MucGVvcGxlLnVpYy5lZHUvQ2hhcHRlcjEwLmh0bWwpIG9yIHRoaXMgYXdlc29tZSBbZ2dwbG90IENoZWF0IFNoZWV0XShodHRwczovL3d3dy5yc3R1ZGlvLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAxNS8wMy9nZ3Bsb3QyLWNoZWF0c2hlZXQucGRmKQ0KDQpJbiB0ZXJtcyBvZiB3aGF0IHRoaXMgZ3JhcGggaXMgdGVsbGluZyB1cywgd2UgY2FuIHZpc3VhbGl6ZSB0aGUgZmFjdCB0aGF0IGZvciBzbWFydCBwZW9wbGUgKDEgU0QgYWJvdmUgdGhlIHBvcHVsYXRpb24gbWVhbiAobm90IGRldGVybWluZWQgYnkgb3VyIGRhdGEgc2V0KSwgYXMgdGhlaXIgd29yayBldGhpYyBpbmNyZWFzZXMsIHNvIGRvZXMgdGhlaXIgR1BBLiBBIHNpbWlsYXIgcGF0dGVybiBpcyBzZWVuIGZvciBwZW9wbGUgd2l0aCBhdmVyYWdlIElRcywgdGhvdWdoIHRoZSBlZmZlY3QgaXMgbm90IG5lYXJseSBhcyBzdHJvbmcuIEZvciBwZW9wbGUgMSBTRCBiZWxvdyB0aGUgcG9wdWxhdGlvbiBtZWFuIG9uIElRLCBhcyB0aGVpciB3b3JrIGV0aGljIGluY3JlYXNlcywgaXQgYXBwZWFycyBhcyB0aG91Z2ggdGhlaXIgR1BBIGFjdHVhbGx5IGRlY3JlYXNlcy4gSW50ZXJlc3RpbmchIE1heWJlIHRoZXkgZ2V0IG1vcmUgY29uZnVzZWQgd2l0aCB0aGUgbWF0ZXJpYWw/IFdobyBrbm93cyEgDQoNCiMjIyBQbG90dGluZyBzaW1wbGUgc2xvcGVzOiBRdWFudGlsZSANCg0KLSBMZXQncyB1c2UgbGV2ZWxzIHRoYXQgYXJlIGJhc2VkIG9uIHF1YW50aWxlcyAoYmlucyBiYXNlZCBvbiBwcm9iYWJpbGl0eSkNCi0gWW91IGNhbiBhc2sgZm9yIGFzIG1hbnkgb3IgYXMgZmV3IHF1YW50aWxlcyBhcyB5b3Ugd2FudA0KLSBOb24tcGFyYW1ldHJpYzsgYmFzZWQgb24gcHJvYmFiaWxpdHkgYW5kIGRvZXMgbm90IGFzc3VtZSBub3JtYWxpdHkgb2YgSVYgDQotIEZvciB0aGlzIGV4YW1wbGUsIGxldCdzIGFzayBmb3IgNSBxdWFudGlsZXMgYW5kIGhhdmUgdGhlbSByb3VuZGVkIHRvIDIgZGVjaW1hbCBwb2ludHMgDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZWNobz1UUlVFfQ0KI01ha2UgeW91ciBuZXcgSVEgdmFyaWFibGUgdGhhdCBhc2tzIGZvciBxdWFudGlsZXMgIA0KSVEuUXVhbnRpbGUgPC0gcXVhbnRpbGUoR1BBLkRhdGEkSVEuQywgcHJvYnM9YygwLC4yNSwuNTAsLjc1LDEpKQ0KSVEuUXVhbnRpbGUgPC0gcm91bmQoSVEuUXVhbnRpbGUsIDIpDQpJUS5RdWFudGlsZSANCg0KbGlicmFyeShlZmZlY3RzKQ0KI1J1biB5b3VyIGludGVyYWN0aW9uDQpJbnRlci5RdWFudGlsZSA8LSBlZmZlY3QoJ0lRLkMqV29yay5FdGhpYy5DJywgR1BBLk1vZGVsLjIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsZXZlbHM9bGlzdChJUS5DID0gYygtMzUuNDQsIC05Ljc4LCAtMC4wNCwgOS44OSwgNDEuOTApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrLkV0aGljLkMgPSBjKC0xLjEsIDAsIDEuMSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZT1UUlVFLCBjb25maWRlbmNlLmxldmVsPS45NSwgdHlwaWNhbD1tZWFuKQ0KI1B1dCBkYXRhIGludG8gZGF0YSBmcmFtZQ0KSW50ZXIuUXVhbnRpbGUgPC0gYXMuZGF0YS5mcmFtZShJbnRlci5RdWFudGlsZSkNCg0KI0NyZWF0ZSBmYWN0b3JzIG9mIHRoZSBkaWZmZXJlbnQgdmFyaWFibGVzIGluIHlvdXIgaW50ZXJhY3Rpb246IA0KDQpJbnRlci5RdWFudGlsZSRJUTwtZmFjdG9yKEludGVyLlF1YW50aWxlJElRLkMsDQogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWMoLTM1LjQ0LCAtOS43OCwgLTAuMDQsIDkuODksIDQxLjkwKSwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiMCUiLCAiMjUlIiwgIjUwJSIsICI3NSUiLCAiMTAwJSIpKQ0KICAgICAgICAgICAgICAgICAgICAgDQpJbnRlci5RdWFudGlsZSRXb3JrLkV0aGljPC1mYWN0b3IoSW50ZXIuUXVhbnRpbGUkV29yay5FdGhpYy5DLA0KICAgICAgICAgICAgICBsZXZlbHM9YygtMS4xLCAwLCAxLjEpLA0KICAgICAgICAgICAgICBsYWJlbHM9YygiUG9vciBXb3JrZXIiLCAiQXZlcmFnZSBXb3JrZXIiLCAiSGFyZCBXb3JrZXIiKSkNCmBgYA0KKipGVU4gV0lUSCBGT05UUyoqDQoNCmluc3RhbGwucGFja2FnZXMoZXh0cmFmb250KSANCg0KSSBkaWQgbm90IGluY2x1ZGUgdGhpcyBwYWNrYWdlIHVwIGZyb250LCBhcyBpdCBpcyB0b3RhbGx5IG9wdGlvbmFsISANCklmIHlvdSB3YW50IHRvIHBsYXkgYXJvdW5kIHdpdGggZGlmZmVyZW50IGZvbnQgb3B0aW9ucywgaW5zdGFsbCB0aGlzIHBhY2thZ2UgYW5kIGxvYWQgaXQNCg0KQWZ0ZXIgaW5zdGFsbGF0aW9uL2xvYWRpbmcsIHlvdSB3aWxsIHdhbnQgdG8gcnVuIHRoZSBmb2xsb3dpbmcgY29kZToNCioqZm9udF9pbXBvcnQoKSoqDQoNClRoaXMgY29kZSBjYW4gdGFrZSBhIGZldyBtaW51dGVzIHRvIHJ1biwgd2hpY2ggaXMgd2h5IEkgaGF2ZSBub3QgaW5jbHVkZWQgaXQgaW4gdGhlIGNvZGVkIHNlY3Rpb24gb2YgdGhpcyBjaGFwdGVyLiANCg0KVGhlIGxhc3QgZnVuY3Rpb24geW91IHdpbGwgbmVlZCBpczogKipmb250cygpKiogDQpZb3Ugd2lsbCBnZXQgYSBsaXN0IG9mIGFsbCB0aGUgZm9udHMgYWNjZXNzaWJsZSB0byB5b3UgaW4gUg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShleHRyYWZvbnQpDQojZm9udF9pbXBvcnQoKSAjIHJ1biB0aGlzIGxpbmUgb2YgY29kZWQgaGVyZSB0byBpbnN0YWxsIGZvbnRzDQpsaWJyYXJ5KGdncGxvdDIpIA0KUGxvdC5RdWFudGlsZTwtZ2dwbG90KGRhdGE9SW50ZXIuUXVhbnRpbGUsIGFlcyh4PVdvcmsuRXRoaWMsIHk9Zml0LCBncm91cD1JUSkpKw0KICAgICAgZ2VvbV9saW5lKHNpemU9MiwgYWVzKGNvbG9yPUlRKSkrDQogICAgICB5bGFiKCJHUEEiKSsNCiAgICAgIHhsYWIoIldvcmsgRXRoaWMiKSsNCiAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzQyYzVmNCIsIiM1NGYyODQiLCIjZjQ1ZGNjIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI2ZmOWQzNSIsIiNkN2FmZmYiKSkrICNjdXN0b20gY29sb3IgY29kaW5nIA0KICAgICAgdGhlbWVfYncoKSsgI2RlbGV0aW5nIHRoZSBncmF5IGJhY2tncm91bmQgDQogICAgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseT0iSW1wYWN0Iiwgc2l6ZT0xNCwgY29sb3I9ImJsYWNrIikpKyAjY2hhbmdpbmcgZm9udCENCiAgICAgIGdndGl0bGUoIlF1YW50aWxlIFBsb3QiKSAjYWRkaW5nIGEgdGl0bGUhIA0KDQpQbG90LlF1YW50aWxlDQoNCmBgYA0KDQojIyMjIEludGVycHJldGF0aW9uIG9mIFF1YW50aWxlIFBsb3QNClNvIHRvIHJlY2FwIHRoZSBjb2RlcyB3ZSBsZWFybmVkIGluIHRoaXMgcGxvdCwgd2Ugbm93IGtub3cgaG93IHRvIGNoYW5nZSBmb250cywgZ2V0IHJpZCBvZiB0aGUgZ3JheSBiYWNrZ3JvdW5kLCBhZGQgYSB0aXRsZSwgYW5kIGNob29zZSBjdXN0b20gY29sb3JzISANCg0KWW91IG1heSBiZSB3b25kZXJpbmcgd2hlcmUgSSBnb3QgdGhlc2UgZnVua3kgbGV0dGVyL251bWJlciBjb21iaW5hdGlvbnMgdGhhdCB0cmFuc2xhdGUgaW50byBjb2xvcnMuIElmIHlvdSBnb29nbGUgImh0bWwgY29sb3IgcGlja2VyIiwgeW91IGNhbiBjb3B5IHRoZSBjb2xvciBjb2RlIG9mIGFueSBjb2xvciB5b3VyIGhlYXJ0IGRlc2lyZXMhIFByZXR0eSBuZWF0ISEgDQoNCk5vdywgaW4gdGVybXMgb2Ygd2hhdCB3ZSdyZSBsZWFybmluZyBmcm9tIHRoaXMgZ3JhcGggLSB3ZSBjYW4gc2VlIHRoZSBpbnRlcmFjdGlvbiBlZmZlY3RzIGEgbG90IG1vcmUgY2xlYXJseS4gSXQgc2VlbXMgYXMgdGhvdWdoIGFsbCBwZW9wbGUgaW4gdGhlIDI1dGggcGVyY2VudGlsZSBvciBoaWdoZXIgYXJlIGV4cGVyaWVuY2luZyBzb21lIGRlZ3JlZWUgb2YgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB3b3JrIGV0aGljIGFuZCBHUEEuIEFzIHdvcmsgZXRoaWMgYW5kIElRIGluY3JlYXNlLCBzbyBkb2VzIEdQQSEgVW5mb3J0dW5hdGVseSwgZm9yIHRoaXMgZ3JvdXAgYmVsb3cgdGhlIDI1dGggcGVyY2VudGlsZSwgdGhlcmUgaXMgYSBwcmV0dHkgY2xlYXIgbmVnYXRpdmUgcmVsYXRpb25zaGlwIGluZGljYXRpbmcgdGhhdCBpcyB0aGVpciB3b3JrIGV0aGljIGluY3JlYXNlcywgdGhlaXIgR1BBIGFjdHVhbGx5IGRlY3JlYXNlcy4gTm90IGdvb2QhIA0KDQojIyMgUGxvdHRpbmcgc2ltcGxlIHNsb3BlczogU3RhbmRhcmQgRGV2aWF0aW9uIA0KDQotIExhc3RseSwgbGV0J3MgY2hvb3NlIG91ciBsZXZlbHMgYmFzZWQgb24gdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgZGF0YSANCi0gV2UgY2FuIHNlbGVjdCB2YWx1ZXMgYmFzZWQgb24gdGhlIG1lYW4gYW5kIFNEIG9mIG91ciBkYXRhIA0KLSBGb3IgdGhpcyBleGFtcGxlLCB3ZSB3aWxsIGRvIDMgdmFsdWVzOiBNIC0gMVNELCBNLCBNICsgMVNELCB3aGVyZSBNID0gbWVhbiANCi0gT25jZSBhZ2Fpbiwgd2UgYXJlIGdvaW5nIHRvIHJvdW5kIG9mZiB0aGVzZSB2YWx1ZXMgYXQgMiBkZWNpbWFsIHBvaW50cyB3aXRoICoqcm91bmQoKQ0KLSBOb3RlOiBiZWNhdXNlIHdlIGhhdmUgY2VudGVyZWQgb3VyIGRhdGEsIE0gPSAwICYgcmVtZW1iZXIsIGNlbnRlcmluZyBkb2Vzbid0IGNoYW5nZSBvdXIgU0QNCi0gQW5vdGhlciBub3RlOiBzaW5jZSB3ZSAiaGFuZCBwaWNrZWQiIHdoYXQgd2Uga25vdyB0byBiZSB0aGUgdHJhZGl0aW9uYWwgbWVhbiBhbmQgU0QgZm9yIElRLCB0aGVzZSBsZXZlbHMgc2hvdWxkIGxvb2sgdmVyeSBzaW1pbGFyIHRvIG91ciBmaXJzdCBzaW1wbGUgc2xvcGVzIGdyYXBoISANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVjaG89VFJVRX0NCiNDcmVhdGUgb3VyIG5ldyB2YXJpYWJsZSBmb3IgSVEgYmFzZWQgb24gdGhlIGFjdHVhbCBtZWFuL3N0YW5kYXJkIGRldmlhdGlvbiBpbiBvdXIgZGF0YSBzZXQNCg0KSVEuU0QgPC0gYyhtZWFuKEdQQS5EYXRhJElRLkMpLXNkKEdQQS5EYXRhJElRLkMpLA0KICAgICAgICAgICBtZWFuKEdQQS5EYXRhJElRLkMpLA0KICAgICAgICAgICBtZWFuKEdQQS5EYXRhJElRLkMpK3NkKEdQQS5EYXRhJElRLkMpKQ0KDQpJUS5TRCA8LSByb3VuZChJUS5TRCwgMikNCklRLlNEDQojIE5vdGU6IHRoZSBtZWFuIGlzIDAgYmVjYXVzZSB3ZSBtZWFuIGNlbnRlcmVkIG91ciBkYXRhLCBtZWFuaW5nIHdlIHNhaWQsIG1ha2UgDQojIHRoZSBtZWFuIG9mIG91ciBkYXRhID0gMCEgQWxzbywgd2Ugc2VlIHRoYXQgb3VyIHN0YW5kYXJkIGRldmlhdGlvbnMgYXJlIHByZXR0eSANCiMgZGFybiBjbG9zZSB0byB0aGUgZXhwZWN0ZWQgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb25zLiBLZWVwIGluIG1pbmQgdGhhdCANCiMgdGhpcyBpcyBzaW11bGF0ZWQgZGF0YSwgYW5kIG1vc3QgZGF0YSBpbiB0aGUgcmVhbCB3b3JsZCB3aWxsIG5vdCBwcm9kdWNlIHN1Y2ggDQojICJ0eXBpY2FsIiBkYXRhIA0KSW50ZXIuU0QgPC0gZWZmZWN0KGMoIklRLkMqV29yay5FdGhpYy5DIiksIEdQQS5Nb2RlbC4yLA0KICAgICAgICAgICAgICAgICAgICAgeGxldmVscz1saXN0KElRLkM9YygtMTQuNzUsIDAsIDE0Ljc1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrLkV0aGljLkM9YygtMS4xLCAwLCAxLjEpKSkgDQojIHB1dCBkYXRhIGluIGRhdGEgZnJhbWUgDQpJbnRlci5TRCA8LSBhcy5kYXRhLmZyYW1lKEludGVyLlNEKQ0KDQojIENyZWF0ZSBmYWN0b3JzIG9mIHRoZSBkaWZmZXJlbnQgdmFyaWFibGVzIGluIHlvdXIgaW50ZXJhY3Rpb24gDQpJbnRlci5TRCRJUTwtZmFjdG9yKEludGVyLlNEJElRLkMsDQogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWMoLTE0Ljc1LCAwLCAxNC43NSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIjEgU0QgQmVsb3cgTWVhbiIsICJNZWFuIiwgIjEgU0QgQWJvdmUgTWVhbiIpKQ0KICAgICAgICAgICAgICAgICAgICAgDQpJbnRlci5TRCRXb3JrLkV0aGljPC1mYWN0b3IoSW50ZXIuU0QkV29yay5FdGhpYy5DLA0KICAgICAgICAgICAgICBsZXZlbHM9YygtMS4xLCAwLCAxLjEpLA0KICAgICAgICAgICAgICBsYWJlbHM9YygiUG9vciBXb3JrZXIiLCAiQXZlcmFnZSBXb3JrZXIiLCAiSGFyZCBXb3JrZXIiKSkNCg0KIyBQbG90IHRoaXMgYmFkIGJveSENClBsb3QuU0Q8LWdncGxvdChkYXRhPUludGVyLlNELCBhZXMoeD1Xb3JrLkV0aGljLCB5PWZpdCwgZ3JvdXA9SVEpKSsNCiAgICAgIGdlb21fbGluZShzaXplPTEsIGFlcyhjb2xvcj1JUSkpKyAjQ2FuIGFkanVzdCB0aGUgdGhpY2tuZXNzIG9mIHlvdXIgbGluZXMNCiAgICAgIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IElRKSwgc2l6ZT0yKSsgI0NhbiBhZGp1c3QgdGhlIHNpemUgb2YgeW91ciBwb2ludHMNCiAgICAgIGdlb21fcmliYm9uKGFlcyh5bWluPWZpdC1zZSwgeW1heD1maXQrc2UpLGZpbGw9ImdyYXkiLGFscGhhPS42KSsgI0NhbiBhZGp1c3QgeW91ciBlcnJvciBiYXJzDQogICAgICB5bGltKDAsNCkrICNQdXRzIGEgbGltaXQgb24gdGhlIHktYXhpcw0KICAgICAgeWxhYigiR1BBIikrICNBZGRzIGEgbGFiZWwgdG8gdGhlIHktYXhpcw0KICAgICAgeGxhYigiV29yayBFdGhpYyIpKyAjQWRkcyBhIGxhYmVsIHRvIHRoZSB4LWF4aXMNCiAgICAgIGdndGl0bGUoIlN0YW5kYXJkIERldmlhdGlvbiBQbG90IikrICNUaXRsZQ0KICAgICAgdGhlbWVfYncoKSsgI1JlbW92ZXMgdGhlIGdyYXkgYmFja2dyb3VuZCANCiAgICAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3I9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIHBhbmVsLmdyaWQubWlub3I9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCkpKyAjUmVtb3ZlcyB0aGUgbGluZXMgDQogICAgIHNjYWxlX2ZpbGxfZ3JleSgpDQpQbG90LlNEDQpgYGANCg0KIyMjIyBJbnRlcnByZXRhdGlvbiBvZiBTRCBwbG90DQoqKiBOb3RlIC0gdGhlIGVycm9yIGJhcnMgaW4gdGhpcyBncmFwaCBhcmUgdmVyeSBoYXJkIHRvIHNlZSwgYmVjYXVzZSB3ZSBoYXZlIHZlcnkgDQpsaXR0bGUgZXJyb3IgaW4gb3VyIHNpbXVsYXRlZCBkYXRhIHNldC4gRm9yIGEgZnVsbCBBUEEgc3R5bGUgZ3JhcGgsIGVycm9yIGJhcnMgDQp3b3VsZCBiZSBleHBlY3RlZC4gDQoNCiMgQ29udGludW91cyB4IENhdGVnb3JpY2FsIFJlZ3Jlc3Npb24gDQoqKklRIHggR2VuZGVyIChNYWxlL0ZlbWFsZSkgYXMgcHJlZGljdG9ycyBvZiBHUEEqKiANCg0KTm93IHRoYXQgd2UgaGF2ZSBnb25lIHRocm91Z2ggb25lIGZ1bGwgZXhhbXBsZSBvZiByZWdyZXNzaW9uIGludGVyYWN0aW9ucywgdGhlIG5leHQgdHdvIHNlY3Rpb25zIHNob3VsZCBiZSBhIGJpdCBlYXNpZXIuIFRoaXMgdXBjb21pbmcgc2VjdGlvbiBpcyBnb2luZyB0byBsb29rIGF0IGhvdw0KeW91IHdvdWxkIHJ1bi9wbG90IGEgcmVncmVzc2lvbiB3aXRoIDEgY29udGludW91cyBwcmVkaWN0b3IgdmFyaWFibGUgYW5kIDEgY2F0ZWdvcmljYWwgcHJlZGljdG9yIHZhcmlhYmxlLiANCg0KR29pbmcgb2ZmIG9mIG91ciBsYXN0IGV4YW1wbGUsIGxldCdzIHNheSB3ZSBub3cgd2FudCB0byBpbnZlc3RpZ2F0ZSBob3cgd29yayBldGhpYyBpbnRlcmFjdHMgd2l0aCBnZW5kZXIgKGFzIGEgY2F0ZWdvcmljYWwgdmFyaWFibGUpLiBUaGluZ3MgZ2V0IHNsaWdodGx5IHRyaWNraWVyLi4uIExldCdzIGNoZWNrIGl0IG91dCENCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPVRSVUV9DQojT25jZSBhZ2Fpbiwgd2UgYXJlIGdvaW5nIHRvIGJlZ2luIGJ5IHNpbXVsYXRpbmcgb3VyIGRhdGEgDQojUmVtZW1iZXIsIHlvdXIgc2VlZCBjYW4gYmUgc2V0IHRvIGFueXRoaW5nIQ0Kc2V0LnNlZWQoMTQwKQkNCiNTdGF5aW5nIHdpdGggMjUwIHBhcnRpY2lwYW50cyBmb3IgY29uc2lzdGVuY3kncyBzYWtlIA0KTiA8LSAyNTANCiNVbmlmb3JtIGRpc3RyaWJ1dGlvbiBvZiB3b3JrIGV0aGljIChYKSBmcm9tIDEtNSAoMSA9IHBvb3Igd29yayBldGhpYywgNSA9IGdyZWF0IHdvcmsgZXRoaWMpIA0KWCA8LSBybm9ybShuLCAyLjc1LCAuNzUpDQojT3VyIG5ld2VzdCB2YXJpYWJsZSwgRywgaXMgYSBiaW5hcnkgdmFyaWFibGUgKDAsMSkgZm9yIGdlbmRlciANCiNXZSBhcmUgYXNraW5nIHRoZSBjb21wdXRlciB0byBjcmVhdGUgYSBkYXRhc2V0IG9mIDBzIGFuZCAxcyBhbmQgY2FsbCBpdCB2YXJpYWJsZSBHDQpHIDwtIHNhbXBsZShyZXAoYygwLDEpLE4pLE4scmVwbGFjZSA9IEZBTFNFKQkNCiNUaGlzIGlzIG91ciBlcXVhdGlvbiB0byBjcmVhdGUgWQ0KWSA8LSAuNypYICsgLjMqRyArIDIqWCpHICsgcm5vcm0obiwgc2QgPSA1KQkJDQojR290dGEgY2FwIG91ciBZIHZhcmlhYmxlIGF0IDQgKGJlY2F1c2UgaXQgaXMgR1BBKQ0KWSA9IChZIC0gbWluKFkpKSAvIChtYXgoWSkgLSBtaW4oWSkpKjQNCiNGaW5hbGx5LCBsZXQncyBwdXQgYWxsIG91ciB2YXJpYWJsZXMgaW50byBhIGRhdGEgZnJhbWUgDQojVGhpcyBpcyBiYXNpY2FsbHkgdGVsbGluZyB0aGUgY29tcHV0ZXIgInB1dCBhbGwgdGhlc2UgdmFyaWFibGVzIEkganVzdCBtYWRlIGludG8gb25lIGRhdGEgc2V0Ig0KR1BBLkRhdGEuMjwtZGF0YS5mcmFtZShHUEE9WSwgV29yay5FdGhpYz1YLCBHZW5kZXI9RykJDQojRG9uJ3QgZm9yZ2V0IHRvIGNlbnRlciBvdXIgY29udGludW91cyB2YXJpYWJsZSEgDQpHUEEuRGF0YS4yJFdvcmsuRXRoaWMuQyA8LSBzY2FsZShHUEEuRGF0YSRXb3JrLkV0aGljLCBjZW50ZXIgPSBUUlVFLCBzY2FsZSA9IEZBTFNFKVssXQ0KYGBgDQojIyBEdW1teSBDb2RpbmcgDQoNCkhlcmUgaXMgd2hlcmUgdGhpbmdzIGdldCBhIGxpdHRsZSBkaWZmZXJlbnQuLiANCg0KKipXaGF0IGlzIER1bW15IENvZGluZz8qKiANCg0KLSBJdCBpcyB0aGUgbW9zdCBjb21tb24gYW5kIGJhc2ljIHdheSB0byBhbmFseXplIGNhdGVnb3JpY2FsIHZhcmlhYmxlcyBpbiByZWdyZXNzaW9uIA0KLSBFdmVyeSB2YXJpYWJsZSBoYXMgYSBiYXNlbGluZS9yZWZlcmVuY2UgZ3JvdXAgdGhhdCBvdGhlciAibGV2ZWxzIiBnZXQgY29tcGFyZWQgdG8NCi0gUiBkdW1teSBjb2RlcyBhdXRvbWF0aWNhbGx5IHdoZW4gaXQgZGV0ZWN0cyBmYWN0b3IgdmFyaWFibGVzIA0KLSBUaGUgcXVlc3Rpb24gd2UgYXJlIGFza2luZyBpczogImhvdyBtdWNoIGRvZXMgZWFjaCBncm91cCBkZXZpYXRlIGZyb20gdGhlIHJlZmVyZW5jZT8iDQoNCkluIHRoaXMgcGFydGljdWxhciBjYXNlLCBzaW5jZSB0aGVyZSBhcmUgb25seSB0d28gbGV2ZWxzIG9mIHRoZSB2YXJpYWJsZSBHZW5kZXIgKG1hbGUgYW5kIGZlbWFsZSksIGl0IGlzIHF1aXRlIGEgc2ltcGxlIGR1bW15IGNvZGUgb2YgMCwgMS4gQWxsIG1hbGVzIGluIHRoZSBkYXRhIHNldCBhcmUgYXNzaWduZWQgYSAwIGFuZCBhbGwgZmVtYWxlcyBhcmUgYXNzaWduZWQgYSAxLiANCg0KUHJldmlvdXNseSwgSSB3cm90ZSB0aGF0IFIgZHVtbXkgY29kZXMgYXV0b21hdGljYWxseS4gV2hpbGUgd2UgZ2V0IHRoZSAwcyBhbmQgMXMgYXV0b21hdGljYWxseSwgaXQgaXMgZmFyIG1vcmUgaW50dWl0aXZlIHRvIHJlbmFtZSBvdXIgZmFjdG9yIHRvIHNvbWV0aGluZyB0aGF0IG1ha2VzIG1vcmUgc2Vuc2UuIA0KDQotIFdlIGFyZSBjcmVhdGluZyBhIG5ldyB2YXJpYWJsZSwgY2FsbGVkIEdlbmRlci5GLCB3aGVyZSBGIHN0YW5kcyBmb3IgZmFjdG9yIA0KLSBUaGlzIHZhcmlhYmxlIG5vdyBoYXMgbGV2ZWxzIHdpdGggd29yZHMsIGluc3RlYWQgb2YganVzdCAwcyBhbmQgMXMgDQotICoqTm90ZToqKiBpdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHlvdXIgbGFiZWxzIGFyZSBzcGVsbGVkIHJpZ2h0IChvciB0aGF0IHlvdSBjb25zaXN0ZW50bHkgc3BlbGwgeW91ciBsYWJlbHMgaW5jb3JyZWN0bHkpIGJlY2F1c2UgeW91IHdpbGwgYmUgZW50ZXJpbmcgaW4gdGhlc2UgZXhhY3QgbGFiZWxzIGFnYWluIHdoZW4geW91IGNyZWF0ZSB5b3VyIGludGVyYWN0aW9ucyANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVjaG89VFJVRX0NCkdQQS5EYXRhLjIkR2VuZGVyLkYgPC0gZmFjdG9yKEdQQS5EYXRhLjIkR2VuZGVyLAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9YygwLDEpLAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIk1hbGUiLCJGZW1hbGUiKSkJDQpgYGANCg0KDQojIyBSdW4geW91ciByZWdyZXNzaW9uIG1vZGVscyANCg0KVXNlICoqbG0oKSBmdW5jdGlvbioqIHRvIHJ1biBtb2RlbCB3aXRoIGFuZCB3aXRob3V0IGludGVyYWN0aW9uDQoNCi0gQWRkaXRpdmUgZWZmZWN0cyA9ICsgDQotIE11bHRpcGxpY2F0aXZlIChpbnRlcmFjdGlvbikgZWZmZWN0cyA9ICogDQoNCioqVXNlIHN0YXJnYXplcigpIHRvIHZpc3VhbGl6ZSB5b3VyIHJlc3VsdHMqKg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZWNobz1UUlVFLHJlc3VsdHM9J2FzaXMnfQ0KR1BBLjIuTW9kZWwuMSA8LSBsbShHUEF+V29yay5FdGhpYy5DK0dlbmRlci5GLCBHUEEuRGF0YS4yKQ0KR1BBLjIuTW9kZWwuMiA8LSBsbShHUEF+V29yay5FdGhpYy5DKkdlbmRlci5GLCBHUEEuRGF0YS4yKQ0KDQpsaWJyYXJ5KHN0YXJnYXplcikNCnN0YXJnYXplcihHUEEuMi5Nb2RlbC4xLCBHUEEuMi5Nb2RlbC4yLHR5cGU9Imh0bWwiLAkNCiAgICAgICAgICBjb2x1bW4ubGFiZWxzID0gYygiTWFpbiBFZmZlY3RzIiwgIkludGVyYWN0aW9uIiksCQ0KICAgICAgICAgIGludGVyY2VwdC5ib3R0b20gPSBGQUxTRSwJDQogICAgICAgICAgc2luZ2xlLnJvdz1GQUxTRSwgCQ0KICAgICAgICAgIG5vdGVzLmFwcGVuZCA9IEZBTFNFLAkNCiAgICAgICAgICBoZWFkZXI9RkFMU0UpCQ0KYGBgDQoNCkxldCdzIGdvIHJpZ2h0IGludG8gY3JlYXRpbmcgb3VyIGludGVyYWN0aW9uIQ0KDQpLZWVwIGluIG1pbmQsIHdlIGFscmVhZHkgdHVybmVkIEdlbmRlciBpbnRvIGEgRmFjdG9yIHdpdGggbGFiZWxlZCBsZXZlbHMsIHNvIHdlIGNhbiByZWZlciB0byB0aGUgYWN0dWFsIG5hbWVzIG9mIHRoZSBsZXZlbHMgKGluc3RlYWQgb2YgbnVtYmVycykNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPVRSVUV9DQpsaWJyYXJ5KGVmZmVjdHMpDQojT3VyIGludGVyYWN0aW9uDQpJbnRlci5HUEEuMiA8LSBlZmZlY3QoJ1dvcmsuRXRoaWMuQypHZW5kZXIuRicsIEdQQS4yLk1vZGVsLjIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bGV2ZWxzPWxpc3QoV29yay5FdGhpYy5DID0gYygtMS4xLCAwLCAxLjEpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlPVRSVUUsIGNvbmZpZGVuY2UubGV2ZWw9Ljk1LCB0eXBpY2FsPW1lYW4pDQoNCiNQdXQgZGF0YSBpbiBkYXRhIGZyYW1lIA0KSW50ZXIuR1BBLjI8LWFzLmRhdGEuZnJhbWUoSW50ZXIuR1BBLjIpDQoNCiNDcmVhdGUgZmFjdG9ycyBvZiB0aGUgaW50ZXJhY3Rpb24gdmFyaWFibGVzICAgICAgICAgICAgICAgICAgICAgIA0KSW50ZXIuR1BBLjIkV29yay5FdGhpYzwtZmFjdG9yKEludGVyLkdQQS4yJFdvcmsuRXRoaWMuQywNCiAgICAgICAgICAgICAgbGV2ZWxzPWMoLTEuMSwgMCwgMS4xKSwNCiAgICAgICAgICAgICAgbGFiZWxzPWMoIlBvb3IgV29ya2VyIiwgIkF2ZXJhZ2UgV29ya2VyIiwgIkhhcmQgV29ya2VyIikpDQpJbnRlci5HUEEuMiRHZW5kZXI8LWZhY3RvcihJbnRlci5HUEEuMiRHZW5kZXIuRiwNCiAgICAgICAgICAgICAgbGV2ZWxzPWMoIk1hbGUiLCAiRmVtYWxlIikpDQojTm90ZTogd2hlbiBJIGNyZWF0ZSB0aGlzIEdlbmRlciBmYWN0b3IsIEkgd2lsbCBubyBsb25nZXIgdXNlICIuRiIgc28gSSBkb24ndCBoYXZlIHRvIHJlbmFtZSBteSBsZWdlbmQgaW4gbXkgcGxvdCANCg0KbGlicmFyeShnZ3Bsb3QyKQ0KI1Bsb3QgaXQgdXAhDQpQbG90LkdQQS4yPC1nZ3Bsb3QoZGF0YT1JbnRlci5HUEEuMiwgYWVzKHg9V29yay5FdGhpYywgeT1maXQsIGdyb3VwPUdlbmRlcikpKw0KICAgICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsNCkpKyAgDQojRm9yIHlsaW0sIHNwZWNpZnkgdGhlIHJhbmdlIG9mIHlvdXIgRFYgKGluIG91ciBjYXNlLCAwLTQpDQogICAgICBnZW9tX2xpbmUoc2l6ZT0yLCBhZXMoY29sb3I9R2VuZGVyKSkrDQogICAgICB5bGFiKCJHUEEiKSsNCiAgICAgIHhsYWIoIldvcmsgRXRoaWMiKSsNCiAgICAgIGdndGl0bGUoIldvcmsgRXRoaWMgYW5kIEdlbmRlciBhcyBQcmVkaWN0b3JzIG9mIEdQQSIpKw0KICAgICAgdGhlbWVfYncoKSsgDQogICAgICAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3I9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yPWVsZW1lbnRfYmxhbmsoKSkrDQogICAgICBzY2FsZV9maWxsX2dyZXkoKQ0KUGxvdC5HUEEuMg0KYGBgDQojIyMjIEludGVycHJldGF0aW9uIG9mIENvbnRpbnVvdXMgeCBDYXRlZ29yaWFsIEludGVyYWN0aW9uIFBsb3QNCkFzIHlvdSBjYW4gc2VlLCB0aGVyZSBpcyBub3QgbXVjaCBvZiBhbiBpbnRlcmFjdGlvbiwgd2hpY2ggd2Ugd291bGQgZXhwZWN0IGFmdGVyIHNlZWluZyB0aGF0IG91ciBpbnRlcmFjdGlvbiBlZmZlY3Qgd2FzIGluc2lnbmlmaWNhbnQuIA0KDQojQ2F0ZWdvcmljYWwgeCBDYXRlZ29yaWNhbCBSZWdyZXNzaW9uIA0KDQoqKlR1dG9ycyBhbmQgR2VuZGVyIGFzIFByZWRpY3RvcnMgb2YgR1BBKioNCg0KRm9yIHRoZSBmaW5hbCBleGFtcGxlIG9mIHRoZSBjaGFwdGVyLCB3ZSBhcmUgZ29pbmcgdG8gbG9vayBhdCBwbG90dGluZyBpbnRlcmFjdGlvbnMgd2l0aCAyIGNhdGVnb3JpY2FsIHByZWRpY3RvcnMuIFdlIGtub3cgdGhhdCBzdHVkZW50cyBkaWZmZXIgaW4gdGhlaXIgYWNjZXNzIHRvL3VzZSBvZiB0dXRvcmluZyBhbmQgaXQgd291bGQgYmUgaW50ZXJlc3RpbmcgdG8gc2VlIGhvdyBHZW5kZXIgaW50ZXJhY3RzIHdpdGggdHV0b3Jpbmcgc2VydmljZXMuIA0KDQpTdHVkZW50cyBpbiB0aGlzIHN0dWR5IGVpdGhlciBoYXZlOiANCg0KLSBObyBUdXRvciANCi0gR3JvdXAgVHV0b3IgDQotIFByaXZhdGUgVHV0b3IgDQoNCiMjIERhdGEgc2ltdWxhdGlvbiANCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPVRSVUV9DQojU2V0IHVwIHNpbXVsYXRpb24JDQpzZXQuc2VlZCgyNDQpCQ0KTiA8LSAyNTAJDQpRIDwtIHNhbXBsZShyZXAoYygtMSwwLDEpLE4pLE4scmVwbGFjZSA9IEZBTFNFKQkjUSA9IFR1dG9yIFN0YXR1cw0KRyA8LSBzYW1wbGUocmVwKGMoMCwxKSxOKjMvMiksTixyZXBsYWNlID0gRkFMU0UpICNHID0gR2VuZGVyDQoNCiNPdXIgZXF1YXRpb24gdG8gY3JlYXRlIFkJDQpZIDwtIC41KlEgKyAuMjUqRyArIDIuNSpRKkcrIDEgKyBybm9ybShOLCBzZD0yKQkNCg0KI1B1dCBhIGNhcCBvbiBvdXIgWQ0KWSA9IChZIC0gbWluKFkpKSAvIChtYXgoWSkgLSBtaW4oWSkpKjQNCg0KI0J1aWxkIG91ciBkYXRhIGZyYW1lCQ0KR1BBLkRhdGEuMzwtZGF0YS5mcmFtZShHUEE9WSxUdXRvcj1RLEdlbmRlcj1HKQkNCg0KYGBgDQoNCiMjIER1bW15IGNvZGluZyANClNpbWlsYXIgdG8gdGhlIGxhc3QgZXhhbXBsZSwgd2UgYXJlIGdvaW5nIHRvIG5vdyBjcmVhdGUgZmFjdG9ycyB3aXRoIGR1bW15IGNvZGVzLiBUaGlzIHRpbWUsIGhvd2V2ZXIsd2UgbmVlZCB0byBkbyB0aGlzIGZvciBCT1RIIHByZWRpY3RvciB2YXJpYWJsZXMgKGdlbmRlciAmIHR1dG9yKSBiZWNhdXNlIHdlIGhhdmUgMiBjYXRlZ29yaWNhbCB2YXJpYWJsZXMuIA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZWNobz1UUlVFfQ0KR1BBLkRhdGEuMyRUdXRvci5GIDwtIGZhY3RvcihHUEEuRGF0YS4zJFR1dG9yLAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9YygtMSwwLDEpLAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIk5vIFR1dG9yIiwgIkdyb3VwIFR1dG9yIiwgIlByaXZhdGUgVHV0b3IiKSkJDQpHUEEuRGF0YS4zJEdlbmRlci5GIDwtIGZhY3RvcihHUEEuRGF0YS4zJEdlbmRlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9YygwLDEpLAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIk1hbGUiLCAiRmVtYWxlIikpCQ0KYGBgDQoNCiMjIFJ1biB5b3VyIHJlZ3Jlc3Npb24gDQpPbmNlIGFnYWluLCB3ZSBsb29rIGF0IGJvdGggb3VyIG1haW4gZWZmZWN0cyBtb2RlbCAmIGludGVyYWN0aW9uIG1vZGVsIGFuZCB1c2Ugc3RhcmdhemVyIHRvIGNvbXBhcmUgdGhlIHR3byBtb2RlbHMuIA0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVjaG89VFJVRSwscmVzdWx0cz0nYXNpcyd9DQpHUEEuMy5Nb2RlbC4xPC1sbShHUEEgfiBUdXRvci5GK0dlbmRlci5GLCBkYXRhID0gR1BBLkRhdGEuMykJDQpHUEEuMy5Nb2RlbC4yPC1sbShHUEEgfiBUdXRvci5GKkdlbmRlci5GLCBkYXRhID0gR1BBLkRhdGEuMykJDQoNCnN0YXJnYXplcihHUEEuMy5Nb2RlbC4xLCBHUEEuMy5Nb2RlbC4yLHR5cGU9Imh0bWwiLAkNCiAgICAgICAgICBjb2x1bW4ubGFiZWxzID0gYygiTWFpbiBFZmZlY3RzIiwgIkludGVyYWN0aW9uIiksCQ0KICAgICAgICAgIGludGVyY2VwdC5ib3R0b20gPSBGQUxTRSwJDQogICAgICAgICAgc2luZ2xlLnJvdz1UUlVFLCAJDQogICAgICAgICAgbm90ZXMuYXBwZW5kID0gRkFMU0UsCQ0KICAgICAgICAgIG9taXQuc3RhdD1jKCJzZXIiKSwJDQogICAgICAgICAgc3Rhci5jdXRvZmZzID0gYygwLjA1LCAwLjAxLCAwLjAwMSksCQ0KICAgICAgICAgIGhlYWRlcj1GQUxTRSkJDQpgYGANCg0KIyMgTm93IGZvciB0aGUgaW50ZXJhY3Rpb24gcGxvdCEgDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPVRSVUV9DQojVGhlIEludGVyYWN0aW9uDQpJbnRlci5HUEEuMyA8LSBlZmZlY3QoJ1R1dG9yLkYqR2VuZGVyLkYnLCBHUEEuMy5Nb2RlbC4yLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2U9VFJVRSkNCiNEYXRhIEZyYW1lDQpJbnRlci5HUEEuMy5ERjwtYXMuZGF0YS5mcmFtZShJbnRlci5HUEEuMykNCg0KIyBSZWxhYmxlIHRoZW0gdG8gcHV0IHRoZW0gYmFjayBpbiBvcmRlcg0KSW50ZXIuR1BBLjMuREYkVHV0b3IuRiA8LSBmYWN0b3IoSW50ZXIuR1BBLjMuREYkVHV0b3IsCQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbD1jKCJObyBUdXRvciIsICJHcm91cCBUdXRvciIsICJQcml2YXRlIFR1dG9yIiksCQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTm8gVHV0b3IiLCAiR3JvdXAgVHV0b3IiLCAiUHJpdmF0ZSBUdXRvciIpKQkNCkludGVyLkdQQS4zLkRGJEdlbmRlci5GIDwtIGZhY3RvcihJbnRlci5HUEEuMy5ERiRHZW5kZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsPWMoIk1hbGUiLCAiRmVtYWxlIiksCQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTWFsZSIsICJGZW1hbGUiKSkNCg0KI0NyZWF0ZSBwbG90DQpQbG90LkdQQS4zPC1nZ3Bsb3QoZGF0YT1JbnRlci5HUEEuMy5ERiwgYWVzKHg9VHV0b3IuRiwgeT1maXQsIGdyb3VwPUdlbmRlci5GKSkrDQogICAgZ2VvbV9saW5lKHNpemU9MiwgYWVzKGNvbG9yPUdlbmRlci5GKSkrDQogICAgZ2VvbV9yaWJib24oYWVzKHltaW49Zml0LXNlLCB5bWF4PWZpdCtzZSxmaWxsPUdlbmRlci5GKSxhbHBoYT0uMikrDQogICAgeWxhYigiR1BBIikrDQogICAgeGxhYigiVHV0b3IiKSsNCiAgICBnZ3RpdGxlKCJUdXRvcnMgYW5kIEdlbmRlciBhcyBHUEEgUHJlZGljdG9ycyIpKw0KICAgIHRoZW1lX2J3KCkrDQogICAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiksDQogICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsDQogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0idG9wIikNClBsb3QuR1BBLjMNCmBgYA0KDQpBIGZpbmFsIGxpdHRsZSBub3RlLi4uDQpUaGVyZSBhcmUgZGVmaW5pdGVseSBlYXNpZXIgd2F5cyB0byBtYWtlIHBsb3RzIGluIFIsIGJ1dCBJIHdhbnQgdG8gc2hvdyB5b3Ugd2l0aCB0aGlzIGZpbmFsIGV4YW1wbGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB1c2luZyBlZmZlY3RzL2dncGxvdCBhbmQgc2ltcGxlciBjb2RlLiBJIHdpbGwgc2F5LCBpdCBpcyBoZWxwZnVsIHRvIHVzZSB0aGVzZSBzaW1wbGUgY29kZXMgYXMgeW91IGFyZSB3b3JraW5nIHRocm91Z2ggeW91ciBhbmFseXNpcyB0byB2aXN1YWxpemUgeW91ciBkYXRhLCBidXQgaW4gdGVybXMgb2YgcHVibGlzaGluZyB5b3VyIGRhdGEsIGdncGxvdCB3aWxsIGdpdmUgeW91IHRoZSBxdWFsaXR5IHlvdSBuZWVkISENCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVjaG89VFJVRX0NCnBsb3QoSW50ZXIuR1BBLjMsIG11bHRpbGluZSA9IFRSVUUpCQ0KYGBgDQoNCjxzY3JpcHQ+DQogIChmdW5jdGlvbihpLHMsbyxnLHIsYSxtKXtpWydHb29nbGVBbmFseXRpY3NPYmplY3QnXT1yO2lbcl09aVtyXXx8ZnVuY3Rpb24oKXsNCiAgKGlbcl0ucT1pW3JdLnF8fFtdKS5wdXNoKGFyZ3VtZW50cyl9LGlbcl0ubD0xKm5ldyBEYXRlKCk7YT1zLmNyZWF0ZUVsZW1lbnQobyksDQogIG09cy5nZXRFbGVtZW50c0J5VGFnTmFtZShvKVswXTthLmFzeW5jPTE7YS5zcmM9ZzttLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsbSkNCiAgfSkod2luZG93LGRvY3VtZW50LCdzY3JpcHQnLCdodHRwczovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9hbmFseXRpY3MuanMnLCdnYScpOw0KDQogIGdhKCdjcmVhdGUnLCAnVUEtOTg4Nzg3OTMtMScsICdhdXRvJyk7DQogIGdhKCdzZW5kJywgJ3BhZ2V2aWV3Jyk7DQoNCjwvc2NyaXB0Pg==
Source: https://ademos.people.uic.edu/Chapter13.html
Posted by: lopezunpleted.blogspot.com

0 Response to "How To Draw A Moderation Graph"
Post a Comment