Introduction

The COVID-19 pandemic is having a profound impact on people and societies around the globe. As a result of that impact, the data that we record is also being affected. This document attempts to look at various kinds of anomalous data, and also the impact of anomalies in specific instances of machine learning.

A Few Words About COVID-19

The COVID-19 pandemic is having and will have serious consequences. The largest is, of course, the impact on individuals, their family and their loved ones. The enormous strain that the pandemic places on healthcare systems results in a secondary impact to those needing care for reasons other than COVID-19, including those that suffer from acute medical conditions ranging from appendicitis to heart attacks and strokes. Financial and economic difficulties caused by loss of work and reduction in salaries (for the fortunate) also result from this event. While the vast majority of the impacts of the virus are negative, there are a very few benefits that the virus, and the “shelter in place” orders may have. These positive impacts include reduced carbon emissions, fewer vehicle accidents, and the chance for families to spend some time together.

I mention the above because I want to be clear that these are all of primary concern.

Stepping back from the immediacy of these issues for a moment, there is another impact to those fields related to data. The purpose of this document is to explore some of these impacts.

Some Context

The COVID-19 pandemic is being captured in the form of recorded data. We are recording losses in jobs, dropping prices in some commodities (gas), and increases in others (toilet paper and hand sanitizer). The data that we are capturing today will be used to train descriptive and predictive models. Will those models be valuable considering the instability in our systems? This post will explore that questions. First, however, it is help to begin with some context.

The following diagram provides shows the relationship of the terms of AI, Machine Learning and Deep Learning.

Ian Goodfellow

Ian Goodfellow

Ian Goodfellow, “Deep Learning”. https://www.deeplearningbook.org/contents/intro.html Page 9.

This post will focus on data that is in the Machine Learning bubble, and for the most part supervised learning.

Outliers

The National Institute of Standards and Technology (NIST) defines data outliers as follows:

Outliers can be subdivided into two groups: Observational outliers and contextual outliers. The following sections will explore some aspects of two types of outliers and include some examples.

Abnormal Values

The most obvious outliers are abnormal values. The National Institute of Standards and Technology defines outliers as follows:

An outlier is an observation that lies an abnormal distance from other values in a random sample from a population. In a sense, this definition leaves it up to the analyst (or a consensus process) to decide what will be considered abnormal. Before abnormal observations can be singled out, it is necessary to characterize normal observations.

Many examples of these outliers can be found in the standard analytics literature and commonly used datasets. One such example appears in the standard R package in the mtcars dataset. It is easy to see the outlier in this plot:

plot(mtcars$wt, mtcars$hp, xlab="Horsepower", ylab="Weight")

One nice thing about these kinds of abnormal observations is that it is possible to measure the degree that a point represents an outlier.

Cook’s distance provides a metric that can be used to quantify outliers.

mdl <- lm(wt~hp, data=mtcars)
cd <- cooks.distance(mdl)
plot(cd)

If you’re curious, the outlier in the above dataset is a Maserati Bora that has a weight of 3,570 lbs and 335 gross horsepower. In other words, for it’s weight, it is not powerful when compared to other cars in the sample.

Contextual Outliers

In their book “Data Mining: Concepts and Techniques, 3rd Edition”" by Micheline Kamber, Jiawei Han, and Jian Pei, the authors provide an extended definition of outliers:

An object in a given data set is a contextual outlier (or conditional outlier) if it deviates significantly with respect to a specific context of the object...

(Section 12.7 Mining Contextual and Collective Outliers)

The key here is that the outlier is considered within a given context. To illustrate this point, consider the following graph of the Dow Jones Industrial Average for the past 6 months:

Dow Jones

Dow Jones

In the above, we see a huge dip in the Dow as a result of concerns about COVID-19. If we “zoom out” and look at the Dow since 2001, we can see that the recent anomolies in the Dow are actually, pretty minor compared to other points in time.

Dow Jones Since 2001

Dow Jones Since 2001

As displayed in the two examples above, outliers are somewhat subjective.

Economic Shocks

Another concept to consider in this discussion, particularly in the context of COVID-19, is economic shocks. Yahoo finance defines economic shocks as follows:

An economic shock, also known as a macroeconomic shock, is any unexpected event that has a large-scale, unexpected impact on the economy.

https://finance.yahoo.com/news/economic-shocks-definition-examples-221454349.html

So, the question arises, is an economic shock an outlier? Based on the pure definition of an outlier, the answer is yes. It is an unexpected event that has an effect on the economy. Frequently, the effects of economic shocks eventually fade away. To see an example, let’s take a look historical gross domestic product (GDP) for the United States.

gdp <- read.csv("GDP.csv", header=T)
plot(gdp, main="United States Gross Domestic Product", ylab="$B")

In 2008-2009, the US economy suffered through the housing crisis. (See https://www.washingtonpost.com/business/economy/a-guide-to-the-financial-crisis--10-years-later/2018/09/10/114b76ba-af10-11e8-a20b-5f4f84429666_story.html) The impact that crisis had on the overall GDP of the United States is clearly visible in the graph above. It is important to note, however, that the GDP did return on it’s same upward trajectory.

Let’s now think about COVID-19. As absolutely horrible the situation is, the underlying fundamentals of our social and economic systems will largely be unaffected. Our infrastructure will be pretty much unaffected, except for the strain on our health care system. And, as we have seen in past epidemics and pandemics, that strain will be fairly short-lived. Perhaps the largest impact on our economy will be in consumer confidence. However, if we think about challenges we have seen in the past, our economic systems seem to come roaring back once the crisis is over. That is clearly visible in the GDP plot above.

In terms of AI and Machine Learning, do shocks prevent us from developing predictive models. The anser is clearly no. To illustrate this point, take a look at a model that was fitted to the GDP data above. This is a simple second degree regression model fitted to the historical GDP data.

gdp <- read.csv("GDP.csv", header=T)
library(ggplot2)
gdp$idx <- seq(1,nrow(gdp))
gdp$idx2 <- gdp$idx^2
gdp_mdl <- lm(GDP~idx2, data=gdp)
gdp$pred <- predict(gdp_mdl, new_data=gdp$idx2)
p <- ggplot() +
  geom_line(data=gdp, aes(x = idx, y = GDP), color = "blue") +
  geom_line(data=gdp, aes(x = idx, y = pred), color = "red")
p

We can see that the model is off a bit due to the shock. However, there clearly is predictive value in the model above. To quantify that, we can see that the \(R^2\) value for the model, the proportion of the variablilty explained by the model, is 0.9874056.

Conclusion

Shocks like the COVID-19 pandemic can have a profound impact on individuals, and a strong short term impact on society. The burden that the current situation is having on our health care system, our society, and individuals cannot be overstated. That said, it is worthwhile to remember that the fundamentals of economic systems, including our infrastructure will be largely unaffected.

The question that many people have is just how much of an impact will COVID-19 have on US GDP. Some articles suggest that it could be around 7-8%, along the lines of the 2008-2009 housing crisis, including this post from March 21, 2020.

https://www.forbes.com/sites/petercohan/2020/03/21/covid-19s-worst-case-106-jobless-rate-15-trillion-gdp-drop/#3c85130910a2pand

Other articles are less optimistic like this one from McKinnesy, but still place the impact at around that of the 2008-2009 downturn.

https://www.mckinsey.com/business-functions/risk/our-insights/covid-19-implications-for-business

We have seen large, and more prolonged impacts to our society in the past. Despite those large, and prolonged challenges, our economic systems have been able to recover. In terms of building analytic models that are able to accomidate outliers, that is a core competency in the discipline of analytics. We have numerous tools to identify anomolous data, and to handle it based on the context that it arises.

LS0tCnRpdGxlOiAiT3V0bGllcnMsIFNob2NrcyBhbmQgUHJlZGljdGFiaWxpdHkiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6ICBNaWxlcyBSIFBvcnRlcgpkYXRlOiAgTWFyY2ggMjYsIDIwMjAKLS0tCgojIEludHJvZHVjdGlvbgoKVGhlIENPVklELTE5IHBhbmRlbWljIGlzIGhhdmluZyBhIHByb2ZvdW5kIGltcGFjdCBvbiBwZW9wbGUgYW5kIHNvY2lldGllcyBhcm91bmQgdGhlIGdsb2JlLiAgQXMgYSByZXN1bHQgb2YgdGhhdCBpbXBhY3QsIHRoZSBkYXRhIHRoYXQgd2UgcmVjb3JkIGlzIGFsc28gYmVpbmcgYWZmZWN0ZWQuICBUaGlzIGRvY3VtZW50IGF0dGVtcHRzIHRvIGxvb2sgYXQgdmFyaW91cyBraW5kcyBvZiBhbm9tYWxvdXMgZGF0YSwgYW5kIGFsc28gdGhlIGltcGFjdCBvZiBhbm9tYWxpZXMgaW4gc3BlY2lmaWMgaW5zdGFuY2VzIG9mIG1hY2hpbmUgbGVhcm5pbmcuCgojIyBBIEZldyBXb3JkcyBBYm91dCBDT1ZJRC0xOQoKVGhlIENPVklELTE5IHBhbmRlbWljIGlzIGhhdmluZyBhbmQgd2lsbCBoYXZlIHNlcmlvdXMgY29uc2VxdWVuY2VzLiAgVGhlIGxhcmdlc3QgaXMsIG9mIGNvdXJzZSwgdGhlICBpbXBhY3Qgb24gaW5kaXZpZHVhbHMsIHRoZWlyIGZhbWlseSBhbmQgdGhlaXIgbG92ZWQgb25lcy4gIFRoZSBlbm9ybW91cyBzdHJhaW4gdGhhdCB0aGUgcGFuZGVtaWMgcGxhY2VzIG9uIGhlYWx0aGNhcmUgc3lzdGVtcyByZXN1bHRzIGluIGEgc2Vjb25kYXJ5IGltcGFjdCB0byB0aG9zZSBuZWVkaW5nIGNhcmUgZm9yIHJlYXNvbnMgb3RoZXIgdGhhbiBDT1ZJRC0xOSwgaW5jbHVkaW5nIHRob3NlIHRoYXQgc3VmZmVyIGZyb20gYWN1dGUgbWVkaWNhbCBjb25kaXRpb25zIHJhbmdpbmcgZnJvbSBhcHBlbmRpY2l0aXMgdG8gaGVhcnQgYXR0YWNrcyBhbmQgc3Ryb2tlcy4gIEZpbmFuY2lhbCBhbmQgZWNvbm9taWMgZGlmZmljdWx0aWVzIGNhdXNlZCBieSBsb3NzIG9mIHdvcmsgYW5kIHJlZHVjdGlvbiBpbiBzYWxhcmllcyAoZm9yIHRoZSBmb3J0dW5hdGUpIGFsc28gcmVzdWx0IGZyb20gdGhpcyBldmVudC4gIFdoaWxlIHRoZSB2YXN0IG1ham9yaXR5IG9mIHRoZSBpbXBhY3RzIG9mIHRoZSB2aXJ1cyBhcmUgbmVnYXRpdmUsIHRoZXJlIGFyZSBhIHZlcnkgZmV3IGJlbmVmaXRzIHRoYXQgdGhlIHZpcnVzLCBhbmQgdGhlICJzaGVsdGVyIGluIHBsYWNlIiBvcmRlcnMgbWF5IGhhdmUuICBUaGVzZSBwb3NpdGl2ZSBpbXBhY3RzIGluY2x1ZGUgcmVkdWNlZCBjYXJib24gZW1pc3Npb25zLCBmZXdlciB2ZWhpY2xlIGFjY2lkZW50cywgYW5kIHRoZSBjaGFuY2UgZm9yIGZhbWlsaWVzIHRvIHNwZW5kIHNvbWUgdGltZSB0b2dldGhlci4KCkkgbWVudGlvbiB0aGUgYWJvdmUgYmVjYXVzZSBJIHdhbnQgdG8gYmUgY2xlYXIgdGhhdCB0aGVzZSBhcmUgYWxsIG9mIHByaW1hcnkgY29uY2Vybi4KClN0ZXBwaW5nIGJhY2sgZnJvbSB0aGUgaW1tZWRpYWN5IG9mIHRoZXNlIGlzc3VlcyBmb3IgYSBtb21lbnQsIHRoZXJlIGlzIGFub3RoZXIgaW1wYWN0IHRvIHRob3NlIGZpZWxkcyByZWxhdGVkIHRvIGRhdGEuICBUaGUgcHVycG9zZSBvZiB0aGlzIGRvY3VtZW50IGlzIHRvIGV4cGxvcmUgc29tZSBvZiB0aGVzZSBpbXBhY3RzLgoKIyBTb21lIENvbnRleHQKClRoZSBDT1ZJRC0xOSBwYW5kZW1pYyBpcyBiZWluZyBjYXB0dXJlZCBpbiB0aGUgZm9ybSBvZiByZWNvcmRlZCBkYXRhLiAgV2UgYXJlIHJlY29yZGluZyBsb3NzZXMgaW4gam9icywgZHJvcHBpbmcgcHJpY2VzIGluIHNvbWUgY29tbW9kaXRpZXMgKGdhcyksIGFuZCBpbmNyZWFzZXMgaW4gb3RoZXJzICh0b2lsZXQgcGFwZXIgYW5kIGhhbmQgc2FuaXRpemVyKS4gIFRoZSBkYXRhIHRoYXQgd2UgYXJlIGNhcHR1cmluZyB0b2RheSB3aWxsIGJlIHVzZWQgdG8gdHJhaW4gZGVzY3JpcHRpdmUgYW5kIHByZWRpY3RpdmUgbW9kZWxzLiAgV2lsbCB0aG9zZSBtb2RlbHMgYmUgdmFsdWFibGUgY29uc2lkZXJpbmcgdGhlIGluc3RhYmlsaXR5IGluIG91ciBzeXN0ZW1zPyAgVGhpcyBwb3N0IHdpbGwgZXhwbG9yZSB0aGF0IHF1ZXN0aW9ucy4gIEZpcnN0LCBob3dldmVyLCBpdCBpcyBoZWxwIHRvIGJlZ2luIHdpdGggc29tZSBjb250ZXh0LiAgCgpUaGUgZm9sbG93aW5nIGRpYWdyYW0gcHJvdmlkZXMgc2hvd3MgdGhlIHJlbGF0aW9uc2hpcCBvZiB0aGUgdGVybXMgb2YgQUksIE1hY2hpbmUgTGVhcm5pbmcgYW5kIERlZXAgTGVhcm5pbmcuCgohW0lhbiBHb29kZmVsbG93XShJYW5Hb29kZmVsbG93RGlhZ3JhbS5qcGcpCgpJYW4gR29vZGZlbGxvdywgIkRlZXAgTGVhcm5pbmciLiAgaHR0cHM6Ly93d3cuZGVlcGxlYXJuaW5nYm9vay5vcmcvY29udGVudHMvaW50cm8uaHRtbCBQYWdlIDkuCgpUaGlzIHBvc3Qgd2lsbCBmb2N1cyBvbiBkYXRhIHRoYXQgaXMgaW4gdGhlIE1hY2hpbmUgTGVhcm5pbmcgYnViYmxlLCBhbmQgZm9yIHRoZSBtb3N0IHBhcnQgc3VwZXJ2aXNlZCBsZWFybmluZy4KCiMgT3V0bGllcnMKClRoZSBOYXRpb25hbCBJbnN0aXR1dGUgb2YgU3RhbmRhcmRzIGFuZCBUZWNobm9sb2d5IChOSVNUKSBkZWZpbmVzIGRhdGEgb3V0bGllcnMgYXMgZm9sbG93czoKCk91dGxpZXJzIGNhbiBiZSBzdWJkaXZpZGVkIGludG8gdHdvIGdyb3VwczogIE9ic2VydmF0aW9uYWwgb3V0bGllcnMgYW5kIGNvbnRleHR1YWwgb3V0bGllcnMuICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIHdpbGwgZXhwbG9yZSBzb21lIGFzcGVjdHMgb2YgdHdvIHR5cGVzIG9mIG91dGxpZXJzIGFuZCBpbmNsdWRlIHNvbWUgZXhhbXBsZXMuCgojIyBBYm5vcm1hbCBWYWx1ZXMKClRoZSBtb3N0IG9idmlvdXMgb3V0bGllcnMgYXJlIGFibm9ybWFsIHZhbHVlcy4gIFRoZSBOYXRpb25hbCBJbnN0aXR1dGUgb2YgU3RhbmRhcmRzIGFuZCBUZWNobm9sb2d5IGRlZmluZXMgb3V0bGllcnMgYXMgZm9sbG93czoKCjxwcmU+QW4gb3V0bGllciBpcyBhbiBvYnNlcnZhdGlvbiB0aGF0IGxpZXMgYW4gYWJub3JtYWwgZGlzdGFuY2UgZnJvbSBvdGhlciB2YWx1ZXMgaW4gYSByYW5kb20gc2FtcGxlIGZyb20gYSBwb3B1bGF0aW9uLiBJbiBhIHNlbnNlLCB0aGlzIGRlZmluaXRpb24gbGVhdmVzIGl0IHVwIHRvIHRoZSBhbmFseXN0IChvciBhIGNvbnNlbnN1cyBwcm9jZXNzKSB0byBkZWNpZGUgd2hhdCB3aWxsIGJlIGNvbnNpZGVyZWQgYWJub3JtYWwuIEJlZm9yZSBhYm5vcm1hbCBvYnNlcnZhdGlvbnMgY2FuIGJlIHNpbmdsZWQgb3V0LCBpdCBpcyBuZWNlc3NhcnkgdG8gY2hhcmFjdGVyaXplIG5vcm1hbCBvYnNlcnZhdGlvbnMuPC9wcmU+CgpNYW55IGV4YW1wbGVzIG9mIHRoZXNlIG91dGxpZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgc3RhbmRhcmQgYW5hbHl0aWNzIGxpdGVyYXR1cmUgYW5kIGNvbW1vbmx5IHVzZWQgZGF0YXNldHMuICBPbmUgc3VjaCBleGFtcGxlIGFwcGVhcnMgaW4gdGhlIHN0YW5kYXJkIFIgcGFja2FnZSBpbiB0aGUgbXRjYXJzIGRhdGFzZXQuICBJdCBpcyBlYXN5IHRvIHNlZSB0aGUgb3V0bGllciBpbiB0aGlzIHBsb3Q6CgpgYGB7cn0KcGxvdChtdGNhcnMkd3QsIG10Y2FycyRocCwgeGxhYj0iSG9yc2Vwb3dlciIsIHlsYWI9IldlaWdodCIpCmBgYAoKT25lIG5pY2UgdGhpbmcgYWJvdXQgdGhlc2Uga2luZHMgb2YgYWJub3JtYWwgb2JzZXJ2YXRpb25zIGlzIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gbWVhc3VyZSB0aGUgZGVncmVlIHRoYXQgYSBwb2ludCByZXByZXNlbnRzIGFuIG91dGxpZXIuICAKCkNvb2sncyBkaXN0YW5jZSBwcm92aWRlcyBhIG1ldHJpYyB0aGF0IGNhbiBiZSB1c2VkIHRvIHF1YW50aWZ5IG91dGxpZXJzLgoKYGBge3J9Cm1kbCA8LSBsbSh3dH5ocCwgZGF0YT1tdGNhcnMpCmNkIDwtIGNvb2tzLmRpc3RhbmNlKG1kbCkKcGxvdChjZCkKYGBgCklmIHlvdSdyZSBjdXJpb3VzLCB0aGUgb3V0bGllciBpbiB0aGUgYWJvdmUgZGF0YXNldCBpcyBhIE1hc2VyYXRpIEJvcmEgdGhhdCBoYXMgYSB3ZWlnaHQgb2YgMyw1NzAgbGJzIGFuZCAzMzUgZ3Jvc3MgaG9yc2Vwb3dlci4gIEluIG90aGVyIHdvcmRzLCBmb3IgaXQncyB3ZWlnaHQsIGl0IGlzIG5vdCBwb3dlcmZ1bCB3aGVuIGNvbXBhcmVkIHRvIG90aGVyIGNhcnMgaW4gdGhlIHNhbXBsZS4KCiMjIENvbnRleHR1YWwgT3V0bGllcnMKCkluIHRoZWlyIGJvb2sgIkRhdGEgTWluaW5nOiBDb25jZXB0cyBhbmQgVGVjaG5pcXVlcywgM3JkIEVkaXRpb24iIiBieSBNaWNoZWxpbmUgS2FtYmVyLCBKaWF3ZWkgSGFuLCBhbmQgSmlhbiBQZWksIHRoZSBhdXRob3JzIHByb3ZpZGUgYW4gZXh0ZW5kZWQgZGVmaW5pdGlvbiBvZiBvdXRsaWVyczoKCjxwcmU+QW4gb2JqZWN0IGluIGEgZ2l2ZW4gZGF0YSBzZXQgaXMgYSBjb250ZXh0dWFsIG91dGxpZXIgKG9yIGNvbmRpdGlvbmFsIG91dGxpZXIpIGlmIGl0IGRldmlhdGVzIHNpZ25pZmljYW50bHkgd2l0aCByZXNwZWN0IHRvIGEgc3BlY2lmaWMgY29udGV4dCBvZiB0aGUgb2JqZWN0Li4uPC9wcmU+CihTZWN0aW9uIDEyLjcgTWluaW5nIENvbnRleHR1YWwgYW5kIENvbGxlY3RpdmUgT3V0bGllcnMpCgpUaGUga2V5IGhlcmUgaXMgdGhhdCB0aGUgb3V0bGllciBpcyBjb25zaWRlcmVkIHdpdGhpbiBhIGdpdmVuIGNvbnRleHQuICBUbyBpbGx1c3RyYXRlIHRoaXMgcG9pbnQsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZ3JhcGggb2YgdGhlIERvdyBKb25lcyBJbmR1c3RyaWFsIEF2ZXJhZ2UgZm9yIHRoZSBwYXN0IDYgbW9udGhzOgoKIVtEb3cgSm9uZXNdKERKSS5wbmcpCgpJbiB0aGUgYWJvdmUsIHdlIHNlZSBhIGh1Z2UgZGlwIGluIHRoZSBEb3cgYXMgYSByZXN1bHQgb2YgY29uY2VybnMgYWJvdXQgQ09WSUQtMTkuICBJZiB3ZSAiem9vbSBvdXQiIGFuZCBsb29rIGF0IHRoZSBEb3cgc2luY2UgMjAwMSwgd2UgY2FuIHNlZSB0aGF0IHRoZSByZWNlbnQgYW5vbW9saWVzIGluIHRoZSBEb3cgYXJlIGFjdHVhbGx5LCBwcmV0dHkgbWlub3IgY29tcGFyZWQgdG8gb3RoZXIgcG9pbnRzIGluIHRpbWUuCgohW0RvdyBKb25lcyBTaW5jZSAyMDAxXShESklfbG9uZ190ZXJtLnBuZykKCkFzIGRpc3BsYXllZCBpbiB0aGUgdHdvIGV4YW1wbGVzIGFib3ZlLCBvdXRsaWVycyBhcmUgc29tZXdoYXQgc3ViamVjdGl2ZS4KCiMjIEVjb25vbWljIFNob2NrcwoKQW5vdGhlciBjb25jZXB0IHRvIGNvbnNpZGVyIGluIHRoaXMgZGlzY3Vzc2lvbiwgcGFydGljdWxhcmx5IGluIHRoZSBjb250ZXh0IG9mIENPVklELTE5LCBpcyBlY29ub21pYyBzaG9ja3MuICBZYWhvbyBmaW5hbmNlIGRlZmluZXMgZWNvbm9taWMgc2hvY2tzIGFzIGZvbGxvd3M6ICAKCjxwcmU+QW4gZWNvbm9taWMgc2hvY2ssIGFsc28ga25vd24gYXMgYSBtYWNyb2Vjb25vbWljIHNob2NrLCBpcyBhbnkgdW5leHBlY3RlZCBldmVudCB0aGF0IGhhcyBhIGxhcmdlLXNjYWxlLCB1bmV4cGVjdGVkIGltcGFjdCBvbiB0aGUgZWNvbm9teS48L3ByZT4gaHR0cHM6Ly9maW5hbmNlLnlhaG9vLmNvbS9uZXdzL2Vjb25vbWljLXNob2Nrcy1kZWZpbml0aW9uLWV4YW1wbGVzLTIyMTQ1NDM0OS5odG1sCgpTbywgdGhlIHF1ZXN0aW9uIGFyaXNlcywgaXMgYW4gZWNvbm9taWMgc2hvY2sgYW4gb3V0bGllcj8gIEJhc2VkIG9uIHRoZSBwdXJlIGRlZmluaXRpb24gb2YgYW4gb3V0bGllciwgdGhlIGFuc3dlciBpcyB5ZXMuICBJdCBpcyBhbiB1bmV4cGVjdGVkIGV2ZW50IHRoYXQgaGFzIGFuIGVmZmVjdCBvbiB0aGUgZWNvbm9teS4gIEZyZXF1ZW50bHksIHRoZSBlZmZlY3RzIG9mIGVjb25vbWljIHNob2NrcyBldmVudHVhbGx5IGZhZGUgYXdheS4gIFRvIHNlZSBhbiBleGFtcGxlLCBsZXQncyB0YWtlIGEgbG9vayBoaXN0b3JpY2FsIGdyb3NzIGRvbWVzdGljIHByb2R1Y3QgKEdEUCkgZm9yIHRoZSBVbml0ZWQgU3RhdGVzLgoKYGBge3J9CmdkcCA8LSByZWFkLmNzdigiR0RQLmNzdiIsIGhlYWRlcj1UKQpwbG90KGdkcCwgbWFpbj0iVW5pdGVkIFN0YXRlcyBHcm9zcyBEb21lc3RpYyBQcm9kdWN0IiwgeWxhYj0iJEIiKQpgYGAKCkluIDIwMDgtMjAwOSwgdGhlIFVTIGVjb25vbXkgc3VmZmVyZWQgdGhyb3VnaCB0aGUgaG91c2luZyBjcmlzaXMuICAoU2VlIGh0dHBzOi8vd3d3Lndhc2hpbmd0b25wb3N0LmNvbS9idXNpbmVzcy9lY29ub215L2EtZ3VpZGUtdG8tdGhlLWZpbmFuY2lhbC1jcmlzaXMtLTEwLXllYXJzLWxhdGVyLzIwMTgvMDkvMTAvMTE0Yjc2YmEtYWYxMC0xMWU4LWEyMGItNWY0Zjg0NDI5NjY2X3N0b3J5Lmh0bWwpICBUaGUgaW1wYWN0IHRoYXQgY3Jpc2lzIGhhZCBvbiB0aGUgb3ZlcmFsbCBHRFAgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgaXMgY2xlYXJseSB2aXNpYmxlIGluIHRoZSBncmFwaCBhYm92ZS4gIEl0IGlzIGltcG9ydGFudCB0byBub3RlLCBob3dldmVyLCB0aGF0IHRoZSBHRFAgZGlkIHJldHVybiBvbiBpdCdzIHNhbWUgdXB3YXJkIHRyYWplY3RvcnkuICAKCkxldCdzIG5vdyB0aGluayBhYm91dCBDT1ZJRC0xOS4gIEFzIGFic29sdXRlbHkgaG9ycmlibGUgdGhlIHNpdHVhdGlvbiBpcywgdGhlIHVuZGVybHlpbmcgZnVuZGFtZW50YWxzIG9mIG91ciBzb2NpYWwgYW5kIGVjb25vbWljIHN5c3RlbXMgd2lsbCBsYXJnZWx5IGJlIHVuYWZmZWN0ZWQuICBPdXIgaW5mcmFzdHJ1Y3R1cmUgd2lsbCBiZSBwcmV0dHkgbXVjaCB1bmFmZmVjdGVkLCBleGNlcHQgZm9yIHRoZSBzdHJhaW4gb24gb3VyIGhlYWx0aCBjYXJlIHN5c3RlbS4gIEFuZCwgYXMgd2UgaGF2ZSBzZWVuIGluIHBhc3QgZXBpZGVtaWNzIGFuZCBwYW5kZW1pY3MsIHRoYXQgc3RyYWluIHdpbGwgYmUgZmFpcmx5IHNob3J0LWxpdmVkLiAgUGVyaGFwcyB0aGUgbGFyZ2VzdCBpbXBhY3Qgb24gb3VyIGVjb25vbXkgd2lsbCBiZSBpbiBjb25zdW1lciBjb25maWRlbmNlLiAgSG93ZXZlciwgaWYgd2UgdGhpbmsgYWJvdXQgY2hhbGxlbmdlcyB3ZSBoYXZlIHNlZW4gaW4gdGhlIHBhc3QsIG91ciBlY29ub21pYyBzeXN0ZW1zIHNlZW0gdG8gY29tZSByb2FyaW5nIGJhY2sgb25jZSB0aGUgY3Jpc2lzIGlzIG92ZXIuICBUaGF0IGlzIGNsZWFybHkgdmlzaWJsZSBpbiB0aGUgR0RQIHBsb3QgYWJvdmUuICAKCkluIHRlcm1zIG9mIEFJIGFuZCBNYWNoaW5lIExlYXJuaW5nLCBkbyBzaG9ja3MgcHJldmVudCB1cyBmcm9tIGRldmVsb3BpbmcgcHJlZGljdGl2ZSBtb2RlbHMuICBUaGUgYW5zZXIgaXMgY2xlYXJseSBuby4gIFRvIGlsbHVzdHJhdGUgdGhpcyBwb2ludCwgdGFrZSBhIGxvb2sgYXQgYSBtb2RlbCB0aGF0IHdhcyBmaXR0ZWQgdG8gdGhlIEdEUCBkYXRhIGFib3ZlLiAgVGhpcyBpcyBhIHNpbXBsZSBzZWNvbmQgZGVncmVlIHJlZ3Jlc3Npb24gbW9kZWwgZml0dGVkIHRvIHRoZSBoaXN0b3JpY2FsIEdEUCBkYXRhLiAgCgpgYGB7cn0KZ2RwIDwtIHJlYWQuY3N2KCJHRFAuY3N2IiwgaGVhZGVyPVQpCmxpYnJhcnkoZ2dwbG90MikKZ2RwJGlkeCA8LSBzZXEoMSxucm93KGdkcCkpCmdkcCRpZHgyIDwtIGdkcCRpZHheMgpnZHBfbWRsIDwtIGxtKEdEUH5pZHgyLCBkYXRhPWdkcCkKZ2RwJHByZWQgPC0gcHJlZGljdChnZHBfbWRsLCBuZXdfZGF0YT1nZHAkaWR4MikKcCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9saW5lKGRhdGE9Z2RwLCBhZXMoeCA9IGlkeCwgeSA9IEdEUCksIGNvbG9yID0gImJsdWUiKSArCiAgZ2VvbV9saW5lKGRhdGE9Z2RwLCBhZXMoeCA9IGlkeCwgeSA9IHByZWQpLCBjb2xvciA9ICJyZWQiKQpwCgpgYGAKCldlIGNhbiBzZWUgdGhhdCB0aGUgbW9kZWwgaXMgb2ZmIGEgYml0IGR1ZSB0byB0aGUgc2hvY2suICBIb3dldmVyLCB0aGVyZSBjbGVhcmx5IGlzIHByZWRpY3RpdmUgdmFsdWUgaW4gdGhlIG1vZGVsIGFib3ZlLiAgVG8gcXVhbnRpZnkgdGhhdCwgd2UgY2FuIHNlZSB0aGF0IHRoZSAkUl4yJCB2YWx1ZSBmb3IgdGhlIG1vZGVsLCB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgdmFyaWFibGlsdHkgZXhwbGFpbmVkIGJ5IHRoZSBtb2RlbCwgaXMgYHIgc3VtbWFyeShnZHBfbWRsKSRyLnNxdWFyZWRgLgoKIyBDb25jbHVzaW9uCgpTaG9ja3MgbGlrZSB0aGUgQ09WSUQtMTkgcGFuZGVtaWMgY2FuIGhhdmUgYSBwcm9mb3VuZCBpbXBhY3Qgb24gaW5kaXZpZHVhbHMsIGFuZCBhIHN0cm9uZyBzaG9ydCB0ZXJtIGltcGFjdCBvbiBzb2NpZXR5LiBUaGUgYnVyZGVuIHRoYXQgdGhlIGN1cnJlbnQgc2l0dWF0aW9uIGlzIGhhdmluZyBvbiBvdXIgaGVhbHRoIGNhcmUgc3lzdGVtLCBvdXIgc29jaWV0eSwgYW5kIGluZGl2aWR1YWxzIGNhbm5vdCBiZSBvdmVyc3RhdGVkLiAgVGhhdCBzYWlkLCBpdCBpcyB3b3J0aHdoaWxlIHRvIHJlbWVtYmVyIHRoYXQgdGhlIGZ1bmRhbWVudGFscyBvZiBlY29ub21pYyBzeXN0ZW1zLCBpbmNsdWRpbmcgb3VyIGluZnJhc3RydWN0dXJlIHdpbGwgYmUgbGFyZ2VseSB1bmFmZmVjdGVkLiAgCgpUaGUgcXVlc3Rpb24gdGhhdCBtYW55IHBlb3BsZSBoYXZlIGlzIGp1c3QgaG93IG11Y2ggb2YgYW4gaW1wYWN0IHdpbGwgQ09WSUQtMTkgaGF2ZSBvbiBVUyBHRFAuICBTb21lIGFydGljbGVzIHN1Z2dlc3QgdGhhdCBpdCBjb3VsZCBiZSBhcm91bmQgNy04JSwgYWxvbmcgdGhlIGxpbmVzIG9mIHRoZSAyMDA4LTIwMDkgaG91c2luZyBjcmlzaXMsIGluY2x1ZGluZyB0aGlzIHBvc3QgZnJvbSBNYXJjaCAyMSwgMjAyMC4gCgpodHRwczovL3d3dy5mb3JiZXMuY29tL3NpdGVzL3BldGVyY29oYW4vMjAyMC8wMy8yMS9jb3ZpZC0xOXMtd29yc3QtY2FzZS0xMDYtam9ibGVzcy1yYXRlLTE1LXRyaWxsaW9uLWdkcC1kcm9wLyMzYzg1MTMwOTEwYTJwYW5kCgpPdGhlciBhcnRpY2xlcyBhcmUgbGVzcyBvcHRpbWlzdGljIGxpa2UgdGhpcyBvbmUgZnJvbSBNY0tpbm5lc3ksIGJ1dCBzdGlsbCBwbGFjZSB0aGUgaW1wYWN0IGF0IGFyb3VuZCB0aGF0IG9mIHRoZSAyMDA4LTIwMDkgZG93bnR1cm4uCgpodHRwczovL3d3dy5tY2tpbnNleS5jb20vYnVzaW5lc3MtZnVuY3Rpb25zL3Jpc2svb3VyLWluc2lnaHRzL2NvdmlkLTE5LWltcGxpY2F0aW9ucy1mb3ItYnVzaW5lc3MKCgpXZSBoYXZlIHNlZW4gbGFyZ2UsIGFuZCBtb3JlIHByb2xvbmdlZCBpbXBhY3RzIHRvIG91ciBzb2NpZXR5IGluIHRoZSBwYXN0LiAgRGVzcGl0ZSB0aG9zZSBsYXJnZSwgYW5kIHByb2xvbmdlZCBjaGFsbGVuZ2VzLCBvdXIgZWNvbm9taWMgc3lzdGVtcyBoYXZlIGJlZW4gYWJsZSB0byByZWNvdmVyLiAgSW4gdGVybXMgb2YgYnVpbGRpbmcgYW5hbHl0aWMgbW9kZWxzIHRoYXQgYXJlIGFibGUgdG8gYWNjb21pZGF0ZSBvdXRsaWVycywgdGhhdCBpcyBhIGNvcmUgY29tcGV0ZW5jeSBpbiB0aGUgZGlzY2lwbGluZSBvZiBhbmFseXRpY3MuICBXZSBoYXZlIG51bWVyb3VzIHRvb2xzIHRvIGlkZW50aWZ5IGFub21vbG91cyBkYXRhLCBhbmQgdG8gaGFuZGxlIGl0IGJhc2VkIG9uIHRoZSBjb250ZXh0IHRoYXQgaXQgYXJpc2VzLg==