Pendahuluan
Insight
Dataset ini diambil dari data penjualan Coffee Chain dan telah difilter
khusus untuk negara bagian Florida. Selanjutnya, dilakukan pengambilan
sampel sebanyak 25 observasi secara acak untuk setiap jenis produk.
Jenis produk yang dianalisis terdiri dari empat kategori yaitu
Coffee, Espresso, Herbal Tea, dan Tea. Total data yang
dianalisis berjumlah 100 observasi. Setiap jenis produk terdiri dari 25
sampel, sehingga distribusi data antar kategori merata.Uji yang akan
dilakukan pada observasi ini adalah uji analisis variansi satu
arah(one way ANOVA). Tujuan dari uji ANAVA adalah untuk
mengetahui apakah terdapat perbedaan rata-rata penjualan yang signifikan
antara keempat jenis produk di Florida. Dengan demikian, perusahaan
dapat mengidentifikasi apakah jenis produk tertentu memiliki performa
penjualan yang lebih tinggi dibandingkan yang lain secara statistik.
Uji Analisis Variansi Satu Arah
Analisis variansi (ANAVA) adalah suatu metode analisis statistik yang
termasuk ke dalam cabang statistika inferensial. Analisis variansi
digunakan untuk menguji perbedaan nilai rata-rata dari dua kelompok data
atau lebih. Analisis variansi satu arah (One-Way ANOVA)
merupakan teknik analisis yang digunakan untuk menguji perbedaan nilai
rata-rata dari beberapa kelompok data yang dipengaruhi oleh satu faktor
perlakuan. Asumsi yang harus terpenuhi sebelum melakukan uji anova
adalah:
-
Normalitas : residu setiap kelompok perlakuan dalam populasi harus
berdistribusi normal.
-
Homogenitas : variabilitas data pada setiap kelompok perlakuan dalam
populasi haruslah relatif sama.
Model Matematis
Model linier analisis variansi satu arah (one-way ANOVA) yaitu:
\[Y_{ij}= \mu+ \tau_i+
\varepsilon_{ij}\] dimana:
-
\(Y_{ij}\) = Nilai pengamatan ke-\(j\) dalam perlakuan (kelompok) ke-\(i\)
-
\(\mu_i\) = Rata-rata umum dari
keseluruhan populasi
-
\(\tau_i\) = Efek perlakuan ke-\(i\),yaitu penyimpangan dari rata-rata
perlakuan ke-\(i\) terhadap rata-rata
umum
-
\(\varepsilon_{ij}\) = Galat
(error) pengamatan ke-\(j\)
dalam perlakuan ke-\(i\)
-
\(i=1,2,3,...,k\) (\(k\) adalah jumlah perlakuan/kelompok)
-
\(j=1,2,3,...,n_i\) (\(n_i\) adalah jumlah pengamatan dalam
perlakuan ke-\(i\))
Tabel ANAVA
Menguji hipotesis yang telah dirumuskan dapat dilakukan dengan
menggunakan analisis variansi satu arah terhadap data yang ingin
dianalisis. Analisis ini memiliki tujuan untuk mengevaluasi perbedaan
rata-rata antar kelompok perlakuan. Hasil perhitungan analisis variansi
satu arah ditampilkan dalam tabel berikut.
|
Sumber.Keragaman
|
Derajat.Kebebasan
|
Jumlah.Kuadrat
|
Rata.rata.Kuadrat
|
F.Hitung
|
|
Perlakuan
|
\(k - 1\)
|
\(JKP =
\frac{y_{i.}^2}{n_i}-\frac{y_{..}^2}{N}\)
|
\(RKP = \frac{JKP}{k-1}\)
|
\(\frac{RKP}{RKS}\)
|
|
Sesatan
|
\(N - k\)
|
\(JKS = JKT - JKP\)
|
\(RKS = \frac{JKS}{N-k}\)
|
|
|
Total
|
\(N - 1\)
|
\(JKT = \sum_{i=1}^{k} y_{ij}^2
-\frac{y_{..}^2}{N}\)
|
|
|
Uji Tukey
Uji Tukey sering juga disebut dengan uji beda nyata jujur (BNJ) atau
atau Honest Significant Difference (HSD) test,
diperkenalkan oleh Tukey pada tahun 1953. Uji Tukey digunakan untuk
membandingkan seluruh pasangan rata-rata perlakuan setelah uji Analisis
variansi dilakukan. Uji Tukey dilakukan dilakukan jika hasil dari tabel
ANAVA ditolak yang menyatakan bahwa terdapat peredaan yang signifikan
sehingga untuk mengetahui kelompok mana yang memiliki perbedaan
rata-rata yang signifikan dilakukan uji Tukey. Metode ini
memperhitungkan tingkat kesalahan eksperimen secara keseluruhan
(experiment-wise error rate) sehingga lebih tepat untuk
perbandingan simultan antara banyak kelompok.
Hasil dan Pemahasan
Library
Berikut merupakan library yang diperlukan dalam membantu dalam melakukan
analisis data.
library(readxl)
library(dplyr)
library(car)
library(knitr)
library(ggplot2)
library(DT)
library(kableExtra)
Data
Data yang digunakan merupakan sampel dari data penjualan Coffee Chain
pada negara bagian Florida. Data terdiri dari 100 observasi yang diambil
secara acak, dengan pembagian merata yaitu 25 observasi untuk setiap
kategori produk, yaitu Coffee, Espresso, Herbal Tea, dan
Tea. Dataset lengkapnya dapat diakses pada
Chain
Coffe Dataset.
set.seed(345)
data <- read_excel("D:/SIM/3. CM1 - Coffee Chain Datasets.xlsx") %>%
filter(State == "Florida") %>%
select(Product_Type = `Product Type`, Sales) %>%
group_by(Product_Type) %>%
sample_n(25)
DT::datatable(data,
filter = 'top',
options = list(
pageLength = 10,
lengthMenu = c(10, 20, 25, 50, 100)
),
caption = 'Data Penjualan Coffee Chain di Florida')
Analisis Deskriptif
Statistika Deskriptif
Pada langkah ini, dilakukan penghitungan statistika deskriptif untuk
empat Product Type, yaitu Coffee, Espresso,
Herbal Tea, dan Tea. Statistika deskriptif ini
memberikan gambaran tentang sebaran dan karakteristik data pada
variabel-variabel tersebut.
sumarry <- data %>%
mutate(row = row_number()) %>%
ungroup() %>%
pivot_wider(names_from = Product_Type, values_from = Sales) %>%
select(-row)
summary(sumarry)
## Coffee Espresso Herbal Tea Tea
## Min. :197 Min. :180.0 Min. : 54.0 Min. : 75.0
## 1st Qu.:218 1st Qu.:201.0 1st Qu.:110.0 1st Qu.: 88.0
## Median :235 Median :221.0 Median :129.0 Median :113.0
## Mean :245 Mean :221.1 Mean :128.2 Mean :111.1
## 3rd Qu.:277 3rd Qu.:234.0 3rd Qu.:154.0 3rd Qu.:129.0
## Max. :341 Max. :294.0 Max. :194.0 Max. :154.0
Boxplot
Boxplot akan membantu dalam memvisualisasi distribusi penjualan
berdasarkan jenis produk. boxplot membantu dalam mengidentifikasi median
penjualan, rentang interkuartil, dan nilai minimum serta nilai maksimum
penjualan untuk setiap jenis produk. Visualisasi dibawah ini merupakan
perbandingan langsung pola penjualan Coffee, Espresso,
Herbal Tea, dan Tea.
ggplot(data, aes(x = Product_Type, y = Sales)) +
geom_boxplot(fill = "#6BAE52", color = "#347928") +
labs(title = "Boxplot Sales per Product Type",
x = "Product Type",
y = "Sales") +
theme_minimal()

Uji Asumsi
Uji Normalitas (Saphiro-Wilk)
Dilakukan uji normalitas residu pada model anava.
-
Hipotesis
\(H_0=\)
Data berdistribusi normal
\(H_1=\)
Data tidak berdistribusi normal
-
Tingkat Signifikansi
\(\alpha=0.05\)
-
Daerah Kritis
\(H_0\) ditolak jika \(P-value<\alpha\)
-
Statistik Uji
Menggunakan shapiro.test() untuk menguji normalitas residu
pada model anava.
anava <- aov(Sales ~ Product_Type, data = data)
shapiro.test(anava$residuals)
##
## Shapiro-Wilk normality test
##
## data: anava$residuals
## W = 0.99232, p-value = 0.8442
-
Kesimpulan
\(P-value = 0.8442 > 0.05\) sehingga
\(H_0\) gagal ditolak, yang berarti
data berdistribusi normal dan uji asumsi normalitas
terpenuhi.
Uji Homogenitas
DIlakukan uji homogenitas pada data.
-
Hipotesis
\(H_0=\)
Varians penjualan keempat jenis produk (Coffee,
Espresso, Herbal Tea, dan Tea) di Florida
adalah homogen (sama).
\(H_1=\)Varians penjualan keempat jenis
produk (Coffee, Espresso, Herbal Tea, dan
Tea) di Florida tidak homogen (berbeda).
-
Tingkat Signifikansi
\(\alpha=0.05\)
-
Daerah Kritis
\(H_0\) ditolak jika \(P-value<\alpha\)
-
Statistik Uji
Untuk menguji hmogenitas dapat menggunakan leveneTest().
leveneTest(Sales ~ factor(Product_Type) ,data=data)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 3 1.8529 0.1428
## 96
-
Kesimpulan
\(P-value=0.1428>0.05\), sehingga
\(H_0\) gagal ditolak, maka Varians
penjualan keempat jenis produk (Coffee, Espresso,
Herbal Tea, dan Tea) di Florida adalah homogen (sama).
Uji asumsi homogenitas terpenuhi.
Uji ANAVA
Dilakukan uji analisis variansi satu arah adalah untuk menganalisis
apakah terdapat perbedaan signifikan pada tingkat penjualan
(sales) antara empat jenis produk yaitu Coffee,
Espresso, Herbal Tea, dan Tea di negara
bagian Florida.Dipilih uji ANAVA karena memiliki kemampuan untuk
membandingkan rata-rata penjualan ldari lebih 2 kelompok produk. Berikut
langkah-langkah pengujian hipotesis.
-
Hipotesis
\(H_0=\)Tidak terdapat perbedaan yang
signifikan pada rata-rata penjualan antara keempat jenis produk
(Coffee, Espresso, Herbal Tea, dan
Tea) di negara bagian Florida.
\(H_1=\)Terdapat perbedaan yang signifikan
pada rata-rata penjualan antara keempat jenis produk (Coffee,
Espresso, Herbal Tea, dan Tea) di negara
bagian Florida.
-
Tingkat signifikansi
\(\alpha=0.05\)
-
Daerah Kritis
\(H_0\) ditolak jika \(F_{hitung}>F_{tabel}\) atau \(P_{value}<0.05\)
-
Statistik Uji
telah didapatkan model anava sebelumnya, untuk mendapatkan hasil tabel
ANAVA dapat diperoleh dengansummary()
## Df Sum Sq Mean Sq F value Pr(>F)
## Product_Type 3 332497 110832 99.94 <2e-16 ***
## Residuals 96 106460 1109
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
-
Kesimpulan
\(P_{value}<0.05\) sehingga \(H_0\) ditolak, yang
berarti terdapat perbedaan yang signifikan pada rata-rata penjualan
antara keempat jenis produk (Coffee, Espresso,
Herbal Tea, dan Tea) di negara bagian Florida.
Melalui kesimpulan yang telah didapatkan yang menyatakan \(H_0\) ditolak sehingga terdapat perbedaan
rata-rata yang signifikan, maka dilanjutkan dengan uji lajut yaitu uji
Tukey.
Uji Tukey
Setelah melalui uji ANAVA yang diketahui terdapat perbedaan yang
signifikan terhadap rata-rata penjualan keempat jenis produk. Langkah
selanjutnya adalah mengidentifikasi secara spesifik jenis produk mana
yang memiliki perbedaan rata-rata penjualan yang signifikan dengan
menggunakan uji Tukey Honestly Significant Difference (HSD).
Berikut hasil uji Tukey.
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Sales ~ Product_Type, data = data)
##
## $Product_Type
## diff lwr upr p adj
## Espresso-Coffee -23.92 -48.54681 0.7068106 0.0602137
## Herbal Tea-Coffee -116.88 -141.50681 -92.2531894 0.0000000
## Tea-Coffee -133.92 -158.54681 -109.2931894 0.0000000
## Herbal Tea-Espresso -92.96 -117.58681 -68.3331894 0.0000000
## Tea-Espresso -110.00 -134.62681 -85.3731894 0.0000000
## Tea-Herbal Tea -17.04 -41.66681 7.5868106 0.2754017
Berdasarkan output uji Tukey HSD yang diberikan, berikut
interpretasi dari perbandingan rata-rata penjualan antara keempat jenis
produk di Florida.
-
Espresso vs Coffee
-
Selisih rata-rata: -23.92 (Coffee leih tinggi daripada
Esresso)
-
Interval kepercayaan 95%: [-48.54681, 0.7068106]
-
Nilai p adj: 0.0602137 > 0.05
-
Interpretasi: Tidak terdapat perbedaan yang signifikan
secara statistik antara penjualan Coffee dengan
Espresso pada tingkat signifikan 5%. Meskipun ada selisih
rata-rata sebesar 23.92 unit, perbedaan ini tidak cukup besar untuk
dianggap berbeda signifikan pada tingkat kepercayaan 95%.
-
Herbal Tea vs Coffee
-
Selisih rata-rata: -116.88 (Coffee leih tinggi daripada
Herbal Tea)
-
Interval kepercayaan 95%: [-141.50681, -92.2531894]
-
Nilai p adj: 0.0000000 < 0.05
-
Interpretasi: Terdapat perbedaan yang signifikan secara
statistik antara penjualan Coffee dengan Herbal Tea
pada tingkat signifikan 5%. Coffee memiliki rata-rata penjualan
yang jauh lebih tinggi dengan selisih 116.88 unit dibandingkan
Herbal Tea.
-
Tea vs Coffee
-
Selisih rata-rata: -133.92 (Coffee leih tinggi daripada
Tea)
-
Interval kepercayaan 95%: [-158.54681, -109.2931894]
-
Nilai p adj: 0.0000000 < 0.05
-
Interpretasi: Terdapat perbedaan yang signifikan secara
statistik antara penjualan Coffee dengan Tea pada
tingkat signifikan 5%. Coffee memiliki rata-rata penjualan yang
jauh lebih tinggi dengan selisih 133.92 unit dibandingkan Tea.
-
Herbal Tea vs Espresso
-
Selisih rata-rata: -92.96 (Espresso leih tinggi daripada
Herbal Tea)
-
Interval kepercayaan 95%: [-117.58681, -68.3331894]
-
Nilai p adj: 0.0000000 < 0.05
-
Interpretasi: Terdapat perbedaan yang signifikan secara
statistik antara penjualan Herbal Tea dengan Espresso
pada tingkat signifikan 5%. Espresso memiliki rata-rata
penjualan yang jauh lebih tinggi dengan selisih 92.96 unit dibandingkan
Herbal Tea.
-
Tea vs Espresso
-
Selisih rata-rata: -110.00 (Espresso leih tinggi daripada
Tea)
-
Interval kepercayaan 95%: [-134.62681, -85.3731894]
-
Nilai p adj: 0.0000000 < 0.05
-
Interpretasi: Terdapat perbedaan yang signifikan secara
statistik antara penjualan Tea dengan Espresso pada
tingkat signifikan 5%. Espresso memiliki rata-rata penjualan
yang jauh lebih tinggi dengan selisih 110.00 unit dibandingkan
Tea.
-
Tea vs Herbal Tea
-
Selisih rata-rata: -17.04 (Herbal Tea leih tinggi daripada
Tea)
-
Interval kepercayaan 95%: [-41.66681, 7.5868106]
-
Nilai p adj: 0.0000000 < 0.05
-
Interpretasi: Terdapat perbedaan yang signifikan secara
statistik antara penjualan Tea dengan Herbal Tea pada
tingkat signifikan 5%. Meskipun ada selisih rata-rata sebesar 17.04
unit, perbedaan ini tidak cukup besar untuk dianggap berbeda signifikan
pada tingkat kepercayaan 95%.
Kesimpulan
Berdasarkan hasil analisis ANAVA satu arah terhadap rata-rata penjualan
empat jenis produk Coffee Chain (Coffee, Espresso, Herbal Tea,
dan Tea) di negara bagian Florida, diperoleh bahwa asumsi
normalitas dan homogenitas varians terpenuhi. Namun,
hasil uji ANOVA menunjukkan bahwa terdapat perbedaan yang signifikan
secara statistik antara rata-rata penjualan keempat jenis produk
tersebut (nilai \(P-value < 0.05\)),
sehingga hipotesis nol ditolak.
Selanjutnya, uji lanjutan Tukey HSD dilakukan untuk mengetahui pasangan
jenis produk mana yang memiliki perbedaan signifikan. Hasil uji Tukey
menunjukkan bahwa:
-
Coffee memiliki rata-rata penjualan yang secara signifikan
lebih tinggi dibandingkan Herbal Tea dan Tea.
-
Espresso memiliki rata-rata penjualan yang secara signifikan
lebih tinggi dibandingkan Herbal Tea dan Tea.
-
Tidak terdapat perbedaan yang signifikan antara penjualan
Coffee dan Espresso, meskipun Coffee sedikit
lebih tinggi secara rata-rata.
-
Terdapat perbedaan signifikan antara Herbal Tea dan
Tea, meskipun Herbal Tea sedikit lebih tinggi secara
rata-rata.
Dengan demikian, produk Coffee dan Espresso merupakan
dua jenis minuman dengan performa penjualan tertinggi, sedangkan
Herbal Tea dan Tea merupakan dua jenis produk dengan
performa penjualan yang lebih rendah secara signifikan. Analisis ini
dapat menjadi dasar dalam pengambilan keputusan strategis, seperti fokus
promosi atau alokasi persediaan, khususnya untuk pasar di wilayah
Florida.
LS0tDQp0aXRsZTogIlBlcmJhbmRpbmdhbiBSYXRhLVJhdGEgUGVuanVhbGFuIEVtcGF0IEplbmlzIFByb2R1ayBDb2ZmZWUgQ2hhaW4gZGkgRmxvcmlkYSBNZW5nZ3VuYWthbiBBbmFsaXNpcyBWYXJpYW5zaSBTYXR1IEFyYWggIg0KYXV0aG9yOiAiUmF0cmlhIEF6ZWxpYSBQdXRyaSBDaGlhcmEgQWd1bWkgKE0wNzIzMDczKSINCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0DQotLS0NCg0KPHN0eWxlPg0KLnRpdGxlIHsNCiBmb250LWZhbWlseTogQ2FuZGFyYTsNCiBmb250LXdlaWdodDogYm9sZDsNCiBjb2xvcjogIzM0NzkyODsNCiBmb250LXNpemU6IDYwcHg7DQogdGV4dC1hbGlnbjogY2VudGVyDQp9DQoNCi5hdXRob3Igew0KIGZvbnQtZmFtaWx5OiBDYW5kYXJhOw0KIGZvbnQtc2l6ZTogMThweDsNCiB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQogDQouYXV0aG9yOmJlZm9yZSB7DQogIGNvbnRlbnQ6ICLwn5GkICI7DQogIGZvbnQtc2l6ZTogMC44ZW07IA0KfQ0KIA0KYm9keXsNCiBmb250LWZhbWlseTogQ2FuZGFyYTsNCiBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmNWVkOw0KfQ0KDQpoMSB7DQogZm9udC1mYW1pbHk6IENhbmRhcmE7DQogY29sb3I6ICM1NDMzMTA7DQogdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LXNpemU6IDM1cHg7DQogZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQoNCmgyIHsNCiBjb2xvciA6ICM3NDUxMkQ7DQogZm9udC1mYW1pbHk6IENhbmRhcmE7DQogdGV4dC1hbGlnbjoganVzdGlmeTsNCiBmb250LXNpemU6IDI1cHg7DQogZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQoNCmgzIHsNCiBjb2xvciA6ICNBRjhGNkY7DQogZm9udC1mYW1pbHk6IENhbmRhcmE7DQogdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQogdGV4dC1hbGlnbjoganVzdGlmeTsNCiBmb250LXNpemU6IDIycHg7DQogZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQoNCm9sIHsNCiBjb2xvciA6IGJsYWNrOw0KIGZvbnQtZmFtaWx5OiBDYW5kYXJhOw0KIHRleHQtYWxpZ246IGp1c3RpZnk7DQogZm9udC1zaXplOiAxNnB4Ow0KfQ0KDQp1bCB7DQogY29sb3IgOiBibGFjazsNCiBmb250LWZhbWlseTogQ2FuZGFyYTsNCiB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KIGZvbnQtc2l6ZTogMTZweDsNCn0NCg0KcHsNCiB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KIGZvbnQtc2l6ZTogMTZweDsNCiBjb2xvcjogYmxhY2s7DQp9DQoNCi5tYXRoIHsNCiAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogbm9ybWFsOw0KfQ0KDQpwcmUgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50Ow0KICBib3JkZXI6IDFweCBzb2xpZCAjRTBFMEUwOw0KICBwYWRkaW5nOiAxMHB4Ow0KICBib3JkZXItcmFkaXVzOiA2cHg7DQp9DQoNCi50b2NpZnkgLnRvY2lmeS1pdGVtLmFjdGl2ZSwNCi50b2NpZnkgLnRvY2lmeS1pdGVtLmhpZ2hsaWdodCB7DQogIGJhY2tncm91bmQtY29sb3I6ICM1NDMzMTAgIWltcG9ydGFudDsgDQogIGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50Ow0KfQ0KDQp9DQo8L3N0eWxlPg0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmBgYA0KDQo8aDE+UGVuZGFodWx1YW48L2gxPg0KDQo8aDI+Kkluc2lnaHQqPC9oMj4NCg0KPHA+IERhdGFzZXQgaW5pIGRpYW1iaWwgZGFyaSBkYXRhIHBlbmp1YWxhbiBDb2ZmZWUgQ2hhaW4gZGFuIHRlbGFoIGRpZmlsdGVyIGtodXN1cyB1bnR1ayBuZWdhcmEgYmFnaWFuIEZsb3JpZGEuIFNlbGFuanV0bnlhLCBkaWxha3VrYW4gcGVuZ2FtYmlsYW4gc2FtcGVsIHNlYmFueWFrIDI1IG9ic2VydmFzaSBzZWNhcmEgYWNhayB1bnR1ayBzZXRpYXAgamVuaXMgcHJvZHVrLiBKZW5pcyBwcm9kdWsgeWFuZyBkaWFuYWxpc2lzIHRlcmRpcmkgZGFyaSBlbXBhdCBrYXRlZ29yaSB5YWl0dSAqQ29mZmVlLCBFc3ByZXNzbywgSGVyYmFsIFRlYSosIGRhbiAqVGVhKi4gVG90YWwgZGF0YSB5YW5nIGRpYW5hbGlzaXMgYmVyanVtbGFoIDEwMCBvYnNlcnZhc2kuIFNldGlhcCBqZW5pcyBwcm9kdWsgdGVyZGlyaSBkYXJpIDI1IHNhbXBlbCwgc2VoaW5nZ2EgZGlzdHJpYnVzaSBkYXRhIGFudGFyIGthdGVnb3JpIG1lcmF0YS5VamkgeWFuZyBha2FuIGRpbGFrdWthbiBwYWRhIG9ic2VydmFzaSBpbmkgYWRhbGFoIHVqaSBhbmFsaXNpcyB2YXJpYW5zaSBzYXR1IGFyYWgoKm9uZSB3YXkgQU5PVkEqKS4gVHVqdWFuIGRhcmkgdWppIEFOQVZBIGFkYWxhaCB1bnR1ayBtZW5nZXRhaHVpIGFwYWthaCB0ZXJkYXBhdCBwZXJiZWRhYW4gcmF0YS1yYXRhIHBlbmp1YWxhbiB5YW5nIHNpZ25pZmlrYW4gYW50YXJhIGtlZW1wYXQgamVuaXMgcHJvZHVrIGRpIEZsb3JpZGEuIERlbmdhbiBkZW1pa2lhbiwgcGVydXNhaGFhbiBkYXBhdCBtZW5naWRlbnRpZmlrYXNpIGFwYWthaCBqZW5pcyBwcm9kdWsgdGVydGVudHUgbWVtaWxpa2kgcGVyZm9ybWEgcGVuanVhbGFuIHlhbmcgbGViaWggdGluZ2dpIGRpYmFuZGluZ2thbiB5YW5nIGxhaW4gc2VjYXJhIHN0YXRpc3Rpay4gPC9wPg0KDQo8aDI+VWppIEFuYWxpc2lzIFZhcmlhbnNpIFNhdHUgQXJhaDwvaDI+DQoNCjxwPkFuYWxpc2lzIHZhcmlhbnNpIChBTkFWQSkgYWRhbGFoIHN1YXR1IG1ldG9kZSBhbmFsaXNpcyBzdGF0aXN0aWsgeWFuZyB0ZXJtYXN1ayBrZSBkYWxhbSBjYWJhbmcgc3RhdGlzdGlrYSBpbmZlcmVuc2lhbC4gQW5hbGlzaXMgdmFyaWFuc2kgZGlndW5ha2FuIHVudHVrIG1lbmd1amkgcGVyYmVkYWFuIG5pbGFpIHJhdGEtcmF0YSBkYXJpIGR1YSBrZWxvbXBvayBkYXRhIGF0YXUgbGViaWguIEFuYWxpc2lzIHZhcmlhbnNpIHNhdHUgYXJhaCAoKk9uZS1XYXkgQU5PVkEqKSBtZXJ1cGFrYW4gdGVrbmlrIGFuYWxpc2lzIHlhbmcgZGlndW5ha2FuIHVudHVrIG1lbmd1amkgcGVyYmVkYWFuIG5pbGFpIHJhdGEtcmF0YSBkYXJpIGJlYmVyYXBhIGtlbG9tcG9rIGRhdGEgeWFuZyBkaXBlbmdhcnVoaSBvbGVoIHNhdHUgZmFrdG9yIHBlcmxha3Vhbi4gQXN1bXNpIHlhbmcgaGFydXMgdGVycGVudWhpIHNlYmVsdW0gbWVsYWt1a2FuIHVqaSBhbm92YSBhZGFsYWg6PGJyPg0KPG9sPg0KPGxpPk5vcm1hbGl0YXMgOiByZXNpZHUgc2V0aWFwIGtlbG9tcG9rIHBlcmxha3VhbiBkYWxhbSBwb3B1bGFzaSBoYXJ1cyBiZXJkaXN0cmlidXNpIG5vcm1hbC48L2xpPg0KPGxpPkhvbW9nZW5pdGFzIDogdmFyaWFiaWxpdGFzIGRhdGEgcGFkYSBzZXRpYXAga2Vsb21wb2sgcGVybGFrdWFuIGRhbGFtIHBvcHVsYXNpIGhhcnVzbGFoIHJlbGF0aWYgc2FtYS48L2xpPg0KPC9vbD4NCjwvcD4NCg0KPGgzPk1vZGVsIE1hdGVtYXRpczwvaDM+DQoNCjxwPiBNb2RlbCBsaW5pZXIgYW5hbGlzaXMgdmFyaWFuc2kgc2F0dSBhcmFoICgqb25lLXdheSBBTk9WQSopIHlhaXR1Og0KJCRZX3tpan09IFxtdSsgXHRhdV9pKyBcdmFyZXBzaWxvbl97aWp9JCQNCmRpbWFuYToNCjx1bD4NCiAgPGxpPiRZX3tpan0kID0gTmlsYWkgcGVuZ2FtYXRhbiBrZS0kaiQgZGFsYW0gcGVybGFrdWFuIChrZWxvbXBvaykga2UtJGkkPC9saT4NCiAgPGxpPiRcbXVfaSQgPSBSYXRhLXJhdGEgdW11bSBkYXJpIGtlc2VsdXJ1aGFuIHBvcHVsYXNpPC9saT4NCiAgPGxpPiRcdGF1X2kkID0gIEVmZWsgcGVybGFrdWFuIGtlLSRpJCx5YWl0dSBwZW55aW1wYW5nYW4gZGFyaSByYXRhLXJhdGEgcGVybGFrdWFuIGtlLSRpJCB0ZXJoYWRhcCByYXRhLXJhdGEgdW11bTwvbGk+DQogIDxsaT4kXHZhcmVwc2lsb25fe2lqfSQgPSBHYWxhdCAoKmVycm9yKikgcGVuZ2FtYXRhbiBrZS0kaiQgZGFsYW0gcGVybGFrdWFuIGtlLSRpJDwvbGk+DQogIDxsaT4kaT0xLDIsMywuLi4sayQgKCRrJCBhZGFsYWgganVtbGFoIHBlcmxha3Vhbi9rZWxvbXBvayk8L2xpPg0KICA8bGk+JGo9MSwyLDMsLi4uLG5faSQgKCRuX2kkIGFkYWxhaCBqdW1sYWggcGVuZ2FtYXRhbiBkYWxhbSBwZXJsYWt1YW4ga2UtJGkkKTwvbGk+DQo8L3VsPg0KDQo8aDM+VGFiZWwgQU5BVkE8L2gzPg0KDQo8cD5NZW5ndWppIGhpcG90ZXNpcyB5YW5nIHRlbGFoIGRpcnVtdXNrYW4gZGFwYXQgZGlsYWt1a2FuIGRlbmdhbiBtZW5nZ3VuYWthbiBhbmFsaXNpcyB2YXJpYW5zaSBzYXR1IGFyYWggdGVyaGFkYXAgZGF0YSB5YW5nIGluZ2luIGRpYW5hbGlzaXMuIEFuYWxpc2lzIGluaSBtZW1pbGlraSB0dWp1YW4gdW50dWsgbWVuZ2V2YWx1YXNpIHBlcmJlZGFhbiByYXRhLXJhdGEgYW50YXIga2Vsb21wb2sgcGVybGFrdWFuLiBIYXNpbCBwZXJoaXR1bmdhbiBhbmFsaXNpcyB2YXJpYW5zaSBzYXR1IGFyYWggZGl0YW1waWxrYW4gZGFsYW0gdGFiZWwgYmVyaWt1dC48L3A+DQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KYGBgDQoNCmBgYHtyIHRhYmVsLWFuYXZhLCBlY2hvPUZBTFNFfQ0KYW5hdmFfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgYFN1bWJlciBLZXJhZ2FtYW5gID0gYygiUGVybGFrdWFuIiwgIlNlc2F0YW4iLCAiVG90YWwiKSwNCiAgYERlcmFqYXQgS2ViZWJhc2FuYCA9IGMoIiRrIC0gMSQiLCAiJE4gLSBrJCIsICIkTiAtIDEkIiksDQogIGBKdW1sYWggS3VhZHJhdGAgPSBjKCIkSktQID0gXFxmcmFje3lfe2kufV4yfXtuX2l9LVxcZnJhY3t5X3suLn1eMn17Tn0kIiwgDQogICAgICAgICAgICAgICAgICAgICAgICIkSktTID0gSktUIC0gSktQJCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiJEpLVCA9IFxcc3VtX3tpPTF9XntrfSB5X3tpan1eMiAtXFxmcmFje3lfey4ufV4yfXtOfSQiKSwNCiAgYFJhdGEtcmF0YSBLdWFkcmF0YCA9IGMoIiRSS1AgPSBcXGZyYWN7SktQfXtrLTF9JCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiJFJLUyA9IFxcZnJhY3tKS1N9e04ta30kIiwgDQogICAgICAgICAgICAgICAgICAgICAgICIiKSwNCiAgYEYgSGl0dW5nYCA9IGMoIiRcXGZyYWN7UktQfXtSS1N9JCIsICIiLCAiIikNCikNCg0Ka2FibGUoYW5hdmFfdGFibGUsIGVzY2FwZSA9IEZBTFNFLCBhbGlnbiA9ICJjIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSwgDQogICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IFRSVUUNCiAgICAgICAgICAgICAgICApICU+JQ0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIiM0QTk0MzUiLCBjb2xvciA9ICIjZmZmYWVkIiwgZm9udF9zaXplID0gMTYpICU+JQ0KICByb3dfc3BlYygxOjMsIGZvbnRfc2l6ZSA9IDE2KSAgJT4lDQogIHJvd19zcGVjKDEsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiNmZmZhZWQiKSAlPiUNCiAgcm93X3NwZWMoMiwgYmFja2dyb3VuZCA9ICIjZmZmYWVkIikgJT4lIA0KICByb3dfc3BlYygzLCBiYWNrZ3JvdW5kID0gIiNmZmZhZWQiKQ0KYGBgDQoNCjxoMj5VamkgVHVrZXk8L2gyPg0KDQo8cD5VamkgVHVrZXkgc2VyaW5nIGp1Z2EgZGlzZWJ1dCBkZW5nYW4gdWppIGJlZGEgbnlhdGEganVqdXIgKEJOSikgYXRhdSAgYXRhdSBIb25lc3QgKlNpZ25pZmljYW50IERpZmZlcmVuY2UqIChIU0QpICp0ZXN0KiwgZGlwZXJrZW5hbGthbiBvbGVoIFR1a2V5IHBhZGEgdGFodW4gMTk1My4gVWppIFR1a2V5IGRpZ3VuYWthbiB1bnR1ayBtZW1iYW5kaW5na2FuIHNlbHVydWggcGFzYW5nYW4gcmF0YS1yYXRhIHBlcmxha3VhbiBzZXRlbGFoIHVqaSBBbmFsaXNpcyB2YXJpYW5zaSBkaWxha3VrYW4uIFVqaSBUdWtleSBkaWxha3VrYW4gZGlsYWt1a2FuIGppa2EgaGFzaWwgZGFyaSB0YWJlbCBBTkFWQSBkaXRvbGFrIHlhbmcgbWVueWF0YWthbiBiYWh3YSB0ZXJkYXBhdCBwZXJlZGFhbiB5YW5nIHNpZ25pZmlrYW4gc2VoaW5nZ2EgdW50dWsgbWVuZ2V0YWh1aSBrZWxvbXBvayBtYW5hIHlhbmcgbWVtaWxpa2kgcGVyYmVkYWFuIHJhdGEtcmF0YSB5YW5nIHNpZ25pZmlrYW4gZGlsYWt1a2FuIHVqaSBUdWtleS4gTWV0b2RlIGluaSBtZW1wZXJoaXR1bmdrYW4gdGluZ2thdCBrZXNhbGFoYW4gZWtzcGVyaW1lbiBzZWNhcmEga2VzZWx1cnVoYW4gKCpleHBlcmltZW50LXdpc2UgZXJyb3IgcmF0ZSopIHNlaGluZ2dhIGxlYmloIHRlcGF0IHVudHVrIHBlcmJhbmRpbmdhbiBzaW11bHRhbiBhbnRhcmEgYmFueWFrIGtlbG9tcG9rLjwvcD4NCg0KDQo8aDE+SGFzaWwgZGFuIFBlbWFoYXNhbjwvaDE+DQoNCjxoMj4qTGlicmFyeSo8L2gyPg0KDQo8cD5CZXJpa3V0IG1lcnVwYWthbiBsaWJyYXJ5IHlhbmcgZGlwZXJsdWthbiBkYWxhbSBtZW1iYW50dSBkYWxhbSBtZWxha3VrYW4gYW5hbGlzaXMgZGF0YS48L3A+DQoNCmBgYHtyIEJ1dHVoLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmBgYA0KDQo8aDI+RGF0YTwvaDI+DQoNCjxwPkRhdGEgeWFuZyBkaWd1bmFrYW4gbWVydXBha2FuIHNhbXBlbCBkYXJpIGRhdGEgcGVuanVhbGFuIENvZmZlZSBDaGFpbiBwYWRhIG5lZ2FyYSBiYWdpYW4gRmxvcmlkYS4gRGF0YSB0ZXJkaXJpIGRhcmkgMTAwIG9ic2VydmFzaSB5YW5nIGRpYW1iaWwgc2VjYXJhIGFjYWssIGRlbmdhbiBwZW1iYWdpYW4gbWVyYXRhIHlhaXR1IDI1IG9ic2VydmFzaSB1bnR1ayBzZXRpYXAga2F0ZWdvcmkgcHJvZHVrLCB5YWl0dSAqQ29mZmVlLCBFc3ByZXNzbywgSGVyYmFsIFRlYSosIGRhbiAqVGVhKi4gRGF0YXNldCBsZW5na2FwbnlhIGRhcGF0IGRpYWtzZXMgcGFkYSA8YSBocmVmPSJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xdWxRdUpNVnpzemlRZnNTcVVEZDNFN2FFU3h0OUtWZkV2Um5KMjNDMUkzRS9lZGl0P3VzcD1zaGFyaW5nIj5DaGFpbiBDb2ZmZSBEYXRhc2V0PC9hPi48L3A+IA0KDQpgYGB7ciBqYWxhbiwgZWNobz1UUlVFLCBmaWcuaGVpZ2h0PTQwMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQpzZXQuc2VlZCgzNDUpDQpkYXRhIDwtIHJlYWRfZXhjZWwoIkQ6L1NJTS8zLiBDTTEgLSBDb2ZmZWUgQ2hhaW4gRGF0YXNldHMueGxzeCIpICU+JQ0KICBmaWx0ZXIoU3RhdGUgPT0gIkZsb3JpZGEiKSAlPiUNCiAgc2VsZWN0KFByb2R1Y3RfVHlwZSA9IGBQcm9kdWN0IFR5cGVgLCBTYWxlcykgJT4lDQogIGdyb3VwX2J5KFByb2R1Y3RfVHlwZSkgJT4lDQogIHNhbXBsZV9uKDI1KQ0KRFQ6OmRhdGF0YWJsZShkYXRhLCANCiAgICAgICAgICAgICAgZmlsdGVyID0gJ3RvcCcsIA0KICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdCgNCiAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gMTAsDQogICAgICAgICAgICAgICAgbGVuZ3RoTWVudSA9IGMoMTAsIDIwLCAyNSwgNTAsIDEwMCkgDQogICAgICAgICAgICAgICksDQogICAgICAgICAgICAgIGNhcHRpb24gPSAnRGF0YSBQZW5qdWFsYW4gQ29mZmVlIENoYWluIGRpIEZsb3JpZGEnKQ0KYGBgDQoNCg0KPGgyPkFuYWxpc2lzIERlc2tyaXB0aWY8L2gyPg0KDQo8aDM+U3RhdGlzdGlrYSBEZXNrcmlwdGlmPC9oMz4NCg0KPHA+UGFkYSBsYW5na2FoIGluaSwgZGlsYWt1a2FuIHBlbmdoaXR1bmdhbiBzdGF0aXN0aWthIGRlc2tyaXB0aWYgdW50dWsgZW1wYXQgKlByb2R1Y3QgVHlwZSosIHlhaXR1ICpDb2ZmZWUqLCAqRXNwcmVzc28qLCAqSGVyYmFsIFRlYSosIGRhbiAqVGVhKi4gU3RhdGlzdGlrYSBkZXNrcmlwdGlmIGluaSBtZW1iZXJpa2FuIGdhbWJhcmFuIHRlbnRhbmcgc2ViYXJhbiBkYW4ga2FyYWt0ZXJpc3RpayBkYXRhIHBhZGEgdmFyaWFiZWwtdmFyaWFiZWwgdGVyc2VidXQuPC9wPg0KDQpgYGB7ciBkZXNrcmlwdGlmfQ0Kc3VtYXJyeSA8LSBkYXRhICU+JSAgDQogIG11dGF0ZShyb3cgPSByb3dfbnVtYmVyKCkpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBQcm9kdWN0X1R5cGUsIHZhbHVlc19mcm9tID0gU2FsZXMpICU+JQ0KICBzZWxlY3QoLXJvdykNCnN1bW1hcnkoc3VtYXJyeSkNCmBgYA0KDQo8aDM+Qm94cGxvdDwvaDM+DQoNCjxwPkJveHBsb3QgYWthbiBtZW1iYW50dSBkYWxhbSBtZW12aXN1YWxpc2FzaSBkaXN0cmlidXNpIHBlbmp1YWxhbiBiZXJkYXNhcmthbiBqZW5pcyBwcm9kdWsuIGJveHBsb3QgbWVtYmFudHUgZGFsYW0gbWVuZ2lkZW50aWZpa2FzaSBtZWRpYW4gcGVuanVhbGFuLCByZW50YW5nIGludGVya3VhcnRpbCwgZGFuIG5pbGFpIG1pbmltdW0gc2VydGEgbmlsYWkgbWFrc2ltdW0gcGVuanVhbGFuIHVudHVrIHNldGlhcCBqZW5pcyBwcm9kdWsuIFZpc3VhbGlzYXNpIGRpYmF3YWggaW5pIG1lcnVwYWthbiBwZXJiYW5kaW5nYW4gbGFuZ3N1bmcgcG9sYSBwZW5qdWFsYW4gKkNvZmZlZSosICpFc3ByZXNzbyosICpIZXJiYWwgVGVhKiwgZGFuICpUZWEqLjwvcD4NCg0KYGBge3Iga290YWt9DQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBQcm9kdWN0X1R5cGUsIHkgPSBTYWxlcykpICsNCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAiIzZCQUU1MiIsIGNvbG9yID0gIiMzNDc5MjgiKSArDQogIGxhYnModGl0bGUgPSAiQm94cGxvdCBTYWxlcyBwZXIgUHJvZHVjdCBUeXBlIiwNCiAgICAgICB4ID0gIlByb2R1Y3QgVHlwZSIsDQogICAgICAgeSA9ICJTYWxlcyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KPGgyPlVqaSBBc3Vtc2k8L2gyPg0KDQo8aDM+VWppIE5vcm1hbGl0YXMgKFNhcGhpcm8tV2lsayk8L2gzPg0KPHA+RGlsYWt1a2FuIHVqaSBub3JtYWxpdGFzIHJlc2lkdSBwYWRhIG1vZGVsIGFuYXZhLjwvcD4NCjxvbD4NCiAgPGxpPioqSGlwb3Rlc2lzKio8YnI+DQogICAgICAkSF8wPSQgRGF0YSBiZXJkaXN0cmlidXNpIG5vcm1hbCA8YnI+DQogICAgICAkSF8xPSQgRGF0YSB0aWRhayBiZXJkaXN0cmlidXNpIG5vcm1hbDwvbGk+DQogIDxsaT4qKlRpbmdrYXQgU2lnbmlmaWthbnNpKio8YnI+DQogICAgICAkXGFscGhhPTAuMDUkPC9saT4NCiAgPGxpPioqRGFlcmFoIEtyaXRpcyoqPGJyPg0KICAgICAgJEhfMCQgZGl0b2xhayBqaWthICRQLXZhbHVlPFxhbHBoYSQ8L2xpPg0KICA8bGk+KipTdGF0aXN0aWsgVWppKio8YnI+DQogICAgIDxwPk1lbmdndW5ha2FuIGBgYHNoYXBpcm8udGVzdCgpYGBgIHVudHVrIG1lbmd1amkgbm9ybWFsaXRhcyByZXNpZHUgcGFkYSBtb2RlbCBhbmF2YS48L1A+IDwvbGk+DQoNCmBgYHtyIG5vcm1hbGl0YXN9DQphbmF2YSA8LSBhb3YoU2FsZXMgfiBQcm9kdWN0X1R5cGUsIGRhdGEgPSBkYXRhKQ0Kc2hhcGlyby50ZXN0KGFuYXZhJHJlc2lkdWFscykNCmBgYA0KDQogIDxsaT4qKktlc2ltcHVsYW4qKjxicj4NCiAgICAgIDxwPiRQLXZhbHVlID0gMC44NDQyID4gMC4wNSQgc2VoaW5nZ2EgJEhfMCQgZ2FnYWwgZGl0b2xhaywgeWFuZyBiZXJhcnRpIGRhdGEgYmVyZGlzdHJpYnVzaSBub3JtYWwgZGFuIHVqaSBhc3Vtc2kgbm9ybWFsaXRhcyAqKnRlcnBlbnVoaSoqLjwvbGk+PC9QPg0KPC9vbD4NCg0KPGgzPlVqaSBIb21vZ2VuaXRhczwvaDM+DQoNCjxwPkRJbGFrdWthbiB1amkgaG9tb2dlbml0YXMgcGFkYSBkYXRhLjwvcD4NCg0KPG9sPg0KICA8bGk+KipIaXBvdGVzaXMqKjxicj4NCiAgICAgICRIXzA9JCBWYXJpYW5zIHBlbmp1YWxhbiBrZWVtcGF0IGplbmlzIHByb2R1ayAoKkNvZmZlZSosICpFc3ByZXNzbyosICpIZXJiYWwgVGVhKiwgZGFuICpUZWEqKSBkaSBGbG9yaWRhIGFkYWxhaCBob21vZ2VuIChzYW1hKS48YnI+DQogICAgICAkSF8xPSRWYXJpYW5zIHBlbmp1YWxhbiBrZWVtcGF0IGplbmlzIHByb2R1ayAoKkNvZmZlZSosICpFc3ByZXNzbyosICpIZXJiYWwgVGVhKiwgZGFuICpUZWEqKSBkaSBGbG9yaWRhIHRpZGFrIGhvbW9nZW4gKGJlcmJlZGEpLjwvbGk+DQogIDxsaT4qKlRpbmdrYXQgU2lnbmlmaWthbnNpKio8YnI+DQogICAgICAkXGFscGhhPTAuMDUkPC9saT4NCiAgPGxpPioqRGFlcmFoIEtyaXRpcyoqPGJyPg0KICAgICAgJEhfMCQgZGl0b2xhayBqaWthICRQLXZhbHVlPFxhbHBoYSQ8L2xpPg0KICA8bGk+KipTdGF0aXN0aWsgVWppKio8YnI+DQogICAgICA8cD5VbnR1ayBtZW5ndWppIGhtb2dlbml0YXMgZGFwYXQgbWVuZ2d1bmFrYW4gYGBgbGV2ZW5lVGVzdCgpYGBgLjwvcD4NCiAgICAgIA0KYGBge3IgaG9tb2dlbml0YXN9DQpsZXZlbmVUZXN0KFNhbGVzIH4gZmFjdG9yKFByb2R1Y3RfVHlwZSkgLGRhdGE9ZGF0YSkNCmBgYA0KICANCiAgPC9saT4NCiAgPGxpPioqS2VzaW1wdWxhbioqPGJyPg0KICAgICAgPHA+JFAtdmFsdWU9MC4xNDI4PjAuMDUkLCBzZWhpbmdnYSAkSF8wJCBnYWdhbCBkaXRvbGFrLCBtYWthIFZhcmlhbnMgcGVuanVhbGFuIGtlZW1wYXQgamVuaXMgcHJvZHVrICgqQ29mZmVlKiwgKkVzcHJlc3NvKiwgKkhlcmJhbCBUZWEqLCBkYW4gKlRlYSopIGRpIEZsb3JpZGEgYWRhbGFoIGhvbW9nZW4gKHNhbWEpLiBVamkgYXN1bXNpIGhvbW9nZW5pdGFzICoqdGVycGVudWhpKiouPC9saT48L3A+DQo8L29sPg0KDQoNCjxoMj5VamkgQU5BVkE8L2gyPg0KDQo8cD5EaWxha3VrYW4gdWppIGFuYWxpc2lzIHZhcmlhbnNpIHNhdHUgYXJhaCBhZGFsYWggdW50dWsgbWVuZ2FuYWxpc2lzIGFwYWthaCB0ZXJkYXBhdCBwZXJiZWRhYW4gc2lnbmlmaWthbiBwYWRhIHRpbmdrYXQgcGVuanVhbGFuICgqc2FsZXMqKSBhbnRhcmEgZW1wYXQgamVuaXMgcHJvZHVrIHlhaXR1ICpDb2ZmZWUqLCAqRXNwcmVzc28qLCAqSGVyYmFsIFRlYSosIGRhbiAqVGVhKiBkaSBuZWdhcmEgYmFnaWFuIEZsb3JpZGEuRGlwaWxpaCB1amkgQU5BVkEga2FyZW5hIG1lbWlsaWtpIGtlbWFtcHVhbiB1bnR1ayBtZW1iYW5kaW5na2FuIHJhdGEtcmF0YSBwZW5qdWFsYW4gbGRhcmkgbGViaWggMiBrZWxvbXBvayBwcm9kdWsuIEJlcmlrdXQgbGFuZ2thaC1sYW5na2FoIHBlbmd1amlhbiBoaXBvdGVzaXMuPC9wPg0KDQo8b2w+DQogIDxsaT4qKkhpcG90ZXNpcyoqPGJyPg0KICAgICAgJEhfMD0kVGlkYWsgdGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiBwYWRhIHJhdGEtcmF0YSBwZW5qdWFsYW4gYW50YXJhIGtlZW1wYXQgamVuaXMgcHJvZHVrICgqQ29mZmVlKiwgKkVzcHJlc3NvKiwgKkhlcmJhbCBUZWEqLCBkYW4gKlRlYSopIGRpIG5lZ2FyYSBiYWdpYW4gRmxvcmlkYS48YnI+DQogICAgICAkSF8xPSRUZXJkYXBhdCBwZXJiZWRhYW4geWFuZyBzaWduaWZpa2FuIHBhZGEgcmF0YS1yYXRhIHBlbmp1YWxhbiBhbnRhcmEga2VlbXBhdCBqZW5pcyBwcm9kdWsgKCpDb2ZmZWUqLCAqRXNwcmVzc28qLCAqSGVyYmFsIFRlYSosIGRhbiAqVGVhKikgZGkgbmVnYXJhIGJhZ2lhbiBGbG9yaWRhLg0KICA8L2xpPg0KICA8bGk+KipUaW5na2F0IHNpZ25pZmlrYW5zaSoqPGJyPg0KICAgICAgJFxhbHBoYT0wLjA1JCA8L2xpPg0KICA8bGk+KipEYWVyYWggS3JpdGlzKio8YnI+DQogICAgICAkSF8wJCBkaXRvbGFrIGppa2EgJEZfe2hpdHVuZ30+Rl97dGFiZWx9JCBhdGF1ICRQX3t2YWx1ZX08MC4wNSQ8L2xpPg0KICA8bGk+KipTdGF0aXN0aWsgVWppKio8YnI+DQogICAgICA8cD50ZWxhaCBkaWRhcGF0a2FuIG1vZGVsIGFuYXZhIHNlYmVsdW1ueWEsIHVudHVrIG1lbmRhcGF0a2FuIGhhc2lsIHRhYmVsIEFOQVZBIGRhcGF0IGRpcGVyb2xlaCBkZW5nYW5gYGBzdW1tYXJ5KClgYGA8L3A+DQogICAgICANCmBgYHtyIGFuYXZhfQ0Kc3VtbWFyeShhbmF2YSkNCmBgYA0KICA8L2xpPg0KICA8bGk+KipLZXNpbXB1bGFuKio8YnI+DQogICAgICA8cD4kUF97dmFsdWV9PDAuMDUkIHNlaGluZ2dhICRIXzAkICoqZGl0b2xhayoqLCB5YW5nIGJlcmFydGkgdGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiBwYWRhIHJhdGEtcmF0YSBwZW5qdWFsYW4gYW50YXJhIGtlZW1wYXQgamVuaXMgcHJvZHVrICgqQ29mZmVlKiwgKkVzcHJlc3NvKiwgKkhlcmJhbCBUZWEqLCBkYW4gKlRlYSopIGRpIG5lZ2FyYSBiYWdpYW4gRmxvcmlkYS48L2xpPjwvcD4NCjwvb2w+DQo8cD5NZWxhbHVpIGtlc2ltcHVsYW4geWFuZyB0ZWxhaCBkaWRhcGF0a2FuIHlhbmcgbWVueWF0YWthbiAkSF8wJCBkaXRvbGFrIHNlaGluZ2dhIHRlcmRhcGF0IHBlcmJlZGFhbiByYXRhLXJhdGEgeWFuZyBzaWduaWZpa2FuLCBtYWthIGRpbGFuanV0a2FuIGRlbmdhbiB1amkgbGFqdXQgeWFpdHUgdWppIFR1a2V5LjwvcD4NCg0KPGgyPlVqaSBUdWtleTwvaDI+DQo8cD4NClNldGVsYWggbWVsYWx1aSB1amkgQU5BVkEgeWFuZyBkaWtldGFodWkgdGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiB0ZXJoYWRhcCByYXRhLXJhdGEgcGVuanVhbGFuIGtlZW1wYXQgamVuaXMgcHJvZHVrLiBMYW5na2FoIHNlbGFuanV0bnlhIGFkYWxhaCBtZW5naWRlbnRpZmlrYXNpIHNlY2FyYSBzcGVzaWZpayBqZW5pcyBwcm9kdWsgbWFuYSB5YW5nIG1lbWlsaWtpIHBlcmJlZGFhbiByYXRhLXJhdGEgcGVuanVhbGFuIHlhbmcgc2lnbmlmaWthbiBkZW5nYW4gbWVuZ2d1bmFrYW4gdWppICpUdWtleSBIb25lc3RseSBTaWduaWZpY2FudCBEaWZmZXJlbmNlKiAoSFNEKS4gQmVyaWt1dCBoYXNpbCB1amkgVHVrZXkuPC9QPg0KDQpgYGB7ciB1amkgdHVrZXl9DQpUdWtleUhTRChhbmF2YSkNCmBgYA0KDQo8cD5CZXJkYXNhcmthbiAqb3V0cHV0KiB1amkgVHVrZXkgSFNEIHlhbmcgZGliZXJpa2FuLCBiZXJpa3V0IGludGVycHJldGFzaSBkYXJpIHBlcmJhbmRpbmdhbiByYXRhLXJhdGEgcGVuanVhbGFuIGFudGFyYSBrZWVtcGF0IGplbmlzIHByb2R1ayBkaSBGbG9yaWRhLjxicj48L3A+DQoNCjxvbD4NCjxsaT4qRXNwcmVzc28qIHZzICpDb2ZmZWUqPGJyPg0KIDx1bD4NCiAgIDxsaT5TZWxpc2loIHJhdGEtcmF0YTogLTIzLjkyICgqQ29mZmVlKiBsZWloIHRpbmdnaSBkYXJpcGFkYSAqRXNyZXNzbyopPC9saT4NCiAgIDxsaT5JbnRlcnZhbCBrZXBlcmNheWFhbiA5NSU6IFstNDguNTQ2ODEsIDAuNzA2ODEwNl0gPC9saT4NCiAgIDxsaT5OaWxhaSBwIGFkajogMC4wNjAyMTM3ID4gMC4wNTwvbGk+DQogICA8bGk+KipJbnRlcnByZXRhc2kqKjogVGlkYWsgdGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrIGFudGFyYSBwZW5qdWFsYW4gKkNvZmZlZSogZGVuZ2FuICpFc3ByZXNzbyogcGFkYSB0aW5na2F0IHNpZ25pZmlrYW4gNSUuIE1lc2tpcHVuIGFkYSBzZWxpc2loIHJhdGEtcmF0YSBzZWJlc2FyIDIzLjkyIHVuaXQsIHBlcmJlZGFhbiBpbmkgdGlkYWsgY3VrdXAgYmVzYXIgdW50dWsgZGlhbmdnYXAgYmVyYmVkYSBzaWduaWZpa2FuIHBhZGEgdGluZ2thdCBrZXBlcmNheWFhbiA5NSUuPC9saT4NCiA8L3VsPiA8L2xpPg0KIA0KPGxpPipIZXJiYWwgVGVhKiB2cyAqQ29mZmVlKjxicj4NCiA8dWw+DQogICA8bGk+U2VsaXNpaCByYXRhLXJhdGE6IC0xMTYuODggKCpDb2ZmZWUqIGxlaWggdGluZ2dpIGRhcmlwYWRhICpIZXJiYWwgVGVhKik8L2xpPg0KICAgPGxpPkludGVydmFsIGtlcGVyY2F5YWFuIDk1JTogWy0xNDEuNTA2ODEsIC05Mi4yNTMxODk0XTwvbGk+DQogICA8bGk+TmlsYWkgcCBhZGo6IDAuMDAwMDAwMCA8IDAuMDU8L2xpPg0KICAgPGxpPioqSW50ZXJwcmV0YXNpKio6IFRlcmRhcGF0IHBlcmJlZGFhbiB5YW5nIHNpZ25pZmlrYW4gc2VjYXJhIHN0YXRpc3RpayBhbnRhcmEgcGVuanVhbGFuICpDb2ZmZWUqIGRlbmdhbiAqSGVyYmFsIFRlYSogcGFkYSB0aW5na2F0IHNpZ25pZmlrYW4gNSUuICpDb2ZmZWUqIG1lbWlsaWtpIHJhdGEtcmF0YSBwZW5qdWFsYW4geWFuZyBqYXVoIGxlYmloIHRpbmdnaSBkZW5nYW4gc2VsaXNpaCAxMTYuODggdW5pdCBkaWJhbmRpbmdrYW4gKkhlcmJhbCBUZWEqLjwvbGk+DQogPC91bD48L2xpPg0KIA0KPGxpPipUZWEqIHZzICpDb2ZmZWUqPGJyPg0KIDx1bD4NCiAgIDxsaT5TZWxpc2loIHJhdGEtcmF0YTogLTEzMy45MiAoKkNvZmZlZSogbGVpaCB0aW5nZ2kgZGFyaXBhZGEgKlRlYSopPC9saT4NCiAgIDxsaT5JbnRlcnZhbCBrZXBlcmNheWFhbiA5NSU6IFstMTU4LjU0NjgxLCAtMTA5LjI5MzE4OTRdPC9saT4NCiAgIDxsaT5OaWxhaSBwIGFkajogMC4wMDAwMDAwIDwgMC4wNTwvbGk+DQogICA8bGk+KipJbnRlcnByZXRhc2kqKjogVGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrIGFudGFyYSBwZW5qdWFsYW4gKkNvZmZlZSogZGVuZ2FuICpUZWEqIHBhZGEgdGluZ2thdCBzaWduaWZpa2FuIDUlLiAqQ29mZmVlKiBtZW1pbGlraSByYXRhLXJhdGEgcGVuanVhbGFuIHlhbmcgamF1aCBsZWJpaCB0aW5nZ2kgZGVuZ2FuIHNlbGlzaWggMTMzLjkyIHVuaXQgZGliYW5kaW5na2FuICpUZWEqLjwvbGk+DQogPC91bD48L2xpPg0KDQo8bGk+KkhlcmJhbCBUZWEqIHZzICpFc3ByZXNzbyo8YnI+DQogPHVsPg0KICAgPGxpPlNlbGlzaWggcmF0YS1yYXRhOiAtOTIuOTYgKCpFc3ByZXNzbyogbGVpaCB0aW5nZ2kgZGFyaXBhZGEgKkhlcmJhbCBUZWEqKTwvbGk+DQogICA8bGk+SW50ZXJ2YWwga2VwZXJjYXlhYW4gOTUlOiBbLTExNy41ODY4MSwgLTY4LjMzMzE4OTRdPC9saT4NCiAgIDxsaT5OaWxhaSBwIGFkajogMC4wMDAwMDAwIDwgMC4wNTwvbGk+DQogICA8bGk+KipJbnRlcnByZXRhc2kqKjogVGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrIGFudGFyYSBwZW5qdWFsYW4gKkhlcmJhbCBUZWEqIGRlbmdhbiAqRXNwcmVzc28qIHBhZGEgdGluZ2thdCBzaWduaWZpa2FuIDUlLiAqRXNwcmVzc28qIG1lbWlsaWtpIHJhdGEtcmF0YSBwZW5qdWFsYW4geWFuZyBqYXVoIGxlYmloIHRpbmdnaSBkZW5nYW4gc2VsaXNpaCA5Mi45NiB1bml0IGRpYmFuZGluZ2thbiAqSGVyYmFsIFRlYSouPC9saT4NCiA8L3VsPjwvbGk+DQoNCjxsaT4qVGVhKiB2cyAqRXNwcmVzc28qPGJyPg0KIDx1bD4NCiAgIDxsaT5TZWxpc2loIHJhdGEtcmF0YTogLTExMC4wMCAoKkVzcHJlc3NvKiBsZWloIHRpbmdnaSBkYXJpcGFkYSAqVGVhKik8L2xpPg0KICAgPGxpPkludGVydmFsIGtlcGVyY2F5YWFuIDk1JTogWy0xMzQuNjI2ODEsIC04NS4zNzMxODk0XTwvbGk+DQogICA8bGk+TmlsYWkgcCBhZGo6IDAuMDAwMDAwMCA8IDAuMDU8L2xpPg0KICAgPGxpPioqSW50ZXJwcmV0YXNpKio6IFRlcmRhcGF0IHBlcmJlZGFhbiB5YW5nIHNpZ25pZmlrYW4gc2VjYXJhIHN0YXRpc3RpayBhbnRhcmEgcGVuanVhbGFuICpUZWEqIGRlbmdhbiAqRXNwcmVzc28qIHBhZGEgdGluZ2thdCBzaWduaWZpa2FuIDUlLiAqRXNwcmVzc28qIG1lbWlsaWtpIHJhdGEtcmF0YSBwZW5qdWFsYW4geWFuZyBqYXVoIGxlYmloIHRpbmdnaSBkZW5nYW4gc2VsaXNpaCAxMTAuMDAgdW5pdCBkaWJhbmRpbmdrYW4gKlRlYSouPC9saT4NCiA8L3VsPjwvbGk+DQogDQo8bGk+KlRlYSogdnMgKkhlcmJhbCBUZWEqPGJyPg0KIDx1bD4NCiAgIDxsaT5TZWxpc2loIHJhdGEtcmF0YTogLTE3LjA0ICgqSGVyYmFsIFRlYSogbGVpaCB0aW5nZ2kgZGFyaXBhZGEgKlRlYSopPC9saT4NCiAgIDxsaT5JbnRlcnZhbCBrZXBlcmNheWFhbiA5NSU6IFstNDEuNjY2ODEsIDcuNTg2ODEwNl08L2xpPg0KICAgPGxpPk5pbGFpIHAgYWRqOiAwLjAwMDAwMDAgPCAwLjA1PC9saT4NCiAgIDxsaT4qKkludGVycHJldGFzaSoqOiBUZXJkYXBhdCBwZXJiZWRhYW4geWFuZyBzaWduaWZpa2FuIHNlY2FyYSBzdGF0aXN0aWsgYW50YXJhIHBlbmp1YWxhbiAqVGVhKiBkZW5nYW4gKkhlcmJhbCBUZWEqIHBhZGEgdGluZ2thdCBzaWduaWZpa2FuIDUlLiBNZXNraXB1biBhZGEgc2VsaXNpaCByYXRhLXJhdGEgc2ViZXNhciAxNy4wNCB1bml0LCBwZXJiZWRhYW4gaW5pIHRpZGFrIGN1a3VwIGJlc2FyIHVudHVrIGRpYW5nZ2FwIGJlcmJlZGEgc2lnbmlmaWthbiBwYWRhIHRpbmdrYXQga2VwZXJjYXlhYW4gOTUlLjwvbGk+DQogPC91bD48L2xpPg0KPC9vbD48L3A+DQoNCjxoMT5LZXNpbXB1bGFuPC9oMT4NCg0KPHA+QmVyZGFzYXJrYW4gaGFzaWwgYW5hbGlzaXMgQU5BVkEgc2F0dSBhcmFoIHRlcmhhZGFwIHJhdGEtcmF0YSBwZW5qdWFsYW4gZW1wYXQgamVuaXMgcHJvZHVrIENvZmZlZSBDaGFpbiAoKkNvZmZlZSwgRXNwcmVzc28sIEhlcmJhbCBUZWEqLCBkYW4gKlRlYSopIGRpIG5lZ2FyYSBiYWdpYW4gRmxvcmlkYSwgZGlwZXJvbGVoIGJhaHdhIGFzdW1zaSBub3JtYWxpdGFzIGRhbiBob21vZ2VuaXRhcyB2YXJpYW5zICoqdGVycGVudWhpKiouIE5hbXVuLCBoYXNpbCB1amkgQU5PVkEgbWVudW5qdWtrYW4gYmFod2EgdGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrIGFudGFyYSByYXRhLXJhdGEgcGVuanVhbGFuIGtlZW1wYXQgamVuaXMgcHJvZHVrIHRlcnNlYnV0IChuaWxhaSAkUC12YWx1ZSA8IDAuMDUkKSwgc2VoaW5nZ2EgaGlwb3Rlc2lzIG5vbCAqKmRpdG9sYWsqKi48L3A+DQoNCjxwPlNlbGFuanV0bnlhLCB1amkgbGFuanV0YW4gVHVrZXkgSFNEIGRpbGFrdWthbiB1bnR1ayBtZW5nZXRhaHVpIHBhc2FuZ2FuIGplbmlzIHByb2R1ayBtYW5hIHlhbmcgbWVtaWxpa2kgcGVyYmVkYWFuIHNpZ25pZmlrYW4uIEhhc2lsIHVqaSBUdWtleSBtZW51bmp1a2thbiBiYWh3YTo8L3A+DQoNCjxvbD4NCiA8bGk+KkNvZmZlZSogbWVtaWxpa2kgcmF0YS1yYXRhIHBlbmp1YWxhbiB5YW5nIHNlY2FyYSBzaWduaWZpa2FuIGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4gKkhlcmJhbCBUZWEqIGRhbiAqVGVhKi48L2xpPg0KIDxsaT4qRXNwcmVzc28qIG1lbWlsaWtpIHJhdGEtcmF0YSBwZW5qdWFsYW4geWFuZyBzZWNhcmEgc2lnbmlmaWthbiBsZWJpaCB0aW5nZ2kgZGliYW5kaW5na2FuICpIZXJiYWwgVGVhKiBkYW4gKlRlYSouPC9saT4NCiA8bGk+VGlkYWsgdGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiBhbnRhcmEgcGVuanVhbGFuICpDb2ZmZWUqIGRhbiAqRXNwcmVzc28qLCBtZXNraXB1biAqQ29mZmVlKiBzZWRpa2l0IGxlYmloIHRpbmdnaSBzZWNhcmEgcmF0YS1yYXRhLjwvbGk+DQogPGxpPlRlcmRhcGF0IHBlcmJlZGFhbiBzaWduaWZpa2FuIGFudGFyYSAqSGVyYmFsIFRlYSogZGFuICpUZWEqLCBtZXNraXB1biAqSGVyYmFsIFRlYSogc2VkaWtpdCBsZWJpaCB0aW5nZ2kgc2VjYXJhIHJhdGEtcmF0YS48L2xpPg0KPC9vbD4NCg0KPHA+RGVuZ2FuIGRlbWlraWFuLCBwcm9kdWsgKkNvZmZlZSogZGFuICpFc3ByZXNzbyogbWVydXBha2FuIGR1YSBqZW5pcyBtaW51bWFuIGRlbmdhbiBwZXJmb3JtYSBwZW5qdWFsYW4gdGVydGluZ2dpLCBzZWRhbmdrYW4gKkhlcmJhbCBUZWEqIGRhbiAqVGVhKiBtZXJ1cGFrYW4gZHVhIGplbmlzIHByb2R1ayBkZW5nYW4gcGVyZm9ybWEgcGVuanVhbGFuIHlhbmcgbGViaWggcmVuZGFoIHNlY2FyYSBzaWduaWZpa2FuLiBBbmFsaXNpcyBpbmkgZGFwYXQgbWVuamFkaSBkYXNhciBkYWxhbSBwZW5nYW1iaWxhbiBrZXB1dHVzYW4gc3RyYXRlZ2lzLCBzZXBlcnRpIGZva3VzIHByb21vc2kgYXRhdSBhbG9rYXNpIHBlcnNlZGlhYW4sIGtodXN1c255YSB1bnR1ayBwYXNhciBkaSB3aWxheWFoIEZsb3JpZGEuPC9wPg0KDQoNCg0K