Introduction
We are doing this research project to look at the level of student
engagement and the overall academic experience with undergraduate
students enrolled at two business schools in the US.
We will look at the relationship between some of these variables. The
goal is to find areas that support or hurt student success and
satisfaction at these universities.
The survey given includes the following sections:
Students’ Engagement in Learning
Student Learning Styles
Writing and Reading Load
Remedial Experience
Encouragement and Support
Growth and Development
Campus Resource Utilization
Retention
How Students Pay for College
The purpose of our analysis is to find patterns in student responses
and examine how these factors correlate with a student’s sense of
academic belonging, satisfaction, and potential persistence to
graduation.
Data Management
This section will prepare the survey data for analysis by handling
missing values across multiple sections of the questionnaire.
Students’ Engagement
in Learning
Student Learning
Styles
Writing and Reading
Load
Remedial
Experience
Encouragement and
Support
Growth and
Development
Campus Resource
Utilization
Retention
How Students Pay for
College
Reliability of the
Analysis
We will now get an initial correlation matrix and make a decision on
whether to scale our values if we have a variety of negatively
correlated values or to compute our cronbachs alpha if our values are
all positively correlated.
Students’ Engagement
in Learning

From the correlation matrix we can see that we have a multitude of
negatively correlated values. Due to this we will have to scale our
values into different sub sections.
Student Learning
Styles

We see from our correlation matrix of student learning styles section
that we have high correlation between our questions.
Confidence Interval of Cronbach’s Alpha
| 0.8325 |
0.8508 |
0.8677 |
Looking at this, it shows we had a strong positive correlation matrix
so, we decided to do a cronbachs alpha calculation. We got an alpha
level of .8508 and a CI of (.8325, .8677). These values are very high
which means we have a high level of internal consistency.
Writing and Reading
Load

We see from our correlation matrix we have positive correlation.
Since these are all positive we go ahead and perform a cronbachs alpha
calculation.
Confidence Interval of Cronbach’s Alpha
| 0.3965 |
0.4703 |
0.5365 |
In the correlation matrix got a lower cronbachs alpha value of .4703
and CI of (.3965, .5365). With this value we cannot accept this
section.
Encouragement and
Support

The correlation matrix shows we have all positive values. Since our
values are positive we can go ahead and do a cronbachs alpha
calculation.
Confidence Interval of Cronbach’s Alpha
| 0.7851 |
0.8083 |
0.8298 |
We got a higher cronbachs value of .8083 and CI of (.7851, .8298). We
can go ahead and say that we have high internal consistency between our
questions.
Campus Resource
Utilization

We see from the correlation matrix above that we have differing
almost equal levels of positive and negative values so we will have to
make some subsections of our observations for this section.

With this matrix we separated it into the 3 different scales. This
did not help us at all in noticing any trends, instead we still see a
lot of negative and positive correlation values. Since we cannot get
these negative values out of the matrix we will not proceed with a
cronbachs alpha calculation and assume that we cannot use this
section.
Retention

This correlation matrix having every value positively correlated. So
we can go ahead and calculate our cronbachs alpha.
Confidence Interval of Cronbach’s Alpha
| 0.8589 |
0.8747 |
0.8891 |
We got a high cronbachs alpha of .8747 and a CI of (.8589, .8891). So
we can say that this section has high internal consistency.
How Students Pay for
College

The matrix for this has a mix of both negative and positively
correlated values so we cannot do a cronbachs alpha calculation. We now
have to go ahead and sub section our How Students Pay for College
section by personal income/savings and outside assistance.
The new matrix of just outside assistance has improved from the last
matrix. All the values are positively correlated so, we can go ahead and
perform a cronbachs alpha calculation.
Confidence Interval of Cronbach’s Alpha
| 0.5828 |
0.6309 |
0.6747 |
This has a smaller cronbach value of .6309 and CI of (.5828, .6747).
Since our value is at .63 we are questionable on whether to use this
questionnaire due to it being low.
PCA
This section presents the results of the PCA (principal component
analysis). The significant principal components identified will be used
in the analytic data set for use in regression modeling.
Students’ Engagement
in Learning PCA
We first generate a plot to visually and statistically help us decide
how many underlying dimensions are in our data for engagement. We do
this before running PCA or using PCs in regression.

Our plot above shows that the appropriate amount of components will
be around 2 so we go ahead and perform principle component analysis.
Factor loadings of the first few PCAs and the cumulative the
proportion of variation explained by the corresponding PCAs in the
Engagement Questionaire Survey.
| q41 |
-0.241 |
0.202 |
| q42 |
-0.280 |
0.050 |
| q43 |
-0.229 |
-0.039 |
| q44 |
-0.215 |
-0.184 |
| q45 |
-0.074 |
-0.082 |
| q46 |
-0.168 |
-0.284 |
| q47 |
-0.265 |
0.030 |
| q48 |
-0.204 |
0.220 |
| q49 |
-0.254 |
0.163 |
| q410 |
-0.018 |
-0.462 |
| q411 |
-0.074 |
-0.470 |
| q412 |
-0.285 |
0.047 |
| q413 |
-0.273 |
-0.078 |
| q414 |
-0.257 |
-0.130 |
| q415 |
-0.187 |
-0.347 |
| q416 |
-0.165 |
-0.278 |
| q417 |
-0.278 |
0.164 |
| q418 |
-0.286 |
0.105 |
| q419 |
-0.222 |
0.134 |
| q420 |
-0.237 |
0.144 |
| q421 |
0.008 |
-0.156 |
Cumulative and proportion of variances explained by each the
principal component in the engagement survey.
| Standard deviation |
2.487 |
1.701 |
| Proportion of Variance |
0.294 |
0.138 |
| Cumulative Proportion |
0.294 |
0.432 |
After looking at the PCA both show were little proportion with PC1
being 29.4% and PC2 being 13.8.

We see here that our graph appears to be skewed to the right. Further
analysis will be need on whether to do a box cox transformation to fix
the distributional issue in the regression residuals.
Student Learning
Styles PCA

We see from the above plot that it suggests to use one principal
component.
Factor loadings of the first few PCAs and the cumulative the
proportion of variation explained by the corresponding PCAs in the
Learning Style Questionaire Survey.
| q51 |
0.279 |
| q52 |
0.420 |
| q53 |
0.454 |
| q54 |
0.413 |
| q55 |
0.453 |
| q56 |
0.405 |
Cumulative and proportion of variances explained by each the
principal component in the Learning Style survey.
| Standard deviation |
1.877 |
| Proportion of Variance |
0.587 |
| Cumulative Proportion |
0.587 |
The PCA has a larger amount of proportion of variance at around
59%.

The plot above shows that our distribution appears to be skewed to
the right. We will need further analysis to see if we need to perform a
box cox transformation to fix the distributional issue in the regression
residuals.
Writing and Reading
Load PCA

We see from the above plot that it suggests to use one principal
component.
Factor loadings of the first few PCAs and the cumulative the
proportion of variation explained by the corresponding PCAs in the
Writing and Reading Questionaire Survey.
| q61 |
0.676 |
| q62 |
0.307 |
| q63 |
0.670 |
Cumulative and proportion of variances explained by each the
principal component in the writing and reading survey.
| Standard deviation |
1.216 |
| Proportion of Variance |
0.493 |
| Cumulative Proportion |
0.493 |
The PCA gives us around 49%.

We see from the distribution plot it is skewed to the right. We will
need further analysis to see if we need to perform a box cox
transformation.
Encouragement and
Support PCA

We see from the above table that it suggests us to use the first two
principle components.
Factor loadings of the first few PCAs and the cumulative the
proportion of variation explained by the corresponding PCAs in the
Encouragement and Support Questionaire Survey.
| q91 |
0.297 |
-0.378 |
| q92 |
0.426 |
-0.162 |
| q93 |
0.416 |
-0.178 |
| q94 |
0.435 |
0.347 |
| q95 |
0.430 |
0.331 |
| q96 |
0.376 |
0.278 |
| q97 |
0.203 |
-0.701 |
Cumulative and proportion of variances explained by each the
principal component in the Encouragement and Support survey.
| Standard deviation |
1.832 |
1.102 |
| Proportion of Variance |
0.480 |
0.173 |
| Cumulative Proportion |
0.480 |
0.653 |
Our first component explains 48% of the total variance and the second
component only explains 17% of the total variance. We will only be using
the first component in our analysis.

We see from the above table that our distribution table is
approximately normal.
Retention PCA

We see from the above table that it suggests for us to use one
component.
Factor loadings of the first few PCAs and the cumulative the
proportion of variation explained by the corresponding PCAs in the
Retention Questionaire Survey.
| q121 |
-0.458 |
| q122 |
-0.461 |
| q123 |
-0.439 |
| q124 |
-0.455 |
| q125 |
-0.422 |
Cumulative and proportion of variances explained by each the
principal component in the Retention survey.
| Standard deviation |
1.835 |
| Proportion of Variance |
0.673 |
| Cumulative Proportion |
0.673 |
The first PC explains 67% of our total variance.

We see can see that our plot is skewed to the right so we might need
to perform a box cox transformation. Also, further analysis is
needed.
How Students Pay for
College PCA

We see from the plot above that it suggests to use on PC.
Factor loadings of the first few PCAs and the cumulative the
proportion of variation explained by the corresponding PCAs in the Pay
Questionaire Survey.
| q133 |
-0.418 |
| q134 |
-0.586 |
| q135 |
-0.528 |
| q136 |
-0.451 |
Cumulative and proportion of variances explained by each the
principal component in the pay survey.
| Standard deviation |
1.391 |
| Proportion of Variance |
0.484 |
| Cumulative Proportion |
0.484 |
The PC is 48.4% of the proportion of variance.

We see from the graph above that it is skewed to the right. We will
need to perform a box cox transformation to fix the distributional
issue.
Project Questions
How well does student engagement in inside and outside the
classroom predict their overall satisfaction with their college
experience?
Does how the student pays for school correlate with the students
engagement in school?
My first question looks at the idea that students who are more
actively engaged in their learning may feel more affiliated in their
academic experience. The survey data that was provided to us shows a lot
of detail on student engagement through the 21 questions (Section 4)
given, making it a strong candidate for giving us enough variables
representing engagement.
The second question is from the assumption if the student pays for
their college than they would be more likely to be more engaged in their
learning. Looking at these two together can offer meaningful insight
into how much a student will be engaged based off if they payed for
their school or if someone else did.
LS0tCnRpdGxlOiAiU3R1ZGVudCBTdXJ2ZXkiCmF1dGhvcjogIlJ5YW4gTGVibyIKZGF0ZTogIjIwMjUtMDQtMTkiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIHRvY19mbG9hdDogeWVzCiAgICBmaWdfd2lkdGg6IDQKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMKICAgIHRoZW1lOiBsdW1lbgogIHdvcmRfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBrZWVwX21kOiB5ZXMKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgZmlnX3dpZHRoOiAzCiAgICBmaWdfaGVpZ2h0OiAzCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKc2x3YXlzX2FsbG93X2h0bWw6IHRydWUKLS0tCgpgYGB7PWh0bWx9Cgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoKLyogQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyAoQ1NTKSBpcyBhIHN0eWxlc2hlZXQgbGFuZ3VhZ2UgdXNlZCB0byBkZXNjcmliZSB0aGUgcHJlc2VudGF0aW9uIG9mIGEgZG9jdW1lbnQgd3JpdHRlbiBpbiBIVE1MIG9yIFhNTC4gaXQgaXMgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBhZGRpbmcgc3R5bGUgKGUuZy4sIGZvbnRzLCBjb2xvcnMsIHNwYWNpbmcpIHRvIFdlYiBkb2N1bWVudHMuICovCgpoMS50aXRsZSB7ICAvKiBUaXRsZSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIHJlcG9ydCB0aXRsZSAqLwogIGZvbnQtc2l6ZTogMjRweDsKICBjb2xvcjogRGFya1JlZDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOwp9Cmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgYXV0aG9ycyAgKi8KICBmb250LXNpemU6IDIwcHg7CiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsKICBjb2xvcjogRGFya1JlZDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7CiAgY29sb3I6IERhcmtCbHVlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQpoMSB7IC8qIEhlYWRlciAxIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMSBzZWN0aW9uIHRpdGxlICAqLwogICAgZm9udC1zaXplOiAyMnB4OwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogbmF2eTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQpoMiB7IC8qIEhlYWRlciAyIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMiBzZWN0aW9uIHRpdGxlICovCiAgICBmb250LXNpemU6IDIwcHg7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDMgeyAvKiBIZWFkZXIgMyAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgMyBzZWN0aW9uIHRpdGxlICAqLwogICAgZm9udC1zaXplOiAxOHB4OwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogbmF2eTsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCmg0IHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDQgc2VjdGlvbiB0aXRsZSAgKi8KICAgIGZvbnQtc2l6ZTogMThweDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IGRhcmtyZWQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9Cgpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQoKLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0KCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9Cgo8L3N0eWxlPgpgYGAKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CiMgRGV0ZWN0LCBpbnN0YWxsLCBhbmQgbG9hZCBwYWNrYWdlcyBpZiBuZWVkZWQuCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikKICAgbGlicmFyeSh0aWR5dmVyc2UpCn0KaWYgKCFyZXF1aXJlKCJHUEFyb3RhdGlvbiIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoIkdQQXJvdGF0aW9uIikKICAgbGlicmFyeShHUEFyb3RhdGlvbikKfQppZiAoIXJlcXVpcmUoIm5GYWN0b3JzIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygibkZhY3RvcnMiKQogICBsaWJyYXJ5KG5GYWN0b3JzKQp9CmlmICghcmVxdWlyZSgicGFyYW1ldGVycyIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoInBhcmFtZXRlcnMiKQogICBsaWJyYXJ5KHBhcmFtZXRlcnMpCn0KaWYgKCFyZXF1aXJlKCJjb3JycGxvdCIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoImNvcnJwbG90IikKICAgbGlicmFyeShjb3JycGxvdCkKfQppZiAoIXJlcXVpcmUoImdnY29ycnBsb3QiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2NvcnJwbG90IikKICAgbGlicmFyeShnZ2NvcnJwbG90KQp9CmlmICghcmVxdWlyZSgiZ2dmb3J0aWZ5IikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dmb3J0aWZ5IikKICAgbGlicmFyeShnZ2ZvcnRpZnkpCn0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpCiAgIGxpYnJhcnkoZ2dwbG90MikKfQppZiAoIXJlcXVpcmUoIkdHYWxseSIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpCiAgIGxpYnJhcnkoR0dhbGx5KQp9CmlmICghcmVxdWlyZSgiR0dhbGx5IikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygiR0dhbGx5IikKICAgbGlicmFyeShHR2FsbHkpCn0KaWYgKCFyZXF1aXJlKCJDQ0EiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJDQ0EiKQogICBsaWJyYXJ5KENDQSkKfQppZiAoIXJlcXVpcmUoIm9sc3JyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygib2xzcnIiKQogICBsaWJyYXJ5KG9sc3JyKQp9CmlmICghcmVxdWlyZSgicHN5Y2giKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpCiAgIGxpYnJhcnkocHN5Y2gpCn0KaWYgKCFyZXF1aXJlKCJjb2Nyb24iKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJjb2Nyb24iKQogICBsaWJyYXJ5KGNvY3JvbikKfQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQogICBsaWJyYXJ5KGtuaXRyKQp9CmlmICghcmVxdWlyZSgicGFuZGVyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikKICAgbGlicmFyeShwYW5kZXIpCn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgIAogICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwgIAogICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAKICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBGQUxTRSAgIAogICAgICAgICAgICAgICAgICAgICAgKSAgIApgYGAKCmBgYHtyfQpkYXRhID0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9SeWFuTGViby9yeWxlYm8vcmVmcy9oZWFkcy9tYWluL2F0LXJpc2stc3VydmV5LWRhdGEuY3N2IiwgaGVhZGVyID0gVFJVRSkKYGBgCgojIEludHJvZHVjdGlvbgoKV2UgYXJlIGRvaW5nIHRoaXMgcmVzZWFyY2ggcHJvamVjdCB0byBsb29rIGF0IHRoZSBsZXZlbCBvZiBzdHVkZW50IGVuZ2FnZW1lbnQgYW5kIHRoZSBvdmVyYWxsIGFjYWRlbWljIGV4cGVyaWVuY2Ugd2l0aCB1bmRlcmdyYWR1YXRlIHN0dWRlbnRzIGVucm9sbGVkIGF0IHR3byBidXNpbmVzcyBzY2hvb2xzIGluIHRoZSBVUy4KCldlIHdpbGwgbG9vayBhdCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc29tZSBvZiB0aGVzZSB2YXJpYWJsZXMuIFRoZSBnb2FsIGlzIHRvIGZpbmQgYXJlYXMgdGhhdCBzdXBwb3J0IG9yIGh1cnQgc3R1ZGVudCBzdWNjZXNzIGFuZCBzYXRpc2ZhY3Rpb24gYXQgdGhlc2UgdW5pdmVyc2l0aWVzLgoKVGhlIHN1cnZleSBnaXZlbiBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOgoKLSBTdHVkZW50cycgRW5nYWdlbWVudCBpbiBMZWFybmluZyAKCi0gU3R1ZGVudCBMZWFybmluZyBTdHlsZXMKCi0gV3JpdGluZyBhbmQgUmVhZGluZyBMb2FkIAoKLSBSZW1lZGlhbCBFeHBlcmllbmNlIAoKLSBFbmNvdXJhZ2VtZW50IGFuZCBTdXBwb3J0IAoKLSBHcm93dGggYW5kIERldmVsb3BtZW50IAoKLSBDYW1wdXMgUmVzb3VyY2UgVXRpbGl6YXRpb24KCi0gUmV0ZW50aW9uCgotIEhvdyBTdHVkZW50cyBQYXkgZm9yIENvbGxlZ2UgCgpUaGUgcHVycG9zZSBvZiBvdXIgYW5hbHlzaXMgaXMgdG8gZmluZCBwYXR0ZXJucyBpbiBzdHVkZW50IHJlc3BvbnNlcyBhbmQgZXhhbWluZSBob3cgdGhlc2UgZmFjdG9ycyBjb3JyZWxhdGUgd2l0aCBhIHN0dWRlbnQncyBzZW5zZSBvZiBhY2FkZW1pYyBiZWxvbmdpbmcsIHNhdGlzZmFjdGlvbiwgYW5kIHBvdGVudGlhbCBwZXJzaXN0ZW5jZSB0byBncmFkdWF0aW9uLgoKIyBEYXRhIE1hbmFnZW1lbnQKClRoaXMgc2VjdGlvbiB3aWxsIHByZXBhcmUgdGhlIHN1cnZleSBkYXRhIGZvciBhbmFseXNpcyBieSBoYW5kbGluZyBtaXNzaW5nIHZhbHVlcyBhY3Jvc3MgbXVsdGlwbGUgc2VjdGlvbnMgb2YgdGhlIHF1ZXN0aW9ubmFpcmUuCgpgYGB7cn0KbXkubW9kZSA9IGZ1bmN0aW9uKGRhdGFzZXQpewogIGZyZXEudGJsID0gdGFibGUoZGF0YXNldCkKICBtYXguZnJlcS5pZD13aGljaChmcmVxLnRibD09bWF4KGZyZXEudGJsKSkKICBtb2RlPW5hbWVzKGZyZXEudGJsW21heC5mcmVxLmlkXSkKICBhcy5udW1lcmljKG1vZGUpCn0KCmBgYAoKIyMgU3R1ZGVudHMnIEVuZ2FnZW1lbnQgaW4gTGVhcm5pbmcgCgpgYGB7cn0KZW5nYWdlbWVudCA9IGRhdGFbLCA0OjI0XQojIEltcHV0aW5nIHdpdGggdGhlIG1vZGUgaW4gZWFjaCBzdXJ2ZXkgaXRlbQpmb3IgKGkgaW4gMToyMSkgewogIGVuZ2FnZW1lbnRbLGldW2lzLm5hKGVuZ2FnZW1lbnRbLGldKV09bXkubW9kZShlbmdhZ2VtZW50WyxpXSkKfQoKYGBgCgojIyBTdHVkZW50IExlYXJuaW5nIFN0eWxlcwoKYGBge3J9CkxlYXJuU3R5bGUgPSBkYXRhWywgMjU6MzBdCiMgSW1wdXRpbmcgd2l0aCB0aGUgbW9kZSBpbiBlYWNoIHN1cnZleSBpdGVtCmZvciAoaSBpbiAxOjYpIHsKICBMZWFyblN0eWxlWyxpXVtpcy5uYShMZWFyblN0eWxlWyxpXSldPW15Lm1vZGUoTGVhcm5TdHlsZVssaV0pCn0KCmBgYAoKIyMgV3JpdGluZyBhbmQgUmVhZGluZyBMb2FkIAoKYGBge3J9CldyaVJlYWQgPSBkYXRhWywgMzE6MzNdCiMgSW1wdXRpbmcgd2l0aCB0aGUgbW9kZSBpbiBlYWNoIHN1cnZleSBpdGVtCmZvciAoaSBpbiAxOjMpIHsKICBXcmlSZWFkWyxpXVtpcy5uYShXcmlSZWFkWyxpXSldPW15Lm1vZGUoV3JpUmVhZFssaV0pCn0KCmBgYAoKIyMgUmVtZWRpYWwgRXhwZXJpZW5jZSAKCmBgYHtyfQpSZW1lZCA9IGRhdGFbLCAzNTo0M10KIyBJbXB1dGluZyB3aXRoIHRoZSBtb2RlIGluIGVhY2ggc3VydmV5IGl0ZW0KZm9yIChpIGluIDE6OSkgewogIFJlbWVkWyxpXVtpcy5uYShSZW1lZFssaV0pXT1teS5tb2RlKFJlbWVkWyxpXSkKfQoKYGBgCgojIyBFbmNvdXJhZ2VtZW50IGFuZCBTdXBwb3J0IAoKYGBge3J9CkVuZ2NuU3VwcCA9IGRhdGFbLCA0NDo1MF0KIyBJbXB1dGluZyB3aXRoIHRoZSBtb2RlIGluIGVhY2ggc3VydmV5IGl0ZW0KZm9yIChpIGluIDE6NykgewogIEVuZ2NuU3VwcFssaV1baXMubmEoRW5nY25TdXBwWyxpXSldPW15Lm1vZGUoRW5nY25TdXBwWyxpXSkKfQoKYGBgCgojIyBHcm93dGggYW5kIERldmVsb3BtZW50IAoKCmBgYHtyfQpHcm93bkRldiA9IGRhdGFbLCA1MTo2NV0KIyBJbXB1dGluZyB3aXRoIHRoZSBtb2RlIGluIGVhY2ggc3VydmV5IGl0ZW0KZm9yIChpIGluIDE6MTUpIHsKICBHcm93bkRldlssaV1baXMubmEoR3Jvd25EZXZbLGldKV09bXkubW9kZShHcm93bkRldlssaV0pCn0KCmBgYAoKIyMgQ2FtcHVzIFJlc291cmNlIFV0aWxpemF0aW9uIAoKYGBge3J9ClJlc291cmNlID0gZGF0YVssIDY2Ojk4XQojIEltcHV0aW5nIHdpdGggdGhlIG1vZGUgaW4gZWFjaCBzdXJ2ZXkgaXRlbQpmb3IgKGkgaW4gMTozMykgewogIFJlc291cmNlWyxpXVtpcy5uYShSZXNvdXJjZVssaV0pXT1teS5tb2RlKFJlc291cmNlWyxpXSkKfQoKYGBgCgojIyBSZXRlbnRpb24gCgpgYGB7cn0KUmV0ZW50aW9uID0gZGF0YVssIDk5OjEwM10KIyBJbXB1dGluZyB3aXRoIHRoZSBtb2RlIGluIGVhY2ggc3VydmV5IGl0ZW0KZm9yIChpIGluIDE6NSkgewogIFJldGVudGlvblssaV1baXMubmEoUmV0ZW50aW9uWyxpXSldPW15Lm1vZGUoUmV0ZW50aW9uWyxpXSkKfQoKYGBgCgojIyBIb3cgU3R1ZGVudHMgUGF5IGZvciBDb2xsZWdlIAoKYGBge3J9ClBheSA9IGRhdGFbLCAxMDQ6MTA5XQojIEltcHV0aW5nIHdpdGggdGhlIG1vZGUgaW4gZWFjaCBzdXJ2ZXkgaXRlbQpmb3IgKGkgaW4gMTo2KSB7CiAgUGF5WyxpXVtpcy5uYShQYXlbLGldKV09bXkubW9kZShQYXlbLGldKQp9CgpgYGAKCgojIFJlbGlhYmlsaXR5IG9mIHRoZSBBbmFseXNpcwoKV2Ugd2lsbCBub3cgZ2V0IGFuIGluaXRpYWwgY29ycmVsYXRpb24gbWF0cml4IGFuZCBtYWtlIGEgZGVjaXNpb24gb24gd2hldGhlciB0byBzY2FsZSBvdXIgdmFsdWVzIGlmIHdlIGhhdmUgYSB2YXJpZXR5IG9mIG5lZ2F0aXZlbHkgY29ycmVsYXRlZCB2YWx1ZXMgb3IgdG8gY29tcHV0ZSBvdXIgY3JvbmJhY2hzIGFscGhhIGlmIG91ciB2YWx1ZXMgYXJlIGFsbCBwb3NpdGl2ZWx5IGNvcnJlbGF0ZWQuIAoKCiMjIFN0dWRlbnRzJyBFbmdhZ2VtZW50IGluIExlYXJuaW5nIAoKYGBge3J9Ck09Y29yKGVuZ2FnZW1lbnQpCmNvcnJwbG90Lm1peGVkKE0sIGxvd2VyLmNvbCA9ICJwdXJwbGUiLCB1cHBlciA9ICJlbGxpcHNlIiwgbnVtYmVyLmNleCA9IC43LCB0bC5jZXggPSAwLjcpCgpgYGAKCkZyb20gdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCB3ZSBjYW4gc2VlIHRoYXQgd2UgaGF2ZSBhIG11bHRpdHVkZSBvZiBuZWdhdGl2ZWx5IGNvcnJlbGF0ZWQgdmFsdWVzLiBEdWUgdG8gdGhpcyB3ZSB3aWxsIGhhdmUgdG8gc2NhbGUgb3VyIHZhbHVlcyBpbnRvIGRpZmZlcmVudCBzdWIgc2VjdGlvbnMuIAoKCgojIyBTdHVkZW50IExlYXJuaW5nIFN0eWxlcwoKYGBge3J9Ck09Y29yKExlYXJuU3R5bGUpCmNvcnJwbG90Lm1peGVkKE0sIGxvd2VyLmNvbCA9ICJwdXJwbGUiLCB1cHBlciA9ICJlbGxpcHNlIiwgbnVtYmVyLmNleCA9IC43LCB0bC5jZXggPSAwLjcpCgpgYGAKCldlIHNlZSBmcm9tIG91ciBjb3JyZWxhdGlvbiBtYXRyaXggb2Ygc3R1ZGVudCBsZWFybmluZyBzdHlsZXMgc2VjdGlvbiB0aGF0IHdlIGhhdmUgaGlnaCBjb3JyZWxhdGlvbiBiZXR3ZWVuIG91ciBxdWVzdGlvbnMuIAoKYGBge3J9CmNyb25iYWNoLmxlYSA9IGFzLm51bWVyaWMocHN5Y2g6OmFscGhhKExlYXJuU3R5bGUpJHRvdGFsWzFdKQoKQ0kubGVhID0gY3JvbmJhY2guYWxwaGEuQ0koYWxwaGEgPSBjcm9uYmFjaC5sZWEsIG4gPSA2NjQsIGl0ZW1zID0gNiwgY29uZi5sZXZlbCA9IDAuOTUpCgpDSS5MZWFyblN0eWxlID0gY2JpbmQoTENJID0gQ0kubGVhWzFdLCBhbHBoYSA9IGNyb25iYWNoLmxlYSwgVUNJID0gQ0kubGVhWzJdKQpyb3cubmFtZXMoQ0kuTGVhcm5TdHlsZSkgPSAiIgoKcGFuZGVyKENJLkxlYXJuU3R5bGUsIGNhcHRpb24gPSAiQ29uZmlkZW5jZSBJbnRlcnZhbCBvZiBDcm9uYmFjaCdzIEFscGhhIikKCmBgYAoKTG9va2luZyBhdCB0aGlzLCBpdCBzaG93cyB3ZSBoYWQgYSBzdHJvbmcgcG9zaXRpdmUgY29ycmVsYXRpb24gbWF0cml4IHNvLCB3ZSBkZWNpZGVkIHRvIGRvIGEgY3JvbmJhY2hzIGFscGhhIGNhbGN1bGF0aW9uLiBXZSBnb3QgYW4gYWxwaGEgbGV2ZWwgb2YgLjg1MDggYW5kIGEgQ0kgb2YgKC44MzI1LCAuODY3NykuIFRoZXNlIHZhbHVlcyBhcmUgdmVyeSBoaWdoIHdoaWNoIG1lYW5zIHdlIGhhdmUgYSBoaWdoIGxldmVsIG9mIGludGVybmFsIGNvbnNpc3RlbmN5LgoKIyMgV3JpdGluZyBhbmQgUmVhZGluZyBMb2FkIAoKYGBge3J9CgpNPWNvcihXcmlSZWFkKQpjb3JycGxvdC5taXhlZChNLCBsb3dlci5jb2wgPSAicHVycGxlIiwgdXBwZXIgPSAiZWxsaXBzZSIsIG51bWJlci5jZXggPSAuNywgdGwuY2V4ID0gMC43KQoKYGBgCgpXZSBzZWUgZnJvbSBvdXIgY29ycmVsYXRpb24gbWF0cml4IHdlIGhhdmUgcG9zaXRpdmUgY29ycmVsYXRpb24uIFNpbmNlIHRoZXNlIGFyZSBhbGwgcG9zaXRpdmUgd2UgZ28gYWhlYWQgYW5kIHBlcmZvcm0gYSBjcm9uYmFjaHMgYWxwaGEgY2FsY3VsYXRpb24uIAoKYGBge3J9CmNyb25iYWNoLndyaSA9IGFzLm51bWVyaWMocHN5Y2g6OmFscGhhKFdyaVJlYWQpJHRvdGFsWzFdKQoKQ0kud3JpID0gY3JvbmJhY2guYWxwaGEuQ0koYWxwaGEgPSBjcm9uYmFjaC53cmksIG4gPSA2NjQsIGl0ZW1zID0gMywgY29uZi5sZXZlbCA9IDAuOTUpCgpDSS5XcmlSZWFkID0gY2JpbmQoTENJID0gQ0kud3JpWzFdLCBhbHBoYSA9IGNyb25iYWNoLndyaSwgVUNJID0gQ0kud3JpWzJdKQpyb3cubmFtZXMoQ0kuV3JpUmVhZCkgPSAiIgoKcGFuZGVyKENJLldyaVJlYWQsIGNhcHRpb24gPSAiQ29uZmlkZW5jZSBJbnRlcnZhbCBvZiBDcm9uYmFjaCdzIEFscGhhIikKCmBgYAoKSW4gdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBnb3QgYSBsb3dlciBjcm9uYmFjaHMgYWxwaGEgdmFsdWUgb2YgLjQ3MDMgYW5kIENJIG9mICguMzk2NSwgLjUzNjUpLiBXaXRoIHRoaXMgdmFsdWUgd2UgY2Fubm90IGFjY2VwdCB0aGlzIHNlY3Rpb24uIAoKIyMgUmVtZWRpYWwgRXhwZXJpZW5jZSAKCmBgYHtyfQpNPWNvcihSZW1lZCkKY29ycnBsb3QubWl4ZWQoTSwgbG93ZXIuY29sID0gInB1cnBsZSIsIHVwcGVyID0gImVsbGlwc2UiLCBudW1iZXIuY2V4ID0gLjcsIHRsLmNleCA9IDAuNykKCmBgYAoKV2Ugc2VlIGZyb20gdGhpcyBjb3JyZWxhdGlvbiBtYXRyaXggd2UgaGF2ZSBhbiBhbGwgcG9zaXRpdmUgbWF0cml4LiBTaW5jZSBvdXIgdmFsdWVzIGFyZSBwb3NpdGl2ZSB3ZSBjYW4gZ28gYWhlYWQgYW5kIGRvIGEgY3JvbmJhY2hzIGFscGhhIGNhbGN1bGF0aW9uLgoKYGBge3J9CmNyb25iYWNoLnJlbSA9IGFzLm51bWVyaWMocHN5Y2g6OmFscGhhKFJlbWVkKSR0b3RhbFsxXSkKCkNJLnJlbSA9IGNyb25iYWNoLmFscGhhLkNJKGFscGhhID0gY3JvbmJhY2gucmVtLCBuID0gNjY0LCBpdGVtcyA9IDksIGNvbmYubGV2ZWwgPSAwLjk1KQoKQ0kucmVtZWRpYWwgPSBjYmluZChMQ0kgPSBDSS5yZW1bMV0sIGFscGhhID0gY3JvbmJhY2gucmVtLCBVQ0kgPSBDSS5yZW1bMl0pCnJvdy5uYW1lcyhDSS5yZW1lZGlhbCkgPSAiIgoKcGFuZGVyKENJLnJlbWVkaWFsLCBjYXB0aW9uID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWwgb2YgQ3JvbmJhY2gncyBBbHBoYSIpCgpgYGAKCldlIGdvdCBhbiBhbHBoYSBsZXZlbCBvZiAuODUyMSBhbmQgYSBDSSBvZiAoLjgzNDcsIC44Njg0KS4gVGhlc2UgdmFsdWVzIGFyZSB2ZXJ5IGhpZ2ggd2hpY2ggbWVhbnMgd2UgaGF2ZSBhIGhpZ2ggbGV2ZWwgb2YgaW50ZXJuYWwgY29uc2lzdGVuY3kuCgojIyBFbmNvdXJhZ2VtZW50IGFuZCBTdXBwb3J0IAoKYGBge3J9Ck09Y29yKEVuZ2NuU3VwcCkKY29ycnBsb3QubWl4ZWQoTSwgbG93ZXIuY29sID0gInB1cnBsZSIsIHVwcGVyID0gImVsbGlwc2UiLCBudW1iZXIuY2V4ID0gLjcsIHRsLmNleCA9IDAuNykKCmBgYAoKVGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBzaG93cyB3ZSBoYXZlIGFsbCBwb3NpdGl2ZSB2YWx1ZXMuIFNpbmNlIG91ciB2YWx1ZXMgYXJlIHBvc2l0aXZlIHdlIGNhbiBnbyBhaGVhZCBhbmQgZG8gYSBjcm9uYmFjaHMgYWxwaGEgY2FsY3VsYXRpb24uCgpgYGB7cn0KY3JvbmJhY2guZW5jID0gYXMubnVtZXJpYyhwc3ljaDo6YWxwaGEoRW5nY25TdXBwKSR0b3RhbFsxXSkKCkNJLmVuYyA9IGNyb25iYWNoLmFscGhhLkNJKGFscGhhID0gY3JvbmJhY2guZW5jLCBuID0gNjY0LCBpdGVtcyA9IDcsIGNvbmYubGV2ZWwgPSAwLjk1KQoKQ0kuRW5nY25TdXBwID0gY2JpbmQoTENJID0gQ0kuZW5jWzFdLCBhbHBoYSA9IGNyb25iYWNoLmVuYywgVUNJID0gQ0kuZW5jWzJdKQpyb3cubmFtZXMoQ0kuRW5nY25TdXBwKSA9ICIiCgpwYW5kZXIoQ0kuRW5nY25TdXBwLCBjYXB0aW9uID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWwgb2YgQ3JvbmJhY2gncyBBbHBoYSIpCgpgYGAKCldlIGdvdCBhIGhpZ2hlciBjcm9uYmFjaHMgdmFsdWUgb2YgLjgwODMgYW5kIENJIG9mICguNzg1MSwgLjgyOTgpLiBXZSBjYW4gZ28gYWhlYWQgYW5kIHNheSB0aGF0IHdlIGhhdmUgaGlnaCBpbnRlcm5hbCBjb25zaXN0ZW5jeSBiZXR3ZWVuIG91ciBxdWVzdGlvbnMuCgojIyBDYW1wdXMgUmVzb3VyY2UgVXRpbGl6YXRpb24KCmBgYHtyfQpNPWNvcihSZXNvdXJjZSkKY29ycnBsb3QubWl4ZWQoTSwgbG93ZXIuY29sID0gInB1cnBsZSIsIHVwcGVyID0gImVsbGlwc2UiLCBudW1iZXIuY2V4ID0gLjcsIHRsLmNleCA9IDAuNykKCmBgYAoKV2Ugc2VlIGZyb20gdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBhYm92ZSB0aGF0IHdlIGhhdmUgZGlmZmVyaW5nIGFsbW9zdCBlcXVhbCBsZXZlbHMgb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcyBzbyB3ZSB3aWxsIGhhdmUgdG8gbWFrZSBzb21lIHN1YnNlY3Rpb25zIG9mIG91ciBvYnNlcnZhdGlvbnMgZm9yIHRoaXMgc2VjdGlvbi4gCgoKYGBge3J9CgpSZXNvdXJjZV9GUyA9IGNiaW5kKFJlc291cmNlJHExMTEuMSwgUmVzb3VyY2UkcTExMi4xLCBSZXNvdXJjZSRxMTEzLjEsIAogICAgICAgICAgICAgICAgICAgIFJlc291cmNlJHExMTQuMSwgUmVzb3VyY2UkcTExNS4xLCBSZXNvdXJjZSRxMTE2LjEsIAogICAgICAgICAgICAgICAgICAgIFJlc291cmNlJHExMTcuMSwgUmVzb3VyY2UkcTExOC4xLCBSZXNvdXJjZSRxMTE5LjEsCiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2UkcTExMTAuMSwgUmVzb3VyY2UkcTExMTEuMSkKCgpSZXNvdXJjZV9TUyA9IGNiaW5kKFJlc291cmNlJHExMTEuMiwgUmVzb3VyY2UkcTExMi4yLCBSZXNvdXJjZSRxMTEzLjIsIAogICAgICAgICAgICAgICAgICAgIFJlc291cmNlJHExMTQuMiwgUmVzb3VyY2UkcTExNS4yLCBSZXNvdXJjZSRxMTE2LjIsIAogICAgICAgICAgICAgICAgICAgIFJlc291cmNlJHExMTcuMiwgUmVzb3VyY2UkcTExOC4yLCBSZXNvdXJjZSRxMTE5LjIsCiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2UkcTExMTAuMiwgUmVzb3VyY2UkcTExMTEuMikKCgpSZXNvdXJjZV9JUyA9IGNiaW5kKFJlc291cmNlJHExMTEuMywgUmVzb3VyY2UkcTExMi4zLCBSZXNvdXJjZSRxMTEzLjMsIAogICAgICAgICAgICAgICAgICAgIFJlc291cmNlJHExMTQuMywgUmVzb3VyY2UkcTExNS4zLCBSZXNvdXJjZSRxMTE2LjMsIAogICAgICAgICAgICAgICAgICAgIFJlc291cmNlJHExMTcuMywgUmVzb3VyY2UkcTExOC4zLCBSZXNvdXJjZSRxMTE5LjMsCiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2UkcTExMTAuMywgUmVzb3VyY2UkcTExMTEuMykKCgoKCk0gPSBjb3IoY2JpbmQoUmVzb3VyY2VfRlMsIFJlc291cmNlX1NTLCBSZXNvdXJjZV9JUykpCmNvcnJwbG90Lm1peGVkKE0sIGxvd2VyLmNvbCA9ICJwdXJwbGUiLCB1cHBlciA9ICJlbGxpcHNlIiwgCiAgICAgICAgICAgICAgIG51bWJlci5jZXggPSAwLjcsIHRsLmNleCA9IDAuNykKCgpgYGAKCldpdGggdGhpcyBtYXRyaXggd2Ugc2VwYXJhdGVkIGl0IGludG8gdGhlIDMgZGlmZmVyZW50IHNjYWxlcy4gVGhpcyBkaWQgbm90IGhlbHAgdXMgYXQgYWxsIGluIG5vdGljaW5nIGFueSB0cmVuZHMsIGluc3RlYWQgd2Ugc3RpbGwgc2VlIGEgbG90IG9mIG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZSBjb3JyZWxhdGlvbiB2YWx1ZXMuIFNpbmNlIHdlIGNhbm5vdCBnZXQgdGhlc2UgbmVnYXRpdmUgdmFsdWVzIG91dCBvZiB0aGUgbWF0cml4IHdlIHdpbGwgbm90IHByb2NlZWQgd2l0aCBhIGNyb25iYWNocyBhbHBoYSBjYWxjdWxhdGlvbiBhbmQgYXNzdW1lIHRoYXQgd2UgY2Fubm90IHVzZSB0aGlzIHNlY3Rpb24uIAoKCiMjIFJldGVudGlvbgoKYGBge3J9Ck09Y29yKFJldGVudGlvbikKY29ycnBsb3QubWl4ZWQoTSwgbG93ZXIuY29sID0gInB1cnBsZSIsIHVwcGVyID0gImVsbGlwc2UiLCBudW1iZXIuY2V4ID0gLjcsIHRsLmNleCA9IDAuNykKCgpgYGAKClRoaXMgY29ycmVsYXRpb24gbWF0cml4IGhhdmluZyBldmVyeSB2YWx1ZSBwb3NpdGl2ZWx5IGNvcnJlbGF0ZWQuIFNvIHdlIGNhbiBnbyBhaGVhZCBhbmQgY2FsY3VsYXRlIG91ciBjcm9uYmFjaHMgYWxwaGEuCgpgYGB7cn0KY3JvbmJhY2gucmV0ID0gYXMubnVtZXJpYyhwc3ljaDo6YWxwaGEoUmV0ZW50aW9uKSR0b3RhbFsxXSkKCkNJLnJldCA9IGNyb25iYWNoLmFscGhhLkNJKGFscGhhID0gY3JvbmJhY2gucmV0LCBuID0gNjY0LCBpdGVtcyA9IDUsIGNvbmYubGV2ZWwgPSAwLjk1KQoKQ0kuUmV0ZW50aW9uID0gY2JpbmQoTENJID0gQ0kucmV0WzFdLCBhbHBoYSA9IGNyb25iYWNoLnJldCwgVUNJID0gQ0kucmV0WzJdKQpyb3cubmFtZXMoQ0kuUmV0ZW50aW9uKSA9ICIiCgpwYW5kZXIoQ0kuUmV0ZW50aW9uLCBjYXB0aW9uID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWwgb2YgQ3JvbmJhY2gncyBBbHBoYSIpCgpgYGAKCldlIGdvdCBhIGhpZ2ggY3JvbmJhY2hzIGFscGhhIG9mIC44NzQ3IGFuZCBhIENJIG9mICguODU4OSwgLjg4OTEpLiBTbyB3ZSBjYW4gc2F5IHRoYXQgdGhpcyBzZWN0aW9uIGhhcyBoaWdoIGludGVybmFsIGNvbnNpc3RlbmN5LiAKCiMjIEhvdyBTdHVkZW50cyBQYXkgZm9yIENvbGxlZ2UgCgpgYGB7cn0KTT1jb3IoUGF5KQpjb3JycGxvdC5taXhlZChNLCBsb3dlci5jb2wgPSAicHVycGxlIiwgdXBwZXIgPSAiZWxsaXBzZSIsIG51bWJlci5jZXggPSAuNywgdGwuY2V4ID0gMC43KQoKYGBgCgpUaGUgbWF0cml4IGZvciB0aGlzIGhhcyBhIG1peCBvZiBib3RoIG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZWx5IGNvcnJlbGF0ZWQgdmFsdWVzIHNvIHdlIGNhbm5vdCBkbyBhIGNyb25iYWNocyBhbHBoYSBjYWxjdWxhdGlvbi4gV2Ugbm93IGhhdmUgdG8gZ28gYWhlYWQgYW5kIHN1YiBzZWN0aW9uIG91ciBIb3cgU3R1ZGVudHMgUGF5IGZvciBDb2xsZWdlIHNlY3Rpb24gYnkgcGVyc29uYWwgaW5jb21lL3NhdmluZ3MgYW5kIG91dHNpZGUgYXNzaXN0YW5jZS4gCgpgYGB7cn0KCnBlcnNvbmFsX2luY29tZV9zYXZlID0gY2JpbmQocTQxMzEgPSBQYXkkcTQxMzEsIHExMzIgPSBQYXkkcTEzMikKCm91dHNpZGVfYXNzaXN0YW5jZSA9IGNiaW5kKHExMzM9UGF5JHExMzMsIHExMzQ9UGF5JHExMzQsIHExMzU9UGF5JHExMzUsIHExMzY9UGF5JHExMzYpCgoKcGF5X2l0ZW1zID0gY2JpbmQob3V0c2lkZV9hc3Npc3RhbmNlLCBwZXJzb25hbF9pbmNvbWVfc2F2ZSApCgpNPWNvcihvdXRzaWRlX2Fzc2lzdGFuY2UpCmNvcnJwbG90Lm1peGVkKE0sIGxvd2VyLmNvbCA9ICJwdXJwbGUiLCB1cHBlciA9ICJlbGxpcHNlIiwgbnVtYmVyLmNleCA9IC43LCB0bC5jZXggPSAwLjcpCgpgYGAKVGhlIG5ldyBtYXRyaXggb2YganVzdCBvdXRzaWRlIGFzc2lzdGFuY2UgaGFzIGltcHJvdmVkIGZyb20gdGhlIGxhc3QgbWF0cml4LiBBbGwgdGhlIHZhbHVlcyBhcmUgcG9zaXRpdmVseSBjb3JyZWxhdGVkIHNvLCB3ZSBjYW4gZ28gYWhlYWQgYW5kIHBlcmZvcm0gYSBjcm9uYmFjaHMgYWxwaGEgY2FsY3VsYXRpb24uIAoKYGBge3J9CmNyb25iYWNoLnBheSA9IGFzLm51bWVyaWMocHN5Y2g6OmFscGhhKG91dHNpZGVfYXNzaXN0YW5jZSkkdG90YWxbMV0pCgpDSS5wYXkgPSBjcm9uYmFjaC5hbHBoYS5DSShhbHBoYSA9IGNyb25iYWNoLnBheSwgbiA9IDY2NCwgaXRlbXMgPSA0LCBjb25mLmxldmVsID0gMC45NSkKCkNJLlBheW1lbnQgPSBjYmluZChMQ0kgPSBDSS5wYXlbMV0sIGFscGhhID0gY3JvbmJhY2gucGF5LCBVQ0kgPSBDSS5wYXlbMl0pCnJvdy5uYW1lcyhDSS5QYXltZW50KSA9ICIiCgpwYW5kZXIoQ0kuUGF5bWVudCwgY2FwdGlvbiA9ICJDb25maWRlbmNlIEludGVydmFsIG9mIENyb25iYWNoJ3MgQWxwaGEiKQoKYGBgCgpUaGlzIGhhcyBhIHNtYWxsZXIgY3JvbmJhY2ggdmFsdWUgb2YgLjYzMDkgYW5kIENJIG9mICguNTgyOCwgLjY3NDcpLiBTaW5jZSBvdXIgdmFsdWUgaXMgYXQgLjYzIHdlIGFyZSBxdWVzdGlvbmFibGUgb24gd2hldGhlciB0byB1c2UgdGhpcyBxdWVzdGlvbm5haXJlIGR1ZSB0byBpdCBiZWluZyBsb3cuIAoKCiMgUENBClRoaXMgc2VjdGlvbiBwcmVzZW50cyB0aGUgcmVzdWx0cyBvZiB0aGUgUENBIChwcmluY2lwYWwgY29tcG9uZW50IGFuYWx5c2lzKS4gVGhlIHNpZ25pZmljYW50IHByaW5jaXBhbCBjb21wb25lbnRzIGlkZW50aWZpZWQgd2lsbCBiZSB1c2VkIGluIHRoZSBhbmFseXRpYyBkYXRhIHNldCBmb3IgdXNlIGluIHJlZ3Jlc3Npb24gbW9kZWxpbmcuCgoKYGBge3J9Ck15LnBsb3RuU2NyZWUgPSBmdW5jdGlvbihtYXQsIGxlZ2VuZCA9IFRSVUUsIG1ldGhvZCA9ImZhY3RvcnMiLCBtYWluKXsKCiAgCiAgICBldiA8LSBlaWdlbihjb3IobWF0KSkgICAgIyBnZXQgZWlnZW52YWx1ZXMKICAgIGFwIDwtIHBhcmFsbGVsKHN1YmplY3Q9bnJvdyhtYXQpLHZhcj1uY29sKG1hdCksIHJlcD01MDAwLGNlbnQ9LjA1KQogICAgblNjcmVlID0gblNjcmVlKHg9ZXYkdmFsdWVzLCBhcGFyYWxsZWw9YXAkZWlnZW4kcWV2cGVhLCBtb2RlbD1tZXRob2QpICAKICAgIAogICAgaWYgKCFpbmhlcml0cyhuU2NyZWUsICJuU2NyZWUiKSkgCiAgICAgICAgc3RvcCgiTWV0aG9kIGlzIG9ubHkgZm9yIG5TY3JlZSBvYmplY3RzIikKICAgIGlmIChuU2NyZWUkTW9kZWwgPT0gImNvbXBvbmVudHMiKSAKICAgICAgICBua2Fpc2VyID0gIkVpZ2VudmFsdWVzID4gbWVhbjogbiA9ICIKICAgIGlmIChuU2NyZWUkTW9kZWwgPT0gImZhY3RvcnMiKSAKICAgICAgbmthaXNlciA9ICJFaWdlbnZhbHVlcyA+IHplcm86IG4gPSAiCiAgICAKICAgIHhsYWIgPSBuU2NyZWUkTW9kZWwKICAgIHlsYWIgPSAiRWlnZW52YWx1ZXMiCiAgICAKICAgIHBhcihjb2wgPSAxLCBwY2ggPSAxOCkKICAgIHBhcihtZnJvdyA9IGMoMSwgMSkpCiAgICBlaWcgPC0gblNjcmVlJEFuYWx5c2lzJEVpZ2VudmFsdWVzCiAgICBrIDwtIDE6bGVuZ3RoKGVpZykKICAgIHBsb3QoMTpsZW5ndGgoZWlnKSwgZWlnLCB0eXBlPSJiIiwgbWFpbiA9IG1haW4sIAogICAgICAgIHhsYWIgPSB4bGFiLCB5bGFiID0geWxhYiwgeWxpbT1jKDAsIDEuMiptYXgoZWlnKSkpCiAgICAKICAgIG5rIDwtIGxlbmd0aChlaWcpCiAgICBub2MgPC0gblNjcmVlJENvbXBvbmVudHMkbm9jCiAgICB2cC5wIDwtIGxtKGVpZ1tjKG5vYyArIDEsIG5rKV0gfiBrW2Mobm9jICsgMSwgbmspXSkKICAgIHggPC0gc3VtKGMoMSwgMSkgKiBjb2VmKHZwLnApKQogICAgeSA8LSBzdW0oYygxLCBuaykgKiBjb2VmKHZwLnApKQogICAgcGFyKGNvbCA9IDEwKQogICAgbGluZXMoa1tjKDEsIG5rKV0sIGMoeCwgeSkpCiAgICBwYXIoY29sID0gMTEsIHBjaCA9IDIwKQogICAgbGluZXMoMTpuaywgblNjcmVlJEFuYWx5c2lzJFBhci5BbmFseXNpcywgdHlwZSA9ICJiIikKICAgIGlmIChsZWdlbmQgPT0gVFJVRSkgewogICAgICAgIGxlZy50eHQgPC0gYyhwYXN0ZShua2Fpc2VyLCBuU2NyZWUkQ29tcG9uZW50cyRua2Fpc2VyKSwgCiAgICAgICAgICAgICAgICAgICBjKHBhc3RlKCJQYXJhbGxlbCBBbmFseXNpczogbiA9ICIsIG5TY3JlZSRDb21wb25lbnRzJG5wYXJhbGxlbCkpLCAKICAgICAgICAgICAgICAgICAgIGMocGFzdGUoIk9wdGltYWwgQ29vcmRpbmF0ZXM6IG4gPSAiLCBuU2NyZWUkQ29tcG9uZW50cyRub2MpKSwgCiAgICAgICAgICAgICAgICAgICBjKHBhc3RlKCJBY2NlbGVyYXRpb24gRmFjdG9yOiBuID0gIiwgblNjcmVlJENvbXBvbmVudHMkbmFmKSkKICAgICAgICAgICAgICAgICAgICkKICAgICAgICBsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gbGVnLnR4dCwgcGNoID0gYygxOCwgMjAsIE5BLCBOQSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmNvbCA9IGMoMSwgMywgMiwgNCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSBjKDEsIDMsIDIsIDQpLCBidHk9Im4iLCBjZXg9MC43KQogICAgfQogICAgbmFmIDwtIG5TY3JlZSRDb21wb25lbnRzJG5hZgogICAgdGV4dCh4ID0gbm9jLCB5ID0gZWlnW25vY10sIGxhYmVsID0gIiAoT0MpIiwgY2V4ID0gMC43LCAKICAgICAgICBhZGogPSBjKDAsIDApLCBjb2wgPSAyKQogICAgdGV4dCh4ID0gbmFmICsgMSwgeSA9IGVpZ1tuYWYgKyAxXSwgbGFiZWwgPSAiIChBRikiLCAKICAgICAgICBjZXggPSAwLjcsIGFkaiA9IGMoMCwgMCksIGNvbCA9IDQpCn0KCmBgYAoKCgpgYGB7cn0KTXkubG9hZGluZ3MudmFyIDwtIGZ1bmN0aW9uKG1hdCwgbmZjdCwgbWV0aG9kPSJmYSIpewogIAogIAogICAgaWYobWV0aG9kID09ICJmYSIpeyAKICAgICBmMSA8LSBmYWN0YW5hbChtYXQsIGZhY3RvcnMgPSBuZmN0LCAgcm90YXRpb24gPSAidmFyaW1heCIpCiAgICAgeCA8LSBsb2FkaW5ncyhmMSkKICAgICB2eCA8LSBjb2xTdW1zKHheMikKICAgICB2YXJTUyA9IHJiaW5kKCdTUyBsb2FkaW5ncycgPSB2eCwKICAgICAgICAgICAgJ1Byb3BvcnRpb24gVmFyJyA9IHZ4L25yb3coeCksCiAgICAgICAgICAgJ0N1bXVsYXRpdmUgVmFyJyA9IGN1bXN1bSh2eC9ucm93KHgpKSkKICAgICB3ZWlnaHQgPSBmMSRsb2FkaW5nc1tdIAogICB9IGVsc2UgaWYgKG1ldGhvZCA9PSAicGNhIil7CiAgICAgcGNhIDwtIHByY29tcChtYXQsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKICAgICB2YXJTUyA9IHN1bW1hcnkocGNhKSRpbXBvcnRhbmNlWywxOm5mY3RdCiAgICAgd2VpZ2h0ID0gcGNhJHJvdGF0aW9uWywxOm5mY3RdCiAgfQogICAgbGlzdChMb2FkaW5ncyA9IHdlaWdodCwgUHJvcC5WYXIgPSB2YXJTUykKfQoKYGBgCgoKIyMgU3R1ZGVudHMnIEVuZ2FnZW1lbnQgaW4gTGVhcm5pbmcgUENBCgpXZSBmaXJzdCBnZW5lcmF0ZSBhIHBsb3QgdG8gdmlzdWFsbHkgYW5kIHN0YXRpc3RpY2FsbHkgaGVscCB1cyBkZWNpZGUgaG93IG1hbnkgdW5kZXJseWluZyBkaW1lbnNpb25zIGFyZSBpbiBvdXIgZGF0YSBmb3IgZW5nYWdlbWVudC4gV2UgZG8gdGhpcyBiZWZvcmUgcnVubmluZyBQQ0Egb3IgdXNpbmcgUENzIGluIHJlZ3Jlc3Npb24uCgpgYGB7cn0KTXkucGxvdG5TY3JlZShtYXQ9ZW5nYWdlbWVudCwgbGVnZW5kID0gVFJVRSwgbWV0aG9kID0iY29tcG9uZW50cyIsIAogICAgICAgICAgICAgIG1haW49IkRldGVybWluYXRpb24gb2YgTnVtYmVyIG9mIENvbXBvbmVudHNcbiBFbmdhZ2VtZW50IChQb3NpdGl2ZSkiKQoKYGBgCgpPdXIgcGxvdCBhYm92ZSBzaG93cyB0aGF0IHRoZSBhcHByb3ByaWF0ZSBhbW91bnQgb2YgY29tcG9uZW50cyB3aWxsIGJlIGFyb3VuZCAyIHNvIHdlIGdvIGFoZWFkIGFuZCBwZXJmb3JtIHByaW5jaXBsZSBjb21wb25lbnQgYW5hbHlzaXMuIAoKCmBgYHtyfQpMb2FkaW5ncyA9IE15LmxvYWRpbmdzLnZhcihtYXQ9ZW5nYWdlbWVudCwgbmZjdD0yLCBtZXRob2Q9InBjYSIpJExvYWRpbmdzCgprYWJsZShyb3VuZChMb2FkaW5ncywzKSwKICAgIGNhcHRpb249IkZhY3RvciBsb2FkaW5ncyBvZiB0aGUgZmlyc3QgZmV3IFBDQXMgYW5kIHRoZSBjdW11bGF0aXZlCiAgICB0aGUgcHJvcG9ydGlvbiBvZiB2YXJpYXRpb24gZXhwbGFpbmVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIFBDQXMgaW4gdGhlIAogICAgRW5nYWdlbWVudCBRdWVzdGlvbmFpcmUgU3VydmV5LiIpCgpgYGAKCgpgYGB7cn0KVmFyUHJvcCA9IE15LmxvYWRpbmdzLnZhcihtYXQ9ZW5nYWdlbWVudCwgbmZjdD0yLCBtZXRob2Q9InBjYSIpJFByb3AuVmFyCgprYWJsZShyb3VuZChWYXJQcm9wLDMpLAogICAgY2FwdGlvbj0iQ3VtdWxhdGl2ZSBhbmQgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZXMgZXhwbGFpbmVkIGJ5IGVhY2ggCiAgICB0aGUgcHJpbmNpcGFsIGNvbXBvbmVudCBpbiB0aGUgZW5nYWdlbWVudCBzdXJ2ZXkuIikKCmBgYAoKQWZ0ZXIgbG9va2luZyBhdCB0aGUgUENBIGJvdGggc2hvdyB3ZXJlIGxpdHRsZSBwcm9wb3J0aW9uIHdpdGggUEMxIGJlaW5nIDI5LjQlIGFuZCBQQzIgYmVpbmcgMTMuOC4KCgoKYGBge3J9CnBjYSA8LSBwcmNvbXAoZW5nYWdlbWVudCwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKQplbmcuaWR4ID0gcGNhJHhbLDFdCgoKaGlzdChlbmcuaWR4LAptYWluPSJEaXN0cmlidXRpb24gb2YgRW5nYWdlbWVudCBJbmRleCIsCmJyZWFrcyA9IHNlcShtaW4oZW5nLmlkeCksIG1heChlbmcuaWR4KSwgbGVuZ3RoPTkpLAp4bGFiPSJFbmdhZ2VtZW50IEluZGV4IiwKeGxpbT1yYW5nZShlbmcuaWR4KSwKYm9yZGVyPSJyZWQiLApjb2w9ImxpZ2h0Ymx1ZSIsCmZyZXE9RkFMU0UKKQoKYGBgCgpXZSBzZWUgaGVyZSB0aGF0IG91ciBncmFwaCBhcHBlYXJzIHRvIGJlIHNrZXdlZCB0byB0aGUgcmlnaHQuIEZ1cnRoZXIgYW5hbHlzaXMgd2lsbCBiZSBuZWVkIG9uIHdoZXRoZXIgdG8gZG8gYSBib3ggY294IHRyYW5zZm9ybWF0aW9uIHRvIGZpeCB0aGUgZGlzdHJpYnV0aW9uYWwgaXNzdWUgaW4gdGhlIHJlZ3Jlc3Npb24gcmVzaWR1YWxzLgoKIyMgU3R1ZGVudCBMZWFybmluZyBTdHlsZXMgUENBCgpgYGB7cn0KTXkucGxvdG5TY3JlZShtYXQ9TGVhcm5TdHlsZSwgbGVnZW5kID0gVFJVRSwgbWV0aG9kID0iY29tcG9uZW50cyIsIAogICAgICAgICAgICAgIG1haW49IkRldGVybWluYXRpb24gb2YgTnVtYmVyIG9mIENvbXBvbmVudHNcbiBMZWFybmluZyBTdHlsZSAoUG9zaXRpdmUpIikKCmBgYAoKV2Ugc2VlIGZyb20gdGhlIGFib3ZlIHBsb3QgdGhhdCBpdCBzdWdnZXN0cyB0byB1c2Ugb25lIHByaW5jaXBhbCBjb21wb25lbnQuCgpgYGB7cn0KTG9hZGluZ3MgPSBNeS5sb2FkaW5ncy52YXIobWF0PUxlYXJuU3R5bGUsIG5mY3Q9MSwgbWV0aG9kPSJwY2EiKSRMb2FkaW5ncwoKa2FibGUocm91bmQoTG9hZGluZ3MsMyksCiAgICBjYXB0aW9uPSJGYWN0b3IgbG9hZGluZ3Mgb2YgdGhlIGZpcnN0IGZldyBQQ0FzIGFuZCB0aGUgY3VtdWxhdGl2ZQogICAgdGhlIHByb3BvcnRpb24gb2YgdmFyaWF0aW9uIGV4cGxhaW5lZCBieSB0aGUgY29ycmVzcG9uZGluZyBQQ0FzIGluIHRoZSAKICAgIExlYXJuaW5nIFN0eWxlIFF1ZXN0aW9uYWlyZSBTdXJ2ZXkuIikKCmBgYAoKCmBgYHtyfQpWYXJQcm9wID0gTXkubG9hZGluZ3MudmFyKG1hdD1MZWFyblN0eWxlLCBuZmN0PTEsIG1ldGhvZD0icGNhIikkUHJvcC5WYXIKCmthYmxlKHJvdW5kKFZhclByb3AsMyksCiAgICBjYXB0aW9uPSJDdW11bGF0aXZlIGFuZCBwcm9wb3J0aW9uIG9mIHZhcmlhbmNlcyBleHBsYWluZWQgYnkgZWFjaCAKICAgIHRoZSBwcmluY2lwYWwgY29tcG9uZW50IGluIHRoZSBMZWFybmluZyBTdHlsZSBzdXJ2ZXkuIikKCmBgYAoKVGhlIFBDQSBoYXMgYSBsYXJnZXIgYW1vdW50IG9mIHByb3BvcnRpb24gb2YgdmFyaWFuY2UgYXQgYXJvdW5kIDU5JS4KCmBgYHtyfQpwY2EgPC0gcHJjb21wKExlYXJuU3R5bGUsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKbGVhLmlkeCA9IHBjYSR4WywxXQoKCmhpc3QobGVhLmlkeCwKbWFpbj0iRGlzdHJpYnV0aW9uIG9mIExlYXJuaW5nIFN0eWxlIEluZGV4IiwKYnJlYWtzID0gc2VxKG1pbihsZWEuaWR4KSwgbWF4KGxlYS5pZHgpLCBsZW5ndGg9OSksCnhsYWI9IkxlYXJuaW5nIFN0eWxlIEluZGV4IiwKeGxpbT1yYW5nZShsZWEuaWR4KSwKYm9yZGVyPSJyZWQiLApjb2w9ImxpZ2h0Ymx1ZSIsCmZyZXE9RkFMU0UKKQoKYGBgCgpUaGUgcGxvdCBhYm92ZSBzaG93cyB0aGF0IG91ciBkaXN0cmlidXRpb24gYXBwZWFycyB0byBiZSBza2V3ZWQgdG8gdGhlIHJpZ2h0LiBXZSB3aWxsIG5lZWQgZnVydGhlciBhbmFseXNpcyB0byBzZWUgaWYgd2UgbmVlZCB0byBwZXJmb3JtIGEgYm94IGNveCB0cmFuc2Zvcm1hdGlvbiB0byBmaXggdGhlIGRpc3RyaWJ1dGlvbmFsIGlzc3VlIGluIHRoZSByZWdyZXNzaW9uIHJlc2lkdWFscy4KCiMjIFdyaXRpbmcgYW5kIFJlYWRpbmcgTG9hZCBQQ0EKCmBgYHtyfQpNeS5wbG90blNjcmVlKG1hdD1XcmlSZWFkLCBsZWdlbmQgPSBUUlVFLCBtZXRob2QgPSJjb21wb25lbnRzIiwgCiAgICAgICAgICAgICAgbWFpbj0iRGV0ZXJtaW5hdGlvbiBvZiBOdW1iZXIgb2YgQ29tcG9uZW50c1xuIFdyaXRpbmcgYW5kIFJlYWRpbmcgKFBvc2l0aXZlKSIpCgpgYGAKCldlIHNlZSBmcm9tIHRoZSBhYm92ZSBwbG90IHRoYXQgaXQgc3VnZ2VzdHMgdG8gdXNlIG9uZSBwcmluY2lwYWwgY29tcG9uZW50LiAKCmBgYHtyfQpMb2FkaW5ncyA9IE15LmxvYWRpbmdzLnZhcihtYXQ9V3JpUmVhZCwgbmZjdD0xLCBtZXRob2Q9InBjYSIpJExvYWRpbmdzCgprYWJsZShyb3VuZChMb2FkaW5ncywzKSwKICAgIGNhcHRpb249IkZhY3RvciBsb2FkaW5ncyBvZiB0aGUgZmlyc3QgZmV3IFBDQXMgYW5kIHRoZSBjdW11bGF0aXZlCiAgICB0aGUgcHJvcG9ydGlvbiBvZiB2YXJpYXRpb24gZXhwbGFpbmVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIFBDQXMgaW4gdGhlIAogICAgV3JpdGluZyBhbmQgUmVhZGluZyBRdWVzdGlvbmFpcmUgU3VydmV5LiIpCgpgYGAKCgpgYGB7cn0KVmFyUHJvcCA9IE15LmxvYWRpbmdzLnZhcihtYXQ9V3JpUmVhZCwgbmZjdD0xLCBtZXRob2Q9InBjYSIpJFByb3AuVmFyCgprYWJsZShyb3VuZChWYXJQcm9wLDMpLAogICAgY2FwdGlvbj0iQ3VtdWxhdGl2ZSBhbmQgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZXMgZXhwbGFpbmVkIGJ5IGVhY2ggCiAgICB0aGUgcHJpbmNpcGFsIGNvbXBvbmVudCBpbiB0aGUgd3JpdGluZyBhbmQgcmVhZGluZyBzdXJ2ZXkuIikKCmBgYAoKVGhlIFBDQSBnaXZlcyB1cyBhcm91bmQgNDklLgoKYGBge3J9CnBjYSA8LSBwcmNvbXAoV3JpUmVhZCwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKQp3cmkuaWR4ID0gcGNhJHhbLDFdCiMgaGlzdChzYy5pZHgsIGJyZWFrcz0xMCwgbWFpbj0iRGlzdHJpYnV0aW9uIG9mIFNlbGYtY29tcGFzc2lvbiBJbmRleCIpCiMjCmhpc3Qod3JpLmlkeCwKbWFpbj0iRGlzdHJpYnV0aW9uIG9mIFdyaXRpbmcgYW5kIFJlYWRpbmcgSW5kZXgiLApicmVha3MgPSBzZXEobWluKHdyaS5pZHgpLCBtYXgod3JpLmlkeCksIGxlbmd0aD05KSwKeGxhYj0iV3JpdGluZyBhbmQgUmVhZGluZyBJbmRleCIsCnhsaW09cmFuZ2Uod3JpLmlkeCksCmJvcmRlcj0icmVkIiwKY29sPSJsaWdodGJsdWUiLApmcmVxPUZBTFNFCikKCmBgYAoKV2Ugc2VlIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBwbG90IGl0IGlzIHNrZXdlZCB0byB0aGUgcmlnaHQuIFdlIHdpbGwgbmVlZCBmdXJ0aGVyIGFuYWx5c2lzIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHBlcmZvcm0gYSBib3ggY294IHRyYW5zZm9ybWF0aW9uLgoKIyMgUmVtZWRpYWwgRXhwZXJpZW5jZSBQQ0EKCmBgYHtyfQpNeS5wbG90blNjcmVlKG1hdD1SZW1lZCwgbGVnZW5kID0gVFJVRSwgbWV0aG9kID0iY29tcG9uZW50cyIsIAogICAgICAgICAgICAgIG1haW49IkRldGVybWluYXRpb24gb2YgTnVtYmVyIG9mIENvbXBvbmVudHNcbiBSZW1lZGlhbCAoUG9zaXRpdmUpIikKCmBgYAoKV2Ugc2VlIGZyb20gdGhlIGFib3ZlIHBsb3QgdGhhdCBpdCBzdWdnZXN0cyB0byB1c2UgMiBwcmluY2lwbGUgY29tcG9uZW50cyBpbiBvdXIgY29tcG9uZW50IGFuYWx5c2lzLgoKYGBge3J9CkxvYWRpbmdzID0gTXkubG9hZGluZ3MudmFyKG1hdD1SZW1lZCwgbmZjdD0yLCBtZXRob2Q9InBjYSIpJExvYWRpbmdzCiMgcGNhIGxvYWRpbmdzCmthYmxlKHJvdW5kKExvYWRpbmdzLDMpLAogICAgY2FwdGlvbj0iRmFjdG9yIGxvYWRpbmdzIG9mIHRoZSBmaXJzdCBmZXcgUENBcyBhbmQgdGhlIGN1bXVsYXRpdmUKICAgIHRoZSBwcm9wb3J0aW9uIG9mIHZhcmlhdGlvbiBleHBsYWluZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgUENBcyBpbiB0aGUgCiAgICBSZW1lZGlhbCBRdWVzdGlvbmFpcmUgU3VydmV5LiIpCgpgYGAKCgpgYGB7cn0KVmFyUHJvcCA9IE15LmxvYWRpbmdzLnZhcihtYXQ9UmVtZWQsIG5mY3Q9MiwgbWV0aG9kPSJwY2EiKSRQcm9wLlZhcgojIHBjYSBsb2FkaW5ncwprYWJsZShyb3VuZChWYXJQcm9wLDMpLAogICAgY2FwdGlvbj0iQ3VtdWxhdGl2ZSBhbmQgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZXMgZXhwbGFpbmVkIGJ5IGVhY2ggCiAgICB0aGUgcHJpbmNpcGFsIGNvbXBvbmVudCBpbiB0aGUgcmVtZWRpYWwgc3VydmV5LiIpCgpgYGAKClBDQSAxIGhhcyA0Ny41JSBvZiBwcm9wb3J0aW9uIG9mIHZhcmlhbmNlIGNvbXBhcmVkIHRvIG91ciBzZWNvbmQgY29tcG9uZW50IHdoaWNoIG9ubHkgaGFzIDEyLjglLiBXZSB3aWxsIG9ubHkgYmUgdXNpbmcgdGhlIGZpcnN0IHByaW5jaXBsZSBjb21wb25lbnQuIAoKYGBge3J9CnBjYSA8LSBwcmNvbXAoUmVtZWQsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKcmVtLmlkeCA9IHBjYSR4WywxXQojIGhpc3Qoc2MuaWR4LCBicmVha3M9MTAsIG1haW49IkRpc3RyaWJ1dGlvbiBvZiBTZWxmLWNvbXBhc3Npb24gSW5kZXgiKQojIwpoaXN0KHJlbS5pZHgsCm1haW49IkRpc3RyaWJ1dGlvbiBvZiBSZW1lZGlhbCBJbmRleCIsCmJyZWFrcyA9IHNlcShtaW4ocmVtLmlkeCksIG1heChyZW0uaWR4KSwgbGVuZ3RoPTkpLAp4bGFiPSJSZW1lZGlhbCBJbmRleCIsCnhsaW09cmFuZ2UocmVtLmlkeCksCmJvcmRlcj0icmVkIiwKY29sPSJsaWdodGJsdWUiLApmcmVxPUZBTFNFCikKCmBgYAoKVGhlIGRpc3RyaWJ1dGlvbiBpbiB0aGUgdGFibGUgYWJvdmUgaXMgc2tld2VkIHRvIHRoZSBsZWZ0LiBTbyB3ZSB3aWxsIGhhdmUgdG8gcGVyZm9ybSBhIGJveCBjb3ggdHJhbnNmb3JtYXRpb24gdG8gZml4IHRoZSBkaXN0cmlidXRpb25hbCBpc3N1ZS4KCiMjIEVuY291cmFnZW1lbnQgYW5kIFN1cHBvcnQgUENBCgpgYGB7cn0KTXkucGxvdG5TY3JlZShtYXQ9RW5nY25TdXBwLCBsZWdlbmQgPSBUUlVFLCBtZXRob2QgPSJjb21wb25lbnRzIiwgCiAgICAgICAgICAgICAgbWFpbj0iRGV0ZXJtaW5hdGlvbiBvZiBOdW1iZXIgb2YgQ29tcG9uZW50c1xuIEVuY291cmFnZW1lbnQgYW5kIFN1cHBvcnQgKFBvc2l0aXZlKSIpCgpgYGAKCldlIHNlZSBmcm9tIHRoZSBhYm92ZSB0YWJsZSB0aGF0IGl0IHN1Z2dlc3RzIHVzIHRvIHVzZSB0aGUgZmlyc3QgdHdvIHByaW5jaXBsZSBjb21wb25lbnRzLgoKYGBge3J9CkxvYWRpbmdzID0gTXkubG9hZGluZ3MudmFyKG1hdD1FbmdjblN1cHAsIG5mY3Q9MiwgbWV0aG9kPSJwY2EiKSRMb2FkaW5ncwojIHBjYSBsb2FkaW5ncwprYWJsZShyb3VuZChMb2FkaW5ncywzKSwKICAgIGNhcHRpb249IkZhY3RvciBsb2FkaW5ncyBvZiB0aGUgZmlyc3QgZmV3IFBDQXMgYW5kIHRoZSBjdW11bGF0aXZlCiAgICB0aGUgcHJvcG9ydGlvbiBvZiB2YXJpYXRpb24gZXhwbGFpbmVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIFBDQXMgaW4gdGhlIAogICAgRW5jb3VyYWdlbWVudCBhbmQgU3VwcG9ydCBRdWVzdGlvbmFpcmUgU3VydmV5LiIpCgpgYGAKCgpgYGB7cn0KVmFyUHJvcCA9IE15LmxvYWRpbmdzLnZhcihtYXQ9RW5nY25TdXBwLCBuZmN0PTIsIG1ldGhvZD0icGNhIikkUHJvcC5WYXIKIyBwY2EgbG9hZGluZ3MKa2FibGUocm91bmQoVmFyUHJvcCwzKSwKICAgIGNhcHRpb249IkN1bXVsYXRpdmUgYW5kIHByb3BvcnRpb24gb2YgdmFyaWFuY2VzIGV4cGxhaW5lZCBieSBlYWNoIAogICAgdGhlIHByaW5jaXBhbCBjb21wb25lbnQgaW4gdGhlIEVuY291cmFnZW1lbnQgYW5kIFN1cHBvcnQgc3VydmV5LiIpCgpgYGAKCk91ciBmaXJzdCBjb21wb25lbnQgZXhwbGFpbnMgNDglIG9mIHRoZSB0b3RhbCB2YXJpYW5jZSBhbmQgdGhlIHNlY29uZCBjb21wb25lbnQgb25seSBleHBsYWlucyAxNyUgb2YgdGhlIHRvdGFsIHZhcmlhbmNlLiBXZSB3aWxsIG9ubHkgYmUgdXNpbmcgdGhlIGZpcnN0IGNvbXBvbmVudCBpbiBvdXIgYW5hbHlzaXMuCgpgYGB7cn0KcGNhIDwtIHByY29tcChFbmdjblN1cHAsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKZW5jLmlkeCA9IHBjYSR4WywxXQojIGhpc3Qoc2MuaWR4LCBicmVha3M9MTAsIG1haW49IkRpc3RyaWJ1dGlvbiBvZiBTZWxmLWNvbXBhc3Npb24gSW5kZXgiKQojIwpoaXN0KGVuYy5pZHgsCm1haW49IkRpc3RyaWJ1dGlvbiBvZiBFbmNvdXJhZ2VtZW50IGFuZCBTdXBwb3J0IEluZGV4IiwKYnJlYWtzID0gc2VxKG1pbihlbmMuaWR4KSwgbWF4KGVuYy5pZHgpLCBsZW5ndGg9OSksCnhsYWI9IkVuY291cmFnZW1lbnQgYW5kIFN1cHBvcnQgSW5kZXgiLAp4bGltPXJhbmdlKGVuYy5pZHgpLApib3JkZXI9InJlZCIsCmNvbD0ibGlnaHRibHVlIiwKZnJlcT1GQUxTRQopCgpgYGAKCldlIHNlZSBmcm9tIHRoZSBhYm92ZSB0YWJsZSB0aGF0IG91ciBkaXN0cmlidXRpb24gdGFibGUgaXMgYXBwcm94aW1hdGVseSBub3JtYWwuCgojIyBSZXRlbnRpb24gUENBCgpgYGB7cn0KTXkucGxvdG5TY3JlZShtYXQ9UmV0ZW50aW9uLCBsZWdlbmQgPSBUUlVFLCBtZXRob2QgPSJjb21wb25lbnRzIiwgCiAgICAgICAgICAgICAgbWFpbj0iRGV0ZXJtaW5hdGlvbiBvZiBOdW1iZXIgb2YgQ29tcG9uZW50c1xuIFJldGVudGlvbiAoUG9zaXRpdmUpIikKCmBgYAoKV2Ugc2VlIGZyb20gdGhlIGFib3ZlIHRhYmxlIHRoYXQgaXQgc3VnZ2VzdHMgZm9yIHVzIHRvIHVzZSBvbmUgY29tcG9uZW50LgoKYGBge3J9CkxvYWRpbmdzID0gTXkubG9hZGluZ3MudmFyKG1hdD1SZXRlbnRpb24sIG5mY3Q9MSwgbWV0aG9kPSJwY2EiKSRMb2FkaW5ncwojIHBjYSBsb2FkaW5ncwprYWJsZShyb3VuZChMb2FkaW5ncywzKSwKICAgIGNhcHRpb249IkZhY3RvciBsb2FkaW5ncyBvZiB0aGUgZmlyc3QgZmV3IFBDQXMgYW5kIHRoZSBjdW11bGF0aXZlCiAgICB0aGUgcHJvcG9ydGlvbiBvZiB2YXJpYXRpb24gZXhwbGFpbmVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIFBDQXMgaW4gdGhlIAogICAgUmV0ZW50aW9uIFF1ZXN0aW9uYWlyZSBTdXJ2ZXkuIikKCmBgYAoKCmBgYHtyfQpWYXJQcm9wID0gTXkubG9hZGluZ3MudmFyKG1hdD1SZXRlbnRpb24sIG5mY3Q9MSwgbWV0aG9kPSJwY2EiKSRQcm9wLlZhcgojIHBjYSBsb2FkaW5ncwprYWJsZShyb3VuZChWYXJQcm9wLDMpLAogICAgY2FwdGlvbj0iQ3VtdWxhdGl2ZSBhbmQgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZXMgZXhwbGFpbmVkIGJ5IGVhY2ggCiAgICB0aGUgcHJpbmNpcGFsIGNvbXBvbmVudCBpbiB0aGUgUmV0ZW50aW9uIHN1cnZleS4iKQoKYGBgCgpUaGUgZmlyc3QgUEMgZXhwbGFpbnMgNjclIG9mIG91ciB0b3RhbCB2YXJpYW5jZS4KCmBgYHtyfQpwY2EgPC0gcHJjb21wKFJldGVudGlvbiwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKQpyZXQuaWR4ID0gcGNhJHhbLDFdCiMgaGlzdChzYy5pZHgsIGJyZWFrcz0xMCwgbWFpbj0iRGlzdHJpYnV0aW9uIG9mIFNlbGYtY29tcGFzc2lvbiBJbmRleCIpCiMjCmhpc3QocmV0LmlkeCwKbWFpbj0iRGlzdHJpYnV0aW9uIG9mIFJldGVudGlvbiBJbmRleCIsCmJyZWFrcyA9IHNlcShtaW4ocmV0LmlkeCksIG1heChyZXQuaWR4KSwgbGVuZ3RoPTkpLAp4bGFiPSJSZXRlbnRpb24gSW5kZXgiLAp4bGltPXJhbmdlKHJldC5pZHgpLApib3JkZXI9InJlZCIsCmNvbD0ibGlnaHRibHVlIiwKZnJlcT1GQUxTRQopCgpgYGAKCldlIHNlZSBjYW4gc2VlIHRoYXQgb3VyIHBsb3QgaXMgc2tld2VkIHRvIHRoZSByaWdodCBzbyB3ZSBtaWdodCBuZWVkIHRvIHBlcmZvcm0gYSBib3ggY294IHRyYW5zZm9ybWF0aW9uLiBBbHNvLCBmdXJ0aGVyIGFuYWx5c2lzIGlzIG5lZWRlZC4KCiMjIEhvdyBTdHVkZW50cyBQYXkgZm9yIENvbGxlZ2UgUENBCgpgYGB7cn0KTXkucGxvdG5TY3JlZShtYXQ9b3V0c2lkZV9hc3Npc3RhbmNlLCBsZWdlbmQgPSBUUlVFLCBtZXRob2QgPSJjb21wb25lbnRzIiwgCiAgICAgICAgICAgICAgbWFpbj0iRGV0ZXJtaW5hdGlvbiBvZiBOdW1iZXIgb2YgQ29tcG9uZW50c1xuIFBheSAoUG9zaXRpdmUpIikKCmBgYAoKV2Ugc2VlIGZyb20gdGhlIHBsb3QgYWJvdmUgdGhhdCBpdCBzdWdnZXN0cyB0byB1c2Ugb24gUEMuCgpgYGB7cn0KTG9hZGluZ3MgPSBNeS5sb2FkaW5ncy52YXIobWF0PW91dHNpZGVfYXNzaXN0YW5jZSwgbmZjdD0xLCBtZXRob2Q9InBjYSIpJExvYWRpbmdzCiMgcGNhIGxvYWRpbmdzCmthYmxlKHJvdW5kKExvYWRpbmdzLDMpLAogICAgY2FwdGlvbj0iRmFjdG9yIGxvYWRpbmdzIG9mIHRoZSBmaXJzdCBmZXcgUENBcyBhbmQgdGhlIGN1bXVsYXRpdmUKICAgIHRoZSBwcm9wb3J0aW9uIG9mIHZhcmlhdGlvbiBleHBsYWluZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgUENBcyBpbiB0aGUgCiAgICBQYXkgUXVlc3Rpb25haXJlIFN1cnZleS4iKQoKYGBgCgoKYGBge3J9ClZhclByb3AgPSBNeS5sb2FkaW5ncy52YXIobWF0PW91dHNpZGVfYXNzaXN0YW5jZSwgbmZjdD0xLCBtZXRob2Q9InBjYSIpJFByb3AuVmFyCiMgcGNhIGxvYWRpbmdzCmthYmxlKHJvdW5kKFZhclByb3AsMyksCiAgICBjYXB0aW9uPSJDdW11bGF0aXZlIGFuZCBwcm9wb3J0aW9uIG9mIHZhcmlhbmNlcyBleHBsYWluZWQgYnkgZWFjaCAKICAgIHRoZSBwcmluY2lwYWwgY29tcG9uZW50IGluIHRoZSBwYXkgc3VydmV5LiIpCgpgYGAKClRoZSBQQyBpcyA0OC40JSBvZiB0aGUgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZS4KCmBgYHtyfQpwY2EgPC0gcHJjb21wKG91dHNpZGVfYXNzaXN0YW5jZSwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKQpwYXkuaWR4ID0gcGNhJHhbLDFdCiMgaGlzdChzYy5pZHgsIGJyZWFrcz0xMCwgbWFpbj0iRGlzdHJpYnV0aW9uIG9mIFNlbGYtY29tcGFzc2lvbiBJbmRleCIpCiMjCmhpc3QocGF5LmlkeCwKbWFpbj0iRGlzdHJpYnV0aW9uIG9mIFBheSBJbmRleCIsCmJyZWFrcyA9IHNlcShtaW4ocGF5LmlkeCksIG1heChwYXkuaWR4KSwgbGVuZ3RoPTkpLAp4bGFiPSJQYXkgSW5kZXgiLAp4bGltPXJhbmdlKHBheS5pZHgpLApib3JkZXI9InJlZCIsCmNvbD0ibGlnaHRibHVlIiwKZnJlcT1GQUxTRQopCgpgYGAKCldlIHNlZSBmcm9tIHRoZSBncmFwaCBhYm92ZSB0aGF0IGl0IGlzIHNrZXdlZCB0byB0aGUgcmlnaHQuIFdlIHdpbGwgbmVlZCB0byBwZXJmb3JtIGEgYm94IGNveCB0cmFuc2Zvcm1hdGlvbiB0byBmaXggdGhlIGRpc3RyaWJ1dGlvbmFsIGlzc3VlLgoKCiMgUHJvamVjdCBRdWVzdGlvbnMKCjEuIEhvdyB3ZWxsIGRvZXMgc3R1ZGVudCBlbmdhZ2VtZW50IGluIGluc2lkZSBhbmQgb3V0c2lkZSB0aGUgY2xhc3Nyb29tIHByZWRpY3QgdGhlaXIgb3ZlcmFsbCBzYXRpc2ZhY3Rpb24gd2l0aCB0aGVpciBjb2xsZWdlIGV4cGVyaWVuY2U/CgoyLiBEb2VzIGhvdyB0aGUgc3R1ZGVudCBwYXlzIGZvciBzY2hvb2wgY29ycmVsYXRlIHdpdGggdGhlIHN0dWRlbnRzIGVuZ2FnZW1lbnQgaW4gc2Nob29sPwoKTXkgZmlyc3QgcXVlc3Rpb24gbG9va3MgYXQgdGhlIGlkZWEgdGhhdCBzdHVkZW50cyB3aG8gYXJlIG1vcmUgYWN0aXZlbHkgZW5nYWdlZCBpbiB0aGVpciBsZWFybmluZyBtYXkgZmVlbCBtb3JlIGFmZmlsaWF0ZWQgaW4gdGhlaXIgYWNhZGVtaWMgZXhwZXJpZW5jZS4gVGhlIHN1cnZleSBkYXRhIHRoYXQgd2FzIHByb3ZpZGVkIHRvIHVzIHNob3dzIGEgbG90IG9mIGRldGFpbCBvbiBzdHVkZW50IGVuZ2FnZW1lbnQgdGhyb3VnaCB0aGUgMjEgcXVlc3Rpb25zIChTZWN0aW9uIDQpIGdpdmVuLCBtYWtpbmcgaXQgYSBzdHJvbmcgY2FuZGlkYXRlIGZvciBnaXZpbmcgdXMgZW5vdWdoIHZhcmlhYmxlcyByZXByZXNlbnRpbmcgZW5nYWdlbWVudC4gCgpUaGUgc2Vjb25kIHF1ZXN0aW9uIGlzIGZyb20gdGhlIGFzc3VtcHRpb24gaWYgdGhlIHN0dWRlbnQgcGF5cyBmb3IgdGhlaXIgY29sbGVnZSB0aGFuIHRoZXkgd291bGQgYmUgbW9yZSBsaWtlbHkgdG8gYmUgbW9yZSBlbmdhZ2VkIGluIHRoZWlyIGxlYXJuaW5nLiBMb29raW5nIGF0IHRoZXNlIHR3byB0b2dldGhlciBjYW4gb2ZmZXIgbWVhbmluZ2Z1bCBpbnNpZ2h0IGludG8gaG93IG11Y2ggYSBzdHVkZW50IHdpbGwgYmUgZW5nYWdlZCBiYXNlZCBvZmYgaWYgdGhleSBwYXllZCBmb3IgdGhlaXIgc2Nob29sIG9yIGlmIHNvbWVvbmUgZWxzZSBkaWQuCgoKCg==