Confidence Interval

Study Cases ~ week 13

Foto Mahasiswa

Adinda Adelia Futri

Institut Teknologi Sains Bandung (ITSB)

Program Studi Data Science


1 📘 Case Study 1

1.1 Confidence Interval for Mean (σ Diketahui)


1.2 1️⃣ Soal

Sebuah platform e-commerce ingin mengestimasi rata-rata jumlah transaksi harian per pengguna setelah peluncuran fitur baru. Berdasarkan data historis skala besar, standar deviasi populasi diketahui.

Diketahui:

  • σ = 3.2
  • n = 100
  • x̄ = 12.6

Tentukan interval kepercayaan rata-rata populasi pada tingkat kepercayaan:

  • 90%
  • 95%
  • 99%

1.3 2️⃣ Menentukan Distribusi yang Digunakan

Karena:

  1. Standar deviasi populasi (σ) diketahui
  2. Ukuran sampel besar (n ≥ 30)
  3. Estimasi yang dicari adalah rata-rata populasi

Maka digunakan Distribusi Normal (Z).


1.4 3️⃣ Perhitungan Manual (Seperti Coretan di Buku)

1.4.1 Rumus Interval Kepercayaan

\[ CI = \bar{x} \pm Z_{\alpha/2} \times \frac{\sigma}{\sqrt{n}} \]


1.4.2 ✏️ Step 1 – Hitung Standard Error (SE)

Diketahui:

\[ \sigma = 3.2, \quad n = 100 \]

\[ SE = \frac{\sigma}{\sqrt{n}} \]

\[ SE = \frac{3.2}{\sqrt{100}} \]

\[ SE = \frac{3.2}{10} \]

\[ SE = 0.32 \]

Artinya, rata-rata sampel diperkirakan menyimpang sebesar 0.32 transaksi dari rata-rata populasi.


1.4.3 ✏️ Step 2 – Tentukan Nilai α dan α/2

Karena interval kepercayaan dua sisi, maka:

  • Untuk 90%: \[ \alpha = 1 - 0.90 = 0.10 \Rightarrow \alpha/2 = 0.05 \]

  • Untuk 95%: \[ \alpha = 1 - 0.95 = 0.05 \Rightarrow \alpha/2 = 0.025 \]

  • Untuk 99%: \[ \alpha = 1 - 0.99 = 0.01 \Rightarrow \alpha/2 = 0.005 \]


1.4.4 ✏️ Step 3 – Menentukan Nilai Z dari Tabel Distribusi Normal

Nilai Z dicari dari tabel distribusi normal standar berdasarkan probabilitas:

\[ Z = Z_{(1 - \alpha/2)} \]

Hasil pembacaan tabel: - 90% → \(Z = 1.645\) - 95% → \(Z = 1.960\) - 99% → \(Z = 2.576\)


1.5 4️⃣ Tabel Distribusi Normal

Logo

Gambar: Tabel Distribusi Normal Standar (Z-Table)<br>
Digunakan untuk menentukan nilai kritis Z pada interval kepercayaan dua sisi

1.5.1 ✏️ Step 4 – Hitung Margin of Error (ME)

Rumus:

\[ ME = Z \times SE \]

Perhitungan:

  • 90%: \[ ME = 1.645 \times 0.32 = 0.526 \]

  • 95%: \[ ME = 1.960 \times 0.32 = 0.627 \]

  • 99%: \[ ME = 2.576 \times 0.32 = 0.824 \]


1.5.2 ✏️ Step 5 – Hitung Confidence Interval

Rumus:

\[ CI = \bar{x} \pm ME \]

Substitusi nilai:

  • 90%: \[ CI = 12.6 \pm 0.526 \]

  • 95%: \[ CI = 12.6 \pm 0.627 \]

  • 99%: \[ CI = 12.6 \pm 0.824 \]


1.6 5️⃣ Perhitungan Menggunakan R (Verifikasi)

# Diketahui
x_bar <- 12.6
sigma <- 3.2
n <- 100

# Step 1: Standard Error
SE <- sigma / sqrt(n)

# Step 2: Confidence Levels
conf_level <- c(0.90, 0.95, 0.99)

# Step 3: Nilai Z
z_value <- qnorm((1 + conf_level) / 2)

# Step 4: Margin of Error
ME <- z_value * SE

# Step 5: Confidence Interval
lower <- x_bar - ME
upper <- x_bar + ME

# Tabel hasil
CI_result <- data.frame(
  Confidence_Level = c("90%", "95%", "99%"),
  Z_Score = round(z_value, 3),
  Margin_of_Error = round(ME, 3),
  Lower_Bound = round(lower, 3),
  Upper_Bound = round(upper, 3)
)

CI_result

1.7 Confidence Interval Density Plot

1.8

1.9 6️⃣ Interpretasi

Interpretasi Statistik:
Dengan tingkat kepercayaan 95%, rata-rata jumlah transaksi harian per pengguna berada pada interval 11.973 sampai 13.227 transaksi.

Interpretasi Bisnis:
Hal ini menunjukkan bahwa fitur baru menghasilkan rata-rata sekitar 12–13 transaksi per pengguna per hari. Interval yang relatif sempit menandakan estimasi yang stabil dan dapat digunakan sebagai dasar evaluasi performa fitur oleh manajemen.

2 📘 Case Study 2

2.1 Confidence Interval for Mean (σ Tidak Diketahui)


2.2 1️⃣ Soal

Tim UX Research ingin mengestimasi rata-rata waktu penyelesaian tugas (menit) pada aplikasi mobile baru. Data diperoleh dari 12 pengguna berikut:

8.4, 7.9, 9.1, 8.7, 8.2, 9.0, 7.8, 8.5, 8.9, 8.1, 8.6, 8.3

Karena standar deviasi populasi tidak diketahui dan jumlah sampel kecil, diperlukan interval kepercayaan untuk mengestimasi rata-rata populasi.


2.3 2️⃣ Metode yang Digunakan

Metode yang digunakan adalah Confidence Interval Mean dengan Distribusi t.

Alasan (langsung dari kondisi soal):

  • Sampel kecil (n = 12)
  • Standar deviasi populasi tidak diketahui
  • Tujuan analisis adalah estimasi rata-rata populasi

2.4 3️⃣ Perhitungan Step-by-Step (Perhitungan Nyata dari Soal)

Data waktu penyelesaian tugas (menit):

8.4, 7.9, 9.1, 8.7, 8.2, 9.0, 7.8, 8.5, 8.9, 8.1, 8.6, 8.3


2.4.1 ✏️ Step 1 – Menentukan Ukuran Sampel dan Derajat Kebebasan

Jumlah data pengguna:

\[ n = 12 \]

Karena standar deviasi populasi tidak diketahui, maka digunakan distribusi t dengan derajat kebebasan:

\[ df = n - 1 = 12 - 1 = 11 \]


2.4.2 ✏️ Step 2 – Menghitung Rata-rata Sampel (\(\bar{x}\))

Rumus rata-rata sampel:

\[ \bar{x} = \frac{\sum x_i}{n} \]

Substitusi nilai dari soal:

\[ \bar{x} = \frac{ 8.4 + 7.9 + 9.1 + 8.7 + 8.2 + 9.0 + 7.8 + 8.5 + 8.9 + 8.1 + 8.6 + 8.3 }{12} \]

\[ \bar{x} = \frac{101.5}{12} = 8.458 \]

Artinya, rata-rata waktu penyelesaian tugas dari 12 pengguna adalah 8.458 menit.


2.4.3 ✏️ Step 3 – Menghitung Standar Deviasi Sampel (s)

Rumus standar deviasi sampel:

\[ s = \sqrt{ \frac{\sum (x_i - \bar{x})^2}{n - 1} } \]

Perhitungan ini mengukur seberapa besar variasi waktu penyelesaian antar pengguna.

Hasil perhitungan dari data:

\[ s = 0.406 \]

Nilai ini menunjukkan bahwa waktu penyelesaian pengguna cukup konsisten, tetapi tetap memiliki variasi.


2.4.4 ✏️ Step 4 – Menghitung Standard Error (SE)

Standard Error menunjukkan ketelitian rata-rata sampel dalam mengestimasi rata-rata populasi.

Rumus:

\[ SE = \frac{s}{\sqrt{n}} \]

Substitusi nilai:

\[ SE = \frac{0.406}{\sqrt{12}} \]

\[ SE = \frac{0.406}{3.464} = 0.117 \]


2.4.5 ✏️ Step 5 – Menentukan Nilai t dari Tabel Distribusi t

Dengan: - derajat kebebasan \(df = 11\)

Nilai t dari tabel distribusi t adalah:

  • 90% → \(t = 1.796\)
  • 95% → \(t = 2.201\)
  • 99% → \(t = 3.106\)

Logo

Gambar: Tabel Distribusi t (Student’s t-Distribution)<br>
Digunakan untuk menentukan nilai kritis t berdasarkan derajat kebebasan (df = 11)

2.4.6 ✏️ Step 6 – Menghitung Margin of Error (ME)

Rumus Margin of Error:

\[ ME = t \times SE \]

2.4.6.1 🔹 Confidence Level 90%

\[ ME_{90} = 1.796 \times 0.117 = 0.210 \]

2.4.6.2 🔹 Confidence Level 95%

\[ ME_{95} = 2.201 \times 0.117 = 0.258 \]

2.4.6.3 🔹 Confidence Level 99%

\[ ME_{99} = 3.106 \times 0.117 = 0.363 \]


2.4.7 ✏️ Step 7 – Membentuk Confidence Interval

Rumus interval kepercayaan:

\[ CI = \bar{x} \pm ME \]

2.4.7.1 🔹 CI 90%

\[ CI_{90} = 8.458 \pm 0.210 \]

\[ CI_{90} = (8.248,\; 8.668) \]

2.4.7.2 🔹 CI 95%

\[ CI_{95} = 8.458 \pm 0.258 \]

\[ CI_{95} = (8.200,\; 8.716) \]

2.4.7.3 🔹 CI 99%

\[ CI_{99} = 8.458 \pm 0.363 \]

\[ CI_{99} = (8.095,\; 8.821) \]

Rentang ini merepresentasikan estimasi rata-rata waktu penyelesaian tugas seluruh pengguna aplikasi, bukan hanya 12 responden.


2.5 5️⃣ Perhitungan, Tabel Hasil, dan Visualisasi Menggunakan R

# Data waktu penyelesaian tugas (menit)
data <- c(8.4,7.9,9.1,8.7,8.2,9.0,7.8,8.5,8.9,8.1,8.6,8.3)

# Ukuran sampel
n <- length(data)

# Rata-rata dan standar deviasi sampel
x_bar <- mean(data)
s <- sd(data)

# Standard Error
SE <- s / sqrt(n)

# Confidence Levels
conf_level <- c(0.90, 0.95, 0.99)

# Nilai t
t_value <- qt((1 + conf_level) / 2, df = n - 1)

# Margin of Error
ME <- t_value * SE

# Confidence Interval
lower <- x_bar - ME
upper <- x_bar + ME

# Tabel hasil
CI_result <- data.frame(
  Confidence_Level = c("90%", "95%", "99%"),
  t_value = round(t_value, 3),
  Margin_of_Error = round(ME, 3),
  Lower_Bound = round(lower, 3),
  Upper_Bound = round(upper, 3)
)

CI_result

2.5.1 📊 Visualisasi Confidence Interval

plot(NULL,
     xlim = c(min(lower) - 0.2, max(upper) + 0.2),
     ylim = c(1, 3),
     xlab = "Task Completion Time (minutes)",
     ylab = "",
     yaxt = "n",
     main = "Confidence Interval of Task Completion Time")

segments(lower, 1:3, upper, 1:3, lwd = 3)
points(rep(x_bar, 3), 1:3, pch = 19)
axis(2, at = 1:3, labels = CI_result$Confidence_Level)


2.6 6️⃣ Interpretasi Akhir

Insight Statistik Interval kepercayaan melebar seiring meningkatnya tingkat kepercayaan, menunjukkan adanya trade-off antara keyakinan statistik dan presisi estimasi.

Implikasi UX & Bisnis Hasil ini mengindikasikan bahwa pengguna menyelesaikan tugas rata-rata dalam waktu sekitar 8–9 menit secara konsisten. Namun, karena jumlah responden masih terbatas, penambahan partisipan UX testing sangat disarankan untuk memperoleh estimasi yang lebih presisi sebelum pengambilan keputusan desain final.

3 📘 Case Study 3

3.1 Confidence Interval for a Proportion (A/B Testing)


3.2 1️⃣ Soal

Tim Data Science melakukan A/B Testing pada desain tombol Call-To-Action (CTA) baru.
Hasil eksperimen menunjukkan:

  • Total pengguna yang melihat CTA:
    \[ n = 400 \]

  • Jumlah pengguna yang mengklik CTA:
    \[ x = 156 \]

Tujuan analisis ini adalah mengestimasi proporsi pengguna yang mengklik CTA menggunakan interval kepercayaan.


3.3 2️⃣ Metode yang Digunakan

Metode yang digunakan adalah Confidence Interval untuk Proporsi (Z-Interval).

Alasan berdasarkan kondisi soal:

  • Data berupa proporsi (klik / tidak klik)
  • Ukuran sampel besar (n = 400)
  • Distribusi binomial dapat didekati dengan distribusi normal
  • Nilai \(np\) dan \(n(1-p)\) cukup besar

3.4 3️⃣ Perhitungan Step-by-Step (Perhitungan Nyata dari Soal)


3.4.1 ✏️ Step 1 – Menghitung Proporsi Sampel (\(\hat{p}\))

Proporsi sampel adalah persentase pengguna yang mengklik CTA dari seluruh pengguna.

Rumus:

\[ \hat{p} = \frac{x}{n} \]

Substitusi nilai dari soal:

\[ \hat{p} = \frac{156}{400} = 0.39 \]

Artinya, 39% pengguna dalam eksperimen mengklik CTA baru.


3.4.2 ✏️ Step 2 – Mengecek Syarat Pendekatan Normal

Syarat penggunaan Z-interval untuk proporsi:

\[ n\hat{p} \ge 10 \quad \text{dan} \quad n(1-\hat{p}) \ge 10 \]

Cek:

\[ n\hat{p} = 400 \times 0.39 = 156 \]

\[ n(1-\hat{p}) = 400 \times 0.61 = 244 \]

Karena kedua nilai ≫ 10, maka pendekatan distribusi normal valid digunakan.


3.4.3 ✏️ Step 3 – Menghitung Standard Error (SE) Proporsi

Standard Error menunjukkan seberapa besar variasi estimasi proporsi sampel terhadap proporsi populasi.

Rumus:

\[ SE = \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \]

Substitusi nilai:

\[ SE = \sqrt{\frac{0.39(1-0.39)}{400}} \]

\[ SE = \sqrt{\frac{0.2379}{400}} \]

\[ SE = \sqrt{0.00059475} = 0.0244 \]


3.4.4 ✏️ Step 4 – Menentukan Nilai Z dari Tabel Distribusi Normal

Nilai Z ditentukan oleh tingkat kepercayaan:

  • 90% → \(Z = 1.645\)
  • 95% → \(Z = 1.960\)
  • 99% → \(Z = 2.576\)

3.4.5 ✏️ Step 5 – Menghitung Margin of Error (ME)

Rumus Margin of Error:

\[ ME = Z \times SE \]

3.4.5.1 🔹 Confidence Level 90%

\[ ME_{90} = 1.645 \times 0.0244 = 0.040 \]

3.4.5.2 🔹 Confidence Level 95%

\[ ME_{95} = 1.960 \times 0.0244 = 0.048 \]

3.4.5.3 🔹 Confidence Level 99%

\[ ME_{99} = 2.576 \times 0.0244 = 0.063 \]


3.4.6 ✏️ Step 6 – Membentuk Confidence Interval Proporsi

Rumus interval kepercayaan:

\[ CI = \hat{p} \pm ME \]

3.4.6.1 🔹 CI 90%

\[ CI_{90} = 0.39 \pm 0.040 \]

\[ CI_{90} = (0.350,\; 0.430) \]

3.4.6.2 🔹 CI 95%

\[ CI_{95} = 0.39 \pm 0.048 \]

\[ CI_{95} = (0.342,\; 0.438) \]

3.4.6.3 🔹 CI 99%

\[ CI_{99} = 0.39 \pm 0.063 \]

\[ CI_{99} = (0.327,\; 0.453) \]

Rentang ini menunjukkan estimasi proporsi sebenarnya pengguna yang mengklik CTA di seluruh populasi pengguna.


3.5 4️⃣ Perhitungan, Tabel Hasil, dan Visualisasi Menggunakan R

# Data A/B Testing
n <- 400
x <- 156

# Sample proportion
p_hat <- x / n

# Standard Error
SE <- sqrt((p_hat * (1 - p_hat)) / n)

# Confidence Levels
conf_level <- c(0.90, 0.95, 0.99)

# Z values
z_value <- qnorm((1 + conf_level) / 2)

# Margin of Error
ME <- z_value * SE

# Confidence Intervals
lower <- p_hat - ME
upper <- p_hat + ME

# Tabel hasil
CI_result <- data.frame(
  Confidence_Level = c("90%", "95%", "99%"),
  Z_value = round(z_value, 3),
  Margin_of_Error = round(ME, 3),
  Lower_Bound = round(lower, 3),
  Upper_Bound = round(upper, 3)
)

CI_result

3.5.1 Visualisasi Confidence Interval Proporsi

plot(NULL,
     xlim = c(min(lower) - 0.05, max(upper) + 0.05),
     ylim = c(1, 3),
     xlab = "Proportion of CTA Clicks",
     ylab = "",
     yaxt = "n",
     main = "Confidence Interval for CTA Click-Through Rate")

segments(lower, 1:3, upper, 1:3, lwd = 3)
points(rep(p_hat, 3), 1:3, pch = 19)
axis(2, at = 1:3, labels = CI_result$Confidence_Level)


3.6 5️⃣ Interpretasi dalam Konteks Produk & Bisnis

Semakin tinggi tingkat kepercayaan, semakin lebar interval kepercayaan yang dihasilkan. Hal ini mencerminkan peningkatan tingkat kehati-hatian dalam mengestimasi performa sebenarnya dari suatu eksperimen.

Dalam konteks eksperimen produk:

  • 90% CI → interval lebih sempit, cocok untuk keputusan cepat
  • 95% CI → memberikan keseimbangan antara risiko dan kepastian, umum digunakan untuk keputusan rollout
  • 99% CI → sangat konservatif, tetapi risiko salah keputusan lebih kecil

Jika interval seluruhnya berada di atas baseline CTR lama, maka CTA baru dapat dianggap memberikan peningkatan performa yang signifikan dan layak di-roll out ke seluruh pengguna.

4 📘 Case Study 4

4.1 Precision Comparison: Z-Test vs t-Test (API Latency)


4.2 1️⃣ Soal

Dua tim data mengukur API latency (ms) pada kondisi berbeda.

4.2.1 🔹 Team A

  • Ukuran sampel:
    \[ n = 36 \]
  • Rata-rata sampel:
    \[ \bar{x} = 210 \]
  • Standar deviasi populasi diketahui:
    \[ \sigma = 24 \]

4.2.2 🔹 Team B

  • Ukuran sampel:
    \[ n = 36 \]
  • Rata-rata sampel:
    \[ \bar{x} = 210 \]
  • Standar deviasi populasi tidak diketahui, hanya tersedia standar deviasi sampel:
    \[ s = 24 \]

Tujuan analisis adalah membandingkan presisi interval kepercayaan yang dihasilkan oleh kedua pendekatan.


4.3 2️⃣ Metode Statistik yang Digunakan

4.3.1 ✅ Team A → Z-Interval

Digunakan karena:

  • Standar deviasi populasi (\(\sigma\)) diketahui
  • Ukuran sampel cukup besar

4.3.2 ✅ Team B → t-Interval

Digunakan karena:

  • Standar deviasi populasi tidak diketahui
  • Variabilitas diestimasi dari sampel (\(s\))

4.4 3️⃣ Perhitungan Step-by-Step (Perhitungan Nyata dari Soal)


4.4.1 ✏️ Step 1 – Menentukan Standard Error (SE)

4.4.1.1 🔹 Team A (Z-Test)

Rumus:

\[ SE_A = \frac{\sigma}{\sqrt{n}} \]

Substitusi nilai:

\[ SE_A = \frac{24}{\sqrt{36}} = \frac{24}{6} = 4 \]


4.4.1.2 🔹 Team B (t-Test)

Rumus:

\[ SE_B = \frac{s}{\sqrt{n}} \]

Substitusi nilai:

\[ SE_B = \frac{24}{\sqrt{36}} = \frac{24}{6} = 4 \]

➡️ Nilai SE sama, karena \(s = \sigma\) dan \(n\) sama.


4.4.2 ✏️ Step 2 – Menentukan Nilai Kritis (Z dan t)

4.4.2.1 🔹 Nilai Z (Distribusi Normal)

  • 90% → \(Z = 1.645\)
  • 95% → \(Z = 1.960\)
  • 99% → \(Z = 2.576\)

Logo


4.4.2.2 🔹 Nilai t (Distribusi t)

Derajat kebebasan:

\[ df = n - 1 = 35 \]

  • 90% → \(t = 1.690\)
  • 95% → \(t = 2.030\)
  • 99% → \(t = 2.724\)

Logo


4.4.3 ✏️ Step 3 – Menghitung Margin of Error (ME)

Rumus umum:

\[ ME = \text{nilai kritis} \times SE \]


4.4.3.1 🔹 Team A (Z-Interval)

  • 90%
    \[ ME_{90} = 1.645 \times 4 = 6.58 \]

  • 95%
    \[ ME_{95} = 1.960 \times 4 = 7.84 \]

  • 99%
    \[ ME_{99} = 2.576 \times 4 = 10.30 \]


4.4.3.2 🔹 Team B (t-Interval)

  • 90%
    \[ ME_{90} = 1.690 \times 4 = 6.76 \]

  • 95%
    \[ ME_{95} = 2.030 \times 4 = 8.12 \]

  • 99%
    \[ ME_{99} = 2.724 \times 4 = 10.90 \]


4.4.4 ✏️ Step 4 – Membentuk Confidence Interval

Rumus:

\[ CI = \bar{x} \pm ME \]


4.4.4.1 🔹 Team A (Z-Test)

  • 90% → (203.42 , 216.58)
  • 95% → (202.16 , 217.84)
  • 99% → (199.70 , 220.30)

4.4.4.2 🔹 Team B (t-Test)

  • 90% → (203.24 , 216.76)
  • 95% → (201.88 , 218.12)
  • 99% → (199.10 , 220.90)

4.5 4️⃣ Perhitungan, Tabel Hasil, dan Visualisasi Menggunakan R

# Parameter
n <- 36
x_bar <- 210
sigma <- 24
s <- 24

# Standard Error
SE <- sigma / sqrt(n)

# Confidence Levels
conf_level <- c(0.90, 0.95, 0.99)

# Z and t values
z_value <- qnorm((1 + conf_level) / 2)
t_value <- qt((1 + conf_level) / 2, df = n - 1)

# Margin of Error
ME_z <- z_value * SE
ME_t <- t_value * SE

# Confidence Intervals
lower_z <- x_bar - ME_z
upper_z <- x_bar + ME_z

lower_t <- x_bar - ME_t
upper_t <- x_bar + ME_t

# Tabel hasil
CI_result <- data.frame(
  Test = rep(c("Z-Test", "t-Test"), each = 3),
  Confidence_Level = rep(c("90%", "95%", "99%"), 2),
  Lower_Bound = round(c(lower_z, lower_t), 2),
  Upper_Bound = round(c(upper_z, upper_t), 2)
)

CI_result

4.5.1 Visualisasi Perbandingan Interval

plot(NULL,
     xlim = c(min(lower_t) - 2, max(upper_t) + 2),
     ylim = c(1, 6),
     xlab = "API Latency (ms)",
     ylab = "",
     yaxt = "n",
     main = "Comparison of Z-Test and t-Test Confidence Intervals")

segments(lower_z, 1:3, upper_z, 1:3, lwd = 3)
segments(lower_t, 4:6, upper_t, 4:6, lwd = 3)

points(rep(x_bar, 6), 1:6, pch = 19)

axis(2,
     at = 1:6,
     labels = c("Z 90%", "Z 95%", "Z 99%",
                "t 90%", "t 95%", "t 99%"))


4.6 5️⃣ Interpretasi Akhir

Walaupun kedua tim menggunakan data yang sangat mirip, interval kepercayaan dari t-test selalu lebih lebar dibandingkan Z-test.

Hal ini terjadi karena:

  • Distribusi t memperhitungkan ketidakpastian tambahan akibat estimasi standar deviasi dari sampel
  • Nilai kritis t lebih besar daripada Z, terutama pada confidence level tinggi

Dalam praktik analitik:

  • Z-test memberikan interval lebih sempit (lebih presisi) jika \(\sigma\) diketahui
  • t-test lebih konservatif dan lebih aman saat \(\sigma\) tidak diketahui

5 📘 Case Study 5

5.1 One-Sided Confidence Interval (Lower Bound) – Premium Feature Usage


5.2 1️⃣ Soal

Sebuah perusahaan SaaS ingin memastikan bahwa minimal 70% pengguna aktif mingguan menggunakan fitur premium.

Dari hasil eksperimen diperoleh:

  • Total pengguna:
    \[ n = 250 \]
  • Pengguna aktif premium:
    \[ x = 185 \]

Manajemen hanya tertarik pada batas bawah estimasi proporsi.


5.3 2️⃣ Jenis Confidence Interval dan Metode

Metode yang digunakan adalah One-Sided (Lower) Confidence Interval untuk Proporsi
menggunakan pendekatan distribusi normal (Z-interval).

Alasan sesuai soal:

  • Data berbentuk proporsi (pakai / tidak pakai)
  • Ukuran sampel besar
  • Fokus keputusan hanya pada batas bawah, bukan dua sisi

5.4 3️⃣ Perhitungan Step-by-Step (Perhitungan Nyata dari Soal)


5.4.1 ✏️ Step 1 – Menghitung Proporsi Sampel (\(\hat{p}\))

Proporsi sampel menunjukkan persentase pengguna yang memakai fitur premium.

Rumus: \[ \hat{p} = \frac{x}{n} \]

Substitusi nilai dari soal: \[ \hat{p} = \frac{185}{250} = 0.74 \]

Artinya, 74% pengguna dalam eksperimen menggunakan fitur premium.


5.4.2 ✏️ Step 2 – Mengecek Syarat Pendekatan Normal

Syarat: \[ n\hat{p} \ge 10 \quad \text{dan} \quad n(1-\hat{p}) \ge 10 \]

Cek: \[ n\hat{p} = 250 \times 0.74 = 185 \] \[ n(1-\hat{p}) = 250 \times 0.26 = 65 \]

Karena kedua nilai jauh di atas 10, pendekatan normal valid digunakan.


5.4.3 ✏️ Step 3 – Menghitung Standard Error (SE)

Rumus: \[ SE = \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \]

Substitusi: \[ SE = \sqrt{\frac{0.74(1-0.74)}{250}} \] \[ SE = \sqrt{\frac{0.1924}{250}} \] \[ SE = \sqrt{0.0007696} = 0.0277 \]


5.4.4 ✏️ Step 4 – Menentukan Nilai Z (One-Sided)

Karena interval satu sisi (lower bound), nilai Z adalah:

  • 90% → \(Z = 1.282\)
  • 95% → \(Z = 1.645\)
  • 99% → \(Z = 2.330\)

5.4.5 ✏️ Step 5 – Menghitung Lower Bound Confidence Interval

Rumus one-sided lower CI: \[ CI_{lower} = \hat{p} - Z \times SE \]


5.4.5.1 🔹 Lower CI 90%

\[ CI_{90} = 0.74 - (1.282 \times 0.0277) \] \[ CI_{90} = 0.74 - 0.0355 = 0.7045 \]


5.4.5.2 🔹 Lower CI 95%

\[ CI_{95} = 0.74 - (1.645 \times 0.0277) \] \[ CI_{95} = 0.74 - 0.0456 = 0.6944 \]


5.4.5.3 🔹 Lower CI 99%

\[ CI_{99} = 0.74 - (2.330 \times 0.0277) \] \[ CI_{99} = 0.74 - 0.0646 = 0.6754 \]


5.5 4️⃣ Perhitungan, Tabel Hasil, dan Visualisasi Menggunakan R

# Data SaaS
n <- 250
x <- 185

# Sample proportion
p_hat <- x / n

# Standard Error
SE <- sqrt((p_hat * (1 - p_hat)) / n)

# Confidence Levels (one-sided)
conf_level <- c(0.90, 0.95, 0.99)

# Z values for one-sided CI
z_value <- qnorm(conf_level)

# Lower Bound CI
lower_bound <- p_hat - z_value * SE

# Tabel hasil
CI_result <- data.frame(
  Confidence_Level = c("90%", "95%", "99%"),
  Z_value = round(z_value, 3),
  Lower_Bound = round(lower_bound, 3)
)

CI_result

5.5.1 Visualisasi Lower Bound Confidence Interval

plot(NULL,
     xlim = c(min(lower_bound) - 0.05, p_hat + 0.02),
     ylim = c(1, 3),
     xlab = "Proportion of Premium Users",
     ylab = "",
     yaxt = "n",
     main = "One-Sided Lower Confidence Interval")

segments(lower_bound, 1:3, p_hat, 1:3, lwd = 3)
points(rep(p_hat, 3), 1:3, pch = 19)
abline(v = 0.70, lty = 2)

axis(2, at = 1:3, labels = CI_result$Confidence_Level)


5.6 5️⃣ Keputusan Bisnis: Apakah Target 70% Tercapai?

  • 90% CI → lower bound = 0.7045
  • 95% CI → lower bound = 0.6944
  • 99% CI → lower bound = 0.6754

5.6.1 📌 Kesimpulan

  • Pada confidence level 90%, target 70% pengguna premium tercapai secara statistik
  • Pada 95% dan 99%, target belum dapat dipastikan

Semakin tinggi tingkat kepercayaan, semakin konservatif keputusan bisnis yang diambil.

LS0tDQp0aXRsZTogIkNvbmZpZGVuY2UgSW50ZXJ2YWwiICMgTWFpbiB0aXRsZSBvZiB0aGUgZG9jdW1lbnQNCnN1YnRpdGxlOiAiU3R1ZHkgQ2FzZXMgfiB3ZWVrIDEzIiAjIFN1YnRpdGxlIG9yIHRvcGljIGZvciB3ZWVrIDINCmF1dGhvcjogIkFkaW5kYSBBZGVsaWEgRnV0cmkiICAgICAgICAjIFJlcGxhY2Ugd2l0aCB5b3VyIGZ1bGwgbmFtZQ0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCIgIyBBdXRvIGRpc3BsYXlzIHRoZSBjdXJyZW50IGRhdGUNCm91dHB1dDogICAgICAgICAgICAgICAgICAgICAgICAgIyBPdXRwdXQgc2VjdGlvbiBkZWZpbmVzIHRoZSBmb3JtYXQgYW5kIGxheW91dCANCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246ICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vanViYS9ybWRmb3JtYXRzDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUgICAgICAgICMgRW1iZWRzIGFsbCByZXNvdXJjZXMgKENTUywgSlMsIGltYWdlcykgDQogICAgdGh1bWJuYWlsczogdHJ1ZSAgICAgICAgICAgICMgRGlzcGxheXMgaW1hZ2UgdGh1bWJuYWlscyBpbiB0aGUgZG9jDQogICAgbGlnaHRib3g6IHRydWUgICAgICAgICAgICAgICMgRW5hYmxlcyBjbGljayB0byBlbmxhcmdlIGltYWdlcw0KICAgIGdhbGxlcnk6IHRydWUgICAgICAgICAgICAgICAjIEdyb3VwcyBpbWFnZXMgaW50byBhbiBpbnRlcmFjdGl2ZSBnYWxsZXJ5DQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlICAgICAgICMgQXV0b21hdGljYWxseSBudW1iZXJzIGFsbCBzZWN0aW9ucw0KICAgIGxpYl9kaXI6IGxpYnMgICAgICAgICAgICAgICAjIERpcmVjdG9yeSB3aGVyZSBKYXZhU2NyaXB0L0NTUyBsaWJyYXJpZXMNCiAgICBkZl9wcmludDogInBhZ2VkIiAgICAgICAgICAgIyBEaXNwbGF5cyBkYXRhIGZyYW1lcyBhcyBpbnRlcmFjdGl2ZSBwYWdlZCANCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93IiAgICAgICAgIyBBbGxvd3MgZm9sZGluZy91bmZvbGRpbmcgUiBjb2RlIGJsb2NrcyANCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMgICAgICAgICAgIyBBZGRzIGEgYnV0dG9uIHRvIGRvd25sb2FkIGFsbCBSIGNvZGUNCi0tLQ0KDQpgYGB7PWh0bWx9DQo8c3R5bGU+DQovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgQ09XQk9ZIEJST1dOIFRIRU1FIOKAkyBDT05GSURFTkNFIElOVEVSVkFMDQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KDQpib2R5IHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2ZiZjdmMjsNCiAgY29sb3I6ICMzZTJmMjM7DQogIGZvbnQtZmFtaWx5OiAiR2VvcmdpYSIsIHNlcmlmOw0KICBsaW5lLWhlaWdodDogMS44Ow0KfQ0KDQovKiA9PT09PSBIRUFESU5HUyA9PT09PSAqLw0KaDEsIGgyLCBoMyB7DQogIGNvbG9yOiAjNmI0MjI2Ow0KICBmb250LXdlaWdodDogNzAwOw0KfQ0KDQpoMiB7DQogIGJvcmRlci1ib3R0b206IDNweCBzb2xpZCAjYzlhMjdjOw0KICBwYWRkaW5nLWJvdHRvbTogNnB4Ow0KICBtYXJnaW4tdG9wOiAzNXB4Ow0KfQ0KDQovKiA9PT09PSBUT09MVElQID09PT09ICovDQoudG9vbHRpcCB7DQogIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgY3Vyc29yOiBoZWxwOw0KICBjb2xvcjogIzhiNWUzYzsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQoNCi50b29sdGlwOjphZnRlciB7DQogIGNvbnRlbnQ6IGF0dHIoZGF0YS10aXApOw0KICBwb3NpdGlvbjogYWJzb2x1dGU7DQogIGJvdHRvbTogMTM1JTsNCiAgbGVmdDogNTAlOw0KICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7DQogIGJhY2tncm91bmQtY29sb3I6ICM0YjJlMWY7DQogIGNvbG9yOiAjZmZmOw0KICBwYWRkaW5nOiA4cHggMTJweDsNCiAgYm9yZGVyLXJhZGl1czogNnB4Ow0KICBmb250LXNpemU6IDEzcHg7DQogIG9wYWNpdHk6IDA7DQogIHBvaW50ZXItZXZlbnRzOiBub25lOw0KICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgZWFzZTsNCn0NCg0KLnRvb2x0aXA6aG92ZXI6OmFmdGVyIHsNCiAgb3BhY2l0eTogMTsNCn0NCg0KLyogPT09PT0gRElTVFJJQlVUSU9OIElNQUdFID09PT09ICovDQouZGlzdHJpYnV0aW9uLWJveCB7DQogIGJhY2tncm91bmQ6ICNmZmZmZmY7DQogIGJvcmRlcjogMXB4IHNvbGlkICNkNmMzYjA7DQogIGJvcmRlci1yYWRpdXM6IDE0cHg7DQogIHBhZGRpbmc6IDI0cHg7DQogIG1hcmdpbjogMzVweCBhdXRvOw0KICBtYXgtd2lkdGg6IDc1MHB4Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCi5kaXN0cmlidXRpb24tYm94IGltZyB7DQogIG1heC13aWR0aDogMTAwJTsNCiAgYm9yZGVyLXJhZGl1czogMTBweDsNCiAgYm94LXNoYWRvdzogMCA4cHggMThweCByZ2JhKDAsMCwwLDAuMTgpOw0KfQ0KDQouZGlzdHJpYnV0aW9uLWNhcHRpb24gew0KICBmb250LXNpemU6IDE0cHg7DQogIGNvbG9yOiAjNWEzYjJhOw0KICBtYXJnaW4tdG9wOiAxMnB4Ow0KICBmb250LXN0eWxlOiBpdGFsaWM7DQp9DQo8L3N0eWxlPg0KYGBgDQoNCg0KPHN0eWxlPg0KDQovKiA9PT09PT09PT09PT09PT09PT09PT0gTUFUSUtBTiBXQVJOQSBNRVJBSCBERUZBVUxUID09PT09PT09PT09PT09PT09PT09PSAqLw0KYm9keSwNCi5tYWluLWNvbnRhaW5lciwNCnNlY3Rpb24sDQoubGV2ZWwxLCAubGV2ZWwyLCAubGV2ZWwzIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZWZlNiAhaW1wb3J0YW50Ow0KICBjb2xvcjogIzNiMmExYSAhaW1wb3J0YW50Ow0KfQ0KDQovKiA9PT09PT09PT09PT09PT09PT09PT0gSEVBREVSIEFUQVMgPT09PT09PT09PT09PT09PT09PT09ICovDQojaGVhZGVyLCAudGl0bGUsIC5zdWJ0aXRsZSB7DQogIGJhY2tncm91bmQtY29sb3I6ICNmNmVmZTYgIWltcG9ydGFudDsNCiAgY29sb3I6ICM1YzNhMjEgIWltcG9ydGFudDsNCiAgYm9yZGVyLWJvdHRvbTogM3B4IHNvbGlkICNkMmI0OGMgIWltcG9ydGFudDsNCn0NCg0KLyogPT09PT09PT09PT09PT09PT09PT09IFBBTkVMIFVUQU1BID09PT09PT09PT09PT09PT09PT09PSAqLw0KLm1haW4tY29udGFpbmVyIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmFmMyAhaW1wb3J0YW50Ow0KICBwYWRkaW5nOiAzMHB4Ow0KICBib3JkZXItcmFkaXVzOiAxNHB4Ow0KfQ0KDQovKiA9PT09PT09PT09PT09PT09PT09PT0gSlVEVUwgPT09PT09PT09PT09PT09PT09PT09ICovDQpoMSwgaDIsIGgzLCBoNCB7DQogIGNvbG9yOiAjNmIzZTFlICFpbXBvcnRhbnQ7DQp9DQoNCi8qID09PT09PT09PT09PT09PT09PT09PSBMSU5LID09PT09PT09PT09PT09PT09PT09PSAqLw0KYSB7DQogIGNvbG9yOiAjOGI1YTJiICFpbXBvcnRhbnQ7DQp9DQphOmhvdmVyIHsNCiAgY29sb3I6ICNiODczMzMgIWltcG9ydGFudDsNCn0NCg0KLyogPT09PT09PT09PT09PT09PT09PT09IENPREUgQ0hVTksgPT09PT09PT09PT09PT09PT09PT09ICovDQpwcmUgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlNGQ1ICFpbXBvcnRhbnQ7DQogIGJvcmRlci1sZWZ0OiA2cHggc29saWQgIzhiNWEyYiAhaW1wb3J0YW50Ow0KICBib3JkZXItcmFkaXVzOiAxMHB4Ow0KfQ0KDQpjb2RlIHsNCiAgY29sb3I6ICM1YzNhMjEgIWltcG9ydGFudDsNCn0NCg0KLyogPT09PT09PT09PT09PT09PT09PT09IE9VVFBVVCA9PT09PT09PT09PT09PT09PT09PT0gKi8NCmRpdi5yLW91dHB1dCB7DQogIGJhY2tncm91bmQtY29sb3I6ICNmM2U4ZDggIWltcG9ydGFudDsNCiAgYm9yZGVyLXJhZGl1czogMTBweDsNCn0NCg0KLyogPT09PT09PT09PT09PT09PT09PT09IFRBQkVMID09PT09PT09PT09PT09PT09PT09PSAqLw0KdGFibGUgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmYWYzICFpbXBvcnRhbnQ7DQp9DQoNCnRoIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2QyYjQ4YyAhaW1wb3J0YW50Ow0KICBjb2xvcjogIzNiMmExYSAhaW1wb3J0YW50Ow0KfQ0KDQp0ZCB7DQogIGJvcmRlcjogMXB4IHNvbGlkICNlMGM5YTYgIWltcG9ydGFudDsNCn0NCg0KLyogPT09PT09PT09PT09PT09PT09PT09IEhJTEFOR0tBTiBNRVJBSCBOQVYgPT09PT09PT09PT09PT09PT09PT09ICovDQoubmF2YmFyLA0KLm5hdmJhci1kZWZhdWx0IHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZWZlNiAhaW1wb3J0YW50Ow0KICBib3JkZXItY29sb3I6ICNkMmI0OGMgIWltcG9ydGFudDsNCn0NCg0KLm5hdmJhciBhIHsNCiAgY29sb3I6ICM1YzNhMjEgIWltcG9ydGFudDsNCn0NCg0KPC9zdHlsZT4NCg0KDQoNCjwhLS0gPT09PT09PT09PT09PT09PT09PT09IEhFQURFUiBSUFVCUyA9PT09PT09PT09PT09PT09PT09PT0gLS0+DQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyBtYXJnaW4tdG9wOjMwcHg7IG1hcmdpbi1ib3R0b206NDBweDsiPg0KDQogIDxpbWcgc3JjPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYWRpbmRhYWRlbGlhZnV0cmk2LWdpZi9hZGluZGFhZGVsaWEvbWFpbi9hZGluZGFhZGVsaWEuanBlZyINCiAgICAgICBhbHQ9IkZvdG8gTWFoYXNpc3dhIg0KICAgICAgIHN0eWxlPSJ3aWR0aDoxODBweDsgYm9yZGVyLXJhZGl1czo4cHg7IGJvcmRlcjoycHggc29saWQgIzhCNUEyQjsgbWFyZ2luLWJvdHRvbToxMHB4OyI+DQoNCiAgPHAgc3R5bGU9Im1hcmdpbjowOyBmb250LXNpemU6MTRweDsgZm9udC13ZWlnaHQ6Ym9sZDsiPg0KICAgIEFkaW5kYSBBZGVsaWEgRnV0cmkNCiAgPC9wPg0KDQogIDxwIHN0eWxlPSJtYXJnaW46MDsgZm9udC1zaXplOjEzcHg7Ij4NCiAgICBJbnN0aXR1dCBUZWtub2xvZ2kgU2FpbnMgQmFuZHVuZyAoSVRTQikNCiAgPC9wPg0KDQogIDxwIHN0eWxlPSJtYXJnaW46MDsgZm9udC1zaXplOjEzcHg7Ij4NCiAgICBQcm9ncmFtIFN0dWRpIERhdGEgU2NpZW5jZQ0KICA8L3A+DQoNCjwvZGl2Pg0KDQo8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgIzhCNUEyQjsgd2lkdGg6NjAlOyBtYXJnaW46YXV0bzsgbWFyZ2luLWJvdHRvbTo0MHB4OyI+DQoNCjwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQoNCg0KDQoNCiMg8J+TmCBDYXNlIFN0dWR5IDEgIA0KIyMgQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgTWVhbiAoz4MgRGlrZXRhaHVpKQ0KDQotLS0NCg0KIyMgMe+4j+KDoyBTb2FsDQoNClNlYnVhaCBwbGF0Zm9ybSAqKmUtY29tbWVyY2UqKiBpbmdpbiBtZW5nZXN0aW1hc2kgKipyYXRhLXJhdGEganVtbGFoIHRyYW5zYWtzaSBoYXJpYW4gcGVyIHBlbmdndW5hKiogc2V0ZWxhaCBwZWx1bmN1cmFuIGZpdHVyIGJhcnUuIEJlcmRhc2Fya2FuIGRhdGEgaGlzdG9yaXMgc2thbGEgYmVzYXIsICoqc3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpIGRpa2V0YWh1aSoqLg0KDQpEaWtldGFodWk6DQoNCi0gz4MgPSAzLjIgIA0KLSBuID0gMTAwICANCi0geMyEID0gMTIuNiAgDQoNClRlbnR1a2FuICoqaW50ZXJ2YWwga2VwZXJjYXlhYW4gcmF0YS1yYXRhIHBvcHVsYXNpKiogcGFkYSB0aW5na2F0IGtlcGVyY2F5YWFuOg0KDQotIDkwJQ0KLSA5NSUNCi0gOTklDQoNCi0tLQ0KDQojIyAy77iP4oOjIE1lbmVudHVrYW4gRGlzdHJpYnVzaSB5YW5nIERpZ3VuYWthbg0KDQpLYXJlbmE6DQoNCjEuIFN0YW5kYXIgZGV2aWFzaSBwb3B1bGFzaSAoz4MpICoqZGlrZXRhaHVpKioNCjIuIFVrdXJhbiBzYW1wZWwgKipiZXNhciAobiDiiaUgMzApKioNCjMuIEVzdGltYXNpIHlhbmcgZGljYXJpIGFkYWxhaCAqKnJhdGEtcmF0YSBwb3B1bGFzaSoqDQoNCk1ha2EgZGlndW5ha2FuICoqRGlzdHJpYnVzaSBOb3JtYWwgKFopKiouDQoNCi0tLQ0KDQojIyAz77iP4oOjIFBlcmhpdHVuZ2FuIE1hbnVhbCAoU2VwZXJ0aSBDb3JldGFuIGRpIEJ1a3UpDQoNCiMjIyBSdW11cyBJbnRlcnZhbCBLZXBlcmNheWFhbg0KDQpcWw0KQ0kgPSBcYmFye3h9IFxwbSBaX3tcYWxwaGEvMn0gXHRpbWVzIFxmcmFje1xzaWdtYX17XHNxcnR7bn19DQpcXQ0KDQotLS0NCg0KIyMjIOKcj++4jyBTdGVwIDEg4oCTIEhpdHVuZyBTdGFuZGFyZCBFcnJvciAoU0UpDQoNCkRpa2V0YWh1aToNCg0KXFsNClxzaWdtYSA9IDMuMiwgXHF1YWQgbiA9IDEwMA0KXF0NCg0KXFsNClNFID0gXGZyYWN7XHNpZ21hfXtcc3FydHtufX0NClxdDQoNClxbDQpTRSA9IFxmcmFjezMuMn17XHNxcnR7MTAwfX0NClxdDQoNClxbDQpTRSA9IFxmcmFjezMuMn17MTB9DQpcXQ0KDQpcWw0KU0UgPSAwLjMyDQpcXQ0KDQpBcnRpbnlhLCByYXRhLXJhdGEgc2FtcGVsIGRpcGVya2lyYWthbiBtZW55aW1wYW5nIHNlYmVzYXIgKiowLjMyIHRyYW5zYWtzaSoqIGRhcmkgcmF0YS1yYXRhIHBvcHVsYXNpLg0KDQotLS0NCg0KIyMjIOKcj++4jyBTdGVwIDIg4oCTIFRlbnR1a2FuIE5pbGFpIM6xIGRhbiDOsS8yDQoNCkthcmVuYSBpbnRlcnZhbCBrZXBlcmNheWFhbiAqKmR1YSBzaXNpKiosIG1ha2E6DQoNCi0gVW50dWsgOTAlOg0KXFsNClxhbHBoYSA9IDEgLSAwLjkwID0gMC4xMCBcUmlnaHRhcnJvdyBcYWxwaGEvMiA9IDAuMDUNClxdDQoNCi0gVW50dWsgOTUlOg0KXFsNClxhbHBoYSA9IDEgLSAwLjk1ID0gMC4wNSBcUmlnaHRhcnJvdyBcYWxwaGEvMiA9IDAuMDI1DQpcXQ0KDQotIFVudHVrIDk5JToNClxbDQpcYWxwaGEgPSAxIC0gMC45OSA9IDAuMDEgXFJpZ2h0YXJyb3cgXGFscGhhLzIgPSAwLjAwNQ0KXF0NCg0KLS0tDQoNCiMjIyDinI/vuI8gU3RlcCAzIOKAkyBNZW5lbnR1a2FuIE5pbGFpIFogZGFyaSBUYWJlbCBEaXN0cmlidXNpIE5vcm1hbA0KDQpOaWxhaSBaIGRpY2FyaSBkYXJpICoqdGFiZWwgZGlzdHJpYnVzaSBub3JtYWwgc3RhbmRhcioqIGJlcmRhc2Fya2FuIHByb2JhYmlsaXRhczoNCg0KXFsNClogPSBaX3soMSAtIFxhbHBoYS8yKX0NClxdDQoNCkhhc2lsIHBlbWJhY2FhbiB0YWJlbDoNCi0gOTAlIOKGkiBcKCBaID0gMS42NDUgXCkNCi0gOTUlIOKGkiBcKCBaID0gMS45NjAgXCkNCi0gOTklIOKGkiBcKCBaID0gMi41NzYgXCkNCg0KLS0tDQoNCiMjIDTvuI/ig6MgVGFiZWwgRGlzdHJpYnVzaSBOb3JtYWwNCjxkaXYgY2xhc3M9ImRpc3RyaWJ1dGlvbi1ib3giPg0KICA8aW1nIGlkPSJGb3RvIiBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hZGluZGFhZGVsaWFmdXRyaTYtZ2lmL2Rpc3RyaWJ1c2ktei9tYWluL2Rpc3RyaWJ1c2ktei5qcGVnIiBhbHQ9IkxvZ28iIHN0eWxlPSJ3aWR0aDoyMDBweDsgZGlzcGxheTogYmxvY2s7IG1hcmdpbjogYXV0bzsiPiINCg0KICA8ZGl2IGNsYXNzPSJkaXN0cmlidXRpb24tY2FwdGlvbiI+DQogICAgR2FtYmFyOiBUYWJlbCBEaXN0cmlidXNpIE5vcm1hbCBTdGFuZGFyIChaLVRhYmxlKTxicj4NCiAgICBEaWd1bmFrYW4gdW50dWsgbWVuZW50dWthbiBuaWxhaSBrcml0aXMgWiBwYWRhIGludGVydmFsIGtlcGVyY2F5YWFuIGR1YSBzaXNpDQogIDwvZGl2Pg0KPC9kaXY+DQoNCg0KLS0tDQoNCiMjIyDinI/vuI8gU3RlcCA0IOKAkyBIaXR1bmcgTWFyZ2luIG9mIEVycm9yIChNRSkNCg0KUnVtdXM6DQoNClxbDQpNRSA9IFogXHRpbWVzIFNFDQpcXQ0KDQpQZXJoaXR1bmdhbjoNCg0KLSA5MCU6DQpcWw0KTUUgPSAxLjY0NSBcdGltZXMgMC4zMiA9IDAuNTI2DQpcXQ0KDQotIDk1JToNClxbDQpNRSA9IDEuOTYwIFx0aW1lcyAwLjMyID0gMC42MjcNClxdDQoNCi0gOTklOg0KXFsNCk1FID0gMi41NzYgXHRpbWVzIDAuMzIgPSAwLjgyNA0KXF0NCg0KLS0tDQoNCiMjIyDinI/vuI8gU3RlcCA1IOKAkyBIaXR1bmcgQ29uZmlkZW5jZSBJbnRlcnZhbA0KDQpSdW11czoNCg0KXFsNCkNJID0gXGJhcnt4fSBccG0gTUUNClxdDQoNClN1YnN0aXR1c2kgbmlsYWk6DQoNCi0gOTAlOg0KXFsNCkNJID0gMTIuNiBccG0gMC41MjYNClxdDQoNCi0gOTUlOg0KXFsNCkNJID0gMTIuNiBccG0gMC42MjcNClxdDQoNCi0gOTklOg0KXFsNCkNJID0gMTIuNiBccG0gMC44MjQNClxdDQoNCg0KLS0tDQoNCiMjIDXvuI/ig6MgUGVyaGl0dW5nYW4gTWVuZ2d1bmFrYW4gUiAoVmVyaWZpa2FzaSkNCg0KYGBge3J9DQojIERpa2V0YWh1aQ0KeF9iYXIgPC0gMTIuNg0Kc2lnbWEgPC0gMy4yDQpuIDwtIDEwMA0KDQojIFN0ZXAgMTogU3RhbmRhcmQgRXJyb3INClNFIDwtIHNpZ21hIC8gc3FydChuKQ0KDQojIFN0ZXAgMjogQ29uZmlkZW5jZSBMZXZlbHMNCmNvbmZfbGV2ZWwgPC0gYygwLjkwLCAwLjk1LCAwLjk5KQ0KDQojIFN0ZXAgMzogTmlsYWkgWg0Kel92YWx1ZSA8LSBxbm9ybSgoMSArIGNvbmZfbGV2ZWwpIC8gMikNCg0KIyBTdGVwIDQ6IE1hcmdpbiBvZiBFcnJvcg0KTUUgPC0gel92YWx1ZSAqIFNFDQoNCiMgU3RlcCA1OiBDb25maWRlbmNlIEludGVydmFsDQpsb3dlciA8LSB4X2JhciAtIE1FDQp1cHBlciA8LSB4X2JhciArIE1FDQoNCiMgVGFiZWwgaGFzaWwNCkNJX3Jlc3VsdCA8LSBkYXRhLmZyYW1lKA0KICBDb25maWRlbmNlX0xldmVsID0gYygiOTAlIiwgIjk1JSIsICI5OSUiKSwNCiAgWl9TY29yZSA9IHJvdW5kKHpfdmFsdWUsIDMpLA0KICBNYXJnaW5fb2ZfRXJyb3IgPSByb3VuZChNRSwgMyksDQogIExvd2VyX0JvdW5kID0gcm91bmQobG93ZXIsIDMpLA0KICBVcHBlcl9Cb3VuZCA9IHJvdW5kKHVwcGVyLCAzKQ0KKQ0KDQpDSV9yZXN1bHQNCmBgYA0KIyMgQ29uZmlkZW5jZSBJbnRlcnZhbCBEZW5zaXR5IFBsb3QNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTZ9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCg0KDQojIFdhcm5hIENJIGxlYmloIGtvbnRyYXMNCmNpX2NvbG9ycyA8LSBjKA0KICAiOTAlIENJIiA9ICIjRTZDNzlDIiwNCiAgIjk1JSBDSSIgPSAiI0M4OUI2MyIsDQogICI5OSUgQ0kiID0gIiM4QzYyMzkiDQopDQoNCiMgRGVuc2l0eSBkYXRhDQp4X3NlcSA8LSBzZXEoMTEsIDE0LCBsZW5ndGgub3V0ID0gMzAwKQ0KDQpkZW5zaXR5X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgeCA9IHJlcCh4X3NlcSwgMyksDQogIGRlbnNpdHkgPSByZXAoZG5vcm0oeF9zZXEsIDEyLjYsIDAuMzIpLCAzKSwNCiAgbGV2ZWwgPSBmYWN0b3IoDQogICAgcmVwKGMoIjkwJSBDSSIsICI5NSUgQ0kiLCAiOTklIENJIiksIGVhY2ggPSAzMDApLA0KICAgIGxldmVscyA9IGMoIjkwJSBDSSIsICI5NSUgQ0kiLCAiOTklIENJIikNCiAgKQ0KKQ0KDQojIENvbmZpZGVuY2UgaW50ZXJ2YWxzDQpjaV9zdGF0cyA8LSBkYXRhLmZyYW1lKA0KICBsZXZlbCA9IGMoIjkwJSBDSSIsICI5NSUgQ0kiLCAiOTklIENJIiksDQogIGxvd2VyID0gYygxMi42IC0gMS42NDUqMC4zMiwgMTIuNiAtIDEuOTYqMC4zMiwgMTIuNiAtIDIuNTc2KjAuMzIpLA0KICB1cHBlciA9IGMoMTIuNiArIDEuNjQ1KjAuMzIsIDEyLjYgKyAxLjk2KjAuMzIsIDEyLjYgKyAyLjU3NiowLjMyKSwNCiAgeSA9IGMoMC4wMzAsIDAuMDI0LCAwLjAxOCkNCikNCg0KIyBQbG90DQpnZ3Bsb3QoKSArDQogIGdlb21fYXJlYSgNCiAgICBkYXRhID0gZGVuc2l0eV9kYXRhLA0KICAgIGFlcyh4ID0geCwgeSA9IGRlbnNpdHksIGZpbGwgPSBsZXZlbCksDQogICAgYWxwaGEgPSAwLjcNCiAgKSArDQogIGdlb21fc2VnbWVudCgNCiAgICBkYXRhID0gY2lfc3RhdHMsDQogICAgYWVzKHggPSBsb3dlciwgeGVuZCA9IHVwcGVyLCB5ID0geSwgeWVuZCA9IHksIGNvbG9yID0gbGV2ZWwpLA0KICAgIGxpbmV3aWR0aCA9IDIuMiwNCiAgICBsaW5lZW5kID0gInJvdW5kIg0KICApICsNCiAgZ2VvbV92bGluZSgNCiAgICB4aW50ZXJjZXB0ID0gMTIuNiwNCiAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLA0KICAgIGNvbG9yID0gIiM0RTM0MkUiLA0KICAgIGxpbmV3aWR0aCA9IDAuOQ0KICApICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2lfY29sb3JzKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjaV9jb2xvcnMpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJDb25maWRlbmNlIEludGVydmFsIERlbnNpdHkgUGxvdCIsDQogICAgc3VidGl0bGUgPSAiQ29tcGFyaXNvbiBvZiA5MCUsIDk1JSwgYW5kIDk5JSBDb25maWRlbmNlIExldmVscyIsDQogICAgeCA9ICJUcmFuc2FjdGlvbnMgcGVyIERheSIsDQogICAgeSA9ICJQcm9iYWJpbGl0eSBEZW5zaXR5IiwNCiAgICBmaWxsID0gIkNvbmZpZGVuY2UgTGV2ZWwiLA0KICAgIGNvbG9yID0gIkNvbmZpZGVuY2UgTGV2ZWwiLA0KICAgIGNhcHRpb24gPSAiTWVhbiA9IDEyLjYgfCBTRSA9IDAuMzIgfCBuID0gMTAwIg0KICApICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMikgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KDQpgYGANCi0tLQ0KDQojIyA277iP4oOjIEludGVycHJldGFzaQ0KDQoqKkludGVycHJldGFzaSBTdGF0aXN0aWs6KiogIA0KRGVuZ2FuIHRpbmdrYXQga2VwZXJjYXlhYW4gOTUlLCByYXRhLXJhdGEganVtbGFoIHRyYW5zYWtzaSBoYXJpYW4gcGVyIHBlbmdndW5hIGJlcmFkYSBwYWRhIGludGVydmFsICoqMTEuOTczIHNhbXBhaSAxMy4yMjcgdHJhbnNha3NpKiouDQoNCioqSW50ZXJwcmV0YXNpIEJpc25pczoqKiAgDQpIYWwgaW5pIG1lbnVuanVra2FuIGJhaHdhIGZpdHVyIGJhcnUgbWVuZ2hhc2lsa2FuIHJhdGEtcmF0YSBzZWtpdGFyICoqMTLigJMxMyB0cmFuc2Frc2kgcGVyIHBlbmdndW5hIHBlciBoYXJpKiouIEludGVydmFsIHlhbmcgcmVsYXRpZiBzZW1waXQgbWVuYW5kYWthbiBlc3RpbWFzaSB5YW5nIHN0YWJpbCBkYW4gZGFwYXQgZGlndW5ha2FuIHNlYmFnYWkgZGFzYXIgZXZhbHVhc2kgcGVyZm9ybWEgZml0dXIgb2xlaCBtYW5hamVtZW4uDQoNCg0KDQojIPCfk5ggQ2FzZSBTdHVkeSAyICANCiMjIENvbmZpZGVuY2UgSW50ZXJ2YWwgZm9yIE1lYW4gKM+DIFRpZGFrIERpa2V0YWh1aSkNCg0KLS0tDQoNCiMjIDHvuI/ig6MgU29hbA0KDQpUaW0gKipVWCBSZXNlYXJjaCoqIGluZ2luIG1lbmdlc3RpbWFzaSAqKnJhdGEtcmF0YSB3YWt0dSBwZW55ZWxlc2FpYW4gdHVnYXMgKG1lbml0KSoqIHBhZGEgYXBsaWthc2kgbW9iaWxlIGJhcnUuIERhdGEgZGlwZXJvbGVoIGRhcmkgKioxMiBwZW5nZ3VuYSoqIGJlcmlrdXQ6DQoNCjguNCwgNy45LCA5LjEsIDguNywgOC4yLCA5LjAsIDcuOCwgOC41LCA4LjksIDguMSwgOC42LCA4LjMNCg0KS2FyZW5hIHN0YW5kYXIgZGV2aWFzaSBwb3B1bGFzaSB0aWRhayBkaWtldGFodWkgZGFuIGp1bWxhaCBzYW1wZWwga2VjaWwsIGRpcGVybHVrYW4gaW50ZXJ2YWwga2VwZXJjYXlhYW4gdW50dWsgbWVuZ2VzdGltYXNpIHJhdGEtcmF0YSBwb3B1bGFzaS4NCg0KLS0tDQoNCiMjIDLvuI/ig6MgTWV0b2RlIHlhbmcgRGlndW5ha2FuDQoNCk1ldG9kZSB5YW5nIGRpZ3VuYWthbiBhZGFsYWggKipDb25maWRlbmNlIEludGVydmFsIE1lYW4gZGVuZ2FuIERpc3RyaWJ1c2kgdCoqLg0KDQoqKkFsYXNhbiAobGFuZ3N1bmcgZGFyaSBrb25kaXNpIHNvYWwpOioqDQoNCi0gU2FtcGVsIGtlY2lsIChuID0gMTIpDQotIFN0YW5kYXIgZGV2aWFzaSBwb3B1bGFzaSB0aWRhayBkaWtldGFodWkNCi0gVHVqdWFuIGFuYWxpc2lzIGFkYWxhaCBlc3RpbWFzaSByYXRhLXJhdGEgcG9wdWxhc2kNCg0KLS0tDQoNCiMjIDPvuI/ig6MgUGVyaGl0dW5nYW4gU3RlcC1ieS1TdGVwIChQZXJoaXR1bmdhbiBOeWF0YSBkYXJpIFNvYWwpDQoNCkRhdGEgd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzIChtZW5pdCk6DQoNCjguNCwgNy45LCA5LjEsIDguNywgOC4yLCA5LjAsIDcuOCwgOC41LCA4LjksIDguMSwgOC42LCA4LjMNCg0KLS0tDQoNCiMjIyDinI/vuI8gU3RlcCAxIOKAkyBNZW5lbnR1a2FuIFVrdXJhbiBTYW1wZWwgZGFuIERlcmFqYXQgS2ViZWJhc2FuDQoNCkp1bWxhaCBkYXRhIHBlbmdndW5hOg0KDQpcWw0KbiA9IDEyDQpcXQ0KDQpLYXJlbmEgc3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpICoqdGlkYWsgZGlrZXRhaHVpKiosIG1ha2EgZGlndW5ha2FuIGRpc3RyaWJ1c2kgdCBkZW5nYW4gZGVyYWphdCBrZWJlYmFzYW46DQoNClxbDQpkZiA9IG4gLSAxID0gMTIgLSAxID0gMTENClxdDQoNCi0tLQ0KDQojIyMg4pyP77iPIFN0ZXAgMiDigJMgTWVuZ2hpdHVuZyBSYXRhLXJhdGEgU2FtcGVsIChcKFxiYXJ7eH1cKSkNCg0KUnVtdXMgcmF0YS1yYXRhIHNhbXBlbDoNCg0KXFsNClxiYXJ7eH0gPSBcZnJhY3tcc3VtIHhfaX17bn0NClxdDQoNClN1YnN0aXR1c2kgbmlsYWkgZGFyaSBzb2FsOg0KDQpcWw0KXGJhcnt4fSA9DQpcZnJhY3sNCjguNCArIDcuOSArIDkuMSArIDguNyArIDguMiArIDkuMCArIDcuOCArIDguNSArIDguOSArIDguMSArIDguNiArIDguMw0KfXsxMn0NClxdDQoNClxbDQpcYmFye3h9ID0gXGZyYWN7MTAxLjV9ezEyfSA9IDguNDU4DQpcXQ0KDQpBcnRpbnlhLCByYXRhLXJhdGEgd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzIGRhcmkgMTIgcGVuZ2d1bmEgYWRhbGFoICoqOC40NTggbWVuaXQqKi4NCg0KLS0tDQoNCiMjIyDinI/vuI8gU3RlcCAzIOKAkyBNZW5naGl0dW5nIFN0YW5kYXIgRGV2aWFzaSBTYW1wZWwgKHMpDQoNClJ1bXVzIHN0YW5kYXIgZGV2aWFzaSBzYW1wZWw6DQoNClxbDQpzID0NClxzcXJ0ew0KXGZyYWN7XHN1bSAoeF9pIC0gXGJhcnt4fSleMn17biAtIDF9DQp9DQpcXQ0KDQpQZXJoaXR1bmdhbiBpbmkgbWVuZ3VrdXIgKipzZWJlcmFwYSBiZXNhciB2YXJpYXNpIHdha3R1IHBlbnllbGVzYWlhbiBhbnRhciBwZW5nZ3VuYSoqLg0KDQpIYXNpbCBwZXJoaXR1bmdhbiBkYXJpIGRhdGE6DQoNClxbDQpzID0gMC40MDYNClxdDQoNCk5pbGFpIGluaSBtZW51bmp1a2thbiBiYWh3YSB3YWt0dSBwZW55ZWxlc2FpYW4gcGVuZ2d1bmEgY3VrdXAga29uc2lzdGVuLCB0ZXRhcGkgdGV0YXAgbWVtaWxpa2kgdmFyaWFzaS4NCg0KLS0tDQoNCiMjIyDinI/vuI8gU3RlcCA0IOKAkyBNZW5naGl0dW5nIFN0YW5kYXJkIEVycm9yIChTRSkNCg0KU3RhbmRhcmQgRXJyb3IgbWVudW5qdWtrYW4gKiprZXRlbGl0aWFuIHJhdGEtcmF0YSBzYW1wZWwgZGFsYW0gbWVuZ2VzdGltYXNpIHJhdGEtcmF0YSBwb3B1bGFzaSoqLg0KDQpSdW11czoNCg0KXFsNClNFID0gXGZyYWN7c317XHNxcnR7bn19DQpcXQ0KDQpTdWJzdGl0dXNpIG5pbGFpOg0KDQpcWw0KU0UgPSBcZnJhY3swLjQwNn17XHNxcnR7MTJ9fQ0KXF0NCg0KXFsNClNFID0gXGZyYWN7MC40MDZ9ezMuNDY0fSA9IDAuMTE3DQpcXQ0KDQotLS0NCg0KIyMjIOKcj++4jyBTdGVwIDUg4oCTIE1lbmVudHVrYW4gTmlsYWkgdCBkYXJpIFRhYmVsIERpc3RyaWJ1c2kgdA0KDQpEZW5nYW46DQotIGRlcmFqYXQga2ViZWJhc2FuIFwoZGYgPSAxMVwpDQoNCk5pbGFpIHQgZGFyaSB0YWJlbCBkaXN0cmlidXNpIHQgYWRhbGFoOg0KDQotIDkwJSDihpIgXCh0ID0gMS43OTZcKQ0KLSA5NSUg4oaSIFwodCA9IDIuMjAxXCkNCi0gOTklIOKGkiBcKHQgPSAzLjEwNlwpDQoNCjxkaXYgY2xhc3M9ImRpc3RyaWJ1dGlvbi1ib3giPg0KICA8aW1nIGlkPSJGb3RvIiBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hZGluZGFhZGVsaWFmdXRyaTYtZ2lmL2Rpc3RyaWJ1c2ktdC9tYWluL2Rpc3RyaWJ1c2ktdC5wbmciIGFsdD0iTG9nbyIgc3R5bGU9IndpZHRoOjIwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQoNCiAgPGRpdiBjbGFzcz0iZGlzdHJpYnV0aW9uLWNhcHRpb24iPg0KICAgIEdhbWJhcjogVGFiZWwgRGlzdHJpYnVzaSB0IChTdHVkZW504oCZcyB0LURpc3RyaWJ1dGlvbik8YnI+DQogICAgRGlndW5ha2FuIHVudHVrIG1lbmVudHVrYW4gbmlsYWkga3JpdGlzIHQgYmVyZGFzYXJrYW4gZGVyYWphdCBrZWJlYmFzYW4gKGRmID0gMTEpDQogIDwvZGl2Pg0KPC9kaXY+DQoNCg0KLS0tDQoNCiMjIyDinI/vuI8gU3RlcCA2IOKAkyBNZW5naGl0dW5nIE1hcmdpbiBvZiBFcnJvciAoTUUpDQoNClJ1bXVzIE1hcmdpbiBvZiBFcnJvcjoNCg0KXFsNCk1FID0gdCBcdGltZXMgU0UNClxdDQoNCiMjIyMg8J+UuSBDb25maWRlbmNlIExldmVsIDkwJQ0KDQpcWw0KTUVfezkwfSA9IDEuNzk2IFx0aW1lcyAwLjExNyA9IDAuMjEwDQpcXQ0KDQojIyMjIPCflLkgQ29uZmlkZW5jZSBMZXZlbCA5NSUNCg0KXFsNCk1FX3s5NX0gPSAyLjIwMSBcdGltZXMgMC4xMTcgPSAwLjI1OA0KXF0NCg0KIyMjIyDwn5S5IENvbmZpZGVuY2UgTGV2ZWwgOTklDQoNClxbDQpNRV97OTl9ID0gMy4xMDYgXHRpbWVzIDAuMTE3ID0gMC4zNjMNClxdDQoNCi0tLQ0KDQojIyMg4pyP77iPIFN0ZXAgNyDigJMgTWVtYmVudHVrIENvbmZpZGVuY2UgSW50ZXJ2YWwNCg0KUnVtdXMgaW50ZXJ2YWwga2VwZXJjYXlhYW46DQoNClxbDQpDSSA9IFxiYXJ7eH0gXHBtIE1FDQpcXQ0KDQojIyMjIPCflLkgQ0kgOTAlDQoNClxbDQpDSV97OTB9ID0gOC40NTggXHBtIDAuMjEwDQpcXQ0KDQpcWw0KQ0lfezkwfSA9ICg4LjI0OCxcOyA4LjY2OCkNClxdDQoNCiMjIyMg8J+UuSBDSSA5NSUNCg0KXFsNCkNJX3s5NX0gPSA4LjQ1OCBccG0gMC4yNTgNClxdDQoNClxbDQpDSV97OTV9ID0gKDguMjAwLFw7IDguNzE2KQ0KXF0NCg0KIyMjIyDwn5S5IENJIDk5JQ0KDQpcWw0KQ0lfezk5fSA9IDguNDU4IFxwbSAwLjM2Mw0KXF0NCg0KXFsNCkNJX3s5OX0gPSAoOC4wOTUsXDsgOC44MjEpDQpcXQ0KDQpSZW50YW5nIGluaSBtZXJlcHJlc2VudGFzaWthbiBlc3RpbWFzaSByYXRhLXJhdGEgd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzICoqc2VsdXJ1aCBwZW5nZ3VuYSBhcGxpa2FzaSoqLCBidWthbiBoYW55YSAxMiByZXNwb25kZW4uDQoNCi0tLQ0KDQojIyA177iP4oOjIFBlcmhpdHVuZ2FuLCBUYWJlbCBIYXNpbCwgZGFuIFZpc3VhbGlzYXNpIE1lbmdndW5ha2FuIFINCg0KYGBge3J9DQojIERhdGEgd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzIChtZW5pdCkNCmRhdGEgPC0gYyg4LjQsNy45LDkuMSw4LjcsOC4yLDkuMCw3LjgsOC41LDguOSw4LjEsOC42LDguMykNCg0KIyBVa3VyYW4gc2FtcGVsDQpuIDwtIGxlbmd0aChkYXRhKQ0KDQojIFJhdGEtcmF0YSBkYW4gc3RhbmRhciBkZXZpYXNpIHNhbXBlbA0KeF9iYXIgPC0gbWVhbihkYXRhKQ0KcyA8LSBzZChkYXRhKQ0KDQojIFN0YW5kYXJkIEVycm9yDQpTRSA8LSBzIC8gc3FydChuKQ0KDQojIENvbmZpZGVuY2UgTGV2ZWxzDQpjb25mX2xldmVsIDwtIGMoMC45MCwgMC45NSwgMC45OSkNCg0KIyBOaWxhaSB0DQp0X3ZhbHVlIDwtIHF0KCgxICsgY29uZl9sZXZlbCkgLyAyLCBkZiA9IG4gLSAxKQ0KDQojIE1hcmdpbiBvZiBFcnJvcg0KTUUgPC0gdF92YWx1ZSAqIFNFDQoNCiMgQ29uZmlkZW5jZSBJbnRlcnZhbA0KbG93ZXIgPC0geF9iYXIgLSBNRQ0KdXBwZXIgPC0geF9iYXIgKyBNRQ0KDQojIFRhYmVsIGhhc2lsDQpDSV9yZXN1bHQgPC0gZGF0YS5mcmFtZSgNCiAgQ29uZmlkZW5jZV9MZXZlbCA9IGMoIjkwJSIsICI5NSUiLCAiOTklIiksDQogIHRfdmFsdWUgPSByb3VuZCh0X3ZhbHVlLCAzKSwNCiAgTWFyZ2luX29mX0Vycm9yID0gcm91bmQoTUUsIDMpLA0KICBMb3dlcl9Cb3VuZCA9IHJvdW5kKGxvd2VyLCAzKSwNCiAgVXBwZXJfQm91bmQgPSByb3VuZCh1cHBlciwgMykNCikNCg0KQ0lfcmVzdWx0DQpgYGANCg0KLS0tDQoNCiMjIyDwn5OKIFZpc3VhbGlzYXNpIENvbmZpZGVuY2UgSW50ZXJ2YWwNCg0KYGBge3IgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcud2lkdGg9MTQsIGZpZy5oZWlnaHQ9MTB9DQpwbG90KE5VTEwsDQogICAgIHhsaW0gPSBjKG1pbihsb3dlcikgLSAwLjIsIG1heCh1cHBlcikgKyAwLjIpLA0KICAgICB5bGltID0gYygxLCAzKSwNCiAgICAgeGxhYiA9ICJUYXNrIENvbXBsZXRpb24gVGltZSAobWludXRlcykiLA0KICAgICB5bGFiID0gIiIsDQogICAgIHlheHQgPSAibiIsDQogICAgIG1haW4gPSAiQ29uZmlkZW5jZSBJbnRlcnZhbCBvZiBUYXNrIENvbXBsZXRpb24gVGltZSIpDQoNCnNlZ21lbnRzKGxvd2VyLCAxOjMsIHVwcGVyLCAxOjMsIGx3ZCA9IDMpDQpwb2ludHMocmVwKHhfYmFyLCAzKSwgMTozLCBwY2ggPSAxOSkNCmF4aXMoMiwgYXQgPSAxOjMsIGxhYmVscyA9IENJX3Jlc3VsdCRDb25maWRlbmNlX0xldmVsKQ0KYGBgDQoNCi0tLQ0KDQojIyA277iP4oOjIEludGVycHJldGFzaSBBa2hpcg0KDQoqKkluc2lnaHQgU3RhdGlzdGlrKioNCkludGVydmFsIGtlcGVyY2F5YWFuIG1lbGViYXIgc2VpcmluZyBtZW5pbmdrYXRueWEgdGluZ2thdCBrZXBlcmNheWFhbiwgbWVudW5qdWtrYW4gYWRhbnlhIHRyYWRlLW9mZiBhbnRhcmEga2V5YWtpbmFuIHN0YXRpc3RpayBkYW4gcHJlc2lzaSBlc3RpbWFzaS4NCg0KKipJbXBsaWthc2kgVVggJiBCaXNuaXMqKg0KSGFzaWwgaW5pIG1lbmdpbmRpa2FzaWthbiBiYWh3YSBwZW5nZ3VuYSBtZW55ZWxlc2Fpa2FuIHR1Z2FzIHJhdGEtcmF0YSBkYWxhbSB3YWt0dSBzZWtpdGFyIDjigJM5IG1lbml0IHNlY2FyYSBrb25zaXN0ZW4uIE5hbXVuLCBrYXJlbmEganVtbGFoIHJlc3BvbmRlbiBtYXNpaCB0ZXJiYXRhcywgcGVuYW1iYWhhbiBwYXJ0aXNpcGFuIFVYIHRlc3Rpbmcgc2FuZ2F0IGRpc2FyYW5rYW4gdW50dWsgbWVtcGVyb2xlaCBlc3RpbWFzaSB5YW5nIGxlYmloIHByZXNpc2kgc2ViZWx1bSBwZW5nYW1iaWxhbiBrZXB1dHVzYW4gZGVzYWluIGZpbmFsLg0KDQoNCg0KIyDwn5OYIENhc2UgU3R1ZHkgMyAgDQojIyBDb25maWRlbmNlIEludGVydmFsIGZvciBhIFByb3BvcnRpb24gKEEvQiBUZXN0aW5nKQ0KDQotLS0NCg0KIyMgMe+4j+KDoyBTb2FsDQoNClRpbSAqKkRhdGEgU2NpZW5jZSoqIG1lbGFrdWthbiAqKkEvQiBUZXN0aW5nKiogcGFkYSBkZXNhaW4gdG9tYm9sICpDYWxsLVRvLUFjdGlvbiAoQ1RBKSogYmFydS4gIA0KSGFzaWwgZWtzcGVyaW1lbiBtZW51bmp1a2thbjoNCg0KLSBUb3RhbCBwZW5nZ3VuYSB5YW5nIG1lbGloYXQgQ1RBOiAgDQogIFxbDQogIG4gPSA0MDANCiAgXF0NCg0KLSBKdW1sYWggcGVuZ2d1bmEgeWFuZyBtZW5na2xpayBDVEE6ICANCiAgXFsNCiAgeCA9IDE1Ng0KICBcXQ0KDQpUdWp1YW4gYW5hbGlzaXMgaW5pIGFkYWxhaCBtZW5nZXN0aW1hc2kgKipwcm9wb3JzaSBwZW5nZ3VuYSB5YW5nIG1lbmdrbGlrIENUQSoqIG1lbmdndW5ha2FuIGludGVydmFsIGtlcGVyY2F5YWFuLg0KDQotLS0NCg0KIyMgMu+4j+KDoyBNZXRvZGUgeWFuZyBEaWd1bmFrYW4NCg0KTWV0b2RlIHlhbmcgZGlndW5ha2FuIGFkYWxhaCAqKkNvbmZpZGVuY2UgSW50ZXJ2YWwgdW50dWsgUHJvcG9yc2kgKFotSW50ZXJ2YWwpKiouDQoNCioqQWxhc2FuIGJlcmRhc2Fya2FuIGtvbmRpc2kgc29hbDoqKg0KDQotIERhdGEgYmVydXBhICoqcHJvcG9yc2kgKGtsaWsgLyB0aWRhayBrbGlrKSoqDQotIFVrdXJhbiBzYW1wZWwgYmVzYXIgKG4gPSA0MDApDQotIERpc3RyaWJ1c2kgYmlub21pYWwgZGFwYXQgZGlkZWthdGkgZGVuZ2FuIGRpc3RyaWJ1c2kgbm9ybWFsDQotIE5pbGFpIFwobnBcKSBkYW4gXChuKDEtcClcKSBjdWt1cCBiZXNhcg0KDQotLS0NCg0KIyMgM++4j+KDoyBQZXJoaXR1bmdhbiBTdGVwLWJ5LVN0ZXAgKFBlcmhpdHVuZ2FuIE55YXRhIGRhcmkgU29hbCkNCg0KLS0tDQoNCiMjIyDinI/vuI8gU3RlcCAxIOKAkyBNZW5naGl0dW5nIFByb3BvcnNpIFNhbXBlbCAoXChcaGF0e3B9XCkpDQoNClByb3BvcnNpIHNhbXBlbCBhZGFsYWggKipwZXJzZW50YXNlIHBlbmdndW5hIHlhbmcgbWVuZ2tsaWsgQ1RBIGRhcmkgc2VsdXJ1aCBwZW5nZ3VuYSoqLg0KDQpSdW11czoNCg0KXFsNClxoYXR7cH0gPSBcZnJhY3t4fXtufQ0KXF0NCg0KU3Vic3RpdHVzaSBuaWxhaSBkYXJpIHNvYWw6DQoNClxbDQpcaGF0e3B9ID0gXGZyYWN7MTU2fXs0MDB9ID0gMC4zOQ0KXF0NCg0KQXJ0aW55YSwgKiozOSUgcGVuZ2d1bmEqKiBkYWxhbSBla3NwZXJpbWVuIG1lbmdrbGlrIENUQSBiYXJ1Lg0KDQotLS0NCg0KIyMjIOKcj++4jyBTdGVwIDIg4oCTIE1lbmdlY2VrIFN5YXJhdCBQZW5kZWthdGFuIE5vcm1hbA0KDQpTeWFyYXQgcGVuZ2d1bmFhbiBaLWludGVydmFsIHVudHVrIHByb3BvcnNpOg0KDQpcWw0KblxoYXR7cH0gXGdlIDEwIFxxdWFkIFx0ZXh0e2Rhbn0gXHF1YWQgbigxLVxoYXR7cH0pIFxnZSAxMA0KXF0NCg0KQ2VrOg0KDQpcWw0KblxoYXR7cH0gPSA0MDAgXHRpbWVzIDAuMzkgPSAxNTYNClxdDQoNClxbDQpuKDEtXGhhdHtwfSkgPSA0MDAgXHRpbWVzIDAuNjEgPSAyNDQNClxdDQoNCkthcmVuYSBrZWR1YSBuaWxhaSAqKuKJqyAxMCoqLCBtYWthIHBlbmRla2F0YW4gZGlzdHJpYnVzaSBub3JtYWwgKip2YWxpZCBkaWd1bmFrYW4qKi4NCg0KLS0tDQoNCiMjIyDinI/vuI8gU3RlcCAzIOKAkyBNZW5naGl0dW5nIFN0YW5kYXJkIEVycm9yIChTRSkgUHJvcG9yc2kNCg0KU3RhbmRhcmQgRXJyb3IgbWVudW5qdWtrYW4gKipzZWJlcmFwYSBiZXNhciB2YXJpYXNpIGVzdGltYXNpIHByb3BvcnNpIHNhbXBlbCB0ZXJoYWRhcCBwcm9wb3JzaSBwb3B1bGFzaSoqLg0KDQpSdW11czoNCg0KXFsNClNFID0gXHNxcnR7XGZyYWN7XGhhdHtwfSgxLVxoYXR7cH0pfXtufX0NClxdDQoNClN1YnN0aXR1c2kgbmlsYWk6DQoNClxbDQpTRSA9IFxzcXJ0e1xmcmFjezAuMzkoMS0wLjM5KX17NDAwfX0NClxdDQoNClxbDQpTRSA9IFxzcXJ0e1xmcmFjezAuMjM3OX17NDAwfX0NClxdDQoNClxbDQpTRSA9IFxzcXJ0ezAuMDAwNTk0NzV9ID0gMC4wMjQ0DQpcXQ0KDQotLS0NCg0KIyMjIOKcj++4jyBTdGVwIDQg4oCTIE1lbmVudHVrYW4gTmlsYWkgWiBkYXJpIFRhYmVsIERpc3RyaWJ1c2kgTm9ybWFsDQoNCk5pbGFpIFogZGl0ZW50dWthbiBvbGVoIHRpbmdrYXQga2VwZXJjYXlhYW46DQoNCi0gOTAlIOKGkiBcKFogPSAxLjY0NVwpDQotIDk1JSDihpIgXChaID0gMS45NjBcKQ0KLSA5OSUg4oaSIFwoWiA9IDIuNTc2XCkNCg0KLS0tDQoNCiMjIyDinI/vuI8gU3RlcCA1IOKAkyBNZW5naGl0dW5nIE1hcmdpbiBvZiBFcnJvciAoTUUpDQoNClJ1bXVzIE1hcmdpbiBvZiBFcnJvcjoNCg0KXFsNCk1FID0gWiBcdGltZXMgU0UNClxdDQoNCiMjIyMg8J+UuSBDb25maWRlbmNlIExldmVsIDkwJQ0KDQpcWw0KTUVfezkwfSA9IDEuNjQ1IFx0aW1lcyAwLjAyNDQgPSAwLjA0MA0KXF0NCg0KIyMjIyDwn5S5IENvbmZpZGVuY2UgTGV2ZWwgOTUlDQoNClxbDQpNRV97OTV9ID0gMS45NjAgXHRpbWVzIDAuMDI0NCA9IDAuMDQ4DQpcXQ0KDQojIyMjIPCflLkgQ29uZmlkZW5jZSBMZXZlbCA5OSUNCg0KXFsNCk1FX3s5OX0gPSAyLjU3NiBcdGltZXMgMC4wMjQ0ID0gMC4wNjMNClxdDQoNCi0tLQ0KDQojIyMg4pyP77iPIFN0ZXAgNiDigJMgTWVtYmVudHVrIENvbmZpZGVuY2UgSW50ZXJ2YWwgUHJvcG9yc2kNCg0KUnVtdXMgaW50ZXJ2YWwga2VwZXJjYXlhYW46DQoNClxbDQpDSSA9IFxoYXR7cH0gXHBtIE1FDQpcXQ0KDQojIyMjIPCflLkgQ0kgOTAlDQoNClxbDQpDSV97OTB9ID0gMC4zOSBccG0gMC4wNDANClxdDQoNClxbDQpDSV97OTB9ID0gKDAuMzUwLFw7IDAuNDMwKQ0KXF0NCg0KIyMjIyDwn5S5IENJIDk1JQ0KDQpcWw0KQ0lfezk1fSA9IDAuMzkgXHBtIDAuMDQ4DQpcXQ0KDQpcWw0KQ0lfezk1fSA9ICgwLjM0MixcOyAwLjQzOCkNClxdDQoNCiMjIyMg8J+UuSBDSSA5OSUNCg0KXFsNCkNJX3s5OX0gPSAwLjM5IFxwbSAwLjA2Mw0KXF0NCg0KXFsNCkNJX3s5OX0gPSAoMC4zMjcsXDsgMC40NTMpDQpcXQ0KDQpSZW50YW5nIGluaSBtZW51bmp1a2thbiBlc3RpbWFzaSAqKnByb3BvcnNpIHNlYmVuYXJueWEgcGVuZ2d1bmEgeWFuZyBtZW5na2xpayBDVEEgZGkgc2VsdXJ1aCBwb3B1bGFzaSBwZW5nZ3VuYSoqLg0KDQotLS0NCg0KIyMgNO+4j+KDoyBQZXJoaXR1bmdhbiwgVGFiZWwgSGFzaWwsIGRhbiBWaXN1YWxpc2FzaSBNZW5nZ3VuYWthbiBSDQoNCmBgYHtyfQ0KIyBEYXRhIEEvQiBUZXN0aW5nDQpuIDwtIDQwMA0KeCA8LSAxNTYNCg0KIyBTYW1wbGUgcHJvcG9ydGlvbg0KcF9oYXQgPC0geCAvIG4NCg0KIyBTdGFuZGFyZCBFcnJvcg0KU0UgPC0gc3FydCgocF9oYXQgKiAoMSAtIHBfaGF0KSkgLyBuKQ0KDQojIENvbmZpZGVuY2UgTGV2ZWxzDQpjb25mX2xldmVsIDwtIGMoMC45MCwgMC45NSwgMC45OSkNCg0KIyBaIHZhbHVlcw0Kel92YWx1ZSA8LSBxbm9ybSgoMSArIGNvbmZfbGV2ZWwpIC8gMikNCg0KIyBNYXJnaW4gb2YgRXJyb3INCk1FIDwtIHpfdmFsdWUgKiBTRQ0KDQojIENvbmZpZGVuY2UgSW50ZXJ2YWxzDQpsb3dlciA8LSBwX2hhdCAtIE1FDQp1cHBlciA8LSBwX2hhdCArIE1FDQoNCiMgVGFiZWwgaGFzaWwNCkNJX3Jlc3VsdCA8LSBkYXRhLmZyYW1lKA0KICBDb25maWRlbmNlX0xldmVsID0gYygiOTAlIiwgIjk1JSIsICI5OSUiKSwNCiAgWl92YWx1ZSA9IHJvdW5kKHpfdmFsdWUsIDMpLA0KICBNYXJnaW5fb2ZfRXJyb3IgPSByb3VuZChNRSwgMyksDQogIExvd2VyX0JvdW5kID0gcm91bmQobG93ZXIsIDMpLA0KICBVcHBlcl9Cb3VuZCA9IHJvdW5kKHVwcGVyLCAzKQ0KKQ0KDQpDSV9yZXN1bHQNCmBgYA0KDQotLS0NCg0KIyMjIFZpc3VhbGlzYXNpIENvbmZpZGVuY2UgSW50ZXJ2YWwgUHJvcG9yc2kNCg0KYGBge3IgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcud2lkdGg9MTQsIGZpZy5oZWlnaHQ9MTB9DQpwbG90KE5VTEwsDQogICAgIHhsaW0gPSBjKG1pbihsb3dlcikgLSAwLjA1LCBtYXgodXBwZXIpICsgMC4wNSksDQogICAgIHlsaW0gPSBjKDEsIDMpLA0KICAgICB4bGFiID0gIlByb3BvcnRpb24gb2YgQ1RBIENsaWNrcyIsDQogICAgIHlsYWIgPSAiIiwNCiAgICAgeWF4dCA9ICJuIiwNCiAgICAgbWFpbiA9ICJDb25maWRlbmNlIEludGVydmFsIGZvciBDVEEgQ2xpY2stVGhyb3VnaCBSYXRlIikNCg0Kc2VnbWVudHMobG93ZXIsIDE6MywgdXBwZXIsIDE6MywgbHdkID0gMykNCnBvaW50cyhyZXAocF9oYXQsIDMpLCAxOjMsIHBjaCA9IDE5KQ0KYXhpcygyLCBhdCA9IDE6MywgbGFiZWxzID0gQ0lfcmVzdWx0JENvbmZpZGVuY2VfTGV2ZWwpDQpgYGANCg0KLS0tDQoNCiMjIDXvuI/ig6MgSW50ZXJwcmV0YXNpIGRhbGFtIEtvbnRla3MgUHJvZHVrICYgQmlzbmlzDQoNClNlbWFraW4gdGluZ2dpIHRpbmdrYXQga2VwZXJjYXlhYW4sICoqc2VtYWtpbiBsZWJhciBpbnRlcnZhbCBrZXBlcmNheWFhbioqIHlhbmcgZGloYXNpbGthbi4gSGFsIGluaSBtZW5jZXJtaW5rYW4gcGVuaW5na2F0YW4gdGluZ2thdCBrZWhhdGktaGF0aWFuIGRhbGFtIG1lbmdlc3RpbWFzaSBwZXJmb3JtYSBzZWJlbmFybnlhIGRhcmkgc3VhdHUgZWtzcGVyaW1lbi4NCg0KRGFsYW0ga29udGVrcyBla3NwZXJpbWVuIHByb2R1azoNCg0KLSAqKjkwJSBDSSoqIOKGkiBpbnRlcnZhbCBsZWJpaCBzZW1waXQsIGNvY29rIHVudHVrIGtlcHV0dXNhbiBjZXBhdA0KLSAqKjk1JSBDSSoqIOKGkiBtZW1iZXJpa2FuIGtlc2VpbWJhbmdhbiBhbnRhcmEgcmlzaWtvIGRhbiBrZXBhc3RpYW4sIHVtdW0gZGlndW5ha2FuIHVudHVrIGtlcHV0dXNhbiByb2xsb3V0DQotICoqOTklIENJKiog4oaSIHNhbmdhdCBrb25zZXJ2YXRpZiwgdGV0YXBpIHJpc2lrbyBzYWxhaCBrZXB1dHVzYW4gbGViaWgga2VjaWwNCg0KSmlrYSBpbnRlcnZhbCBzZWx1cnVobnlhIGJlcmFkYSBkaSBhdGFzIGJhc2VsaW5lIENUUiBsYW1hLCBtYWthIENUQSBiYXJ1IGRhcGF0IGRpYW5nZ2FwICoqbWVtYmVyaWthbiBwZW5pbmdrYXRhbiBwZXJmb3JtYSB5YW5nIHNpZ25pZmlrYW4qKiBkYW4gbGF5YWsgZGktKnJvbGwgb3V0KiBrZSBzZWx1cnVoIHBlbmdndW5hLg0KDQojIPCfk5ggQ2FzZSBTdHVkeSA0ICANCiMjIFByZWNpc2lvbiBDb21wYXJpc29uOiBaLVRlc3QgdnMgdC1UZXN0IChBUEkgTGF0ZW5jeSkNCg0KLS0tDQoNCiMjIDHvuI/ig6MgU29hbA0KDQpEdWEgdGltIGRhdGEgbWVuZ3VrdXIgKipBUEkgbGF0ZW5jeSAobXMpKiogcGFkYSBrb25kaXNpIGJlcmJlZGEuDQoNCiMjIyDwn5S5IFRlYW0gQQ0KLSBVa3VyYW4gc2FtcGVsOiAgDQogIFxbDQogIG4gPSAzNg0KICBcXQ0KLSBSYXRhLXJhdGEgc2FtcGVsOiAgDQogIFxbDQogIFxiYXJ7eH0gPSAyMTANCiAgXF0NCi0gU3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpIGRpa2V0YWh1aTogIA0KICBcWw0KICBcc2lnbWEgPSAyNA0KICBcXQ0KDQojIyMg8J+UuSBUZWFtIEINCi0gVWt1cmFuIHNhbXBlbDogIA0KICBcWw0KICBuID0gMzYNCiAgXF0NCi0gUmF0YS1yYXRhIHNhbXBlbDogIA0KICBcWw0KICBcYmFye3h9ID0gMjEwDQogIFxdDQotIFN0YW5kYXIgZGV2aWFzaSBwb3B1bGFzaSAqKnRpZGFrIGRpa2V0YWh1aSoqLCBoYW55YSB0ZXJzZWRpYSBzdGFuZGFyIGRldmlhc2kgc2FtcGVsOiAgDQogIFxbDQogIHMgPSAyNA0KICBcXQ0KDQpUdWp1YW4gYW5hbGlzaXMgYWRhbGFoIG1lbWJhbmRpbmdrYW4gKipwcmVzaXNpIGludGVydmFsIGtlcGVyY2F5YWFuKiogeWFuZyBkaWhhc2lsa2FuIG9sZWgga2VkdWEgcGVuZGVrYXRhbi4NCg0KLS0tDQoNCiMjIDLvuI/ig6MgTWV0b2RlIFN0YXRpc3RpayB5YW5nIERpZ3VuYWthbg0KDQojIyMg4pyFIFRlYW0gQSDihpIgKipaLUludGVydmFsKioNCkRpZ3VuYWthbiBrYXJlbmE6DQoNCi0gU3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpIChcKFxzaWdtYVwpKSBkaWtldGFodWkNCi0gVWt1cmFuIHNhbXBlbCBjdWt1cCBiZXNhcg0KDQojIyMg4pyFIFRlYW0gQiDihpIgKip0LUludGVydmFsKioNCkRpZ3VuYWthbiBrYXJlbmE6DQoNCi0gU3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpICoqdGlkYWsgZGlrZXRhaHVpKioNCi0gVmFyaWFiaWxpdGFzIGRpZXN0aW1hc2kgZGFyaSBzYW1wZWwgKFwoc1wpKQ0KDQotLS0NCg0KIyMgM++4j+KDoyBQZXJoaXR1bmdhbiBTdGVwLWJ5LVN0ZXAgKFBlcmhpdHVuZ2FuIE55YXRhIGRhcmkgU29hbCkNCg0KLS0tDQoNCiMjIyDinI/vuI8gU3RlcCAxIOKAkyBNZW5lbnR1a2FuIFN0YW5kYXJkIEVycm9yIChTRSkNCg0KIyMjIyDwn5S5IFRlYW0gQSAoWi1UZXN0KQ0KDQpSdW11czoNCg0KXFsNClNFX0EgPSBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fQ0KXF0NCg0KU3Vic3RpdHVzaSBuaWxhaToNCg0KXFsNClNFX0EgPSBcZnJhY3syNH17XHNxcnR7MzZ9fSA9IFxmcmFjezI0fXs2fSA9IDQNClxdDQoNCi0tLQ0KDQojIyMjIPCflLkgVGVhbSBCICh0LVRlc3QpDQoNClJ1bXVzOg0KDQpcWw0KU0VfQiA9IFxmcmFje3N9e1xzcXJ0e259fQ0KXF0NCg0KU3Vic3RpdHVzaSBuaWxhaToNCg0KXFsNClNFX0IgPSBcZnJhY3syNH17XHNxcnR7MzZ9fSA9IFxmcmFjezI0fXs2fSA9IDQNClxdDQoNCuKeoe+4jyAqKk5pbGFpIFNFIHNhbWEqKiwga2FyZW5hIFwocyA9IFxzaWdtYVwpIGRhbiBcKG5cKSBzYW1hLg0KDQotLS0NCg0KIyMjIOKcj++4jyBTdGVwIDIg4oCTIE1lbmVudHVrYW4gTmlsYWkgS3JpdGlzIChaIGRhbiB0KQ0KDQojIyMjIPCflLkgTmlsYWkgWiAoRGlzdHJpYnVzaSBOb3JtYWwpDQoNCi0gOTAlIOKGkiBcKFogPSAxLjY0NVwpDQotIDk1JSDihpIgXChaID0gMS45NjBcKQ0KLSA5OSUg4oaSIFwoWiA9IDIuNTc2XCkNCg0KPGltZyBpZD0iRm90byIgc3JjPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYWRpbmRhYWRlbGlhZnV0cmk2LWdpZi9kaXN0cmlidXNpLXovbWFpbi9kaXN0cmlidXNpLXouanBlZyIgYWx0PSJMb2dvIiBzdHlsZT0id2lkdGg6MjAwcHg7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87Ij4NCg0KLS0tDQoNCiMjIyMg8J+UuSBOaWxhaSB0IChEaXN0cmlidXNpIHQpDQoNCkRlcmFqYXQga2ViZWJhc2FuOg0KDQpcWw0KZGYgPSBuIC0gMSA9IDM1DQpcXQ0KDQotIDkwJSDihpIgXCh0ID0gMS42OTBcKQ0KLSA5NSUg4oaSIFwodCA9IDIuMDMwXCkNCi0gOTklIOKGkiBcKHQgPSAyLjcyNFwpDQoNCjxpbWcgaWQ9IkZvdG8iIHNyYz0iaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2FkaW5kYWFkZWxpYWZ1dHJpNi1naWYvZGlzdHJpYnVzaS10L21haW4vZGlzdHJpYnVzaS10LnBuZyIgYWx0PSJMb2dvIiBzdHlsZT0id2lkdGg6MjAwcHg7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87Ij4NCg0KLS0tDQoNCiMjIyDinI/vuI8gU3RlcCAzIOKAkyBNZW5naGl0dW5nIE1hcmdpbiBvZiBFcnJvciAoTUUpDQoNClJ1bXVzIHVtdW06DQoNClxbDQpNRSA9IFx0ZXh0e25pbGFpIGtyaXRpc30gXHRpbWVzIFNFDQpcXQ0KDQotLS0NCg0KIyMjIyDwn5S5IFRlYW0gQSAoWi1JbnRlcnZhbCkNCg0KLSA5MCUgIA0KXFsNCk1FX3s5MH0gPSAxLjY0NSBcdGltZXMgNCA9IDYuNTgNClxdDQoNCi0gOTUlICANClxbDQpNRV97OTV9ID0gMS45NjAgXHRpbWVzIDQgPSA3Ljg0DQpcXQ0KDQotIDk5JSAgDQpcWw0KTUVfezk5fSA9IDIuNTc2IFx0aW1lcyA0ID0gMTAuMzANClxdDQoNCi0tLQ0KDQojIyMjIPCflLkgVGVhbSBCICh0LUludGVydmFsKQ0KDQotIDkwJSAgDQpcWw0KTUVfezkwfSA9IDEuNjkwIFx0aW1lcyA0ID0gNi43Ng0KXF0NCg0KLSA5NSUgIA0KXFsNCk1FX3s5NX0gPSAyLjAzMCBcdGltZXMgNCA9IDguMTINClxdDQoNCi0gOTklICANClxbDQpNRV97OTl9ID0gMi43MjQgXHRpbWVzIDQgPSAxMC45MA0KXF0NCg0KLS0tDQoNCiMjIyDinI/vuI8gU3RlcCA0IOKAkyBNZW1iZW50dWsgQ29uZmlkZW5jZSBJbnRlcnZhbA0KDQpSdW11czoNCg0KXFsNCkNJID0gXGJhcnt4fSBccG0gTUUNClxdDQoNCi0tLQ0KDQojIyMjIPCflLkgVGVhbSBBIChaLVRlc3QpDQoNCi0gOTAlIOKGkiAoMjAzLjQyICwgMjE2LjU4KQ0KLSA5NSUg4oaSICgyMDIuMTYgLCAyMTcuODQpDQotIDk5JSDihpIgKDE5OS43MCAsIDIyMC4zMCkNCg0KLS0tDQoNCiMjIyMg8J+UuSBUZWFtIEIgKHQtVGVzdCkNCg0KLSA5MCUg4oaSICgyMDMuMjQgLCAyMTYuNzYpDQotIDk1JSDihpIgKDIwMS44OCAsIDIxOC4xMikNCi0gOTklIOKGkiAoMTk5LjEwICwgMjIwLjkwKQ0KDQotLS0NCg0KIyMgNO+4j+KDoyBQZXJoaXR1bmdhbiwgVGFiZWwgSGFzaWwsIGRhbiBWaXN1YWxpc2FzaSBNZW5nZ3VuYWthbiBSDQoNCmBgYHtyfQ0KIyBQYXJhbWV0ZXINCm4gPC0gMzYNCnhfYmFyIDwtIDIxMA0Kc2lnbWEgPC0gMjQNCnMgPC0gMjQNCg0KIyBTdGFuZGFyZCBFcnJvcg0KU0UgPC0gc2lnbWEgLyBzcXJ0KG4pDQoNCiMgQ29uZmlkZW5jZSBMZXZlbHMNCmNvbmZfbGV2ZWwgPC0gYygwLjkwLCAwLjk1LCAwLjk5KQ0KDQojIFogYW5kIHQgdmFsdWVzDQp6X3ZhbHVlIDwtIHFub3JtKCgxICsgY29uZl9sZXZlbCkgLyAyKQ0KdF92YWx1ZSA8LSBxdCgoMSArIGNvbmZfbGV2ZWwpIC8gMiwgZGYgPSBuIC0gMSkNCg0KIyBNYXJnaW4gb2YgRXJyb3INCk1FX3ogPC0gel92YWx1ZSAqIFNFDQpNRV90IDwtIHRfdmFsdWUgKiBTRQ0KDQojIENvbmZpZGVuY2UgSW50ZXJ2YWxzDQpsb3dlcl96IDwtIHhfYmFyIC0gTUVfeg0KdXBwZXJfeiA8LSB4X2JhciArIE1FX3oNCg0KbG93ZXJfdCA8LSB4X2JhciAtIE1FX3QNCnVwcGVyX3QgPC0geF9iYXIgKyBNRV90DQoNCiMgVGFiZWwgaGFzaWwNCkNJX3Jlc3VsdCA8LSBkYXRhLmZyYW1lKA0KICBUZXN0ID0gcmVwKGMoIlotVGVzdCIsICJ0LVRlc3QiKSwgZWFjaCA9IDMpLA0KICBDb25maWRlbmNlX0xldmVsID0gcmVwKGMoIjkwJSIsICI5NSUiLCAiOTklIiksIDIpLA0KICBMb3dlcl9Cb3VuZCA9IHJvdW5kKGMobG93ZXJfeiwgbG93ZXJfdCksIDIpLA0KICBVcHBlcl9Cb3VuZCA9IHJvdW5kKGModXBwZXJfeiwgdXBwZXJfdCksIDIpDQopDQoNCkNJX3Jlc3VsdA0KYGBgDQoNCi0tLQ0KDQojIyMgVmlzdWFsaXNhc2kgUGVyYmFuZGluZ2FuIEludGVydmFsDQoNCmBgYHtyIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLndpZHRoPTE0LCBmaWcuaGVpZ2h0PTEwfQ0KcGxvdChOVUxMLA0KICAgICB4bGltID0gYyhtaW4obG93ZXJfdCkgLSAyLCBtYXgodXBwZXJfdCkgKyAyKSwNCiAgICAgeWxpbSA9IGMoMSwgNiksDQogICAgIHhsYWIgPSAiQVBJIExhdGVuY3kgKG1zKSIsDQogICAgIHlsYWIgPSAiIiwNCiAgICAgeWF4dCA9ICJuIiwNCiAgICAgbWFpbiA9ICJDb21wYXJpc29uIG9mIFotVGVzdCBhbmQgdC1UZXN0IENvbmZpZGVuY2UgSW50ZXJ2YWxzIikNCg0Kc2VnbWVudHMobG93ZXJfeiwgMTozLCB1cHBlcl96LCAxOjMsIGx3ZCA9IDMpDQpzZWdtZW50cyhsb3dlcl90LCA0OjYsIHVwcGVyX3QsIDQ6NiwgbHdkID0gMykNCg0KcG9pbnRzKHJlcCh4X2JhciwgNiksIDE6NiwgcGNoID0gMTkpDQoNCmF4aXMoMiwNCiAgICAgYXQgPSAxOjYsDQogICAgIGxhYmVscyA9IGMoIlogOTAlIiwgIlogOTUlIiwgIlogOTklIiwNCiAgICAgICAgICAgICAgICAidCA5MCUiLCAidCA5NSUiLCAidCA5OSUiKSkNCmBgYA0KDQotLS0NCg0KIyMgNe+4j+KDoyBJbnRlcnByZXRhc2kgQWtoaXINCg0KV2FsYXVwdW4ga2VkdWEgdGltIG1lbmdndW5ha2FuIGRhdGEgeWFuZyAqKnNhbmdhdCBtaXJpcCoqLCBpbnRlcnZhbCBrZXBlcmNheWFhbiBkYXJpICoqdC10ZXN0IHNlbGFsdSBsZWJpaCBsZWJhcioqIGRpYmFuZGluZ2thbiBaLXRlc3QuDQoNCkhhbCBpbmkgdGVyamFkaSBrYXJlbmE6DQoNCi0gRGlzdHJpYnVzaSB0IG1lbXBlcmhpdHVuZ2thbiAqKmtldGlkYWtwYXN0aWFuIHRhbWJhaGFuKiogYWtpYmF0IGVzdGltYXNpIHN0YW5kYXIgZGV2aWFzaSBkYXJpIHNhbXBlbA0KLSBOaWxhaSBrcml0aXMgdCAqKmxlYmloIGJlc2FyKiogZGFyaXBhZGEgWiwgdGVydXRhbWEgcGFkYSBjb25maWRlbmNlIGxldmVsIHRpbmdnaQ0KDQpEYWxhbSBwcmFrdGlrIGFuYWxpdGlrOg0KDQotIFotdGVzdCBtZW1iZXJpa2FuIGludGVydmFsIGxlYmloIHNlbXBpdCAoKipsZWJpaCBwcmVzaXNpKiopIGppa2EgXChcc2lnbWFcKSBkaWtldGFodWkNCi0gdC10ZXN0IGxlYmloIGtvbnNlcnZhdGlmIGRhbiAqKmxlYmloIGFtYW4qKiBzYWF0IFwoXHNpZ21hXCkgdGlkYWsgZGlrZXRhaHVpDQoNCg0KDQojIPCfk5ggQ2FzZSBTdHVkeSA1ICANCiMjIE9uZS1TaWRlZCBDb25maWRlbmNlIEludGVydmFsIChMb3dlciBCb3VuZCkg4oCTIFByZW1pdW0gRmVhdHVyZSBVc2FnZQ0KDQotLS0NCg0KIyMgMe+4j+KDoyBTb2FsDQoNClNlYnVhaCBwZXJ1c2FoYWFuICoqU2FhUyoqIGluZ2luIG1lbWFzdGlrYW4gYmFod2EgKiptaW5pbWFsIDcwJSBwZW5nZ3VuYSBha3RpZiBtaW5nZ3VhbioqIG1lbmdndW5ha2FuIGZpdHVyIHByZW1pdW0uDQoNCkRhcmkgaGFzaWwgZWtzcGVyaW1lbiBkaXBlcm9sZWg6DQoNCi0gVG90YWwgcGVuZ2d1bmE6ICANCiAgXFsNCiAgbiA9IDI1MA0KICBcXQ0KLSBQZW5nZ3VuYSBha3RpZiBwcmVtaXVtOiAgDQogIFxbDQogIHggPSAxODUNCiAgXF0NCg0KTWFuYWplbWVuICoqaGFueWEgdGVydGFyaWsgcGFkYSBiYXRhcyBiYXdhaCoqIGVzdGltYXNpIHByb3BvcnNpLg0KDQotLS0NCg0KIyMgMu+4j+KDoyBKZW5pcyBDb25maWRlbmNlIEludGVydmFsIGRhbiBNZXRvZGUNCg0KTWV0b2RlIHlhbmcgZGlndW5ha2FuIGFkYWxhaCAqKk9uZS1TaWRlZCAoTG93ZXIpIENvbmZpZGVuY2UgSW50ZXJ2YWwgdW50dWsgUHJvcG9yc2kqKiAgDQptZW5nZ3VuYWthbiAqKnBlbmRla2F0YW4gZGlzdHJpYnVzaSBub3JtYWwgKFotaW50ZXJ2YWwpKiouDQoNCioqQWxhc2FuIHNlc3VhaSBzb2FsOioqDQoNCi0gRGF0YSBiZXJiZW50dWsgcHJvcG9yc2kgKHBha2FpIC8gdGlkYWsgcGFrYWkpDQotIFVrdXJhbiBzYW1wZWwgYmVzYXINCi0gRm9rdXMga2VwdXR1c2FuIGhhbnlhIHBhZGEgKipiYXRhcyBiYXdhaCoqLCBidWthbiBkdWEgc2lzaQ0KDQotLS0NCg0KIyMgM++4j+KDoyBQZXJoaXR1bmdhbiBTdGVwLWJ5LVN0ZXAgKFBlcmhpdHVuZ2FuIE55YXRhIGRhcmkgU29hbCkNCg0KLS0tDQoNCiMjIyDinI/vuI8gU3RlcCAxIOKAkyBNZW5naGl0dW5nIFByb3BvcnNpIFNhbXBlbCAoXChcaGF0e3B9XCkpDQoNClByb3BvcnNpIHNhbXBlbCBtZW51bmp1a2thbiAqKnBlcnNlbnRhc2UgcGVuZ2d1bmEgeWFuZyBtZW1ha2FpIGZpdHVyIHByZW1pdW0qKi4NCg0KUnVtdXM6DQpcWw0KXGhhdHtwfSA9IFxmcmFje3h9e259DQpcXQ0KDQpTdWJzdGl0dXNpIG5pbGFpIGRhcmkgc29hbDoNClxbDQpcaGF0e3B9ID0gXGZyYWN7MTg1fXsyNTB9ID0gMC43NA0KXF0NCg0KQXJ0aW55YSwgKio3NCUgcGVuZ2d1bmEqKiBkYWxhbSBla3NwZXJpbWVuIG1lbmdndW5ha2FuIGZpdHVyIHByZW1pdW0uDQoNCi0tLQ0KDQojIyMg4pyP77iPIFN0ZXAgMiDigJMgTWVuZ2VjZWsgU3lhcmF0IFBlbmRla2F0YW4gTm9ybWFsDQoNClN5YXJhdDoNClxbDQpuXGhhdHtwfSBcZ2UgMTAgXHF1YWQgXHRleHR7ZGFufSBccXVhZCBuKDEtXGhhdHtwfSkgXGdlIDEwDQpcXQ0KDQpDZWs6DQpcWw0KblxoYXR7cH0gPSAyNTAgXHRpbWVzIDAuNzQgPSAxODUNClxdDQpcWw0KbigxLVxoYXR7cH0pID0gMjUwIFx0aW1lcyAwLjI2ID0gNjUNClxdDQoNCkthcmVuYSBrZWR1YSBuaWxhaSBqYXVoIGRpIGF0YXMgMTAsIHBlbmRla2F0YW4gbm9ybWFsICoqdmFsaWQgZGlndW5ha2FuKiouDQoNCi0tLQ0KDQojIyMg4pyP77iPIFN0ZXAgMyDigJMgTWVuZ2hpdHVuZyBTdGFuZGFyZCBFcnJvciAoU0UpDQoNClJ1bXVzOg0KXFsNClNFID0gXHNxcnR7XGZyYWN7XGhhdHtwfSgxLVxoYXR7cH0pfXtufX0NClxdDQoNClN1YnN0aXR1c2k6DQpcWw0KU0UgPSBcc3FydHtcZnJhY3swLjc0KDEtMC43NCl9ezI1MH19DQpcXQ0KXFsNClNFID0gXHNxcnR7XGZyYWN7MC4xOTI0fXsyNTB9fQ0KXF0NClxbDQpTRSA9IFxzcXJ0ezAuMDAwNzY5Nn0gPSAwLjAyNzcNClxdDQoNCi0tLQ0KDQojIyMg4pyP77iPIFN0ZXAgNCDigJMgTWVuZW50dWthbiBOaWxhaSBaIChPbmUtU2lkZWQpDQoNCkthcmVuYSBpbnRlcnZhbCAqKnNhdHUgc2lzaSAobG93ZXIgYm91bmQpKiosIG5pbGFpIFogYWRhbGFoOg0KDQotIDkwJSDihpIgXChaID0gMS4yODJcKQ0KLSA5NSUg4oaSIFwoWiA9IDEuNjQ1XCkNCi0gOTklIOKGkiBcKFogPSAyLjMzMFwpDQoNCg0KLS0tDQoNCiMjIyDinI/vuI8gU3RlcCA1IOKAkyBNZW5naGl0dW5nIExvd2VyIEJvdW5kIENvbmZpZGVuY2UgSW50ZXJ2YWwNCg0KUnVtdXMgKipvbmUtc2lkZWQgbG93ZXIgQ0kqKjoNClxbDQpDSV97bG93ZXJ9ID0gXGhhdHtwfSAtIFogXHRpbWVzIFNFDQpcXQ0KDQotLS0NCg0KIyMjIyDwn5S5IExvd2VyIENJIDkwJQ0KDQpcWw0KQ0lfezkwfSA9IDAuNzQgLSAoMS4yODIgXHRpbWVzIDAuMDI3NykNClxdDQpcWw0KQ0lfezkwfSA9IDAuNzQgLSAwLjAzNTUgPSAwLjcwNDUNClxdDQoNCi0tLQ0KDQojIyMjIPCflLkgTG93ZXIgQ0kgOTUlDQoNClxbDQpDSV97OTV9ID0gMC43NCAtICgxLjY0NSBcdGltZXMgMC4wMjc3KQ0KXF0NClxbDQpDSV97OTV9ID0gMC43NCAtIDAuMDQ1NiA9IDAuNjk0NA0KXF0NCg0KLS0tDQoNCiMjIyMg8J+UuSBMb3dlciBDSSA5OSUNCg0KXFsNCkNJX3s5OX0gPSAwLjc0IC0gKDIuMzMwIFx0aW1lcyAwLjAyNzcpDQpcXQ0KXFsNCkNJX3s5OX0gPSAwLjc0IC0gMC4wNjQ2ID0gMC42NzU0DQpcXQ0KDQotLS0NCg0KIyMgNO+4j+KDoyBQZXJoaXR1bmdhbiwgVGFiZWwgSGFzaWwsIGRhbiBWaXN1YWxpc2FzaSBNZW5nZ3VuYWthbiBSDQoNCmBgYHtyfQ0KIyBEYXRhIFNhYVMNCm4gPC0gMjUwDQp4IDwtIDE4NQ0KDQojIFNhbXBsZSBwcm9wb3J0aW9uDQpwX2hhdCA8LSB4IC8gbg0KDQojIFN0YW5kYXJkIEVycm9yDQpTRSA8LSBzcXJ0KChwX2hhdCAqICgxIC0gcF9oYXQpKSAvIG4pDQoNCiMgQ29uZmlkZW5jZSBMZXZlbHMgKG9uZS1zaWRlZCkNCmNvbmZfbGV2ZWwgPC0gYygwLjkwLCAwLjk1LCAwLjk5KQ0KDQojIFogdmFsdWVzIGZvciBvbmUtc2lkZWQgQ0kNCnpfdmFsdWUgPC0gcW5vcm0oY29uZl9sZXZlbCkNCg0KIyBMb3dlciBCb3VuZCBDSQ0KbG93ZXJfYm91bmQgPC0gcF9oYXQgLSB6X3ZhbHVlICogU0UNCg0KIyBUYWJlbCBoYXNpbA0KQ0lfcmVzdWx0IDwtIGRhdGEuZnJhbWUoDQogIENvbmZpZGVuY2VfTGV2ZWwgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLA0KICBaX3ZhbHVlID0gcm91bmQoel92YWx1ZSwgMyksDQogIExvd2VyX0JvdW5kID0gcm91bmQobG93ZXJfYm91bmQsIDMpDQopDQoNCkNJX3Jlc3VsdA0KYGBgDQoNCi0tLQ0KDQojIyMgVmlzdWFsaXNhc2kgTG93ZXIgQm91bmQgQ29uZmlkZW5jZSBJbnRlcnZhbA0KDQpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy53aWR0aD0xNCwgZmlnLmhlaWdodD0xMH0NCnBsb3QoTlVMTCwNCiAgICAgeGxpbSA9IGMobWluKGxvd2VyX2JvdW5kKSAtIDAuMDUsIHBfaGF0ICsgMC4wMiksDQogICAgIHlsaW0gPSBjKDEsIDMpLA0KICAgICB4bGFiID0gIlByb3BvcnRpb24gb2YgUHJlbWl1bSBVc2VycyIsDQogICAgIHlsYWIgPSAiIiwNCiAgICAgeWF4dCA9ICJuIiwNCiAgICAgbWFpbiA9ICJPbmUtU2lkZWQgTG93ZXIgQ29uZmlkZW5jZSBJbnRlcnZhbCIpDQoNCnNlZ21lbnRzKGxvd2VyX2JvdW5kLCAxOjMsIHBfaGF0LCAxOjMsIGx3ZCA9IDMpDQpwb2ludHMocmVwKHBfaGF0LCAzKSwgMTozLCBwY2ggPSAxOSkNCmFibGluZSh2ID0gMC43MCwgbHR5ID0gMikNCg0KYXhpcygyLCBhdCA9IDE6MywgbGFiZWxzID0gQ0lfcmVzdWx0JENvbmZpZGVuY2VfTGV2ZWwpDQpgYGANCg0KLS0tDQoNCiMjIDXvuI/ig6MgS2VwdXR1c2FuIEJpc25pczogQXBha2FoIFRhcmdldCA3MCUgVGVyY2FwYWk/DQoNCi0gKio5MCUgQ0kqKiDihpIgbG93ZXIgYm91bmQgPSAqKjAuNzA0NSoqIOKchSAgDQotICoqOTUlIENJKiog4oaSIGxvd2VyIGJvdW5kID0gKiowLjY5NDQqKiDinYwgIA0KLSAqKjk5JSBDSSoqIOKGkiBsb3dlciBib3VuZCA9ICoqMC42NzU0Kiog4p2MICANCg0KIyMjIPCfk4wgS2VzaW1wdWxhbg0KLSBQYWRhICoqY29uZmlkZW5jZSBsZXZlbCA5MCUqKiwgdGFyZ2V0ICoqNzAlIHBlbmdndW5hIHByZW1pdW0gdGVyY2FwYWkgc2VjYXJhIHN0YXRpc3RpayoqDQotIFBhZGEgKio5NSUgZGFuIDk5JSoqLCB0YXJnZXQgKipiZWx1bSBkYXBhdCBkaXBhc3Rpa2FuKioNCg0KU2VtYWtpbiB0aW5nZ2kgdGluZ2thdCBrZXBlcmNheWFhbiwgc2VtYWtpbiAqKmtvbnNlcnZhdGlmIGtlcHV0dXNhbiBiaXNuaXMqKiB5YW5nIGRpYW1iaWwuDQo=