1 Eksperimen Campuran

Semua desain yang dibahas pada bab 4 sebelumnya termasuk dalam kelas desain ortogonal di mana semua faktor bervariasi secara independen. Namun, dalam banyak pengaplikasian dan terutama dalam ilmu kimia ada kasus di mana faktor tidak dapat dan tidak boleh divariasikan secara independen. Jika, katakanlah, ada tiga senyawa \(x1, x2, x3\), semuanya dalam kisaran 0-1 dengan 1 menunjukkan komponen murni, desain dari pencampuran komponen ini harus mematuhi aturan campuran \((\sum_{i} x_{i}=1)\). Sebenarnya, semua masalah dalam kimia adalah masalah campuran, tetapi dalam banyak kasus, pelarut diperlakukan sebagai “pengisi” inert yang tidak berkontribusi pada batasan campuran dan dengan demikian memungkinkan faktor konsentrasi yang tersisa untuk bervariasi secara independen. Karena kendala atau batasan campuran, masalah campuran memerlukan model parametrik khusus dan sesuai dengan model desain khusus ini. Model campuran dan desain campuran akan diperkenalkan pada bagian berikut dan penggunaannya di R akan ditunjukkan dengan beberapa contoh literatur. Sebuah tinjauan komprehensif tentang eksperimen campuran dan sumber yang baik untuk bacaan lebih lanjut adalah buku (John A. Cornell 1990). (John Lawson, Cameron Willden 2016) memberikan gambaran umum tentang paket mixexp, kumpulan fungsi untuk membuat dan menganalisis desain campuran di R.

1.1 Model Campuran

Mencoba mengidentifikasi model OLS parametrik \(\hat y = a_ {0} + a_ {1} \cdot x_ {1} + a_ {2} \cdot x_ {2} + a_ {3} \cdot x_ {3}x3\) mengingat batasan campuran \(\sum_ {i = 1} ^ 3x_ {i} = 1\) akan gagal karena batasan campuran membuat satu variabel menjadi berlebihan. Salah satu cara menangani singularitas adalah dengan melepaskan satu variabel, misalnya \(x3\), dan melanjutkan dengan model yang dikurangi \(\hat y = a_ {0} ^ {'} + a_ {1} \cdot x_ {1} ^ {' } + a_ {2} \cdot x_ {2} ^ {'}2\) dan kondisi tambahan \(x3 = 1 - x1 - x2\). Ini disebut pendekatan variabel slack dengan variabel slack, di sini x3, biasanya dipilih sebagai komponen yang paling inert. Perhatikan bahwa variabel lain dapat dikecualikan tanpa memengaruhi statistik model, karena semua model variabel slack secara statistik merosot dan akan memberikan prediksi yang sama. Cara yang lebih alami untuk menangani batasan linier adalah dengan mengintegrasikan batasan campuran \(\sum_ {i} x_ {i} = 1\) ke dalam persamaan regresi, yang mengarah ke apa yang disebut model Scheffe, dinamai sesuai nama ilmuwan yang pertama menurunkan persamaan ini. Dari model parametrik

\(\hat y = a_ {0} + a_ {1} \cdot x_ {1} + a_ {2} \cdot x_ {2} + a_ {3} \cdot x_ {3}\)

dan kontras campuran

\(x_ {1} + x_ {2} + x_ {3} = 1\)

diikuti dengan substitusi

\(\hat y = a_ {0} (x_ {1} + x_ {2} + x_ {3 }) + a_ {1} \cdot x_ {1} + a_ {2} \cdot x_ {2} + a_ {3} \cdot x_ {3} \Leftrightarrow\)

\(\hat y = (a_ {0} + a_ {1}) \cdot x_ {1} + (a_ {0} + a_ {2}) \cdot x_ {2} + (a_ {0} + a_ {3}) \cdot x_ {3}\)

model efek utama Scheffe \(\hat y = a_ {1} ^ {'} \cdot x_ {1} + a_ {2} ^ {'} \cdot x_ {2} + a_ {3} ^ {'} \cdot x_ {3}\)

Yang meluas untuk komponen campuran K ke model efek utama Scheffe, persamaan (5.1)

\(\begin {equation} y = \sum_ {i = 1} ^ {K} a_ {i} ^ {'} \cdot x_ {i} + \epsilon \tag {5.1} \end {equation}\)

Dari persamaan (5.1) dan batasan campuran mengikuti identitas \(\hat {y}_{x_ {i} = 1} = a_ {i} ^ {'}\), sehingga koefisien regresi adalah nilai yang diharapkan \(\hat y_ {i}\) dari komponen murni \(x_i\) dengan campuran penjumlahan terbobot dari komponen murni. Dalam model linear Scheffe, komponen-komponen tidak berinteraksi dan ini mungkin merupakan asumsi yang terlalu ketat untuk banyak aplikasi sehingga memotivasi model Scheffe kuadrat.

Dimulai dengan model kuadrat

\(\hat y = a_ {0} + a_ {1} \cdot x_ {1} + a_ {2} \cdot x_ {2} + a_ {3} \cdot x_ {3} + a_ {4} \cdot x_ {1} ^ 2 + a_ {5} \cdot x_ {2} ^ 2 + a_ {6} \cdot x_ {3} ^ 2 + a_ {7} \cdot x_ {1} \cdot x_ {2} + a_ {8} \cdot x_ {1} \cdot x_ {3} + a_ {9} \cdot x_ {2} \cdot x_ {3}\)

dengan mengintegrasikan batasan campuran model Scheffe kuadrat adalah diperoleh

\(\hat y = a_ {1} ^ {'} \cdot x_ {1} + a_ {2} ^ {'} \cdot x_ {2} + a_ {3} ^ {'} \cdot x_ {3 } + a_ {4} ^ {'} \cdot x_ {1} \cdot x_ {2} + a_ {5} ^ {'} \cdot x_ {1} \cdot x_ {3} + a_ {6} ^ { '} \cdot x_ {2} \cdot x_ {3}\)

dengan model Scheffe kuadrat umum untuk komponen K yang diberikan oleh persamaan (5.2)

\(\begin {equation} y = \sum_ {i = 1} ^ {K} a_ {i} ^ {'} \cdot x_ {i} + \sum_ {j> i} ^ {K} a_ {ij} ^ {'} \cdot x_ {i} \cdot x_ {j} + \epsilon \tag {5.2} \end {equation}\)

Untuk campuran biner apa pun \(x_i = 0.5, x_j = 0.5\) mengikuti persamaan (5.2) persamaan

\(\hat y_ {x_ {i} = 0,5; x_ {j} = 0,5} = \frac {a_ {i} + a_ { j}} {2} + \frac {a_ {ij}} {4}\)

yang digambarkan dalam gambar 5.1 secara grafis untuk dua campuran biner dengan \(a_{ij} > 0\) (sinergisme) dan \(a_{ij} <0\) (antagonisme). Garis lurus menunjukkan model Scheffe linier dengan \(a_{ij}\).

Gambar 5.1: Plot respons model Scheffe kuadrat untuk campuran biner x1, x2

dengan efek sinergis dan antagonis berlabel merah dan biru.

Akuntansi untuk efek orde tinggi seperti interaksi terner dapat dicapai dengan menambah model Scheffe kuadrat dengan istilah interaksi orde tinggi seperti dalam model Scheffe kubik penuh, lihat persamaan (5.3)

\(\begin {equation} y = \sum_ {i = 1} ^ {K} a_ {i} \cdot x_ {i} + \sum_ {j> i} ^ {K} a_ {ij} \cdot x_ { i} \cdot x_ {j} + \sum_ {j> i} ^ {K} \delta_ {ij} \cdot x_ {i} \cdot x_ {j} \cdot (x_ {i} - x_ {j}) + \sum_ {k> j> i} ^ {K} a_ {ijk} \cdot x_ {i} \cdot x_ {j} \cdot x_ {k} + \epsilon \tag {5.3} \end {equation}\)

Gambar 5.2 menunjukkan plot campuran biner dari model kubik penuh, yang sekarang dapat menjelaskan efek sinergis dan antagonistik dalam ruang campuran. Model kubik yang mendasari gambar 5.2 adalah bentuk parametrik \(\hat y = a_ {1} \cdot x_ {1} + a_ {2} \cdot x_ {2} + a_ {12} \cdot x_ {1} \cdot x_ {2} + \delta_ {12} \cdot x_ {1} \cdot x_ {2} \cdot (x_ {1} -x_ {2})\) dengan parameter disetel ke \(a_1 = 50, a_2 = 100, a_{12} = 0 dan \delta_ {12} = - 200\).

Gambar 5.2: Plot respon model kubik Scheffe untuk campuran biner x1, x2 dengan efek sinergis dan antagonis dalam ruang campuran

Model kubik penuh, rumus (5.3), sangat fleksibel karena banyaknya parameter regresi, sehingga cenderung mudah menyesuaikan data. Seringkali model kubik tereduksi, persamaan (5.4), cukup kompleks untuk menggambarkan situasi eksperimental secara memadai.

\(\begin {equation} y = \sum_ {i = 1} ^ {K} a_ {i} \cdot x_ {i} + \sum_ {j> i} ^ {K} a_ {ij} \cdot x_ { i} \cdot x_ {j} + \sum_ {k> j> i} ^ {K} a_ {ijk} \cdot x_ {i} \cdot x_ {j} \cdot x_ {k} + \epsilon \tag { 5.4} \end {equation}\)

Model campuran yang dijelaskan di atas - model kubik linier, kuadrat, penuh dan tereduksi (khusus) - adalah cukup untuk memodelkan sebagian besar sistem campuran dengan tepat dan dapat digunakan sebagai blok bangunan untuk memodelkan desain proses campuran, di mana komponen campuran K adalah \(x_1, x_2 ,… X_K\) digabungkan dengan faktor proses P yang mana \(z_1, z_2,… z_P\). Model proses campuran pertama dihasilkan dari perpotongan penuh model Scheffe kuadrat dengan model proses faktorial (bilinear), yaitu:

\(y = \Bigg (\sum_ {i = 1} ^ {K} a_ {i} \cdot x_ { i} + \sum_ {j> i} ^ {K} a_ {ij} \cdot x_ {i} \cdot x_ {j} \Bigg) \cdot \Bigg (\alpha_ {0} + \sum_ {l = 1 } ^ P \alpha_ {l} \cdot z_ {l} + \sum_ {m> l} ^ R \alpha_ {lm} \cdot z_ {l} \cdot z_ {m} \Bigg) + \epsilon\)

dan dari ekspansi produk mengikuti langsung model parametrik, persamaan (5.5)

\(\begin {align} y = & \sum_ {i = 1} ^ {K} b_ {i} \cdot x_ {i} + \sum_ {j> i} ^ {K} b_ {ij} \cdot x_ {i} \cdot x_ {j} + \sum_ {i = 1} ^ K \sum_ {l = 1} ^ P b_ {il} ^ {'} \cdot x_ {i} \cdot z_ {l} + \sum_ {j> i} ^ K \sum_ {l = 1} ^ P b_ {ijl} ^ {'} \cdot x_ {i} \cdot x_ {j} \cdot z_ {l} \ + \notag \\ & \sum_ {i} ^ K \sum_ {m> l} ^ P b_ {ilm} ^ {'} \cdot x_ {i} \cdot z_ {l} \cdot z_ {m} + \sum_ {j> i} ^ K \sum_ {m> l} ^ P b_ {ijlm} ^ {'} \cdot x_ {i} \cdot x_ {j} \cdot z_ {l} \cdot z_ {m} + \epsilon \tag {5.5 } \end {align}\)

Jumlah koefisien regresi dalam rumus (5.5) sebagai fungsi K dan P tumbuh dengan cepat membuat desain silang menjadi penggunaan terbatas untuk sebagian besar aplikasi. Model yang lebih sulit diperoleh dengan secara khusus yaitu dengan menghubungkan model Scheffe kuadrat dengan model RSM yang mengarah ke persamaan (5.6)

\(\begin{equation} y = \sum_{i=1}^{K}b_{i}\cdot x_{i} + \sum_{j>i}^{K} b_{ij} \cdot x_{i} \cdot x_{j} + \sum_{i=1}^K \sum_{l=1}^P b_{il}^{'} \cdot x_{i} \cdot z_{l} + \sum_{m>l}^P b_{lm}^{'} \cdot z_{l} \cdot z_{m}+ \sum_{l=1}^P b_{ll} \cdot z_{l}^2 + \epsilon \tag{5.6} \end{equation}\)

mpat model campuran, persamaan # 1: (5.1), # 2: (5.2), # 3: (5.3), # 4: (5.4) dan dua desain proses campuran, proses desain campuran bersilangan antara penuh dan sebagian, persamaan # 5: (5.5) dan # 6: (5.6), dapat dengan mudah direferensikan oleh argumen model dalam R-function mixexp :: MixModel (…, model = #) dengan # yang menunjukkan nomor model dalam daftar di atas.

Saat menganalisis eksperimen campuran, semua prinsip validasi model OLS berlaku seperti pengujian statistik dan analisis residual seperti yang akan ditunjukkan dengan beberapa contoh data yang disediakan dengan mixexp paket R dari (R.H. Myers, D.C. Montgomery 2002). Tujuan percobaan adalah untuk menemukan perpaduan yang optimal dari komponen x1, x2, x3 yang memaksimalkan laju silikon etsa wafer (respon erate). Rancangan percobaan ini adalah Rancangan Simplex-Centroid yang direplikasi sebagian (dijelaskan kemudian) ditambah dengan beberapa titik interior. Desainnya secara maksimal mendukung model kubik yang dikurangi dan akan berfungsi di sini sebagai contoh untuk mendemonstrasikan beberapa fungsi dari mixexp. Berbeda dari model ortogonal, dalam model campuran biasanya tidak mungkin untuk menghilangkann satu per satu istilah model yang tidak signifikan karena hal ini akan melanggar batasan campuran dan membuat model menjadi tunggal. Biasanya cukup untuk memilih di antara model # 1- # 4 untuk mendeskripsikan data dengan tepat dalam domain model41.

Contoh data ditunjukkan pada gambar 5.3 sebagai plot terner dan mendukung model #1, #2 atau #4. Replikasi ditandai dengan lingkaran dan diseimbangkan dengan baik di atas ruang desain agar tidak mengganggu ortogonalitas desain.

Gambar 5.3: Plot terner dari data etsa dengan ulangan yang ditandai dengan lingkaran

Mengikuti prinsip kesederhanaan, data pertama-tama dianalisis dengan model Scheffe kuadrat dan selanjutnya dengan model kubik tereduksi, dan residu dibandingkan pada gambar 5.4 (perhatikan bahwa \(R^2\) di dalam outputlm dari model tanpa intersep adalah bias dan harus diabaikan. Nilai \(R^2\) yang dilaporkan oleh MixModel sudah benar dan sebagai gantinya harus digunakan).

## 
## Call:
## lm(formula = erate ~ -1 + x1 + x2 + x3 + x1:x2 + x1:x3 + x2:x3, 
##     data = etch)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -157.68  -30.13   11.62   38.04  177.90 
## 
## Coefficients:
##       Estimate Std. Error t value Pr(>|t|)    
## x1      534.64      83.35   6.414 0.000206 ***
## x2      329.16      83.35   3.949 0.004241 ** 
## x3      252.73      83.35   3.032 0.016254 *  
## x1:x2  1343.11     469.58   2.860 0.021145 *  
## x1:x3   644.53     469.58   1.373 0.207133    
## x2:x3   711.68     469.58   1.516 0.168101    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 120.3 on 8 degrees of freedom
## Multiple R-squared:  0.9721, Adjusted R-squared:  0.9511 
## F-statistic: 46.38 on 6 and 8 DF,  p-value: 8.741e-06
##      
##       coefficients   Std.err  t.value        Prob
## x1        534.6383  83.34866 6.414481 0.000205933
## x2        329.1622  83.34866 3.949220 0.004240658
## x3        252.7336  83.34866 3.032245 0.016253810
## x2:x1    1343.1061 469.58404 2.860204 0.021144784
## x3:x1     644.5346 469.58404 1.372565 0.207132664
## x2:x3     711.6775 469.58404 1.515549 0.168101200
##      
## Residual standard error:  120.261  on  8 degrees of freedom 
## Corrected Multiple R-squared:  0.7583617
## 
## Call:
## lm(formula = mixmodnI, data = frame)
## 
## Coefficients:
##     x1      x2      x3   x1:x2   x1:x3   x2:x3  
##  534.6   329.2   252.7  1343.1   644.5   711.7
##      
##          coefficients   Std.err     t.value         Prob
## x1         550.199515  23.22446 23.69051468 6.067419e-08
## x2         344.723325  23.22446 14.84311192 1.509476e-06
## x3         268.294753  23.22446 11.55224716 8.203511e-06
## x2:x1      689.537037 146.51489  4.70625916 2.192427e-03
## x3:x1       -9.034392 146.51489 -0.06166193 9.525557e-01
## x2:x3       58.108466 146.51489  0.39660451 7.034720e-01
## x2:x3:x1  9243.333333 940.85336  9.82441444 2.404146e-05
##      
## Residual standard error:  33.43177  on  7 degrees of freedom 
## Corrected Multiple R-squared:  0.9836603
## 
## Call:
## lm(formula = mixmodnI, data = frame)
## 
## Coefficients:
##       x1        x2        x3     x1:x2     x1:x3     x2:x3  x1:x2:x3  
##  550.200   344.723   268.295   689.537    -9.034    58.108  9243.333
## [1] 9.353397
## [1] 57.53584

Gambar 5.4: Residual pelajar versus prediksi model dari kuadratik (panel kiri) dan model kubik Scheffe tereduksi dari data etsa. Pasangan replikasi (3,10), (2,9), (8,1) dan (7,11) lebih baik dijelaskan dalam kesalahan relikasi oleh model kubik (panel kanan) dibandingkan dengan model kuadrat (panel kiri).

Nilai R2 yang dikoreksi dari model Scheffe kuadrat, \(R^2=0,76\) lebih kecil dibandingkan dengan model kubik, \(R^2=0,98\), menunjukkan bahwa istilah \(x_1:x_2:x_3\) berkontribusi secara substansial terhadap varians dari respons. Kesimpulan serupa dapat ditarik dari gambar 5.4 yang menunjukkan model kuadrat Scheffe menjadi bias, misalnya, tidak tepat menggambarkan pasangan replikasi #7, #11. Dalam model kubik Scheffe suku terner \(x_1:x_2:x_3\) ditemukan signifikan dan residual model kubik sekarang lebih sesuai dengan asumsi normalitas ataskesalahan ϵ

Model kubik dapat divisualisasikan dengan plot kontur terner yang ditunjukkan pada gambar 5.5. Maksimum terletak dekat dengan sentroid \((x_1 = 0,33, x_2 = 0,33, x_3 = 0,33)^{42}\)

Gambar 5.5: Plot kontur dari model kubik tereduksi dari data etsa

Plot kontur juga dapat digunakan untuk dimensi yang lebih tinggi dari K = 3 dengan mengkondisikan (mengiris) plot pada variabel yang ditetapkan konstan. Namun, ini dapat menjadi membingungkan ketika ada banyak irisan untuk dibandingkan, dan oleh karena itu cara lain yang populer dan kurang membingungkan untuk memvisualisasikan model campuran berdimensi tinggi adalah plot efek Cox. Pertama, arah Cox didefinisikan sebagai garis yang menghubungkan titik centroid dengan simpul-simpul (lihat gambar 5.6) ruang campuran. Saat bergerak ke arah Cox, katakanlah, \(x_1\) rasio komponen campuran yang tersisa tetap konstan, di sini \(\frac {x_ {2}} {x_ {3}} = 1\), dan ini setara dengan efek “independen” dari \(x_1\) dalam ruang campuran. Efek Cox adalah jejak yang diperoleh dari menggores permukaan respons di sepanjang arah Cox. Gambar 5.6 menunjukkan arah Cox dalam ruang campuran tiga dimensi bersama dengan plot efek Cox dari model kubik tereduksi dari data etsa.

Gambar 5.6: Arah Cox dalam ruang campuran 3D (panel kiri) dan plot efek sepanjang arah Cox dari model etsa kubik tereduksi (panel kanan)

1.2 Desain campuran

Bagian sebelumnya memperkenalkan enam model parametrik yang berbeda untuk pemodelan campuran dan sistem proses campuran. Terkait dengan masing-masing model adalah desain proses campuran dan campuran yang secara optimal mendukung model yang dipilih. Model dan desain adalah dua sisi dari mata uang yang sama: Model parametrik menentukan desain dan desain menentukan dan membatasi model yang dapat diperkirakan dari data. Desain campuran dapat secara luas dibagi menjadi desain biasa (regular design) di mana desain tersebut mencakup seluruh ruang campuran \((0 \leq x_ {i} \leq 1 )\) dan desain tidak beraturan (atau dibatasi) yang hanya berupa subruang,\(LB_ {i} (> 0) \leq x_ {i} \leq UB_ {i} (<1)\), dari seluruh ruang campuran terisi. Gambar 5.7 menunjukkan contoh desain campuran beraturan dan tidak beraturan dalam tiga dimensi.

Gambar 5.7: Contoh desain biasa (panel kiri) dan tidak beraturan (dibatasi) (panel kanan)

Model Scheffe linier dan kuadrat (model #1, #2) dapat diperkirakan dengan (regular) Simplex Lattice Designs (SLD) yang ditunjukkan untuk K = 3 pada gambar 5.8 dan dibuat dengan mixexp R-function SLD (fac, lev) . Agument fac menunjukkan jumlah faktor dan lev menentukan jumlah level dengan \(x_i>0\).

Gambar 5.8: Desain Kisi Simpleks untuk memperkirakan model linear (SLD (3,1), panel kiri) dan kuadratik Scheffe (SLD (3,2), panel kanan)

Komponen murni (titik puncak pada gambar 5.8) cukup untuk memperkirakan model Scheffe linier. Model kuadrat Scheffe didukung dengan menambah desain sebelumnya dengan semua campuran biner di tengah tiga sisi. Kedua desain \(saturated^{43}\)

dan oleh karena itu perlu proses tambahan untuk memperkirakan varian kesalahan dan untuk memeriksa adanya efek urutan yang lebih tinggi.

Model kubik tereduksi (model #4) dapat diperkirakan dengan Simplex Centroid Designs (SCD). Sekali lagi, SCD sudah jenuh (saturated) dan perlu proses tambahan untuk memperkirakan varian error dan Lack of Fit.

Akhirnya, Desain three level Simplex Lattice dapat digunakan untuk memperkirakan model kubik penuh (model #3). Semua desain dapat dibuat dengan mudah dengan fungsi mixexp :: SLD () dan mixexp :: SCD () dan contoh untuk K = 3 dari yang pertama dan yang terakhir digambarkan pada gambar 5.8 dan 5.9.

Gambar 5.9: Simplex Centroid Design SCD (3) (panel kiri) untuk model kubik tereduksi dan Simplex Lattice Design SLD tiga tingkat (3,3) (panel kanan) untuk model kubik penuh Scheffe

Model dan desain campuran klasik adalah kaku dalam hal struktur model dan ukuran desain mirip dengan apa yang dikatakan tentang desain ortogonal klasik. Desain Simplex-Lattice orde kedua akan membuat semua interaksi dua arah dapat diperkirakan, terlepas dari apakah mereka menarik atau mungkin secara fisik. Struktur model dan ukuran desain dapat ditentukan secara lebih fleksibel dengan desain optimal seperti yang ditunjukkan dengan R-code berikut. Di sini tujuannya adalah untuk secara pelit mengidentifikasi model Scheffe non-standar, dalam notasi-R ~ \(-1 + x_1 + x_2 + x_3 + x_1: x_2 + x_1: x_2: x_3\) , dengan enam putaran dari satu set kandidat dari 60 kandidat campuran reguler . Gambar 5.10 menggambarkan titik desain optimal D dalam ruang campuran yang terdiri dari komponen murni (mengacu pada efek utama \(x_1,x_2,x_3\)), campuran biner \(x_1,x_2\) (untuk istilah interaksi \(x_1:x_2\)) dan dua titik yang dekat dengan pusat massa untuk mengidentifikasi interaksi tiga arah \(x_1:x_2:x_3\).

Gambar 5.10: Desain campuran D-optimal model ~ \(-1 + x_1 + x_2 + x_3 + x_1: x_2 + x_1: x_2: x_3\) ditulis dalam notasi rumus-R

Desain untuk model proses campuran bersilangan penuh (# 5), persamaan (5.5), hasil dari campuran persilangan dan desain proses. Misalkan fac menjadi desain faktorial penuh atau pecahan dengan baris N1 dan kolom P dan campuran desain campuran dimensi \((N_2) x (K)\), hasil kali Kartesius dari dimensi \((N_1 * N_2) x (P + K)\) mendukung persilangan penuh desain proses campuran seperti yang ditunjukkan R-code berikut untuk K = 3 dan P = 3, masing-masing

## [1] 80  6
##      
##             coefficients   Std.err     t.value       Prob
## x1            0.05990870 0.3082853  0.19432872 0.84695368
## x2           -0.57818736 0.3082853 -1.87549413 0.06842376
## x3           -0.20611270 0.3082853 -0.66857769 0.50780621
## x2:x1         0.05555502 1.3647251  0.04070785 0.96774194
## x3:x1        -1.00098144 1.3647251 -0.73346746 0.46777458
## x2:x3         0.85963536 1.3647251  0.62989636 0.53253190
## x1:z1        -0.17240678 0.3082853 -0.55924415 0.57927649
## x1:z2         0.48903461 0.3082853  1.58630507 0.12095767
## x1:z3         0.12188272 0.3082853  0.39535684 0.69479036
## x2:z1         0.22176294 0.3082853  0.71934310 0.47633042
## x2:z2         0.26971744 0.3082853  0.87489542 0.38712724
## x2:z3        -0.03665631 0.3082853 -0.11890384 0.90597790
## x3:z1         0.18778266 0.3082853  0.60911964 0.54606984
## x3:z2         0.04506181 0.3082853  0.14616916 0.88456052
## x3:z3        -0.12555989 0.3082853 -0.40728467 0.68608424
## x2:x1:z1     -1.82763803 1.3647251 -1.33919867 0.18846181
## x2:x1:z2     -0.75822632 1.3647251 -0.55558905 0.58174831
## x2:x1:z3      0.06996290 1.3647251  0.05126520 0.95938274
## x3:x1:z1      0.13423785 1.3647251  0.09836256 0.92216144
## x3:x1:z2     -0.90892644 1.3647251 -0.66601431 0.50942517
## x3:x1:z3      1.30367180 1.3647251  0.95526330 0.34548243
## x2:x3:z1     -0.72218119 1.3647251 -0.52917705 0.59976052
## x2:x3:z2     -1.33291497 1.3647251 -0.97669119 0.33489917
## x2:x3:z3      1.88583297 1.3647251  1.38184092 0.17509079
## x1:z1:z2      0.26702234 0.3082853  0.86615321 0.39184221
## x1:z1:z3     -0.58110294 0.3082853 -1.88495153 0.06710090
## x1:z2:z3     -0.14089678 0.3082853 -0.45703367 0.65024895
## x2:z1:z2     -0.13425104 0.3082853 -0.43547654 0.66568022
## x2:z1:z3      0.01472591 0.3082853  0.04776715 0.96215199
## x2:z2:z3     -0.17024018 0.3082853 -0.55221625 0.58403377
## x3:z1:z2     -0.30992865 0.3082853 -1.00533047 0.32109681
## x3:z1:z3     -0.69175568 0.3082853 -2.24388117 0.03074588
## x3:z2:z3      0.45376014 0.3082853  1.47188357 0.14928650
## x2:x1:z1:z2  -0.45968552 1.3647251 -0.33683378 0.73809548
## x2:x1:z1:z3   0.93480706 1.3647251  0.68497829 0.49751482
## x2:x1:z2:z3   2.83909884 1.3647251  2.08034487 0.04428803
## x3:x1:z1:z2  -0.64270562 1.3647251 -0.47094146 0.64037490
## x3:x1:z1:z3   3.11414546 1.3647251  2.28188481 0.02818482
## x3:x1:z2:z3   2.41847375 1.3647251  1.77213255 0.08439084
## x2:x3:z1:z2  -1.50904885 1.3647251 -1.10575299 0.27578515
## x2:x3:z1:z3   3.01676321 1.3647251  2.21052813 0.03316260
## x2:x3:z2:z3  -1.35284331 1.3647251 -0.99129365 0.32781272
##      
## Residual standard error:  0.926512  on  38 degrees of freedom 
## Corrected Multiple R-squared:  0.5948409
## 
## Call:
## lm(formula = mixmod, data = frame)
## 
## Coefficients:
##          x1           x2           x3        x2:x1        x3:x1        x2:x3  
##     0.05991     -0.57819     -0.20611      0.05556     -1.00098      0.85964  
##       x1:z1        x1:z2        x1:z3        x2:z1        x2:z2        x2:z3  
##    -0.17241      0.48903      0.12188      0.22176      0.26972     -0.03666  
##       x3:z1        x3:z2        x3:z3     x2:x1:z1     x2:x1:z2     x2:x1:z3  
##     0.18778      0.04506     -0.12556     -1.82764     -0.75823      0.06996  
##    x3:x1:z1     x3:x1:z2     x3:x1:z3     x2:x3:z1     x2:x3:z2     x2:x3:z3  
##     0.13424     -0.90893      1.30367     -0.72218     -1.33291      1.88583  
##    x1:z1:z2     x1:z1:z3     x1:z2:z3     x2:z1:z2     x2:z1:z3     x2:z2:z3  
##     0.26702     -0.58110     -0.14090     -0.13425      0.01473     -0.17024  
##    x3:z1:z2     x3:z1:z3     x3:z2:z3  x2:x1:z1:z2  x2:x1:z1:z3  x2:x1:z2:z3  
##    -0.30993     -0.69176      0.45376     -0.45969      0.93481      2.83910  
## x3:x1:z1:z2  x3:x1:z1:z3  x3:x1:z2:z3  x2:x3:z1:z2  x2:x3:z1:z3  x2:x3:z2:z3  
##    -0.64271      3.11415      2.41847     -1.50905      3.01676     -1.35284
## [1] 15.35277

Desain dan model yang saling bersilangan sangat besar dan hampir tidak dapat dilakukan dalam pengaturan laboratorium biasa, dan desain yang sebagian disilang, model # 6 (persamaan (5.6))), mungkin menjadi alternatif yang lebih realistis untuk sebagian besar proyek. Desain proses campuran yang disilangkan sebagian dan pelit dapat dihasilkan dengan memilih titik secara optimal D dari kumpulan kandidat yang sepenuhnya bersilang dengan AlgDesign :: optFederov () seperti yang ditunjukkan oleh kode berikut

## [1] "Warning, when using Model 6 the design in the process variables allow fitting the full quadratic model"
##      
##         coefficients   Std.err    t.value      Prob
## x1         1.1568064 1.1661825  0.9919600 0.3471356
## x2         1.4896200 1.0769369  1.3832007 0.1999491
## x3         0.5302152 1.2014390  0.4413168 0.6693956
## I(z1^2)   -0.4855809 0.5771805 -0.8412983 0.4219706
## I(z2^2)   -0.2406845 0.5947270 -0.4046974 0.6951494
## I(z3^2)   -0.2628178 0.6226630 -0.4220868 0.6828656
## x1:x2     -3.0211103 3.3953217 -0.8897862 0.3967412
## x1:x3      0.3875330 3.5732353  0.1084544 0.9160147
## x2:x3     -2.6004735 3.4484189 -0.7541060 0.4700549
## x1:z1     -0.5310433 0.5583275 -0.9511321 0.3663794
## x1:z2     -0.4529325 0.5666571 -0.7993062 0.4446950
## x1:z3     -0.2559378 0.4999943 -0.5118815 0.6210569
## x2:z1     -0.3321763 0.5764581 -0.5762367 0.5785786
## x2:z2     -0.3683906 0.5352710 -0.6882320 0.5086556
## x2:z3     -0.2032059 0.5336694 -0.3807712 0.7122050
## x3:z1      0.4478906 0.6118973  0.7319702 0.4828108
## x3:z2      0.4189375 0.6242892  0.6710632 0.5190298
## x3:z3     -0.8799695 0.5389427 -1.6327700 0.1369515
## z1:z2      0.1701386 0.4439679  0.3832228 0.7104494
## z1:z3      0.4408563 0.4035429  1.0924644 0.3030079
## z2:z3      0.1727396 0.4084885  0.4228750 0.6823111
##      
## Residual standard error:  1.188226  on  9 degrees of freedom 
## Corrected Multiple R-squared:  0.5440434
## 
## Call:
## lm(formula = mixmod, data = frame)
## 
## Coefficients:
##      x1       x2       x3  I(z1^2)  I(z2^2)  I(z3^2)    x1:x2    x1:x3  
##  1.1568   1.4896   0.5302  -0.4856  -0.2407  -0.2628  -3.0211   0.3875  
##   x2:x3    x1:z1    x1:z2    x1:z3    x2:z1    x2:z2    x2:z3    x3:z1  
## -2.6005  -0.5310  -0.4529  -0.2559  -0.3322  -0.3684  -0.2032   0.4479  
##   x3:z2    x3:z3    z1:z2    z1:z3    z2:z3  
##  0.4189  -0.8800   0.1701   0.4409   0.1727
## [1] 24.00369

Desain terbatas atau tidak beraturan dapat dibangun atau distrukturkan dengan algoritma simpul ekstrim yang diimplementasikan dalam fungsi \(Xvert ()\) dari paket mixexp dengan menentukan dimensi dan kawasan terbatas \((LB_ {i} \ge 0) \leq x_ {i} \leq UB_ { i} \le 1\) dengan \(LB_i\) dan \(UB_i\) masing-masing menunjukkan batas atas dan bawah xi. Konsistensi membutuhkan jumlah dari batas atas untuk melebihi 1, yaitu \(\sum_ {i} UB_ {i}> 1\).

Desain biasa dan tidak beraturan seringkali jarang tersebar dalam mendukung istilah tatanan yang lebih tinggi. Titik interior tambahan dapat dibuat dengan fungsi Fillv () dengan membuat rata-rata dan dengan demikian membuat titik tengah di antara semua kemungkinan pasangan.

Sebaliknya, jika desain yang dibatasi memiliki terlalu banyak proses yang diberikan tujuan proyek, hal itu dapat dikurangi dengan memilih subset titik desain secara optimal dengan fungsi R AlgDesign :: optFederov().

Augmentasi desain terbatas dengan titik interior yang ditunjukkan dengan kode-R berikut, dan gambar 5.11 menunjukkan desain sebelum dan sesudah augmentasi.

Gambar 5.11: Desain terbatas \(x_ {1} <0,3; x_ {2} <0,3; \sum_ {i} x_ {i} = 1\) (panel kiri) dan desain terkait ditambah dengan titik interior (panel kanan);

  • Tabel 5.1 memberikan gambaran umum tentang model dan desain campuran yang telah dibahas sejauh ini dikombinasikan dengan petunjuk singkat tentang cara membuat desain ini di R.

  • Tabel 5.1: Model dan desain campuran beserta petunjuk tentang cara membuat desain di R. Angka (1-6) dalam daftar secara langsung merujuk ke argumen model di R-function mixexp :: MixModel (…, model = ( 1-6))

Akhirnya dan serupa dengan desain ortogonal, desain campuran dapat diblokir jika terdapat parameter gangguan seperti batch bahan baku, teknisi, atau peralatan laboratorium yang berbeda. Meskipun ada beberapa desain campuran yang diblokir secara optimal yang berasal dari prinsip pertama (untuk detailnya lihat (John A. Cornell 1990)), pemblokiran algoritmik dengan R-function AlgDesign :: optBlock () sudah cukup untuk sebagian besar tujuan praktis. Kode contoh berikut akan memblokir desain Simplex-lattic orde tiga dengan sepuluh runs menjadi dua blok dan menggambarkan kedua blok pada gambar 5.12. Selain itu, kode contoh menunjukkan beberapa solusi untuk menghindari beberapa masalah yang tidak tercakup oleh fungsionalitas standar.

Pertama, tentukan variabel \(x_{ij} = x_i-x_j\) untuk menentukan suku kubik \(x_i: x_j: (x_i-x_j)\) dalam ekspresi rumus. Kedua, tentukan variabel baru sesuai dengan block2 = as.integer (block == “B2”) sebagai indikator blok yang unik. Ini diperlukan karena lm () secara default menjatuhkan level pertama dari suatu faktor (di sini \(B_1\) dalam blok = \({B_1, B_2}\)) ketika model memiliki intersep. Namun, ketika tidak ada intersep, baik blockB1 dan blockB2 disimpan dalam matriks model sehingga menjadikan model singular karena blockB1 + blockB2 = 1 dan \(x_1 + x_2 + x_3 = 1\). Masalah ini dielakkan dengan variabel blok baru block2 = as.integer (blok == “B2”). Kemudian parameter lokasi model lm kubik penuh sesuai dengan model yang sebenarnya meskipun tidak ditemukan istilah yang signifikan. Namun, ini tidak mengejutkan karena hanya ada 1 derajat kebebasan yang membuat statistik pengujian sangat konservatif.

## 
## Call:
## lm(formula = y ~ -1 + block + (x1 + x2 + x3)^3 + x1:x2:x12 + 
##     x1:x3:x13 + x2:x3:x23, data = x)
## 
## Residuals:
##          1          2          4          5          6          7          3 
##  1.251e-17 -1.431e-17  2.339e-17  1.079e-01 -1.079e-01 -1.002e-17 -7.683e-18 
##         51         61          8          9         10 
## -1.079e-01  1.079e-01 -2.503e-17  6.674e-18 -1.067e-17 
## 
## Coefficients: (1 not defined because of singularities)
##           Estimate Std. Error t value Pr(>|t|)   
## blockB1     5.0703     0.3052  16.613   0.0383 * 
## blockB2    24.9924     0.2158 115.811   0.0055 **
## x1         -2.0946     0.3738  -5.604   0.1124   
## x2         -2.9911     0.3738  -8.002   0.0791 . 
## x3              NA         NA      NA       NA   
## x1:x2      -0.3166     1.0857  -0.292   0.8194   
## x1:x3       0.3885     0.9403   0.413   0.7505   
## x2:x3      -0.5591     0.9711  -0.576   0.6674   
## x1:x2:x3    1.5672     5.7401   0.273   0.8303   
## x1:x2:x12  10.8875     2.6148   4.164   0.1501   
## x1:x3:x13   0.3372     1.9270   0.175   0.8897   
## x2:x3:x23  -1.3537     2.3787  -0.569   0.6706   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2158 on 1 degrees of freedom
## Multiple R-squared:      1,  Adjusted R-squared:  0.9998 
## F-statistic:  6666 on 11 and 1 DF,  p-value: 0.009553
## [1] 1.90344e+17
## 
## Call:
## lm(formula = y ~ -1 + block2 + (x1 + x2 + x3)^3 + x1:x2:x12 + 
##     x1:x3:x13 + x2:x3:x23, data = x)
## 
## Residuals:
##          1          2          4          5          6          7          3 
## -1.739e-17  2.315e-17 -1.655e-17  1.079e-01 -1.079e-01  9.307e-18 -7.520e-18 
##         51         61          8          9         10 
## -1.079e-01  1.079e-01 -1.215e-18  6.300e-18 -3.478e-17 
## 
## Coefficients:
##           Estimate Std. Error t value Pr(>|t|)   
## block2     19.9221     0.2158  92.316   0.0069 **
## x1          2.9757     0.2158  13.789   0.0461 * 
## x2          2.0792     0.2158   9.635   0.0658 . 
## x3          5.0703     0.3052  16.613   0.0383 * 
## x1:x2      -0.3166     1.0857  -0.292   0.8194   
## x1:x3       0.3885     0.9403   0.413   0.7505   
## x2:x3      -0.5591     0.9711  -0.576   0.6674   
## x1:x2:x3    1.5672     5.7401   0.273   0.8303   
## x1:x2:x12  10.8875     2.6148   4.164   0.1501   
## x1:x3:x13   0.3372     1.9270   0.175   0.8897   
## x2:x3:x23  -1.3537     2.3787  -0.569   0.6706   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2158 on 1 degrees of freedom
## Multiple R-squared:      1,  Adjusted R-squared:  0.9998 
## F-statistic:  6666 on 11 and 1 DF,  p-value: 0.009553
## [1] 47.5957

Gambar 5.12: Desain campuran kubik penuh dalam dua blok B1 (panel kiri) dan B2 (panel kanan)

2 Referensi

John A. Cornell. 1990. Experiments with Mixtures. 2nd ed. Wiley, New York.

John Lawson, Cameron Willden. 2016. “Mixture Experiments in R Using Mixexp.” Journal of Statistical Software 72. https://www.jstatsoft.org/article/view/v072c02.

R.H. Myers, D.C. Montgomery. 2002. Response Surface Methodology: Process and Product Optimization Using Designed Experiments. 2nd ed. John Wiley & Sons.

  • Lebih tepatnya, cukup mereduksi model kubik #4 menjadi model kuadrat #2 jika efek urutan ketiga tidak signifikan, atau untuk mengurangi #2 menjadi #1 jika efek kuadrat tidak signifikan.↩

  • Lokasi yang tepat dari optimum tetap tidak jelas dalam plot kontur. Dengan bantuan optimasi, subjek bab 6, maksimum dapat ditemukan menjadi \(x_ {1} ^ * = 0.41, x_ {2} ^ * = 0.34, x_ {3} ^ * = 0.25\)dengan tingkat etsa yang diharapkan pada saat ini \(\hat y = 832\).↩

  • Jumlah run sama dengan jumlah regresi. Ini akan memberikan kesesuaian yang sempurna dengan \(R^2=1\).

LS0tDQp0aXRsZTogIk1peHR1cmUgRXhwZXJpbWVudHMiDQphdXRob3I6ICJOaWNob2xhcyBBbmRyaWFuIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICB0aGVtZTogc3BhY2VsYWINCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCi0tLQ0KDQpgYGB7ciBMb2dvLCBlY2hvPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoID0gJzQwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiaHR0cHM6Ly9naXRodWIuY29tL0Jha3RpLVNpcmVnYXIvaW1hZ2VzL2Jsb2IvbWFzdGVyL2xvZ28ucG5nP3Jhdz10cnVlIikNCmBgYA0KDQojIEVrc3BlcmltZW4gQ2FtcHVyYW4gDQpTZW11YSBkZXNhaW4geWFuZyBkaWJhaGFzIHBhZGEgYmFiIDQgc2ViZWx1bW55YSB0ZXJtYXN1ayBkYWxhbSBrZWxhcyBkZXNhaW4gb3J0b2dvbmFsIGRpIG1hbmEgc2VtdWEgZmFrdG9yIGJlcnZhcmlhc2kgc2VjYXJhIGluZGVwZW5kZW4uIE5hbXVuLCBkYWxhbSBiYW55YWsgcGVuZ2FwbGlrYXNpYW4gZGFuIHRlcnV0YW1hIGRhbGFtIGlsbXUga2ltaWEgYWRhIGthc3VzIGRpIG1hbmEgZmFrdG9yIHRpZGFrIGRhcGF0IGRhbiB0aWRhayBib2xlaCBkaXZhcmlhc2lrYW4gc2VjYXJhIGluZGVwZW5kZW4uIEppa2EsIGthdGFrYW5sYWgsIGFkYSB0aWdhIHNlbnlhd2EgJHgxLCB4MiwgeDMkLCBzZW11YW55YSBkYWxhbSBraXNhcmFuIDAtMSBkZW5nYW4gMSBtZW51bmp1a2thbiBrb21wb25lbiBtdXJuaSwgZGVzYWluIGRhcmkgcGVuY2FtcHVyYW4ga29tcG9uZW4gaW5pIGhhcnVzIG1lbWF0dWhpIGF0dXJhbiBjYW1wdXJhbiAkKFxzdW1fe2l9IHhfe2l9PTEpJC4gU2ViZW5hcm55YSwgc2VtdWEgbWFzYWxhaCBkYWxhbSBraW1pYSBhZGFsYWggbWFzYWxhaCBjYW1wdXJhbiwgdGV0YXBpIGRhbGFtIGJhbnlhayBrYXN1cywgcGVsYXJ1dCBkaXBlcmxha3VrYW4gc2ViYWdhaSDigJxwZW5naXNp4oCdIGluZXJ0IHlhbmcgdGlkYWsgYmVya29udHJpYnVzaSBwYWRhIGJhdGFzYW4gY2FtcHVyYW4gZGFuIGRlbmdhbiBkZW1pa2lhbiBtZW11bmdraW5rYW4gZmFrdG9yIGtvbnNlbnRyYXNpIHlhbmcgdGVyc2lzYSB1bnR1ayBiZXJ2YXJpYXNpIHNlY2FyYSBpbmRlcGVuZGVuLiBLYXJlbmEga2VuZGFsYSBhdGF1IGJhdGFzYW4gY2FtcHVyYW4sIG1hc2FsYWggY2FtcHVyYW4gbWVtZXJsdWthbiBtb2RlbCBwYXJhbWV0cmlrIGtodXN1cyBkYW4gc2VzdWFpIGRlbmdhbiBtb2RlbCBkZXNhaW4ga2h1c3VzIGluaS4gTW9kZWwgY2FtcHVyYW4gZGFuIGRlc2FpbiBjYW1wdXJhbiBha2FuIGRpcGVya2VuYWxrYW4gcGFkYSBiYWdpYW4gYmVyaWt1dCBkYW4gcGVuZ2d1bmFhbm55YSBkaSBSIGFrYW4gZGl0dW5qdWtrYW4gZGVuZ2FuIGJlYmVyYXBhIGNvbnRvaCBsaXRlcmF0dXIuIFNlYnVhaCB0aW5qYXVhbiBrb21wcmVoZW5zaWYgdGVudGFuZyBla3NwZXJpbWVuIGNhbXB1cmFuIGRhbiBzdW1iZXIgeWFuZyBiYWlrIHVudHVrIGJhY2FhbiBsZWJpaCBsYW5qdXQgYWRhbGFoIGJ1a3UgKEpvaG4gQS4gQ29ybmVsbCAxOTkwKS4gKEpvaG4gTGF3c29uLCBDYW1lcm9uIFdpbGxkZW4gMjAxNikgbWVtYmVyaWthbiBnYW1iYXJhbiB1bXVtIHRlbnRhbmcgcGFrZXQgbWl4ZXhwLCBrdW1wdWxhbiBmdW5nc2kgdW50dWsgbWVtYnVhdCBkYW4gbWVuZ2FuYWxpc2lzIGRlc2FpbiBjYW1wdXJhbiBkaSBSLg0KDQojIyBNb2RlbCBDYW1wdXJhbg0KTWVuY29iYSBtZW5naWRlbnRpZmlrYXNpIG1vZGVsIE9MUyBwYXJhbWV0cmlrICRcaGF0IHkgPSBhXyB7MH0gKyBhXyB7MX0gXGNkb3QgeF8gezF9ICsgYV8gezJ9IFxjZG90IHhfIHsyfSArIGFfIHszfSBcY2RvdCB4XyB7M314MyQgbWVuZ2luZ2F0IGJhdGFzYW4gY2FtcHVyYW4gJFxzdW1fIHtpID0gMX0gXiAzeF8ge2l9ID0gMSQgYWthbiBnYWdhbCBrYXJlbmEgYmF0YXNhbiBjYW1wdXJhbiBtZW1idWF0IHNhdHUgdmFyaWFiZWwgbWVuamFkaSBiZXJsZWJpaGFuLiBTYWxhaCBzYXR1IGNhcmEgbWVuYW5nYW5pIHNpbmd1bGFyaXRhcyBhZGFsYWggZGVuZ2FuIG1lbGVwYXNrYW4gc2F0dSB2YXJpYWJlbCwgbWlzYWxueWEgJHgzJCwgZGFuIG1lbGFuanV0a2FuIGRlbmdhbiBtb2RlbCB5YW5nIGRpa3VyYW5naSAkXGhhdCB5ID0gYV8gezB9IF4geyd9ICsgYV8gezF9IFxjZG90IHhfIHsxfSBeIHsnIH0gKyBhXyB7Mn0gXGNkb3QgeF8gezJ9IF4geyd9MiQgZGFuIGtvbmRpc2kgdGFtYmFoYW4gJHgzID0gMSAtIHgxIC0geDIkLiBJbmkgZGlzZWJ1dCBwZW5kZWthdGFuIHZhcmlhYmVsIHNsYWNrIGRlbmdhbiB2YXJpYWJlbCBzbGFjaywgZGkgc2luaSB4MywgYmlhc2FueWEgZGlwaWxpaCBzZWJhZ2FpIGtvbXBvbmVuIHlhbmcgcGFsaW5nIGluZXJ0LiBQZXJoYXRpa2FuIGJhaHdhIHZhcmlhYmVsIGxhaW4gZGFwYXQgZGlrZWN1YWxpa2FuIHRhbnBhIG1lbWVuZ2FydWhpIHN0YXRpc3RpayBtb2RlbCwga2FyZW5hIHNlbXVhIG1vZGVsIHZhcmlhYmVsIHNsYWNrIHNlY2FyYSBzdGF0aXN0aWsgbWVyb3NvdCBkYW4gYWthbiBtZW1iZXJpa2FuIHByZWRpa3NpIHlhbmcgc2FtYS4gQ2FyYSB5YW5nIGxlYmloIGFsYW1pIHVudHVrIG1lbmFuZ2FuaSBiYXRhc2FuIGxpbmllciBhZGFsYWggZGVuZ2FuIG1lbmdpbnRlZ3Jhc2lrYW4gYmF0YXNhbiBjYW1wdXJhbiAkXHN1bV8ge2l9IHhfIHtpfSA9IDEkIGtlIGRhbGFtIHBlcnNhbWFhbiByZWdyZXNpLCB5YW5nIG1lbmdhcmFoIGtlIGFwYSB5YW5nIGRpc2VidXQgbW9kZWwgU2NoZWZmZSwgZGluYW1haSBzZXN1YWkgbmFtYSBpbG11d2FuIHlhbmcgcGVydGFtYSBtZW51cnVua2FuIHBlcnNhbWFhbiBpbmkuIERhcmkgbW9kZWwgcGFyYW1ldHJpaw0KDQokXGhhdCB5ID0gYV8gezB9ICsgYV8gezF9IFxjZG90IHhfIHsxfSArIGFfIHsyfSBcY2RvdCB4XyB7Mn0gKyBhXyB7M30gXGNkb3QgeF8gezN9JA0KDQpkYW4ga29udHJhcyBjYW1wdXJhbg0KDQokeF8gezF9ICsgeF8gezJ9ICsgeF8gezN9ID0gMSQNCg0KZGlpa3V0aSBkZW5nYW4gc3Vic3RpdHVzaQ0KDQokXGhhdCB5ID0gYV8gezB9ICh4XyB7MX0gKyB4XyB7Mn0gKyB4XyB7MyB9KSArIGFfIHsxfSBcY2RvdCB4XyB7MX0gKyBhXyB7Mn0gXGNkb3QgeF8gezJ9ICsgYV8gezN9IFxjZG90IHhfIHszfSBcTGVmdHJpZ2h0YXJyb3ckDQoNCiRcaGF0IHkgPSAoYV8gezB9ICsgYV8gezF9KSBcY2RvdCB4XyB7MX0gKyAoYV8gezB9ICsgYV8gezJ9KSBcY2RvdCB4XyB7Mn0gKyAoYV8gezB9ICsgYV8gezN9KSBcY2RvdCB4XyB7M30kDQoNCm1vZGVsIGVmZWsgdXRhbWEgU2NoZWZmZQ0KJFxoYXQgeSA9IGFfIHsxfSBeIHsnfSBcY2RvdCB4XyB7MX0gKyBhXyB7Mn0gXiB7J30gXGNkb3QgeF8gezJ9ICsgYV8gezN9IF4geyd9IFxjZG90IHhfIHszfSQNCg0KWWFuZyBtZWx1YXMgdW50dWsga29tcG9uZW4gY2FtcHVyYW4gSyBrZSBtb2RlbCBlZmVrIHV0YW1hIFNjaGVmZmUsIHBlcnNhbWFhbiAoNS4xKQ0KDQokXGJlZ2luIHtlcXVhdGlvbn0geSA9IFxzdW1fIHtpID0gMX0gXiB7S30gYV8ge2l9IF4geyd9IFxjZG90IHhfIHtpfSArIFxlcHNpbG9uIFx0YWcgezUuMX0gXGVuZCB7ZXF1YXRpb259JA0KDQpEYXJpIHBlcnNhbWFhbiAoNS4xKSBkYW4gYmF0YXNhbiBjYW1wdXJhbiBtZW5naWt1dGkgaWRlbnRpdGFzICRcaGF0IHt5fV97eF8ge2l9ID0gMX0gPSBhXyB7aX0gXiB7J30kLCBzZWhpbmdnYSBrb2VmaXNpZW4gcmVncmVzaSBhZGFsYWggbmlsYWkgeWFuZyBkaWhhcmFwa2FuICRcaGF0IHlfIHtpfSQgZGFyaSBrb21wb25lbiBtdXJuaSAkeF9pJCBkZW5nYW4gY2FtcHVyYW4gcGVuanVtbGFoYW4gdGVyYm9ib3QgZGFyaSBrb21wb25lbiBtdXJuaS4gRGFsYW0gbW9kZWwgbGluZWFyIFNjaGVmZmUsIGtvbXBvbmVuLWtvbXBvbmVuIHRpZGFrIGJlcmludGVyYWtzaSBkYW4gaW5pIG11bmdraW4gbWVydXBha2FuIGFzdW1zaSB5YW5nIHRlcmxhbHUga2V0YXQgdW50dWsgYmFueWFrIGFwbGlrYXNpIHNlaGluZ2dhIG1lbW90aXZhc2kgbW9kZWwgU2NoZWZmZSBrdWFkcmF0Lg0KDQpEaW11bGFpIGRlbmdhbiBtb2RlbCBrdWFkcmF0IA0KDQokXGhhdCB5ID0gYV8gezB9ICsgYV8gezF9IFxjZG90IHhfIHsxfSArIGFfIHsyfSBcY2RvdCB4XyB7Mn0gKyBhXyB7M30gXGNkb3QgeF8gezN9ICsgYV8gezR9IFxjZG90IHhfIHsxfSBeIDIgKyBhXyB7NX0gXGNkb3QgeF8gezJ9IF4gMiArIGFfIHs2fSBcY2RvdCB4XyB7M30gXiAyICsgYV8gezd9IFxjZG90IHhfIHsxfSBcY2RvdCB4XyB7Mn0gKyBhXyB7OH0gXGNkb3QgeF8gezF9IFxjZG90IHhfIHszfSArIGFfIHs5fSBcY2RvdCB4XyB7Mn0gXGNkb3QgeF8gezN9JA0KDQpkZW5nYW4gbWVuZ2ludGVncmFzaWthbiBiYXRhc2FuIGNhbXB1cmFuIG1vZGVsIFNjaGVmZmUga3VhZHJhdCBhZGFsYWggZGlwZXJvbGVoDQoNCiRcaGF0IHkgPSBhXyB7MX0gXiB7J30gXGNkb3QgeF8gezF9ICsgYV8gezJ9IF4geyd9IFxjZG90IHhfIHsyfSArIGFfIHszfSBeIHsnfSBcY2RvdCB4XyB7MyB9ICsgYV8gezR9IF4geyd9IFxjZG90IHhfIHsxfSBcY2RvdCB4XyB7Mn0gKyBhXyB7NX0gXiB7J30gXGNkb3QgeF8gezF9IFxjZG90IHhfIHszfSArIGFfIHs2fSBeIHsgJ30gXGNkb3QgeF8gezJ9IFxjZG90IHhfIHszfSQNCg0KZGVuZ2FuIG1vZGVsIFNjaGVmZmUga3VhZHJhdCB1bXVtIHVudHVrIGtvbXBvbmVuIEsgeWFuZyBkaWJlcmlrYW4gb2xlaCBwZXJzYW1hYW4gKDUuMikNCg0KJFxiZWdpbiB7ZXF1YXRpb259IHkgPSBcc3VtXyB7aSA9IDF9IF4ge0t9IGFfIHtpfSBeIHsnfSBcY2RvdCB4XyB7aX0gKyBcc3VtXyB7aj4gaX0gXiB7S30gYV8ge2lqfSBeIHsnfSBcY2RvdCB4XyB7aX0gXGNkb3QgeF8ge2p9ICsgXGVwc2lsb24gXHRhZyB7NS4yfSBcZW5kIHtlcXVhdGlvbn0kDQoNClVudHVrIGNhbXB1cmFuIGJpbmVyIGFwYSBwdW4gJHhfaSA9IDAuNSwgeF9qID0gMC41JCBtZW5naWt1dGkgcGVyc2FtYWFuICg1LjIpIHBlcnNhbWFhbg0KDQokXGhhdCB5XyB7eF8ge2l9ID0gMCw1OyB4XyB7an0gPSAwLDV9ID0gXGZyYWMge2FfIHtpfSArIGFfIHsgan19IHsyfSArIFxmcmFjIHthXyB7aWp9fSB7NH0kDQoNCnlhbmcgZGlnYW1iYXJrYW4gZGFsYW0gZ2FtYmFyIDUuMSBzZWNhcmEgZ3JhZmlzIHVudHVrIGR1YSBjYW1wdXJhbiBiaW5lciBkZW5nYW4gJGFfe2lqfSA+IDAkIChzaW5lcmdpc21lKSBkYW4gJGFfe2lqfSA8MCQgKGFudGFnb25pc21lKS4gR2FyaXMgbHVydXMgbWVudW5qdWtrYW4gbW9kZWwgU2NoZWZmZSBsaW5pZXIgZGVuZ2FuICRhX3tpan0kLg0KDQpgYGB7cixtZXNzYWdlPUZBTFNFfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIm1peHR1cmUxLTEucG5nIikNCmBgYA0KDQpHYW1iYXIgNS4xOiBQbG90IHJlc3BvbnMgbW9kZWwgU2NoZWZmZSBrdWFkcmF0IHVudHVrIGNhbXB1cmFuIGJpbmVyIHgxLCB4Mg0KDQpkZW5nYW4gZWZlayBzaW5lcmdpcyBkYW4gYW50YWdvbmlzIGJlcmxhYmVsIG1lcmFoIGRhbiBiaXJ1Lg0KDQpBa3VudGFuc2kgdW50dWsgZWZlayBvcmRlIHRpbmdnaSBzZXBlcnRpIGludGVyYWtzaSB0ZXJuZXIgZGFwYXQgZGljYXBhaSBkZW5nYW4gbWVuYW1iYWggbW9kZWwgU2NoZWZmZSBrdWFkcmF0IGRlbmdhbiBpc3RpbGFoIGludGVyYWtzaSBvcmRlIHRpbmdnaSBzZXBlcnRpIGRhbGFtIG1vZGVsIFNjaGVmZmUga3ViaWsgcGVudWgsIGxpaGF0IHBlcnNhbWFhbiAoNS4zKQ0KDQokXGJlZ2luIHtlcXVhdGlvbn0geSA9IFxzdW1fIHtpID0gMX0gXiB7S30gYV8ge2l9IFxjZG90IHhfIHtpfSArIFxzdW1fIHtqPiBpfSBeIHtLfSBhXyB7aWp9IFxjZG90IHhfIHsgaX0gXGNkb3QgeF8ge2p9ICsgXHN1bV8ge2o+IGl9IF4ge0t9IFxkZWx0YV8ge2lqfSBcY2RvdCB4XyB7aX0gXGNkb3QgeF8ge2p9IFxjZG90ICh4XyB7aX0gLSB4XyB7an0pICsgXHN1bV8ge2s+IGo+IGl9IF4ge0t9IGFfIHtpamt9IFxjZG90IHhfIHtpfSBcY2RvdCB4XyB7an0gXGNkb3QgeF8ge2t9ICsgXGVwc2lsb24gXHRhZyB7NS4zfSBcZW5kIHtlcXVhdGlvbn0kDQoNCkdhbWJhciA1LjIgbWVudW5qdWtrYW4gcGxvdCBjYW1wdXJhbiBiaW5lciBkYXJpIG1vZGVsIGt1YmlrIHBlbnVoLCB5YW5nIHNla2FyYW5nIGRhcGF0IG1lbmplbGFza2FuIGVmZWsgc2luZXJnaXMgZGFuIGFudGFnb25pc3RpayBkYWxhbSBydWFuZyBjYW1wdXJhbi4gTW9kZWwga3ViaWsgeWFuZyBtZW5kYXNhcmkgZ2FtYmFyIDUuMiBhZGFsYWggYmVudHVrIHBhcmFtZXRyaWsgDQokXGhhdCB5ID0gYV8gezF9IFxjZG90IHhfIHsxfSArIGFfIHsyfSBcY2RvdCB4XyB7Mn0gKyBhXyB7MTJ9IFxjZG90IHhfIHsxfSBcY2RvdCB4XyB7Mn0gKyBcZGVsdGFfIHsxMn0gXGNkb3QgeF8gezF9IFxjZG90IHhfIHsyfSBcY2RvdCAoeF8gezF9IC14XyB7Mn0pJCBkZW5nYW4gcGFyYW1ldGVyIGRpc2V0ZWwga2UgJGFfMSA9IDUwLCBhXzIgPSAxMDAsIGFfezEyfSA9IDAgZGFuIFxkZWx0YV8gezEyfSA9IC0gMjAwJC4NCg0KYGBge3J9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiZ2FtYmFyIDIucG5nIikNCmBgYA0KDQpHYW1iYXIgNS4yOiBQbG90IHJlc3BvbiBtb2RlbCBrdWJpayBTY2hlZmZlIHVudHVrIGNhbXB1cmFuIGJpbmVyIHgxLCB4MiBkZW5nYW4gZWZlayBzaW5lcmdpcyBkYW4gYW50YWdvbmlzIGRhbGFtIHJ1YW5nIGNhbXB1cmFuDQoNCk1vZGVsIGt1YmlrIHBlbnVoLCBydW11cyAoNS4zKSwgc2FuZ2F0IGZsZWtzaWJlbCBrYXJlbmEgYmFueWFrbnlhIHBhcmFtZXRlciByZWdyZXNpLCBzZWhpbmdnYSBjZW5kZXJ1bmcgbXVkYWggbWVueWVzdWFpa2FuIGRhdGEuIFNlcmluZ2thbGkgbW9kZWwga3ViaWsgdGVyZWR1a3NpLCBwZXJzYW1hYW4gKDUuNCksIGN1a3VwIGtvbXBsZWtzIHVudHVrIG1lbmdnYW1iYXJrYW4gc2l0dWFzaSBla3NwZXJpbWVudGFsIHNlY2FyYSBtZW1hZGFpLg0KDQokXGJlZ2luIHtlcXVhdGlvbn0geSA9IFxzdW1fIHtpID0gMX0gXiB7S30gYV8ge2l9IFxjZG90IHhfIHtpfSArIFxzdW1fIHtqPiBpfSBeIHtLfSBhXyB7aWp9IFxjZG90IHhfIHsgaX0gXGNkb3QgeF8ge2p9ICsgXHN1bV8ge2s+IGo+IGl9IF4ge0t9IGFfIHtpamt9IFxjZG90IHhfIHtpfSBcY2RvdCB4XyB7an0gXGNkb3QgeF8ge2t9ICsgXGVwc2lsb24gXHRhZyB7IDUuNH0gXGVuZCB7ZXF1YXRpb259JA0KDQpNb2RlbCBjYW1wdXJhbiB5YW5nIGRpamVsYXNrYW4gZGkgYXRhcyAtIG1vZGVsIGt1YmlrIGxpbmllciwga3VhZHJhdCwgcGVudWggZGFuIHRlcmVkdWtzaSAoa2h1c3VzKSAtIGFkYWxhaCBjdWt1cCB1bnR1ayBtZW1vZGVsa2FuIHNlYmFnaWFuIGJlc2FyIHNpc3RlbSBjYW1wdXJhbiBkZW5nYW4gdGVwYXQgZGFuIGRhcGF0IGRpZ3VuYWthbiBzZWJhZ2FpIGJsb2sgYmFuZ3VuYW4gdW50dWsgbWVtb2RlbGthbiBkZXNhaW4gcHJvc2VzIGNhbXB1cmFuLCBkaSBtYW5hIGtvbXBvbmVuIGNhbXB1cmFuIEsgYWRhbGFoICR4XzEsIHhfMiAs4oCmIFhfSyQgZGlnYWJ1bmdrYW4gZGVuZ2FuIGZha3RvciBwcm9zZXMgUCB5YW5nIG1hbmEgJHpfMSwgel8yLOKApiB6X1AkLiBNb2RlbCBwcm9zZXMgY2FtcHVyYW4gcGVydGFtYSBkaWhhc2lsa2FuIGRhcmkgcGVycG90b25nYW4gcGVudWggbW9kZWwgU2NoZWZmZSBrdWFkcmF0IGRlbmdhbiBtb2RlbCBwcm9zZXMgZmFrdG9yaWFsIChiaWxpbmVhciksIHlhaXR1Og0KDQokeSA9IFxCaWdnIChcc3VtXyB7aSA9IDF9IF4ge0t9IGFfIHtpfSBcY2RvdCB4XyB7IGl9ICsgXHN1bV8ge2o+IGl9IF4ge0t9IGFfIHtpan0gXGNkb3QgeF8ge2l9IFxjZG90IHhfIHtqfSBcQmlnZykgXGNkb3QgXEJpZ2cgKFxhbHBoYV8gezB9ICsgXHN1bV8ge2wgPSAxIH0gXiBQIFxhbHBoYV8ge2x9IFxjZG90IHpfIHtsfSArIFxzdW1fIHttPiBsfSBeIFIgXGFscGhhXyB7bG19IFxjZG90IHpfIHtsfSBcY2RvdCB6XyB7bX0gXEJpZ2cpICsgXGVwc2lsb24kDQoNCmRhbiBkYXJpIGVrc3BhbnNpIHByb2R1ayBtZW5naWt1dGkgbGFuZ3N1bmcgbW9kZWwgcGFyYW1ldHJpaywgcGVyc2FtYWFuICg1LjUpDQoNCiRcYmVnaW4ge2FsaWdufSB5ID0gJiBcc3VtXyB7aSA9IDF9IF4ge0t9IGJfIHtpfSBcY2RvdCB4XyB7aX0gKyBcc3VtXyB7aj4gaX0gXiB7S30gYl8ge2lqfSBcY2RvdCB4XyB7aX0gXGNkb3QgeF8ge2p9ICsgXHN1bV8ge2kgPSAxfSBeIEsgXHN1bV8ge2wgPSAxfSBeIFAgYl8ge2lsfSBeIHsnfSBcY2RvdCB4XyB7aX0gXGNkb3Qgel8ge2x9ICsgXHN1bV8ge2o+IGl9IF4gSyBcc3VtXyB7bCA9IDF9IF4gUCBiXyB7aWpsfSBeIHsnfSBcY2RvdCB4XyB7aX0gXGNkb3QgeF8ge2p9IFxjZG90IHpfIHtsfSBcICsgXG5vdGFnIFxcICYgXHN1bV8ge2l9IF4gSyBcc3VtXyB7bT4gbH0gXiBQIGJfIHtpbG19IF4geyd9IFxjZG90IHhfIHtpfSBcY2RvdCB6XyB7bH0gXGNkb3Qgel8ge219ICsgXHN1bV8ge2o+IGl9IF4gSyBcc3VtXyB7bT4gbH0gXiBQIGJfIHtpamxtfSBeIHsnfSBcY2RvdCB4XyB7aX0gXGNkb3QgeF8ge2p9IFxjZG90IHpfIHtsfSBcY2RvdCB6XyB7bX0gKyBcZXBzaWxvbiBcdGFnIHs1LjUgfSBcZW5kIHthbGlnbn0kDQoNCkp1bWxhaCBrb2VmaXNpZW4gcmVncmVzaSBkYWxhbSBydW11cyAoNS41KSBzZWJhZ2FpIGZ1bmdzaSBLIGRhbiBQIHR1bWJ1aCBkZW5nYW4gY2VwYXQgbWVtYnVhdCBkZXNhaW4gc2lsYW5nIG1lbmphZGkgcGVuZ2d1bmFhbiB0ZXJiYXRhcyB1bnR1ayBzZWJhZ2lhbiBiZXNhciBhcGxpa2FzaS4gTW9kZWwgeWFuZyBsZWJpaCBzdWxpdCBkaXBlcm9sZWggZGVuZ2FuIHNlY2FyYSBraHVzdXMgeWFpdHUgZGVuZ2FuIG1lbmdodWJ1bmdrYW4gbW9kZWwgU2NoZWZmZSBrdWFkcmF0IGRlbmdhbiBtb2RlbCBSU00geWFuZyBtZW5nYXJhaCBrZSBwZXJzYW1hYW4gKDUuNikNCg0KJFxiZWdpbntlcXVhdGlvbn0geSA9IFxzdW1fe2k9MX1ee0t9Yl97aX1cY2RvdCB4X3tpfSArIFxzdW1fe2o+aX1ee0t9IGJfe2lqfSBcY2RvdCB4X3tpfSBcY2RvdCB4X3tqfSArIFxzdW1fe2k9MX1eSyBcc3VtX3tsPTF9XlAgYl97aWx9XnsnfSBcY2RvdCB4X3tpfSBcY2RvdCB6X3tsfSArIFxzdW1fe20+bH1eUCBiX3tsbX1eeyd9IFxjZG90IHpfe2x9IFxjZG90IHpfe219KyBcc3VtX3tsPTF9XlAgYl97bGx9IFxjZG90IHpfe2x9XjIgKyBcZXBzaWxvbiBcdGFnezUuNn0gXGVuZHtlcXVhdGlvbn0kDQoNCm1wYXQgbW9kZWwgY2FtcHVyYW4sIHBlcnNhbWFhbiAjIDE6ICg1LjEpLCAjIDI6ICg1LjIpLCAjIDM6ICg1LjMpLCAjIDQ6ICg1LjQpIGRhbiBkdWEgZGVzYWluIHByb3NlcyBjYW1wdXJhbiwgcHJvc2VzIGRlc2FpbiBjYW1wdXJhbiBiZXJzaWxhbmdhbiBhbnRhcmEgcGVudWggZGFuIHNlYmFnaWFuLCBwZXJzYW1hYW4gIyA1OiAoNS41KSBkYW4gIyA2OiAoNS42KSwgZGFwYXQgZGVuZ2FuIG11ZGFoIGRpcmVmZXJlbnNpa2FuIG9sZWggYXJndW1lbiBtb2RlbCBkYWxhbSBSLWZ1bmN0aW9uIG1peGV4cCA6OiBNaXhNb2RlbCAo4oCmLCBtb2RlbCA9ICMpIGRlbmdhbiAjIHlhbmcgbWVudW5qdWtrYW4gbm9tb3IgbW9kZWwgZGFsYW0gZGFmdGFyIGRpIGF0YXMuDQoNClNhYXQgbWVuZ2FuYWxpc2lzIGVrc3BlcmltZW4gY2FtcHVyYW4sIHNlbXVhIHByaW5zaXAgdmFsaWRhc2kgbW9kZWwgT0xTIGJlcmxha3Ugc2VwZXJ0aSBwZW5ndWppYW4gc3RhdGlzdGlrIGRhbiBhbmFsaXNpcyByZXNpZHVhbCBzZXBlcnRpIHlhbmcgYWthbiBkaXR1bmp1a2thbiBkZW5nYW4gYmViZXJhcGEgY29udG9oIGRhdGEgeWFuZyBkaXNlZGlha2FuIGRlbmdhbiBtaXhleHAgcGFrZXQgUiBkYXJpIChSLkguIE15ZXJzLCBELkMuIE1vbnRnb21lcnkgMjAwMikuIFR1anVhbiBwZXJjb2JhYW4gYWRhbGFoIHVudHVrIG1lbmVtdWthbiBwZXJwYWR1YW4geWFuZyBvcHRpbWFsIGRhcmkga29tcG9uZW4geDEsIHgyLCB4MyB5YW5nIG1lbWFrc2ltYWxrYW4gbGFqdSBzaWxpa29uIGV0c2Egd2FmZXIgKHJlc3BvbiBlcmF0ZSkuIFJhbmNhbmdhbiBwZXJjb2JhYW4gaW5pIGFkYWxhaCBSYW5jYW5nYW4gU2ltcGxleC1DZW50cm9pZCB5YW5nIGRpcmVwbGlrYXNpIHNlYmFnaWFuIChkaWplbGFza2FuIGtlbXVkaWFuKSBkaXRhbWJhaCBkZW5nYW4gYmViZXJhcGEgdGl0aWsgaW50ZXJpb3IuIERlc2Fpbm55YSBzZWNhcmEgbWFrc2ltYWwgbWVuZHVrdW5nIG1vZGVsIGt1YmlrIHlhbmcgZGlrdXJhbmdpIGRhbiBha2FuIGJlcmZ1bmdzaSBkaSBzaW5pIHNlYmFnYWkgY29udG9oIHVudHVrIG1lbmRlbW9uc3RyYXNpa2FuIGJlYmVyYXBhIGZ1bmdzaSBkYXJpIG1peGV4cC4gQmVyYmVkYSBkYXJpIG1vZGVsIG9ydG9nb25hbCwgZGFsYW0gbW9kZWwgY2FtcHVyYW4gYmlhc2FueWEgdGlkYWsgbXVuZ2tpbiB1bnR1ayBtZW5naGlsYW5na2FubiBzYXR1IHBlciBzYXR1IGlzdGlsYWggbW9kZWwgeWFuZyB0aWRhayBzaWduaWZpa2FuIGthcmVuYSBoYWwgaW5pIGFrYW4gbWVsYW5nZ2FyIGJhdGFzYW4gY2FtcHVyYW4gZGFuIG1lbWJ1YXQgbW9kZWwgbWVuamFkaSB0dW5nZ2FsLiBCaWFzYW55YSBjdWt1cCB1bnR1ayBtZW1pbGloIGRpIGFudGFyYSBtb2RlbCAjIDEtICMgNCB1bnR1ayBtZW5kZXNrcmlwc2lrYW4gZGF0YSBkZW5nYW4gdGVwYXQgZGFsYW0gZG9tYWluIG1vZGVsNDEuDQoNCkNvbnRvaCBkYXRhIGRpdHVuanVra2FuIHBhZGEgZ2FtYmFyIDUuMyBzZWJhZ2FpIHBsb3QgdGVybmVyIGRhbiBtZW5kdWt1bmcgbW9kZWwgIzEsICMyIGF0YXUgIzQuIFJlcGxpa2FzaSBkaXRhbmRhaSBkZW5nYW4gbGluZ2thcmFuIGRhbiBkaXNlaW1iYW5na2FuIGRlbmdhbiBiYWlrIGRpIGF0YXMgcnVhbmcgZGVzYWluIGFnYXIgdGlkYWsgbWVuZ2dhbmdndSBvcnRvZ29uYWxpdGFzIGRlc2Fpbi4NCg0KYGBge3J9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiZ2FtYmFyMy5wbmciKQ0KYGBgDQoNCkdhbWJhciA1LjM6IFBsb3QgdGVybmVyIGRhcmkgZGF0YSBldHNhIGRlbmdhbiB1bGFuZ2FuIHlhbmcgZGl0YW5kYWkgZGVuZ2FuIGxpbmdrYXJhbg0KDQpNZW5naWt1dGkgcHJpbnNpcCBrZXNlZGVyaGFuYWFuLCBkYXRhIHBlcnRhbWEtdGFtYSBkaWFuYWxpc2lzIGRlbmdhbiBtb2RlbCBTY2hlZmZlIGt1YWRyYXQgZGFuIHNlbGFuanV0bnlhIGRlbmdhbiBtb2RlbCBrdWJpayB0ZXJlZHVrc2ksIGRhbiByZXNpZHUgZGliYW5kaW5na2FuIHBhZGEgZ2FtYmFyIDUuNCAocGVyaGF0aWthbiBiYWh3YSAkUl4yJA0KZGkgZGFsYW0gb3V0cHV0bG0gZGFyaSBtb2RlbCB0YW5wYSBpbnRlcnNlcCBhZGFsYWggYmlhcyBkYW4gaGFydXMgZGlhYmFpa2FuLiBOaWxhaSAkUl4yJCB5YW5nIGRpbGFwb3JrYW4gb2xlaCBNaXhNb2RlbCBzdWRhaCBiZW5hciBkYW4gc2ViYWdhaSBnYW50aW55YSBoYXJ1cyBkaWd1bmFrYW4pLg0KDQpgYGB7ciAsIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCmxpYnJhcnkobWl4ZXhwKQ0KYGBgDQoNCmBgYHtyfQ0KZGF0YSgiZXRjaCIpDQpzdW1tYXJ5KGxtKGVyYXRlIH4gLTEgKyB4MSArIHgyICsgeDMgKyANCiAgICAgICAgICAgICB4MTp4MiArIHgxOngzICsgeDI6eDMsIA0KICAgICAgICAgICAgICAgZGF0YSA9IGV0Y2gpKSANCmBgYA0KDQpgYGB7cn0NCiMgbm90ZTogUjIgc2FsYWgga2FyZW5hIHNhYXQgdGlkYWsgYWRhIGludGVyc2VwDQojIG1ha2EgU1MubW9kZWwgdGlkYWsgZGlzZXN1YWlrYW4gZGVuZ2FuIG1ha3N1ZA0KIyBCaWFzYW55YSwgaW50ZXJzZXAgYTAgbWVtYXN0aWthbiBwZW55ZXN1YWlhbiByYXRhLXJhdGEgICAgICAgICAgICAgICAgICAgICAgICANCg0KKHJlczEgPC0gTWl4TW9kZWwoZXRjaCwgImVyYXRlIiwgDQogIG1peGNvbXBzID0gYygieDEiLCAieDIiLCAieDMiKSwgbW9kZWwgPSAyKSkNCmBgYA0KDQpgYGB7cn0NCiMga3VhZHJhdCBTY2hlZmZlIFIyIGFkYWxhaCBiZW5hcg0KKHJlczIgPC0gTWl4TW9kZWwoZXRjaCwgImVyYXRlIiwgDQogICAgICBtaXhjb21wcyA9IGMoIngxIiwgIngyIiwgIngzIiksIG1vZGVsID0gNCkpIA0KYGBgDQoNCmBgYHtyfQ0KIyBNZW5ndXJhbmdpIGt1YmlrDQprYXBwYShyZXMxKQ0KYGBgDQoNCmBgYHtyfQ0Ka2FwcGEocmVzMikNCmBgYA0KDQpgYGB7cn0NCnBhcihtZnJvdz1jKDEsMikpDQpjb2xjb2wgICAgICAgICAgICAgICAgICAgIDwtIHJlcCgiYmxhY2siKSANCmNvbGNvbFtkdXBsaWNhdGVkKGV0Y2hbLDE6M10pXTwtICJyZWQiICNjb2xvciBsYWJlbCByZXBsaWNhdGVzDQpwYXIobWZyb3c9YygxLDIpKQ0KcGxvdChwcmVkaWN0KHJlczEpLCByc3R1ZGVudChyZXMxKSx5bGltPWMoLTQsMyksDQogICAgIHhsYWI9ZXhwcmVzc2lvbiggcGFzdGUoInByZWRpY3RlZCByZXNwb25zZSAiLCBoYXQoeSkpICksDQogICAgIHlsYWI9InN0dWRlbnRpemVkIHJlc2lkdWFscyIsdHlwZT0ibiIsDQogICAgIG1haW49ZXhwcmVzc2lvbihwYXN0ZSgiKCIsZnJhYyhwYXN0ZSgieSAtICIsDQogICAgICAgICAgICBoYXQoeSkpLHNpZ21hKSwgIikgfiAiLCBoYXQoeSkgICApKSApDQp0ZXh0KHByZWRpY3QocmVzMSksIHJzdHVkZW50KHJlczEpLGxhYmVsPTE6bnJvdyhldGNoKSwgY29sPWNvbGNvbCkNCmFibGluZShoPWMoLTIsMCwyKSxsdHk9YygyLDEsMikpDQpncmlkKCkNCg0KIyBwZXJpa3NhIHNpc2EgbW9kZWwga3ViaWsgdGVyZWR1a3NpDQpwbG90KHByZWRpY3QocmVzMiksIHJzdHVkZW50KHJlczIpLHlsaW09YygtNCwzKSwNCiAgICAgeGxhYj1leHByZXNzaW9uKCBwYXN0ZSgicHJlZGljdGVkIHJlc3BvbnNlICIsIGhhdCh5KSkgKSwNCiAgICAgeWxhYj0ic3R1ZGVudGl6ZWQgcmVzaWR1YWxzIix0eXBlPSJuIiwNCiAgICAgbWFpbj1leHByZXNzaW9uKHBhc3RlKCIoIixmcmFjKHBhc3RlKCJ5IC0gIiwNCiAgICAgICAgICBoYXQoeSkpLHNpZ21hKSwgIikgfiAiLCBoYXQoeSkgICApKSApDQp0ZXh0KHByZWRpY3QocmVzMiksIHJzdHVkZW50KHJlczIpLGxhYmVsPTE6bnJvdyhldGNoKSxjb2w9Y29sY29sKQ0KYWJsaW5lKGg9YygtMiwwLDIpLGx0eT1jKDIsMSwyKSkNCmdyaWQoKQ0KYGBgDQoNCkdhbWJhciA1LjQ6IFJlc2lkdWFsIHBlbGFqYXIgdmVyc3VzIHByZWRpa3NpIG1vZGVsIGRhcmkga3VhZHJhdGlrIChwYW5lbCBraXJpKSBkYW4gbW9kZWwga3ViaWsgU2NoZWZmZSB0ZXJlZHVrc2kgZGFyaSBkYXRhIGV0c2EuIFBhc2FuZ2FuIHJlcGxpa2FzaSAoMywxMCksICgyLDkpLCAoOCwxKSBkYW4gKDcsMTEpIGxlYmloIGJhaWsgZGlqZWxhc2thbiBkYWxhbSBrZXNhbGFoYW4gcmVsaWthc2kgb2xlaCBtb2RlbCBrdWJpayAocGFuZWwga2FuYW4pIGRpYmFuZGluZ2thbiBkZW5nYW4gbW9kZWwga3VhZHJhdCAocGFuZWwga2lyaSkuDQoNCk5pbGFpIFIyDQp5YW5nIGRpa29yZWtzaSBkYXJpIG1vZGVsIFNjaGVmZmUga3VhZHJhdCwgJFJeMj0wLDc2JCBsZWJpaCBrZWNpbCBkaWJhbmRpbmdrYW4gZGVuZ2FuIG1vZGVsIGt1YmlrLCAkUl4yPTAsOTgkLCBtZW51bmp1a2thbiBiYWh3YSBpc3RpbGFoICR4XzE6eF8yOnhfMyQgYmVya29udHJpYnVzaSBzZWNhcmEgc3Vic3RhbnNpYWwgdGVyaGFkYXAgdmFyaWFucyBkYXJpIHJlc3BvbnMuIEtlc2ltcHVsYW4gc2VydXBhIGRhcGF0IGRpdGFyaWsgZGFyaSBnYW1iYXIgNS40IHlhbmcgbWVudW5qdWtrYW4gbW9kZWwga3VhZHJhdCBTY2hlZmZlIG1lbmphZGkgYmlhcywgbWlzYWxueWEsIHRpZGFrIHRlcGF0IG1lbmdnYW1iYXJrYW4gcGFzYW5nYW4gcmVwbGlrYXNpICM3LCAjMTEuIERhbGFtIG1vZGVsIGt1YmlrIFNjaGVmZmUgc3VrdSB0ZXJuZXIgJHhfMTp4XzI6eF8zJCBkaXRlbXVrYW4gc2lnbmlmaWthbiBkYW4gcmVzaWR1YWwgbW9kZWwga3ViaWsgc2VrYXJhbmcgbGViaWggc2VzdWFpIGRlbmdhbiBhc3Vtc2kgbm9ybWFsaXRhcyBhdGFza2VzYWxhaGFuIM+1DQoNCg0KTW9kZWwga3ViaWsgZGFwYXQgZGl2aXN1YWxpc2FzaWthbiBkZW5nYW4gcGxvdCBrb250dXIgdGVybmVyIHlhbmcgZGl0dW5qdWtrYW4gcGFkYSBnYW1iYXIgNS41LiBNYWtzaW11bSB0ZXJsZXRhayBkZWthdCBkZW5nYW4gc2VudHJvaWQgJCh4XzEgPSAwLDMzLCB4XzIgPSAwLDMzLCB4XzMgPSAwLDMzKV57NDJ9JA0KDQpgYGB7cn0NCmRhdGEoImV0Y2giKQ0KaW52aXNpYmxlKGNhcHR1cmUub3V0cHV0KHJlcyA8LSBNaXhNb2RlbChldGNoLCAiZXJhdGUiLA0KICAgICAgICAgICAgbWl4Y29tcHMgPSBjKCJ4MSIsICJ4MiIsICJ4MyIpLCBtb2RlbCA9IDQpKSApDQoNCiMgcGxvdCBtb2RlbCBjYW1wdXJhbiBrdWJpayBzZWJhZ2FpIHBsb3Qga29udHVyIHRlcm5lcg0KTW9kZWxQbG90KG1vZGVsID0gcmVzLA0KICAgICAgICAgIGRpbWVuc2lvbnMgPSBsaXN0KHgxID0gIngxIiwgeDIgPSAieDIiLCB4MyA9ICJ4MyIpLA0KICAgICAgICAgIGNvbnRvdXIgPSBUUlVFLCBjdXRzID0gNiwgZmlsbCA9IFRSVUUpDQpgYGANCg0KR2FtYmFyIDUuNTogUGxvdCBrb250dXIgZGFyaSBtb2RlbCBrdWJpayB0ZXJlZHVrc2kgZGFyaSBkYXRhIGV0c2ENCg0KUGxvdCBrb250dXIganVnYSBkYXBhdCBkaWd1bmFrYW4gdW50dWsgZGltZW5zaSB5YW5nIGxlYmloIHRpbmdnaSBkYXJpIEsgPSAzIGRlbmdhbiBtZW5na29uZGlzaWthbiAobWVuZ2lyaXMpIHBsb3QgcGFkYSB2YXJpYWJlbCB5YW5nIGRpdGV0YXBrYW4ga29uc3Rhbi4gTmFtdW4sIGluaSBkYXBhdCBtZW5qYWRpIG1lbWJpbmd1bmdrYW4ga2V0aWthIGFkYSBiYW55YWsgaXJpc2FuIHVudHVrIGRpYmFuZGluZ2thbiwgZGFuIG9sZWgga2FyZW5hIGl0dSBjYXJhIGxhaW4geWFuZyBwb3B1bGVyIGRhbiBrdXJhbmcgbWVtYmluZ3VuZ2thbiB1bnR1ayBtZW12aXN1YWxpc2FzaWthbiBtb2RlbCBjYW1wdXJhbiBiZXJkaW1lbnNpIHRpbmdnaSBhZGFsYWggcGxvdCBlZmVrIENveC4gUGVydGFtYSwgYXJhaCBDb3ggZGlkZWZpbmlzaWthbiBzZWJhZ2FpIGdhcmlzIHlhbmcgbWVuZ2h1YnVuZ2thbiB0aXRpayBjZW50cm9pZCBkZW5nYW4gc2ltcHVsLXNpbXB1bCAobGloYXQgZ2FtYmFyIDUuNikgcnVhbmcgY2FtcHVyYW4uIFNhYXQgYmVyZ2VyYWsga2UgYXJhaCBDb3gsIGthdGFrYW5sYWgsICR4XzEkDQpyYXNpbyBrb21wb25lbiBjYW1wdXJhbiB5YW5nIHRlcnNpc2EgdGV0YXAga29uc3RhbiwgZGkgc2luaSAkXGZyYWMge3hfIHsyfX0ge3hfIHszfX0gPSAxJCwgZGFuIGluaSBzZXRhcmEgZGVuZ2FuIGVmZWsg4oCcaW5kZXBlbmRlbuKAnSBkYXJpICR4XzEkIGRhbGFtIHJ1YW5nIGNhbXB1cmFuLiBFZmVrIENveCBhZGFsYWggamVqYWsgeWFuZyBkaXBlcm9sZWggZGFyaSBtZW5nZ29yZXMgcGVybXVrYWFuIHJlc3BvbnMgZGkgc2VwYW5qYW5nIGFyYWggQ294LiBHYW1iYXIgNS42IG1lbnVuanVra2FuIGFyYWggQ294IGRhbGFtIHJ1YW5nIGNhbXB1cmFuIHRpZ2EgZGltZW5zaSBiZXJzYW1hIGRlbmdhbiBwbG90IGVmZWsgQ294IGRhcmkgbW9kZWwga3ViaWsgdGVyZWR1a3NpIGRhcmkgZGF0YSBldHNhLg0KDQpgYGB7ciAsIHdhcm5pbmc9RkFMU0V9DQpybShsaXN0PWxzKCkpDQpsaWJyYXJ5KG1peGV4cCkNCmxpYnJhcnkoVGVybmFyeSkNCmBgYA0KDQpgYGB7cn0NCmRhdGEoZXRjaCkNCmludmlzaWJsZShjYXB0dXJlLm91dHB1dChyZXMgPC0gTWl4TW9kZWwoZXRjaCwgImVyYXRlIiwNCiAgICAgICBtaXhjb21wcyA9IGMoIngxIiwgIngyIiwgIngzIiksIG1vZGVsID0gNCkpICkNCg0KIyBwbG90IG1vZGVsIGNhbXB1cmFuIGt1YmlrIHNlYmFnYWkgcGxvdCBrb250dXIgdGVybmVyDQpwYXIobWZyb3c9YygxLDIpKQ0KVGVybmFyeVBsb3QoYXRpcD0ieDEiLCBidGlwPSJ4MiIsIGN0aXA9IngzIiwgYXhpcy5jZXg9MS4yLGxhYi5jZXggPSAxLjMsDQogICAgICAgICAgICBheGlzLmxhYmVscz1zZXEoMCwxLDAuMSkpDQpUZXJuYXJ5QXJyb3dzKGMoMCwwLjUsMC41KSxjKDEsMCwwKSxjb2w9InJlZCIsbGVuZ3RoPTAuMTUsIGx3ZD0yKQ0KVGVybmFyeUFycm93cyhjKDAuNSwwLDAuNSksYygwLDEsMCksY29sPSJyZWQiLGxlbmd0aD0wLjE1LCBsd2Q9MikNClRlcm5hcnlBcnJvd3MoYygwLjUsMC41LDApLGMoMCwwLDEpLGNvbD0icmVkIixsZW5ndGg9MC4xNSwgbHdkPTIpDQpBZGRUb1Rlcm5hcnkocG9pbnRzLCBsaXN0KHgxPXJlcCgwLjMzLDMpLHgyPXJlcCgwLjMzLDMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB4Mz1yZXAoMC4zMywzKSkscGNoPTE2LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjb2w9ImJsYWNrIixjZXg9MS41KQ0KdGl0bGUobWFpbj0iQ294IGRpcmVjdGlvbiIsY2V4Lm1haW49MS41KQ0KDQpNb2RlbEVmZihuZmFjID0gMywgbW9kID0gNCwgZGlyID0gMiwgdWZ1bmMgPSByZXMsDQogICAgICAgICAgICAgZGltZW5zaW9ucyA9IGxpc3QoIngxIiwgIngyIiwgIngzIikpDQpgYGANCg0KR2FtYmFyIDUuNjogQXJhaCBDb3ggZGFsYW0gcnVhbmcgY2FtcHVyYW4gM0QgKHBhbmVsIGtpcmkpIGRhbiBwbG90IGVmZWsgc2VwYW5qYW5nIGFyYWggQ294IGRhcmkgbW9kZWwgZXRzYSBrdWJpayB0ZXJlZHVrc2kgKHBhbmVsIGthbmFuKQ0KDQojIyBEZXNhaW4gY2FtcHVyYW4NCkJhZ2lhbiBzZWJlbHVtbnlhIG1lbXBlcmtlbmFsa2FuIGVuYW0gbW9kZWwgcGFyYW1ldHJpayB5YW5nIGJlcmJlZGEgdW50dWsgcGVtb2RlbGFuIGNhbXB1cmFuIGRhbiBzaXN0ZW0gcHJvc2VzIGNhbXB1cmFuLiBUZXJrYWl0IGRlbmdhbiBtYXNpbmctbWFzaW5nIG1vZGVsIGFkYWxhaCBkZXNhaW4gcHJvc2VzIGNhbXB1cmFuIGRhbiBjYW1wdXJhbiB5YW5nIHNlY2FyYSBvcHRpbWFsIG1lbmR1a3VuZyBtb2RlbCB5YW5nIGRpcGlsaWguIE1vZGVsIGRhbiBkZXNhaW4gYWRhbGFoIGR1YSBzaXNpIGRhcmkgbWF0YSB1YW5nIHlhbmcgc2FtYTogTW9kZWwgcGFyYW1ldHJpayBtZW5lbnR1a2FuIGRlc2FpbiBkYW4gZGVzYWluIG1lbmVudHVrYW4gZGFuIG1lbWJhdGFzaSBtb2RlbCB5YW5nIGRhcGF0IGRpcGVya2lyYWthbiBkYXJpIGRhdGEuIERlc2FpbiBjYW1wdXJhbiBkYXBhdCBzZWNhcmEgbHVhcyBkaWJhZ2kgbWVuamFkaSBkZXNhaW4gYmlhc2EgKHJlZ3VsYXIgZGVzaWduKSBkaSBtYW5hIGRlc2FpbiB0ZXJzZWJ1dCBtZW5jYWt1cCBzZWx1cnVoIHJ1YW5nIGNhbXB1cmFuICQoMCBcbGVxIHhfIHtpfSBcbGVxIDEgKSQgZGFuIGRlc2FpbiB0aWRhayBiZXJhdHVyYW4gKGF0YXUgZGliYXRhc2kpIHlhbmcgaGFueWEgYmVydXBhIHN1YnJ1YW5nLCRMQl8ge2l9ICg+IDApIFxsZXEgeF8ge2l9IFxsZXEgVUJfIHtpfSAoPDEpJCwgZGFyaSBzZWx1cnVoIHJ1YW5nIGNhbXB1cmFuIHRlcmlzaS4gR2FtYmFyIDUuNyBtZW51bmp1a2thbiBjb250b2ggZGVzYWluIGNhbXB1cmFuIGJlcmF0dXJhbiBkYW4gdGlkYWsgYmVyYXR1cmFuIGRhbGFtIHRpZ2EgZGltZW5zaS4NCg0KYGBge3J9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiZ2FtYmFyNC5wbmciKQ0KYGBgDQpHYW1iYXIgNS43OiBDb250b2ggZGVzYWluIGJpYXNhIChwYW5lbCBraXJpKSBkYW4gdGlkYWsgYmVyYXR1cmFuIChkaWJhdGFzaSkgKHBhbmVsIGthbmFuKQ0KDQpNb2RlbCBTY2hlZmZlIGxpbmllciBkYW4ga3VhZHJhdCAobW9kZWwgIzEsICMyKSBkYXBhdCBkaXBlcmtpcmFrYW4gZGVuZ2FuIChyZWd1bGFyKSBTaW1wbGV4IExhdHRpY2UgRGVzaWducyAoU0xEKSB5YW5nIGRpdHVuanVra2FuIHVudHVrIEsgPSAzIHBhZGEgZ2FtYmFyIDUuOCBkYW4gZGlidWF0IGRlbmdhbiBtaXhleHAgUi1mdW5jdGlvbiBTTEQgKGZhYywgbGV2KSAuIEFndW1lbnQgZmFjIG1lbnVuanVra2FuIGp1bWxhaCBmYWt0b3IgZGFuIGxldiBtZW5lbnR1a2FuIGp1bWxhaCBsZXZlbCBkZW5nYW4gJHhfaT4wJC4NCg0KYGBge3J9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiZ2FtYmFyNS5wbmciKQ0KYGBgDQoNCkdhbWJhciA1Ljg6IERlc2FpbiBLaXNpIFNpbXBsZWtzIHVudHVrIG1lbXBlcmtpcmFrYW4gbW9kZWwgbGluZWFyIChTTEQgKDMsMSksIHBhbmVsIGtpcmkpIGRhbiBrdWFkcmF0aWsgU2NoZWZmZSAoU0xEICgzLDIpLCBwYW5lbCBrYW5hbikNCg0KS29tcG9uZW4gbXVybmkgKHRpdGlrIHB1bmNhayBwYWRhIGdhbWJhciA1LjgpIGN1a3VwIHVudHVrIG1lbXBlcmtpcmFrYW4gbW9kZWwgU2NoZWZmZSBsaW5pZXIuIE1vZGVsIGt1YWRyYXQgU2NoZWZmZSBkaWR1a3VuZyBkZW5nYW4gbWVuYW1iYWggZGVzYWluIHNlYmVsdW1ueWEgZGVuZ2FuIHNlbXVhIGNhbXB1cmFuIGJpbmVyIGRpIHRlbmdhaCB0aWdhIHNpc2kuIEtlZHVhIGRlc2FpbiAkc2F0dXJhdGVkXns0M30kDQoNCmRhbiBvbGVoIGthcmVuYSBpdHUgcGVybHUgcHJvc2VzIHRhbWJhaGFuIHVudHVrIG1lbXBlcmtpcmFrYW4gdmFyaWFuIGtlc2FsYWhhbiBkYW4gdW50dWsgbWVtZXJpa3NhIGFkYW55YSBlZmVrIHVydXRhbiB5YW5nIGxlYmloIHRpbmdnaS4NCg0KTW9kZWwga3ViaWsgdGVyZWR1a3NpIChtb2RlbCAjNCkgZGFwYXQgZGlwZXJraXJha2FuIGRlbmdhbiBTaW1wbGV4IENlbnRyb2lkIERlc2lnbnMgKFNDRCkuIFNla2FsaSBsYWdpLCBTQ0Qgc3VkYWggamVudWggKHNhdHVyYXRlZCkgZGFuIHBlcmx1IHByb3NlcyB0YW1iYWhhbiB1bnR1ayBtZW1wZXJraXJha2FuIHZhcmlhbiBlcnJvciBkYW4gTGFjayBvZiBGaXQuDQoNCkFraGlybnlhLCBEZXNhaW4gdGhyZWUgbGV2ZWwgU2ltcGxleCBMYXR0aWNlIGRhcGF0IGRpZ3VuYWthbiB1bnR1ayBtZW1wZXJraXJha2FuIG1vZGVsIGt1YmlrIHBlbnVoIChtb2RlbCAjMykuIFNlbXVhIGRlc2FpbiBkYXBhdCBkaWJ1YXQgZGVuZ2FuIG11ZGFoIGRlbmdhbiBmdW5nc2kgbWl4ZXhwIDo6IFNMRCAoKSBkYW4gbWl4ZXhwIDo6IFNDRCAoKSBkYW4gY29udG9oIHVudHVrIEsgPSAzIGRhcmkgeWFuZyBwZXJ0YW1hIGRhbiB5YW5nIHRlcmFraGlyIGRpZ2FtYmFya2FuIHBhZGEgZ2FtYmFyIDUuOCBkYW4gNS45Lg0KDQpgYGB7cn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJnYW1iYXI2LnBuZyIpDQpgYGANCg0KR2FtYmFyIDUuOTogU2ltcGxleCBDZW50cm9pZCBEZXNpZ24gU0NEICgzKSAocGFuZWwga2lyaSkgdW50dWsgbW9kZWwga3ViaWsgdGVyZWR1a3NpIGRhbiBTaW1wbGV4IExhdHRpY2UgRGVzaWduIFNMRCB0aWdhIHRpbmdrYXQgKDMsMykgKHBhbmVsIGthbmFuKSB1bnR1ayBtb2RlbCBrdWJpayBwZW51aCBTY2hlZmZlDQoNCk1vZGVsIGRhbiBkZXNhaW4gY2FtcHVyYW4ga2xhc2lrIGFkYWxhaCBrYWt1IGRhbGFtIGhhbCBzdHJ1a3R1ciBtb2RlbCBkYW4gdWt1cmFuIGRlc2FpbiBtaXJpcCBkZW5nYW4gYXBhIHlhbmcgZGlrYXRha2FuIHRlbnRhbmcgZGVzYWluIG9ydG9nb25hbCBrbGFzaWsuIERlc2FpbiBTaW1wbGV4LUxhdHRpY2Ugb3JkZSBrZWR1YSBha2FuIG1lbWJ1YXQgc2VtdWEgaW50ZXJha3NpIGR1YSBhcmFoIGRhcGF0IGRpcGVya2lyYWthbiwgdGVybGVwYXMgZGFyaSBhcGFrYWggbWVyZWthIG1lbmFyaWsgYXRhdSBtdW5na2luIHNlY2FyYSBmaXNpay4gU3RydWt0dXIgbW9kZWwgZGFuIHVrdXJhbiBkZXNhaW4gZGFwYXQgZGl0ZW50dWthbiBzZWNhcmEgbGViaWggZmxla3NpYmVsIGRlbmdhbiBkZXNhaW4gb3B0aW1hbCBzZXBlcnRpIHlhbmcgZGl0dW5qdWtrYW4gZGVuZ2FuIFItY29kZSBiZXJpa3V0LiBEaSBzaW5pIHR1anVhbm55YSBhZGFsYWggdW50dWsgc2VjYXJhIHBlbGl0IG1lbmdpZGVudGlmaWthc2kgbW9kZWwgU2NoZWZmZSBub24tc3RhbmRhciwgZGFsYW0gbm90YXNpLVIgfiAkLTEgKyB4XzEgKyB4XzIgKyB4XzMgKyB4XzE6IHhfMiArIHhfMTogeF8yOiB4XzMkDQosIGRlbmdhbiBlbmFtIHB1dGFyYW4gZGFyaSBzYXR1IHNldCBrYW5kaWRhdCBkYXJpIDYwIGthbmRpZGF0IGNhbXB1cmFuIHJlZ3VsZXIgLiBHYW1iYXIgNS4xMCBtZW5nZ2FtYmFya2FuIHRpdGlrIGRlc2FpbiBvcHRpbWFsIEQgZGFsYW0gcnVhbmcgY2FtcHVyYW4geWFuZyB0ZXJkaXJpIGRhcmkga29tcG9uZW4gbXVybmkgKG1lbmdhY3UgcGFkYSBlZmVrIHV0YW1hICR4XzEseF8yLHhfMyQpLCBjYW1wdXJhbiBiaW5lciAkeF8xLHhfMiQgKHVudHVrIGlzdGlsYWggaW50ZXJha3NpICR4XzE6eF8yJCkgZGFuIGR1YSB0aXRpayB5YW5nIGRla2F0IGRlbmdhbiBwdXNhdCBtYXNzYSB1bnR1ayBtZW5naWRlbnRpZmlrYXNpIGludGVyYWtzaSB0aWdhIGFyYWggJHhfMTp4XzI6eF8zJC4NCg0KYGBge3J9DQpybShsaXN0PWxzKCkpDQpsaWJyYXJ5KEFsZ0Rlc2lnbikNCmxpYnJhcnkoVGVybmFyeSkNCnNldC5zZWVkKDEyMzQpDQp4eCA8LSBleHBhbmQuZ3JpZCh4MT1zZXEoMCwxLDAuMSksDQogICAgICAgICAgICAgICAgIHgyPXNlcSgwLDEsMC4xKSwNCiAgICAgICAgICAgICAgICAgeDM9c2VxKDAsMSwwLjEpICkgIyBkZXNhaW4gZ3JpZCANCnggPC0geHhbYXBwbHkoeHgsMSxzdW0pPT0xLF0gIyBoYW55YSBzdW1feC5pPTEgDQptaXggPC0gb3B0RmVkZXJvdih+IC0xICsgeDEgKyB4MiArIHgzICsgDQogICAgICAgICAgICB4MTp4MiArIHgxOngyOngzLCBkYXRhPXgsblRyaWFscz02LA0KICAgICAgICAgICAgICAgICAgIG5SZXBlYXRzPTEwMDApJGRlc2lnbg0KVGVybmFyeVBsb3QoYXRpcD0ieDEiLCBidGlwPSJ4MiIsIGN0aXA9IngzIiwNCiAgICAgICAgICBheGlzLmxhYmVscz1zZXEoMCwxLDAuMSksIGxhYi5jZXg9MSkNCkFkZFRvVGVybmFyeShwb2ludHMsIG1peCxwY2g9MTYsY29sPSJyZWQiLGNleD0xKQ0KYGBgDQoNCkdhbWJhciA1LjEwOiBEZXNhaW4gY2FtcHVyYW4gRC1vcHRpbWFsIG1vZGVsIH4gJC0xICsgeF8xICsgeF8yICsgeF8zICsgeF8xOiB4XzIgKyB4XzE6IHhfMjogeF8zJCBkaXR1bGlzIGRhbGFtIG5vdGFzaSBydW11cy1SDQoNCkRlc2FpbiB1bnR1ayBtb2RlbCBwcm9zZXMgY2FtcHVyYW4gYmVyc2lsYW5nYW4gcGVudWggKCMgNSksIHBlcnNhbWFhbiAoNS41KSwgaGFzaWwgZGFyaSBjYW1wdXJhbiBwZXJzaWxhbmdhbiBkYW4gZGVzYWluIHByb3Nlcy4gTWlzYWxrYW4gZmFjIG1lbmphZGkgZGVzYWluIGZha3RvcmlhbCBwZW51aCBhdGF1IHBlY2FoYW4gZGVuZ2FuIGJhcmlzIE4xDQpkYW4ga29sb20gUCBkYW4gY2FtcHVyYW4gZGVzYWluIGNhbXB1cmFuIGRpbWVuc2kgJChOXzIpIHggKEspJCwgaGFzaWwga2FsaSBLYXJ0ZXNpdXMgZGFyaSBkaW1lbnNpICQoTl8xICogTl8yKSB4IChQICsgSykkIG1lbmR1a3VuZyBwZXJzaWxhbmdhbiBwZW51aCBkZXNhaW4gcHJvc2VzIGNhbXB1cmFuIHNlcGVydGkgeWFuZyBkaXR1bmp1a2thbiBSLWNvZGUgYmVyaWt1dCB1bnR1ayBLID0gMyBkYW4gUCA9IDMsIG1hc2luZy1tYXNpbmcNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9DQpybShsaXN0PWxzKCkpDQpzZXQuc2VlZCgxMjM0KQ0KDQpmYWMgPC0gRnJGMjo6RnJGMig4LDMscmFuZG9taXplPUYpICAjIDJeMyBkZXNhaW4gZmFrdG9yaWFsIHBlbnVoOyBOPTgNCmBgYA0KDQpgYGB7cn0NCm1peCA8LSBtaXhleHA6OlNMRCgzLDMpICMgRGVzYWluIFNMRCBOPTEwDQogICAgICAgICAgICAgICAgICAgICAgICAjIDN2ZXJ0ZXgrM3gyZWRnZXMrY2VudHJvaWQNCmZhYyA8LSBkYXRhLmZyYW1lKHNhcHBseShmYWMsZnVuY3Rpb24oeCkNCiAgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoeCkpKSkgDQojIFViYWggZmFrdG9yIGtlIG51bWVyaWsgDQpjb2xuYW1lcyhmYWMpIDwtIHBhc3RlKCJ6IiwxOjMsc2VwPSIiKQ0KeCA8LSBtZXJnZShtaXgsZmFjKSAjIFByb2R1ayBDYXJ0ZXNpYW4gDQpkaW0oeCkNCmBgYA0KDQpgYGB7cn0NCngkeSA8LSBybm9ybShucm93KHgpKQ0KKHJlcyA8LSBtaXhleHA6Ok1peE1vZGVsKHgsICJ5IiwNCiAgICAgICAgIG1peGNvbXBzID0gYygieDEiLCAieDIiLCAieDMiKSwgDQogICAgICAgICBwcm9jdmFycyA9IGMoInoxIiwgInoyIiwgInozIiksDQogICAgICAgICBtb2RlbCA9IDUpKSAjIE1vZGVsIHByb3NlcyBjYW1wdXJhbiBiZXJzaWxhbmdhbiBwZW51aCAjNQ0KYGBgDQoNCmBgYHtyfQ0Ka2FwcGEocmVzKQ0KYGBgDQoNCkRlc2FpbiBkYW4gbW9kZWwgeWFuZyBzYWxpbmcgYmVyc2lsYW5nYW4gc2FuZ2F0IGJlc2FyIGRhbiBoYW1waXIgdGlkYWsgZGFwYXQgZGlsYWt1a2FuIGRhbGFtIHBlbmdhdHVyYW4gbGFib3JhdG9yaXVtIGJpYXNhLCBkYW4gZGVzYWluIHlhbmcgc2ViYWdpYW4gZGlzaWxhbmcsIG1vZGVsICMgNiAocGVyc2FtYWFuICg1LjYpKSksIG11bmdraW4gbWVuamFkaSBhbHRlcm5hdGlmIHlhbmcgbGViaWggcmVhbGlzdGlzIHVudHVrIHNlYmFnaWFuIGJlc2FyIHByb3llay4gRGVzYWluIHByb3NlcyBjYW1wdXJhbiB5YW5nIGRpc2lsYW5na2FuIHNlYmFnaWFuIGRhbiBwZWxpdCBkYXBhdCBkaWhhc2lsa2FuIGRlbmdhbiBtZW1pbGloIHRpdGlrIHNlY2FyYSBvcHRpbWFsIEQgZGFyaSBrdW1wdWxhbiBrYW5kaWRhdCB5YW5nIHNlcGVudWhueWEgYmVyc2lsYW5nIGRlbmdhbiBBbGdEZXNpZ24gOjogb3B0RmVkZXJvdiAoKSBzZXBlcnRpIHlhbmcgZGl0dW5qdWtrYW4gb2xlaCBrb2RlIGJlcmlrdXQNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpybShsaXN0PWxzKCkpDQpzZXQuc2VlZCgxMjM0KQ0KcnNtICA8LSByc206OmJiZCgzLCBuMD0xLHJhbmRvbWl6ZT1GKVssLSgxOjIpXSAjIGRlc2FpbiBCb3gtQmVobmtlbiA7Tj0xMw0Kc2xkICA8LSBtaXhleHA6OlNMRCgzLDMpICMgZGVzYWluIGt1YmlrIFNpbXBsZXgtbGF0dGljZSBkZXNpZ247Tj0xMA0KY29sbmFtZXMocnNtKSA8LSBwYXN0ZSgieiIsMTozLHNlcD0iIikNCmNhbmRpZGF0ZSA8LSBtZXJnZShzbGQscnNtKSAjIHByb2R1ayBDYXJ0ZXNpYW4gIGRpbT0oMTMwIHggNikNCm1peCA8LSBBbGdEZXNpZ246Om9wdEZlZGVyb3YofiAtMSArICh4MSt4Mit4MyleMyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDE6ejEgKyB4MTp6MiArIHgxOnozICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Mjp6MSArIHgyOnoyICsgeDI6ejMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgzOnoxICsgeDM6ejIgKyB4Mzp6MyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgejE6ejIgKyB6MTp6MyArIHoyOnozICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJKHoxXjIpICsgSSh6Ml4yKSArIEkoejNeMikgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWNhbmRpZGF0ZSxuVHJpYWxzPTMwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb249IkQiLCBuUmVwZWF0cz0xMDAwKSRkZXNpZ24NCm1peCR5IDwtIHJub3JtKG5yb3cobWl4KSkNCihyZXMgPC0gbWl4ZXhwOjpNaXhNb2RlbChtaXgsICJ5IiwNCiAgICAgICAgIG1peGNvbXBzID0gYygieDEiLCAieDIiLCAieDMiKSwgDQogICAgICAgICBwcm9jdmFycyA9IGMoInoxIiwgInoyIiwgInozIiksDQogICAgICAgICBtb2RlbCA9IDYpKQ0KYGBgDQoNCmBgYHtyfQ0Ka2FwcGEocmVzKQ0KYGBgDQoNCkRlc2FpbiB0ZXJiYXRhcyBhdGF1IHRpZGFrIGJlcmF0dXJhbiBkYXBhdCBkaWJhbmd1biBhdGF1IGRpc3RydWt0dXJrYW4gZGVuZ2FuIGFsZ29yaXRtYSBzaW1wdWwgZWtzdHJpbSB5YW5nIGRpaW1wbGVtZW50YXNpa2FuIGRhbGFtIGZ1bmdzaSAkWHZlcnQgKCkkIGRhcmkgcGFrZXQgbWl4ZXhwIGRlbmdhbiBtZW5lbnR1a2FuIGRpbWVuc2kgZGFuIGthd2FzYW4gdGVyYmF0YXMgJChMQl8ge2l9IFxnZSAwKSBcbGVxIHhfIHtpfSBcbGVxIFVCXyB7IGl9IFxsZSAxJCBkZW5nYW4gJExCX2kkIGRhbiAkVUJfaSQgbWFzaW5nLW1hc2luZyBtZW51bmp1a2thbiBiYXRhcyBhdGFzIGRhbiBiYXdhaCB4aS4gS29uc2lzdGVuc2kgbWVtYnV0dWhrYW4ganVtbGFoIGRhcmkgYmF0YXMgYXRhcyB1bnR1ayBtZWxlYmloaSAxLCB5YWl0dSAkXHN1bV8ge2l9IFVCXyB7aX0+IDEkLg0KDQpEZXNhaW4gYmlhc2EgZGFuIHRpZGFrIGJlcmF0dXJhbiBzZXJpbmdrYWxpIGphcmFuZyB0ZXJzZWJhciBkYWxhbSBtZW5kdWt1bmcgaXN0aWxhaCB0YXRhbmFuIHlhbmcgbGViaWggdGluZ2dpLiBUaXRpayBpbnRlcmlvciB0YW1iYWhhbiBkYXBhdCBkaWJ1YXQgZGVuZ2FuIGZ1bmdzaSBGaWxsdiAoKSBkZW5nYW4gbWVtYnVhdCByYXRhLXJhdGEgZGFuIGRlbmdhbiBkZW1pa2lhbiBtZW1idWF0IHRpdGlrIHRlbmdhaCBkaSBhbnRhcmEgc2VtdWEga2VtdW5na2luYW4gcGFzYW5nYW4uDQoNClNlYmFsaWtueWEsIGppa2EgZGVzYWluIHlhbmcgZGliYXRhc2kgbWVtaWxpa2kgdGVybGFsdSBiYW55YWsgcHJvc2VzIHlhbmcgZGliZXJpa2FuIHR1anVhbiBwcm95ZWssIGhhbCBpdHUgZGFwYXQgZGlrdXJhbmdpIGRlbmdhbiBtZW1pbGloIHN1YnNldCB0aXRpayBkZXNhaW4gc2VjYXJhIG9wdGltYWwgZGVuZ2FuIGZ1bmdzaSBSIEFsZ0Rlc2lnbiA6OiBvcHRGZWRlcm92KCkuDQoNCkF1Z21lbnRhc2kgZGVzYWluIHRlcmJhdGFzIGRlbmdhbiB0aXRpayBpbnRlcmlvciB5YW5nIGRpdHVuanVra2FuIGRlbmdhbiBrb2RlLVIgYmVyaWt1dCwgZGFuIGdhbWJhciA1LjExIG1lbnVuanVra2FuIGRlc2FpbiBzZWJlbHVtIGRhbiBzZXN1ZGFoIGF1Z21lbnRhc2kuDQoNCmBgYHtyfQ0Kcm0obGlzdD1scygpKQ0KeDEgPC0gbWl4ZXhwOjpYdmVydCgzLHVjPWMoLjMsLjMsMSksbGM9YygwLDAsMCksbmRtPTEscGxvdD1GKVssLTRdDQp4MiA8LSBtaXhleHA6OkZpbGx2KDMseDEpDQpwYXIobWZyb3c9YygxLDIpKQ0KVGVybmFyeVBsb3QoYXRpcD0ieDEiLCBidGlwPSJ4MiIsIGN0aXA9IngzIixheGlzLmNleD0xLjIsbGFiLmNleCA9IDEuNSwNCiAgICAgICAgICBheGlzLmxhYmVscz1zZXEoMCwxLDAuMSkpDQpBZGRUb1Rlcm5hcnkocG9pbnRzLCB4MSxwY2g9MTYsY29sPSJyZWQiLGNleD0xLjUpDQpUZXJuYXJ5UGxvdChhdGlwPSJ4MSIsIGJ0aXA9IngyIiwgY3RpcD0ieDMiLGF4aXMuY2V4PTEuMixsYWIuY2V4ID0gMS41LA0KICAgICAgICAgICAgYXhpcy5sYWJlbHM9c2VxKDAsMSwwLjEpKQ0KQWRkVG9UZXJuYXJ5KHBvaW50cywgeDIscGNoPTE2LGNvbD0icmVkIixjZXg9MS41KQ0KYGBgDQoNCkdhbWJhciA1LjExOiBEZXNhaW4gdGVyYmF0YXMgJHhfIHsxfSA8MCwzOyB4XyB7Mn0gPDAsMzsgXHN1bV8ge2l9IHhfIHtpfSA9IDEkIChwYW5lbCBraXJpKSBkYW4gZGVzYWluIHRlcmthaXQgZGl0YW1iYWggZGVuZ2FuIHRpdGlrIGludGVyaW9yIChwYW5lbCBrYW5hbik7DQoNCi0gVGFiZWwgNS4xIG1lbWJlcmlrYW4gZ2FtYmFyYW4gdW11bSB0ZW50YW5nIG1vZGVsIGRhbiBkZXNhaW4gY2FtcHVyYW4geWFuZyB0ZWxhaCBkaWJhaGFzIHNlamF1aCBpbmkgZGlrb21iaW5hc2lrYW4gZGVuZ2FuIHBldHVuanVrIHNpbmdrYXQgdGVudGFuZyBjYXJhIG1lbWJ1YXQgZGVzYWluIGluaSBkaSBSLg0KDQotIFRhYmVsIDUuMTogTW9kZWwgZGFuIGRlc2FpbiBjYW1wdXJhbiBiZXNlcnRhIHBldHVuanVrIHRlbnRhbmcgY2FyYSBtZW1idWF0IGRlc2FpbiBkaSBSLiBBbmdrYSAoMS02KSBkYWxhbSBkYWZ0YXIgc2VjYXJhIGxhbmdzdW5nIG1lcnVqdWsga2UgYXJndW1lbiBtb2RlbCBkaSBSLWZ1bmN0aW9uIG1peGV4cCA6OiBNaXhNb2RlbCAo4oCmLCBtb2RlbCA9ICggMS02KSkNCg0KYGBge3J9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiZ2FtYmFyNy5wbmciKQ0KYGBgDQoNCkFraGlybnlhIGRhbiBzZXJ1cGEgZGVuZ2FuIGRlc2FpbiBvcnRvZ29uYWwsIGRlc2FpbiBjYW1wdXJhbiBkYXBhdCBkaWJsb2tpciBqaWthIHRlcmRhcGF0IHBhcmFtZXRlciBnYW5nZ3VhbiBzZXBlcnRpIGJhdGNoIGJhaGFuIGJha3UsIHRla25pc2ksIGF0YXUgcGVyYWxhdGFuIGxhYm9yYXRvcml1bSB5YW5nIGJlcmJlZGEuIE1lc2tpcHVuIGFkYSBiZWJlcmFwYSBkZXNhaW4gY2FtcHVyYW4geWFuZyBkaWJsb2tpciBzZWNhcmEgb3B0aW1hbCB5YW5nIGJlcmFzYWwgZGFyaSBwcmluc2lwIHBlcnRhbWEgKHVudHVrIGRldGFpbG55YSBsaWhhdCAoSm9obiBBLiBDb3JuZWxsIDE5OTApKSwgcGVtYmxva2lyYW4gYWxnb3JpdG1payBkZW5nYW4gUi1mdW5jdGlvbiBBbGdEZXNpZ24gOjogb3B0QmxvY2sgKCkgc3VkYWggY3VrdXAgdW50dWsgc2ViYWdpYW4gYmVzYXIgdHVqdWFuIHByYWt0aXMuIEtvZGUgY29udG9oIGJlcmlrdXQgYWthbiBtZW1ibG9raXIgZGVzYWluIFNpbXBsZXgtbGF0dGljIG9yZGUgdGlnYSBkZW5nYW4gc2VwdWx1aCBydW5zIG1lbmphZGkgZHVhIGJsb2sgZGFuIG1lbmdnYW1iYXJrYW4ga2VkdWEgYmxvayBwYWRhIGdhbWJhciA1LjEyLiBTZWxhaW4gaXR1LCBrb2RlIGNvbnRvaCBtZW51bmp1a2thbiBiZWJlcmFwYSBzb2x1c2kgdW50dWsgbWVuZ2hpbmRhcmkgYmViZXJhcGEgbWFzYWxhaCB5YW5nIHRpZGFrIHRlcmNha3VwIG9sZWggZnVuZ3Npb25hbGl0YXMgc3RhbmRhci4gDQoNClBlcnRhbWEsIHRlbnR1a2FuIHZhcmlhYmVsICR4X3tpan0gPSB4X2kteF9qJCB1bnR1ayBtZW5lbnR1a2FuIHN1a3Uga3ViaWsgJHhfaTogeF9qOiAoeF9pLXhfaikkIGRhbGFtIGVrc3ByZXNpIHJ1bXVzLiBLZWR1YSwgdGVudHVrYW4gdmFyaWFiZWwgYmFydSBzZXN1YWkgZGVuZ2FuIGJsb2NrMiA9IGFzLmludGVnZXIgKGJsb2NrID09ICJCMiIpIHNlYmFnYWkgaW5kaWthdG9yIGJsb2sgeWFuZyB1bmlrLiBJbmkgZGlwZXJsdWthbiBrYXJlbmEgbG0gKCkgc2VjYXJhIGRlZmF1bHQgbWVuamF0dWhrYW4gbGV2ZWwgcGVydGFtYSBkYXJpIHN1YXR1IGZha3RvciAoZGkgc2luaSAkQl8xJCBkYWxhbSBibG9rID0gJHtCXzEsIEJfMn0kKSBrZXRpa2EgbW9kZWwgbWVtaWxpa2kgaW50ZXJzZXAuIE5hbXVuLCBrZXRpa2EgdGlkYWsgYWRhIGludGVyc2VwLCBiYWlrIGJsb2NrQjEgZGFuIGJsb2NrQjIgZGlzaW1wYW4gZGFsYW0gbWF0cmlrcyBtb2RlbCBzZWhpbmdnYSBtZW5qYWRpa2FuIG1vZGVsIHNpbmd1bGFyIGthcmVuYSBibG9ja0IxICsgYmxvY2tCMiA9IDEgZGFuICR4XzEgKyB4XzIgKyB4XzMgPSAxJC4gTWFzYWxhaCBpbmkgZGllbGFra2FuIGRlbmdhbiB2YXJpYWJlbCBibG9rIGJhcnUgYmxvY2syID0gYXMuaW50ZWdlciAoYmxvayA9PSAiQjIiKS4gS2VtdWRpYW4gcGFyYW1ldGVyIGxva2FzaSBtb2RlbCBsbSBrdWJpayBwZW51aCBzZXN1YWkgZGVuZ2FuIG1vZGVsIHlhbmcgc2ViZW5hcm55YSBtZXNraXB1biB0aWRhayBkaXRlbXVrYW4gaXN0aWxhaCB5YW5nIHNpZ25pZmlrYW4uIE5hbXVuLCBpbmkgdGlkYWsgbWVuZ2VqdXRrYW4ga2FyZW5hIGhhbnlhIGFkYSAxIGRlcmFqYXQga2ViZWJhc2FuIHlhbmcgbWVtYnVhdCBzdGF0aXN0aWsgcGVuZ3VqaWFuIHNhbmdhdCBrb25zZXJ2YXRpZi4NCg0KYGBge3J9DQpybShsaXN0PWxzKCkpDQpzZXQuc2VlZCgxMjM0NSkNCg0KeCAgICA8LSBtaXhleHA6OlNMRCgzLDMpDQp4JHgxMiAgPC0geCR4MS14JHgyICAgICAgICMgTGVtYmFyIGtlcmphIHBlcnRhbWEgDQp4JHgxMyAgPC0geCR4MS14JHgzDQp4JHgyMyAgPC0geCR4Mi14JHgzDQoNCnJlcyAgPC0gQWxnRGVzaWduOjpvcHRCbG9jayh+IC0xICsoeDEreDIreDMpXjMgKyANCiAgICAgICAgICAgICAgeDE6eDI6eDEyICsgeDE6eDM6eDEzICsgeDI6eDM6eDIzICwgeCwNCiAgICAgICAgICAgICAgYyg2LDYpLGNyaXRlcmlvbj0iRHBjIiwgblJlcGVhdHM9MTAwMCkNCnggICAgICAgPC0gcmVzJGRlc2lnbg0KeCRibG9jayA8LSBmYWN0b3IoYyhyZXAoIkIxIiw2KSxyZXAoIkIyIiw2KSApKQ0KDQp4JHkgICAgICA8LSAyMCooeCRibG9jaz09IkIyIikgKyAzKngkeDEgKyAyKngkeDIgKyANCiAgICAgICAgICAgIDUqeCR4MyArIDEwKngkeDEqeCR4Mip4JHgxMiArIHJub3JtKG5yb3coeCksMCwwLjEpDQp4JGJsb2NrMiA8LSBhcy5pbnRlZ2VyKHgkYmxvY2s9PSJCMiIpICMgTGVtYmFyIGtlcmphIGtlZHVhIA0KDQojIGl0dSB0aWRhayBha2FuIGJla2VyamEgc2ViYWdhaSBibG9ja0IxK2Jsb2NrQjI9MSANCiMgPT4gY29uZm91bmRlZCBkZW5nYW4gIHgxK3gyK3gzPTENCnN1bW1hcnkocmVzIDwtIChsbSh5IH4gLTEgKyBibG9jayArKHgxK3gyK3gzKV4zICsgDQogICAgICAgICAgICAgICAgeDE6eDI6eDEyICsgeDE6eDM6eDEzICsgeDI6eDM6eDIzICAsZGF0YT14KSkpDQpgYGANCg0KYGBge3J9DQprYXBwYShyZXMpICMgZGVzYWluIHNpbmd1bGFyIDEuOTAzNDRlKzE3DQpgYGANCg0KYGBge3J9DQojIyB0YXBpIHRyaWsgaW5pIGFrYW4gbWVtYmFudHUNCngkYmxvY2syIDwtIGFzLmludGVnZXIoeCRibG9jaz09IkIyIikNCnN1bW1hcnkocmVzIDwtIChsbSh5IH4gLTEgKyBibG9jazIgKyh4MSt4Mit4MyleMyArIA0KICAgICAgICAgICAgICB4MTp4Mjp4MTIgKyB4MTp4Mzp4MTMgKyB4Mjp4Mzp4MjMgICxkYXRhPXgpKSkNCmBgYA0KDQpgYGB7cn0NCmthcHBhKHJlcykNCmBgYA0KDQpgYGB7cn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJnYW1iYXI4LnBuZyIpDQpgYGANCg0KR2FtYmFyIDUuMTI6IERlc2FpbiBjYW1wdXJhbiBrdWJpayBwZW51aCBkYWxhbSBkdWEgYmxvayBCMSAocGFuZWwga2lyaSkgZGFuIEIyIChwYW5lbCBrYW5hbikNCg0KIyBSZWZlcmVuc2kNCg0KSm9obiBBLiBDb3JuZWxsLiAxOTkwLiBFeHBlcmltZW50cyB3aXRoIE1peHR1cmVzLiAybmQgZWQuIFdpbGV5LCBOZXcgWW9yay4NCg0KSm9obiBMYXdzb24sIENhbWVyb24gV2lsbGRlbi4gMjAxNi4g4oCcTWl4dHVyZSBFeHBlcmltZW50cyBpbiBSIFVzaW5nIE1peGV4cC7igJ0gSm91cm5hbCBvZiBTdGF0aXN0aWNhbCBTb2Z0d2FyZSA3Mi4gaHR0cHM6Ly93d3cuanN0YXRzb2Z0Lm9yZy9hcnRpY2xlL3ZpZXcvdjA3MmMwMi4NCg0KUi5ILiBNeWVycywgRC5DLiBNb250Z29tZXJ5LiAyMDAyLiBSZXNwb25zZSBTdXJmYWNlIE1ldGhvZG9sb2d5OiBQcm9jZXNzIGFuZCBQcm9kdWN0IE9wdGltaXphdGlvbiBVc2luZyBEZXNpZ25lZCBFeHBlcmltZW50cy4gMm5kIGVkLiBKb2huIFdpbGV5ICYgU29ucy4NCg0KICAgIA0KICAgIA0KLSBMZWJpaCB0ZXBhdG55YSwgY3VrdXAgbWVyZWR1a3NpIG1vZGVsIGt1YmlrICM0IG1lbmphZGkgbW9kZWwga3VhZHJhdCAjMiBqaWthIGVmZWsgdXJ1dGFuIGtldGlnYSB0aWRhayBzaWduaWZpa2FuLCBhdGF1IHVudHVrIG1lbmd1cmFuZ2kgIzIgbWVuamFkaSAjMSBqaWthIGVmZWsga3VhZHJhdCB0aWRhayBzaWduaWZpa2FuLuKGqQ0KDQotIExva2FzaSB5YW5nIHRlcGF0IGRhcmkgb3B0aW11bSB0ZXRhcCB0aWRhayBqZWxhcyBkYWxhbSBwbG90IGtvbnR1ci4gRGVuZ2FuIGJhbnR1YW4gb3B0aW1hc2ksIHN1YmplayBiYWIgNiwgbWFrc2ltdW0gZGFwYXQgZGl0ZW11a2FuIG1lbmphZGkgJHhfIHsxfSBeICogPSAwLjQxLCB4XyB7Mn0gXiAqID0gMC4zNCwgeF8gezN9IF4gKiA9IDAuMjUkZGVuZ2FuIHRpbmdrYXQgZXRzYSB5YW5nIGRpaGFyYXBrYW4gcGFkYSBzYWF0IGluaSAkXGhhdCB5ID0gODMyJC7ihqkNCg0KLSBKdW1sYWggcnVuIHNhbWEgZGVuZ2FuIGp1bWxhaCByZWdyZXNpLiBJbmkgYWthbiBtZW1iZXJpa2FuIGtlc2VzdWFpYW4geWFuZyBzZW1wdXJuYSBkZW5nYW4gJFJeMj0xJC4NCg0K