Introduction
This project explores how lifestyle, demographic, and health factors
influence sleep quality, sleep duration, and the presence of sleep
disorders. The goal is to uncover actionable insights that can help
individuals improve their sleep health.
Business Objective
The objective of this analysis is to determine which lifestyle and
health-related factors most significantly affect sleep health. I aim
to:
Identify trends and correlations.
Highlight potential risk factors for sleep disorders.
Offer data-driven recommendations.
Success will be measured by the ability to draw clear, actionable
conclusions and (optionally) build a simple predictive model using
Excel.
Key Questions
This project seeks to answer the following questions:
How does age correlate with sleep duration?
Do men and women report different sleep quality levels?
Are certain occupations more prone to sleep disorders?
Is there a pattern between occupation type and physical
activity?
How does physical activity level impact sleep quality?
Is there a relationship between daily steps and sleep
duration?
Do people with high stress levels sleep less or report poorer
sleep quality?
Are people with higher physical activity levels less likely to
have sleep disorders?
How does heart rate vary with sleep quality or
disorders?
Is there a relationship between BMI and sleep duration or
disorder occurrence?
Do people with healthy BMI ranges have better sleep?
What factors are most associated with short sleep duration (<6
hours)?
What predicts high sleep quality (>7/10)?
Which features are most predictive of having a sleep
disorder?
Do people who walk more steps have lower stress and better
sleep?
Can we recommend an optimal lifestyle profile (steps, activity
level, BMI, stress) for better sleep?
Among individuals with high sleep quality, what are the common
lifestyle patterns?
Which combinations of stress and activity result in the worst
sleep?
Is there a threshold of daily steps beyond which sleep quality
doesn’t improve?
Dataset Overview
The dataset includes 374 observations and 13 variables (columns):
- Age (Numeric)
- Gender (Male/Female)
- Occupation (Categorical)
- Sleep Duration (Hours)
- Quality of Sleep (1–10)
- Physical Activity Level
- Stress Level (1–10)
- BMI
- Heart Rate
- Daily Steps
- Sleep Disorder (None, Insomnia, Apnea)
Source: Kaggle
Data Preparation
Data cleaning was initially done using Excel:
Assigned appropriate formats to columns.
Ensured data doesn’t have blank cells or duplicate data.
Verified numerical columns for valid ranges and
outliers.
Created Age Range to group participants by age.
Categorized blood pressure into Normal, Hypertension Stage 1 and
Hypertension Stage 2 according to the American College of Cardiology/
American Heart Association.
Blood pressure chart
Categorised participants into sleeper types: Short sleeper,
Normal sleeper and Excessive sleeper; based on the general
recommendations of the Cleveland
Clinic, Mayo
Clinic, and Healthline.
Categorised activity levels into the following: Very light
activity, Light activity, Moderate activity, Vigorous activity, Very
hard activity, Maximum effort activity based on classifications of the
American
Physical Therapy Association.
RPE scale
Further data processing was done in Power BI:
Created calculated columns and measures to allow for easy data
summarisation
Exploratory Analysis
Demographic data dashboard
25-29 year olds have the shortest sleep duration and 55+ year
olds have the longest average sleep duration.
Females have higher sleep quality(52%) than males (48%).
Nurses report the highest levels of physical activity.
The engineering professioin has the most people with no sleep
disorders, the nursing profession has the most people suffering sleep
apnea while the salesperson profession has the most people suffering
insomnia.
Lifestyle data dashboard
Sleep quality rises with physical activity levels and peaks
between levels 80-85.
Average daily steps is 6,820 steps.
People who fall into the short sleeper category record below
average daily steps, normal sleepers record the highest sleep duration
at an average of 5000 daily steps.
The highest level of insomnia is observed in people who engage in
moderate level physical activity, the highest level of sleep apnea is
observed in people who perform very hard activity and light physical
activity has the most amount of people with no sleep disorders.
The highest stress level (8) records the worst sleep quality
(5.86) while the least stress level (3) records the best sleep quality
(8.97).
Health metrics dashboard
People in the Obese BMI category record the least sleep duration
and quality while people in the normal BMI category record the highest
sleep duration and quality.
The average heart rate for subjects with the worst sleep quality
(4) is 85bpm, the average heart rate for subjects with the best sleep
quality (9) is 65.34bpm.
Most participants with blood-pressure within the Normal,Elevated
and Hypertension stage 1 categories experience no sleep disorder; sleep
apnea is most prevalent in the Hypertension stage 2 category.
Sleep health dashboard
Average sleep duration is 7.13 hours.
The normal BMI category records the longest sleep duration
whereas the obese category records the least.
Stress level is observed to be lowest in Normal blood-pressure
group and highest in the Elevated blood-pressure group.
Sleep duration is observed to be lowest in Hypertension stage 2
blood-pressure group and longest in elevated blood-pressure
group.
The hypertension stage 2 category records the highest average
daily steps for people experiencing sleep apnea as well as people
experiencing no disorders, the normal blood pressure category on the
other hand shows the highest daily steps for people experiencing
insomnia.
Behavioral insights dashboard
- The best sleep quality and least stress level were observed at 6000
average daily steps,
- At stress level of 3, sleep quality is highest for light, very hard
and vigorous activity levels.
- The obese and the overweight categories only have low sleep
quality.
Key Insights
Sleep duration increases with age. The oldest group (55+) reports
the highest sleep duration while the youngest group (25-29) reports the
least.
The donut chart shows that females report higher sleep quality
than males.
The ‘Sleep Disorder Occurence by Occupation’ area chart shows
variation by occupation. Some occupations like sales representative,
salesperson, teacher and nurse exhibit higher sleep disorder rates,
while others show lower rates.
Physical activity levels vary across occupations. Professions
like nursing and law tend to have higher levels of physical activity
while other professions have less. Sales representatives show the least
level of physical activity.
An increase in physical activity levels is positively associated
with better sleep.
Daily walking as measured by daily steps, does not have a direct
impact on sleep duration.
Higher levels of stress are linked to poor sleep quality, people
with high levels of stress report lower levels of sleep
quality.
Individuals who engage in light activity are less likely to
report sleep disorders.
Individuals with lower heart rates tend to have better sleep
quality and report less sleep disorders.
Higher BMI is linked to shorter sleep duration. However, sleep
disorders are distributed across categories with the Normal BMI group
showing the highest prevalence.
The highest sleep quality is recorded among people in the normal
BMI category.
High stress, low physical activity and high BMI are all strongly
associated with shorter sleep duration.
Low stress levels, healthy BMI and increased physical activity
are linked to better sleep quality.
High stress, high BMI, low physical activity and very low daily
exercise are strong indicators of sleep disorders.
People who walk more steps daily experience lower stress levels
and better sleep quality.
The charts show an optimal profile: 6,000–10,000 steps per day,
moderate to vigorous physical activity, normal BMI, and low stress for
best sleep quality.
Lifestyle habits that relate to high sleep quality include normal
BMI, moderate-vigorous physical activity, active daily routines and
minimal stress.
A combination of high stress and low physical activity gives the
worst possible sleep quality outcomes.
Sleep quality peaks a second time at about 7,500 steps per day,
after which it begins to decline steadily.
Recommendations
Encourage moderate to vigorous exercise routines across all age
groups, aiming for at least 30 minutes per day. This supports both
physical and sleep health.
Professions with higher sleep disorder rates (for instance,
teachers, nurses, sales attendants) may benefit from targeted stress
reduction programs, flexible schedules, and wellness
interventions.
Stress management techniques such as mindfulness, relaxation, or
counseling should be promoted, especially for high-stress
groups.
Support programs that help people achieve and maintain a normal
BMI, as this is strongly linked to better sleep outcomes.
Set realistic step goals. Promote walking goals in the range of
5,000–7,500 steps per day. Beyond this range, there may be less
benefits. Consistent movement is more beneficial than step
extremes.
Individuals should be educated on how daily lifestyle factors
impact sleep quality to allow them make small, sustainable
changes.
Use the optimal lifestyle profile (normal BMI, low stress,
moderate-to-high physical activity, 7,500 steps/day) as a behavioral
model in sleep health campaigns.
Identify individuals with combinations of high BMI, low activity,
and high stress as high risk for sleep disorders, and prioritise them
for intervention.
Conclusion
This analysis shows that sleep health is deeply influenced by
lifestyle behaviors, including stress levels, physical activity, BMI,
and daily habits. Age, gender, and occupation also play key roles in
shaping sleep experiences for individuals.
Key findings suggest:
Age and gender matter: Older adults tend to sleep longer, while
females sleep better than males.
Occupation is linked to sleep disorders: Sales, teaching, and
healthcare professions show higher disorder rates; possibly due to
work-related stress or irregular schedules.
Activity and sleep Are closely connected: Higher physical
activity correlates strongly with better sleep quality, while sedentary
routines and low daily steps are associated with poor sleep and elevated
stress.
Stress contributes tremendously to poor sleep: High stress levels
consistently predict lower sleep quality and a higher likelihood of
sleep disorders.
Body weight and sleep: A normal BMI is consistently associated
with better sleep duration and quality. Meanwhile, higher BMI,
especially when paired with stress and inactivity, is a strong indicator
of sleep problems.
Daily steps have a threshold effect: Daily walking does not
directly improve sleep duration but it supports lower stress and better
sleep quality up to a certain point - (about 7,500 steps), after which
benefits decline.
Future work could explore time-based patterns in data and take a look
at some other lifestyle factors that may influence sleep. Like the
effects of screen time before bed on sleep quality and duration, or
investigate the outcomes between people who stick to consistent sleep
schedules and those who do not. Or even observe the role of caffeine
and/or diet in relation to stress and sleep quality. Integrating
wearable device tracking for richer insights could be considered as
well.
LS0tDQp0aXRsZTogIlNsZWVwIEhlYWx0aCBhbmQgTGlmZXN0eWxlIEFuYWx5c2lzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQplZGl0b3Jfb3B0aW9uczogDQogIG1hcmtkb3duOiANCiAgICB3cmFwOiBzZW50ZW5jZQ0KLS0tDQoNCg0KIyMgSW50cm9kdWN0aW9uDQoNClRoaXMgcHJvamVjdCBleHBsb3JlcyBob3cgbGlmZXN0eWxlLCBkZW1vZ3JhcGhpYywgYW5kIGhlYWx0aCBmYWN0b3JzIGluZmx1ZW5jZSBzbGVlcCBxdWFsaXR5LCBzbGVlcCBkdXJhdGlvbiwgYW5kIHRoZSBwcmVzZW5jZSBvZiBzbGVlcCBkaXNvcmRlcnMuDQpUaGUgZ29hbCBpcyB0byB1bmNvdmVyIGFjdGlvbmFibGUgaW5zaWdodHMgdGhhdCBjYW4gaGVscCBpbmRpdmlkdWFscyBpbXByb3ZlIHRoZWlyIHNsZWVwIGhlYWx0aC4NCg0KIyMgQnVzaW5lc3MgT2JqZWN0aXZlDQoNClRoZSBvYmplY3RpdmUgb2YgdGhpcyBhbmFseXNpcyBpcyB0byBkZXRlcm1pbmUgd2hpY2ggbGlmZXN0eWxlIGFuZCBoZWFsdGgtcmVsYXRlZCBmYWN0b3JzIG1vc3Qgc2lnbmlmaWNhbnRseSBhZmZlY3Qgc2xlZXAgaGVhbHRoLg0KSSBhaW0gdG86DQoNCiogSWRlbnRpZnkgdHJlbmRzIGFuZCBjb3JyZWxhdGlvbnMuDQoNCiogSGlnaGxpZ2h0IHBvdGVudGlhbCByaXNrIGZhY3RvcnMgZm9yIHNsZWVwIGRpc29yZGVycy4NCg0KKiBPZmZlciBkYXRhLWRyaXZlbiByZWNvbW1lbmRhdGlvbnMuDQoNClN1Y2Nlc3Mgd2lsbCBiZSBtZWFzdXJlZCBieSB0aGUgYWJpbGl0eSB0byBkcmF3IGNsZWFyLCBhY3Rpb25hYmxlIGNvbmNsdXNpb25zIGFuZCAob3B0aW9uYWxseSkgYnVpbGQgYSBzaW1wbGUgcHJlZGljdGl2ZSBtb2RlbCB1c2luZyBFeGNlbC4NCg0KIyMgS2V5IFF1ZXN0aW9ucw0KDQpUaGlzIHByb2plY3Qgc2Vla3MgdG8gYW5zd2VyIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zOg0KDQoxLiBIb3cgZG9lcyBhZ2UgY29ycmVsYXRlIHdpdGggc2xlZXAgZHVyYXRpb24/DQoNCjIuIERvIG1lbiBhbmQgd29tZW4gcmVwb3J0IGRpZmZlcmVudCBzbGVlcCBxdWFsaXR5IGxldmVscz8NCg0KMy4gQXJlIGNlcnRhaW4gb2NjdXBhdGlvbnMgbW9yZSBwcm9uZSB0byBzbGVlcCBkaXNvcmRlcnM/DQoNCjQuIElzIHRoZXJlIGEgcGF0dGVybiBiZXR3ZWVuIG9jY3VwYXRpb24gdHlwZSBhbmQgcGh5c2ljYWwgYWN0aXZpdHk/DQoNCjUuIEhvdyBkb2VzIHBoeXNpY2FsIGFjdGl2aXR5IGxldmVsIGltcGFjdCBzbGVlcCBxdWFsaXR5Pw0KDQo2LiBJcyB0aGVyZSBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGRhaWx5IHN0ZXBzIGFuZCBzbGVlcCBkdXJhdGlvbj8NCg0KNy4gRG8gcGVvcGxlIHdpdGggaGlnaCBzdHJlc3MgbGV2ZWxzIHNsZWVwIGxlc3Mgb3IgcmVwb3J0IHBvb3JlciBzbGVlcCBxdWFsaXR5Pw0KDQo4LiBBcmUgcGVvcGxlIHdpdGggaGlnaGVyIHBoeXNpY2FsIGFjdGl2aXR5IGxldmVscyBsZXNzIGxpa2VseSB0byBoYXZlIHNsZWVwIGRpc29yZGVycz8NCg0KOS4gSG93IGRvZXMgaGVhcnQgcmF0ZSB2YXJ5IHdpdGggc2xlZXAgcXVhbGl0eSBvciBkaXNvcmRlcnM/DQoNCjEwLiBJcyB0aGVyZSBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJNSSBhbmQgc2xlZXAgZHVyYXRpb24gb3IgZGlzb3JkZXIgb2NjdXJyZW5jZT8NCg0KMTEuIERvIHBlb3BsZSB3aXRoIGhlYWx0aHkgQk1JIHJhbmdlcyBoYXZlIGJldHRlciBzbGVlcD8NCg0KMTIuIFdoYXQgZmFjdG9ycyBhcmUgbW9zdCBhc3NvY2lhdGVkIHdpdGggc2hvcnQgc2xlZXAgZHVyYXRpb24gKFw8NiBob3Vycyk/DQoNCjEzLiBXaGF0IHByZWRpY3RzIGhpZ2ggc2xlZXAgcXVhbGl0eSAoXD43LzEwKT8NCg0KMTQuIFdoaWNoIGZlYXR1cmVzIGFyZSBtb3N0IHByZWRpY3RpdmUgb2YgaGF2aW5nIGEgc2xlZXAgZGlzb3JkZXI/DQoNCjE1LglEbyBwZW9wbGUgd2hvIHdhbGsgbW9yZSBzdGVwcyBoYXZlIGxvd2VyIHN0cmVzcyBhbmQgYmV0dGVyIHNsZWVwPw0KDQoxNi4JQ2FuIHdlIHJlY29tbWVuZCBhbiBvcHRpbWFsIGxpZmVzdHlsZSBwcm9maWxlIChzdGVwcywgYWN0aXZpdHkgbGV2ZWwsIEJNSSwgc3RyZXNzKSBmb3IgYmV0dGVyIHNsZWVwPw0KDQoxNy4gQW1vbmcgaW5kaXZpZHVhbHMgd2l0aCBoaWdoIHNsZWVwIHF1YWxpdHksIHdoYXQgYXJlIHRoZSBjb21tb24gbGlmZXN0eWxlIHBhdHRlcm5zPw0KDQoxOC4gV2hpY2ggY29tYmluYXRpb25zIG9mIHN0cmVzcyBhbmQgYWN0aXZpdHkgcmVzdWx0IGluIHRoZSB3b3JzdCBzbGVlcD8NCg0KMTkuIElzIHRoZXJlIGEgdGhyZXNob2xkIG9mIGRhaWx5IHN0ZXBzIGJleW9uZCB3aGljaCBzbGVlcCBxdWFsaXR5IGRvZXNu4oCZdCBpbXByb3ZlPw0KDQoNCiMjIERhdGFzZXQgT3ZlcnZpZXcNCg0KVGhlIGRhdGFzZXQgaW5jbHVkZXMgMzc0IG9ic2VydmF0aW9ucyBhbmQgMTMgdmFyaWFibGVzIChjb2x1bW5zKToNCg0KKiAgIEFnZSAoTnVtZXJpYykNCiogICBHZW5kZXIgKE1hbGUvRmVtYWxlKQ0KKiAgIE9jY3VwYXRpb24gKENhdGVnb3JpY2FsKQ0KKiAgIFNsZWVwIER1cmF0aW9uIChIb3VycykNCiogICBRdWFsaXR5IG9mIFNsZWVwICgx4oCTMTApDQoqICAgUGh5c2ljYWwgQWN0aXZpdHkgTGV2ZWwNCiogICBTdHJlc3MgTGV2ZWwgKDHigJMxMCkNCiogICBCTUkNCiogICBIZWFydCBSYXRlDQoqICAgRGFpbHkgU3RlcHMNCiogICBTbGVlcCBEaXNvcmRlciAoTm9uZSwgSW5zb21uaWEsIEFwbmVhKQ0KDQpTb3VyY2U6IFtLYWdnbGVdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvdW9tMTkwMzQ2YS9zbGVlcC1oZWFsdGgtYW5kLWxpZmVzdHlsZS1kYXRhc2V0KQ0KDQojIyBUb29scyBVc2VkDQoNClRoZSB0b29scyB1c2VkIGZvciB0aGlzIHByb2plY3QgYXJlOg0KDQoqIEV4Y2VsIGZvciBjbGVhbmluZyBkYXRhLg0KKiBQb3dlciBCSSBmb3IgdmlzdWFsaXNhdGlvbi4NCiogUiBzY3JpcHQgZm9yIGRvY3VtZW50YXRpb24uDQoNCiMjIERhdGEgUHJlcGFyYXRpb24NCg0KIyMjIyBEYXRhIGNsZWFuaW5nIHdhcyBpbml0aWFsbHkgZG9uZSB1c2luZyBFeGNlbDoNCg0KKiBBc3NpZ25lZCBhcHByb3ByaWF0ZSBmb3JtYXRzIHRvIGNvbHVtbnMuDQoNCiogRW5zdXJlZCBkYXRhIGRvZXNuJ3QgaGF2ZSBibGFuayBjZWxscyBvciBkdXBsaWNhdGUgZGF0YS4NCg0KKiBWZXJpZmllZCBudW1lcmljYWwgY29sdW1ucyBmb3IgdmFsaWQgcmFuZ2VzIGFuZCBvdXRsaWVycy4NCg0KKiBDcmVhdGVkIEFnZSBSYW5nZSB0byBncm91cCBwYXJ0aWNpcGFudHMgYnkgYWdlLg0KDQoqIENhdGVnb3JpemVkIGJsb29kIHByZXNzdXJlIGludG8gTm9ybWFsLCBIeXBlcnRlbnNpb24gU3RhZ2UgMSBhbmQgSHlwZXJ0ZW5zaW9uIFN0YWdlIDIgYWNjb3JkaW5nIHRvIHRoZSBBbWVyaWNhbiBDb2xsZWdlIG9mIENhcmRpb2xvZ3kvIEFtZXJpY2FuIEhlYXJ0IEFzc29jaWF0aW9uLg0KDQohW0Jsb29kIHByZXNzdXJlIGNoYXJ0XShDOlxVc2Vyc1xjaGlrZVxEb2N1bWVudHNcRGF0YSBmb3IgYW5hbHlzaXNcU2xlZXAgSGVhbHRoXGJsb29kLXByZXNzdXJlLWNoYXJ0LmpwZykNCg0KKiBDYXRlZ29yaXNlZCBwYXJ0aWNpcGFudHMgaW50byBzbGVlcGVyIHR5cGVzOiBTaG9ydCBzbGVlcGVyLCBOb3JtYWwgc2xlZXBlciBhbmQgRXhjZXNzaXZlIHNsZWVwZXI7IGJhc2VkIG9uIHRoZSBnZW5lcmFsIHJlY29tbWVuZGF0aW9ucyBvZiB0aGUgW0NsZXZlbGFuZCBDbGluaWNdKGh0dHBzOi8vbXkuY2xldmVsYW5kY2xpbmljLm9yZy9oZWFsdGgvYm9keS8xMjE0OC1zbGVlcC1iYXNpY3MpLCBbTWF5byBDbGluaWNdKGh0dHBzOi8vd3d3Lm1heW9jbGluaWMub3JnL2hlYWx0aHktbGlmZXN0eWxlL2FkdWx0LWhlYWx0aC9leHBlcnQtYW5zd2Vycy9ob3ctbWFueS1ob3Vycy1vZi1zbGVlcC1hcmUtZW5vdWdoL2ZhcS0yMDA1Nzg5OCksIGFuZCBbSGVhbHRobGluZV0oaHR0cHM6Ly93d3cuaGVhbHRobGluZS5jb20vaGVhbHRoL3NsZWVwL3NsZWVwLWNhbGN1bGF0b3IpLg0KDQoqIENhdGVnb3Jpc2VkIGFjdGl2aXR5IGxldmVscyBpbnRvIHRoZSBmb2xsb3dpbmc6IFZlcnkgbGlnaHQgYWN0aXZpdHksIExpZ2h0IGFjdGl2aXR5LCBNb2RlcmF0ZSBhY3Rpdml0eSwgVmlnb3JvdXMgYWN0aXZpdHksIFZlcnkgaGFyZCBhY3Rpdml0eSwgTWF4aW11bSBlZmZvcnQgYWN0aXZpdHkgYmFzZWQgb24gY2xhc3NpZmljYXRpb25zIG9mIHRoZSBbQW1lcmljYW4gUGh5c2ljYWwgVGhlcmFweSBBc3NvY2lhdGlvbl0oaHR0cHM6Ly93d3cuYXB0YS5vcmcvcGF0aWVudC1jYXJlL2V2aWRlbmNlLWJhc2VkLXByYWN0aWNlLXJlc291cmNlcy90ZXN0LW1lYXN1cmVzL29tbmktZXhlcnRpb24tc2NhbGUpLg0KDQohW1JQRSBzY2FsZV0oaHR0cHM6Ly93d3cuaGZlLmNvLnVrL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDIzLzAyL1JQRS1DaGFydC5wbmcpDQoNCiMjIyMgRnVydGhlciBkYXRhIHByb2Nlc3Npbmcgd2FzIGRvbmUgaW4gUG93ZXIgQkk6DQoNCkNyZWF0ZWQgY2FsY3VsYXRlZCBjb2x1bW5zIGFuZCBtZWFzdXJlcyB0byBhbGxvdyBmb3IgZWFzeSBkYXRhIHN1bW1hcmlzYXRpb24NCg0KDQojIyBFeHBsb3JhdG9yeSBBbmFseXNpcw0KDQohW0RlbW9ncmFwaGljIGRhdGEgZGFzaGJvYXJkXShDOlxVc2Vyc1xjaGlrZVxEb2N1bWVudHNcRGF0YSBmb3IgYW5hbHlzaXNcU2xlZXAgSGVhbHRoXERhc2hib2FyZHNcRGVtb2dyYXBoeS5wbmcpDQoNCiogMjUtMjkgeWVhciBvbGRzIGhhdmUgdGhlIHNob3J0ZXN0IHNsZWVwIGR1cmF0aW9uIGFuZCA1NSsgeWVhciBvbGRzIGhhdmUgdGhlIGxvbmdlc3QgYXZlcmFnZSBzbGVlcCBkdXJhdGlvbi4NCg0KKiBGZW1hbGVzIGhhdmUgaGlnaGVyIHNsZWVwIHF1YWxpdHkoNTIlKSB0aGFuIG1hbGVzICg0OCUpLg0KDQoqIE51cnNlcyByZXBvcnQgdGhlIGhpZ2hlc3QgbGV2ZWxzIG9mIHBoeXNpY2FsIGFjdGl2aXR5Lg0KDQoqIFRoZSBlbmdpbmVlcmluZyBwcm9mZXNzaW9pbiBoYXMgdGhlIG1vc3QgcGVvcGxlIHdpdGggbm8gc2xlZXAgZGlzb3JkZXJzLCB0aGUgbnVyc2luZyBwcm9mZXNzaW9uIGhhcyB0aGUgbW9zdCBwZW9wbGUgc3VmZmVyaW5nIHNsZWVwIGFwbmVhIHdoaWxlIHRoZSBzYWxlc3BlcnNvbiBwcm9mZXNzaW9uIGhhcyB0aGUgbW9zdCBwZW9wbGUgc3VmZmVyaW5nIGluc29tbmlhLg0KDQoNCiFbTGlmZXN0eWxlIGRhdGEgZGFzaGJvYXJkXShDOlxVc2Vyc1xjaGlrZVxEb2N1bWVudHNcRGF0YSBmb3IgYW5hbHlzaXNcU2xlZXAgSGVhbHRoXERhc2hib2FyZHNcTGlmZXN0eWxlLnBuZykNCg0KKiBTbGVlcCBxdWFsaXR5IHJpc2VzIHdpdGggcGh5c2ljYWwgYWN0aXZpdHkgbGV2ZWxzIGFuZCBwZWFrcyBiZXR3ZWVuIGxldmVscyA4MC04NS4NCg0KKiBBdmVyYWdlIGRhaWx5IHN0ZXBzIGlzIDYsODIwIHN0ZXBzLg0KDQoqICBQZW9wbGUgd2hvIGZhbGwgaW50byB0aGUgc2hvcnQgc2xlZXBlciBjYXRlZ29yeSByZWNvcmQgYmVsb3cgYXZlcmFnZSBkYWlseSBzdGVwcywgbm9ybWFsIHNsZWVwZXJzIHJlY29yZCB0aGUgaGlnaGVzdCBzbGVlcCBkdXJhdGlvbiBhdCBhbiBhdmVyYWdlIG9mIDUwMDAgZGFpbHkgc3RlcHMuDQoNCiogVGhlIGhpZ2hlc3QgbGV2ZWwgb2YgaW5zb21uaWEgaXMgb2JzZXJ2ZWQgaW4gcGVvcGxlIHdobyBlbmdhZ2UgaW4gbW9kZXJhdGUgbGV2ZWwgcGh5c2ljYWwgYWN0aXZpdHksIHRoZSBoaWdoZXN0IGxldmVsIG9mIHNsZWVwIGFwbmVhIGlzIG9ic2VydmVkIGluIHBlb3BsZSB3aG8gcGVyZm9ybSB2ZXJ5IGhhcmQgYWN0aXZpdHkgYW5kIGxpZ2h0IHBoeXNpY2FsIGFjdGl2aXR5IGhhcyB0aGUgbW9zdCBhbW91bnQgb2YgcGVvcGxlIHdpdGggbm8gc2xlZXAgZGlzb3JkZXJzLg0KDQoqIFRoZSBoaWdoZXN0IHN0cmVzcyBsZXZlbCAoOCkgcmVjb3JkcyB0aGUgd29yc3Qgc2xlZXAgcXVhbGl0eSAoNS44Nikgd2hpbGUgdGhlIGxlYXN0IHN0cmVzcyBsZXZlbCAoMykgcmVjb3JkcyB0aGUgYmVzdCBzbGVlcCBxdWFsaXR5ICg4Ljk3KS4NCg0KDQohW0hlYWx0aCBtZXRyaWNzIGRhc2hib2FyZF0oQzpcVXNlcnNcY2hpa2VcRG9jdW1lbnRzXERhdGEgZm9yIGFuYWx5c2lzXFNsZWVwIEhlYWx0aFxEYXNoYm9hcmRzXEhlYWx0aCBNZXRyaWNzLnBuZykNCg0KKiBQZW9wbGUgaW4gdGhlIE9iZXNlIEJNSSBjYXRlZ29yeSByZWNvcmQgdGhlIGxlYXN0IHNsZWVwIGR1cmF0aW9uIGFuZCBxdWFsaXR5IHdoaWxlIHBlb3BsZSBpbiB0aGUgbm9ybWFsIEJNSSBjYXRlZ29yeSByZWNvcmQgdGhlIGhpZ2hlc3Qgc2xlZXAgZHVyYXRpb24gYW5kIHF1YWxpdHkuDQoNCiogVGhlIGF2ZXJhZ2UgaGVhcnQgcmF0ZSBmb3Igc3ViamVjdHMgd2l0aCB0aGUgd29yc3Qgc2xlZXAgcXVhbGl0eSAoNCkgaXMgODVicG0sIHRoZSBhdmVyYWdlIGhlYXJ0IHJhdGUgZm9yIHN1YmplY3RzIHdpdGggdGhlIGJlc3Qgc2xlZXAgcXVhbGl0eSAoOSkgaXMgNjUuMzRicG0uDQoNCiogTW9zdCBwYXJ0aWNpcGFudHMgd2l0aCBibG9vZC1wcmVzc3VyZSB3aXRoaW4gdGhlIE5vcm1hbCxFbGV2YXRlZCBhbmQgSHlwZXJ0ZW5zaW9uIHN0YWdlIDEgY2F0ZWdvcmllcyBleHBlcmllbmNlIG5vIHNsZWVwIGRpc29yZGVyOyBzbGVlcCBhcG5lYSBpcyBtb3N0IHByZXZhbGVudCBpbiB0aGUgSHlwZXJ0ZW5zaW9uIHN0YWdlIDIgY2F0ZWdvcnkuDQoNCg0KIVtTbGVlcCBoZWFsdGggZGFzaGJvYXJkXShDOlxVc2Vyc1xjaGlrZVxEb2N1bWVudHNcRGF0YSBmb3IgYW5hbHlzaXNcU2xlZXAgSGVhbHRoXERhc2hib2FyZHNcU2xlZXAgSGVhbHRoLnBuZykNCg0KKiBBdmVyYWdlIHNsZWVwIGR1cmF0aW9uIGlzIDcuMTMgaG91cnMuDQoNCiogVGhlIG5vcm1hbCBCTUkgY2F0ZWdvcnkgcmVjb3JkcyB0aGUgbG9uZ2VzdCBzbGVlcCBkdXJhdGlvbiB3aGVyZWFzIHRoZSBvYmVzZSBjYXRlZ29yeSByZWNvcmRzIHRoZSBsZWFzdC4NCg0KKiBTdHJlc3MgbGV2ZWwgaXMgb2JzZXJ2ZWQgdG8gYmUgbG93ZXN0IGluIE5vcm1hbCBibG9vZC1wcmVzc3VyZSBncm91cCBhbmQgaGlnaGVzdCBpbiB0aGUgRWxldmF0ZWQgYmxvb2QtcHJlc3N1cmUgZ3JvdXAuDQoNCiogU2xlZXAgZHVyYXRpb24gaXMgb2JzZXJ2ZWQgdG8gYmUgbG93ZXN0IGluIEh5cGVydGVuc2lvbiBzdGFnZSAyIGJsb29kLXByZXNzdXJlIGdyb3VwIGFuZCBsb25nZXN0IGluIGVsZXZhdGVkIGJsb29kLXByZXNzdXJlIGdyb3VwLg0KDQoqIFRoZSBoeXBlcnRlbnNpb24gc3RhZ2UgMiBjYXRlZ29yeSByZWNvcmRzIHRoZSBoaWdoZXN0IGF2ZXJhZ2UgZGFpbHkgc3RlcHMgZm9yIHBlb3BsZSBleHBlcmllbmNpbmcgc2xlZXAgYXBuZWEgYXMgd2VsbCBhcyBwZW9wbGUgZXhwZXJpZW5jaW5nIG5vIGRpc29yZGVycywgdGhlIG5vcm1hbCBibG9vZCBwcmVzc3VyZSBjYXRlZ29yeSBvbiB0aGUgb3RoZXIgaGFuZCBzaG93cyB0aGUgaGlnaGVzdCBkYWlseSBzdGVwcyBmb3IgcGVvcGxlIGV4cGVyaWVuY2luZyBpbnNvbW5pYS4NCg0KDQohW0JlaGF2aW9yYWwgaW5zaWdodHMgZGFzaGJvYXJkXShDOlxVc2Vyc1xjaGlrZVxEb2N1bWVudHNcRGF0YSBmb3IgYW5hbHlzaXNcU2xlZXAgSGVhbHRoXERhc2hib2FyZHNcQmVoYXZpb3JhbCBJbnNpZ2h0cy5wbmcpDQoNCiogVGhlIGJlc3Qgc2xlZXAgcXVhbGl0eSBhbmQgbGVhc3Qgc3RyZXNzIGxldmVsIHdlcmUgb2JzZXJ2ZWQgYXQgNjAwMCBhdmVyYWdlIGRhaWx5IHN0ZXBzLCANCiogQXQgc3RyZXNzIGxldmVsIG9mIDMsIHNsZWVwIHF1YWxpdHkgaXMgaGlnaGVzdCBmb3IgbGlnaHQsIHZlcnkgaGFyZCBhbmQgdmlnb3JvdXMgYWN0aXZpdHkgbGV2ZWxzLg0KKiBUaGUgb2Jlc2UgYW5kIHRoZSBvdmVyd2VpZ2h0IGNhdGVnb3JpZXMgb25seSBoYXZlIGxvdyBzbGVlcCBxdWFsaXR5Lg0KDQojIyBLZXkgSW5zaWdodHMNCg0KMS4gU2xlZXAgZHVyYXRpb24gaW5jcmVhc2VzIHdpdGggYWdlLiBUaGUgb2xkZXN0IGdyb3VwICg1NSspIHJlcG9ydHMgdGhlIGhpZ2hlc3Qgc2xlZXAgZHVyYXRpb24gd2hpbGUgdGhlIHlvdW5nZXN0IGdyb3VwICgyNS0yOSkgcmVwb3J0cyB0aGUgbGVhc3QuDQoNCjIuIFRoZSBkb251dCBjaGFydCBzaG93cyB0aGF0IGZlbWFsZXMgcmVwb3J0IGhpZ2hlciBzbGVlcCBxdWFsaXR5IHRoYW4gbWFsZXMuDQoNCjMuIFRoZSAnU2xlZXAgRGlzb3JkZXIgT2NjdXJlbmNlIGJ5IE9jY3VwYXRpb24nIGFyZWEgY2hhcnQgc2hvd3MgdmFyaWF0aW9uIGJ5IG9jY3VwYXRpb24uIFNvbWUgb2NjdXBhdGlvbnMgbGlrZSBzYWxlcyByZXByZXNlbnRhdGl2ZSwgc2FsZXNwZXJzb24sIHRlYWNoZXIgYW5kIG51cnNlIGV4aGliaXQgaGlnaGVyIHNsZWVwIGRpc29yZGVyIHJhdGVzLCB3aGlsZSBvdGhlcnMgc2hvdyBsb3dlciByYXRlcy4NCg0KNC4gUGh5c2ljYWwgYWN0aXZpdHkgbGV2ZWxzIHZhcnkgYWNyb3NzIG9jY3VwYXRpb25zLiBQcm9mZXNzaW9ucyBsaWtlIG51cnNpbmcgYW5kIGxhdyB0ZW5kIHRvIGhhdmUgaGlnaGVyIGxldmVscyBvZiBwaHlzaWNhbCBhY3Rpdml0eSB3aGlsZSBvdGhlciBwcm9mZXNzaW9ucyBoYXZlIGxlc3MuIFNhbGVzIHJlcHJlc2VudGF0aXZlcyBzaG93IHRoZSBsZWFzdCBsZXZlbCBvZiBwaHlzaWNhbCBhY3Rpdml0eS4NCg0KNS4gQW4gaW5jcmVhc2UgaW4gcGh5c2ljYWwgYWN0aXZpdHkgbGV2ZWxzIGlzIHBvc2l0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIGJldHRlciBzbGVlcC4NCg0KNi4gRGFpbHkgd2Fsa2luZyBhcyBtZWFzdXJlZCBieSBkYWlseSBzdGVwcywgZG9lcyBub3QgaGF2ZSBhIGRpcmVjdCBpbXBhY3Qgb24gc2xlZXAgZHVyYXRpb24uDQoNCjcuIEhpZ2hlciBsZXZlbHMgb2Ygc3RyZXNzIGFyZSBsaW5rZWQgdG8gcG9vciBzbGVlcCBxdWFsaXR5LCBwZW9wbGUgd2l0aCBoaWdoIGxldmVscyBvZiBzdHJlc3MgcmVwb3J0IGxvd2VyIGxldmVscyBvZiBzbGVlcCBxdWFsaXR5Lg0KDQo4LiBJbmRpdmlkdWFscyB3aG8gZW5nYWdlIGluIGxpZ2h0IGFjdGl2aXR5IGFyZSBsZXNzIGxpa2VseSB0byByZXBvcnQgc2xlZXAgZGlzb3JkZXJzLg0KDQo5LiBJbmRpdmlkdWFscyB3aXRoIGxvd2VyIGhlYXJ0IHJhdGVzIHRlbmQgdG8gaGF2ZSBiZXR0ZXIgc2xlZXAgcXVhbGl0eSBhbmQgcmVwb3J0IGxlc3Mgc2xlZXAgZGlzb3JkZXJzLg0KDQoxMC4gSGlnaGVyIEJNSSBpcyBsaW5rZWQgdG8gc2hvcnRlciBzbGVlcCBkdXJhdGlvbi4gSG93ZXZlciwgc2xlZXAgZGlzb3JkZXJzIGFyZSBkaXN0cmlidXRlZCBhY3Jvc3MgY2F0ZWdvcmllcyB3aXRoIHRoZSBOb3JtYWwgQk1JIGdyb3VwIHNob3dpbmcgdGhlIGhpZ2hlc3QgcHJldmFsZW5jZS4NCg0KMTEuIFRoZSBoaWdoZXN0IHNsZWVwIHF1YWxpdHkgaXMgcmVjb3JkZWQgYW1vbmcgcGVvcGxlIGluIHRoZSBub3JtYWwgQk1JIGNhdGVnb3J5Lg0KDQoxMi4gSGlnaCBzdHJlc3MsIGxvdyBwaHlzaWNhbCBhY3Rpdml0eSBhbmQgaGlnaCBCTUkgYXJlIGFsbCBzdHJvbmdseSBhc3NvY2lhdGVkIHdpdGggc2hvcnRlciBzbGVlcCBkdXJhdGlvbi4gDQoNCjEzLiBMb3cgc3RyZXNzIGxldmVscywgaGVhbHRoeSBCTUkgYW5kIGluY3JlYXNlZCBwaHlzaWNhbCBhY3Rpdml0eSBhcmUgbGlua2VkIHRvIGJldHRlciBzbGVlcCBxdWFsaXR5Lg0KDQoxNC4gSGlnaCBzdHJlc3MsIGhpZ2ggQk1JLCBsb3cgcGh5c2ljYWwgYWN0aXZpdHkgYW5kIHZlcnkgbG93IGRhaWx5IGV4ZXJjaXNlIGFyZSBzdHJvbmcgaW5kaWNhdG9ycyBvZiBzbGVlcCBkaXNvcmRlcnMuDQoNCjE1LiBQZW9wbGUgd2hvIHdhbGsgbW9yZSBzdGVwcyBkYWlseSBleHBlcmllbmNlIGxvd2VyIHN0cmVzcyBsZXZlbHMgYW5kIGJldHRlciBzbGVlcCBxdWFsaXR5Lg0KDQoxNi4gVGhlIGNoYXJ0cyBzaG93IGFuIG9wdGltYWwgcHJvZmlsZTogNiwwMDDigJMxMCwwMDAgc3RlcHMgcGVyIGRheSwgbW9kZXJhdGUgdG8gdmlnb3JvdXMgcGh5c2ljYWwgYWN0aXZpdHksIG5vcm1hbCBCTUksIGFuZCBsb3cgc3RyZXNzIGZvciBiZXN0IHNsZWVwIHF1YWxpdHkuDQoNCjE3LiBMaWZlc3R5bGUgaGFiaXRzIHRoYXQgcmVsYXRlIHRvIGhpZ2ggc2xlZXAgcXVhbGl0eSBpbmNsdWRlIG5vcm1hbCBCTUksIG1vZGVyYXRlLXZpZ29yb3VzIHBoeXNpY2FsIGFjdGl2aXR5LCBhY3RpdmUgZGFpbHkgcm91dGluZXMgYW5kIG1pbmltYWwgc3RyZXNzLg0KDQoxOC4gQSBjb21iaW5hdGlvbiBvZiBoaWdoIHN0cmVzcyBhbmQgbG93IHBoeXNpY2FsIGFjdGl2aXR5IGdpdmVzIHRoZSB3b3JzdCBwb3NzaWJsZSBzbGVlcCBxdWFsaXR5IG91dGNvbWVzLg0KDQoxOS4gU2xlZXAgcXVhbGl0eSBwZWFrcyBhIHNlY29uZCB0aW1lIGF0IGFib3V0IDcsNTAwIHN0ZXBzIHBlciBkYXksIGFmdGVyIHdoaWNoIGl0IGJlZ2lucyB0byBkZWNsaW5lIHN0ZWFkaWx5Lg0KDQojIyBSZWNvbW1lbmRhdGlvbnMNCg0KKiBFbmNvdXJhZ2UgbW9kZXJhdGUgdG8gdmlnb3JvdXMgZXhlcmNpc2Ugcm91dGluZXMgYWNyb3NzIGFsbCBhZ2UgZ3JvdXBzLCBhaW1pbmcgZm9yIGF0IGxlYXN0IDMwIG1pbnV0ZXMgcGVyIGRheS4gVGhpcyBzdXBwb3J0cyBib3RoIHBoeXNpY2FsIGFuZCBzbGVlcCBoZWFsdGguDQoNCiogUHJvZmVzc2lvbnMgd2l0aCBoaWdoZXIgc2xlZXAgZGlzb3JkZXIgcmF0ZXMgKGZvciBpbnN0YW5jZSwgdGVhY2hlcnMsIG51cnNlcywgc2FsZXMgYXR0ZW5kYW50cykgbWF5IGJlbmVmaXQgZnJvbSB0YXJnZXRlZCBzdHJlc3MgcmVkdWN0aW9uIHByb2dyYW1zLCBmbGV4aWJsZSBzY2hlZHVsZXMsIGFuZCB3ZWxsbmVzcyBpbnRlcnZlbnRpb25zLg0KDQoqIFN0cmVzcyBtYW5hZ2VtZW50IHRlY2huaXF1ZXMgc3VjaCBhcyBtaW5kZnVsbmVzcywgcmVsYXhhdGlvbiwgb3IgY291bnNlbGluZyBzaG91bGQgYmUgcHJvbW90ZWQsIGVzcGVjaWFsbHkgZm9yIGhpZ2gtc3RyZXNzIGdyb3Vwcy4NCg0KKiBTdXBwb3J0IHByb2dyYW1zIHRoYXQgaGVscCBwZW9wbGUgYWNoaWV2ZSBhbmQgbWFpbnRhaW4gYSBub3JtYWwgQk1JLCBhcyB0aGlzIGlzIHN0cm9uZ2x5IGxpbmtlZCB0byBiZXR0ZXIgc2xlZXAgb3V0Y29tZXMuDQoNCiogU2V0IHJlYWxpc3RpYyBzdGVwIGdvYWxzLiBQcm9tb3RlIHdhbGtpbmcgZ29hbHMgaW4gdGhlIHJhbmdlIG9mIDUsMDAw4oCTNyw1MDAgc3RlcHMgcGVyIGRheS4gQmV5b25kIHRoaXMgcmFuZ2UsIHRoZXJlIG1heSBiZSBsZXNzIGJlbmVmaXRzLiBDb25zaXN0ZW50IG1vdmVtZW50IGlzIG1vcmUgYmVuZWZpY2lhbCB0aGFuIHN0ZXAgZXh0cmVtZXMuDQoNCiogSW5kaXZpZHVhbHMgc2hvdWxkIGJlIGVkdWNhdGVkIG9uIGhvdyBkYWlseSBsaWZlc3R5bGUgZmFjdG9ycyBpbXBhY3Qgc2xlZXAgcXVhbGl0eSB0byBhbGxvdyB0aGVtIG1ha2Ugc21hbGwsIHN1c3RhaW5hYmxlIGNoYW5nZXMuDQoNCiogVXNlIHRoZSBvcHRpbWFsIGxpZmVzdHlsZSBwcm9maWxlIChub3JtYWwgQk1JLCBsb3cgc3RyZXNzLCBtb2RlcmF0ZS10by1oaWdoIHBoeXNpY2FsIGFjdGl2aXR5LCA3LDUwMCBzdGVwcy9kYXkpIGFzIGEgYmVoYXZpb3JhbCBtb2RlbCBpbiBzbGVlcCBoZWFsdGggY2FtcGFpZ25zLg0KDQoqIElkZW50aWZ5IGluZGl2aWR1YWxzIHdpdGggY29tYmluYXRpb25zIG9mIGhpZ2ggQk1JLCBsb3cgYWN0aXZpdHksIGFuZCBoaWdoIHN0cmVzcyBhcyBoaWdoIHJpc2sgZm9yIHNsZWVwIGRpc29yZGVycywgYW5kIHByaW9yaXRpc2UgdGhlbSBmb3IgaW50ZXJ2ZW50aW9uLg0KDQoNCiMjIENvbmNsdXNpb24NCg0KVGhpcyBhbmFseXNpcyBzaG93cyB0aGF0IHNsZWVwIGhlYWx0aCBpcyBkZWVwbHkgaW5mbHVlbmNlZCBieSBsaWZlc3R5bGUgYmVoYXZpb3JzLCBpbmNsdWRpbmcgc3RyZXNzIGxldmVscywgcGh5c2ljYWwgYWN0aXZpdHksIEJNSSwgYW5kIGRhaWx5IGhhYml0cy4gQWdlLCBnZW5kZXIsIGFuZCBvY2N1cGF0aW9uIGFsc28gcGxheSBrZXkgcm9sZXMgaW4gc2hhcGluZyBzbGVlcCBleHBlcmllbmNlcyBmb3IgaW5kaXZpZHVhbHMuDQoNCktleSBmaW5kaW5ncyBzdWdnZXN0Og0KDQoqIEFnZSBhbmQgZ2VuZGVyIG1hdHRlcjogT2xkZXIgYWR1bHRzIHRlbmQgdG8gc2xlZXAgbG9uZ2VyLCB3aGlsZSBmZW1hbGVzIHNsZWVwIGJldHRlciB0aGFuIG1hbGVzLg0KDQoqIE9jY3VwYXRpb24gaXMgbGlua2VkIHRvIHNsZWVwIGRpc29yZGVyczogU2FsZXMsIHRlYWNoaW5nLCBhbmQgaGVhbHRoY2FyZSBwcm9mZXNzaW9ucyBzaG93IGhpZ2hlciBkaXNvcmRlciByYXRlczsgcG9zc2libHkgZHVlIHRvIHdvcmstcmVsYXRlZCBzdHJlc3Mgb3IgaXJyZWd1bGFyIHNjaGVkdWxlcy4NCg0KKiBBY3Rpdml0eSBhbmQgc2xlZXAgQXJlIGNsb3NlbHkgY29ubmVjdGVkOiBIaWdoZXIgcGh5c2ljYWwgYWN0aXZpdHkgY29ycmVsYXRlcyBzdHJvbmdseSB3aXRoIGJldHRlciBzbGVlcCBxdWFsaXR5LCB3aGlsZSBzZWRlbnRhcnkgcm91dGluZXMgYW5kIGxvdyBkYWlseSBzdGVwcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHBvb3Igc2xlZXAgYW5kIGVsZXZhdGVkIHN0cmVzcy4NCg0KKiBTdHJlc3MgY29udHJpYnV0ZXMgdHJlbWVuZG91c2x5IHRvIHBvb3Igc2xlZXA6IEhpZ2ggc3RyZXNzIGxldmVscyBjb25zaXN0ZW50bHkgcHJlZGljdCBsb3dlciBzbGVlcCBxdWFsaXR5IGFuZCBhIGhpZ2hlciBsaWtlbGlob29kIG9mIHNsZWVwIGRpc29yZGVycy4NCg0KKiBCb2R5IHdlaWdodCBhbmQgc2xlZXA6IEEgbm9ybWFsIEJNSSBpcyBjb25zaXN0ZW50bHkgYXNzb2NpYXRlZCB3aXRoIGJldHRlciBzbGVlcCBkdXJhdGlvbiBhbmQgcXVhbGl0eS4gTWVhbndoaWxlLCBoaWdoZXIgQk1JLCBlc3BlY2lhbGx5IHdoZW4gcGFpcmVkIHdpdGggc3RyZXNzIGFuZCBpbmFjdGl2aXR5LCBpcyBhIHN0cm9uZyBpbmRpY2F0b3Igb2Ygc2xlZXAgcHJvYmxlbXMuDQoNCiogRGFpbHkgc3RlcHMgaGF2ZSBhIHRocmVzaG9sZCBlZmZlY3Q6IERhaWx5IHdhbGtpbmcgZG9lcyBub3QgZGlyZWN0bHkgaW1wcm92ZSBzbGVlcCBkdXJhdGlvbiBidXQgaXQgc3VwcG9ydHMgbG93ZXIgc3RyZXNzIGFuZCBiZXR0ZXIgc2xlZXAgcXVhbGl0eSB1cCB0byBhIGNlcnRhaW4gcG9pbnQgLSAoYWJvdXQgNyw1MDAgc3RlcHMpLCBhZnRlciB3aGljaCBiZW5lZml0cyBkZWNsaW5lLg0KDQpGdXR1cmUgd29yayBjb3VsZCBleHBsb3JlIHRpbWUtYmFzZWQgcGF0dGVybnMgaW4gZGF0YSBhbmQgdGFrZSBhIGxvb2sgYXQgc29tZSBvdGhlciBsaWZlc3R5bGUgZmFjdG9ycyB0aGF0IG1heSAgaW5mbHVlbmNlIHNsZWVwLiBMaWtlIHRoZSBlZmZlY3RzIG9mIHNjcmVlbiB0aW1lIGJlZm9yZSBiZWQgb24gc2xlZXAgcXVhbGl0eSBhbmQgZHVyYXRpb24sIG9yIGludmVzdGlnYXRlIHRoZSBvdXRjb21lcyBiZXR3ZWVuIHBlb3BsZSB3aG8gc3RpY2sgdG8gY29uc2lzdGVudCBzbGVlcCBzY2hlZHVsZXMgYW5kIHRob3NlIHdobyBkbyBub3QuIE9yIGV2ZW4gb2JzZXJ2ZSB0aGUgcm9sZSBvZiBjYWZmZWluZSBhbmQvb3IgZGlldCBpbiByZWxhdGlvbiB0byBzdHJlc3MgYW5kIHNsZWVwIHF1YWxpdHkuIEludGVncmF0aW5nIHdlYXJhYmxlIGRldmljZSB0cmFja2luZyBmb3IgcmljaGVyIGluc2lnaHRzIGNvdWxkIGJlIGNvbnNpZGVyZWQgYXMgd2VsbC4NCg==