Profil Mahasiswa - Anindya Kristianingputri
R Programming
Data Science Programming I
Introduction Data Science
In this Assigment, I present my responses and personal
perspectives on several aspects of data science. The discussion focuses
on four main points. First is The purpose of studying data science
programming, Second, the reasons why this field is important to learn,
Third, the tools that should be understood to develop skills in data
science, and last but not least the domain knowledge that interests me
the most. Through this Assigment, I aim to share my current
understanding of data science.
What is Data Science? (biru·cream)
What is Data Science ?
Data Science is a branch of study that combines computer science, mathematics, and statistics. It includes programming, advanced analysis, artificial intelligence, and machine learning. This helps us to have a deeper understanding of a specific discipline and to uncover insights derived from both structured and unstructured data, which are used for planning and decision-making on related issues.
What is the Main
Purpose of Data Science Programming ?
What is Data Science? (biru·cream)
The main purpose of learning data science programming is to develop the ability to manage and analyze data efficiently in order to generate meaningful insights. Programming serves as a foundational skill that supports the processes of collecting, cleaning, and analyzing data. Without programming skills, these tasks would be difficult and time-consuming. By learning programming, Us can work with large datasets more effectively, build and test basic machine learning models, and visualize analytical results. In addition, programming knowledge helps learners understand data collection techniques such as web scraping and the importance of data cleaning to ensure accuracy and reliability. Therefore, programming becomes a fundamental tool for build strong competence in data science and prepare for future professional roles in this field.
Why Do We Learn about
it ?
What is Data Science? (biru·cream)
The reason why we learning data science programming is to develop the ability to manage and analyze data efficiently in order to generate meaningful insights. Programming supports important processes such as collecting, cleaning, and analyzing data, which would otherwise be difficult and time-consuming. By mastering programming skills, we can work with large datasets, build and test basic machine learning models, and visualize results effectively. In addition, understanding programming helps us learn data collection techniques like web scraping and ensures data accuracy through proper cleaning. Therefore, programming is a fundamental skill for building strong competence in data science and preparing for future careers in this field..
Give your interest
domain knowledge of the data science
What is Data Science? (biru·cream)
A compelling aspect of domain knowledge that I find particularly engaging lies in the intersection of marketing and business, where data science serves as a powerful tool for strategic insight. In this context, data science can identify differences in consumer behavior patterns based on demographic and psychographic characteristics, as well as purchasing trends, to create optimal market segmentation. For example, machine learning can be applied to predict customer churn by analyzing transaction histories and customer interactions, enabling companies to automatically provide targeted special offers to maintain customer loyalty. However, the resulting strategies must be validated through A/B testing to scientifically assess whether the new approach generates a statistically significant impact on key metrics such as conversion rate, thereby leading to well founded and effective strategic decision making.
Conclusion
Data Science is an interdisciplinary field that integrates computer
science, mathematics, and statistics to analyze both structured and
unstructured data in order to generate meaningful insights for
decision-making. Programming plays a fundamental role in this process,
as it enables efficient data collection, cleaning, analysis,
visualization, and the development of basic machine learning models. By
mastering programming skills, individuals can manage large datasets
effectively and ensure data accuracy and reliability.
Furthermore, the application of data science in marketing and
business demonstrates its strategic value, particularly in understanding
consumer behavior, optimizing market segmentation, predicting customer
churn, and validating strategies through A/B testing. Therefore,
programming competence combined with domain knowledge forms a strong
foundation for building professional expertise in data science and
supporting data-driven strategic decisions.
LS0tDQp0aXRsZTogIkludHJvZHVjdGlvbiBEYXRhIFNjaWVuY2UiICAgICAgICAgICAgIyBNYWluIHRpdGxlIG9mIHRoZSBkb2N1bWVudA0KYXV0aG9yOiAiQW5pbmR5YSBLcmlzdGlhbmluZ3B1dHJpICg1MjI1MDAyNSkiICAgICAgIyBSZXBsYWNlIHdpdGggeW91ciBmdWxsIG5hbWUNCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiICMgQXV0byBkaXNwbGF5cyB0aGUgY3VycmVudCBkYXRlDQpvdXRwdXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICMgT3V0cHV0IHNlY3Rpb24gZGVmaW5lcyB0aGUgZm9ybWF0IGFuZCBsYXlvdXQgDQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOiAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL2p1YmEvcm1kZm9ybWF0cw0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlICAgICAgICAjIEVtYmVkcyBhbGwgcmVzb3VyY2VzIChDU1MsIEpTLCBpbWFnZXMpIA0KICAgIHRodW1ibmFpbHM6IHRydWUgICAgICAgICAgICAjIERpc3BsYXlzIGltYWdlIHRodW1ibmFpbHMgaW4gdGhlIGRvYw0KICAgIGxpZ2h0Ym94OiB0cnVlICAgICAgICAgICAgICAjIEVuYWJsZXMgY2xpY2sgdG8gZW5sYXJnZSBpbWFnZXMNCiAgICBnYWxsZXJ5OiB0cnVlICAgICAgICAgICAgICAgIyBHcm91cHMgaW1hZ2VzIGludG8gYW4gaW50ZXJhY3RpdmUgZ2FsbGVyeQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICAgICAjIEF1dG9tYXRpY2FsbHkgbnVtYmVycyBhbGwgc2VjdGlvbnMNCiAgICBsaWJfZGlyOiBsaWJzICAgICAgICAgICAgICAgIyBEaXJlY3Rvcnkgd2hlcmUgSmF2YVNjcmlwdC9DU1MgbGlicmFyaWVzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCIgICAgICAgICAgICMgRGlzcGxheXMgZGF0YSBmcmFtZXMgYXMgaW50ZXJhY3RpdmUgcGFnZWQgDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyIgICAgICAgICMgQWxsb3dzIGZvbGRpbmcvdW5mb2xkaW5nIFIgY29kZSBibG9ja3MgDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAgICAgICMgQWRkcyBhIGJ1dHRvbiB0byBkb3dubG9hZCBhbGwgUiBjb2RlDQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDQ3cHggIWltcG9ydGFudDsNCiAgZm9udC13ZWlnaHQ6IDgwMDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsICJQYWxhdGlubyBMaW5vdHlwZSIsIHNlcmlmOw0KICBmb250LXN0eWxlOiBpdGFsaWMgIWltcG9ydGFudDsNCiAgbWFyZ2luLWJvdHRvbTogMjBweCAhaW1wb3J0YW50Ow0KICBsaW5lLWhlaWdodDogMS4yOw0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQogIHBhZGRpbmctYm90dG9tOiAxNXB4ICFpbXBvcnRhbnQ7DQp9DQoNCmgxLnRpdGxlOjphZnRlciB7DQogIGNvbnRlbnQ6ICIiOw0KICBwb3NpdGlvbjogYWJzb2x1dGU7DQogIGJvdHRvbTogMDsNCiAgbGVmdDogNTAlOw0KICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7DQogIHdpZHRoOiAxNTBweDsNCiAgaGVpZ2h0OiAycHg7DQogIGJhY2tncm91bmQ6IGN1cnJlbnRDb2xvcjsNCiAgb3BhY2l0eTogMC4zOw0KfQ0KDQoucGVyZmVjdC1jZW50ZXItYm94IHsNCiAgcG9zaXRpb246IHJlbGF0aXZlOw0KICBwYWRkaW5nOiAyNXB4IDQwcHggIWltcG9ydGFudDsNCiAgbWFyZ2luOiAyMHB4IGF1dG8gIWltcG9ydGFudDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBkaXNwbGF5OiB0YWJsZTsNCiAgYmFja2dyb3VuZDogd2hpdGU7DQogIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7DQogIGJvcmRlci1yYWRpdXM6IDEycHg7DQogIGJveC1zaGFkb3c6IDAgNHB4IDEycHggcmdiYSgwLDAsMCwwLjEpOw0KICBtYXgtd2lkdGg6IDUwMHB4Ow0KfQ0KDQoucGVyZmVjdC1jZW50ZXItYm94OjpiZWZvcmUsDQoucGVyZmVjdC1jZW50ZXItYm94OjphZnRlciB7DQogIGNvbnRlbnQ6ICIiOw0KICBwb3NpdGlvbjogYWJzb2x1dGU7DQogIHdpZHRoOiAxOHB4Ow0KICBoZWlnaHQ6IDE4cHg7DQogIGJvcmRlcjogMnB4IHNvbGlkIGJsYWNrOw0KICBvcGFjaXR5OiAwLjM7DQogIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7DQp9DQoNCi5wZXJmZWN0LWNlbnRlci1ib3g6OmJlZm9yZSB7DQogIHRvcDogOHB4Ow0KICBsZWZ0OiA4cHg7DQogIGJvcmRlci1yaWdodDogbm9uZTsNCiAgYm9yZGVyLWJvdHRvbTogbm9uZTsNCn0NCg0KLnBlcmZlY3QtY2VudGVyLWJveDo6YWZ0ZXIgew0KICBib3R0b206IDhweDsNCiAgcmlnaHQ6IDhweDsNCiAgYm9yZGVyLWxlZnQ6IG5vbmU7DQogIGJvcmRlci10b3A6IG5vbmU7DQp9DQoNCi5wZXJmZWN0LWNlbnRlci1ib3g6aG92ZXI6OmJlZm9yZSwNCi5wZXJmZWN0LWNlbnRlci1ib3g6aG92ZXI6OmFmdGVyIHsNCiAgd2lkdGg6IDIycHg7DQogIGhlaWdodDogMjJweDsNCiAgb3BhY2l0eTogMC41Ow0KfQ0KDQoud2Vlay1udW1iZXIgew0KICBmb250LXNpemU6IDE4cHggIWltcG9ydGFudDsNCiAgZm9udC13ZWlnaHQ6IDcwMDsNCiAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4Ow0KICBtYXJnaW4tYm90dG9tOiA1cHggIWltcG9ydGFudDsNCiAgbGluZS1oZWlnaHQ6IDEuMzsNCn0NCg0KLmFzc2lnbm1lbnQtdGl0bGUgew0KICBmb250LXNpemU6IDE0cHggIWltcG9ydGFudDsNCiAgZm9udC13ZWlnaHQ6IDUwMDsNCiAgcG9zaXRpb246IHJlbGF0aXZlOw0KICBwYWRkaW5nLXRvcDogOHB4ICFpbXBvcnRhbnQ7DQogIG1hcmdpbi10b3A6IDVweCAhaW1wb3J0YW50Ow0KICBsaW5lLWhlaWdodDogMS4zOw0KfQ0KDQouYXNzaWdubWVudC10aXRsZTo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgdG9wOiAwOw0KICBsZWZ0OiA1MCU7DQogIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsNCiAgd2lkdGg6IDkwcHg7DQogIGhlaWdodDogMXB4Ow0KICBiYWNrZ3JvdW5kOiBjdXJyZW50Q29sb3I7DQogIG9wYWNpdHk6IDAuMzsNCn0NCg0KLmNvbnRhaW5lciB7DQogIG1hcmdpbjogMCAhaW1wb3J0YW50Ow0KICBwYWRkaW5nOiAyMHB4ICFpbXBvcnRhbnQ7DQp9DQoNCi5jb250ZW50LXdyYXBwZXIgew0KICBkaXNwbGF5OiBmbGV4Ow0KICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KICBnYXA6IDE1cHggIWltcG9ydGFudDsNCiAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCn0NCjwvc3R5bGU+DQpgYGANCg0KYGBgez1odG1sfQ0KPCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPSJpZCI+DQo8aGVhZD4NCiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+DQogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPg0KICAgIDx0aXRsZT5Qcm9maWwgTWFoYXNpc3dhIC0gQW5pbmR5YSBLcmlzdGlhbmluZ3B1dHJpPC90aXRsZT4NCiAgICA8c3R5bGU+DQogICAgICAgICogew0KICAgICAgICAgICAgbWFyZ2luOiAwOw0KICAgICAgICAgICAgcGFkZGluZzogMDsNCiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgICAgIH0NCg0KICAgICAgICBib2R5IHsNCiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknLCBzeXN0ZW0tdWksIHNhbnMtc2VyaWY7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMGMyNDYxIDAlLCAjMWUzNzk5IDUwJSwgIzRhNjliZCAxMDAlKTsNCiAgICAgICAgICAgIGNvbG9yOiAjMzMzOw0KICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjsNCiAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7DQogICAgICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgbWluLWhlaWdodDogMTAwdmg7DQogICAgICAgIH0NCg0KICAgICAgICAuY29udGFpbmVyIHsNCiAgICAgICAgICAgIG1heC13aWR0aDogOTAwcHg7DQogICAgICAgICAgICB3aWR0aDogMTAwJTsNCiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxNXB4Ow0KICAgICAgICAgICAgYm94LXNoYWRvdzogMCAxMHB4IDMwcHggcmdiYSgxMiwgMzYsIDk3LCAwLjMpOw0KICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICAgICAgICAgIGJvcmRlcjogMnB4IHNvbGlkICM0YTY5YmQ7DQogICAgICAgIH0NCg0KICAgICAgICAuaGVhZGVyIHsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgIzFlMzc5OSwgIzRhNjliZCk7DQogICAgICAgICAgICBjb2xvcjogd2hpdGU7DQogICAgICAgICAgICBwYWRkaW5nOiAzMHB4Ow0KICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgICAgICB9DQoNCiAgICAgICAgLnByb2ZpbGUtY29udGVudCB7DQogICAgICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgICAgICBnYXA6IDIwcHg7DQogICAgICAgIH0NCg0KICAgICAgICAucGhvdG8tY29udGFpbmVyIHsNCiAgICAgICAgICAgIHdpZHRoOiAxNTBweDsNCiAgICAgICAgICAgIGhlaWdodDogMTUwcHg7DQogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7DQogICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOw0KICAgICAgICAgICAgYm9yZGVyOiA0cHggc29saWQgIzgyY2NkZDsNCiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCAxNXB4IHJnYmEoMTMwLCAyMDQsIDIyMSwgMC41KTsNCiAgICAgICAgfQ0KDQogICAgICAgIC5wcm9maWxlLXBob3RvIHsNCiAgICAgICAgICAgIHdpZHRoOiAxMDAlOw0KICAgICAgICAgICAgaGVpZ2h0OiAxMDAlOw0KICAgICAgICAgICAgb2JqZWN0LWZpdDogY292ZXI7DQogICAgICAgIH0NCg0KICAgICAgICAubmFtZSB7DQogICAgICAgICAgICBmb250LXNpemU6IDI4cHg7DQogICAgICAgICAgICBmb250LXdlaWdodDogNzAwOw0KICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4Ow0KICAgICAgICAgICAgY29sb3I6ICNmZmZmZmY7DQogICAgICAgICAgICB0ZXh0LXNoYWRvdzogMXB4IDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjMpOw0KICAgICAgICB9DQoNCiAgICAgICAgLm5pbSB7DQogICAgICAgICAgICBmb250LXNpemU6IDE4cHg7DQogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDEzMCwgMjA0LCAyMjEsIDAuOSk7DQogICAgICAgICAgICBjb2xvcjogIzBjMjQ2MTsNCiAgICAgICAgICAgIHBhZGRpbmc6IDZweCAxNXB4Ow0KICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMjBweDsNCiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7DQogICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQogICAgICAgICAgICBmb250LXdlaWdodDogNjAwOw0KICAgICAgICB9DQoNCiAgICAgICAgLnN0dWR5LWluZm8gew0KICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4Ow0KICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4Ow0KICAgICAgICAgICAgY29sb3I6ICNlNmY3ZmY7DQogICAgICAgIH0NCg0KICAgICAgICAuZG9zZW4taW5mbyB7DQogICAgICAgICAgICBmb250LXNpemU6IDE2cHg7DQogICAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4Ow0KICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICAgICAgICAgIGNvbG9yOiAjODJjY2RkOw0KICAgICAgICB9DQoNCiAgICAgICAgLnNraWxscy1zZWN0aW9uIHsNCiAgICAgICAgICAgIHBhZGRpbmc6IDQwcHggMzBweDsNCiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMGY4ZmY7DQogICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgICAgICAgICBib3JkZXItdG9wOiAycHggc29saWQgIzRhNjliZDsNCiAgICAgICAgfQ0KDQogICAgICAgIC5za2lsbHMtbGlzdCB7DQogICAgICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7DQogICAgICAgICAgICBnYXA6IDIwcHg7DQogICAgICAgIH0NCg0KICAgICAgICAuc2tpbGwtaXRlbSB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICM0YTY5YmQsICM2YTg5Y2MpOw0KICAgICAgICAgICAgY29sb3I6IHdoaXRlOw0KICAgICAgICAgICAgcGFkZGluZzogMTVweCAzMHB4Ow0KICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMjVweDsNCiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMxZTM3OTk7DQogICAgICAgICAgICBib3gtc2hhZG93OiAwIDNweCA4cHggcmdiYSg3NCwgMTA1LCAxODksIDAuMik7DQogICAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOw0KICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsNCiAgICAgICAgICAgIG1pbi13aWR0aDogMTgwcHg7DQogICAgICAgIH0NCg0KICAgICAgICAuc2tpbGwtaXRlbTpob3ZlciB7DQogICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTVweCk7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICMxZTM3OTksICM0YTY5YmQpOw0KICAgICAgICAgICAgYm94LXNoYWRvdzogMCA1cHggMTVweCByZ2JhKDc0LCAxMDUsIDE4OSwgMC4zKTsNCiAgICAgICAgfQ0KDQogICAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgew0KICAgICAgICAgICAgLmhlYWRlciB7DQogICAgICAgICAgICAgICAgcGFkZGluZzogMjVweCAyMHB4Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAucGhvdG8tY29udGFpbmVyIHsNCiAgICAgICAgICAgICAgICB3aWR0aDogMTMwcHg7DQogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMzBweDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLm5hbWUgew0KICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLnNraWxsLWl0ZW0gew0KICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEycHggMjVweDsNCiAgICAgICAgICAgICAgICBtaW4td2lkdGg6IDE2MHB4Ow0KICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA0ODBweCkgew0KICAgICAgICAgICAgYm9keSB7DQogICAgICAgICAgICAgICAgcGFkZGluZzogMTBweDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLmhlYWRlciB7DQogICAgICAgICAgICAgICAgcGFkZGluZzogMjBweCAxNXB4Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAubmFtZSB7DQogICAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAubmltIHsNCiAgICAgICAgICAgICAgICBmb250LXNpemU6IDE2cHg7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIC5za2lsbHMtbGlzdCB7DQogICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCiAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgIGdhcDogMTVweDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLnNraWxsLWl0ZW0gew0KICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlOw0KICAgICAgICAgICAgICAgIG1heC13aWR0aDogMjUwcHg7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHk+DQogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4NCiAgICAgICAgPGhlYWRlciBjbGFzcz0iaGVhZGVyIj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InByb2ZpbGUtY29udGVudCI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGhvdG8tY29udGFpbmVyIj4NCiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9IkQ6L0JhY2t1cCBDL0Rlc2t0b3AvdHVnYXMgc3RhdGlzdGlrYS9wcm9maWxlLnBuZyIgDQogICAgICAgICAgICAgICAgICAgICAgICAgYWx0PSJGb3RvIFByb2ZpbCBBbmluZHlhIEtyaXN0aWFuaW5ncHV0cmkiIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJwcm9maWxlLXBob3RvIj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9maWxlLWluZm8iPg0KICAgICAgICAgICAgICAgICAgICA8aDEgY2xhc3M9Im5hbWUiPkFuaW5keWEgS3Jpc3RpYW5pbmdwdXRyaTwvaDE+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5pbSI+TklNOiA1MjI1MDAyNTwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdHVkeS1pbmZvIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlN0dWRlbnQgTWFqb3IgRGF0YSBTY2llbmNlPC9wPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHA+SW5zdGl0dXQgVGVrbm9sb2dpIFNhaW5zIEJhbmR1bmc8L3A+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb3Nlbi1pbmZvIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkRvc2VuOiBCYWt0aSBTaXJlZ2FyLCBNLlNjLiwgQ0RTPC9wPg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2hlYWRlcj4NCg0KICAgICAgICA8ZGl2IGNsYXNzPSJza2lsbHMtc2VjdGlvbiI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJza2lsbHMtbGlzdCI+DQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNraWxsLWl0ZW0iPlIgUHJvZ3JhbW1pbmc8L3NwYW4+DQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNraWxsLWl0ZW0iPkRhdGEgU2NpZW5jZSBQcm9ncmFtbWluZyBJPC9zcGFuPg0KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJza2lsbC1pdGVtIj5JbnRyb2R1Y3Rpb24gRGF0YSBTY2llbmNlPC9zcGFuPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0KYGBgDQoNCg0KDQo6Ojp7c3R5bGU9ImJhY2tncm91bmQtY29sb3I6I0ZGRjVFMTsgYm9yZGVyLWxlZnQ6NnB4IHNvbGlkICMxRTkwRkY7IHBhZGRpbmc6MTJweDsgYm9yZGVyLXJhZGl1czo4cHg7IG1hcmdpbjoyMHB4IDA7IHRleHQtYWxpZ246IGp1c3RpZnk7In0NCg0KKipJbiB0aGlzIEFzc2lnbWVudCwgSSBwcmVzZW50IG15IHJlc3BvbnNlcyBhbmQgcGVyc29uYWwgcGVyc3BlY3RpdmVzIG9uIHNldmVyYWwgYXNwZWN0cyBvZiBkYXRhIHNjaWVuY2UuIFRoZSBkaXNjdXNzaW9uIGZvY3VzZXMgb24gZm91ciBtYWluIHBvaW50cy4gIEZpcnN0IGlzIFRoZSBwdXJwb3NlIG9mIHN0dWR5aW5nIGRhdGEgc2NpZW5jZSBwcm9ncmFtbWluZywgU2Vjb25kLCB0aGUgcmVhc29ucyB3aHkgdGhpcyBmaWVsZCBpcyBpbXBvcnRhbnQgdG8gbGVhcm4sIFRoaXJkLCB0aGUgdG9vbHMgdGhhdCBzaG91bGQgYmUgdW5kZXJzdG9vZCB0byBkZXZlbG9wIHNraWxscyBpbiBkYXRhIHNjaWVuY2UsIGFuZCBsYXN0IGJ1dCBub3QgbGVhc3QgdGhlIGRvbWFpbiBrbm93bGVkZ2UgdGhhdCBpbnRlcmVzdHMgbWUgdGhlIG1vc3QuIFRocm91Z2ggdGhpcyBBc3NpZ21lbnQsIEkgYWltIHRvIHNoYXJlIG15IGN1cnJlbnQgdW5kZXJzdGFuZGluZyBvZiBkYXRhIHNjaWVuY2UuKioNCg0KOjo6DQoNCmBgYHs9aHRtbH0NCjwhRE9DVFlQRSBodG1sPg0KPGh0bWwgbGFuZz0iaWQiPg0KPGhlYWQ+DQogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPg0KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4NCiAgICA8dGl0bGU+V2hhdCBpcyBEYXRhIFNjaWVuY2U/IChiaXJ1wrdjcmVhbSk8L3RpdGxlPg0KICAgIDxzdHlsZT4NCiAgICAgICAgYm9keSwgaHRtbCB7DQogICAgICAgICAgICBtYXJnaW46IDA7DQogICAgICAgICAgICBwYWRkaW5nOiAwOw0KICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7DQogICAgICAgIH0NCiAgICAgICAgLmRhdGEtc2NpZW5jZS10ZWtzIHsNCiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlMmVkZjc7DQogICAgICAgICAgICBjb2xvcjogIzJiNGE2ZjsNCiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAnR2VvcmdpYScsICdUaW1lcyBOZXcgUm9tYW4nLCBzZXJpZjsNCiAgICAgICAgICAgIGZvbnQtc2l6ZTogMS4zcmVtOw0KICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjsNCiAgICAgICAgICAgIHBhZGRpbmc6IDEuOHJlbSAyLjJyZW07DQogICAgICAgICAgICBtYXgtd2lkdGg6IDkwMHB4Ow0KICAgICAgICAgICAgbWFyZ2luOiAwIGF1dG87DQogICAgICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7DQogICAgICAgICAgICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KICAgICAgICB9DQogICAgICAgIC5kYXRhLXNjaWVuY2UtdGVrcyBoMSB7DQogICAgICAgICAgICBtYXJnaW46IDAgMCAwLjVyZW0gMDsNCiAgICAgICAgICAgIHBhZGRpbmc6IDA7DQogICAgICAgICAgICBmb250LXNpemU6IDIuNHJlbTsNCiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7DQogICAgICAgICAgICBjb2xvcjogIzFmNDk3MzsNCiAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjI7DQogICAgICAgIH0NCiAgICAgICAgLmRhdGEtc2NpZW5jZS10ZWtzIHAgew0KICAgICAgICAgICAgbWFyZ2luOiAwOw0KICAgICAgICAgICAgcGFkZGluZzogMDsNCiAgICAgICAgfQ0KICAgIDwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4NCiAgICA8ZGl2IGNsYXNzPSJkYXRhLXNjaWVuY2UtdGVrcyI+DQogICAgICAgIDxoMT5XaGF0IGlzIERhdGEgU2NpZW5jZSA/PC9oMT4NCiAgICAgICAgPHA+RGF0YSBTY2llbmNlIGlzIGEgYnJhbmNoIG9mIHN0dWR5IHRoYXQgY29tYmluZXMgY29tcHV0ZXIgc2NpZW5jZSwgbWF0aGVtYXRpY3MsIGFuZCBzdGF0aXN0aWNzLiBJdCBpbmNsdWRlcyBwcm9ncmFtbWluZywgYWR2YW5jZWQgYW5hbHlzaXMsIGFydGlmaWNpYWwgaW50ZWxsaWdlbmNlLCBhbmQgbWFjaGluZSBsZWFybmluZy4gVGhpcyBoZWxwcyB1cyB0byBoYXZlIGEgZGVlcGVyIHVuZGVyc3RhbmRpbmcgb2YgYSBzcGVjaWZpYyBkaXNjaXBsaW5lIGFuZCB0byB1bmNvdmVyIGluc2lnaHRzIGRlcml2ZWQgZnJvbSBib3RoIHN0cnVjdHVyZWQgYW5kIHVuc3RydWN0dXJlZCBkYXRhLCB3aGljaCBhcmUgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIGRlY2lzaW9uLW1ha2luZyBvbiByZWxhdGVkIGlzc3Vlcy48L3A+DQogICAgPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQpgYGANCg0KIyBXaGF0IGlzIHRoZSBNYWluIFB1cnBvc2Ugb2YgRGF0YSBTY2llbmNlIFByb2dyYW1taW5nID8NCg0KYGBgez1odG1sfQ0KPCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPSJpZCI+DQo8aGVhZD4NCiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+DQogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPg0KICAgIDx0aXRsZT5XaGF0IGlzIERhdGEgU2NpZW5jZT8gKGJpcnXCt2NyZWFtKTwvdGl0bGU+DQogICAgPHN0eWxlPg0KICAgICAgICBib2R5LCBodG1sIHsNCiAgICAgICAgICAgIG1hcmdpbjogMDsNCiAgICAgICAgICAgIHBhZGRpbmc6IDA7DQogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsNCiAgICAgICAgfQ0KICAgICAgICAuZGF0YS1zY2llbmNlLXRla3Mgew0KICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZWRmNzsNCiAgICAgICAgICAgIGNvbG9yOiAjMmI0YTZmOw0KICAgICAgICAgICAgZm9udC1mYW1pbHk6ICdHZW9yZ2lhJywgJ1RpbWVzIE5ldyBSb21hbicsIHNlcmlmOw0KICAgICAgICAgICAgZm9udC1zaXplOiAxLjNyZW07DQogICAgICAgICAgICBsaW5lLWhlaWdodDogMS42Ow0KICAgICAgICAgICAgcGFkZGluZzogMS44cmVtIDIuMnJlbTsNCiAgICAgICAgICAgIG1heC13aWR0aDogOTAwcHg7DQogICAgICAgICAgICBtYXJnaW46IDAgYXV0bzsNCiAgICAgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsNCiAgICAgICAgICAgIHRleHQtYWxpZ246IGp1c3RpZnk7DQogICAgICAgIH0NCiAgICAgICAgLmRhdGEtc2NpZW5jZS10ZWtzIGgxIHsNCiAgICAgICAgICAgIG1hcmdpbjogMCAwIDAuNXJlbSAwOw0KICAgICAgICAgICAgcGFkZGluZzogMDsNCiAgICAgICAgICAgIGZvbnQtc2l6ZTogMi40cmVtOw0KICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsNCiAgICAgICAgICAgIGNvbG9yOiAjMWY0OTczOw0KICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuMjsNCiAgICAgICAgfQ0KICAgICAgICAuZGF0YS1zY2llbmNlLXRla3MgcCB7DQogICAgICAgICAgICBtYXJnaW46IDA7DQogICAgICAgICAgICBwYWRkaW5nOiAwOw0KICAgICAgICB9DQogICAgPC9zdHlsZT4NCjwvaGVhZD4NCjxib2R5Pg0KICAgIDxkaXYgY2xhc3M9ImRhdGEtc2NpZW5jZS10ZWtzIj4NCiAgICAgICAgPGgxPjwvaDE+DQogICAgICAgIDxwPlRoZSBtYWluIHB1cnBvc2Ugb2YgbGVhcm5pbmcgZGF0YSBzY2llbmNlIHByb2dyYW1taW5nIGlzIHRvIGRldmVsb3AgdGhlIGFiaWxpdHkgdG8gbWFuYWdlIGFuZCBhbmFseXplIGRhdGEgZWZmaWNpZW50bHkgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgbWVhbmluZ2Z1bCBpbnNpZ2h0cy4gUHJvZ3JhbW1pbmcgc2VydmVzIGFzIGEgZm91bmRhdGlvbmFsIHNraWxsIHRoYXQgc3VwcG9ydHMgdGhlIHByb2Nlc3NlcyBvZiBjb2xsZWN0aW5nLCBjbGVhbmluZywgYW5kIGFuYWx5emluZyBkYXRhLiBXaXRob3V0IHByb2dyYW1taW5nIHNraWxscywgdGhlc2UgdGFza3Mgd291bGQgYmUgZGlmZmljdWx0IGFuZCB0aW1lLWNvbnN1bWluZy4gQnkgbGVhcm5pbmcgcHJvZ3JhbW1pbmcsIFVzIGNhbiB3b3JrIHdpdGggbGFyZ2UgZGF0YXNldHMgbW9yZSBlZmZlY3RpdmVseSwgYnVpbGQgYW5kIHRlc3QgYmFzaWMgbWFjaGluZSBsZWFybmluZyBtb2RlbHMsIGFuZCB2aXN1YWxpemUgYW5hbHl0aWNhbCByZXN1bHRzLiBJbiBhZGRpdGlvbiwgcHJvZ3JhbW1pbmcga25vd2xlZGdlIGhlbHBzIGxlYXJuZXJzIHVuZGVyc3RhbmQgZGF0YSBjb2xsZWN0aW9uIHRlY2huaXF1ZXMgc3VjaCBhcyB3ZWIgc2NyYXBpbmcgYW5kIHRoZSBpbXBvcnRhbmNlIG9mIGRhdGEgY2xlYW5pbmcgdG8gZW5zdXJlIGFjY3VyYWN5IGFuZCByZWxpYWJpbGl0eS4gVGhlcmVmb3JlLCBwcm9ncmFtbWluZyBiZWNvbWVzIGEgZnVuZGFtZW50YWwgdG9vbCBmb3IgYnVpbGQgc3Ryb25nIGNvbXBldGVuY2UgaW4gZGF0YSBzY2llbmNlIGFuZCBwcmVwYXJlIGZvciBmdXR1cmUgcHJvZmVzc2lvbmFsIHJvbGVzIGluIHRoaXMgZmllbGQuPC9wPg0KICAgIDwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0KYGBgDQoNCiMgV2h5IERvIFdlIExlYXJuIGFib3V0IGl0ID8NCg0KYGBgez1odG1sfQ0KPCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPSJpZCI+DQo8aGVhZD4NCiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+DQogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPg0KICAgIDx0aXRsZT5XaGF0IGlzIERhdGEgU2NpZW5jZT8gKGJpcnXCt2NyZWFtKTwvdGl0bGU+DQogICAgPHN0eWxlPg0KICAgICAgICBib2R5LCBodG1sIHsNCiAgICAgICAgICAgIG1hcmdpbjogMDsNCiAgICAgICAgICAgIHBhZGRpbmc6IDA7DQogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsNCiAgICAgICAgfQ0KICAgICAgICAuZGF0YS1zY2llbmNlLXRla3Mgew0KICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZWRmNzsNCiAgICAgICAgICAgIGNvbG9yOiAjMmI0YTZmOw0KICAgICAgICAgICAgZm9udC1mYW1pbHk6ICdHZW9yZ2lhJywgJ1RpbWVzIE5ldyBSb21hbicsIHNlcmlmOw0KICAgICAgICAgICAgZm9udC1zaXplOiAxLjNyZW07DQogICAgICAgICAgICBsaW5lLWhlaWdodDogMS42Ow0KICAgICAgICAgICAgcGFkZGluZzogMS44cmVtIDIuMnJlbTsNCiAgICAgICAgICAgIG1heC13aWR0aDogOTAwcHg7DQogICAgICAgICAgICBtYXJnaW46IDAgYXV0bzsNCiAgICAgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsNCiAgICAgICAgICAgIHRleHQtYWxpZ246IGp1c3RpZnk7DQogICAgICAgIH0NCiAgICAgICAgLmRhdGEtc2NpZW5jZS10ZWtzIGgxIHsNCiAgICAgICAgICAgIG1hcmdpbjogMCAwIDAuNXJlbSAwOw0KICAgICAgICAgICAgcGFkZGluZzogMDsNCiAgICAgICAgICAgIGZvbnQtc2l6ZTogMi40cmVtOw0KICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsNCiAgICAgICAgICAgIGNvbG9yOiAjMWY0OTczOw0KICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuMjsNCiAgICAgICAgfQ0KICAgICAgICAuZGF0YS1zY2llbmNlLXRla3MgcCB7DQogICAgICAgICAgICBtYXJnaW46IDA7DQogICAgICAgICAgICBwYWRkaW5nOiAwOw0KICAgICAgICB9DQogICAgPC9zdHlsZT4NCjwvaGVhZD4NCjxib2R5Pg0KICAgIDxkaXYgY2xhc3M9ImRhdGEtc2NpZW5jZS10ZWtzIj4NCiAgICAgICAgPGgxPjwvaDE+DQogICAgICAgIDxwPlRoZSByZWFzb24gd2h5IHdlIGxlYXJuaW5nIGRhdGEgc2NpZW5jZSBwcm9ncmFtbWluZyBpcyB0byBkZXZlbG9wIHRoZSBhYmlsaXR5IHRvIG1hbmFnZSBhbmQgYW5hbHl6ZSBkYXRhIGVmZmljaWVudGx5IGluIG9yZGVyIHRvIGdlbmVyYXRlIG1lYW5pbmdmdWwgaW5zaWdodHMuIFByb2dyYW1taW5nIHN1cHBvcnRzIGltcG9ydGFudCBwcm9jZXNzZXMgc3VjaCBhcyBjb2xsZWN0aW5nLCBjbGVhbmluZywgYW5kIGFuYWx5emluZyBkYXRhLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgYmUgZGlmZmljdWx0IGFuZCB0aW1lLWNvbnN1bWluZy4gQnkgbWFzdGVyaW5nIHByb2dyYW1taW5nIHNraWxscywgd2UgY2FuIHdvcmsgd2l0aCBsYXJnZSBkYXRhc2V0cywgYnVpbGQgYW5kIHRlc3QgYmFzaWMgbWFjaGluZSBsZWFybmluZyBtb2RlbHMsIGFuZCB2aXN1YWxpemUgcmVzdWx0cyBlZmZlY3RpdmVseS4gSW4gYWRkaXRpb24sIHVuZGVyc3RhbmRpbmcgcHJvZ3JhbW1pbmcgaGVscHMgdXMgbGVhcm4gZGF0YSBjb2xsZWN0aW9uIHRlY2huaXF1ZXMgbGlrZSB3ZWIgc2NyYXBpbmcgYW5kIGVuc3VyZXMgZGF0YSBhY2N1cmFjeSB0aHJvdWdoIHByb3BlciBjbGVhbmluZy4gVGhlcmVmb3JlLCBwcm9ncmFtbWluZyBpcyBhIGZ1bmRhbWVudGFsIHNraWxsIGZvciBidWlsZGluZyBzdHJvbmcgY29tcGV0ZW5jZSBpbiBkYXRhIHNjaWVuY2UgYW5kIHByZXBhcmluZyBmb3IgZnV0dXJlIGNhcmVlcnMgaW4gdGhpcyBmaWVsZC4uPC9wPg0KICAgIDwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0KYGBgDQoNCiMgV2hhdCBUb29scyB0byBoYXZlIHRvIGV4cGVydCBhYm91dCA/DQoNCmBgYHs9aHRtbH0NCjwhRE9DVFlQRSBodG1sPg0KPGh0bWwgbGFuZz0iZW4iPg0KPGhlYWQ+DQogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPg0KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4NCiAgICA8dGl0bGU+UHl0aG9uLCBSLCBTUUw8L3RpdGxlPg0KICAgIDxzdHlsZT4NCiAgICAgICAgLyogV1JBUFBFUiBVTklLIC0gc2VtdWEgZ2F5YSBkaWJ1bmdrdXMgZGFsYW0gc2VsZWN0b3IgLnB5dGhvbi1yLXNxbC1zZWN0aW9uICovDQogICAgICAgIC5weXRob24tci1zcWwtc2VjdGlvbiB7DQogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsNCiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknLCBzeXN0ZW0tdWksIHNhbnMtc2VyaWY7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5weXRob24tci1zcWwtc2VjdGlvbiAqIHsNCiAgICAgICAgICAgIG1hcmdpbjogMDsNCiAgICAgICAgICAgIHBhZGRpbmc6IDA7DQogICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAucHl0aG9uLXItc3FsLXNlY3Rpb24gew0KICAgICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzBjMjQ2MSAwJSwgIzFlMzc5OSA1MCUsICM0YTY5YmQgMTAwJSk7DQogICAgICAgICAgICBjb2xvcjogIzMzMzsNCiAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7DQogICAgICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgbWluLWhlaWdodDogMTAwdmg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5weXRob24tci1zcWwtc2VjdGlvbiAuY29udGFpbmVyIHsNCiAgICAgICAgICAgIG1heC13aWR0aDogMTEwMHB4Ow0KICAgICAgICAgICAgd2lkdGg6IDEwMCU7DQogICAgICAgICAgICBtYXJnaW46IDAgYXV0bzsNCiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxNXB4Ow0KICAgICAgICAgICAgYm94LXNoYWRvdzogMCAxMHB4IDMwcHggcmdiYSgxMiwgMzYsIDk3LCAwLjMpOw0KICAgICAgICAgICAgcGFkZGluZzogMnJlbSAycmVtIDIuNXJlbSAycmVtOw0KICAgICAgICAgICAgYm9yZGVyOiAycHggc29saWQgIzRhNjliZDsNCiAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5weXRob24tci1zcWwtc2VjdGlvbiBoMSB7DQogICAgICAgICAgICBmb250LXdlaWdodDogNzAwOw0KICAgICAgICAgICAgZm9udC1zaXplOiAycmVtOw0KICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgICAgICAgICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCAiUGFsYXRpbm8gTGlub3R5cGUiLCBzZXJpZjsNCiAgICAgICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsNCiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7DQogICAgICAgICAgICBsaW5lLWhlaWdodDogMS4yOw0KICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7DQogICAgICAgICAgICBjb2xvcjogIzBjMjQ2MTsNCiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5weXRob24tci1zcWwtc2VjdGlvbiBoMTo6YWZ0ZXIgew0KICAgICAgICAgICAgY29udGVudDogIiI7DQogICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQogICAgICAgICAgICBib3R0b206IDA7DQogICAgICAgICAgICBsZWZ0OiA1MCU7DQogICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7DQogICAgICAgICAgICB3aWR0aDogMTUwcHg7DQogICAgICAgICAgICBoZWlnaHQ6IDJweDsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICM0YTY5YmQ7DQogICAgICAgICAgICBvcGFjaXR5OiAwLjM7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5weXRob24tci1zcWwtc2VjdGlvbiAuY2FyZHMgew0KICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgIGZsZXgtd3JhcDogd3JhcDsNCiAgICAgICAgICAgIGdhcDogMS44cmVtOw0KICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgICAgICAgICBtYXJnaW4tdG9wOiAzMHB4Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAucHl0aG9uLXItc3FsLXNlY3Rpb24gLmNhcmQgew0KICAgICAgICAgICAgZmxleDogMSAxIDI4MHB4Ow0KICAgICAgICAgICAgbWluLXdpZHRoOiAyNjBweDsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmMGY4ZmY7DQogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4Ow0KICAgICAgICAgICAgcGFkZGluZzogMS44cmVtIDEuNXJlbTsNCiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDEycHggcmdiYSgwLDAsMCwwLjEpOw0KICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsNCiAgICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7DQogICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5weXRob24tci1zcWwtc2VjdGlvbiAuY2FyZDo6YmVmb3JlLA0KICAgICAgICAucHl0aG9uLXItc3FsLXNlY3Rpb24gLmNhcmQ6OmFmdGVyIHsNCiAgICAgICAgICAgIGNvbnRlbnQ6ICIiOw0KICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOw0KICAgICAgICAgICAgd2lkdGg6IDE4cHg7DQogICAgICAgICAgICBoZWlnaHQ6IDE4cHg7DQogICAgICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAjNGE2OWJkOw0KICAgICAgICAgICAgb3BhY2l0eTogMC4zOw0KICAgICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLnB5dGhvbi1yLXNxbC1zZWN0aW9uIC5jYXJkOjpiZWZvcmUgew0KICAgICAgICAgICAgdG9wOiA4cHg7DQogICAgICAgICAgICBsZWZ0OiA4cHg7DQogICAgICAgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7DQogICAgICAgICAgICBib3JkZXItYm90dG9tOiBub25lOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAucHl0aG9uLXItc3FsLXNlY3Rpb24gLmNhcmQ6OmFmdGVyIHsNCiAgICAgICAgICAgIGJvdHRvbTogOHB4Ow0KICAgICAgICAgICAgcmlnaHQ6IDhweDsNCiAgICAgICAgICAgIGJvcmRlci1sZWZ0OiBub25lOw0KICAgICAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLnB5dGhvbi1yLXNxbC1zZWN0aW9uIC5jYXJkOmhvdmVyOjpiZWZvcmUsDQogICAgICAgIC5weXRob24tci1zcWwtc2VjdGlvbiAuY2FyZDpob3Zlcjo6YWZ0ZXIgew0KICAgICAgICAgICAgd2lkdGg6IDIycHg7DQogICAgICAgICAgICBoZWlnaHQ6IDIycHg7DQogICAgICAgICAgICBvcGFjaXR5OiAwLjU7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5weXRob24tci1zcWwtc2VjdGlvbiAuY2FyZDpob3ZlciB7DQogICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTVweCk7DQogICAgICAgICAgICBib3gtc2hhZG93OiAwIDVweCAxNXB4IHJnYmEoNzQsIDEwNSwgMTg5LCAwLjMpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAucHl0aG9uLXItc3FsLXNlY3Rpb24gLnRpdGxlIHsNCiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7DQogICAgICAgICAgICBmb250LXNpemU6IDEuNnJlbTsNCiAgICAgICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOw0KICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMS4yNXJlbTsNCiAgICAgICAgICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgIzRhNjliZDsNCiAgICAgICAgICAgIHBhZGRpbmctbGVmdDogMC44cmVtOw0KICAgICAgICAgICAgY29sb3I6ICMwYzI0NjE7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5weXRob24tci1zcWwtc2VjdGlvbiAuZGVzYyB7DQogICAgICAgICAgICBjb2xvcjogIzMzMzsNCiAgICAgICAgICAgIGZvbnQtc2l6ZTogMXJlbTsNCiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEuNXJlbTsNCiAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5weXRob24tci1zcWwtc2VjdGlvbiAubGlicmFyeS1saXN0IHsNCiAgICAgICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7DQogICAgICAgICAgICBtYXJnaW4tdG9wOiAwLjhyZW07DQogICAgICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICAgICAgZmxleC13cmFwOiB3cmFwOw0KICAgICAgICAgICAgZ2FwOiAwLjVyZW07DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5weXRob24tci1zcWwtc2VjdGlvbiAubGlicmFyeS1saXN0IGxpIHsNCiAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgIzRhNjliZCwgIzZhODljYyk7DQogICAgICAgICAgICBjb2xvcjogd2hpdGU7DQogICAgICAgICAgICBtYXJnaW46IDA7DQogICAgICAgICAgICBwYWRkaW5nOiAwLjVyZW0gMXJlbTsNCiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDI1cHg7DQogICAgICAgICAgICBmb250LXNpemU6IDAuODVyZW07DQogICAgICAgICAgICBmb250LXdlaWdodDogNTAwOw0KICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzFlMzc5OTsNCiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgM3B4IDhweCByZ2JhKDc0LCAxMDUsIDE4OSwgMC4yKTsNCiAgICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5weXRob24tci1zcWwtc2VjdGlvbiAubGlicmFyeS1saXN0IGxpOmhvdmVyIHsNCiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtM3B4KTsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgIzFlMzc5OSwgIzRhNjliZCk7DQogICAgICAgICAgICBib3gtc2hhZG93OiAwIDVweCAxNXB4IHJnYmEoNzQsIDEwNSwgMTg5LCAwLjMpOw0KICAgICAgICB9DQogICAgPC9zdHlsZT4NCjwvaGVhZD4NCjxib2R5Pg0KICAgIDxkaXYgY2xhc3M9InB5dGhvbi1yLXNxbC1zZWN0aW9uIj4NCiAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4NCiAgICAgICAgICAgIDxoMT5QeXRob24gwrcgUiDCtyBTUUw8L2gxPg0KDQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkcyI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZCI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj5QeXRob248L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVzYyI+DQogICAgICAgICAgICAgICAgICAgICAgICBDbGFzc2lmaWVkIGFzIGEgZmxleGlibGUgdG9vbCB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIHVzZXJzIHdvcmxkd2lkZS4gUHl0aG9uIGhhcyBhIHN0cm9uZyBmb2N1cyBvbiBtYWNoaW5lIGxlYXJuaW5nLCB3ZWIgZGV2ZWxvcG1lbnQsIGFuZCBkYXRhIHZpc3VhbGl6YXRpb24uIEl0IGlzIHN1cHBvcnRlZCBieSB2YXJpb3VzIGxpYnJhcmllcyBzdWNoIGFzIHBhbmRhcywgbnVtcHksIGFuZCBzY2lraXQtbGVhcm4uDQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9ImxpYnJhcnktbGlzdCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8bGk+cGFuZGFzPC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5udW1weTwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICA8bGk+c2Npa2l0LWxlYXJuPC9saT4NCiAgICAgICAgICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQiPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+UjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZXNjIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIEtub3duIGFzIGEgdG9vbCB0aGF0IGV4Y2VscyBpbiBzdGF0aXN0aWNhbCBhbmFseXNpcyBhbmQgZGF0YSB2aXN1YWxpemF0aW9uLCBhcyB3ZWxsIGFzIGJlaW5nIGZsZXhpYmxlIGluIGRhdGEgbWFuaXB1bGF0aW9uLiBSIGlzIHBvcHVsYXIgZm9yIGl0cyBsaWJyYXJpZXMgc3VjaCBhcyBkcGx5ciwgZ2dwbG90MiwgYW5kIHRpZHlyLiBBZGRpdGlvbmFsbHksIGl0IGlzIHN0cm9uZyBmb3IgYWR2YW5jZWQgc3RhdGlzdGljYWwgYW5hbHlzaXMsIHRleHQgbWluaW5nLCBhbmQgc29jaWFsIG5ldHdvcmsgYW5hbHlzaXMuDQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9ImxpYnJhcnktbGlzdCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8bGk+ZHBseXI8L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGxpPmdncGxvdDI8L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGxpPnRpZHlyPC9saT4NCiAgICAgICAgICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQiPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+U1FMPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlc2MiPg0KICAgICAgICAgICAgICAgICAgICAgICAgSGlnaGx5IGVmZmVjdGl2ZSBmb3IgbWFuYWdpbmcgYW5kIHF1ZXJ5aW5nIHJlbGF0aW9uYWwgZGF0YWJhc2VzLCBhbmQgc3VwcG9ydHMgZGF0YSBjbGVhbmluZyBhbmQgdHJhbnNmb3JtYXRpb24gcHJvY2Vzc2VzIGVmZmljaWVudGx5LiBTUUwgZXhjZWxzIGluIHByb2Nlc3Npbmcgc3RydWN0dXJlZCBkYXRhIGFuZCBtYW5hZ2luZyBsYXJnZSBkYXRhc2V0cy4gSXQgaXMgYWxzbyBlYXN5IHRvIGludGVncmF0ZSB3aXRoIG90aGVyIHByb2dyYW1taW5nIGxhbmd1YWdlcy4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQpgYGANCg0KDQojIEdpdmUgeW91ciBpbnRlcmVzdCBkb21haW4ga25vd2xlZGdlIG9mIHRoZSBkYXRhIHNjaWVuY2UNCg0KYGBgez1odG1sfQ0KPCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPSJpZCI+DQo8aGVhZD4NCiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+DQogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPg0KICAgIDx0aXRsZT5XaGF0IGlzIERhdGEgU2NpZW5jZT8gKGJpcnXCt2NyZWFtKTwvdGl0bGU+DQogICAgPHN0eWxlPg0KICAgICAgICBib2R5LCBodG1sIHsNCiAgICAgICAgICAgIG1hcmdpbjogMDsNCiAgICAgICAgICAgIHBhZGRpbmc6IDA7DQogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsNCiAgICAgICAgfQ0KICAgICAgICAuZGF0YS1zY2llbmNlLXRla3Mgew0KICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZWRmNzsNCiAgICAgICAgICAgIGNvbG9yOiAjMmI0YTZmOw0KICAgICAgICAgICAgZm9udC1mYW1pbHk6ICdHZW9yZ2lhJywgJ1RpbWVzIE5ldyBSb21hbicsIHNlcmlmOw0KICAgICAgICAgICAgZm9udC1zaXplOiAxLjNyZW07DQogICAgICAgICAgICBsaW5lLWhlaWdodDogMS42Ow0KICAgICAgICAgICAgcGFkZGluZzogMS44cmVtIDIuMnJlbTsNCiAgICAgICAgICAgIG1heC13aWR0aDogOTAwcHg7DQogICAgICAgICAgICBtYXJnaW46IDAgYXV0bzsNCiAgICAgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsNCiAgICAgICAgICAgIHRleHQtYWxpZ246IGp1c3RpZnk7DQogICAgICAgIH0NCiAgICAgICAgLmRhdGEtc2NpZW5jZS10ZWtzIGgxIHsNCiAgICAgICAgICAgIG1hcmdpbjogMCAwIDAuNXJlbSAwOw0KICAgICAgICAgICAgcGFkZGluZzogMDsNCiAgICAgICAgICAgIGZvbnQtc2l6ZTogMi40cmVtOw0KICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsNCiAgICAgICAgICAgIGNvbG9yOiAjMWY0OTczOw0KICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuMjsNCiAgICAgICAgfQ0KICAgICAgICAuZGF0YS1zY2llbmNlLXRla3MgcCB7DQogICAgICAgICAgICBtYXJnaW46IDA7DQogICAgICAgICAgICBwYWRkaW5nOiAwOw0KICAgICAgICB9DQogICAgPC9zdHlsZT4NCjwvaGVhZD4NCjxib2R5Pg0KICAgIDxkaXYgY2xhc3M9ImRhdGEtc2NpZW5jZS10ZWtzIj4NCiAgICAgICAgPGgxPjwvaDE+DQogICAgICAgIDxwPkEgY29tcGVsbGluZyBhc3BlY3Qgb2YgZG9tYWluIGtub3dsZWRnZSB0aGF0IEkgZmluZCBwYXJ0aWN1bGFybHkgZW5nYWdpbmcgbGllcyBpbiB0aGUgaW50ZXJzZWN0aW9uIG9mIG1hcmtldGluZyBhbmQgYnVzaW5lc3MsIHdoZXJlIGRhdGEgc2NpZW5jZSBzZXJ2ZXMgYXMgYSBwb3dlcmZ1bCB0b29sIGZvciBzdHJhdGVnaWMgaW5zaWdodC4gSW4gdGhpcyBjb250ZXh0LCBkYXRhIHNjaWVuY2UgY2FuIGlkZW50aWZ5IGRpZmZlcmVuY2VzIGluIGNvbnN1bWVyIGJlaGF2aW9yIHBhdHRlcm5zIGJhc2VkIG9uIGRlbW9ncmFwaGljIGFuZCBwc3ljaG9ncmFwaGljIGNoYXJhY3RlcmlzdGljcywgYXMgd2VsbCBhcyBwdXJjaGFzaW5nIHRyZW5kcywgdG8gY3JlYXRlIG9wdGltYWwgbWFya2V0IHNlZ21lbnRhdGlvbi4gRm9yIGV4YW1wbGUsIG1hY2hpbmUgbGVhcm5pbmcgY2FuIGJlIGFwcGxpZWQgdG8gcHJlZGljdCBjdXN0b21lciBjaHVybiBieSBhbmFseXppbmcgdHJhbnNhY3Rpb24gaGlzdG9yaWVzIGFuZCBjdXN0b21lciBpbnRlcmFjdGlvbnMsIGVuYWJsaW5nIGNvbXBhbmllcyB0byBhdXRvbWF0aWNhbGx5IHByb3ZpZGUgdGFyZ2V0ZWQgc3BlY2lhbCBvZmZlcnMgdG8gbWFpbnRhaW4gY3VzdG9tZXIgbG95YWx0eS4gSG93ZXZlciwgdGhlIHJlc3VsdGluZyBzdHJhdGVnaWVzIG11c3QgYmUgdmFsaWRhdGVkIHRocm91Z2ggQS9CIHRlc3RpbmcgdG8gc2NpZW50aWZpY2FsbHkgYXNzZXNzIHdoZXRoZXIgdGhlIG5ldyBhcHByb2FjaCBnZW5lcmF0ZXMgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGltcGFjdCBvbiBrZXkgbWV0cmljcyBzdWNoIGFzIGNvbnZlcnNpb24gcmF0ZSwgdGhlcmVieSBsZWFkaW5nIHRvIHdlbGwgZm91bmRlZCBhbmQgZWZmZWN0aXZlIHN0cmF0ZWdpYyBkZWNpc2lvbiBtYWtpbmcuPC9wPg0KICAgIDwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0KYGBgDQoNCiMgQ29uY2x1c2lvbiANCg0KOjo6e3N0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiNGRkY1RTE7IGJvcmRlci1sZWZ0OjZweCBzb2xpZCAjMUU5MEZGOyBwYWRkaW5nOjEycHg7IGJvcmRlci1yYWRpdXM6OHB4OyBtYXJnaW46MjBweCAwOyB0ZXh0LWFsaWduOiBqdXN0aWZ5OyJ9DQoNCkRhdGEgU2NpZW5jZSBpcyBhbiBpbnRlcmRpc2NpcGxpbmFyeSBmaWVsZCB0aGF0IGludGVncmF0ZXMgY29tcHV0ZXIgc2NpZW5jZSwgbWF0aGVtYXRpY3MsIGFuZCBzdGF0aXN0aWNzIHRvIGFuYWx5emUgYm90aCBzdHJ1Y3R1cmVkIGFuZCB1bnN0cnVjdHVyZWQgZGF0YSBpbiBvcmRlciB0byBnZW5lcmF0ZSBtZWFuaW5nZnVsIGluc2lnaHRzIGZvciBkZWNpc2lvbi1tYWtpbmcuIFByb2dyYW1taW5nIHBsYXlzIGEgZnVuZGFtZW50YWwgcm9sZSBpbiB0aGlzIHByb2Nlc3MsIGFzIGl0IGVuYWJsZXMgZWZmaWNpZW50IGRhdGEgY29sbGVjdGlvbiwgY2xlYW5pbmcsIGFuYWx5c2lzLCB2aXN1YWxpemF0aW9uLCBhbmQgdGhlIGRldmVsb3BtZW50IG9mIGJhc2ljIG1hY2hpbmUgbGVhcm5pbmcgbW9kZWxzLiBCeSBtYXN0ZXJpbmcgcHJvZ3JhbW1pbmcgc2tpbGxzLCBpbmRpdmlkdWFscyBjYW4gbWFuYWdlIGxhcmdlIGRhdGFzZXRzIGVmZmVjdGl2ZWx5IGFuZCBlbnN1cmUgZGF0YSBhY2N1cmFjeSBhbmQgcmVsaWFiaWxpdHkuDQoNCkZ1cnRoZXJtb3JlLCB0aGUgYXBwbGljYXRpb24gb2YgZGF0YSBzY2llbmNlIGluIG1hcmtldGluZyBhbmQgYnVzaW5lc3MgZGVtb25zdHJhdGVzIGl0cyBzdHJhdGVnaWMgdmFsdWUsIHBhcnRpY3VsYXJseSBpbiB1bmRlcnN0YW5kaW5nIGNvbnN1bWVyIGJlaGF2aW9yLCBvcHRpbWl6aW5nIG1hcmtldCBzZWdtZW50YXRpb24sIHByZWRpY3RpbmcgY3VzdG9tZXIgY2h1cm4sIGFuZCB2YWxpZGF0aW5nIHN0cmF0ZWdpZXMgdGhyb3VnaCBBL0IgdGVzdGluZy4gVGhlcmVmb3JlLCBwcm9ncmFtbWluZyBjb21wZXRlbmNlIGNvbWJpbmVkIHdpdGggZG9tYWluIGtub3dsZWRnZSBmb3JtcyBhIHN0cm9uZyBmb3VuZGF0aW9uIGZvciBidWlsZGluZyBwcm9mZXNzaW9uYWwgZXhwZXJ0aXNlIGluIGRhdGEgc2NpZW5jZSBhbmQgc3VwcG9ydGluZyBkYXRhLWRyaXZlbiBzdHJhdGVnaWMgZGVjaXNpb25zLg0KDQo6OjoNCg==