1 Introduction

The goal of this research project is to measure the level of self-compassion as well as the self-care of BSW and MSW students in a Social Work Program at a regional University. We will be using the following two reliable and validated instruments to measure their level of self-compassion and self-care as they immerse themselves in the helping profession. We hope to see how the SC of the students correlates to other independent variables i.e. undergrad/grad program social work, age, education level, religiosity, spirituality, gender, etc.

  1. The Self-Compassion Scale

  2. The Gratitude Questionnaire

The purpose of our research is to study the perception of self-compassion in social work students and how it can link to self-care as well as success in the social work program and field. This will help provide students with self-care practices during their training to thrive in the profession in the future.

2 Data Management and Analyzing Survey Instruments


The next chart illustrates the data management workflow to create the analytic data set.

include_graphics("img/w11-DataManagementWorkFlow.png")

survey = read.csv("w11-SurveyDataCsvFinal.csv", head = TRUE)
# names(survey)

The original survey data have three components, a self-compassion scale, gratitude questionnaire instruments, and some demographic questions.

The three components have different portions of missing values. We split the original data set into three subsets of data and imputed the missing values related to the self-compassion and gratitude data based on the survey instruments. Since there are only a few missing values, we replace the missing values in each survey question with the mode of the associated survey item. We create indexes of the two instruments separately to aggregate the information in the two survey data sets.

Since R does not have a function to find the model of a given data set, I write the following function to find the model of a data set.

We will perform both principal component analysis (PCA) and exploratory factor analysis (EFA).

my.mode = function(dataset){
  freq.tbl = table(dataset)
  max.freq.id=which(freq.tbl==max(freq.tbl))
  mode=names(freq.tbl[max.freq.id])
  as.numeric(mode)
}

2.1 Handling Missing Values Self-Compassion Instrument

This instrument contains only the data associated with the 12 items in the survey instrument. In the original data file, the 12 variables are named Q2_1, Q2_2, …, Q2_12. We impute the missing value by replacing the missing value in each of the 12 items with the mode of the corresponding survey items. Since there are only a few missing values in this instrument, this imputation will not impact the subsequent PCA and EFA.

compassion = survey[, 1:12]
# Imputing with the mode in each survey item
for (i in 1:12) {
  compassion[,i][is.na(compassion[,i])]=my.mode(compassion[,i])
}

2.2 Handling Missing Values in Gratitude Scale

The gratitude questionnaire contains only the variables associated with gratitude questions. The variables used in the original data file are Q3_1, Q3_2, …, Q3_6. We use the same mode imputation method to fill in the missing values as used in the above self-compassion survey data. The gratitude questionnaire has even fewer missing values. Any imputation will not impact any subsequent analysis.

gratitude = survey[, 13:18]
# Imputing with the mode in each survey item
for (i in 1:6) {
  gratitude[,i][is.na(gratitude[,i])]=my.mode(gratitude[,i])
}

Since Likert scales of the Q3_3 and Q3_6 were in reverse order in the design. We transform back the usual order and create a new dataset using the same variable names.

gratitude.new = gratitude
gratitude.new$Q3_3 = 8-gratitude$Q3_3
gratitude.new$Q3_6 = 8-gratitude$Q3_6

2.3 Handling Demographic Variables

The demographic variables have two issues: missing values and imbalance categories. Since the size of the data set is slightly close to 120, imputing missing values in a meaningful way is crucial to maintaining the sample size and the statistical power of all subsequent association analyses. About 15 records in the data sets do not have demographic information. Therefore these records were deleted from the final data.

A few missing values occurred in the years of education and employment that are imputed using the auxiliary information in the variables of age, the years of education, and the length of employment.

The major issue of these categorical variables is the imbalance category. The following modifications to the original demographic variables are utilized.

demographic = survey[, -(1:18)]
demographic00=demographic
# replace missing values with 99.
demographic00[is.na(demographic00)] <- 99  
# Create a frequency table for collapsing categories
#list(Q8.1=table(demographic00$Q8_1),
#     Q8.2=table(demographic00$Q8_2),
#     Q8.3=table(demographic00$Q8_3),
#     Q8.5=table(demographic00$Q8_5),
#     Q8.6=table(demographic00$Q8_6),
#     Q.9=table(demographic00$Q9),
#     Q.11=table(demographic00$Q11),
#     Q.13=table(demographic00$Q13),
#     Q.14=table(demographic00$Q14),
#     Q.15=table(demographic00$Q15),
#     Q.16=table(demographic00$Q16),
#     Q.17=table(demographic00$Q17),
#     Q.18=table(demographic00$Q18),
#     Q.19=table(demographic00$Q19),
#     Q.20=table(demographic00$Q20)
#     )
grp.age = Q8_1:  1 = (3,23], 2 = [24, 30],  3 = [31, 59]
grp.edu = Q8_2:    1 = [0,15] associate, 2 = [15.5,18.5] bachelor, 3 = [19, 25]  advdegree
grp.empl = Q8_3:   1 = [0,5]  entry, 2 = [5.5,10] junior, 3 = [10.5, 35]   senior
kid.num = Q8_5: 1 = (0) No child, 2 = at least one child
home.size = Q8_6:  1 = (1), 2 = (2), 3 = 3 or more

gender = Q9:  1 = (2) female, 2 = (1,3,5,7) male 
race = Q11:   1 = (1)   white,   2 = (2,3) other
marital.st = Q13: 1 = (1) single, 2 = (2) married/civil Partner, 3 = other
disability = Q14:  1 = yes,  2 = No
religion = Q15:  1 = 9 (no religion), 2 = (1,2,3,6,7,8,10,11,99) (religion)
Sexual.orient = Q16:  1 = (4)  heterosexual,  2 = (1,2,3,5,6,7,10) other
poli.affil = Q17: 1 = (4)ind, 2 = (5,6,7)  democrats, 3 = (1,2,3, 99) other
SW.Program = Q18: 1 = (1) BSW, 2 = (2,99) MSW
Urbanity = Q19:  1 = (1) urban, 2 = (2) rural, 3 = (3) suburban
Spirituality = Q20: 1 = (1,2,3) low, 2 = (4)   moderate,  3 = (5,6,7) high

We re-define the demographic variables based on the above modification. The modified demographic variables will be used in subsequent modeling.

Q8.1=demographic00$Q8_1
grp.age=cut(Q8.1, breaks=c(1, 23, 30, 100), labels=c("[1,23]", "[24,30]", "[30,99]"))
#
Q8.2=demographic00$Q8_2
grp.edu=cut(Q8.2, breaks=c(0, 15.5, 19, 100), labels=c("Assoc", "Bachelor", "Adv.deg"))
#
Q8.3=demographic00$Q8_3
grp.empl=cut(Q8.3, breaks=c(-1,5, 9, 100), labels=c("entry", "junior", "senior"))
#
Q8.5=demographic00$Q8_5
kid.num=cut(Q8.5, breaks=c(-1,1,100), labels=c("No-kid", "With-kid"))
#
Q8.6=demographic00$Q8_6
home.size=cut(Q8.6, breaks=c(-1,2,100), labels=c("1-2", "3+"))
#
Q.9=demographic00$Q9
gender=rep("male", length(Q.9))
gender[which(Q.9==2)]="female"
#
Q.11=demographic00$Q11
race=rep("other", length(Q.11))
race[which(Q.11==1)]="white"
#
Q.13=demographic00$Q13
marital.st = rep("other", length(Q.13))
marital.st[which(Q.13==1)]="single"
marital.st[which(Q.13==2)]="married"
#
Q.14=demographic00$Q14
disability=rep("yes", length(Q.14))
disability[which(Q.14==2)]="no"
#
Q.15=demographic00$Q15
religion=rep("religion", length(Q.15))
religion[which(Q.15==1)]="no-religion"
#
Q.16=demographic00$Q16
sexual.orient=rep("other", length(Q.16))
sexual.orient[which(Q.16==4)]="heterosexual"
#
Q.17=demographic00$Q17
poli.affil = rep("Republican", length(Q.17))
poli.affil[Q.17 %in% c(5,6)]="ModDemocrats"
poli.affil[Q.17 %in% c(7)]="StrongDemocrats"
poli.affil[which(Q.17 ==4)]="independent"
#
Q.18=demographic00$Q18
SW.program=rep("MSW", length(Q.18))
SW.program[which(Q.18==1)]="BSW"
#
Q.19=demographic00$Q19
urbanity=rep("urban", length(Q.19))
urbanity[which(Q.19==2)]="rural"
urbanity[which(Q.19==3)]="suburban"
#
Q.20=demographic00$Q20
spirituality=rep("high", length(Q.20))
spirituality[which(Q.20==2)]="moderate"
spirituality[Q.20 %in% c(1,2,3)]="low"
#
new.demographics=data.frame(grp.age, grp.edu, grp.empl, kid.num, home.size, gender, race,
           marital.st, disability, religion, sexual.orient, poli.affil,
           SW.program, urbanity, spirituality)
#new.demographics

3 Validity and Reliability Analyses

This section reports measures of validity and reliability of the two survey instruments: self-compassion and gratitude.

3.1 Self-compassion Instrument

The Self-Compassion Scale (SCS), developed by Kristin Neff in 2003, is a widely used instrument that measures self-compassion through six key subscales, which can be grouped into two overarching (not opposite) dimensions:

  • Self-Compassion (positive, adaptive responses): Treating oneself with warmth, recognizing shared human struggles, and maintaining emotional balance.
    • Self-Kindness (SK)
      • Item 3: when something painful happens, I try to take a balanced view of the situation.
      • Item 7: when something upsets me, I try to keep my emotions in balance.
    • Common Humanity (CH)
      • Item 5: I try to see my failings as part of the human condition.
      • Item 10: When I feel inadequate in some way, I try to remind myself that feelings of inadequacy are shared by most people.
    • Mindfulness (MD)
      • Item 2: I try to be understanding and patient towards those aspects of my personality I don’t like.
      • Item 6: When I am going through a very hard time. I give myself the caring and tenderness I need.
  • Self-Coldness (negative, harsh responses): Being self-critical, feeling alone in suffering, and obsessing over negative emotions.
    • Self-Judgment (SJ)
      • Item 11: I am disapproving and judgmental about my own flaws and inadequacies.
      • Item 12: I am intolerant and impatient towards those aspects of my personality I don’t like.
    • Isolation (IS)
      • Item 4: When I am feeling down, I tend to feel like most other people are probably happier than I am.
      • Item 8: When I fail at something that is important to me, I tend to feel alone in my failure.
    • Over-Identification (OI)
      • Item 1: When I fail at something important to me, I become consumed by feelings of inadequacy.
      • Item 9: When I am feeling down, I tend to obsess and fixate on everything that is wrong.

We start with some correlation plots to see the relevance of the PCA procedure on the self-compassion data.

##
M=cor(compassion)
corrplot.mixed(M, lower.col = "purple", upper = "ellipse", number.cex = .7, tl.cex = 0.7)
The pairwise correlation plot reveals the potential relevance of PCA. The shape of an ellipse represents the correlation. The skinnier the ellipse, the higher the correlation. The direction reflects whether a correlation is positive or negative. The off-diagonal direction implies s positive correlation while the main diagonal direction implies a negative association.

The pairwise correlation plot reveals the potential relevance of PCA. The shape of an ellipse represents the correlation. The skinnier the ellipse, the higher the correlation. The direction reflects whether a correlation is positive or negative. The off-diagonal direction implies s positive correlation while the main diagonal direction implies a negative association.

Figure 1 shows the moderate association between individual survey items. This implies that the PCA is relevant in aggregating the information in the survey items.

Similar to López et. al. (2018), we use the six positive items associated with mindfulness, self-kindness, and the sense of common humanity to define the self-compassion index.

From the pair-wise correlation plot, we can see that some of the items are reversely scored. We next change back the scale so that all items are positively correlated.

###
selfcomp = cbind(compassion$Q2_3, compassion$Q2_7, compassion$Q2_10,
                 compassion$Q2_5,compassion$Q2_2,compassion$Q2_6)
###
selfcold =  cbind(compassion$Q2_1, compassion$Q2_9, compassion$Q2_4,
                 compassion$Q2_8,compassion$Q2_11,compassion$Q2_12)

###  MD = Mindfulness, SK = Self-kindness, CH = sense of common humanity
selfcomp.sub = cbind(MD1=compassion$Q2_3, MD2=compassion$Q2_7, 
                     CH1=compassion$Q2_10,CH2=compassion$Q2_5,
                     SK1=compassion$Q2_2,SK2=compassion$Q2_6)

### SJ = self-judement OI = Over-identification, IS = Isolation
selfcold.sub =  cbind(OI1=compassion$Q2_1, OI2=compassion$Q2_9, 
                     IS1=compassion$Q2_4, IS2=compassion$Q2_8,
                     SJ1=compassion$Q2_11,SJ2=compassion$Q2_12)
### Simple sum and average
selfcomp.sum = compassion$Q2_3 + compassion$Q2_7 + compassion$Q2_10 +
                 compassion$Q2_5 + compassion$Q2_2 + compassion$Q2_6
selfcomp.avg = selfcomp.sum/6
##
M=cor(cbind(selfcomp.sub, selfcold.sub))
corrplot.mixed(M, lower.col = "purple", upper = "ellipse", number.cex = .7, tl.cex = 0.7)
The pairwise correlation plot reveals the potential relevance of PCA. Group items based on self-compassion and self-coldness

The pairwise correlation plot reveals the potential relevance of PCA. Group items based on self-compassion and self-coldness

Next, we make the following heatmap to illustrate the pairwise correlation between the items in the survey instrument based on the positive adjustment of the scale.

##
M=cor(selfcomp.sub)
corrplot.mixed(M, lower.col = "purple", upper = "ellipse", number.cex = .7, tl.cex = 0.7)
Pairwise correlation based on negatively adjusted subscales. The shape of an ellipse represents the correlation. The skinnier the ellipse, the higher the correlation. The direction reflects whether a correlation is positive or negative. The off-diagonal direction implies s positive correlation while the main diagonal direction implies a negative association.

Pairwise correlation based on negatively adjusted subscales. The shape of an ellipse represents the correlation. The skinnier the ellipse, the higher the correlation. The direction reflects whether a correlation is positive or negative. The off-diagonal direction implies s positive correlation while the main diagonal direction implies a negative association.

Intern Consistency

With the adjusted scores in the self-compassion instrument, we calculate one of the commonly used internal consistency reliability Cronbach alpha as follows.

Next, we find the Cronbach alpha and its 95% confidence interval.

cronbach.sc = as.numeric(alpha(selfcomp.sub)$total[1])
CI.sc = cronbach.alpha.CI(alpha=cronbach.sc, n=104, items=6, conf.level = 0.95)
CI.comp = cbind(LCI = CI.sc[1], alpha = cronbach.sc, UCI =CI.sc[2])
row.names(CI.comp) = ""
pander(CI.comp, caption="Confodence Interval of Cranbach Alpha")
Confodence Interval of Cranbach Alpha
LCI alpha UCI
0.6904 0.7672 0.8302

We can see that Cronbach’s alpha is 0.77 with a 95% confidence interval (0.70, 0.84) suggesting that the items in the self-compassion instrument have relatively high internal consistency.

3.2 Gratitude Questionaire

In this section, we perform the same analysis on the gratitude survey instrument. First of all, we present a pairwise correlation plot to display the correlation between individual survey items in the gratitude survey instrument.

##
M1=cor(gratitude.new)
#corrplot(M, type = "upper", method = "ellipse", main="Pairwise Correlation Plot: Self-Compassion Scale")
corrplot.mixed(M1, lower.col = "purple", upper = "ellipse", number.cex = .7, tl.cex = 0.7)
The pairwise correlation plot reveals the potential relevance of PCA for the gratitude instrument. The shape of an ellipse represents the correlation. The skinnier the ellipse, the higher the correlation. The direction reflects whether a correlation is positive or negative. The off-diagonal direction implies s positive correlation while the main diagonal direction implies a negative association.

The pairwise correlation plot reveals the potential relevance of PCA for the gratitude instrument. The shape of an ellipse represents the correlation. The skinnier the ellipse, the higher the correlation. The direction reflects whether a correlation is positive or negative. The off-diagonal direction implies s positive correlation while the main diagonal direction implies a negative association.

Figure 3 shows that a moderate correlation exists between individual variables. This implies the PCA and EFA can be used to aggregate the information in the set original survey items. Next, we estimate the number of PCAs or EFAs to be retained for the subsequent analysis using the commonly used procedures and summarize the results in the following Figure 4.

Cronbach’s Alpha

The internal consistency measure, Cronbach’s alpha, of the gratitude instruments calculated below

cronbach.gr = as.numeric(alpha(gratitude.new)$total[1])
CI.gr = cronbach.alpha.CI(alpha=cronbach.gr, n=104, items=6, conf.level = 0.95)
CI.gratitude = cbind(LCI = CI.gr[1], alpha = cronbach.gr, UCI =CI.gr[2])
row.names(CI.gratitude) = ""
kable(CI.gratitude, caption="Confodence Interval of Cranbach Alpha")
Confodence Interval of Cranbach Alpha
LCI alpha UCI
0.7280232 0.795529 0.8508849

We can see that Cronbach’s alpha is 0.8 with a 95% confidence interval (0.74, 0.86) also suggesting that the items in the Gratitude rating instrument have relatively high internal consistency.

LS0tDQp0aXRsZTogIlN1cnZleSBEYXRhIFByb2Nlc3NpbmcsIFZhbGlkaXR5LCBhbmQgUmVsaWFiaWxpdHkgIg0KYXV0aG9yOiAiQSBDYXNlIFN0dWR5Ig0KZGF0ZTogIkNoZW5nIFBlbmciDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAga2VlcF90ZXg6IGZhbHNlDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiA1DQogICAgZmlnX2hlaWdodDogNA0KLS0tDQoNCmBgYHs9aHRtbH0NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCmRpdiNUT0MgbGkgew0KICAgIGxpc3Qtc3R5bGU6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQpoMS50aXRsZSB7DQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgyIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCjwvc3R5bGU+DQpgYGANCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCmlmICghcmVxdWlyZSgiR1BBcm90YXRpb24iKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiR1BBcm90YXRpb24iKQ0KICAgbGlicmFyeShHUEFyb3RhdGlvbikNCn0NCmlmICghcmVxdWlyZSgibkZhY3RvcnMiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygibkZhY3RvcnMiKQ0KICAgbGlicmFyeShuRmFjdG9ycykNCn0NCmlmICghcmVxdWlyZSgicGFyYW1ldGVycyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYXJhbWV0ZXJzIikNCiAgIGxpYnJhcnkocGFyYW1ldGVycykNCn0NCmlmICghcmVxdWlyZSgiY29ycnBsb3QiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiY29ycnBsb3QiKQ0KICAgbGlicmFyeShjb3JycGxvdCkNCn0NCmlmICghcmVxdWlyZSgiZ2djb3JycGxvdCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2NvcnJwbG90IikNCiAgIGxpYnJhcnkoZ2djb3JycGxvdCkNCn0NCmlmICghcmVxdWlyZSgiZ2dmb3J0aWZ5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImdnZm9ydGlmeSIpDQogICBsaWJyYXJ5KGdnZm9ydGlmeSkNCn0NCmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCiAgIGxpYnJhcnkoZ2dwbG90MikNCn0NCmlmICghcmVxdWlyZSgiR0dhbGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQogICBsaWJyYXJ5KEdHYWxseSkNCn0NCmlmICghcmVxdWlyZSgiR0dhbGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQogICBsaWJyYXJ5KEdHYWxseSkNCn0NCmlmICghcmVxdWlyZSgiQ0NBIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkNDQSIpDQogICBsaWJyYXJ5KENDQSkNCn0NCmlmICghcmVxdWlyZSgib2xzcnIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygib2xzcnIiKQ0KICAgbGlicmFyeShvbHNycikNCn0NCmlmICghcmVxdWlyZSgicHN5Y2giKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQ0KICAgbGlicmFyeShwc3ljaCkNCn0NCmlmICghcmVxdWlyZSgiY29jcm9uIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImNvY3JvbiIpDQogICBsaWJyYXJ5KGNvY3JvbikNCn0NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgicGFuZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBhbmRlciIpDQogICBsaWJyYXJ5KHBhbmRlcikNCn0NCiMjDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbj0nY2VudGVyJywgDQogICAgICAgICAgICAgICAgICAgICAgZmlnLnBvcyA9ICdodCcpDQpgYGANCg0KDQpcDQoNCg0KIyBJbnRyb2R1Y3Rpb24NCg0KVGhlIGdvYWwgb2YgdGhpcyByZXNlYXJjaCBwcm9qZWN0IGlzIHRvIG1lYXN1cmUgdGhlIGxldmVsIG9mIHNlbGYtY29tcGFzc2lvbiBhcyB3ZWxsIGFzIHRoZSBzZWxmLWNhcmUgb2YgQlNXIGFuZCBNU1cgc3R1ZGVudHMgaW4gYSBTb2NpYWwgV29yayBQcm9ncmFtIGF0IGEgcmVnaW9uYWwgVW5pdmVyc2l0eS4gV2Ugd2lsbCBiZSB1c2luZyB0aGUgZm9sbG93aW5nIHR3byByZWxpYWJsZSBhbmQgdmFsaWRhdGVkIGluc3RydW1lbnRzIHRvIG1lYXN1cmUgdGhlaXIgbGV2ZWwgb2Ygc2VsZi1jb21wYXNzaW9uIGFuZCBzZWxmLWNhcmUgYXMgdGhleSBpbW1lcnNlIHRoZW1zZWx2ZXMgaW4gdGhlIGhlbHBpbmcgcHJvZmVzc2lvbi4gV2UgaG9wZSB0byBzZWUgaG93IHRoZSBTQyBvZiB0aGUgc3R1ZGVudHMgY29ycmVsYXRlcyB0byBvdGhlciBpbmRlcGVuZGVudCB2YXJpYWJsZXMgaS5lLiB1bmRlcmdyYWQvZ3JhZCBwcm9ncmFtIHNvY2lhbCB3b3JrLCBhZ2UsIGVkdWNhdGlvbiBsZXZlbCwgcmVsaWdpb3NpdHksIHNwaXJpdHVhbGl0eSwgZ2VuZGVyLCBldGMuDQoNCjEuIFRoZSBTZWxmLUNvbXBhc3Npb24gU2NhbGUNCg0KMi4gVGhlIEdyYXRpdHVkZSBRdWVzdGlvbm5haXJlDQoNClRoZSBwdXJwb3NlIG9mIG91ciByZXNlYXJjaCBpcyB0byBzdHVkeSB0aGUgcGVyY2VwdGlvbiBvZiBzZWxmLWNvbXBhc3Npb24gaW4gc29jaWFsIHdvcmsgc3R1ZGVudHMgYW5kIGhvdyBpdCBjYW4gbGluayB0byBzZWxmLWNhcmUgYXMgd2VsbCBhcyBzdWNjZXNzIGluIHRoZSBzb2NpYWwgd29yayBwcm9ncmFtIGFuZCBmaWVsZC4gVGhpcyB3aWxsIGhlbHAgcHJvdmlkZSBzdHVkZW50cyB3aXRoIHNlbGYtY2FyZSBwcmFjdGljZXMgZHVyaW5nIHRoZWlyIHRyYWluaW5nIHRvIHRocml2ZSBpbiB0aGUgcHJvZmVzc2lvbiBpbiB0aGUgZnV0dXJlLg0KDQoNCiMgRGF0YSBNYW5hZ2VtZW50IGFuZCBBbmFseXppbmcgU3VydmV5IEluc3RydW1lbnRzDQoNClwNCg0KVGhlIG5leHQgY2hhcnQgaWxsdXN0cmF0ZXMgdGhlIGRhdGEgbWFuYWdlbWVudCB3b3JrZmxvdyB0byBjcmVhdGUgdGhlIGFuYWx5dGljIGRhdGEgc2V0Lg0KDQpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aCA9ICc1MCUnfQ0KaW5jbHVkZV9ncmFwaGljcygiaW1nL3cxMS1EYXRhTWFuYWdlbWVudFdvcmtGbG93LnBuZyIpDQpgYGANCg0KDQoNCmBgYHtyfQ0Kc3VydmV5ID0gcmVhZC5jc3YoIncxMS1TdXJ2ZXlEYXRhQ3N2RmluYWwuY3N2IiwgaGVhZCA9IFRSVUUpDQojIG5hbWVzKHN1cnZleSkNCmBgYA0KDQpUaGUgb3JpZ2luYWwgc3VydmV5IGRhdGEgaGF2ZSB0aHJlZSBjb21wb25lbnRzLCBhIHNlbGYtY29tcGFzc2lvbiBzY2FsZSwgIGdyYXRpdHVkZSBxdWVzdGlvbm5haXJlIGluc3RydW1lbnRzLCBhbmQgc29tZSBkZW1vZ3JhcGhpYyBxdWVzdGlvbnMuIA0KDQpUaGUgdGhyZWUgY29tcG9uZW50cyBoYXZlIGRpZmZlcmVudCBwb3J0aW9ucyBvZiBtaXNzaW5nIHZhbHVlcy4gV2Ugc3BsaXQgdGhlIG9yaWdpbmFsIGRhdGEgc2V0IGludG8gdGhyZWUgc3Vic2V0cyBvZiBkYXRhIGFuZCBpbXB1dGVkIHRoZSBtaXNzaW5nIHZhbHVlcyByZWxhdGVkIHRvIHRoZSBzZWxmLWNvbXBhc3Npb24gYW5kIGdyYXRpdHVkZSBkYXRhIGJhc2VkIG9uIHRoZSBzdXJ2ZXkgaW5zdHJ1bWVudHMuIFNpbmNlIHRoZXJlIGFyZSBvbmx5IGEgZmV3IG1pc3NpbmcgdmFsdWVzLCB3ZSByZXBsYWNlIHRoZSBtaXNzaW5nIHZhbHVlcyBpbiBlYWNoIHN1cnZleSBxdWVzdGlvbiB3aXRoIHRoZSBtb2RlIG9mIHRoZSBhc3NvY2lhdGVkIHN1cnZleSBpdGVtLiBXZSBjcmVhdGUgaW5kZXhlcyBvZiB0aGUgdHdvIGluc3RydW1lbnRzIHNlcGFyYXRlbHkgdG8gYWdncmVnYXRlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgdHdvIHN1cnZleSBkYXRhIHNldHMuIA0KDQpTaW5jZSBSIGRvZXMgbm90IGhhdmUgYSBmdW5jdGlvbiB0byBmaW5kIHRoZSBtb2RlbCBvZiBhIGdpdmVuIGRhdGEgc2V0LCBJIHdyaXRlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gZmluZCB0aGUgbW9kZWwgb2YgYSBkYXRhIHNldC4NCg0KV2Ugd2lsbCBwZXJmb3JtIGJvdGggcHJpbmNpcGFsIGNvbXBvbmVudCBhbmFseXNpcyAoUENBKSBhbmQgZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIChFRkEpLg0KDQoNCg0KYGBge3J9DQpteS5tb2RlID0gZnVuY3Rpb24oZGF0YXNldCl7DQogIGZyZXEudGJsID0gdGFibGUoZGF0YXNldCkNCiAgbWF4LmZyZXEuaWQ9d2hpY2goZnJlcS50Ymw9PW1heChmcmVxLnRibCkpDQogIG1vZGU9bmFtZXMoZnJlcS50YmxbbWF4LmZyZXEuaWRdKQ0KICBhcy5udW1lcmljKG1vZGUpDQp9DQpgYGANCg0KIyMgSGFuZGxpbmcgTWlzc2luZyBWYWx1ZXMgU2VsZi1Db21wYXNzaW9uIEluc3RydW1lbnQNCg0KVGhpcyBpbnN0cnVtZW50IGNvbnRhaW5zIG9ubHkgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSAxMiBpdGVtcyBpbiB0aGUgc3VydmV5IGluc3RydW1lbnQuIEluIHRoZSBvcmlnaW5hbCBkYXRhIGZpbGUsIHRoZSAxMiB2YXJpYWJsZXMgYXJlIG5hbWVkIFEyXzEsIFEyXzIsIC4uLiwgUTJfMTIuIFdlIGltcHV0ZSB0aGUgbWlzc2luZyB2YWx1ZSBieSByZXBsYWNpbmcgdGhlIG1pc3NpbmcgdmFsdWUgaW4gZWFjaCBvZiB0aGUgMTIgaXRlbXMgd2l0aCB0aGUgbW9kZSBvZiB0aGUgY29ycmVzcG9uZGluZyBzdXJ2ZXkgaXRlbXMuIFNpbmNlIHRoZXJlIGFyZSBvbmx5IGEgZmV3IG1pc3NpbmcgdmFsdWVzIGluIHRoaXMgaW5zdHJ1bWVudCwgdGhpcyBpbXB1dGF0aW9uIHdpbGwgbm90IGltcGFjdCB0aGUgc3Vic2VxdWVudCBQQ0EgYW5kIEVGQS4gIA0KDQpgYGB7cn0NCmNvbXBhc3Npb24gPSBzdXJ2ZXlbLCAxOjEyXQ0KIyBJbXB1dGluZyB3aXRoIHRoZSBtb2RlIGluIGVhY2ggc3VydmV5IGl0ZW0NCmZvciAoaSBpbiAxOjEyKSB7DQogIGNvbXBhc3Npb25bLGldW2lzLm5hKGNvbXBhc3Npb25bLGldKV09bXkubW9kZShjb21wYXNzaW9uWyxpXSkNCn0NCmBgYA0KDQojIyBIYW5kbGluZyBNaXNzaW5nIFZhbHVlcyBpbiBHcmF0aXR1ZGUgU2NhbGUNCg0KVGhlIGdyYXRpdHVkZSBxdWVzdGlvbm5haXJlIGNvbnRhaW5zIG9ubHkgdGhlIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggZ3JhdGl0dWRlIHF1ZXN0aW9ucy4gVGhlIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBvcmlnaW5hbCBkYXRhIGZpbGUgYXJlIFEzXzEsIFEzXzIsIC4uLiwgUTNfNi4gV2UgdXNlIHRoZSBzYW1lIG1vZGUgaW1wdXRhdGlvbiBtZXRob2QgdG8gZmlsbCBpbiB0aGUgbWlzc2luZyB2YWx1ZXMgYXMgdXNlZCBpbiB0aGUgYWJvdmUgc2VsZi1jb21wYXNzaW9uIHN1cnZleSBkYXRhLiBUaGUgZ3JhdGl0dWRlIHF1ZXN0aW9ubmFpcmUgaGFzIGV2ZW4gZmV3ZXIgbWlzc2luZyB2YWx1ZXMuIEFueSBpbXB1dGF0aW9uIHdpbGwgbm90IGltcGFjdCBhbnkgc3Vic2VxdWVudCBhbmFseXNpcy4NCg0KYGBge3J9DQpncmF0aXR1ZGUgPSBzdXJ2ZXlbLCAxMzoxOF0NCiMgSW1wdXRpbmcgd2l0aCB0aGUgbW9kZSBpbiBlYWNoIHN1cnZleSBpdGVtDQpmb3IgKGkgaW4gMTo2KSB7DQogIGdyYXRpdHVkZVssaV1baXMubmEoZ3JhdGl0dWRlWyxpXSldPW15Lm1vZGUoZ3JhdGl0dWRlWyxpXSkNCn0NCmBgYA0KDQpTaW5jZSBMaWtlcnQgc2NhbGVzIG9mIHRoZSBRM18zIGFuZCBRM182IHdlcmUgaW4gKipyZXZlcnNlIG9yZGVyKiogaW4gdGhlIGRlc2lnbi4gV2UgdHJhbnNmb3JtIGJhY2sgdGhlIHVzdWFsIG9yZGVyIGFuZCBjcmVhdGUgYSBuZXcgZGF0YXNldCB1c2luZyB0aGUgc2FtZSB2YXJpYWJsZSBuYW1lcy4NCg0KYGBge3J9DQpncmF0aXR1ZGUubmV3ID0gZ3JhdGl0dWRlDQpncmF0aXR1ZGUubmV3JFEzXzMgPSA4LWdyYXRpdHVkZSRRM18zDQpncmF0aXR1ZGUubmV3JFEzXzYgPSA4LWdyYXRpdHVkZSRRM182DQpgYGANCg0KIyMgSGFuZGxpbmcgRGVtb2dyYXBoaWMgVmFyaWFibGVzDQoNCg0KVGhlIGRlbW9ncmFwaGljIHZhcmlhYmxlcyBoYXZlIHR3byBpc3N1ZXM6IG1pc3NpbmcgdmFsdWVzIGFuZCBpbWJhbGFuY2UgY2F0ZWdvcmllcy4gU2luY2UgdGhlIHNpemUgb2YgdGhlIGRhdGEgc2V0IGlzIHNsaWdodGx5IGNsb3NlIHRvIDEyMCwgaW1wdXRpbmcgbWlzc2luZyB2YWx1ZXMgaW4gYSBtZWFuaW5nZnVsIHdheSBpcyBjcnVjaWFsIHRvIG1haW50YWluaW5nIHRoZSBzYW1wbGUgc2l6ZSBhbmQgdGhlIHN0YXRpc3RpY2FsIHBvd2VyIG9mIGFsbCBzdWJzZXF1ZW50IGFzc29jaWF0aW9uIGFuYWx5c2VzLiBBYm91dCAxNSByZWNvcmRzIGluIHRoZSBkYXRhIHNldHMgZG8gbm90IGhhdmUgZGVtb2dyYXBoaWMgaW5mb3JtYXRpb24uIFRoZXJlZm9yZSB0aGVzZSByZWNvcmRzIHdlcmUgZGVsZXRlZCBmcm9tIHRoZSBmaW5hbCBkYXRhLiANCg0KQSBmZXcgbWlzc2luZyB2YWx1ZXMgb2NjdXJyZWQgaW4gdGhlIHllYXJzIG9mIGVkdWNhdGlvbiBhbmQgZW1wbG95bWVudCB0aGF0IGFyZSBpbXB1dGVkIHVzaW5nIHRoZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24gaW4gdGhlIHZhcmlhYmxlcyBvZiBhZ2UsIHRoZSB5ZWFycyBvZiBlZHVjYXRpb24sIGFuZCB0aGUgbGVuZ3RoIG9mIGVtcGxveW1lbnQuIA0KDQpUaGUgbWFqb3IgaXNzdWUgb2YgdGhlc2UgY2F0ZWdvcmljYWwgdmFyaWFibGVzIGlzIHRoZSBpbWJhbGFuY2UgY2F0ZWdvcnkuIFRoZSBmb2xsb3dpbmcgbW9kaWZpY2F0aW9ucyB0byB0aGUgb3JpZ2luYWwgZGVtb2dyYXBoaWMgdmFyaWFibGVzIGFyZSB1dGlsaXplZC4NCg0KDQpgYGB7cn0NCmRlbW9ncmFwaGljID0gc3VydmV5WywgLSgxOjE4KV0NCmRlbW9ncmFwaGljMDA9ZGVtb2dyYXBoaWMNCiMgcmVwbGFjZSBtaXNzaW5nIHZhbHVlcyB3aXRoIDk5Lg0KZGVtb2dyYXBoaWMwMFtpcy5uYShkZW1vZ3JhcGhpYzAwKV0gPC0gOTkgIA0KIyBDcmVhdGUgYSBmcmVxdWVuY3kgdGFibGUgZm9yIGNvbGxhcHNpbmcgY2F0ZWdvcmllcw0KI2xpc3QoUTguMT10YWJsZShkZW1vZ3JhcGhpYzAwJFE4XzEpLA0KIyAgICAgUTguMj10YWJsZShkZW1vZ3JhcGhpYzAwJFE4XzIpLA0KIyAgICAgUTguMz10YWJsZShkZW1vZ3JhcGhpYzAwJFE4XzMpLA0KIyAgICAgUTguNT10YWJsZShkZW1vZ3JhcGhpYzAwJFE4XzUpLA0KIyAgICAgUTguNj10YWJsZShkZW1vZ3JhcGhpYzAwJFE4XzYpLA0KIyAgICAgUS45PXRhYmxlKGRlbW9ncmFwaGljMDAkUTkpLA0KIyAgICAgUS4xMT10YWJsZShkZW1vZ3JhcGhpYzAwJFExMSksDQojICAgICBRLjEzPXRhYmxlKGRlbW9ncmFwaGljMDAkUTEzKSwNCiMgICAgIFEuMTQ9dGFibGUoZGVtb2dyYXBoaWMwMCRRMTQpLA0KIyAgICAgUS4xNT10YWJsZShkZW1vZ3JhcGhpYzAwJFExNSksDQojICAgICBRLjE2PXRhYmxlKGRlbW9ncmFwaGljMDAkUTE2KSwNCiMgICAgIFEuMTc9dGFibGUoZGVtb2dyYXBoaWMwMCRRMTcpLA0KIyAgICAgUS4xOD10YWJsZShkZW1vZ3JhcGhpYzAwJFExOCksDQojICAgICBRLjE5PXRhYmxlKGRlbW9ncmFwaGljMDAkUTE5KSwNCiMgICAgIFEuMjA9dGFibGUoZGVtb2dyYXBoaWMwMCRRMjApDQojICAgICApDQpgYGANCg0KDQpgYGB7IH0NCmdycC5hZ2UgPSBROF8xOiAgMSA9ICgzLDIzXSwgMiA9IFsyNCwgMzBdLCAgMyA9IFszMSwgNTldDQpncnAuZWR1ID0gUThfMjogICAgMSA9IFswLDE1XSBhc3NvY2lhdGUsIDIgPSBbMTUuNSwxOC41XSBiYWNoZWxvciwgMyA9IFsxOSwgMjVdICBhZHZkZWdyZWUNCmdycC5lbXBsID0gUThfMzogICAxID0gWzAsNV0gIGVudHJ5LCAyID0gWzUuNSwxMF0ganVuaW9yLCAzID0gWzEwLjUsIDM1XSAgIHNlbmlvcg0Ka2lkLm51bSA9IFE4XzU6IDEgPSAoMCkgTm8gY2hpbGQsIDIgPSBhdCBsZWFzdCBvbmUgY2hpbGQNCmhvbWUuc2l6ZSA9IFE4XzY6ICAxID0gKDEpLCAyID0gKDIpLCAzID0gMyBvciBtb3JlDQoNCmdlbmRlciA9IFE5OiAgMSA9ICgyKSBmZW1hbGUsIDIgPSAoMSwzLDUsNykgbWFsZSANCnJhY2UgPSBRMTE6ICAgMSA9ICgxKSAgIHdoaXRlLCAgIDIgPSAoMiwzKSBvdGhlcg0KbWFyaXRhbC5zdCA9IFExMzogMSA9ICgxKSBzaW5nbGUsIDIgPSAoMikgbWFycmllZC9jaXZpbCBQYXJ0bmVyLCAzID0gb3RoZXINCmRpc2FiaWxpdHkgPSBRMTQ6ICAxID0geWVzLCAgMiA9IE5vDQpyZWxpZ2lvbiA9IFExNTogIDEgPSA5IChubyByZWxpZ2lvbiksIDIgPSAoMSwyLDMsNiw3LDgsMTAsMTEsOTkpIChyZWxpZ2lvbikNClNleHVhbC5vcmllbnQgPSBRMTY6ICAxID0gKDQpICBoZXRlcm9zZXh1YWwsICAyID0gKDEsMiwzLDUsNiw3LDEwKSBvdGhlcg0KcG9saS5hZmZpbCA9IFExNzogMSA9ICg0KWluZCwgMiA9ICg1LDYsNykgIGRlbW9jcmF0cywgMyA9ICgxLDIsMywgOTkpIG90aGVyDQpTVy5Qcm9ncmFtID0gUTE4OiAxID0gKDEpIEJTVywgMiA9ICgyLDk5KSBNU1cNClVyYmFuaXR5ID0gUTE5OiAgMSA9ICgxKSB1cmJhbiwgMiA9ICgyKSBydXJhbCwgMyA9ICgzKSBzdWJ1cmJhbg0KU3Bpcml0dWFsaXR5ID0gUTIwOiAxID0gKDEsMiwzKSBsb3csIDIgPSAoNCkgICBtb2RlcmF0ZSwgIDMgPSAoNSw2LDcpIGhpZ2gNCmBgYA0KDQpXZSByZS1kZWZpbmUgdGhlIGRlbW9ncmFwaGljIHZhcmlhYmxlcyBiYXNlZCBvbiB0aGUgYWJvdmUgbW9kaWZpY2F0aW9uLiBUaGUgbW9kaWZpZWQgZGVtb2dyYXBoaWMgdmFyaWFibGVzIHdpbGwgYmUgdXNlZCBpbiBzdWJzZXF1ZW50IG1vZGVsaW5nLg0KDQpgYGB7cn0NClE4LjE9ZGVtb2dyYXBoaWMwMCRROF8xDQpncnAuYWdlPWN1dChROC4xLCBicmVha3M9YygxLCAyMywgMzAsIDEwMCksIGxhYmVscz1jKCJbMSwyM10iLCAiWzI0LDMwXSIsICJbMzAsOTldIikpDQojDQpROC4yPWRlbW9ncmFwaGljMDAkUThfMg0KZ3JwLmVkdT1jdXQoUTguMiwgYnJlYWtzPWMoMCwgMTUuNSwgMTksIDEwMCksIGxhYmVscz1jKCJBc3NvYyIsICJCYWNoZWxvciIsICJBZHYuZGVnIikpDQojDQpROC4zPWRlbW9ncmFwaGljMDAkUThfMw0KZ3JwLmVtcGw9Y3V0KFE4LjMsIGJyZWFrcz1jKC0xLDUsIDksIDEwMCksIGxhYmVscz1jKCJlbnRyeSIsICJqdW5pb3IiLCAic2VuaW9yIikpDQojDQpROC41PWRlbW9ncmFwaGljMDAkUThfNQ0Ka2lkLm51bT1jdXQoUTguNSwgYnJlYWtzPWMoLTEsMSwxMDApLCBsYWJlbHM9YygiTm8ta2lkIiwgIldpdGgta2lkIikpDQojDQpROC42PWRlbW9ncmFwaGljMDAkUThfNg0KaG9tZS5zaXplPWN1dChROC42LCBicmVha3M9YygtMSwyLDEwMCksIGxhYmVscz1jKCIxLTIiLCAiMysiKSkNCiMNClEuOT1kZW1vZ3JhcGhpYzAwJFE5DQpnZW5kZXI9cmVwKCJtYWxlIiwgbGVuZ3RoKFEuOSkpDQpnZW5kZXJbd2hpY2goUS45PT0yKV09ImZlbWFsZSINCiMNClEuMTE9ZGVtb2dyYXBoaWMwMCRRMTENCnJhY2U9cmVwKCJvdGhlciIsIGxlbmd0aChRLjExKSkNCnJhY2Vbd2hpY2goUS4xMT09MSldPSJ3aGl0ZSINCiMNClEuMTM9ZGVtb2dyYXBoaWMwMCRRMTMNCm1hcml0YWwuc3QgPSByZXAoIm90aGVyIiwgbGVuZ3RoKFEuMTMpKQ0KbWFyaXRhbC5zdFt3aGljaChRLjEzPT0xKV09InNpbmdsZSINCm1hcml0YWwuc3Rbd2hpY2goUS4xMz09MildPSJtYXJyaWVkIg0KIw0KUS4xND1kZW1vZ3JhcGhpYzAwJFExNA0KZGlzYWJpbGl0eT1yZXAoInllcyIsIGxlbmd0aChRLjE0KSkNCmRpc2FiaWxpdHlbd2hpY2goUS4xND09MildPSJubyINCiMNClEuMTU9ZGVtb2dyYXBoaWMwMCRRMTUNCnJlbGlnaW9uPXJlcCgicmVsaWdpb24iLCBsZW5ndGgoUS4xNSkpDQpyZWxpZ2lvblt3aGljaChRLjE1PT0xKV09Im5vLXJlbGlnaW9uIg0KIw0KUS4xNj1kZW1vZ3JhcGhpYzAwJFExNg0Kc2V4dWFsLm9yaWVudD1yZXAoIm90aGVyIiwgbGVuZ3RoKFEuMTYpKQ0Kc2V4dWFsLm9yaWVudFt3aGljaChRLjE2PT00KV09ImhldGVyb3NleHVhbCINCiMNClEuMTc9ZGVtb2dyYXBoaWMwMCRRMTcNCnBvbGkuYWZmaWwgPSByZXAoIlJlcHVibGljYW4iLCBsZW5ndGgoUS4xNykpDQpwb2xpLmFmZmlsW1EuMTcgJWluJSBjKDUsNildPSJNb2REZW1vY3JhdHMiDQpwb2xpLmFmZmlsW1EuMTcgJWluJSBjKDcpXT0iU3Ryb25nRGVtb2NyYXRzIg0KcG9saS5hZmZpbFt3aGljaChRLjE3ID09NCldPSJpbmRlcGVuZGVudCINCiMNClEuMTg9ZGVtb2dyYXBoaWMwMCRRMTgNClNXLnByb2dyYW09cmVwKCJNU1ciLCBsZW5ndGgoUS4xOCkpDQpTVy5wcm9ncmFtW3doaWNoKFEuMTg9PTEpXT0iQlNXIg0KIw0KUS4xOT1kZW1vZ3JhcGhpYzAwJFExOQ0KdXJiYW5pdHk9cmVwKCJ1cmJhbiIsIGxlbmd0aChRLjE5KSkNCnVyYmFuaXR5W3doaWNoKFEuMTk9PTIpXT0icnVyYWwiDQp1cmJhbml0eVt3aGljaChRLjE5PT0zKV09InN1YnVyYmFuIg0KIw0KUS4yMD1kZW1vZ3JhcGhpYzAwJFEyMA0Kc3Bpcml0dWFsaXR5PXJlcCgiaGlnaCIsIGxlbmd0aChRLjIwKSkNCnNwaXJpdHVhbGl0eVt3aGljaChRLjIwPT0yKV09Im1vZGVyYXRlIg0Kc3Bpcml0dWFsaXR5W1EuMjAgJWluJSBjKDEsMiwzKV09ImxvdyINCiMNCm5ldy5kZW1vZ3JhcGhpY3M9ZGF0YS5mcmFtZShncnAuYWdlLCBncnAuZWR1LCBncnAuZW1wbCwga2lkLm51bSwgaG9tZS5zaXplLCBnZW5kZXIsIHJhY2UsDQogICAgICAgICAgIG1hcml0YWwuc3QsIGRpc2FiaWxpdHksIHJlbGlnaW9uLCBzZXh1YWwub3JpZW50LCBwb2xpLmFmZmlsLA0KICAgICAgICAgICBTVy5wcm9ncmFtLCB1cmJhbml0eSwgc3Bpcml0dWFsaXR5KQ0KI25ldy5kZW1vZ3JhcGhpY3MNCmBgYA0KDQoNCiMgVmFsaWRpdHkgYW5kIFJlbGlhYmlsaXR5IEFuYWx5c2VzDQoNClRoaXMgc2VjdGlvbiByZXBvcnRzIG1lYXN1cmVzIG9mIHZhbGlkaXR5IGFuZCByZWxpYWJpbGl0eSBvZiB0aGUgdHdvIHN1cnZleSBpbnN0cnVtZW50czogc2VsZi1jb21wYXNzaW9uIGFuZCBncmF0aXR1ZGUuDQoNCg0KIyMgU2VsZi1jb21wYXNzaW9uIEluc3RydW1lbnQNCg0KVGhlIFNlbGYtQ29tcGFzc2lvbiBTY2FsZSAoU0NTKSwgZGV2ZWxvcGVkIGJ5IEtyaXN0aW4gTmVmZiBpbiAyMDAzLCBpcyBhIHdpZGVseSB1c2VkIGluc3RydW1lbnQgdGhhdCBtZWFzdXJlcyBzZWxmLWNvbXBhc3Npb24gdGhyb3VnaCBzaXgga2V5IHN1YnNjYWxlcywgd2hpY2ggY2FuIGJlIGdyb3VwZWQgaW50byB0d28gb3ZlcmFyY2hpbmcgKG5vdCBvcHBvc2l0ZSkgZGltZW5zaW9uczoNCg0KKiAqKlNlbGYtQ29tcGFzc2lvbioqIChwb3NpdGl2ZSwgYWRhcHRpdmUgcmVzcG9uc2VzKTogVHJlYXRpbmcgb25lc2VsZiB3aXRoIHdhcm10aCwgcmVjb2duaXppbmcgc2hhcmVkIGh1bWFuIHN0cnVnZ2xlcywgYW5kIG1haW50YWluaW5nIGVtb3Rpb25hbCBiYWxhbmNlLgkNCiAgKyBTZWxmLUtpbmRuZXNzICgqKlNLKiopDQogICAgLSBJdGVtIDM6ICp3aGVuIHNvbWV0aGluZyBwYWluZnVsIGhhcHBlbnMsIEkgdHJ5IHRvIHRha2UgYSBiYWxhbmNlZCB2aWV3IG9mIHRoZSBzaXR1YXRpb24uKg0KICAgIC0gSXRlbSA3OiAqd2hlbiBzb21ldGhpbmcgdXBzZXRzIG1lLCBJIHRyeSB0byBrZWVwIG15IGVtb3Rpb25zIGluIGJhbGFuY2UuKg0KICArIENvbW1vbiBIdW1hbml0eSAoKipDSCoqKQ0KICAgIC0gSXRlbSA1OiAqSSB0cnkgdG8gc2VlIG15IGZhaWxpbmdzIGFzIHBhcnQgb2YgdGhlIGh1bWFuIGNvbmRpdGlvbi4qDQogICAgLSBJdGVtIDEwOiAqV2hlbiBJIGZlZWwgaW5hZGVxdWF0ZSBpbiBzb21lIHdheSwgSSB0cnkgdG8gcmVtaW5kIG15c2VsZiB0aGF0IGZlZWxpbmdzIG9mIGluYWRlcXVhY3kgYXJlIHNoYXJlZCBieSBtb3N0IHBlb3BsZS4qDQogICsgTWluZGZ1bG5lc3MgKCoqTUQqKikNCiAgICAtIEl0ZW0gMjogKkkgdHJ5IHRvIGJlIHVuZGVyc3RhbmRpbmcgYW5kIHBhdGllbnQgdG93YXJkcyB0aG9zZSBhc3BlY3RzIG9mIG15IHBlcnNvbmFsaXR5IEkgZG9uJ3QgbGlrZS4qDQogICAgLSBJdGVtIDY6ICpXaGVuIEkgYW0gZ29pbmcgdGhyb3VnaCBhIHZlcnkgaGFyZCB0aW1lLiBJIGdpdmUgbXlzZWxmIHRoZSBjYXJpbmcgYW5kIHRlbmRlcm5lc3MgSSBuZWVkLioNCg0KDQoNCiogKipTZWxmLUNvbGRuZXNzKiogKG5lZ2F0aXZlLCBoYXJzaCByZXNwb25zZXMpOiBCZWluZyBzZWxmLWNyaXRpY2FsLCBmZWVsaW5nIGFsb25lIGluIHN1ZmZlcmluZywgYW5kIG9ic2Vzc2luZyBvdmVyIG5lZ2F0aXZlIGVtb3Rpb25zLg0KICArIFNlbGYtSnVkZ21lbnQgKCoqU0oqKikNCiAgICAtIEl0ZW0gMTE6ICpJIGFtIGRpc2FwcHJvdmluZyBhbmQganVkZ21lbnRhbCBhYm91dCBteSBvd24gZmxhd3MgYW5kIGluYWRlcXVhY2llcy4qDQogICAgLSBJdGVtIDEyOiAqSSBhbSBpbnRvbGVyYW50IGFuZCBpbXBhdGllbnQgdG93YXJkcyB0aG9zZSBhc3BlY3RzIG9mIG15IHBlcnNvbmFsaXR5IEkgZG9uJ3QgbGlrZS4qDQogICsgSXNvbGF0aW9uICgqKklTKiopDQogICAgLSBJdGVtIDQ6ICpXaGVuIEkgYW0gZmVlbGluZyBkb3duLCBJIHRlbmQgdG8gZmVlbCBsaWtlIG1vc3Qgb3RoZXIgcGVvcGxlIGFyZSBwcm9iYWJseSBoYXBwaWVyIHRoYW4gSSBhbS4qDQogICAgLSBJdGVtIDg6ICpXaGVuIEkgZmFpbCBhdCBzb21ldGhpbmcgdGhhdCBpcyBpbXBvcnRhbnQgdG8gbWUsIEkgdGVuZCB0byBmZWVsIGFsb25lIGluIG15IGZhaWx1cmUuKg0KICArIE92ZXItSWRlbnRpZmljYXRpb24gKCoqT0kqKikNCiAgICAtIEl0ZW0gMTogKldoZW4gSSBmYWlsIGF0IHNvbWV0aGluZyBpbXBvcnRhbnQgdG8gbWUsIEkgYmVjb21lIGNvbnN1bWVkIGJ5IGZlZWxpbmdzIG9mIGluYWRlcXVhY3kuKg0KICAgIC0gSXRlbSA5OiAqV2hlbiBJIGFtIGZlZWxpbmcgZG93biwgSSB0ZW5kIHRvIG9ic2VzcyBhbmQgZml4YXRlIG9uIGV2ZXJ5dGhpbmcgdGhhdCBpcyB3cm9uZy4qDQoNCg0KV2Ugc3RhcnQgd2l0aCBzb21lIGNvcnJlbGF0aW9uIHBsb3RzIHRvIHNlZSB0aGUgcmVsZXZhbmNlIG9mIHRoZSBQQ0EgcHJvY2VkdXJlIG9uIHRoZSBzZWxmLWNvbXBhc3Npb24gZGF0YS4gDQoNCg0KYGBge3IgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodCA9IDYsIGZpZy5jYXA9IlRoZSBwYWlyd2lzZSBjb3JyZWxhdGlvbiBwbG90IHJldmVhbHMgdGhlIHBvdGVudGlhbCByZWxldmFuY2Ugb2YgUENBLiBUaGUgc2hhcGUgb2YgYW4gZWxsaXBzZSByZXByZXNlbnRzIHRoZSBjb3JyZWxhdGlvbi4gVGhlIHNraW5uaWVyIHRoZSBlbGxpcHNlLCB0aGUgaGlnaGVyIHRoZSBjb3JyZWxhdGlvbi4gVGhlIGRpcmVjdGlvbiByZWZsZWN0cyB3aGV0aGVyIGEgY29ycmVsYXRpb24gaXMgcG9zaXRpdmUgb3IgbmVnYXRpdmUuIFRoZSBvZmYtZGlhZ29uYWwgZGlyZWN0aW9uIGltcGxpZXMgcyBwb3NpdGl2ZSBjb3JyZWxhdGlvbiB3aGlsZSB0aGUgbWFpbiBkaWFnb25hbCBkaXJlY3Rpb24gaW1wbGllcyBhIG5lZ2F0aXZlIGFzc29jaWF0aW9uLiJ9DQojIw0KTT1jb3IoY29tcGFzc2lvbikNCmNvcnJwbG90Lm1peGVkKE0sIGxvd2VyLmNvbCA9ICJwdXJwbGUiLCB1cHBlciA9ICJlbGxpcHNlIiwgbnVtYmVyLmNleCA9IC43LCB0bC5jZXggPSAwLjcpDQpgYGANCg0KRmlndXJlIDEgc2hvd3MgdGhlIG1vZGVyYXRlIGFzc29jaWF0aW9uIGJldHdlZW4gaW5kaXZpZHVhbCBzdXJ2ZXkgaXRlbXMuIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBQQ0EgaXMgcmVsZXZhbnQgaW4gYWdncmVnYXRpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBzdXJ2ZXkgaXRlbXMuIA0KDQoNClNpbWlsYXIgdG8gTMOzcGV6IGV0LiBhbC4gKDIwMTgpLCB3ZSB1c2UgdGhlIHNpeCBwb3NpdGl2ZSBpdGVtcyBhc3NvY2lhdGVkIHdpdGggbWluZGZ1bG5lc3MsIHNlbGYta2luZG5lc3MsIGFuZCB0aGUgc2Vuc2Ugb2YgY29tbW9uIGh1bWFuaXR5IHRvIGRlZmluZSB0aGUgc2VsZi1jb21wYXNzaW9uIGluZGV4LiANCg0KDQpGcm9tIHRoZSBwYWlyLXdpc2UgY29ycmVsYXRpb24gcGxvdCwgd2UgY2FuIHNlZSB0aGF0IHNvbWUgb2YgdGhlIGl0ZW1zIGFyZSByZXZlcnNlbHkgc2NvcmVkLiBXZSBuZXh0IGNoYW5nZSBiYWNrIHRoZSBzY2FsZSBzbyB0aGF0IGFsbCBpdGVtcyBhcmUgcG9zaXRpdmVseSBjb3JyZWxhdGVkLg0KDQpgYGB7cn0NCiMjIw0Kc2VsZmNvbXAgPSBjYmluZChjb21wYXNzaW9uJFEyXzMsIGNvbXBhc3Npb24kUTJfNywgY29tcGFzc2lvbiRRMl8xMCwNCiAgICAgICAgICAgICAgICAgY29tcGFzc2lvbiRRMl81LGNvbXBhc3Npb24kUTJfMixjb21wYXNzaW9uJFEyXzYpDQojIyMNCnNlbGZjb2xkID0gIGNiaW5kKGNvbXBhc3Npb24kUTJfMSwgY29tcGFzc2lvbiRRMl85LCBjb21wYXNzaW9uJFEyXzQsDQogICAgICAgICAgICAgICAgIGNvbXBhc3Npb24kUTJfOCxjb21wYXNzaW9uJFEyXzExLGNvbXBhc3Npb24kUTJfMTIpDQoNCiMjIyAgTUQgPSBNaW5kZnVsbmVzcywgU0sgPSBTZWxmLWtpbmRuZXNzLCBDSCA9IHNlbnNlIG9mIGNvbW1vbiBodW1hbml0eQ0Kc2VsZmNvbXAuc3ViID0gY2JpbmQoTUQxPWNvbXBhc3Npb24kUTJfMywgTUQyPWNvbXBhc3Npb24kUTJfNywgDQogICAgICAgICAgICAgICAgICAgICBDSDE9Y29tcGFzc2lvbiRRMl8xMCxDSDI9Y29tcGFzc2lvbiRRMl81LA0KICAgICAgICAgICAgICAgICAgICAgU0sxPWNvbXBhc3Npb24kUTJfMixTSzI9Y29tcGFzc2lvbiRRMl82KQ0KDQojIyMgU0ogPSBzZWxmLWp1ZGVtZW50IE9JID0gT3Zlci1pZGVudGlmaWNhdGlvbiwgSVMgPSBJc29sYXRpb24NCnNlbGZjb2xkLnN1YiA9ICBjYmluZChPSTE9Y29tcGFzc2lvbiRRMl8xLCBPSTI9Y29tcGFzc2lvbiRRMl85LCANCiAgICAgICAgICAgICAgICAgICAgIElTMT1jb21wYXNzaW9uJFEyXzQsIElTMj1jb21wYXNzaW9uJFEyXzgsDQogICAgICAgICAgICAgICAgICAgICBTSjE9Y29tcGFzc2lvbiRRMl8xMSxTSjI9Y29tcGFzc2lvbiRRMl8xMikNCiMjIyBTaW1wbGUgc3VtIGFuZCBhdmVyYWdlDQpzZWxmY29tcC5zdW0gPSBjb21wYXNzaW9uJFEyXzMgKyBjb21wYXNzaW9uJFEyXzcgKyBjb21wYXNzaW9uJFEyXzEwICsNCiAgICAgICAgICAgICAgICAgY29tcGFzc2lvbiRRMl81ICsgY29tcGFzc2lvbiRRMl8yICsgY29tcGFzc2lvbiRRMl82DQpzZWxmY29tcC5hdmcgPSBzZWxmY29tcC5zdW0vNg0KYGBgDQoNCg0KYGBge3IgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodCA9IDYsIGZpZy5jYXA9IlRoZSBwYWlyd2lzZSBjb3JyZWxhdGlvbiBwbG90IHJldmVhbHMgdGhlIHBvdGVudGlhbCByZWxldmFuY2Ugb2YgUENBLiBHcm91cCBpdGVtcyBiYXNlZCBvbiBzZWxmLWNvbXBhc3Npb24gYW5kIHNlbGYtY29sZG5lc3MifQ0KIyMNCk09Y29yKGNiaW5kKHNlbGZjb21wLnN1Yiwgc2VsZmNvbGQuc3ViKSkNCmNvcnJwbG90Lm1peGVkKE0sIGxvd2VyLmNvbCA9ICJwdXJwbGUiLCB1cHBlciA9ICJlbGxpcHNlIiwgbnVtYmVyLmNleCA9IC43LCB0bC5jZXggPSAwLjcpDQpgYGANCg0KTmV4dCwgd2UgbWFrZSB0aGUgZm9sbG93aW5nIGhlYXRtYXAgdG8gaWxsdXN0cmF0ZSB0aGUgcGFpcndpc2UgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgaXRlbXMgaW4gdGhlIHN1cnZleSBpbnN0cnVtZW50IGJhc2VkIG9uIHRoZSBwb3NpdGl2ZSBhZGp1c3RtZW50IG9mIHRoZSBzY2FsZS4gDQoNCg0KYGBge3IgZmlnLmNhcD0iUGFpcndpc2UgY29ycmVsYXRpb24gYmFzZWQgb24gbmVnYXRpdmVseSBhZGp1c3RlZCBzdWJzY2FsZXMuIFRoZSBzaGFwZSBvZiBhbiBlbGxpcHNlIHJlcHJlc2VudHMgdGhlIGNvcnJlbGF0aW9uLiBUaGUgc2tpbm5pZXIgdGhlIGVsbGlwc2UsIHRoZSBoaWdoZXIgdGhlIGNvcnJlbGF0aW9uLiBUaGUgZGlyZWN0aW9uIHJlZmxlY3RzIHdoZXRoZXIgYSBjb3JyZWxhdGlvbiBpcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZS4gVGhlIG9mZi1kaWFnb25hbCBkaXJlY3Rpb24gaW1wbGllcyBzIHBvc2l0aXZlIGNvcnJlbGF0aW9uIHdoaWxlIHRoZSBtYWluIGRpYWdvbmFsIGRpcmVjdGlvbiBpbXBsaWVzIGEgbmVnYXRpdmUgYXNzb2NpYXRpb24uIn0NCiMjDQpNPWNvcihzZWxmY29tcC5zdWIpDQpjb3JycGxvdC5taXhlZChNLCBsb3dlci5jb2wgPSAicHVycGxlIiwgdXBwZXIgPSAiZWxsaXBzZSIsIG51bWJlci5jZXggPSAuNywgdGwuY2V4ID0gMC43KQ0KYGBgDQoNCg0KKipJbnRlcm4gQ29uc2lzdGVuY3kqKg0KDQpXaXRoIHRoZSBhZGp1c3RlZCBzY29yZXMgaW4gdGhlIHNlbGYtY29tcGFzc2lvbiBpbnN0cnVtZW50LCB3ZSBjYWxjdWxhdGUgb25lIG9mIHRoZSBjb21tb25seSB1c2VkIGludGVybmFsIGNvbnNpc3RlbmN5IHJlbGlhYmlsaXR5IENyb25iYWNoIGFscGhhIGFzIGZvbGxvd3MuDQoNCk5leHQsIHdlIGZpbmQgdGhlIENyb25iYWNoIGFscGhhIGFuZCBpdHMgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwuDQoNCmBgYHtyfQ0KY3JvbmJhY2guc2MgPSBhcy5udW1lcmljKGFscGhhKHNlbGZjb21wLnN1YikkdG90YWxbMV0pDQpDSS5zYyA9IGNyb25iYWNoLmFscGhhLkNJKGFscGhhPWNyb25iYWNoLnNjLCBuPTEwNCwgaXRlbXM9NiwgY29uZi5sZXZlbCA9IDAuOTUpDQpDSS5jb21wID0gY2JpbmQoTENJID0gQ0kuc2NbMV0sIGFscGhhID0gY3JvbmJhY2guc2MsIFVDSSA9Q0kuc2NbMl0pDQpyb3cubmFtZXMoQ0kuY29tcCkgPSAiIg0KcGFuZGVyKENJLmNvbXAsIGNhcHRpb249IkNvbmZvZGVuY2UgSW50ZXJ2YWwgb2YgQ3JhbmJhY2ggQWxwaGEiKQ0KYGBgDQoNCg0KDQpXZSBjYW4gc2VlIHRoYXQgQ3JvbmJhY2gncyBhbHBoYSBpcyAwLjc3IHdpdGggYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoMC43MCwgMC44NCkgc3VnZ2VzdGluZyB0aGF0IHRoZSBpdGVtcyBpbiB0aGUgc2VsZi1jb21wYXNzaW9uIGluc3RydW1lbnQgaGF2ZSByZWxhdGl2ZWx5IGhpZ2ggaW50ZXJuYWwgY29uc2lzdGVuY3kuIA0KDQoNCiMjIEdyYXRpdHVkZSBRdWVzdGlvbmFpcmUNCg0KSW4gdGhpcyBzZWN0aW9uLCB3ZSBwZXJmb3JtIHRoZSBzYW1lIGFuYWx5c2lzIG9uIHRoZSBncmF0aXR1ZGUgc3VydmV5IGluc3RydW1lbnQuIEZpcnN0IG9mIGFsbCwgd2UgcHJlc2VudCBhIHBhaXJ3aXNlIGNvcnJlbGF0aW9uIHBsb3QgdG8gZGlzcGxheSB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiBpbmRpdmlkdWFsIHN1cnZleSBpdGVtcyBpbiB0aGUgZ3JhdGl0dWRlIHN1cnZleSBpbnN0cnVtZW50Lg0KDQpgYGB7ciBmaWcuY2FwPSJUaGUgcGFpcndpc2UgY29ycmVsYXRpb24gcGxvdCByZXZlYWxzIHRoZSBwb3RlbnRpYWwgcmVsZXZhbmNlIG9mIFBDQSBmb3IgdGhlIGdyYXRpdHVkZSBpbnN0cnVtZW50LiBUaGUgc2hhcGUgb2YgYW4gZWxsaXBzZSByZXByZXNlbnRzIHRoZSBjb3JyZWxhdGlvbi4gVGhlIHNraW5uaWVyIHRoZSBlbGxpcHNlLCB0aGUgaGlnaGVyIHRoZSBjb3JyZWxhdGlvbi4gVGhlIGRpcmVjdGlvbiByZWZsZWN0cyB3aGV0aGVyIGEgY29ycmVsYXRpb24gaXMgcG9zaXRpdmUgb3IgbmVnYXRpdmUuIFRoZSBvZmYtZGlhZ29uYWwgZGlyZWN0aW9uIGltcGxpZXMgcyBwb3NpdGl2ZSBjb3JyZWxhdGlvbiB3aGlsZSB0aGUgbWFpbiBkaWFnb25hbCBkaXJlY3Rpb24gaW1wbGllcyBhIG5lZ2F0aXZlIGFzc29jaWF0aW9uLiJ9DQojIw0KTTE9Y29yKGdyYXRpdHVkZS5uZXcpDQojY29ycnBsb3QoTSwgdHlwZSA9ICJ1cHBlciIsIG1ldGhvZCA9ICJlbGxpcHNlIiwgbWFpbj0iUGFpcndpc2UgQ29ycmVsYXRpb24gUGxvdDogU2VsZi1Db21wYXNzaW9uIFNjYWxlIikNCmNvcnJwbG90Lm1peGVkKE0xLCBsb3dlci5jb2wgPSAicHVycGxlIiwgdXBwZXIgPSAiZWxsaXBzZSIsIG51bWJlci5jZXggPSAuNywgdGwuY2V4ID0gMC43KQ0KYGBgDQoNCg0KRmlndXJlIDMgc2hvd3MgdGhhdCBhIG1vZGVyYXRlIGNvcnJlbGF0aW9uIGV4aXN0cyBiZXR3ZWVuIGluZGl2aWR1YWwgdmFyaWFibGVzLiBUaGlzIGltcGxpZXMgdGhlIFBDQSBhbmQgRUZBIGNhbiBiZSB1c2VkIHRvIGFnZ3JlZ2F0ZSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHNldCBvcmlnaW5hbCBzdXJ2ZXkgaXRlbXMuIE5leHQsIHdlIGVzdGltYXRlIHRoZSBudW1iZXIgb2YgUENBcyBvciBFRkFzIHRvIGJlIHJldGFpbmVkIGZvciB0aGUgc3Vic2VxdWVudCBhbmFseXNpcyB1c2luZyB0aGUgY29tbW9ubHkgdXNlZCBwcm9jZWR1cmVzIGFuZCBzdW1tYXJpemUgdGhlIHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBGaWd1cmUgNC4NCg0KDQoqKkNyb25iYWNoJ3MgQWxwaGEqKg0KDQpUaGUgaW50ZXJuYWwgY29uc2lzdGVuY3kgbWVhc3VyZSwgQ3JvbmJhY2gncyBhbHBoYSwgb2YgdGhlIGdyYXRpdHVkZSBpbnN0cnVtZW50cyBjYWxjdWxhdGVkIGJlbG93DQoNCmBgYHtyfQ0KY3JvbmJhY2guZ3IgPSBhcy5udW1lcmljKGFscGhhKGdyYXRpdHVkZS5uZXcpJHRvdGFsWzFdKQ0KQ0kuZ3IgPSBjcm9uYmFjaC5hbHBoYS5DSShhbHBoYT1jcm9uYmFjaC5nciwgbj0xMDQsIGl0ZW1zPTYsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KQ0kuZ3JhdGl0dWRlID0gY2JpbmQoTENJID0gQ0kuZ3JbMV0sIGFscGhhID0gY3JvbmJhY2guZ3IsIFVDSSA9Q0kuZ3JbMl0pDQpyb3cubmFtZXMoQ0kuZ3JhdGl0dWRlKSA9ICIiDQprYWJsZShDSS5ncmF0aXR1ZGUsIGNhcHRpb249IkNvbmZvZGVuY2UgSW50ZXJ2YWwgb2YgQ3JhbmJhY2ggQWxwaGEiKQ0KYGBgDQoNCg0KV2UgY2FuIHNlZSB0aGF0IENyb25iYWNoJ3MgYWxwaGEgaXMgMC44IHdpdGggYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoMC43NCwgMC44NikgYWxzbyBzdWdnZXN0aW5nIHRoYXQgdGhlIGl0ZW1zIGluIHRoZSBHcmF0aXR1ZGUgcmF0aW5nIGluc3RydW1lbnQgaGF2ZSByZWxhdGl2ZWx5IGhpZ2ggaW50ZXJuYWwgY29uc2lzdGVuY3kuDQoNCg==