1 Introduction

As a data scientist you probably retain or reject hypothesis based on measurements of observed samples. The decision is often based on a statistical mechanism called hypothesis testing. Let’s watching the following video:


There are three conditions of having hypothesis testing included:

  • Left Tailed Test: When the \(\bar{x}\) is significantly below the hypothesised population mean \(µ_0\) then \(H_0\) will be rejected and the test used will be the left tailed test (lower tailed test) since the critical region (denoting rejection of \(H_0\)) will be in the left tail of the normal curve (representing sampling distribution of sample statistic \(\bar{x}\)).

\[\text{Left Tailed Test} = \begin{cases} {H_0: \mu \ge \mu_0} \\ {H1: \mu < \mu_0 } \end{cases}\]

  • Right Tailed Test: When the \(\bar{x}\) is significantly above the hypothesized population mean \(µ_0\) then \(H_0\) will be rejected and the test used will be right tailed test (upper tailed test) since the critical region (denoting rejection of \(H_0\) will be in the right tail of the normal curve (representing sampling distribution of sample statistic \(\bar{x}\) ).

\[\text{Right Tailed Test} = \begin{cases} {H_0: \mu \le \mu_0} \\ {H1: \mu > \mu_0 } \end{cases}\]

  • Two Tailed Test: When the \(\bar{x}\) is significantly different (significantly higher or lower than) from the hypothesis population mean \(µ_0\) then \(H_0\) will will be rejected. In this case, the two tailed test will be applicable because there will be two critical regions (denoting rejection of \(H_0\)) on both the tails of the normal curve (representing sampling distribution of sample statistic \(\bar{x}\)).

\[\text{Two Tailed Test} = \begin{cases} {H_0: \mu = \mu_0} \\ {H1: \mu \neq \mu_0 } \end{cases}\]

2 Hypothesis Testing

The critical regions for Hypothesis Testing are shown as shaded portions in the following figure:

Hypothesis Testing

Hypothesis Testing

On comparing the observed value of Test statistic with that of the critical value, we may identify whether the observed value lies in the critical region (reject \(H_0\)) or in the acceptance region (do not reject \(H_0\)) and decide accordingly.

  • Left Tailed Test: If \(Z_{Crit} < -1.645\), then reject \(H_0\) at 5% level of Significance (\(\alpha\) is taken as 5% in most of the analytic situations).
  • Right Tailed Test: If \(Z_{Crit} > 1.645\), then reject \(H_0\) at 5% level of Significance.
  • Two Tailed Test: If \(Z_{Crit}> 1.96\) or If \(Z_{Crit} < -1.96\), then reject \(H_0\) at 5% Level of Significance.

There is also an alternative approach for hypothesis testing, this approach is very much used in all the software packages. Here, you will fucos on the following statement:

  • If p-value \(< \alpha\): reject \(H_0\)
  • If p-value \(\ge \alpha\) : Fails to Reject \(H_0\)

Procedure for Finding P-Values:

P-values

P-values

3 Type of Error I & II

  • A Type I error is the mistake of rejecting the null hypothesis when it is true. The symbol \(\alpha\) (alpha) is used to represent the probability of a type I error.

  • A Type II error is the mistake of failing to reject the null hypothesis when it is false. The symbol \(\beta\) (beta) is used to represent the probability of a type II error.

Type of Error

Type of Error

4 Type I ~ One Tail Z-test

The null hypothesis of the One-tail (left/right) test of the population mean \(\mu\) and \(\sigma\) can be expressed as follows:

\[\text{Hypothesis Testing $H_0$} = \begin{cases} {\mu \ge \mu_0} & \text{Left Tail} \\ {\mu \le \mu_0} & \text{Right Tail} \end{cases}\]

where \(\mu_0\) is a hypothesized left/right bound of the true population mean \(\mu\).

Let us define the test statistic \(z\) in terms of the sample mean, the sample size and the population standard deviation \(\sigma\):

\[z={\bar{x}-\mu_0 \over \sigma/\sqrt{n}}\]

Then the null hypothesis of the left tail test is to be rejected if \(z \le −z_\alpha\) , where \(z_\alpha\) is the \(100(1-\alpha)\) percentile of the standard normal distribution.

4.1 Example 1

Left Tail: Suppose the manufacturer claims that the mean speed of a motorcycle is more than 100 km/hours. In a sample of 30 motorcycles, it was found that they only last 99 km/hours on average. Assume the population standard deviation is 1.2 km/hours. At .05 significance level, can we reject the claim by the manufacturer?

4.1.1 Z-test statistics

First, we calculate the z-test statistics according to the information that we have from the Example 1. In this case, we use z-statistics because we know the mean \(\mu\) and standard deviation \(\sigma\), also we know that the sample size \(\ge 30\).

## [1] -4.564355

4.1.2 Critical value

Then, we calculate the left critical value.

## [1] -1.644854

Now, we can conclude that the test statistic -4.5644 is less than the critical value of -1.6449. Consequently, at .05 significance level, we reject the claim that mean lifetime of a motorcycle is above 100 km/hours.

4.1.3 P-value

Alternative solution: Instead of using the critical value, we apply the pnorm function to compute the left tail p-value of the test statistic. As it turns out to be less than the .05 significance level, we reject the null hypothesis that \(μ \ge 100\).

## [1] 2.505166e-06

4.2 Exercise 1

Right Tail: A food company argue that for each a cookie bag of their products, there is at most 2 grams of saturated fat in a single cookie. In a sample of 40 cookies, it is found that the mean amount of saturated fat per cookie is 2.1 grams. Assume that the population standard deviation is 0.25 grams. At 0.05 significance level, can we reject the claim?

4.2.1 Z-test statistics

First, we calculate the z-test statistics according to the information that we have from the Exercise 1. In this case, we use z-statistics because we know the mean \(\mu\) and standard deviation \(\sigma\), also we know that the sample size \(\ge 30\).

## [1] 2.529822

4.2.2 Critical value

Then, we calculate the left critical value.

## [1] 1.644854

Now, we can conclude that the test statistic 2.529822 is greater than the critical value of 1.644854. Consequently, at .05 significance level, we reject the claim that mean there is at most 2 grams of saturated fat in cookie.

4.2.3 P-value

Alternative solution: Instead of using the critical value, we apply the pnorm function to compute the left tail p-value of the test statistic. As it turns out to be less than the .05 significance level, we reject the null hypothesis that \(μ \leq 2\).

## [1] 0.994294

5 Type I ~ Two Tail Z-test

The null hypothesis of the two-tailed test of the population mean \(\mu\) and \(\sigma\) can be expressed as follows:

\[\mu_0 = \mu\]

where \(\mu_0\) is a hypothesized value of the true population mean \(\mu\).

Let us define the test statistic \(z\) in terms of the sample mean, the sample size and the population standard deviation \(\sigma\):

\[z={\bar{x}-\mu_0 \over \sigma/\sqrt{n}}\]

Then the null hypothesis of the two-tailed test is to be rejected if \(z \le - z_{\alpha/2}\) or \(z \ge z_{\alpha/2}\) , where \(z_{\alpha/2}\) is the \(100(1-\alpha/2)\) percentile of the standard normal distribution.

5.1 Example 2

Suppose the mean weight of King Penguins found in an Antarctic colony last year was 15.4 kg. In a sample of 35 penguins same time this year in the same colony, the mean penguin weight is 14.6 kg. Assume the population standard deviation is 2.5 kg. At .05 significance level, can we reject the null hypothesis that the mean penguin weight does not differ from last year?

5.1.1 Z-test statistics

First, we calculate the z-test statistics according to the information that we have from the Example 2. In this case, we use z-statistics because we know the mean \(\mu\) and standard deviation \(\sigma\), also we know that the sample size \(\ge 30\).

## [1] -1.893146

5.1.2 Critical value

Then, we calculate the left critical value.

## [1] -1.959964  1.959964

The test statistic -1.8931 lies between the critical values -1.9600 and 1.9600. Hence, at .05 significance level, we do not reject the null hypothesis that the mean penguin weight does not differ from last year.

5.1.3 P-value

Alternative solution: Instead of using the critical value, we apply the 2*pnorm() function to compute the two tail p-value of the test statistic.

## [1] 0.05833852

As it turns out to be greater than the .05 significance level, we do not reject the null hypothesis that \(μ > 15.4\).

5.2 Exercise 2

To test the hypothesis that the mean systolic blood pressure in a certain population equals 140 mmHg. The standard deviation has a known value of 20 and a data set of 55 patients is available.

##    no status mmhg
## 1   1      0  120
## 2   2      0  115
## 3   3      0   94
## 4   4      0  118
## 5   5      0  111
## 6   6      0  102
## 7   7      0  102
## 8   8      0  131
## 9   9      0  104
## 10 10      0  107
## 11 11      0  115
## 12 12      0  139
## 13 13      0  115
## 14 14      0  113
## 15 15      0  114
## 16 16      0  105
## 17 17      0  115
## 18 18      0  134
## 19 19      0  109
## 20 20      0  109
## 21 21      0   93
## 22 22      0  118
## 23 23      0  109
## 24 24      0  106
## 25 25      0  125
## 26 26      1  150
## 27 27      1  142
## 28 28      1  119
## 29 29      1  127
## 30 30      1  141
## 31 31      1  149
## 32 32      1  144
## 33 33      1  142
## 34 34      1  149
## 35 35      1  161
## 36 36      1  143
## 37 37      1  140
## 38 38      1  148
## 39 39      1  149
## 40 40      1  141
## 41 41      1  146
## 42 42      1  159
## 43 43      1  152
## 44 44      1  135
## 45 45      1  134
## 46 46      1  161
## 47 47      1  130
## 48 48      1  125
## 49 49      1  141
## 50 50      1  148
## 51 51      1  153
## 52 52      1  145
## 53 53      1  137
## 54 54      1  147
## 55 55      1  169

5.2.1 Z-test statistics

First, we calculate the z-test statistics according to the information that we have from the Exercise 2. In this case, we use z-statistics because we know the mean \(\mu\) and standard deviation \(\sigma\), also we know that the sample size \(\ge 30\).

## [1] -3.708099

5.2.2 Critical value

Then, we calculate the left critical value.

## [1] -1.959964  1.959964

The test statistic -3.708099 lies between the critical values -1.959964 and 1.959964. Hence, at .05 significance level, we reject the null hypothesis that the mean systolic blood pressure in a certain population equals 140 mmHg

5.2.3 P-value

Alternative solution: Instead of using the critical value, we apply the 2*pnorm() function to compute the two tail p-value of the test statistic.

## [1] 0.0002088208

As it turns out to be less than the .05 significance level, we reject the null hypothesis that \(μ = 140\).

6 Type I ~ One Tail t-test

The null hypothesis of the one-tail (left/right) test of the population mean \(\mu\) and unknown \(\sigma\) can be expressed as follows:

\[\text{Hypothesis Testing $H_0$} = \begin{cases} {\mu \le \mu_0} & \text{Left Tail} \\ {\mu \ge \mu_0} & \text{Right Tail} \end{cases}\]

where \(\mu_0\) is a hypothesized left/right bound of the true population mean \(\mu\).

Let us define the test statistic \(t\) in terms of the sample mean, the sample size and the sample standard deviation \(s\):

\[t={\bar{x}-\mu_0 \over s/\sqrt{n}}\]

Then the null hypothesis of the lower tail test is to be rejected if \(t\le−t_\alpha\) , where \(t_\alpha\) is the \(100(1 − \alpha)\) percentile of the Student \(t\) distribution with \(n − 1\) degrees of freedom.

6.1 Example 3

Suppose the manufacturer claims that the mean lifetime of a light bulb is more than 10,000 hours. In a sample of 30 light bulbs, it was found that they only last 9,900 hours on average. Assume the sample standard deviation is 125 hours. At .05 significance level, can we reject the claim by the manufacturer?

6.1.1 T-test statistics

First, we calculate the t-test statistics according to the information that we have from the Example 1. In this case, we use t-statistics because we dont know the mean \(\mu\) and standard deviation \(\sigma\) of pupulation, also we know that the sample size \(\ge 30\).

## [1] -4.38178

6.1.2 Critical value

Then, we calculate the left critical value.

## [1] -1.699127

The test statistic -4.3818 is less than the critical value of -1.6991. Hence, at .05 significance level, we can reject the claim that mean lifetime of a light bulb is above 10,000 hours.

6.1.3 P-value

Alternative Solution: Instead of using the critical value, we apply the pt function to compute the lower tail p-value of the test statistic.

## [1] 7.035026e-05

As it turns out to be less than the .05 significance level, we reject the null hypothesis that \(\mu \ge 10000.\)

6.2 Exercise 3

Right tail: Garuda-food Indonesia claims that for each a cookie bag states of their product, there is at most 2 grams of saturated fat in a single cookie. In a sample of 40 cookies, it is found that the mean amount of saturated fat per cookie is 2.1 grams. Assume that the sample standard deviation is 0.3 gram. At .05 significance level, can we reject the claim?

6.2.1 T-test statistics

First, we calculate the t-test statistics according to the information that we have from the Exercises 3. In this case, we use t-statistics because we dont know the mean \(\mu\) and standard deviation \(\sigma\) of pupulation, also we know that the sample size \(\ge 30\).

## [1] 2.108185

6.2.2 Critical value

Then, we calculate the left critical value.

## [1] 1.684875

The test statistic 2.108185 is greater than the critical value of 1.684875. Hence, at .05 significance level, we can reject the claim that mean for each a cookie bag states of Garuda Food Indonesia’s product, there is at most 2 grams of saturated fat in a single cookie

6.2.3 P-value

Alternative Solution: Instead of using the critical value, we apply the pt function to compute the lower tail p-value of the test statistic.

## [1] 0.979254

As it turns out to be greater than the .05 significance level, we fail to reject the null hypothesis that \(\mu \leq 2.\)

7 Type I ~ Two Tail T-test

The null hypothesis of the two-tailed test of the population mean \(\mu\) and unknown \(\sigma\) can be expressed as follows:

\[\mu_0 = \mu\]

where \(\mu_0\) is a hypothesized value of the true population mean \(\mu\).

Let us define the test statistic \(t\) in terms of the sample mean, the sample size and the sample standard deviation \(s:\)

\[t={\bar{x}-\mu_0 \over s/\sqrt{n}}\]

Then the null hypothesis of the two-tailed test is to be rejected if \(t\le-t_{\alpha∕2}\) or \(t\ge t_{\alpha∕2}\) , where \(t_{\alpha∕2}\) is the \(100(1-\alpha)\) percentile of the Student \(t\) distribution with \(n−1\) degrees of freedom.

7.1 Example 4

Some journals concluded that the average weight of Hachiko Dogs around the world last ten years was 15.4 kg. Researchers want to make sure if there a change in the average weight of these varieties after ten years. Therefore, they pick up a random sample of 35 Dogs from the same varieties and at the same time this year, they found that the mean penguin weight is 14.6 kg. Assume the sample standard deviation is 2.5 kg. At .05 significance level, can we reject the null hypothesis that the mean Hachiko Dogs does not differ from last ten years?

7.1.1 T-test statistics

First, we calculate the t-test statistics according to the information that we have from the Example 2. In this case, we use t-statistics because we know the mean \(\mu\) and standard deviation \(\sigma\), also we know that the sample size \(\ge 35\).

## [1] -1.893146

7.1.2 Critical value

Then, we calculate the left critical value.

## [1] -2.032245  2.032245

The test statistic -1.8931 lies between the critical values -2.04523 and 2.04523. Hence, at .05 significance level, we do not reject the null hypothesis that the mean penguin weight does not differ from last year.

7.1.3 P-value

Alternative solution: Instead of using the critical value, we apply the 2*pt() function to compute the two tail p-value of the test statistic.

## [1] 0.06687552

Since it turns out to be greater than the .05 significance level, we do not reject the null hypothesis that \(μ \ge 15.4\).

7.2 Exercise 4

To test the hypothesis that the mean systolic blood pressure in a certain population equals 140 mmHg. The dataset at hands has measurements on 55 patients.

7.2.1 T-test statistics

First, we calculate the t-test statistics according to the information that we have from the Exercise 4. In this case, we use t-statistics because we know the mean \(\mu\) and standard deviation \(\sigma\), also we know that the sample size \(\ge 35\).

## [1] -3.869272

7.2.2 Critical value

Then, we calculate the left critical value.

## [1] -2.004879  2.004879

The test statistic -3.869272 lies between the critical values -2.004879 and 2.004879. Hence, at .05 significance level, we reject the null hypothesis that the mean systolic blood pressure in a certain population equals 140 mmHg

7.2.3 P-value

Alternative solution: Instead of using the critical value, we apply the 2*pt() function to compute the two tail p-value of the test statistic.

## [1] 0.0002961114

Since it turns out to be less than the .05 significance level, we reject the null hypothesis that \(μ = 140\).

8 Type II ~ One Tail

In a left/right tail test of the population mean, the null hypothesis claims that the true population mean \(\mu\) is greater than a given hypothetical value \(\mu_0\).

\[\text{Type II Error $H_a$} = \begin{cases} {\mu \ge \mu_0} & \text{Left Tail} \\ {\mu \le \mu_0} & \text{Right Tail} \end{cases}\]

A type II error occurs if the hypothesis test based on a random sample fails to reject the null hypothesis even when the true population mean \(\mu\) is in fact less than \(\mu_0\).

8.1 Example 5

Suppose the manufacturer claims that the mean speed of a motorcycle is more than 100 km/hours. In Assume the population standard deviation is 1.2 km/hours. At .05 significance level, what is the probability of having type II error for a sample size of 30 motorcycles?

8.1.1 Standard Error of the Mean

We begin with computing the standard deviation of the mean, sem.

## [1] 0.219089

Next compute the lower bound of sample means for which the null hypothesis \(\mu \ge 10000\) would not be rejected.

8.1.2 Sample Mean

## [1] 99.63963

Therefore, so long as the sample mean is greater than 99.64 in a hypothesis test, the null hypothesis will not be rejected. Since we assume that the actual population mean is 99.50, we can compute the probability of the sample mean above 99.64, and thus found the probability of type II error.

8.1.3 Probability of Error

## [1] 0.261957

If the motorcycle sample size is 30, the actual mean motorcycles speed is 9,950 hours and the population standard deviation is 120 hours, then the probability of type II error for testing the null hypothesis \(\mu \ge 10000\) at .05 significance level is 26.2%, and the power of the hypothesis test is 73.8%.

8.2 Exercise 5

Right tail: Garuda-food Indonesia claims that for each a cookie bag states of their product, there is at most 2 grams of saturated fat in a single cookie. Assume the actual mean amount of saturated fat per cookie is 2.075 grams and the sample standard deviation is 0.25 grams. At .05 significance level, what is the probability of having a type II error for a sample size of 35 cookies?

8.2.1 Standard Error of the Mean

We begin with computing the standard deviation of the mean, sem.

## [1] 0.04225771

Next compute the lower bound of sample means for which the null hypothesis \(\mu \leq 2\) would not be rejected.

8.2.2 Sample Mean

## [1] 1.930492

Therefore, so long as the sample mean is greater than 1.93 in a hypothesis test, the null hypothesis will not be rejected. Since we assume that the actual population mean is 2.075, we can compute the probability of the sample mean above 1.93, and thus found the probability of type II error.

8.2.3 Probability of Error

## [1] 0.9996865

If the Garuda Food Indonesia sample size is 35, the actual mean amount of saturated fat per cookie is 2.075 grams and the sample standard deviation is 0.25 grams, then the probability of type II error for testing the null hypothesis \(\mu \leq 2\) at .05 significance level is 99%, and the power of the hypothesis test is 1%.

9 Type II ~ Two Tail

In a two-tailed test of the population mean, the null hypothesis claims that the true population mean \(\mu\) is equal to a given hypothetical value \(\mu_0\).

\[\mu_0 = \mu\]

A type II error occurs if the hypothesis test based on a random sample fails to reject the null hypothesis even when the true population mean \(\mu\) is in fact different from \(\mu_0\).

Assume that the population has a known standard deviation \(\sigma\). By the Central Limit Theorem, the population of all possible means of samples of sufficiently large size n approximately follows the normal distribution. Hence we can compute the range of sample means for which the null hypothesis will not be rejected, and then obtain an estimate of the probability of type II error.

9.1 Example 6

Some journals concluded that the average weight of Hachiko Dogs around the world last ten years was 15.4 kg. Researchers want to make sure if there a change in the average weight of these varieties after ten years. Assume the actual mean population weight is 15.1 kg, and the population standard deviation is 2.5 kg. At .05 significance level, what is the probability of having type II error for a sample size of 35 Hachiko Dogs?

9.1.1 Standard Error of the Mean

We begin with computing the standard deviation of the mean, sem.

## [1] 0.4225771

Next compute the left and right bounds of sample means for which the null hypothesis \(\mu = 15.4\) would not be rejected.

9.1.2 Sample Mean

## [1] 14.57176 16.22824

Therefore, so long as the sample mean is between 14.572 and 16.228 in a hypothesis test, the null hypothesis will not be rejected. Since we assume that the actual population mean is 15.1, we can compute the lower tail probabilities of both end points.

9.1.3 Probability of Error

## [1] 0.1056435 0.9962062
## [1] 0.8905627

Finally, the probability of type II error is the probability between the two end points. If the sample size of Hachiko Dogs is 35, the actual mean population weight is 15.1 kg and the population standard deviation is 2.5 kg, then the probability of type II error for testing the null hypothesis \(\mu = 15.4\) at .05 significance level is 89.1%, and the power of the hypothesis test is 10.9%.

9.2 Exercise 6

Under same assumptions as Example 6, if actual mean population weight is 14.9 kg, what is the probability of type II errors? What is the power of the hypothesis test?

9.2.1 Standard Error of the Mean

We begin with computing the standard deviation of the mean, sem.

## [1] 0.4225771

Next compute the left and right bounds of sample means for which the null hypothesis \(\mu = 15.4\) would not be rejected.

9.2.2 Sample Mean

## [1] 14.57176 16.22824

Therefore, so long as the sample mean is between 14.572 and 16.228 in a hypothesis test, the null hypothesis will not be rejected. Since we assume that the actual population mean is 14.9, we can compute the lower tail probabilities of both end points.

9.2.3 Probability of Error

## [1] 0.2186537 0.9991644
## [1] 0.7805107

Finally, the probability of type II error is the probability between the two end points. If the sample size of Hachiko Dogs is 35, the actual mean population weight is 14.9 kg and the population standard deviation is 2.5 kg, then the probability of type II error for testing the null hypothesis \(\mu = 15.4\) at .05 significance level is 78%, and the power of the hypothesis test is 22%.

10 Mind Map (Hypothesis)

Mind Map Hypothesis Testing

Mind Map Hypothesis Testing

LS0tDQp0aXRsZTogIkxhYjQ6IEh5cG90aGVzaXMgVGVzdGluZyINCmF1dGhvcjogIkltZWxkYSBTaWFudHVyaSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzDQogICAgdGhlbWU6IHNwYWNlbGFiDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQotLS0NCg0KYGBge3IgTG9nbywgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aCA9ICc0MCUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoImh0dHBzOi8vZ2l0aHViLmNvbS9CYWt0aS1TaXJlZ2FyL2ltYWdlcy9ibG9iL21hc3Rlci9sb2dvLnBuZz9yYXc9dHJ1ZSIpDQpgYGANCg0KDQojIEludHJvZHVjdGlvbg0KDQpBcyBhIGRhdGEgc2NpZW50aXN0IHlvdSBwcm9iYWJseSByZXRhaW4gb3IgcmVqZWN0IGh5cG90aGVzaXMgYmFzZWQgb24gbWVhc3VyZW1lbnRzIG9mIG9ic2VydmVkIHNhbXBsZXMuIFRoZSBkZWNpc2lvbiBpcyBvZnRlbiBiYXNlZCBvbiBhIHN0YXRpc3RpY2FsIG1lY2hhbmlzbSBjYWxsZWQgaHlwb3RoZXNpcyB0ZXN0aW5nLiBMZXQncyB3YXRjaGluZyB0aGUgZm9sbG93aW5nIHZpZGVvOg0KDQo8Y2VudGVyPg0KPGlmcmFtZSB3aWR0aD0iNzUwIiBoZWlnaHQ9IjQ1MCIgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9hX2w5OTF4VUFPVSIgZnJhbWVib3JkZXI9IjAiIGFsbG93PSJhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZSIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPg0KPC9jZW50ZXI+DQoNCjxicj4NCg0KVGhlcmUgYXJlIHRocmVlIGNvbmRpdGlvbnMgb2YgaGF2aW5nIGh5cG90aGVzaXMgdGVzdGluZyBpbmNsdWRlZDoNCg0KKiAqKkxlZnQgVGFpbGVkIFRlc3Q6KiogV2hlbiB0aGUgJFxiYXJ7eH0kIGlzIHNpZ25pZmljYW50bHkgYmVsb3cgdGhlIGh5cG90aGVzaXNlZCBwb3B1bGF0aW9uIG1lYW4gJMK1XzAkIHRoZW4gJEhfMCQgd2lsbCBiZSByZWplY3RlZCBhbmQgdGhlIHRlc3QgdXNlZCB3aWxsIGJlIHRoZSBsZWZ0IHRhaWxlZCB0ZXN0IChsb3dlciB0YWlsZWQgdGVzdCkgc2luY2UgdGhlIGNyaXRpY2FsIHJlZ2lvbiAoZGVub3RpbmcgcmVqZWN0aW9uIG9mICRIXzAkKSB3aWxsIGJlIGluIHRoZSBsZWZ0IHRhaWwgb2YgdGhlIG5vcm1hbCBjdXJ2ZSAocmVwcmVzZW50aW5nIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiBzYW1wbGUgc3RhdGlzdGljICRcYmFye3h9JCkuIA0KDQpcW1x0ZXh0e0xlZnQgVGFpbGVkIFRlc3R9ID0gXGJlZ2lue2Nhc2VzfSB7SF8wOiBcbXUgXGdlIFxtdV8wfSBcXA0KICAgICAgICAgICAgICAgICAgICAgIHtIMTogXG11IDwgXG11XzAgfSBcZW5ke2Nhc2VzfVxdDQoNCiogKipSaWdodCBUYWlsZWQgVGVzdDoqKiBXaGVuIHRoZSAkXGJhcnt4fSQgaXMgc2lnbmlmaWNhbnRseSBhYm92ZSB0aGUgaHlwb3RoZXNpemVkIHBvcHVsYXRpb24gbWVhbiAkwrVfMCQgdGhlbiAkSF8wJCB3aWxsIGJlIHJlamVjdGVkIGFuZCB0aGUgdGVzdCB1c2VkIHdpbGwgYmUgcmlnaHQgdGFpbGVkIHRlc3QgKHVwcGVyIHRhaWxlZCB0ZXN0KSBzaW5jZSB0aGUgY3JpdGljYWwgcmVnaW9uIChkZW5vdGluZyByZWplY3Rpb24gb2YgJEhfMCQgd2lsbCBiZSBpbiB0aGUgcmlnaHQgdGFpbCBvZiB0aGUgbm9ybWFsIGN1cnZlIChyZXByZXNlbnRpbmcgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHNhbXBsZSBzdGF0aXN0aWMgJFxiYXJ7eH0kICkuDQoNClxbXHRleHR7UmlnaHQgVGFpbGVkIFRlc3R9ID0gXGJlZ2lue2Nhc2VzfSB7SF8wOiBcbXUgXGxlIFxtdV8wfSBcXA0KICAgICAgICAgICAgICAgICAgICAgIHtIMTogXG11ID4gXG11XzAgfSBcZW5ke2Nhc2VzfVxdDQoNCiogKipUd28gVGFpbGVkIFRlc3Q6KiogV2hlbiB0aGUgJFxiYXJ7eH0kIGlzIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IChzaWduaWZpY2FudGx5IGhpZ2hlciBvciBsb3dlciB0aGFuKSBmcm9tIHRoZSBoeXBvdGhlc2lzIHBvcHVsYXRpb24gbWVhbiAkwrVfMCQgdGhlbiAkSF8wJCB3aWxsIHdpbGwgYmUgcmVqZWN0ZWQuIEluIHRoaXMgY2FzZSwgdGhlIHR3byB0YWlsZWQgdGVzdCB3aWxsIGJlIGFwcGxpY2FibGUgYmVjYXVzZSB0aGVyZSB3aWxsIGJlIHR3byBjcml0aWNhbCByZWdpb25zIChkZW5vdGluZyByZWplY3Rpb24gb2YgJEhfMCQpIG9uIGJvdGggdGhlIHRhaWxzIG9mIHRoZSBub3JtYWwgY3VydmUgKHJlcHJlc2VudGluZyBzYW1wbGluZyBkaXN0cmlidXRpb24gb2Ygc2FtcGxlIHN0YXRpc3RpYyAkXGJhcnt4fSQpLiANCg0KXFtcdGV4dHtUd28gVGFpbGVkIFRlc3R9ID0gXGJlZ2lue2Nhc2VzfSB7SF8wOiBcbXUgPSBcbXVfMH0gXFwNCiAgICAgICAgICAgICAgICAgICAgICB7SDE6IFxtdSBcbmVxIFxtdV8wIH0gXGVuZHtjYXNlc31cXQ0KDQoNCiMgSHlwb3RoZXNpcyBUZXN0aW5nIA0KDQpUaGUgY3JpdGljYWwgcmVnaW9ucyBmb3IgYEh5cG90aGVzaXMgVGVzdGluZ2AgYXJlIHNob3duIGFzIHNoYWRlZCBwb3J0aW9ucyBpbiB0aGUgZm9sbG93aW5nIGZpZ3VyZToNCg0KYGBge3IsIGVjaG89RkFMU0UsZmlnLmFsaWduPSdjZW50ZXInLGZpZy5jYXA9Ikh5cG90aGVzaXMgVGVzdGluZyIsIG91dC53aWR0aCA9ICcxMDAlJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJIeXBvdGhlc2lzLVRlc3RpbmcuanBnIikNCmBgYA0KDQpPbiBjb21wYXJpbmcgdGhlIG9ic2VydmVkIHZhbHVlIG9mIFRlc3Qgc3RhdGlzdGljIHdpdGggdGhhdCBvZiB0aGUgY3JpdGljYWwgdmFsdWUsIHdlIG1heSBpZGVudGlmeSB3aGV0aGVyIHRoZSBvYnNlcnZlZCB2YWx1ZSBsaWVzIGluIHRoZSBjcml0aWNhbCByZWdpb24gKHJlamVjdCAkSF8wJCkgb3IgaW4gdGhlIGFjY2VwdGFuY2UgcmVnaW9uIChkbyBub3QgcmVqZWN0ICRIXzAkKSBhbmQgZGVjaWRlIGFjY29yZGluZ2x5Lg0KDQoqIExlZnQgVGFpbGVkIFRlc3Q6IElmICRaX3tDcml0fSA8IC0xLjY0NSQsIHRoZW4gcmVqZWN0ICRIXzAkIGF0IDUlIGxldmVsIG9mIFNpZ25pZmljYW5jZSAoJFxhbHBoYSQgaXMgdGFrZW4gYXMgNSUgaW4gbW9zdCBvZiB0aGUgYW5hbHl0aWMgc2l0dWF0aW9ucykuDQoqIFJpZ2h0IFRhaWxlZCBUZXN0OiBJZiAkWl97Q3JpdH0gPiAxLjY0NSQsIHRoZW4gcmVqZWN0ICRIXzAkIGF0IDUlIGxldmVsIG9mIFNpZ25pZmljYW5jZS4NCiogVHdvIFRhaWxlZCBUZXN0OiBJZiAkWl97Q3JpdH0+IDEuOTYkIG9yIElmICRaX3tDcml0fSA8IC0xLjk2JCwgdGhlbiByZWplY3QgJEhfMCQgYXQgNSUgTGV2ZWwgb2YgU2lnbmlmaWNhbmNlLg0KDQpUaGVyZSBpcyBhbHNvIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIGZvciBoeXBvdGhlc2lzIHRlc3RpbmcsIHRoaXMgYXBwcm9hY2ggaXMgdmVyeSBtdWNoIHVzZWQgaW4gYWxsIHRoZSBzb2Z0d2FyZSBwYWNrYWdlcy4gSGVyZSwgeW91IHdpbGwgZnVjb3Mgb24gdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQ6DQoNCiogSWYgcC12YWx1ZSAkPCBcYWxwaGEkOiByZWplY3QgJEhfMCQNCiogSWYgcC12YWx1ZSAkXGdlIFxhbHBoYSQgOiBGYWlscyB0byBSZWplY3QgJEhfMCQNCg0KUHJvY2VkdXJlIGZvciBGaW5kaW5nIFAtVmFsdWVzOg0KDQpgYGB7ciwgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsZmlnLmNhcD0iUC12YWx1ZXMiLCBvdXQud2lkdGggPSAnMTAwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUC12YWx1ZXMucG5nIikNCmBgYA0KDQojIFR5cGUgb2YgRXJyb3IgSSAmIElJDQoNCiogQSBUeXBlIEkgZXJyb3IgaXMgdGhlIG1pc3Rha2Ugb2YgcmVqZWN0aW5nIHRoZSBudWxsIGh5cG90aGVzaXMgd2hlbiBpdCBpcyB0cnVlLiBUaGUgc3ltYm9sICRcYWxwaGEkIChhbHBoYSkgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHByb2JhYmlsaXR5IG9mIGEgdHlwZSBJIGVycm9yLiANCg0KKiBBIFR5cGUgSUkgZXJyb3IgaXMgdGhlIG1pc3Rha2Ugb2YgZmFpbGluZyB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB3aGVuIGl0IGlzIGZhbHNlLiBUaGUgc3ltYm9sICRcYmV0YSQgKGJldGEpIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwcm9iYWJpbGl0eSBvZiBhIHR5cGUgSUkgZXJyb3IuIA0KDQpgYGB7ciwgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsZmlnLmNhcD0iVHlwZSBvZiBFcnJvciIsIG91dC53aWR0aCA9ICcxMDAlJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJUeXBlLW9mLWVycm9yLnBuZyIpDQpgYGANCg0KIyBUeXBlIEkgfiBPbmUgVGFpbCBaLXRlc3QNCg0KVGhlIG51bGwgaHlwb3RoZXNpcyBvZiB0aGUgT25lLXRhaWwgKGxlZnQvcmlnaHQpIHRlc3Qgb2YgdGhlIHBvcHVsYXRpb24gbWVhbiAkXG11JCBhbmQgJFxzaWdtYSQgY2FuIGJlIGV4cHJlc3NlZCBhcyBmb2xsb3dzOg0KDQpcW1x0ZXh0e0h5cG90aGVzaXMgVGVzdGluZyAkSF8wJH0gPSBcYmVnaW57Y2FzZXN9IHtcbXUgXGdlIFxtdV8wfSAmIFx0ZXh0e0xlZnQgVGFpbH0gXFwNCiAgICAgICAgICAgICAgICAgICAgICB7XG11IFxsZSBcbXVfMH0gJiBcdGV4dHtSaWdodCBUYWlsfSBcZW5ke2Nhc2VzfVxdDQoNCndoZXJlICRcbXVfMCQgaXMgYSBoeXBvdGhlc2l6ZWQgbGVmdC9yaWdodCBib3VuZCBvZiB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4gJFxtdSQuDQoNCkxldCB1cyBkZWZpbmUgdGhlIHRlc3Qgc3RhdGlzdGljICR6JCBpbiB0ZXJtcyBvZiB0aGUgc2FtcGxlIG1lYW4sIHRoZSBzYW1wbGUgc2l6ZSBhbmQgdGhlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uICRcc2lnbWEkOg0KDQpcW3o9e1xiYXJ7eH0tXG11XzAgXG92ZXIgXHNpZ21hL1xzcXJ0e259fVxdDQoNClRoZW4gdGhlIG51bGwgaHlwb3RoZXNpcyBvZiB0aGUgbGVmdCB0YWlsIHRlc3QgaXMgdG8gYmUgcmVqZWN0ZWQgaWYgJHogXGxlIOKIknpfXGFscGhhJCAsIHdoZXJlICR6X1xhbHBoYSQgaXMgdGhlICQxMDAoMS1cYWxwaGEpJCBwZXJjZW50aWxlIG9mIHRoZSBzdGFuZGFyZCBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQojIyBFeGFtcGxlIDENCg0KKipMZWZ0IFRhaWw6KiogU3VwcG9zZSB0aGUgbWFudWZhY3R1cmVyIGNsYWltcyB0aGF0IHRoZSBtZWFuIHNwZWVkIG9mIGEgbW90b3JjeWNsZSBpcyBtb3JlIHRoYW4gMTAwIGttL2hvdXJzLiBJbiBhIHNhbXBsZSBvZiAzMCBtb3RvcmN5Y2xlcywgaXQgd2FzIGZvdW5kIHRoYXQgdGhleSBvbmx5IGxhc3QgOTkga20vaG91cnMgb24gYXZlcmFnZS4gQXNzdW1lIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAxLjIga20vaG91cnMuIEF0IC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwsIGNhbiB3ZSByZWplY3QgdGhlIGNsYWltIGJ5IHRoZSBtYW51ZmFjdHVyZXI/DQoNCiMjIyBaLXRlc3Qgc3RhdGlzdGljcw0KDQpGaXJzdCwgd2UgY2FsY3VsYXRlIHRoZSB6LXRlc3Qgc3RhdGlzdGljcyBhY2NvcmRpbmcgdG8gdGhlIGluZm9ybWF0aW9uIHRoYXQgd2UgaGF2ZSBmcm9tIHRoZSBFeGFtcGxlIDEuIEluIHRoaXMgY2FzZSwgd2UgdXNlIHotc3RhdGlzdGljcyBiZWNhdXNlIHdlIGtub3cgdGhlIG1lYW4gJFxtdSQgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiAkXHNpZ21hJCwgYWxzbyB3ZSBrbm93IHRoYXQgdGhlIHNhbXBsZSBzaXplICRcZ2UgMzAkLg0KDQpgYGB7cn0NCm11MCA9IDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGh5cG90aGVzaXplZCB2YWx1ZSANCnhiYXIgPSA5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBtZWFuIA0Kc2lnbWEgPSAxLjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gDQpuID0gMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYW1wbGUgc2l6ZSANCnogPSAoeGJhci1tdTApLyhzaWdtYS9zcXJ0KG4pKTt6ICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3Qgc3RhdGlzdGljIA0KYGBgDQoNCiMjIyBDcml0aWNhbCB2YWx1ZQ0KDQpUaGVuLCB3ZSBjYWxjdWxhdGUgdGhlIGxlZnQgY3JpdGljYWwgdmFsdWUuIA0KDQpgYGB7cn0NCmFscGhhID0gLjA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwNCnouYWxwaGEgPSBxbm9ybSgxLWFscGhhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJpZ2h0IHRhaWwgY3JpdGljYWwgdmFsdWUNCi16LmFscGhhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxlZnQgdGFpbCBjcml0aWNhbCB2YWx1ZSANCmBgYA0KDQpOb3csIHdlIGNhbiBjb25jbHVkZSB0aGF0IHRoZSB0ZXN0IHN0YXRpc3RpYyAtNC41NjQ0IGlzIGxlc3MgdGhhbiB0aGUgY3JpdGljYWwgdmFsdWUgb2YgLTEuNjQ0OS4gQ29uc2VxdWVudGx5LCBhdCAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCB3ZSByZWplY3QgdGhlIGNsYWltIHRoYXQgbWVhbiBsaWZldGltZSBvZiBhIG1vdG9yY3ljbGUgaXMgYWJvdmUgMTAwIGttL2hvdXJzLg0KDQojIyMgUC12YWx1ZQ0KDQoqKkFsdGVybmF0aXZlIHNvbHV0aW9uOioqIEluc3RlYWQgb2YgdXNpbmcgdGhlIGNyaXRpY2FsIHZhbHVlLCB3ZSBhcHBseSB0aGUgcG5vcm0gZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgbGVmdCB0YWlsIHAtdmFsdWUgb2YgdGhlIHRlc3Qgc3RhdGlzdGljLiBBcyBpdCB0dXJucyBvdXQgdG8gYmUgbGVzcyB0aGFuIHRoZSAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCB3ZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0ICTOvCBcZ2UgMTAwJC4NCg0KYGBge3J9DQpwdmFsID0gcG5vcm0oeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsZWZ0IHRhaWwgcOKIknZhbHVlDQpwdmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmludCBw4oiSdmFsdWUNCmBgYA0KDQoNCiMjIEV4ZXJjaXNlIDENCg0KKipSaWdodCBUYWlsOioqIEEgZm9vZCBjb21wYW55IGFyZ3VlIHRoYXQgZm9yIGVhY2ggYSBjb29raWUgYmFnIG9mIHRoZWlyIHByb2R1Y3RzLCB0aGVyZSBpcyBhdCBtb3N0IDIgZ3JhbXMgb2Ygc2F0dXJhdGVkIGZhdCBpbiBhIHNpbmdsZSBjb29raWUuIEluIGEgc2FtcGxlIG9mIDQwIGNvb2tpZXMsIGl0IGlzIGZvdW5kIHRoYXQgdGhlIG1lYW4gYW1vdW50IG9mIHNhdHVyYXRlZCBmYXQgcGVyIGNvb2tpZSBpcyAyLjEgZ3JhbXMuIEFzc3VtZSB0aGF0IHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAwLjI1IGdyYW1zLiBBdCAwLjA1IHNpZ25pZmljYW5jZSBsZXZlbCwgY2FuIHdlIHJlamVjdCB0aGUgY2xhaW0/DQoNCiMjIyBaLXRlc3Qgc3RhdGlzdGljcw0KDQpGaXJzdCwgd2UgY2FsY3VsYXRlIHRoZSB6LXRlc3Qgc3RhdGlzdGljcyBhY2NvcmRpbmcgdG8gdGhlIGluZm9ybWF0aW9uIHRoYXQgd2UgaGF2ZSBmcm9tIHRoZSBFeGVyY2lzZSAxLiBJbiB0aGlzIGNhc2UsIHdlIHVzZSB6LXN0YXRpc3RpY3MgYmVjYXVzZSB3ZSBrbm93IHRoZSBtZWFuICRcbXUkIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gJFxzaWdtYSQsIGFsc28gd2Uga25vdyB0aGF0IHRoZSBzYW1wbGUgc2l6ZSAkXGdlIDMwJC4NCg0KYGBge3J9DQptdTAgPSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaHlwb3RoZXNpemVkIHZhbHVlIA0KeGJhciA9IDIuMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBtZWFuIA0Kc2lnbWEgPSAwLjI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uIA0KbiA9IDQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBzaXplIA0KeiA9ICh4YmFyLW11MCkvKHNpZ21hL3NxcnQobikpO3ogICAgICAgICAgICAgICAgICAgICAjIHRlc3Qgc3RhdGlzdGljIA0KYGBgDQoNCiMjIyBDcml0aWNhbCB2YWx1ZQ0KDQpUaGVuLCB3ZSBjYWxjdWxhdGUgdGhlIGxlZnQgY3JpdGljYWwgdmFsdWUuIA0KDQpgYGB7cn0NCmFscGhhID0gMC4wNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDAuMDUgc2lnbmlmaWNhbmNlIGxldmVsDQp6LmFscGhhID0gcW5vcm0oMS1hbHBoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBSaWdodCB0YWlsIGNyaXRpY2FsIHZhbHVlDQp6LmFscGhhDQpgYGANCg0KTm93LCB3ZSBjYW4gY29uY2x1ZGUgdGhhdCB0aGUgdGVzdCBzdGF0aXN0aWMgMi41Mjk4MjIgaXMgZ3JlYXRlciB0aGFuIHRoZSBjcml0aWNhbCB2YWx1ZSBvZiAxLjY0NDg1NC4gQ29uc2VxdWVudGx5LCBhdCAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCB3ZSByZWplY3QgdGhlIGNsYWltIHRoYXQgbWVhbiB0aGVyZSBpcyBhdCBtb3N0IDIgZ3JhbXMgb2Ygc2F0dXJhdGVkIGZhdCBpbiBjb29raWUuIA0KDQojIyMgUC12YWx1ZQ0KDQoqKkFsdGVybmF0aXZlIHNvbHV0aW9uOioqIEluc3RlYWQgb2YgdXNpbmcgdGhlIGNyaXRpY2FsIHZhbHVlLCB3ZSBhcHBseSB0aGUgcG5vcm0gZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgbGVmdCB0YWlsIHAtdmFsdWUgb2YgdGhlIHRlc3Qgc3RhdGlzdGljLiBBcyBpdCB0dXJucyBvdXQgdG8gYmUgbGVzcyB0aGFuIHRoZSAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCB3ZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0ICTOvCBcbGVxIDIkLg0KDQpgYGB7cn0NCnB2YWwgPSBwbm9ybSh6KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFJpZ2h0IHRhaWwgcOKIknZhbHVlDQpwdmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmludCBw4oiSdmFsdWUNCmBgYA0KDQojIFR5cGUgSSB+IFR3byBUYWlsIFotdGVzdA0KDQpUaGUgbnVsbCBoeXBvdGhlc2lzIG9mIHRoZSB0d28tdGFpbGVkIHRlc3Qgb2YgdGhlIHBvcHVsYXRpb24gbWVhbiAgJFxtdSQgYW5kICRcc2lnbWEkIGNhbiBiZSBleHByZXNzZWQgYXMgZm9sbG93czoNCg0KXFtcbXVfMCA9IFxtdVxdDQoNCndoZXJlICRcbXVfMCQgaXMgYSBoeXBvdGhlc2l6ZWQgdmFsdWUgb2YgdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuICRcbXUkLg0KDQpMZXQgdXMgZGVmaW5lIHRoZSB0ZXN0IHN0YXRpc3RpYyAkeiQgaW4gdGVybXMgb2YgdGhlIHNhbXBsZSBtZWFuLCB0aGUgc2FtcGxlIHNpemUgYW5kIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiAkXHNpZ21hJDoNCg0KXFt6PXtcYmFye3h9LVxtdV8wIFxvdmVyIFxzaWdtYS9cc3FydHtufX1cXQ0KDQpUaGVuIHRoZSBudWxsIGh5cG90aGVzaXMgb2YgdGhlIHR3by10YWlsZWQgdGVzdCBpcyB0byBiZSByZWplY3RlZCBpZiAkeiBcbGUgLSB6X3tcYWxwaGEvMn0kIG9yICR6IFxnZSB6X3tcYWxwaGEvMn0kICwgd2hlcmUgJHpfe1xhbHBoYS8yfSQgaXMgdGhlICQxMDAoMS1cYWxwaGEvMikkIHBlcmNlbnRpbGUgb2YgdGhlIHN0YW5kYXJkIG5vcm1hbCBkaXN0cmlidXRpb24uDQoNCiMjIEV4YW1wbGUgMg0KDQpTdXBwb3NlIHRoZSBtZWFuIHdlaWdodCBvZiBLaW5nIFBlbmd1aW5zIGZvdW5kIGluIGFuIEFudGFyY3RpYyBjb2xvbnkgbGFzdCB5ZWFyIHdhcyAxNS40IGtnLiBJbiBhIHNhbXBsZSBvZiAzNSBwZW5ndWlucyBzYW1lIHRpbWUgdGhpcyB5ZWFyIGluIHRoZSBzYW1lIGNvbG9ueSwgdGhlIG1lYW4gcGVuZ3VpbiB3ZWlnaHQgaXMgMTQuNiBrZy4gQXNzdW1lIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAyLjUga2cuIEF0IC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwsIGNhbiB3ZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZSBtZWFuIHBlbmd1aW4gd2VpZ2h0IGRvZXMgbm90IGRpZmZlciBmcm9tIGxhc3QgeWVhcj8NCg0KDQojIyMgWi10ZXN0IHN0YXRpc3RpY3MNCg0KRmlyc3QsIHdlIGNhbGN1bGF0ZSB0aGUgei10ZXN0IHN0YXRpc3RpY3MgYWNjb3JkaW5nIHRvIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdlIGhhdmUgZnJvbSB0aGUgRXhhbXBsZSAyLiBJbiB0aGlzIGNhc2UsIHdlIHVzZSB6LXN0YXRpc3RpY3MgYmVjYXVzZSB3ZSBrbm93IHRoZSBtZWFuICRcbXUkIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gJFxzaWdtYSQsIGFsc28gd2Uga25vdyB0aGF0IHRoZSBzYW1wbGUgc2l6ZSAkXGdlIDMwJC4NCg0KYGBge3J9DQptdTAgPSAxNS40ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBoeXBvdGhlc2l6ZWQgdmFsdWUgDQp4YmFyID0gMTQuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYW1wbGUgbWVhbiANCnNpZ21hID0gMi41ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uIA0KbiA9IDM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2FtcGxlIHNpemUgDQp6ID0gKHhiYXItbXUwKS8oc2lnbWEvc3FydChuKSk7eiAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0IHN0YXRpc3RpYyANCmBgYA0KDQojIyMgQ3JpdGljYWwgdmFsdWUNCg0KVGhlbiwgd2UgY2FsY3VsYXRlIHRoZSBsZWZ0IGNyaXRpY2FsIHZhbHVlLiANCg0KYGBge3J9DQphbHBoYSA9IC4wNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAuMDUgc2lnbmlmaWNhbmNlIGxldmVsDQp6LmhhbGYuYWxwaGEgPSBxbm9ybSgxLWFscGhhLzIpICAgICAgICAgICAgICAgICAgICAgICAgIyBwZXItb25lIHRhaWwgLjAyNSBzaWduaWZpY2FuY2UgbGV2ZWwNCmMoLXouaGFsZi5hbHBoYSwgei5oYWxmLmFscGhhKSAgICAgICAgICAgICAgICAgICAgICAgICAjIFR3by1UYWlsZWQgMC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwgICANCmBgYA0KDQpUaGUgdGVzdCBzdGF0aXN0aWMgLTEuODkzMSBsaWVzIGJldHdlZW4gdGhlIGNyaXRpY2FsIHZhbHVlcyAtMS45NjAwIGFuZCAxLjk2MDAuIEhlbmNlLCBhdCAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCB3ZSBkbyBub3QgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCB0aGUgbWVhbiBwZW5ndWluIHdlaWdodCBkb2VzIG5vdCBkaWZmZXIgZnJvbSBsYXN0IHllYXIuDQoNCiMjIyBQLXZhbHVlDQoNCioqQWx0ZXJuYXRpdmUgc29sdXRpb246KiogSW5zdGVhZCBvZiB1c2luZyB0aGUgY3JpdGljYWwgdmFsdWUsIHdlIGFwcGx5IHRoZSBgMipwbm9ybSgpYCBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSB0d28gdGFpbCBwLXZhbHVlIG9mIHRoZSB0ZXN0IHN0YXRpc3RpYy4gDQoNCmBgYHtyfQ0KcHZhbD0yKnBub3JtKC1hYnMoeikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdHdvIHRhaWwgcOKIknZhbHVlDQpwdmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmludCBw4oiSdmFsdWUNCmBgYA0KQXMgaXQgdHVybnMgb3V0IHRvIGJlIGdyZWF0ZXIgdGhhbiB0aGUgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCwgd2UgZG8gbm90IHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgJM68ID4gMTUuNCQuDQoNCiMjIEV4ZXJjaXNlIDINCg0KVG8gdGVzdCB0aGUgaHlwb3RoZXNpcyB0aGF0IHRoZSBtZWFuIHN5c3RvbGljIGJsb29kIHByZXNzdXJlIGluIGEgY2VydGFpbiBwb3B1bGF0aW9uIGVxdWFscyAxNDAgbW1IZy4gVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBoYXMgYSBrbm93biB2YWx1ZSBvZiAyMCBhbmQgYSBkYXRhIHNldCBvZiA1NSBwYXRpZW50cyBpcyBhdmFpbGFibGUuDQoNCmBgYHtyfQ0KI0Jsb29kX3ByZXNzdXJlIGRhdGFzZXQNCm5vIDwtIHNlcSgxOjU1KQ0Kc3RhdHVzIDwtIGMocmVwKDAsIDI1KSwgcmVwKDEsIDMwKSkNCm1taGcgPC0gYygxMjAsMTE1LDk0LDExOCwxMTEsMTAyLDEwMiwxMzEsMTA0LDEwNywxMTUsMTM5LDExNSwxMTMsMTE0LDEwNSwNCiAgICAgICAgICAxMTUsMTM0LDEwOSwxMDksOTMsMTE4LDEwOSwxMDYsMTI1LDE1MCwxNDIsMTE5LDEyNywxNDEsMTQ5LDE0NCwNCiAgICAgICAgICAxNDIsMTQ5LDE2MSwxNDMsMTQwLDE0OCwxNDksMTQxLDE0NiwxNTksMTUyLDEzNSwxMzQsMTYxLDEzMCwxMjUsDQogICAgICAgICAgMTQxLDE0OCwxNTMsMTQ1LDEzNywxNDcsMTY5KQ0KYmxvb2RfcHJlc3N1cmUgPC1kYXRhLmZyYW1lKG5vLHN0YXR1cyxtbWhnKQ0KYmxvb2RfcHJlc3N1cmUNCmBgYA0KDQojIyMgWi10ZXN0IHN0YXRpc3RpY3MNCg0KRmlyc3QsIHdlIGNhbGN1bGF0ZSB0aGUgei10ZXN0IHN0YXRpc3RpY3MgYWNjb3JkaW5nIHRvIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdlIGhhdmUgZnJvbSB0aGUgRXhlcmNpc2UgMi4gSW4gdGhpcyBjYXNlLCB3ZSB1c2Ugei1zdGF0aXN0aWNzIGJlY2F1c2Ugd2Uga25vdyB0aGUgbWVhbiAkXG11JCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uICRcc2lnbWEkLCBhbHNvIHdlIGtub3cgdGhhdCB0aGUgc2FtcGxlIHNpemUgJFxnZSAzMCQuDQoNCmBgYHtyfQ0KbXUwID0gMTQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBoeXBvdGhlc2l6ZWQgdmFsdWUgDQp4YmFyID0gbWVhbihibG9vZF9wcmVzc3VyZSRtbWhnKSAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBtZWFuDQpzaWdtYSA9IDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uIA0KbiA9IDU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYW1wbGUgc2l6ZSANCnogPSAoeGJhci1tdTApLyhzaWdtYS9zcXJ0KG4pKTt6ICAgICAgICAgICAgICAgICAgICAgICMgdGVzdCBzdGF0aXN0aWMgDQpgYGANCg0KIyMjIENyaXRpY2FsIHZhbHVlDQoNClRoZW4sIHdlIGNhbGN1bGF0ZSB0aGUgbGVmdCBjcml0aWNhbCB2YWx1ZS4gDQoNCmBgYHtyfQ0KYWxwaGEgPSAuMDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgLjA1IHNpZ25pZmljYW5jZSBsZXZlbA0Kei5oYWxmLmFscGhhID0gcW5vcm0oMS1hbHBoYS8yKSAgICAgICAgICAgICAgICAgICAgICAgICMgcGVyLW9uZSB0YWlsIC4wMjUgc2lnbmlmaWNhbmNlIGxldmVsDQpjKC16LmhhbGYuYWxwaGEsIHouaGFsZi5hbHBoYSkgICAgICAgICAgICAgICAgICAgICAgICAgIyBUd28tVGFpbGVkIDAuMDUgc2lnbmlmaWNhbmNlIGxldmVsICAgDQpgYGANCg0KVGhlIHRlc3Qgc3RhdGlzdGljIC0zLjcwODA5OSBsaWVzIGJldHdlZW4gdGhlIGNyaXRpY2FsIHZhbHVlcyAtMS45NTk5NjQgYW5kIDEuOTU5OTY0LiBIZW5jZSwgYXQgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCwgd2UgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCB0aGUgbWVhbiBzeXN0b2xpYyBibG9vZCBwcmVzc3VyZSBpbiBhIGNlcnRhaW4gcG9wdWxhdGlvbiBlcXVhbHMgMTQwIG1tSGcNCg0KIyMjIFAtdmFsdWUNCg0KKipBbHRlcm5hdGl2ZSBzb2x1dGlvbjoqKiBJbnN0ZWFkIG9mIHVzaW5nIHRoZSBjcml0aWNhbCB2YWx1ZSwgd2UgYXBwbHkgdGhlIGAyKnBub3JtKClgIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIHR3byB0YWlsIHAtdmFsdWUgb2YgdGhlIHRlc3Qgc3RhdGlzdGljLiANCg0KYGBge3J9DQpwdmFsPTIqcG5vcm0oLWFicyh6KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0d28gdGFpbCBw4oiSdmFsdWUNCnB2YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByaW50IHDiiJJ2YWx1ZQ0KYGBgDQpBcyBpdCB0dXJucyBvdXQgdG8gYmUgbGVzcyB0aGFuIHRoZSAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCB3ZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0ICTOvCA9IDE0MCQuDQoNCg0KIyBUeXBlIEkgfiBPbmUgVGFpbCB0LXRlc3QNCg0KVGhlIG51bGwgaHlwb3RoZXNpcyBvZiB0aGUgb25lLXRhaWwgKGxlZnQvcmlnaHQpIHRlc3Qgb2YgdGhlIHBvcHVsYXRpb24gbWVhbiAkXG11JCBhbmQgdW5rbm93biAkXHNpZ21hJCBjYW4gYmUgZXhwcmVzc2VkIGFzIGZvbGxvd3M6DQoNClxbXHRleHR7SHlwb3RoZXNpcyBUZXN0aW5nICRIXzAkfSA9IFxiZWdpbntjYXNlc30ge1xtdSBcbGUgXG11XzB9ICYgXHRleHR7TGVmdCBUYWlsfSBcXA0KICAgICAgICAgICAgICAgICAgICAgIHtcbXUgXGdlIFxtdV8wfSAmIFx0ZXh0e1JpZ2h0IFRhaWx9IFxlbmR7Y2FzZXN9XF0NCg0Kd2hlcmUgJFxtdV8wJCBpcyBhIGh5cG90aGVzaXplZCBsZWZ0L3JpZ2h0IGJvdW5kIG9mIHRoZSB0cnVlIHBvcHVsYXRpb24gbWVhbiAkXG11JC4NCg0KTGV0IHVzIGRlZmluZSB0aGUgdGVzdCBzdGF0aXN0aWMgJHQkIGluIHRlcm1zIG9mIHRoZSBzYW1wbGUgbWVhbiwgdGhlIHNhbXBsZSBzaXplIGFuZCB0aGUgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiAkcyQ6DQoNClxbdD17XGJhcnt4fS1cbXVfMCBcb3ZlciBzL1xzcXJ0e259fVxdDQoNClRoZW4gdGhlIG51bGwgaHlwb3RoZXNpcyBvZiB0aGUgbG93ZXIgdGFpbCB0ZXN0IGlzIHRvIGJlIHJlamVjdGVkIGlmICR0XGxl4oiSdF9cYWxwaGEkICwgd2hlcmUgJHRfXGFscGhhJCBpcyB0aGUgJDEwMCgxIOKIkiBcYWxwaGEpJCBwZXJjZW50aWxlIG9mIHRoZSBTdHVkZW50ICR0JCBkaXN0cmlidXRpb24gd2l0aCAkbiDiiJIgMSQgZGVncmVlcyBvZiBmcmVlZG9tLg0KDQojIyBFeGFtcGxlIDMNCg0KU3VwcG9zZSB0aGUgbWFudWZhY3R1cmVyIGNsYWltcyB0aGF0IHRoZSBtZWFuIGxpZmV0aW1lIG9mIGEgbGlnaHQgYnVsYiBpcyBtb3JlIHRoYW4gMTAsMDAwIGhvdXJzLiBJbiBhIHNhbXBsZSBvZiAzMCBsaWdodCBidWxicywgaXQgd2FzIGZvdW5kIHRoYXQgdGhleSBvbmx5IGxhc3QgOSw5MDAgaG91cnMgb24gYXZlcmFnZS4gQXNzdW1lIHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIDEyNSBob3Vycy4gQXQgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCwgY2FuIHdlIHJlamVjdCB0aGUgY2xhaW0gYnkgdGhlIG1hbnVmYWN0dXJlcj8NCg0KIyMjIFQtdGVzdCBzdGF0aXN0aWNzDQoNCkZpcnN0LCB3ZSBjYWxjdWxhdGUgdGhlIHQtdGVzdCBzdGF0aXN0aWNzIGFjY29yZGluZyB0byB0aGUgaW5mb3JtYXRpb24gdGhhdCB3ZSBoYXZlIGZyb20gdGhlIEV4YW1wbGUgMS4gSW4gdGhpcyBjYXNlLCB3ZSB1c2UgdC1zdGF0aXN0aWNzIGJlY2F1c2Ugd2UgZG9udCBrbm93IHRoZSBtZWFuICRcbXUkIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gJFxzaWdtYSQgb2YgcHVwdWxhdGlvbiwgYWxzbyB3ZSBrbm93IHRoYXQgdGhlIHNhbXBsZSBzaXplICRcZ2UgMzAkLg0KDQpgYGB7cn0NCm11MCA9IDEwMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGh5cG90aGVzaXplZCB2YWx1ZSAgDQp4YmFyID0gOTkwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYW1wbGUgbWVhbiANCnMgPSAxMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gDQpuID0gMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYW1wbGUgc2l6ZSANCnQgPSAoeGJhci1tdTApLyhzL3NxcnQobikpO3QgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3Qgc3RhdGlzdGljICANCmBgYA0KDQojIyMgQ3JpdGljYWwgdmFsdWUNCg0KVGhlbiwgd2UgY2FsY3VsYXRlIHRoZSBsZWZ0IGNyaXRpY2FsIHZhbHVlLiANCg0KYGBge3J9DQphbHBoYSA9IC4wNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgMC4wNSBsZWZ0IHRhaWwgc2lnbmlmaWNhbnQgbGV2ZWwgDQp0LmFscGhhID0gcXQoMS1hbHBoYSwgZGY9bi0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyByaWdodCB0YWlsIGNyaXRpY2FsIHZhbHVlICAgIA0KLXQuYWxwaGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGVmdCB0YWlsIGNyaXRpY2FsIHZhbHVlIA0KYGBgDQoNClRoZSB0ZXN0IHN0YXRpc3RpYyAtNC4zODE4IGlzIGxlc3MgdGhhbiB0aGUgY3JpdGljYWwgdmFsdWUgb2YgLTEuNjk5MS4gSGVuY2UsIGF0IC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwsIHdlIGNhbiByZWplY3QgdGhlIGNsYWltIHRoYXQgbWVhbiBsaWZldGltZSBvZiBhIGxpZ2h0IGJ1bGIgaXMgYWJvdmUgMTAsMDAwIGhvdXJzLg0KDQojIyMgUC12YWx1ZQ0KDQoqKkFsdGVybmF0aXZlIFNvbHV0aW9uOioqIEluc3RlYWQgb2YgdXNpbmcgdGhlIGNyaXRpY2FsIHZhbHVlLCB3ZSBhcHBseSB0aGUgYHB0YCBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSBsb3dlciB0YWlsIHAtdmFsdWUgb2YgdGhlIHRlc3Qgc3RhdGlzdGljLg0KDQpgYGB7cn0NCnB2YWwgPSBwdCh0LCBkZj1uLTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxlZnQgdGFpbCBw4oiSdmFsdWUNCnB2YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByaW50IHDiiJJ2YWx1ZQ0KYGBgDQogQXMgaXQgdHVybnMgb3V0IHRvIGJlIGxlc3MgdGhhbiB0aGUgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCwgd2UgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCAkXG11IFxnZSAxMDAwMC4kDQogDQojIyBFeGVyY2lzZSAzDQoNCioqUmlnaHQgdGFpbDoqKiBHYXJ1ZGEtZm9vZCBJbmRvbmVzaWEgY2xhaW1zIHRoYXQgZm9yIGVhY2ggYSBjb29raWUgYmFnIHN0YXRlcyBvZiB0aGVpciBwcm9kdWN0LCB0aGVyZSBpcyBhdCBtb3N0IDIgZ3JhbXMgb2Ygc2F0dXJhdGVkIGZhdCBpbiBhIHNpbmdsZSBjb29raWUuIEluIGEgc2FtcGxlIG9mIDQwIGNvb2tpZXMsIGl0IGlzIGZvdW5kIHRoYXQgdGhlIG1lYW4gYW1vdW50IG9mIHNhdHVyYXRlZCBmYXQgcGVyIGNvb2tpZSBpcyAyLjEgZ3JhbXMuIEFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIDAuMyBncmFtLiBBdCAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCBjYW4gd2UgcmVqZWN0IHRoZSBjbGFpbT8NCg0KIyMjIFQtdGVzdCBzdGF0aXN0aWNzDQoNCkZpcnN0LCB3ZSBjYWxjdWxhdGUgdGhlIHQtdGVzdCBzdGF0aXN0aWNzIGFjY29yZGluZyB0byB0aGUgaW5mb3JtYXRpb24gdGhhdCB3ZSBoYXZlIGZyb20gdGhlIEV4ZXJjaXNlcyAzLiBJbiB0aGlzIGNhc2UsIHdlIHVzZSB0LXN0YXRpc3RpY3MgYmVjYXVzZSB3ZSBkb250IGtub3cgdGhlIG1lYW4gJFxtdSQgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiAkXHNpZ21hJCBvZiBwdXB1bGF0aW9uLCBhbHNvIHdlIGtub3cgdGhhdCB0aGUgc2FtcGxlIHNpemUgJFxnZSAzMCQuDQoNCmBgYHtyfQ0KbXUwID0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBoeXBvdGhlc2l6ZWQgdmFsdWUgIA0KeGJhciA9IDIuMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYW1wbGUgbWVhbiANCnMgPSAwLjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiANCm4gPSA0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2FtcGxlIHNpemUgDQp0ID0gKHhiYXItbXUwKS8ocy9zcXJ0KG4pKTt0ICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3Qgc3RhdGlzdGljICANCmBgYA0KDQojIyMgQ3JpdGljYWwgdmFsdWUNCg0KVGhlbiwgd2UgY2FsY3VsYXRlIHRoZSBsZWZ0IGNyaXRpY2FsIHZhbHVlLiANCg0KYGBge3J9DQphbHBoYSA9IC4wNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgMC4wNSBsZWZ0IHRhaWwgc2lnbmlmaWNhbnQgbGV2ZWwgDQp0LmFscGhhID0gcXQoMS1hbHBoYSwgZGY9bi0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBSaWdodCB0YWlsIGNyaXRpY2FsIHZhbHVlICAgIA0KdC5hbHBoYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpgYGANCg0KVGhlIHRlc3Qgc3RhdGlzdGljIDIuMTA4MTg1IGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3JpdGljYWwgdmFsdWUgb2YgMS42ODQ4NzUuIEhlbmNlLCBhdCAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCB3ZSBjYW4gcmVqZWN0IHRoZSBjbGFpbSB0aGF0IG1lYW4gZm9yIGVhY2ggYSBjb29raWUgYmFnIHN0YXRlcyBvZiBHYXJ1ZGEgRm9vZCBJbmRvbmVzaWEncyBwcm9kdWN0LCB0aGVyZSBpcyBhdCBtb3N0IDIgZ3JhbXMgb2Ygc2F0dXJhdGVkIGZhdCBpbiBhIHNpbmdsZSBjb29raWUNCg0KIyMjIFAtdmFsdWUNCg0KKipBbHRlcm5hdGl2ZSBTb2x1dGlvbjoqKiBJbnN0ZWFkIG9mIHVzaW5nIHRoZSBjcml0aWNhbCB2YWx1ZSwgd2UgYXBwbHkgdGhlIGBwdGAgZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgbG93ZXIgdGFpbCBwLXZhbHVlIG9mIHRoZSB0ZXN0IHN0YXRpc3RpYy4NCg0KYGBge3J9DQpwdmFsID0gcHQodCwgZGY9bi0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsZWZ0IHRhaWwgcOKIknZhbHVlDQpwdmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmludCBw4oiSdmFsdWUNCmBgYA0KIEFzIGl0IHR1cm5zIG91dCB0byBiZSBncmVhdGVyIHRoYW4gdGhlIC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwsIHdlIGZhaWwgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCAkXG11IFxsZXEgMi4kDQoNCiMgVHlwZSBJIH4gVHdvIFRhaWwgVC10ZXN0DQoNClRoZSBudWxsIGh5cG90aGVzaXMgb2YgdGhlIHR3by10YWlsZWQgdGVzdCBvZiB0aGUgcG9wdWxhdGlvbiBtZWFuICRcbXUkIGFuZCB1bmtub3duICRcc2lnbWEkIGNhbiBiZSBleHByZXNzZWQgYXMgZm9sbG93czoNCg0KXFtcbXVfMCA9IFxtdVxdDQoNCndoZXJlICRcbXVfMCQgaXMgYSBoeXBvdGhlc2l6ZWQgdmFsdWUgb2YgdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuICRcbXUkLg0KDQpMZXQgdXMgZGVmaW5lIHRoZSB0ZXN0IHN0YXRpc3RpYyAkdCQgaW4gdGVybXMgb2YgdGhlIHNhbXBsZSBtZWFuLCB0aGUgc2FtcGxlIHNpemUgYW5kIHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uICRzOiQNCg0KXFt0PXtcYmFye3h9LVxtdV8wIFxvdmVyIHMvXHNxcnR7bn19XF0NCg0KVGhlbiB0aGUgbnVsbCBoeXBvdGhlc2lzIG9mIHRoZSB0d28tdGFpbGVkIHRlc3QgaXMgdG8gYmUgcmVqZWN0ZWQgaWYgJHRcbGUtdF97XGFscGhh4oiVMn0kIG9yICR0XGdlIHRfe1xhbHBoYeKIlTJ9JCAsIHdoZXJlICR0X3tcYWxwaGHiiJUyfSQgaXMgdGhlICQxMDAoMS1cYWxwaGEpJCBwZXJjZW50aWxlIG9mIHRoZSBTdHVkZW50ICR0JCBkaXN0cmlidXRpb24gd2l0aCAkbuKIkjEkIGRlZ3JlZXMgb2YgZnJlZWRvbS4NCg0KIyMgRXhhbXBsZSA0DQoNClNvbWUgam91cm5hbHMgY29uY2x1ZGVkIHRoYXQgdGhlIGF2ZXJhZ2Ugd2VpZ2h0IG9mIEhhY2hpa28gRG9ncyBhcm91bmQgdGhlIHdvcmxkIGxhc3QgdGVuIHllYXJzIHdhcyAxNS40IGtnLiBSZXNlYXJjaGVycyB3YW50IHRvIG1ha2Ugc3VyZSBpZiB0aGVyZSBhIGNoYW5nZSBpbiB0aGUgYXZlcmFnZSB3ZWlnaHQgb2YgdGhlc2UgdmFyaWV0aWVzIGFmdGVyIHRlbiB5ZWFycy4gVGhlcmVmb3JlLCB0aGV5IHBpY2sgdXAgYSByYW5kb20gc2FtcGxlIG9mIDM1IERvZ3MgZnJvbSB0aGUgc2FtZSB2YXJpZXRpZXMgYW5kIGF0IHRoZSBzYW1lIHRpbWUgdGhpcyB5ZWFyLCAgdGhleSBmb3VuZCB0aGF0IHRoZSBtZWFuIHBlbmd1aW4gd2VpZ2h0IGlzIDE0LjYga2cuIEFzc3VtZSB0aGUgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAyLjUga2cuIEF0IC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwsIGNhbiB3ZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZSBtZWFuIEhhY2hpa28gRG9ncyBkb2VzIG5vdCBkaWZmZXIgZnJvbSBsYXN0IHRlbiB5ZWFycz8NCg0KDQojIyMgVC10ZXN0IHN0YXRpc3RpY3MNCg0KRmlyc3QsIHdlIGNhbGN1bGF0ZSB0aGUgdC10ZXN0IHN0YXRpc3RpY3MgYWNjb3JkaW5nIHRvIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdlIGhhdmUgZnJvbSB0aGUgRXhhbXBsZSAyLiBJbiB0aGlzIGNhc2UsIHdlIHVzZSB0LXN0YXRpc3RpY3MgYmVjYXVzZSB3ZSBrbm93IHRoZSBtZWFuICRcbXUkIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gJFxzaWdtYSQsIGFsc28gd2Uga25vdyB0aGF0IHRoZSBzYW1wbGUgc2l6ZSAkXGdlIDM1JC4NCg0KYGBge3J9DQptdTAgPSAxNS40ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBoeXBvdGhlc2l6ZWQgdmFsdWUgDQp4YmFyID0gMTQuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYW1wbGUgbWVhbiANCnMgPSAyLjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gDQpuID0gMzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYW1wbGUgc2l6ZSANCnQgPSAoeGJhci1tdTApLyhzL3NxcnQobikpO3QgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3Qgc3RhdGlzdGljIA0KYGBgDQoNCiMjIyBDcml0aWNhbCB2YWx1ZQ0KDQpUaGVuLCB3ZSBjYWxjdWxhdGUgdGhlIGxlZnQgY3JpdGljYWwgdmFsdWUuIA0KDQpgYGB7cn0NCmFscGhhID0gLjA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwNCnQuaGFsZi5hbHBoYSA9IHF0KDEtYWxwaGEvMiwgZGY9bi0xKSAgICAgICAgICAgICAgICAgICAjIHBlci1vbmUgdGFpbCAuMDI1IHNpZ25pZmljYW5jZSBsZXZlbA0KYygtdC5oYWxmLmFscGhhLCB0LmhhbGYuYWxwaGEpICAgICAgICAgICAgICAgICAgICAgICAgICMgVHdvLVRhaWxlZCAwLjA1IHNpZ25pZmljYW5jZSBsZXZlbA0KYGBgDQoNClRoZSB0ZXN0IHN0YXRpc3RpYyAtMS44OTMxIGxpZXMgYmV0d2VlbiB0aGUgY3JpdGljYWwgdmFsdWVzIC0yLjA0NTIzIGFuZCAyLjA0NTIzLiBIZW5jZSwgYXQgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCwgd2UgZG8gbm90IHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgdGhlIG1lYW4gcGVuZ3VpbiB3ZWlnaHQgZG9lcyBub3QgZGlmZmVyIGZyb20gbGFzdCB5ZWFyLg0KDQojIyMgUC12YWx1ZQ0KDQoqKkFsdGVybmF0aXZlIHNvbHV0aW9uOioqIEluc3RlYWQgb2YgdXNpbmcgdGhlIGNyaXRpY2FsIHZhbHVlLCB3ZSBhcHBseSB0aGUgYDIqcHQoKWAgZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgdHdvIHRhaWwgcC12YWx1ZSBvZiB0aGUgdGVzdCBzdGF0aXN0aWMuIA0KDQpgYGB7cn0NCnB2YWwgPSAyKnB0KHQsIGRmPW4tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHR3byB0YWlsIHDiiJJ2YWx1ZQ0KcHZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJpbnQgcOKIknZhbHVlDQpgYGANClNpbmNlIGl0IHR1cm5zIG91dCB0byBiZSBncmVhdGVyIHRoYW4gdGhlIC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwsIHdlIGRvIG5vdCByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0ICTOvCBcZ2UgMTUuNCQuDQoNCg0KIyMgRXhlcmNpc2UgNA0KDQpUbyB0ZXN0IHRoZSBoeXBvdGhlc2lzIHRoYXQgdGhlIG1lYW4gc3lzdG9saWMgYmxvb2QgcHJlc3N1cmUgaW4gYSBjZXJ0YWluIHBvcHVsYXRpb24gZXF1YWxzIDE0MCBtbUhnLiBUaGUgZGF0YXNldCBhdCBoYW5kcyBoYXMgbWVhc3VyZW1lbnRzIG9uIDU1IHBhdGllbnRzLg0KDQpgYGB7cn0NCiNCbG9vZF9wcmVzc3VyZSBkYXRhc2V0DQpubyA8LSBzZXEoMTo1NSkNCnN0YXR1cyA8LSBjKHJlcCgwLCAyNSksIHJlcCgxLCAzMCkpDQptbWhnIDwtIGMoMTIwLDExNSw5NCwxMTgsMTExLDEwMiwxMDIsMTMxLDEwNCwxMDcsMTE1LDEzOSwxMTUsMTEzLDExNCwxMDUsDQogICAgICAgICAgMTE1LDEzNCwxMDksMTA5LDkzLDExOCwxMDksMTA2LDEyNSwxNTAsMTQyLDExOSwxMjcsMTQxLDE0OSwxNDQsDQogICAgICAgICAgMTQyLDE0OSwxNjEsMTQzLDE0MCwxNDgsMTQ5LDE0MSwxNDYsMTU5LDE1MiwxMzUsMTM0LDE2MSwxMzAsMTI1LA0KICAgICAgICAgIDE0MSwxNDgsMTUzLDE0NSwxMzcsMTQ3LDE2OSkNCmJsb29kX3ByZXNzdXJlIDwtZGF0YS5mcmFtZShubyxzdGF0dXMsbW1oZykNCmBgYA0KDQojIyMgVC10ZXN0IHN0YXRpc3RpY3MNCg0KRmlyc3QsIHdlIGNhbGN1bGF0ZSB0aGUgdC10ZXN0IHN0YXRpc3RpY3MgYWNjb3JkaW5nIHRvIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdlIGhhdmUgZnJvbSB0aGUgRXhlcmNpc2UgNC4gSW4gdGhpcyBjYXNlLCB3ZSB1c2UgdC1zdGF0aXN0aWNzIGJlY2F1c2Ugd2Uga25vdyB0aGUgbWVhbiAkXG11JCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uICRcc2lnbWEkLCBhbHNvIHdlIGtub3cgdGhhdCB0aGUgc2FtcGxlIHNpemUgJFxnZSAzNSQuDQoNCmBgYHtyfQ0KbXUwID0gMTQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaHlwb3RoZXNpemVkIHZhbHVlIA0KeGJhciA9IG1lYW4oYmxvb2RfcHJlc3N1cmUkbW1oZykgICAgICAgICAgICAgICAgICAgICAgICMgc2FtcGxlIG1lYW4NCnMgPSBzZChibG9vZF9wcmVzc3VyZSRtbWhnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gDQpuID0gNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYW1wbGUgc2l6ZSANCnQgPSAoeGJhci1tdTApLyhzL3NxcnQobikpO3QgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3Qgc3RhdGlzdGljIA0KYGBgDQoNCiMjIyBDcml0aWNhbCB2YWx1ZQ0KDQpUaGVuLCB3ZSBjYWxjdWxhdGUgdGhlIGxlZnQgY3JpdGljYWwgdmFsdWUuIA0KDQpgYGB7cn0NCmFscGhhID0gLjA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwNCnQuaGFsZi5hbHBoYSA9IHF0KDEtYWxwaGEvMiwgZGY9bi0xKSAgICAgICAgICAgICAgICAgICAjIHBlci1vbmUgdGFpbCAuMDI1IHNpZ25pZmljYW5jZSBsZXZlbA0KYygtdC5oYWxmLmFscGhhLCB0LmhhbGYuYWxwaGEpICAgICAgICAgICAgICAgICAgICAgICAgICMgVHdvLVRhaWxlZCAwLjA1IHNpZ25pZmljYW5jZSBsZXZlbA0KYGBgDQoNClRoZSB0ZXN0IHN0YXRpc3RpYyAtMy44NjkyNzIgbGllcyBiZXR3ZWVuIHRoZSBjcml0aWNhbCB2YWx1ZXMgLTIuMDA0ODc5IGFuZCAyLjAwNDg3OS4gSGVuY2UsIGF0IC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwsIHdlIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgdGhlIG1lYW4gc3lzdG9saWMgYmxvb2QgcHJlc3N1cmUgaW4gYSBjZXJ0YWluIHBvcHVsYXRpb24gZXF1YWxzIDE0MCBtbUhnDQoNCiMjIyBQLXZhbHVlDQoNCioqQWx0ZXJuYXRpdmUgc29sdXRpb246KiogSW5zdGVhZCBvZiB1c2luZyB0aGUgY3JpdGljYWwgdmFsdWUsIHdlIGFwcGx5IHRoZSBgMipwdCgpYCBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSB0d28gdGFpbCBwLXZhbHVlIG9mIHRoZSB0ZXN0IHN0YXRpc3RpYy4gDQoNCmBgYHtyfQ0KcHZhbCA9IDIqcHQodCwgZGY9bi0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdHdvIHRhaWwgcOKIknZhbHVlDQpwdmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmludCBw4oiSdmFsdWUNCmBgYA0KU2luY2UgaXQgdHVybnMgb3V0IHRvIGJlIGxlc3MgdGhhbiB0aGUgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCwgd2UgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCAkzrwgPSAxNDAkLg0KDQoNCg0KIyBUeXBlIElJIH4gT25lIFRhaWwgDQoNCkluIGEgbGVmdC9yaWdodCB0YWlsIHRlc3Qgb2YgdGhlIHBvcHVsYXRpb24gbWVhbiwgdGhlIG51bGwgaHlwb3RoZXNpcyBjbGFpbXMgdGhhdCB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4gJFxtdSQgaXMgZ3JlYXRlciB0aGFuIGEgZ2l2ZW4gaHlwb3RoZXRpY2FsIHZhbHVlICRcbXVfMCQuDQoNClxbXHRleHR7VHlwZSBJSSBFcnJvciAkSF9hJH0gPSBcYmVnaW57Y2FzZXN9IHtcbXUgXGdlIFxtdV8wfSAmIFx0ZXh0e0xlZnQgVGFpbH0gXFwNCiAgICAgICAgICAgICAgICAgICAgICB7XG11IFxsZSBcbXVfMH0gJiBcdGV4dHtSaWdodCBUYWlsfSBcZW5ke2Nhc2VzfVxdDQogICAgICAgICAgICAgICAgICAgICAgDQpBIHR5cGUgSUkgZXJyb3Igb2NjdXJzIGlmIHRoZSBoeXBvdGhlc2lzIHRlc3QgYmFzZWQgb24gYSByYW5kb20gc2FtcGxlIGZhaWxzIHRvIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIGV2ZW4gd2hlbiB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4gJFxtdSQgaXMgaW4gZmFjdCBsZXNzIHRoYW4gJFxtdV8wJC4NCg0KIyMgRXhhbXBsZSA1DQoNClN1cHBvc2UgdGhlIG1hbnVmYWN0dXJlciBjbGFpbXMgdGhhdCB0aGUgbWVhbiBzcGVlZCBvZiBhIG1vdG9yY3ljbGUgaXMgbW9yZSB0aGFuIDEwMCBrbS9ob3Vycy4gSW4gQXNzdW1lIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAxLjIga20vaG91cnMuIEF0IC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwsIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IG9mIGhhdmluZyB0eXBlIElJIGVycm9yIGZvciBhIHNhbXBsZSBzaXplIG9mIDMwIG1vdG9yY3ljbGVzPw0KDQoNCiMjIyBTdGFuZGFyZCBFcnJvciBvZiB0aGUgTWVhbiANCg0KV2UgYmVnaW4gd2l0aCBjb21wdXRpbmcgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiwgc2VtLg0KDQpgYGB7cn0NCm4gPSAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBzaXplIA0Kc2lnbWEgPSAxLjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gDQpzZW0gPSBzaWdtYS9zcXJ0KG4pOyBzZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdGFuZGFyZCBlcnJvciANCmBgYA0KTmV4dCBjb21wdXRlIHRoZSBsb3dlciBib3VuZCBvZiBzYW1wbGUgbWVhbnMgZm9yIHdoaWNoIHRoZSBudWxsIGh5cG90aGVzaXMgJFxtdSBcZ2UgMTAwMDAkIHdvdWxkIG5vdCBiZSByZWplY3RlZC4NCg0KIyMjIFNhbXBsZSBNZWFuDQoNCg0KYGBge3J9DQphbHBoYSA9IC4wNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzaWduaWZpY2FuY2UgbGV2ZWwgDQptdTAgPSAxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBoeXBvdGhldGljYWwgbG93ZXIgYm91bmQgDQpxID0gcW5vcm0oYWxwaGEsIG1lYW49bXUwLCBzZD1zZW0pOyBxIA0KYGBgDQpUaGVyZWZvcmUsIHNvIGxvbmcgYXMgdGhlIHNhbXBsZSBtZWFuIGlzIGdyZWF0ZXIgdGhhbiA5OS42NCBpbiBhIGh5cG90aGVzaXMgdGVzdCwgdGhlIG51bGwgaHlwb3RoZXNpcyB3aWxsIG5vdCBiZSByZWplY3RlZC4gU2luY2Ugd2UgYXNzdW1lIHRoYXQgdGhlIGFjdHVhbCBwb3B1bGF0aW9uIG1lYW4gaXMgOTkuNTAsIHdlIGNhbiBjb21wdXRlIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgc2FtcGxlIG1lYW4gYWJvdmUgOTkuNjQsIGFuZCB0aHVzIGZvdW5kIHRoZSBwcm9iYWJpbGl0eSBvZiB0eXBlIElJIGVycm9yLg0KDQojIyMgUHJvYmFiaWxpdHkgb2YgRXJyb3INCg0KYGBge3J9DQptdSA9IDk5LjUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXNzdW1lZCBhY3R1YWwgbWVhbiANCnBub3JtKHEsIG1lYW49bXUsIHNkPXNlbSwgbG93ZXIudGFpbD1GQUxTRSkgDQpgYGANCklmIHRoZSBtb3RvcmN5Y2xlIHNhbXBsZSBzaXplIGlzIDMwLCB0aGUgYWN0dWFsIG1lYW4gbW90b3JjeWNsZXMgc3BlZWQgaXMgOSw5NTAgaG91cnMgYW5kIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAxMjAgaG91cnMsIHRoZW4gdGhlIHByb2JhYmlsaXR5IG9mIHR5cGUgSUkgZXJyb3IgZm9yIHRlc3RpbmcgdGhlIG51bGwgaHlwb3RoZXNpcyAkXG11IFxnZSAxMDAwMCQgYXQgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCBpcyAyNi4yJSwgYW5kIHRoZSBwb3dlciBvZiB0aGUgaHlwb3RoZXNpcyB0ZXN0IGlzIDczLjglLg0KDQoNCiMjIEV4ZXJjaXNlIDUNCg0KKipSaWdodCB0YWlsOioqIEdhcnVkYS1mb29kIEluZG9uZXNpYSBjbGFpbXMgdGhhdCBmb3IgZWFjaCBhIGNvb2tpZSBiYWcgc3RhdGVzIG9mIHRoZWlyIHByb2R1Y3QsIHRoZXJlIGlzIGF0IG1vc3QgMiBncmFtcyBvZiBzYXR1cmF0ZWQgZmF0IGluIGEgc2luZ2xlIGNvb2tpZS4gQXNzdW1lIHRoZSBhY3R1YWwgbWVhbiBhbW91bnQgb2Ygc2F0dXJhdGVkIGZhdCBwZXIgY29va2llIGlzIDIuMDc1IGdyYW1zIGFuZCB0aGUgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAwLjI1IGdyYW1zLiBBdCAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCB3aGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBoYXZpbmcgYSB0eXBlIElJIGVycm9yIGZvciBhIHNhbXBsZSBzaXplIG9mIDM1IGNvb2tpZXM/DQoNCiMjIyBTdGFuZGFyZCBFcnJvciBvZiB0aGUgTWVhbiANCg0KV2UgYmVnaW4gd2l0aCBjb21wdXRpbmcgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiwgc2VtLg0KDQpgYGB7cn0NCm4gPSAzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBzaXplIA0KcyA9IDAuMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiANCnNlbSA9IHMvc3FydChuKTsgc2VtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0YW5kYXJkIGVycm9yIA0KYGBgDQpOZXh0IGNvbXB1dGUgdGhlIGxvd2VyIGJvdW5kIG9mIHNhbXBsZSBtZWFucyBmb3Igd2hpY2ggdGhlIG51bGwgaHlwb3RoZXNpcyAkXG11IFxsZXEgMiQgd291bGQgbm90IGJlIHJlamVjdGVkLg0KDQojIyMgU2FtcGxlIE1lYW4NCg0KYGBge3J9DQphbHBoYSA9IC4wNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2lnbmlmaWNhbmNlIGxldmVsIA0KbXUwID0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGh5cG90aGV0aWNhbCBsb3dlciBib3VuZCANCnEgPSBxbm9ybShhbHBoYSwgbWVhbj1tdTAsIHNkPXNlbSk7IHEgDQpgYGANCg0KVGhlcmVmb3JlLCBzbyBsb25nIGFzIHRoZSBzYW1wbGUgbWVhbiBpcyBncmVhdGVyIHRoYW4gMS45MyBpbiBhIGh5cG90aGVzaXMgdGVzdCwgdGhlIG51bGwgaHlwb3RoZXNpcyB3aWxsIG5vdCBiZSByZWplY3RlZC4gU2luY2Ugd2UgYXNzdW1lIHRoYXQgdGhlIGFjdHVhbCBwb3B1bGF0aW9uIG1lYW4gaXMgMi4wNzUsIHdlIGNhbiBjb21wdXRlIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgc2FtcGxlIG1lYW4gYWJvdmUgMS45MywgYW5kIHRodXMgZm91bmQgdGhlIHByb2JhYmlsaXR5IG9mIHR5cGUgSUkgZXJyb3IuDQoNCiMjIyBQcm9iYWJpbGl0eSBvZiBFcnJvcg0KDQpgYGB7cn0NCm11ID0gMi4wNzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhc3N1bWVkIGFjdHVhbCBtZWFuIA0KcG5vcm0ocSwgbWVhbj1tdSwgc2Q9c2VtLCBsb3dlci50YWlsPUZBTFNFKSANCmBgYA0KSWYgdGhlIEdhcnVkYSBGb29kIEluZG9uZXNpYSBzYW1wbGUgc2l6ZSBpcyAzNSwgdGhlIGFjdHVhbCBtZWFuIGFtb3VudCBvZiBzYXR1cmF0ZWQgZmF0IHBlciBjb29raWUgaXMgMi4wNzUgZ3JhbXMgYW5kIHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIDAuMjUgZ3JhbXMsIHRoZW4gdGhlIHByb2JhYmlsaXR5IG9mIHR5cGUgSUkgZXJyb3IgZm9yIHRlc3RpbmcgdGhlIG51bGwgaHlwb3RoZXNpcyAkXG11IFxsZXEgMiQgYXQgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCBpcyA5OSUsIGFuZCB0aGUgcG93ZXIgb2YgdGhlIGh5cG90aGVzaXMgdGVzdCBpcyAxJS4NCg0KIyBUeXBlIElJIH4gVHdvIFRhaWwgDQogDQogSW4gYSB0d28tdGFpbGVkIHRlc3Qgb2YgdGhlIHBvcHVsYXRpb24gbWVhbiwgdGhlIG51bGwgaHlwb3RoZXNpcyBjbGFpbXMgdGhhdCB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4gJFxtdSQgaXMgZXF1YWwgdG8gYSBnaXZlbiBoeXBvdGhldGljYWwgdmFsdWUgJFxtdV8wJC4NCg0KXFtcbXVfMCA9IFxtdVxdDQoNCkEgdHlwZSBJSSBlcnJvciBvY2N1cnMgaWYgdGhlIGh5cG90aGVzaXMgdGVzdCBiYXNlZCBvbiBhIHJhbmRvbSBzYW1wbGUgZmFpbHMgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgZXZlbiB3aGVuIHRoZSB0cnVlIHBvcHVsYXRpb24gbWVhbiAkXG11JCBpcyBpbiBmYWN0IGRpZmZlcmVudCBmcm9tICRcbXVfMCQuDQoNCkFzc3VtZSB0aGF0IHRoZSBwb3B1bGF0aW9uIGhhcyBhIGtub3duIHN0YW5kYXJkIGRldmlhdGlvbiAkXHNpZ21hJC4gQnkgdGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSwgdGhlIHBvcHVsYXRpb24gb2YgYWxsIHBvc3NpYmxlIG1lYW5zIG9mIHNhbXBsZXMgb2Ygc3VmZmljaWVudGx5IGxhcmdlIHNpemUgbiBhcHByb3hpbWF0ZWx5IGZvbGxvd3MgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uIEhlbmNlIHdlIGNhbiBjb21wdXRlIHRoZSByYW5nZSBvZiBzYW1wbGUgbWVhbnMgZm9yIHdoaWNoIHRoZSBudWxsIGh5cG90aGVzaXMgd2lsbCBub3QgYmUgcmVqZWN0ZWQsIGFuZCB0aGVuIG9idGFpbiBhbiBlc3RpbWF0ZSBvZiB0aGUgcHJvYmFiaWxpdHkgb2YgdHlwZSBJSSBlcnJvci4NCg0KIyMgRXhhbXBsZSA2DQoNClNvbWUgam91cm5hbHMgY29uY2x1ZGVkIHRoYXQgdGhlIGF2ZXJhZ2Ugd2VpZ2h0IG9mIEhhY2hpa28gRG9ncyBhcm91bmQgdGhlIHdvcmxkIGxhc3QgdGVuIHllYXJzIHdhcyAxNS40IGtnLiBSZXNlYXJjaGVycyB3YW50IHRvIG1ha2Ugc3VyZSBpZiB0aGVyZSBhIGNoYW5nZSBpbiB0aGUgYXZlcmFnZSB3ZWlnaHQgb2YgdGhlc2UgdmFyaWV0aWVzIGFmdGVyIHRlbiB5ZWFycy4gQXNzdW1lIHRoZSBhY3R1YWwgbWVhbiBwb3B1bGF0aW9uIHdlaWdodCBpcyAxNS4xIGtnLCBhbmQgdGhlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uIGlzIDIuNSBrZy4gQXQgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCwgd2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgaGF2aW5nIHR5cGUgSUkgZXJyb3IgZm9yIGEgc2FtcGxlIHNpemUgb2YgMzUgSGFjaGlrbyBEb2dzPw0KDQojIyMgU3RhbmRhcmQgRXJyb3Igb2YgdGhlIE1lYW4gDQoNCldlIGJlZ2luIHdpdGggY29tcHV0aW5nIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4sIHNlbS4NCg0KYGBge3J9DQpuID0gMzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBzaXplIA0Kc2lnbWEgPSAyLjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiANCnNlbSA9IHNpZ21hL3NxcnQobik7IHNlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RhbmRhcmQgZXJyb3IgDQpgYGANCg0KTmV4dCBjb21wdXRlIHRoZSBsZWZ0IGFuZCByaWdodCBib3VuZHMgb2Ygc2FtcGxlIG1lYW5zIGZvciB3aGljaCB0aGUgbnVsbCBoeXBvdGhlc2lzICRcbXUgPSAxNS40JCB3b3VsZCBub3QgYmUgcmVqZWN0ZWQuDQoNCiMjIyBTYW1wbGUgTWVhbg0KDQpgYGB7cn0NCmFscGhhID0gLjA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2lnbmlmaWNhbmNlIGxldmVsIA0KbXUwID0gMTUuNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBoeXBvdGhldGljYWwgbWVhbiANCkkgPSBjKGFscGhhLzIsIDEtYWxwaGEvMikgDQpxID0gcW5vcm0oSSwgbWVhbj1tdTAsIHNkPXNlbSk7IHEgDQpgYGANCg0KVGhlcmVmb3JlLCBzbyBsb25nIGFzIHRoZSBzYW1wbGUgbWVhbiBpcyBiZXR3ZWVuIDE0LjU3MiBhbmQgMTYuMjI4IGluIGEgaHlwb3RoZXNpcyB0ZXN0LCB0aGUgbnVsbCBoeXBvdGhlc2lzIHdpbGwgbm90IGJlIHJlamVjdGVkLiBTaW5jZSB3ZSBhc3N1bWUgdGhhdCB0aGUgYWN0dWFsIHBvcHVsYXRpb24gbWVhbiBpcyAxNS4xLCB3ZSBjYW4gY29tcHV0ZSB0aGUgbG93ZXIgdGFpbCBwcm9iYWJpbGl0aWVzIG9mIGJvdGggZW5kIHBvaW50cy4NCg0KIyMjIFByb2JhYmlsaXR5IG9mIEVycm9yDQoNCmBgYHtyfQ0KbXUgPSAxNS4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhc3N1bWVkIGFjdHVhbCBtZWFuIA0KcCA9IHBub3JtKHEsIG1lYW49bXUsIHNkPXNlbSk7IHAgDQpkaWZmKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBbMl0tcFsxXSANCmBgYA0KDQpGaW5hbGx5LCB0aGUgcHJvYmFiaWxpdHkgb2YgdHlwZSBJSSBlcnJvciBpcyB0aGUgcHJvYmFiaWxpdHkgYmV0d2VlbiB0aGUgdHdvIGVuZCBwb2ludHMuIElmIHRoZSBzYW1wbGUgc2l6ZSBvZiBIYWNoaWtvIERvZ3MgaXMgMzUsIHRoZSBhY3R1YWwgbWVhbiBwb3B1bGF0aW9uIHdlaWdodCBpcyAxNS4xIGtnIGFuZCB0aGUgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gaXMgMi41IGtnLCB0aGVuIHRoZSBwcm9iYWJpbGl0eSBvZiB0eXBlIElJIGVycm9yIGZvciB0ZXN0aW5nIHRoZSBudWxsIGh5cG90aGVzaXMgJFxtdSA9IDE1LjQkIGF0IC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwgaXMgODkuMSUsIGFuZCB0aGUgcG93ZXIgb2YgdGhlIGh5cG90aGVzaXMgdGVzdCBpcyAxMC45JS4NCg0KIyMgRXhlcmNpc2UgNg0KDQpVbmRlciBzYW1lIGFzc3VtcHRpb25zIGFzIEV4YW1wbGUgNiwgaWYgYWN0dWFsIG1lYW4gcG9wdWxhdGlvbiB3ZWlnaHQgaXMgMTQuOSBrZywgd2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgdHlwZSBJSSBlcnJvcnM/IFdoYXQgaXMgdGhlIHBvd2VyIG9mIHRoZSBoeXBvdGhlc2lzIHRlc3Q/DQoNCiMjIyBTdGFuZGFyZCBFcnJvciBvZiB0aGUgTWVhbiANCg0KV2UgYmVnaW4gd2l0aCBjb21wdXRpbmcgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiwgc2VtLg0KDQpgYGB7cn0NCm4gPSAzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2FtcGxlIHNpemUgDQpzaWdtYSA9IDIuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uIA0Kc2VtID0gc2lnbWEvc3FydChuKTsgc2VtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdGFuZGFyZCBlcnJvciANCmBgYA0KDQpOZXh0IGNvbXB1dGUgdGhlIGxlZnQgYW5kIHJpZ2h0IGJvdW5kcyBvZiBzYW1wbGUgbWVhbnMgZm9yIHdoaWNoIHRoZSBudWxsIGh5cG90aGVzaXMgJFxtdSA9IDE1LjQkIHdvdWxkIG5vdCBiZSByZWplY3RlZC4NCg0KIyMjIFNhbXBsZSBNZWFuDQoNCmBgYHtyfQ0KYWxwaGEgPSAuMDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzaWduaWZpY2FuY2UgbGV2ZWwgDQptdTAgPSAxNS40ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGh5cG90aGV0aWNhbCBtZWFuIA0KSSA9IGMoYWxwaGEvMiwgMS1hbHBoYS8yKSANCnEgPSBxbm9ybShJLCBtZWFuPW11MCwgc2Q9c2VtKTsgcSANCmBgYA0KDQpUaGVyZWZvcmUsIHNvIGxvbmcgYXMgdGhlIHNhbXBsZSBtZWFuIGlzIGJldHdlZW4gMTQuNTcyIGFuZCAxNi4yMjggaW4gYSBoeXBvdGhlc2lzIHRlc3QsIHRoZSBudWxsIGh5cG90aGVzaXMgd2lsbCBub3QgYmUgcmVqZWN0ZWQuIFNpbmNlIHdlIGFzc3VtZSB0aGF0IHRoZSBhY3R1YWwgcG9wdWxhdGlvbiBtZWFuIGlzIDE0LjksIHdlIGNhbiBjb21wdXRlIHRoZSBsb3dlciB0YWlsIHByb2JhYmlsaXRpZXMgb2YgYm90aCBlbmQgcG9pbnRzLg0KDQojIyMgUHJvYmFiaWxpdHkgb2YgRXJyb3INCg0KYGBge3J9DQptdSA9IDE0LjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFzc3VtZWQgYWN0dWFsIG1lYW4gDQpwID0gcG5vcm0ocSwgbWVhbj1tdSwgc2Q9c2VtKTsgcCANCmRpZmYocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcFsyXS1wWzFdIA0KYGBgDQoNCkZpbmFsbHksIHRoZSBwcm9iYWJpbGl0eSBvZiB0eXBlIElJIGVycm9yIGlzIHRoZSBwcm9iYWJpbGl0eSBiZXR3ZWVuIHRoZSB0d28gZW5kIHBvaW50cy4gSWYgdGhlIHNhbXBsZSBzaXplIG9mIEhhY2hpa28gRG9ncyBpcyAzNSwgdGhlIGFjdHVhbCBtZWFuIHBvcHVsYXRpb24gd2VpZ2h0IGlzIDE0Ljkga2cgYW5kIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAyLjUga2csIHRoZW4gdGhlIHByb2JhYmlsaXR5IG9mIHR5cGUgSUkgZXJyb3IgZm9yIHRlc3RpbmcgdGhlIG51bGwgaHlwb3RoZXNpcyAkXG11ID0gMTUuNCQgYXQgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCBpcyA3OCUsIGFuZCB0aGUgcG93ZXIgb2YgdGhlIGh5cG90aGVzaXMgdGVzdCBpcyAyMiUuDQoNCiANCiMgTWluZCBNYXAgKEh5cG90aGVzaXMpDQogDQpgYGB7ciwgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsZmlnLmNhcD0iTWluZCBNYXAgSHlwb3RoZXNpcyBUZXN0aW5nIiwgb3V0LndpZHRoID0gJzEwMCUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIk1pbmQtTWFwLUh5cG90aGVzaXMtVGVzdGluZy5wbmciKQ0KYGBgDQoNCg==