Kurt Schulzke, JD, CPA, CFE

I. Introduction

What would the Securities & Exchange Commission do if Home Depot reported as its 2020 “net income” only its revenues (not expenses), from only its best eight months, in only its best 18 states? What if we replace “Home Depot” with “CDC”? Which organization should be held to higher accounting and disclosure standards? Which has more power to damage the United States with misleading information?

In 2020, the CDC’s budget ballooned from $8 billion to roughly $46 billion, all in response to perceived Covid-19 mortality. How many deaths has Covid-19 caused? Causal analysis is always a tricky business,1 but pinpointing cause of death is notoriously error-prone,2 more so when a reported cause is used to solicit billions in funding. Indeed, the CDC emphasizes the funding connection twice on the first page of its 65-page death certificate handbook.3 In support of its remarkable budget increase, and claiming concern that death-certificate-based counts were under-counting Covid-19 deaths, in fall 2020, the CDC began estimating “excess” deaths as a proxy for Covid-19 deaths.

To be clear, the CDC’s estimate is not data. It is an estimate, which means it is one judgmental interpretation of data among multiple possible interpretations. Is the CDC’s estimate realistic? To find out, we will explore the CDC’s data and evaluate the model they used to make their estimate.

The key high-level questions are these: What is the plausible range of “excess” deaths in a relevant place over a relevant time period? What share of excess deaths might be fairly attributed to Covid-19? And how transparently does the CDC present the range and share to readers? We offer some answers to these questions in Part V. We’ll keep things simple and (mostly) visual, avoiding complex statistical tools.

At the outset, we note that the SEC’s fundamental “anti-fraud” standard, Rule 10b-5, declares it illegal, in buying or selling stocks, to (a) employ any device, scheme, or artifice to defraud, (b) mislead readers by statements or omissions, or (c) engage in any act, practice, or course of business which operates as a fraud or deceit upon anyone.

Let’s see how the CDC measures up to stock market disclosure requirements. In doing so, we’ll generally follow the AICPA standard for auditing management estimates, SAS 143, which admonishes that the importance of professional skepticism:

…increases when accounting estimates are subject to a greater degree of estimation uncertainty or are affected to a greater degree by complexity, subjectivity, or other inherent risk factors. Similarly, the exercise of professional skepticism is important when there is greater susceptibility to misstatement due to management bias or fraud.4

In this connection, we should also consider the “fraud triangle,” which holds that opportunities, incentives, and easily accessible rationalizations heighten fraud risk. All three legs of the triangle are abundantly evident here.

Before we engage the CDC’s model, we’ll peek at the “raw” data (scaled to per thousand population) while keeping in mind that it is curated by the NCHS, a division of the CDC. We’ll assume that the data are what the CDC says they are: unvarnished, reported deaths data. An audit would be required to verify the validity of this assumption. For context, the U.S. crude annual mortality rate has recently averaged 8-9 nationally, ranging between 12.5 (WV) and 9 (Alaska). And, according to the CDC, the 1918 flu killed 675,000 out of 103 million Americans (6.6 DPT).

Keep in mind that we are looking at total deaths data, not Covid-19 deaths data. While the popular narrative makes it difficult to remember this, even the CDC admits in their Technical Notes that they do not know what share of “excess” deaths can be blamed on Covid-19. This means that they cannot say how many people have truly died from Covid-19. No one can. Not the WHO, not Johns Hopkins U., not Emory U., not Georgia Tech. No one knows. For all we know, the Covid-19 narrative may be masking other, more deadly causes.

Figure 1 gets us started. It visualizes weekly total U.S. DPT from all causes and all jurisdictions since 2014. The CDC says that the data for pre-2020 years is “final” and that 2020-21 data are “provisional,” though the “all cause” deaths figures (from most states) appear pretty stable after about four weeks.

ByStates1420(c("United States"), c("Fig. 1.1"), c("2014-01-04"), c("2020-12-20")) +
geom_hline(yintercept = 0.2071215, size = .6, color = "green4", alpha = .5) +
  labs(title = "Weekly All-Cause Deaths per Thousand", subtitle = "Jan 2014 - Dec 19, 2020", y = "Deaths per Thousand Pop", x = "Month & Year", caption = "Source: CDC/NCHS; U.S. Census. \n 2020 population is assumed equal to 2019 U.S. census estimate.", tag = c("Fig. 1"))

Even at this altitude, the 2020 data paint a strange picture compared to prior years. The horizontal green line marks the high-point of the 2018 flu season. The y-axis scale runs from 0.10 to 0.95 deaths per thousand (DPT) to accommodate spring 2020 spikes in the Tri-state area (NY, CT, NJ). These will appear later. The 2019 and 2020 highs stand out, respectively, as low and high, but why and by how much? We take a closer look in Figure 2.1, which shrinks the y-axis (vertical) range and drops the 2014 data. This brings smaller patterns into view.

Fig_2.1 <- suppressMessages(print(ByStates1420(c("United States"), c("Fig. 2.1"), c("2014-12-31"), c("2020-12-20")) +
  scale_y_continuous(breaks = seq(0.10,0.25,0.025),limits = c(0.10,0.25)) + 
  scale_x_date(date_breaks = "2 months", date_labels = "%b %y") +
  geom_hline(yintercept = 0.2071215, size = .5, color = "green4", alpha = .5) +
  labs(title = "Weekly All-Cause Deaths per Thousand - U.S.", subtitle = "Oct 2014 - Dec 19 2020", y = "Deaths per Thousand Pop", x = "Month & Year", caption = "Source: CDC/NCHS; U.S. Census. \n 2020 population is assumed equal to 2019 U.S. census estimate.", tag = c("Fig. 2.1"))))

Figure 2.1 shows a spring 2020 spike in pink. At its apex, it rises by roughly 0.025 DPT above the 2018 peak (blue). A 4-week-long peak of 0.025 adds 0.10 deaths or about 1 percent of the annual total of 8-9 DTP. Spikes in 2015 and 2018 were followed by down years. If this pattern holds, we’ll see the 2020 peak followed by lows in 2021-22. That is, unless – as cancer diagnosis data suggest – Covid-19 interventions drive up deaths from other causes.

In addition, 2019 missed the typical January - March spike. Instead, deaths plateaued. Later, after the summer 2019 trough, they climbed Aug to Jan, then plateaued again – reminiscent of 2016 – in January and February 2020, before spiking well above the 2018 peak between March 28 and April 25. Then they dropped, with an after-shock in mid July to early August, before falling again until mid-October. In short, lots of ups and downs but no 2020 summer trough. This is all at the national level.

How does the picture change if we exclude the Tri-state area? Figure 2.2 tells the tail, as it were. Focus on the flat green line (representing the 2018 peak in flu deaths) and the squiggly purple and pink ones.

Fig_2.2 <- suppressMessages(print(ByStates1420nin(c("United States", "New York City", "New York", "Connecticut", "New Jersey"), c("2014-01-04"), c("2020-12-20")) +
  scale_y_continuous(breaks = seq(0.10,0.25,0.025),limits = c(0.10,0.25)) + 
  scale_x_date(date_breaks = "2 months", date_labels = "%b %y") +
  geom_hline(yintercept = 0.2071215, size = .5, color = "green4", alpha = .5) +
  labs(title = "Weekly All-Cause DPT - U.S. less Tri-state area", subtitle = "Oct 2014 - Dec 19 2020", y = "Deaths per Thousand Pop", x = "Month & Year", caption = "Source: CDC/NCHS; U.S. Census. \n 2020 population is assumed equal to 2019 U.S. census estimate.", tag = c("Fig. 2.2"))))

Removing the Tri-state drops the national spring 2020 peak below January 2018. The line then morphs into a serpentine spring-summer-fall that would make Hogwarts and Loch Ness proud. It’s almost as if the peak that no-showed in January 2019 was “apparated” into spring and summer 2020. Maybe, outside of the first-hit Tri-state – which spiked the 2020 national high over the (green) 2018 flu line – the spring 2020 school and business closures that occurred in many states (e.g., Georgia) merely smoothed deaths into the summer. We can search for the serpent in the state data, though this won’t guarantee that the data can be trusted. First, let’s talk modeling excess deaths.

Excess deaths are estimated, not counted. They are a function of both the estimator’s subjective judgments and objective data. It is widely accepted that estimated excess deaths equals reported deaths from all causes in excess of estimated “expected” deaths over a given time period in a chosen geographical area. In theory, excess deaths may result from some novel cause or causes like, e.g., Covid-19 and societal responses to it. However, the CDC states that Covid-19 may not be the cause of any of the CDC’s estimated excess deaths.5 Similarly, an excess of zero or less is some evidence that no novel cause is killing large numbers of people who would not die anyway. So the debate centers on the meaning and estimation of the plausible range of expected deaths, the proper time and geography subsets to use for comparing expected to actual deaths, how to present the comparison, and what share of the excess, if any, to attribute to particular plausible causes (e.g., Covid-10).

In its October 23, 2020 Morbidity and Mortality Weekly Report (MMWR), the CDC published 299,028 as its estimate of nationwide excess deaths, from Feb 1 to Oct 3, 2020. It attributed ~2/3 of these (198,081) to Covid-19.6 This 198,081 number, apparently based largely on PCR test positives, may be significantly overstated, particularly in light of the WHO’s Jan 20, 2021 Notice warning, contrary to longstanding CDC Covid-19 dogma, that a single PCR test positive alone does not justify a “Covid-19” diagnosis.7

That said, in the MMWR, the CDC states that excess deaths “have been used to estimate the impact of public health pandemics or disasters, particularly when there are questions about underascertainment of deaths directly attributable to a given event or cause.” This implies, misleadingly, that excess deaths are not also useful for exposing suspected over-counts.

In any case, after updating for data available through mid-January 2021, the CDC’s gross estimated excess for the Feb 1 - Oct 3, 2020 period is either 311K or 206K, depending on which expected death benchmark (mean or upper-bound) is used. If we assume that the CDC’s 2/3 multiplier holds for all numbers of excess deaths, these would translate to 208K or 137K gross estimated Covid-19 deaths.

filter(Wtd_CDC_C19_Ex, !Code == "US" & `Week Ending Date` > "2020-01-31" & `Week Ending Date` < "2020-10-04") %>% 
  group_by() %>% 
  summarise(Excess = sum(`Excess Higher Estimate`)*2/3)

filter(Wtd_CDC_C19_Ex, !Code == "US" & `Week Ending Date` > "2020-01-31" & `Week Ending Date` < "2020-10-04") %>% 
  group_by() %>% 
  summarise(Excess = sum(`Excess Lower Estimate`)*2/3)

But this 8-month, gross national estimate, based on multiple by-state-by-week statistical models,8 is misleading. This is partly because it arbitrarily cherry-picks eight months instead of twelve. And not just any eight months. Starting the count just as deaths were about to spike in the Tri-state is like Home Depot reporting profits for only its best eight months. It also implies that a nationwide estimate is meaningful when, because of diversity among states and regions, it is not.

Yet questions regarding the CDC estimate – involving binning, netting, algorithm choice, estimation uncertainty, and training data – run much deeper. And the net impact of Covid-19 where you live is probably much less than the CDC’s national estimate suggests. In most states, according to the CDC’s own “provisional” numbers, the net impact of Covid-19 for the year ended September 30, 2020 was zero or less, if we use the lower side of the CDC’s estimate. What? The CDC’s estimate is two-sided, you ask? Yes, of course. More than two-sided. This is true of every estimate. Numbers can be spun in many directions. Estimates and their interpretation are as much art as science, and estimates cover a range of possibilities. In the CDC’s case, the range is very wide. Let’s consider how and why.

II. Questions & choices

The CDC’s model relies in large part on five subjective choices: 1. time and geography segments or “bins” for prediction and reporting, 2. whether to ignore deficits or net them against surpluses, 3. what to say about estimation uncertainty (e.g., report high and low point estimates or probability distributions over the plausible range), 4. which algorithm or other tool to use in predicting (i.e., “modeling”) expected deaths, and 5. which historical data to use for “training” the model. These choices significantly impact outcomes.

Overshadowing these modeling choices are visceral value-based questions: What is the appropriate “loss function” for evaluating possible regulatory responses to novel causes of mortality like Covid-19? In other words, what should society be trying to maximize or minimize with regulatory choices? Do we want to maximize the joys of association with other human beings or minimize exposure to a single risk (e.g., contracting Covid-19)?

We’ll comment briefly on each of these issues in the sections that follow.

A. Netting & binning

The CDC’s excess deaths model (we’ll call them “surplus” deaths) predicts how many people will die in each week of the year in each state. These weekly-by-state predictions are then compared to reported deaths. If the reported deaths exceed predicted deaths in a given week, that excess counts toward surplus deaths. However, any deficit (i.e., where predicted deaths exceed reported) is counted as zero.9 The CDC then reports the sum of these weekly, gross surpluses as U.S. excess deaths.

Let’s use Georgia as an example. Figure 3, copied from the CDC’s website, illustrates the impact of the CDC’s netting and binning choices on Georgia’s surplus deaths. The blue vertical bars show reported deaths adjusted for the CDC’s assumptions about incomplete reporting. The brown line visualizes the mean CDC expected deaths produced by the model. The differences between the brown line and the top of the blue bars–in yellow highlight–equals the deficit or surplus deaths per week, but only if we use the mean expected-death threshold. If the CDC’s dashboard allowed us to use the upper-bound expected deaths, the brown line would rise and the yellow zone would expand considerably.

Fig. 3

Source: <https://www.cdc.gov/nchs/nvss/vsrr/covid19/excess_deaths.htm>

The mean-based deficits highlighted in yellow were ignored by the CDC’s national estimate of 198K Covid-19 deaths. Ignoring the yellow zone inflates estimated Covid-19 deaths, just as if Home Depot were to report its gross revenues (without deducting expenses) as net income. To illustrate the impact of this one-sided accounting, gross Georgia excess deaths (ignoring the yellow zone) for the two years, 2019-2020, using the CDC’s mean expected deaths would be 14,144, while the net (counting the yellow zone) would be 2,156 less, or 11,988:

filter(Wtd_CDC_C19_Ex, State %in% c("Georgia") & (Year == "2020" | Year == "2019")) %>%   group_by() %>% 
  summarise(sum(`Excess Higher Estimate`))

filter(Wtd_CDC_C19_Ex, State %in% c("Georgia") & (Year == "2020" | Year == "2019")) %>%   group_by() %>% 
  summarise(sum(`Observed Number` - `Average Expected Count`))

By contrast, if measured against the CDC’s upper bound expected deaths, the CDC’s estimate of Georgia’s gross surplus (excess) deaths would be 8,997, with a net deficit of 185:

filter(Wtd_CDC_C19_Ex, State %in% c("Georgia") & (Year == "2020" | Year == "2019")) %>%   group_by() %>% 
  summarise(sum(`Excess Lower Estimate`))

filter(Wtd_CDC_C19_Ex, State %in% c("Georgia") & (Year == "2020" | Year == "2019")) %>%   group_by() %>% 
  summarise(sum(`Observed Number`-`Upper Bound Threshold`))

The CDC attempts to rationalize this surplus-only accounting by arguing that some weekly deficits in some states may eventually flip to surpluses because of “incomplete” reporting. This argument does not pass the straight-face test. Reporting is always incomplete and every organization has accounting cutoffs. Furthermore, data scientists routinely model missing or incomplete data, especially in the health sciences. It’s data science 101, as the CDC well knows. The CDC’s own model “weights” weekly by-state reported deaths by their predicted incompleteness. That the CDC models these reporting lags means they can also model the deficits.

And let’s not forget that the numbers used by the CDC to recommend nationwide lock downs in the spring of 2020 were beyond “incomplete”: they were largely imaginary. So while deficits for some slow jurisdictions (e.g., North Carolina) might warrant “deferred netting,” permanently hiding the deficits finds no scientific justification.

At the national level, by netting estimated deficits against estimated surpluses10 and reporting the entire Sep 30, 2020 year (instead of just eight months), the CDC’s 299K mean-based estimate drops to about 60K.11 Why didn’t the CDC bin annually? One possible motive is suggested by the R package – surveillance – used by the CDC to develop its model.12 But annual binning is not the only option. Figure 2 suggests that total deaths are seasonal, cyclical, and gradually trending upward, naturally cycling through ever-higher highs every 2-3 years. Thus, biennial or triennial bins might be more informative. Whatever the binning window, deficits must be counted.

Beyond netting and time binning, geographical binning also affects the reported surplus. It does so at two levels: prediction and reporting. First, the CDC’s state-based prediction model produces surpluses that are 25% higher than they would be if the model were run at the national level. Second, putting the entire U.S. into a single geographic bucket obscures important regional and state-level differences. For example, using annual binning (9-30 YE) and dropping the Tri-state area from the national estimate reduces national surplus deaths to ~13K. Tri-state added ~41K surplus deaths to the national total. We’ll look more closely at state and regional differences in Part IV.

B. Uncertainty

Two issues are of concern here. First, the CDC MMWR claims an impossible degree of estimating precision, reporting its national (and state) estimates to single deaths, e.g., “299,028,” instead of rounding, e.g., “299K,” or stating a range, “50K-299K.” Given the many subjective assumptions involved, such precision is misleading. While the CDC explains most of its assumptions and notes that its model produces “expected” and “upper bound” point estimates,13 it nevertheless promotes the illusion of precision through its public-facing media like the MMWR. This conveys the false impression that the estimate is more certain than it is. Modeling is a mix of subjective judgment and objective science. The CDC should make this clear.

Second, aside from inflated claims of precision, point estimates – which is all the CDC offers on its dashboard – are inadequate to support responsible policy. Are 10-20K excess deaths more or less probable than 190-200K? While the notes refer to upper-bound and mean expected deaths, the dashboard (see Fig. 3, brown line) shows only the mean value and prevents readers from accessing the upper-bound.

The notes say that the model relies on the historical mean (the “expected value”, in statistical terms) for each MMWR week to establish the expectation for the current week’s deaths. Thus, every week in every state gets it’s own little model. It’s not clear how many data points feed into each weekly model, but – with only five years to pick from – there might be only five (2015-2019). For illustrative purposes, let’s look at those five (and their means) for New York City and Nebraska in week 15.

# Create overlaid histograms with means
# Pull the data
pdata <- filter(pcap_long, Juris %in% c("New York City", "Nebraska") & Cause %in% c("All") & `MMWR Week` %in% c("15") & Year %nin% c("2014","2020", "2021")) %>% 
  select(Juris, Year, Deaths, DeathsPM)
pdata

pdata %>% 
  group_by(Juris) %>% 
  summarise(Mean = mean(Deaths),
            DPTmu = mean(DeathsPM))
NA

Of these numbers, which deserves to be the chosen, “expected” one in Nebraska and NYC in 2020 Week 15? Statistically speaking, none of them. That’s right: None of these numbers was individually probable at all because probability attaches only to ranges, not to point-estimates. For the record, here are the reported Week 15 results:

filter(pcap_long, Juris %in% c("New York City", "Nebraska") & Cause %in% c("All") & `MMWR Week` %in% c("15") & Year %in% c("2020")) %>% 
  select(Juris, Year, Deaths, DeathsPM)
NA

NYC’s reported 2020 7,860 deaths (0.942 DPT) were 7.4 times the 2015-19 mean, 1060 (0.126 DPT), but Nebraska’s reported 343 (0.177 DPT) came remarkably close to its mean, 335 (0.176 DPT). Yet, prospectively, none of the historical numbers or their mean should carry any more weight than the others in establishing the expectation that defines an “excess.” And why limit the benchmarking period to the past five years? Why not ten or twenty? Why not go back to the 1918 flu, which killed 6.6 DPT? There’s no science to the choice; it is completely arbitrary and should be decided through open debate among elected representatives, not by cloistered, unaccountable data modelers.

For a different perspective on the relative plausibility of the CDC’s mean and upper-bound, consider Figure 4.

ggplot(data = filter(GA_CDCvDPH, `MMWR Week` %in% c(1:52)), aes(x = `MMWR Week`, y = Deaths/10600, group = Source, color = Source)) +
  geom_line() + 
  scale_x_discrete(breaks = seq(0,52,2)) +
  scale_y_continuous(breaks = seq(-.10,.10,.01)) +
  theme_minimal() +
  theme(axis.text.x = element_text(size = 7, angle = 0, hjust = 0), plot.caption = element_text(size = 7), plot.tag = element_text(size = 9), plot.margin = margin(.3, .3, .3, .3, "cm")) +
  labs(title = "Georgia Covid-19 vs. CDC upper-bound excess (DPT)", subtitle = "2020 MMWR Weeks 1-52", y = "Deaths Per Thousand", x = "MMWR Week", tag = "Fig. 4", caption = "Sources: CDC; Georgia DPH; www2.census.gov \n 'GADPH' = Deaths reported by GA DPH as Covid-19 deaths \n 'CDC' = Excess of deaths from all causes over CDC upper-bound expected deaths")

Figure 4 shows a close correlation, in weeks 5-48, between Georgia’s reported Covid-19 deaths (classified as such based primarily on positive PCR test results) and the CDC’s modeled, low-end excess deaths estimate (based on the CDC’s upper-bound expected deaths). If we assume the accuracy of Georgia’s PCR-identified Covid-19 deaths and that all excess deaths were caused by Covid-19,14 this correlation suggests that the CDC’s upper-bound expectation is much closer to reality than the mean shown on the CDC dashboard. This points to net excess deaths (from all causes, for the 9-30 year) centered on 19K and 60K for the U.S. without and with Tri-state, respectively.


# Without Tri-state
filter(Ex20wt, Code %nin% c("US", "NYC", "NJ", "NY", "CT")) %>% 
  group_by() %>% 
summarise(Up_Ex_noTri = sum(SmallEx),
          Up_Ex_noTri_DPT = sum(SmallEx)/328e3)

# With Tri-state
filter(Ex20wt, Code %nin% c("US")) %>% 
  group_by() %>% 
summarise(Up_Ex_All = sum(SmallEx),
          Up_Ex_All_DPT = sum(SmallEx)/328e3)
NA

In summary, the inherent uncertainty of these estimates demands more clarity and transparency. We need the full distribution of probabilities over plausible values and the assumptions that support them. We also need an open debate on what they all mean. Modern data science offers multiple tools to make this happen. One of the best is Bayesian networks, about which I have previously written in the Covid-19 context. When so much is at stake for so many, there is every reason to treat uncertainty with the highest degree of data professionalism and transparency. Most importatly, those who make this fateful decision should be held fully accountable, in every sense of the term, to the stakeholders affected by it. This is corporate governance 101.

C. Loss function

Whatever the model, the user must decide how many deaths are too many. What number of deaths requires policy interventions like business closures, social distancing, masks, or vaccination? The CDC’s own excess deaths model points to ten deaths per state per week as the lower bound. The Technical Notes state that weekly counts “between 1 and 9 are suppressed.”15 In other words, nine or fewer deaths are not tracked at all by the CDC. This suggests that the CDC believes that less than ten deaths per state per week should not impact public policy. Another benchmark might be the 1918-19 flu pandemic, with an estimated toll of 6.6 DPT. Through September 30, 2020, the CDC’s own 200K gross, mean-based estimate equated to only 0.60 DPT. After netting, the upper-bound based estimate was 0.18 (0.06) with (without) Tri-state.

This is not to say that ten is certainly the right threshold but merely that there is a number, ten or higher per week per state, below which government intervention is over-kill. The threshold is a value judgment related to an equally judgmental loss function that should balance or “net” costs and benefits.16 Isolating a nursing home patient may prevent a Covid-19 infection at the expense of inducing severe depression or suicide. Shuttering restaurants and concerts may reduce Covid-19 deaths while killing restaurant operators and musicians by starvation and dramatically reducing the quality of life for millions. Oxford epidemiologist Sunetra Gupta calls this a violation of the “social contract:”17

Why don’t we do this for the flu? What’s the contract here? … We want schools to remain open, we want people to flourish, we want inequality not to get any worse. We want the arts… What are we alive for? We put all of these things on a plane … and we say, ‘Okay, we’re going to tolerate this level of disease in the population. It will kill some people. We will try and protect them.’ We just do our best within that context, within those boundaries to try and make it all work." I think that’s the social contract … and that’s what’s being ignored."

How do 0.06 to 0.85 deaths per thousand fit into the social contract? Where do you draw the line?

D. Algorithm

The CDC uses the Farrington algorithm to model expected deaths but does not identify alternatives or compare Farrington to them.18 Schumacher et al, cited in the CDC’s Technical Notes, say that Farrington “only performs one time-point detection” of outbreaks.19 In order to fully and fairly evaluate the model, we need to see the code. The CDC should publish its R code and explain why the Farrington method is suitable at all and why it is better than alternatives.

E. Training Data

Like all models, the CDC’s excess deaths model was “trained” on historical data. However, it’s unclear which data the CDC used. The Technical Notes say both “2013-present” and “2015-2019” but provide no link to the data itself. We need access to the data. We also need access to data going back at least to 1918 to cross-check the appropriateness of limiting the model’s historical knowledge to just the last five years.

III. Data & Code

The Part IV analysis20 – primarily in the form of visualizations and commentary – focuses on three bodies of data: 1. U.S. mortality from all causes by age, time, and place (NCHS),21 2. Excess Deaths Associated with Covid-19 (NCHS),22 and 3. a Covid-19 tracking spreadsheet produced by the Georgia Department of Public Health. Population denominators for per-thousand figures and, for cross-validation, annual deaths, are from the U.S. Census.23

The code used to wrangle and transform the data appears in the Appendix. All coding was done in R Studio using tidyverse24 and other R packages identified in the first code chunk. The code can be hidden or revealed by toggling the Code button in the top right corner of this html document and before each code chunk. The full R Studio .Rmd file can also be downloaded through the same button. I provide the code, submit to the MIT open source license, to encourage others to extend the analysis.

IV. Analysis

In Part IV, we’ll look more closely at deaths by time period and jurisdiction using simple visualizations. New York City (NYC) is treated as a separate state, so New York state (NY) excludes NYC.

Parts IV. A-B deal with total deaths per thousand, without regard to modeling the excess. Part IV.C digs directly into the CDC excess deaths model and data table. In Parts A-C, we see that 2020 mortality in the U.S. varied by state, region, and time periods mostly inside narrow bands, with the Tri-state area being the far-out exception. In most places, in most weeks, 2020 deaths from all causes differed from 2014-2019 by less than 0.10 DPT. Within this range, several regional patterns are distinguishable, with the northeastern United States clearly standing out in terms of maximum weekly DPT. The table below sorts 2020 reported weekly DPT (which the table calls “DeathsPM”) from high to low. Only four of the top 50 weekly scores – in MS, LA, and TN – are located south of Washington, D.C. (38 deg. north latitude).

filter(pcap_long, Cause == "All" & !Juris == "United States" & Year == "2020") %>%
  select(c(1,4,7,10)) %>% 
  arrange(-DeathsPM)

A. By state & region

1. U.S.

Figure 1, discussed in Part I, plots the weekly nationwide DPT, January 2014 to mid-December 2020. A rough measure of the difference between 2020 and prior years is the distance or “delta” between the high weekly DPTs, 2018 vs 2020 and 2019 vs 2020. These can be visually evaluated or calculated directly. In Figure 1, these are, respectively, ~ 0.035 and ~ 0.05 DPT. The plots that follow drill down on specific regions and states, north-to-south and east-to-west.

2. NE: NY, NYC, NJ, CT

We begin with NYC (Fig. 5). Boasting an estimated 2019 population of 8.4 million, about 2.2 million less than Georgia, NYC reached its 2020 DPT high of ~0.94 DPT in Week 15, far surpassing peaks in 2018 (0.15) and 2019 (0.16). The 2018/20 delta of 0.79 per thousand is 22.6 times the overall 2018/20 U.S. delta that includes the NYC data.

NYC <- ByStates1420(c("New York City"), c("Fig. 5"), c("2014-01-10"), c("2020-12-20"))
NYC

Fig. 6 places NYC in its broader regional context. Again, NYC stands out, though other NE players (especially NJ) make a strong showing. NY state and NJ were rising above the 2018 peak, at the end of December.

ByStates1420(c("New York City", "New York", "New Jersey", "Connecticut"), c("Fig. 6"), c("2014-01-10"), c("2020-12-20"))

3. Mid Atlantic

A bit further south, in Figure 7, MD and PA show 2018/20 deltas of ~ 0.05. VA, with a negligible delta, is elevated compared to 2018 but not in comparison to MD and PA, which were climbing into late December. The late drop in NC reflects slow reporting.

ByStates1420(c("Maryland", "Pennsylvania", "Virginia", "North Carolina"), c("Fig. 7"), c("2014-01-10"), c("2020-12-20"))

4. SE: GA, FL, SC, TN

Moving into SEC territory, the Fig. 8 y-axis shrinks and shifts downward. In the selected states, the deltas max out at ~0.04 per thousand. In contrast to the NE, GA and SC show two relatively minor but distinct highs in spring and late summer. FL and TN are climbing into December, while the others meander or fall (GA). The trailing volatility in SC is suspicious.

ByStates1420(c("Georgia", "Florida", "South Carolina", "Tennessee"), c("Fig. 8"), c("2014-01-10"), c("2020-12-20"))

5. Midwest: MI, IL, OH, IN

In the Midwest, Figure 9, MI busts the curve (and stretches the y-axis), mimicking NJ with a 2018/20 delta of ~0.20. IN and OH had no or low deltas, with IL sporting ~0.025. All four states were rising into November, but fell in December.

ByStates1420(c("Michigan", "Illinois", "Ohio", "Indiana"), c("Fig. 9"), c("2014-01-10"), c("2020-12-20"))

7. Northern Plains

Lots of late-fall runs on the northern plains were followed by dives, where roughly no deltas appeared until mid-Octoberish. All four states began falling in late November. The SD drop is corroborated by the SD Department of Health Covid-19 Dashboard.

ByStates1420(c("South Dakota", "North Dakota", "Montana", "Nebraska"), c("Fig. 10"), c("2014-01-10"), c("2020-12-20"))

8. Rockies: UT, CO, AZ, NV

Fig. 11 shows a bit of action in CO, ID, and WY, with little to show in UT which, nevertheless, bared some flare in November. By late December, all are falling and miniscule compared to the Tri-state.

ByStates1420(c("Utah", "Colorado", "Idaho", "Wyoming"), c("Fig. 11"), c("2014-01-10"), c("2020-12-20"))

9. Southwest: NM, AZ, CA, NV

In the SW (Fig. 12), only AZ had a 2018/20 delta to speak of, at ~ 0.05. By late December, NV and NM were falling, with CA and AZ rising, though still nothing compared to territory above the 38th parallel.

ByStates1420(c("New Mexico", "Arizona", "California", "Nevada"), c("Fig. 12"), c("2014-01-10"), c("2020-12-20"))

10. Pac Northwest

In Figure 13, Oregon, and Washington show deficits with respect to their high-water mark in 2017 but are on par with 2019. Idaho and California were included because of geographical proximity (far northern CA is really Pac NW). ID made a late run but stumbles by late November.

ByStates1420(c("Washington", "Oregon", "Idaho", "California"), c("Fig. 13"), c("2014-01-10"), c("2020-12-20"))

B. Layered years

Layered smooth-line plots25 offer a different view of state DPT deltas. Faceting the plots facilitates state-to-state comparisons. Interpret these plots with caution because 1. the y-axes are very narrow; those hills and spikes typically reach no more than 0.10 DPT over the lows; 2. the y-axes are different for every panel; and 3. the smoothing function “smooths” extreme values in order to expose larger patterns; thus, the deltas won’t look as wide as they do in previous figures.

1. U.S.

Consistent with Fig. 1, Fig. 14.1 shows a maximum 2019/20 delta of ~.065 DPT. The typical fall uptick starts at about week 43.

YearLayers(c("United States"), c("Fig. 14.1"), c("2014-01-10"), c("2020-12-20"))

2. South

In the South, Texas (Fig. 14.2) stands out for its muted seasonal pattern and low mean DPT. No wonder Oracle wants to move to Austin! Alabama’s 2014 data are suspect. Three states have deltas of ~ 0.10. For comparison of smooth and line plots, an extended times series panel (Fig. 14.3) is included for the same group. MI and AL were climbing through late December.

YearLayers(c("Alabama", "Louisiana", "Mississippi", "Texas"), c("Fig. 14.2"), c("2014-01-10"), c("2020-12-20")) 


ByStates1420(c("Alabama", "Louisiana", "Mississippi", "Texas"), c("Fig. 14.3"), c("2014-01-10"), c("2020-12-20")) 

3. SE: GA, FL, SC, TN

The layers in Fig. 14.4 highlight GA’s counter-seasonal, bi-modal pattern with deficit deaths by late November, While TN has been mostly climbing since April or May. Yet it’s all within 0.05 DPT.

YearLayers(c("Georgia", "Florida", "South Carolina", "Tennessee"), c("Fig. 14.4"), c("2014-01-10"), c("2020-12-20"))

3. Flyover

In Fig. 14.5, AK and OK show similar patterns, as do KS and NE, until NE takes a dive at the end.

YearLayers(c("Arkansas", "Kansas", "Nebraska", "Oklahoma"), c("Fig. 14.5"), c("2014-01-10"), c("2020-12-20")) 

4. Tri-state

Fig. 14.6 re-emphasizes how different the Tri-state is from the rest of the country. Either the data are corrupt or something went terribly wrong in the Tri-state, especially NYC. Either way, policies that might apply in the Tri-state should have zero sway over the remainder of the country.

YearLayers(c("New York City", "New York", "Connecticut", "New Jersey"), c("Fig. 14.6"), c("2014-01-10"), c("2020-12-20")) 

C. Excess Deaths

We now shift to estimates produced by the CDC’s excess deaths model.26 The expected deaths are estimated and compared to reported deaths over time intervals or “bins.” The CDC’s model estimates expected deaths by state by week, then sums these estimates over some larger time period. We’ll look at the twelve months beginning on October 1, 2019, which is when flu season typically starts in the northern hemisphere. This 9-30-20 year end excludes the last quarter of 2020, for which data for some states might be incomplete.

For the 9-30-20 year, absolute, net U.S. excess deaths (“net” means surpluses - deficits) based on the CDC’s upper-bound (mean) expected deaths were 60K (286K) with Tri-state, and 19K (225K) without (see queries below). In other words, even the CDC’s model recognizes a wide range of plausible estimates. In DPT, with the Tri-state the upper-bound-to-mean range is 0.18 - 0.87 or 0.06 - 0.69 without Tri-state, against an annual national mean DPT of about 8.6 over the 2017-2019 interval (see queries below). Without Tri-state, this means that the CDC’s upper-bound total excess deaths, on the high side, were roughly 0.69/8.6 = 8% of a “normal” year. On the low side, this figure drops to 0.06/8.6 = 0.6%.

# With Tri-state
filter(Ex20wt, Code %nin% c("US")) %>% 
  group_by() %>% 
summarise(Up_Ex_All = sum(SmallEx),
          Up_Ex_All_DPT = sum(SmallEx)/328e3,
          Mu_Ex_All = sum(BigEx),
          Mu_All_DPT = sum(BigEx)/328e3)

# Without Tri-state
filter(Ex20wt, Code %nin% c("US", "NYC", "NJ", "NY", "CT")) %>% 
  group_by() %>% 
summarise(Up_Ex_noTri = sum(SmallEx),
          Up_Ex_noTri_DPT = sum(SmallEx)/328e3,
          Mu_Ex_noTri = sum(BigEx),
          Mu_Ex_noTri_DPT = sum(BigEx)/328e3)
NA

1. Bar chart by state

Figure 15 plots a bar for each state, sorted by estimated upper-bound net excess deaths per thousand for the year ended September 30, 2020. States to the right of IN – all 32 of them – have deficits, not excesses, over this time period.


# YE 9-30-20
ggplot(data = filter(Ex20wt,!Code == "US"), aes(x = reorder(Code, -EDPT), y = EDPT, fill = EDPT)) +
geom_bar(stat = "identity", show.legend = FALSE) +
#geom_text(aes(label = Code)) +
scale_fill_gradient(low = "blue", high = "red") +
scale_y_continuous(breaks = seq(-1.60, 2.7, .20)) +
theme_minimal() +
  theme(title = element_text(size = 9),axis.title.y = element_text(size = 8), axis.text.x = element_text(size = 6.5, angle = 90, hjust = 0, vjust = 0), axis.text.y = element_text(size = 6, angle = 0, hjust = 0, vjust = 0), plot.caption = element_text(size = 7), plot.tag = element_text(size = 8.5), plot.margin = margin(.3, .3, .3, .3, "cm")) +
labs(title = "Estimated Excess Deaths Per Thousand Population by State", subtitle = "YE Sep 30, 2020 - Upper Bound Expected Deaths", caption = "Source: CDC/NCHS & U.S. Census. \n Est. excess = sum of weekly reported deaths - CDC upper-bound Farrington-algorithm expected deaths", y = "Estimated Excess Deaths Per Thousand", x = "State", tag = "Fig. 15")

2. Text plot of states

Figures 16.1 and 16.2 offer a different perspective on Figure 15, plotting the states by their ratios of reported deaths to the CDC’s upper-bound and mean expected deaths, respectively. The vertical red line marks the 1:1 ratio. States to the left (right) of the line reported fewer (more) deaths than predicted, meaning that they had no (some) surplus or excess. This is a good visual illustration of the uncertainty in the CDC’s estimate. Let’s recall, however, that Figure 4 (under Part II.B., above) suggests that Figure 16.1 (using the upper-bound expected deaths) is closer to reality than Figure 16.2 (using the mean expected deaths). The figures reinforce that New York City and New Jersey should be viewed as a policy and treatment zone completely distinct from the rest of the country. More investigation is warranted to discover why NYC and New Jersey did so poorly compared to the rest of the United States.

# Dot plot from https://socviz.co/maps.html

ggplot(data = filter(Ex20wt, Code %nin% c("US", "PR")), aes(x = Reported/HiPredict, y = reorder(Code, Reported/HiPredict), color = Reported/HiPredict)) +
geom_vline(xintercept = 1, color = "red", alpha = .5) +
geom_text(aes(label = Code), size = 2, show.legend = FALSE) +
scale_color_gradient(low = "blue", high = "red") +
#scale_x_continuous(breaks = c(-0.15, -0.10, -0.05, 0.0, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30)) +
#scale_x_continuous(breaks = seq(-0.15, 0.30, .05)) +
scale_y_discrete(labels = NULL) +
theme_minimal() +
  theme(axis.text.y = element_text(size = 5, angle = 0, hjust = 0, vjust = 0), axis.text.x = element_text(size = 6, angle = 0, hjust = 0, vjust = 0), plot.caption = element_text(size = 7), plot.tag = element_text(size = 8.5), plot.margin = margin(.3, .3, .3, .3, "cm")) +
labs(title = "Reported Deaths to CDC Upper Bound Predicted Deaths by State", subtitle = "All-Causes. Year Ended Sep 30, 2020", caption = "Sources: CDC/NCHS.", y = "", x = "NCHS Reported/Upper Bound Predicted Deaths from all causes", tag = "Fig. 16.1")


# Dot plot from https://socviz.co/maps.html

ggplot(data = filter(Ex20wt, Code %nin% c("US", "PR")), aes(x = Reported/MuPredict, y = reorder(Code, Reported/MuPredict), color = Reported/MuPredict)) +
geom_vline(xintercept = 1, color = "red", alpha = .5) +
geom_text(aes(label = Code), size = 2, show.legend = FALSE) +
scale_color_gradient(low = "blue", high = "red") +
#scale_x_continuous(breaks = c(-0.15, -0.10, -0.05, 0.0, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30)) +
#scale_x_continuous(breaks = seq(-0.15, 0.30, .05)) +
scale_y_discrete(labels = NULL) +
theme_minimal() +
  theme(axis.text.y = element_text(size = 5, angle = 0, hjust = 0, vjust = 0), axis.text.x = element_text(size = 6, angle = 0, hjust = 0, vjust = 0), plot.caption = element_text(size = 7), plot.tag = element_text(size = 8.5), plot.margin = margin(.3, .3, .3, .3, "cm")) +
labs(title = "Reported Deaths to CDC Mean Predicted Deaths by State", subtitle = "All-Causes. For the YE Sep 30, 2020", caption = "Sources: CDC/NCHS.", y = "", x = "NCHS Reported/Mean Predicted Deaths from all causes", tag = "Fig. 16.2")

V. Conclusion

So let’s summarize.

What is the plausible range of total “excess” deaths in a relevant place over a relevant time period?

The answer depends on where you live and the measurement window. No one lives everywhere across the United States. That said, the range for the year ended September 30, 2020 for United States most likely lies between 0.17 - 0.85 (0.03 - 0.67) DPT, including (excluding) the Tri-state. For most states individually, zero excess is plausible. Yet, this highly important fact goes unmentioned in the CDC’s October 23 MMWR, which cherry-picks the Feb - Sep period and ignores deficits to produce 0.91 DPT (299,028/328 million/1,000) as the solitary point estimate for the entire country. Compare to the 1918 flu with a 6.6 DPT.

What share of excess deaths might be fairly attributed to Covid-19?

Small and getting smaller, especially in light of the WHO’s Jan 20, 2021 Notice warning that a PCR test positive should not be counted as “Covid-19” in the absence of a clinical diagnosis: “The cycle threshold (Ct) needed to detect virus is inversely proportional to the patient’s viral load. Where test results do not correspond with the clinical presentation, a new specimen should be taken and retested using the same or different NAT technology.”

The vast majority of the fatalities are either (a) very elderly and, therefore, likely to die soon anyway, or (b) saddled with major comorbidities and … likely to die soon anyway. Even the CDC admits, in print, that it does not know whether ANY of its estimated excess deaths were caused by Covid. All of this means that we should be looking beyond Covid-19 for a full explanation of the Tri-state and other anomalies like the summer 2020 serpent.

How transparently does the CDC present the range and share to readers?

Not transparently at all. They publish a big, falsely precise, nationwide number (i.e., 298,028) – cherry-picked from the “best” eight months – front and center. They fail to inform readers, “Our estimate is subject to lots of uncertainty. We don’t even know how many”excess" deaths there are and we don’t know what share of the unknown excess deaths were caused by Covid." This is all buried in the fine print. They entirely omit the upper-bound expected deaths from their dashboard, fail to share their model code and data, and say nothing about the inversely proportional relationship between PCR cycle threshold (Ct) and viral load, which calls into question the Covid-19 label on deaths reported by the states.

Perhaps most importantly, contrary to standard practice in research, the CDC modelers say nothing about their major financial interest in fostering the appearance of higher excess deaths. An adequate disclosure might read like this:

CONFLICT OF INTEREST: Covid-19 deaths are a proxy for CDC revenue. The CDC tends to receive more federal funding when the perceived epidemic death rate is high. In 2020, Congress increased our operating budget from $8.5 billion to $25 billion in response to Covid-19. Thus, this estimate may be affected by bias induced by our financial interest in higher reported Covid-19 deaths.

In summary, in order to meet minimum SEC rules, which fundamentally require that statements and disclosures be "not materially misleading," the CDC’s excess deaths estimate, disclosures, and presentation thereof would need to change significantly.

Appendix

I. Data preparation

A. Load libraries

B. Import all data

C. Xforms

Here we transform the CDC, Census, and Georgia data for further analysis.

1. CDC data

# Add C19 vars to cause_14_19

cause_14_19 <- mutate(cause_14_19,
   flag_cov19mcod = "0",
   flag_cov19ucod = "0",
   `COVID-19 (U071, Multiple Cause of Death)` = 0,
   `COVID-19 (U071, Underlying Cause of Death)` = 0)

# Reorder columns
cause_14_19 <- cause_14_19[c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,33,34,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32)]

# Verify that column names are the same. Cols 5 and 11 have changed slightly since 2018.
names(cause_14_19)
names(cause_20_21)

# Rename columns to synch with cause_20_21
names(cause_14_19)[5] <- "All Cause" #remove extra space
names(cause_14_19)[11] <- "Influenza and pneumonia (J09-J18)" #change J10 to J09

# Merge 2019-2020 & 2014-2018 data
cause_14_21 <- rbind(cause_14_19, cause_20_21)

# Change column names for easier analysis
names(cause_14_21)[5] <- "All"
names(cause_14_21)[1] <- "Juris"
names(cause_14_21)[6] <- "Natural"
names(cause_14_21)[7] <- "Sept"
names(cause_14_21)[8] <- "Cancer"
names(cause_14_21)[9] <- "Diab"
names(cause_14_21)[10] <- "Alz"
names(cause_14_21)[11] <- "InflPn"
names(cause_14_21)[12] <- "CLRD"
names(cause_14_21)[13] <- "OthRD"
names(cause_14_21)[14] <- "Nephr"
names(cause_14_21)[15] <- "OthUnk"
names(cause_14_21)[16] <- "HD"
names(cause_14_21)[17] <- "Stroke"
names(cause_14_21)[18] <- "C19mcod"
names(cause_14_21)[19] <- "C19ucod"

# Reduce columns & add NonNat cause
cause_14_21 <- select(cause_14_21, c(1:19))

cause_14_21 <- mutate(cause_14_21,
    NonNat = All - Natural)

# cause_14_21: format Year and Week as.factor

cause_14_21$`MMWR Year` <- as.factor(cause_14_21$`MMWR Year`)
cause_14_21$`MMWR Week` <- as.factor(cause_14_21$`MMWR Week`)

# CDC_C19_Ex: Create hidelta & lodelta variables

CDC_C19_Ex$hidelta <- CDC_C19_Ex$`Observed Number` - CDC_C19_Ex$`Average Expected Count`
CDC_C19_Ex$lodelta <- CDC_C19_Ex$`Observed Number` - CDC_C19_Ex$`Upper Bound Threshold`

# Wtd_CDC_C19_Ex: Create hidelta & lodelta variables

Wtd_CDC_C19_Ex$hidelta <- Wtd_CDC_C19_Ex$`Observed Number` - Wtd_CDC_C19_Ex$`Average Expected Count`

Wtd_CDC_C19_Ex$lodelta <- Wtd_CDC_C19_Ex$`Observed Number` - Wtd_CDC_C19_Ex$`Upper Bound Threshold`

CDC: Long format conversion

Before we convert the CDC data to long format to facilitate time series analysis, we check for missing data patterns.

miss_txns <- aggr(cause_14_21, col = c('navyblue','yellow'),
                  numbers = TRUE, sortVars = TRUE, 
                  labels = names(cause_14_21), cex.axis = .7,
                  gap = 3, ylab = c("Missing data","Pattern"))

The missing values reflect reported weekly counts of less than 10 deaths that are intentionally “suppressed” by the CDC. In the CDC’s 2019-2020 table (Dec 30, 2020 update), the “all cause” column is missing only CT week 51 and NC week 43. Many more values are missing for specific causes of death because the states take longer to report such details. We replace all missing numeric values with 0.

setnafill(cause_14_21, cols = c(5:20), fill = 0) # data.table function
# print cause_14_21 to show the effect

Prepare for DT melt. Melting converts the data from “wide” to “long” format. Long is better for time series analysis.

setDT(cause_14_21) # Convert to DT for DT melt

# melt
cause_long <- melt(cause_14_21, id.vars = c(1:4), measure.vars = c(5:20))

# Change "variable" and "value" names
names(cause_long)[6] <- "Deaths"
names(cause_long)[5] <- "Cause"

Check for any remaining missing Deaths

filter(cause_long, is.na((Deaths)))

2. Census data

Rename some vars & create 2020 population estimate = 2019 pop estimate.

names(Pop_Est)[4] <- "St_Num"
names(Pop_Est)[5] <- "Juris"

Convert to long format

Pop_long <- select(Pop_Est, c(2:11))
Pop_long$POPESTIMATE2020 <- Pop_long$POPESTIMATE2019
Pop_long$POPESTIMATE2021 <- Pop_long$POPESTIMATE2019
setDT(Pop_long)
Pop_long <- melt(Pop_long, id.vars = c(1:4), measure.vars = c(5:12))

# Change variable to Pop
names(Pop_long)[6] <- "Pop"

Extract year from variable variable.

Pop_long$Year <- substr(Pop_long$variable, 12, 15)
Pop_long$Year <- as.factor(Pop_long$Year)

3. Join long CDC & Census tables

The DeathsPM variable was originally intended to report deaths per million but was repurposed to report deaths per thousand. Much of the literature uses per thousand and thousands are more relateable than millions.

names(cause_long)[2] <- "Year"
pcap_long <- cause_long %>% 
  left_join(select(Pop_long, Juris, REGION, DIVISION, Year, Pop)) %>% 
  mutate(DeathsPM = Deaths/(Pop/1e3))

4. CDC Excess deaths

This data transform chunk supports analysis of the CDC’s Excess Deaths worksheet. First, we import state abbrevs & join with CDC_C10_Ex & PopEst tables. Then we create per-thousand variables like DPTmu (mean deaths per thousand), EDPT (excess deaths per thousand), and REDPT (reported excess deaths per thousand).

StateCodes <- read_csv("StateAbbrevs.csv")

# Unweighted actuals

CDC_C19_Ex <- select(CDC_C19_Ex, `Week Ending Date`, Year, State, `Observed Number`, `Upper Bound Threshold`, `Average Expected Count`, `Excess Lower Estimate`, `Excess Higher Estimate`) %>% 
left_join(select(StateCodes, -Abbrev)) %>% 
  left_join(select(Pop_Est, c(5,9:11,39:41)), by = c("State" = "Juris")) %>%   mutate(Year = as.factor(Year))

# Weighted actuals

Wtd_CDC_C19_Ex <- select(Wtd_CDC_C19_Ex, `Week Ending Date`, Year, State, `Observed Number`, `Upper Bound Threshold`, `Average Expected Count`, `Excess Lower Estimate`, `Excess Higher Estimate`) %>% 
left_join(select(StateCodes, -Abbrev)) %>% 
  left_join(select(Pop_Est, c(5,9:11,39:41)), by = c("State" = "Juris")) %>%   mutate(Year = as.factor(Year))

# Create unweighted DPTmu from CDC_C19_Ex$`Observed Number`

Mean_deaths <- CDC_C19_Ex %>% 
  group_by(Code, State, Year) %>% 
  summarise(Deaths = sum(`Observed Number`)) %>% 
  filter(Year %nin% c("2020", "2021")) %>% 
  left_join(select(Pop_long, -variable), by = c("State" = "Juris", "Year")) %>% 
  mutate(DPT_yr = Deaths/(Pop/1e3)) %>%   
  group_by(Code) %>% 
  summarise(DPTmu = mean(DPT_yr)) 
   
CDC_C19_Ex <- CDC_C19_Ex %>% 
  left_join(Mean_deaths, by = "Code")

# Create weighted DPTmu from CDC_C19_Ex$`Observed Number`

Wt_Mean_deaths <- Wtd_CDC_C19_Ex %>% 
  group_by(Code, State, Year) %>% 
  summarise(Deaths = sum(`Observed Number`)) %>% 
  filter(Year %nin% c("2020", "2021")) %>% 
  left_join(select(Pop_long, -variable), by = c("State" = "Juris", "Year")) %>% 
  mutate(DPT_yr = Deaths/(Pop/1e3)) %>%   
  group_by(Code) %>% 
  summarise(DPTmu = mean(DPT_yr)) 
   
Wtd_CDC_C19_Ex <- Wtd_CDC_C19_Ex %>% 
  left_join(Wt_Mean_deaths,  by = "Code")

# Create 9-30 2020 table 
Ex20 <- filter(CDC_C19_Ex, `Week Ending Date` > "2019-09-30" & `Week Ending Date` < "2020-10-01") %>% 
  group_by(Code) %>% 
  summarise(POPESTIMATE2019, DPTmu, Reported = sum(`Observed Number`), HiPredict = sum(`Upper Bound Threshold`), MuPredict = sum(`Average Expected Count`)) %>%
  distinct(.keep_all = TRUE) %>% 
  filter(!is.na(Reported)) %>% 
  mutate(SmallEx = Reported - HiPredict,
    BigEx = Reported - MuPredict,
    EDPT = (Reported - HiPredict)/(POPESTIMATE2019/1e3), 
    EDPTratio = EDPT/DPTmu,
    REDPT = (Reported/(POPESTIMATE2019/1e3)) - DPTmu,
    REDPTratio = ((Reported/(POPESTIMATE2019/1e3)) - DPTmu)/DPTmu)

# Create 9-30 2020 table using weighted observations 
Ex20wt <- filter(Wtd_CDC_C19_Ex, `Week Ending Date` > "2019-09-30" & `Week Ending Date` < "2020-10-01") %>% 
  group_by(Code) %>% 
  summarise(POPESTIMATE2019, DPTmu, Reported = sum(`Observed Number`), HiPredict = sum(`Upper Bound Threshold`), MuPredict = sum(`Average Expected Count`)) %>%
  distinct(.keep_all = TRUE) %>% 
  filter(!is.na(Reported)) %>% 
  mutate(SmallEx = Reported - HiPredict,
    BigEx = Reported - MuPredict,
    EDPT = (Reported - HiPredict)/(POPESTIMATE2019/1e3), 
    EDPTratio = EDPT/DPTmu,
    REDPT = (Reported/(POPESTIMATE2019/1e3)) - DPTmu,
    REDPTratio = ((Reported/(POPESTIMATE2019/1e3)) - DPTmu)/DPTmu)

# Create 9-30 2019 table
Ex19 <- filter(CDC_C19_Ex, `Week Ending Date` > "2018-09-30" & `Week Ending Date` < "2019-10-01") %>% 
         group_by(State) %>% 
         summarise(Code, POPESTIMATE2018, DPTmu, Reported = sum(`Observed Number`), HiPredict = sum(`Upper Bound Threshold`), MuPredict = sum(`Average Expected Count`)) %>%
  distinct(.keep_all = TRUE) %>% 
  filter(!is.na(Reported)) %>% 
         mutate(SmallEx = Reported - HiPredict,
                BigEx = Reported - MuPredict,
                EDPT = (Reported - HiPredict)/(POPESTIMATE2018/1e3), 
                EDPTratio = EDPT/DPTmu)

# Create 9-30 2018 table 

Ex18 <- filter(CDC_C19_Ex, `Week Ending Date` > "2017-09-30" & `Week Ending Date` < "2018-10-01") %>% 
         group_by(State) %>% 
         summarise(Code, POPESTIMATE2017, DPTmu, Reported = sum(`Observed Number`), HiPredict = sum(`Upper Bound Threshold`), MuPredict = sum(`Average Expected Count`)) %>%
  distinct(.keep_all = TRUE) %>% 
  filter(!is.na(Reported)) %>% 
         mutate(SmallEx = Reported - HiPredict,
                BigEx = Reported - MuPredict,
                EDPT = (Reported - HiPredict)/(POPESTIMATE2017/1e3), 
                EDPTratio = EDPT/DPTmu)

5. GA DPH vs weighted CDC


GA_weekly_deaths <- GA_epi_symp_date %>%
  filter(county == "Georgia") %>% 
  mutate(`Week Ending Date` = ceiling_date(`symptom date`, "week") - 1) %>% 
  group_by(`Week Ending Date`) %>%
  summarise(Deaths = sum(deaths)) 

GA_CDCvDPH <- filter(Wtd_CDC_C19_Ex, State == "Georgia" & Year == 2020 & `Week Ending Date` < "2020-12-27") %>% 
  mutate(Deaths = `Observed Number` - `Upper Bound Threshold`, Source = "CDC") %>% select(`Week Ending Date`, Deaths, Source) %>%
  rbind(GA_weekly_deaths %>% mutate(Source = "GADPH")) %>%
  left_join(filter(cause_14_21, Juris == "Georgia") %>% select(`Week Ending Date`, `MMWR Week`)) 

D. Functions

# Build ByStates1420 "in" function

ByStates1420 <- function(States, Fig, Start, Stop){
  ggplot(data = filter(pcap_long, Juris %in% c(States) & Cause %in% c("All") & `Week Ending Date` > Start & `Week Ending Date` < Stop), aes( x = `Week Ending Date`, y = DeathsPM, color = Year)) +
  geom_line(size = .5) +
  geom_hline(yintercept = 0.2071215, size = .4, color = "green4", alpha = .4) +
  scale_y_continuous(breaks = seq(0.10,0.95,0.10),limits = c(0.10,0.95)) + 
  scale_x_date(date_breaks = "3 months", date_labels = "%b %y") +
  theme_minimal() +
  theme(axis.text.x = element_text(size = 6, angle = 90, hjust = 0), plot.caption = element_text(size = 6.5), plot.tag = element_text(size = 9), plot.margin = margin(.3, .3, .3, .3, "cm")) +
  labs(title = "Weekly All-Cause Deaths per Thousand", subtitle = "Over the x-axis time interval", y = "Deaths per Thousand Pop", x = "Month & Year", caption = "Source: CDC; U.S. Census", tag = c(Fig)) +
  facet_wrap(~Juris, ncol = 2)
}

# Build ByStates1420 "not in" function

ByStates1420nin <- function(States, Start, Stop){
  ggplot(data = 
    (filter(pcap_long, Juris %nin% c(States) & Cause %in% c("All") & `Week Ending Date` > Start & `Week Ending Date` < Stop) %>% 
    group_by(`Week Ending Date`)) %>% 
    summarise(Year, DPT = sum(Deaths)/(sum(Pop)/1e3)), aes(x = `Week Ending Date`, y = DPT, color = Year)) +
  geom_line(size = .5) +
  scale_y_continuous(breaks = seq(0.10,0.95,0.10),limits = c(0.10,0.95)) + 
  scale_x_date(date_breaks = "3 months", date_labels = "%b %y") +
  theme_minimal() +
  theme(axis.text.x = element_text(size = 6, angle = 90, hjust = 0), plot.caption = element_text(size = 6.5), plot.tag = element_text(size = 9), plot.margin = margin(.3, .3, .3, .3, "cm")) 
}

# Build YearLayers function

YearLayers <- function(States, Fig, Start, Stop) {
  ggplot(data = filter(pcap_long, Juris %in% c(States) & Cause %in% c("All") & `Week Ending Date` > Start & `Week Ending Date` < Stop), aes(x = `MMWR Week`, y = DeathsPM, group = Year, color = Year)) + 
  geom_smooth(size = .6, se = FALSE, span = 0.20) +
  scale_x_discrete(breaks = seq(0,52,4)) +
  theme_minimal() +
  theme(axis.text.x = element_text(size = 7, angle = 0, hjust = 0), plot.caption = element_text(size = 7), plot.tag = element_text(size = 9), plot.margin = margin(.3, .3, .3, .3, "cm")) +
  facet_wrap(~Juris, ncol = 2) +
  labs(title = "Weekly Deaths per Thousand - All Causes by Year", subtitle = "11 Jan 2014 to 12 Dec 2020", y = "Deaths per Thousand", x = "CDC MMWR Week", tag = c(Fig), caption = "Sources: data.CDC.gov; www2.census.gov. Lines fitted with LOESS smoothing via geom_smooth in R ggplot2 package.")
}

  1. See, e.g., Judea Pearl & Dana Mackenzie, The Book of Why: The New Science of Cause and Effect (2018).↩︎

  2. See “Principles and Pitfalls: a Guide to Death Certification,” Clin Med Res. 2015 Jun; 13(2): 74-82. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4504663/.↩︎

  3. The CDC’s 65-page instruction book, https://www.cdc.gov/nchs/data/misc/hb_cod.pdf, explains how to complete the death certificate at https://www.cdc.gov/nchs/data/dvs/blue_form.pdf.↩︎

  4. SAS 143, para. 7 (AICPA 2020).↩︎

  5. “Finally, the estimates of excess deaths reported here may not be due to COVID-19, either directly or indirectly.” Technical Notes, https://www.cdc.gov/nchs/nvss/vsrr/covid19/excess_deaths.htm.↩︎

  6. See <https://www.cdc.gov/mmwr/volumes/69/wr/mm6942e2.htm>. The 198,081 “attributed” to Covid-19 apparently represents deaths what the CDC calls “confirmed or presumed COVID-19 deaths.” By “confirmed,” the CDC means that the decedent at some point received a positive PCR test result, suggesting the presence of SARS-COV-2 virus.↩︎

  7. “The cycle threshold (Ct) needed to detect virus is inversely proportional to the patient’s viral load. Where test results do not correspond with the clinical presentation, a new specimen should be taken and retested using the same or different NAT technology.”↩︎

  8. See https://www.cdc.gov/nchs/nvss/vsrr/covid19/excess_deaths.htm.↩︎

  9. “Negative values, where the observed count fell below the thresholds, were set to zero… The total number of excess deaths in each state was calculated by summing the excess deaths in each week, from February 1, 2020 to present.” https://www.cdc.gov/nchs/nvss/vsrr/covid19/excess_deaths.htm.↩︎

  10. The underlying CDC figures are in the worksheet at https://data.cdc.gov/api/views/xkkf-xrst/rows.csv?accessType=DOWNLOAD&bom=true&format=true%20target=↩︎

  11. For its national estimate, the CDC omitted North Carolina because of incomplete reporting.↩︎

  12. The surveillance package was built to assist public health authorities in “lessening disease burden by, e.g., timely recognizing emerging outbreaks in case of infectious diseases.” In other words, it was created to locate epidemic outbreaks for possible short-term intervention, not to estimate excess deaths for long-term policy formulation. See Maëlle Salmon, Dirk Schumacher & Michael Höhle, “Monitoring Count Time Series in R: Aberration Detection in Public Health Surveillance,” J. Statistical Software (2016), https://www.jstatsoft.org/article/view/v070i10.↩︎

  13. See https://www.cdc.gov/nchs/nvss/vsrr/covid19/excess_deaths.htm.↩︎

  14. Georgia is a sample of one. We would need to test this correlation for more states in order to reach a more reliable conclusion on its meaning. Note, also, that the WHO’s January 20, 2021 Notice on Covid-19 diagnosis calls into question the accuracy of Covid-19 death reports from any state, like Georgia, which relies primarily on a single PCR test positive for classifying “cases” and deaths as Covid-19.↩︎

  15. CDC, Excess Deaths Associated with COVID-19, Technical Notes, https://www.cdc.gov/nchs/nvss/vsrr/covid19/excess_deaths.htm↩︎

  16. See, generally, Austin Frakt, “Putting a Dollar Value on Life? Governments Already Do,” NYT (May 11, 2020), https://www.nytimes.com/2020/05/11/upshot/virus-price-human-life.html.↩︎

  17. Sunetra Gupta discusses the epidemiological “social contract” at 1:46 - 1:51 of the video at https://gbdeclaration.org/video/.↩︎

  18. I gather from the footnotes, that “Farrington” means farringtonFlexible, discussed in the surveillance package user manual. Other possibilities are algo.farrington and algo.cdc (based on Farrington).The Farrington algo assumes that events (e.g., deaths) occur frequencies prescribed by the Poisson distribution, which is nicely explained in this zedstatistics video. It would help greatly if the CDC were to publicly share its code.↩︎

  19. Salmon M, Schumacher D, Hohle M. Monitoring Count Time Series in R: Aberration Detection in Public Health Surveillance. Journal of Statistical Software 2016;70(10):1-35, 14.↩︎

  20. The analysis was inspired in part by Genevieve Briand’s November 2020 presentation at John Hopkins University in which Briand suggested that Covid-19 should not be credited with any excess deaths in the United States.↩︎

  21. CDC data sources: https://data.cdc.gov/NCHS/Provisional-COVID-19-Death-Counts-by-Sex-Age-and-W/vsak-wrfu, https://data.cdc.gov/NCHS/Weekly-Counts-of-Deaths-by-State-and-Select-Causes/3yf8-kanr, and https://data.cdc.gov/NCHS/Weekly-Counts-of-Deaths-by-State-and-Select-Causes/muzy-jte6.↩︎

  22. See https://www.cdc.gov/nchs/nvss/vsrr/covid19/excess_deaths.htm.↩︎

  23. Census data sources: http://www2.census.gov/programs-surveys/popest/datasets/2010-2019/national/totals/nst-est2019-alldata.csv, and https://www.census.gov/data/tables/time-series/demo/popest/2010s-total-cities-and-towns.html#ds.↩︎

  24. Wickham H, Averick M, Bryan J, Chang W, McGowan LD, François R, Grolemund G, Hayes A, Henry L, Hester J, Kuhn M, Pedersen TL, Miller E, Bache SM, Müller K, Ooms J, Robinson D, Seidel DP, Spinu V, Takahashi K, Vaughan D, Wilke C, Woo K, Yutani H (2019). “Welcome to the tidyverse.” Journal of Open Source Software, 4(43), 1686. doi: 10.21105/joss.01686.↩︎

  25. Smooth lines were fitted using LOESS smoothing implemented in R through the geom_smooth function of the ggplot2 package. LOESS smoothing is “a non-parametric form of regression that uses a weighted, sliding-window average to calculate a line of best fit.” Wickham H (2016). ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. ISBN 978-3-319-24277-4, https://ggplot2.tidyverse.org.↩︎

  26. The CDC’s National and State Estimates of Excess Deaths worksheet is available in csv format at https://www.cdc.gov/nchs/nvss/vsrr/covid19/excess_deaths.htm.↩︎

LS0tDQp0aXRsZTogIkhvbWUgRGVwb3QsIEhvZ3dhcnRzICYgRXhjZXNzIERlYXRocyBhdCB0aGUgQ0RDIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQotLS0NCg0KIyMjIyBLdXJ0IFNjaHVsemtlLCBKRCwgQ1BBLCBDRkUNCg0KIyMgSS4gSW50cm9kdWN0aW9uDQoNCldoYXQgd291bGQgdGhlIFNlY3VyaXRpZXMgJiBFeGNoYW5nZSBDb21taXNzaW9uIGRvIGlmIEhvbWUgRGVwb3QgcmVwb3J0ZWQgYXMgaXRzIDIwMjAgIm5ldCBpbmNvbWUiIG9ubHkgaXRzIHJldmVudWVzIChub3QgZXhwZW5zZXMpLCBmcm9tIG9ubHkgaXRzIGJlc3QgZWlnaHQgbW9udGhzLCBpbiBvbmx5IGl0cyBiZXN0IDE4IHN0YXRlcz8gV2hhdCBpZiB3ZSByZXBsYWNlICJIb21lIERlcG90IiB3aXRoICJDREMiPyBXaGljaCBvcmdhbml6YXRpb24gc2hvdWxkIGJlIGhlbGQgdG8gaGlnaGVyIGFjY291bnRpbmcgYW5kIGRpc2Nsb3N1cmUgc3RhbmRhcmRzPyBXaGljaCBoYXMgbW9yZSBwb3dlciB0byBkYW1hZ2UgdGhlIFVuaXRlZCBTdGF0ZXMgd2l0aCBtaXNsZWFkaW5nIGluZm9ybWF0aW9uPw0KDQpJbiAyMDIwLCB0aGUgQ0RDJ3MgW2J1ZGdldCBiYWxsb29uZWQgZnJvbSBcJDggYmlsbGlvbl0oaHR0cHM6Ly93d3cuY2RjLmdvdi9idWRnZXQvZG9jdW1lbnRzL2Z5MjAyMC9meS0yMDIwLWNkYy1vcGVyYXRpbmctcGxhbi5wZGYpIHRvIHJvdWdobHkgW1wkNDYgYmlsbGlvbl0oaHR0cHM6Ly93d3cuY2RjLmdvdi9idWRnZXQvZmFjdC1zaGVldHMvY292aWQtMTkvaW5kZXguaHRtbCksIGFsbCBpbiByZXNwb25zZSB0byBwZXJjZWl2ZWQgQ292aWQtMTkgbW9ydGFsaXR5LiBIb3cgbWFueSBkZWF0aHMgaGFzIENvdmlkLTE5IGNhdXNlZD8gQ2F1c2FsIGFuYWx5c2lzIGlzIGFsd2F5cyBhIHRyaWNreSBidXNpbmVzcyxbXjFdIGJ1dCBwaW5wb2ludGluZyBjYXVzZSBvZiBkZWF0aCBpcyBub3RvcmlvdXNseSBlcnJvci1wcm9uZSxbXjJdIG1vcmUgc28gd2hlbiBhIHJlcG9ydGVkIGNhdXNlIGlzIHVzZWQgdG8gc29saWNpdCBiaWxsaW9ucyBpbiBmdW5kaW5nLiBJbmRlZWQsIHRoZSBDREMgZW1waGFzaXplcyB0aGUgZnVuZGluZyBjb25uZWN0aW9uIHR3aWNlIG9uIHRoZSBmaXJzdCBwYWdlIG9mIGl0cyA2NS1wYWdlIGRlYXRoIGNlcnRpZmljYXRlIGhhbmRib29rLlteM10gSW4gc3VwcG9ydCBvZiBpdHMgcmVtYXJrYWJsZSBidWRnZXQgaW5jcmVhc2UsIGFuZCBjbGFpbWluZyBjb25jZXJuIHRoYXQgZGVhdGgtY2VydGlmaWNhdGUtYmFzZWQgY291bnRzIHdlcmUgdW5kZXItY291bnRpbmcgQ292aWQtMTkgZGVhdGhzLCBpbiBmYWxsIDIwMjAsIHRoZSBDREMgYmVnYW4gZXN0aW1hdGluZyAiZXhjZXNzIiBkZWF0aHMgYXMgYSBwcm94eSBmb3IgQ292aWQtMTkgZGVhdGhzLg0KDQpbXjFdOiBTZWUsIGUuZy4sIEp1ZGVhIFBlYXJsICYgRGFuYSBNYWNrZW56aWUsICpUaGUgQm9vayBvZiBXaHk6IFRoZSBOZXcgU2NpZW5jZSBvZiBDYXVzZSBhbmQgRWZmZWN0KiAoMjAxOCkuDQoNClteMl06IFNlZSAiUHJpbmNpcGxlcyBhbmQgUGl0ZmFsbHM6IGEgR3VpZGUgdG8gRGVhdGggQ2VydGlmaWNhdGlvbiwiIFtDbGluIE1lZCBSZXNdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcG1jL2FydGljbGVzL1BNQzQ1MDQ2NjMvIykuIDIwMTUgSnVuOyAxMygyKTogNzQtODIuIDxodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3BtYy9hcnRpY2xlcy9QTUM0NTA0NjYzLz4uDQoNClteM106IFRoZSBDREMncyA2NS1wYWdlIGluc3RydWN0aW9uIGJvb2ssIDxodHRwczovL3d3dy5jZGMuZ292L25jaHMvZGF0YS9taXNjL2hiX2NvZC5wZGY+LCBleHBsYWlucyBob3cgdG8gY29tcGxldGUgdGhlIGRlYXRoIGNlcnRpZmljYXRlIGF0IDxodHRwczovL3d3dy5jZGMuZ292L25jaHMvZGF0YS9kdnMvYmx1ZV9mb3JtLnBkZj4uDQoNClRvIGJlIGNsZWFyLCB0aGUgQ0RDJ3MgZXN0aW1hdGUgaXMgbm90IGRhdGEuIEl0IGlzIGFuICplc3RpbWF0ZSosIHdoaWNoIG1lYW5zIGl0IGlzIG9uZSBqdWRnbWVudGFsIGludGVycHJldGF0aW9uIG9mIGRhdGEgYW1vbmcgbXVsdGlwbGUgcG9zc2libGUgaW50ZXJwcmV0YXRpb25zLiBJcyB0aGUgQ0RDJ3MgZXN0aW1hdGUgcmVhbGlzdGljPyBUbyBmaW5kIG91dCwgd2Ugd2lsbCBleHBsb3JlIHRoZSBDREMncyBkYXRhIGFuZCBldmFsdWF0ZSB0aGUgbW9kZWwgdGhleSB1c2VkIHRvIG1ha2UgdGhlaXIgZXN0aW1hdGUuDQoNClRoZSBrZXkgaGlnaC1sZXZlbCBxdWVzdGlvbnMgYXJlIHRoZXNlOiBXaGF0IGlzIHRoZSBwbGF1c2libGUgcmFuZ2Ugb2YgImV4Y2VzcyIgZGVhdGhzIGluIGEgcmVsZXZhbnQgcGxhY2Ugb3ZlciBhIHJlbGV2YW50IHRpbWUgcGVyaW9kPyBXaGF0IHNoYXJlIG9mIGV4Y2VzcyBkZWF0aHMgbWlnaHQgYmUgZmFpcmx5IGF0dHJpYnV0ZWQgdG8gQ292aWQtMTk/IEFuZCBob3cgdHJhbnNwYXJlbnRseSBkb2VzIHRoZSBDREMgcHJlc2VudCB0aGUgcmFuZ2UgYW5kIHNoYXJlIHRvIHJlYWRlcnM/IFdlIG9mZmVyIHNvbWUgYW5zd2VycyB0byB0aGVzZSBxdWVzdGlvbnMgaW4gUGFydCBWLiBXZSdsbCBrZWVwIHRoaW5ncyBzaW1wbGUgYW5kIChtb3N0bHkpIHZpc3VhbCwgYXZvaWRpbmcgY29tcGxleCBzdGF0aXN0aWNhbCB0b29scy4NCg0KQXQgdGhlIG91dHNldCwgd2Ugbm90ZSB0aGF0IHRoZSBTRUMncyBmdW5kYW1lbnRhbCAiYW50aS1mcmF1ZCIgc3RhbmRhcmQsIFtSdWxlIDEwYi01XShodHRwczovL3d3dy5sYXcuY29ybmVsbC5lZHUvY2ZyL3RleHQvMTcvMjQwLjEwYi01KSwgZGVjbGFyZXMgaXQgaWxsZWdhbCwgaW4gYnV5aW5nIG9yIHNlbGxpbmcgc3RvY2tzLCB0byAoYSkgZW1wbG95IGFueSBkZXZpY2UsIHNjaGVtZSwgb3IgYXJ0aWZpY2UgdG8gZGVmcmF1ZCwgKGIpIG1pc2xlYWQgcmVhZGVycyBieSBzdGF0ZW1lbnRzIG9yIG9taXNzaW9ucywgb3IgKGMpIGVuZ2FnZSBpbiBhbnkgYWN0LCBwcmFjdGljZSwgb3IgY291cnNlIG9mIGJ1c2luZXNzIHdoaWNoIG9wZXJhdGVzIGFzIGEgZnJhdWQgb3IgZGVjZWl0IHVwb24gYW55b25lLg0KDQpMZXQncyBzZWUgaG93IHRoZSBDREMgbWVhc3VyZXMgdXAgdG8gc3RvY2sgbWFya2V0IGRpc2Nsb3N1cmUgcmVxdWlyZW1lbnRzLiBJbiBkb2luZyBzbywgd2UnbGwgZ2VuZXJhbGx5IGZvbGxvdyB0aGUgQUlDUEEgc3RhbmRhcmQgZm9yIGF1ZGl0aW5nIG1hbmFnZW1lbnQgZXN0aW1hdGVzLCBTQVMgMTQzLCB3aGljaCBhZG1vbmlzaGVzIHRoYXQgdGhlIGltcG9ydGFuY2Ugb2YgcHJvZmVzc2lvbmFsIHNrZXB0aWNpc206DQoNCj4gLi4uaW5jcmVhc2VzIHdoZW4gYWNjb3VudGluZyBlc3RpbWF0ZXMgYXJlIHN1YmplY3QgdG8gYSBncmVhdGVyIGRlZ3JlZSBvZiBlc3RpbWF0aW9uIHVuY2VydGFpbnR5IG9yIGFyZSBhZmZlY3RlZCB0byBhIGdyZWF0ZXIgZGVncmVlIGJ5IGNvbXBsZXhpdHksIHN1YmplY3Rpdml0eSwgb3Igb3RoZXIgaW5oZXJlbnQgcmlzayBmYWN0b3JzLiBTaW1pbGFybHksIHRoZSBleGVyY2lzZSBvZiBwcm9mZXNzaW9uYWwgc2tlcHRpY2lzbSBpcyBpbXBvcnRhbnQgd2hlbiB0aGVyZSBpcyBncmVhdGVyIHN1c2NlcHRpYmlsaXR5IHRvIG1pc3N0YXRlbWVudCBkdWUgdG8gbWFuYWdlbWVudCBiaWFzIG9yIGZyYXVkLlteNF0NCg0KW140XTogU0FTIDE0MywgcGFyYS4gNyAoQUlDUEEgMjAyMCkuDQoNCkluIHRoaXMgY29ubmVjdGlvbiwgd2Ugc2hvdWxkIGFsc28gY29uc2lkZXIgdGhlICJbZnJhdWQgdHJpYW5nbGVdKGh0dHBzOi8vY29ycG9yYXRlZmluYW5jZWluc3RpdHV0ZS5jb20vcmVzb3VyY2VzL2tub3dsZWRnZS9hY2NvdW50aW5nL2ZyYXVkLXRyaWFuZ2xlLyksIiB3aGljaCBob2xkcyB0aGF0IG9wcG9ydHVuaXRpZXMsIGluY2VudGl2ZXMsIGFuZCBlYXNpbHkgYWNjZXNzaWJsZSByYXRpb25hbGl6YXRpb25zIGhlaWdodGVuIGZyYXVkIHJpc2suIEFsbCB0aHJlZSBsZWdzIG9mIHRoZSB0cmlhbmdsZSBhcmUgYWJ1bmRhbnRseSBldmlkZW50IGhlcmUuDQoNCkJlZm9yZSB3ZSBlbmdhZ2UgdGhlIENEQydzIG1vZGVsLCB3ZSdsbCBwZWVrIGF0IHRoZSAicmF3IiBkYXRhIChzY2FsZWQgdG8gcGVyIHRob3VzYW5kIHBvcHVsYXRpb24pIHdoaWxlIGtlZXBpbmcgaW4gbWluZCB0aGF0IGl0IGlzIGN1cmF0ZWQgYnkgdGhlIFtOQ0hTXShodHRwczovL3d3dy5jZGMuZ292L25jaHMvYWJvdXQvb3JnYW5pemF0aW9uLmh0bSksIGEgZGl2aXNpb24gb2YgdGhlIENEQy4gV2UnbGwgYXNzdW1lIHRoYXQgdGhlIGRhdGEgYXJlIHdoYXQgdGhlIFtDREMgc2F5cyB0aGV5IGFyZV0oaHR0cHM6Ly9kYXRhLmNkYy5nb3YvTkNIUy9XZWVrbHktQ291bnRzLW9mLURlYXRocy1ieS1TdGF0ZS1hbmQtU2VsZWN0LUNhdXNlcy9tdXp5LWp0ZTYpOiB1bnZhcm5pc2hlZCwgcmVwb3J0ZWQgZGVhdGhzIGRhdGEuIEFuIGF1ZGl0IHdvdWxkIGJlIHJlcXVpcmVkIHRvIHZlcmlmeSB0aGUgdmFsaWRpdHkgb2YgdGhpcyBhc3N1bXB0aW9uLiBGb3IgY29udGV4dCwgdGhlIFtVLlMuIGNydWRlIGFubnVhbCBtb3J0YWxpdHkgcmF0ZV0oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLkRZTi5DRFJULklOP2xvY2F0aW9ucz1VUykgaGFzIHJlY2VudGx5IGF2ZXJhZ2VkIDgtOSBuYXRpb25hbGx5LCByYW5naW5nIGJldHdlZW4gMTIuNSAoV1YpIGFuZCA5IChBbGFza2EpLiBBbmQsIGFjY29yZGluZyB0byB0aGUgQ0RDLCB0aGUgMTkxOCBmbHUga2lsbGVkIFs2NzUsMDAwXShodHRwczovL3d3dy5jZGMuZ292L2ZsdS9wYW5kZW1pYy1yZXNvdXJjZXMvMTkxOC1wYW5kZW1pYy1oMW4xLmh0bWwpIG91dCBvZiAxMDMgbWlsbGlvbiBBbWVyaWNhbnMgKDYuNiBEUFQpLg0KDQpLZWVwIGluIG1pbmQgdGhhdCB3ZSBhcmUgbG9va2luZyBhdCAqdG90YWwqIGRlYXRocyBkYXRhLCBub3QgQ292aWQtMTkgZGVhdGhzIGRhdGEuIFdoaWxlIHRoZSBwb3B1bGFyIG5hcnJhdGl2ZSBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gcmVtZW1iZXIgdGhpcywgZXZlbiB0aGUgQ0RDIGFkbWl0cyBpbiB0aGVpciBUZWNobmljYWwgTm90ZXMgdGhhdCAqdGhleSBkbyBub3Qga25vdyogd2hhdCBzaGFyZSBvZiAiZXhjZXNzIiBkZWF0aHMgY2FuIGJlIGJsYW1lZCBvbiBDb3ZpZC0xOS4gVGhpcyBtZWFucyB0aGF0IHRoZXkgY2Fubm90IHNheSBob3cgbWFueSBwZW9wbGUgaGF2ZSB0cnVseSBkaWVkIGZyb20gQ292aWQtMTkuIE5vIG9uZSBjYW4uIE5vdCB0aGUgV0hPLCBub3QgSm9obnMgSG9wa2lucyBVLiwgbm90IEVtb3J5IFUuLCBub3QgR2VvcmdpYSBUZWNoLiAqTm8gb25lIGtub3dzLiogRm9yIGFsbCB3ZSBrbm93LCB0aGUgQ292aWQtMTkgbmFycmF0aXZlIG1heSBiZSBtYXNraW5nIG90aGVyLCBtb3JlIGRlYWRseSBjYXVzZXMuDQoNCkZpZ3VyZSAxIGdldHMgdXMgc3RhcnRlZC4gSXQgdmlzdWFsaXplcyB3ZWVrbHkgdG90YWwgVS5TLiBEUFQgZnJvbSBhbGwgY2F1c2VzIGFuZCBhbGwganVyaXNkaWN0aW9ucyBzaW5jZSAyMDE0LiBUaGUgQ0RDIHNheXMgdGhhdCB0aGUgZGF0YSBmb3IgcHJlLTIwMjAgeWVhcnMgaXMgImZpbmFsIiBhbmQgdGhhdCAyMDIwLTIxIGRhdGEgYXJlICJwcm92aXNpb25hbCwiIHRob3VnaCB0aGUgImFsbCBjYXVzZSIgZGVhdGhzIGZpZ3VyZXMgKGZyb20gbW9zdCBzdGF0ZXMpIGFwcGVhciBwcmV0dHkgc3RhYmxlIGFmdGVyIGFib3V0IGZvdXIgd2Vla3MuDQoNCmBgYHtyfQ0KQnlTdGF0ZXMxNDIwKGMoIlVuaXRlZCBTdGF0ZXMiKSwgYygiRmlnLiAxLjEiKSwgYygiMjAxNC0wMS0wNCIpLCBjKCIyMDIwLTEyLTIwIikpICsNCmdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMjA3MTIxNSwgc2l6ZSA9IC42LCBjb2xvciA9ICJncmVlbjQiLCBhbHBoYSA9IC41KSArDQogIGxhYnModGl0bGUgPSAiV2Vla2x5IEFsbC1DYXVzZSBEZWF0aHMgcGVyIFRob3VzYW5kIiwgc3VidGl0bGUgPSAiSmFuIDIwMTQgLSBEZWMgMTksIDIwMjAiLCB5ID0gIkRlYXRocyBwZXIgVGhvdXNhbmQgUG9wIiwgeCA9ICJNb250aCAmIFllYXIiLCBjYXB0aW9uID0gIlNvdXJjZTogQ0RDL05DSFM7IFUuUy4gQ2Vuc3VzLiBcbiAyMDIwIHBvcHVsYXRpb24gaXMgYXNzdW1lZCBlcXVhbCB0byAyMDE5IFUuUy4gY2Vuc3VzIGVzdGltYXRlLiIsIHRhZyA9IGMoIkZpZy4gMSIpKQ0KYGBgDQoNCkV2ZW4gYXQgdGhpcyBhbHRpdHVkZSwgdGhlIDIwMjAgZGF0YSBwYWludCBhIHN0cmFuZ2UgcGljdHVyZSBjb21wYXJlZCB0byBwcmlvciB5ZWFycy4gVGhlIGhvcml6b250YWwgZ3JlZW4gbGluZSBtYXJrcyB0aGUgaGlnaC1wb2ludCBvZiB0aGUgMjAxOCBmbHUgc2Vhc29uLiBUaGUgeS1heGlzIHNjYWxlIHJ1bnMgZnJvbSAwLjEwIHRvIDAuOTUgZGVhdGhzIHBlciB0aG91c2FuZCAoRFBUKSB0byBhY2NvbW1vZGF0ZSBzcHJpbmcgMjAyMCBzcGlrZXMgaW4gdGhlIFRyaS1zdGF0ZSBhcmVhIChOWSwgQ1QsIE5KKS4gVGhlc2Ugd2lsbCBhcHBlYXIgbGF0ZXIuIFRoZSAyMDE5IGFuZCAyMDIwICpoaWdocyogc3RhbmQgb3V0LCByZXNwZWN0aXZlbHksIGFzIGxvdyBhbmQgaGlnaCwgYnV0IHdoeSBhbmQgYnkgaG93IG11Y2g/IFdlIHRha2UgYSBjbG9zZXIgbG9vayBpbiBGaWd1cmUgMi4xLCB3aGljaCBzaHJpbmtzIHRoZSB5LWF4aXMgKHZlcnRpY2FsKSByYW5nZSBhbmQgZHJvcHMgdGhlIDIwMTQgZGF0YS4gVGhpcyBicmluZ3Mgc21hbGxlciBwYXR0ZXJucyBpbnRvIHZpZXcuDQoNCmBgYHtyfQ0KRmlnXzIuMSA8LSBzdXBwcmVzc01lc3NhZ2VzKHByaW50KEJ5U3RhdGVzMTQyMChjKCJVbml0ZWQgU3RhdGVzIiksIGMoIkZpZy4gMi4xIiksIGMoIjIwMTQtMTItMzEiKSwgYygiMjAyMC0xMi0yMCIpKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMC4xMCwwLjI1LDAuMDI1KSxsaW1pdHMgPSBjKDAuMTAsMC4yNSkpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIyIG1vbnRocyIsIGRhdGVfbGFiZWxzID0gIiViICV5IikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjIwNzEyMTUsIHNpemUgPSAuNSwgY29sb3IgPSAiZ3JlZW40IiwgYWxwaGEgPSAuNSkgKw0KICBsYWJzKHRpdGxlID0gIldlZWtseSBBbGwtQ2F1c2UgRGVhdGhzIHBlciBUaG91c2FuZCAtIFUuUy4iLCBzdWJ0aXRsZSA9ICJPY3QgMjAxNCAtIERlYyAxOSAyMDIwIiwgeSA9ICJEZWF0aHMgcGVyIFRob3VzYW5kIFBvcCIsIHggPSAiTW9udGggJiBZZWFyIiwgY2FwdGlvbiA9ICJTb3VyY2U6IENEQy9OQ0hTOyBVLlMuIENlbnN1cy4gXG4gMjAyMCBwb3B1bGF0aW9uIGlzIGFzc3VtZWQgZXF1YWwgdG8gMjAxOSBVLlMuIGNlbnN1cyBlc3RpbWF0ZS4iLCB0YWcgPSBjKCJGaWcuIDIuMSIpKSkpDQoNCmBgYA0KDQpGaWd1cmUgMi4xIHNob3dzIGEgc3ByaW5nIDIwMjAgc3Bpa2UgaW4gcGluay4gQXQgaXRzIGFwZXgsIGl0IHJpc2VzIGJ5IHJvdWdobHkgMC4wMjUgRFBUIGFib3ZlIHRoZSAyMDE4IHBlYWsgKGJsdWUpLiBBIDQtd2Vlay1sb25nIHBlYWsgb2YgMC4wMjUgYWRkcyAwLjEwIGRlYXRocyBvciBhYm91dCAxIHBlcmNlbnQgb2YgdGhlICphbm51YWwqIHRvdGFsIG9mIDgtOSBEVFAuIFNwaWtlcyBpbiAyMDE1IGFuZCAyMDE4IHdlcmUgZm9sbG93ZWQgYnkgZG93biB5ZWFycy4gSWYgdGhpcyBwYXR0ZXJuIGhvbGRzLCB3ZSdsbCBzZWUgdGhlIDIwMjAgcGVhayBmb2xsb3dlZCBieSBsb3dzIGluIDIwMjEtMjIuIFRoYXQgaXMsIHVubGVzcyAtLSBhcyBbY2FuY2VyIGRpYWdub3NpcyBkYXRhIHN1Z2dlc3RdKGh0dHBzOi8vd3d3LnN0YXRuZXdzLmNvbS8yMDIwLzA4LzA0L25ldy1jYW5jZXItZGlhZ25vc2VzLWZlbGwtc2hhcnBseS1hZnRlci1jb3JvbmF2aXJ1cy8pIC0tIENvdmlkLTE5IGludGVydmVudGlvbnMgZHJpdmUgdXAgZGVhdGhzIGZyb20gb3RoZXIgY2F1c2VzLg0KDQpJbiBhZGRpdGlvbiwgMjAxOSBtaXNzZWQgdGhlIHR5cGljYWwgSmFudWFyeSAtIE1hcmNoIHNwaWtlLiBJbnN0ZWFkLCBkZWF0aHMgcGxhdGVhdWVkLiBMYXRlciwgYWZ0ZXIgdGhlIHN1bW1lciAyMDE5IHRyb3VnaCwgdGhleSBjbGltYmVkIEF1ZyB0byBKYW4sIHRoZW4gcGxhdGVhdWVkICphZ2FpbiogLS0gcmVtaW5pc2NlbnQgb2YgMjAxNiAtLSBpbiBKYW51YXJ5IGFuZCBGZWJydWFyeSAyMDIwLCBiZWZvcmUgc3Bpa2luZyB3ZWxsIGFib3ZlIHRoZSAyMDE4IHBlYWsgYmV0d2VlbiBNYXJjaCAyOCBhbmQgQXByaWwgMjUuIFRoZW4gdGhleSBkcm9wcGVkLCB3aXRoIGFuIGFmdGVyLXNob2NrIGluIG1pZCBKdWx5IHRvIGVhcmx5IEF1Z3VzdCwgYmVmb3JlIGZhbGxpbmcgYWdhaW4gdW50aWwgbWlkLU9jdG9iZXIuIEluIHNob3J0LCBsb3RzIG9mIHVwcyBhbmQgZG93bnMgYnV0IG5vIDIwMjAgc3VtbWVyIHRyb3VnaC4gVGhpcyBpcyBhbGwgYXQgdGhlIG5hdGlvbmFsIGxldmVsLg0KDQpIb3cgZG9lcyB0aGUgcGljdHVyZSBjaGFuZ2UgaWYgd2UgZXhjbHVkZSB0aGUgVHJpLXN0YXRlIGFyZWE/IEZpZ3VyZSAyLjIgdGVsbHMgdGhlIHRhaWwsIGFzIGl0IHdlcmUuIEZvY3VzIG9uIHRoZSBmbGF0IGdyZWVuIGxpbmUgKHJlcHJlc2VudGluZyB0aGUgMjAxOCBwZWFrIGluIGZsdSBkZWF0aHMpIGFuZCB0aGUgc3F1aWdnbHkgcHVycGxlIGFuZCBwaW5rIG9uZXMuDQoNCmBgYHtyfQ0KRmlnXzIuMiA8LSBzdXBwcmVzc01lc3NhZ2VzKHByaW50KEJ5U3RhdGVzMTQyMG5pbihjKCJVbml0ZWQgU3RhdGVzIiwgIk5ldyBZb3JrIENpdHkiLCAiTmV3IFlvcmsiLCAiQ29ubmVjdGljdXQiLCAiTmV3IEplcnNleSIpLCBjKCIyMDE0LTAxLTA0IiksIGMoIjIwMjAtMTItMjAiKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAuMTAsMC4yNSwwLjAyNSksbGltaXRzID0gYygwLjEwLDAuMjUpKSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMiBtb250aHMiLCBkYXRlX2xhYmVscyA9ICIlYiAleSIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4yMDcxMjE1LCBzaXplID0gLjUsIGNvbG9yID0gImdyZWVuNCIsIGFscGhhID0gLjUpICsNCiAgbGFicyh0aXRsZSA9ICJXZWVrbHkgQWxsLUNhdXNlIERQVCAtIFUuUy4gbGVzcyBUcmktc3RhdGUgYXJlYSIsIHN1YnRpdGxlID0gIk9jdCAyMDE0IC0gRGVjIDE5IDIwMjAiLCB5ID0gIkRlYXRocyBwZXIgVGhvdXNhbmQgUG9wIiwgeCA9ICJNb250aCAmIFllYXIiLCBjYXB0aW9uID0gIlNvdXJjZTogQ0RDL05DSFM7IFUuUy4gQ2Vuc3VzLiBcbiAyMDIwIHBvcHVsYXRpb24gaXMgYXNzdW1lZCBlcXVhbCB0byAyMDE5IFUuUy4gY2Vuc3VzIGVzdGltYXRlLiIsIHRhZyA9IGMoIkZpZy4gMi4yIikpKSkNCmBgYA0KDQpSZW1vdmluZyB0aGUgVHJpLXN0YXRlIGRyb3BzIHRoZSAqbmF0aW9uYWwqIHNwcmluZyAyMDIwIHBlYWsgYmVsb3cgSmFudWFyeSAyMDE4LiBUaGUgbGluZSB0aGVuIG1vcnBocyBpbnRvIGEgc2VycGVudGluZSBzcHJpbmctc3VtbWVyLWZhbGwgdGhhdCB3b3VsZCBtYWtlIEhvZ3dhcnRzIGFuZCBMb2NoIE5lc3MgcHJvdWQuIEl0J3MgYWxtb3N0IGFzIGlmIHRoZSBwZWFrIHRoYXQgbm8tc2hvd2VkIGluIEphbnVhcnkgMjAxOSB3YXMgIlthcHBhcmF0ZWRdKGh0dHBzOi8vaGFycnlwb3R0ZXIuZmFuZG9tLmNvbS93aWtpL0FwcGFyaXRpb24pIiBpbnRvIHNwcmluZyBhbmQgc3VtbWVyIDIwMjAuIE1heWJlLCBvdXRzaWRlIG9mIHRoZSBmaXJzdC1oaXQgVHJpLXN0YXRlIC0tIHdoaWNoIHNwaWtlZCB0aGUgMjAyMCBuYXRpb25hbCBoaWdoIG92ZXIgdGhlIChncmVlbikgMjAxOCBmbHUgbGluZSAtLSB0aGUgc3ByaW5nIDIwMjAgc2Nob29sIGFuZCBidXNpbmVzcyBjbG9zdXJlcyB0aGF0IG9jY3VycmVkIGluIG1hbnkgc3RhdGVzIChlLmcuLCBHZW9yZ2lhKSBtZXJlbHkgc21vb3RoZWQgZGVhdGhzIGludG8gdGhlIHN1bW1lci4gV2UgY2FuIHNlYXJjaCBmb3IgdGhlIHNlcnBlbnQgaW4gdGhlIHN0YXRlIGRhdGEsIHRob3VnaCB0aGlzIHdvbid0IGd1YXJhbnRlZSB0aGF0IHRoZSBkYXRhIGNhbiBiZSB0cnVzdGVkLiBGaXJzdCwgbGV0J3MgdGFsayBtb2RlbGluZyBleGNlc3MgZGVhdGhzLg0KDQpFeGNlc3MgZGVhdGhzIGFyZSBlc3RpbWF0ZWQsIG5vdCBjb3VudGVkLiBUaGV5IGFyZSBhIGZ1bmN0aW9uIG9mIGJvdGggdGhlIGVzdGltYXRvcidzIHN1YmplY3RpdmUganVkZ21lbnRzIGFuZCBvYmplY3RpdmUgZGF0YS4gSXQgaXMgd2lkZWx5IGFjY2VwdGVkIHRoYXQgKmVzdGltYXRlZCogZXhjZXNzIGRlYXRocyBlcXVhbHMgKnJlcG9ydGVkKiBkZWF0aHMgZnJvbSBhbGwgY2F1c2VzIGluIGV4Y2VzcyBvZiAqZXN0aW1hdGVkKiAiZXhwZWN0ZWQiIGRlYXRocyBvdmVyIGEgZ2l2ZW4gdGltZSBwZXJpb2QgaW4gYSBjaG9zZW4gZ2VvZ3JhcGhpY2FsIGFyZWEuIEluIHRoZW9yeSwgZXhjZXNzIGRlYXRocyBtYXkgcmVzdWx0IGZyb20gc29tZSBub3ZlbCBjYXVzZSBvciBjYXVzZXMgbGlrZSwgZS5nLiwgQ292aWQtMTkgYW5kIHNvY2lldGFsIHJlc3BvbnNlcyB0byBpdC4gSG93ZXZlciwgdGhlIFtDREMgc3RhdGVzXShodHRwczovL3d3dy5jZGMuZ292L25jaHMvbnZzcy92c3JyL2NvdmlkMTkvZXhjZXNzX2RlYXRocy5odG0pIHRoYXQgQ292aWQtMTkgbWF5ICpub3QqIGJlIHRoZSBjYXVzZSBvZiAqYW55KiBvZiB0aGUgQ0RDJ3MgZXN0aW1hdGVkIGV4Y2VzcyBkZWF0aHMuW141XSBTaW1pbGFybHksIGFuIGV4Y2VzcyBvZiB6ZXJvIG9yIGxlc3MgaXMgc29tZSBldmlkZW5jZSB0aGF0IG5vIG5vdmVsIGNhdXNlIGlzIGtpbGxpbmcgbGFyZ2UgbnVtYmVycyBvZiBwZW9wbGUgd2hvIHdvdWxkIG5vdCBkaWUgYW55d2F5LiBTbyB0aGUgZGViYXRlIGNlbnRlcnMgb24gdGhlIG1lYW5pbmcgYW5kIGVzdGltYXRpb24gb2YgdGhlICpwbGF1c2libGUgcmFuZ2UqIG9mIGV4cGVjdGVkIGRlYXRocywgdGhlIHByb3BlciB0aW1lIGFuZCBnZW9ncmFwaHkgKnN1YnNldHMqIHRvIHVzZSBmb3IgY29tcGFyaW5nIGV4cGVjdGVkIHRvIGFjdHVhbCBkZWF0aHMsIGhvdyB0byAqcHJlc2VudCogdGhlIGNvbXBhcmlzb24sIGFuZCAqd2hhdCBzaGFyZSogb2YgdGhlIGV4Y2VzcywgaWYgYW55LCB0byBhdHRyaWJ1dGUgdG8gcGFydGljdWxhciBwbGF1c2libGUgY2F1c2VzIChlLmcuLCBDb3ZpZC0xMCkuDQoNClteNV06ICJGaW5hbGx5LCB0aGUgZXN0aW1hdGVzIG9mIGV4Y2VzcyBkZWF0aHMgcmVwb3J0ZWQgaGVyZSBtYXkgbm90IGJlIGR1ZSB0byBDT1ZJRC0xOSwgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuIiBUZWNobmljYWwgTm90ZXMsIDxodHRwczovL3d3dy5jZGMuZ292L25jaHMvbnZzcy92c3JyL2NvdmlkMTkvZXhjZXNzX2RlYXRocy5odG0+Lg0KDQpJbiBpdHMgW09jdG9iZXIgMjMsIDIwMjAgTW9yYmlkaXR5IGFuZCBNb3J0YWxpdHkgV2Vla2x5IFJlcG9ydF0oaHR0cHM6Ly93d3cuY2RjLmdvdi9tbXdyL3ZvbHVtZXMvNjkvd3IvbW02OTQyZTIuaHRtKSAoTU1XUiksIHRoZSBDREMgcHVibGlzaGVkIDI5OSwwMjggYXMgaXRzIGVzdGltYXRlIG9mIG5hdGlvbndpZGUgKmV4Y2VzcyogZGVhdGhzLCBmcm9tIEZlYiAxIHRvIE9jdCAzLCAyMDIwLiBJdCBhdHRyaWJ1dGVkIFx+Mi8zIG9mIHRoZXNlICgxOTgsMDgxKSB0byBDb3ZpZC0xOS5bXjZdIFRoaXMgMTk4LDA4MSBudW1iZXIsIGFwcGFyZW50bHkgYmFzZWQgbGFyZ2VseSBvbiBQQ1IgdGVzdCBwb3NpdGl2ZXMsIG1heSBiZSBzaWduaWZpY2FudGx5IG92ZXJzdGF0ZWQsIHBhcnRpY3VsYXJseSBpbiBsaWdodCBvZiB0aGUgV0hPJ3MgW0phbiAyMCwgMjAyMSBOb3RpY2VdKGh0dHBzOi8vd3d3Lndoby5pbnQvbmV3cy9pdGVtLzIwLTAxLTIwMjEtd2hvLWluZm9ybWF0aW9uLW5vdGljZS1mb3ItaXZkLXVzZXJzLTIwMjAtMDUpIHdhcm5pbmcsIGNvbnRyYXJ5IHRvIGxvbmdzdGFuZGluZyBDREMgQ292aWQtMTkgZG9nbWEsIHRoYXQgYSBzaW5nbGUgUENSIHRlc3QgcG9zaXRpdmUgYWxvbmUgZG9lcyBub3QganVzdGlmeSBhICJDb3ZpZC0xOSIgZGlhZ25vc2lzLlteN10NCg0KW142XTogU2VlIFtcPGh0dHBzOi8vd3d3LmNkYy5nb3YvbW13ci92b2x1bWVzLzY5L3dyL21tNjk0MmUyLmh0bVw+XShodHRwczovL3d3dy5jZGMuZ292L21td3Ivdm9sdW1lcy82OS93ci9tbTY5NDJlMi5odG0pLiBUaGUgMTk4LDA4MSAiYXR0cmlidXRlZCIgdG8gQ292aWQtMTkgYXBwYXJlbnRseSByZXByZXNlbnRzIGRlYXRocyB3aGF0IHRoZSBDREMgY2FsbHMgImNvbmZpcm1lZCBvciBwcmVzdW1lZCBDT1ZJRC0xOSBkZWF0aHMuIiBCeSAiY29uZmlybWVkLCIgdGhlIENEQyBtZWFucyB0aGF0IHRoZSBkZWNlZGVudCBhdCBzb21lIHBvaW50IHJlY2VpdmVkIGEgcG9zaXRpdmUgUENSIHRlc3QgcmVzdWx0LCBzdWdnZXN0aW5nIHRoZSBwcmVzZW5jZSBvZiBTQVJTLUNPVi0yIHZpcnVzLg0KDQpbXjddOiAiVGhlIGN5Y2xlIHRocmVzaG9sZCAoQ3QpIG5lZWRlZCB0byBkZXRlY3QgdmlydXMgaXMgaW52ZXJzZWx5IHByb3BvcnRpb25hbCB0byB0aGUgcGF0aWVudCdzIHZpcmFsIGxvYWQuIFdoZXJlIHRlc3QgcmVzdWx0cyBkbyBub3QgY29ycmVzcG9uZCB3aXRoIHRoZSBjbGluaWNhbCBwcmVzZW50YXRpb24sIGEgbmV3IHNwZWNpbWVuIHNob3VsZCBiZSB0YWtlbiBhbmQgcmV0ZXN0ZWQgdXNpbmcgdGhlIHNhbWUgb3IgZGlmZmVyZW50IE5BVCB0ZWNobm9sb2d5LiINCg0KVGhhdCBzYWlkLCBpbiB0aGUgTU1XUiwgdGhlIENEQyBzdGF0ZXMgdGhhdCBleGNlc3MgZGVhdGhzICJoYXZlIGJlZW4gdXNlZCB0byBlc3RpbWF0ZSB0aGUgaW1wYWN0IG9mIHB1YmxpYyBoZWFsdGggcGFuZGVtaWNzIG9yIGRpc2FzdGVycywgcGFydGljdWxhcmx5IHdoZW4gdGhlcmUgYXJlIHF1ZXN0aW9ucyBhYm91dCB1bmRlcmFzY2VydGFpbm1lbnQgb2YgZGVhdGhzIGRpcmVjdGx5IGF0dHJpYnV0YWJsZSB0byBhIGdpdmVuIGV2ZW50IG9yIGNhdXNlLiIgVGhpcyBpbXBsaWVzLCBtaXNsZWFkaW5nbHksIHRoYXQgZXhjZXNzIGRlYXRocyBhcmUgbm90IGFsc28gdXNlZnVsIGZvciBleHBvc2luZyBzdXNwZWN0ZWQgb3Zlci1jb3VudHMuDQoNCkluIGFueSBjYXNlLCBhZnRlciB1cGRhdGluZyBmb3IgZGF0YSBhdmFpbGFibGUgdGhyb3VnaCBtaWQtSmFudWFyeSAyMDIxLCB0aGUgQ0RDJ3MgKmdyb3NzKiBlc3RpbWF0ZWQgZXhjZXNzIGZvciB0aGUgRmViIDEgLSBPY3QgMywgMjAyMCBwZXJpb2QgaXMgZWl0aGVyIDMxMUsgb3IgMjA2SywgZGVwZW5kaW5nIG9uIHdoaWNoIGV4cGVjdGVkIGRlYXRoIGJlbmNobWFyayAobWVhbiBvciB1cHBlci1ib3VuZCkgaXMgdXNlZC4gSWYgd2UgYXNzdW1lIHRoYXQgdGhlIENEQydzIDIvMyBtdWx0aXBsaWVyIGhvbGRzIGZvciBhbGwgbnVtYmVycyBvZiBleGNlc3MgZGVhdGhzLCB0aGVzZSB3b3VsZCB0cmFuc2xhdGUgdG8gMjA4SyBvciAxMzdLICpncm9zcyogZXN0aW1hdGVkIENvdmlkLTE5IGRlYXRocy4NCg0KYGBge3J9DQpmaWx0ZXIoV3RkX0NEQ19DMTlfRXgsICFDb2RlID09ICJVUyIgJiBgV2VlayBFbmRpbmcgRGF0ZWAgPiAiMjAyMC0wMS0zMSIgJiBgV2VlayBFbmRpbmcgRGF0ZWAgPCAiMjAyMC0xMC0wNCIpICU+JSANCiAgZ3JvdXBfYnkoKSAlPiUgDQogIHN1bW1hcmlzZShFeGNlc3MgPSBzdW0oYEV4Y2VzcyBIaWdoZXIgRXN0aW1hdGVgKSoyLzMpDQoNCmZpbHRlcihXdGRfQ0RDX0MxOV9FeCwgIUNvZGUgPT0gIlVTIiAmIGBXZWVrIEVuZGluZyBEYXRlYCA+ICIyMDIwLTAxLTMxIiAmIGBXZWVrIEVuZGluZyBEYXRlYCA8ICIyMDIwLTEwLTA0IikgJT4lIA0KICBncm91cF9ieSgpICU+JSANCiAgc3VtbWFyaXNlKEV4Y2VzcyA9IHN1bShgRXhjZXNzIExvd2VyIEVzdGltYXRlYCkqMi8zKQ0KYGBgDQoNCkJ1dCB0aGlzIDgtbW9udGgsICpncm9zcyogbmF0aW9uYWwgZXN0aW1hdGUsIGJhc2VkIG9uIFttdWx0aXBsZSBieS1zdGF0ZS1ieS13ZWVrIHN0YXRpc3RpY2FsIG1vZGVsc10oaHR0cHM6Ly93d3cuY2RjLmdvdi9uY2hzL252c3MvdnNyci9jb3ZpZDE5L2V4Y2Vzc19kZWF0aHMuaHRtKSxbXjhdIGlzIG1pc2xlYWRpbmcuIFRoaXMgaXMgcGFydGx5IGJlY2F1c2UgaXQgYXJiaXRyYXJpbHkgY2hlcnJ5LXBpY2tzIGVpZ2h0IG1vbnRocyBpbnN0ZWFkIG9mIHR3ZWx2ZS4gQW5kIG5vdCBqdXN0IGFueSBlaWdodCBtb250aHMuIFN0YXJ0aW5nIHRoZSBjb3VudCBqdXN0IGFzIGRlYXRocyB3ZXJlIGFib3V0IHRvIHNwaWtlIGluIHRoZSBUcmktc3RhdGUgaXMgbGlrZSBIb21lIERlcG90IHJlcG9ydGluZyBwcm9maXRzIGZvciBvbmx5IGl0cyAqYmVzdCogZWlnaHQgbW9udGhzLiBJdCBhbHNvIGltcGxpZXMgdGhhdCBhIG5hdGlvbndpZGUgZXN0aW1hdGUgaXMgbWVhbmluZ2Z1bCB3aGVuLCBiZWNhdXNlIG9mIGRpdmVyc2l0eSBhbW9uZyBzdGF0ZXMgYW5kIHJlZ2lvbnMsIGl0IGlzIG5vdC4NCg0KW144XTogU2VlIDxodHRwczovL3d3dy5jZGMuZ292L25jaHMvbnZzcy92c3JyL2NvdmlkMTkvZXhjZXNzX2RlYXRocy5odG0+Lg0KDQpZZXQgcXVlc3Rpb25zIHJlZ2FyZGluZyB0aGUgQ0RDIGVzdGltYXRlIC0tIGludm9sdmluZyBiaW5uaW5nLCBuZXR0aW5nLCBhbGdvcml0aG0gY2hvaWNlLCBlc3RpbWF0aW9uIHVuY2VydGFpbnR5LCBhbmQgdHJhaW5pbmcgZGF0YSAtLSBydW4gbXVjaCBkZWVwZXIuIEFuZCB0aGUgbmV0IGltcGFjdCBvZiBDb3ZpZC0xOSB3aGVyZSB5b3UgbGl2ZSBpcyBwcm9iYWJseSBtdWNoIGxlc3MgdGhhbiB0aGUgQ0RDJ3MgbmF0aW9uYWwgZXN0aW1hdGUgc3VnZ2VzdHMuIEluIG1vc3Qgc3RhdGVzLCBhY2NvcmRpbmcgdG8gdGhlIENEQydzIG93biAicHJvdmlzaW9uYWwiIG51bWJlcnMsIHRoZSBuZXQgaW1wYWN0IG9mIENvdmlkLTE5IGZvciB0aGUgeWVhciBlbmRlZCBTZXB0ZW1iZXIgMzAsIDIwMjAgd2FzIHplcm8gb3IgbGVzcywgaWYgd2UgdXNlIHRoZSBsb3dlciBzaWRlIG9mIHRoZSBDREMncyBlc3RpbWF0ZS4gV2hhdD8gVGhlIENEQydzIGVzdGltYXRlIGlzIHR3by1zaWRlZCwgeW91IGFzaz8gWWVzLCBvZiBjb3Vyc2UuIE1vcmUgdGhhbiB0d28tc2lkZWQuIFRoaXMgaXMgdHJ1ZSBvZiAqZXZlcnkqIGVzdGltYXRlLiBOdW1iZXJzIGNhbiBiZSBzcHVuIGluIG1hbnkgZGlyZWN0aW9ucy4gRXN0aW1hdGVzIGFuZCB0aGVpciBpbnRlcnByZXRhdGlvbiBhcmUgYXMgbXVjaCBhcnQgYXMgc2NpZW5jZSwgYW5kIGVzdGltYXRlcyBjb3ZlciBhICpyYW5nZSogb2YgcG9zc2liaWxpdGllcy4gSW4gdGhlIENEQydzIGNhc2UsIHRoZSByYW5nZSBpcyB2ZXJ5IHdpZGUuIExldCdzIGNvbnNpZGVyIGhvdyBhbmQgd2h5Lg0KDQojIyBJSS4gUXVlc3Rpb25zICYgY2hvaWNlcw0KDQpUaGUgW0NEQydzIG1vZGVsXShodHRwczovL3d3dy5jZGMuZ292L25jaHMvbnZzcy92c3JyL2NvdmlkMTkvZXhjZXNzX2RlYXRocy5odG0pIHJlbGllcyBpbiBsYXJnZSBwYXJ0IG9uIGZpdmUgc3ViamVjdGl2ZSBjaG9pY2VzOiAxLiAqdGltZSBhbmQgZ2VvZ3JhcGh5IHNlZ21lbnRzKiBvciAiYmlucyIgZm9yIHByZWRpY3Rpb24gYW5kIHJlcG9ydGluZywgMi4gd2hldGhlciB0byAqaWdub3JlIGRlZmljaXRzIG9yIG5ldCB0aGVtKiBhZ2FpbnN0IHN1cnBsdXNlcywgMy4gd2hhdCB0byBzYXkgYWJvdXQgKmVzdGltYXRpb24gdW5jZXJ0YWludHkqIChlLmcuLCByZXBvcnQgaGlnaCBhbmQgbG93IHBvaW50IGVzdGltYXRlcyBvciBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb25zIG92ZXIgdGhlIHBsYXVzaWJsZSByYW5nZSksIDQuIHdoaWNoIGFsZ29yaXRobSBvciBvdGhlciB0b29sIHRvIHVzZSBpbiBwcmVkaWN0aW5nIChpLmUuLCAibW9kZWxpbmciKSBleHBlY3RlZCBkZWF0aHMsIGFuZCA1LiB3aGljaCBoaXN0b3JpY2FsIGRhdGEgdG8gdXNlIGZvciAidHJhaW5pbmciIHRoZSBtb2RlbC4gVGhlc2UgY2hvaWNlcyBzaWduaWZpY2FudGx5IGltcGFjdCBvdXRjb21lcy4NCg0KT3ZlcnNoYWRvd2luZyB0aGVzZSBtb2RlbGluZyBjaG9pY2VzIGFyZSB2aXNjZXJhbCB2YWx1ZS1iYXNlZCBxdWVzdGlvbnM6IFdoYXQgaXMgdGhlIGFwcHJvcHJpYXRlICJsb3NzIGZ1bmN0aW9uIiBmb3IgZXZhbHVhdGluZyBwb3NzaWJsZSByZWd1bGF0b3J5IHJlc3BvbnNlcyB0byBub3ZlbCBjYXVzZXMgb2YgbW9ydGFsaXR5IGxpa2UgQ292aWQtMTk/IEluIG90aGVyIHdvcmRzLCB3aGF0IHNob3VsZCBzb2NpZXR5IGJlIHRyeWluZyB0byBtYXhpbWl6ZSBvciBtaW5pbWl6ZSB3aXRoIHJlZ3VsYXRvcnkgY2hvaWNlcz8gRG8gd2Ugd2FudCB0byBtYXhpbWl6ZSB0aGUgam95cyBvZiBhc3NvY2lhdGlvbiB3aXRoIG90aGVyIGh1bWFuIGJlaW5ncyBvciBtaW5pbWl6ZSBleHBvc3VyZSB0byBhIHNpbmdsZSByaXNrIChlLmcuLCBjb250cmFjdGluZyBDb3ZpZC0xOSk/DQoNCldlJ2xsIGNvbW1lbnQgYnJpZWZseSBvbiBlYWNoIG9mIHRoZXNlIGlzc3VlcyBpbiB0aGUgc2VjdGlvbnMgdGhhdCBmb2xsb3cuDQoNCiMjIyBBLiBOZXR0aW5nICYgYmlubmluZw0KDQpUaGUgW0NEQydzIGV4Y2VzcyBkZWF0aHMgbW9kZWxdKGh0dHBzOi8vd3d3LmNkYy5nb3YvbmNocy9udnNzL3ZzcnIvY292aWQxOS9leGNlc3NfZGVhdGhzLmh0bSkgKHdlJ2xsIGNhbGwgdGhlbSAic3VycGx1cyIgZGVhdGhzKSBwcmVkaWN0cyBob3cgbWFueSBwZW9wbGUgd2lsbCBkaWUgaW4gKmVhY2ggd2Vlayogb2YgdGhlIHllYXIgaW4gKmVhY2ggc3RhdGUqLiBUaGVzZSB3ZWVrbHktYnktc3RhdGUgKnByZWRpY3Rpb25zKiBhcmUgdGhlbiBjb21wYXJlZCB0byAqcmVwb3J0ZWQqIGRlYXRocy4gSWYgdGhlIHJlcG9ydGVkIGRlYXRocyBleGNlZWQgcHJlZGljdGVkIGRlYXRocyBpbiBhIGdpdmVuIHdlZWssIHRoYXQgZXhjZXNzIGNvdW50cyB0b3dhcmQgc3VycGx1cyBkZWF0aHMuIEhvd2V2ZXIsIGFueSBkZWZpY2l0IChpLmUuLCB3aGVyZSBwcmVkaWN0ZWQgZGVhdGhzIGV4Y2VlZCByZXBvcnRlZCkgaXMgY291bnRlZCBhcyB6ZXJvLlteOV0gVGhlIENEQyB0aGVuIHJlcG9ydHMgdGhlIHN1bSBvZiB0aGVzZSB3ZWVrbHksIGdyb3NzIHN1cnBsdXNlcyBhcyBVLlMuIGV4Y2VzcyBkZWF0aHMuDQoNClteOV06ICJOZWdhdGl2ZSB2YWx1ZXMsIHdoZXJlIHRoZSBvYnNlcnZlZCBjb3VudCBmZWxsIGJlbG93IHRoZSB0aHJlc2hvbGRzLCB3ZXJlIHNldCB0byB6ZXJvLi4uIFRoZSB0b3RhbCBudW1iZXIgb2YgZXhjZXNzIGRlYXRocyBpbiBlYWNoIHN0YXRlIHdhcyBjYWxjdWxhdGVkIGJ5IHN1bW1pbmcgdGhlIGV4Y2VzcyBkZWF0aHMgaW4gZWFjaCB3ZWVrLCBmcm9tIEZlYnJ1YXJ5IDEsIDIwMjAgdG8gcHJlc2VudC4iIDxodHRwczovL3d3dy5jZGMuZ292L25jaHMvbnZzcy92c3JyL2NvdmlkMTkvZXhjZXNzX2RlYXRocy5odG0+Lg0KDQpMZXQncyB1c2UgR2VvcmdpYSBhcyBhbiBleGFtcGxlLiBGaWd1cmUgMywgY29waWVkIGZyb20gdGhlIFtDREMncyB3ZWJzaXRlXShodHRwczovL3d3dy5jZGMuZ292L25jaHMvbnZzcy92c3JyL2NvdmlkMTkvZXhjZXNzX2RlYXRocy5odG0pLCBpbGx1c3RyYXRlcyB0aGUgaW1wYWN0IG9mIHRoZSBDREMncyBuZXR0aW5nIGFuZCBiaW5uaW5nIGNob2ljZXMgb24gR2VvcmdpYSdzIHN1cnBsdXMgZGVhdGhzLiBUaGUgYmx1ZSB2ZXJ0aWNhbCBiYXJzIHNob3cgcmVwb3J0ZWQgZGVhdGhzIGFkanVzdGVkIGZvciB0aGUgQ0RDJ3MgYXNzdW1wdGlvbnMgYWJvdXQgaW5jb21wbGV0ZSByZXBvcnRpbmcuIFRoZSBicm93biBsaW5lIHZpc3VhbGl6ZXMgdGhlICptZWFuKiBDREMgZXhwZWN0ZWQgZGVhdGhzIHByb2R1Y2VkIGJ5IHRoZSBtb2RlbC4gVGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGJyb3duIGxpbmUgYW5kIHRoZSB0b3Agb2YgdGhlIGJsdWUgYmFycy0taW4geWVsbG93IGhpZ2hsaWdodC0tZXF1YWxzIHRoZSBkZWZpY2l0IG9yIHN1cnBsdXMgZGVhdGhzIHBlciB3ZWVrLCBidXQgb25seSBpZiB3ZSB1c2UgdGhlICptZWFuKiBleHBlY3RlZC1kZWF0aCB0aHJlc2hvbGQuIElmIHRoZSBDREMncyBkYXNoYm9hcmQgYWxsb3dlZCB1cyB0byB1c2UgdGhlIHVwcGVyLWJvdW5kIGV4cGVjdGVkIGRlYXRocywgdGhlIGJyb3duIGxpbmUgd291bGQgcmlzZSBhbmQgdGhlIHllbGxvdyB6b25lIHdvdWxkIGV4cGFuZCBjb25zaWRlcmFibHkuDQoNCkZpZy4gMw0KDQpbIVtTb3VyY2U6IFw8aHR0cHM6Ly93d3cuY2RjLmdvdi9uY2hzL252c3MvdnNyci9jb3ZpZDE5L2V4Y2Vzc19kZWF0aHMuaHRtXD5dKGltYWdlcy9HQSUyMEV4Y2Vzcy0wMS5QTkcgIkNEQyBlc3RpbWF0ZSBvZiBHZW9yZ2lhIEV4Y2VzcyBDb3ZpZC0xOSBkZWF0aHMiKV0oaHR0cHM6Ly93d3cuY2RjLmdvdi9uY2hzL252c3MvdnNyci9jb3ZpZDE5L2V4Y2Vzc19kZWF0aHMuaHRtKQ0KDQpUaGUgbWVhbi1iYXNlZCBkZWZpY2l0cyBoaWdobGlnaHRlZCBpbiB5ZWxsb3cgd2VyZSBpZ25vcmVkIGJ5IHRoZSBDREMncyBuYXRpb25hbCBlc3RpbWF0ZSBvZiAxOThLIENvdmlkLTE5IGRlYXRocy4gSWdub3JpbmcgdGhlIHllbGxvdyB6b25lIGluZmxhdGVzIGVzdGltYXRlZCBDb3ZpZC0xOSBkZWF0aHMsIGp1c3QgYXMgaWYgSG9tZSBEZXBvdCB3ZXJlIHRvIHJlcG9ydCBpdHMgZ3Jvc3MgcmV2ZW51ZXMgKHdpdGhvdXQgZGVkdWN0aW5nIGV4cGVuc2VzKSBhcyBuZXQgaW5jb21lLiBUbyBpbGx1c3RyYXRlIHRoZSBpbXBhY3Qgb2YgdGhpcyBvbmUtc2lkZWQgYWNjb3VudGluZywgKmdyb3NzKiBHZW9yZ2lhIGV4Y2VzcyBkZWF0aHMgKGlnbm9yaW5nIHRoZSB5ZWxsb3cgem9uZSkgZm9yIHRoZSB0d28geWVhcnMsIDIwMTktMjAyMCwgdXNpbmcgdGhlIENEQydzIG1lYW4gZXhwZWN0ZWQgZGVhdGhzIHdvdWxkIGJlIDE0LDE0NCwgd2hpbGUgdGhlICpuZXQqIChjb3VudGluZyB0aGUgeWVsbG93IHpvbmUpIHdvdWxkIGJlIDIsMTU2IGxlc3MsIG9yIDExLDk4ODoNCg0KYGBge3J9DQpmaWx0ZXIoV3RkX0NEQ19DMTlfRXgsIFN0YXRlICVpbiUgYygiR2VvcmdpYSIpICYgKFllYXIgPT0gIjIwMjAiIHwgWWVhciA9PSAiMjAxOSIpKSAlPiUgICBncm91cF9ieSgpICU+JSANCiAgc3VtbWFyaXNlKHN1bShgRXhjZXNzIEhpZ2hlciBFc3RpbWF0ZWApKQ0KDQpmaWx0ZXIoV3RkX0NEQ19DMTlfRXgsIFN0YXRlICVpbiUgYygiR2VvcmdpYSIpICYgKFllYXIgPT0gIjIwMjAiIHwgWWVhciA9PSAiMjAxOSIpKSAlPiUgICBncm91cF9ieSgpICU+JSANCiAgc3VtbWFyaXNlKHN1bShgT2JzZXJ2ZWQgTnVtYmVyYCAtIGBBdmVyYWdlIEV4cGVjdGVkIENvdW50YCkpDQpgYGANCg0KQnkgY29udHJhc3QsIGlmIG1lYXN1cmVkIGFnYWluc3QgdGhlIENEQydzICp1cHBlciBib3VuZCogZXhwZWN0ZWQgZGVhdGhzLCB0aGUgQ0RDJ3MgZXN0aW1hdGUgb2YgR2VvcmdpYSdzICpncm9zcyBzdXJwbHVzKiAoZXhjZXNzKSBkZWF0aHMgd291bGQgYmUgOCw5OTcsIHdpdGggYSAqbmV0IGRlZmljaXQqIG9mIDE4NToNCg0KYGBge3J9DQpmaWx0ZXIoV3RkX0NEQ19DMTlfRXgsIFN0YXRlICVpbiUgYygiR2VvcmdpYSIpICYgKFllYXIgPT0gIjIwMjAiIHwgWWVhciA9PSAiMjAxOSIpKSAlPiUgICBncm91cF9ieSgpICU+JSANCiAgc3VtbWFyaXNlKHN1bShgRXhjZXNzIExvd2VyIEVzdGltYXRlYCkpDQoNCmZpbHRlcihXdGRfQ0RDX0MxOV9FeCwgU3RhdGUgJWluJSBjKCJHZW9yZ2lhIikgJiAoWWVhciA9PSAiMjAyMCIgfCBZZWFyID09ICIyMDE5IikpICU+JSAgIGdyb3VwX2J5KCkgJT4lIA0KICBzdW1tYXJpc2Uoc3VtKGBPYnNlcnZlZCBOdW1iZXJgLWBVcHBlciBCb3VuZCBUaHJlc2hvbGRgKSkNCmBgYA0KDQpUaGUgQ0RDIGF0dGVtcHRzIHRvIHJhdGlvbmFsaXplIHRoaXMgc3VycGx1cy1vbmx5IGFjY291bnRpbmcgYnkgYXJndWluZyB0aGF0IHNvbWUgd2Vla2x5IGRlZmljaXRzIGluIHNvbWUgc3RhdGVzIG1heSBldmVudHVhbGx5IGZsaXAgdG8gc3VycGx1c2VzIGJlY2F1c2Ugb2YgImluY29tcGxldGUiIHJlcG9ydGluZy4gVGhpcyBhcmd1bWVudCBkb2VzIG5vdCBwYXNzIHRoZSBzdHJhaWdodC1mYWNlIHRlc3QuIFJlcG9ydGluZyBpcyAqYWx3YXlzKiBpbmNvbXBsZXRlIGFuZCBldmVyeSBvcmdhbml6YXRpb24gaGFzIGFjY291bnRpbmcgY3V0b2Zmcy4gRnVydGhlcm1vcmUsIGRhdGEgc2NpZW50aXN0cyByb3V0aW5lbHkgW21vZGVsIG1pc3Npbmcgb3IgaW5jb21wbGV0ZSBkYXRhXShodHRwczovL3d3dy5qc3RhdHNvZnQub3JnL2FydGljbGUvdmlldy92MDQ1aTAzKSwgZXNwZWNpYWxseSBpbiB0aGUgaGVhbHRoIHNjaWVuY2VzLiBJdCdzIFtkYXRhIHNjaWVuY2UgMTAxXShodHRwczovL2FtaWNlcy5vcmcvbWljZS9pbmRleC5odG1sKSwgYXMgdGhlIENEQyB3ZWxsIGtub3dzLiBUaGUgQ0RDJ3Mgb3duIG1vZGVsICJ3ZWlnaHRzIiB3ZWVrbHkgYnktc3RhdGUgcmVwb3J0ZWQgZGVhdGhzIGJ5IHRoZWlyIHByZWRpY3RlZCBpbmNvbXBsZXRlbmVzcy4gVGhhdCB0aGUgQ0RDIG1vZGVscyB0aGVzZSByZXBvcnRpbmcgbGFncyBtZWFucyB0aGV5IGNhbiBhbHNvIG1vZGVsIHRoZSBkZWZpY2l0cy4NCg0KQW5kIGxldCdzIG5vdCBmb3JnZXQgdGhhdCB0aGUgbnVtYmVycyB1c2VkIGJ5IHRoZSBDREMgdG8gcmVjb21tZW5kIG5hdGlvbndpZGUgbG9jayBkb3ducyBpbiB0aGUgc3ByaW5nIG9mIDIwMjAgd2VyZSBiZXlvbmQgImluY29tcGxldGUiOiB0aGV5IHdlcmUgbGFyZ2VseSBpbWFnaW5hcnkuIFNvIHdoaWxlIGRlZmljaXRzIGZvciBzb21lIHNsb3cganVyaXNkaWN0aW9ucyAoZS5nLiwgTm9ydGggQ2Fyb2xpbmEpIG1pZ2h0IHdhcnJhbnQgImRlZmVycmVkIG5ldHRpbmcsIiBwZXJtYW5lbnRseSBoaWRpbmcgdGhlIGRlZmljaXRzIGZpbmRzIG5vIHNjaWVudGlmaWMganVzdGlmaWNhdGlvbi4NCg0KQXQgdGhlIG5hdGlvbmFsIGxldmVsLCBieSBuZXR0aW5nIGVzdGltYXRlZCBkZWZpY2l0cyBhZ2FpbnN0IGVzdGltYXRlZCBzdXJwbHVzZXNbXjEwXSBhbmQgcmVwb3J0aW5nIHRoZSBlbnRpcmUgU2VwIDMwLCAyMDIwIHllYXIgKGluc3RlYWQgb2YganVzdCBlaWdodCBtb250aHMpLCB0aGUgQ0RDJ3MgMjk5SyBtZWFuLWJhc2VkIGVzdGltYXRlIGRyb3BzIHRvIGFib3V0IDYwSy5bXjExXSBXaHkgZGlkbid0IHRoZSBDREMgYmluIGFubnVhbGx5PyBPbmUgcG9zc2libGUgbW90aXZlIGlzIHN1Z2dlc3RlZCBieSB0aGUgUiBwYWNrYWdlIC0tIFtzdXJ2ZWlsbGFuY2VdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9zdXJ2ZWlsbGFuY2Uvc3VydmVpbGxhbmNlLnBkZikgLS0gdXNlZCBieSB0aGUgQ0RDIHRvIGRldmVsb3AgaXRzIG1vZGVsLlteMTJdIEJ1dCBhbm51YWwgYmlubmluZyBpcyBub3QgdGhlIG9ubHkgb3B0aW9uLiBGaWd1cmUgMiBzdWdnZXN0cyB0aGF0IHRvdGFsIGRlYXRocyBhcmUgc2Vhc29uYWwsIGN5Y2xpY2FsLCBhbmQgZ3JhZHVhbGx5IHRyZW5kaW5nIHVwd2FyZCwgbmF0dXJhbGx5IGN5Y2xpbmcgdGhyb3VnaCBldmVyLWhpZ2hlciBoaWdocyBldmVyeSAyLTMgeWVhcnMuIFRodXMsIGJpZW5uaWFsIG9yIHRyaWVubmlhbCBiaW5zIG1pZ2h0IGJlIG1vcmUgaW5mb3JtYXRpdmUuIFdoYXRldmVyIHRoZSBiaW5uaW5nIHdpbmRvdywgZGVmaWNpdHMgbXVzdCBiZSBjb3VudGVkLg0KDQpbXjEwXTogVGhlIHVuZGVybHlpbmcgQ0RDIGZpZ3VyZXMgYXJlIGluIHRoZSB3b3Jrc2hlZXQgYXQgPGh0dHBzOi8vZGF0YS5jZGMuZ292L2FwaS92aWV3cy94a2tmLXhyc3Qvcm93cy5jc3Y/YWNjZXNzVHlwZT1ET1dOTE9BRCZib209dHJ1ZSZmb3JtYXQ9dHJ1ZSUyMHRhcmdldD0+DQoNClteMTFdOiBGb3IgaXRzIG5hdGlvbmFsIGVzdGltYXRlLCB0aGUgQ0RDIG9taXR0ZWQgTm9ydGggQ2Fyb2xpbmEgYmVjYXVzZSBvZiBpbmNvbXBsZXRlIHJlcG9ydGluZy4NCg0KW14xMl06IFRoZSBzdXJ2ZWlsbGFuY2UgcGFja2FnZSB3YXMgYnVpbHQgdG8gYXNzaXN0IHB1YmxpYyBoZWFsdGggYXV0aG9yaXRpZXMgaW4gImxlc3NlbmluZyBkaXNlYXNlIGJ1cmRlbiBieSwgZS5nLiwgdGltZWx5IHJlY29nbml6aW5nIGVtZXJnaW5nIG91dGJyZWFrcyBpbiBjYXNlIG9mIGluZmVjdGlvdXMgZGlzZWFzZXMuIiBJbiBvdGhlciB3b3JkcywgaXQgd2FzIGNyZWF0ZWQgdG8gbG9jYXRlIGVwaWRlbWljIG91dGJyZWFrcyBmb3IgcG9zc2libGUgc2hvcnQtdGVybSBpbnRlcnZlbnRpb24sIG5vdCB0byBlc3RpbWF0ZSBleGNlc3MgZGVhdGhzIGZvciBsb25nLXRlcm0gcG9saWN5IGZvcm11bGF0aW9uLiAqU2VlKiBNYcOrbGxlIFNhbG1vbiwgRGlyayBTY2h1bWFjaGVyICYgTWljaGFlbCBIw7ZobGUsICJNb25pdG9yaW5nIENvdW50IFRpbWUgU2VyaWVzIGluIFI6IEFiZXJyYXRpb24gRGV0ZWN0aW9uIGluIFB1YmxpYyBIZWFsdGggU3VydmVpbGxhbmNlLCIgSi4gU3RhdGlzdGljYWwgU29mdHdhcmUgKDIwMTYpLCA8aHR0cHM6Ly93d3cuanN0YXRzb2Z0Lm9yZy9hcnRpY2xlL3ZpZXcvdjA3MGkxMD4uDQoNCkJleW9uZCBuZXR0aW5nIGFuZCB0aW1lIGJpbm5pbmcsIGdlb2dyYXBoaWNhbCBiaW5uaW5nIGFsc28gYWZmZWN0cyB0aGUgcmVwb3J0ZWQgc3VycGx1cy4gSXQgZG9lcyBzbyBhdCB0d28gbGV2ZWxzOiBwcmVkaWN0aW9uIGFuZCByZXBvcnRpbmcuICpGaXJzdCosIHRoZSBDREMncyBzdGF0ZS1iYXNlZCBwcmVkaWN0aW9uIG1vZGVsIHByb2R1Y2VzIHN1cnBsdXNlcyB0aGF0IGFyZSBbMjUlIGhpZ2hlcl0oaHR0cHM6Ly93d3cuY2RjLmdvdi9uY2hzL252c3MvdnNyci9jb3ZpZDE5L2V4Y2Vzc19kZWF0aHMuaHRtKSB0aGFuIHRoZXkgd291bGQgYmUgaWYgdGhlIG1vZGVsIHdlcmUgcnVuIGF0IHRoZSBuYXRpb25hbCBsZXZlbC4gKlNlY29uZCosIHB1dHRpbmcgdGhlIGVudGlyZSBVLlMuIGludG8gYSBzaW5nbGUgZ2VvZ3JhcGhpYyBidWNrZXQgb2JzY3VyZXMgaW1wb3J0YW50IHJlZ2lvbmFsIGFuZCBzdGF0ZS1sZXZlbCBkaWZmZXJlbmNlcy4gRm9yIGV4YW1wbGUsIHVzaW5nIGFubnVhbCBiaW5uaW5nICg5LTMwIFlFKSAqYW5kKiBkcm9wcGluZyB0aGUgVHJpLXN0YXRlIGFyZWEgZnJvbSB0aGUgbmF0aW9uYWwgZXN0aW1hdGUgcmVkdWNlcyBuYXRpb25hbCBzdXJwbHVzIGRlYXRocyB0byBcfjEzSy4gVHJpLXN0YXRlIGFkZGVkIFx+NDFLIHN1cnBsdXMgZGVhdGhzIHRvIHRoZSBuYXRpb25hbCB0b3RhbC4gV2UnbGwgbG9vayBtb3JlIGNsb3NlbHkgYXQgc3RhdGUgYW5kIHJlZ2lvbmFsIGRpZmZlcmVuY2VzIGluIFBhcnQgSVYuDQoNCiMjIyBCLiBVbmNlcnRhaW50eQ0KDQpUd28gaXNzdWVzIGFyZSBvZiBjb25jZXJuIGhlcmUuICpGaXJzdCosIHRoZSBDREMgTU1XUiBjbGFpbXMgYW4gaW1wb3NzaWJsZSBkZWdyZWUgb2YgZXN0aW1hdGluZyBwcmVjaXNpb24sIHJlcG9ydGluZyBpdHMgbmF0aW9uYWwgKGFuZCBzdGF0ZSkgZXN0aW1hdGVzIHRvIHNpbmdsZSBkZWF0aHMsIGUuZy4sICIyOTksMDI4LCIgaW5zdGVhZCBvZiByb3VuZGluZywgZS5nLiwgIjI5OUssIiBvciBzdGF0aW5nIGEgcmFuZ2UsICI1MEstMjk5Sy4iIEdpdmVuIHRoZSBtYW55IHN1YmplY3RpdmUgYXNzdW1wdGlvbnMgaW52b2x2ZWQsIHN1Y2ggcHJlY2lzaW9uIGlzIG1pc2xlYWRpbmcuIFdoaWxlIHRoZSBDREMgZXhwbGFpbnMgbW9zdCBvZiBpdHMgYXNzdW1wdGlvbnMgYW5kIG5vdGVzIHRoYXQgaXRzIG1vZGVsIHByb2R1Y2VzICJleHBlY3RlZCIgYW5kICJ1cHBlciBib3VuZCIgcG9pbnQgZXN0aW1hdGVzLFteMTNdIGl0IG5ldmVydGhlbGVzcyBwcm9tb3RlcyB0aGUgaWxsdXNpb24gb2YgcHJlY2lzaW9uIHRocm91Z2ggaXRzIHB1YmxpYy1mYWNpbmcgbWVkaWEgbGlrZSB0aGUgTU1XUi4gVGhpcyBjb252ZXlzIHRoZSBmYWxzZSBpbXByZXNzaW9uIHRoYXQgdGhlIGVzdGltYXRlIGlzIG1vcmUgY2VydGFpbiB0aGFuIGl0IGlzLiBNb2RlbGluZyBpcyBhIG1peCBvZiBzdWJqZWN0aXZlIGp1ZGdtZW50IGFuZCBvYmplY3RpdmUgc2NpZW5jZS4gVGhlIENEQyBzaG91bGQgbWFrZSB0aGlzIGNsZWFyLg0KDQpbXjEzXTogU2VlIDxodHRwczovL3d3dy5jZGMuZ292L25jaHMvbnZzcy92c3JyL2NvdmlkMTkvZXhjZXNzX2RlYXRocy5odG0+Lg0KDQoqU2Vjb25kKiwgYXNpZGUgZnJvbSBpbmZsYXRlZCBjbGFpbXMgb2YgcHJlY2lzaW9uLCBwb2ludCBlc3RpbWF0ZXMgLS0gd2hpY2ggaXMgYWxsIHRoZSBDREMgb2ZmZXJzIG9uIGl0cyBkYXNoYm9hcmQgLS0gYXJlIGluYWRlcXVhdGUgdG8gc3VwcG9ydCByZXNwb25zaWJsZSBwb2xpY3kuIEFyZSAxMC0yMEsgZXhjZXNzIGRlYXRocyBtb3JlIG9yIGxlc3MgcHJvYmFibGUgdGhhbiAxOTAtMjAwSz8gV2hpbGUgdGhlIG5vdGVzIHJlZmVyIHRvIHVwcGVyLWJvdW5kIGFuZCBtZWFuICpleHBlY3RlZCogZGVhdGhzLCB0aGUgZGFzaGJvYXJkIChzZWUgRmlnLiAzLCBicm93biBsaW5lKSBzaG93cyBvbmx5IHRoZSBtZWFuIHZhbHVlIGFuZCBwcmV2ZW50cyByZWFkZXJzIGZyb20gYWNjZXNzaW5nIHRoZSB1cHBlci1ib3VuZC4NCg0KVGhlIG5vdGVzIHNheSB0aGF0IHRoZSBtb2RlbCByZWxpZXMgb24gdGhlIGhpc3RvcmljYWwgbWVhbiAodGhlICJleHBlY3RlZCB2YWx1ZSIsIGluIHN0YXRpc3RpY2FsIHRlcm1zKSBmb3IgZWFjaCBNTVdSIHdlZWsgdG8gZXN0YWJsaXNoIHRoZSBleHBlY3RhdGlvbiBmb3IgdGhlIGN1cnJlbnQgd2VlaydzIGRlYXRocy4gVGh1cywgZXZlcnkgd2VlayBpbiBldmVyeSBzdGF0ZSBnZXRzIGl0J3Mgb3duIGxpdHRsZSBtb2RlbC4gSXQncyBub3QgY2xlYXIgaG93IG1hbnkgZGF0YSBwb2ludHMgZmVlZCBpbnRvIGVhY2ggd2Vla2x5IG1vZGVsLCBidXQgLS0gd2l0aCBvbmx5IGZpdmUgeWVhcnMgdG8gcGljayBmcm9tIC0tIHRoZXJlIG1pZ2h0IGJlIG9ubHkgZml2ZSAoMjAxNS0yMDE5KS4gRm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3NlcywgbGV0J3MgbG9vayBhdCB0aG9zZSBmaXZlIChhbmQgdGhlaXIgbWVhbnMpIGZvciBOZXcgWW9yayBDaXR5IGFuZCBOZWJyYXNrYSBpbiB3ZWVrIDE1Lg0KDQpgYGB7cn0NCiMgQ3JlYXRlIG92ZXJsYWlkIGhpc3RvZ3JhbXMgd2l0aCBtZWFucw0KIyBQdWxsIHRoZSBkYXRhDQpwZGF0YSA8LSBmaWx0ZXIocGNhcF9sb25nLCBKdXJpcyAlaW4lIGMoIk5ldyBZb3JrIENpdHkiLCAiTmVicmFza2EiKSAmIENhdXNlICVpbiUgYygiQWxsIikgJiBgTU1XUiBXZWVrYCAlaW4lIGMoIjE1IikgJiBZZWFyICVuaW4lIGMoIjIwMTQiLCIyMDIwIiwgIjIwMjEiKSkgJT4lIA0KICBzZWxlY3QoSnVyaXMsIFllYXIsIERlYXRocywgRGVhdGhzUE0pDQpwZGF0YQ0KDQpwZGF0YSAlPiUgDQogIGdyb3VwX2J5KEp1cmlzKSAlPiUgDQogIHN1bW1hcmlzZShNZWFuID0gbWVhbihEZWF0aHMpLA0KICAgICAgICAgICAgRFBUbXUgPSBtZWFuKERlYXRoc1BNKSkNCg0KYGBgDQoNCk9mIHRoZXNlIG51bWJlcnMsIHdoaWNoIGRlc2VydmVzIHRvIGJlIHRoZSBjaG9zZW4sICJleHBlY3RlZCIgb25lIGluIE5lYnJhc2thIGFuZCBOWUMgaW4gMjAyMCBXZWVrIDE1PyBTdGF0aXN0aWNhbGx5IHNwZWFraW5nLCBub25lIG9mIHRoZW0uIFRoYXQncyByaWdodDogKk5vbmUqIG9mIHRoZXNlIG51bWJlcnMgd2FzIGluZGl2aWR1YWxseSBwcm9iYWJsZSBhdCBhbGwgYmVjYXVzZSBwcm9iYWJpbGl0eSBhdHRhY2hlcyBvbmx5IHRvIHJhbmdlcywgbm90IHRvIHBvaW50LWVzdGltYXRlcy4gRm9yIHRoZSByZWNvcmQsIGhlcmUgYXJlIHRoZSByZXBvcnRlZCBXZWVrIDE1IHJlc3VsdHM6DQoNCmBgYHtyfQ0KZmlsdGVyKHBjYXBfbG9uZywgSnVyaXMgJWluJSBjKCJOZXcgWW9yayBDaXR5IiwgIk5lYnJhc2thIikgJiBDYXVzZSAlaW4lIGMoIkFsbCIpICYgYE1NV1IgV2Vla2AgJWluJSBjKCIxNSIpICYgWWVhciAlaW4lIGMoIjIwMjAiKSkgJT4lIA0KICBzZWxlY3QoSnVyaXMsIFllYXIsIERlYXRocywgRGVhdGhzUE0pDQoNCmBgYA0KDQpOWUMncyByZXBvcnRlZCAyMDIwIDcsODYwIGRlYXRocyAoMC45NDIgRFBUKSB3ZXJlIDcuNCB0aW1lcyB0aGUgMjAxNS0xOSBtZWFuLCAxMDYwICgwLjEyNiBEUFQpLCBidXQgTmVicmFza2EncyByZXBvcnRlZCAzNDMgKDAuMTc3IERQVCkgY2FtZSByZW1hcmthYmx5IGNsb3NlIHRvIGl0cyBtZWFuLCAzMzUgKDAuMTc2IERQVCkuIFlldCwgcHJvc3BlY3RpdmVseSwgbm9uZSBvZiB0aGUgaGlzdG9yaWNhbCBudW1iZXJzIG9yIHRoZWlyIG1lYW4gc2hvdWxkIGNhcnJ5IGFueSBtb3JlIHdlaWdodCB0aGFuIHRoZSBvdGhlcnMgaW4gZXN0YWJsaXNoaW5nIHRoZSBleHBlY3RhdGlvbiB0aGF0IGRlZmluZXMgYW4gImV4Y2Vzcy4iIEFuZCB3aHkgbGltaXQgdGhlIGJlbmNobWFya2luZyBwZXJpb2QgdG8gdGhlIHBhc3QgZml2ZSB5ZWFycz8gV2h5IG5vdCB0ZW4gb3IgdHdlbnR5PyBXaHkgbm90IGdvIGJhY2sgdG8gdGhlIDE5MTggZmx1LCB3aGljaCBraWxsZWQgNi42IERQVD8gVGhlcmUncyBubyBzY2llbmNlIHRvIHRoZSBjaG9pY2U7IGl0IGlzIGNvbXBsZXRlbHkgYXJiaXRyYXJ5IGFuZCBzaG91bGQgYmUgZGVjaWRlZCB0aHJvdWdoIG9wZW4gZGViYXRlIGFtb25nIGVsZWN0ZWQgcmVwcmVzZW50YXRpdmVzLCBub3QgYnkgY2xvaXN0ZXJlZCwgdW5hY2NvdW50YWJsZSBkYXRhIG1vZGVsZXJzLg0KDQpGb3IgYSBkaWZmZXJlbnQgcGVyc3BlY3RpdmUgb24gdGhlIHJlbGF0aXZlIHBsYXVzaWJpbGl0eSBvZiB0aGUgQ0RDJ3MgbWVhbiBhbmQgdXBwZXItYm91bmQsIGNvbnNpZGVyIEZpZ3VyZSA0Lg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gZmlsdGVyKEdBX0NEQ3ZEUEgsIGBNTVdSIFdlZWtgICVpbiUgYygxOjUyKSksIGFlcyh4ID0gYE1NV1IgV2Vla2AsIHkgPSBEZWF0aHMvMTA2MDAsIGdyb3VwID0gU291cmNlLCBjb2xvciA9IFNvdXJjZSkpICsNCiAgZ2VvbV9saW5lKCkgKyANCiAgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBzZXEoMCw1MiwyKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0uMTAsLjEwLC4wMSkpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGFuZ2xlID0gMCwgaGp1c3QgPSAwKSwgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwgcGxvdC50YWcgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLCBwbG90Lm1hcmdpbiA9IG1hcmdpbiguMywgLjMsIC4zLCAuMywgImNtIikpICsNCiAgbGFicyh0aXRsZSA9ICJHZW9yZ2lhIENvdmlkLTE5IHZzLiBDREMgdXBwZXItYm91bmQgZXhjZXNzIChEUFQpIiwgc3VidGl0bGUgPSAiMjAyMCBNTVdSIFdlZWtzIDEtNTIiLCB5ID0gIkRlYXRocyBQZXIgVGhvdXNhbmQiLCB4ID0gIk1NV1IgV2VlayIsIHRhZyA9ICJGaWcuIDQiLCBjYXB0aW9uID0gIlNvdXJjZXM6IENEQzsgR2VvcmdpYSBEUEg7IHd3dzIuY2Vuc3VzLmdvdiBcbiAnR0FEUEgnID0gRGVhdGhzIHJlcG9ydGVkIGJ5IEdBIERQSCBhcyBDb3ZpZC0xOSBkZWF0aHMgXG4gJ0NEQycgPSBFeGNlc3Mgb2YgZGVhdGhzIGZyb20gYWxsIGNhdXNlcyBvdmVyIENEQyB1cHBlci1ib3VuZCBleHBlY3RlZCBkZWF0aHMiKQ0KYGBgDQoNCkZpZ3VyZSA0IHNob3dzIGEgY2xvc2UgY29ycmVsYXRpb24sIGluIHdlZWtzIDUtNDgsIGJldHdlZW4gR2VvcmdpYSdzIHJlcG9ydGVkIENvdmlkLTE5IGRlYXRocyAoY2xhc3NpZmllZCBhcyBzdWNoIGJhc2VkIHByaW1hcmlseSBvbiBwb3NpdGl2ZSBQQ1IgdGVzdCByZXN1bHRzKSBhbmQgdGhlIENEQydzIG1vZGVsZWQsIGxvdy1lbmQgZXhjZXNzIGRlYXRocyBlc3RpbWF0ZSAoYmFzZWQgb24gdGhlIENEQydzIHVwcGVyLWJvdW5kIGV4cGVjdGVkIGRlYXRocykuIElmIHdlIGFzc3VtZSB0aGUgYWNjdXJhY3kgb2YgR2VvcmdpYSdzIFBDUi1pZGVudGlmaWVkIENvdmlkLTE5IGRlYXRocyBhbmQgdGhhdCAqYWxsKiBleGNlc3MgZGVhdGhzIHdlcmUgY2F1c2VkIGJ5IENvdmlkLTE5LFteMTRdIHRoaXMgY29ycmVsYXRpb24gc3VnZ2VzdHMgdGhhdCB0aGUgQ0RDJ3MgdXBwZXItYm91bmQgZXhwZWN0YXRpb24gaXMgbXVjaCBjbG9zZXIgdG8gcmVhbGl0eSB0aGFuIHRoZSBtZWFuIHNob3duIG9uIHRoZSBDREMgZGFzaGJvYXJkLiBUaGlzIHBvaW50cyB0byBuZXQgZXhjZXNzIGRlYXRocyAoZnJvbSBhbGwgY2F1c2VzLCBmb3IgdGhlIDktMzAgeWVhcikgY2VudGVyZWQgb24gMTlLIGFuZCA2MEsgZm9yIHRoZSBVLlMuIHdpdGhvdXQgYW5kIHdpdGggVHJpLXN0YXRlLCByZXNwZWN0aXZlbHkuDQoNClteMTRdOiBHZW9yZ2lhIGlzIGEgc2FtcGxlIG9mIG9uZS4gV2Ugd291bGQgbmVlZCB0byB0ZXN0IHRoaXMgY29ycmVsYXRpb24gZm9yIG1vcmUgc3RhdGVzIGluIG9yZGVyIHRvIHJlYWNoIGEgbW9yZSByZWxpYWJsZSBjb25jbHVzaW9uIG9uIGl0cyBtZWFuaW5nLiBOb3RlLCBhbHNvLCB0aGF0IHRoZSBXSE8ncyBbSmFudWFyeSAyMCwgMjAyMSBOb3RpY2VdKGh0dHBzOi8vd3d3Lndoby5pbnQvbmV3cy9pdGVtLzIwLTAxLTIwMjEtd2hvLWluZm9ybWF0aW9uLW5vdGljZS1mb3ItaXZkLXVzZXJzLTIwMjAtMDUpIG9uIENvdmlkLTE5IGRpYWdub3NpcyBjYWxscyBpbnRvIHF1ZXN0aW9uIHRoZSBhY2N1cmFjeSBvZiBDb3ZpZC0xOSBkZWF0aCByZXBvcnRzIGZyb20gYW55IHN0YXRlLCBsaWtlIEdlb3JnaWEsIHdoaWNoIHJlbGllcyBwcmltYXJpbHkgb24gYSBzaW5nbGUgUENSIHRlc3QgcG9zaXRpdmUgZm9yIGNsYXNzaWZ5aW5nICJjYXNlcyIgYW5kIGRlYXRocyBhcyBDb3ZpZC0xOS4NCg0KYGBge3J9DQoNCiMgV2l0aG91dCBUcmktc3RhdGUNCmZpbHRlcihFeDIwd3QsIENvZGUgJW5pbiUgYygiVVMiLCAiTllDIiwgIk5KIiwgIk5ZIiwgIkNUIikpICU+JSANCiAgZ3JvdXBfYnkoKSAlPiUgDQpzdW1tYXJpc2UoVXBfRXhfbm9UcmkgPSBzdW0oU21hbGxFeCksDQogICAgICAgICAgVXBfRXhfbm9UcmlfRFBUID0gc3VtKFNtYWxsRXgpLzMyOGUzKQ0KDQojIFdpdGggVHJpLXN0YXRlDQpmaWx0ZXIoRXgyMHd0LCBDb2RlICVuaW4lIGMoIlVTIikpICU+JSANCiAgZ3JvdXBfYnkoKSAlPiUgDQpzdW1tYXJpc2UoVXBfRXhfQWxsID0gc3VtKFNtYWxsRXgpLA0KICAgICAgICAgIFVwX0V4X0FsbF9EUFQgPSBzdW0oU21hbGxFeCkvMzI4ZTMpDQoNCmBgYA0KDQpJbiBzdW1tYXJ5LCB0aGUgaW5oZXJlbnQgdW5jZXJ0YWludHkgb2YgdGhlc2UgZXN0aW1hdGVzIGRlbWFuZHMgbW9yZSBjbGFyaXR5IGFuZCB0cmFuc3BhcmVuY3kuIFdlIG5lZWQgdGhlICpmdWxsIGRpc3RyaWJ1dGlvbiogb2YgcHJvYmFiaWxpdGllcyBvdmVyIHBsYXVzaWJsZSB2YWx1ZXMgYW5kIHRoZSBhc3N1bXB0aW9ucyB0aGF0IHN1cHBvcnQgdGhlbS4gV2UgYWxzbyBuZWVkIGFuIG9wZW4gZGViYXRlIG9uIHdoYXQgdGhleSBhbGwgbWVhbi4gTW9kZXJuIGRhdGEgc2NpZW5jZSBvZmZlcnMgbXVsdGlwbGUgdG9vbHMgdG8gbWFrZSB0aGlzIGhhcHBlbi4gT25lIG9mIHRoZSBiZXN0IGlzIEJheWVzaWFuIG5ldHdvcmtzLCBhYm91dCB3aGljaCBJIGhhdmUgW3ByZXZpb3VzbHkgd3JpdHRlbl0oaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL3B1bHNlL2FteS1rbG9idWNoYXItY292aWQtMTktdGVzdHMtZmFsc2UtcG9zaXRpdmVzLWt1cnQtc2NodWx6a2UpIGluIHRoZSBDb3ZpZC0xOSBjb250ZXh0LiBXaGVuIHNvIG11Y2ggaXMgYXQgc3Rha2UgZm9yIHNvIG1hbnksIHRoZXJlIGlzIGV2ZXJ5IHJlYXNvbiB0byB0cmVhdCB1bmNlcnRhaW50eSB3aXRoIHRoZSBoaWdoZXN0IGRlZ3JlZSBvZiBkYXRhIHByb2Zlc3Npb25hbGlzbSBhbmQgdHJhbnNwYXJlbmN5LiBNb3N0IGltcG9ydGF0bHksIHRob3NlIHdobyBtYWtlIHRoaXMgZmF0ZWZ1bCBkZWNpc2lvbiBzaG91bGQgYmUgaGVsZCBmdWxseSBhY2NvdW50YWJsZSwgaW4gZXZlcnkgc2Vuc2Ugb2YgdGhlIHRlcm0sIHRvIHRoZSBzdGFrZWhvbGRlcnMgYWZmZWN0ZWQgYnkgaXQuIFRoaXMgaXMgY29ycG9yYXRlIGdvdmVybmFuY2UgMTAxLg0KDQojIyMgQy4gTG9zcyBmdW5jdGlvbg0KDQpXaGF0ZXZlciB0aGUgbW9kZWwsIHRoZSB1c2VyIG11c3QgZGVjaWRlIGhvdyBtYW55IGRlYXRocyBhcmUgdG9vIG1hbnkuIFdoYXQgbnVtYmVyIG9mIGRlYXRocyByZXF1aXJlcyBwb2xpY3kgaW50ZXJ2ZW50aW9ucyBsaWtlIGJ1c2luZXNzIGNsb3N1cmVzLCBzb2NpYWwgZGlzdGFuY2luZywgbWFza3MsIG9yIHZhY2NpbmF0aW9uPyBUaGUgQ0RDJ3Mgb3duIGV4Y2VzcyBkZWF0aHMgbW9kZWwgcG9pbnRzIHRvIHRlbiBkZWF0aHMgcGVyIHN0YXRlIHBlciB3ZWVrIGFzIHRoZSBsb3dlciBib3VuZC4gVGhlIFtUZWNobmljYWwgTm90ZXNdKGh0dHBzOi8vd3d3LmNkYy5nb3YvbmNocy9udnNzL3ZzcnIvY292aWQxOS9leGNlc3NfZGVhdGhzLmh0bSkgc3RhdGUgdGhhdCB3ZWVrbHkgY291bnRzICJiZXR3ZWVuIDEgYW5kIDkgYXJlIHN1cHByZXNzZWQuIlteMTVdIEluIG90aGVyIHdvcmRzLCBuaW5lIG9yIGZld2VyIGRlYXRocyBhcmUgbm90IHRyYWNrZWQgYXQgYWxsIGJ5IHRoZSBDREMuIFRoaXMgc3VnZ2VzdHMgdGhhdCB0aGUgQ0RDIGJlbGlldmVzIHRoYXQgbGVzcyB0aGFuIHRlbiBkZWF0aHMgcGVyIHN0YXRlIHBlciB3ZWVrIHNob3VsZCBub3QgaW1wYWN0IHB1YmxpYyBwb2xpY3kuIEFub3RoZXIgYmVuY2htYXJrIG1pZ2h0IGJlIHRoZSAxOTE4LTE5IGZsdSBwYW5kZW1pYywgd2l0aCBhbiBlc3RpbWF0ZWQgdG9sbCBvZiA2LjYgRFBULiBUaHJvdWdoIFNlcHRlbWJlciAzMCwgMjAyMCwgdGhlIENEQydzIG93biAyMDBLIGdyb3NzLCBtZWFuLWJhc2VkIGVzdGltYXRlIGVxdWF0ZWQgdG8gb25seSAwLjYwIERQVC4gQWZ0ZXIgbmV0dGluZywgdGhlIHVwcGVyLWJvdW5kIGJhc2VkIGVzdGltYXRlIHdhcyAwLjE4ICgwLjA2KSB3aXRoICh3aXRob3V0KSBUcmktc3RhdGUuDQoNClteMTVdOiBDREMsIEV4Y2VzcyBEZWF0aHMgQXNzb2NpYXRlZCB3aXRoIENPVklELTE5LCBUZWNobmljYWwgTm90ZXMsIDxodHRwczovL3d3dy5jZGMuZ292L25jaHMvbnZzcy92c3JyL2NvdmlkMTkvZXhjZXNzX2RlYXRocy5odG0+DQoNClRoaXMgaXMgbm90IHRvIHNheSB0aGF0IHRlbiBpcyBjZXJ0YWlubHkgdGhlIHJpZ2h0IHRocmVzaG9sZCBidXQgbWVyZWx5IHRoYXQgdGhlcmUgaXMgYSBudW1iZXIsIHRlbiBvciBoaWdoZXIgcGVyIHdlZWsgcGVyIHN0YXRlLCBiZWxvdyB3aGljaCBnb3Zlcm5tZW50IGludGVydmVudGlvbiBpcyBvdmVyLWtpbGwuIFRoZSB0aHJlc2hvbGQgaXMgYSB2YWx1ZSBqdWRnbWVudCByZWxhdGVkIHRvIGFuIGVxdWFsbHkganVkZ21lbnRhbCBsb3NzIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJhbGFuY2Ugb3IgIm5ldCIgY29zdHMgYW5kIGJlbmVmaXRzLlteMTZdIElzb2xhdGluZyBhIG51cnNpbmcgaG9tZSBwYXRpZW50IG1heSBwcmV2ZW50IGEgQ292aWQtMTkgaW5mZWN0aW9uIGF0IHRoZSBleHBlbnNlIG9mIGluZHVjaW5nIHNldmVyZSBkZXByZXNzaW9uIG9yIHN1aWNpZGUuIFNodXR0ZXJpbmcgcmVzdGF1cmFudHMgYW5kIGNvbmNlcnRzIG1heSByZWR1Y2UgQ292aWQtMTkgZGVhdGhzIHdoaWxlIGtpbGxpbmcgcmVzdGF1cmFudCBvcGVyYXRvcnMgYW5kIG11c2ljaWFucyBieSBzdGFydmF0aW9uIGFuZCBkcmFtYXRpY2FsbHkgcmVkdWNpbmcgdGhlIHF1YWxpdHkgb2YgbGlmZSBmb3IgbWlsbGlvbnMuIE94Zm9yZCBlcGlkZW1pb2xvZ2lzdCBbU3VuZXRyYSBHdXB0YSBjYWxsc10oaHR0cHM6Ly9nYmRlY2xhcmF0aW9uLm9yZy92aWRlby8pIHRoaXMgYSB2aW9sYXRpb24gb2YgdGhlICJzb2NpYWwgY29udHJhY3Q6IlteMTddDQoNClteMTZdOiAqU2VlLCBnZW5lcmFsbHkqLCBBdXN0aW4gRnJha3QsICJQdXR0aW5nIGEgRG9sbGFyIFZhbHVlIG9uIExpZmU/IEdvdmVybm1lbnRzIEFscmVhZHkgRG8sIiBOWVQgKE1heSAxMSwgMjAyMCksIDxodHRwczovL3d3dy5ueXRpbWVzLmNvbS8yMDIwLzA1LzExL3Vwc2hvdC92aXJ1cy1wcmljZS1odW1hbi1saWZlLmh0bWw+Lg0KDQpbXjE3XTogU3VuZXRyYSBHdXB0YSBkaXNjdXNzZXMgdGhlIGVwaWRlbWlvbG9naWNhbCAic29jaWFsIGNvbnRyYWN0IiBhdCAxOjQ2IC0gMTo1MSBvZiB0aGUgdmlkZW8gYXQgPGh0dHBzOi8vZ2JkZWNsYXJhdGlvbi5vcmcvdmlkZW8vPi4NCg0KPiBXaHkgZG9uJ3Qgd2UgZG8gdGhpcyBmb3IgdGhlIGZsdT8gV2hhdCdzIHRoZSBjb250cmFjdCBoZXJlPyAuLi4gV2Ugd2FudCBzY2hvb2xzIHRvIHJlbWFpbiBvcGVuLCB3ZSB3YW50IHBlb3BsZSB0byBmbG91cmlzaCwgd2Ugd2FudCBpbmVxdWFsaXR5IG5vdCB0byBnZXQgYW55IHdvcnNlLiBXZSB3YW50IHRoZSBhcnRzLi4uIFdoYXQgYXJlIHdlIGFsaXZlIGZvcj8gV2UgcHV0IGFsbCBvZiB0aGVzZSB0aGluZ3Mgb24gYSBwbGFuZSAuLi4gYW5kIHdlIHNheSwgJ09rYXksIHdlJ3JlIGdvaW5nIHRvIHRvbGVyYXRlIHRoaXMgbGV2ZWwgb2YgZGlzZWFzZSBpbiB0aGUgcG9wdWxhdGlvbi4gSXQgd2lsbCBraWxsIHNvbWUgcGVvcGxlLiBXZSB3aWxsIHRyeSBhbmQgcHJvdGVjdCB0aGVtLicgV2UganVzdCBkbyBvdXIgYmVzdCB3aXRoaW4gdGhhdCBjb250ZXh0LCB3aXRoaW4gdGhvc2UgYm91bmRhcmllcyB0byB0cnkgYW5kIG1ha2UgaXQgYWxsIHdvcmsuIiBJIHRoaW5rIHRoYXQncyB0aGUgc29jaWFsIGNvbnRyYWN0IC4uLiBhbmQgdGhhdCdzIHdoYXQncyBiZWluZyBpZ25vcmVkLiINCg0KSG93IGRvIDAuMDYgdG8gMC44NSBkZWF0aHMgcGVyIHRob3VzYW5kIGZpdCBpbnRvIHRoZSBzb2NpYWwgY29udHJhY3Q/IFdoZXJlIGRvICp5b3UqIGRyYXcgdGhlIGxpbmU/DQoNCiMjIyBELiBBbGdvcml0aG0NCg0KVGhlIENEQyB1c2VzIHRoZSBGYXJyaW5ndG9uIGFsZ29yaXRobSB0byBtb2RlbCBleHBlY3RlZCBkZWF0aHMgYnV0IGRvZXMgbm90IGlkZW50aWZ5IGFsdGVybmF0aXZlcyBvciBjb21wYXJlIEZhcnJpbmd0b24gdG8gdGhlbS5bXjE4XSBbU2NodW1hY2hlciBldCBhbF0oaHR0cHM6Ly93d3cuanN0YXRzb2Z0Lm9yZy9hcnRpY2xlL3ZpZXcvdjA3MGkxMCksIGNpdGVkIGluIHRoZSBDREMncyBUZWNobmljYWwgTm90ZXMsIHNheSB0aGF0IEZhcnJpbmd0b24gIm9ubHkgcGVyZm9ybXMgb25lIHRpbWUtcG9pbnQgZGV0ZWN0aW9uIiBvZiBvdXRicmVha3MuW14xOV0gSW4gb3JkZXIgdG8gZnVsbHkgYW5kIGZhaXJseSBldmFsdWF0ZSB0aGUgbW9kZWwsIHdlIG5lZWQgdG8gc2VlIHRoZSBjb2RlLiBUaGUgQ0RDIHNob3VsZCBwdWJsaXNoIGl0cyBSIGNvZGUgYW5kIGV4cGxhaW4gKndoeSogdGhlIEZhcnJpbmd0b24gbWV0aG9kIGlzIHN1aXRhYmxlIGF0IGFsbCBhbmQgKndoeSogaXQgaXMgYmV0dGVyIHRoYW4gYWx0ZXJuYXRpdmVzLg0KDQpbXjE4XTogSSBnYXRoZXIgZnJvbSB0aGUgW2Zvb3Rub3Rlc10oaHR0cHM6Ly93d3cuY2RjLmdvdi9uY2hzL252c3MvdnNyci9jb3ZpZDE5L2V4Y2Vzc19kZWF0aHMuaHRtKSwgdGhhdCAiRmFycmluZ3RvbiIgbWVhbnMgZmFycmluZ3RvbkZsZXhpYmxlLCBkaXNjdXNzZWQgaW4gdGhlIFtzdXJ2ZWlsbGFuY2UgcGFja2FnZSB1c2VyIG1hbnVhbF0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3N1cnZlaWxsYW5jZS9zdXJ2ZWlsbGFuY2UucGRmKS4gT3RoZXIgcG9zc2liaWxpdGllcyBhcmUgYWxnby5mYXJyaW5ndG9uIGFuZCBhbGdvLmNkYyAoYmFzZWQgb24gRmFycmluZ3RvbikuVGhlIEZhcnJpbmd0b24gYWxnbyBhc3N1bWVzIHRoYXQgZXZlbnRzIChlLmcuLCBkZWF0aHMpIG9jY3VyIGZyZXF1ZW5jaWVzIHByZXNjcmliZWQgYnkgdGhlIFBvaXNzb24gZGlzdHJpYnV0aW9uLCB3aGljaCBpcyBuaWNlbHkgZXhwbGFpbmVkIGluIFt0aGlzIHplZHN0YXRpc3RpY3MgdmlkZW9dKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9Y1BPQ2hyX2t1UXMpLiBJdCB3b3VsZCBoZWxwIGdyZWF0bHkgaWYgdGhlIENEQyB3ZXJlIHRvIHB1YmxpY2x5IHNoYXJlIGl0cyBjb2RlLg0KDQpbXjE5XTogU2FsbW9uIE0sIFNjaHVtYWNoZXIgRCwgSG9obGUgTS4gTW9uaXRvcmluZyBDb3VudCBUaW1lIFNlcmllcyBpbiBSOiBBYmVycmF0aW9uIERldGVjdGlvbiBpbiBQdWJsaWMgSGVhbHRoIFN1cnZlaWxsYW5jZS4gKkpvdXJuYWwgb2YgU3RhdGlzdGljYWwgU29mdHdhcmUqIDIwMTY7NzAoMTApOjEtMzUsIDE0Lg0KDQojIyMgRS4gVHJhaW5pbmcgRGF0YQ0KDQpMaWtlIGFsbCBtb2RlbHMsIHRoZSBDREMncyBleGNlc3MgZGVhdGhzIG1vZGVsIHdhcyAidHJhaW5lZCIgb24gaGlzdG9yaWNhbCBkYXRhLiBIb3dldmVyLCBpdCdzIHVuY2xlYXIgd2hpY2ggZGF0YSB0aGUgQ0RDIHVzZWQuIFRoZSBbVGVjaG5pY2FsIE5vdGVzXShodHRwczovL3d3dy5jZGMuZ292L25jaHMvbnZzcy92c3JyL2NvdmlkMTkvZXhjZXNzX2RlYXRocy5odG0pIHNheSBib3RoICIyMDEzLXByZXNlbnQiIGFuZCAiMjAxNS0yMDE5IiBidXQgcHJvdmlkZSBubyBsaW5rIHRvIHRoZSBkYXRhIGl0c2VsZi4gV2UgbmVlZCBhY2Nlc3MgdG8gdGhlIGRhdGEuIFdlIGFsc28gbmVlZCBhY2Nlc3MgdG8gZGF0YSBnb2luZyBiYWNrIGF0IGxlYXN0IHRvIDE5MTggdG8gY3Jvc3MtY2hlY2sgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiBsaW1pdGluZyB0aGUgbW9kZWwncyBoaXN0b3JpY2FsIGtub3dsZWRnZSB0byBqdXN0IHRoZSBsYXN0IGZpdmUgeWVhcnMuDQoNCiMjIElJSS4gRGF0YSAmIENvZGUNCg0KVGhlIFBhcnQgSVYgYW5hbHlzaXNbXjIwXSAtLSBwcmltYXJpbHkgaW4gdGhlIGZvcm0gb2YgdmlzdWFsaXphdGlvbnMgYW5kIGNvbW1lbnRhcnkgLS0gZm9jdXNlcyBvbiB0aHJlZSBib2RpZXMgb2YgZGF0YTogMS4gVS5TLiBtb3J0YWxpdHkgZnJvbSBhbGwgY2F1c2VzIGJ5IGFnZSwgdGltZSwgYW5kIHBsYWNlIChOQ0hTKSxbXjIxXSAyLiBFeGNlc3MgRGVhdGhzIEFzc29jaWF0ZWQgd2l0aCBDb3ZpZC0xOSAoTkNIUyksW14yMl0gYW5kIDMuIGEgW0NvdmlkLTE5IHRyYWNraW5nIHNwcmVhZHNoZWV0XShodHRwczovL2dhLWNvdmlkMTkub25kZW1hbmQuc2FzLmNvbS9kb2NzL2dhX2NvdmlkX2RhdGEuemlwKSBwcm9kdWNlZCBieSB0aGUgR2VvcmdpYSBEZXBhcnRtZW50IG9mIFB1YmxpYyBIZWFsdGguIFBvcHVsYXRpb24gZGVub21pbmF0b3JzIGZvciBwZXItdGhvdXNhbmQgZmlndXJlcyBhbmQsIGZvciBjcm9zcy12YWxpZGF0aW9uLCBhbm51YWwgZGVhdGhzLCBhcmUgZnJvbSB0aGUgVS5TLiBDZW5zdXMuW14yM10NCg0KW14yMF06IFRoZSBhbmFseXNpcyB3YXMgaW5zcGlyZWQgaW4gcGFydCBieSBbR2VuZXZpZXZlIEJyaWFuZCdzIE5vdmVtYmVyIDIwMjAgcHJlc2VudGF0aW9uXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PTNUS0pONjFhZmxJJmZlYXR1cmU9eW91dHUuYmUpIGF0IEpvaG4gSG9wa2lucyBVbml2ZXJzaXR5IGluIHdoaWNoIEJyaWFuZCBzdWdnZXN0ZWQgdGhhdCBDb3ZpZC0xOSBzaG91bGQgbm90IGJlIGNyZWRpdGVkIHdpdGggYW55IGV4Y2VzcyBkZWF0aHMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMuDQoNClteMjFdOiBDREMgZGF0YSBzb3VyY2VzOiA8aHR0cHM6Ly9kYXRhLmNkYy5nb3YvTkNIUy9Qcm92aXNpb25hbC1DT1ZJRC0xOS1EZWF0aC1Db3VudHMtYnktU2V4LUFnZS1hbmQtVy92c2FrLXdyZnU+LCA8aHR0cHM6Ly9kYXRhLmNkYy5nb3YvTkNIUy9XZWVrbHktQ291bnRzLW9mLURlYXRocy1ieS1TdGF0ZS1hbmQtU2VsZWN0LUNhdXNlcy8zeWY4LWthbnIsPiBhbmQgPGh0dHBzOi8vZGF0YS5jZGMuZ292L05DSFMvV2Vla2x5LUNvdW50cy1vZi1EZWF0aHMtYnktU3RhdGUtYW5kLVNlbGVjdC1DYXVzZXMvbXV6eS1qdGU2Lj4NCg0KW14yMl06IFNlZSA8aHR0cHM6Ly93d3cuY2RjLmdvdi9uY2hzL252c3MvdnNyci9jb3ZpZDE5L2V4Y2Vzc19kZWF0aHMuaHRtPi4NCg0KW14yM106IENlbnN1cyBkYXRhIHNvdXJjZXM6IDxodHRwOi8vd3d3Mi5jZW5zdXMuZ292L3Byb2dyYW1zLXN1cnZleXMvcG9wZXN0L2RhdGFzZXRzLzIwMTAtMjAxOS9uYXRpb25hbC90b3RhbHMvbnN0LWVzdDIwMTktYWxsZGF0YS5jc3Y+LCBhbmQgPGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvZGF0YS90YWJsZXMvdGltZS1zZXJpZXMvZGVtby9wb3Blc3QvMjAxMHMtdG90YWwtY2l0aWVzLWFuZC10b3ducy5odG1sI2RzPi4NCg0KVGhlIGNvZGUgdXNlZCB0byB3cmFuZ2xlIGFuZCB0cmFuc2Zvcm0gdGhlIGRhdGEgYXBwZWFycyBpbiB0aGUgQXBwZW5kaXguIEFsbCBjb2Rpbmcgd2FzIGRvbmUgaW4gW1IgU3R1ZGlvXShodHRwczovL3JzdHVkaW8uY29tLykgdXNpbmcgW3RpZHl2ZXJzZV0oaHR0cHM6Ly93d3cudGlkeXZlcnNlLm9yZy8pW14yNF0gYW5kIG90aGVyIFIgcGFja2FnZXMgaWRlbnRpZmllZCBpbiB0aGUgZmlyc3QgY29kZSBjaHVuay4gVGhlIGNvZGUgY2FuIGJlIGhpZGRlbiBvciByZXZlYWxlZCBieSB0b2dnbGluZyB0aGUgQ29kZSBidXR0b24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgb2YgdGhpcyBodG1sIGRvY3VtZW50IGFuZCBiZWZvcmUgZWFjaCBjb2RlIGNodW5rLiBUaGUgZnVsbCBSIFN0dWRpbyAuUm1kIGZpbGUgY2FuIGFsc28gYmUgZG93bmxvYWRlZCB0aHJvdWdoIHRoZSBzYW1lIGJ1dHRvbi4gSSBwcm92aWRlIHRoZSBjb2RlLCBzdWJtaXQgdG8gdGhlIE1JVCBvcGVuIHNvdXJjZSBsaWNlbnNlLCB0byBlbmNvdXJhZ2Ugb3RoZXJzIHRvIGV4dGVuZCB0aGUgYW5hbHlzaXMuDQoNClteMjRdOiBXaWNraGFtIEgsIEF2ZXJpY2sgTSwgQnJ5YW4gSiwgQ2hhbmcgVywgTWNHb3dhbiBMRCwgRnJhbsOnb2lzIFIsIEdyb2xlbXVuZCBHLCBIYXllcyBBLCBIZW5yeSBMLCBIZXN0ZXIgSiwgS3VobiBNLCBQZWRlcnNlbiBUTCwgTWlsbGVyIEUsIEJhY2hlIFNNLCBNw7xsbGVyIEssIE9vbXMgSiwgUm9iaW5zb24gRCwgU2VpZGVsIERQLCBTcGludSBWLCBUYWthaGFzaGkgSywgVmF1Z2hhbiBELCBXaWxrZSBDLCBXb28gSywgWXV0YW5pIEggKDIwMTkpLiAiV2VsY29tZSB0byB0aGUgdGlkeXZlcnNlLiIgKkpvdXJuYWwgb2YgT3BlbiBTb3VyY2UgU29mdHdhcmUqLCAqKjQqKig0MyksIDE2ODYuIGRvaTogWzEwLjIxMTA1L2pvc3MuMDE2ODZdKGh0dHBzOi8vZG9pLm9yZy8xMC4yMTEwNS9qb3NzLjAxNjg2KS4NCg0KIyMgSVYuIEFuYWx5c2lzDQoNCkluIFBhcnQgSVYsIHdlJ2xsIGxvb2sgbW9yZSBjbG9zZWx5IGF0IGRlYXRocyBieSB0aW1lIHBlcmlvZCBhbmQganVyaXNkaWN0aW9uIHVzaW5nIHNpbXBsZSB2aXN1YWxpemF0aW9ucy4gTmV3IFlvcmsgQ2l0eSAoTllDKSBpcyB0cmVhdGVkIGFzIGEgc2VwYXJhdGUgc3RhdGUsIHNvIE5ldyBZb3JrIHN0YXRlIChOWSkgZXhjbHVkZXMgTllDLg0KDQpQYXJ0cyBJVi4gQS1CIGRlYWwgd2l0aCB0b3RhbCBkZWF0aHMgcGVyIHRob3VzYW5kLCB3aXRob3V0IHJlZ2FyZCB0byBtb2RlbGluZyB0aGUgZXhjZXNzLiBQYXJ0IElWLkMgZGlncyBkaXJlY3RseSBpbnRvIHRoZSBDREMgZXhjZXNzIGRlYXRocyBtb2RlbCBhbmQgZGF0YSB0YWJsZS4gSW4gUGFydHMgQS1DLCB3ZSBzZWUgdGhhdCAyMDIwIG1vcnRhbGl0eSBpbiB0aGUgVS5TLiB2YXJpZWQgYnkgc3RhdGUsIHJlZ2lvbiwgYW5kIHRpbWUgcGVyaW9kcyBtb3N0bHkgaW5zaWRlIG5hcnJvdyBiYW5kcywgd2l0aCB0aGUgVHJpLXN0YXRlIGFyZWEgYmVpbmcgdGhlIGZhci1vdXQgZXhjZXB0aW9uLiBJbiBtb3N0IHBsYWNlcywgaW4gbW9zdCB3ZWVrcywgMjAyMCBkZWF0aHMgZnJvbSBhbGwgY2F1c2VzIGRpZmZlcmVkIGZyb20gMjAxNC0yMDE5IGJ5IGxlc3MgdGhhbiAwLjEwIERQVC4gV2l0aGluIHRoaXMgcmFuZ2UsIHNldmVyYWwgcmVnaW9uYWwgcGF0dGVybnMgYXJlIGRpc3Rpbmd1aXNoYWJsZSwgd2l0aCB0aGUgbm9ydGhlYXN0ZXJuIFVuaXRlZCBTdGF0ZXMgY2xlYXJseSBzdGFuZGluZyBvdXQgaW4gdGVybXMgb2YgbWF4aW11bSB3ZWVrbHkgRFBULiBUaGUgdGFibGUgYmVsb3cgc29ydHMgMjAyMCByZXBvcnRlZCB3ZWVrbHkgRFBUICh3aGljaCB0aGUgdGFibGUgY2FsbHMgIkRlYXRoc1BNIikgZnJvbSBoaWdoIHRvIGxvdy4gT25seSBmb3VyIG9mIHRoZSB0b3AgNTAgd2Vla2x5IHNjb3JlcyAtLSBpbiBNUywgTEEsIGFuZCBUTiAtLSBhcmUgbG9jYXRlZCBzb3V0aCBvZiBXYXNoaW5ndG9uLCBELkMuICgzOCBkZWcuIG5vcnRoIGxhdGl0dWRlKS4NCg0KYGBge3J9DQpmaWx0ZXIocGNhcF9sb25nLCBDYXVzZSA9PSAiQWxsIiAmICFKdXJpcyA9PSAiVW5pdGVkIFN0YXRlcyIgJiBZZWFyID09ICIyMDIwIikgJT4lDQogIHNlbGVjdChjKDEsNCw3LDEwKSkgJT4lIA0KICBhcnJhbmdlKC1EZWF0aHNQTSkNCmBgYA0KDQojIyMgQS4gQnkgc3RhdGUgJiByZWdpb24NCg0KIyMjIyAxLiBVLlMuDQoNCkZpZ3VyZSAxLCBkaXNjdXNzZWQgaW4gUGFydCBJLCBwbG90cyB0aGUgd2Vla2x5IG5hdGlvbndpZGUgRFBULCBKYW51YXJ5IDIwMTQgdG8gbWlkLURlY2VtYmVyIDIwMjAuIEEgcm91Z2ggbWVhc3VyZSBvZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDIwMjAgYW5kIHByaW9yIHllYXJzIGlzIHRoZSBkaXN0YW5jZSBvciAiZGVsdGEiIGJldHdlZW4gdGhlIGhpZ2ggd2Vla2x5IERQVHMsIDIwMTggdnMgMjAyMCBhbmQgMjAxOSB2cyAyMDIwLiBUaGVzZSBjYW4gYmUgdmlzdWFsbHkgZXZhbHVhdGVkIG9yIGNhbGN1bGF0ZWQgZGlyZWN0bHkuIEluIEZpZ3VyZSAxLCB0aGVzZSBhcmUsIHJlc3BlY3RpdmVseSwgXH4gMC4wMzUgYW5kIFx+IDAuMDUgRFBULiBUaGUgcGxvdHMgdGhhdCBmb2xsb3cgZHJpbGwgZG93biBvbiBzcGVjaWZpYyByZWdpb25zIGFuZCBzdGF0ZXMsIG5vcnRoLXRvLXNvdXRoIGFuZCBlYXN0LXRvLXdlc3QuDQoNCiMjIyMgMi4gTkU6IE5ZLCBOWUMsIE5KLCBDVA0KDQpXZSBiZWdpbiB3aXRoIE5ZQyAoRmlnLiA1KS4gQm9hc3RpbmcgYW4gZXN0aW1hdGVkIDIwMTkgcG9wdWxhdGlvbiBvZiA4LjQgbWlsbGlvbiwgYWJvdXQgMi4yIG1pbGxpb24gbGVzcyB0aGFuIEdlb3JnaWEsIE5ZQyByZWFjaGVkIGl0cyAyMDIwIERQVCBoaWdoIG9mIFx+MC45NCBEUFQgaW4gV2VlayAxNSwgZmFyIHN1cnBhc3NpbmcgcGVha3MgaW4gMjAxOCAoMC4xNSkgYW5kIDIwMTkgKDAuMTYpLiBUaGUgMjAxOC8yMCBkZWx0YSBvZiAwLjc5IHBlciB0aG91c2FuZCBpcyAyMi42IHRpbWVzIHRoZSBvdmVyYWxsIDIwMTgvMjAgVS5TLiBkZWx0YSB0aGF0IGluY2x1ZGVzIHRoZSBOWUMgZGF0YS4NCg0KYGBge3J9DQpOWUMgPC0gQnlTdGF0ZXMxNDIwKGMoIk5ldyBZb3JrIENpdHkiKSwgYygiRmlnLiA1IiksIGMoIjIwMTQtMDEtMTAiKSwgYygiMjAyMC0xMi0yMCIpKQ0KTllDDQpgYGANCg0KRmlnLiA2IHBsYWNlcyBOWUMgaW4gaXRzIGJyb2FkZXIgcmVnaW9uYWwgY29udGV4dC4gQWdhaW4sIE5ZQyBzdGFuZHMgb3V0LCB0aG91Z2ggb3RoZXIgTkUgcGxheWVycyAoZXNwZWNpYWxseSBOSikgbWFrZSBhIHN0cm9uZyBzaG93aW5nLiBOWSBzdGF0ZSBhbmQgTkogd2VyZSByaXNpbmcgYWJvdmUgdGhlIDIwMTggcGVhaywgYXQgdGhlIGVuZCBvZiBEZWNlbWJlci4NCg0KYGBge3J9DQpCeVN0YXRlczE0MjAoYygiTmV3IFlvcmsgQ2l0eSIsICJOZXcgWW9yayIsICJOZXcgSmVyc2V5IiwgIkNvbm5lY3RpY3V0IiksIGMoIkZpZy4gNiIpLCBjKCIyMDE0LTAxLTEwIiksIGMoIjIwMjAtMTItMjAiKSkNCmBgYA0KDQojIyMjIDMuIE1pZCBBdGxhbnRpYw0KDQpBIGJpdCBmdXJ0aGVyIHNvdXRoLCBpbiBGaWd1cmUgNywgTUQgYW5kIFBBIHNob3cgMjAxOC8yMCBkZWx0YXMgb2YgXH4gMC4wNS4gVkEsIHdpdGggYSBuZWdsaWdpYmxlIGRlbHRhLCBpcyBlbGV2YXRlZCBjb21wYXJlZCB0byAyMDE4IGJ1dCBub3QgaW4gY29tcGFyaXNvbiB0byBNRCBhbmQgUEEsIHdoaWNoIHdlcmUgY2xpbWJpbmcgaW50byBsYXRlIERlY2VtYmVyLiBUaGUgbGF0ZSBkcm9wIGluIE5DIHJlZmxlY3RzIHNsb3cgcmVwb3J0aW5nLg0KDQpgYGB7cn0NCkJ5U3RhdGVzMTQyMChjKCJNYXJ5bGFuZCIsICJQZW5uc3lsdmFuaWEiLCAiVmlyZ2luaWEiLCAiTm9ydGggQ2Fyb2xpbmEiKSwgYygiRmlnLiA3IiksIGMoIjIwMTQtMDEtMTAiKSwgYygiMjAyMC0xMi0yMCIpKQ0KYGBgDQoNCiMjIyMgNC4gU0U6IEdBLCBGTCwgU0MsIFRODQoNCk1vdmluZyBpbnRvIFNFQyB0ZXJyaXRvcnksIHRoZSBGaWcuIDggeS1heGlzIHNocmlua3MgYW5kIHNoaWZ0cyBkb3dud2FyZC4gSW4gdGhlIHNlbGVjdGVkIHN0YXRlcywgdGhlIGRlbHRhcyBtYXggb3V0IGF0IFx+MC4wNCBwZXIgdGhvdXNhbmQuIEluIGNvbnRyYXN0IHRvIHRoZSBORSwgR0EgYW5kIFNDIHNob3cgdHdvIHJlbGF0aXZlbHkgbWlub3IgYnV0IGRpc3RpbmN0IGhpZ2hzIGluIHNwcmluZyBhbmQgbGF0ZSBzdW1tZXIuIEZMIGFuZCBUTiBhcmUgY2xpbWJpbmcgaW50byBEZWNlbWJlciwgd2hpbGUgdGhlIG90aGVycyBtZWFuZGVyIG9yIGZhbGwgKEdBKS4gVGhlIHRyYWlsaW5nIHZvbGF0aWxpdHkgaW4gU0MgaXMgc3VzcGljaW91cy4NCg0KYGBge3J9DQpCeVN0YXRlczE0MjAoYygiR2VvcmdpYSIsICJGbG9yaWRhIiwgIlNvdXRoIENhcm9saW5hIiwgIlRlbm5lc3NlZSIpLCBjKCJGaWcuIDgiKSwgYygiMjAxNC0wMS0xMCIpLCBjKCIyMDIwLTEyLTIwIikpDQpgYGANCg0KIyMjIyA1LiBNaWR3ZXN0OiBNSSwgSUwsIE9ILCBJTg0KDQpJbiB0aGUgTWlkd2VzdCwgRmlndXJlIDksIE1JIGJ1c3RzIHRoZSBjdXJ2ZSAoYW5kIHN0cmV0Y2hlcyB0aGUgeS1heGlzKSwgbWltaWNraW5nIE5KIHdpdGggYSAyMDE4LzIwIGRlbHRhIG9mIFx+MC4yMC4gSU4gYW5kIE9IIGhhZCBubyBvciBsb3cgZGVsdGFzLCB3aXRoIElMIHNwb3J0aW5nIFx+MC4wMjUuIEFsbCBmb3VyIHN0YXRlcyB3ZXJlIHJpc2luZyBpbnRvIE5vdmVtYmVyLCBidXQgZmVsbCBpbiBEZWNlbWJlci4NCg0KYGBge3J9DQpCeVN0YXRlczE0MjAoYygiTWljaGlnYW4iLCAiSWxsaW5vaXMiLCAiT2hpbyIsICJJbmRpYW5hIiksIGMoIkZpZy4gOSIpLCBjKCIyMDE0LTAxLTEwIiksIGMoIjIwMjAtMTItMjAiKSkNCmBgYA0KDQojIyMjIDcuIE5vcnRoZXJuIFBsYWlucw0KDQpMb3RzIG9mIGxhdGUtZmFsbCBydW5zIG9uIHRoZSBub3J0aGVybiBwbGFpbnMgd2VyZSBmb2xsb3dlZCBieSBkaXZlcywgd2hlcmUgcm91Z2hseSBubyBkZWx0YXMgYXBwZWFyZWQgdW50aWwgbWlkLU9jdG9iZXJpc2guIEFsbCBmb3VyIHN0YXRlcyBiZWdhbiBmYWxsaW5nIGluIGxhdGUgTm92ZW1iZXIuIFRoZSBTRCBkcm9wIGlzIGNvcnJvYm9yYXRlZCBieSB0aGUgW1NEIERlcGFydG1lbnQgb2YgSGVhbHRoIENvdmlkLTE5IERhc2hib2FyZF0oaHR0cHM6Ly9kb2guc2QuZ292L0NPVklEL0Rhc2hib2FyZC5hc3B4KS4NCg0KYGBge3J9DQpCeVN0YXRlczE0MjAoYygiU291dGggRGFrb3RhIiwgIk5vcnRoIERha290YSIsICJNb250YW5hIiwgIk5lYnJhc2thIiksIGMoIkZpZy4gMTAiKSwgYygiMjAxNC0wMS0xMCIpLCBjKCIyMDIwLTEyLTIwIikpDQpgYGANCg0KIyMjIyA4LiBSb2NraWVzOiBVVCwgQ08sIEFaLCBOVg0KDQpGaWcuIDExIHNob3dzIGEgYml0IG9mIGFjdGlvbiBpbiBDTywgSUQsIGFuZCBXWSwgd2l0aCBsaXR0bGUgdG8gc2hvdyBpbiBVVCB3aGljaCwgbmV2ZXJ0aGVsZXNzLCBiYXJlZCBzb21lIGZsYXJlIGluIE5vdmVtYmVyLiBCeSBsYXRlIERlY2VtYmVyLCBhbGwgYXJlIGZhbGxpbmcgYW5kIG1pbmlzY3VsZSBjb21wYXJlZCB0byB0aGUgVHJpLXN0YXRlLg0KDQpgYGB7cn0NCkJ5U3RhdGVzMTQyMChjKCJVdGFoIiwgIkNvbG9yYWRvIiwgIklkYWhvIiwgIld5b21pbmciKSwgYygiRmlnLiAxMSIpLCBjKCIyMDE0LTAxLTEwIiksIGMoIjIwMjAtMTItMjAiKSkNCmBgYA0KDQojIyMjIDkuIFNvdXRod2VzdDogTk0sIEFaLCBDQSwgTlYNCg0KSW4gdGhlIFNXIChGaWcuIDEyKSwgb25seSBBWiBoYWQgYSAyMDE4LzIwIGRlbHRhIHRvIHNwZWFrIG9mLCBhdCBcfiAwLjA1LiBCeSBsYXRlIERlY2VtYmVyLCBOViBhbmQgTk0gd2VyZSBmYWxsaW5nLCB3aXRoIENBIGFuZCBBWiByaXNpbmcsIHRob3VnaCBzdGlsbCBub3RoaW5nIGNvbXBhcmVkIHRvIHRlcnJpdG9yeSBhYm92ZSB0aGUgMzh0aCBwYXJhbGxlbC4NCg0KYGBge3J9DQpCeVN0YXRlczE0MjAoYygiTmV3IE1leGljbyIsICJBcml6b25hIiwgIkNhbGlmb3JuaWEiLCAiTmV2YWRhIiksIGMoIkZpZy4gMTIiKSwgYygiMjAxNC0wMS0xMCIpLCBjKCIyMDIwLTEyLTIwIikpDQpgYGANCg0KIyMjIyAxMC4gUGFjIE5vcnRod2VzdA0KDQpJbiBGaWd1cmUgMTMsIE9yZWdvbiwgYW5kIFdhc2hpbmd0b24gc2hvdyBkZWZpY2l0cyB3aXRoIHJlc3BlY3QgdG8gdGhlaXIgaGlnaC13YXRlciBtYXJrIGluIDIwMTcgYnV0IGFyZSBvbiBwYXIgd2l0aCAyMDE5LiBJZGFobyBhbmQgQ2FsaWZvcm5pYSB3ZXJlIGluY2x1ZGVkIGJlY2F1c2Ugb2YgZ2VvZ3JhcGhpY2FsIHByb3hpbWl0eSAoZmFyIG5vcnRoZXJuIENBIGlzIHJlYWxseSBQYWMgTlcpLiBJRCBtYWRlIGEgbGF0ZSBydW4gYnV0IHN0dW1ibGVzIGJ5IGxhdGUgTm92ZW1iZXIuDQoNCmBgYHtyfQ0KQnlTdGF0ZXMxNDIwKGMoIldhc2hpbmd0b24iLCAiT3JlZ29uIiwgIklkYWhvIiwgIkNhbGlmb3JuaWEiKSwgYygiRmlnLiAxMyIpLCBjKCIyMDE0LTAxLTEwIiksIGMoIjIwMjAtMTItMjAiKSkNCmBgYA0KDQojIyMgQi4gTGF5ZXJlZCB5ZWFycw0KDQpMYXllcmVkIHNtb290aC1saW5lIHBsb3RzW14yNV0gb2ZmZXIgYSBkaWZmZXJlbnQgdmlldyBvZiBzdGF0ZSBEUFQgZGVsdGFzLiBGYWNldGluZyB0aGUgcGxvdHMgZmFjaWxpdGF0ZXMgc3RhdGUtdG8tc3RhdGUgY29tcGFyaXNvbnMuIEludGVycHJldCB0aGVzZSBwbG90cyB3aXRoIGNhdXRpb24gYmVjYXVzZSAxLiB0aGUgeS1heGVzIGFyZSB2ZXJ5IG5hcnJvdzsgdGhvc2UgaGlsbHMgYW5kIHNwaWtlcyB0eXBpY2FsbHkgcmVhY2ggbm8gbW9yZSB0aGFuIDAuMTAgRFBUIG92ZXIgdGhlIGxvd3M7IDIuIHRoZSB5LWF4ZXMgYXJlIGRpZmZlcmVudCBmb3IgZXZlcnkgcGFuZWw7IGFuZCAzLiB0aGUgc21vb3RoaW5nIGZ1bmN0aW9uICJzbW9vdGhzIiBleHRyZW1lIHZhbHVlcyBpbiBvcmRlciB0byBleHBvc2UgbGFyZ2VyIHBhdHRlcm5zOyB0aHVzLCB0aGUgZGVsdGFzIHdvbid0IGxvb2sgYXMgd2lkZSBhcyB0aGV5IGRvIGluIHByZXZpb3VzIGZpZ3VyZXMuDQoNClteMjVdOiBTbW9vdGggbGluZXMgd2VyZSBmaXR0ZWQgdXNpbmcgTE9FU1Mgc21vb3RoaW5nIGltcGxlbWVudGVkIGluIFIgdGhyb3VnaCB0aGUgZ2VvbV9zbW9vdGggZnVuY3Rpb24gb2YgdGhlIGdncGxvdDIgcGFja2FnZS4gTE9FU1Mgc21vb3RoaW5nIGlzICJhIG5vbi1wYXJhbWV0cmljIGZvcm0gb2YgcmVncmVzc2lvbiB0aGF0IHVzZXMgYSB3ZWlnaHRlZCwgc2xpZGluZy13aW5kb3cgYXZlcmFnZSB0byBjYWxjdWxhdGUgYSBsaW5lIG9mIGJlc3QgZml0LiIgV2lja2hhbSBIICgyMDE2KS4gKmdncGxvdDI6IEVsZWdhbnQgR3JhcGhpY3MgZm9yIERhdGEgQW5hbHlzaXMqLiBTcHJpbmdlci1WZXJsYWcgTmV3IFlvcmsuIElTQk4gOTc4LTMtMzE5LTI0Mjc3LTQsIDxodHRwczovL2dncGxvdDIudGlkeXZlcnNlLm9yZz4uDQoNCiMjIyMgMS4gVS5TLg0KDQpDb25zaXN0ZW50IHdpdGggRmlnLiAxLCBGaWcuIDE0LjEgc2hvd3MgYSBtYXhpbXVtIDIwMTkvMjAgZGVsdGEgb2YgXH4uMDY1IERQVC4gVGhlIHR5cGljYWwgZmFsbCB1cHRpY2sgc3RhcnRzIGF0IGFib3V0IHdlZWsgNDMuDQoNCmBgYHtyfQ0KWWVhckxheWVycyhjKCJVbml0ZWQgU3RhdGVzIiksIGMoIkZpZy4gMTQuMSIpLCBjKCIyMDE0LTAxLTEwIiksIGMoIjIwMjAtMTItMjAiKSkNCg0KYGBgDQoNCiMjIyMgMi4gU291dGgNCg0KSW4gdGhlIFNvdXRoLCBUZXhhcyAoRmlnLiAxNC4yKSBzdGFuZHMgb3V0IGZvciBpdHMgbXV0ZWQgc2Vhc29uYWwgcGF0dGVybiBhbmQgbG93IG1lYW4gRFBULiBObyB3b25kZXIgT3JhY2xlIHdhbnRzIHRvIG1vdmUgdG8gQXVzdGluISBBbGFiYW1hJ3MgMjAxNCBkYXRhIGFyZSBzdXNwZWN0LiBUaHJlZSBzdGF0ZXMgaGF2ZSBkZWx0YXMgb2YgXH4gMC4xMC4gRm9yIGNvbXBhcmlzb24gb2Ygc21vb3RoIGFuZCBsaW5lIHBsb3RzLCBhbiBleHRlbmRlZCB0aW1lcyBzZXJpZXMgcGFuZWwgKEZpZy4gMTQuMykgaXMgaW5jbHVkZWQgZm9yIHRoZSBzYW1lIGdyb3VwLiBNSSBhbmQgQUwgd2VyZSBjbGltYmluZyB0aHJvdWdoIGxhdGUgRGVjZW1iZXIuDQoNCmBgYHtyfQ0KWWVhckxheWVycyhjKCJBbGFiYW1hIiwgIkxvdWlzaWFuYSIsICJNaXNzaXNzaXBwaSIsICJUZXhhcyIpLCBjKCJGaWcuIDE0LjIiKSwgYygiMjAxNC0wMS0xMCIpLCBjKCIyMDIwLTEyLTIwIikpIA0KDQpCeVN0YXRlczE0MjAoYygiQWxhYmFtYSIsICJMb3Vpc2lhbmEiLCAiTWlzc2lzc2lwcGkiLCAiVGV4YXMiKSwgYygiRmlnLiAxNC4zIiksIGMoIjIwMTQtMDEtMTAiKSwgYygiMjAyMC0xMi0yMCIpKSANCg0KYGBgDQoNCiMjIyMgMy4gU0U6IEdBLCBGTCwgU0MsIFRODQoNClRoZSBsYXllcnMgaW4gRmlnLiAxNC40IGhpZ2hsaWdodCBHQSdzIGNvdW50ZXItc2Vhc29uYWwsIGJpLW1vZGFsIHBhdHRlcm4gd2l0aCBkZWZpY2l0IGRlYXRocyBieSBsYXRlIE5vdmVtYmVyLCBXaGlsZSBUTiBoYXMgYmVlbiBtb3N0bHkgY2xpbWJpbmcgc2luY2UgQXByaWwgb3IgTWF5LiBZZXQgaXQncyBhbGwgd2l0aGluIDAuMDUgRFBULg0KDQpgYGB7cn0NClllYXJMYXllcnMoYygiR2VvcmdpYSIsICJGbG9yaWRhIiwgIlNvdXRoIENhcm9saW5hIiwgIlRlbm5lc3NlZSIpLCBjKCJGaWcuIDE0LjQiKSwgYygiMjAxNC0wMS0xMCIpLCBjKCIyMDIwLTEyLTIwIikpDQpgYGANCg0KIyMjIyAzLiBGbHlvdmVyDQoNCkluIEZpZy4gMTQuNSwgQUsgYW5kIE9LIHNob3cgc2ltaWxhciBwYXR0ZXJucywgYXMgZG8gS1MgYW5kIE5FLCB1bnRpbCBORSB0YWtlcyBhIGRpdmUgYXQgdGhlIGVuZC4NCg0KYGBge3J9DQpZZWFyTGF5ZXJzKGMoIkFya2Fuc2FzIiwgIkthbnNhcyIsICJOZWJyYXNrYSIsICJPa2xhaG9tYSIpLCBjKCJGaWcuIDE0LjUiKSwgYygiMjAxNC0wMS0xMCIpLCBjKCIyMDIwLTEyLTIwIikpIA0KYGBgDQoNCiMjIyMgNC4gVHJpLXN0YXRlDQoNCkZpZy4gMTQuNiByZS1lbXBoYXNpemVzIGhvdyBkaWZmZXJlbnQgdGhlIFRyaS1zdGF0ZSBpcyBmcm9tIHRoZSByZXN0IG9mIHRoZSBjb3VudHJ5LiBFaXRoZXIgdGhlIGRhdGEgYXJlIGNvcnJ1cHQgb3Igc29tZXRoaW5nIHdlbnQgdGVycmlibHkgd3JvbmcgaW4gdGhlIFRyaS1zdGF0ZSwgZXNwZWNpYWxseSBOWUMuIEVpdGhlciB3YXksIHBvbGljaWVzIHRoYXQgbWlnaHQgYXBwbHkgaW4gdGhlIFRyaS1zdGF0ZSBzaG91bGQgaGF2ZSB6ZXJvIHN3YXkgb3ZlciB0aGUgcmVtYWluZGVyIG9mIHRoZSBjb3VudHJ5Lg0KDQpgYGB7cn0NClllYXJMYXllcnMoYygiTmV3IFlvcmsgQ2l0eSIsICJOZXcgWW9yayIsICJDb25uZWN0aWN1dCIsICJOZXcgSmVyc2V5IiksIGMoIkZpZy4gMTQuNiIpLCBjKCIyMDE0LTAxLTEwIiksIGMoIjIwMjAtMTItMjAiKSkgDQpgYGANCg0KIyMjIEMuIEV4Y2VzcyBEZWF0aHMNCg0KV2Ugbm93IHNoaWZ0IHRvIGVzdGltYXRlcyBwcm9kdWNlZCBieSB0aGUgQ0RDJ3MgZXhjZXNzIGRlYXRocyBtb2RlbC5bXjI2XSBUaGUgZXhwZWN0ZWQgZGVhdGhzIGFyZSBlc3RpbWF0ZWQgYW5kIGNvbXBhcmVkIHRvIHJlcG9ydGVkIGRlYXRocyBvdmVyIHRpbWUgaW50ZXJ2YWxzIG9yICJiaW5zLiIgVGhlIENEQydzIG1vZGVsIGVzdGltYXRlcyBleHBlY3RlZCBkZWF0aHMgYnkgc3RhdGUgYnkgd2VlaywgdGhlbiBzdW1zIHRoZXNlIGVzdGltYXRlcyBvdmVyIHNvbWUgbGFyZ2VyIHRpbWUgcGVyaW9kLiBXZSdsbCBsb29rIGF0IHRoZSB0d2VsdmUgbW9udGhzIGJlZ2lubmluZyBvbiBPY3RvYmVyIDEsIDIwMTksIHdoaWNoIGlzIHdoZW4gZmx1IHNlYXNvbiB0eXBpY2FsbHkgc3RhcnRzIGluIHRoZSBub3J0aGVybiBoZW1pc3BoZXJlLiBUaGlzIDktMzAtMjAgeWVhciBlbmQgZXhjbHVkZXMgdGhlIGxhc3QgcXVhcnRlciBvZiAyMDIwLCBmb3Igd2hpY2ggZGF0YSBmb3Igc29tZSBzdGF0ZXMgbWlnaHQgYmUgaW5jb21wbGV0ZS4NCg0KW14yNl06IFRoZSBDREMncyBOYXRpb25hbCBhbmQgU3RhdGUgRXN0aW1hdGVzIG9mIEV4Y2VzcyBEZWF0aHMgd29ya3NoZWV0IGlzIGF2YWlsYWJsZSBpbiBjc3YgZm9ybWF0IGF0IDxodHRwczovL3d3dy5jZGMuZ292L25jaHMvbnZzcy92c3JyL2NvdmlkMTkvZXhjZXNzX2RlYXRocy5odG0+Lg0KDQpGb3IgdGhlIDktMzAtMjAgeWVhciwgYWJzb2x1dGUsIG5ldCBVLlMuIGV4Y2VzcyBkZWF0aHMgKCJuZXQiIG1lYW5zIHN1cnBsdXNlcyAtIGRlZmljaXRzKSBiYXNlZCBvbiB0aGUgQ0RDJ3MgdXBwZXItYm91bmQgKG1lYW4pIGV4cGVjdGVkIGRlYXRocyB3ZXJlIDYwSyAoMjg2Sykgd2l0aCBUcmktc3RhdGUsIGFuZCAxOUsgKDIyNUspIHdpdGhvdXQgKHNlZSBxdWVyaWVzIGJlbG93KS4gSW4gb3RoZXIgd29yZHMsIGV2ZW4gdGhlIENEQydzIG1vZGVsIHJlY29nbml6ZXMgYSB3aWRlIHJhbmdlIG9mIHBsYXVzaWJsZSBlc3RpbWF0ZXMuIEluIERQVCwgKndpdGgqIHRoZSBUcmktc3RhdGUgdGhlIHVwcGVyLWJvdW5kLXRvLW1lYW4gcmFuZ2UgaXMgMC4xOCAtIDAuODcgb3IgMC4wNiAtIDAuNjkgKndpdGhvdXQqIFRyaS1zdGF0ZSwgYWdhaW5zdCBhbiBhbm51YWwgbmF0aW9uYWwgbWVhbiBEUFQgb2YgYWJvdXQgOC42IG92ZXIgdGhlIDIwMTctMjAxOSBpbnRlcnZhbCAoc2VlIHF1ZXJpZXMgYmVsb3cpLiBXaXRob3V0IFRyaS1zdGF0ZSwgdGhpcyBtZWFucyB0aGF0IHRoZSBDREMncyB1cHBlci1ib3VuZCB0b3RhbCBleGNlc3MgZGVhdGhzLCBvbiB0aGUgKmhpZ2gqIHNpZGUsIHdlcmUgcm91Z2hseSAwLjY5LzguNiA9IDglIG9mIGEgIm5vcm1hbCIgeWVhci4gT24gdGhlIGxvdyBzaWRlLCB0aGlzIGZpZ3VyZSBkcm9wcyB0byAwLjA2LzguNiA9IDAuNiUuDQoNCmBgYHtyfQ0KIyBXaXRoIFRyaS1zdGF0ZQ0KZmlsdGVyKEV4MjB3dCwgQ29kZSAlbmluJSBjKCJVUyIpKSAlPiUgDQogIGdyb3VwX2J5KCkgJT4lIA0Kc3VtbWFyaXNlKFVwX0V4X0FsbCA9IHN1bShTbWFsbEV4KSwNCiAgICAgICAgICBVcF9FeF9BbGxfRFBUID0gc3VtKFNtYWxsRXgpLzMyOGUzLA0KICAgICAgICAgIE11X0V4X0FsbCA9IHN1bShCaWdFeCksDQogICAgICAgICAgTXVfQWxsX0RQVCA9IHN1bShCaWdFeCkvMzI4ZTMpDQoNCiMgV2l0aG91dCBUcmktc3RhdGUNCmZpbHRlcihFeDIwd3QsIENvZGUgJW5pbiUgYygiVVMiLCAiTllDIiwgIk5KIiwgIk5ZIiwgIkNUIikpICU+JSANCiAgZ3JvdXBfYnkoKSAlPiUgDQpzdW1tYXJpc2UoVXBfRXhfbm9UcmkgPSBzdW0oU21hbGxFeCksDQogICAgICAgICAgVXBfRXhfbm9UcmlfRFBUID0gc3VtKFNtYWxsRXgpLzMyOGUzLA0KICAgICAgICAgIE11X0V4X25vVHJpID0gc3VtKEJpZ0V4KSwNCiAgICAgICAgICBNdV9FeF9ub1RyaV9EUFQgPSBzdW0oQmlnRXgpLzMyOGUzKQ0KDQpgYGANCg0KIyMjIyAxLiBCYXIgY2hhcnQgYnkgc3RhdGUNCg0KRmlndXJlIDE1IHBsb3RzIGEgYmFyIGZvciBlYWNoIHN0YXRlLCBzb3J0ZWQgYnkgZXN0aW1hdGVkIHVwcGVyLWJvdW5kICpuZXQgZXhjZXNzKiBkZWF0aHMgcGVyIHRob3VzYW5kIGZvciB0aGUgeWVhciBlbmRlZCBTZXB0ZW1iZXIgMzAsIDIwMjAuIFN0YXRlcyB0byB0aGUgcmlnaHQgb2YgSU4gLS0gYWxsIDMyIG9mIHRoZW0gLS0gaGF2ZSBkZWZpY2l0cywgbm90IGV4Y2Vzc2VzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QuDQoNCmBgYHtyfQ0KDQojIFlFIDktMzAtMjANCmdncGxvdChkYXRhID0gZmlsdGVyKEV4MjB3dCwhQ29kZSA9PSAiVVMiKSwgYWVzKHggPSByZW9yZGVyKENvZGUsIC1FRFBUKSwgeSA9IEVEUFQsIGZpbGwgPSBFRFBUKSkgKw0KZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiNnZW9tX3RleHQoYWVzKGxhYmVsID0gQ29kZSkpICsNCnNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsNCnNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoLTEuNjAsIDIuNywgLjIwKSkgKw0KdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUodGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LjUsIGFuZ2xlID0gOTAsIGhqdXN0ID0gMCwgdmp1c3QgPSAwKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYsIGFuZ2xlID0gMCwgaGp1c3QgPSAwLCB2anVzdCA9IDApLCBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLCBwbG90LnRhZyA9IGVsZW1lbnRfdGV4dChzaXplID0gOC41KSwgcGxvdC5tYXJnaW4gPSBtYXJnaW4oLjMsIC4zLCAuMywgLjMsICJjbSIpKSArDQpsYWJzKHRpdGxlID0gIkVzdGltYXRlZCBFeGNlc3MgRGVhdGhzIFBlciBUaG91c2FuZCBQb3B1bGF0aW9uIGJ5IFN0YXRlIiwgc3VidGl0bGUgPSAiWUUgU2VwIDMwLCAyMDIwIC0gVXBwZXIgQm91bmQgRXhwZWN0ZWQgRGVhdGhzIiwgY2FwdGlvbiA9ICJTb3VyY2U6IENEQy9OQ0hTICYgVS5TLiBDZW5zdXMuIFxuIEVzdC4gZXhjZXNzID0gc3VtIG9mIHdlZWtseSByZXBvcnRlZCBkZWF0aHMgLSBDREMgdXBwZXItYm91bmQgRmFycmluZ3Rvbi1hbGdvcml0aG0gZXhwZWN0ZWQgZGVhdGhzIiwgeSA9ICJFc3RpbWF0ZWQgRXhjZXNzIERlYXRocyBQZXIgVGhvdXNhbmQiLCB4ID0gIlN0YXRlIiwgdGFnID0gIkZpZy4gMTUiKQ0KDQpgYGANCg0KIyMjIyAyLiBUZXh0IHBsb3Qgb2Ygc3RhdGVzDQoNCkZpZ3VyZXMgMTYuMSBhbmQgMTYuMiBvZmZlciBhIGRpZmZlcmVudCBwZXJzcGVjdGl2ZSBvbiBGaWd1cmUgMTUsIHBsb3R0aW5nIHRoZSBzdGF0ZXMgYnkgdGhlaXIgKnJhdGlvcyogb2YgcmVwb3J0ZWQgZGVhdGhzIHRvIHRoZSBDREMncyAqdXBwZXItYm91bmQqIGFuZCAqbWVhbiogZXhwZWN0ZWQgZGVhdGhzLCByZXNwZWN0aXZlbHkuIFRoZSB2ZXJ0aWNhbCByZWQgbGluZSBtYXJrcyB0aGUgMToxIHJhdGlvLiBTdGF0ZXMgdG8gdGhlIGxlZnQgKHJpZ2h0KSBvZiB0aGUgbGluZSByZXBvcnRlZCBmZXdlciAobW9yZSkgZGVhdGhzIHRoYW4gcHJlZGljdGVkLCBtZWFuaW5nIHRoYXQgdGhleSBoYWQgbm8gKHNvbWUpIHN1cnBsdXMgb3IgZXhjZXNzLiBUaGlzIGlzIGEgZ29vZCB2aXN1YWwgaWxsdXN0cmF0aW9uIG9mIHRoZSB1bmNlcnRhaW50eSBpbiB0aGUgQ0RDJ3MgZXN0aW1hdGUuIExldCdzIHJlY2FsbCwgaG93ZXZlciwgdGhhdCBGaWd1cmUgNCAodW5kZXIgUGFydCBJSS5CLiwgYWJvdmUpIHN1Z2dlc3RzIHRoYXQgRmlndXJlIDE2LjEgKHVzaW5nIHRoZSB1cHBlci1ib3VuZCBleHBlY3RlZCBkZWF0aHMpIGlzIGNsb3NlciB0byByZWFsaXR5IHRoYW4gRmlndXJlIDE2LjIgKHVzaW5nIHRoZSBtZWFuIGV4cGVjdGVkIGRlYXRocykuIFRoZSBmaWd1cmVzIHJlaW5mb3JjZSB0aGF0IE5ldyBZb3JrIENpdHkgYW5kIE5ldyBKZXJzZXkgc2hvdWxkIGJlIHZpZXdlZCBhcyBhIHBvbGljeSBhbmQgdHJlYXRtZW50IHpvbmUgY29tcGxldGVseSBkaXN0aW5jdCBmcm9tIHRoZSByZXN0IG9mIHRoZSBjb3VudHJ5LiBNb3JlIGludmVzdGlnYXRpb24gaXMgd2FycmFudGVkIHRvIGRpc2NvdmVyIHdoeSBOWUMgYW5kIE5ldyBKZXJzZXkgZGlkIHNvIHBvb3JseSBjb21wYXJlZCB0byB0aGUgcmVzdCBvZiB0aGUgVW5pdGVkIFN0YXRlcy4NCg0KYGBge3J9DQojIERvdCBwbG90IGZyb20gaHR0cHM6Ly9zb2N2aXouY28vbWFwcy5odG1sDQoNCmdncGxvdChkYXRhID0gZmlsdGVyKEV4MjB3dCwgQ29kZSAlbmluJSBjKCJVUyIsICJQUiIpKSwgYWVzKHggPSBSZXBvcnRlZC9IaVByZWRpY3QsIHkgPSByZW9yZGVyKENvZGUsIFJlcG9ydGVkL0hpUHJlZGljdCksIGNvbG9yID0gUmVwb3J0ZWQvSGlQcmVkaWN0KSkgKw0KZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSwgY29sb3IgPSAicmVkIiwgYWxwaGEgPSAuNSkgKw0KZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvZGUpLCBzaXplID0gMiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0Kc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsNCiNzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtMC4xNSwgLTAuMTAsIC0wLjA1LCAwLjAsIDAuMDUsIDAuMTAsIDAuMTUsIDAuMjAsIDAuMjUsIDAuMzApKSArDQojc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMC4xNSwgMC4zMCwgLjA1KSkgKw0Kc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHMgPSBOVUxMKSArDQp0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSwgYW5nbGUgPSAwLCBoanVzdCA9IDAsIHZqdXN0ID0gMCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBhbmdsZSA9IDAsIGhqdXN0ID0gMCwgdmp1c3QgPSAwKSwgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwgcGxvdC50YWcgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDguNSksIHBsb3QubWFyZ2luID0gbWFyZ2luKC4zLCAuMywgLjMsIC4zLCAiY20iKSkgKw0KbGFicyh0aXRsZSA9ICJSZXBvcnRlZCBEZWF0aHMgdG8gQ0RDIFVwcGVyIEJvdW5kIFByZWRpY3RlZCBEZWF0aHMgYnkgU3RhdGUiLCBzdWJ0aXRsZSA9ICJBbGwtQ2F1c2VzLiBZZWFyIEVuZGVkIFNlcCAzMCwgMjAyMCIsIGNhcHRpb24gPSAiU291cmNlczogQ0RDL05DSFMuIiwgeSA9ICIiLCB4ID0gIk5DSFMgUmVwb3J0ZWQvVXBwZXIgQm91bmQgUHJlZGljdGVkIERlYXRocyBmcm9tIGFsbCBjYXVzZXMiLCB0YWcgPSAiRmlnLiAxNi4xIikNCg0KIyBEb3QgcGxvdCBmcm9tIGh0dHBzOi8vc29jdml6LmNvL21hcHMuaHRtbA0KDQpnZ3Bsb3QoZGF0YSA9IGZpbHRlcihFeDIwd3QsIENvZGUgJW5pbiUgYygiVVMiLCAiUFIiKSksIGFlcyh4ID0gUmVwb3J0ZWQvTXVQcmVkaWN0LCB5ID0gcmVvcmRlcihDb2RlLCBSZXBvcnRlZC9NdVByZWRpY3QpLCBjb2xvciA9IFJlcG9ydGVkL011UHJlZGljdCkpICsNCmdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEsIGNvbG9yID0gInJlZCIsIGFscGhhID0gLjUpICsNCmdlb21fdGV4dChhZXMobGFiZWwgPSBDb2RlKSwgc2l6ZSA9IDIsIHNob3cubGVnZW5kID0gRkFMU0UpICsNCnNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9ICJibHVlIiwgaGlnaCA9ICJyZWQiKSArDQojc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoLTAuMTUsIC0wLjEwLCAtMC4wNSwgMC4wLCAwLjA1LCAwLjEwLCAwLjE1LCAwLjIwLCAwLjI1LCAwLjMwKSkgKw0KI3NjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoLTAuMTUsIDAuMzAsIC4wNSkpICsNCnNjYWxlX3lfZGlzY3JldGUobGFiZWxzID0gTlVMTCkgKw0KdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUsIGFuZ2xlID0gMCwgaGp1c3QgPSAwLCB2anVzdCA9IDApLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiwgYW5nbGUgPSAwLCBoanVzdCA9IDAsIHZqdXN0ID0gMCksIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksIHBsb3QudGFnID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LjUpLCBwbG90Lm1hcmdpbiA9IG1hcmdpbiguMywgLjMsIC4zLCAuMywgImNtIikpICsNCmxhYnModGl0bGUgPSAiUmVwb3J0ZWQgRGVhdGhzIHRvIENEQyBNZWFuIFByZWRpY3RlZCBEZWF0aHMgYnkgU3RhdGUiLCBzdWJ0aXRsZSA9ICJBbGwtQ2F1c2VzLiBGb3IgdGhlIFlFIFNlcCAzMCwgMjAyMCIsIGNhcHRpb24gPSAiU291cmNlczogQ0RDL05DSFMuIiwgeSA9ICIiLCB4ID0gIk5DSFMgUmVwb3J0ZWQvTWVhbiBQcmVkaWN0ZWQgRGVhdGhzIGZyb20gYWxsIGNhdXNlcyIsIHRhZyA9ICJGaWcuIDE2LjIiKQ0KYGBgDQoNCiMjIFYuIENvbmNsdXNpb24NCg0KU28gbGV0J3Mgc3VtbWFyaXplLg0KDQoqV2hhdCBpcyB0aGUgcGxhdXNpYmxlIHJhbmdlIG9mIHRvdGFsICJleGNlc3MiIGRlYXRocyBpbiBhIHJlbGV2YW50IHBsYWNlIG92ZXIgYSByZWxldmFudCB0aW1lIHBlcmlvZD8qDQoNClRoZSBhbnN3ZXIgZGVwZW5kcyBvbiB3aGVyZSB5b3UgbGl2ZSBhbmQgdGhlIG1lYXN1cmVtZW50IHdpbmRvdy4gTm8gb25lIGxpdmVzIGV2ZXJ5d2hlcmUgYWNyb3NzIHRoZSBVbml0ZWQgU3RhdGVzLiBUaGF0IHNhaWQsIHRoZSByYW5nZSBmb3IgdGhlIHllYXIgZW5kZWQgU2VwdGVtYmVyIDMwLCAyMDIwIGZvciBVbml0ZWQgU3RhdGVzIG1vc3QgbGlrZWx5IGxpZXMgYmV0d2VlbiAwLjE3IC0gMC44NSAoMC4wMyAtIDAuNjcpIERQVCwgaW5jbHVkaW5nIChleGNsdWRpbmcpIHRoZSBUcmktc3RhdGUuIEZvciBtb3N0IHN0YXRlcyBpbmRpdmlkdWFsbHksIHplcm8gZXhjZXNzIGlzIHBsYXVzaWJsZS4gWWV0LCB0aGlzIGhpZ2hseSBpbXBvcnRhbnQgZmFjdCBnb2VzIHVubWVudGlvbmVkIGluIHRoZSBDREMncyBPY3RvYmVyIDIzIE1NV1IsIHdoaWNoIGNoZXJyeS1waWNrcyB0aGUgRmViIC0gU2VwIHBlcmlvZCBhbmQgaWdub3JlcyBkZWZpY2l0cyB0byBwcm9kdWNlIDAuOTEgRFBUICgyOTksMDI4LzMyOCBtaWxsaW9uLzEsMDAwKSBhcyB0aGUgc29saXRhcnkgcG9pbnQgZXN0aW1hdGUgZm9yIHRoZSBlbnRpcmUgY291bnRyeS4gQ29tcGFyZSB0byB0aGUgMTkxOCBmbHUgd2l0aCBhIDYuNiBEUFQuDQoNCipXaGF0IHNoYXJlIG9mIGV4Y2VzcyBkZWF0aHMgbWlnaHQgYmUgZmFpcmx5IGF0dHJpYnV0ZWQgdG8gQ292aWQtMTk/Kg0KDQpTbWFsbCBhbmQgZ2V0dGluZyBzbWFsbGVyLCBlc3BlY2lhbGx5IGluIGxpZ2h0IG9mIHRoZSBXSE8ncyBbSmFuIDIwLCAyMDIxIE5vdGljZV0oaHR0cHM6Ly93d3cud2hvLmludC9uZXdzL2l0ZW0vMjAtMDEtMjAyMS13aG8taW5mb3JtYXRpb24tbm90aWNlLWZvci1pdmQtdXNlcnMtMjAyMC0wNSkgd2FybmluZyB0aGF0IGEgUENSIHRlc3QgcG9zaXRpdmUgc2hvdWxkIG5vdCBiZSBjb3VudGVkIGFzICJDb3ZpZC0xOSIgaW4gdGhlIGFic2VuY2Ugb2YgYSBjbGluaWNhbCBkaWFnbm9zaXM6ICJUaGUgY3ljbGUgdGhyZXNob2xkIChDdCkgbmVlZGVkIHRvIGRldGVjdCB2aXJ1cyBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBwYXRpZW50J3MgdmlyYWwgbG9hZC4gV2hlcmUgdGVzdCByZXN1bHRzIGRvIG5vdCBjb3JyZXNwb25kIHdpdGggdGhlIGNsaW5pY2FsIHByZXNlbnRhdGlvbiwgYSBuZXcgc3BlY2ltZW4gc2hvdWxkIGJlIHRha2VuIGFuZCByZXRlc3RlZCB1c2luZyB0aGUgc2FtZSBvciBkaWZmZXJlbnQgTkFUIHRlY2hub2xvZ3kuIg0KDQpUaGUgdmFzdCBtYWpvcml0eSBvZiB0aGUgZmF0YWxpdGllcyBhcmUgZWl0aGVyIChhKSB2ZXJ5IGVsZGVybHkgYW5kLCB0aGVyZWZvcmUsIGxpa2VseSB0byBkaWUgc29vbiBhbnl3YXksIG9yIChiKSBzYWRkbGVkIHdpdGggbWFqb3IgY29tb3JiaWRpdGllcyBhbmQgLi4uIGxpa2VseSB0byBkaWUgc29vbiBhbnl3YXkuIEV2ZW4gdGhlIENEQyBhZG1pdHMsIGluIHByaW50LCB0aGF0IGl0IGRvZXMgbm90IGtub3cgd2hldGhlciBBTlkgb2YgaXRzIGVzdGltYXRlZCBleGNlc3MgZGVhdGhzIHdlcmUgY2F1c2VkIGJ5IENvdmlkLiBBbGwgb2YgdGhpcyBtZWFucyB0aGF0IHdlIHNob3VsZCBiZSBsb29raW5nIGJleW9uZCBDb3ZpZC0xOSBmb3IgYSBmdWxsIGV4cGxhbmF0aW9uIG9mIHRoZSBUcmktc3RhdGUgYW5kIG90aGVyIGFub21hbGllcyBsaWtlIHRoZSBzdW1tZXIgMjAyMCBzZXJwZW50Lg0KDQoqSG93IHRyYW5zcGFyZW50bHkgZG9lcyB0aGUgQ0RDIHByZXNlbnQgdGhlIHJhbmdlIGFuZCBzaGFyZSB0byByZWFkZXJzPyoNCg0KTm90IHRyYW5zcGFyZW50bHkgYXQgYWxsLiBUaGV5IHB1Ymxpc2ggYSBiaWcsIGZhbHNlbHkgcHJlY2lzZSwgbmF0aW9ud2lkZSBudW1iZXIgKGkuZS4sIDI5OCwwMjgpIC0tIGNoZXJyeS1waWNrZWQgZnJvbSB0aGUgImJlc3QiIGVpZ2h0IG1vbnRocyAtLSBmcm9udCBhbmQgY2VudGVyLiBUaGV5IGZhaWwgdG8gaW5mb3JtIHJlYWRlcnMsICJPdXIgZXN0aW1hdGUgaXMgc3ViamVjdCB0byBsb3RzIG9mIHVuY2VydGFpbnR5LiBXZSBkb24ndCBldmVuIGtub3cgaG93IG1hbnkgImV4Y2VzcyIgZGVhdGhzIHRoZXJlIGFyZSBhbmQgd2UgZG9uJ3Qga25vdyB3aGF0IHNoYXJlIG9mIHRoZSB1bmtub3duIGV4Y2VzcyBkZWF0aHMgd2VyZSBjYXVzZWQgYnkgQ292aWQuIiBUaGlzIGlzIGFsbCBidXJpZWQgaW4gdGhlIGZpbmUgcHJpbnQuIFRoZXkgZW50aXJlbHkgb21pdCB0aGUgdXBwZXItYm91bmQgZXhwZWN0ZWQgZGVhdGhzIGZyb20gdGhlaXIgZGFzaGJvYXJkLCBmYWlsIHRvIHNoYXJlIHRoZWlyIG1vZGVsIGNvZGUgYW5kIGRhdGEsIGFuZCBzYXkgbm90aGluZyBhYm91dCB0aGUgaW52ZXJzZWx5IHByb3BvcnRpb25hbCByZWxhdGlvbnNoaXAgYmV0d2VlbiBQQ1IgY3ljbGUgdGhyZXNob2xkIChDdCkgYW5kIHZpcmFsIGxvYWQsIHdoaWNoIGNhbGxzIGludG8gcXVlc3Rpb24gdGhlIENvdmlkLTE5IGxhYmVsIG9uIGRlYXRocyByZXBvcnRlZCBieSB0aGUgc3RhdGVzLg0KDQpQZXJoYXBzIG1vc3QgaW1wb3J0YW50bHksIGNvbnRyYXJ5IHRvIHN0YW5kYXJkIHByYWN0aWNlIGluIHJlc2VhcmNoLCB0aGUgQ0RDIG1vZGVsZXJzIHNheSBub3RoaW5nIGFib3V0IHRoZWlyIG1ham9yIGZpbmFuY2lhbCBpbnRlcmVzdCBpbiBmb3N0ZXJpbmcgdGhlIGFwcGVhcmFuY2Ugb2YgaGlnaGVyIGV4Y2VzcyBkZWF0aHMuIEFuIGFkZXF1YXRlIGRpc2Nsb3N1cmUgbWlnaHQgcmVhZCBsaWtlIHRoaXM6DQoNCj4gQ09ORkxJQ1QgT0YgSU5URVJFU1Q6IENvdmlkLTE5IGRlYXRocyBhcmUgYSBwcm94eSBmb3IgQ0RDIHJldmVudWUuIFRoZSBDREMgdGVuZHMgdG8gcmVjZWl2ZSBtb3JlIGZlZGVyYWwgZnVuZGluZyB3aGVuIHRoZSBwZXJjZWl2ZWQgZXBpZGVtaWMgZGVhdGggcmF0ZSBpcyBoaWdoLiBJbiAyMDIwLCBDb25ncmVzcyBpbmNyZWFzZWQgb3VyIG9wZXJhdGluZyBidWRnZXQgZnJvbSBcJDguNSBiaWxsaW9uIHRvIFwkMjUgYmlsbGlvbiBpbiByZXNwb25zZSB0byBDb3ZpZC0xOS4gVGh1cywgdGhpcyBlc3RpbWF0ZSBtYXkgYmUgYWZmZWN0ZWQgYnkgYmlhcyBpbmR1Y2VkIGJ5IG91ciBmaW5hbmNpYWwgaW50ZXJlc3QgaW4gaGlnaGVyIHJlcG9ydGVkIENvdmlkLTE5IGRlYXRocy4NCg0KSW4gc3VtbWFyeSwgaW4gb3JkZXIgdG8gbWVldCBtaW5pbXVtIFNFQyBydWxlcywgd2hpY2ggZnVuZGFtZW50YWxseSByZXF1aXJlIHRoYXQgc3RhdGVtZW50cyBhbmQgZGlzY2xvc3VyZXMgW2JlICJub3QgbWF0ZXJpYWxseSBtaXNsZWFkaW5nXShodHRwOi8vYmxvZ3MyLmxhdy5jb2x1bWJpYS5lZHUvanRsL3dwLWNvbnRlbnQvdXBsb2Fkcy9zaXRlcy80LzIwMTgvMDEvU2NodWx6a2VfNTYtQ0pUTC02LTEucGRmKSwiIHRoZSBDREMncyBleGNlc3MgZGVhdGhzIGVzdGltYXRlLCBkaXNjbG9zdXJlcywgYW5kIHByZXNlbnRhdGlvbiB0aGVyZW9mIHdvdWxkIG5lZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkuDQoNCiMjIEFwcGVuZGl4DQoNCiMjIEkuIERhdGEgcHJlcGFyYXRpb24NCg0KIyMjIEEuIExvYWQgbGlicmFyaWVzDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KDQojIG1hZ2ljIG9wdGlvbg0Kb3B0aW9ucyh0aWR5dmVyc2UucXVpZXQgPSBUUlVFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkobWljZSkNCmxpYnJhcnkoVklNKQ0KbGlicmFyeShsYXR0aWNlKQ0KbGlicmFyeShkYnBseXIpDQpsaWJyYXJ5KEhtaXNjKQ0KbGlicmFyeShyZXNoYXBlKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeSh0aWR5cXVhbnQpDQpsaWJyYXJ5KFJTb2NyYXRhKQ0KIyBTdXBwcmVzcyBzdW1tYXJpc2UgaW5mbw0Kb3B0aW9ucyhkcGx5ci5zdW1tYXJpc2UuaW5mb3JtID0gRkFMU0UpDQoNCmBgYA0KDQojIyMgQi4gSW1wb3J0IGFsbCBkYXRhDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KDQojIEltcG9ydCBDREMgV2Vla2x5IGJ5IENhdXNlIDIwMTQtMTggd2l0aCBkcGx5cg0KIyBodHRwczovL2RhdGEuY2RjLmdvdi9OQ0hTL1dlZWtseS1Db3VudHMtb2YtRGVhdGhzLWJ5LVN0YXRlLWFuZC1TZWxlY3QtQ2F1c2VzLzN5Zjgta2Fucg0KY2F1c2VfMTRfMTkgPC0gcmVhZF9jc3YoIldlZWtseV9Db3VudHNfb2ZfRGVhdGhzX2J5X1N0YXRlX2FuZF9TZWxlY3RfQ2F1c2VzX18yMDE0LTIwMTkuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhgV2VlayBFbmRpbmcgRGF0ZWAgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJW0vJWQvJVkiKSksIA0KICAgIG5hID0gIjAiKQ0KDQojIEltcG9ydCBDREMgV2Vla2x5IGJ5IENhdXNlIDIwMTktMjAgd2l0aCBkcGx5cg0KIyBodHRwczovL2RhdGEuY2RjLmdvdi9OQ0hTL1dlZWtseS1Db3VudHMtb2YtRGVhdGhzLWJ5LVN0YXRlLWFuZC1TZWxlY3QtQ2F1c2VzL211enktanRlNg0KY2F1c2VfMjBfMjEgPC0gcmVhZF9jc3YoIldlZWtseV9Db3VudHNfb2ZfRGVhdGhzX2J5X1N0YXRlX2FuZF9TZWxlY3RfQ2F1c2VzX18yMDIwLTIwMjFfMDEyMTIxLmNzdiIsICAgICBjb2xfdHlwZXMgPSBjb2xzKGBXZWVrIEVuZGluZyBEYXRlYCA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlWS0lbS0lZCIpKSwNCiAgICBuYSA9ICIwIikNCg0KIyBJbXBvcnQgQ0RDIFVud2VpZ2h0ZWQgRXhjZXNzIERlYXRocyAyMDE3LTIwICYgUmVtb3ZlIGR1cGxpY2F0ZXMNCiMgaHR0cHM6Ly93d3cuY2RjLmdvdi9uY2hzL252c3MvdnNyci9jb3ZpZDE5L2V4Y2Vzc19kZWF0aHMuaHRtDQpDRENfQzE5X0V4IDwtIHJlYWRfY3N2KCJFeGNlc3NfRGVhdGhzX0Fzc29jaWF0ZWRfd2l0aF9DT1ZJRC0xOV8wMTIxMjEuY3N2IikgJT4lDQogIGZpbHRlcihPdXRjb21lID09ICJBbGwgY2F1c2VzIiwgVHlwZSA9PSAiVW53ZWlnaHRlZCIpICU+JSANCiAgZGlzdGluY3QoLmtlZXBfYWxsID0gVFJVRSkgDQoNCiMgSW1wb3J0IENEQyBXZWlnaHRlZCBFeGNlc3MgRGVhdGhzIDIwMTctMjAgJiBSZW1vdmUgZHVwbGljYXRlcw0KIyBodHRwczovL3d3dy5jZGMuZ292L25jaHMvbnZzcy92c3JyL2NvdmlkMTkvZXhjZXNzX2RlYXRocy5odG0NCld0ZF9DRENfQzE5X0V4IDwtIHJlYWRfY3N2KCJFeGNlc3NfRGVhdGhzX0Fzc29jaWF0ZWRfd2l0aF9DT1ZJRC0xOV8wMTIxMjEuY3N2IikgJT4lDQogIGZpbHRlcihPdXRjb21lID09ICJBbGwgY2F1c2VzIiwgVHlwZSA9PSAiUHJlZGljdGVkICh3ZWlnaHRlZCkiKSAlPiUgDQogIGRpc3RpbmN0KC5rZWVwX2FsbCA9IFRSVUUpIA0KDQojIEltcG9ydCBjZW5zdXMgZGF0YSANCg0KUG9wX0VzdCA8LSByZWFkX2NzdigiMjAxOV9VU19DZW5zdXNfUG9wX0VzdGltYXRlcy5jc3YiKQ0KDQojIEltcG9ydCBHQSBEUEggZXBpY3VydmUgZGF0YSAmIGdyb3VwIGJ5IHNhbWUgV2VlayBFbmRpbmcgRGF0ZSBhcyBDREMgRXhjZXNzIERlYXRocw0KIyBodHRwczovL2dhLWNvdmlkMTkub25kZW1hbmQuc2FzLmNvbS9kb2NzL2dhX2NvdmlkX2RhdGEuemlwDQoNCkdBX2VwaV9zeW1wX2RhdGUgPC0gcmVhZF9jc3YoIkdBIGVwaWN1cnZlX3N5bXB0b21fZGF0ZV8wMTIxMjEuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhgc3ltcHRvbSBkYXRlYCA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlWS0lbS0lZCIpKSkNCmBgYA0KDQojIyMgQy4gWGZvcm1zDQoNCkhlcmUgd2UgdHJhbnNmb3JtIHRoZSBDREMsIENlbnN1cywgYW5kIEdlb3JnaWEgZGF0YSBmb3IgZnVydGhlciBhbmFseXNpcy4NCg0KIyMjIyAxLiBDREMgZGF0YQ0KDQpgYGB7cn0NCiMgQWRkIEMxOSB2YXJzIHRvIGNhdXNlXzE0XzE5DQoNCmNhdXNlXzE0XzE5IDwtIG11dGF0ZShjYXVzZV8xNF8xOSwNCiAgIGZsYWdfY292MTltY29kID0gIjAiLA0KICAgZmxhZ19jb3YxOXVjb2QgPSAiMCIsDQogICBgQ09WSUQtMTkgKFUwNzEsIE11bHRpcGxlIENhdXNlIG9mIERlYXRoKWAgPSAwLA0KICAgYENPVklELTE5IChVMDcxLCBVbmRlcmx5aW5nIENhdXNlIG9mIERlYXRoKWAgPSAwKQ0KDQojIFJlb3JkZXIgY29sdW1ucw0KY2F1c2VfMTRfMTkgPC0gY2F1c2VfMTRfMTlbYygxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywzMywzNCwxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMildDQoNCiMgVmVyaWZ5IHRoYXQgY29sdW1uIG5hbWVzIGFyZSB0aGUgc2FtZS4gQ29scyA1IGFuZCAxMSBoYXZlIGNoYW5nZWQgc2xpZ2h0bHkgc2luY2UgMjAxOC4NCm5hbWVzKGNhdXNlXzE0XzE5KQ0KbmFtZXMoY2F1c2VfMjBfMjEpDQoNCiMgUmVuYW1lIGNvbHVtbnMgdG8gc3luY2ggd2l0aCBjYXVzZV8yMF8yMQ0KbmFtZXMoY2F1c2VfMTRfMTkpWzVdIDwtICJBbGwgQ2F1c2UiICNyZW1vdmUgZXh0cmEgc3BhY2UNCm5hbWVzKGNhdXNlXzE0XzE5KVsxMV0gPC0gIkluZmx1ZW56YSBhbmQgcG5ldW1vbmlhIChKMDktSjE4KSIgI2NoYW5nZSBKMTAgdG8gSjA5DQoNCiMgTWVyZ2UgMjAxOS0yMDIwICYgMjAxNC0yMDE4IGRhdGENCmNhdXNlXzE0XzIxIDwtIHJiaW5kKGNhdXNlXzE0XzE5LCBjYXVzZV8yMF8yMSkNCg0KIyBDaGFuZ2UgY29sdW1uIG5hbWVzIGZvciBlYXNpZXIgYW5hbHlzaXMNCm5hbWVzKGNhdXNlXzE0XzIxKVs1XSA8LSAiQWxsIg0KbmFtZXMoY2F1c2VfMTRfMjEpWzFdIDwtICJKdXJpcyINCm5hbWVzKGNhdXNlXzE0XzIxKVs2XSA8LSAiTmF0dXJhbCINCm5hbWVzKGNhdXNlXzE0XzIxKVs3XSA8LSAiU2VwdCINCm5hbWVzKGNhdXNlXzE0XzIxKVs4XSA8LSAiQ2FuY2VyIg0KbmFtZXMoY2F1c2VfMTRfMjEpWzldIDwtICJEaWFiIg0KbmFtZXMoY2F1c2VfMTRfMjEpWzEwXSA8LSAiQWx6Ig0KbmFtZXMoY2F1c2VfMTRfMjEpWzExXSA8LSAiSW5mbFBuIg0KbmFtZXMoY2F1c2VfMTRfMjEpWzEyXSA8LSAiQ0xSRCINCm5hbWVzKGNhdXNlXzE0XzIxKVsxM10gPC0gIk90aFJEIg0KbmFtZXMoY2F1c2VfMTRfMjEpWzE0XSA8LSAiTmVwaHIiDQpuYW1lcyhjYXVzZV8xNF8yMSlbMTVdIDwtICJPdGhVbmsiDQpuYW1lcyhjYXVzZV8xNF8yMSlbMTZdIDwtICJIRCINCm5hbWVzKGNhdXNlXzE0XzIxKVsxN10gPC0gIlN0cm9rZSINCm5hbWVzKGNhdXNlXzE0XzIxKVsxOF0gPC0gIkMxOW1jb2QiDQpuYW1lcyhjYXVzZV8xNF8yMSlbMTldIDwtICJDMTl1Y29kIg0KDQojIFJlZHVjZSBjb2x1bW5zICYgYWRkIE5vbk5hdCBjYXVzZQ0KY2F1c2VfMTRfMjEgPC0gc2VsZWN0KGNhdXNlXzE0XzIxLCBjKDE6MTkpKQ0KDQpjYXVzZV8xNF8yMSA8LSBtdXRhdGUoY2F1c2VfMTRfMjEsDQogICAgTm9uTmF0ID0gQWxsIC0gTmF0dXJhbCkNCg0KIyBjYXVzZV8xNF8yMTogZm9ybWF0IFllYXIgYW5kIFdlZWsgYXMuZmFjdG9yDQoNCmNhdXNlXzE0XzIxJGBNTVdSIFllYXJgIDwtIGFzLmZhY3RvcihjYXVzZV8xNF8yMSRgTU1XUiBZZWFyYCkNCmNhdXNlXzE0XzIxJGBNTVdSIFdlZWtgIDwtIGFzLmZhY3RvcihjYXVzZV8xNF8yMSRgTU1XUiBXZWVrYCkNCg0KIyBDRENfQzE5X0V4OiBDcmVhdGUgaGlkZWx0YSAmIGxvZGVsdGEgdmFyaWFibGVzDQoNCkNEQ19DMTlfRXgkaGlkZWx0YSA8LSBDRENfQzE5X0V4JGBPYnNlcnZlZCBOdW1iZXJgIC0gQ0RDX0MxOV9FeCRgQXZlcmFnZSBFeHBlY3RlZCBDb3VudGANCkNEQ19DMTlfRXgkbG9kZWx0YSA8LSBDRENfQzE5X0V4JGBPYnNlcnZlZCBOdW1iZXJgIC0gQ0RDX0MxOV9FeCRgVXBwZXIgQm91bmQgVGhyZXNob2xkYA0KDQojIFd0ZF9DRENfQzE5X0V4OiBDcmVhdGUgaGlkZWx0YSAmIGxvZGVsdGEgdmFyaWFibGVzDQoNCld0ZF9DRENfQzE5X0V4JGhpZGVsdGEgPC0gV3RkX0NEQ19DMTlfRXgkYE9ic2VydmVkIE51bWJlcmAgLSBXdGRfQ0RDX0MxOV9FeCRgQXZlcmFnZSBFeHBlY3RlZCBDb3VudGANCg0KV3RkX0NEQ19DMTlfRXgkbG9kZWx0YSA8LSBXdGRfQ0RDX0MxOV9FeCRgT2JzZXJ2ZWQgTnVtYmVyYCAtIFd0ZF9DRENfQzE5X0V4JGBVcHBlciBCb3VuZCBUaHJlc2hvbGRgDQpgYGANCg0KQ0RDOiBMb25nIGZvcm1hdCBjb252ZXJzaW9uDQoNCkJlZm9yZSB3ZSBjb252ZXJ0IHRoZSBDREMgZGF0YSB0byBsb25nIGZvcm1hdCB0byBmYWNpbGl0YXRlIHRpbWUgc2VyaWVzIGFuYWx5c2lzLCB3ZSBjaGVjayBmb3IgbWlzc2luZyBkYXRhIHBhdHRlcm5zLg0KDQpgYGB7cn0NCm1pc3NfdHhucyA8LSBhZ2dyKGNhdXNlXzE0XzIxLCBjb2wgPSBjKCduYXZ5Ymx1ZScsJ3llbGxvdycpLA0KICAgICAgICAgICAgICAgICAgbnVtYmVycyA9IFRSVUUsIHNvcnRWYXJzID0gVFJVRSwgDQogICAgICAgICAgICAgICAgICBsYWJlbHMgPSBuYW1lcyhjYXVzZV8xNF8yMSksIGNleC5heGlzID0gLjcsDQogICAgICAgICAgICAgICAgICBnYXAgPSAzLCB5bGFiID0gYygiTWlzc2luZyBkYXRhIiwiUGF0dGVybiIpKQ0KYGBgDQoNClRoZSBtaXNzaW5nIHZhbHVlcyByZWZsZWN0IHJlcG9ydGVkIHdlZWtseSBjb3VudHMgb2YgbGVzcyB0aGFuIDEwIGRlYXRocyB0aGF0IGFyZSBpbnRlbnRpb25hbGx5ICJzdXBwcmVzc2VkIiBieSB0aGUgQ0RDLiBJbiB0aGUgQ0RDJ3MgMjAxOS0yMDIwIHRhYmxlIChEZWMgMzAsIDIwMjAgdXBkYXRlKSwgdGhlICJhbGwgY2F1c2UiIGNvbHVtbiBpcyBtaXNzaW5nIG9ubHkgQ1Qgd2VlayA1MSBhbmQgTkMgd2VlayA0My4gTWFueSBtb3JlIHZhbHVlcyBhcmUgbWlzc2luZyBmb3Igc3BlY2lmaWMgY2F1c2VzIG9mIGRlYXRoIGJlY2F1c2UgdGhlIHN0YXRlcyB0YWtlIGxvbmdlciB0byByZXBvcnQgc3VjaCBkZXRhaWxzLiBXZSByZXBsYWNlIGFsbCBtaXNzaW5nIG51bWVyaWMgdmFsdWVzIHdpdGggMC4NCg0KYGBge3J9DQpzZXRuYWZpbGwoY2F1c2VfMTRfMjEsIGNvbHMgPSBjKDU6MjApLCBmaWxsID0gMCkgIyBkYXRhLnRhYmxlIGZ1bmN0aW9uDQojIHByaW50IGNhdXNlXzE0XzIxIHRvIHNob3cgdGhlIGVmZmVjdA0KDQpgYGANCg0KUHJlcGFyZSBmb3IgRFQgbWVsdC4gTWVsdGluZyBjb252ZXJ0cyB0aGUgZGF0YSBmcm9tICJ3aWRlIiB0byAibG9uZyIgZm9ybWF0LiBMb25nIGlzIGJldHRlciBmb3IgdGltZSBzZXJpZXMgYW5hbHlzaXMuDQoNCmBgYHtyfQ0Kc2V0RFQoY2F1c2VfMTRfMjEpICMgQ29udmVydCB0byBEVCBmb3IgRFQgbWVsdA0KDQojIG1lbHQNCmNhdXNlX2xvbmcgPC0gbWVsdChjYXVzZV8xNF8yMSwgaWQudmFycyA9IGMoMTo0KSwgbWVhc3VyZS52YXJzID0gYyg1OjIwKSkNCg0KIyBDaGFuZ2UgInZhcmlhYmxlIiBhbmQgInZhbHVlIiBuYW1lcw0KbmFtZXMoY2F1c2VfbG9uZylbNl0gPC0gIkRlYXRocyINCm5hbWVzKGNhdXNlX2xvbmcpWzVdIDwtICJDYXVzZSINCmBgYA0KDQpDaGVjayBmb3IgYW55IHJlbWFpbmluZyBtaXNzaW5nIERlYXRocw0KDQpgYGB7cn0NCmZpbHRlcihjYXVzZV9sb25nLCBpcy5uYSgoRGVhdGhzKSkpDQpgYGANCg0KIyMjIyAyLiBDZW5zdXMgZGF0YQ0KDQpSZW5hbWUgc29tZSB2YXJzICYgY3JlYXRlIDIwMjAgcG9wdWxhdGlvbiBlc3RpbWF0ZSA9IDIwMTkgcG9wIGVzdGltYXRlLg0KDQpgYGB7cn0NCm5hbWVzKFBvcF9Fc3QpWzRdIDwtICJTdF9OdW0iDQpuYW1lcyhQb3BfRXN0KVs1XSA8LSAiSnVyaXMiDQpgYGANCg0KQ29udmVydCB0byBsb25nIGZvcm1hdA0KDQpgYGB7cn0NClBvcF9sb25nIDwtIHNlbGVjdChQb3BfRXN0LCBjKDI6MTEpKQ0KUG9wX2xvbmckUE9QRVNUSU1BVEUyMDIwIDwtIFBvcF9sb25nJFBPUEVTVElNQVRFMjAxOQ0KUG9wX2xvbmckUE9QRVNUSU1BVEUyMDIxIDwtIFBvcF9sb25nJFBPUEVTVElNQVRFMjAxOQ0Kc2V0RFQoUG9wX2xvbmcpDQpQb3BfbG9uZyA8LSBtZWx0KFBvcF9sb25nLCBpZC52YXJzID0gYygxOjQpLCBtZWFzdXJlLnZhcnMgPSBjKDU6MTIpKQ0KDQojIENoYW5nZSB2YXJpYWJsZSB0byBQb3ANCm5hbWVzKFBvcF9sb25nKVs2XSA8LSAiUG9wIg0KYGBgDQoNCkV4dHJhY3QgeWVhciBmcm9tIHZhcmlhYmxlIHZhcmlhYmxlLg0KDQpgYGB7cn0NClBvcF9sb25nJFllYXIgPC0gc3Vic3RyKFBvcF9sb25nJHZhcmlhYmxlLCAxMiwgMTUpDQpQb3BfbG9uZyRZZWFyIDwtIGFzLmZhY3RvcihQb3BfbG9uZyRZZWFyKQ0KYGBgDQoNCiMjIyMgMy4gSm9pbiBsb25nIENEQyAmIENlbnN1cyB0YWJsZXMNCg0KVGhlIERlYXRoc1BNIHZhcmlhYmxlIHdhcyBvcmlnaW5hbGx5IGludGVuZGVkIHRvIHJlcG9ydCBkZWF0aHMgcGVyIG1pbGxpb24gYnV0IHdhcyByZXB1cnBvc2VkIHRvIHJlcG9ydCBkZWF0aHMgcGVyIHRob3VzYW5kLiBNdWNoIG9mIHRoZSBsaXRlcmF0dXJlIHVzZXMgcGVyIHRob3VzYW5kIGFuZCB0aG91c2FuZHMgYXJlIG1vcmUgcmVsYXRlYWJsZSB0aGFuIG1pbGxpb25zLg0KDQpgYGB7cn0NCm5hbWVzKGNhdXNlX2xvbmcpWzJdIDwtICJZZWFyIg0KcGNhcF9sb25nIDwtIGNhdXNlX2xvbmcgJT4lIA0KICBsZWZ0X2pvaW4oc2VsZWN0KFBvcF9sb25nLCBKdXJpcywgUkVHSU9OLCBESVZJU0lPTiwgWWVhciwgUG9wKSkgJT4lIA0KICBtdXRhdGUoRGVhdGhzUE0gPSBEZWF0aHMvKFBvcC8xZTMpKQ0KYGBgDQoNCiMjIyMgNC4gQ0RDIEV4Y2VzcyBkZWF0aHMNCg0KVGhpcyBkYXRhIHRyYW5zZm9ybSBjaHVuayBzdXBwb3J0cyBhbmFseXNpcyBvZiB0aGUgQ0RDJ3MgRXhjZXNzIERlYXRocyB3b3Jrc2hlZXQuIEZpcnN0LCB3ZSBpbXBvcnQgc3RhdGUgYWJicmV2cyAmIGpvaW4gd2l0aCBDRENfQzEwX0V4ICYgUG9wRXN0IHRhYmxlcy4gVGhlbiB3ZSBjcmVhdGUgcGVyLXRob3VzYW5kIHZhcmlhYmxlcyBsaWtlIERQVG11IChtZWFuIGRlYXRocyBwZXIgdGhvdXNhbmQpLCBFRFBUIChleGNlc3MgZGVhdGhzIHBlciB0aG91c2FuZCksIGFuZCBSRURQVCAocmVwb3J0ZWQgZXhjZXNzIGRlYXRocyBwZXIgdGhvdXNhbmQpLg0KDQpgYGB7cn0NClN0YXRlQ29kZXMgPC0gcmVhZF9jc3YoIlN0YXRlQWJicmV2cy5jc3YiKQ0KDQojIFVud2VpZ2h0ZWQgYWN0dWFscw0KDQpDRENfQzE5X0V4IDwtIHNlbGVjdChDRENfQzE5X0V4LCBgV2VlayBFbmRpbmcgRGF0ZWAsIFllYXIsIFN0YXRlLCBgT2JzZXJ2ZWQgTnVtYmVyYCwgYFVwcGVyIEJvdW5kIFRocmVzaG9sZGAsIGBBdmVyYWdlIEV4cGVjdGVkIENvdW50YCwgYEV4Y2VzcyBMb3dlciBFc3RpbWF0ZWAsIGBFeGNlc3MgSGlnaGVyIEVzdGltYXRlYCkgJT4lIA0KbGVmdF9qb2luKHNlbGVjdChTdGF0ZUNvZGVzLCAtQWJicmV2KSkgJT4lIA0KICBsZWZ0X2pvaW4oc2VsZWN0KFBvcF9Fc3QsIGMoNSw5OjExLDM5OjQxKSksIGJ5ID0gYygiU3RhdGUiID0gIkp1cmlzIikpICU+JSAgIG11dGF0ZShZZWFyID0gYXMuZmFjdG9yKFllYXIpKQ0KDQojIFdlaWdodGVkIGFjdHVhbHMNCg0KV3RkX0NEQ19DMTlfRXggPC0gc2VsZWN0KFd0ZF9DRENfQzE5X0V4LCBgV2VlayBFbmRpbmcgRGF0ZWAsIFllYXIsIFN0YXRlLCBgT2JzZXJ2ZWQgTnVtYmVyYCwgYFVwcGVyIEJvdW5kIFRocmVzaG9sZGAsIGBBdmVyYWdlIEV4cGVjdGVkIENvdW50YCwgYEV4Y2VzcyBMb3dlciBFc3RpbWF0ZWAsIGBFeGNlc3MgSGlnaGVyIEVzdGltYXRlYCkgJT4lIA0KbGVmdF9qb2luKHNlbGVjdChTdGF0ZUNvZGVzLCAtQWJicmV2KSkgJT4lIA0KICBsZWZ0X2pvaW4oc2VsZWN0KFBvcF9Fc3QsIGMoNSw5OjExLDM5OjQxKSksIGJ5ID0gYygiU3RhdGUiID0gIkp1cmlzIikpICU+JSAgIG11dGF0ZShZZWFyID0gYXMuZmFjdG9yKFllYXIpKQ0KDQojIENyZWF0ZSB1bndlaWdodGVkIERQVG11IGZyb20gQ0RDX0MxOV9FeCRgT2JzZXJ2ZWQgTnVtYmVyYA0KDQpNZWFuX2RlYXRocyA8LSBDRENfQzE5X0V4ICU+JSANCiAgZ3JvdXBfYnkoQ29kZSwgU3RhdGUsIFllYXIpICU+JSANCiAgc3VtbWFyaXNlKERlYXRocyA9IHN1bShgT2JzZXJ2ZWQgTnVtYmVyYCkpICU+JSANCiAgZmlsdGVyKFllYXIgJW5pbiUgYygiMjAyMCIsICIyMDIxIikpICU+JSANCiAgbGVmdF9qb2luKHNlbGVjdChQb3BfbG9uZywgLXZhcmlhYmxlKSwgYnkgPSBjKCJTdGF0ZSIgPSAiSnVyaXMiLCAiWWVhciIpKSAlPiUgDQogIG11dGF0ZShEUFRfeXIgPSBEZWF0aHMvKFBvcC8xZTMpKSAlPiUgICANCiAgZ3JvdXBfYnkoQ29kZSkgJT4lIA0KICBzdW1tYXJpc2UoRFBUbXUgPSBtZWFuKERQVF95cikpIA0KICAgDQpDRENfQzE5X0V4IDwtIENEQ19DMTlfRXggJT4lIA0KICBsZWZ0X2pvaW4oTWVhbl9kZWF0aHMsIGJ5ID0gIkNvZGUiKQ0KDQojIENyZWF0ZSB3ZWlnaHRlZCBEUFRtdSBmcm9tIENEQ19DMTlfRXgkYE9ic2VydmVkIE51bWJlcmANCg0KV3RfTWVhbl9kZWF0aHMgPC0gV3RkX0NEQ19DMTlfRXggJT4lIA0KICBncm91cF9ieShDb2RlLCBTdGF0ZSwgWWVhcikgJT4lIA0KICBzdW1tYXJpc2UoRGVhdGhzID0gc3VtKGBPYnNlcnZlZCBOdW1iZXJgKSkgJT4lIA0KICBmaWx0ZXIoWWVhciAlbmluJSBjKCIyMDIwIiwgIjIwMjEiKSkgJT4lIA0KICBsZWZ0X2pvaW4oc2VsZWN0KFBvcF9sb25nLCAtdmFyaWFibGUpLCBieSA9IGMoIlN0YXRlIiA9ICJKdXJpcyIsICJZZWFyIikpICU+JSANCiAgbXV0YXRlKERQVF95ciA9IERlYXRocy8oUG9wLzFlMykpICU+JSAgIA0KICBncm91cF9ieShDb2RlKSAlPiUgDQogIHN1bW1hcmlzZShEUFRtdSA9IG1lYW4oRFBUX3lyKSkgDQogICANCld0ZF9DRENfQzE5X0V4IDwtIFd0ZF9DRENfQzE5X0V4ICU+JSANCiAgbGVmdF9qb2luKFd0X01lYW5fZGVhdGhzLCAgYnkgPSAiQ29kZSIpDQoNCiMgQ3JlYXRlIDktMzAgMjAyMCB0YWJsZSANCkV4MjAgPC0gZmlsdGVyKENEQ19DMTlfRXgsIGBXZWVrIEVuZGluZyBEYXRlYCA+ICIyMDE5LTA5LTMwIiAmIGBXZWVrIEVuZGluZyBEYXRlYCA8ICIyMDIwLTEwLTAxIikgJT4lIA0KICBncm91cF9ieShDb2RlKSAlPiUgDQogIHN1bW1hcmlzZShQT1BFU1RJTUFURTIwMTksIERQVG11LCBSZXBvcnRlZCA9IHN1bShgT2JzZXJ2ZWQgTnVtYmVyYCksIEhpUHJlZGljdCA9IHN1bShgVXBwZXIgQm91bmQgVGhyZXNob2xkYCksIE11UHJlZGljdCA9IHN1bShgQXZlcmFnZSBFeHBlY3RlZCBDb3VudGApKSAlPiUNCiAgZGlzdGluY3QoLmtlZXBfYWxsID0gVFJVRSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKFJlcG9ydGVkKSkgJT4lIA0KICBtdXRhdGUoU21hbGxFeCA9IFJlcG9ydGVkIC0gSGlQcmVkaWN0LA0KICAgIEJpZ0V4ID0gUmVwb3J0ZWQgLSBNdVByZWRpY3QsDQogICAgRURQVCA9IChSZXBvcnRlZCAtIEhpUHJlZGljdCkvKFBPUEVTVElNQVRFMjAxOS8xZTMpLCANCiAgICBFRFBUcmF0aW8gPSBFRFBUL0RQVG11LA0KICAgIFJFRFBUID0gKFJlcG9ydGVkLyhQT1BFU1RJTUFURTIwMTkvMWUzKSkgLSBEUFRtdSwNCiAgICBSRURQVHJhdGlvID0gKChSZXBvcnRlZC8oUE9QRVNUSU1BVEUyMDE5LzFlMykpIC0gRFBUbXUpL0RQVG11KQ0KDQojIENyZWF0ZSA5LTMwIDIwMjAgdGFibGUgdXNpbmcgd2VpZ2h0ZWQgb2JzZXJ2YXRpb25zIA0KRXgyMHd0IDwtIGZpbHRlcihXdGRfQ0RDX0MxOV9FeCwgYFdlZWsgRW5kaW5nIERhdGVgID4gIjIwMTktMDktMzAiICYgYFdlZWsgRW5kaW5nIERhdGVgIDwgIjIwMjAtMTAtMDEiKSAlPiUgDQogIGdyb3VwX2J5KENvZGUpICU+JSANCiAgc3VtbWFyaXNlKFBPUEVTVElNQVRFMjAxOSwgRFBUbXUsIFJlcG9ydGVkID0gc3VtKGBPYnNlcnZlZCBOdW1iZXJgKSwgSGlQcmVkaWN0ID0gc3VtKGBVcHBlciBCb3VuZCBUaHJlc2hvbGRgKSwgTXVQcmVkaWN0ID0gc3VtKGBBdmVyYWdlIEV4cGVjdGVkIENvdW50YCkpICU+JQ0KICBkaXN0aW5jdCgua2VlcF9hbGwgPSBUUlVFKSAlPiUgDQogIGZpbHRlcighaXMubmEoUmVwb3J0ZWQpKSAlPiUgDQogIG11dGF0ZShTbWFsbEV4ID0gUmVwb3J0ZWQgLSBIaVByZWRpY3QsDQogICAgQmlnRXggPSBSZXBvcnRlZCAtIE11UHJlZGljdCwNCiAgICBFRFBUID0gKFJlcG9ydGVkIC0gSGlQcmVkaWN0KS8oUE9QRVNUSU1BVEUyMDE5LzFlMyksIA0KICAgIEVEUFRyYXRpbyA9IEVEUFQvRFBUbXUsDQogICAgUkVEUFQgPSAoUmVwb3J0ZWQvKFBPUEVTVElNQVRFMjAxOS8xZTMpKSAtIERQVG11LA0KICAgIFJFRFBUcmF0aW8gPSAoKFJlcG9ydGVkLyhQT1BFU1RJTUFURTIwMTkvMWUzKSkgLSBEUFRtdSkvRFBUbXUpDQoNCiMgQ3JlYXRlIDktMzAgMjAxOSB0YWJsZQ0KRXgxOSA8LSBmaWx0ZXIoQ0RDX0MxOV9FeCwgYFdlZWsgRW5kaW5nIERhdGVgID4gIjIwMTgtMDktMzAiICYgYFdlZWsgRW5kaW5nIERhdGVgIDwgIjIwMTktMTAtMDEiKSAlPiUgDQogICAgICAgICBncm91cF9ieShTdGF0ZSkgJT4lIA0KICAgICAgICAgc3VtbWFyaXNlKENvZGUsIFBPUEVTVElNQVRFMjAxOCwgRFBUbXUsIFJlcG9ydGVkID0gc3VtKGBPYnNlcnZlZCBOdW1iZXJgKSwgSGlQcmVkaWN0ID0gc3VtKGBVcHBlciBCb3VuZCBUaHJlc2hvbGRgKSwgTXVQcmVkaWN0ID0gc3VtKGBBdmVyYWdlIEV4cGVjdGVkIENvdW50YCkpICU+JQ0KICBkaXN0aW5jdCgua2VlcF9hbGwgPSBUUlVFKSAlPiUgDQogIGZpbHRlcighaXMubmEoUmVwb3J0ZWQpKSAlPiUgDQogICAgICAgICBtdXRhdGUoU21hbGxFeCA9IFJlcG9ydGVkIC0gSGlQcmVkaWN0LA0KICAgICAgICAgICAgICAgIEJpZ0V4ID0gUmVwb3J0ZWQgLSBNdVByZWRpY3QsDQogICAgICAgICAgICAgICAgRURQVCA9IChSZXBvcnRlZCAtIEhpUHJlZGljdCkvKFBPUEVTVElNQVRFMjAxOC8xZTMpLCANCiAgICAgICAgICAgICAgICBFRFBUcmF0aW8gPSBFRFBUL0RQVG11KQ0KDQojIENyZWF0ZSA5LTMwIDIwMTggdGFibGUgDQoNCkV4MTggPC0gZmlsdGVyKENEQ19DMTlfRXgsIGBXZWVrIEVuZGluZyBEYXRlYCA+ICIyMDE3LTA5LTMwIiAmIGBXZWVrIEVuZGluZyBEYXRlYCA8ICIyMDE4LTEwLTAxIikgJT4lIA0KICAgICAgICAgZ3JvdXBfYnkoU3RhdGUpICU+JSANCiAgICAgICAgIHN1bW1hcmlzZShDb2RlLCBQT1BFU1RJTUFURTIwMTcsIERQVG11LCBSZXBvcnRlZCA9IHN1bShgT2JzZXJ2ZWQgTnVtYmVyYCksIEhpUHJlZGljdCA9IHN1bShgVXBwZXIgQm91bmQgVGhyZXNob2xkYCksIE11UHJlZGljdCA9IHN1bShgQXZlcmFnZSBFeHBlY3RlZCBDb3VudGApKSAlPiUNCiAgZGlzdGluY3QoLmtlZXBfYWxsID0gVFJVRSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKFJlcG9ydGVkKSkgJT4lIA0KICAgICAgICAgbXV0YXRlKFNtYWxsRXggPSBSZXBvcnRlZCAtIEhpUHJlZGljdCwNCiAgICAgICAgICAgICAgICBCaWdFeCA9IFJlcG9ydGVkIC0gTXVQcmVkaWN0LA0KICAgICAgICAgICAgICAgIEVEUFQgPSAoUmVwb3J0ZWQgLSBIaVByZWRpY3QpLyhQT1BFU1RJTUFURTIwMTcvMWUzKSwgDQogICAgICAgICAgICAgICAgRURQVHJhdGlvID0gRURQVC9EUFRtdSkNCmBgYA0KDQojIyMjIDUuIEdBIERQSCB2cyB3ZWlnaHRlZCBDREMNCg0KYGBge3J9DQoNCkdBX3dlZWtseV9kZWF0aHMgPC0gR0FfZXBpX3N5bXBfZGF0ZSAlPiUNCiAgZmlsdGVyKGNvdW50eSA9PSAiR2VvcmdpYSIpICU+JSANCiAgbXV0YXRlKGBXZWVrIEVuZGluZyBEYXRlYCA9IGNlaWxpbmdfZGF0ZShgc3ltcHRvbSBkYXRlYCwgIndlZWsiKSAtIDEpICU+JSANCiAgZ3JvdXBfYnkoYFdlZWsgRW5kaW5nIERhdGVgKSAlPiUNCiAgc3VtbWFyaXNlKERlYXRocyA9IHN1bShkZWF0aHMpKSANCg0KR0FfQ0RDdkRQSCA8LSBmaWx0ZXIoV3RkX0NEQ19DMTlfRXgsIFN0YXRlID09ICJHZW9yZ2lhIiAmIFllYXIgPT0gMjAyMCAmIGBXZWVrIEVuZGluZyBEYXRlYCA8ICIyMDIwLTEyLTI3IikgJT4lIA0KICBtdXRhdGUoRGVhdGhzID0gYE9ic2VydmVkIE51bWJlcmAgLSBgVXBwZXIgQm91bmQgVGhyZXNob2xkYCwgU291cmNlID0gIkNEQyIpICU+JSBzZWxlY3QoYFdlZWsgRW5kaW5nIERhdGVgLCBEZWF0aHMsIFNvdXJjZSkgJT4lDQogIHJiaW5kKEdBX3dlZWtseV9kZWF0aHMgJT4lIG11dGF0ZShTb3VyY2UgPSAiR0FEUEgiKSkgJT4lDQogIGxlZnRfam9pbihmaWx0ZXIoY2F1c2VfMTRfMjEsIEp1cmlzID09ICJHZW9yZ2lhIikgJT4lIHNlbGVjdChgV2VlayBFbmRpbmcgRGF0ZWAsIGBNTVdSIFdlZWtgKSkgDQoNCmBgYA0KDQojIyMgRC4gRnVuY3Rpb25zDQoNCmBgYHtyfQ0KIyBCdWlsZCBCeVN0YXRlczE0MjAgImluIiBmdW5jdGlvbg0KDQpCeVN0YXRlczE0MjAgPC0gZnVuY3Rpb24oU3RhdGVzLCBGaWcsIFN0YXJ0LCBTdG9wKXsNCiAgZ2dwbG90KGRhdGEgPSBmaWx0ZXIocGNhcF9sb25nLCBKdXJpcyAlaW4lIGMoU3RhdGVzKSAmIENhdXNlICVpbiUgYygiQWxsIikgJiBgV2VlayBFbmRpbmcgRGF0ZWAgPiBTdGFydCAmIGBXZWVrIEVuZGluZyBEYXRlYCA8IFN0b3ApLCBhZXMoIHggPSBgV2VlayBFbmRpbmcgRGF0ZWAsIHkgPSBEZWF0aHNQTSwgY29sb3IgPSBZZWFyKSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMjA3MTIxNSwgc2l6ZSA9IC40LCBjb2xvciA9ICJncmVlbjQiLCBhbHBoYSA9IC40KSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMC4xMCwwLjk1LDAuMTApLGxpbWl0cyA9IGMoMC4xMCwwLjk1KSkgKyANCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjMgbW9udGhzIiwgZGF0ZV9sYWJlbHMgPSAiJWIgJXkiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBhbmdsZSA9IDkwLCBoanVzdCA9IDApLCBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYuNSksIHBsb3QudGFnID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgcGxvdC5tYXJnaW4gPSBtYXJnaW4oLjMsIC4zLCAuMywgLjMsICJjbSIpKSArDQogIGxhYnModGl0bGUgPSAiV2Vla2x5IEFsbC1DYXVzZSBEZWF0aHMgcGVyIFRob3VzYW5kIiwgc3VidGl0bGUgPSAiT3ZlciB0aGUgeC1heGlzIHRpbWUgaW50ZXJ2YWwiLCB5ID0gIkRlYXRocyBwZXIgVGhvdXNhbmQgUG9wIiwgeCA9ICJNb250aCAmIFllYXIiLCBjYXB0aW9uID0gIlNvdXJjZTogQ0RDOyBVLlMuIENlbnN1cyIsIHRhZyA9IGMoRmlnKSkgKw0KICBmYWNldF93cmFwKH5KdXJpcywgbmNvbCA9IDIpDQp9DQoNCiMgQnVpbGQgQnlTdGF0ZXMxNDIwICJub3QgaW4iIGZ1bmN0aW9uDQoNCkJ5U3RhdGVzMTQyMG5pbiA8LSBmdW5jdGlvbihTdGF0ZXMsIFN0YXJ0LCBTdG9wKXsNCiAgZ2dwbG90KGRhdGEgPSANCiAgICAoZmlsdGVyKHBjYXBfbG9uZywgSnVyaXMgJW5pbiUgYyhTdGF0ZXMpICYgQ2F1c2UgJWluJSBjKCJBbGwiKSAmIGBXZWVrIEVuZGluZyBEYXRlYCA+IFN0YXJ0ICYgYFdlZWsgRW5kaW5nIERhdGVgIDwgU3RvcCkgJT4lIA0KICAgIGdyb3VwX2J5KGBXZWVrIEVuZGluZyBEYXRlYCkpICU+JSANCiAgICBzdW1tYXJpc2UoWWVhciwgRFBUID0gc3VtKERlYXRocykvKHN1bShQb3ApLzFlMykpLCBhZXMoeCA9IGBXZWVrIEVuZGluZyBEYXRlYCwgeSA9IERQVCwgY29sb3IgPSBZZWFyKSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IC41KSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMC4xMCwwLjk1LDAuMTApLGxpbWl0cyA9IGMoMC4xMCwwLjk1KSkgKyANCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjMgbW9udGhzIiwgZGF0ZV9sYWJlbHMgPSAiJWIgJXkiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBhbmdsZSA9IDkwLCBoanVzdCA9IDApLCBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYuNSksIHBsb3QudGFnID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgcGxvdC5tYXJnaW4gPSBtYXJnaW4oLjMsIC4zLCAuMywgLjMsICJjbSIpKSANCn0NCg0KIyBCdWlsZCBZZWFyTGF5ZXJzIGZ1bmN0aW9uDQoNClllYXJMYXllcnMgPC0gZnVuY3Rpb24oU3RhdGVzLCBGaWcsIFN0YXJ0LCBTdG9wKSB7DQogIGdncGxvdChkYXRhID0gZmlsdGVyKHBjYXBfbG9uZywgSnVyaXMgJWluJSBjKFN0YXRlcykgJiBDYXVzZSAlaW4lIGMoIkFsbCIpICYgYFdlZWsgRW5kaW5nIERhdGVgID4gU3RhcnQgJiBgV2VlayBFbmRpbmcgRGF0ZWAgPCBTdG9wKSwgYWVzKHggPSBgTU1XUiBXZWVrYCwgeSA9IERlYXRoc1BNLCBncm91cCA9IFllYXIsIGNvbG9yID0gWWVhcikpICsgDQogIGdlb21fc21vb3RoKHNpemUgPSAuNiwgc2UgPSBGQUxTRSwgc3BhbiA9IDAuMjApICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBzZXEoMCw1Miw0KSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgYW5nbGUgPSAwLCBoanVzdCA9IDApLCBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLCBwbG90LnRhZyA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksIHBsb3QubWFyZ2luID0gbWFyZ2luKC4zLCAuMywgLjMsIC4zLCAiY20iKSkgKw0KICBmYWNldF93cmFwKH5KdXJpcywgbmNvbCA9IDIpICsNCiAgbGFicyh0aXRsZSA9ICJXZWVrbHkgRGVhdGhzIHBlciBUaG91c2FuZCAtIEFsbCBDYXVzZXMgYnkgWWVhciIsIHN1YnRpdGxlID0gIjExIEphbiAyMDE0IHRvIDEyIERlYyAyMDIwIiwgeSA9ICJEZWF0aHMgcGVyIFRob3VzYW5kIiwgeCA9ICJDREMgTU1XUiBXZWVrIiwgdGFnID0gYyhGaWcpLCBjYXB0aW9uID0gIlNvdXJjZXM6IGRhdGEuQ0RDLmdvdjsgd3d3Mi5jZW5zdXMuZ292LiBMaW5lcyBmaXR0ZWQgd2l0aCBMT0VTUyBzbW9vdGhpbmcgdmlhIGdlb21fc21vb3RoIGluIFIgZ2dwbG90MiBwYWNrYWdlLiIpDQp9DQoNCmBgYA0K