Introduction
Data visualization techniques and tools are used to gather and bridge together knowledge. The power of analysis engages and communicates crucial information and data to an audience. For each graph and figure below, data visualization software, such as such as R, Tableau, and QGIS, were used. The way information is creatively presented can provide insights and knowledge to the larger community. This portfolio was created using R Markdown to demonstrate data analysis of PHQ9 data. A non-profit organization in Northwest Detroit that serves children and adults in the community through various behavioral health programs provided the dataset. The organization strives to improve the life of those experiencing a mental health concern.This non-profit organization wishes to remain anonymous.
PHQ-9
For each program, the Patient Health Questionnaire (PHQ9) is used to assess the client. The PHQ-9 is a nine-item depression scale measuring depressive symptoms. As one of the most validated tools in mental health, it is used as a screening tool to diagnose depression and monitor treatment. The nine questions are based directly on the nine diagnostic criteria for major depressive disorder in the DSM-V. The higher the score, the more depressive symptoms are present. An overview of the The Patient Health Questionnaire (PHQ-9) can be viewed here.
The chart below is taken from the non-profit organization and the PHQ-9 severity scoring is as follows: 
Client Demographic
Age, gender, and place of residency were the factors analyzed with the PHQ9 scores.The client population represents those who received services from September 1st, 2018 until October 31st, 2019. From the fiscal year 2019, there were a total of 3,413 clients. QGIS displays the client population residing in five different counties and fifty-five different cities. Using R software, the client demographics can be displayed through histograms and descriptive statistics. There was a higher count of females compared to males.
Place of Residency
Geographical mapping in QGIS presents the density of the client population residing in Michigan. On this platform the city and county are mapped to demonstrate where most clients are from. The map of the counties and cities are blue and the darker shade of blue represents a greater number of clients. The majority of the clients reside in Detroit and are from the following counties: Livingston, Macomb, Monroe, Oakland, St. Clair, and Wayne.

Gender
There was a total of 1,820 females and 1,593 males in the client population.

Age
The client’s age range is from 11 years old to 96 years old. The average age of the client population is 42 years old.


Data Analysis: PHQ9 Scores
Histogram and Descriptive Statistics
The scores range from 0-27. The average initial score was 9.0 and the average final score was 8.1. Decreasing scores represent improvement and less depressive symptoms.
According to the histogram of both initial (yellow) and final (red) scores, most clients do not have any depressive symptoms. As the PHQ9 score increases, the count of clients decreases.


Place of Residency
QGIS was used to display the average initial and final PHQ9 scores by client’s residency. The PHQ9 scores on the map are categorized by depression severity: None, Mild, Moderate, Moderately Severe, and Severe. The map of the cities are in red and the darker the color, the higher the PHQ9 score is for that city. When comparing the two maps, the average final score map displays more cities in lighter shades of red. More cities in lighter shades of red means they have lower PHQ9 scores. Additionally, the third map displays the cities representing the increase (red) and decrease (green) in PHQ9 score. A decreased value indicates an improvement in symptoms of depression, whereas an increased value indicates worsening in symptoms of depression. Overall, the map is green which indicates the treatment has helped reduce depressive symptoms.


Bar Chart ( Initial and Final PHQ9 Score)
CityIF <- read_excel("~/Desktop/SpSu2020/1 r studio/CityIF.xlsx")
library(readxl) # import Excel
library(ggplot2) # beautiful graphs
library(tidyr) # tidy data
library(dplyr) # wrangle data
CityIF %>%
# wrangle and tidy the data
select(City, First, Last) %>% # select only certain vars.
group_by(City) %>%
summarise(Initial = mean(First),
Final = mean(Last)) %>%
gather(key,
value,
2:3) %>%
# graph the data
ggplot(aes(x = City,
y = value,
fill = key)) +
geom_bar(stat = "identity",
position = position_dodge()) + # unstack
coord_flip() + # flip to make it readable
theme(axis.text.y = element_text(size = rel(.5))) +
labs(title = "Average PHQ9 Initial and Final Score by City",
x = "City",
y = "PHQ9 Score",
fill = "Key")

Gender
When comparing gender with Tableau, females display a higher PHQ9 score for both average initial and final scores compared to males. PHQ9 scores for both genders decreased, which means less depressive synptoms are displayed amongst clients. For females, the average PHQ9 scores decreased from 10.2 to 9.3. The scores for males also decreased from 7.7 to 6.8.

Age
To present visually appealing graphs, Tableau was used to compare average initial and final scores across age groups. The line graph shows average initial score (green) and average final score (blue) of clients from age 11 to 96. The initial and final scores tend to follow a similar trend with the scores increasing up to age 45 and then steadily decreasing with a spike up at age 77.

Bivariate Statistics
Correlation Analysis
For the correlation test, three variables were analyzed: age, initial score, and final score. The correlation test was conducted to determine if there was an association between the three variables. Below are the correlation values from the test. There is no correlation between age and the final or initial scores. However, for initial and final sores, there was a correlation value of .69. A scatterplot is included demonstrating the position correlation.
Correlation Value: Initial Score and Age -0.01604
Correlation Value:Final Score and Age -0.02008
Correlation Value:PHQ9 Initial and Final Score 0.6964

Two Sample t-test (Initial and Final PHQ9 Score)
A two sample t-test was conducted to compare the initial and iinal PHQ9 scores as well as scores between genders. According to the p-value of the t-test, there is a significant difference between the initial and final PHQ9 scores. Additionally, there is a significant difference between male and female when comparing PHQ9 scores.
Welch Two Sample t-test: PHQ$First
and PHQ$Last
(continued below)
5.38 |
6636 |
7.71e-08 * * * |
two.sided |
9.014 |
Welch Two Sample t-test: PHQ$First
by PHQ$Gender
(continued below)
10.21 |
3281 |
4.194e-24 * * * |
two.sided |
Welch Two Sample t-test: PHQ$Last
by PHQ$Gender
(continued below)
11.21 |
3345 |
1.153e-28 * * * |
two.sided |
Anova Test (City)
An anova test was conducted to compare the PHQ9 scores between cities to see if there was a significant difference. According to the p-value, there is a significant different. A graph of the final PHQ9 scores by city is included. The graph shows the variation of PHQ9 scores for each city.
Analysis of Variance Model
City |
54 |
3444 |
63.79 |
1.446 |
0.01865 |
Residuals |
3307 |
145840 |
44.1 |
NA |
NA |
Final PHQ9 Score Variation by City

Discussion
A total of 1,820 females and 1,593 males provided data for the study. Both gender groups had PHQ9 values decrease which means lower signs of depression. According to the two sample t-test, there was a significant difference between the initial and final scores. Overall, throughout all the age groups, females have a higher PHQ9 score compared to males in both initial and final scores. According to Crawford et al. (2017), female patients were slightly more often than males to receive a depression diagnosis and a PHQ-9 administration. The results analyzed aligned with the study above. Rossom et al. (2017) reported that PHQ9 predicts risk for suicide attempts and deaths across age groups. Overall, PHQ9 serves as an accurate measure to detect current depressive disorders and can address those at risk for suicide. Crawford et al. (2017) reported that income levels did not demonstrate any differences in PHQ9 levels. For future implications, education level, socioeconomic status, and racial background will be analyzed in addition to the client’s gender, age, and place of residency to compare results to see if the data aligns with other studies. Furthermore, there were some limitations while analzying the data. Some clients were removed from data analysis because of missing information. When analyzing data, the total number of clients for each age group were not the same which affected the average initial and final score.
Conclusion
R software, Tableau, and QGIS demonstrate the power of data visualization programs to effectively display visually pleasing and informative images and maps of large datasets. These tools can turn data from daunting numerical tables into approachable and easily understandable information. Analyzing large data sets provides knowledge and insights and can support more effective delivery of healthcare services. Data visualization harnesses the potential to change policies and enhance patient care and public health.
Reference
Crawford, Phillip, Simon, Greg, Lynch, Frances, & Clarke, Greg. (10/8/2017). Differences in Adult PHQ9 Administration at KP Northwest by Demographic and Census Factors. Journal of Patient-Centered Research and Reviews, 4(3), 189–190. Aurora Health Care, Inc.
Rossom, Rebecca C, Coleman, Karen J, Ahmedani, Brian K, Beck, Arne, Johnson, Eric, Oliver, Malia, & Simon, Greg E. (2017). Suicidal Ideation Reported on the PHQ9 and Risk of Suicidal Behavior across Age Groups. Journal of Affective Disorders, 215, 77–84. Journal Article, Netherlands: Elsevier B.V.
Workgroup S.N.C.C.R.T. Workgroup STABLE resource toolkit (2007) (Available online) Google Scholar
LS0tCnRpdGxlOiAiQ29tcGFyaW5nIFBIUTkgU2NvcmVzIgphdXRob3I6ICJTdXNhbiBXdSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBmb250c2l6ZTogMTNwdAogICAgZm9udC1mYW1pbHk6IEhlbHZldGljYQogICAgbWFpbmZvbnQ6IEFyaWFsCiAgICBnZW9tZXRyeTogbWFyZ2luPTFpbgogICAgZm9udHRoZW1lOiAic3RydWN0dXJlYm9sZCIKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBmaWdfd2lkdGg6IDYKICAgIGZpZ19oZWlnaHQ6IDUKICAgIGhpZ2hsaWdodDogaGFkZG9jawogICAgbGlua2NvbG9yOiBibHVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IGRlZmF1bHQKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogeWVzCiAgICAgIHNtb290aF9zY3JvbGw6IHllcwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICBmaWdfd2lkdGg6IDQKICAgIGZpZ19oZWlnaHQ6IDQKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIGZpZ193aWR0aDogNQogICAgZmlnX2hlaWdodDogNQotLS0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keXsgLyogTm9ybWFsICAqLwogICAgICBmb250LXNpemU6IDE0cHg7CiAgfQp0ZCB7ICAvKiBUYWJsZSAgKi8KICBmb250LXNpemU6IDhweDsKfQpoMS50aXRsZSB7CiAgZm9udC1zaXplOiAzOHB4OwogIGNvbG9yOiBCbGFjazsKfQpoMSB7IC8qIEhlYWRlciAxICovCiAgZm9udC1zaXplOiAyOHB4OwogIGNvbG9yOiBCbGFjazsKfQpoMiB7IC8qIEhlYWRlciAyICovCiAgICBmb250LXNpemU6IDIycHg7CiAgY29sb3I6IERhcmtCbHVlOwp9CmgzIHsgLyogSGVhZGVyIDMgKi8KICBmb250LXNpemU6IDE4cHg7CiAgZm9udC1mYW1pbHk6ICJzZXJpZjsKICBjb2xvcjogRGFya0JsdWU7Cn0KY29kZS5yeyAvKiBDb2RlIGJsb2NrICovCiAgICBmb250LXNpemU6IDEycHg7Cn0KcHJlIHsgLyogQ29kZSBibG9jayAtIGRldGVybWluZXMgY29kZSBzcGFjaW5nIGJldHdlZW4gbGluZXMgKi8KICAgIGZvbnQtc2l6ZTogMTRweDsKfQo8L3N0eWxlPgpgYGB7ciBjaHVua19uYW1lLCByZXN1bHRzPSJoaWRlIn0KeCA8LSBybm9ybSgxMDApCnkgPC0gMip4ICsgcm5vcm0oMTAwKQpjb3IoeCwgeSkKYGBgCmBgYHtyfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsCm1lc3NhZ2UgPSBGQUxTRSwKd2FybmluZyA9IEZBTFNFKSAKYGBgCgoKIyBJbnRyb2R1Y3Rpb24KRGF0YSB2aXN1YWxpemF0aW9uIHRlY2huaXF1ZXMgYW5kIHRvb2xzIGFyZSB1c2VkIHRvIGdhdGhlciBhbmQgYnJpZGdlIHRvZ2V0aGVyIGtub3dsZWRnZS4gVGhlIHBvd2VyIG9mIGFuYWx5c2lzIGVuZ2FnZXMgYW5kIGNvbW11bmljYXRlcyBjcnVjaWFsIGluZm9ybWF0aW9uIGFuZCBkYXRhIHRvIGFuIGF1ZGllbmNlLiBGb3IgZWFjaCBncmFwaCBhbmQgZmlndXJlIGJlbG93LCBkYXRhIHZpc3VhbGl6YXRpb24gc29mdHdhcmUsIHN1Y2ggYXMgc3VjaCBhcyBSLCBUYWJsZWF1LCBhbmQgUUdJUywgd2VyZSB1c2VkLiBUaGUgd2F5IGluZm9ybWF0aW9uIGlzIGNyZWF0aXZlbHkgcHJlc2VudGVkIGNhbiBwcm92aWRlIGluc2lnaHRzIGFuZCBrbm93bGVkZ2UgdG8gdGhlIGxhcmdlciBjb21tdW5pdHkuIFRoaXMgcG9ydGZvbGlvIHdhcyBjcmVhdGVkIHVzaW5nIFIgTWFya2Rvd24gdG8gZGVtb25zdHJhdGUgZGF0YSBhbmFseXNpcyBvZiBQSFE5IGRhdGEuIEEgbm9uLXByb2ZpdCBvcmdhbml6YXRpb24gaW4gTm9ydGh3ZXN0IERldHJvaXQgdGhhdCBzZXJ2ZXMgY2hpbGRyZW4gYW5kIGFkdWx0cyBpbiB0aGUgY29tbXVuaXR5IHRocm91Z2ggdmFyaW91cyBiZWhhdmlvcmFsIGhlYWx0aCBwcm9ncmFtcyBwcm92aWRlZCB0aGUgZGF0YXNldC4gVGhlIG9yZ2FuaXphdGlvbiBzdHJpdmVzIHRvIGltcHJvdmUgdGhlIGxpZmUgb2YgdGhvc2UgZXhwZXJpZW5jaW5nIGEgbWVudGFsIGhlYWx0aCBjb25jZXJuLlRoaXMgbm9uLXByb2ZpdCBvcmdhbml6YXRpb24gd2lzaGVzIHRvIHJlbWFpbiBhbm9ueW1vdXMuCgojIyBQSFEtOSAKRm9yIGVhY2ggcHJvZ3JhbSwgdGhlIFBhdGllbnQgSGVhbHRoIFF1ZXN0aW9ubmFpcmUgKFBIUTkpIGlzIHVzZWQgdG8gYXNzZXNzIHRoZSBjbGllbnQuIFRoZSBQSFEtOSBpcyBhIG5pbmUtaXRlbSBkZXByZXNzaW9uIHNjYWxlIG1lYXN1cmluZyBkZXByZXNzaXZlIHN5bXB0b21zLiBBcyBvbmUgb2YgdGhlIG1vc3QgdmFsaWRhdGVkIHRvb2xzIGluIG1lbnRhbCBoZWFsdGgsIGl0IGlzIHVzZWQgYXMgYSBzY3JlZW5pbmcgdG9vbCB0byBkaWFnbm9zZSBkZXByZXNzaW9uIGFuZCBtb25pdG9yIHRyZWF0bWVudC4gVGhlIG5pbmUgcXVlc3Rpb25zIGFyZSBiYXNlZCBkaXJlY3RseSBvbiB0aGUgbmluZSBkaWFnbm9zdGljIGNyaXRlcmlhIGZvciBtYWpvciBkZXByZXNzaXZlIGRpc29yZGVyIGluIHRoZSBEU00tVi4gVGhlIGhpZ2hlciB0aGUgc2NvcmUsIHRoZSBtb3JlIGRlcHJlc3NpdmUgc3ltcHRvbXMgYXJlIHByZXNlbnQuCkFuIG92ZXJ2aWV3IG9mIHRoZSBUaGUgUGF0aWVudCBIZWFsdGggUXVlc3Rpb25uYWlyZSAoUEhRLTkpIGNhbiBiZSB2aWV3ZWQgW2hlcmVdKGh0dHA6Ly93d3cuZHJ1Z3NhbmRhbGNvaG9sLmllLzI2ODE0LzEvUGF0aWVudCUyMEhlYWx0aCUyMFF1ZXN0aW9ubmFpcmUucGRmKS4KIApUaGUgY2hhcnQgYmVsb3cgaXMgdGFrZW4gZnJvbSB0aGUgbm9uLXByb2ZpdCBvcmdhbml6YXRpb24gYW5kIAp0aGUgUEhRLTkgc2V2ZXJpdHkgc2NvcmluZyBpcyBhcyBmb2xsb3dzOgohW10oL1VzZXJzL3N1d3UvRGVza3RvcC9QaWN0dXJlIGZvciBSIG1hcmtkb3duLzgucG5nKQoKCiMgQ2xpZW50ICBEZW1vZ3JhcGhpYwpBZ2UsIGdlbmRlciwgYW5kIHBsYWNlIG9mIHJlc2lkZW5jeSB3ZXJlIHRoZSBmYWN0b3JzIGFuYWx5emVkIHdpdGggdGhlIFBIUTkgc2NvcmVzLlRoZSBjbGllbnQgcG9wdWxhdGlvbiByZXByZXNlbnRzIHRob3NlIHdobyByZWNlaXZlZCBzZXJ2aWNlcyBmcm9tIFNlcHRlbWJlciAxc3QsIDIwMTggdW50aWwgT2N0b2JlciAzMXN0LCAyMDE5LiBGcm9tIHRoZSBmaXNjYWwgeWVhciAyMDE5LCB0aGVyZSB3ZXJlIGEgdG90YWwgb2YgMyw0MTMgY2xpZW50cy4gUUdJUyBkaXNwbGF5cyB0aGUgY2xpZW50IHBvcHVsYXRpb24gcmVzaWRpbmcgaW4gZml2ZSBkaWZmZXJlbnQgY291bnRpZXMgYW5kIGZpZnR5LWZpdmUgZGlmZmVyZW50IGNpdGllcy4gVXNpbmcgUiBzb2Z0d2FyZSwgdGhlIGNsaWVudCBkZW1vZ3JhcGhpY3MgY2FuIGJlIGRpc3BsYXllZCB0aHJvdWdoIGhpc3RvZ3JhbXMgYW5kIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MuIFRoZXJlIHdhcyBhIGhpZ2hlciBjb3VudCBvZiBmZW1hbGVzIGNvbXBhcmVkIHRvIG1hbGVzLiAKCiMjIFBsYWNlIG9mIFJlc2lkZW5jeQpHZW9ncmFwaGljYWwgbWFwcGluZyBpbiBRR0lTIHByZXNlbnRzIHRoZSBkZW5zaXR5IG9mIHRoZSBjbGllbnQgcG9wdWxhdGlvbiByZXNpZGluZyBpbiBNaWNoaWdhbi4gT24gdGhpcyBwbGF0Zm9ybSB0aGUgY2l0eSBhbmQgY291bnR5IGFyZSBtYXBwZWQgdG8gZGVtb25zdHJhdGUgd2hlcmUgbW9zdCBjbGllbnRzIGFyZSBmcm9tLiBUaGUgbWFwIG9mIHRoZSBjb3VudGllcyBhbmQgY2l0aWVzIGFyZSBibHVlIGFuZCB0aGUgZGFya2VyIHNoYWRlIG9mIGJsdWUgcmVwcmVzZW50cyBhIGdyZWF0ZXIgbnVtYmVyIG9mIGNsaWVudHMuICBUaGUgbWFqb3JpdHkgb2YgdGhlIGNsaWVudHMgcmVzaWRlIGluIERldHJvaXQgYW5kIGFyZSBmcm9tIHRoZSBmb2xsb3dpbmcgY291bnRpZXM6IExpdmluZ3N0b24sIE1hY29tYiwgTW9ucm9lLCBPYWtsYW5kLCBTdC4gQ2xhaXIsIGFuZCBXYXluZS4KCiFbXSgvVXNlcnMvc3V3dS9EZXNrdG9wL1BpY3R1cmUgZm9yIFIgbWFya2Rvd24vQ1BCMi5wbmcpCiFbXSgvVXNlcnMvc3V3dS9EZXNrdG9wL1BpY3R1cmUgZm9yIFIgbWFya2Rvd24vMDAucG5nKQoKCiMjIEdlbmRlciAKClRoZXJlIHdhcyBhIHRvdGFsIG9mIDEsODIwIGZlbWFsZXMgYW5kIDEsNTkzIG1hbGVzIGluIHRoZSBjbGllbnQgcG9wdWxhdGlvbi4gCmBgYHtyfQpsaWJyYXJ5KHJlYWR4bCkKUEhRIDwtIHJlYWRfZXhjZWwoIn4vRGVza3RvcC9TcFN1MjAyMC8xIHIgc3R1ZGlvL1BIUS54bHMiKQpteWRhdGEgPC0gcmVhZF9leGNlbCgifi9EZXNrdG9wL1NwU3UyMDIwLzEgciBzdHVkaW8vUEhRLnhscyIpCgpsaWJyYXJ5KGdncGxvdDIpICMgZ3JhcGhzCgpsaWJyYXJ5KGRwbHlyKSAjIGRhdGEgd3JhbmdsaW5nCgoKbXlkYXRhICU+JQogIGZpbHRlcighaXMubmEoR2VuZGVyKSkgJT4lICMgZmlsdGVyIG9uIG5vbi1taXNzaW5nIHZhbHVlcwogIGdncGxvdChhZXMoeCA9IEdlbmRlciwgIyB4IGlzIG5laWdoYm9yaG9vZAogICAgICAgICAgICAgZmlsbCA9IEdlbmRlcikpICsgIyBmaWxsIGlzIG5laWdoYm9yaG9vZAogIGdlb21fYmFyKHdpZHRoPS42KSsKICBsYWJzKHRpdGxlPSJOdW1iZXIgQ291bnQgYnkgR2VuZGVyIChOPTM0MTMpIiwKICAgICAgIHN1YnRpdGxlPSJIaWdoZXIgQ291bnRzIG9mIEZlbWFsZXMgdGhhbiBNYWxlcyAiLAogICAgICAgeD0iR2VuZGVyIiwKICAgICAgIHk9Ik51bWJlciBvZiBQZW9wbGUiKQpgYGAKCiMjICBBZ2UgIApUaGUgY2xpZW50J3MgYWdlIHJhbmdlIGlzIGZyb20gMTEgeWVhcnMgb2xkIHRvIDk2IHllYXJzIG9sZC4gVGhlIGF2ZXJhZ2UgYWdlIG9mIHRoZSBjbGllbnQgcG9wdWxhdGlvbiBpcyA0MiB5ZWFycyBvbGQuCgohW10oL1VzZXJzL3N1d3UvRGVza3RvcC9QaWN0dXJlIGZvciBSIG1hcmtkb3duLzkucG5nKQoKCmBgYHtyfQpoaXN0KFBIUSRBZ2UsbWFpbj0iQWdlIG9mIENsaWVudHMiLHlsYWI9Ik51bWJlciIsIHhsYWI9IkFnZSIsY29sPSJvcmFuZ2UiKQpgYGAKCgojIERhdGEgQW5hbHlzaXM6IFBIUTkgU2NvcmVzCgojIyBIaXN0b2dyYW0gYW5kIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MKClRoZSBzY29yZXMgcmFuZ2UgZnJvbSAwLTI3LiBUaGUgYXZlcmFnZSBpbml0aWFsIHNjb3JlIHdhcyA5LjAgYW5kIHRoZSBhdmVyYWdlIGZpbmFsIHNjb3JlIHdhcyA4LjEuIERlY3JlYXNpbmcgc2NvcmVzIHJlcHJlc2VudCBpbXByb3ZlbWVudCBhbmQgbGVzcyAgZGVwcmVzc2l2ZSBzeW1wdG9tcy4gCgohW10oL1VzZXJzL3N1d3UvRGVza3RvcC9QaWN0dXJlIGZvciBSIG1hcmtkb3duLzExLnBuZykKQWNjb3JkaW5nIHRvIHRoZSBoaXN0b2dyYW0gb2YgYm90aCBpbml0aWFsICh5ZWxsb3cpIGFuZCBmaW5hbCAocmVkKSBzY29yZXMsIG1vc3QgY2xpZW50cyBkbyBub3QgaGF2ZSBhbnkgZGVwcmVzc2l2ZSBzeW1wdG9tcy4gQXMgdGhlIFBIUTkgc2NvcmUgaW5jcmVhc2VzLCB0aGUgY291bnQgb2YgY2xpZW50cyBkZWNyZWFzZXMuCmBgYHtyfQpoaXN0KFBIUSRGaXJzdCxicmVha3M9MTIsIGNvbD0ieWVsbG93IixtYWluPSJJbml0aWFsIFBIUTkgU2NvcmUgb2YgQ2xpZW50cyIseWxhYj0iTnVtYmVyIG9mIHBlb3BsZSIsIHhsYWI9IlBIUTkgU2NvcmUiKQpoaXN0KFBIUSRMYXN0LGJyZWFrcz0xMiwgY29sPSJyZWQiLG1haW49IkZpbmFsIFBIUTkgU2NvcmUgb2YgQ2xpZW50cyIseWxhYj0iTnVtYmVyIG9mIHBlb3BsZSIsIHhsYWI9IlBIUTkgU2NvcmUiKQpgYGAKCiMjIFBsYWNlIG9mIFJlc2lkZW5jeSAKClFHSVMgd2FzIHVzZWQgdG8gZGlzcGxheSB0aGUgYXZlcmFnZSBpbml0aWFsIGFuZCBmaW5hbCBQSFE5IHNjb3JlcyBieSBjbGllbnTigJlzIHJlc2lkZW5jeS4gIFRoZSBQSFE5IHNjb3JlcyBvbiB0aGUgbWFwIGFyZSBjYXRlZ29yaXplZCBieSBkZXByZXNzaW9uIHNldmVyaXR5OiBOb25lLCBNaWxkLCBNb2RlcmF0ZSwgTW9kZXJhdGVseSBTZXZlcmUsIGFuZCBTZXZlcmUuIFRoZSBtYXAgb2YgdGhlIGNpdGllcyBhcmUgaW4gcmVkIGFuZCB0aGUgZGFya2VyIHRoZSBjb2xvciwgdGhlIGhpZ2hlciB0aGUgUEhROSBzY29yZSBpcyBmb3IgdGhhdCBjaXR5LiBXaGVuIGNvbXBhcmluZyB0aGUgdHdvIG1hcHMsIHRoZSBhdmVyYWdlIGZpbmFsIHNjb3JlIG1hcCBkaXNwbGF5cyBtb3JlIGNpdGllcyBpbiBsaWdodGVyIHNoYWRlcyBvZiByZWQuIE1vcmUgY2l0aWVzIGluIGxpZ2h0ZXIgc2hhZGVzIG9mIHJlZCBtZWFucyB0aGV5IGhhdmUgbG93ZXIgUEhROSBzY29yZXMuIEFkZGl0aW9uYWxseSwgdGhlIHRoaXJkIG1hcCBkaXNwbGF5cyB0aGUgY2l0aWVzIHJlcHJlc2VudGluZyB0aGUgaW5jcmVhc2UgKHJlZCkgYW5kIGRlY3JlYXNlIChncmVlbikgaW4gUEhROSBzY29yZS4gQSBkZWNyZWFzZWQgdmFsdWUgaW5kaWNhdGVzIGFuIGltcHJvdmVtZW50IGluIHN5bXB0b21zIG9mIGRlcHJlc3Npb24sIHdoZXJlYXMgYW4gaW5jcmVhc2VkIHZhbHVlIGluZGljYXRlcyB3b3JzZW5pbmcgaW4gc3ltcHRvbXMgb2YgZGVwcmVzc2lvbi4gT3ZlcmFsbCwgdGhlIG1hcCBpcyBncmVlbiB3aGljaCBpbmRpY2F0ZXMgdGhlIHRyZWF0bWVudCBoYXMgaGVscGVkIHJlZHVjZSBkZXByZXNzaXZlIHN5bXB0b21zLiAKCiFbXSgvVXNlcnMvc3V3dS9EZXNrdG9wL1BpY3R1cmUgZm9yIFIgbWFya2Rvd24vNi5wbmcpCiFbXSgvVXNlcnMvc3V3dS9EZXNrdG9wL1BpY3R1cmUgZm9yIFIgbWFya2Rvd24vNy5wbmcpCgohW10oL1VzZXJzL3N1d3UvRGVza3RvcC9QaWN0dXJlIGZvciBSIG1hcmtkb3duLzUucG5nKQoKCkJhciBDaGFydCAoIEluaXRpYWwgYW5kIEZpbmFsIFBIUTkgU2NvcmUpCmBgYHtyfQpDaXR5SUYgPC0gcmVhZF9leGNlbCgifi9EZXNrdG9wL1NwU3UyMDIwLzEgciBzdHVkaW8vQ2l0eUlGLnhsc3giKQpsaWJyYXJ5KHJlYWR4bCkgIyBpbXBvcnQgRXhjZWwKbGlicmFyeShnZ3Bsb3QyKSAjIGJlYXV0aWZ1bCBncmFwaHMKbGlicmFyeSh0aWR5cikgIyB0aWR5IGRhdGEKbGlicmFyeShkcGx5cikgIyB3cmFuZ2xlIGRhdGEKCkNpdHlJRiAlPiUgIAogICMgd3JhbmdsZSBhbmQgdGlkeSB0aGUgZGF0YQogIHNlbGVjdChDaXR5LCBGaXJzdCwgTGFzdCkgJT4lICAjIHNlbGVjdCBvbmx5IGNlcnRhaW4gdmFycy4KICBncm91cF9ieShDaXR5KSAlPiUgIAogIHN1bW1hcmlzZShJbml0aWFsID0gbWVhbihGaXJzdCksICAKICAgICAgICAgICAgRmluYWwgPSBtZWFuKExhc3QpKSAlPiUgIAogIGdhdGhlcihrZXksICAKICAgICAgICAgdmFsdWUsICAKICAgICAgICAgMjozKSAlPiUgIAogICMgZ3JhcGggdGhlIGRhdGEKICBnZ3Bsb3QoYWVzKHggPSBDaXR5LCAgCiAgICAgICAgICAgICB5ID0gdmFsdWUsICAKICAgICAgICAgICAgIGZpbGwgPSBrZXkpKSArICAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgIAogICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKyAgIyB1bnN0YWNrCiAgY29vcmRfZmxpcCgpICsgICMgZmxpcCB0byBtYWtlIGl0IHJlYWRhYmxlCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCguNSkpKSArICAKICBsYWJzKHRpdGxlID0gIkF2ZXJhZ2UgUEhROSBJbml0aWFsIGFuZCBGaW5hbCBTY29yZSBieSBDaXR5IiwKICAgICAgIHggPSAiQ2l0eSIsCiAgICAgICB5ID0gIlBIUTkgU2NvcmUiLAogICAgICAgZmlsbCA9ICJLZXkiKQpgYGAKCgojIyBHZW5kZXIgCldoZW4gY29tcGFyaW5nIGdlbmRlciB3aXRoIFRhYmxlYXUsIGZlbWFsZXMgZGlzcGxheSBhIGhpZ2hlciBQSFE5IHNjb3JlIGZvciBib3RoIGF2ZXJhZ2UgaW5pdGlhbCBhbmQgZmluYWwgc2NvcmVzIGNvbXBhcmVkIHRvIG1hbGVzLiBQSFE5IHNjb3JlcyBmb3IgYm90aCBnZW5kZXJzIGRlY3JlYXNlZCwgd2hpY2ggbWVhbnMgbGVzcyBkZXByZXNzaXZlIHN5bnB0b21zIGFyZSBkaXNwbGF5ZWQgYW1vbmdzdCBjbGllbnRzLiBGb3IgZmVtYWxlcywgdGhlIGF2ZXJhZ2UgUEhROSBzY29yZXMgZGVjcmVhc2VkIGZyb20gMTAuMiB0byA5LjMuIFRoZSBzY29yZXMgZm9yIG1hbGVzIGFsc28gZGVjcmVhc2VkIGZyb20gNy43IHRvIDYuOC4gCgohW10oL1VzZXJzL3N1d3UvRGVza3RvcC9QaWN0dXJlIGZvciBSIG1hcmtkb3duLzIucG5nKQoKCiMjIEFnZSAKVG8gcHJlc2VudCB2aXN1YWxseSBhcHBlYWxpbmcgZ3JhcGhzLCBUYWJsZWF1IHdhcyB1c2VkIHRvIGNvbXBhcmUgYXZlcmFnZSBpbml0aWFsIGFuZCBmaW5hbCBzY29yZXMgYWNyb3NzIGFnZSBncm91cHMuIFRoZSBsaW5lIGdyYXBoIHNob3dzIGF2ZXJhZ2UgaW5pdGlhbCBzY29yZSAoZ3JlZW4pIGFuZCBhdmVyYWdlIGZpbmFsIHNjb3JlIChibHVlKSBvZiBjbGllbnRzIGZyb20gYWdlIDExIHRvIDk2LiBUaGUgaW5pdGlhbCBhbmQgZmluYWwgc2NvcmVzIHRlbmQgdG8gZm9sbG93IGEgc2ltaWxhciB0cmVuZCB3aXRoIHRoZSBzY29yZXMgaW5jcmVhc2luZyB1cCB0byBhZ2UgNDUgYW5kIHRoZW4gc3RlYWRpbHkgZGVjcmVhc2luZyB3aXRoIGEgc3Bpa2UgdXAgYXQgYWdlIDc3LgoKIVtdKC9Vc2Vycy9zdXd1L0Rlc2t0b3AvUGljdHVyZSBmb3IgUiBtYXJrZG93bi8xLnBuZykKCiMgQml2YXJpYXRlIFN0YXRpc3RpY3MKIyMgQ29ycmVsYXRpb24gQW5hbHlzaXMKRm9yIHRoZSBjb3JyZWxhdGlvbiB0ZXN0LCB0aHJlZSB2YXJpYWJsZXMgd2VyZSBhbmFseXplZDogYWdlLCBpbml0aWFsIHNjb3JlLCBhbmQgZmluYWwgc2NvcmUuIFRoZSBjb3JyZWxhdGlvbiB0ZXN0IHdhcyBjb25kdWN0ZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIHdhcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSB0aHJlZSB2YXJpYWJsZXMuIEJlbG93IGFyZSB0aGUgY29ycmVsYXRpb24gdmFsdWVzIGZyb20gdGhlIHRlc3QuIFRoZXJlIGlzIG5vIGNvcnJlbGF0aW9uIGJldHdlZW4gYWdlIGFuZCB0aGUgZmluYWwgb3IgaW5pdGlhbCBzY29yZXMuIEhvd2V2ZXIsIGZvciBpbml0aWFsIGFuZCBmaW5hbCBzb3JlcywgdGhlcmUgd2FzIGEgY29ycmVsYXRpb24gdmFsdWUgb2YgLjY5LiBBIHNjYXR0ZXJwbG90IGlzIGluY2x1ZGVkIGRlbW9uc3RyYXRpbmcgdGhlIHBvc2l0aW9uIGNvcnJlbGF0aW9uLiAgCgogICogQ29ycmVsYXRpb24gVmFsdWU6IEluaXRpYWwgU2NvcmUgYW5kIEFnZQpgYGB7cixlY2hvPUZBTFNFfQpsaWJyYXJ5KHBhbmRlcikKcGFuZGVyKGNvcihQSFEkRmlyc3QsIAogICAgUEhRJEFnZSwKICAgIHVzZSA9ICJjb21wbGV0ZS5vYnMiKSkKYGBgCgogICogQ29ycmVsYXRpb24gVmFsdWU6RmluYWwgU2NvcmUgYW5kIEFnZQpgYGB7cixlY2hvPUZBTFNFfQpsaWJyYXJ5KHBhbmRlcikKcGFuZGVyKGNvcihQSFEkQWdlLCAKICAgIFBIUSRMYXN0LAogICAgdXNlID0gImNvbXBsZXRlLm9icyIpKQpgYGAKCgogICogQ29ycmVsYXRpb24gVmFsdWU6UEhROSBJbml0aWFsIGFuZCBGaW5hbCBTY29yZQpgYGB7cixlY2hvPUZBTFNFfQpsaWJyYXJ5KHBhbmRlcikKcGFuZGVyKGNvcihQSFEkRmlyc3QsIAogICAgUEhRJExhc3QsCiAgICB1c2UgPSAiY29tcGxldGUub2JzIikpCmBgYAoKYGBge3J9CmdncGxvdChQSFEsCiAgICAgICBhZXMoeD1GaXJzdCwgCiAgICAgICAgICAgeT1MYXN0KSkrCiAgZ2VvbV9wb2ludChjb2xvdXIgPSAicmVkIiwgc2l6ZSA9IC4zKSsgCiAgZ2VvbV9zbW9vdGgoY29sb3VyPSJibGFjayIsIHNpemU9MSkrCmxhYnModGl0bGUgPSAiU2NhdHRlcnBsb3Qgb2YgUEhROSBJbml0aWFsIGFuZCBGaW5hbCBTY29yZShDb3JyZWxhdGlvbiBWYWx1ZSA9IC42OSkiLAogICAgIHggPSAiUEhROSBJbml0aWFsIFNjb3JlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9ICJQSFE5IEZpbmFsIFNjb3JlIikrCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCguNSkpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgoKCgojIyBUd28gU2FtcGxlIHQtdGVzdCAoSW5pdGlhbCBhbmQgRmluYWwgUEhROSBTY29yZSkKQSB0d28gc2FtcGxlIHQtdGVzdCB3YXMgY29uZHVjdGVkIHRvIGNvbXBhcmUgdGhlIGluaXRpYWwgYW5kIGlpbmFsIFBIUTkgc2NvcmVzIGFzIHdlbGwgYXMgc2NvcmVzIGJldHdlZW4gZ2VuZGVycy4gQWNjb3JkaW5nIHRvIHRoZSBwLXZhbHVlIG9mIHRoZSB0LXRlc3QsICB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgaW5pdGlhbCBhbmQgZmluYWwgUEhROSBzY29yZXMuIEFkZGl0aW9uYWxseSwgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIHdoZW4gY29tcGFyaW5nIFBIUTkgc2NvcmVzLgoKYGBge3IsIGVjaG89RkFMU0UsZXZhbD1GQUxTRX0KcGFuZGVyKHQudGVzdCh4LCB5ID0gTlVMTCwgYWx0ZXJuYXRpdmUgPSBjKCJ0d28uc2lkZWQiLCAibGVzcyIsICJncmVhdGVyIiksIG11ID0gMCwgCiAgICAgICAgICAgICAgcGFpcmVkID0gRkFMU0UsIHZhci5lcXVhbCA9IEZBTFNFLCBjb25mLmxldmVsID0gMC45NSkpCmBgYAoKYGBge3IsZWNobz1GQUxTRX0KbGlicmFyeShwYW5kZXIpCnBhbmRlcih0LnRlc3QoUEhRJEZpcnN0LFBIUSRMYXN0KSkKcGFuZGVyKHQudGVzdChQSFEkRmlyc3QgfiBQSFEkR2VuZGVyKSkKcGFuZGVyKHQudGVzdChQSFEkTGFzdCB+IFBIUSRHZW5kZXIpKQpgYGAKCgojIyBBbm92YSBUZXN0IChDaXR5KQpBbiBhbm92YSB0ZXN0IHdhcyBjb25kdWN0ZWQgdG8gY29tcGFyZSB0aGUgUEhROSBzY29yZXMgYmV0d2VlbiBjaXRpZXMgdG8gc2VlIGlmIHRoZXJlIHdhcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UuIEFjY29yZGluZyB0byB0aGUgcC12YWx1ZSwgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBkaWZmZXJlbnQuIEEgZ3JhcGggb2YgdGhlIGZpbmFsIFBIUTkgc2NvcmVzIGJ5IGNpdHkgaXMgaW5jbHVkZWQuIFRoZSBncmFwaCBzaG93cyB0aGUgdmFyaWF0aW9uIG9mIFBIUTkgc2NvcmVzIGZvciBlYWNoIGNpdHkuIAoKYGBge3IsZWNobz1GQUxTRX0KbXlhbm92YSA8LSBhb3YoTGFzdCB+IENpdHksZGF0YSA9IFBIUSkgIyBkYXRhIHNldAogIHBhbmRlcihzdW1tYXJ5KG15YW5vdmEpKQoKYGBgCgoKIyMjIEZpbmFsIFBIUTkgU2NvcmUgVmFyaWF0aW9uIGJ5IENpdHkKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3JpZGdlcykKZ2dwbG90KFBIUSwgCiAgICAgICBhZXMoeCA9IExhc3QsICAKICAgICAgICAgICB5ID0gQ2l0eSwgIAogICAgICAgICAgIGZpbGwgPSBDaXR5KSkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoKSsKICBsYWJzKHRpdGxlID0gIkZpbmFsIFBIUTkgU2NvcmUgVmFyaWF0aW9uIGJ5IENpdHkiLHggPSAiUEhROSBTY29yZSIsCiAgICAgICB5ID0gIkNpdHkiKSsKICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKC41KSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKYGBgCgojIERpc2N1c3Npb24KCkEgdG90YWwgb2YgMSw4MjAgZmVtYWxlcyBhbmQgMSw1OTMgbWFsZXMgcHJvdmlkZWQgZGF0YSBmb3IgdGhlIHN0dWR5LiBCb3RoIGdlbmRlciBncm91cHMgaGFkIFBIUTkgdmFsdWVzIGRlY3JlYXNlIHdoaWNoIG1lYW5zIGxvd2VyIHNpZ25zIG9mIGRlcHJlc3Npb24uIEFjY29yZGluZyB0byB0aGUgdHdvIHNhbXBsZSB0LXRlc3QsIHRoZXJlIHdhcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgaW5pdGlhbCBhbmQgZmluYWwgc2NvcmVzLiBPdmVyYWxsLCB0aHJvdWdob3V0IGFsbCB0aGUgYWdlIGdyb3VwcywgZmVtYWxlcyBoYXZlIGEgaGlnaGVyIFBIUTkgc2NvcmUgY29tcGFyZWQgdG8gbWFsZXMgaW4gYm90aCBpbml0aWFsIGFuZCBmaW5hbCBzY29yZXMuIEFjY29yZGluZyB0byBDcmF3Zm9yZCBldCBhbC4gKDIwMTcpLCBmZW1hbGUgcGF0aWVudHMgd2VyZSBzbGlnaHRseSBtb3JlIG9mdGVuIHRoYW4gbWFsZXMgdG8gcmVjZWl2ZSBhIGRlcHJlc3Npb24gZGlhZ25vc2lzIGFuZCBhIFBIUS05IGFkbWluaXN0cmF0aW9uLiBUaGUgcmVzdWx0cyBhbmFseXplZCBhbGlnbmVkIHdpdGggdGhlIHN0dWR5IGFib3ZlLiBSb3Nzb20gZXQgYWwuICgyMDE3KSByZXBvcnRlZCB0aGF0IFBIUTkgcHJlZGljdHMgcmlzayBmb3Igc3VpY2lkZSBhdHRlbXB0cyBhbmQgZGVhdGhzIGFjcm9zcyBhZ2UgZ3JvdXBzLiBPdmVyYWxsLCAgUEhROSBzZXJ2ZXMgYXMgYW4gYWNjdXJhdGUgbWVhc3VyZSB0byBkZXRlY3QgY3VycmVudCBkZXByZXNzaXZlIGRpc29yZGVycyBhbmQgY2FuIGFkZHJlc3MgdGhvc2UgYXQgcmlzayBmb3Igc3VpY2lkZS4gQ3Jhd2ZvcmQgZXQgYWwuICgyMDE3KSByZXBvcnRlZCB0aGF0IGluY29tZSBsZXZlbHMgZGlkIG5vdCBkZW1vbnN0cmF0ZSBhbnkgZGlmZmVyZW5jZXMgaW4gUEhROSBsZXZlbHMuIEZvciBmdXR1cmUgaW1wbGljYXRpb25zLCBlZHVjYXRpb24gbGV2ZWwsIHNvY2lvZWNvbm9taWMgc3RhdHVzLCBhbmQgcmFjaWFsIGJhY2tncm91bmQgd2lsbCBiZSBhbmFseXplZCBpbiBhZGRpdGlvbiB0byB0aGUgY2xpZW50J3MgZ2VuZGVyLCBhZ2UsIGFuZCBwbGFjZSBvZiByZXNpZGVuY3kgdG8gY29tcGFyZSByZXN1bHRzIHRvIHNlZSBpZiB0aGUgZGF0YSBhbGlnbnMgd2l0aCBvdGhlciBzdHVkaWVzLiBGdXJ0aGVybW9yZSwgdGhlcmUgd2VyZSBzb21lIGxpbWl0YXRpb25zIHdoaWxlIGFuYWx6eWluZyB0aGUgZGF0YS4gU29tZSBjbGllbnRzIHdlcmUgcmVtb3ZlZCBmcm9tIGRhdGEgYW5hbHlzaXMgYmVjYXVzZSBvZiBtaXNzaW5nIGluZm9ybWF0aW9uLiAgV2hlbiBhbmFseXppbmcgZGF0YSwgdGhlIHRvdGFsIG51bWJlciBvZiBjbGllbnRzIGZvciBlYWNoIGFnZSBncm91cCB3ZXJlIG5vdCB0aGUgc2FtZSB3aGljaCBhZmZlY3RlZCB0aGUgYXZlcmFnZSBpbml0aWFsIGFuZCBmaW5hbCBzY29yZS4KCiMgQ29uY2x1c2lvbgpSIHNvZnR3YXJlLCBUYWJsZWF1LCBhbmQgUUdJUyBkZW1vbnN0cmF0ZSB0aGUgcG93ZXIgb2YgZGF0YSB2aXN1YWxpemF0aW9uIHByb2dyYW1zIHRvIGVmZmVjdGl2ZWx5IGRpc3BsYXkgdmlzdWFsbHkgcGxlYXNpbmcgYW5kIGluZm9ybWF0aXZlIGltYWdlcyBhbmQgbWFwcyBvZiBsYXJnZSBkYXRhc2V0cy4gVGhlc2UgdG9vbHMgY2FuIHR1cm4gZGF0YSBmcm9tIGRhdW50aW5nIG51bWVyaWNhbCB0YWJsZXMgaW50byBhcHByb2FjaGFibGUgYW5kIGVhc2lseSB1bmRlcnN0YW5kYWJsZSBpbmZvcm1hdGlvbi4gQW5hbHl6aW5nIGxhcmdlIGRhdGEgc2V0cyBwcm92aWRlcyBrbm93bGVkZ2UgYW5kIGluc2lnaHRzIGFuZCBjYW4gc3VwcG9ydCBtb3JlIGVmZmVjdGl2ZSBkZWxpdmVyeSBvZiBoZWFsdGhjYXJlIHNlcnZpY2VzLiBEYXRhIHZpc3VhbGl6YXRpb24gaGFybmVzc2VzIHRoZSBwb3RlbnRpYWwgdG8gY2hhbmdlIHBvbGljaWVzIGFuZCBlbmhhbmNlIHBhdGllbnQgY2FyZSBhbmQgcHVibGljIGhlYWx0aC4KCiMgUmVmZXJlbmNlCkNyYXdmb3JkLCBQaGlsbGlwLCBTaW1vbiwgR3JlZywgTHluY2gsIEZyYW5jZXMsICYgQ2xhcmtlLCBHcmVnLiAoMTAvOC8yMDE3KS4gRGlmZmVyZW5jZXMgaW4gQWR1bHQgUEhROSBBZG1pbmlzdHJhdGlvbiBhdCBLUCBOb3J0aHdlc3QgYnkgRGVtb2dyYXBoaWMgYW5kIENlbnN1cyBGYWN0b3JzLiBKb3VybmFsIG9mIFBhdGllbnQtQ2VudGVyZWQgUmVzZWFyY2ggYW5kIFJldmlld3MsIDQoMyksIDE4OeKAkzE5MC4gQXVyb3JhIEhlYWx0aCBDYXJlLCBJbmMuCiAKUm9zc29tLCBSZWJlY2NhIEMsIENvbGVtYW4sIEthcmVuIEosIEFobWVkYW5pLCBCcmlhbiBLLCBCZWNrLCBBcm5lLCBKb2huc29uLCBFcmljLCBPbGl2ZXIsIE1hbGlhLCAmIFNpbW9uLCBHcmVnIEUuICgyMDE3KS4gU3VpY2lkYWwgSWRlYXRpb24gUmVwb3J0ZWQgb24gdGhlIFBIUTkgYW5kIFJpc2sgb2YgU3VpY2lkYWwgQmVoYXZpb3IgYWNyb3NzIEFnZSBHcm91cHMuIEpvdXJuYWwgb2YgQWZmZWN0aXZlIERpc29yZGVycywgMjE1LCA3N+KAkzg0LiBKb3VybmFsIEFydGljbGUsIE5ldGhlcmxhbmRzOiBFbHNldmllciBCLlYuCgpXb3JrZ3JvdXAgUy5OLkMuQy5SLlQuIFdvcmtncm91cCBTVEFCTEUgcmVzb3VyY2UgdG9vbGtpdAooMjAwNykgKEF2YWlsYWJsZSBvbmxpbmUpIEdvb2dsZSBTY2hvbGFyCgoKCg==