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:

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:

  1. How does age correlate with sleep duration?

  2. Do men and women report different sleep quality levels?

  3. Are certain occupations more prone to sleep disorders?

  4. Is there a pattern between occupation type and physical activity?

  5. How does physical activity level impact sleep quality?

  6. Is there a relationship between daily steps and sleep duration?

  7. Do people with high stress levels sleep less or report poorer sleep quality?

  8. Are people with higher physical activity levels less likely to have sleep disorders?

  9. How does heart rate vary with sleep quality or disorders?

  10. Is there a relationship between BMI and sleep duration or disorder occurrence?

  11. Do people with healthy BMI ranges have better sleep?

  12. What factors are most associated with short sleep duration (<6 hours)?

  13. What predicts high sleep quality (>7/10)?

  14. Which features are most predictive of having a sleep disorder?

  15. Do people who walk more steps have lower stress and better sleep?

  16. Can we recommend an optimal lifestyle profile (steps, activity level, BMI, stress) for better sleep?

  17. Among individuals with high sleep quality, what are the common lifestyle patterns?

  18. Which combinations of stress and activity result in the worst sleep?

  19. 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):

Source: Kaggle

Tools Used

The tools used for this project are:

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
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
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
Demographic data dashboard
Lifestyle data dashboard
Lifestyle data dashboard
Health metrics dashboard
Health metrics dashboard
Sleep health dashboard
Sleep health dashboard
Behavioral insights dashboard
Behavioral insights dashboard

Key Insights

  1. Sleep duration increases with age. The oldest group (55+) reports the highest sleep duration while the youngest group (25-29) reports the least.

  2. The donut chart shows that females report higher sleep quality than males.

  3. 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.

  4. 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.

  5. An increase in physical activity levels is positively associated with better sleep.

  6. Daily walking as measured by daily steps, does not have a direct impact on sleep duration.

  7. Higher levels of stress are linked to poor sleep quality, people with high levels of stress report lower levels of sleep quality.

  8. Individuals who engage in light activity are less likely to report sleep disorders.

  9. Individuals with lower heart rates tend to have better sleep quality and report less sleep disorders.

  10. Higher BMI is linked to shorter sleep duration. However, sleep disorders are distributed across categories with the Normal BMI group showing the highest prevalence.

  11. The highest sleep quality is recorded among people in the normal BMI category.

  12. High stress, low physical activity and high BMI are all strongly associated with shorter sleep duration.

  13. Low stress levels, healthy BMI and increased physical activity are linked to better sleep quality.

  14. High stress, high BMI, low physical activity and very low daily exercise are strong indicators of sleep disorders.

  15. People who walk more steps daily experience lower stress levels and better sleep quality.

  16. 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.

  17. Lifestyle habits that relate to high sleep quality include normal BMI, moderate-vigorous physical activity, active daily routines and minimal stress.

  18. A combination of high stress and low physical activity gives the worst possible sleep quality outcomes.

  19. Sleep quality peaks a second time at about 7,500 steps per day, after which it begins to decline steadily.

Recommendations

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:

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==