Introduction
According to Wikipedia, Educational inequality refers to unequal access to education, and the unequal outcomes for students that result. Educational inequality in the United States is one of the worst world-wide. Educational inequality, like most other nationwide problems, is the result of government policies, socio-economic status of families, implicit bias towards race or ethnicity of the student, and resources available to students via their school. There are several more factors that widen the gap in education, however, a few of them will be discussed in the following paragraphs. After a discussion of these factors, educational inequality will be examined via exploratory data analysis (EDA) in two states that lie directly opposite each other on the educational equality scale according to US News (usnews.com) rankings for education: Alabama and Massachusetts.
Factors affecting Educational Inequality
Race
Race is often a big contributing factor to educational inequality; Race influences teacher’s expectations thus achievement results. A 2016 study showed that non-black teachers expected less from Black students than Black teachers who evaluated the same student. Teacher expectations, according to previous students, have shown that students whose teachers trust in their capabilities often do better. More importantly, minority students often don’t have access to high-quality teachers which directly affects their performance over time.
Socioeconomic Status
Also, a family’s socioeconomic status is a strong determinant of a child’s education; the parent’s level of education, jobs, and income directly influence the difficulty children will experience in school. This creates a learning gap between students from higher socioeconomic backgrounds and those from lower socioeconomic backgrounds. One of the datasets to be analyzed includes a measure of students’ socioeconomic situation, the estimated student population (ages 5–17) in poverty.
White Supremacy
Several scholars have argued that school curricula still promote white supremacy. In textbooks, most, if not all, achievements are often associated with European/white personalities. Such biased frameworks, in addition to biased treatment from white teachers, often condition minority students subconsciously that they are not able to achieve greater things on their own. More often, stories narrated in textbooks about slavery do so in ways that empathize with whites rather than the abused slaves; textbooks include discussions of slave revolts in terms of the damage caused to white people instead of the need of enslaved people to overthrow slavery. Such narrations enforce the wrong idea that black people, whenever they rise up against oppression, are naturally destructive. For minority children, the effect of such narrations in a class setting causes unnecessary anxiety and slows down effective learning. White supremacy is difficult to measure and assess statistically therefore it will not be explored further in this paper as well.
Efforts to mitigate Educational Inequality
Some programs have been put in place to resolve the educational gap in the US. Early intervention programs, programs that aim to support and educate very young children (up to six years old) who have been victims of, or at high risk of abuse or neglect as well as children with developmental delays or disabilities. Notable early intervention programs are the Perry Preschool Project in Michigan, and the Abecedarian Project in North Carolina. Early intervention was found to improve the likelihood of participating children performing better on average in reading and math assessments than children who did not participate in these programs.
The role of funding in Educational (In)equality
School funding also has a significant role to play in educational inequality. In the US, public schools provide basic education free of charge from kindergarten until the twelfth grade. These schools run on money provided by the federal government via taxes. Funding determines the quality of facilities available to students in a particular school. In the US, there is a significant funding gap between low-income and high-income schools. Many studies have found that states are spending less money on students from low-income communities than they are on students from high-income communities. Note that per student spending is significantly higher in the US than in many other countries. The main issue lies in how and where funding is allocated to. In this paper, educational inequality will also be examined through the lens of funding. Insights from the general analysis may provide useful information on how to bridge the gap in educational inequality. To do this, the following research questions will be answered via statistical analysis:
- Q1. What is the poverty rate distribution amongst 5-17 year old students like in schools from both states?
- Q2. How has total government expenditure changed in both states over time?
- Q3. What is the average government expenditure per student in AL and MA?
- Q4. What is the full-time staff per student distribution over both states?
- Q5. How do Math and English assessment scores compare in schools across both states on average?
- Q6. What is the distribution for assessment scores based on race like for both states over time?
- Q7. Is there a linear relationship between poverty rates and performance?
Most of these questions can be answered via EDA analysis and/or inferential tests to validate differences between the groups in question. This analysis will make use of datasets collected from federal databases but compiled by the Urban Institute Education Data explorer
Method
The EDA presented in this paper makes use of 3 datasets. The major challenge was cross-referencing and merging both datasets for comprehensive analysis.
Results
Q1. What is the poverty rate distribution amongst 5-17 year old students like in schools from both states?
From the plots, the modal poverty rate for Alabama is about 30% while the modal poverty rate for Massachusetts is consistently less than 10% from 2014 to 2018.

Q2. How has total government expenditure changed in both states over time?
Massachusetts consistently spends more than Alabama on education. It is important to also note that the gap in spending between both states widens significantly over time. 
Q3. What is the average government expenditure per student in AL and MA?
The per student spending for Alabama is a little below $9,000 while the value is greater than $14,000 for Massachusetts.
Q4. What is the Student to Fulltime staff distribution over both states?
Here, fulltime staff include the following: * Teachers (elementary, secondary, pre-KG, KG) * Coordinators * Guidance counselors (elementary, secondary, pre-KG, KG) * School administrators
Q5. How do Math and English assessment scores compare in schools across both states on average?
Math scores have been better at Massachusetts from 2014 to 2018 than they were at Alabama over the past 4 years although MA’s scores dip while AL’s score increases.

Q6. What is the distribution for assessment scores based on race like for both states over time?
Most minorities perform less in both maths and reading. The performance of white students, however, is second to that of Asians. This finding is consistent with both states. More data is needed to assess why this might be the case. Although racism and white supremacy are factors influencing this gap, there is not enough data (in this paper) to quantify these claims.


Discussion
It appears counter-intuitive that despite Massachusetts’ consistently increasing expenses, Alabama appears to catch up with them in terms of performance. We would expect that the increase in expenditure would correlate to an increase in the quality of education hence an increase in student performance. This means that other factors are at play (like how much is allocated to employee benefits, the educational profiles of teachers in each state) hence more analysis is required before any conclusions can be drawn.
Limitations of the conclusions drawn
Data for certain parameters are missing for certain years making it difficult for an analysis over a consistent timeline of all questions posed in this paper. Data on employee benefits at school districts is hard to obtain in a usable format for data analysis (based on my search), therefore the range of my conclusions ended up smaller than I had planned.
Ideas for future analysis
Further analysis on these questions promises to reveal more insights about the inequality gap between AL and MA, and possibly help inform decision-making by school districts.
- What is the average government expenditure per student distribution in high poverty schools vs low poverty schools?
- Spending on pupil support services in high poverty schools vs low poverty schools.
- What is the racial/ethnic distribution of the school-age population in poverty in both states?
- What employee benefits are available in high and low poverty schools? What benefits are specific to a particular state? Do these benefits affect full-time staff rates or other measures?
LS0tCnRpdGxlOiAiQW4gRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcyBvbiBFZHVjYXRpb25hbCBJbmVxdWFsaXR5IGJldHdlZW4gTWFzc2FjaHVzZXR0cyBhbmQgQWxhYmFtYSIKYXV0aG9yOiAiQW5pa3VhYmUgTmFuYSIKc3VidGl0bGU6IFN0YXQwNDEgRmluYWwgUHJvamVjdApvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDogCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgaGlnaGxpZ2h0OiBweWdtZW50cwpmb250c2l6ZTogMTFwdApnZW9tZXRyeTogbWFyZ2luPTFpbgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKZGlzdHJpY3RzX2RhdGEgPC0gcmVhZF9jc3YoJy4vZGlzdHJpY3RzLWRhdGEuY3N2JykgJT4lIG11dGF0ZSh5ZWFyID0gYXMubnVtZXJpYyh5ZWFyKSkKbGlicmFyeShnZ3RoZW1lcykKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dhbmltYXRlKQpsaWJyYXJ5KHBsb3RseSkKYGBgCiMgSW50cm9kdWN0aW9uCgpBY2NvcmRpbmcgdG8gV2lraXBlZGlhLCBFZHVjYXRpb25hbCBpbmVxdWFsaXR5IHJlZmVycyB0byB1bmVxdWFsIGFjY2VzcyB0byBlZHVjYXRpb24sIGFuZCB0aGUgdW5lcXVhbCBvdXRjb21lcyBmb3Igc3R1ZGVudHMgdGhhdCByZXN1bHQuIEVkdWNhdGlvbmFsIGluZXF1YWxpdHkgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgaXMgb25lIG9mIHRoZSB3b3JzdCB3b3JsZC13aWRlLiBFZHVjYXRpb25hbCBpbmVxdWFsaXR5LCBsaWtlIG1vc3Qgb3RoZXIgbmF0aW9ud2lkZSBwcm9ibGVtcywgaXMgdGhlIHJlc3VsdCBvZiBnb3Zlcm5tZW50IHBvbGljaWVzLCBzb2Npby1lY29ub21pYyBzdGF0dXMgb2YgZmFtaWxpZXMsIGltcGxpY2l0IGJpYXMgdG93YXJkcyByYWNlIG9yIGV0aG5pY2l0eSBvZiB0aGUgc3R1ZGVudCwgYW5kIHJlc291cmNlcyBhdmFpbGFibGUgdG8gc3R1ZGVudHMgdmlhIHRoZWlyIHNjaG9vbC4gVGhlcmUgYXJlIHNldmVyYWwgbW9yZSBmYWN0b3JzIHRoYXQgd2lkZW4gdGhlIGdhcCBpbiBlZHVjYXRpb24sIGhvd2V2ZXIsIGEgZmV3IG9mIHRoZW0gd2lsbCBiZSBkaXNjdXNzZWQgaW4gdGhlIGZvbGxvd2luZyBwYXJhZ3JhcGhzLiBBZnRlciBhIGRpc2N1c3Npb24gb2YgdGhlc2UgZmFjdG9ycywgZWR1Y2F0aW9uYWwgaW5lcXVhbGl0eSB3aWxsIGJlIGV4YW1pbmVkIHZpYSBleHBsb3JhdG9yeSBkYXRhIGFuYWx5c2lzIChFREEpIGluIHR3byBzdGF0ZXMgdGhhdCBsaWUgZGlyZWN0bHkgb3Bwb3NpdGUgZWFjaCBvdGhlciBvbiB0aGUgZWR1Y2F0aW9uYWwgZXF1YWxpdHkgc2NhbGUgYWNjb3JkaW5nIHRvIFVTIE5ld3MgKHVzbmV3cy5jb20pIHJhbmtpbmdzIGZvciBlZHVjYXRpb246IEFsYWJhbWEgYW5kIE1hc3NhY2h1c2V0dHMuCgojIyBGYWN0b3JzIGFmZmVjdGluZyBFZHVjYXRpb25hbCBJbmVxdWFsaXR5CiMjIyBSYWNlClJhY2UgaXMgb2Z0ZW4gYSBiaWcgY29udHJpYnV0aW5nIGZhY3RvciB0byBlZHVjYXRpb25hbCBpbmVxdWFsaXR5OyBSYWNlIGluZmx1ZW5jZXMgdGVhY2hlcidzIGV4cGVjdGF0aW9ucyB0aHVzIGFjaGlldmVtZW50IHJlc3VsdHMuIEEgMjAxNiBzdHVkeSBzaG93ZWQgdGhhdCBub24tYmxhY2sgdGVhY2hlcnMgZXhwZWN0ZWQgbGVzcyBmcm9tIEJsYWNrIHN0dWRlbnRzIHRoYW4gQmxhY2sgdGVhY2hlcnMgd2hvIGV2YWx1YXRlZCB0aGUgc2FtZSBzdHVkZW50LiBUZWFjaGVyIGV4cGVjdGF0aW9ucywgYWNjb3JkaW5nIHRvIHByZXZpb3VzIHN0dWRlbnRzLCBoYXZlIHNob3duIHRoYXQgc3R1ZGVudHMgd2hvc2UgdGVhY2hlcnMgdHJ1c3QgaW4gdGhlaXIgY2FwYWJpbGl0aWVzIG9mdGVuIGRvIGJldHRlci4gTW9yZSBpbXBvcnRhbnRseSwgbWlub3JpdHkgc3R1ZGVudHMgb2Z0ZW4gZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gaGlnaC1xdWFsaXR5IHRlYWNoZXJzIHdoaWNoIGRpcmVjdGx5IGFmZmVjdHMgdGhlaXIgcGVyZm9ybWFuY2Ugb3ZlciB0aW1lLiAKCiMjIyBTb2Npb2Vjb25vbWljIFN0YXR1cwpBbHNvLCBhIGZhbWlseSdzIHNvY2lvZWNvbm9taWMgc3RhdHVzIGlzIGEgc3Ryb25nIGRldGVybWluYW50IG9mIGEgY2hpbGQncyBlZHVjYXRpb247IHRoZSBwYXJlbnQncyBsZXZlbCBvZiBlZHVjYXRpb24sIGpvYnMsIGFuZCBpbmNvbWUgZGlyZWN0bHkgaW5mbHVlbmNlIHRoZSBkaWZmaWN1bHR5IGNoaWxkcmVuIHdpbGwgZXhwZXJpZW5jZSBpbiBzY2hvb2wuIFRoaXMgY3JlYXRlcyBhIGxlYXJuaW5nIGdhcCBiZXR3ZWVuIHN0dWRlbnRzIGZyb20gaGlnaGVyIHNvY2lvZWNvbm9taWMgYmFja2dyb3VuZHMgYW5kIHRob3NlIGZyb20gbG93ZXIgc29jaW9lY29ub21pYyBiYWNrZ3JvdW5kcy4gT25lIG9mIHRoZSBkYXRhc2V0cyB0byBiZSBhbmFseXplZCBpbmNsdWRlcyBhIG1lYXN1cmUgb2Ygc3R1ZGVudHMnIHNvY2lvZWNvbm9taWMgc2l0dWF0aW9uLCB0aGUgZXN0aW1hdGVkIHN0dWRlbnQgcG9wdWxhdGlvbiAoYWdlcyA14oCTMTcpIGluIHBvdmVydHkuCgojIyMgU2Nob29sIGRpc2NpcGxpbmUgcmVmb3JtClRoZXJlIGV4aXN0cyBhIGRpc2NpcGxpbmUgZ2FwIGJldHdlZW4gc2Nob29scyBpbiB0aGUgVVM7IFJlc2VhcmNoZXJzIGhhdmUgc3VnZ2VzdGVkIHRoYXQgYSBzaGlmdCB0b3dhcmRzIGltcHJvdmluZyB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHN0dWRlbnRzIGFuZCB0ZWFjaGVycyBjYW4gYmVzdCBzdXBwb3J0IG1pbm9yaXR5IHN0dWRlbnRzIGFuZCBwcm92aWRlIGEgZm91bmRhdGlvbiBmcm9tIHdoaWNoIGJldHRlciByZWZvcm1zIGNhbiBiZSBkZXZlbG9wZWQuIFJlc2VhcmNoIGhhcyBhbHNvIHNob3duIHRoYXQgQWZyaWNhbiBBbWVyaWNhbiBzdHVkZW50cyBhcmUgbW9yZSBsaWtlbHkgdG8gYWNjZXB0IHRlYWNoZXJzIHdoZW4gdGhleSBhcmUgdmlld2VkIGFzIGVuZ2FnaW5nIG9yIGludm9sdmVkIGluIGEgc3R1ZGVudCdzIHN1Y2Nlc3MuIFBvc2l0aXZlIGRpc2NpcGxpbmFyeSByZWZvcm1zIGFsc28gaGVscCBkZXN0cm95IHRoZSBwaXBlbGluZSB0aGF0IGRpc3Byb3BvcnRpb25hdGVseSBtb3ZlcyBtaW5vcml0eSBzdHVkZW50cyBpbnRvIHByaXNvbi4gQSBzaGlmdCBmcm9tIHB1bml0aXZlIGRpc2NpcGxpbmUgbGlrZSBzdXNwZW5zaW9ucyBhbmQgb3RoZXIgZm9ybXMgb2YgcHVuaXNobWVudCB0aGF0IGRvIG5vdCB0YWtlIGludG8gYWNjb3VudCBhIHN0dWRlbnQncyBiYWNrZ3JvdW5kIGFsc28gZ29lcyBhIGxvbmcgd2F5IHRvIGltcHJvdmluZyB0aGUgcXVhbGl0eSBvZiBlZHVjYXRpb24gbWlub3JpdHkgc3R1ZGVudHMgcmVjZWl2ZSBpbiBjbGFzc3Jvb21zLiBUaGUgc3RhdGlzdGljYWwgaW1wYWN0L3JlbGF0aW9uc2hpcCBzY2hvb2wgZGlzY2lwbGluZSBoYXMgb24gZWR1Y2F0aW9uYWwgaW5lcXVhbGl0eSB3aWxsIG5vdCBiZSBleHBsb3JlZCBmdXJ0aGVyIGluIHRoaXMgcGFwZXIgYmVjYXVzZSBvZiBhIGxhY2sgb2Ygc3VmZmljaWVudCBkYXRhLgoKIyMjIFdoaXRlIFN1cHJlbWFjeQpTZXZlcmFsIHNjaG9sYXJzIGhhdmUgYXJndWVkIHRoYXQgc2Nob29sIGN1cnJpY3VsYSBzdGlsbCBwcm9tb3RlIHdoaXRlIHN1cHJlbWFjeS4gSW4gdGV4dGJvb2tzLCBtb3N0LCBpZiBub3QgYWxsLCBhY2hpZXZlbWVudHMgYXJlIG9mdGVuIGFzc29jaWF0ZWQgd2l0aCBFdXJvcGVhbi93aGl0ZSBwZXJzb25hbGl0aWVzLiBTdWNoIGJpYXNlZCBmcmFtZXdvcmtzLCBpbiBhZGRpdGlvbiB0byBiaWFzZWQgdHJlYXRtZW50IGZyb20gd2hpdGUgdGVhY2hlcnMsIG9mdGVuIGNvbmRpdGlvbiBtaW5vcml0eSBzdHVkZW50cyBzdWJjb25zY2lvdXNseSB0aGF0IHRoZXkgYXJlIG5vdCBhYmxlIHRvIGFjaGlldmUgZ3JlYXRlciB0aGluZ3Mgb24gdGhlaXIgb3duLiBNb3JlIG9mdGVuLCBzdG9yaWVzIG5hcnJhdGVkIGluIHRleHRib29rcyBhYm91dCBzbGF2ZXJ5IGRvIHNvIGluIHdheXMgdGhhdCBlbXBhdGhpemUgd2l0aCB3aGl0ZXMgcmF0aGVyIHRoYW4gdGhlIGFidXNlZCBzbGF2ZXM7IHRleHRib29rcyBpbmNsdWRlIGRpc2N1c3Npb25zIG9mIHNsYXZlIHJldm9sdHMgaW4gdGVybXMgb2YgdGhlIGRhbWFnZSBjYXVzZWQgdG8gd2hpdGUgcGVvcGxlIGluc3RlYWQgb2YgdGhlIG5lZWQgb2YgZW5zbGF2ZWQgcGVvcGxlIHRvIG92ZXJ0aHJvdyBzbGF2ZXJ5LiBTdWNoIG5hcnJhdGlvbnMgZW5mb3JjZSB0aGUgd3JvbmcgaWRlYSB0aGF0IGJsYWNrIHBlb3BsZSwgd2hlbmV2ZXIgdGhleSByaXNlIHVwIGFnYWluc3Qgb3BwcmVzc2lvbiwgYXJlIG5hdHVyYWxseSBkZXN0cnVjdGl2ZS4gRm9yIG1pbm9yaXR5IGNoaWxkcmVuLCB0aGUgZWZmZWN0IG9mIHN1Y2ggbmFycmF0aW9ucyBpbiBhIGNsYXNzIHNldHRpbmcgY2F1c2VzIHVubmVjZXNzYXJ5IGFueGlldHkgYW5kIHNsb3dzIGRvd24gZWZmZWN0aXZlIGxlYXJuaW5nLiBXaGl0ZSBzdXByZW1hY3kgaXMgZGlmZmljdWx0IHRvIG1lYXN1cmUgYW5kIGFzc2VzcyBzdGF0aXN0aWNhbGx5IHRoZXJlZm9yZSBpdCB3aWxsIG5vdCBiZSBleHBsb3JlZCBmdXJ0aGVyIGluIHRoaXMgcGFwZXIgYXMgd2VsbC4KCgojIyBFZmZvcnRzIHRvIG1pdGlnYXRlIEVkdWNhdGlvbmFsIEluZXF1YWxpdHkKU29tZSBwcm9ncmFtcyBoYXZlIGJlZW4gcHV0IGluIHBsYWNlIHRvIHJlc29sdmUgdGhlIGVkdWNhdGlvbmFsIGdhcCBpbiB0aGUgVVMuIEVhcmx5IGludGVydmVudGlvbiBwcm9ncmFtcywgcHJvZ3JhbXMgdGhhdCBhaW0gdG8gc3VwcG9ydCBhbmQgZWR1Y2F0ZSB2ZXJ5IHlvdW5nIGNoaWxkcmVuICh1cCB0byBzaXggeWVhcnMgb2xkKSB3aG8gaGF2ZSBiZWVuIHZpY3RpbXMgb2YsIG9yIGF0IGhpZ2ggcmlzayBvZiBhYnVzZSBvciBuZWdsZWN0IGFzIHdlbGwgYXMgY2hpbGRyZW4gd2l0aCBkZXZlbG9wbWVudGFsIGRlbGF5cyBvciBkaXNhYmlsaXRpZXMuIE5vdGFibGUgZWFybHkgaW50ZXJ2ZW50aW9uIHByb2dyYW1zIGFyZSB0aGUgUGVycnkgUHJlc2Nob29sIFByb2plY3QgaW4gTWljaGlnYW4sIGFuZCB0aGUgQWJlY2VkYXJpYW4gUHJvamVjdCBpbiBOb3J0aCBDYXJvbGluYS4gRWFybHkgaW50ZXJ2ZW50aW9uIHdhcyBmb3VuZCB0byBpbXByb3ZlIHRoZSBsaWtlbGlob29kIG9mIHBhcnRpY2lwYXRpbmcgY2hpbGRyZW4gcGVyZm9ybWluZyBiZXR0ZXIgb24gYXZlcmFnZSBpbiByZWFkaW5nIGFuZCBtYXRoIGFzc2Vzc21lbnRzIHRoYW4gY2hpbGRyZW4gd2hvIGRpZCBub3QgcGFydGljaXBhdGUgaW4gdGhlc2UgcHJvZ3JhbXMuIAoKIyMgVGhlIHJvbGUgb2YgZnVuZGluZyBpbiBFZHVjYXRpb25hbCAoSW4pZXF1YWxpdHkKU2Nob29sIGZ1bmRpbmcgYWxzbyBoYXMgYSBzaWduaWZpY2FudCByb2xlIHRvIHBsYXkgaW4gZWR1Y2F0aW9uYWwgaW5lcXVhbGl0eS4gSW4gdGhlIFVTLCBwdWJsaWMgc2Nob29scyBwcm92aWRlIGJhc2ljIGVkdWNhdGlvbiBmcmVlIG9mIGNoYXJnZSBmcm9tIGtpbmRlcmdhcnRlbiB1bnRpbCB0aGUgdHdlbGZ0aCBncmFkZS4gVGhlc2Ugc2Nob29scyBydW4gb24gbW9uZXkgcHJvdmlkZWQgYnkgdGhlIGZlZGVyYWwgZ292ZXJubWVudCB2aWEgdGF4ZXMuIEZ1bmRpbmcgZGV0ZXJtaW5lcyB0aGUgcXVhbGl0eSBvZiBmYWNpbGl0aWVzIGF2YWlsYWJsZSB0byBzdHVkZW50cyBpbiBhIHBhcnRpY3VsYXIgc2Nob29sLiBJbiB0aGUgVVMsIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZnVuZGluZyBnYXAgYmV0d2VlbiBsb3ctaW5jb21lIGFuZCBoaWdoLWluY29tZSBzY2hvb2xzLiBNYW55IHN0dWRpZXMgaGF2ZSBmb3VuZCB0aGF0IHN0YXRlcyBhcmUgc3BlbmRpbmcgbGVzcyBtb25leSBvbiBzdHVkZW50cyBmcm9tIGxvdy1pbmNvbWUgY29tbXVuaXRpZXMgdGhhbiB0aGV5IGFyZSBvbiBzdHVkZW50cyBmcm9tIGhpZ2gtaW5jb21lIGNvbW11bml0aWVzLiBOb3RlIHRoYXQgcGVyIHN0dWRlbnQgc3BlbmRpbmcgaXMgc2lnbmlmaWNhbnRseSBoaWdoZXIgaW4gdGhlIFVTIHRoYW4gaW4gbWFueSBvdGhlciBjb3VudHJpZXMuIFRoZSBtYWluIGlzc3VlIGxpZXMgaW4gaG93IGFuZCB3aGVyZSBmdW5kaW5nIGlzIGFsbG9jYXRlZCB0by4gSW4gdGhpcyBwYXBlciwgZWR1Y2F0aW9uYWwgaW5lcXVhbGl0eSB3aWxsIGFsc28gYmUgZXhhbWluZWQgdGhyb3VnaCB0aGUgbGVucyBvZiBmdW5kaW5nLiBJbnNpZ2h0cyBmcm9tIHRoZSBnZW5lcmFsIGFuYWx5c2lzIG1heSBwcm92aWRlIHVzZWZ1bCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gYnJpZGdlIHRoZSBnYXAgaW4gZWR1Y2F0aW9uYWwgaW5lcXVhbGl0eS4gVG8gZG8gdGhpcywgdGhlIGZvbGxvd2luZyByZXNlYXJjaCBxdWVzdGlvbnMgd2lsbCBiZSBhbnN3ZXJlZCB2aWEgc3RhdGlzdGljYWwgYW5hbHlzaXM6CgoqIFExLiBXaGF0IGlzIHRoZSBwb3ZlcnR5IHJhdGUgZGlzdHJpYnV0aW9uIGFtb25nc3QgNS0xNyB5ZWFyIG9sZCBzdHVkZW50cyBsaWtlIGluIHNjaG9vbHMgZnJvbSBib3RoIHN0YXRlcz8gCiogUTIuIEhvdyBoYXMgdG90YWwgZ292ZXJubWVudCBleHBlbmRpdHVyZSBjaGFuZ2VkIGluIGJvdGggc3RhdGVzIG92ZXIgdGltZT8gCiogUTMuIFdoYXQgaXMgdGhlIGF2ZXJhZ2UgZ292ZXJubWVudCBleHBlbmRpdHVyZSBwZXIgc3R1ZGVudCBpbiBBTCBhbmQgTUE/CiogUTQuIFdoYXQgaXMgdGhlIGZ1bGwtdGltZSBzdGFmZiBwZXIgc3R1ZGVudCBkaXN0cmlidXRpb24gb3ZlciBib3RoIHN0YXRlcz8gCiogUTUuIEhvdyBkbyBNYXRoIGFuZCBFbmdsaXNoIGFzc2Vzc21lbnQgc2NvcmVzIGNvbXBhcmUgaW4gc2Nob29scyBhY3Jvc3MgYm90aCBzdGF0ZXMgb24gYXZlcmFnZT8gCiogUTYuIFdoYXQgaXMgdGhlIGRpc3RyaWJ1dGlvbiBmb3IgYXNzZXNzbWVudCBzY29yZXMgYmFzZWQgb24gcmFjZSBsaWtlIGZvciBib3RoIHN0YXRlcyBvdmVyIHRpbWU/CiogUTcuIElzIHRoZXJlIGEgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBvdmVydHkgcmF0ZXMgYW5kIHBlcmZvcm1hbmNlPwoKTW9zdCBvZiB0aGVzZSBxdWVzdGlvbnMgY2FuIGJlIGFuc3dlcmVkIHZpYSBFREEgYW5hbHlzaXMgYW5kL29yIGluZmVyZW50aWFsIHRlc3RzIHRvIHZhbGlkYXRlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGdyb3VwcyBpbiBxdWVzdGlvbi4gVGhpcyBhbmFseXNpcyB3aWxsIG1ha2UgdXNlIG9mIGRhdGFzZXRzIGNvbGxlY3RlZCBmcm9tIGZlZGVyYWwgZGF0YWJhc2VzIGJ1dCBjb21waWxlZCBieSB0aGUgW1VyYmFuIEluc3RpdHV0ZSBFZHVjYXRpb24gRGF0YSBleHBsb3Jlcl0oaHR0cHM6Ly9lZHVjYXRpb25kYXRhLnVyYmFuLm9yZy9kYXRhLWV4cGxvcmVyL3NjaG9vbC1kaXN0cmljdHMvKSAKCiMgTWV0aG9kClRoZSBFREEgcHJlc2VudGVkIGluIHRoaXMgcGFwZXIgbWFrZXMgdXNlIG9mIDMgZGF0YXNldHMuIFRoZSBtYWpvciBjaGFsbGVuZ2Ugd2FzIGNyb3NzLXJlZmVyZW5jaW5nIGFuZCBtZXJnaW5nIGJvdGggZGF0YXNldHMgZm9yIGNvbXByZWhlbnNpdmUgYW5hbHlzaXMuIAoKIyBSZXN1bHRzCgojIyBRMS4gV2hhdCBpcyB0aGUgcG92ZXJ0eSByYXRlIGRpc3RyaWJ1dGlvbiBhbW9uZ3N0IDUtMTcgeWVhciBvbGQgc3R1ZGVudHMgbGlrZSBpbiBzY2hvb2xzIGZyb20gYm90aCBzdGF0ZXM/IAoKRnJvbSB0aGUgcGxvdHMsIHRoZSBtb2RhbCBwb3ZlcnR5IHJhdGUgZm9yIEFsYWJhbWEgaXMgYWJvdXQgMzAlIHdoaWxlIHRoZSBtb2RhbCBwb3ZlcnR5IHJhdGUgZm9yIE1hc3NhY2h1c2V0dHMgaXMgY29uc2lzdGVudGx5IGxlc3MgdGhhbiAxMCUgZnJvbSAyMDE0IHRvIDIwMTguCmBgYHtyIGVkYS0xLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQphYl9kYXRhIDwtIGRpc3RyaWN0c19kYXRhICU+JSBmaWx0ZXIoc3RhdGVfbmFtZSA9PSAnQWxhYmFtYScpCm1hX2RhdGEgPC0gZGlzdHJpY3RzX2RhdGEgJT4lIGZpbHRlcihzdGF0ZV9uYW1lID09ICdNYXNzYWNodXNldHRzJykKYWxfcCA9IGdncGxvdChhYl9kYXRhLGFlcyh4ID0gZXN0X3BvcHVsYXRpb25fNV8xN19wb3ZlcnR5X3BjdCoxMDApKSArIAogIGdlb21faGlzdG9ncmFtKGZpbGwgPSAicmVkIixhbHBoYSA9IC44KSArIAogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIHNjaG9vbC1hZ2UgcG9wdWxhdGlvbiAoYWdlcyA1LTE3KSBpbiBwb3ZlcnR5IGluIEFsYWJhbWEiLCAKICAgICAgIHN1YnRpdGxlID0gIkVhY2ggb2JzZXJ2YXRpb25hbCB1bml0IGlzIGEgc2Nob29sIGRpc3RyaWN0IiwKICAgICAgIHggPSAiJSBvZiBzY2hvb2wtYWdlIHBvcHVsYXRpb24gKGFnZXMgNS0xNykgaW4gcG92ZXJ0eSIpICsgdGhlbWVfbWluaW1hbCgpCgptYV9wID0gZ2dwbG90KG1hX2RhdGEsYWVzKHggPSBlc3RfcG9wdWxhdGlvbl81XzE3X3BvdmVydHlfcGN0KjEwMCkpICsKICBnZW9tX2hpc3RvZ3JhbShmaWxsID0gImRvZGdlcmJsdWUiLGFscGhhID0gLjgpKyAKICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBzY2hvb2wtYWdlIHBvcHVsYXRpb24gKGFnZXMgNS0xNykgaW4gcG92ZXJ0eSBpbiBNYXNzYWNodXNldHRzIiwKICAgICAgIHN1YnRpdGxlID0gIkVhY2ggb2JzZXJ2YXRpb25hbCB1bml0IGlzIGEgc2Nob29sIGRpc3RyaWN0IiwKICAgICAgIHggPSAiJSBvZiBzY2hvb2wtYWdlIHBvcHVsYXRpb24gKGFnZXMgNS0xNykgaW4gcG92ZXJ0eSIpICsgdGhlbWVfbWluaW1hbCgpCgphbmltXzEgPSBtYV9wICsgdHJhbnNpdGlvbl90aW1lKHllYXIpICsgbGFicyhzdWJ0aXRsZSA9ICJZZWFyOiB7cm91bmQoZnJhbWVfdGltZSl9IikKYW5pbWF0ZShhbmltXzEsbmZyYW1lcyA9IDEwKQpgYGAKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KYW5pbV8yID0gYWxfcCArIHRyYW5zaXRpb25fdGltZSh5ZWFyKSArIGxhYnMoc3VidGl0bGUgPSAiWWVhcjoge3JvdW5kKGZyYW1lX3RpbWUpfSIpCmFuaW1hdGUoYW5pbV8yLG5mcmFtZXMgPSAxMCkKYGBgCgojIyBRMi4gSG93IGhhcyB0b3RhbCBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlIGNoYW5nZWQgaW4gYm90aCBzdGF0ZXMgb3ZlciB0aW1lPyAKTWFzc2FjaHVzZXR0cyBjb25zaXN0ZW50bHkgc3BlbmRzIG1vcmUgdGhhbiBBbGFiYW1hIG9uIGVkdWNhdGlvbi4gSXQgaXMgaW1wb3J0YW50IHRvIGFsc28gbm90ZSB0aGF0IHRoZSBnYXAgaW4gc3BlbmRpbmcgYmV0d2VlbiBib3RoIHN0YXRlcyB3aWRlbnMgc2lnbmlmaWNhbnRseSBvdmVyIHRpbWUuIApgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojZGF0YXNldCBvbiBlZHVjYXRpb24gZXhwZW5kaXR1cmUKc3RhdGVfZXhwX2RhdGEgPSByZWFkeGw6OnJlYWRfeGxzeCgnZGF0YS54bHN4JykKCiMgY3JlYXRlIG5ldyBjb2x1bW5zIC0geWVhciBhbmQgZXhwZW5kaXR1cmUKcmVzdHJ1Y3R1cmVkX2RhdGEgPSBzdGF0ZV9leHBfZGF0YSAlPiUgcGl2b3RfbG9uZ2VyKCFzdGF0ZSxuYW1lc190bz0ieWVhciIsdmFsdWVzX3RvPSJleHBlbmRpdHVyZSIpICU+JSBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhcikpCgpleHBfcDEgPSByZXN0cnVjdHVyZWRfZGF0YSAlPiUgZmlsdGVyKHN0YXRlID09ICdNYXNzYWNodXNldHRzJyB8IHN0YXRlID09ICdBbGFiYW1hJykgJT4lIGdncGxvdChhZXMoeCA9IGFzLmNoYXJhY3Rlcih5ZWFyKSx5ID1leHBlbmRpdHVyZSwgZ3JvdXAgPSBzdGF0ZSxjb2wgPSBzdGF0ZSkpICsgCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoYygicmVkIiwiZG9kZ2VyYmx1ZSIpKSArCiAgY29vcmRfY2FydGVzaWFuKGNsaXAgPSAnb2ZmJykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgdHJhbnNpdGlvbl9yZXZlYWwoeWVhcikgKwogIGxhYnModGl0bGUgPSAiVG90YWwgZWR1Y2F0aW9uYWwgZXhwZW5kaXR1cmUgaW4gQWwgYW5kIE1BIGZyb20gMTk5NyB0byAyMDE2IiwgeCA9ICJZZWFyIix5ID0gIlRvdGFsIEV4cGVuZGl0dXJlIChpbiB0aG91c2FuZHMgb2YgJCkiKSsgdGhlbWVfbWluaW1hbCgpKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIixheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKYW5pbV8yID0gZXhwX3AxIAphbmltYXRlKGFuaW1fMixuZnJhbWVzID0gMTApCmBgYAoKIyMgUTMuIFdoYXQgaXMgdGhlIGF2ZXJhZ2UgZ292ZXJubWVudCBleHBlbmRpdHVyZSBwZXIgc3R1ZGVudCBpbiBBTCBhbmQgTUE/ClRoZSBwZXIgc3R1ZGVudCBzcGVuZGluZyBmb3IgQWxhYmFtYSBpcyBhIGxpdHRsZSBiZWxvdyBgJDksMDAwYCB3aGlsZSB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIGAkMTQsMDAwYCBmb3IgTWFzc2FjaHVzZXR0cy4KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc3VtbWFyaXplX3N0YXRzID0gZnVuY3Rpb24oZGF0YSl7CiAgZGF0YSAlPiUgZ3JvdXBfYnkoeWVhcikgJT4lIGZpbHRlcihhcy5udW1lcmljKHllYXIpID4gMjAxMyAmIChhcy5udW1lcmljKHllYXIpIDw9IDIwMTYpKSAlPiUgc3VtbWFyaXNlKAogIHN0YXRlX2Vucm9sbG1lbnQgPSBzdW0oZW5yb2xsbWVudCxuYS5ybSA9IFRSVUUpLAogIHN0YXRlX2Z1bGx0aW1lID0gc3VtKHRlYWNoZXJzX2VsZW1lbnRhcnlfZnRlLHRlYWNoZXJzX2tpbmRlcmdhcnRlbl9mdGUsdGVhY2hlcnNfcHJla19mdGUsdGVhY2hlcnNfc2Vjb25kYXJ5X2Z0ZSxjb29yZGluYXRvcnNfZnRlLGd1aWRhbmNlX2NvdW5zZWxvcnNfZWxlbV9mdGUsZ3VpZGFuY2VfY291bnNlbG9yc19zZWNfZnRlLGd1aWRhbmNlX2NvdW5zZWxvcnNfb3RoZXJfZnRlLHNjaG9vbF9hZG1pbmlzdHJhdG9yc19mdGUsbmEucm0gPSBUUlVFKQopIAp9CgptdXRhdGVfZCA9IGZ1bmN0aW9uKGRhdGEpewogIGRhdGEgJT4lIG11dGF0ZSgKICBmdGVfcGVyX3N0dSA9IHN0YXRlX2Vucm9sbG1lbnQvc3RhdGVfZnVsbHRpbWUsCiAgZXhwX3Blcl9zdHUgPSBleHBlbmRpdHVyZS9zdGF0ZV9lbnJvbGxtZW50CikKfQoKYWxfc3VtbWFyaXplZF9kYXRhID0gYWJfZGF0YSAlPiUgc3VtbWFyaXplX3N0YXRzKCkKbWFfc3VtbWFyaXplZF9kYXRhID0gbWFfZGF0YSAlPiUgc3VtbWFyaXplX3N0YXRzKCkKYWxfZXhwZW5zZXMgPSByZXN0cnVjdHVyZWRfZGF0YSAlPiUgZmlsdGVyKHN0YXRlID09ICdBbGFiYW1hJykgCm1hX2V4cGVuc2VzID0gcmVzdHJ1Y3R1cmVkX2RhdGEgJT4lIGZpbHRlcihzdGF0ZSA9PSAgJ01hc3NhY2h1c2V0dHMnKQoKYWxfZXhwX2Vucm9sbG1lbnQgPSBsZWZ0X2pvaW4oYWxfc3VtbWFyaXplZF9kYXRhLGFsX2V4cGVuc2VzLGJ5ID0gInllYXIiKQptYV9leHBfZW5yb2xsbWVudCA9IGxlZnRfam9pbihtYV9zdW1tYXJpemVkX2RhdGEsbWFfZXhwZW5zZXMsIGJ5ID0gInllYXIiKQpiID0gcmJpbmQobWFfZXhwX2Vucm9sbG1lbnQsYWxfZXhwX2Vucm9sbG1lbnQpICU+JSBtdXRhdGVfZCgpCnNwX3Bsb3QgPSBnZ3Bsb3QoYixhZXMoeCA9IGFzLmNoYXJhY3Rlcih5ZWFyKSx5ID0gZXhwX3Blcl9zdHUsZ3JvdXAgPSBzdGF0ZSkpICsgCiAgZ2VvbV9saW5lKGFlcyhjb2wgPSBzdGF0ZSx0ZXh0ID0gZXhwX3Blcl9zdHUpKSArCiAgbGFicyh5ID0gIkV4cGVuc2UgcGVyIHN0dWRlbnQgKGluIHRob3VzYW5kcyBvZiBkb2xsYXJzKSIseCA9ICJZZWFyIiwgdGl0bGUgPSAiTWFzc2FjaHVzZXR0cyBhbmQgQWxhYmFtYSBleHBlbnNlIHBlciBzdHVkZW50IikgKyB0aGVtZV9taW5pbWFsKCkKZ2dwbG90bHkoc3BfcGxvdCx0b29sdGlwID0gInRleHQiKQpgYGAKCgojIyBRNC4gV2hhdCBpcyB0aGUgU3R1ZGVudCB0byBGdWxsdGltZSBzdGFmZiBkaXN0cmlidXRpb24gb3ZlciBib3RoIHN0YXRlcz8gCkhlcmUsIGZ1bGx0aW1lIHN0YWZmIGluY2x1ZGUgdGhlIGZvbGxvd2luZzoKKiBUZWFjaGVycyAoZWxlbWVudGFyeSwgc2Vjb25kYXJ5LCBwcmUtS0csIEtHKQoqIENvb3JkaW5hdG9ycyAKKiBHdWlkYW5jZSBjb3Vuc2Vsb3JzIChlbGVtZW50YXJ5LCBzZWNvbmRhcnksIHByZS1LRywgS0cpCiogU2Nob29sIGFkbWluaXN0cmF0b3JzCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZ0ZV9wZXJfc3R1X3Bsb3QgPSBnZ3Bsb3QoYixhZXMoeCA9IGFzLmNoYXJhY3Rlcih5ZWFyKSx5ID0gZnRlX3Blcl9zdHUsIGdyb3VwID0gc3RhdGUsIGNvbCA9IHN0YXRlKSkgKyBnZW9tX2xpbmUoYWVzKHRleHQgPSBmdGVfcGVyX3N0dSkpICsKICBsYWJzKHkgPSAiU3R1ZGVudCB0byBGdWxsdGltZSBzdGFmZiByYXRpbyIseCA9ICJZZWFyIiwgdGl0bGUgPSAiTWFzc2FjaHVzZXR0cyBhbmQgQWxhYmFtYSBmdWxsdGltZSBzdGFmZiBwZXIgc3R1ZGVudCIpICsgdGhlbWVfbWluaW1hbCgpCmdncGxvdGx5KGZ0ZV9wZXJfc3R1X3Bsb3QsIHRvb2x0aXAgPSAidGV4dCIpCmBgYAoKIyMgUTUuIEhvdyBkbyBNYXRoIGFuZCBFbmdsaXNoIGFzc2Vzc21lbnQgc2NvcmVzIGNvbXBhcmUgaW4gc2Nob29scyBhY3Jvc3MgYm90aCBzdGF0ZXMgb24gYXZlcmFnZT8gCgpNYXRoIHNjb3JlcyBoYXZlIGJlZW4gYmV0dGVyIGF0IE1hc3NhY2h1c2V0dHMgZnJvbSAyMDE0IHRvIDIwMTggdGhhbiB0aGV5IHdlcmUgYXQgQWxhYmFtYSBvdmVyIHRoZSBwYXN0IDQgeWVhcnMgYWx0aG91Z2ggTUEncyBzY29yZXMgZGlwIHdoaWxlICBBTCdzIHNjb3JlIGluY3JlYXNlcy4KYGBge3IgZWRhLTIsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmJ5X3JhY2VfZGF0YSA9IHJlYWRfY3N2KCcuL2Rpc3RyaWN0cy1kYXRhLWJ5LXJhY2UuY3N2JykgJT4lIAogIGZpbHRlcihtYXRoX3Rlc3RfcGN0X3Byb2ZfaGlnaCAhPSAnU3VwcHJlc3NlZCBkYXRhJykgJT4lIG11dGF0ZSh5ZWFyID0gYXMubnVtZXJpYyh5ZWFyKSkKCmJ5X3JhY2VfYWJfZGF0YSA9IGJ5X3JhY2VfZGF0YSAlPiUgZmlsdGVyKHN0YXRlX25hbWUgPT0gJ0FsYWJhbWEnKQpieV9yYWNlX21hX2RhdGEgPSBieV9yYWNlX2RhdGEgJT4lIGZpbHRlcihzdGF0ZV9uYW1lID09ICdNYXNzYWNodXNldHRzJykKZ3JvdXBlZF9ieV95cl9hYiA9IGJ5X3JhY2VfYWJfZGF0YSAlPiUgZ3JvdXBfYnkoeWVhcikgJT4lIAogIHN1bW1hcmlzZShhdmdfbWF0aF9oaWdoID0gbWVhbihhcy5udW1lcmljKG1hdGhfdGVzdF9wY3RfcHJvZl9oaWdoKSkKICAgICAgICAgICAgICAsYXZnX21hdGhfbWlkID0gbWVhbihhcy5udW1lcmljKG1hdGhfdGVzdF9wY3RfcHJvZl9taWRwdCkpCiAgICAgICAgICAgICxhdmdfbWF0aF9sb3cgPSBtZWFuKGFzLm51bWVyaWMobWF0aF90ZXN0X3BjdF9wcm9mX2xvdykpCiAgICAgICAgICAgICxzdGF0ZSA9IHN0YXRlX25hbWUpCmdyb3VwZWRfYnlfeXJfbWEgPSBieV9yYWNlX21hX2RhdGEgJT4lIGdyb3VwX2J5KHllYXIpICU+JSAKICBzdW1tYXJpc2UoYXZnX21hdGhfaGlnaCA9IG1lYW4oYXMubnVtZXJpYyhtYXRoX3Rlc3RfcGN0X3Byb2ZfaGlnaCkpLAogICAgICAgICAgICBhdmdfbWF0aF9taWQgPSBtZWFuKGFzLm51bWVyaWMobWF0aF90ZXN0X3BjdF9wcm9mX21pZHB0KSksCiAgICAgICAgICAgIGF2Z19tYXRoX2xvdyA9IG1lYW4oYXMubnVtZXJpYyhtYXRoX3Rlc3RfcGN0X3Byb2ZfbG93KSksCiAgICAgICAgICAgIHN0YXRlID0gc3RhdGVfbmFtZSkKCgpyZWFkX2dyb3VwZWRfYnlfeXJfYWIgPSBieV9yYWNlX2FiX2RhdGEgJT4lIGdyb3VwX2J5KHllYXIpICU+JSAKICBzdW1tYXJpc2UoYXZnX3JlYWRfaGlnaCA9IG1lYW4oYXMubnVtZXJpYyhyZWFkX3Rlc3RfcGN0X3Byb2ZfaGlnaCksbmEucm0gPSBUUlVFKQogICAgICAgICAgICAgICxhdmdfcmVhZF9taWQgPSBtZWFuKGFzLm51bWVyaWMocmVhZF90ZXN0X3BjdF9wcm9mX21pZHB0KSxuYS5ybSA9IFRSVUUpCiAgICAgICAgICAgICxhdmdfcmVhZF9sb3cgPSBtZWFuKGFzLm51bWVyaWMocmVhZF90ZXN0X3BjdF9wcm9mX2xvdyksbmEucm0gPSBUUlVFKQogICAgICAgICAgICAsc3RhdGUgPSBzdGF0ZV9uYW1lKQpyZWFkX2dyb3VwZWRfYnlfeXJfbWEgPSBieV9yYWNlX21hX2RhdGEgJT4lIGdyb3VwX2J5KHllYXIpICU+JSAKICBzdW1tYXJpc2UoYXZnX3JlYWRfaGlnaCA9IG1lYW4oYXMubnVtZXJpYyhyZWFkX3Rlc3RfcGN0X3Byb2ZfaGlnaCksbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgYXZnX3JlYWRfbWlkID0gbWVhbihhcy5udW1lcmljKHJlYWRfdGVzdF9wY3RfcHJvZl9taWRwdCksbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgYXZnX3JlYWRfbG93ID0gbWVhbihhcy5udW1lcmljKHJlYWRfdGVzdF9wY3RfcHJvZl9sb3cpLG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHN0YXRlID0gc3RhdGVfbmFtZSkKCgogbWF0aF9jb21wID0gICBnZ3Bsb3QocmJpbmQoZ3JvdXBlZF9ieV95cl9hYixncm91cGVkX2J5X3lyX21hKSxhZXMoeSA9IHNlcSgxLDEwMCxieSA9IDIwKSwgeCA9IHllYXIpLGFscGhhID0gLjgpICsgCiAgICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltYXggPSBhdmdfbWF0aF9oaWdoLCB5ID0gYXZnX21hdGhfbWlkLCB5bWluID0gYXZnX21hdGhfbG93LGNvbCA9IHN0YXRlLGdyb3VwID0gc3RhdGUpKSArIAogIGxhYnMoeSA9ICIlIE1hdGggU2NvcmUiLHggPSAiWWVhciIsIHRpdGxlID0gIk1hc3NhY2h1c2V0dHMgYW5kIEFsYWJhbWEgTWF0aCBzY29yZSByYW5nZSIpICsgdGhlbWVfbWluaW1hbCgpCiAgIAogICAKICByZWFkaW5nX2NvbXAgPSBnZ3Bsb3QocmJpbmQocmVhZF9ncm91cGVkX2J5X3lyX2FiLHJlYWRfZ3JvdXBlZF9ieV95cl9tYSksYWVzKHkgPSBzZXEoMSwxMDAsYnkgPSAyMCksIHggPSB5ZWFyKSxhbHBoYSA9IC44KSArIAogICAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWF4ID0gYXZnX3JlYWRfaGlnaCwgeSA9IGF2Z19yZWFkX21pZCwgeW1pbiA9IGF2Z19yZWFkX2xvdyxjb2wgPSBzdGF0ZSxncm91cCA9IHN0YXRlKSkgKyAKICBsYWJzKHkgPSAiJSBSZWFkaW5nIFNjb3JlIix4ID0gIlllYXIiLCB0aXRsZSA9ICJNYXNzYWNodXNldHRzIGFuZCBBbGFiYW1hIFJlYWRpbmcgc2NvcmUgcmFuZ2UiKSArIHRoZW1lX21pbmltYWwoKQogIAphbmltXzQgPSBtYXRoX2NvbXAgKyB0cmFuc2l0aW9uX3JldmVhbCh5ZWFyKQphbmltYXRlKGFuaW1fNCxuZnJhbWVzID0gMTUpCmBgYApgYGB7cn0KYW5pbV81ID0gcmVhZGluZ19jb21wICsgdHJhbnNpdGlvbl9yZXZlYWwoeWVhcikKYW5pbWF0ZShhbmltXzUsbmZyYW1lcyA9IDE1KQpgYGAKCgojIyBRNi4gV2hhdCBpcyB0aGUgZGlzdHJpYnV0aW9uIGZvciBhc3Nlc3NtZW50IHNjb3JlcyBiYXNlZCBvbiByYWNlIGxpa2UgZm9yIGJvdGggc3RhdGVzIG92ZXIgdGltZT8KTW9zdCBtaW5vcml0aWVzIHBlcmZvcm0gbGVzcyBpbiBib3RoIG1hdGhzIGFuZCByZWFkaW5nLiBUaGUgcGVyZm9ybWFuY2Ugb2Ygd2hpdGUgc3R1ZGVudHMsIGhvd2V2ZXIsIGlzIHNlY29uZCB0byB0aGF0IG9mIEFzaWFucy4gVGhpcyBmaW5kaW5nIGlzIGNvbnNpc3RlbnQgd2l0aCBib3RoIHN0YXRlcy4gTW9yZSBkYXRhIGlzIG5lZWRlZCB0byBhc3Nlc3Mgd2h5IHRoaXMgbWlnaHQgYmUgdGhlIGNhc2UuIEFsdGhvdWdoIHJhY2lzbSBhbmQgd2hpdGUgc3VwcmVtYWN5IGFyZSBmYWN0b3JzIGluZmx1ZW5jaW5nIHRoaXMgZ2FwLCB0aGVyZSBpcyBub3QgZW5vdWdoIGRhdGEgKGluIHRoaXMgcGFwZXIpIHRvIHF1YW50aWZ5IHRoZXNlIGNsYWltcy4KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmQgPSBieV9yYWNlX2RhdGEgJT4lIGdyb3VwX2J5KHllYXIsc3RhdGVfbmFtZSxyYWNlKSAlPiUgc3VtbWFyaXNlKAogIGF2Z19tYXRoX2hpZ2ggPSBtZWFuKGFzLm51bWVyaWMobWF0aF90ZXN0X3BjdF9wcm9mX2hpZ2gpKSwKICAgICAgICAgICAgYXZnX21hdGhfbWlkID0gbWVhbihhcy5udW1lcmljKG1hdGhfdGVzdF9wY3RfcHJvZl9taWRwdCkpLAogICAgICAgICAgICBhdmdfbWF0aF9sb3cgPSBtZWFuKGFzLm51bWVyaWMobWF0aF90ZXN0X3BjdF9wcm9mX2xvdykpLAogIGF2Z19yZWFkX2hpZ2ggPSBtZWFuKGFzLm51bWVyaWMocmVhZF90ZXN0X3BjdF9wcm9mX2hpZ2gpKSwKICBhdmdfcmVhZF9taWQgPSBtZWFuKGFzLm51bWVyaWMocmVhZF90ZXN0X3BjdF9wcm9mX21pZHB0KSksCiAgICAgICAgICAgIGF2Z19yZWFkX2xvdyA9IG1lYW4oYXMubnVtZXJpYyhyZWFkX3Rlc3RfcGN0X3Byb2ZfbG93KSkKICApCgptX3Njb3JlID0gZ2dwbG90KGQsYWVzKHggPSByYWNlLCBncm91cCA9IHJhY2UsIGNvbCA9IHJhY2UpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWF4ID0gYXZnX21hdGhfaGlnaCwgeSA9IGF2Z19tYXRoX21pZCwgeW1pbiA9IGF2Z19tYXRoX2xvdyksYWxwaGEgPSAuOCkgKyAKICBmYWNldF9ncmlkKHN0YXRlX25hbWUgfiB5ZWFyKSArCiAgdGhlbWVfbWluaW1hbCgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgbGFicyh0aXRsZSA9ICJNYXRoIHBlcmZvcm1hbmNlIGluIE1BIGFuZCBBTCBmcm9tIDIwMTQtMjAxNyBwZXIgcmFjZSIsIHkgPSAiJSBNYXRoIHNjb3JlIHJhbmdlIix4ID0gIlJhY2UiKQoKcl9zY29yZSA9IGdncGxvdChkLGFlcyh4ID0gcmFjZSwgZ3JvdXAgPSByYWNlLCBjb2wgPSByYWNlKSkgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1heCA9IGF2Z19yZWFkX2hpZ2gsIHkgPSBhdmdfcmVhZF9taWQsIHltaW4gPSBhdmdfcmVhZF9sb3cpLGFscGhhID0gLjgpICsgCiAgZmFjZXRfZ3JpZChzdGF0ZV9uYW1lIH4geWVhcikgKwogIHRoZW1lX21pbmltYWwoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArIAogIGxhYnModGl0bGUgPSAiUmVhZGluZyBwZXJmb3JtYW5jZSBpbiBNQSBhbmQgQUwgZnJvbSAyMDE0LTIwMTcgcGVyIHJhY2UiLCB5ID0gIiUgUmVhZGluZyBzY29yZSByYW5nZSIseCA9ICJSYWNlIikKZ2dwbG90bHkocl9zY29yZSkKZ2dwbG90bHkobV9zY29yZSkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpyX2FsX21hX2NvbXAgPSBnZ3Bsb3QoZCxhZXMoeCA9IHJhY2UsIGdyb3VwID0gc3RhdGVfbmFtZSwgY29sID0gc3RhdGVfbmFtZSkpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltYXggPSBhdmdfcmVhZF9oaWdoLCB5ID0gYXZnX3JlYWRfbWlkLCB5bWluID0gYXZnX3JlYWRfbG93KSxhbHBoYSA9IC44KSArIGZhY2V0X2dyaWQoLiB+IHllYXIpICsgCiAgdGhlbWVfbWluaW1hbCgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsgCiAgbGFicyh0aXRsZSA9ICJSZWFkaW5nIHBlcmZvcm1hbmNlIGluIE1BIGFuZCBBTCBmcm9tIDIwMTQtMjAxNyBwZXIgcmFjZSIsIHkgPSAiJSBSZWFkaW5nIHNjb3JlIHJhbmdlIix4ID0gIlJhY2UiKQoKbV9hbF9tYV9jb21wID0gZ2dwbG90KGQsYWVzKHggPSByYWNlLCBncm91cCA9IHN0YXRlX25hbWUsIGNvbCA9IHN0YXRlX25hbWUpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWF4ID0gYXZnX21hdGhfaGlnaCwgeSA9IGF2Z19tYXRoX21pZCwgeW1pbiA9IGF2Z19tYXRoX2xvdyksYWxwaGEgPSAuOCkgKyBmYWNldF9ncmlkKC4gfiB5ZWFyKSArIAogIHRoZW1lX21pbmltYWwoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArIAogIGxhYnModGl0bGUgPSAiTWF0aCBwZXJmb3JtYW5jZSBpbiBNQSBhbmQgQUwgZnJvbSAyMDE0LTIwMTcgcGVyIHJhY2UiLCB5ID0gIiUgTWF0aCBzY29yZSByYW5nZSIseCA9ICJSYWNlIikKCnJfYWxfbWFfY29tcAptX2FsX21hX2NvbXAKYGBgCgojIyBRNy4gSXMgdGhlcmUgYSBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gcG92ZXJ0eSByYXRlcyBhbmQgcGVyZm9ybWFuY2U/Ckl0IG1ha2VzIHNlbnNlIHRoYXQgYSBkaXN0cmljdCdzIHNvY2lvLWVjb25vbWljIHByb2ZpbGUgd291bGQgY29ycmVsYXRlIHdpdGggc3R1ZGVudCBwZXJmb3JtYW5jZS4gRnJvbSB0aGUgc2NhdHRlcnBsb3QsIGEgbGluZWFyIHJlbGF0aW9uc2hpcCBpcyBjbGVhcjoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpkaXN0cmljdHNfZGF0YSA9IGRpc3RyaWN0c19kYXRhICU+JSBkcm9wX25hKG1hdGhfdGVzdF9wY3RfcHJvZl9taWRwdCxyZWFkX3Rlc3RfcGN0X3Byb2ZfbWlkcHQpICU+JSBtdXRhdGUobWF0aF90ZXN0X3BjdF9wcm9mX21pZHB0PSBhcy5udW1lcmljKG1hdGhfdGVzdF9wY3RfcHJvZl9taWRwdCkscmVhZF90ZXN0X3BjdF9wcm9mX21pZHB0ID0gYXMubnVtZXJpYyhyZWFkX3Rlc3RfcGN0X3Byb2ZfbWlkcHQpKSAKCmdncGxvdChkaXN0cmljdHNfZGF0YSxhZXMoeCA9IGVzdF9wb3B1bGF0aW9uXzVfMTdfcG92ZXJ0eV9wY3QseSA9IG1hdGhfdGVzdF9wY3RfcHJvZl9taWRwdCkpICsgZ2VvbV9wb2ludCgpICsgbGFicyh5ID0gIm1hdGggdGVzdCBzY29yZSAoMS0xMDApIix4ID0gIiUgb2Ygc3R1ZGVudCBpbiBwb3ZlcnR5Iix0aXRsZSA9ICJJbXBhY3Qgb2Ygc29jaW8tZWNvbm9taWMgY2xhc3Mgb24gcGVyZm9ybWFuY2UiKSArIHRoZW1lX21pbmltYWwoKQoKZ2dwbG90KGRpc3RyaWN0c19kYXRhLGFlcyh4ID0gZXN0X3BvcHVsYXRpb25fNV8xN19wb3ZlcnR5X3BjdCx5ID0gcmVhZF90ZXN0X3BjdF9wcm9mX21pZHB0KSkgKyBnZW9tX3BvaW50KCkgKyBsYWJzKHkgPSAicmVhZGluZyB0ZXN0IHNjb3JlICgxLTEwMCkiLHggPSAiJSBvZiBzdHVkZW50IGluIHBvdmVydHkiLHRpdGxlID0gIkltcGFjdCBvZiBzb2Npby1lY29ub21pYyBjbGFzcyBvbiBwZXJmb3JtYW5jZSIpICsgdGhlbWVfbWluaW1hbCgpCmBgYAoKClRoZSBuZXh0IHN0ZXAgaXMgdG8gZml0IGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwsIGFuZCBlbnN1cmUgdGhhdCB0aGUgcmVzaWR1YWxzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZCBhbmQgdGhhdCB0aGUgZXF1YWwgdmFyaWFuY2UgYXNzdW1wdGlvbiAocG9pbnRzIG9uIGEgZml0dGVkIHZzIHJlc2lkdWFsIGdyYXBoIHJldmVhbCBubyBnZW9tZXRyaWMgcGF0dGVybikgaXMgc2F0aXNmaWVkOgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShicm9vbSkKIyBkaXN0cmljdHNfd2l0aF9hc3Nlc3NtZW50IDwtIGRpc3RyaWN0c19kYXRhICU+JSBkcm9wX25hKG1hdGhfdGVzdF9wY3RfcHJvZl9taWRwdCxyZWFkX3Rlc3RfcGN0X3Byb2ZfbWlkcHQpCiMgCiMgZGlzdHJpY3RzX3dpdGhfYXNzZXNzbWVudCA9IGRpc3RyaWN0c193aXRoX2Fzc2Vzc21lbnQgJT4lIG11dGF0ZShtYXRoX3Rlc3RfcGN0X3Byb2ZfbWlkcHQ9IGFzLm51bWVyaWMobWF0aF90ZXN0X3BjdF9wcm9mX21pZHB0KSkKbW9kZWwgPSBsbShtYXRoX3Rlc3RfcGN0X3Byb2ZfbG93IH4gZXN0X3BvcHVsYXRpb25fNV8xN19wb3ZlcnR5X3BjdCwgZGlzdHJpY3RzX2RhdGEpCgpsbV9yZXMgPSBhdWdtZW50KG1vZGVsLGludGVydmFsID0gInByZWRpY3Rpb24iKQpwMiA9IGdncGxvdChsbV9yZXMsIGFlcyh4ID0gLnN0ZC5yZXNpZCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDE1KSArIGxhYnModGl0bGUgPSAiTm9ybWFsIGRpc3RyaWJ1dGlvbiBvZiByZXNpZHVhbHMiKSArIHRoZW1lX21pbmltYWwoKQoKcDMgPSBnZ3Bsb3QobG1fcmVzLCBhZXMoeCA9IC5maXR0ZWQsIHkgPSAuc3RkLnJlc2lkKSkgKwogIGdlb21fcG9pbnQoKSArIGxhYnModGl0bGUgID0gIkVxdWFsIHZhcmlhbmNlIGNoZWNrIikgKyB0aGVtZV9taW5pbWFsKCkKCnAyCnAzCmBgYAoKRnJvbSB0aGUgcmVzdWx0cyBhYm92ZSwgZml0dGluZyBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIGlzIGFjY2VwdGFibGUuCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpnZ3Bsb3QoZGlzdHJpY3RzX2RhdGEsYWVzKHggPSBlc3RfcG9wdWxhdGlvbl81XzE3X3BvdmVydHlfcGN0LHkgPSBtYXRoX3Rlc3RfcGN0X3Byb2ZfbWlkcHQpKSArIGdlb21fcG9pbnQoKSArIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIsc2UgPSBGQUxTRSkgKyB0aGVtZV9taW5pbWFsKCkgKyBsYWJzKHRpdGxlID0gIkltcGFjdCBvZiBzb2Npby1lY29ub21pYyBjbGFzcyBvbiBwZXJmb3JtYW5jZSIsIHkgPSAibWF0aCB0ZXN0IHNjb3JlICgxLTEwMCkiLHggPSAiJSBvZiBzdHVkZW50IGluIHBvdmVydHkiKQpnZ3Bsb3QoZGlzdHJpY3RzX2RhdGEsYWVzKHggPSBlc3RfcG9wdWxhdGlvbl81XzE3X3BvdmVydHlfcGN0LHkgPSByZWFkX3Rlc3RfcGN0X3Byb2ZfbWlkcHQpKSArIGdlb21fcG9pbnQoKSArIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIsc2UgPSBGQUxTRSkgKyB0aGVtZV9taW5pbWFsKCkgKyBsYWJzKHRpdGxlID0gIkltcGFjdCBvZiBzb2Npby1lY29ub21pYyBjbGFzcyBvbiBwZXJmb3JtYW5jZSIsIHkgPSAiUmVhZGluZyB0ZXN0IHNjb3JlICgxLTEwMCkiLHggPSAiJSBvZiBzdHVkZW50IGluIHBvdmVydHkiKQpgYGAKCkEgc3VtbWFyeSBvZiB0aGUgbW9kZWwgb3V0cHV0IHJldmVhbHMgYSBzdHJvbmcgKGFuZCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50KSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSB0d28gdmFyaWFibGVzLgoKYGBge3J9CnN1bW1hcnkobW9kZWwpCmBgYAoKIyBEaXNjdXNzaW9uICAKSXQgYXBwZWFycyBjb3VudGVyLWludHVpdGl2ZSB0aGF0IGRlc3BpdGUgTWFzc2FjaHVzZXR0cycgY29uc2lzdGVudGx5IGluY3JlYXNpbmcgZXhwZW5zZXMsIEFsYWJhbWEgYXBwZWFycyB0byBjYXRjaCB1cCB3aXRoIHRoZW0gaW4gdGVybXMgb2YgcGVyZm9ybWFuY2UuIFdlIHdvdWxkIGV4cGVjdCB0aGF0IHRoZSBpbmNyZWFzZSBpbiBleHBlbmRpdHVyZSB3b3VsZCBjb3JyZWxhdGUgdG8gYW4gaW5jcmVhc2UgaW4gdGhlIHF1YWxpdHkgb2YgZWR1Y2F0aW9uIGhlbmNlIGFuIGluY3JlYXNlIGluIHN0dWRlbnQgcGVyZm9ybWFuY2UuIFRoaXMgbWVhbnMgdGhhdCBvdGhlciBmYWN0b3JzIGFyZSBhdCBwbGF5IChsaWtlIGhvdyBtdWNoIGlzIGFsbG9jYXRlZCB0byBlbXBsb3llZSBiZW5lZml0cywgdGhlIGVkdWNhdGlvbmFsIHByb2ZpbGVzIG9mIHRlYWNoZXJzIGluIGVhY2ggc3RhdGUpIGhlbmNlIG1vcmUgYW5hbHlzaXMgaXMgcmVxdWlyZWQgYmVmb3JlIGFueSBjb25jbHVzaW9ucyBjYW4gYmUgZHJhd24uIAoKIyMgTGltaXRhdGlvbnMgb2YgdGhlIGNvbmNsdXNpb25zIGRyYXduICAKRGF0YSBmb3IgY2VydGFpbiBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nIGZvciBjZXJ0YWluIHllYXJzIG1ha2luZyBpdCBkaWZmaWN1bHQgZm9yIGFuIGFuYWx5c2lzIG92ZXIgYSBjb25zaXN0ZW50IHRpbWVsaW5lIG9mIGFsbCBxdWVzdGlvbnMgcG9zZWQgaW4gdGhpcyBwYXBlci4gRGF0YSBvbiBlbXBsb3llZSBiZW5lZml0cyBhdCBzY2hvb2wgZGlzdHJpY3RzIGlzIGhhcmQgdG8gb2J0YWluIGluIGEgdXNhYmxlIGZvcm1hdCBmb3IgZGF0YSBhbmFseXNpcyAoYmFzZWQgb24gbXkgc2VhcmNoKSwgdGhlcmVmb3JlIHRoZSByYW5nZSBvZiBteSBjb25jbHVzaW9ucyBlbmRlZCB1cCBzbWFsbGVyIHRoYW4gSSBoYWQgcGxhbm5lZC4KCiMjIElkZWFzIGZvciBmdXR1cmUgYW5hbHlzaXMgIApGdXJ0aGVyIGFuYWx5c2lzIG9uIHRoZXNlIHF1ZXN0aW9ucyBwcm9taXNlcyB0byByZXZlYWwgbW9yZSBpbnNpZ2h0cyBhYm91dCB0aGUgaW5lcXVhbGl0eSBnYXAgYmV0d2VlbiBBTCBhbmQgTUEsIGFuZCBwb3NzaWJseSBoZWxwIGluZm9ybSBkZWNpc2lvbi1tYWtpbmcgYnkgc2Nob29sIGRpc3RyaWN0cy4KCiogV2hhdCBpcyB0aGUgYXZlcmFnZSBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlIHBlciBzdHVkZW50IGRpc3RyaWJ1dGlvbiBpbiBoaWdoIHBvdmVydHkgc2Nob29scyB2cyBsb3cgcG92ZXJ0eSBzY2hvb2xzPwoqIFNwZW5kaW5nIG9uIHB1cGlsIHN1cHBvcnQgc2VydmljZXMgaW4gaGlnaCBwb3ZlcnR5IHNjaG9vbHMgdnMgbG93IHBvdmVydHkgc2Nob29scy4gCiogV2hhdCBpcyB0aGUgcmFjaWFsL2V0aG5pYyBkaXN0cmlidXRpb24gb2YgdGhlIHNjaG9vbC1hZ2UgcG9wdWxhdGlvbiBpbiBwb3ZlcnR5IGluIGJvdGggc3RhdGVzPwoqIFdoYXQgZW1wbG95ZWUgYmVuZWZpdHMgYXJlIGF2YWlsYWJsZSBpbiBoaWdoIGFuZCBsb3cgcG92ZXJ0eSBzY2hvb2xzPyBXaGF0IGJlbmVmaXRzIGFyZSBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgc3RhdGU/IERvIHRoZXNlIGJlbmVmaXRzIGFmZmVjdCBmdWxsLXRpbWUgc3RhZmYgcmF0ZXMgb3Igb3RoZXIgbWVhc3VyZXM/CgoKIyBSZWZlcmVuY2VzCjEuIFtEYXRhc2V0cyB1c2VkIGZvciB0aGlzIHByb2plY3RdKGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9kcml2ZS9mb2xkZXJzLzFqRDJic0ZVX2JrTGg5R05OZUF6aHdHVGx2QmZfTFVEcD91c3A9c2hhcmluZykKMi4gW1VyYmFuIEluc3RpdHV0ZSAtIEVkdWNhdGlvbiBEYXRhIEV4cGxvcmVyXShodHRwczovL2VkdWNhdGlvbmRhdGEudXJiYW4ub3JnL2RhdGEtZXhwbG9yZXIvc2Nob29sLWRpc3RyaWN0cy8pCjMuIFtTdHVkZW50IG91dGNvbWVzOiBEb2VzIG1vcmUgbW9uZXkgcmVhbGx5IG1hdHRlcj9dKGh0dHBzOi8vd3d3LmVkd2Vlay5vcmcvcG9saWN5LXBvbGl0aWNzL3N0dWRlbnQtb3V0Y29tZXMtZG9lcy1tb3JlLW1vbmV5LXJlYWxseS1tYXR0ZXIvMjAxOS8wNikKNC4gW1draXBlZGlhIC0gRWR1Y2F0aW9uYWwgaW5lcXVhbGl0eSBpbiB0aGUgVW5pdGVkIFN0YXRlc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRWR1Y2F0aW9uYWxfaW5lcXVhbGl0eV9pbl90aGVfVW5pdGVkX1N0YXRlcyk=