library(tidyverse)
library(openintro)
library("NHANES")
## Warning: package 'NHANES' was built under R version 4.3.3
library(dplyr)
library(ggplot2)
library(survey)
## Warning: package 'survey' was built under R version 4.3.3
library(broom)
library(quantreg)
## Warning: package 'quantreg' was built under R version 4.3.3
## Warning in .recacheSubclasses(def@className, def, env): undefined subclass
## "ndiMatrix" of class "replValueSp"; definition not updated

HEALTH RESEARCH QUESTION: how interconnected are body mass index (BMI) and physical activity? In addition, do other health and/or lifestyle variables have an impact on BMI?

REASONING: I am quite physically active. I workout for roughly 2-2.5 hrs 5-6 days per week. Although, I am not certain of my BMI. I would like to think I am within the range for my height and weight. Nonetheless, I am still curious to know the answer to this.

STATISTICAL ANALYSIS PLAN:

Data Preparation: Clean and preprocess the NHANES dataset, including handling missing data and outlier detection. Check for multicollinearity among predictor variables.

Descriptive Statistics: Compute summary statistics (mean, standard deviation, etc.) for continuous variables (e.g., BMI, height, testosterone, etc.) and frequency tables for categorical variables (e.g., race, smoking status, gender, etc.). Generate visualizations such as histograms, boxplots, and bar charts to explore the distribution of variables and identify any patterns or trends.

Regression Analysis: Conduct multiple regression analysis to examine the relationship between BMI (dependent variable) and predictor variables (independent variables) including: Physical activity (PhysActiveYes) Smoking status (SmokeNowYes) Race (Race1) Alcohol consumption (Alcohol12PlusYrYes) Gender (Gendermale) Height Testosterone Total Cholesterol (TotChol) Explore interaction effects between physical activity and smoking status, as well as other relevant interactions. Perform model diagnostics including checking for model assumptions such as linearity, normality of residuals, and homoscedasticity.

Hypothesis Testing: Formulate hypotheses based on the regression results and conduct hypothesis tests to assess the significance of predictor variables. Interpret the coefficients and p-values to determine the strength and direction of associations between variables and BMI. Explore any significant interaction effects to understand their implications for BMI.

Model Comparison and Selection: Compare different regression models using information criteria (e.g., AIC, BIC) to select the most parsimonious and interpretable model. Assess the goodness of fit of the chosen model and evaluate its predictive performance.

Discussion and Conclusion: Interpret the findings in the context of the research question and relevant literature. Discuss the implications of the results for public health and clinical practice. Highlight any limitations of the study and suggest directions for future research. Conclude with a summary of key findings and their significance.

Sensitivity Analysis: Conduct sensitivity analysis to assess the robustness of results to different model specifications or data preprocessing techniques.

Reporting: Present the results in a clear and concise manner using tables, figures, and narrative descriptions. Write a comprehensive report summarizing the research question, methods, results, and conclusions. By following this analysis plan, we can systematically investigate the factors influencing BMI in the NHANES dataset and provide valuable insights into the relationship between lifestyle factors, demographics, and BMI.

glimpse(NHANES)
## Rows: 10,000
## Columns: 76
## $ ID               <int> 51624, 51624, 51624, 51625, 51630, 51638, 51646, 5164…
## $ SurveyYr         <fct> 2009_10, 2009_10, 2009_10, 2009_10, 2009_10, 2009_10,…
## $ Gender           <fct> male, male, male, male, female, male, male, female, f…
## $ Age              <int> 34, 34, 34, 4, 49, 9, 8, 45, 45, 45, 66, 58, 54, 10, …
## $ AgeDecade        <fct>  30-39,  30-39,  30-39,  0-9,  40-49,  0-9,  0-9,  40…
## $ AgeMonths        <int> 409, 409, 409, 49, 596, 115, 101, 541, 541, 541, 795,…
## $ Race1            <fct> White, White, White, Other, White, White, White, Whit…
## $ Race3            <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ Education        <fct> High School, High School, High School, NA, Some Colle…
## $ MaritalStatus    <fct> Married, Married, Married, NA, LivePartner, NA, NA, M…
## $ HHIncome         <fct> 25000-34999, 25000-34999, 25000-34999, 20000-24999, 3…
## $ HHIncomeMid      <int> 30000, 30000, 30000, 22500, 40000, 87500, 60000, 8750…
## $ Poverty          <dbl> 1.36, 1.36, 1.36, 1.07, 1.91, 1.84, 2.33, 5.00, 5.00,…
## $ HomeRooms        <int> 6, 6, 6, 9, 5, 6, 7, 6, 6, 6, 5, 10, 6, 10, 10, 4, 3,…
## $ HomeOwn          <fct> Own, Own, Own, Own, Rent, Rent, Own, Own, Own, Own, O…
## $ Work             <fct> NotWorking, NotWorking, NotWorking, NA, NotWorking, N…
## $ Weight           <dbl> 87.4, 87.4, 87.4, 17.0, 86.7, 29.8, 35.2, 75.7, 75.7,…
## $ Length           <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ HeadCirc         <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ Height           <dbl> 164.7, 164.7, 164.7, 105.4, 168.4, 133.1, 130.6, 166.…
## $ BMI              <dbl> 32.22, 32.22, 32.22, 15.30, 30.57, 16.82, 20.64, 27.2…
## $ BMICatUnder20yrs <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ BMI_WHO          <fct> 30.0_plus, 30.0_plus, 30.0_plus, 12.0_18.5, 30.0_plus…
## $ Pulse            <int> 70, 70, 70, NA, 86, 82, 72, 62, 62, 62, 60, 62, 76, 8…
## $ BPSysAve         <int> 113, 113, 113, NA, 112, 86, 107, 118, 118, 118, 111, …
## $ BPDiaAve         <int> 85, 85, 85, NA, 75, 47, 37, 64, 64, 64, 63, 74, 85, 6…
## $ BPSys1           <int> 114, 114, 114, NA, 118, 84, 114, 106, 106, 106, 124, …
## $ BPDia1           <int> 88, 88, 88, NA, 82, 50, 46, 62, 62, 62, 64, 76, 86, 6…
## $ BPSys2           <int> 114, 114, 114, NA, 108, 84, 108, 118, 118, 118, 108, …
## $ BPDia2           <int> 88, 88, 88, NA, 74, 50, 36, 68, 68, 68, 62, 72, 88, 6…
## $ BPSys3           <int> 112, 112, 112, NA, 116, 88, 106, 118, 118, 118, 114, …
## $ BPDia3           <int> 82, 82, 82, NA, 76, 44, 38, 60, 60, 60, 64, 76, 82, 7…
## $ Testosterone     <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ DirectChol       <dbl> 1.29, 1.29, 1.29, NA, 1.16, 1.34, 1.55, 2.12, 2.12, 2…
## $ TotChol          <dbl> 3.49, 3.49, 3.49, NA, 6.70, 4.86, 4.09, 5.82, 5.82, 5…
## $ UrineVol1        <int> 352, 352, 352, NA, 77, 123, 238, 106, 106, 106, 113, …
## $ UrineFlow1       <dbl> NA, NA, NA, NA, 0.094, 1.538, 1.322, 1.116, 1.116, 1.…
## $ UrineVol2        <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ UrineFlow2       <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ Diabetes         <fct> No, No, No, No, No, No, No, No, No, No, No, No, No, N…
## $ DiabetesAge      <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ HealthGen        <fct> Good, Good, Good, NA, Good, NA, NA, Vgood, Vgood, Vgo…
## $ DaysPhysHlthBad  <int> 0, 0, 0, NA, 0, NA, NA, 0, 0, 0, 10, 0, 4, NA, NA, 0,…
## $ DaysMentHlthBad  <int> 15, 15, 15, NA, 10, NA, NA, 3, 3, 3, 0, 0, 0, NA, NA,…
## $ LittleInterest   <fct> Most, Most, Most, NA, Several, NA, NA, None, None, No…
## $ Depressed        <fct> Several, Several, Several, NA, Several, NA, NA, None,…
## $ nPregnancies     <int> NA, NA, NA, NA, 2, NA, NA, 1, 1, 1, NA, NA, NA, NA, N…
## $ nBabies          <int> NA, NA, NA, NA, 2, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ Age1stBaby       <int> NA, NA, NA, NA, 27, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ SleepHrsNight    <int> 4, 4, 4, NA, 8, NA, NA, 8, 8, 8, 7, 5, 4, NA, 5, 7, N…
## $ SleepTrouble     <fct> Yes, Yes, Yes, NA, Yes, NA, NA, No, No, No, No, No, Y…
## $ PhysActive       <fct> No, No, No, NA, No, NA, NA, Yes, Yes, Yes, Yes, Yes, …
## $ PhysActiveDays   <int> NA, NA, NA, NA, NA, NA, NA, 5, 5, 5, 7, 5, 1, NA, 2, …
## $ TVHrsDay         <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ CompHrsDay       <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ TVHrsDayChild    <int> NA, NA, NA, 4, NA, 5, 1, NA, NA, NA, NA, NA, NA, 4, N…
## $ CompHrsDayChild  <int> NA, NA, NA, 1, NA, 0, 6, NA, NA, NA, NA, NA, NA, 3, N…
## $ Alcohol12PlusYr  <fct> Yes, Yes, Yes, NA, Yes, NA, NA, Yes, Yes, Yes, Yes, Y…
## $ AlcoholDay       <int> NA, NA, NA, NA, 2, NA, NA, 3, 3, 3, 1, 2, 6, NA, NA, …
## $ AlcoholYear      <int> 0, 0, 0, NA, 20, NA, NA, 52, 52, 52, 100, 104, 364, N…
## $ SmokeNow         <fct> No, No, No, NA, Yes, NA, NA, NA, NA, NA, No, NA, NA, …
## $ Smoke100         <fct> Yes, Yes, Yes, NA, Yes, NA, NA, No, No, No, Yes, No, …
## $ Smoke100n        <fct> Smoker, Smoker, Smoker, NA, Smoker, NA, NA, Non-Smoke…
## $ SmokeAge         <int> 18, 18, 18, NA, 38, NA, NA, NA, NA, NA, 13, NA, NA, N…
## $ Marijuana        <fct> Yes, Yes, Yes, NA, Yes, NA, NA, Yes, Yes, Yes, NA, Ye…
## $ AgeFirstMarij    <int> 17, 17, 17, NA, 18, NA, NA, 13, 13, 13, NA, 19, 15, N…
## $ RegularMarij     <fct> No, No, No, NA, No, NA, NA, No, No, No, NA, Yes, Yes,…
## $ AgeRegMarij      <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 20, 15, N…
## $ HardDrugs        <fct> Yes, Yes, Yes, NA, Yes, NA, NA, No, No, No, No, Yes, …
## $ SexEver          <fct> Yes, Yes, Yes, NA, Yes, NA, NA, Yes, Yes, Yes, Yes, Y…
## $ SexAge           <int> 16, 16, 16, NA, 12, NA, NA, 13, 13, 13, 17, 22, 12, N…
## $ SexNumPartnLife  <int> 8, 8, 8, NA, 10, NA, NA, 20, 20, 20, 15, 7, 100, NA, …
## $ SexNumPartYear   <int> 1, 1, 1, NA, 1, NA, NA, 0, 0, 0, NA, 1, 1, NA, NA, 1,…
## $ SameSex          <fct> No, No, No, NA, Yes, NA, NA, Yes, Yes, Yes, No, No, N…
## $ SexOrientation   <fct> Heterosexual, Heterosexual, Heterosexual, NA, Heteros…
## $ PregnantNow      <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…

EXPLORATORY DATA ANALYSES ON RESEARCH QUESTION - PART I: visualizing survey weight and strata variables

REASONING/DEFENSE: after using glimpse(), the NHANESraw data has several health measurement variables. Further, it contains a sampling weight variable WTMEC2YR. Due to the NHANESraw data spanning just 4 years and the sampling weights are based on 2 years of data, a weight variable must be created which covers the entirety of the 4 years. To accomplish this, we must divide the 2-year weight in half. Therefore, in total, the weights sum to the total population of the United States (U.s.).

Key actions of glimpse(): - Compact Summary: glimpse() provides a compact summary of a data frame that includes the following information: total number of observations (rows) in the data frame, total number of variables (columns) in the data frame, names of the variables along with their data types, and a preview of the first few values of each variable. - Column Details: glimpse() shows the first few values along with their data types. - Integrated with the Tidyverse: since glimpse() is part of the dplyr package, it integrates seamlessly with other functions in the Tidyverse ecosystem.

INTERPRETATIONS: Black and Hispanic Groups: These groups have very similar distributions, with median values that are close to each other, and relatively narrow interquartile ranges (IQR), which suggest that the middle 50% of the data points are clustered in a relatively small range. The whiskers (the lines extending from the boxes) are also quite short, indicating that most of the data points fall within a smaller overall range. There are a few outliers indicated by individual dots beyond the whiskers. Mexican Group: This group has a distribution similar to the Black and Hispanic groups, with a slightly higher median. The IQR is narrow, indicating a tight clustering of the middle 50% of the data around the median, and it has a few outliers as well. White Group: This group has a higher median value compared to the other groups and a much wider IQR, showing that there is more variability in the middle 50% of the data points for this group. The range of the data points (indicated by the whiskers) is also the widest among all groups. There is a substantial number of outliers, which are well above the upper whisker.Other Group: The distribution for this group is similar to the Black, Hispanic, and Mexican groups in terms of median and IQR but has fewer outliers than the White group. Overall, the boxplot suggests that the “White” racial group has a higher median value of “WTMEC4YR” and more variability compared to the other groups. The “Other” group, while having a median similar to the Black, Hispanic, and Mexican groups, seems to have fewer extreme values. The boxplot also indicates the presence of outliers in all groups, with the White group having the most.

data("NHANESraw")
glimpse(NHANESraw)
## Rows: 20,293
## Columns: 78
## $ ID               <int> 51624, 51625, 51626, 51627, 51628, 51629, 51630, 5163…
## $ SurveyYr         <fct> 2009_10, 2009_10, 2009_10, 2009_10, 2009_10, 2009_10,…
## $ Gender           <fct> male, male, male, male, female, male, female, female,…
## $ Age              <int> 34, 4, 16, 10, 60, 26, 49, 1, 10, 80, 10, 80, 4, 35, …
## $ AgeMonths        <int> 409, 49, 202, 131, 722, 313, 596, 12, 124, NA, 121, N…
## $ Race1            <fct> White, Other, Black, Black, Black, Mexican, White, Wh…
## $ Race3            <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ Education        <fct> High School, NA, NA, NA, High School, 9 - 11th Grade,…
## $ MaritalStatus    <fct> Married, NA, NA, NA, Widowed, Married, LivePartner, N…
## $ HHIncome         <fct> 25000-34999, 20000-24999, 45000-54999, 20000-24999, 1…
## $ HHIncomeMid      <int> 30000, 22500, 50000, 22500, 12500, 30000, 40000, 4000…
## $ Poverty          <dbl> 1.36, 1.07, 2.27, 0.81, 0.69, 1.01, 1.91, 1.36, 2.68,…
## $ HomeRooms        <int> 6, 9, 5, 6, 6, 4, 5, 5, 7, 4, 5, 5, 7, NA, 6, 6, 5, 6…
## $ HomeOwn          <fct> Own, Own, Own, Rent, Rent, Rent, Rent, Rent, Own, Own…
## $ Work             <fct> NotWorking, NA, NotWorking, NA, NotWorking, Working, …
## $ Weight           <dbl> 87.4, 17.0, 72.3, 39.8, 116.8, 97.6, 86.7, 9.4, 26.0,…
## $ Length           <dbl> NA, NA, NA, NA, NA, NA, NA, 75.7, NA, NA, NA, NA, NA,…
## $ HeadCirc         <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ Height           <dbl> 164.7, 105.4, 181.3, 147.8, 166.0, 173.0, 168.4, NA, …
## $ BMI              <dbl> 32.22, 15.30, 22.00, 18.22, 42.39, 32.61, 30.57, NA, …
## $ BMICatUnder20yrs <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ BMI_WHO          <fct> 30.0_plus, 12.0_18.5, 18.5_to_24.9, 12.0_18.5, 30.0_p…
## $ Pulse            <int> 70, NA, 68, 68, 72, 72, 86, NA, 70, 88, 84, 54, NA, N…
## $ BPSysAve         <int> 113, NA, 109, 93, 150, 104, 112, NA, 108, 139, 94, 12…
## $ BPDiaAve         <int> 85, NA, 59, 41, 68, 49, 75, NA, 53, 43, 45, 60, NA, N…
## $ BPSys1           <int> 114, NA, 112, 92, 154, 102, 118, NA, 106, 142, 94, 12…
## $ BPDia1           <int> 88, NA, 62, 36, 70, 50, 82, NA, 60, 62, 38, 62, NA, N…
## $ BPSys2           <int> 114, NA, 114, 94, 150, 104, 108, NA, 106, 140, 92, 12…
## $ BPDia2           <int> 88, NA, 60, 44, 68, 48, 74, NA, 50, 46, 40, 62, NA, N…
## $ BPSys3           <int> 112, NA, 104, 92, 150, 104, 116, NA, 110, 138, 96, 11…
## $ BPDia3           <int> 82, NA, 58, 38, 68, 50, 76, NA, 56, 40, 50, 58, NA, N…
## $ Testosterone     <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ DirectChol       <dbl> 1.29, NA, 1.55, 1.89, 1.16, 1.16, 1.16, NA, 1.58, 1.9…
## $ TotChol          <dbl> 3.49, NA, 4.97, 4.16, 5.22, 4.14, 6.70, NA, 4.14, 4.7…
## $ UrineVol1        <int> 352, NA, 281, 139, 30, 202, 77, NA, 39, 128, 109, 38,…
## $ UrineFlow1       <dbl> NA, NA, 0.415, 1.078, 0.476, 0.563, 0.094, NA, 0.300,…
## $ UrineVol2        <int> NA, NA, NA, NA, 246, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ UrineFlow2       <dbl> NA, NA, NA, NA, 2.51, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ Diabetes         <fct> No, No, No, No, Yes, No, No, No, No, No, No, Yes, No,…
## $ DiabetesAge      <int> NA, NA, NA, NA, 56, NA, NA, NA, NA, NA, NA, 70, NA, N…
## $ HealthGen        <fct> Good, NA, Vgood, NA, Fair, Good, Good, NA, NA, Excell…
## $ DaysPhysHlthBad  <int> 0, NA, 2, NA, 20, 2, 0, NA, NA, 0, NA, 0, NA, NA, NA,…
## $ DaysMentHlthBad  <int> 15, NA, 0, NA, 25, 14, 10, NA, NA, 0, NA, 0, NA, NA, …
## $ LittleInterest   <fct> Most, NA, NA, NA, Most, None, Several, NA, NA, None, …
## $ Depressed        <fct> Several, NA, NA, NA, Most, Most, Several, NA, NA, Non…
## $ nPregnancies     <int> NA, NA, NA, NA, 1, NA, 2, NA, NA, NA, NA, NA, NA, NA,…
## $ nBabies          <int> NA, NA, NA, NA, 1, NA, 2, NA, NA, NA, NA, NA, NA, NA,…
## $ Age1stBaby       <int> NA, NA, NA, NA, NA, NA, 27, NA, NA, NA, NA, NA, NA, N…
## $ SleepHrsNight    <int> 4, NA, 8, NA, 4, 4, 8, NA, NA, 6, NA, 9, NA, 7, NA, N…
## $ SleepTrouble     <fct> Yes, NA, No, NA, No, No, Yes, NA, NA, No, NA, No, NA,…
## $ PhysActive       <fct> No, NA, Yes, NA, No, Yes, No, NA, NA, Yes, NA, No, NA…
## $ PhysActiveDays   <int> NA, NA, 5, NA, NA, 2, NA, NA, NA, 4, NA, NA, NA, NA, …
## $ TVHrsDay         <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ CompHrsDay       <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ TVHrsDayChild    <int> NA, 4, NA, 1, NA, NA, NA, NA, 1, NA, 3, NA, 2, NA, 5,…
## $ CompHrsDayChild  <int> NA, 1, NA, 1, NA, NA, NA, NA, 0, NA, 0, NA, 1, NA, 0,…
## $ Alcohol12PlusYr  <fct> Yes, NA, NA, NA, No, Yes, Yes, NA, NA, Yes, NA, No, N…
## $ AlcoholDay       <int> NA, NA, NA, NA, NA, 19, 2, NA, NA, 1, NA, NA, NA, NA,…
## $ AlcoholYear      <int> 0, NA, NA, NA, 0, 48, 20, NA, NA, 52, NA, 0, NA, NA, …
## $ SmokeNow         <fct> No, NA, NA, NA, Yes, No, Yes, NA, NA, No, NA, No, NA,…
## $ Smoke100         <fct> Yes, NA, NA, NA, Yes, Yes, Yes, NA, NA, Yes, NA, Yes,…
## $ SmokeAge         <int> 18, NA, NA, NA, 16, 15, 38, NA, NA, 16, NA, 21, NA, N…
## $ Marijuana        <fct> Yes, NA, NA, NA, NA, Yes, Yes, NA, NA, NA, NA, NA, NA…
## $ AgeFirstMarij    <int> 17, NA, NA, NA, NA, 10, 18, NA, NA, NA, NA, NA, NA, N…
## $ RegularMarij     <fct> No, NA, NA, NA, NA, Yes, No, NA, NA, NA, NA, NA, NA, …
## $ AgeRegMarij      <int> NA, NA, NA, NA, NA, 12, NA, NA, NA, NA, NA, NA, NA, N…
## $ HardDrugs        <fct> Yes, NA, NA, NA, No, Yes, Yes, NA, NA, NA, NA, NA, NA…
## $ SexEver          <fct> Yes, NA, NA, NA, Yes, Yes, Yes, NA, NA, NA, NA, NA, N…
## $ SexAge           <int> 16, NA, NA, NA, 15, 9, 12, NA, NA, NA, NA, NA, NA, NA…
## $ SexNumPartnLife  <int> 8, NA, NA, NA, 4, 10, 10, NA, NA, NA, NA, NA, NA, NA,…
## $ SexNumPartYear   <int> 1, NA, NA, NA, NA, 1, 1, NA, NA, NA, NA, NA, NA, NA, …
## $ SameSex          <fct> No, NA, NA, NA, No, No, Yes, NA, NA, NA, NA, NA, NA, …
## $ SexOrientation   <fct> Heterosexual, NA, NA, NA, NA, Heterosexual, Heterosex…
## $ WTINT2YR         <dbl> 80100.544, 53901.104, 13953.078, 11664.899, 20090.339…
## $ WTMEC2YR         <dbl> 81528.772, 56995.035, 14509.279, 12041.635, 21000.339…
## $ SDMVPSU          <int> 1, 2, 1, 2, 2, 1, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1,…
## $ SDMVSTRA         <int> 83, 79, 84, 86, 75, 88, 85, 86, 88, 77, 86, 79, 84, 7…
## $ PregnantNow      <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, U…
NHANESraw <- NHANESraw %>%
                mutate(WTMEC4YR = WTMEC2YR / 2)

NHANESraw %>% summarize(total_WTMEC4YR = sum(WTMEC4YR))
## # A tibble: 1 × 1
##   total_WTMEC4YR
##            <dbl>
## 1     304267200.
ggplot(NHANESraw, aes(x=Race1, y=WTMEC4YR))+
geom_boxplot()

EXPLORATORY DATA ANALYSES ON RESEARCH QUESTION - PART II: survey design

REASONING/DEFENSE: the survey package will now be used in order to specify the survey design (will be used later on). Additionally, the NHANESraw data contains a strata variable, SDMVSTRA, and a cluster ID variable, SDMVPSU, which accounts for design effects of clustering.

Key actions of SDMVSTRA: - Stratum Identification: each observation in the NHANES dataset is assigned a value in the SDMVSTRA variable, which identifies the specific stratum to which the observation belongs. Strata are defined based on certain characteristics (e.g., age group, race/ethnicity) to ensure that each subgroup is represented in the sample. - Survey Analysis: in survey data analysis, the SDMVSTRA variable is used to specify the stratum when conducting analyses that account for the survey design. - Complex Survey Design: NHANES employs a complex survey design involving stratification, clustering, and sampling weights. The SDMVSTRA variable is just one component of this design, helping to ensure that the survey sample is representative of the U.S. population.

Key actions of SDMVPSU: - Primarily Sampling Unit Identification: each observation in the NHANES dataset is assigned a value in the SDMVPSU variable, which identifies the specific primary sampling unit (PSU) to which the observation belongs. - Clustering Identification: NHANES employs a clustered sampling design where individuals are sampled from within certain geographic clusters (PSUs). The SDMVPSU variable identifies these clusters. - Survey Analysis: the SDMVPSU variable is used to specify the PSU when conducting analyses that account for the survey design.

nhanes_design <- svydesign(
    data = NHANESraw,
    strata = ~SDMVSTRA,
    id = ~SDMVPSU,
    nest = TRUE,
    weights = ~WTMEC4YR)

summary(nhanes_design)
## Stratified 1 - level Cluster Sampling design (with replacement)
## With (62) clusters.
## svydesign(data = NHANESraw, strata = ~SDMVSTRA, id = ~SDMVPSU, 
##     nest = TRUE, weights = ~WTMEC4YR)
## Probabilities:
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 8.986e-06 5.664e-05 1.054e-04       Inf 1.721e-04       Inf 
## Stratum Sizes: 
##             75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91
## obs        803 785 823 829 696 751 696 724 713 683 592 946 598 647 251 862 998
## design.PSU   2   2   2   2   2   2   2   2   2   2   2   3   2   2   2   3   3
## actual.PSU   2   2   2   2   2   2   2   2   2   2   2   3   2   2   2   3   3
##             92  93  94  95  96  97  98  99 100 101 102 103
## obs        875 602 688 722 676 608 708 682 700 715 624 296
## design.PSU   3   2   2   2   2   2   2   2   2   2   2   2
## actual.PSU   3   2   2   2   2   2   2   2   2   2   2   2
## Data variables:
##  [1] "ID"               "SurveyYr"         "Gender"           "Age"             
##  [5] "AgeMonths"        "Race1"            "Race3"            "Education"       
##  [9] "MaritalStatus"    "HHIncome"         "HHIncomeMid"      "Poverty"         
## [13] "HomeRooms"        "HomeOwn"          "Work"             "Weight"          
## [17] "Length"           "HeadCirc"         "Height"           "BMI"             
## [21] "BMICatUnder20yrs" "BMI_WHO"          "Pulse"            "BPSysAve"        
## [25] "BPDiaAve"         "BPSys1"           "BPDia1"           "BPSys2"          
## [29] "BPDia2"           "BPSys3"           "BPDia3"           "Testosterone"    
## [33] "DirectChol"       "TotChol"          "UrineVol1"        "UrineFlow1"      
## [37] "UrineVol2"        "UrineFlow2"       "Diabetes"         "DiabetesAge"     
## [41] "HealthGen"        "DaysPhysHlthBad"  "DaysMentHlthBad"  "LittleInterest"  
## [45] "Depressed"        "nPregnancies"     "nBabies"          "Age1stBaby"      
## [49] "SleepHrsNight"    "SleepTrouble"     "PhysActive"       "PhysActiveDays"  
## [53] "TVHrsDay"         "CompHrsDay"       "TVHrsDayChild"    "CompHrsDayChild" 
## [57] "Alcohol12PlusYr"  "AlcoholDay"       "AlcoholYear"      "SmokeNow"        
## [61] "Smoke100"         "SmokeAge"         "Marijuana"        "AgeFirstMarij"   
## [65] "RegularMarij"     "AgeRegMarij"      "HardDrugs"        "SexEver"         
## [69] "SexAge"           "SexNumPartnLife"  "SexNumPartYear"   "SameSex"         
## [73] "SexOrientation"   "WTINT2YR"         "WTMEC2YR"         "SDMVPSU"         
## [77] "SDMVSTRA"         "PregnantNow"      "WTMEC4YR"

EXPLORATORY DATA ANALYSES ON RESEARCH QUESTION - PART III: subset these data

REASONING/DEFENSE: even though filtering the data may be seen as a simple process, it can become complicated when weights are involved. Therefore, analysis of survey data requires consideration of the design and weights at each step. Moreover, when examining a subset of data, we must specify this in the design we proceed with. The subset of data cannot just be removed via filtering the raw data due to survey weights no longer being correct and will not constitute the full U.S. population. Being that children and young adults (< 20 years-of-age) have different BMI categories, we will subset these data to just analyze adults of at least 20 years-of-age.

nhanes_adult <- nhanes_design%>%
                subset(Age >=20)

summary(nhanes_adult)
## Stratified 1 - level Cluster Sampling design (with replacement)
## With (62) clusters.
## subset(., Age >= 20)
## Probabilities:
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 8.986e-06 4.303e-05 8.107e-05       Inf 1.240e-04       Inf 
## Stratum Sizes: 
##             75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91
## obs        471 490 526 500 410 464 447 400 411 395 357 512 327 355 153 509 560
## design.PSU   2   2   2   2   2   2   2   2   2   2   2   3   2   2   2   3   3
## actual.PSU   2   2   2   2   2   2   2   2   2   2   2   3   2   2   2   3   3
##             92  93  94  95  96  97  98  99 100 101 102 103
## obs        483 376 368 454 362 315 414 409 377 460 308 165
## design.PSU   3   2   2   2   2   2   2   2   2   2   2   2
## actual.PSU   3   2   2   2   2   2   2   2   2   2   2   2
## Data variables:
##  [1] "ID"               "SurveyYr"         "Gender"           "Age"             
##  [5] "AgeMonths"        "Race1"            "Race3"            "Education"       
##  [9] "MaritalStatus"    "HHIncome"         "HHIncomeMid"      "Poverty"         
## [13] "HomeRooms"        "HomeOwn"          "Work"             "Weight"          
## [17] "Length"           "HeadCirc"         "Height"           "BMI"             
## [21] "BMICatUnder20yrs" "BMI_WHO"          "Pulse"            "BPSysAve"        
## [25] "BPDiaAve"         "BPSys1"           "BPDia1"           "BPSys2"          
## [29] "BPDia2"           "BPSys3"           "BPDia3"           "Testosterone"    
## [33] "DirectChol"       "TotChol"          "UrineVol1"        "UrineFlow1"      
## [37] "UrineVol2"        "UrineFlow2"       "Diabetes"         "DiabetesAge"     
## [41] "HealthGen"        "DaysPhysHlthBad"  "DaysMentHlthBad"  "LittleInterest"  
## [45] "Depressed"        "nPregnancies"     "nBabies"          "Age1stBaby"      
## [49] "SleepHrsNight"    "SleepTrouble"     "PhysActive"       "PhysActiveDays"  
## [53] "TVHrsDay"         "CompHrsDay"       "TVHrsDayChild"    "CompHrsDayChild" 
## [57] "Alcohol12PlusYr"  "AlcoholDay"       "AlcoholYear"      "SmokeNow"        
## [61] "Smoke100"         "SmokeAge"         "Marijuana"        "AgeFirstMarij"   
## [65] "RegularMarij"     "AgeRegMarij"      "HardDrugs"        "SexEver"         
## [69] "SexAge"           "SexNumPartnLife"  "SexNumPartYear"   "SameSex"         
## [73] "SexOrientation"   "WTINT2YR"         "WTMEC2YR"         "SDMVPSU"         
## [77] "SDMVSTRA"         "PregnantNow"      "WTMEC4YR"
nrow(nhanes_adult)
## [1] 11778
nrow(nhanes_design)
## [1] 20293

EXPLORATORY DATA ANALYSES ON RESEARCH QUESTION- PART IV: visualizing BMI

REASONING/DEFENSE: we will use svydesign() here. This will be used to analyze the complexity of these data. Specifically, it will be used to create a survey design object, which is a special data structure that stores information about the survey design. Including sampling weights, strata, clusters, and possibly other design features.

Key actions of svydesign(): - Specifies the Survey Design: when the information is provided about the survey design, this helps the function to properly account for the complex survey design when performing analyses. - Creates a Survey Design Object: this function creates a survey design object based on the information provided. This object contains all the necessary information about the survey design. - Allows for Survey-Weighted Analysis: once the survey design object is created using this function, we can use it in conjunction with other functions in the survey package to perform survey-weighted analyses. Such as survey-weighted means, proportions, and regression.

INTERPRETATIONS: The chart here is a histogram that represents the distribution of BMI values within the dataset. The x-axis of the histogram is labeled “BMI” and spans a range from 0 to 80, which are typical values for human BMI. The y-axis is labeled “count” and seems to represent the number of occurrences within the dataset that fall within each BMI range. The units on the y-axis are scientific notation, indicating very large numbers (e.g., 1e+07 is 10,000,000).

Here are some observations about the chart: the histogram has a bell-shaped distribution, indicating that the BMI values in the dataset are somewhat normally distributed, with most of the values clustering around the center of the range. There is a red vertical line that appears to indicate the mean or median BMI value for the dataset, which is located just above the 30 mark on the x-axis. This suggests that the average BMI in this dataset is slightly above 30. The shape of the distribution indicates that there are fewer individuals with very low or very high BMI values and more individuals with BMI values around the center.

Based on a BMI scale, a value of 30 or above is generally considered obese, which suggests that the average BMI in this dataset is in the obese category, potentially indicating a public health concern if this dataset represents a general population. However, without more context about the source of the data or the population it represents, further interpretation would be speculative.

bmi_mean_raw <- NHANESraw %>% 
    filter(Age >= 20) %>%
    summarize(avg.BMI = mean(BMI, na.rm=TRUE))
bmi_mean_raw
## # A tibble: 1 × 1
##   avg.BMI
##     <dbl>
## 1    29.0
bmi_mean <- svymean(~BMI, design = nhanes_adult, na.rm = TRUE)
bmi_mean
##       mean     SE
## BMI 28.734 0.1235
NHANESraw %>% 
  filter(Age >= 20) %>%
    ggplot(mapping=aes(x=BMI, weight=WTMEC4YR)) + 
    geom_histogram()+
    geom_vline(xintercept = coef(bmi_mean), color="red")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 547 rows containing non-finite values (`stat_bin()`).

EXPLORATORY DATA ANALYSES ON RESEARCH QUESTION - PART V: is BMI lower in physically active people?

REASONING/DEFENSE: the distribution of BMI appears to be roughly what can be expected with most people under 40kg/m^2 and a slight positive skewness due to a few people having a much higher BMI. With respect to the research question, let us focus on the following: does the distribution of BMI differ between people who are physically active versus those who are not physically active? Now, we can visually compare BMI with a boxplot and we can formally test for a difference in the mean BMI.

INTERPRETATIONS: This boxplot displays the following: the center line of the box is the median, which splits the dataset in half. The upper and lower extents of the box represent the upper and lower quartiles, Q1 and Q3, respectively, which contain 50% of the data points each. Specifically, this boxplot displays data on BMI in relation to physical activity. The data is split into two categories: physically active and not physically active. Based on the boxplot, we can see that the median BMI is lower for people who are physically active compared to those who are not physically active. The interquartile range, however, is larger for the physically active group, which means the data points are spread out more. There are also more outliers in the physically active group.

NHANESraw %>% 
    filter(Age>=20) %>%
    ggplot(mapping=aes(x=PhysActive, y= BMI, weight=WTMEC4YR))+
    geom_boxplot()
## Warning: Removed 547 rows containing non-finite values (`stat_boxplot()`).

survey_ttest <- svyttest(BMI~PhysActive, design = nhanes_adult)

tidy(survey_ttest)
## # A tibble: 1 × 8
##   estimate statistic  p.value parameter conf.low conf.high method    alternative
##      <dbl>     <dbl>    <dbl>     <dbl>    <dbl>     <dbl> <chr>     <chr>      
## 1    -1.85     -9.72 4.56e-11        32    -2.23     -1.46 Design-b… two.sided

EXPLORATORY DATA ANALYSES ON RESEARCH QUESTION BY INCORPORATING A VARIABLE - PART VI: smoking (1/2)

REASONING/DEFENSE: the relationship between physical activity and BMI may not be a simple one. There may be several lifestyle and/or demographic variables in play. For example, this could be smoking. The questions here are: if one smokes, would they be more or less likely to be physically active? Are smokers more or less likely to have a higher or lower BMI? I am sure we can use our own anecdotal evidence to draw conclusion, but let us do this through these data.

Reasons for using this variable: - Health Outcomes: smoking is a well-known risk factor for various health outcomes. Such as cardiovascular disease, respiratory diseases, and certain types of cancer. Including this variable in the analysis, we can investigate its association with different health outcomes while accounting for the complex survey design. - Confounding Factor: smoking may act as a confounding factor in the relationship between other variables of interest (e.g., dietary habits, physical activity) and health outcomes. By including this variable in the analysis, we can control for its potential confounding effects and obtain more accurate estimates of the relationships between other variables and health outcomes.

INTERPRETATIONS: This is a bar graph showing the proportion of people who are currently smokers and how physically active they are. The y-axis shows the proportion of people, while the x-axis categorizes people based on whether they are currently smoking or not. The bar labeled “No” is taller than the bar labeled “Yes.” This suggests that a higher proportion of people who do not smoke are physically active compared to current smokers. There are a few reasons why this might be the case. Smoking can make it difficult to be physically active because it reduces lung capacity and stamina. People who smoke may also be more likely to have other health conditions that make it difficult to exercise. Additionally, people who are trying to quit smoking may be more likely to take up physical activity as a way to improve their health. Overall, the graph suggests that there is a correlation between smoking and physical activity. People who do not smoke are more likely to be physically active than current smokers.

phys_by_smoke <- svyby(~PhysActive, by = ~SmokeNow, 
                       FUN = svymean, 
                       design = nhanes_adult, 
                       keep.names = FALSE)

phys_by_smoke
##   SmokeNow PhysActiveNo PhysActiveYes se.PhysActiveNo se.PhysActiveYes
## 1       No    0.4566990     0.5433010      0.01738054       0.01738054
## 2      Yes    0.5885421     0.4114579      0.01163246       0.01163246
ggplot(data = phys_by_smoke, aes(SmokeNow, PhysActiveYes, fill = SmokeNow)) +
 geom_col()+
    ylab("Proportion Physically Active")

EXPLORATORY DATA ANALYSES ON RESEARCH QUESTION BY INCORPORATING A VARIABLE - PART VII: smoking (2/2)

Here, we will examine the relationship between smoking and BMI. In addition, we will compare BMI by physical activity by stratified smoking status.

REASONING/DEFENSE: stratifying by smoking status means dividing the dataset into groups based on whether individuals are smokers or non-smokers. This allows us to compare BMI and physical activity within each smoking category separately. In addition, within each smoking category, we will further stratify individuals based on their physical activity levels. Finally, once the dataset has been stratified by smoking status and physical activity levels, we can compare BMI distributions within each subgroup.

INTERPRETATIONS: This boxplot suggests that there is a positive association between self-reported physical activity levels and smoking status. In general, non-smokers reported higher levels of physical activity compared to current smokers. There is also more variation in the physical activity levels reported by non-smokers compared to current smokers. Here are some additional points to consider: this is a self-reported survey, so it is possible that people inaccurately reported their physical activity levels or smoking status. The data may not be generalizable to the entire population. The boxplot does not show cause and effect. It is possible that there is another factor that is causing both smoking and physical inactivity. Overall, the boxplot suggests that there is a correlation between smoking and physical activity. People who do not smoke tend to report being more physically active than current smokers.

INTERPRETATIONS: This boxplot suggests a possible positive association between self-reported physical activity levels and BMI. In general, people with lower BMI reported higher levels of physical activity compared to people with lower BMI. However, it is important to note that BMI is a measure of weight relative to height and does not take into account body composition. Muscle tissue is denser than fat tissue, so people with more muscle mass may have a higher BMI even if they are not overweight. Here are some additional points to consider: this is a self-reported survey, so it is possible that people inaccurately reported their physical activity levels or BMI. The data may not be generalizable to the entire population. The boxplot does not show cause and effect. It is possible that there is another factor that is causing both higher BMI and higher physical activity levels. Overall, we see that people who are physically active tend to have lower BMI no matter their smoking status, and this is true even if they didn’t answer the question. However, we also see that smokers have lower BMI in general. In addition, looking closely we see the difference in BMI comparing physically active people to non-physically active people is slightly smaller in smokers than in non-smokers.

BMI_by_smoke <- svyby(~BMI, by = ~SmokeNow, 
                       FUN = svymean, 
                       design = nhanes_adult, 
                       na.rm = TRUE)
BMI_by_smoke
##     SmokeNow      BMI        se
## No        No 29.25734 0.1915138
## Yes      Yes 27.74873 0.1652377
NHANESraw %>% 
  filter(Age>=20, !is.na(SmokeNow)) %>% 
    ggplot(mapping=aes(x=SmokeNow, y= BMI, weight=WTMEC4YR))+
    geom_boxplot()
## Warning: Removed 244 rows containing non-finite values (`stat_boxplot()`).

NHANESraw %>% 
  filter(Age>=20) %>%
    ggplot(mapping=aes(x=SmokeNow, y= BMI, weight=WTMEC4YR, color=PhysActive))+
    geom_boxplot()
## Warning: Removed 547 rows containing non-finite values (`stat_boxplot()`).

ANALYZING THE DATA THROUGH REGRESSION MODELS - Survey-Weighted Generalized Linear Model (GLM): Example #1 & #2

Variables: smoking status, physical activity, race, alcohol consumption in past 12 months, and gender.

HYPOTHESIS: physical activity and smoking status will be significant predictors of BMI, with physically active individuals and smokers having lower BMI. Additionally, we expect race and alcohol consumption to also influence BMI, with certain racial groups and individuals who consume alcohol having lower BMI. Furthermore, we anticipate that gender may not have a significant association with BMI. We also hypothesize that there may be an interaction effect between physical activity and smoking status on BMI, although the direction and significance of this interaction require further investigation.

INTERPRETATION - MOD 1 (post running the model): Smoking Status (SmokeNowYes): There is a statistically significant negative association between smoking status and BMI (estimate = -2.24, p < 0.001). This suggests that smokers tend to have lower BMI compared to non-smokers. Physical Activity (PhysActiveYes): Similarly, there is a statistically significant negative association between physical activity and BMI (estimate = -2.35, p < 0.001). This indicates that individuals who are physically active tend to have lower BMI compared to those who are not physically active. Interaction Term (SmokeNowYes:PhysActiveYes): The interaction between smoking status and physical activity is statistically significant (estimate = 1.00, p = 0.007). This suggests that the relationship between smoking status and BMI varies depending on physical activity levels. Further analysis would be needed to understand the nature of this interaction. Overall, both smoking status and physical activity appear to be important factors associated with BMI in this model. Additionally, the interaction between smoking status and physical activity indicates that their combined effect on BMI may differ from their individual effects.

INTERPRETATION - MOD 2 (post running the model): Physical Activity (PhysActiveYes): There is a statistically significant negative association between physical activity and BMI (estimate = -2.11, p < 0.001). This indicates that individuals who are physically active tend to have lower BMI compared to those who are not physically active. Smoking Status (SmokeNowYes): Similarly, there is a statistically significant negative association between smoking status and BMI (estimate = -2.23, p < 0.001). This suggests that smokers tend to have lower BMI compared to non-smokers. Race: Among the race categories, Hispanic, White, and Other races show statistically significant negative associations with BMI compared to the reference category (Non-Hispanic Black). This suggests that individuals from these racial backgrounds tend to have lower BMI. Alcohol Consumption (Alcohol12PlusYrYes): There is a statistically significant negative association between alcohol consumption and BMI (estimate = -0.855, p = 0.025). This indicates that individuals who consume alcohol in the past 12 months tend to have lower BMI compared to those who do not. Gender (Gendermale): The association between gender and BMI is not statistically significant (estimate = -0.256, p = 0.278), suggesting that there is no significant difference in BMI between males and females. Interaction Term (PhysActiveYes:SmokeNowYes): The interaction between physical activity and smoking status is marginally significant (estimate = 0.737, p = 0.069). This suggests that the relationship between physical activity and BMI may vary depending on smoking status, although further investigation may be needed to confirm this relationship. Overall, physical activity, smoking status, race, and alcohol consumption appear to be important factors associated with BMI in this model. Gender, however, does not appear to have a significant association with BMI in this analysis. Additionally, the interaction between physical activity and smoking status warrants further exploration to understand its implications for BMI.

mod1 <- svyglm(BMI ~ SmokeNow * PhysActive, design = nhanes_adult)

tidy_mod1 <- tidy(mod1)
tidy_mod1
## # A tibble: 4 × 5
##   term                      estimate std.error statistic  p.value
##   <chr>                        <dbl>     <dbl>     <dbl>    <dbl>
## 1 (Intercept)                  30.5      0.210    146.   2.62e-44
## 2 SmokeNowYes                  -2.24     0.267     -8.40 2.26e- 9
## 3 PhysActiveYes                -2.35     0.236     -9.97 4.96e-11
## 4 SmokeNowYes:PhysActiveYes     1.00     0.344      2.92 6.52e- 3
diff_non_smoke <- tidy_mod1 %>% 
    filter(term == "PhysActiveYes") %>% 
    select(estimate)
diff_non_smoke
## # A tibble: 1 × 1
##   estimate
##      <dbl>
## 1    -2.35
diff_smoke <- tidy_mod1 %>% 
   filter(term %in% c('PhysActiveYes','SmokeNowYes:PhysActiveYes')) %>% 
    summarize(estimate = sum(estimate))
diff_smoke
## # A tibble: 1 × 1
##   estimate
##      <dbl>
## 1    -1.35
mod2 <- svyglm(BMI ~ PhysActive*SmokeNow + Race1 + Alcohol12PlusYr + Gender, 
               design = nhanes_adult)

tidy(mod2)
## # A tibble: 10 × 5
##    term                      estimate std.error statistic  p.value
##    <chr>                        <dbl>     <dbl>     <dbl>    <dbl>
##  1 (Intercept)                 33.2       0.316   105.    1.75e-33
##  2 PhysActiveYes               -2.11      0.273    -7.75  5.56e- 8
##  3 SmokeNowYes                 -2.23      0.303    -7.34  1.40e- 7
##  4 Race1Hispanic               -1.47      0.420    -3.49  1.88e- 3
##  5 Race1Mexican                -0.191     0.464    -0.412 6.84e- 1
##  6 Race1White                  -2.08      0.320    -6.49  1.04e- 6
##  7 Race1Other                  -3.11      0.620    -5.01  4.09e- 5
##  8 Alcohol12PlusYrYes          -0.855     0.358    -2.39  2.50e- 2
##  9 Gendermale                  -0.256     0.230    -1.11  2.78e- 1
## 10 PhysActiveYes:SmokeNowYes    0.737     0.387     1.90  6.92e- 2

ANALYZING THE DATA THROUGH REGRESSION MODELS - Survey-Weighted Generalized Linear Model (GLM): Example #3

Variables: smoking status, physical activity, race, alcohol consumption in past 12 months, gender, and height.

HYPOTHESIS: after controlling for factors such as physical activity, smoking status, race, alcohol consumption, and gender, height will have a positive association with BMI. Additionally, we expect physical activity to be negatively associated with BMI, and smoking status to be associated with lower BMI.

INTERPRETATION (post running the model): Physical Activity (PhysActiveYes): There is a statistically significant negative association between physical activity and BMI (estimate = -2.13, p < 0.001). This indicates that individuals who are physically active tend to have lower BMI compared to those who are not physically active. Smoking Status (SmokeNowYes): Similarly, there is a statistically significant negative association between smoking status and BMI (estimate = -2.25, p < 0.001). This suggests that smokers tend to have lower BMI compared to non-smokers. Race: Among the race categories, Hispanic, White, and Other races show statistically significant negative associations with BMI compared to the reference category (Non-Hispanic Black). This suggests that individuals from these racial backgrounds tend to have lower BMI. Alcohol Consumption (Alcohol12PlusYrYes): There is a statistically significant negative association between alcohol consumption and BMI (estimate = -0.881, p = 0.020). This indicates that individuals who consume alcohol in the past 12 months tend to have lower BMI compared to those who do not. Gender (Gendermale): The association between gender and BMI is not statistically significant (estimate = -0.492, p = 0.159), suggesting that there is no significant difference in BMI between males and females. Height: Height does not show a statistically significant association with BMI (p = 0.370) in this model. Interaction Term (PhysActiveYes:SmokeNowYes): The interaction between physical activity and smoking status is marginally significant (estimate = 0.753, p = 0.066). This suggests that the relationship between physical activity and BMI may vary depending on smoking status, although further investigation may be needed to confirm this relationship. Overall, physical activity and smoking status appear to be the most influential factors associated with BMI in this model, while other variables such as race, alcohol consumption, gender, and the interaction between physical activity and smoking status also show significant associations with BMI. Height, however, does not appear to have a significant association with BMI in this analysis.

mod3 <- svyglm(BMI ~ PhysActive * SmokeNow + Race1 + Alcohol12PlusYr + Gender + Height,
               design = nhanes_adult)

tidy(mod3)
## # A tibble: 11 × 5
##    term                      estimate std.error statistic       p.value
##    <chr>                        <dbl>     <dbl>     <dbl>         <dbl>
##  1 (Intercept)                30.3       3.21       9.43  0.00000000230
##  2 PhysActiveYes              -2.13      0.274     -7.79  0.0000000672 
##  3 SmokeNowYes                -2.25      0.315     -7.14  0.000000286  
##  4 Race1Hispanic              -1.39      0.421     -3.30  0.00313      
##  5 Race1Mexican               -0.0918    0.481     -0.191 0.850        
##  6 Race1White                 -2.09      0.321     -6.52  0.00000119   
##  7 Race1Other                 -3.05      0.614     -4.97  0.0000507    
##  8 Alcohol12PlusYrYes         -0.881     0.352     -2.50  0.0200       
##  9 Gendermale                 -0.492     0.338     -1.46  0.159        
## 10 Height                      0.0184    0.0201     0.915 0.370        
## 11 PhysActiveYes:SmokeNowYes   0.753     0.390      1.93  0.0657

ANALYZING THE DATA THROUGH REGRESSION MODELS - Survey-Weighted Generalized Linear Model (GLM): Examle #4

Variables: smoking status, physical activity, race, alcohol consumption in past 12 months, gender, height, testosterone, and TotChol.

HYPOTHESIS: after controlling for factors such as physical activity, smoking status, race, alcohol consumption, gender, height, testosterone, and Total Cholesterol (TotChol), there will be significant associations between these variables and BMI among adults aged 20 and above in the NHANES dataset. Specifically, we expect that higher levels of physical activity, non-smoking status, and certain demographic factors such as being male and of certain racial backgrounds, will be associated with lower BMI. Additionally, we anticipate that higher levels of height, testosterone, and Total Cholesterol will be positively associated with BMI, reflecting their potential contributions to body composition and metabolic health.

INTERPRETATION (post running the model): Physical Activity (PhysActiveYes): There is a statistically significant negative association between physical activity and BMI (estimate = -1.51, p = 0.0221). This suggests that individuals who are physically active tend to have lower BMI compared to those who are not physically active. Smoking Status (SmokeNowYes): Although the association is not statistically significant at conventional levels (p = 0.0512), there is a negative trend indicating that smokers may have lower BMI compared to non-smokers. Race: Among the race categories, Hispanic, White, and Other races show statistically significant negative associations with BMI compared to the reference category (Non-Hispanic Black). This suggests that individuals from these racial backgrounds tend to have lower BMI. Alcohol Consumption (Alcohol12PlusYrYes): The association between alcohol consumption and BMI is not statistically significant (p = 0.251), indicating that alcohol consumption in the past 12 months may not significantly influence BMI. Gender (Gendermale): There is a statistically significant positive association between gender (male) and BMI (estimate = 4.24, p = 0.00195), suggesting that males tend to have higher BMI compared to females. Height: Height does not show a statistically significant association with BMI (p = 0.873) in this model. Testosterone: There is a statistically significant negative association between testosterone and BMI (estimate = -0.0108, p = 0.000266). This suggests that higher levels of testosterone are associated with lower BMI. Total Cholesterol (TotChol): Total cholesterol does not show a statistically significant association with BMI (p = 0.896) in this model. Interaction Term (PhysActiveYes:SmokeNowYes): The interaction between physical activity and smoking status is not statistically significant (p = 0.355), indicating that the joint effect of physical activity and smoking status on BMI is not significant. Overall, physical activity, smoking status (marginally), race, gender, and testosterone appear to be important predictors of BMI in this regression model. Other variables such as alcohol consumption, height, and total cholesterol do not show significant associations with BMI after controlling for other factors.

mod4 <- svyglm(BMI ~ PhysActive * SmokeNow + Race1 + Alcohol12PlusYr + Gender + Height + Testosterone + TotChol,
               design = nhanes_adult)

tidy(mod4)
## # A tibble: 13 × 5
##    term                      estimate std.error statistic  p.value
##    <chr>                        <dbl>     <dbl>     <dbl>    <dbl>
##  1 (Intercept)               33.4       4.06        8.24  0.000430
##  2 PhysActiveYes             -1.51      0.461      -3.28  0.0221  
##  3 SmokeNowYes               -1.19      0.465      -2.55  0.0512  
##  4 Race1Hispanic             -1.63      0.610      -2.66  0.0446  
##  5 Race1Mexican               0.339     0.772       0.440 0.679   
##  6 Race1White                -2.22      0.487      -4.55  0.00610 
##  7 Race1Other                -2.77      0.862      -3.21  0.0237  
##  8 Alcohol12PlusYrYes        -0.721     0.555      -1.30  0.251   
##  9 Gendermale                 4.24      0.716       5.93  0.00195 
## 10 Height                    -0.00387   0.0230     -0.168 0.873   
## 11 Testosterone              -0.0108    0.00118    -9.11  0.000266
## 12 TotChol                    0.0170    0.123       0.138 0.896   
## 13 PhysActiveYes:SmokeNowYes -0.608     0.596      -1.02  0.355

CONCLUDING REPORT:

Introduction: Body Mass Index (BMI) is a widely used measure of adiposity and is associated with various health outcomes. Understanding the factors influencing BMI in adults is crucial for public health interventions aimed at preventing obesity and related diseases. In this study, we analyzed data from the National Health and Nutrition Examination Survey (NHANES) to investigate the associations between BMI and various lifestyle and demographic factors.

Methods: We conducted multiple regression analysis using NHANES data to examine the relationship between BMI and predictor variables including physical activity, smoking status, race, alcohol consumption, gender, height, testosterone, and total cholesterol. Interaction effects between physical activity and smoking status were also explored. Model diagnostics and hypothesis tests were performed to assess the significance of predictor variables.

Results: Our analysis revealed several key findings:

Physical Activity and Smoking Status: Both physical activity and smoking status were significant predictors of BMI, with physically active individuals and smokers having lower BMI.

Race and Alcohol Consumption: Certain racial groups (Hispanic, White, Other) showed lower BMI compared to Non-Hispanic Black individuals. Alcohol consumption in the past 12 months was associated with lower BMI. Gender and Height: Gender did not show a significant association with BMI. Height also did not have a significant impact on BMI.

Interaction Effect: There was a marginally significant interaction between physical activity and smoking status, suggesting that the relationship between physical activity and BMI may vary depending on smoking status.

Discussion: The findings of this study highlight the complex interplay between lifestyle and demographic factors in determining BMI. Physical activity and smoking status emerged as significant predictors of BMI, underscoring the importance of promoting healthy behaviors for weight management. The observed racial differences in BMI warrant further investigation to understand the underlying mechanisms. Additionally, the interaction between physical activity and smoking status suggests that interventions targeting both behaviors may be beneficial for BMI control.

Conclusion: In conclusion, our analysis provides valuable insights into the factors influencing BMI in adults using NHANES data. The findings underscore the importance of promoting physical activity and smoking cessation for obesity prevention efforts. Future research should focus on elucidating the mechanisms underlying racial disparities in BMI and exploring tailored interventions for high-risk populations.

Limitations: It is important to acknowledge the limitations of this study, including the cross-sectional nature of NHANES data, which limits causal inference. Additionally, self-reported measures of physical activity, smoking status, and alcohol consumption may be subject to recall bias. Further longitudinal studies are needed to confirm the observed associations and explore potential causal pathways.

LS0tDQp0aXRsZTogIlBIVEg1MjEwX1NQMjRfRklOQUxQUk9KRUNUIg0KYXV0aG9yOiAiQ29saW4gUy4iDQpkYXRlOiAiQXByaWwgMjMsIDIwMjQiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkob3BlbmludHJvKQ0KbGlicmFyeSgiTkhBTkVTIikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHN1cnZleSkNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KHF1YW50cmVnKQ0KDQpgYGANCg0KSEVBTFRIIFJFU0VBUkNIIFFVRVNUSU9OOiBob3cgaW50ZXJjb25uZWN0ZWQgYXJlIGJvZHkgbWFzcyBpbmRleCAoQk1JKSBhbmQgcGh5c2ljYWwgYWN0aXZpdHk/IEluIGFkZGl0aW9uLCBkbyBvdGhlciBoZWFsdGggYW5kL29yIGxpZmVzdHlsZSB2YXJpYWJsZXMgaGF2ZSBhbiBpbXBhY3Qgb24gQk1JPw0KDQpSRUFTT05JTkc6IEkgYW0gcXVpdGUgcGh5c2ljYWxseSBhY3RpdmUuIEkgd29ya291dCBmb3Igcm91Z2hseSAyLTIuNSBocnMgNS02IGRheXMgcGVyIHdlZWsuIEFsdGhvdWdoLCBJIGFtIG5vdCBjZXJ0YWluIG9mIG15IEJNSS4gSSB3b3VsZCBsaWtlIHRvIHRoaW5rIEkgYW0gd2l0aGluIHRoZSByYW5nZSBmb3IgbXkgaGVpZ2h0IGFuZCB3ZWlnaHQuIE5vbmV0aGVsZXNzLCBJIGFtIHN0aWxsIGN1cmlvdXMgdG8ga25vdyB0aGUgYW5zd2VyIHRvIHRoaXMuDQoNClNUQVRJU1RJQ0FMIEFOQUxZU0lTIFBMQU46DQoNCkRhdGEgUHJlcGFyYXRpb246DQpDbGVhbiBhbmQgcHJlcHJvY2VzcyB0aGUgTkhBTkVTIGRhdGFzZXQsIGluY2x1ZGluZyBoYW5kbGluZyBtaXNzaW5nIGRhdGEgYW5kIG91dGxpZXIgZGV0ZWN0aW9uLg0KQ2hlY2sgZm9yIG11bHRpY29sbGluZWFyaXR5IGFtb25nIHByZWRpY3RvciB2YXJpYWJsZXMuDQoNCkRlc2NyaXB0aXZlIFN0YXRpc3RpY3M6DQpDb21wdXRlIHN1bW1hcnkgc3RhdGlzdGljcyAobWVhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCBldGMuKSBmb3IgY29udGludW91cyB2YXJpYWJsZXMgKGUuZy4sIEJNSSwgaGVpZ2h0LCB0ZXN0b3N0ZXJvbmUsIGV0Yy4pIGFuZCBmcmVxdWVuY3kgdGFibGVzIGZvciBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgKGUuZy4sIHJhY2UsIHNtb2tpbmcgc3RhdHVzLCBnZW5kZXIsIGV0Yy4pLg0KR2VuZXJhdGUgdmlzdWFsaXphdGlvbnMgc3VjaCBhcyBoaXN0b2dyYW1zLCBib3hwbG90cywgYW5kIGJhciBjaGFydHMgdG8gZXhwbG9yZSB0aGUgZGlzdHJpYnV0aW9uIG9mIHZhcmlhYmxlcyBhbmQgaWRlbnRpZnkgYW55IHBhdHRlcm5zIG9yIHRyZW5kcy4NCg0KUmVncmVzc2lvbiBBbmFseXNpczoNCkNvbmR1Y3QgbXVsdGlwbGUgcmVncmVzc2lvbiBhbmFseXNpcyB0byBleGFtaW5lIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBCTUkgKGRlcGVuZGVudCB2YXJpYWJsZSkgYW5kIHByZWRpY3RvciB2YXJpYWJsZXMgKGluZGVwZW5kZW50IHZhcmlhYmxlcykgaW5jbHVkaW5nOg0KUGh5c2ljYWwgYWN0aXZpdHkgKFBoeXNBY3RpdmVZZXMpDQpTbW9raW5nIHN0YXR1cyAoU21va2VOb3dZZXMpDQpSYWNlIChSYWNlMSkNCkFsY29ob2wgY29uc3VtcHRpb24gKEFsY29ob2wxMlBsdXNZclllcykNCkdlbmRlciAoR2VuZGVybWFsZSkNCkhlaWdodA0KVGVzdG9zdGVyb25lDQpUb3RhbCBDaG9sZXN0ZXJvbCAoVG90Q2hvbCkNCkV4cGxvcmUgaW50ZXJhY3Rpb24gZWZmZWN0cyBiZXR3ZWVuIHBoeXNpY2FsIGFjdGl2aXR5IGFuZCBzbW9raW5nIHN0YXR1cywgYXMgd2VsbCBhcyBvdGhlciByZWxldmFudCBpbnRlcmFjdGlvbnMuDQpQZXJmb3JtIG1vZGVsIGRpYWdub3N0aWNzIGluY2x1ZGluZyBjaGVja2luZyBmb3IgbW9kZWwgYXNzdW1wdGlvbnMgc3VjaCBhcyBsaW5lYXJpdHksIG5vcm1hbGl0eSBvZiByZXNpZHVhbHMsIGFuZCBob21vc2NlZGFzdGljaXR5Lg0KDQpIeXBvdGhlc2lzIFRlc3Rpbmc6DQpGb3JtdWxhdGUgaHlwb3RoZXNlcyBiYXNlZCBvbiB0aGUgcmVncmVzc2lvbiByZXN1bHRzIGFuZCBjb25kdWN0IGh5cG90aGVzaXMgdGVzdHMgdG8gYXNzZXNzIHRoZSBzaWduaWZpY2FuY2Ugb2YgcHJlZGljdG9yIHZhcmlhYmxlcy4NCkludGVycHJldCB0aGUgY29lZmZpY2llbnRzIGFuZCBwLXZhbHVlcyB0byBkZXRlcm1pbmUgdGhlIHN0cmVuZ3RoIGFuZCBkaXJlY3Rpb24gb2YgYXNzb2NpYXRpb25zIGJldHdlZW4gdmFyaWFibGVzIGFuZCBCTUkuDQpFeHBsb3JlIGFueSBzaWduaWZpY2FudCBpbnRlcmFjdGlvbiBlZmZlY3RzIHRvIHVuZGVyc3RhbmQgdGhlaXIgaW1wbGljYXRpb25zIGZvciBCTUkuDQoNCk1vZGVsIENvbXBhcmlzb24gYW5kIFNlbGVjdGlvbjoNCkNvbXBhcmUgZGlmZmVyZW50IHJlZ3Jlc3Npb24gbW9kZWxzIHVzaW5nIGluZm9ybWF0aW9uIGNyaXRlcmlhIChlLmcuLCBBSUMsIEJJQykgdG8gc2VsZWN0IHRoZSBtb3N0IHBhcnNpbW9uaW91cyBhbmQgaW50ZXJwcmV0YWJsZSBtb2RlbC4NCkFzc2VzcyB0aGUgZ29vZG5lc3Mgb2YgZml0IG9mIHRoZSBjaG9zZW4gbW9kZWwgYW5kIGV2YWx1YXRlIGl0cyBwcmVkaWN0aXZlIHBlcmZvcm1hbmNlLg0KDQpEaXNjdXNzaW9uIGFuZCBDb25jbHVzaW9uOg0KSW50ZXJwcmV0IHRoZSBmaW5kaW5ncyBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVzZWFyY2ggcXVlc3Rpb24gYW5kIHJlbGV2YW50IGxpdGVyYXR1cmUuDQpEaXNjdXNzIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhlIHJlc3VsdHMgZm9yIHB1YmxpYyBoZWFsdGggYW5kIGNsaW5pY2FsIHByYWN0aWNlLg0KSGlnaGxpZ2h0IGFueSBsaW1pdGF0aW9ucyBvZiB0aGUgc3R1ZHkgYW5kIHN1Z2dlc3QgZGlyZWN0aW9ucyBmb3IgZnV0dXJlIHJlc2VhcmNoLg0KQ29uY2x1ZGUgd2l0aCBhIHN1bW1hcnkgb2Yga2V5IGZpbmRpbmdzIGFuZCB0aGVpciBzaWduaWZpY2FuY2UuDQoNClNlbnNpdGl2aXR5IEFuYWx5c2lzOg0KQ29uZHVjdCBzZW5zaXRpdml0eSBhbmFseXNpcyB0byBhc3Nlc3MgdGhlIHJvYnVzdG5lc3Mgb2YgcmVzdWx0cyB0byBkaWZmZXJlbnQgbW9kZWwgc3BlY2lmaWNhdGlvbnMgb3IgZGF0YSBwcmVwcm9jZXNzaW5nIHRlY2huaXF1ZXMuDQoNClJlcG9ydGluZzoNClByZXNlbnQgdGhlIHJlc3VsdHMgaW4gYSBjbGVhciBhbmQgY29uY2lzZSBtYW5uZXIgdXNpbmcgdGFibGVzLCBmaWd1cmVzLCBhbmQgbmFycmF0aXZlIGRlc2NyaXB0aW9ucy4NCldyaXRlIGEgY29tcHJlaGVuc2l2ZSByZXBvcnQgc3VtbWFyaXppbmcgdGhlIHJlc2VhcmNoIHF1ZXN0aW9uLCBtZXRob2RzLCByZXN1bHRzLCBhbmQgY29uY2x1c2lvbnMuDQpCeSBmb2xsb3dpbmcgdGhpcyBhbmFseXNpcyBwbGFuLCB3ZSBjYW4gc3lzdGVtYXRpY2FsbHkgaW52ZXN0aWdhdGUgdGhlIGZhY3RvcnMgaW5mbHVlbmNpbmcgQk1JIGluIHRoZSBOSEFORVMgZGF0YXNldCBhbmQgcHJvdmlkZSB2YWx1YWJsZSBpbnNpZ2h0cyBpbnRvIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBsaWZlc3R5bGUgZmFjdG9ycywgZGVtb2dyYXBoaWNzLCBhbmQgQk1JLg0KDQpgYGB7cn0NCmdsaW1wc2UoTkhBTkVTKQ0KDQpgYGANCg0KRVhQTE9SQVRPUlkgREFUQSBBTkFMWVNFUyBPTiBSRVNFQVJDSCBRVUVTVElPTiAtIFBBUlQgSTogdmlzdWFsaXppbmcgc3VydmV5IHdlaWdodCBhbmQgc3RyYXRhIHZhcmlhYmxlcw0KDQpSRUFTT05JTkcvREVGRU5TRTogYWZ0ZXIgdXNpbmcgZ2xpbXBzZSgpLCB0aGUgTkhBTkVTcmF3IGRhdGEgaGFzIHNldmVyYWwgaGVhbHRoIG1lYXN1cmVtZW50IHZhcmlhYmxlcy4gRnVydGhlciwgaXQgY29udGFpbnMgYSBzYW1wbGluZyB3ZWlnaHQgdmFyaWFibGUgV1RNRUMyWVIuIER1ZSB0byB0aGUgTkhBTkVTcmF3IGRhdGEgc3Bhbm5pbmcganVzdCA0IHllYXJzIGFuZCB0aGUgc2FtcGxpbmcgd2VpZ2h0cyBhcmUgYmFzZWQgb24gMiB5ZWFycyBvZiBkYXRhLCBhIHdlaWdodCB2YXJpYWJsZSBtdXN0IGJlIGNyZWF0ZWQgd2hpY2ggY292ZXJzIHRoZSBlbnRpcmV0eSBvZiB0aGUgNCB5ZWFycy4gVG8gYWNjb21wbGlzaCB0aGlzLCB3ZSBtdXN0IGRpdmlkZSB0aGUgMi15ZWFyIHdlaWdodCBpbiBoYWxmLiBUaGVyZWZvcmUsIGluIHRvdGFsLCB0aGUgd2VpZ2h0cyBzdW0gdG8gdGhlIHRvdGFsIHBvcHVsYXRpb24gb2YgdGhlIFVuaXRlZCBTdGF0ZXMgKFUucy4pLg0KDQpLZXkgYWN0aW9ucyBvZiBnbGltcHNlKCk6DQogLSBDb21wYWN0IFN1bW1hcnk6IGdsaW1wc2UoKSBwcm92aWRlcyBhIGNvbXBhY3Qgc3VtbWFyeSBvZiBhIGRhdGEgZnJhbWUgdGhhdCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOiB0b3RhbCBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIChyb3dzKSBpbiB0aGUgZGF0YSBmcmFtZSwgdG90YWwgbnVtYmVyIG9mIHZhcmlhYmxlcyAoY29sdW1ucykgaW4gdGhlIGRhdGEgZnJhbWUsIG5hbWVzIG9mIHRoZSB2YXJpYWJsZXMgYWxvbmcgd2l0aCB0aGVpciBkYXRhIHR5cGVzLCBhbmQgYSBwcmV2aWV3IG9mIHRoZSBmaXJzdCBmZXcgdmFsdWVzIG9mIGVhY2ggdmFyaWFibGUuDQogLSBDb2x1bW4gRGV0YWlsczogZ2xpbXBzZSgpIHNob3dzIHRoZSBmaXJzdCBmZXcgdmFsdWVzIGFsb25nIHdpdGggdGhlaXIgZGF0YSB0eXBlcy4NCiAtIEludGVncmF0ZWQgd2l0aCB0aGUgVGlkeXZlcnNlOiBzaW5jZSBnbGltcHNlKCkgaXMgcGFydCBvZiB0aGUgZHBseXIgcGFja2FnZSwgaXQgaW50ZWdyYXRlcyBzZWFtbGVzc2x5IHdpdGggb3RoZXIgZnVuY3Rpb25zIGluIHRoZSBUaWR5dmVyc2UgZWNvc3lzdGVtLg0KDQpJTlRFUlBSRVRBVElPTlM6IA0KICBCbGFjayBhbmQgSGlzcGFuaWMgR3JvdXBzOiBUaGVzZSBncm91cHMgaGF2ZSB2ZXJ5IHNpbWlsYXIgZGlzdHJpYnV0aW9ucywgd2l0aCBtZWRpYW4gdmFsdWVzIHRoYXQgYXJlIGNsb3NlIHRvIGVhY2ggb3RoZXIsIGFuZCByZWxhdGl2ZWx5IG5hcnJvdyBpbnRlcnF1YXJ0aWxlIHJhbmdlcyAoSVFSKSwgd2hpY2ggc3VnZ2VzdCB0aGF0IHRoZSBtaWRkbGUgNTAlIG9mIHRoZSBkYXRhIHBvaW50cyBhcmUgY2x1c3RlcmVkIGluIGEgcmVsYXRpdmVseSBzbWFsbCByYW5nZS4gVGhlIHdoaXNrZXJzICh0aGUgbGluZXMgZXh0ZW5kaW5nIGZyb20gdGhlIGJveGVzKSBhcmUgYWxzbyBxdWl0ZSBzaG9ydCwgaW5kaWNhdGluZyB0aGF0IG1vc3Qgb2YgdGhlIGRhdGEgcG9pbnRzIGZhbGwgd2l0aGluIGEgc21hbGxlciBvdmVyYWxsIHJhbmdlLiBUaGVyZSBhcmUgYSBmZXcgb3V0bGllcnMgaW5kaWNhdGVkIGJ5IGluZGl2aWR1YWwgZG90cyBiZXlvbmQgdGhlIHdoaXNrZXJzLg0KICBNZXhpY2FuIEdyb3VwOiBUaGlzIGdyb3VwIGhhcyBhIGRpc3RyaWJ1dGlvbiBzaW1pbGFyIHRvIHRoZSBCbGFjayBhbmQgSGlzcGFuaWMgZ3JvdXBzLCB3aXRoIGEgc2xpZ2h0bHkgaGlnaGVyIG1lZGlhbi4gVGhlIElRUiBpcyBuYXJyb3csIGluZGljYXRpbmcgYSB0aWdodCBjbHVzdGVyaW5nIG9mIHRoZSBtaWRkbGUgNTAlIG9mIHRoZSBkYXRhIGFyb3VuZCB0aGUgbWVkaWFuLCBhbmQgaXQgaGFzIGEgZmV3IG91dGxpZXJzIGFzIHdlbGwuDQogIFdoaXRlIEdyb3VwOiBUaGlzIGdyb3VwIGhhcyBhIGhpZ2hlciBtZWRpYW4gdmFsdWUgY29tcGFyZWQgdG8gdGhlIG90aGVyIGdyb3VwcyBhbmQgYSBtdWNoIHdpZGVyIElRUiwgc2hvd2luZyB0aGF0IHRoZXJlIGlzIG1vcmUgdmFyaWFiaWxpdHkgaW4gdGhlIG1pZGRsZSA1MCUgb2YgdGhlIGRhdGEgcG9pbnRzIGZvciB0aGlzIGdyb3VwLiBUaGUgcmFuZ2Ugb2YgdGhlIGRhdGEgcG9pbnRzIChpbmRpY2F0ZWQgYnkgdGhlIHdoaXNrZXJzKSBpcyBhbHNvIHRoZSB3aWRlc3QgYW1vbmcgYWxsIGdyb3Vwcy4gVGhlcmUgaXMgYSBzdWJzdGFudGlhbCBudW1iZXIgb2Ygb3V0bGllcnMsIHdoaWNoIGFyZSB3ZWxsIGFib3ZlIHRoZSB1cHBlciB3aGlza2VyLk90aGVyIEdyb3VwOiBUaGUgZGlzdHJpYnV0aW9uIGZvciB0aGlzIGdyb3VwIGlzIHNpbWlsYXIgdG8gdGhlIEJsYWNrLCBIaXNwYW5pYywgYW5kIE1leGljYW4gZ3JvdXBzIGluIHRlcm1zIG9mIG1lZGlhbiBhbmQgSVFSIGJ1dCBoYXMgZmV3ZXIgb3V0bGllcnMgdGhhbiB0aGUgV2hpdGUgZ3JvdXAuDQogIE92ZXJhbGwsIHRoZSBib3hwbG90IHN1Z2dlc3RzIHRoYXQgdGhlICJXaGl0ZSIgcmFjaWFsIGdyb3VwIGhhcyBhIGhpZ2hlciBtZWRpYW4gdmFsdWUgb2YgIldUTUVDNFlSIiBhbmQgbW9yZSB2YXJpYWJpbGl0eSBjb21wYXJlZCB0byB0aGUgb3RoZXIgZ3JvdXBzLiBUaGUgIk90aGVyIiBncm91cCwgd2hpbGUgaGF2aW5nIGEgbWVkaWFuIHNpbWlsYXIgdG8gdGhlIEJsYWNrLCBIaXNwYW5pYywgYW5kIE1leGljYW4gZ3JvdXBzLCBzZWVtcyB0byBoYXZlIGZld2VyIGV4dHJlbWUgdmFsdWVzLiBUaGUgYm94cGxvdCBhbHNvIGluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2Ygb3V0bGllcnMgaW4gYWxsIGdyb3Vwcywgd2l0aCB0aGUgV2hpdGUgZ3JvdXAgaGF2aW5nIHRoZSBtb3N0Lg0KDQpgYGB7cn0NCmRhdGEoIk5IQU5FU3JhdyIpDQpnbGltcHNlKE5IQU5FU3JhdykNCg0KTkhBTkVTcmF3IDwtIE5IQU5FU3JhdyAlPiUNCiAgICAgICAgICAgICAgICBtdXRhdGUoV1RNRUM0WVIgPSBXVE1FQzJZUiAvIDIpDQoNCk5IQU5FU3JhdyAlPiUgc3VtbWFyaXplKHRvdGFsX1dUTUVDNFlSID0gc3VtKFdUTUVDNFlSKSkNCg0KZ2dwbG90KE5IQU5FU3JhdywgYWVzKHg9UmFjZTEsIHk9V1RNRUM0WVIpKSsNCmdlb21fYm94cGxvdCgpDQoNCmBgYA0KDQpFWFBMT1JBVE9SWSBEQVRBIEFOQUxZU0VTIE9OIFJFU0VBUkNIIFFVRVNUSU9OIC0gUEFSVCBJSTogc3VydmV5IGRlc2lnbg0KDQpSRUFTT05JTkcvREVGRU5TRTogdGhlIHN1cnZleSBwYWNrYWdlIHdpbGwgbm93IGJlIHVzZWQgaW4gb3JkZXIgdG8gc3BlY2lmeSB0aGUgc3VydmV5IGRlc2lnbiAod2lsbCBiZSB1c2VkIGxhdGVyIG9uKS4gQWRkaXRpb25hbGx5LCB0aGUgTkhBTkVTcmF3IGRhdGEgY29udGFpbnMgYSBzdHJhdGEgdmFyaWFibGUsIFNETVZTVFJBLCBhbmQgYSBjbHVzdGVyIElEIHZhcmlhYmxlLCBTRE1WUFNVLCB3aGljaCBhY2NvdW50cyBmb3IgZGVzaWduIGVmZmVjdHMgb2YgY2x1c3RlcmluZy4NCg0KS2V5IGFjdGlvbnMgb2YgU0RNVlNUUkE6DQogLSBTdHJhdHVtIElkZW50aWZpY2F0aW9uOiBlYWNoIG9ic2VydmF0aW9uIGluIHRoZSBOSEFORVMgZGF0YXNldCBpcyBhc3NpZ25lZCBhIHZhbHVlIGluIHRoZSBTRE1WU1RSQSB2YXJpYWJsZSwgd2hpY2ggaWRlbnRpZmllcyB0aGUgc3BlY2lmaWMgc3RyYXR1bSB0byB3aGljaCB0aGUgb2JzZXJ2YXRpb24gYmVsb25ncy4gU3RyYXRhIGFyZSBkZWZpbmVkIGJhc2VkIG9uIGNlcnRhaW4gY2hhcmFjdGVyaXN0aWNzIChlLmcuLCBhZ2UgZ3JvdXAsIHJhY2UvZXRobmljaXR5KSB0byBlbnN1cmUgdGhhdCBlYWNoIHN1Ymdyb3VwIGlzIHJlcHJlc2VudGVkIGluIHRoZSBzYW1wbGUuDQogLSBTdXJ2ZXkgQW5hbHlzaXM6IGluIHN1cnZleSBkYXRhIGFuYWx5c2lzLCB0aGUgU0RNVlNUUkEgdmFyaWFibGUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBzdHJhdHVtIHdoZW4gY29uZHVjdGluZyBhbmFseXNlcyB0aGF0IGFjY291bnQgZm9yIHRoZSBzdXJ2ZXkgZGVzaWduLg0KIC0gQ29tcGxleCBTdXJ2ZXkgRGVzaWduOiBOSEFORVMgZW1wbG95cyBhIGNvbXBsZXggc3VydmV5IGRlc2lnbiBpbnZvbHZpbmcgc3RyYXRpZmljYXRpb24sIGNsdXN0ZXJpbmcsIGFuZCBzYW1wbGluZyB3ZWlnaHRzLiBUaGUgU0RNVlNUUkEgdmFyaWFibGUgaXMganVzdCBvbmUgY29tcG9uZW50IG9mIHRoaXMgZGVzaWduLCBoZWxwaW5nIHRvIGVuc3VyZSB0aGF0IHRoZSBzdXJ2ZXkgc2FtcGxlIGlzIHJlcHJlc2VudGF0aXZlIG9mIHRoZSBVLlMuIHBvcHVsYXRpb24uDQoNCktleSBhY3Rpb25zIG9mIFNETVZQU1U6DQogLSBQcmltYXJpbHkgU2FtcGxpbmcgVW5pdCBJZGVudGlmaWNhdGlvbjogZWFjaCBvYnNlcnZhdGlvbiBpbiB0aGUgTkhBTkVTIGRhdGFzZXQgaXMgYXNzaWduZWQgYSB2YWx1ZSBpbiB0aGUgU0RNVlBTVSB2YXJpYWJsZSwgd2hpY2ggaWRlbnRpZmllcyB0aGUgc3BlY2lmaWMgcHJpbWFyeSBzYW1wbGluZyB1bml0IChQU1UpIHRvIHdoaWNoIHRoZSBvYnNlcnZhdGlvbiBiZWxvbmdzLg0KIC0gQ2x1c3RlcmluZyBJZGVudGlmaWNhdGlvbjogTkhBTkVTIGVtcGxveXMgYSBjbHVzdGVyZWQgc2FtcGxpbmcgZGVzaWduIHdoZXJlIGluZGl2aWR1YWxzIGFyZSBzYW1wbGVkIGZyb20gd2l0aGluIGNlcnRhaW4gZ2VvZ3JhcGhpYyBjbHVzdGVycyAoUFNVcykuIFRoZSBTRE1WUFNVIHZhcmlhYmxlIGlkZW50aWZpZXMgdGhlc2UgY2x1c3RlcnMuDQogLSBTdXJ2ZXkgQW5hbHlzaXM6IHRoZSBTRE1WUFNVIHZhcmlhYmxlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgUFNVIHdoZW4gY29uZHVjdGluZyBhbmFseXNlcyB0aGF0IGFjY291bnQgZm9yIHRoZSBzdXJ2ZXkgZGVzaWduLg0KDQpgYGB7cn0NCm5oYW5lc19kZXNpZ24gPC0gc3Z5ZGVzaWduKA0KICAgIGRhdGEgPSBOSEFORVNyYXcsDQogICAgc3RyYXRhID0gflNETVZTVFJBLA0KICAgIGlkID0gflNETVZQU1UsDQogICAgbmVzdCA9IFRSVUUsDQogICAgd2VpZ2h0cyA9IH5XVE1FQzRZUikNCg0Kc3VtbWFyeShuaGFuZXNfZGVzaWduKQ0KDQpgYGANCg0KRVhQTE9SQVRPUlkgREFUQSBBTkFMWVNFUyBPTiBSRVNFQVJDSCBRVUVTVElPTiAtIFBBUlQgSUlJOiBzdWJzZXQgdGhlc2UgZGF0YQ0KDQpSRUFTT05JTkcvREVGRU5TRTogZXZlbiB0aG91Z2ggZmlsdGVyaW5nIHRoZSBkYXRhIG1heSBiZSBzZWVuIGFzIGEgc2ltcGxlIHByb2Nlc3MsIGl0IGNhbiBiZWNvbWUgY29tcGxpY2F0ZWQgd2hlbiB3ZWlnaHRzIGFyZSBpbnZvbHZlZC4gVGhlcmVmb3JlLCBhbmFseXNpcyBvZiBzdXJ2ZXkgZGF0YSByZXF1aXJlcyBjb25zaWRlcmF0aW9uIG9mIHRoZSBkZXNpZ24gYW5kIHdlaWdodHMgYXQgZWFjaCBzdGVwLiBNb3Jlb3Zlciwgd2hlbiBleGFtaW5pbmcgYSBzdWJzZXQgb2YgZGF0YSwgd2UgbXVzdCBzcGVjaWZ5IHRoaXMgaW4gdGhlIGRlc2lnbiB3ZSBwcm9jZWVkIHdpdGguIFRoZSBzdWJzZXQgb2YgZGF0YSBjYW5ub3QganVzdCBiZSByZW1vdmVkIHZpYSBmaWx0ZXJpbmcgdGhlIHJhdyBkYXRhIGR1ZSB0byBzdXJ2ZXkgd2VpZ2h0cyBubyBsb25nZXIgYmVpbmcgY29ycmVjdCBhbmQgd2lsbCBub3QgY29uc3RpdHV0ZSB0aGUgZnVsbCBVLlMuIHBvcHVsYXRpb24uIEJlaW5nIHRoYXQgY2hpbGRyZW4gYW5kIHlvdW5nIGFkdWx0cyAoPCAyMCB5ZWFycy1vZi1hZ2UpIGhhdmUgZGlmZmVyZW50IEJNSSBjYXRlZ29yaWVzLCB3ZSB3aWxsIHN1YnNldCB0aGVzZSBkYXRhIHRvIGp1c3QgYW5hbHl6ZSBhZHVsdHMgb2YgYXQgbGVhc3QgMjAgeWVhcnMtb2YtYWdlLg0KDQpgYGB7cn0NCm5oYW5lc19hZHVsdCA8LSBuaGFuZXNfZGVzaWduJT4lDQogICAgICAgICAgICAgICAgc3Vic2V0KEFnZSA+PTIwKQ0KDQpzdW1tYXJ5KG5oYW5lc19hZHVsdCkNCg0KbnJvdyhuaGFuZXNfYWR1bHQpDQoNCm5yb3cobmhhbmVzX2Rlc2lnbikNCg0KYGBgDQoNCkVYUExPUkFUT1JZIERBVEEgQU5BTFlTRVMgT04gUkVTRUFSQ0ggUVVFU1RJT04tIFBBUlQgSVY6IHZpc3VhbGl6aW5nIEJNSQ0KDQpSRUFTT05JTkcvREVGRU5TRTogd2Ugd2lsbCB1c2Ugc3Z5ZGVzaWduKCkgaGVyZS4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gYW5hbHl6ZSB0aGUgY29tcGxleGl0eSBvZiB0aGVzZSBkYXRhLiBTcGVjaWZpY2FsbHksIGl0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBzdXJ2ZXkgZGVzaWduIG9iamVjdCwgd2hpY2ggaXMgYSBzcGVjaWFsIGRhdGEgc3RydWN0dXJlIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdXJ2ZXkgZGVzaWduLiBJbmNsdWRpbmcgc2FtcGxpbmcgd2VpZ2h0cywgc3RyYXRhLCBjbHVzdGVycywgYW5kIHBvc3NpYmx5IG90aGVyIGRlc2lnbiBmZWF0dXJlcy4NCg0KS2V5IGFjdGlvbnMgb2Ygc3Z5ZGVzaWduKCk6DQogLSBTcGVjaWZpZXMgdGhlIFN1cnZleSBEZXNpZ246IHdoZW4gdGhlICBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBhYm91dCB0aGUgc3VydmV5IGRlc2lnbiwgdGhpcyBoZWxwcyB0aGUgZnVuY3Rpb24gdG8gcHJvcGVybHkgYWNjb3VudCBmb3IgdGhlIGNvbXBsZXggc3VydmV5IGRlc2lnbiB3aGVuIHBlcmZvcm1pbmcgYW5hbHlzZXMuDQogLSBDcmVhdGVzIGEgU3VydmV5IERlc2lnbiBPYmplY3Q6IHRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHN1cnZleSBkZXNpZ24gb2JqZWN0IGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZC4gVGhpcyBvYmplY3QgY29udGFpbnMgYWxsIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1cnZleSBkZXNpZ24uDQogLSBBbGxvd3MgZm9yIFN1cnZleS1XZWlnaHRlZCBBbmFseXNpczogb25jZSB0aGUgc3VydmV5IGRlc2lnbiBvYmplY3QgaXMgY3JlYXRlZCB1c2luZyB0aGlzIGZ1bmN0aW9uLCB3ZSBjYW4gdXNlIGl0IGluIGNvbmp1bmN0aW9uIHdpdGggb3RoZXIgZnVuY3Rpb25zIGluIHRoZSBzdXJ2ZXkgcGFja2FnZSB0byBwZXJmb3JtIHN1cnZleS13ZWlnaHRlZCBhbmFseXNlcy4gU3VjaCBhcyBzdXJ2ZXktd2VpZ2h0ZWQgbWVhbnMsIHByb3BvcnRpb25zLCBhbmQgcmVncmVzc2lvbi4NCg0KSU5URVJQUkVUQVRJT05TOg0KICBUaGUgY2hhcnQgaGVyZSBpcyBhIGhpc3RvZ3JhbSB0aGF0IHJlcHJlc2VudHMgdGhlIGRpc3RyaWJ1dGlvbiBvZiBCTUkgdmFsdWVzIHdpdGhpbiB0aGUgZGF0YXNldC4gVGhlIHgtYXhpcyBvZiB0aGUgaGlzdG9ncmFtIGlzIGxhYmVsZWQgIkJNSSIgYW5kIHNwYW5zIGEgcmFuZ2UgZnJvbSAwIHRvIDgwLCB3aGljaCBhcmUgdHlwaWNhbCB2YWx1ZXMgZm9yIGh1bWFuIEJNSS4gVGhlIHktYXhpcyBpcyBsYWJlbGVkICJjb3VudCIgYW5kIHNlZW1zIHRvIHJlcHJlc2VudCB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIHdpdGhpbiB0aGUgZGF0YXNldCB0aGF0IGZhbGwgd2l0aGluIGVhY2ggQk1JIHJhbmdlLiBUaGUgdW5pdHMgb24gdGhlIHktYXhpcyBhcmUgc2NpZW50aWZpYyBub3RhdGlvbiwgaW5kaWNhdGluZyB2ZXJ5IGxhcmdlIG51bWJlcnMgKGUuZy4sIDFlKzA3IGlzIDEwLDAwMCwwMDApLg0KDQogIEhlcmUgYXJlIHNvbWUgb2JzZXJ2YXRpb25zIGFib3V0IHRoZSBjaGFydDogdGhlIGhpc3RvZ3JhbSBoYXMgYSBiZWxsLXNoYXBlZCBkaXN0cmlidXRpb24sIGluZGljYXRpbmcgdGhhdCB0aGUgQk1JIHZhbHVlcyBpbiB0aGUgZGF0YXNldCBhcmUgc29tZXdoYXQgbm9ybWFsbHkgZGlzdHJpYnV0ZWQsIHdpdGggbW9zdCBvZiB0aGUgdmFsdWVzIGNsdXN0ZXJpbmcgYXJvdW5kIHRoZSBjZW50ZXIgb2YgdGhlIHJhbmdlLiBUaGVyZSBpcyBhIHJlZCB2ZXJ0aWNhbCBsaW5lIHRoYXQgYXBwZWFycyB0byBpbmRpY2F0ZSB0aGUgbWVhbiBvciBtZWRpYW4gQk1JIHZhbHVlIGZvciB0aGUgZGF0YXNldCwgd2hpY2ggaXMgbG9jYXRlZCBqdXN0IGFib3ZlIHRoZSAzMCBtYXJrIG9uIHRoZSB4LWF4aXMuIFRoaXMgc3VnZ2VzdHMgdGhhdCB0aGUgYXZlcmFnZSBCTUkgaW4gdGhpcyBkYXRhc2V0IGlzIHNsaWdodGx5IGFib3ZlIDMwLiBUaGUgc2hhcGUgb2YgdGhlIGRpc3RyaWJ1dGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBhcmUgZmV3ZXIgaW5kaXZpZHVhbHMgd2l0aCB2ZXJ5IGxvdyBvciB2ZXJ5IGhpZ2ggQk1JIHZhbHVlcyBhbmQgbW9yZSBpbmRpdmlkdWFscyB3aXRoIEJNSSB2YWx1ZXMgYXJvdW5kIHRoZSBjZW50ZXIuDQoNCiAgQmFzZWQgb24gYSBCTUkgc2NhbGUsIGEgdmFsdWUgb2YgMzAgb3IgYWJvdmUgaXMgZ2VuZXJhbGx5IGNvbnNpZGVyZWQgb2Jlc2UsIHdoaWNoIHN1Z2dlc3RzIHRoYXQgdGhlIGF2ZXJhZ2UgQk1JIGluIHRoaXMgZGF0YXNldCBpcyBpbiB0aGUgb2Jlc2UgY2F0ZWdvcnksIHBvdGVudGlhbGx5IGluZGljYXRpbmcgYSBwdWJsaWMgaGVhbHRoIGNvbmNlcm4gaWYgdGhpcyBkYXRhc2V0IHJlcHJlc2VudHMgYSBnZW5lcmFsIHBvcHVsYXRpb24uIEhvd2V2ZXIsIHdpdGhvdXQgbW9yZSBjb250ZXh0IGFib3V0IHRoZSBzb3VyY2Ugb2YgdGhlIGRhdGEgb3IgdGhlIHBvcHVsYXRpb24gaXQgcmVwcmVzZW50cywgZnVydGhlciBpbnRlcnByZXRhdGlvbiB3b3VsZCBiZSBzcGVjdWxhdGl2ZS4NCg0KYGBge3J9DQpibWlfbWVhbl9yYXcgPC0gTkhBTkVTcmF3ICU+JSANCiAgICBmaWx0ZXIoQWdlID49IDIwKSAlPiUNCiAgICBzdW1tYXJpemUoYXZnLkJNSSA9IG1lYW4oQk1JLCBuYS5ybT1UUlVFKSkNCmJtaV9tZWFuX3Jhdw0KDQpibWlfbWVhbiA8LSBzdnltZWFuKH5CTUksIGRlc2lnbiA9IG5oYW5lc19hZHVsdCwgbmEucm0gPSBUUlVFKQ0KYm1pX21lYW4NCg0KTkhBTkVTcmF3ICU+JSANCiAgZmlsdGVyKEFnZSA+PSAyMCkgJT4lDQogICAgZ2dwbG90KG1hcHBpbmc9YWVzKHg9Qk1JLCB3ZWlnaHQ9V1RNRUM0WVIpKSArIA0KICAgIGdlb21faGlzdG9ncmFtKCkrDQogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY29lZihibWlfbWVhbiksIGNvbG9yPSJyZWQiKQ0KDQpgYGANCg0KRVhQTE9SQVRPUlkgREFUQSBBTkFMWVNFUyBPTiBSRVNFQVJDSCBRVUVTVElPTiAtIFBBUlQgVjogaXMgQk1JIGxvd2VyIGluIHBoeXNpY2FsbHkgYWN0aXZlIHBlb3BsZT8NCg0KUkVBU09OSU5HL0RFRkVOU0U6IHRoZSBkaXN0cmlidXRpb24gb2YgQk1JIGFwcGVhcnMgdG8gYmUgcm91Z2hseSB3aGF0IGNhbiBiZSBleHBlY3RlZCB3aXRoIG1vc3QgcGVvcGxlIHVuZGVyIDQwa2cvbV4yIGFuZCBhIHNsaWdodCBwb3NpdGl2ZSBza2V3bmVzcyBkdWUgdG8gYSBmZXcgcGVvcGxlIGhhdmluZyBhIG11Y2ggaGlnaGVyIEJNSS4gV2l0aCByZXNwZWN0IHRvIHRoZSByZXNlYXJjaCBxdWVzdGlvbiwgbGV0IHVzIGZvY3VzIG9uIHRoZSBmb2xsb3dpbmc6IGRvZXMgdGhlIGRpc3RyaWJ1dGlvbiBvZiBCTUkgZGlmZmVyIGJldHdlZW4gcGVvcGxlIHdobyBhcmUgcGh5c2ljYWxseSBhY3RpdmUgdmVyc3VzIHRob3NlIHdobyBhcmUgbm90IHBoeXNpY2FsbHkgYWN0aXZlPyBOb3csIHdlIGNhbiB2aXN1YWxseSBjb21wYXJlIEJNSSB3aXRoIGEgYm94cGxvdCBhbmQgd2UgY2FuIGZvcm1hbGx5IHRlc3QgZm9yIGEgZGlmZmVyZW5jZSBpbiB0aGUgbWVhbiBCTUkuDQoNCklOVEVSUFJFVEFUSU9OUzoNCiAgVGhpcyBib3hwbG90IGRpc3BsYXlzIHRoZSBmb2xsb3dpbmc6IHRoZSBjZW50ZXIgbGluZSBvZiB0aGUgYm94IGlzIHRoZSBtZWRpYW4sIHdoaWNoIHNwbGl0cyB0aGUgZGF0YXNldCBpbiBoYWxmLiBUaGUgdXBwZXIgYW5kIGxvd2VyIGV4dGVudHMgb2YgdGhlIGJveCByZXByZXNlbnQgdGhlIHVwcGVyIGFuZCBsb3dlciBxdWFydGlsZXMsIFExIGFuZCBRMywgcmVzcGVjdGl2ZWx5LCB3aGljaCBjb250YWluIDUwJSBvZiB0aGUgZGF0YSBwb2ludHMgZWFjaC4gU3BlY2lmaWNhbGx5LCB0aGlzIGJveHBsb3QgZGlzcGxheXMgZGF0YSBvbiBCTUkgaW4gcmVsYXRpb24gdG8gcGh5c2ljYWwgYWN0aXZpdHkuIFRoZSBkYXRhIGlzIHNwbGl0IGludG8gdHdvIGNhdGVnb3JpZXM6IHBoeXNpY2FsbHkgYWN0aXZlIGFuZCBub3QgcGh5c2ljYWxseSBhY3RpdmUuDQogIEJhc2VkIG9uIHRoZSBib3hwbG90LCB3ZSBjYW4gc2VlIHRoYXQgdGhlIG1lZGlhbiBCTUkgaXMgbG93ZXIgZm9yIHBlb3BsZSB3aG8gYXJlIHBoeXNpY2FsbHkgYWN0aXZlIGNvbXBhcmVkIHRvIHRob3NlIHdobyBhcmUgbm90IHBoeXNpY2FsbHkgYWN0aXZlLiBUaGUgaW50ZXJxdWFydGlsZSByYW5nZSwgaG93ZXZlciwgaXMgbGFyZ2VyIGZvciB0aGUgcGh5c2ljYWxseSBhY3RpdmUgZ3JvdXAsIHdoaWNoIG1lYW5zIHRoZSBkYXRhIHBvaW50cyBhcmUgc3ByZWFkIG91dCBtb3JlLiBUaGVyZSBhcmUgYWxzbyBtb3JlIG91dGxpZXJzIGluIHRoZSBwaHlzaWNhbGx5IGFjdGl2ZSBncm91cC4NCg0KYGBge3J9DQpOSEFORVNyYXcgJT4lIA0KICAgIGZpbHRlcihBZ2U+PTIwKSAlPiUNCiAgICBnZ3Bsb3QobWFwcGluZz1hZXMoeD1QaHlzQWN0aXZlLCB5PSBCTUksIHdlaWdodD1XVE1FQzRZUikpKw0KICAgIGdlb21fYm94cGxvdCgpDQoNCnN1cnZleV90dGVzdCA8LSBzdnl0dGVzdChCTUl+UGh5c0FjdGl2ZSwgZGVzaWduID0gbmhhbmVzX2FkdWx0KQ0KDQp0aWR5KHN1cnZleV90dGVzdCkNCg0KYGBgDQoNCkVYUExPUkFUT1JZIERBVEEgQU5BTFlTRVMgT04gUkVTRUFSQ0ggUVVFU1RJT04gQlkgSU5DT1JQT1JBVElORyBBIFZBUklBQkxFIC0gUEFSVCBWSTogc21va2luZyAoMS8yKQ0KDQpSRUFTT05JTkcvREVGRU5TRTogdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBoeXNpY2FsIGFjdGl2aXR5IGFuZCBCTUkgbWF5IG5vdCBiZSBhIHNpbXBsZSBvbmUuIFRoZXJlIG1heSBiZSBzZXZlcmFsIGxpZmVzdHlsZSBhbmQvb3IgZGVtb2dyYXBoaWMgdmFyaWFibGVzIGluIHBsYXkuIEZvciBleGFtcGxlLCB0aGlzIGNvdWxkIGJlIHNtb2tpbmcuIFRoZSBxdWVzdGlvbnMgaGVyZSBhcmU6IGlmIG9uZSBzbW9rZXMsIHdvdWxkIHRoZXkgYmUgbW9yZSBvciBsZXNzIGxpa2VseSB0byBiZSBwaHlzaWNhbGx5IGFjdGl2ZT8gQXJlIHNtb2tlcnMgbW9yZSBvciBsZXNzIGxpa2VseSB0byBoYXZlIGEgaGlnaGVyIG9yIGxvd2VyIEJNST8gSSBhbSBzdXJlIHdlIGNhbiB1c2Ugb3VyIG93biBhbmVjZG90YWwgZXZpZGVuY2UgdG8gZHJhdyBjb25jbHVzaW9uLCBidXQgbGV0IHVzIGRvIHRoaXMgdGhyb3VnaCB0aGVzZSBkYXRhLg0KDQpSZWFzb25zIGZvciB1c2luZyB0aGlzIHZhcmlhYmxlOg0KIC0gSGVhbHRoIE91dGNvbWVzOiBzbW9raW5nIGlzIGEgd2VsbC1rbm93biByaXNrIGZhY3RvciBmb3IgdmFyaW91cyBoZWFsdGggb3V0Y29tZXMuIFN1Y2ggYXMgY2FyZGlvdmFzY3VsYXIgZGlzZWFzZSwgcmVzcGlyYXRvcnkgZGlzZWFzZXMsIGFuZCBjZXJ0YWluIHR5cGVzIG9mIGNhbmNlci4gSW5jbHVkaW5nIHRoaXMgdmFyaWFibGUgaW4gdGhlIGFuYWx5c2lzLCB3ZSBjYW4gaW52ZXN0aWdhdGUgaXRzIGFzc29jaWF0aW9uIHdpdGggZGlmZmVyZW50IGhlYWx0aCBvdXRjb21lcyB3aGlsZSBhY2NvdW50aW5nIGZvciB0aGUgY29tcGxleCBzdXJ2ZXkgZGVzaWduLg0KIC0gQ29uZm91bmRpbmcgRmFjdG9yOiBzbW9raW5nIG1heSBhY3QgYXMgYSBjb25mb3VuZGluZyBmYWN0b3IgaW4gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG90aGVyIHZhcmlhYmxlcyBvZiBpbnRlcmVzdCAoZS5nLiwgZGlldGFyeSBoYWJpdHMsIHBoeXNpY2FsIGFjdGl2aXR5KSBhbmQgaGVhbHRoIG91dGNvbWVzLiBCeSBpbmNsdWRpbmcgdGhpcyB2YXJpYWJsZSBpbiB0aGUgYW5hbHlzaXMsIHdlIGNhbiBjb250cm9sIGZvciBpdHMgcG90ZW50aWFsIGNvbmZvdW5kaW5nIGVmZmVjdHMgYW5kIG9idGFpbiBtb3JlIGFjY3VyYXRlIGVzdGltYXRlcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIG90aGVyIHZhcmlhYmxlcyBhbmQgaGVhbHRoIG91dGNvbWVzLg0KDQpJTlRFUlBSRVRBVElPTlM6DQogIFRoaXMgaXMgYSBiYXIgZ3JhcGggc2hvd2luZyB0aGUgcHJvcG9ydGlvbiBvZiBwZW9wbGUgd2hvIGFyZSBjdXJyZW50bHkgc21va2VycyBhbmQgaG93IHBoeXNpY2FsbHkgYWN0aXZlIHRoZXkgYXJlLiBUaGUgeS1heGlzIHNob3dzIHRoZSBwcm9wb3J0aW9uIG9mIHBlb3BsZSwgd2hpbGUgdGhlIHgtYXhpcyBjYXRlZ29yaXplcyBwZW9wbGUgYmFzZWQgb24gd2hldGhlciB0aGV5IGFyZSBjdXJyZW50bHkgc21va2luZyBvciBub3QuDQogIFRoZSBiYXIgbGFiZWxlZCAiTm8iIGlzIHRhbGxlciB0aGFuIHRoZSBiYXIgbGFiZWxlZCAiWWVzLiIgVGhpcyBzdWdnZXN0cyB0aGF0IGEgaGlnaGVyIHByb3BvcnRpb24gb2YgcGVvcGxlIHdobyBkbyBub3Qgc21va2UgYXJlIHBoeXNpY2FsbHkgYWN0aXZlIGNvbXBhcmVkIHRvIGN1cnJlbnQgc21va2Vycy4gVGhlcmUgYXJlIGEgZmV3IHJlYXNvbnMgd2h5IHRoaXMgbWlnaHQgYmUgdGhlIGNhc2UuIFNtb2tpbmcgY2FuIG1ha2UgaXQgZGlmZmljdWx0IHRvIGJlIHBoeXNpY2FsbHkgYWN0aXZlIGJlY2F1c2UgaXQgcmVkdWNlcyBsdW5nIGNhcGFjaXR5IGFuZCBzdGFtaW5hLiBQZW9wbGUgd2hvIHNtb2tlIG1heSBhbHNvIGJlIG1vcmUgbGlrZWx5IHRvIGhhdmUgb3RoZXIgaGVhbHRoIGNvbmRpdGlvbnMgdGhhdCBtYWtlIGl0IGRpZmZpY3VsdCB0byBleGVyY2lzZS4gQWRkaXRpb25hbGx5LCBwZW9wbGUgd2hvIGFyZSB0cnlpbmcgdG8gcXVpdCBzbW9raW5nIG1heSBiZSBtb3JlIGxpa2VseSB0byB0YWtlIHVwIHBoeXNpY2FsIGFjdGl2aXR5IGFzIGEgd2F5IHRvIGltcHJvdmUgdGhlaXIgaGVhbHRoLg0KICBPdmVyYWxsLCB0aGUgZ3JhcGggc3VnZ2VzdHMgdGhhdCB0aGVyZSBpcyBhIGNvcnJlbGF0aW9uIGJldHdlZW4gc21va2luZyBhbmQgcGh5c2ljYWwgYWN0aXZpdHkuIFBlb3BsZSB3aG8gZG8gbm90IHNtb2tlIGFyZSBtb3JlIGxpa2VseSB0byBiZSBwaHlzaWNhbGx5IGFjdGl2ZSB0aGFuIGN1cnJlbnQgc21va2Vycy4NCg0KYGBge3J9DQpwaHlzX2J5X3Ntb2tlIDwtIHN2eWJ5KH5QaHlzQWN0aXZlLCBieSA9IH5TbW9rZU5vdywgDQogICAgICAgICAgICAgICAgICAgICAgIEZVTiA9IHN2eW1lYW4sIA0KICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24gPSBuaGFuZXNfYWR1bHQsIA0KICAgICAgICAgICAgICAgICAgICAgICBrZWVwLm5hbWVzID0gRkFMU0UpDQoNCnBoeXNfYnlfc21va2UNCg0KZ2dwbG90KGRhdGEgPSBwaHlzX2J5X3Ntb2tlLCBhZXMoU21va2VOb3csIFBoeXNBY3RpdmVZZXMsIGZpbGwgPSBTbW9rZU5vdykpICsNCiBnZW9tX2NvbCgpKw0KICAgIHlsYWIoIlByb3BvcnRpb24gUGh5c2ljYWxseSBBY3RpdmUiKQ0KDQpgYGANCg0KRVhQTE9SQVRPUlkgREFUQSBBTkFMWVNFUyBPTiBSRVNFQVJDSCBRVUVTVElPTiBCWSBJTkNPUlBPUkFUSU5HIEEgVkFSSUFCTEUgLSBQQVJUIFZJSTogc21va2luZyAoMi8yKQ0KDQpIZXJlLCB3ZSB3aWxsIGV4YW1pbmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNtb2tpbmcgYW5kIEJNSS4gSW4gYWRkaXRpb24sIHdlIHdpbGwgY29tcGFyZSBCTUkgYnkgcGh5c2ljYWwgYWN0aXZpdHkgYnkgc3RyYXRpZmllZCBzbW9raW5nIHN0YXR1cy4NCg0KUkVBU09OSU5HL0RFRkVOU0U6IHN0cmF0aWZ5aW5nIGJ5IHNtb2tpbmcgc3RhdHVzIG1lYW5zIGRpdmlkaW5nIHRoZSBkYXRhc2V0IGludG8gZ3JvdXBzIGJhc2VkIG9uIHdoZXRoZXIgaW5kaXZpZHVhbHMgYXJlIHNtb2tlcnMgb3Igbm9uLXNtb2tlcnMuIFRoaXMgYWxsb3dzIHVzIHRvIGNvbXBhcmUgQk1JIGFuZCBwaHlzaWNhbCBhY3Rpdml0eSB3aXRoaW4gZWFjaCBzbW9raW5nIGNhdGVnb3J5IHNlcGFyYXRlbHkuIEluIGFkZGl0aW9uLCB3aXRoaW4gZWFjaCBzbW9raW5nIGNhdGVnb3J5LCB3ZSB3aWxsIGZ1cnRoZXIgc3RyYXRpZnkgaW5kaXZpZHVhbHMgYmFzZWQgb24gdGhlaXIgcGh5c2ljYWwgYWN0aXZpdHkgbGV2ZWxzLiBGaW5hbGx5LCBvbmNlIHRoZSBkYXRhc2V0IGhhcyBiZWVuIHN0cmF0aWZpZWQgYnkgc21va2luZyBzdGF0dXMgYW5kIHBoeXNpY2FsIGFjdGl2aXR5IGxldmVscywgd2UgY2FuIGNvbXBhcmUgQk1JIGRpc3RyaWJ1dGlvbnMgd2l0aGluIGVhY2ggc3ViZ3JvdXAuDQoNCklOVEVSUFJFVEFUSU9OUzoNCiAgVGhpcyBib3hwbG90IHN1Z2dlc3RzIHRoYXQgdGhlcmUgaXMgYSBwb3NpdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHNlbGYtcmVwb3J0ZWQgcGh5c2ljYWwgYWN0aXZpdHkgbGV2ZWxzIGFuZCBzbW9raW5nIHN0YXR1cy4gIEluIGdlbmVyYWwsIG5vbi1zbW9rZXJzIHJlcG9ydGVkIGhpZ2hlciBsZXZlbHMgb2YgcGh5c2ljYWwgYWN0aXZpdHkgY29tcGFyZWQgdG8gY3VycmVudCBzbW9rZXJzLiBUaGVyZSBpcyBhbHNvIG1vcmUgdmFyaWF0aW9uIGluIHRoZSBwaHlzaWNhbCBhY3Rpdml0eSBsZXZlbHMgcmVwb3J0ZWQgYnkgbm9uLXNtb2tlcnMgY29tcGFyZWQgdG8gY3VycmVudCBzbW9rZXJzLg0KICBIZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgcG9pbnRzIHRvIGNvbnNpZGVyOiB0aGlzIGlzIGEgc2VsZi1yZXBvcnRlZCBzdXJ2ZXksIHNvIGl0IGlzIHBvc3NpYmxlIHRoYXQgcGVvcGxlIGluYWNjdXJhdGVseSByZXBvcnRlZCB0aGVpciBwaHlzaWNhbCBhY3Rpdml0eSBsZXZlbHMgb3Igc21va2luZyBzdGF0dXMuIFRoZSBkYXRhIG1heSBub3QgYmUgZ2VuZXJhbGl6YWJsZSB0byB0aGUgZW50aXJlIHBvcHVsYXRpb24uIFRoZSBib3hwbG90IGRvZXMgbm90IHNob3cgY2F1c2UgYW5kIGVmZmVjdC4gSXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBpcyBhbm90aGVyIGZhY3RvciB0aGF0IGlzIGNhdXNpbmcgYm90aCBzbW9raW5nIGFuZCBwaHlzaWNhbCBpbmFjdGl2aXR5Lg0KICBPdmVyYWxsLCB0aGUgYm94cGxvdCBzdWdnZXN0cyB0aGF0IHRoZXJlIGlzIGEgY29ycmVsYXRpb24gYmV0d2VlbiBzbW9raW5nIGFuZCBwaHlzaWNhbCBhY3Rpdml0eS4gUGVvcGxlIHdobyBkbyBub3Qgc21va2UgdGVuZCB0byByZXBvcnQgYmVpbmcgbW9yZSBwaHlzaWNhbGx5IGFjdGl2ZSB0aGFuIGN1cnJlbnQgc21va2Vycy4NCg0KSU5URVJQUkVUQVRJT05TOg0KICBUaGlzIGJveHBsb3Qgc3VnZ2VzdHMgYSBwb3NzaWJsZSBwb3NpdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHNlbGYtcmVwb3J0ZWQgcGh5c2ljYWwgYWN0aXZpdHkgbGV2ZWxzIGFuZCBCTUkuICBJbiBnZW5lcmFsLCBwZW9wbGUgd2l0aCBsb3dlciBCTUkgcmVwb3J0ZWQgaGlnaGVyIGxldmVscyBvZiBwaHlzaWNhbCBhY3Rpdml0eSBjb21wYXJlZCB0byBwZW9wbGUgd2l0aCBsb3dlciBCTUkuIEhvd2V2ZXIsIGl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgQk1JIGlzIGEgbWVhc3VyZSBvZiB3ZWlnaHQgcmVsYXRpdmUgdG8gaGVpZ2h0IGFuZCBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCBib2R5IGNvbXBvc2l0aW9uLiBNdXNjbGUgdGlzc3VlIGlzIGRlbnNlciB0aGFuIGZhdCB0aXNzdWUsIHNvIHBlb3BsZSB3aXRoIG1vcmUgbXVzY2xlIG1hc3MgbWF5IGhhdmUgYSBoaWdoZXIgQk1JIGV2ZW4gaWYgdGhleSBhcmUgbm90IG92ZXJ3ZWlnaHQuDQogIEhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCBwb2ludHMgdG8gY29uc2lkZXI6IHRoaXMgaXMgYSBzZWxmLXJlcG9ydGVkIHN1cnZleSwgc28gaXQgaXMgcG9zc2libGUgdGhhdCBwZW9wbGUgaW5hY2N1cmF0ZWx5IHJlcG9ydGVkIHRoZWlyIHBoeXNpY2FsIGFjdGl2aXR5IGxldmVscyBvciBCTUkuIFRoZSBkYXRhIG1heSBub3QgYmUgZ2VuZXJhbGl6YWJsZSB0byB0aGUgZW50aXJlIHBvcHVsYXRpb24uIFRoZSBib3hwbG90IGRvZXMgbm90IHNob3cgY2F1c2UgYW5kIGVmZmVjdC4gSXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBpcyBhbm90aGVyIGZhY3RvciB0aGF0IGlzIGNhdXNpbmcgYm90aCBoaWdoZXIgQk1JIGFuZCBoaWdoZXIgcGh5c2ljYWwgYWN0aXZpdHkgbGV2ZWxzLg0KICBPdmVyYWxsLCB3ZSBzZWUgdGhhdCBwZW9wbGUgd2hvIGFyZSBwaHlzaWNhbGx5IGFjdGl2ZSB0ZW5kIHRvIGhhdmUgbG93ZXIgQk1JIG5vIG1hdHRlciB0aGVpciBzbW9raW5nIHN0YXR1cywgYW5kIHRoaXMgaXMgdHJ1ZSBldmVuIGlmIHRoZXkgZGlkbid0IGFuc3dlciB0aGUgcXVlc3Rpb24uIEhvd2V2ZXIsIHdlIGFsc28gc2VlIHRoYXQgc21va2VycyBoYXZlIGxvd2VyIEJNSSBpbiBnZW5lcmFsLiBJbiBhZGRpdGlvbiwgbG9va2luZyBjbG9zZWx5IHdlIHNlZSB0aGUgZGlmZmVyZW5jZSBpbiBCTUkgY29tcGFyaW5nIHBoeXNpY2FsbHkgYWN0aXZlIHBlb3BsZSB0byBub24tcGh5c2ljYWxseSBhY3RpdmUgcGVvcGxlIGlzIHNsaWdodGx5IHNtYWxsZXIgaW4gc21va2VycyB0aGFuIGluIG5vbi1zbW9rZXJzLg0KDQpgYGB7cn0NCkJNSV9ieV9zbW9rZSA8LSBzdnlieSh+Qk1JLCBieSA9IH5TbW9rZU5vdywgDQogICAgICAgICAgICAgICAgICAgICAgIEZVTiA9IHN2eW1lYW4sIA0KICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24gPSBuaGFuZXNfYWR1bHQsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpDQpCTUlfYnlfc21va2UNCg0KTkhBTkVTcmF3ICU+JSANCiAgZmlsdGVyKEFnZT49MjAsICFpcy5uYShTbW9rZU5vdykpICU+JSANCiAgICBnZ3Bsb3QobWFwcGluZz1hZXMoeD1TbW9rZU5vdywgeT0gQk1JLCB3ZWlnaHQ9V1RNRUM0WVIpKSsNCiAgICBnZW9tX2JveHBsb3QoKQ0KDQpOSEFORVNyYXcgJT4lIA0KICBmaWx0ZXIoQWdlPj0yMCkgJT4lDQogICAgZ2dwbG90KG1hcHBpbmc9YWVzKHg9U21va2VOb3csIHk9IEJNSSwgd2VpZ2h0PVdUTUVDNFlSLCBjb2xvcj1QaHlzQWN0aXZlKSkrDQogICAgZ2VvbV9ib3hwbG90KCkNCg0KYGBgDQoNCkFOQUxZWklORyBUSEUgREFUQSBUSFJPVUdIIFJFR1JFU1NJT04gTU9ERUxTIC0gU3VydmV5LVdlaWdodGVkIEdlbmVyYWxpemVkIExpbmVhciBNb2RlbCAoR0xNKTogRXhhbXBsZSAjMSAmICMyDQoNClZhcmlhYmxlczogc21va2luZyBzdGF0dXMsIHBoeXNpY2FsIGFjdGl2aXR5LCByYWNlLCBhbGNvaG9sIGNvbnN1bXB0aW9uIGluIHBhc3QgMTIgbW9udGhzLCBhbmQgZ2VuZGVyLg0KDQpIWVBPVEhFU0lTOiBwaHlzaWNhbCBhY3Rpdml0eSBhbmQgc21va2luZyBzdGF0dXMgd2lsbCBiZSBzaWduaWZpY2FudCBwcmVkaWN0b3JzIG9mIEJNSSwgd2l0aCBwaHlzaWNhbGx5IGFjdGl2ZSBpbmRpdmlkdWFscyBhbmQgc21va2VycyBoYXZpbmcgbG93ZXIgQk1JLiBBZGRpdGlvbmFsbHksIHdlIGV4cGVjdCByYWNlIGFuZCBhbGNvaG9sIGNvbnN1bXB0aW9uIHRvIGFsc28gaW5mbHVlbmNlIEJNSSwgd2l0aCBjZXJ0YWluIHJhY2lhbCBncm91cHMgYW5kIGluZGl2aWR1YWxzIHdobyBjb25zdW1lIGFsY29ob2wgaGF2aW5nIGxvd2VyIEJNSS4gRnVydGhlcm1vcmUsIHdlIGFudGljaXBhdGUgdGhhdCBnZW5kZXIgbWF5IG5vdCBoYXZlIGEgc2lnbmlmaWNhbnQgYXNzb2NpYXRpb24gd2l0aCBCTUkuIFdlIGFsc28gaHlwb3RoZXNpemUgdGhhdCB0aGVyZSBtYXkgYmUgYW4gaW50ZXJhY3Rpb24gZWZmZWN0IGJldHdlZW4gcGh5c2ljYWwgYWN0aXZpdHkgYW5kIHNtb2tpbmcgc3RhdHVzIG9uIEJNSSwgYWx0aG91Z2ggdGhlIGRpcmVjdGlvbiBhbmQgc2lnbmlmaWNhbmNlIG9mIHRoaXMgaW50ZXJhY3Rpb24gcmVxdWlyZSBmdXJ0aGVyIGludmVzdGlnYXRpb24uDQoNCklOVEVSUFJFVEFUSU9OIC0gTU9EIDEgKHBvc3QgcnVubmluZyB0aGUgbW9kZWwpOg0KICBTbW9raW5nIFN0YXR1cyAoU21va2VOb3dZZXMpOiBUaGVyZSBpcyBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgbmVnYXRpdmUgYXNzb2NpYXRpb24gYmV0d2VlbiBzbW9raW5nIHN0YXR1cyBhbmQgQk1JIChlc3RpbWF0ZSA9IC0yLjI0LCBwIDwgMC4wMDEpLiBUaGlzIHN1Z2dlc3RzIHRoYXQgc21va2VycyB0ZW5kIHRvIGhhdmUgbG93ZXIgQk1JIGNvbXBhcmVkIHRvIG5vbi1zbW9rZXJzLiBQaHlzaWNhbCBBY3Rpdml0eSAoUGh5c0FjdGl2ZVllcyk6IFNpbWlsYXJseSwgdGhlcmUgaXMgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IG5lZ2F0aXZlIGFzc29jaWF0aW9uIGJldHdlZW4gcGh5c2ljYWwgYWN0aXZpdHkgYW5kIEJNSSAoZXN0aW1hdGUgPSAtMi4zNSwgcCA8IDAuMDAxKS4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBpbmRpdmlkdWFscyB3aG8gYXJlIHBoeXNpY2FsbHkgYWN0aXZlIHRlbmQgdG8gaGF2ZSBsb3dlciBCTUkgY29tcGFyZWQgdG8gdGhvc2Ugd2hvIGFyZSBub3QgcGh5c2ljYWxseSBhY3RpdmUuIEludGVyYWN0aW9uIFRlcm0gKFNtb2tlTm93WWVzOlBoeXNBY3RpdmVZZXMpOiBUaGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBzbW9raW5nIHN0YXR1cyBhbmQgcGh5c2ljYWwgYWN0aXZpdHkgaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCAoZXN0aW1hdGUgPSAxLjAwLCBwID0gMC4wMDcpLiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNtb2tpbmcgc3RhdHVzIGFuZCBCTUkgdmFyaWVzIGRlcGVuZGluZyBvbiBwaHlzaWNhbCBhY3Rpdml0eSBsZXZlbHMuIEZ1cnRoZXIgYW5hbHlzaXMgd291bGQgYmUgbmVlZGVkIHRvIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGlzIGludGVyYWN0aW9uLg0KICBPdmVyYWxsLCBib3RoIHNtb2tpbmcgc3RhdHVzIGFuZCBwaHlzaWNhbCBhY3Rpdml0eSBhcHBlYXIgdG8gYmUgaW1wb3J0YW50IGZhY3RvcnMgYXNzb2NpYXRlZCB3aXRoIEJNSSBpbiB0aGlzIG1vZGVsLiBBZGRpdGlvbmFsbHksIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHNtb2tpbmcgc3RhdHVzIGFuZCBwaHlzaWNhbCBhY3Rpdml0eSBpbmRpY2F0ZXMgdGhhdCB0aGVpciBjb21iaW5lZCBlZmZlY3Qgb24gQk1JIG1heSBkaWZmZXIgZnJvbSB0aGVpciBpbmRpdmlkdWFsIGVmZmVjdHMuDQoNCklOVEVSUFJFVEFUSU9OIC0gTU9EIDIgKHBvc3QgcnVubmluZyB0aGUgbW9kZWwpOg0KICBQaHlzaWNhbCBBY3Rpdml0eSAoUGh5c0FjdGl2ZVllcyk6IFRoZXJlIGlzIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBuZWdhdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHBoeXNpY2FsIGFjdGl2aXR5IGFuZCBCTUkgKGVzdGltYXRlID0gLTIuMTEsIHAgPCAwLjAwMSkuIFRoaXMgaW5kaWNhdGVzIHRoYXQgaW5kaXZpZHVhbHMgd2hvIGFyZSBwaHlzaWNhbGx5IGFjdGl2ZSB0ZW5kIHRvIGhhdmUgbG93ZXIgQk1JIGNvbXBhcmVkIHRvIHRob3NlIHdobyBhcmUgbm90IHBoeXNpY2FsbHkgYWN0aXZlLiBTbW9raW5nIFN0YXR1cyAoU21va2VOb3dZZXMpOiBTaW1pbGFybHksIHRoZXJlIGlzIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBuZWdhdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHNtb2tpbmcgc3RhdHVzIGFuZCBCTUkgKGVzdGltYXRlID0gLTIuMjMsIHAgPCAwLjAwMSkuIFRoaXMgc3VnZ2VzdHMgdGhhdCBzbW9rZXJzIHRlbmQgdG8gaGF2ZSBsb3dlciBCTUkgY29tcGFyZWQgdG8gbm9uLXNtb2tlcnMuIFJhY2U6IEFtb25nIHRoZSByYWNlIGNhdGVnb3JpZXMsIEhpc3BhbmljLCBXaGl0ZSwgYW5kIE90aGVyIHJhY2VzIHNob3cgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBuZWdhdGl2ZSBhc3NvY2lhdGlvbnMgd2l0aCBCTUkgY29tcGFyZWQgdG8gdGhlIHJlZmVyZW5jZSBjYXRlZ29yeSAoTm9uLUhpc3BhbmljIEJsYWNrKS4gVGhpcyBzdWdnZXN0cyB0aGF0IGluZGl2aWR1YWxzIGZyb20gdGhlc2UgcmFjaWFsIGJhY2tncm91bmRzIHRlbmQgdG8gaGF2ZSBsb3dlciBCTUkuDQogIEFsY29ob2wgQ29uc3VtcHRpb24gKEFsY29ob2wxMlBsdXNZclllcyk6IFRoZXJlIGlzIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBuZWdhdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGFsY29ob2wgY29uc3VtcHRpb24gYW5kIEJNSSAoZXN0aW1hdGUgPSAtMC44NTUsIHAgPSAwLjAyNSkuIFRoaXMgaW5kaWNhdGVzIHRoYXQgaW5kaXZpZHVhbHMgd2hvIGNvbnN1bWUgYWxjb2hvbCBpbiB0aGUgcGFzdCAxMiBtb250aHMgdGVuZCB0byBoYXZlIGxvd2VyIEJNSSBjb21wYXJlZCB0byB0aG9zZSB3aG8gZG8gbm90LiBHZW5kZXIgKEdlbmRlcm1hbGUpOiBUaGUgYXNzb2NpYXRpb24gYmV0d2VlbiBnZW5kZXIgYW5kIEJNSSBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCAoZXN0aW1hdGUgPSAtMC4yNTYsIHAgPSAwLjI3OCksIHN1Z2dlc3RpbmcgdGhhdCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIEJNSSBiZXR3ZWVuIG1hbGVzIGFuZCBmZW1hbGVzLiBJbnRlcmFjdGlvbiBUZXJtIChQaHlzQWN0aXZlWWVzOlNtb2tlTm93WWVzKTogVGhlIGludGVyYWN0aW9uIGJldHdlZW4gcGh5c2ljYWwgYWN0aXZpdHkgYW5kIHNtb2tpbmcgc3RhdHVzIGlzIG1hcmdpbmFsbHkgc2lnbmlmaWNhbnQgKGVzdGltYXRlID0gMC43MzcsIHAgPSAwLjA2OSkuIFRoaXMgc3VnZ2VzdHMgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gcGh5c2ljYWwgYWN0aXZpdHkgYW5kIEJNSSBtYXkgdmFyeSBkZXBlbmRpbmcgb24gc21va2luZyBzdGF0dXMsIGFsdGhvdWdoIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbiBtYXkgYmUgbmVlZGVkIHRvIGNvbmZpcm0gdGhpcyByZWxhdGlvbnNoaXAuDQogIE92ZXJhbGwsIHBoeXNpY2FsIGFjdGl2aXR5LCBzbW9raW5nIHN0YXR1cywgcmFjZSwgYW5kIGFsY29ob2wgY29uc3VtcHRpb24gYXBwZWFyIHRvIGJlIGltcG9ydGFudCBmYWN0b3JzIGFzc29jaWF0ZWQgd2l0aCBCTUkgaW4gdGhpcyBtb2RlbC4gR2VuZGVyLCBob3dldmVyLCBkb2VzIG5vdCBhcHBlYXIgdG8gaGF2ZSBhIHNpZ25pZmljYW50IGFzc29jaWF0aW9uIHdpdGggQk1JIGluIHRoaXMgYW5hbHlzaXMuIEFkZGl0aW9uYWxseSwgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gcGh5c2ljYWwgYWN0aXZpdHkgYW5kIHNtb2tpbmcgc3RhdHVzIHdhcnJhbnRzIGZ1cnRoZXIgZXhwbG9yYXRpb24gdG8gdW5kZXJzdGFuZCBpdHMgaW1wbGljYXRpb25zIGZvciBCTUkuDQoNCmBgYHtyfQ0KbW9kMSA8LSBzdnlnbG0oQk1JIH4gU21va2VOb3cgKiBQaHlzQWN0aXZlLCBkZXNpZ24gPSBuaGFuZXNfYWR1bHQpDQoNCnRpZHlfbW9kMSA8LSB0aWR5KG1vZDEpDQp0aWR5X21vZDENCg0KZGlmZl9ub25fc21va2UgPC0gdGlkeV9tb2QxICU+JSANCiAgICBmaWx0ZXIodGVybSA9PSAiUGh5c0FjdGl2ZVllcyIpICU+JSANCiAgICBzZWxlY3QoZXN0aW1hdGUpDQpkaWZmX25vbl9zbW9rZQ0KDQpkaWZmX3Ntb2tlIDwtIHRpZHlfbW9kMSAlPiUgDQogICBmaWx0ZXIodGVybSAlaW4lIGMoJ1BoeXNBY3RpdmVZZXMnLCdTbW9rZU5vd1llczpQaHlzQWN0aXZlWWVzJykpICU+JSANCiAgICBzdW1tYXJpemUoZXN0aW1hdGUgPSBzdW0oZXN0aW1hdGUpKQ0KZGlmZl9zbW9rZQ0KDQptb2QyIDwtIHN2eWdsbShCTUkgfiBQaHlzQWN0aXZlKlNtb2tlTm93ICsgUmFjZTEgKyBBbGNvaG9sMTJQbHVzWXIgKyBHZW5kZXIsIA0KICAgICAgICAgICAgICAgZGVzaWduID0gbmhhbmVzX2FkdWx0KQ0KDQp0aWR5KG1vZDIpDQoNCmBgYA0KDQpBTkFMWVpJTkcgVEhFIERBVEEgVEhST1VHSCBSRUdSRVNTSU9OIE1PREVMUyAtIFN1cnZleS1XZWlnaHRlZCBHZW5lcmFsaXplZCBMaW5lYXIgTW9kZWwgKEdMTSk6IEV4YW1wbGUgIzMNCg0KVmFyaWFibGVzOiBzbW9raW5nIHN0YXR1cywgcGh5c2ljYWwgYWN0aXZpdHksIHJhY2UsIGFsY29ob2wgY29uc3VtcHRpb24gaW4gcGFzdCAxMiBtb250aHMsIGdlbmRlciwgYW5kIGhlaWdodC4NCg0KSFlQT1RIRVNJUzogYWZ0ZXIgY29udHJvbGxpbmcgZm9yIGZhY3RvcnMgc3VjaCBhcyBwaHlzaWNhbCBhY3Rpdml0eSwgc21va2luZyBzdGF0dXMsIHJhY2UsIGFsY29ob2wgY29uc3VtcHRpb24sIGFuZCBnZW5kZXIsIGhlaWdodCB3aWxsIGhhdmUgYSBwb3NpdGl2ZSBhc3NvY2lhdGlvbiB3aXRoIEJNSS4gQWRkaXRpb25hbGx5LCB3ZSBleHBlY3QgcGh5c2ljYWwgYWN0aXZpdHkgdG8gYmUgbmVnYXRpdmVseSBhc3NvY2lhdGVkIHdpdGggQk1JLCBhbmQgc21va2luZyBzdGF0dXMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGxvd2VyIEJNSS4NCg0KSU5URVJQUkVUQVRJT04gKHBvc3QgcnVubmluZyB0aGUgbW9kZWwpOg0KICBQaHlzaWNhbCBBY3Rpdml0eSAoUGh5c0FjdGl2ZVllcyk6IFRoZXJlIGlzIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBuZWdhdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHBoeXNpY2FsIGFjdGl2aXR5IGFuZCBCTUkgKGVzdGltYXRlID0gLTIuMTMsIHAgPCAwLjAwMSkuIFRoaXMgaW5kaWNhdGVzIHRoYXQgaW5kaXZpZHVhbHMgd2hvIGFyZSBwaHlzaWNhbGx5IGFjdGl2ZSB0ZW5kIHRvIGhhdmUgbG93ZXIgQk1JIGNvbXBhcmVkIHRvIHRob3NlIHdobyBhcmUgbm90IHBoeXNpY2FsbHkgYWN0aXZlLiBTbW9raW5nIFN0YXR1cyAoU21va2VOb3dZZXMpOiBTaW1pbGFybHksIHRoZXJlIGlzIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBuZWdhdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHNtb2tpbmcgc3RhdHVzIGFuZCBCTUkgKGVzdGltYXRlID0gLTIuMjUsIHAgPCAwLjAwMSkuIFRoaXMgc3VnZ2VzdHMgdGhhdCBzbW9rZXJzIHRlbmQgdG8gaGF2ZSBsb3dlciBCTUkgY29tcGFyZWQgdG8gbm9uLXNtb2tlcnMuIFJhY2U6IEFtb25nIHRoZSByYWNlIGNhdGVnb3JpZXMsIEhpc3BhbmljLCBXaGl0ZSwgYW5kIE90aGVyIHJhY2VzIHNob3cgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBuZWdhdGl2ZSBhc3NvY2lhdGlvbnMgd2l0aCBCTUkgY29tcGFyZWQgdG8gdGhlIHJlZmVyZW5jZSBjYXRlZ29yeSAoTm9uLUhpc3BhbmljIEJsYWNrKS4gVGhpcyBzdWdnZXN0cyB0aGF0IGluZGl2aWR1YWxzIGZyb20gdGhlc2UgcmFjaWFsIGJhY2tncm91bmRzIHRlbmQgdG8gaGF2ZSBsb3dlciBCTUkuIA0KICBBbGNvaG9sIENvbnN1bXB0aW9uIChBbGNvaG9sMTJQbHVzWXJZZXMpOiBUaGVyZSBpcyBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgbmVnYXRpdmUgYXNzb2NpYXRpb24gYmV0d2VlbiBhbGNvaG9sIGNvbnN1bXB0aW9uIGFuZCBCTUkgKGVzdGltYXRlID0gLTAuODgxLCBwID0gMC4wMjApLiBUaGlzIGluZGljYXRlcyB0aGF0IGluZGl2aWR1YWxzIHdobyBjb25zdW1lIGFsY29ob2wgaW4gdGhlIHBhc3QgMTIgbW9udGhzIHRlbmQgdG8gaGF2ZSBsb3dlciBCTUkgY29tcGFyZWQgdG8gdGhvc2Ugd2hvIGRvIG5vdC4gR2VuZGVyIChHZW5kZXJtYWxlKTogVGhlIGFzc29jaWF0aW9uIGJldHdlZW4gZ2VuZGVyIGFuZCBCTUkgaXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgKGVzdGltYXRlID0gLTAuNDkyLCBwID0gMC4xNTkpLCBzdWdnZXN0aW5nIHRoYXQgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBCTUkgYmV0d2VlbiBtYWxlcyBhbmQgZmVtYWxlcy4gSGVpZ2h0OiBIZWlnaHQgZG9lcyBub3Qgc2hvdyBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYXNzb2NpYXRpb24gd2l0aCBCTUkgKHAgPSAwLjM3MCkgaW4gdGhpcyBtb2RlbC4gSW50ZXJhY3Rpb24gVGVybSAoUGh5c0FjdGl2ZVllczpTbW9rZU5vd1llcyk6IFRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHBoeXNpY2FsIGFjdGl2aXR5IGFuZCBzbW9raW5nIHN0YXR1cyBpcyBtYXJnaW5hbGx5IHNpZ25pZmljYW50IChlc3RpbWF0ZSA9IDAuNzUzLCBwID0gMC4wNjYpLiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBoeXNpY2FsIGFjdGl2aXR5IGFuZCBCTUkgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHNtb2tpbmcgc3RhdHVzLCBhbHRob3VnaCBmdXJ0aGVyIGludmVzdGlnYXRpb24gbWF5IGJlIG5lZWRlZCB0byBjb25maXJtIHRoaXMgcmVsYXRpb25zaGlwLg0KICBPdmVyYWxsLCBwaHlzaWNhbCBhY3Rpdml0eSBhbmQgc21va2luZyBzdGF0dXMgYXBwZWFyIHRvIGJlIHRoZSBtb3N0IGluZmx1ZW50aWFsIGZhY3RvcnMgYXNzb2NpYXRlZCB3aXRoIEJNSSBpbiB0aGlzIG1vZGVsLCB3aGlsZSBvdGhlciB2YXJpYWJsZXMgc3VjaCBhcyByYWNlLCBhbGNvaG9sIGNvbnN1bXB0aW9uLCBnZW5kZXIsIGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBwaHlzaWNhbCBhY3Rpdml0eSBhbmQgc21va2luZyBzdGF0dXMgYWxzbyBzaG93IHNpZ25pZmljYW50IGFzc29jaWF0aW9ucyB3aXRoIEJNSS4gSGVpZ2h0LCBob3dldmVyLCBkb2VzIG5vdCBhcHBlYXIgdG8gaGF2ZSBhIHNpZ25pZmljYW50IGFzc29jaWF0aW9uIHdpdGggQk1JIGluIHRoaXMgYW5hbHlzaXMuDQoNCmBgYHtyfQ0KbW9kMyA8LSBzdnlnbG0oQk1JIH4gUGh5c0FjdGl2ZSAqIFNtb2tlTm93ICsgUmFjZTEgKyBBbGNvaG9sMTJQbHVzWXIgKyBHZW5kZXIgKyBIZWlnaHQsDQogICAgICAgICAgICAgICBkZXNpZ24gPSBuaGFuZXNfYWR1bHQpDQoNCnRpZHkobW9kMykNCg0KYGBgDQoNCkFOQUxZWklORyBUSEUgREFUQSBUSFJPVUdIIFJFR1JFU1NJT04gTU9ERUxTIC0gU3VydmV5LVdlaWdodGVkIEdlbmVyYWxpemVkIExpbmVhciBNb2RlbCAoR0xNKTogRXhhbWxlICM0DQoNClZhcmlhYmxlczogc21va2luZyBzdGF0dXMsIHBoeXNpY2FsIGFjdGl2aXR5LCByYWNlLCBhbGNvaG9sIGNvbnN1bXB0aW9uIGluIHBhc3QgMTIgbW9udGhzLCBnZW5kZXIsIGhlaWdodCwgdGVzdG9zdGVyb25lLCBhbmQgVG90Q2hvbC4NCg0KSFlQT1RIRVNJUzogYWZ0ZXIgY29udHJvbGxpbmcgZm9yIGZhY3RvcnMgc3VjaCBhcyBwaHlzaWNhbCBhY3Rpdml0eSwgc21va2luZyBzdGF0dXMsIHJhY2UsIGFsY29ob2wgY29uc3VtcHRpb24sIGdlbmRlciwgaGVpZ2h0LCB0ZXN0b3N0ZXJvbmUsIGFuZCBUb3RhbCBDaG9sZXN0ZXJvbCAoVG90Q2hvbCksIHRoZXJlIHdpbGwgYmUgc2lnbmlmaWNhbnQgYXNzb2NpYXRpb25zIGJldHdlZW4gdGhlc2UgdmFyaWFibGVzIGFuZCBCTUkgYW1vbmcgYWR1bHRzIGFnZWQgMjAgYW5kIGFib3ZlIGluIHRoZSBOSEFORVMgZGF0YXNldC4gU3BlY2lmaWNhbGx5LCB3ZSBleHBlY3QgdGhhdCBoaWdoZXIgbGV2ZWxzIG9mIHBoeXNpY2FsIGFjdGl2aXR5LCBub24tc21va2luZyBzdGF0dXMsIGFuZCBjZXJ0YWluIGRlbW9ncmFwaGljIGZhY3RvcnMgc3VjaCBhcyBiZWluZyBtYWxlIGFuZCBvZiBjZXJ0YWluIHJhY2lhbCBiYWNrZ3JvdW5kcywgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggbG93ZXIgQk1JLiBBZGRpdGlvbmFsbHksIHdlIGFudGljaXBhdGUgdGhhdCBoaWdoZXIgbGV2ZWxzIG9mIGhlaWdodCwgdGVzdG9zdGVyb25lLCBhbmQgVG90YWwgQ2hvbGVzdGVyb2wgd2lsbCBiZSBwb3NpdGl2ZWx5IGFzc29jaWF0ZWQgd2l0aCBCTUksIHJlZmxlY3RpbmcgdGhlaXIgcG90ZW50aWFsIGNvbnRyaWJ1dGlvbnMgdG8gYm9keSBjb21wb3NpdGlvbiBhbmQgbWV0YWJvbGljIGhlYWx0aC4NCg0KSU5URVJQUkVUQVRJT04gKHBvc3QgcnVubmluZyB0aGUgbW9kZWwpOg0KICBQaHlzaWNhbCBBY3Rpdml0eSAoUGh5c0FjdGl2ZVllcyk6IFRoZXJlIGlzIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBuZWdhdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHBoeXNpY2FsIGFjdGl2aXR5IGFuZCBCTUkgKGVzdGltYXRlID0gLTEuNTEsIHAgPSAwLjAyMjEpLiBUaGlzIHN1Z2dlc3RzIHRoYXQgaW5kaXZpZHVhbHMgd2hvIGFyZSBwaHlzaWNhbGx5IGFjdGl2ZSB0ZW5kIHRvIGhhdmUgbG93ZXIgQk1JIGNvbXBhcmVkIHRvIHRob3NlIHdobyBhcmUgbm90IHBoeXNpY2FsbHkgYWN0aXZlLiBTbW9raW5nIFN0YXR1cyAoU21va2VOb3dZZXMpOiBBbHRob3VnaCB0aGUgYXNzb2NpYXRpb24gaXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYXQgY29udmVudGlvbmFsIGxldmVscyAocCA9IDAuMDUxMiksIHRoZXJlIGlzIGEgbmVnYXRpdmUgdHJlbmQgaW5kaWNhdGluZyB0aGF0IHNtb2tlcnMgbWF5IGhhdmUgbG93ZXIgQk1JIGNvbXBhcmVkIHRvIG5vbi1zbW9rZXJzLiBSYWNlOiBBbW9uZyB0aGUgcmFjZSBjYXRlZ29yaWVzLCBIaXNwYW5pYywgV2hpdGUsIGFuZCBPdGhlciByYWNlcyBzaG93IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgbmVnYXRpdmUgYXNzb2NpYXRpb25zIHdpdGggQk1JIGNvbXBhcmVkIHRvIHRoZSByZWZlcmVuY2UgY2F0ZWdvcnkgKE5vbi1IaXNwYW5pYyBCbGFjaykuIFRoaXMgc3VnZ2VzdHMgdGhhdCBpbmRpdmlkdWFscyBmcm9tIHRoZXNlIHJhY2lhbCBiYWNrZ3JvdW5kcyB0ZW5kIHRvIGhhdmUgbG93ZXIgQk1JLiBBbGNvaG9sIENvbnN1bXB0aW9uIChBbGNvaG9sMTJQbHVzWXJZZXMpOiBUaGUgYXNzb2NpYXRpb24gYmV0d2VlbiBhbGNvaG9sIGNvbnN1bXB0aW9uIGFuZCBCTUkgaXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgKHAgPSAwLjI1MSksIGluZGljYXRpbmcgdGhhdCBhbGNvaG9sIGNvbnN1bXB0aW9uIGluIHRoZSBwYXN0IDEyIG1vbnRocyBtYXkgbm90IHNpZ25pZmljYW50bHkgaW5mbHVlbmNlIEJNSS4gDQogIEdlbmRlciAoR2VuZGVybWFsZSk6IFRoZXJlIGlzIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBwb3NpdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGdlbmRlciAobWFsZSkgYW5kIEJNSSAoZXN0aW1hdGUgPSA0LjI0LCBwID0gMC4wMDE5NSksIHN1Z2dlc3RpbmcgdGhhdCBtYWxlcyB0ZW5kIHRvIGhhdmUgaGlnaGVyIEJNSSBjb21wYXJlZCB0byBmZW1hbGVzLiBIZWlnaHQ6IEhlaWdodCBkb2VzIG5vdCBzaG93IGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhc3NvY2lhdGlvbiB3aXRoIEJNSSAocCA9IDAuODczKSBpbiB0aGlzIG1vZGVsLiBUZXN0b3N0ZXJvbmU6IFRoZXJlIGlzIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBuZWdhdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRlc3Rvc3Rlcm9uZSBhbmQgQk1JIChlc3RpbWF0ZSA9IC0wLjAxMDgsIHAgPSAwLjAwMDI2NikuIFRoaXMgc3VnZ2VzdHMgdGhhdCBoaWdoZXIgbGV2ZWxzIG9mIHRlc3Rvc3Rlcm9uZSBhcmUgYXNzb2NpYXRlZCB3aXRoIGxvd2VyIEJNSS4gVG90YWwgQ2hvbGVzdGVyb2wgKFRvdENob2wpOiBUb3RhbCBjaG9sZXN0ZXJvbCBkb2VzIG5vdCBzaG93IGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhc3NvY2lhdGlvbiB3aXRoIEJNSSAocCA9IDAuODk2KSBpbiB0aGlzIG1vZGVsLiBJbnRlcmFjdGlvbiBUZXJtIChQaHlzQWN0aXZlWWVzOlNtb2tlTm93WWVzKTogVGhlIGludGVyYWN0aW9uIGJldHdlZW4gcGh5c2ljYWwgYWN0aXZpdHkgYW5kIHNtb2tpbmcgc3RhdHVzIGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IChwID0gMC4zNTUpLCBpbmRpY2F0aW5nIHRoYXQgdGhlIGpvaW50IGVmZmVjdCBvZiBwaHlzaWNhbCBhY3Rpdml0eSBhbmQgc21va2luZyBzdGF0dXMgb24gQk1JIGlzIG5vdCBzaWduaWZpY2FudC4NCiAgT3ZlcmFsbCwgcGh5c2ljYWwgYWN0aXZpdHksIHNtb2tpbmcgc3RhdHVzIChtYXJnaW5hbGx5KSwgcmFjZSwgZ2VuZGVyLCBhbmQgdGVzdG9zdGVyb25lIGFwcGVhciB0byBiZSBpbXBvcnRhbnQgcHJlZGljdG9ycyBvZiBCTUkgaW4gdGhpcyByZWdyZXNzaW9uIG1vZGVsLiBPdGhlciB2YXJpYWJsZXMgc3VjaCBhcyBhbGNvaG9sIGNvbnN1bXB0aW9uLCBoZWlnaHQsIGFuZCB0b3RhbCBjaG9sZXN0ZXJvbCBkbyBub3Qgc2hvdyBzaWduaWZpY2FudCBhc3NvY2lhdGlvbnMgd2l0aCBCTUkgYWZ0ZXIgY29udHJvbGxpbmcgZm9yIG90aGVyIGZhY3RvcnMuDQoNCmBgYHtyfQ0KbW9kNCA8LSBzdnlnbG0oQk1JIH4gUGh5c0FjdGl2ZSAqIFNtb2tlTm93ICsgUmFjZTEgKyBBbGNvaG9sMTJQbHVzWXIgKyBHZW5kZXIgKyBIZWlnaHQgKyBUZXN0b3N0ZXJvbmUgKyBUb3RDaG9sLA0KICAgICAgICAgICAgICAgZGVzaWduID0gbmhhbmVzX2FkdWx0KQ0KDQp0aWR5KG1vZDQpDQoNCmBgYA0KDQpDT05DTFVESU5HIFJFUE9SVDoNCg0KSW50cm9kdWN0aW9uOg0KQm9keSBNYXNzIEluZGV4IChCTUkpIGlzIGEgd2lkZWx5IHVzZWQgbWVhc3VyZSBvZiBhZGlwb3NpdHkgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCB2YXJpb3VzIGhlYWx0aCBvdXRjb21lcy4gVW5kZXJzdGFuZGluZyB0aGUgZmFjdG9ycyBpbmZsdWVuY2luZyBCTUkgaW4gYWR1bHRzIGlzIGNydWNpYWwgZm9yIHB1YmxpYyBoZWFsdGggaW50ZXJ2ZW50aW9ucyBhaW1lZCBhdCBwcmV2ZW50aW5nIG9iZXNpdHkgYW5kIHJlbGF0ZWQgZGlzZWFzZXMuIEluIHRoaXMgc3R1ZHksIHdlIGFuYWx5emVkIGRhdGEgZnJvbSB0aGUgTmF0aW9uYWwgSGVhbHRoIGFuZCBOdXRyaXRpb24gRXhhbWluYXRpb24gU3VydmV5IChOSEFORVMpIHRvIGludmVzdGlnYXRlIHRoZSBhc3NvY2lhdGlvbnMgYmV0d2VlbiBCTUkgYW5kIHZhcmlvdXMgbGlmZXN0eWxlIGFuZCBkZW1vZ3JhcGhpYyBmYWN0b3JzLg0KDQpNZXRob2RzOg0KV2UgY29uZHVjdGVkIG11bHRpcGxlIHJlZ3Jlc3Npb24gYW5hbHlzaXMgdXNpbmcgTkhBTkVTIGRhdGEgdG8gZXhhbWluZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk1JIGFuZCBwcmVkaWN0b3IgdmFyaWFibGVzIGluY2x1ZGluZyBwaHlzaWNhbCBhY3Rpdml0eSwgc21va2luZyBzdGF0dXMsIHJhY2UsIGFsY29ob2wgY29uc3VtcHRpb24sIGdlbmRlciwgaGVpZ2h0LCB0ZXN0b3N0ZXJvbmUsIGFuZCB0b3RhbCBjaG9sZXN0ZXJvbC4gSW50ZXJhY3Rpb24gZWZmZWN0cyBiZXR3ZWVuIHBoeXNpY2FsIGFjdGl2aXR5IGFuZCBzbW9raW5nIHN0YXR1cyB3ZXJlIGFsc28gZXhwbG9yZWQuIE1vZGVsIGRpYWdub3N0aWNzIGFuZCBoeXBvdGhlc2lzIHRlc3RzIHdlcmUgcGVyZm9ybWVkIHRvIGFzc2VzcyB0aGUgc2lnbmlmaWNhbmNlIG9mIHByZWRpY3RvciB2YXJpYWJsZXMuDQoNClJlc3VsdHM6DQpPdXIgYW5hbHlzaXMgcmV2ZWFsZWQgc2V2ZXJhbCBrZXkgZmluZGluZ3M6DQoNClBoeXNpY2FsIEFjdGl2aXR5IGFuZCBTbW9raW5nIFN0YXR1czogQm90aCBwaHlzaWNhbCBhY3Rpdml0eSBhbmQgc21va2luZyBzdGF0dXMgd2VyZSBzaWduaWZpY2FudCBwcmVkaWN0b3JzIG9mIEJNSSwgd2l0aCBwaHlzaWNhbGx5IGFjdGl2ZSBpbmRpdmlkdWFscyBhbmQgc21va2VycyBoYXZpbmcgbG93ZXIgQk1JLg0KDQpSYWNlIGFuZCBBbGNvaG9sIENvbnN1bXB0aW9uOiBDZXJ0YWluIHJhY2lhbCBncm91cHMgKEhpc3BhbmljLCBXaGl0ZSwgT3RoZXIpIHNob3dlZCBsb3dlciBCTUkgY29tcGFyZWQgdG8gTm9uLUhpc3BhbmljIEJsYWNrIGluZGl2aWR1YWxzLiBBbGNvaG9sIGNvbnN1bXB0aW9uIGluIHRoZSBwYXN0IDEyIG1vbnRocyB3YXMgYXNzb2NpYXRlZCB3aXRoIGxvd2VyIEJNSS4NCkdlbmRlciBhbmQgSGVpZ2h0OiBHZW5kZXIgZGlkIG5vdCBzaG93IGEgc2lnbmlmaWNhbnQgYXNzb2NpYXRpb24gd2l0aCBCTUkuIEhlaWdodCBhbHNvIGRpZCBub3QgaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdCBvbiBCTUkuDQoNCkludGVyYWN0aW9uIEVmZmVjdDogVGhlcmUgd2FzIGEgbWFyZ2luYWxseSBzaWduaWZpY2FudCBpbnRlcmFjdGlvbiBiZXR3ZWVuIHBoeXNpY2FsIGFjdGl2aXR5IGFuZCBzbW9raW5nIHN0YXR1cywgc3VnZ2VzdGluZyB0aGF0IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBwaHlzaWNhbCBhY3Rpdml0eSBhbmQgQk1JIG1heSB2YXJ5IGRlcGVuZGluZyBvbiBzbW9raW5nIHN0YXR1cy4NCg0KRGlzY3Vzc2lvbjoNClRoZSBmaW5kaW5ncyBvZiB0aGlzIHN0dWR5IGhpZ2hsaWdodCB0aGUgY29tcGxleCBpbnRlcnBsYXkgYmV0d2VlbiBsaWZlc3R5bGUgYW5kIGRlbW9ncmFwaGljIGZhY3RvcnMgaW4gZGV0ZXJtaW5pbmcgQk1JLiBQaHlzaWNhbCBhY3Rpdml0eSBhbmQgc21va2luZyBzdGF0dXMgZW1lcmdlZCBhcyBzaWduaWZpY2FudCBwcmVkaWN0b3JzIG9mIEJNSSwgdW5kZXJzY29yaW5nIHRoZSBpbXBvcnRhbmNlIG9mIHByb21vdGluZyBoZWFsdGh5IGJlaGF2aW9ycyBmb3Igd2VpZ2h0IG1hbmFnZW1lbnQuIFRoZSBvYnNlcnZlZCByYWNpYWwgZGlmZmVyZW5jZXMgaW4gQk1JIHdhcnJhbnQgZnVydGhlciBpbnZlc3RpZ2F0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIHVuZGVybHlpbmcgbWVjaGFuaXNtcy4gQWRkaXRpb25hbGx5LCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBwaHlzaWNhbCBhY3Rpdml0eSBhbmQgc21va2luZyBzdGF0dXMgc3VnZ2VzdHMgdGhhdCBpbnRlcnZlbnRpb25zIHRhcmdldGluZyBib3RoIGJlaGF2aW9ycyBtYXkgYmUgYmVuZWZpY2lhbCBmb3IgQk1JIGNvbnRyb2wuDQoNCkNvbmNsdXNpb246DQpJbiBjb25jbHVzaW9uLCBvdXIgYW5hbHlzaXMgcHJvdmlkZXMgdmFsdWFibGUgaW5zaWdodHMgaW50byB0aGUgZmFjdG9ycyBpbmZsdWVuY2luZyBCTUkgaW4gYWR1bHRzIHVzaW5nIE5IQU5FUyBkYXRhLiBUaGUgZmluZGluZ3MgdW5kZXJzY29yZSB0aGUgaW1wb3J0YW5jZSBvZiBwcm9tb3RpbmcgcGh5c2ljYWwgYWN0aXZpdHkgYW5kIHNtb2tpbmcgY2Vzc2F0aW9uIGZvciBvYmVzaXR5IHByZXZlbnRpb24gZWZmb3J0cy4gRnV0dXJlIHJlc2VhcmNoIHNob3VsZCBmb2N1cyBvbiBlbHVjaWRhdGluZyB0aGUgbWVjaGFuaXNtcyB1bmRlcmx5aW5nIHJhY2lhbCBkaXNwYXJpdGllcyBpbiBCTUkgYW5kIGV4cGxvcmluZyB0YWlsb3JlZCBpbnRlcnZlbnRpb25zIGZvciBoaWdoLXJpc2sgcG9wdWxhdGlvbnMuDQoNCkxpbWl0YXRpb25zOg0KSXQgaXMgaW1wb3J0YW50IHRvIGFja25vd2xlZGdlIHRoZSBsaW1pdGF0aW9ucyBvZiB0aGlzIHN0dWR5LCBpbmNsdWRpbmcgdGhlIGNyb3NzLXNlY3Rpb25hbCBuYXR1cmUgb2YgTkhBTkVTIGRhdGEsIHdoaWNoIGxpbWl0cyBjYXVzYWwgaW5mZXJlbmNlLiBBZGRpdGlvbmFsbHksIHNlbGYtcmVwb3J0ZWQgbWVhc3VyZXMgb2YgcGh5c2ljYWwgYWN0aXZpdHksIHNtb2tpbmcgc3RhdHVzLCBhbmQgYWxjb2hvbCBjb25zdW1wdGlvbiBtYXkgYmUgc3ViamVjdCB0byByZWNhbGwgYmlhcy4gRnVydGhlciBsb25naXR1ZGluYWwgc3R1ZGllcyBhcmUgbmVlZGVkIHRvIGNvbmZpcm0gdGhlIG9ic2VydmVkIGFzc29jaWF0aW9ucyBhbmQgZXhwbG9yZSBwb3RlbnRpYWwgY2F1c2FsIHBhdGh3YXlzLg0K