Stroke happens when a blockage or bleed of the blood vessels either interrupts or reduces the supply of blood to the brain.

Stroke is a leading cause of disability and death in the United States.

Objective: This analysis study aims to understand the nature of Stroke relative to the criteria included in the data. We hope to bring awareness to the reader, through this analysis, to reflect on one’s current health and lifestyle status and how close or preventive one is for a stroke incidence.

Data Retrieval and Structure

Path: https://www.kaggle.com/fedesoriano/stroke-prediction-dataset

stroke <- read.csv("stroke.csv")
str(stroke)
'data.frame':   5110 obs. of  12 variables:
 $ id               : int  9046 51676 31112 60182 1665 56669 53882 10434 27419 60491 ...
 $ gender           : chr  "Male" "Female" "Male" "Female" ...
 $ age              : num  67 61 80 49 79 81 74 69 59 78 ...
 $ hypertension     : int  0 0 0 0 1 0 1 0 0 0 ...
 $ heart_disease    : int  1 0 1 0 0 0 1 0 0 0 ...
 $ ever_married     : chr  "Yes" "Yes" "Yes" "Yes" ...
 $ work_type        : chr  "Private" "Self-employed" "Private" "Private" ...
 $ Residence_type   : chr  "Urban" "Rural" "Rural" "Urban" ...
 $ avg_glucose_level: num  229 202 106 171 174 ...
 $ bmi              : chr  "36.6" "N/A" "32.5" "34.4" ...
 $ smoking_status   : chr  "formerly smoked" "never smoked" "never smoked" "smokes" ...
 $ stroke           : int  1 1 1 1 1 1 1 1 1 1 ...

‘data.frame’: 5110 obs. of 12 variables:

PARTICIPANTS: We have a total of 5110 Participants with 10 Criteria

Criteria Definition

  1. id: unique identifier
  2. gender: “Male”, “Female” or “Other”
  3. age: age of the patient
  4. hypertension: 0 if the patient doesn’t have hypertension, 1 if the patient has hypertension
  5. heart_disease: 0 if the patient doesn’t have any heart diseases, 1 if the patient has a heart disease
  6. ever_married: “No” or “Yes”
  7. work_type: “children”, “Govt_jov”, “Never_worked”, “Private” or “Self-employed”
  8. Residence_type: “Rural” or “Urban”
  9. avg_glucose_level: average glucose level in blood
  10. bmi: body mass index
  11. smoking_status: “formerly smoked”, “never smoked”, “smokes” or “Unknown”*
  12. stroke: 1 if the patient had a stroke or 0 if not

*Note: “Unknown” in smoking_status means that the information is unavailable for this patient

PARTICIPANTS BY GENDER

table(stroke$gender)

Female   Male  Other 
  2994   2115      1 

There are more female participants over men or 58.59% and 41.39% respectively

Participant Demographic with Stroke

withstroke <- stroke %>% filter(stroke==1)
wostroke <-  stroke %>% filter(stroke==0)
stat <- ifelse(stroke$stroke==1,"stroke","no stroke")
sum(stroke$stroke)
[1] 249
table(stroke$gender,stat)
        stat
         no stroke stroke
  Female      2853    141
  Male        2007    108
  Other          1      0

Of all Participants, 249 are diagnosed with stroke or 4.9% of total participants.

Between gender, 141 for females and 108 on males have stroke or 4.9% and 5.4% respectively

Conclusion: By Gender - we have seen more stroke in men over women at 5.4% and 4.9% respectively. However it isn’t much of a difference to conclude that gender would be a huge factor in developing a stroke.

We will observe more on this analysis to which criteria, wether male or female, could potentially trigger a development of stroke.

Participant by Age

hist(stroke$age)

The distribution of our participants by Age is wide (0-80yo) which is quite a good criteria for the measure of common-ness of stroke incidence in age. Also, having sufficient freqeuncy (average of 200 participants) in each age range allow us to have a good sampling measure.

mean(stroke$age)
[1] 43.22661

Overall we have an average of 43.22yo amongst participants

Stroke Incidence by Age

withstroke %>% ggplot(aes(age, fill=gender)) + geom_density(alpha=0.2) + ggtitle("Stroke by Age in Male and Female")

In Conclusion, looking at the chart, Age plays a vital factor in the incidence of stroke. As age of the participants progresses so is the prevalence of stroke. Women tend to be prone at an earlier age while more men develop the illness over time.

Average Stroke Incidence by Age

mean(withstroke$age)
[1] 67.72819

STROKE AND HYPERTENSION

Hypertension also known as high or raised blood pressure, is a condition in which the blood vessels have persistently raised pressure. Hypertension could lead to stroke.

stat <- ifelse(stroke$stroke==1,"stroke","no stroke")
highblood <- ifelse(stroke$hypertension==1,"with hypertension","without hypertension")
table(highblood, stat)
                      stat
highblood              no stroke stroke
  with hypertension          432     66
  without hypertension      4429    183

We have a total of 498 participants that are hypertensive or 9.8%.

And 66 of hypertensive participants developed stroke or 13.25%

On the other hand, we have 4612 participants without hypertension and 183 of them had a stroke or 3.97%

In conclusion, with hypertension, you get 3 times as much chance of developing stroke.

STROKE AND HEART DISEASE

stat <- ifelse(stroke$stroke==1,"stroke","no stroke")
heart.disease <- ifelse(stroke$heart_disease==1,"with heart disease","without heart disease")
table(heart.disease, stat)
                       stat
heart.disease           no stroke stroke
  with heart disease          229     47
  without heart disease      4632    202

We have a total of 276 participants that have heart disease or 5.4% of overall participants,

47 of those or 17% have developed stroke.

While 4834 OF participants do not have heart disease yet 202 have developed stroke or 4.2%

In conclusion, with heart disease, you get 4 times as much chance of developing stroke.

WHAT IF: you have Hypertension and Heart disease at the same time?

sum(stroke$hypertension==1 & stroke$heart_disease==1)
[1] 64

Of all applicants, 64 have both hypertension and heart disease

sum(stroke$hypertension==1 & stroke$heart_disease==1 & stroke$stroke==1)
[1] 13

and 13 of those developed stroke or 20.31%

Overall, the risk of stroke is 6 times as high if you have both hypertension and heart disease.

Keep Track of your heart health to prevent stroke.

GLUCOSE LEVEL OF PARTICIPANTS

hist(stroke$avg_glucose_level)

mean(stroke$avg_glucose_level)
[1] 106.1477

The participants are normally distributed within the lower range or with a mean of 106.15 of glucose level

STROKE AND GLUCOSE LEVEL

withstroke %>% ggplot(aes(avg_glucose_level, fill=gender)) + geom_density(alpha=0.2) + ggtitle("Stroke and Glucose Level by Gender")


withstroke %>% ggplot(aes(age, avg_glucose_level, color=gender)) + geom_point() + ggtitle("Stroke and Glucose Level over Time")

More participants with lower glucose level developed stroke and mostly were women while the opposite spectrum of elevated glucose levels that developed the illness were men.

In conclusion, keeping one’s glucose level at normal level will decrease the chance of developing the illness over time.

BMI

bmi_ <- ifelse(stroke$bmi=="N/A",0,stroke$bmi)
bmi_ <- as.numeric(bmi_)
hist(bmi_)

mean(bmi_)
[1] 27.75673

The normal distribution of BMI from the participants are between 20-40 with a mean of 27.76.

The normal BMI is 24.

BMI AND STROKE

bmi_withstroke <- ifelse(withstroke$bmi=="N/A",0,withstroke$bmi)
bmi_withstroke <- as.numeric(bmi_withstroke)
hist(bmi_withstroke)

mean(bmi_withstroke)
[1] 25.57631

From the participants with stroke (249), the normal distribution of BMI is 25.57 concluding that even having close to a normal range of BMI, stroke can potentially develop.

Now, let’s Analyze the Lifestyle criteria and observe if these triggered a development of stroke to our participants

MARRIAGE

stroke %>% ggplot(aes(ever_married)) + geom_bar(width=0.2) + ggtitle("Marriage status All Participants")

Most of the participants are married.

MARRIAGE AND STROKE

ever.married <- stroke$ever_married
table(ever.married,stat)
            stat
ever.married no stroke stroke
         No       1728     29
         Yes      3133    220

For the non-married only 29 participants developed stroke and 220 for the married.

The probability, for the non-married the development of the condition is 1.7% and for the married at 6.6%.

In summary for married individuals, one can get 4 times as much chance of developing stroke. Therefore, make your wife happy and everything will be alright. :)

RESIDENCE: Can your place or residence have a factor in developing stroke?

stroke %>% ggplot(aes(Residence_type)) + geom_bar(width=0.2) + ggtitle("Place of Residence All Participants")

Our participants have about the same number in place of residence, either rural or urban

RESIDENCE AND STROKE

reside <- stroke$Residence_type
table(reside, stat)
       stat
reside  no stroke stroke
  Rural      2400    114
  Urban      2461    135

Rural 4.53% Urban 5.20%

In conclusion, based on our sample, there is not much extreme difference in place of residence that would trigger a development of stroke. Whatever or wherever place you may be living, the potential exists almost as much.

WORK Most of the people have jobs. It is needed for survival. Can the same reason to survive lead us to develop a severe condition such as stroke? if so, which work type could it be? let’s find out.

stroke %>% ggplot(aes(work_type)) + geom_bar(width=0.2) + ggtitle("Work Type All Participants")

Majority of the participants are in the Private Sector.

WORK TYPE AND STROKE

work <- stroke$work_type
table( work, stat)
               stat
work            no stroke stroke
  children            685      2
  Govt_job            624     33
  Never_worked         22      0
  Private            2776    149
  Self-employed       754     65

Statistically, the probability of developing a stroke by work:

Children 0.29% Gov_job 5.02% Never_worked 0% Private 5.09% Self-employed 7.94%

Based on participants data, those that never worked had 0 probability of developing stroke, whereas children had small a one. Both Government and Private work sectors have the same probability and the Self-employed have the highest probability.

What work type have you?

SMOKING

stroke %>% ggplot(aes(smoking_status)) + geom_bar(width=0.2) + ggtitle("Smoking All Participants")

Most of the total participants never smoked. Although there is a a lot of “unknown” data, the three statuses should be enough to determine individual probabilities.

smoke <- stroke$smoking_status
table( smoke, stat)
                 stat
smoke             no stroke stroke
  formerly smoked       815     70
  never smoked         1802     90
  smokes                747     42
  Unknown              1497     47

Statistically, the probability of developing a stroke by Smoking:

formerly 7.91% never smoked 4.76% smokes 5.32% Unknown 3.04%%

Smoking, even if you have stopped already, increases the risk of stroke as the data tells us.

Overall Takeaway:

NOw that you have an overview analysis of the stroke indicators through this data, you can answer for yourself how close or preventive you are to developing stroke. We all want to prevent this event from developing as we progress through age, ang age is a huge factor in developing stroke as data suggests. If we remain in our current health and lifestyle conditions knowing it increases the risk, then at one point in time it may happen.

To keep the probability low, including other criteria in this analysis, one should make sure to minimize what could potentially increase the risk as one or more of these criteria combined (example hypertension + heart disease) the risk increases even higher.

One thing that we cannot control is Age. Everybody ages, but the rest of criteria in this data, we can. A better heart health, Not Smoking, Manage Stress, normalize BMI and the works will surely lower the risk of stroke in our lives.

May this analysis give you a data-driven decision to decide the health and lifestyle choices to consider towards the goal of stroke prevention.

Thank you.

#computing probabilities

percent <- function(){
  a <- readline(prompt = "a: ")
  b <- readline(prompt = "b: ")
  a <- as.numeric(a)
  b <- as.numeric(b)
  c = (a/(a+b))*100
  print(c)
}
LS0tDQp0aXRsZTogIlN0cm9rZSBBbmFseXNpcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClN0cm9rZSBoYXBwZW5zIHdoZW4gYSBibG9ja2FnZSBvciBibGVlZCBvZiB0aGUgYmxvb2QgdmVzc2VscyBlaXRoZXIgaW50ZXJydXB0cyBvciByZWR1Y2VzIHRoZSBzdXBwbHkgb2YgYmxvb2QgdG8gdGhlIGJyYWluLiANCiANClN0cm9rZSBpcyBhIGxlYWRpbmcgY2F1c2Ugb2YgZGlzYWJpbGl0eSBhbmQgZGVhdGggaW4gdGhlIFVuaXRlZCBTdGF0ZXMuDQogDQogDQogT2JqZWN0aXZlOiBUaGlzIGFuYWx5c2lzIHN0dWR5IGFpbXMgdG8gdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIFN0cm9rZSByZWxhdGl2ZSB0byB0aGUgY3JpdGVyaWEgaW5jbHVkZWQgaW4gdGhlIGRhdGEuIFdlIGhvcGUgdG8gYnJpbmcgYXdhcmVuZXNzIHRvIHRoZSByZWFkZXIsIHRocm91Z2ggdGhpcyBhbmFseXNpcywgdG8gcmVmbGVjdCBvbiBvbmUncyBjdXJyZW50IGhlYWx0aCBhbmQgbGlmZXN0eWxlIHN0YXR1cyBhbmQgaG93IGNsb3NlIG9yIHByZXZlbnRpdmUgb25lIGlzIGZvciBhIHN0cm9rZSBpbmNpZGVuY2UuIA0KDQpEYXRhIFJldHJpZXZhbCBhbmQgU3RydWN0dXJlDQoNCg0KUGF0aDogaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9mZWRlc29yaWFuby9zdHJva2UtcHJlZGljdGlvbi1kYXRhc2V0DQpgYGB7cn0NCnN0cm9rZSA8LSByZWFkLmNzdigic3Ryb2tlLmNzdiIpDQpzdHIoc3Ryb2tlKQ0KYGBgDQoNCidkYXRhLmZyYW1lJzoJNTExMCBvYnMuIG9mICAxMiB2YXJpYWJsZXM6DQoNClBBUlRJQ0lQQU5UUzogV2UgaGF2ZSBhIHRvdGFsIG9mIDUxMTAgUGFydGljaXBhbnRzIHdpdGggMTAgQ3JpdGVyaWENCg0KDQpDcml0ZXJpYSBEZWZpbml0aW9uDQoNCjEpIGlkOiB1bmlxdWUgaWRlbnRpZmllcg0KMikgZ2VuZGVyOiAiTWFsZSIsICJGZW1hbGUiIG9yICJPdGhlciINCjMpIGFnZTogYWdlIG9mIHRoZSBwYXRpZW50DQo0KSBoeXBlcnRlbnNpb246IDAgaWYgdGhlIHBhdGllbnQgZG9lc24ndCBoYXZlIGh5cGVydGVuc2lvbiwgMSBpZiB0aGUgcGF0aWVudCBoYXMgaHlwZXJ0ZW5zaW9uDQo1KSBoZWFydF9kaXNlYXNlOiAwIGlmIHRoZSBwYXRpZW50IGRvZXNuJ3QgaGF2ZSBhbnkgaGVhcnQgZGlzZWFzZXMsIDEgaWYgdGhlIHBhdGllbnQgaGFzIGEgaGVhcnQgZGlzZWFzZQ0KNikgZXZlcl9tYXJyaWVkOiAiTm8iIG9yICJZZXMiDQo3KSB3b3JrX3R5cGU6ICJjaGlsZHJlbiIsICJHb3Z0X2pvdiIsICJOZXZlcl93b3JrZWQiLCAiUHJpdmF0ZSIgb3IgIlNlbGYtZW1wbG95ZWQiDQo4KSBSZXNpZGVuY2VfdHlwZTogIlJ1cmFsIiBvciAiVXJiYW4iDQo5KSBhdmdfZ2x1Y29zZV9sZXZlbDogYXZlcmFnZSBnbHVjb3NlIGxldmVsIGluIGJsb29kDQoxMCkgYm1pOiBib2R5IG1hc3MgaW5kZXgNCjExKSBzbW9raW5nX3N0YXR1czogImZvcm1lcmx5IHNtb2tlZCIsICJuZXZlciBzbW9rZWQiLCAic21va2VzIiBvciAiVW5rbm93biIqDQoxMikgc3Ryb2tlOiAxIGlmIHRoZSBwYXRpZW50IGhhZCBhIHN0cm9rZSBvciAwIGlmIG5vdA0KDQoqTm90ZTogIlVua25vd24iIGluIHNtb2tpbmdfc3RhdHVzIG1lYW5zIHRoYXQgdGhlIGluZm9ybWF0aW9uIGlzIHVuYXZhaWxhYmxlIGZvciB0aGlzIHBhdGllbnQNCg0KDQoNClBBUlRJQ0lQQU5UUyBCWSBHRU5ERVINCmBgYHtyfQ0KdGFibGUoc3Ryb2tlJGdlbmRlcikNCmBgYA0KVGhlcmUgYXJlIG1vcmUgZmVtYWxlIHBhcnRpY2lwYW50cyBvdmVyIG1lbiBvciA1OC41OSUgYW5kIDQxLjM5JSByZXNwZWN0aXZlbHkNCg0KDQoNClBhcnRpY2lwYW50IERlbW9ncmFwaGljIHdpdGggU3Ryb2tlDQpgYGB7cn0NCndpdGhzdHJva2UgPC0gc3Ryb2tlICU+JSBmaWx0ZXIoc3Ryb2tlPT0xKQ0Kd29zdHJva2UgPC0gIHN0cm9rZSAlPiUgZmlsdGVyKHN0cm9rZT09MCkNCnN0YXQgPC0gaWZlbHNlKHN0cm9rZSRzdHJva2U9PTEsInN0cm9rZSIsIm5vIHN0cm9rZSIpDQpzdW0oc3Ryb2tlJHN0cm9rZSkNCnRhYmxlKHN0cm9rZSRnZW5kZXIsc3RhdCkNCmBgYA0KDQpPZiBhbGwgUGFydGljaXBhbnRzLCAyNDkgYXJlIGRpYWdub3NlZCB3aXRoIHN0cm9rZSBvciA0LjklIG9mIHRvdGFsIHBhcnRpY2lwYW50cy4NCg0KQmV0d2VlbiBnZW5kZXIsIDE0MSBmb3IgZmVtYWxlcyBhbmQgMTA4IG9uIG1hbGVzIGhhdmUgc3Ryb2tlIG9yIDQuOSUgYW5kIDUuNCUgcmVzcGVjdGl2ZWx5DQoNCkNvbmNsdXNpb246IEJ5IEdlbmRlciAtIHdlIGhhdmUgc2VlbiBtb3JlIHN0cm9rZSBpbiBtZW4gb3ZlciB3b21lbiBhdCA1LjQlIGFuZCA0LjklIHJlc3BlY3RpdmVseS4gSG93ZXZlciBpdCBpc24ndCBtdWNoIG9mIGEgZGlmZmVyZW5jZSB0byBjb25jbHVkZSB0aGF0IGdlbmRlciB3b3VsZCBiZSBhIGh1Z2UgZmFjdG9yIGluIGRldmVsb3BpbmcgYSBzdHJva2UuIA0KDQpXZSB3aWxsIG9ic2VydmUgbW9yZSBvbiB0aGlzIGFuYWx5c2lzIHRvIHdoaWNoIGNyaXRlcmlhLCB3ZXRoZXIgbWFsZSBvciBmZW1hbGUsIGNvdWxkIHBvdGVudGlhbGx5IHRyaWdnZXIgYSBkZXZlbG9wbWVudCBvZiBzdHJva2UuDQoNClBhcnRpY2lwYW50IGJ5IEFnZQ0KDQpgYGB7cn0NCmhpc3Qoc3Ryb2tlJGFnZSkNCmBgYA0KVGhlIGRpc3RyaWJ1dGlvbiBvZiBvdXIgcGFydGljaXBhbnRzIGJ5IEFnZSBpcyB3aWRlICgwLTgweW8pIHdoaWNoIGlzIHF1aXRlIGEgZ29vZCBjcml0ZXJpYSBmb3IgdGhlIG1lYXN1cmUgb2YgY29tbW9uLW5lc3Mgb2Ygc3Ryb2tlIGluY2lkZW5jZSBpbiBhZ2UuIEFsc28sIGhhdmluZyBzdWZmaWNpZW50IGZyZXFldW5jeSAoYXZlcmFnZSBvZiAyMDAgcGFydGljaXBhbnRzKSBpbiBlYWNoIGFnZSByYW5nZSBhbGxvdyB1cyB0byBoYXZlIGEgZ29vZCBzYW1wbGluZyBtZWFzdXJlLiANCg0KYGBge3J9DQptZWFuKHN0cm9rZSRhZ2UpDQpgYGANCk92ZXJhbGwgd2UgaGF2ZSBhbiBhdmVyYWdlIG9mIDQzLjIyeW8gYW1vbmdzdCBwYXJ0aWNpcGFudHMNCg0KDQpTdHJva2UgSW5jaWRlbmNlIGJ5IEFnZQ0KYGBge3J9DQp3aXRoc3Ryb2tlICU+JSBnZ3Bsb3QoYWVzKGFnZSwgZmlsbD1nZW5kZXIpKSArIGdlb21fZGVuc2l0eShhbHBoYT0wLjIpICsgZ2d0aXRsZSgiU3Ryb2tlIGJ5IEFnZSBpbiBNYWxlIGFuZCBGZW1hbGUiKQ0KDQpgYGANCkluIENvbmNsdXNpb24sIGxvb2tpbmcgYXQgdGhlIGNoYXJ0LCBBZ2UgcGxheXMgYSB2aXRhbCBmYWN0b3IgaW4gdGhlIGluY2lkZW5jZSBvZiBzdHJva2UuIEFzIGFnZSBvZiB0aGUgcGFydGljaXBhbnRzIHByb2dyZXNzZXMgc28gaXMgdGhlIHByZXZhbGVuY2Ugb2Ygc3Ryb2tlLiBXb21lbiB0ZW5kIHRvIGJlIHByb25lIGF0IGFuIGVhcmxpZXIgYWdlIHdoaWxlIG1vcmUgbWVuIGRldmVsb3AgdGhlIGlsbG5lc3Mgb3ZlciB0aW1lLg0KDQoNCkF2ZXJhZ2UgU3Ryb2tlIEluY2lkZW5jZSBieSBBZ2UNCmBgYHtyfQ0KbWVhbih3aXRoc3Ryb2tlJGFnZSkNCmBgYA0KDQoNCg0KU1RST0tFIEFORCBIWVBFUlRFTlNJT04NCg0KSHlwZXJ0ZW5zaW9uDQphbHNvIGtub3duIGFzIGhpZ2ggb3IgcmFpc2VkIGJsb29kIHByZXNzdXJlLCBpcyBhIGNvbmRpdGlvbiBpbiB3aGljaCB0aGUgYmxvb2QgdmVzc2VscyBoYXZlIHBlcnNpc3RlbnRseSByYWlzZWQgcHJlc3N1cmUuIEh5cGVydGVuc2lvbiBjb3VsZCBsZWFkIHRvIHN0cm9rZS4NCmBgYHtyfQ0Kc3RhdCA8LSBpZmVsc2Uoc3Ryb2tlJHN0cm9rZT09MSwic3Ryb2tlIiwibm8gc3Ryb2tlIikNCmhpZ2hibG9vZCA8LSBpZmVsc2Uoc3Ryb2tlJGh5cGVydGVuc2lvbj09MSwid2l0aCBoeXBlcnRlbnNpb24iLCJ3aXRob3V0IGh5cGVydGVuc2lvbiIpDQp0YWJsZShoaWdoYmxvb2QsIHN0YXQpDQpgYGANCldlIGhhdmUgYSB0b3RhbCBvZiA0OTggcGFydGljaXBhbnRzIHRoYXQgYXJlIGh5cGVydGVuc2l2ZSBvciA5LjglLg0KDQogQW5kIDY2IG9mIGh5cGVydGVuc2l2ZSBwYXJ0aWNpcGFudHMgZGV2ZWxvcGVkIHN0cm9rZSBvciAxMy4yNSUgDQoNCk9uIHRoZSBvdGhlciBoYW5kLCB3ZSBoYXZlIDQ2MTIgcGFydGljaXBhbnRzIHdpdGhvdXQgaHlwZXJ0ZW5zaW9uIGFuZCAxODMgb2YgdGhlbSBoYWQgYSBzdHJva2Ugb3IgMy45NyUNCg0KSW4gY29uY2x1c2lvbiwgd2l0aCBoeXBlcnRlbnNpb24sIHlvdSBnZXQgMyB0aW1lcyBhcyBtdWNoIGNoYW5jZSBvZiBkZXZlbG9waW5nIHN0cm9rZS4gDQoNCg0KDQpTVFJPS0UgQU5EIEhFQVJUIERJU0VBU0UNCmBgYHtyfQ0Kc3RhdCA8LSBpZmVsc2Uoc3Ryb2tlJHN0cm9rZT09MSwic3Ryb2tlIiwibm8gc3Ryb2tlIikNCmhlYXJ0LmRpc2Vhc2UgPC0gaWZlbHNlKHN0cm9rZSRoZWFydF9kaXNlYXNlPT0xLCJ3aXRoIGhlYXJ0IGRpc2Vhc2UiLCJ3aXRob3V0IGhlYXJ0IGRpc2Vhc2UiKQ0KdGFibGUoaGVhcnQuZGlzZWFzZSwgc3RhdCkNCmBgYA0KV2UgaGF2ZSBhIHRvdGFsIG9mIDI3NiBwYXJ0aWNpcGFudHMgdGhhdCBoYXZlIGhlYXJ0IGRpc2Vhc2Ugb3IgNS40JSBvZiBvdmVyYWxsIHBhcnRpY2lwYW50cywgDQoNCjQ3IG9mIHRob3NlIG9yIDE3JSBoYXZlIGRldmVsb3BlZCBzdHJva2UuDQoNCldoaWxlIDQ4MzQgT0YgcGFydGljaXBhbnRzIGRvIG5vdCBoYXZlIGhlYXJ0IGRpc2Vhc2UgeWV0IDIwMiBoYXZlIGRldmVsb3BlZCBzdHJva2Ugb3IgNC4yJQ0KDQpJbiBjb25jbHVzaW9uLCB3aXRoIGhlYXJ0IGRpc2Vhc2UsIHlvdSBnZXQgNCB0aW1lcyBhcyBtdWNoIGNoYW5jZSBvZiBkZXZlbG9waW5nIHN0cm9rZS4NCg0KDQpXSEFUIElGOiB5b3UgaGF2ZSBIeXBlcnRlbnNpb24gYW5kIEhlYXJ0IGRpc2Vhc2UgYXQgdGhlIHNhbWUgdGltZT8NCmBgYHtyfQ0Kc3VtKHN0cm9rZSRoeXBlcnRlbnNpb249PTEgJiBzdHJva2UkaGVhcnRfZGlzZWFzZT09MSkNCmBgYA0KT2YgYWxsIGFwcGxpY2FudHMsIDY0IGhhdmUgYm90aCBoeXBlcnRlbnNpb24gYW5kIGhlYXJ0IGRpc2Vhc2UNCmBgYHtyfQ0Kc3VtKHN0cm9rZSRoeXBlcnRlbnNpb249PTEgJiBzdHJva2UkaGVhcnRfZGlzZWFzZT09MSAmIHN0cm9rZSRzdHJva2U9PTEpDQpgYGANCmFuZCAxMyBvZiB0aG9zZSBkZXZlbG9wZWQgc3Ryb2tlIG9yIDIwLjMxJQ0KDQpPdmVyYWxsLCB0aGUgcmlzayBvZiBzdHJva2UgaXMgNiB0aW1lcyBhcyBoaWdoIGlmIHlvdSBoYXZlIGJvdGggaHlwZXJ0ZW5zaW9uIGFuZCBoZWFydCBkaXNlYXNlLg0KDQpLZWVwIFRyYWNrIG9mIHlvdXIgaGVhcnQgaGVhbHRoIHRvIHByZXZlbnQgc3Ryb2tlLg0KDQoNCkdMVUNPU0UgTEVWRUwgT0YgUEFSVElDSVBBTlRTDQpgYGB7cn0NCmhpc3Qoc3Ryb2tlJGF2Z19nbHVjb3NlX2xldmVsKQ0KYGBgDQpgYGB7cn0NCm1lYW4oc3Ryb2tlJGF2Z19nbHVjb3NlX2xldmVsKQ0KYGBgDQpUaGUgcGFydGljaXBhbnRzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZCB3aXRoaW4gdGhlIGxvd2VyIHJhbmdlIG9yIHdpdGggYSBtZWFuIG9mIDEwNi4xNSBvZiBnbHVjb3NlIGxldmVsDQoNCg0KU1RST0tFIEFORCBHTFVDT1NFIExFVkVMDQpgYGB7cn0NCndpdGhzdHJva2UgJT4lIGdncGxvdChhZXMoYXZnX2dsdWNvc2VfbGV2ZWwsIGZpbGw9Z2VuZGVyKSkgKyBnZW9tX2RlbnNpdHkoYWxwaGE9MC4yKSArIGdndGl0bGUoIlN0cm9rZSBhbmQgR2x1Y29zZSBMZXZlbCBieSBHZW5kZXIiKQ0KDQp3aXRoc3Ryb2tlICU+JSBnZ3Bsb3QoYWVzKGFnZSwgYXZnX2dsdWNvc2VfbGV2ZWwsIGNvbG9yPWdlbmRlcikpICsgZ2VvbV9wb2ludCgpICsgZ2d0aXRsZSgiU3Ryb2tlIGFuZCBHbHVjb3NlIExldmVsIG92ZXIgVGltZSIpDQoNCmBgYA0KTW9yZSBwYXJ0aWNpcGFudHMgd2l0aCBsb3dlciBnbHVjb3NlIGxldmVsIGRldmVsb3BlZCBzdHJva2UgYW5kIG1vc3RseSB3ZXJlIHdvbWVuIHdoaWxlIHRoZSBvcHBvc2l0ZSBzcGVjdHJ1bSBvZiBlbGV2YXRlZCBnbHVjb3NlIGxldmVscyB0aGF0IGRldmVsb3BlZCB0aGUgaWxsbmVzcyB3ZXJlIG1lbi4NCg0KSW4gY29uY2x1c2lvbiwga2VlcGluZyBvbmUncyBnbHVjb3NlIGxldmVsIGF0IG5vcm1hbCBsZXZlbCB3aWxsIGRlY3JlYXNlIHRoZSBjaGFuY2Ugb2YgZGV2ZWxvcGluZyB0aGUgaWxsbmVzcyBvdmVyIHRpbWUuDQoNCg0KQk1JDQpgYGB7cn0NCmJtaV8gPC0gaWZlbHNlKHN0cm9rZSRibWk9PSJOL0EiLDAsc3Ryb2tlJGJtaSkNCmJtaV8gPC0gYXMubnVtZXJpYyhibWlfKQ0KaGlzdChibWlfKQ0KYGBgDQpgYGB7cn0NCm1lYW4oYm1pXykNCmBgYA0KVGhlIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgQk1JIGZyb20gdGhlIHBhcnRpY2lwYW50cyBhcmUgYmV0d2VlbiAyMC00MCB3aXRoIGEgbWVhbiBvZiAyNy43Ni4NCg0KVGhlIG5vcm1hbCBCTUkgaXMgMjQuDQoNCg0KQk1JIEFORCBTVFJPS0UNCmBgYHtyfQ0KYm1pX3dpdGhzdHJva2UgPC0gaWZlbHNlKHdpdGhzdHJva2UkYm1pPT0iTi9BIiwwLHdpdGhzdHJva2UkYm1pKQ0KYm1pX3dpdGhzdHJva2UgPC0gYXMubnVtZXJpYyhibWlfd2l0aHN0cm9rZSkNCmhpc3QoYm1pX3dpdGhzdHJva2UpDQpgYGANCmBgYHtyfQ0KbWVhbihibWlfd2l0aHN0cm9rZSkNCmBgYA0KRnJvbSB0aGUgcGFydGljaXBhbnRzIHdpdGggc3Ryb2tlICgyNDkpLCB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiBvZiBCTUkgaXMgMjUuNTcgY29uY2x1ZGluZyB0aGF0IGV2ZW4gaGF2aW5nIGNsb3NlIHRvIGEgbm9ybWFsIHJhbmdlIG9mIEJNSSwgc3Ryb2tlIGNhbiBwb3RlbnRpYWxseSBkZXZlbG9wLg0KDQoNCk5vdywgbGV0J3MgQW5hbHl6ZSB0aGUgTGlmZXN0eWxlIGNyaXRlcmlhIGFuZCBvYnNlcnZlIGlmIHRoZXNlICB0cmlnZ2VyZWQgYSBkZXZlbG9wbWVudCBvZiBzdHJva2UgdG8gb3VyIHBhcnRpY2lwYW50cw0KDQpNQVJSSUFHRQ0KYGBge3J9DQpzdHJva2UgJT4lIGdncGxvdChhZXMoZXZlcl9tYXJyaWVkKSkgKyBnZW9tX2Jhcih3aWR0aD0wLjIpICsgZ2d0aXRsZSgiTWFycmlhZ2Ugc3RhdHVzIEFsbCBQYXJ0aWNpcGFudHMiKQ0KYGBgDQpNb3N0IG9mIHRoZSBwYXJ0aWNpcGFudHMgYXJlIG1hcnJpZWQuDQoNCg0KTUFSUklBR0UgQU5EIFNUUk9LRQ0KYGBge3J9DQpldmVyLm1hcnJpZWQgPC0gc3Ryb2tlJGV2ZXJfbWFycmllZA0KdGFibGUoZXZlci5tYXJyaWVkLHN0YXQpDQpgYGANCkZvciB0aGUgbm9uLW1hcnJpZWQgb25seSAyOSBwYXJ0aWNpcGFudHMgZGV2ZWxvcGVkIHN0cm9rZSBhbmQgMjIwIGZvciB0aGUgbWFycmllZC4gDQoNClRoZSBwcm9iYWJpbGl0eSwgZm9yIHRoZSBub24tbWFycmllZCB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIGNvbmRpdGlvbiBpcyAxLjclIGFuZCBmb3IgdGhlIG1hcnJpZWQgYXQgNi42JS4NCg0KSW4gc3VtbWFyeSBmb3IgbWFycmllZCBpbmRpdmlkdWFscywgb25lIGNhbiBnZXQgNCB0aW1lcyBhcyBtdWNoIGNoYW5jZSBvZiBkZXZlbG9waW5nIHN0cm9rZS4gVGhlcmVmb3JlLCBtYWtlIHlvdXIgd2lmZSBoYXBweSBhbmQgZXZlcnl0aGluZyB3aWxsIGJlIGFscmlnaHQuIDopDQoNCg0KUkVTSURFTkNFOiBDYW4geW91ciBwbGFjZSBvciByZXNpZGVuY2UgaGF2ZSBhIGZhY3RvciBpbiBkZXZlbG9waW5nIHN0cm9rZT8NCmBgYHtyfQ0Kc3Ryb2tlICU+JSBnZ3Bsb3QoYWVzKFJlc2lkZW5jZV90eXBlKSkgKyBnZW9tX2Jhcih3aWR0aD0wLjIpICsgZ2d0aXRsZSgiUGxhY2Ugb2YgUmVzaWRlbmNlIEFsbCBQYXJ0aWNpcGFudHMiKQ0KYGBgDQpPdXIgcGFydGljaXBhbnRzIGhhdmUgYWJvdXQgdGhlIHNhbWUgbnVtYmVyIGluIHBsYWNlIG9mIHJlc2lkZW5jZSwgZWl0aGVyIHJ1cmFsIG9yIHVyYmFuDQoNClJFU0lERU5DRSBBTkQgU1RST0tFDQpgYGB7cn0NCnJlc2lkZSA8LSBzdHJva2UkUmVzaWRlbmNlX3R5cGUNCnRhYmxlKHJlc2lkZSwgc3RhdCkNCmBgYA0KDQpSdXJhbCAgIDQuNTMlDQpVcmJhbiAgIDUuMjAlDQoNCkluIGNvbmNsdXNpb24sIGJhc2VkIG9uIG91ciBzYW1wbGUsIHRoZXJlIGlzIG5vdCBtdWNoIGV4dHJlbWUgZGlmZmVyZW5jZSBpbiBwbGFjZSBvZiByZXNpZGVuY2UgdGhhdCB3b3VsZCB0cmlnZ2VyIGEgZGV2ZWxvcG1lbnQgb2Ygc3Ryb2tlLiBXaGF0ZXZlciBvciB3aGVyZXZlciBwbGFjZSB5b3UgbWF5IGJlIGxpdmluZywgdGhlIHBvdGVudGlhbCBleGlzdHMgYWxtb3N0IGFzIG11Y2guDQoNCg0KV09SSw0KTW9zdCBvZiB0aGUgcGVvcGxlIGhhdmUgam9icy4gSXQgaXMgbmVlZGVkIGZvciBzdXJ2aXZhbC4gQ2FuIHRoZSBzYW1lIHJlYXNvbiB0byBzdXJ2aXZlIGxlYWQgdXMgdG8gZGV2ZWxvcCBhIHNldmVyZSBjb25kaXRpb24gc3VjaCBhcyBzdHJva2U/IGlmIHNvLCB3aGljaCB3b3JrIHR5cGUgY291bGQgaXQgYmU/IGxldCdzIGZpbmQgb3V0LiANCmBgYHtyfQ0Kc3Ryb2tlICU+JSBnZ3Bsb3QoYWVzKHdvcmtfdHlwZSkpICsgZ2VvbV9iYXIod2lkdGg9MC4yKSArIGdndGl0bGUoIldvcmsgVHlwZSBBbGwgUGFydGljaXBhbnRzIikNCmBgYA0KTWFqb3JpdHkgb2YgdGhlIHBhcnRpY2lwYW50cyBhcmUgaW4gdGhlIFByaXZhdGUgU2VjdG9yLiANCg0KDQpXT1JLIFRZUEUgQU5EIFNUUk9LRQ0KYGBge3J9DQp3b3JrIDwtIHN0cm9rZSR3b3JrX3R5cGUNCnRhYmxlKCB3b3JrLCBzdGF0KQ0KYGBgDQpTdGF0aXN0aWNhbGx5LCB0aGUgcHJvYmFiaWxpdHkgb2YgZGV2ZWxvcGluZyBhIHN0cm9rZSBieSB3b3JrOg0KDQpDaGlsZHJlbiAgICAgICAgMC4yOSUNCkdvdl9qb2IgICAgICAgICA1LjAyJQ0KTmV2ZXJfd29ya2VkICAgIDAlDQpQcml2YXRlICAgICAgICAgNS4wOSUNClNlbGYtZW1wbG95ZWQgICA3Ljk0JQ0KDQpCYXNlZCBvbiBwYXJ0aWNpcGFudHMgZGF0YSwgdGhvc2UgdGhhdCBuZXZlciB3b3JrZWQgaGFkIDAgcHJvYmFiaWxpdHkgb2YgZGV2ZWxvcGluZyBzdHJva2UsIHdoZXJlYXMgY2hpbGRyZW4gaGFkIHNtYWxsIGEgb25lLiBCb3RoIEdvdmVybm1lbnQgYW5kIFByaXZhdGUgd29yayBzZWN0b3JzIGhhdmUgdGhlIHNhbWUgcHJvYmFiaWxpdHkgYW5kIHRoZSBTZWxmLWVtcGxveWVkIGhhdmUgdGhlIGhpZ2hlc3QgcHJvYmFiaWxpdHkuDQoNCldoYXQgd29yayB0eXBlIGhhdmUgeW91PyANCg0KU01PS0lORw0KYGBge3J9DQpzdHJva2UgJT4lIGdncGxvdChhZXMoc21va2luZ19zdGF0dXMpKSArIGdlb21fYmFyKHdpZHRoPTAuMikgKyBnZ3RpdGxlKCJTbW9raW5nIEFsbCBQYXJ0aWNpcGFudHMiKQ0KYGBgDQpNb3N0IG9mIHRoZSB0b3RhbCBwYXJ0aWNpcGFudHMgbmV2ZXIgc21va2VkLiBBbHRob3VnaCB0aGVyZSBpcyBhIGEgbG90IG9mICJ1bmtub3duIiBkYXRhLCB0aGUgdGhyZWUgc3RhdHVzZXMgc2hvdWxkIGJlIGVub3VnaCB0byAgZGV0ZXJtaW5lIGluZGl2aWR1YWwgcHJvYmFiaWxpdGllcy4NCmBgYHtyfQ0Kc21va2UgPC0gc3Ryb2tlJHNtb2tpbmdfc3RhdHVzDQp0YWJsZSggc21va2UsIHN0YXQpDQpgYGANClN0YXRpc3RpY2FsbHksIHRoZSBwcm9iYWJpbGl0eSBvZiBkZXZlbG9waW5nIGEgc3Ryb2tlIGJ5IFNtb2tpbmc6DQoNCmZvcm1lcmx5ICAgICAgICA3LjkxJQ0KbmV2ZXIgc21va2VkICAgIDQuNzYlDQpzbW9rZXMgICAgICAgICAgNS4zMiUNClVua25vd24gICAgICAgICAzLjA0JSUNCg0KU21va2luZywgZXZlbiBpZiB5b3UgaGF2ZSBzdG9wcGVkIGFscmVhZHksIGluY3JlYXNlcyB0aGUgcmlzayBvZiBzdHJva2UgYXMgdGhlIGRhdGEgdGVsbHMgdXMuIA0KDQoNCg0KT3ZlcmFsbCBUYWtlYXdheTogDQoNCk5PdyB0aGF0IHlvdSBoYXZlIGFuIG92ZXJ2aWV3IGFuYWx5c2lzIG9mIHRoZSBzdHJva2UgaW5kaWNhdG9ycyB0aHJvdWdoIHRoaXMgZGF0YSwgeW91IGNhbiBhbnN3ZXIgZm9yIHlvdXJzZWxmIGhvdyBjbG9zZSBvciBwcmV2ZW50aXZlIHlvdSBhcmUgdG8gZGV2ZWxvcGluZyBzdHJva2UuIFdlIGFsbCB3YW50IHRvIHByZXZlbnQgdGhpcyBldmVudCBmcm9tIGRldmVsb3BpbmcgYXMgd2UgcHJvZ3Jlc3MgdGhyb3VnaCBhZ2UsIGFuZyBhZ2UgaXMgYSBodWdlIGZhY3RvciBpbiBkZXZlbG9waW5nIHN0cm9rZSBhcyBkYXRhIHN1Z2dlc3RzLiBJZiB3ZSByZW1haW4gaW4gb3VyIGN1cnJlbnQgaGVhbHRoIGFuZCBsaWZlc3R5bGUgY29uZGl0aW9ucyBrbm93aW5nIGl0IGluY3JlYXNlcyB0aGUgcmlzaywgdGhlbiBhdCBvbmUgcG9pbnQgaW4gdGltZSBpdCBtYXkgaGFwcGVuLiAgDQoNClRvIGtlZXAgdGhlIHByb2JhYmlsaXR5IGxvdywgaW5jbHVkaW5nIG90aGVyIGNyaXRlcmlhIGluIHRoaXMgYW5hbHlzaXMsIG9uZSBzaG91bGQgbWFrZSBzdXJlIHRvIG1pbmltaXplIHdoYXQgY291bGQgcG90ZW50aWFsbHkgaW5jcmVhc2UgdGhlIHJpc2sgYXMgb25lIG9yIG1vcmUgb2YgdGhlc2UgY3JpdGVyaWEgY29tYmluZWQgKGV4YW1wbGUgaHlwZXJ0ZW5zaW9uICsgaGVhcnQgZGlzZWFzZSkgdGhlIHJpc2sgaW5jcmVhc2VzIGV2ZW4gaGlnaGVyLg0KDQpPbmUgdGhpbmcgdGhhdCB3ZSBjYW5ub3QgY29udHJvbCBpcyBBZ2UuIEV2ZXJ5Ym9keSBhZ2VzLCBidXQgdGhlIHJlc3Qgb2YgY3JpdGVyaWEgaW4gdGhpcyBkYXRhLCB3ZSBjYW4uIEEgYmV0dGVyIGhlYXJ0IGhlYWx0aCwgTm90IFNtb2tpbmcsIE1hbmFnZSBTdHJlc3MsIG5vcm1hbGl6ZSBCTUkgYW5kIHRoZSB3b3JrcyB3aWxsIHN1cmVseSBsb3dlciB0aGUgcmlzayBvZiBzdHJva2UgaW4gb3VyIGxpdmVzLg0KDQoNCk1heSB0aGlzIGFuYWx5c2lzIGdpdmUgeW91IGEgZGF0YS1kcml2ZW4gZGVjaXNpb24gdG8gZGVjaWRlIHRoZSBoZWFsdGggYW5kIGxpZmVzdHlsZSBjaG9pY2VzIHRvIGNvbnNpZGVyIHRvd2FyZHMgdGhlIGdvYWwgb2Ygc3Ryb2tlIHByZXZlbnRpb24uIA0KDQpUaGFuayB5b3UuDQoNCg0KDQojY29tcHV0aW5nIHByb2JhYmlsaXRpZXMNCmBgYHtyfQ0KcGVyY2VudCA8LSBmdW5jdGlvbigpew0KICBhIDwtIHJlYWRsaW5lKHByb21wdCA9ICJhOiAiKQ0KICBiIDwtIHJlYWRsaW5lKHByb21wdCA9ICJiOiAiKQ0KICBhIDwtIGFzLm51bWVyaWMoYSkNCiAgYiA8LSBhcy5udW1lcmljKGIpDQogIGMgPSAoYS8oYStiKSkqMTAwDQogIHByaW50KGMpDQp9DQpgYGANCg0KDQoNCg0K