Deskripsi

Pada kesempatan kali ini, saya akan melakukan prediksi terhadap karyawan yang akan meninggalkan perusahaan dan tidak meninggalkan perusahan berdasarkan kategori dan beberapa variabel penunjangnya. Algoritma yang akan saya gunakan yaitu menggunakan model Classfication yang terdiri dari Logistik Regression, Classification Tree, Random Forsets dan Super Vector Machine (SVM) yang termasuk dalam Supervised Learning.

Dataset yang digunakan untuk studi kasus ini bisa didownload https://drive.google.com/file/d/14JF0M6G-RXjaNBhuJQEEY1yOtJENMPQS/view?usp=drivesdk

Input Data

Proses mengimprot data dalam format csv dapat dilakukan menggunakan fungsi rea.csv() dan menyebutkan nama file beserta folder tempat menyimpanya.

Data Description

Sebelum melangkah lebih jauh bekerja dengan data, saya perlu mengetahui informasi dasar dari data yang saya miliki. Informasi dasar meliputi ukuran/banyaknya data dan nama-nama kolom atau variabel didalamnya.

glimpse(karyawan)
Rows: 1,058
Columns: 35
$ Age                      <int> 41, 49, 37, 33, 27, 32, 59, 30, 38, 36, 35, 29, 31, 34, 28, 29, 32, 22, 53,~
$ Attrition                <int> 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, ~
$ BusinessTravel           <chr> "Travel_Rarely", "Travel_Frequently", "Travel_Rarely", "Travel_Frequently",~
$ DailyRate                <int> 1102, 279, 1373, 1392, 591, 1005, 1324, 1358, 216, 1299, 809, 153, 670, 134~
$ Department               <chr> "Sales", "Research & Development", "Research & Development", "Research & De~
$ DistanceFromHome         <int> 1, 8, 2, 3, 2, 2, 3, 24, 23, 27, 16, 15, 26, 19, 24, 21, 5, 16, 2, 2, 11, 9~
$ Education                <int> 2, 1, 2, 4, 1, 2, 3, 1, 3, 3, 3, 2, 1, 2, 3, 4, 2, 2, 4, 3, 2, 4, 4, 2, 1, ~
$ EducationField           <chr> "Life Sciences", "Life Sciences", "Other", "Life Sciences", "Medical", "Lif~
$ EmployeeCount            <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ~
$ EmployeeNumber           <int> 1, 2, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 2~
$ EnvironmentSatisfaction  <int> 2, 3, 4, 4, 1, 4, 3, 4, 4, 3, 1, 4, 1, 2, 3, 2, 1, 4, 1, 4, 1, 3, 1, 3, 2, ~
$ Gender                   <chr> "Female", "Male", "Male", "Female", "Male", "Male", "Female", "Male", "Male~
$ HourlyRate               <int> 94, 61, 92, 56, 40, 79, 81, 67, 44, 94, 84, 49, 31, 93, 50, 51, 80, 96, 78,~
$ JobInvolvement           <int> 3, 2, 2, 3, 3, 3, 4, 3, 2, 3, 4, 2, 3, 3, 2, 4, 4, 4, 2, 3, 4, 2, 3, 3, 3, ~
$ JobLevel                 <int> 2, 2, 1, 1, 1, 1, 1, 1, 3, 2, 1, 2, 1, 1, 1, 3, 1, 1, 4, 1, 2, 1, 3, 1, 1, ~
$ JobRole                  <chr> "Sales Executive", "Research Scientist", "Laboratory Technician", "Research~
$ JobSatisfaction          <int> 4, 2, 3, 3, 2, 4, 1, 3, 3, 3, 2, 3, 3, 4, 3, 1, 2, 4, 4, 4, 3, 1, 2, 4, 1, ~
$ MaritalStatus            <chr> "Single", "Married", "Single", "Married", "Married", "Single", "Married", "~
$ MonthlyIncome            <int> 5993, 5130, 2090, 2909, 3468, 3068, 2670, 2693, 9526, 5237, 2426, 4193, 291~
$ MonthlyRate              <int> 19479, 24907, 2396, 23159, 16632, 11864, 9964, 13335, 8787, 16577, 16479, 1~
$ NumCompaniesWorked       <int> 8, 1, 6, 1, 9, 0, 4, 1, 0, 6, 0, 0, 1, 0, 5, 1, 0, 1, 2, 5, 0, 7, 0, 1, 2, ~
$ Over18                   <chr> "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", ~
$ OverTime                 <chr> "Yes", "No", "Yes", "Yes", "No", "No", "Yes", "No", "No", "No", "No", "Yes"~
$ PercentSalaryHike        <int> 11, 23, 15, 11, 12, 13, 20, 22, 21, 13, 13, 12, 17, 11, 14, 11, 12, 13, 16,~
$ PerformanceRating        <int> 3, 4, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, ~
$ RelationshipSatisfaction <int> 1, 4, 2, 3, 4, 3, 1, 2, 2, 2, 3, 4, 4, 3, 2, 3, 4, 2, 3, 3, 4, 2, 3, 4, 3, ~
$ StandardHours            <int> 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,~
$ StockOptionLevel         <int> 0, 1, 0, 0, 1, 0, 3, 1, 0, 2, 1, 0, 1, 1, 0, 1, 2, 2, 0, 0, 1, 0, 0, 0, 0, ~
$ TotalWorkingYears        <int> 8, 10, 7, 8, 6, 8, 12, 1, 10, 17, 6, 10, 5, 3, 6, 10, 7, 1, 31, 6, 5, 10, 1~
$ TrainingTimesLastYear    <int> 0, 3, 3, 3, 3, 2, 3, 2, 2, 3, 5, 3, 1, 2, 4, 1, 5, 2, 3, 3, 5, 4, 4, 6, 2, ~
$ WorkLifeBalance          <int> 1, 3, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 2, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 3, 3, ~
$ YearsAtCompany           <int> 6, 10, 0, 8, 2, 7, 1, 1, 9, 7, 5, 9, 5, 2, 4, 10, 6, 1, 25, 3, 4, 5, 12, 0,~
$ YearsInCurrentRole       <int> 4, 7, 0, 7, 2, 7, 0, 0, 7, 7, 4, 5, 2, 2, 2, 9, 2, 0, 8, 2, 2, 3, 6, 0, 2, ~
$ YearsSinceLastPromotion  <int> 0, 1, 0, 3, 2, 3, 0, 0, 1, 7, 0, 0, 4, 1, 0, 8, 0, 0, 3, 1, 1, 0, 2, 0, 1, ~
$ YearsWithCurrManager     <int> 5, 7, 0, 0, 2, 6, 0, 0, 8, 7, 3, 8, 3, 2, 3, 8, 5, 0, 7, 2, 3, 3, 11, 0, 3,~

Tampaknya bahwa ada sebanyak 1085 baris pada data dengan varaibel sebanyak 35 dan ada baiknya saya mengetahui berapa banyak karyawan yang statusnya tergolong No Attrion (Tidak memiliki atirisi) dan Yes Attrion (Mengalmani Atrisi), karena varaibel ini merupakan variabel yang akan saya gunakan dalam pemodelan sebagai variabel target.

menggunakan fungsi tabel () yang dapat menghasilkan frekuensi dari setap kategori, sedangkan prop.table() dapat menghasilkan proporsi atau presentasi-nya,

table(karyawan$Attrition)

  0   1 
879 179 

Cek Prosentase Variabel Target

prop.table(table(karyawan$Attrition))

        0         1 
0.8308129 0.1691871 

Beradasarkan hasi di atas diperoleh bahwa karyawan yang mengalami Attriton ada sebanyak 179 karyawan atau sebanyak 17% dari keseluruhan yang ada.

Cek Missing Value (Apakah ada nilai yang kosong atau NA)

colSums(is.na(karyawan))
                     Age                Attrition           BusinessTravel                DailyRate 
                       0                        0                        0                        0 
              Department         DistanceFromHome                Education           EducationField 
                       0                        0                        0                        0 
           EmployeeCount           EmployeeNumber  EnvironmentSatisfaction                   Gender 
                       0                        0                        0                        0 
              HourlyRate           JobInvolvement                 JobLevel                  JobRole 
                       0                        0                        0                        0 
         JobSatisfaction            MaritalStatus            MonthlyIncome              MonthlyRate 
                       0                        0                        0                        0 
      NumCompaniesWorked                   Over18                 OverTime        PercentSalaryHike 
                       0                        0                        0                        0 
       PerformanceRating RelationshipSatisfaction            StandardHours         StockOptionLevel 
                       0                        0                        0                        0 
       TotalWorkingYears    TrainingTimesLastYear          WorkLifeBalance           YearsAtCompany 
                       0                        0                        0                        0 
      YearsInCurrentRole  YearsSinceLastPromotion     YearsWithCurrManager 
                       0                        0                        0 

Menghapus varaibel yang tidak dibutuhkan dalam project ini

Eksploration Data Analyisis

Saya akan membandingkan 8 variabel yaitu (Age, Attrition, Education, JobLevel, PercentSalayrHike, MontlyIncome, PerformanceRating, TotalWorkingYears)

cor(karyawan_1)
                          Age    Attrition   Education    JobLevel PercentSalaryHike MonthlyIncome
Age                1.00000000 -0.172067255  0.18072285  0.50648393       -0.02485555    0.49739211
Attrition         -0.17206725  1.000000000 -0.03263074 -0.16920128        0.00490725   -0.16359969
Education          0.18072285 -0.032630740  1.00000000  0.09492171       -0.02671213    0.09253269
JobLevel           0.50648393 -0.169201277  0.09492171  1.00000000       -0.07018046    0.95396393
PercentSalaryHike -0.02485555  0.004907250 -0.02671213 -0.07018046        1.00000000   -0.06025745
MonthlyIncome      0.49739211 -0.163599695  0.09253269  0.95396393       -0.06025745    1.00000000
PerformanceRating -0.03342552  0.007754974 -0.04300827 -0.06153236        0.76979309   -0.05822517
TotalWorkingYears  0.69042789 -0.177136556  0.13121292  0.78692544       -0.05325025    0.77817684
                  PerformanceRating TotalWorkingYears
Age                    -0.033425523        0.69042789
Attrition               0.007754974       -0.17713656
Education              -0.043008270        0.13121292
JobLevel               -0.061532363        0.78692544
PercentSalaryHike       0.769793092       -0.05325025
MonthlyIncome          -0.058225173        0.77817684
PerformanceRating       1.000000000       -0.02749099
TotalWorkingYears      -0.027490995        1.00000000

Dari hasil diatas, diperoleh bahwa tidak ada feature yang secara langsung memiliki nilai corelation cukup tinggi terhadap Attrition. Namun terdapat beberapa hal yang higlight disini Persentase JobLevel koresali yang tinggi yaitu (0.95 dari skala 1) dengan Monthly Income. dan saya akan menghapus Variabel JobLevel, Karena dari Monthly Income sudah bisa menjelaskan bhaw gaji ditentukan sesuai dengan job level masing-masing karyawan.

Sebelum memvisualisasikan data, saya ingin mengubah tipe data variabel Integer, Character ke varaiabel factor agar mudah untuk memvisualisasikan data dan menggunakan model.

Mari lihat apakah variabel character dan Integer berubah ke variabel factor

glimpse(karyawan)
Rows: 1,058
Columns: 29
$ Age                      <int> 41, 49, 37, 33, 27, 32, 59, 30, 38, 36, 35, 29, 31, 34, 28, 29, 32, 22, 53,~
$ Attrition                <fct> Yes, No, Yes, No, No, No, No, No, No, No, No, No, No, No, Yes, No, No, No, ~
$ BusinessTravel           <fct> Travel_Rarely, Travel_Frequently, Travel_Rarely, Travel_Frequently, Travel_~
$ DailyRate                <int> 1102, 279, 1373, 1392, 591, 1005, 1324, 1358, 216, 1299, 809, 153, 670, 134~
$ Department               <fct> Sales, Research & Development, Research & Development, Research & Developme~
$ DistanceFromHome         <int> 1, 8, 2, 3, 2, 2, 3, 24, 23, 27, 16, 15, 26, 19, 24, 21, 5, 16, 2, 2, 11, 9~
$ Education                <int> 2, 1, 2, 4, 1, 2, 3, 1, 3, 3, 3, 2, 1, 2, 3, 4, 2, 2, 4, 3, 2, 4, 4, 2, 1, ~
$ EducationField           <fct> Life Sciences, Life Sciences, Other, Life Sciences, Medical, Life Sciences,~
$ EnvironmentSatisfaction  <fct> Medium, High, Very, Very, Low, Very, High, Very, Very, High, Low, Very, Low~
$ Gender                   <fct> Female, Male, Male, Female, Male, Male, Female, Male, Male, Male, Male, Fem~
$ HourlyRate               <int> 94, 61, 92, 56, 40, 79, 81, 67, 44, 94, 84, 49, 31, 93, 50, 51, 80, 96, 78,~
$ JobInvolvement           <int> 3, 2, 2, 3, 3, 3, 4, 3, 2, 3, 4, 2, 3, 3, 2, 4, 4, 4, 2, 3, 4, 2, 3, 3, 3, ~
$ JobRole                  <fct> Sales Executive, Research Scientist, Laboratory Technician, Research Scient~
$ JobSatisfaction          <fct> Very, Medium, High, High, Medium, Very, Low, High, High, High, Medium, High~
$ MaritalStatus            <fct> Single, Married, Single, Married, Married, Single, Married, Divorced, Singl~
$ MonthlyIncome            <int> 5993, 5130, 2090, 2909, 3468, 3068, 2670, 2693, 9526, 5237, 2426, 4193, 291~
$ MonthlyRate              <int> 19479, 24907, 2396, 23159, 16632, 11864, 9964, 13335, 8787, 16577, 16479, 1~
$ NumCompaniesWorked       <fct> 8, 1, 6, 1, 9, 0, 4, 1, 0, 6, 0, 0, 1, 0, 5, 1, 0, 1, 2, 5, 0, 7, 0, 1, 2, ~
$ PercentSalaryHike        <int> 11, 23, 15, 11, 12, 13, 20, 22, 21, 13, 13, 12, 17, 11, 14, 11, 12, 13, 16,~
$ PerformanceRating        <int> 3, 4, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, ~
$ RelationshipSatisfaction <int> 1, 4, 2, 3, 4, 3, 1, 2, 2, 2, 3, 4, 4, 3, 2, 3, 4, 2, 3, 3, 4, 2, 3, 4, 3, ~
$ StockOptionLevel         <int> 0, 1, 0, 0, 1, 0, 3, 1, 0, 2, 1, 0, 1, 1, 0, 1, 2, 2, 0, 0, 1, 0, 0, 0, 0, ~
$ TotalWorkingYears        <int> 8, 10, 7, 8, 6, 8, 12, 1, 10, 17, 6, 10, 5, 3, 6, 10, 7, 1, 31, 6, 5, 10, 1~
$ TrainingTimesLastYear    <int> 0, 3, 3, 3, 3, 2, 3, 2, 2, 3, 5, 3, 1, 2, 4, 1, 5, 2, 3, 3, 5, 4, 4, 6, 2, ~
$ WorkLifeBalance          <int> 1, 3, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 2, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 3, 3, ~
$ YearsAtCompany           <int> 6, 10, 0, 8, 2, 7, 1, 1, 9, 7, 5, 9, 5, 2, 4, 10, 6, 1, 25, 3, 4, 5, 12, 0,~
$ YearsInCurrentRole       <int> 4, 7, 0, 7, 2, 7, 0, 0, 7, 7, 4, 5, 2, 2, 2, 9, 2, 0, 8, 2, 2, 3, 6, 0, 2, ~
$ YearsSinceLastPromotion  <int> 0, 1, 0, 3, 2, 3, 0, 0, 1, 7, 0, 0, 4, 1, 0, 8, 0, 0, 3, 1, 1, 0, 2, 0, 1, ~
$ YearsWithCurrManager     <int> 5, 7, 0, 0, 2, 6, 0, 0, 8, 7, 3, 8, 3, 2, 3, 8, 5, 0, 7, 2, 3, 3, 11, 0, 3,~

Visualisasi

Visualisai Analysis Univariate (Analisis 1 varibel)

Analysis Univariat adalah suatu teknik analysis data terhadap satu variabel secara mandiri, tiap variabel dianalysis tanpa dikaitkan dengan variabel lainya.

Attrition

Dari diagram ini, menjelaskan bahwa di perusahaan ini mengalami Atrition cukup tinggi yaitu sebanyak 16.9% atau 17% dari sebanyak 1058 karyawan yang bekerja diperusahaan, 179 karyawan meninggalkan perusahaan. Angka 179 karyawan ini perlu saya lihat apa yang menyebabkan mereka bisa meninggalkan perusahaan.

Gender

Ternyata di perusahaan ini banyak karyawan laki-laki yang bekerja diperusahaan dari pada karyawan perempuan. Lebih dari itu 60% populasinya adalah 620 karyawan laki-laki dan 438 karyawan perempuan.

Marital Status

Status pernikahan banyak yang sudah menikah ada 464 yang menikah, 352 yang single, dan divorced 242 karyawan.

Environment Saatisfaction

kepuasan lingkungakan kerja banyak yang High, dan ada juga yang low. sebanyak 209 karyawan yang merasa lingkungan kerjanya tidak sehat.

Job Satisfaction

Kepuasan terhadap pekerjaan banyak yang very dan high, sangat tinggi. tetapi ada juga yang rendah, sebanyak 205 karyawan dari 1058 karyawan yang merasa tidak puas dengan pekerjaanya. Ini juga perlu diteliti kenapa banyak karyawan yang tidak puas dengan pekerjaanya. Apa karena beban kerja yang terlalu tinggi, atau alasan lain.

Num Companies Worked

Jumlah pengalaman pegawai yang bekerja di perusahaan lain, banyak yang 1 kali, ada 356 karyawan yang mempunyai pengalaman kerja 1 kali. Artinya karyawan ini pernah bekerja di perusahaan lain selama satu tahun.

Analysis Bivariate (Analysis 2 Variabel)

Analysis Bivariat adalah dilakukan mengatahui ada tidaknya hubungan kedua variabel

Karyawan yang mengalami attrition berdasarkan gender

Dari diagaram ini ternyata yang mengalami attrisi paling banyak adalah laki-laki. Nah ini saya perlu cari tahu alasan kenapa laki-laki lebih banyak yang meninggalkan perusahaan dari pada wanita.

karyawan yang mengalami Attrition berdasarkan Marital Status

Dari diagaram ini ternyata yang mengalami Attrition paling banyak adalah yang berstatus single. Bearti kemungkinan 17% Attrition disebabkan karena Kontrak Habis, PHK, atau pengunduran diri, bukan karena Pensiun.

Karyawan yang mengalami atrition berdasarkan Departement

Dari diagaram ini yang paling banyak meninggalkan perusahaan adalah dari Departement Research & Development

Karyawan yang mengalami Attrition berdasarkan Environment Satisfaction

Dari diagaram ini telah membuktikan bahwa banyak karyawan yang merasa tidak puas dengan lingkungan kerjanya. Jadi sebagai pihak manajemen perusahaan mestinya selalu memeriksa apakah suasana kantornya harmonis atau tidak, apakah karyawannya dapat mengembangkan diri, kepercayaan satu sama lain atau tidak.

Karyawan yang mengalami attrition berdasarkan job satisfaction

Dari diagaram ini menjelaskan bahwa ada beberapa karyawan yang merasa puas dengan pekerjaanya, ada juga yang tidak puas dengan pekerjaanya ini juga cukup banyak yang tidak puas dengan pekerjaanya dan perlu saya galih lebih dalam lagi apa yang membuat karyawan tidak puas dengan pekerjaanya.

Karyawan yang mengalami attrition berdasarkan Num Compaines Workd

Dari diagram ini menjelaskan bahwa banyak yang mempunyai pengalaman kerja di perusahaan lain hanya 1 kali atau sudah mempunyai pengamalaman 1 tahun, Artinya banyak yang memulai karir. Mungkin alasanya karena mereka ingin memperluas jaringan saja atau ingin mencoba pengalaman baru.

Analysis Multivariat (Analysis 3 Variabel)

Analysis Multivariat adalah membandingkan dua variabel / lebih dari 2 variabel atau melihat pengaruhnya variabel lainya.

Karyawan yang mengalami attrition berdasarkan usia dan lama bekerja di perusahaan

Dari plot ini menjelaskan bahwa karyawan perusahaan paling banyak berada di rentang usia 30-40 tahun. Dan jumlah karyawan yang paling banyak meninggalkan perusahaan adalah karyawan di kelompok rentang usia dibawah 30 tahun dan rentang usia 30-40 tahun. Dan berstatus single yang paling tinggi dibandingkan status lainya. dan rata-rata paling banyak bekerja di perusahaan selama 0 - 10 tahun.

Karyawan yang mengalami attrition berdasrakan gaji dan lama bekerja di perusahaan

Dari plot ini menjelaskan bahwa banyak karyawan yang meninggalkan perusahaan ini rata-rata memiliki dibawah 5 juta dan telah bekerja selama 0 - 10 tahun. Dan kebanyakan stasus nya adalah single, disini juga ada yang sudah bekerja selama 20 tahun tidak kunjung naik gaji. Mungkin ini juga bisa jadi suatu alasan mengapa karyawan meninggalkan perusahaan.

Jadi kesimpulanya adalah Attrition yang paling banyak terjadi pada karyawan kategori usia muda (dibawah 40 tahun), berstatus single atau belum menikah, dan belum pernah memiliki pengalaman bekerja di perusahaan lain sebelumnya. Oleh karena itu, kelompok karyawan yang masuk kategori ini mungkin sebaliknya diberi perlakuan khusus seperti pembatasan rekrutmen.

Data Preparation

Melakukan One Hot Encoding (OHE)

Setelah dataset dibersihkan, masih ada beberapa tahap yang perlu dilakukan agar dataset benar-benar siap untuk diproses oleh model machine learnig. OHE untuk Business Travel, Departement, Education, EducationField, EnvironmentSatisfaction, Gender dan MartialStatus

Membuat Variabel Dummy

library(caret)
dmy <- dummyVars("~ BusinessTravel+Department+Education+EducationField+
                 EnvironmentSatisfaction+Gender+MaritalStatus",
                 data = karyawan)

karyawan_ohe <- data.frame(predict(dmy, newdata = karyawan))
karyawan <- cbind(karyawan, karyawan_ohe)

Remove OHE

karyawan$BusinessTravel <- NULL
karyawan$Department <- NULL
karyawan$Education <- NULL
karyawan$EducationField <- NULL
karyawan$EnvironmentSatisfaction <- NULL
karyawan$MaritalStatus <- NULL

Melakukan Remove Outlier

Mendapatkan nilai outlier

out_stag
 [1] 17 15 15 15 15 17 16 17 15 17 17 17

Mendapatkan indeks baris nilai outlier

out_idx
 [1]  29 124 154 188 232 387 562 617 636 687 876 927

Hapus baris dengan outlier

karyawan <- karyawan[-out_idx,]

Membagi Data Testing dan Data Train

Data Testing = 30% : Data Traning = 70%

set.seed(2021)
m <- nrow(karyawan)
train_idx <- sample(m, 0.7 * m)

train_df <- karyawan[train_idx,]
test_df <- karyawan[-train_idx,]

Modeling

Logistic Regression (LR)

summary(fit.logit)

Call:
glm(formula = Attrition ~ ., family = binomial(link = "logit"), 
    data = train_df)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-2.14865  -0.53246  -0.28516  -0.06424   3.11252  

Coefficients: (7 not defined because of singularities)
                                    Estimate Std. Error z value Pr(>|z|)    
(Intercept)                        1.885e+00  2.245e+00   0.840 0.400969    
Age                               -2.315e-02  1.860e-02  -1.245 0.213230    
DailyRate                         -3.994e-04  3.116e-04  -1.282 0.199865    
DistanceFromHome                   3.965e-02  1.470e-02   2.697 0.006992 ** 
GenderMale                         3.080e-01  2.565e-01   1.201 0.229891    
HourlyRate                        -1.363e-03  6.121e-03  -0.223 0.823717    
JobInvolvement                    -4.186e-01  1.726e-01  -2.424 0.015332 *  
JobRoleHuman Resources             1.815e+01  2.200e+03   0.008 0.993416    
JobRoleLaboratory Technician       2.082e+00  7.251e-01   2.872 0.004082 ** 
JobRoleManager                     1.686e-01  1.108e+00   0.152 0.879066    
JobRoleManufacturing Director      4.807e-01  8.386e-01   0.573 0.566502    
JobRoleResearch Director          -1.583e+01  8.821e+02  -0.018 0.985681    
JobRoleResearch Scientist          1.665e+00  7.283e-01   2.286 0.022227 *  
JobRoleSales Executive             1.648e+00  1.431e+00   1.152 0.249338    
JobRoleSales Representative        3.644e+00  1.512e+00   2.410 0.015969 *  
JobSatisfactionMedium             -1.005e+00  4.043e-01  -2.485 0.012947 *  
JobSatisfactionHigh               -4.565e-01  3.390e-01  -1.346 0.178172    
JobSatisfactionVery               -1.176e+00  3.511e-01  -3.349 0.000812 ***
MonthlyIncome                      8.599e-05  8.351e-05   1.030 0.303140    
MonthlyRate                        1.968e-05  1.770e-05   1.112 0.266243    
NumCompaniesWorked1                6.576e-01  4.249e-01   1.548 0.121690    
NumCompaniesWorked2                7.553e-01  6.258e-01   1.207 0.227437    
NumCompaniesWorked3                1.673e-01  6.433e-01   0.260 0.794798    
NumCompaniesWorked4                7.919e-01  5.963e-01   1.328 0.184135    
NumCompaniesWorked5                1.954e+00  6.392e-01   3.056 0.002241 ** 
NumCompaniesWorked6                1.572e+00  6.659e-01   2.360 0.018255 *  
NumCompaniesWorked7                1.750e+00  6.359e-01   2.752 0.005922 ** 
NumCompaniesWorked8                1.455e+00  7.714e-01   1.886 0.059247 .  
NumCompaniesWorked9                1.722e+00  7.529e-01   2.288 0.022159 *  
PercentSalaryHike                  5.435e-03  5.330e-02   0.102 0.918775    
PerformanceRating                  1.291e-01  5.216e-01   0.247 0.804527    
RelationshipSatisfaction          -3.039e-01  1.102e-01  -2.757 0.005827 ** 
StockOptionLevel                   5.457e-02  2.194e-01   0.249 0.803617    
TotalWorkingYears                 -3.182e-02  3.980e-02  -0.800 0.423989    
TrainingTimesLastYear             -2.961e-01  9.649e-02  -3.069 0.002147 ** 
WorkLifeBalance                   -5.895e-01  1.782e-01  -3.308 0.000938 ***
YearsAtCompany                     1.731e-02  5.294e-02   0.327 0.743716    
YearsInCurrentRole                -1.369e-01  6.626e-02  -2.067 0.038748 *  
YearsSinceLastPromotion            2.060e-01  5.933e-02   3.471 0.000518 ***
YearsWithCurrManager              -9.589e-02  6.795e-02  -1.411 0.158225    
BusinessTravel.Non.Travel         -5.864e-01  4.694e-01  -1.249 0.211623    
BusinessTravel.Travel_Frequently   5.491e-01  2.939e-01   1.868 0.061696 .  
BusinessTravel.Travel_Rarely              NA         NA      NA       NA    
Department.Human.Resources        -1.489e+01  2.200e+03  -0.007 0.994598    
Department.Research...Development  4.585e-01  1.294e+00   0.354 0.723097    
Department.Sales                          NA         NA      NA       NA    
Education                          6.503e-02  1.237e-01   0.526 0.599111    
EducationField.Human.Resources    -2.677e+00  1.541e+00  -1.737 0.082410 .  
EducationField.Life.Sciences      -1.443e+00  4.427e-01  -3.260 0.001114 ** 
EducationField.Marketing          -5.805e-01  5.526e-01  -1.050 0.293553    
EducationField.Medical            -1.222e+00  4.485e-01  -2.725 0.006434 ** 
EducationField.Other              -9.240e-01  6.676e-01  -1.384 0.166349    
EducationField.Technical.Degree           NA         NA      NA       NA    
EnvironmentSatisfaction.Low        1.125e+00  3.507e-01   3.209 0.001331 ** 
EnvironmentSatisfaction.Medium     4.502e-01  3.516e-01   1.281 0.200335    
EnvironmentSatisfaction.High      -7.604e-02  3.309e-01  -0.230 0.818239    
EnvironmentSatisfaction.Very              NA         NA      NA       NA    
Gender.Female                             NA         NA      NA       NA    
Gender.Male                               NA         NA      NA       NA    
MaritalStatus.Divorced            -1.594e+00  4.981e-01  -3.199 0.001378 ** 
MaritalStatus.Married             -1.038e+00  3.530e-01  -2.941 0.003270 ** 
MaritalStatus.Single                      NA         NA      NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 675.47  on 731  degrees of freedom
Residual deviance: 467.60  on 677  degrees of freedom
AIC: 577.6

Number of Fisher Scoring iterations: 17

Evaluasi Pengujian

pred
            2             3             5             6             9            11            14 
 -3.636586752  -0.024447635  -0.660163448  -2.408886012  -2.002335739  -3.553382083  -3.320876294 
           15            21            25            26            31            33            36 
  0.912524291  -4.948029052  -0.606966253  -5.662858019  -2.590135263  -0.789190409  -4.427705166 
           39            40            41            43            46            59            63 
 -1.667584251  -2.996293977  -3.135949740   2.240062021 -16.630462801  -4.590789697 -15.890695648 
           65            66            72            75            79            84            87 
 -3.047214414  -4.161652340  -5.414120940  -3.075459307 -17.022186592  -4.538438662  -0.373874015 
           89            92            97           100           101           103           105 
 -3.805533074  -1.740757857  -1.064143238  -3.060405307  -3.354398812  -0.830425734  -5.721236750 
          111           112           123           132           133           137           142 
 -0.433063417   0.163248973  -0.963841035  -2.063206822  -1.285868178  -1.371784256  -0.381618404 
          143           147           156           160           164           166           171 
 -0.693722503  -2.680273654  -3.701085913   0.135831111  -4.500218915  -4.306529989  -1.841645349 
          172           179           186           192           194           197           205 
  1.941010689  -1.245076709  -5.405203105  -2.813608012  -6.269223234  -0.541464731  -1.100150782 
          210           212           214           221           223           224           225 
 -3.845994232  -3.170416332 -19.132722047  -3.788749815 -20.039988067  -4.552824030  -5.036185981 
          229           233           236           239           241           243           244 
 -2.729625891  -0.059674375  -4.917984463  -2.439723919  -2.017741335  -1.334611114  -1.051980347 
          249           253           254           255           260           270           271 
 -1.285256265  -1.480704855  -1.821452057  -3.299522178  -0.926202393  -4.916790592  -4.131932113 
          273           276           282           286           288           289           292 
 -3.491531788 -19.922783838  -3.303348301  -4.284046803  -3.316286149  -1.962213417   0.380039661 
          293           294           295           297           301           302           303 
 -1.150127844   0.004837980  -1.705713092  -0.303716600  -4.407565575   1.510254759  -3.790497258 
          309           313           319           320           323           329           331 
 -5.266873212  -2.705851639  -1.703955265  -2.006687394  -0.897225440  -2.159447779  -3.314664101 
          335           336           337           339           342           343           348 
 -1.382698418  -1.795678938  -1.452517269  -3.227730557 -22.181530030  -3.598984674   0.680939245 
          352           353           357           358           360           363           364 
 -4.363678911  -1.188753034  -3.311430409   2.143613137  -2.348865874   0.821929454   1.237810088 
          373           375           377           382           386           388           389 
 -2.778249967  -2.606867351  -5.293791764   0.511673458   0.462778873  -3.695149538  -3.262228183 
          392           395           400           405           411           415           416 
 -0.717779060  -3.937398281  -1.197767814  -2.343939234  -2.777665249   0.866694032   0.007476725 
          418           420           424           429           440           443           447 
 -8.094674538  -3.205727893  -3.486124184  -3.706208701  -1.014057069  -0.797998374  -3.514790263 
          449           453           461           465           472           474           480 
 -1.799632425  -5.193345843  -0.092188249  -3.203429839  -5.120202760 -22.041042742  -1.703859510 
          483           486           492           493           494           496           499 
 -0.954864621  -3.036439228  -2.752013897  -1.099388034   0.573379375  -1.704487629  -1.956352284 
          502           503           511           513           514           518           520 
 -1.911843635  -1.730660794  -0.858248848  -0.862687204  -1.852837529  -4.570362653  -4.231202065 
          522           523           526           531           536           540           546 
 -4.984661693  -2.329775172   0.982924758  -5.552226903 -17.980945510   0.258605596  -0.429237187 
          550           552           558           559           560           565           566 
 -3.119760216  -1.867958336  -5.535744110  -0.870139177   0.919984178   1.863227820  -0.749639347 
          567           570           573           574           578           579           583 
 -1.696647372  -1.412686026  -2.193528951   1.773540278  -2.474495189  -1.448068411  -5.991852237 
          584           591           593           594           596           598           601 
 -0.952719476 -21.674456768  -4.762036273  -5.223140920 -18.133487855  -5.023893192  -4.902894869 
          603           604           610           611           622           627           631 
 -1.118416192  -1.724440066 -17.418255144 -20.183381671  -5.067519452  -1.460186374  -0.765401604 
          638           640           647           649           652           653           655 
 -4.378983309  -1.664002628  -0.511066939  -0.042097452  -3.037100324  -2.335911071  -2.506825512 
          656           663           686           692           694           702           712 
 -6.096641679   0.430251326  -1.696610837  -2.167632188  -4.597121918  -3.681310637  -0.465176033 
          715           719           721           727           729           736           737 
-19.861553056  -3.241477046  -0.631995144  -3.513834085  -3.405312022  -1.652412838  -3.218042244 
          739           740           744           746           750           755           758 
 -3.517976172  -3.836721162  -3.942930853  -4.958209593  -3.794018079  -0.966411263  -4.064956988 
          763           765           767           769           771           781           783 
  0.912524953  -1.455075369 -18.161259153   0.500012530 -18.730869945  -0.264551145  -1.866344580 
          786           787           796           802           803           804           806 
 -1.578487175  -1.341801932  -3.922841255  -2.547905768  -4.320732201  -3.838606174  -4.796183683 
          808           810           817           820           825           826           830 
 -3.233241194  -5.893603231  -1.024844013  -1.293256714   0.974647510  -3.182693086   0.251755381 
          832           833           836           840           842           843           847 
 -1.282703994  -3.176287369   2.113427316  -1.188251453   0.017270997  -3.328654050  -4.201807220 
          848           849           853           859           860           861           862 
 -3.279577909  -1.145679034  -4.419995171  -6.382862690  -1.651177414  -3.460186222  -1.237728283 
          869           872           873           877           879           883           885 
 -0.495717674  -0.962166859  -1.506384923   0.520832139  -1.242613733  -1.587302246  -0.782207176 
          889           891           893           897           900           902           903 
 -3.705673472  -2.580918060  -0.815187731  -2.752474023  -2.469424330   0.129901018  -2.404349899 
          904           908           909           910           921           923           924 
 -4.717315028  -4.442215707  -5.008929658  -1.172459329  -3.121066414  -3.645951430  -3.845567184 
          926           928           934           938           943           948           950 
 -3.032880673  -4.922619640   1.006176687  -1.531535848  -3.149532565  -0.408921536  -3.530750215 
          958           960           963           965           967           969           974 
 -1.587909138  -2.879595957 -22.042587723  -2.587611453  -2.429344124  -1.311354850  -3.146153276 
          977           978           980           984           989           999          1001 
 -2.386053657  -0.514012974   0.972293926  -5.211536201  -2.777735466  -1.670872768  -0.215410347 
         1003          1004          1005          1006          1008          1011          1015 
 -1.606977995   0.208868397  -2.581621216   1.519619855  -1.990151871 -23.679652210 -18.599034779 
         1016          1017          1022          1023          1025          1034          1038 
 -0.573437466  -0.998979459   1.746317559  -0.371486468 -20.481078262  -3.722895832  -2.901718258 
         1039          1042          1045          1046          1047          1052 
 -2.016423350  -2.579074101  -0.739200118  -4.239332635  -1.682797441   0.204242424 
prob
           2            3            5            6            9           11           14           15 
2.566601e-02 4.938884e-01 3.407029e-01 8.249760e-02 1.189579e-01 2.783092e-02 3.486191e-02 7.135164e-01 
          21           25           26           31           33           36           39           40 
7.047366e-03 3.527515e-01 3.460561e-03 6.977600e-02 3.123425e-01 1.180094e-02 1.587465e-01 4.759358e-02 
          41           43           46           59           63           65           66           72 
4.164848e-02 9.037899e-01 5.990758e-08 1.004296e-02 1.255332e-07 4.533789e-02 1.534272e-02 4.433507e-03 
          75           79           84           87           89           92           97          100 
4.413096e-02 4.049098e-08 1.057702e-02 4.076053e-01 2.176316e-02 1.492167e-01 2.565185e-01 4.477037e-02 
         101          103          105          111          112          123          132          133 
3.375141e-02 3.035551e-01 3.264962e-03 3.933951e-01 5.407218e-01 2.761098e-01 1.127247e-01 2.165530e-01 
         137          142          143          147          156          160          164          166 
2.023317e-01 4.057366e-01 3.332055e-01 6.414745e-02 2.410147e-02 5.339057e-01 1.098456e-02 1.330095e-02 
         171          172          179          186          192          194          197          205 
1.368568e-01 8.744631e-01 2.235535e-01 4.473044e-03 5.659324e-02 1.890120e-03 3.678469e-01 2.497116e-01 
         210          212          214          221          223          224          225          229 
2.091823e-02 4.029431e-02 4.906416e-09 2.212335e-02 1.980358e-09 1.042753e-02 6.456529e-03 6.124767e-02 
         233          236          239          241          243          244          249          253 
4.850858e-01 7.260753e-03 8.019327e-02 1.173527e-01 2.083977e-01 2.588450e-01 2.166568e-01 1.853210e-01 
         254          255          260          270          271          273          276          282 
1.392597e-01 3.558759e-02 2.836958e-01 7.269364e-03 1.579824e-02 2.955414e-02 2.226614e-09 3.545650e-02 
         286          288          289          292          293          294          295          297 
1.359927e-02 3.501669e-02 1.232277e-01 5.938827e-01 2.404657e-01 5.012095e-01 1.537206e-01 4.246492e-01 
         301          302          303          309          313          319          320          323 
1.203812e-02 8.190990e-01 2.208558e-02 5.133233e-03 6.262895e-02 1.539494e-01 1.185026e-01 2.896210e-01 
         329          331          335          336          337          339          342          343 
1.034517e-01 3.507154e-02 2.005760e-01 1.423779e-01 1.896145e-01 3.813541e-02 2.326397e-10 2.662329e-02 
         348          352          353          357          358          360          363          364 
6.639483e-01 1.257141e-02 2.334820e-01 3.518113e-02 8.950704e-01 8.715596e-02 6.946458e-01 7.751826e-01 
         373          375          377          382          386          388          389          392 
5.851089e-02 6.869775e-02 4.997578e-03 6.251987e-01 6.136732e-01 2.424149e-02 3.688996e-02 3.278822e-01 
         395          400          405          411          415          416          418          420 
1.912594e-02 2.318725e-01 8.754872e-02 5.854310e-02 7.040573e-01 5.018692e-01 3.050668e-04 3.895074e-02 
         424          429          440          443          447          449          453          461 
2.970963e-02 2.398127e-02 2.661866e-01 3.104538e-01 2.889432e-02 1.418958e-01 5.522725e-03 4.769692e-01 
         465          472          474          480          483          486          492          493 
3.903686e-02 5.939325e-03 2.677298e-10 1.539619e-01 2.779076e-01 4.580655e-02 5.997301e-02 2.498546e-01 
         494          496          499          502          503          511          513          514 
6.395426e-01 1.538801e-01 1.238624e-01 1.287739e-01 1.505031e-01 2.977053e-01 2.967782e-01 1.355401e-01 
         518          520          522          523          526          531          536          540 
1.024809e-02 1.432667e-02 6.795596e-03 8.868683e-02 7.276882e-01 3.863823e-03 1.552296e-08 5.642935e-01 
         546          550          552          558          559          560          565          566 
3.943085e-01 4.229948e-02 1.337781e-01 3.927785e-03 2.952253e-01 7.150389e-01 8.656727e-01 3.208999e-01 
         567          570          573          574          578          579          583          584 
1.549036e-01 1.958107e-01 1.003331e-01 8.548974e-01 7.766562e-02 1.902990e-01 2.492801e-03 2.783382e-01 
         591          593          594          596          598          601          603          604 
3.862807e-10 8.475733e-03 5.361471e-03 1.332681e-08 6.535865e-03 7.370332e-03 2.463052e-01 1.513001e-01 
         610          611          622          627          631          638          640          647 
2.724883e-08 1.715808e-09 6.258606e-03 1.884388e-01 3.174747e-01 1.238284e-02 1.592254e-01 3.749434e-01 
         649          652          653          655          656          663          686          692 
4.894772e-01 4.577767e-02 8.819217e-02 7.538107e-02 2.245360e-03 6.059337e-01 1.549084e-01 1.026950e-01 
         694          702          712          715          719          721          727          729 
9.980199e-03 2.457100e-02 3.857586e-01 2.367212e-09 3.763436e-02 3.470583e-01 2.892116e-02 3.212986e-02 
         736          737          739          740          744          746          750          755 
1.607831e-01 3.849238e-02 2.880506e-02 2.110899e-02 1.902243e-02 6.976482e-03 2.200967e-02 2.755964e-01 
         758          763          765          767          769          771          781          783 
1.687410e-02 7.135166e-01 1.892217e-01 1.296180e-08 6.224623e-01 7.333082e-09 4.342453e-01 1.339653e-01 
         786          787          796          802          803          804          806          808 
1.710098e-01 2.072139e-01 1.940096e-02 7.256730e-02 1.311584e-02 2.107008e-02 8.193526e-03 3.793378e-02 
         810          817          820          825          826          830          832          833 
2.749444e-03 2.640849e-01 2.153021e-01 7.260449e-01 3.982223e-02 5.626085e-01 2.170903e-01 4.006789e-02 
         836          840          842          843          847          848          849          853 
8.922014e-01 2.335718e-01 5.043176e-01 3.460116e-02 1.474775e-02 3.627847e-02 2.412792e-01 1.189119e-02 
         859          860          861          862          869          872          873          877 
1.687425e-03 1.609499e-01 3.046653e-02 2.248317e-01 3.785476e-01 2.764446e-01 1.814752e-01 6.273423e-01 
         879          883          885          889          891          893          897          900 
2.239814e-01 1.697638e-01 3.138444e-01 2.399380e-02 7.037664e-02 3.067861e-01 5.994708e-02 7.802964e-02 
         902          903          904          908          909          910          921          923 
5.324297e-01 8.284160e-02 8.859947e-03 1.163291e-02 6.633747e-03 2.364107e-01 4.224660e-02 2.543286e-02 
         924          926          928          934          938          943          948          950 
2.092698e-02 4.596234e-02 7.227419e-03 7.322713e-01 1.777691e-01 4.110970e-02 3.991707e-01 2.844984e-02 
         958          960          963          965          967          969          974          977 
1.696783e-01 5.317147e-02 2.673165e-10 6.993999e-02 8.096226e-02 2.122602e-01 4.124312e-02 8.424238e-02 
         978          980          984          989          999         1001         1003         1004 
3.742533e-01 7.255765e-01 5.423713e-03 5.853923e-02 1.583079e-01 4.463547e-01 1.670086e-01 5.520281e-01 
        1005         1006         1008         1011         1015         1016         1017         1022 
7.033066e-02 8.204825e-01 1.202408e-01 5.200651e-11 8.366462e-09 3.604440e-01 2.691421e-01 8.514877e-01 
        1023         1025         1034         1038         1039         1042         1045         1046 
4.081819e-01 1.274033e-09 2.359377e-02 5.206869e-02 1.174893e-01 7.049738e-02 3.231791e-01 1.421231e-02 
        1047         1052 
1.567254e-01 5.508838e-01 
logit.perf
      Predicted
Actual  No Yes
   No  241  21
   Yes  36  16

True Negatif

Ada 241 karyawan yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata memang benar dia tidak akan meninggalkan perusahaan.

True Positif

Ada 16 Karyawan yang diprediksi akan meninggalkan perusahaan, dan ternyata benar dia akan meninggalkan perusahaan.

False Positif

Ada 21 Karyawan yang diprediksi akan meninggalkan perusahaan, dan ternyata prediksinya salah. Ternyata 22 karyawan itu tidak meninggalkan perusahaan.

False Negatif

Ada 36 karyawan yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata prediksinya salah, Ternyata 36 karyawan itu benar-benar meninggalkan perusahaan.

Clssfication Tree

library(party)
Loading required package: grid
Loading required package: mvtnorm
Loading required package: modeltools
Loading required package: stats4
Loading required package: strucchange
Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric

Loading required package: sandwich

Attaching package: ‘strucchange’

The following object is masked from ‘package:stringr’:

    boundary

Plot Pohon Keputusan

Hasil Prediksi

ctree.pred
  [1] No  Yes No  No  No  No  No  No  No  No  No  Yes No  No  No  No  No  No  No  No  No  No  No  No  No  No 
 [27] No  No  No  No  No  No  No  Yes No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  Yes No  No 
 [53] No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No 
 [79] No  No  No  No  No  No  No  No  No  Yes No  Yes No  No  No  No  No  No  No  No  No  No  No  No  No  No 
[105] Yes No  No  No  No  No  No  Yes No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No 
[131] No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No 
[157] No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No 
[183] No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No 
[209] No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No 
[235] No  Yes No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No 
[261] No  No  No  No  Yes No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No 
[287] No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No  No 
[313] No  No 
Levels: No Yes
ctree.perf
      Predicted
Actual  No Yes
   No  257   5
   Yes  47   5

True Negatif

Ada 257 karyawan yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata memang benar dia tidak akan meninggalkan perusahaan.

True Positif

Ada 5 karyawan yang diprediksi akan meninggalkan perusahaan, dan ternyata memang benar dia akan meninggalkan perusahaan.

False Positif

Ada 5 karyawan yang diprediksi akan meninggalkan perusahaan, dan ternyata prediksinya salah. Ternyata 5 pegawainya itu tidak meninggalkan perusahaan.

False Negatif

Ada 47 karyawan yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata prediksinya salah. Ternyata 45 karyawan itu benar-benar meninggalkan perusahaan.

Random Forest

forest.pred
   2    3    5    6    9   11   14   15   21   25   26   31   33   36   39   40   41   43   46   59   63   65 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No  Yes   No   No   No   No 
  66   72   75   79   84   87   89   92   97  100  101  103  105  111  112  123  132  133  137  142  143  147 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 156  160  164  166  171  172  179  186  192  194  197  205  210  212  214  221  223  224  225  229  233  236 
  No   No   No   No   No  Yes   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 239  241  243  244  249  253  254  255  260  270  271  273  276  282  286  288  289  292  293  294  295  297 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No  Yes 
 301  302  303  309  313  319  320  323  329  331  335  336  337  339  342  343  348  352  353  357  358  360 
  No  Yes   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No  Yes   No 
 363  364  373  375  377  382  386  388  389  392  395  400  405  411  415  416  418  420  424  429  440  443 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 447  449  453  461  465  472  474  480  483  486  492  493  494  496  499  502  503  511  513  514  518  520 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 522  523  526  531  536  540  546  550  552  558  559  560  565  566  567  570  573  574  578  579  583  584 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 591  593  594  596  598  601  603  604  610  611  622  627  631  638  640  647  649  652  653  655  656  663 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No  Yes 
 686  692  694  702  712  715  719  721  727  729  736  737  739  740  744  746  750  755  758  763  765  767 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 769  771  781  783  786  787  796  802  803  804  806  808  810  817  820  825  826  830  832  833  836  840 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 842  843  847  848  849  853  859  860  861  862  869  872  873  877  879  883  885  889  891  893  897  900 
  No   No   No   No   No   No   No   No   No   No   No   No   No  Yes   No   No   No   No   No   No   No   No 
 902  903  904  908  909  910  921  923  924  926  928  934  938  943  948  950  958  960  963  965  967  969 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 974  977  978  980  984  989  999 1001 1003 1004 1005 1006 1008 1011 1015 1016 1017 1022 1023 1025 1034 1038 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
1039 1042 1045 1046 1047 1052 
  No   No   No   No   No   No 
Levels: No Yes
forest.perf
      Predicted
Actual  No Yes
   No  260   2
   Yes  47   5

True Negatif

Ada 260 karyawan yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata memang benar dia tidak akan meninggalkan perusahaan.

True Positif

Ada 5 karyawan yang diprediksi akan meninggalkan perusahaan, dan ternyata memang benar dia akan meninggalkan perusahaan.

False Positif

Ada 2 karyawan yang diprediksi akan meninggalkan perusahaan, dan ternyata prediksinya salah. Ternyata 2 pegawainya itu tidak meninggalkan perusahaan.

False Negatif

Ada 47 karyawan yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata prediksinya salah. Ternyata 47 karyawan itu benar-benar meninggalkan perusahaan.

Soppurt Vector Machine (SVM)

svm.pred
   2    3    5    6    9   11   14   15   21   25   26   31   33   36   39   40   41   43   46   59   63   65 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
  66   72   75   79   84   87   89   92   97  100  101  103  105  111  112  123  132  133  137  142  143  147 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 156  160  164  166  171  172  179  186  192  194  197  205  210  212  214  221  223  224  225  229  233  236 
  No   No   No   No   No  Yes   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 239  241  243  244  249  253  254  255  260  270  271  273  276  282  286  288  289  292  293  294  295  297 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 301  302  303  309  313  319  320  323  329  331  335  336  337  339  342  343  348  352  353  357  358  360 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No  Yes   No 
 363  364  373  375  377  382  386  388  389  392  395  400  405  411  415  416  418  420  424  429  440  443 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 447  449  453  461  465  472  474  480  483  486  492  493  494  496  499  502  503  511  513  514  518  520 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 522  523  526  531  536  540  546  550  552  558  559  560  565  566  567  570  573  574  578  579  583  584 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 591  593  594  596  598  601  603  604  610  611  622  627  631  638  640  647  649  652  653  655  656  663 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 686  692  694  702  712  715  719  721  727  729  736  737  739  740  744  746  750  755  758  763  765  767 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 769  771  781  783  786  787  796  802  803  804  806  808  810  817  820  825  826  830  832  833  836  840 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 842  843  847  848  849  853  859  860  861  862  869  872  873  877  879  883  885  889  891  893  897  900 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 902  903  904  908  909  910  921  923  924  926  928  934  938  943  948  950  958  960  963  965  967  969 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
 974  977  978  980  984  989  999 1001 1003 1004 1005 1006 1008 1011 1015 1016 1017 1022 1023 1025 1034 1038 
  No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No   No 
1039 1042 1045 1046 1047 1052 
  No   No   No   No   No   No 
Levels: No Yes
svm.perf
      Predicted
Actual  No Yes
   No  262   0
   Yes  50   2

True Negatif

Ada 262 karyawan yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata memang benar dia tidak akan meninggalkan perusahaan.

True Positif

Ada 2 Karyawan yang diprediksi akan meninggalkan perusahaan, dan ternyata memang benar dia akan meninggalkan perusahaan.

False Positif

Ada 0 karyawan yang diprediksi akan meninggalkan perusahaan, dan ternyata prediksinya salah. Ternyata 0 karyawanya itu tidak meninggalkan perusahaan.

False Negatif

Ada 50 karyawan yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata prediksinya salah. Ternyata 50 karyawan itu benar-benar meninggalkan perusahaan.

Evaluasi

Performance Comparison

performance <- function(table){
  tn <- table[1,1]
  tp <- table[2,2]
  fn <- table[1,2]
  fp <- table[2,1]
  
  
  accuracy <- (tn + tp) / (tn + tp + fn + fp)
  precision <- tp / (tp + fp)
  recall <- tp / (tp + fn)
  f1score <- 2 * precision * recall / (precision + recall)
  
  result <- paste("Accuracy = ", round(accuracy, 3),
                  "\nPrecision = ", round(precision, 3),
                  "\nRecall = ", round(recall, 3),
                  "\nF1 Score = ", round(f1score, 3), "\n")
  cat(result)
}

Hasil Performance Comparison

performance(logit.perf)
Accuracy =  0.818 
Precision =  0.308 
Recall =  0.432 
F1 Score =  0.36 
performance(ctree.perf)  
Accuracy =  0.834 
Precision =  0.096 
Recall =  0.5 
F1 Score =  0.161 
performance(forest.perf)
Accuracy =  0.844 
Precision =  0.096 
Recall =  0.714 
F1 Score =  0.169 
performance(svm.perf)
Accuracy =  0.841 
Precision =  0.038 
Recall =  1 
F1 Score =  0.074 

Kesimpulan

Setelah selesai melakukan beberapa algoritma, yang menghasilkan tingkat akurasi paling tinggi adalah model Random Forest sebesar 0.85 atau 85%.

Bisa dibuktikan melalui perhitungan confusion matrix, dengan hasil sebagai berikut:

Jadi paling banyak adalah model random forest, sebanyak pegawai yang benar diprediksi tidak akan meninggalkan perusahaan.

Dan yang menghasilkan tingkat precision paling tinggi adalah model Support Vector Machine sebesar 100%. Bisa dibuktikan melalui perhitungan confusion matrix, dengan hasil sebagai berikut:

Jadi paling sedikit yang meninggalkan perusahaan adalah model support vector machine, yaitu sebanyak 2 karyawan yang benar di prediksi akan meninggalkan perusahaan.

Sehingga dapat disimpulkan:

LS0tDQp0aXRsZTogIkRhdGEgQW5hbHlzaXMgTWVtcHJlZGlrc2kgS2FyeWF3YW4gWWFuZyBha2FuIE1lbmluZ2dhbGthbiBQZXJ1c2FoYWFuIE1lbmd1bmFrYW4gS2xhZmlrYXNpIg0KYXV0aG9yOiAiXFUwMDAxRjVFMyBKYW1hbGx1ZGluIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIGZpZ193aWR0aDogNw0KICAgIGZpZ19oZWlnaHQ6IDQuNQ0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCi0tLQ0KDQoNCg0KIyBEZXNrcmlwc2kgDQoNCg0KIVtdKERFU0tSSVBTSS5naWYpDQoNCg0KUGFkYSBrZXNlbXBhdGFuIGthbGkgaW5pLCBzYXlhIGFrYW4gbWVsYWt1a2FuIHByZWRpa3NpIHRlcmhhZGFwIGthcnlhd2FuIHlhbmcgYWthbiBtZW5pbmdnYWxrYW4gcGVydXNhaGFhbiBkYW4gdGlkYWsgbWVuaW5nZ2Fsa2FuIHBlcnVzYWhhbiBiZXJkYXNhcmthbiBrYXRlZ29yaSBkYW4gYmViZXJhcGEgdmFyaWFiZWwgcGVudW5qYW5nbnlhLiBBbGdvcml0bWEgeWFuZyBha2FuIHNheWEgZ3VuYWthbiB5YWl0dSBtZW5nZ3VuYWthbiBtb2RlbCAqKkNsYXNzZmljYXRpb24qKiB5YW5nIHRlcmRpcmkgZGFyaSAqKkxvZ2lzdGlrIFJlZ3Jlc3Npb24sIENsYXNzaWZpY2F0aW9uIFRyZWUsIFJhbmRvbSBGb3JzZXRzIGRhbiBTdXBlciBWZWN0b3IgTWFjaGluZSAoU1ZNKSoqIHlhbmcgdGVybWFzdWsgZGFsYW0gU3VwZXJ2aXNlZCBMZWFybmluZy4NCg0KRGF0YXNldCB5YW5nIGRpZ3VuYWthbiB1bnR1ayBzdHVkaSBrYXN1cyBpbmkgYmlzYSBkaWRvd25sb2FkIGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9maWxlL2QvMTRKRjBNNkctUlhqYU5CaHVKUUVFWTF5T3RKRU5NUFFTL3ZpZXc/dXNwPWRyaXZlc2RrDQoNCg0KIyMgSW5wdXQgRGF0YSANCg0KDQpQcm9zZXMgbWVuZ2ltcHJvdCBkYXRhIGRhbGFtIGZvcm1hdCBjc3YgZGFwYXQgZGlsYWt1a2FuIG1lbmdndW5ha2FuIGZ1bmdzaSByZWEuY3N2KCkgZGFuIG1lbnllYnV0a2FuIG5hbWEgZmlsZSBiZXNlcnRhIGZvbGRlciB0ZW1wYXQgbWVueWltcGFueWEuDQoNCg0KYGBge3J9DQprYXJ5YXdhbiA8LSByZWFkLmNzdihmaWxlID0gInRyYWluLmNzdiIpDQpoZWFkKGthcnlhd2FuKQ0KYGBgDQoNCg0KDQojIyBEYXRhIERlc2NyaXB0aW9uIA0KDQoNClNlYmVsdW0gbWVsYW5na2FoIGxlYmloIGphdWggYmVrZXJqYSBkZW5nYW4gZGF0YSwgc2F5YSBwZXJsdSBtZW5nZXRhaHVpIGluZm9ybWFzaSBkYXNhciBkYXJpIGRhdGEgeWFuZyBzYXlhIG1pbGlraS4gSW5mb3JtYXNpIGRhc2FyIG1lbGlwdXRpIHVrdXJhbi9iYW55YWtueWEgZGF0YSBkYW4gbmFtYS1uYW1hIGtvbG9tIGF0YXUgdmFyaWFiZWwgZGlkYWxhbW55YS4NCg0KDQpgYGB7cn0NCmdsaW1wc2Uoa2FyeWF3YW4pDQpgYGANCg0KVGFtcGFrbnlhIGJhaHdhIGFkYSBzZWJhbnlhayAxMDg1IGJhcmlzIHBhZGEgZGF0YSBkZW5nYW4gdmFyYWliZWwgc2ViYW55YWsgMzUgZGFuIGFkYSBiYWlrbnlhIHNheWEgbWVuZ2V0YWh1aSBiZXJhcGEgYmFueWFrIGthcnlhd2FuIHlhbmcgc3RhdHVzbnlhIHRlcmdvbG9uZyBObyBBdHRyaW9uIChUaWRhayBtZW1pbGlraSBhdGlyaXNpKSBkYW4gWWVzIEF0dHJpb24gKE1lbmdhbG1hbmkgQXRyaXNpKSwga2FyZW5hIHZhcmFpYmVsIGluaSBtZXJ1cGFrYW4gdmFyaWFiZWwgeWFuZyBha2FuIHNheWEgZ3VuYWthbiBkYWxhbSBwZW1vZGVsYW4gc2ViYWdhaSB2YXJpYWJlbCB0YXJnZXQuDQoNCm1lbmdndW5ha2FuIGZ1bmdzaSB0YWJlbCAoKSB5YW5nIGRhcGF0IG1lbmdoYXNpbGthbiBmcmVrdWVuc2kgZGFyaSBzZXRhcCBrYXRlZ29yaSwgc2VkYW5na2FuIHByb3AudGFibGUoKSBkYXBhdCBtZW5naGFzaWxrYW4gcHJvcG9yc2kgYXRhdSBwcmVzZW50YXNpLW55YSwNCg0KDQoNCmBgYHtyfQ0KdGFibGUoa2FyeWF3YW4kQXR0cml0aW9uKQ0KYGBgDQoNCg0KQ2VrIFByb3NlbnRhc2UgVmFyaWFiZWwgVGFyZ2V0DQoNCg0KYGBge3J9DQpwcm9wLnRhYmxlKHRhYmxlKGthcnlhd2FuJEF0dHJpdGlvbikpDQpgYGANCg0KQmVyYWRhc2Fya2FuIGhhc2kgZGkgYXRhcyBkaXBlcm9sZWggYmFod2Ega2FyeWF3YW4geWFuZyBtZW5nYWxhbWkgKipBdHRyaXRvbioqIGFkYSBzZWJhbnlhayAxNzkga2FyeWF3YW4gYXRhdSBzZWJhbnlhayAxNyUgZGFyaSBrZXNlbHVydWhhbiB5YW5nIGFkYS4gDQoNCg0KQ2VrIE1pc3NpbmcgVmFsdWUgKEFwYWthaCBhZGEgbmlsYWkgeWFuZyBrb3NvbmcgYXRhdSBOQSkNCg0KDQpgYGB7cn0NCmNvbFN1bXMoaXMubmEoa2FyeWF3YW4pKQ0KYGBgDQoNCg0KTWVuZ2hhcHVzIHZhcmFpYmVsIHlhbmcgdGlkYWsgZGlidXR1aGthbiBkYWxhbSBwcm9qZWN0IGluaQ0KDQoNCmBgYHtyfQ0Ka2FyeWF3YW4kRW1wbG95ZWVDb3VudCA8LSBOVUxMDQprYXJ5YXdhbiRFbXBsb3llZU51bWJlciA8LSBOVUxMDQprYXJ5YXdhbiRTdGFuZGFyZEhvdXJzIDwtIE5VTEwNCmthcnlhd2FuJE92ZXIxOCA8LSBOVUxMDQprYXJ5YXdhbiRPdmVyVGltZSA8LSBOVUxMDQpgYGANCg0KDQoNCiMgRWtzcGxvcmF0aW9uIERhdGEgQW5hbHlpc2lzDQoNCg0KDQohW10oRURBLmdpZikNCg0KDQoNClNheWEgYWthbiBtZW1iYW5kaW5na2FuICA4IHZhcmlhYmVsIHlhaXR1IChBZ2UsIEF0dHJpdGlvbiwgRWR1Y2F0aW9uLCBKb2JMZXZlbCwgUGVyY2VudFNhbGF5ckhpa2UsIE1vbnRseUluY29tZSwgUGVyZm9ybWFuY2VSYXRpbmcsIFRvdGFsV29ya2luZ1llYXJzKQ0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGNvcnJncmFtKQ0KDQprYXJ5YXdhbl8xIDwtIGthcnlhd2FuWyxjKCJBZ2UiLCAiQXR0cml0aW9uIiwgIkVkdWNhdGlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJKb2JMZXZlbCIsICJQZXJjZW50U2FsYXJ5SGlrZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJNb250aGx5SW5jb21lIiwgIlBlcmZvcm1hbmNlUmF0aW5nIiwgIlRvdGFsV29ya2luZ1llYXJzIildDQpjb3Ioa2FyeWF3YW5fMSkNCmBgYA0KDQoNCkRhcmkgaGFzaWwgZGlhdGFzLCBkaXBlcm9sZWggYmFod2EgdGlkYWsgYWRhIGZlYXR1cmUgeWFuZyBzZWNhcmEgbGFuZ3N1bmcgbWVtaWxpa2kgbmlsYWkgY29yZWxhdGlvbiBjdWt1cCB0aW5nZ2kgdGVyaGFkYXAgKipBdHRyaXRpb24qKi4gTmFtdW4gdGVyZGFwYXQgYmViZXJhcGEgaGFsIHlhbmcgaGlnbGlnaHQgZGlzaW5pIFBlcnNlbnRhc2UgKipKb2JMZXZlbCoqIGtvcmVzYWxpIHlhbmcgdGluZ2dpIHlhaXR1ICoqKDAuOTUgZGFyaSBza2FsYSAxKSoqIGRlbmdhbiAqKk1vbnRobHkgSW5jb21lKiouIGRhbiBzYXlhIGFrYW4gbWVuZ2hhcHVzIFZhcmlhYmVsIEpvYkxldmVsLCBLYXJlbmEgZGFyaSAqKk1vbnRobHkgSW5jb21lKiogc3VkYWggYmlzYSBtZW5qZWxhc2thbiBiaGF3IGdhamkgZGl0ZW50dWthbiBzZXN1YWkgZGVuZ2FuIGpvYiBsZXZlbCBtYXNpbmctbWFzaW5nIGthcnlhd2FuLg0KDQoNCg0KYGBge3J9DQprYXJ5YXdhbiRKb2JMZXZlbCA8LSBOVUxMDQpgYGANCg0KDQoNClNlYmVsdW0gbWVtdmlzdWFsaXNhc2lrYW4gZGF0YSwgc2F5YSBpbmdpbiBtZW5ndWJhaCB0aXBlIGRhdGEgdmFyaWFiZWwgSW50ZWdlciwgQ2hhcmFjdGVyIGtlIHZhcmFpYWJlbCBmYWN0b3IgYWdhciBtdWRhaCB1bnR1ayBtZW12aXN1YWxpc2FzaWthbiBkYXRhIGRhbiBtZW5nZ3VuYWthbiBtb2RlbC4NCg0KDQpgYGB7cn0NCmthcnlhd2FuJEF0dHJpdGlvbiA8LSBmYWN0b3Ioa2FyeWF3YW4kQXR0cml0aW9uLCBsZXZlbHMgPSBjKDAsMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk5vIiwgIlllcyIpKQ0KDQprYXJ5YXdhbiRCdXNpbmVzc1RyYXZlbCA8LSBhcy5mYWN0b3Ioa2FyeWF3YW4kQnVzaW5lc3NUcmF2ZWwpDQoNCmthcnlhd2FuJERlcGFydG1lbnQgPC0gYXMuZmFjdG9yKGthcnlhd2FuJERlcGFydG1lbnQpDQoNCmthcnlhd2FuJEdlbmRlciA8LSBhcy5mYWN0b3Ioa2FyeWF3YW4kR2VuZGVyKQ0KDQprYXJ5YXdhbiRKb2JSb2xlIDwtIGFzLmZhY3RvcihrYXJ5YXdhbiRKb2JSb2xlKQ0KDQprYXJ5YXdhbiRNYXJpdGFsU3RhdHVzIDwtIGFzLmZhY3RvcihrYXJ5YXdhbiRNYXJpdGFsU3RhdHVzKQ0KDQprYXJ5YXdhbiRFZHVjYXRpb25GaWVsZCA8LSBhcy5mYWN0b3Ioa2FyeWF3YW4kRWR1Y2F0aW9uRmllbGQpDQoNCmthcnlhd2FuJE51bUNvbXBhbmllc1dvcmtlZCA8LSBhcy5mYWN0b3Ioa2FyeWF3YW4kTnVtQ29tcGFuaWVzV29ya2VkKQ0KDQprYXJ5YXdhbiRFbnZpcm9ubWVudFNhdGlzZmFjdGlvbiA8LSBmYWN0b3Ioa2FyeWF3YW4kRW52aXJvbm1lbnRTYXRpc2ZhY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxLDIsMyw0KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJMb3ciLCAiTWVkaXVtIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIaWdoIiwgIlZlcnkiKSkNCg0Ka2FyeWF3YW4kSm9iU2F0aXNmYWN0aW9uIDwtIGZhY3RvcihrYXJ5YXdhbiRKb2JTYXRpc2ZhY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxLDIsMyw0KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJMb3ciLCAiTWVkaXVtIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIaWdoIiwgIlZlcnkiKSkNCmBgYA0KDQoNCg0KTWFyaSBsaWhhdCBhcGFrYWggdmFyaWFiZWwgY2hhcmFjdGVyIGRhbiBJbnRlZ2VyIGJlcnViYWgga2UgdmFyaWFiZWwgZmFjdG9yDQoNCg0KDQpgYGB7cn0NCmdsaW1wc2Uoa2FyeWF3YW4pDQpgYGANCg0KDQoNCiMgVmlzdWFsaXNhc2kNCg0KDQoNCiFbXShWaXN1YWxpc2FzaS5naWYpDQoNCg0KDQojIyBWaXN1YWxpc2FpIEFuYWx5c2lzIFVuaXZhcmlhdGUgKEFuYWxpc2lzIDEgdmFyaWJlbCkNCg0KDQpBbmFseXNpcyBVbml2YXJpYXQgYWRhbGFoIHN1YXR1IHRla25payAqKmFuYWx5c2lzKiogZGF0YSB0ZXJoYWRhcCBzYXR1IHZhcmlhYmVsIHNlY2FyYSBtYW5kaXJpLCB0aWFwIHZhcmlhYmVsIGRpYW5hbHlzaXMgdGFucGEgZGlrYWl0a2FuIGRlbmdhbiB2YXJpYWJlbCBsYWlueWEuDQoNCg0KKipBdHRyaXRpb24qKg0KDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGthcnlhd2FuLCBhZXMoQXR0cml0aW9uLCBmaWxsID0gQXR0cml0aW9uKSkrDQogIGdlb21fYmFyKCkrbGFicyh0aXRsZSA9ICJKdW1sYWggVG90YWwgQXRyaXNpIikNCmBgYA0KDQoNCg0KRGFyaSBkaWFncmFtIGluaSwgbWVuamVsYXNrYW4gYmFod2EgZGkgcGVydXNhaGFhbiBpbmkgbWVuZ2FsYW1pIEF0cml0aW9uIGN1a3VwIHRpbmdnaSB5YWl0dSBzZWJhbnlhayAxNi45JSBhdGF1IDE3JSBkYXJpIHNlYmFueWFrIDEwNTgga2FyeWF3YW4geWFuZyBiZWtlcmphIGRpcGVydXNhaGFhbiwgMTc5IGthcnlhd2FuIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLiBBbmdrYSAxNzkga2FyeWF3YW4gaW5pIHBlcmx1IHNheWEgbGloYXQgYXBhIHlhbmcgbWVueWViYWJrYW4gbWVyZWthIGJpc2EgbWVuaW5nZ2Fsa2FuIHBlcnVzYWhhYW4uIA0KDQoNCg0KKipHZW5kZXIqKg0KDQoNCg0KYGBge3J9DQpnZ3Bsb3Qoa2FyeWF3YW4sIGFlcyhHZW5kZXIsIGZpbGwgPSBHZW5kZXIpKSsNCiAgZ2VvbV9iYXIoKStsYWJzKHRpdGxlID0gIkplbmlzIEtlbGFtaW4gS2FyeWF3YW4iKQ0KYGBgDQoNCg0KVGVybnlhdGEgZGkgcGVydXNhaGFhbiBpbmkgYmFueWFrIGthcnlhd2FuIGxha2ktbGFraSB5YW5nIGJla2VyamEgZGlwZXJ1c2FoYWFuIGRhcmkgcGFkYSBrYXJ5YXdhbiBwZXJlbXB1YW4uIExlYmloIGRhcmkgaXR1IDYwJSBwb3B1bGFzaW55YSBhZGFsYWggNjIwIGthcnlhd2FuIGxha2ktbGFraSBkYW4gNDM4IGthcnlhd2FuIHBlcmVtcHVhbi4NCg0KDQoNCioqTWFyaXRhbCBTdGF0dXMqKg0KDQoNCmBgYHtyfQ0KZ2dwbG90KGthcnlhd2FuLCBhZXMoTWFyaXRhbFN0YXR1cywgZmlsbCA9IE1hcml0YWxTdGF0dXMpKSsNCiAgZ2VvbV9iYXIoKStsYWJzKHRpdGxlID0gIlN0YXR1cyBQZXJuaWthaGFuIEthcnlhd2FuIikNCmBgYA0KDQoNClN0YXR1cyBwZXJuaWthaGFuIGJhbnlhayB5YW5nIHN1ZGFoIG1lbmlrYWggYWRhIDQ2NCB5YW5nIG1lbmlrYWgsIDM1MiB5YW5nIHNpbmdsZSwgZGFuIGRpdm9yY2VkIDI0MiBrYXJ5YXdhbi4NCg0KDQoqKkVudmlyb25tZW50IFNhYXRpc2ZhY3Rpb24qKg0KDQoNCg0KYGBge3J9DQpnZ3Bsb3Qoa2FyeWF3YW4sIGFlcyhFbnZpcm9ubWVudFNhdGlzZmFjdGlvbiwgZmlsbCA9IEVudmlyb25tZW50U2F0aXNmYWN0aW9uKSkrDQogIGdlb21fYmFyKCkrbGFicyh0aXRsZSA9ICJLZXB1YXNhbiBMaW5na3VuZ2FuIEtlcmphIikNCmBgYA0KDQoNCmtlcHVhc2FuIGxpbmdrdW5nYWthbiBrZXJqYSBiYW55YWsgeWFuZyBIaWdoLCBkYW4gYWRhIGp1Z2EgeWFuZyBsb3cuIHNlYmFueWFrIDIwOSBrYXJ5YXdhbiB5YW5nIG1lcmFzYSBsaW5na3VuZ2FuIGtlcmphbnlhIHRpZGFrIHNlaGF0Lg0KDQoNCg0KKipKb2IgU2F0aXNmYWN0aW9uKioNCg0KDQpgYGB7cn0NCmdncGxvdChrYXJ5YXdhbiwgYWVzKEpvYlNhdGlzZmFjdGlvbiwgZmlsbCA9IEpvYlNhdGlzZmFjdGlvbikpKw0KICBnZW9tX2JhcigpK2xhYnModGl0bGUgPSAiS2VwdWFzYW4gS2VyamEgS2FyeWF3YW4iKQ0KYGBgDQoNCg0KS2VwdWFzYW4gdGVyaGFkYXAgcGVrZXJqYWFuIGJhbnlhayB5YW5nIHZlcnkgZGFuIGhpZ2gsIHNhbmdhdCB0aW5nZ2kuIHRldGFwaSBhZGEganVnYSB5YW5nIHJlbmRhaCwgc2ViYW55YWsgMjA1IGthcnlhd2FuIGRhcmkgMTA1OCBrYXJ5YXdhbiB5YW5nIG1lcmFzYSB0aWRhayBwdWFzIGRlbmdhbiBwZWtlcmphYW55YS4gSW5pIGp1Z2EgcGVybHUgZGl0ZWxpdGkga2VuYXBhIGJhbnlhayBrYXJ5YXdhbiB5YW5nIHRpZGFrIHB1YXMgZGVuZ2FuIHBla2VyamFhbnlhLiBBcGEga2FyZW5hIGJlYmFuIGtlcmphIHlhbmcgdGVybGFsdSB0aW5nZ2ksIGF0YXUgYWxhc2FuIGxhaW4uDQoNCg0KDQoqKk51bSBDb21wYW5pZXMgV29ya2VkKioNCg0KDQpgYGB7cn0NCmdncGxvdChrYXJ5YXdhbiwgYWVzKE51bUNvbXBhbmllc1dvcmtlZCwgZmlsbCA9IE51bUNvbXBhbmllc1dvcmtlZCkpKw0KICBnZW9tX2JhcigpK2xhYnModGl0bGUgPSAiSnVtbGFoIFBlbmdhbGFtYW4gS2VyamEgS2FyeWF3YW4gZGkgUGVydXNhaGFhbiBMYWluIikNCmBgYA0KDQoNCkp1bWxhaCBwZW5nYWxhbWFuIHBlZ2F3YWkgeWFuZyBiZWtlcmphIGRpIHBlcnVzYWhhYW4gbGFpbiwgYmFueWFrIHlhbmcgMSBrYWxpLCBhZGEgMzU2IGthcnlhd2FuIHlhbmcgbWVtcHVueWFpIHBlbmdhbGFtYW4ga2VyamEgMSBrYWxpLiBBcnRpbnlhIGthcnlhd2FuIGluaSAgcGVybmFoIGJla2VyamEgZGkgcGVydXNhaGFhbiBsYWluIHNlbGFtYSBzYXR1IHRhaHVuLg0KDQoNCg0KIyMgQW5hbHlzaXMgQml2YXJpYXRlIChBbmFseXNpcyAyIFZhcmlhYmVsKQ0KDQoNCg0KQW5hbHlzaXMgQml2YXJpYXQgYWRhbGFoIGRpbGFrdWthbiBtZW5nYXRhaHVpIGFkYSB0aWRha255YSBodWJ1bmdhbiBrZWR1YSB2YXJpYWJlbA0KDQoNCioqS2FyeWF3YW4geWFuZyBtZW5nYWxhbWkgYXR0cml0aW9uIGJlcmRhc2Fya2FuIGdlbmRlcioqDQoNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IGthcnlhd2FuLCBhZXMoeCA9IEF0dHJpdGlvbiwgZmlsbCA9IEdlbmRlcikpKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpK2xhYnModGl0bGUgPSAiQXRyaXNpIEJlcmRhc2Fya2FuIEplbmlzIEtlbGFtaW4iKQ0KYGBgDQoNCg0KRGFyaSBkaWFnYXJhbSBpbmkgdGVybnlhdGEgeWFuZyBtZW5nYWxhbWkgYXR0cmlzaSBwYWxpbmcgYmFueWFrIGFkYWxhaCBsYWtpLWxha2kuIE5haCBpbmkgc2F5YSBwZXJsdSBjYXJpIHRhaHUgYWxhc2FuIGtlbmFwYSBsYWtpLWxha2kgbGViaWggYmFueWFrIHlhbmcgbWVuaW5nZ2Fsa2FuIHBlcnVzYWhhYW4gZGFyaSBwYWRhIHdhbml0YS4NCg0KDQoqKmthcnlhd2FuIHlhbmcgbWVuZ2FsYW1pIEF0dHJpdGlvbiBiZXJkYXNhcmthbiBNYXJpdGFsIFN0YXR1cyoqDQoNCg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0ga2FyeWF3YW4sIGFlcyh4ID0gQXR0cml0aW9uLCBmaWxsID0gTWFyaXRhbFN0YXR1cykpKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICBsYWJzKHRpdGxlID0gIlN0YXR1cyBQZXJrYXdpbmFuIEthcnlhd2FuIikNCmBgYA0KDQoNCkRhcmkgZGlhZ2FyYW0gaW5pIHRlcm55YXRhIHlhbmcgbWVuZ2FsYW1pICoqQXR0cml0aW9uKiogcGFsaW5nIGJhbnlhayBhZGFsYWggeWFuZyBiZXJzdGF0dXMgKipzaW5nbGUqKi4gQmVhcnRpIGtlbXVuZ2tpbmFuIDE3JSBBdHRyaXRpb24gZGlzZWJhYmthbiBrYXJlbmEgIEtvbnRyYWsgSGFiaXMsIFBISywgYXRhdSBwZW5ndW5kdXJhbiBkaXJpLCBidWthbiBrYXJlbmEgUGVuc2l1bi4NCg0KDQoNCioqS2FyeWF3YW4geWFuZyBtZW5nYWxhbWkgYXRyaXRpb24gYmVyZGFzYXJrYW4gRGVwYXJ0ZW1lbnQqKg0KDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBrYXJ5YXdhbiwgYWVzKHggPSBBdHRyaXRpb24sIGZpbGwgPSBEZXBhcnRtZW50KSkrDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikrDQogIGxhYnModGl0bGUgPSAiQXJ0aXNpIEJlcmRhc3JrYW4gRGVwYXJ0ZW1lbiIpDQpgYGANCg0KDQoNCkRhcmkgZGlhZ2FyYW0gaW5pIHlhbmcgcGFsaW5nIGJhbnlhayBtZW5pbmdnYWxrYW4gcGVydXNhaGFhbiBhZGFsYWggZGFyaSAqKkRlcGFydGVtZW50KiogKipSZXNlYXJjaCAmIERldmVsb3BtZW50KioNCg0KDQoNCioqS2FyeWF3YW4geWFuZyBtZW5nYWxhbWkgQXR0cml0aW9uIGJlcmRhc2Fya2FuIEVudmlyb25tZW50IFNhdGlzZmFjdGlvbioqDQoNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IGthcnlhd2FuLCBhZXMoeCA9IEF0dHJpdGlvbiwgZmlsbCA9IEVudmlyb25tZW50U2F0aXNmYWN0aW9uKSkrDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikrDQogIGxhYnModGl0bGUgPSAiQXRyaXNpIEthcnlhd2FuIERlbmdhbiBLZXB1YXNhbiBMaW5na3VuZ2FuIEtlcmphIikNCmBgYA0KDQoNCkRhcmkgZGlhZ2FyYW0gaW5pIHRlbGFoIG1lbWJ1a3Rpa2FuIGJhaHdhIGJhbnlhayBrYXJ5YXdhbiB5YW5nIG1lcmFzYSB0aWRhayBwdWFzIGRlbmdhbiBsaW5na3VuZ2FuIGtlcmphbnlhLiBKYWRpIHNlYmFnYWkgcGloYWsgbWFuYWplbWVuIHBlcnVzYWhhYW4gbWVzdGlueWEgc2VsYWx1IG1lbWVyaWtzYSBhcGFrYWggc3Vhc2FuYSBrYW50b3JueWEgaGFybW9uaXMgYXRhdSB0aWRhaywgYXBha2FoIGthcnlhd2FubnlhIGRhcGF0IG1lbmdlbWJhbmdrYW4gZGlyaSwga2VwZXJjYXlhYW4gc2F0dSBzYW1hIGxhaW4gYXRhdSB0aWRhay4gDQoNCg0KDQoqKkthcnlhd2FuIHlhbmcgbWVuZ2FsYW1pIGF0dHJpdGlvbiBiZXJkYXNhcmthbiBqb2Igc2F0aXNmYWN0aW9uKioNCg0KDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBrYXJ5YXdhbiwgYWVzKHggPSBBdHRyaXRpb24sIGZpbGwgPSBKb2JTYXRpc2ZhY3Rpb24pKSsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgbGFicyh0aXRsZSA9ICJBdHJpc2kgRGVuZ2FuIEtlcHVhc2FuIEtlcmphIEthcnlhd2FuIikNCmBgYA0KDQoNCg0KRGFyaSBkaWFnYXJhbSBpbmkgbWVuamVsYXNrYW4gYmFod2EgYWRhIGJlYmVyYXBhIGthcnlhd2FuIHlhbmcgbWVyYXNhIHB1YXMgZGVuZ2FuIHBla2VyamFhbnlhLCBhZGEganVnYSB5YW5nIHRpZGFrIHB1YXMgZGVuZ2FuIHBla2VyamFhbnlhIGluaSBqdWdhIGN1a3VwIGJhbnlhayB5YW5nIHRpZGFrIHB1YXMgZGVuZ2FuIHBla2VyamFhbnlhIGRhbiBwZXJsdSBzYXlhIGdhbGloIGxlYmloIGRhbGFtIGxhZ2kgYXBhIHlhbmcgbWVtYnVhdCBrYXJ5YXdhbiB0aWRhayBwdWFzIGRlbmdhbiBwZWtlcmphYW55YS4NCg0KDQoqKkthcnlhd2FuIHlhbmcgbWVuZ2FsYW1pIGF0dHJpdGlvbiBiZXJkYXNhcmthbiBOdW0gQ29tcGFpbmVzIFdvcmtkKioNCg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0ga2FyeWF3YW4sIGFlcyh4ID0gQXR0cml0aW9uLCBmaWxsID0gTnVtQ29tcGFuaWVzV29ya2VkKSkrDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikrDQogIGxhYnModGl0bGUgPSAiQXRpcmlzaSBLYXJ5YXdhbiBCZXJkYXNhcmthbiBQZW5nYWxhbWFuIEtlcmphIFNlYmVsdW0gTWFzdWsga2UgUGVydXNhaGFhbiIpDQpgYGANCg0KDQpEYXJpIGRpYWdyYW0gaW5pIG1lbmplbGFza2FuIGJhaHdhIGJhbnlhayB5YW5nIG1lbXB1bnlhaSBwZW5nYWxhbWFuIGtlcmphIGRpIHBlcnVzYWhhYW4gbGFpbiBoYW55YSAxIGthbGkgYXRhdSBzdWRhaCBtZW1wdW55YWkgcGVuZ2FtYWxhbWFuIDEgdGFodW4sIEFydGlueWEgYmFueWFrIHlhbmcgbWVtdWxhaSBrYXJpci4gTXVuZ2tpbiBhbGFzYW55YSBrYXJlbmEgbWVyZWthIGluZ2luIG1lbXBlcmx1YXMgamFyaW5nYW4gc2FqYSBhdGF1IGluZ2luIG1lbmNvYmEgcGVuZ2FsYW1hbiBiYXJ1LiANCg0KDQoNCiMjIEFuYWx5c2lzIE11bHRpdmFyaWF0IChBbmFseXNpcyAzIFZhcmlhYmVsKQ0KDQoNCkFuYWx5c2lzIE11bHRpdmFyaWF0IGFkYWxhaCBtZW1iYW5kaW5na2FuIGR1YSB2YXJpYWJlbCAvIGxlYmloIGRhcmkgMiB2YXJpYWJlbCBhdGF1IG1lbGloYXQgcGVuZ2FydWhueWEgdmFyaWFiZWwgbGFpbnlhLg0KDQoNCioqS2FyeWF3YW4geWFuZyBtZW5nYWxhbWkgYXR0cml0aW9uIGJlcmRhc2Fya2FuIHVzaWEgZGFuIGxhbWEgYmVrZXJqYSBkaSBwZXJ1c2FoYWFuKioNCg0KDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBrYXJ5YXdhbiwgYWVzKHggPSBBZ2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBUb3RhbFdvcmtpbmdZZWFycywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IEdlbmRlcikpKw0KICBnZW9tX3BvaW50KCkrIGZhY2V0X2dyaWQoTWFyaXRhbFN0YXR1cyB+IEF0dHJpdGlvbikrDQogIGxhYnModGl0bGUgPSAiQXRyaXNpIEJlcmRhc2Fya2FuIFN0YXR1cyBQZXJrYXdpbmFuIikNCmBgYA0KDQoNCkRhcmkgcGxvdCBpbmkgbWVuamVsYXNrYW4gYmFod2Ega2FyeWF3YW4gcGVydXNhaGFhbiBwYWxpbmcgYmFueWFrIGJlcmFkYSBkaSByZW50YW5nIHVzaWEgMzAtNDAgdGFodW4uIERhbiBqdW1sYWgga2FyeWF3YW4geWFuZyBwYWxpbmcgYmFueWFrIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuIGFkYWxhaCBrYXJ5YXdhbiBkaSBrZWxvbXBvayByZW50YW5nIHVzaWEgZGliYXdhaCAzMCB0YWh1biBkYW4gcmVudGFuZyB1c2lhIDMwLTQwIHRhaHVuLiBEYW4gYmVyc3RhdHVzICoqc2luZ2xlKiogeWFuZyBwYWxpbmcgdGluZ2dpIGRpYmFuZGluZ2thbiBzdGF0dXMgbGFpbnlhLiBkYW4gcmF0YS1yYXRhIHBhbGluZyBiYW55YWsgYmVrZXJqYSBkaSBwZXJ1c2FoYWFuIHNlbGFtYSAwIC0gMTAgdGFodW4uDQoNCg0KDQoqKkthcnlhd2FuIHlhbmcgbWVuZ2FsYW1pIGF0dHJpdGlvbiBiZXJkYXNyYWthbiBnYWppIGRhbiBsYW1hIGJla2VyamEgZGkgcGVydXNhaGFhbioqDQoNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IGthcnlhd2FuLCBhZXMoeCA9IFRvdGFsV29ya2luZ1llYXJzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gTW9udGhseUluY29tZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IEdlbmRlcikpKw0KICBnZW9tX3BvaW50KCkrIGZhY2V0X2dyaWQoTWFyaXRhbFN0YXR1cyB+IEF0dHJpdGlvbikrDQogIGxhYnModGl0bGUgPSAiQXRyaXNpIEJlcmRhc2Fya2FuIFN0YXR1cyBQZXJrYXdpbmFuIikNCmBgYA0KDQoNCkRhcmkgcGxvdCBpbmkgbWVuamVsYXNrYW4gYmFod2EgYmFueWFrIGthcnlhd2FuIHlhbmcgbWVuaW5nZ2Fsa2FuIHBlcnVzYWhhYW4gaW5pIHJhdGEtcmF0YSBtZW1pbGlraSBkaWJhd2FoIDUganV0YSBkYW4gdGVsYWggYmVrZXJqYSBzZWxhbWEgMCAtIDEwIHRhaHVuLiBEYW4ga2ViYW55YWthbiBzdGFzdXMgbnlhIGFkYWxhaCAqKnNpbmdsZSoqLCBkaXNpbmkganVnYSBhZGEgeWFuZyBzdWRhaCBiZWtlcmphIHNlbGFtYSAyMCB0YWh1biB0aWRhayBrdW5qdW5nIG5haWsgZ2FqaS4gTXVuZ2tpbiBpbmkganVnYSBiaXNhIGphZGkgc3VhdHUgYWxhc2FuIG1lbmdhcGEga2FyeWF3YW4gbWVuaW5nZ2Fsa2FuIHBlcnVzYWhhYW4uIA0KDQpKYWRpIGtlc2ltcHVsYW55YSBhZGFsYWggKipBdHRyaXRpb24qKiB5YW5nIHBhbGluZyBiYW55YWsgdGVyamFkaSBwYWRhIGthcnlhd2FuIGthdGVnb3JpIHVzaWEgbXVkYSAoZGliYXdhaCA0MCB0YWh1biksIGJlcnN0YXR1cyAqKnNpbmdsZSoqIGF0YXUgYmVsdW0gbWVuaWthaCwgZGFuIGJlbHVtIHBlcm5haCBtZW1pbGlraSBwZW5nYWxhbWFuIGJla2VyamEgZGkgcGVydXNhaGFhbiBsYWluIHNlYmVsdW1ueWEuIE9sZWgga2FyZW5hIGl0dSwga2Vsb21wb2sga2FyeWF3YW4geWFuZyBtYXN1ayBrYXRlZ29yaSBpbmkgbXVuZ2tpbiBzZWJhbGlrbnlhIGRpYmVyaSBwZXJsYWt1YW4ga2h1c3VzIHNlcGVydGkgcGVtYmF0YXNhbiByZWtydXRtZW4uDQoNCg0KDQojIERhdGEgUHJlcGFyYXRpb24gDQoNCg0KDQohW10oREFUQSBQUkVQQVJBVElPTi5naWYpDQoNCg0KKipNZWxha3VrYW4gT25lIEhvdCBFbmNvZGluZyAoT0hFKSoqDQoNCg0KU2V0ZWxhaCBkYXRhc2V0IGRpYmVyc2loa2FuLCBtYXNpaCBhZGEgYmViZXJhcGEgdGFoYXAgeWFuZyBwZXJsdSBkaWxha3VrYW4gYWdhciBkYXRhc2V0IGJlbmFyLWJlbmFyIHNpYXAgdW50dWsgZGlwcm9zZXMgb2xlaCBtb2RlbCBtYWNoaW5lIGxlYXJuaWcuIE9IRSB1bnR1ayBCdXNpbmVzcyBUcmF2ZWwsIERlcGFydGVtZW50LCBFZHVjYXRpb24sIEVkdWNhdGlvbkZpZWxkLCBFbnZpcm9ubWVudFNhdGlzZmFjdGlvbiwgR2VuZGVyIGRhbiBNYXJ0aWFsU3RhdHVzIA0KDQpNZW1idWF0IFZhcmlhYmVsIER1bW15DQoNCmBgYHtyfQ0KbGlicmFyeShjYXJldCkNCmRteSA8LSBkdW1teVZhcnMoIn4gQnVzaW5lc3NUcmF2ZWwrRGVwYXJ0bWVudCtFZHVjYXRpb24rRWR1Y2F0aW9uRmllbGQrDQogICAgICAgICAgICAgICAgIEVudmlyb25tZW50U2F0aXNmYWN0aW9uK0dlbmRlcitNYXJpdGFsU3RhdHVzIiwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IGthcnlhd2FuKQ0KDQprYXJ5YXdhbl9vaGUgPC0gZGF0YS5mcmFtZShwcmVkaWN0KGRteSwgbmV3ZGF0YSA9IGthcnlhd2FuKSkNCmthcnlhd2FuIDwtIGNiaW5kKGthcnlhd2FuLCBrYXJ5YXdhbl9vaGUpDQpgYGANCg0KDQoqKlJlbW92ZSBPSEUqKg0KDQoNCmBgYHtyfQ0Ka2FyeWF3YW4kQnVzaW5lc3NUcmF2ZWwgPC0gTlVMTA0Ka2FyeWF3YW4kRGVwYXJ0bWVudCA8LSBOVUxMDQprYXJ5YXdhbiRFZHVjYXRpb24gPC0gTlVMTA0Ka2FyeWF3YW4kRWR1Y2F0aW9uRmllbGQgPC0gTlVMTA0Ka2FyeWF3YW4kRW52aXJvbm1lbnRTYXRpc2ZhY3Rpb24gPC0gTlVMTA0Ka2FyeWF3YW4kTWFyaXRhbFN0YXR1cyA8LSBOVUxMDQpgYGANCg0KDQoqKk1lbGFrdWthbiBSZW1vdmUgT3V0bGllcioqDQoNCk1lbmRhcGF0a2FuIG5pbGFpIG91dGxpZXINCg0KDQpgYGB7cn0NCm91dF9zdGFnIDwtIGJveHBsb3Quc3RhdHMoa2FyeWF3YW4kWWVhcnNXaXRoQ3Vyck1hbmFnZXIpJG91dA0Kb3V0X3N0YWcNCmBgYA0KDQpNZW5kYXBhdGthbiBpbmRla3MgYmFyaXMgbmlsYWkgb3V0bGllcg0KDQoNCmBgYHtyfQ0Kb3V0X2lkeCA8LSB3aGljaChrYXJ5YXdhbiRZZWFyc1dpdGhDdXJyTWFuYWdlciAlaW4lDQogICAgICAgICAgICAgICAgICAgYyhvdXRfc3RhZykpDQpvdXRfaWR4DQpgYGANCg0KDQoqKkhhcHVzIGJhcmlzIGRlbmdhbiBvdXRsaWVyKioNCg0KDQpgYGB7cn0NCmthcnlhd2FuIDwtIGthcnlhd2FuWy1vdXRfaWR4LF0NCmBgYA0KDQoNCg0KKipNZW1iYWdpIERhdGEgVGVzdGluZyBkYW4gRGF0YSBUcmFpbioqDQoNCkRhdGEgVGVzdGluZyA9IDMwJSAgOiBEYXRhIFRyYW5pbmcgPSA3MCUNCg0KYGBge3J9DQpzZXQuc2VlZCgyMDIxKQ0KbSA8LSBucm93KGthcnlhd2FuKQ0KdHJhaW5faWR4IDwtIHNhbXBsZShtLCAwLjcgKiBtKQ0KDQp0cmFpbl9kZiA8LSBrYXJ5YXdhblt0cmFpbl9pZHgsXQ0KdGVzdF9kZiA8LSBrYXJ5YXdhblstdHJhaW5faWR4LF0NCmBgYA0KDQoNCg0KDQojIE1vZGVsaW5nDQoNCg0KDQohW10oTU9ERUxJTkcuZ2lmKQ0KDQoNCg0KIyMgTG9naXN0aWMgUmVncmVzc2lvbiAoTFIpDQoNCg0KDQpgYGB7cn0NCmZpdC5sb2dpdCA8LSBnbG0oZm9ybXVsYSA9IEF0dHJpdGlvbiB+LiwNCiAgICAgICAgICAgICAgICAgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpLA0KICAgICAgICAgICAgICAgICBkYXRhID0gdHJhaW5fZGYpDQpzdW1tYXJ5KGZpdC5sb2dpdCkNCmBgYA0KDQoNCioqRXZhbHVhc2kgUGVuZ3VqaWFuKioNCg0KDQoNCmBgYHtyfQ0KcHJlZCA8LSBwcmVkaWN0KGZpdC5sb2dpdCwgdGVzdF9kZikNCnByZWQNCmBgYA0KDQoNCmBgYHtyfQ0KcHJvYiA8LSBwcmVkaWN0KGZpdC5sb2dpdCwgdGVzdF9kZiwgdHlwZSA9ICJyZXNwb25zZSIpDQpwcm9iDQpgYGANCg0KDQpgYGB7cn0NCmxvZ2l0LnByZWQgPC0gZmFjdG9yKHByb2IgPiAwLjUsDQogICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKEYsVCksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJObyIsICJZZXMiKSkNCmxvZ2l0LnBlcmYgPC0gdGFibGUodGVzdF9kZiRBdHRyaXRpb24sIGxvZ2l0LnByZWQsDQogICAgICAgICAgICAgICAgICAgIGRubiA9IGMoIkFjdHVhbCIsICJQcmVkaWN0ZWQiKSkNCmxvZ2l0LnBlcmYNCmBgYA0KDQoNCioqVHJ1ZSBOZWdhdGlmKiogDQoNCkFkYSAyNDEga2FyeWF3YW4geWFuZyBkaXByZWRpa3NpIHRpZGFrIGFrYW4gbWVuaW5nZ2Fsa2FuIHBlcnVzYWhhYW4sIGRhbiB0ZXJueWF0YSBtZW1hbmcgYmVuYXIgZGlhIHRpZGFrIGFrYW4gbWVuaW5nZ2Fsa2FuIHBlcnVzYWhhYW4uDQoNCg0KKipUcnVlIFBvc2l0aWYqKg0KDQpBZGEgMTYgS2FyeWF3YW4geWFuZyBkaXByZWRpa3NpIGFrYW4gbWVuaW5nZ2Fsa2FuIHBlcnVzYWhhYW4sIGRhbiB0ZXJueWF0YSBiZW5hciBkaWEgYWthbiBtZW5pbmdnYWxrYW4gcGVydXNhaGFhbi4gDQoNCg0KKipGYWxzZSBQb3NpdGlmKioNCg0KQWRhIDIxIEthcnlhd2FuIHlhbmcgZGlwcmVkaWtzaSBha2FuIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLCBkYW4gdGVybnlhdGEgcHJlZGlrc2lueWEgc2FsYWguIFRlcm55YXRhIDIyIGthcnlhd2FuIGl0dSB0aWRhayBtZW5pbmdnYWxrYW4gcGVydXNhaGFhbi4NCg0KDQoqKkZhbHNlIE5lZ2F0aWYqKg0KDQpBZGEgMzYga2FyeWF3YW4geWFuZyBkaXByZWRpa3NpIHRpZGFrIGFrYW4gbWVuaW5nZ2Fsa2FuIHBlcnVzYWhhYW4sIGRhbiB0ZXJueWF0YSBwcmVkaWtzaW55YSBzYWxhaCwgVGVybnlhdGEgMzYga2FyeWF3YW4gaXR1IGJlbmFyLWJlbmFyIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLg0KDQoNCg0KIyMgQ2xzc2ZpY2F0aW9uIFRyZWUgDQoNCg0KDQpgYGB7cn0NCmxpYnJhcnkocGFydHkpDQpmaXQuY3RyZWUgPC0gY3RyZWUoZm9ybXVsYSA9IEF0dHJpdGlvbiB+LiwNCiAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmVlX2NvbnRyb2wobWluc3BsaXQgPSAxLCBtaW5jcml0ZXJpb24gPSAwLjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmJ1Y2tldCA9IDEpLCBkYXRhID0gdHJhaW5fZGYpDQpgYGANCg0KDQoqKlBsb3QgUG9ob24gS2VwdXR1c2FuKioNCg0KDQpgYGB7cn0NCnBsb3QoZml0LmN0cmVlKQ0KYGBgDQoNCg0KKipIYXNpbCBQcmVkaWtzaSoqDQoNCg0KDQpgYGB7cn0NCmN0cmVlLnByZWQgPC0gcHJlZGljdChmaXQuY3RyZWUsIHRlc3RfZGYpDQpjdHJlZS5wcmVkDQpgYGANCg0KDQoNCmBgYHtyfQ0KY3RyZWUucGVyZiA8LSB0YWJsZSh0ZXN0X2RmJEF0dHJpdGlvbiwgY3RyZWUucHJlZCwNCiAgICAgICAgICAgICAgICAgICAgZG5uID0gYygiQWN0dWFsIiwgIlByZWRpY3RlZCIpKQ0KY3RyZWUucGVyZg0KYGBgDQoNCg0KKipUcnVlIE5lZ2F0aWYqKg0KDQpBZGEgMjU3IGthcnlhd2FuIHlhbmcgZGlwcmVkaWtzaSB0aWRhayBha2FuIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLCBkYW4gdGVybnlhdGEgbWVtYW5nIGJlbmFyIGRpYSB0aWRhayBha2FuIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLg0KDQoqKlRydWUgUG9zaXRpZioqDQoNCkFkYSA1IGthcnlhd2FuIHlhbmcgZGlwcmVkaWtzaSBha2FuIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLCBkYW4gdGVybnlhdGEgbWVtYW5nIGJlbmFyIGRpYSBha2FuIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLg0KDQoqKkZhbHNlIFBvc2l0aWYqKg0KDQpBZGEgNSBrYXJ5YXdhbiB5YW5nIGRpcHJlZGlrc2kgYWthbiBtZW5pbmdnYWxrYW4gcGVydXNhaGFhbiwgZGFuIHRlcm55YXRhIHByZWRpa3NpbnlhIHNhbGFoLiBUZXJueWF0YSA1IHBlZ2F3YWlueWEgaXR1IHRpZGFrIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLg0KDQoqKkZhbHNlIE5lZ2F0aWYqKg0KDQpBZGEgNDcga2FyeWF3YW4geWFuZyBkaXByZWRpa3NpIHRpZGFrIGFrYW4gbWVuaW5nZ2Fsa2FuIHBlcnVzYWhhYW4sIGRhbiB0ZXJueWF0YSBwcmVkaWtzaW55YSBzYWxhaC4gVGVybnlhdGEgNDUga2FyeWF3YW4gaXR1IGJlbmFyLWJlbmFyIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLg0KDQoNCg0KIyMgUmFuZG9tIEZvcmVzdCANCg0KDQoNCmBgYHtyfQ0KbGlicmFyeShyYW5kb21Gb3Jlc3QpDQoNCmZpdC5mb3Jlc3QgPC0gcmFuZG9tRm9yZXN0KGZvcm11bGEgPSBBdHRyaXRpb24gfiAuLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRyYWluX2RmLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEuYWN0aW9uID0gbmEucm91Z2hmaXgpDQoNCmZvcmVzdC5wcmVkIDwtIHByZWRpY3QoZml0LmZvcmVzdCwgdGVzdF9kZikNCmZvcmVzdC5wcmVkDQpgYGANCg0KDQoNCmBgYHtyfQ0KZm9yZXN0LnBlcmYgPC0gdGFibGUodGVzdF9kZiRBdHRyaXRpb24sIGZvcmVzdC5wcmVkLA0KICAgICAgICAgICAgICAgICAgICAgZG5uID0gYygiQWN0dWFsIiwiUHJlZGljdGVkIikpDQpmb3Jlc3QucGVyZg0KYGBgDQoNCg0KKipUcnVlIE5lZ2F0aWYqKg0KDQpBZGEgMjYwIGthcnlhd2FuIHlhbmcgZGlwcmVkaWtzaSB0aWRhayBha2FuIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLCBkYW4gdGVybnlhdGEgbWVtYW5nIGJlbmFyIGRpYSB0aWRhayBha2FuIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLg0KDQoqKlRydWUgUG9zaXRpZioqDQoNCkFkYSA1IGthcnlhd2FuIHlhbmcgZGlwcmVkaWtzaSBha2FuIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLCBkYW4gdGVybnlhdGEgbWVtYW5nIGJlbmFyIGRpYSBha2FuIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLg0KDQoqKkZhbHNlIFBvc2l0aWYqKg0KDQpBZGEgMiBrYXJ5YXdhbiB5YW5nIGRpcHJlZGlrc2kgYWthbiBtZW5pbmdnYWxrYW4gcGVydXNhaGFhbiwgZGFuIHRlcm55YXRhIHByZWRpa3NpbnlhIHNhbGFoLiBUZXJueWF0YSAyIHBlZ2F3YWlueWEgaXR1IHRpZGFrIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLg0KDQoqKkZhbHNlIE5lZ2F0aWYqKg0KDQpBZGEgNDcga2FyeWF3YW4geWFuZyBkaXByZWRpa3NpIHRpZGFrIGFrYW4gbWVuaW5nZ2Fsa2FuIHBlcnVzYWhhYW4sIGRhbiB0ZXJueWF0YSBwcmVkaWtzaW55YSBzYWxhaC4gVGVybnlhdGEgNDcga2FyeWF3YW4gaXR1IGJlbmFyLWJlbmFyIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLg0KDQoNCg0KIyMgU29wcHVydCBWZWN0b3IgTWFjaGluZSAoU1ZNKQ0KDQoNCmBgYHtyfQ0KbGlicmFyeShlMTA3MSkNCg0KZml0LnN2bSA8LSBzdm0oZm9ybXVsYSA9IEF0dHJpdGlvbiB+IC4sDQogICAgICAgICAgICAgICBkYXRhID0gdHJhaW5fZGYpDQpzdm0ucHJlZCA8LSBwcmVkaWN0KGZpdC5zdm0sIG5hLm9taXQodGVzdF9kZikpDQpzdm0ucHJlZA0KYGBgDQoNCg0KDQpgYGB7cn0NCnN2bS5wZXJmIDwtIHRhYmxlKG5hLm9taXQodGVzdF9kZikkQXR0cml0aW9uLCBzdm0ucHJlZCwNCiAgICAgICAgICAgICAgICAgIGRubiA9IGMoIkFjdHVhbCIsIlByZWRpY3RlZCIpKQ0Kc3ZtLnBlcmYNCmBgYA0KDQoNCioqVHJ1ZSBOZWdhdGlmKioNCg0KQWRhIDI2MiBrYXJ5YXdhbiB5YW5nIGRpcHJlZGlrc2kgdGlkYWsgYWthbiBtZW5pbmdnYWxrYW4gcGVydXNhaGFhbiwgZGFuIHRlcm55YXRhIG1lbWFuZyBiZW5hciBkaWEgdGlkYWsgYWthbiBtZW5pbmdnYWxrYW4gcGVydXNhaGFhbi4NCg0KKipUcnVlIFBvc2l0aWYqKg0KDQpBZGEgMiBLYXJ5YXdhbiB5YW5nIGRpcHJlZGlrc2kgYWthbiBtZW5pbmdnYWxrYW4gcGVydXNhaGFhbiwgZGFuIHRlcm55YXRhIG1lbWFuZyBiZW5hciBkaWEgYWthbiBtZW5pbmdnYWxrYW4gcGVydXNhaGFhbi4NCg0KKipGYWxzZSBQb3NpdGlmKioNCg0KQWRhIDAga2FyeWF3YW4geWFuZyBkaXByZWRpa3NpIGFrYW4gbWVuaW5nZ2Fsa2FuIHBlcnVzYWhhYW4sIGRhbiB0ZXJueWF0YSBwcmVkaWtzaW55YSBzYWxhaC4gVGVybnlhdGEgMCBrYXJ5YXdhbnlhIGl0dSB0aWRhayBtZW5pbmdnYWxrYW4gcGVydXNhaGFhbi4NCg0KKipGYWxzZSBOZWdhdGlmKioNCg0KQWRhIDUwIGthcnlhd2FuIHlhbmcgZGlwcmVkaWtzaSB0aWRhayBha2FuIG1lbmluZ2dhbGthbiBwZXJ1c2FoYWFuLCBkYW4gdGVybnlhdGEgcHJlZGlrc2lueWEgc2FsYWguIFRlcm55YXRhIDUwIGthcnlhd2FuIGl0dSBiZW5hci1iZW5hciBtZW5pbmdnYWxrYW4gcGVydXNhaGFhbi4NCg0KDQoNCiMgRXZhbHVhc2kNCg0KDQohW10oRVZBTFVBU0kuZ2lmKQ0KDQoNCioqUGVyZm9ybWFuY2UgQ29tcGFyaXNvbioqDQoNCg0KYGBge3J9DQpwZXJmb3JtYW5jZSA8LSBmdW5jdGlvbih0YWJsZSl7DQogIHRuIDwtIHRhYmxlWzEsMV0NCiAgdHAgPC0gdGFibGVbMiwyXQ0KICBmbiA8LSB0YWJsZVsxLDJdDQogIGZwIDwtIHRhYmxlWzIsMV0NCiAgDQogIA0KICBhY2N1cmFjeSA8LSAodG4gKyB0cCkgLyAodG4gKyB0cCArIGZuICsgZnApDQogIHByZWNpc2lvbiA8LSB0cCAvICh0cCArIGZwKQ0KICByZWNhbGwgPC0gdHAgLyAodHAgKyBmbikNCiAgZjFzY29yZSA8LSAyICogcHJlY2lzaW9uICogcmVjYWxsIC8gKHByZWNpc2lvbiArIHJlY2FsbCkNCiAgDQogIHJlc3VsdCA8LSBwYXN0ZSgiQWNjdXJhY3kgPSAiLCByb3VuZChhY2N1cmFjeSwgMyksDQogICAgICAgICAgICAgICAgICAiXG5QcmVjaXNpb24gPSAiLCByb3VuZChwcmVjaXNpb24sIDMpLA0KICAgICAgICAgICAgICAgICAgIlxuUmVjYWxsID0gIiwgcm91bmQocmVjYWxsLCAzKSwNCiAgICAgICAgICAgICAgICAgICJcbkYxIFNjb3JlID0gIiwgcm91bmQoZjFzY29yZSwgMyksICJcbiIpDQogIGNhdChyZXN1bHQpDQp9DQpgYGANCg0KDQoNCioqSGFzaWwgUGVyZm9ybWFuY2UgQ29tcGFyaXNvbioqDQoNCg0KYGBge3J9DQpwZXJmb3JtYW5jZShsb2dpdC5wZXJmKQ0KYGBgDQoNCg0KYGBge3J9DQpwZXJmb3JtYW5jZShjdHJlZS5wZXJmKSAgDQpgYGANCg0KDQpgYGB7cn0NCnBlcmZvcm1hbmNlKGZvcmVzdC5wZXJmKQ0KYGBgDQoNCg0KYGBge3J9DQpwZXJmb3JtYW5jZShzdm0ucGVyZikNCmBgYA0KDQoNCg0KIyBLZXNpbXB1bGFuDQoNCg0KDQohW10oS0VTSU1QVUxBTi5naWYpDQoNCg0KDQpTZXRlbGFoIHNlbGVzYWkgbWVsYWt1a2FuIGJlYmVyYXBhIGFsZ29yaXRtYSwgeWFuZyBtZW5naGFzaWxrYW4gdGluZ2thdCBha3VyYXNpIHBhbGluZyB0aW5nZ2kgYWRhbGFoIG1vZGVsICoqUmFuZG9tIEZvcmVzdCoqIHNlYmVzYXIgMC44NSBhdGF1IDg1JS4NCg0KQmlzYSBkaWJ1a3Rpa2FuIG1lbGFsdWkgcGVyaGl0dW5nYW4gY29uZnVzaW9uIG1hdHJpeCwgZGVuZ2FuIGhhc2lsIHNlYmFnYWkgYmVyaWt1dDoNCg0KLSBBY2N1cmFjeSB1bnR1ayBtb2RlbCBsb2dpc3RpYyByZWdyZXNzaW9uID0gMjQxIGthcnlhd2FuDQoNCi0gQWNjdXJhY3kgdW50dWsgbW9kZWwgY2xhc3NpZmljYXRpb24gdHJlZSA9IDI1NyBrYXJ5YXdhbg0KDQotIEFjY3VyYWN5IHVudHVrIG1vZGVsIHJhbmRvbSBmb3Jlc3QgPSAyNjAga2FyeWF3YW4NCg0KLSBBY2N1cmFjeSB1bnR1ayBtb2RlbCBzdXBwb3J0IHZlY3RvciBtYWNoaW5lID0gMjYyIGthcnlhd2FuDQoNCkphZGkgcGFsaW5nIGJhbnlhayBhZGFsYWggbW9kZWwgcmFuZG9tIGZvcmVzdCwgc2ViYW55YWsgcGVnYXdhaSB5YW5nIGJlbmFyIGRpcHJlZGlrc2kgdGlkYWsgYWthbiBtZW5pbmdnYWxrYW4gcGVydXNhaGFhbi4NCg0KRGFuIHlhbmcgbWVuZ2hhc2lsa2FuIHRpbmdrYXQgcHJlY2lzaW9uIHBhbGluZyB0aW5nZ2kgYWRhbGFoIG1vZGVsIFN1cHBvcnQgVmVjdG9yIE1hY2hpbmUgc2ViZXNhciAxMDAlLg0KQmlzYSBkaWJ1a3Rpa2FuIG1lbGFsdWkgcGVyaGl0dW5nYW4gY29uZnVzaW9uIG1hdHJpeCwgZGVuZ2FuIGhhc2lsIHNlYmFnYWkgYmVyaWt1dDoNCg0KLSBQcmVjaXNpb24gdW50dWsgbW9kZWwgbG9naXN0aWMgcmVncmVzc2lvbiA9IDE2IGthcnlhd2FuDQoNCi0gUHJlY2lzaW9uIHVudHVrIG1vZGVsIGNsYXNzaWZpY2F0aW9uIHRyZWUgPSA1IGthcnlhd2FuDQoNCi0gUHJlY2lzaW9uIHVudHVrIG1vZGVsIHJhbmRvbSBmb3Jlc3QgPSA1IGthcnlhd2FuDQoNCi0gUHJlY2lzaW9uIHVudHVrIG1vZGVsIHN1cHBvcnQgdmVjdG9yIG1hY2hpbmUgPSAyIGthcnlhd2FuDQoNCkphZGkgcGFsaW5nIHNlZGlraXQgeWFuZyBtZW5pbmdnYWxrYW4gcGVydXNhaGFhbiBhZGFsYWggbW9kZWwgc3VwcG9ydCB2ZWN0b3IgbWFjaGluZSwgeWFpdHUgc2ViYW55YWsgMiBrYXJ5YXdhbiB5YW5nIGJlbmFyIGRpIHByZWRpa3NpIGFrYW4gbWVuaW5nZ2Fsa2FuIHBlcnVzYWhhYW4uDQoNClNlaGluZ2dhIGRhcGF0IGRpc2ltcHVsa2FuOiANCg0KLSBQcm9qZWsgaW5pIGRpbGFrdWthbiBzZWxhbWEgMTggaGFyaSANCg0KLSBVbnR1ayB2YXJpYWJlbCB1dGFtYSB5YW5nIGRpZ3VuYWthbiBkYWxhbSBwcm9qZWsgaW5pIGFkYWxhaCBhdHRyaXRpb24sIGFnZSwgbW9udGhseWluY29tZSwgZ2VuZGVyLCBtYXJpdGFsc3RhdHVzLCBudW1jb21wYW5pZXN3b3JrZWQuIA0KDQotIFVudHVrIG1vZGVsLCBtdW5na2luIGJpc2EgZGkgZGVwbG95IGxhZ2kgZGFsYW0gbWVuaW5na2F0a2FuIG5pbGFpIGFrdXJhc2lueWEuDQoNCi0gTWVudXJ1dCBzYXlhLCBNb2RlbCB5YW5nIHBhbGluZyBtZW5ndW50dW5na2FuIGRhbGFtIHNlZ2kgYmlzbmlzIGFkYWxhaCBtb2RlbCBTdXBwb3J0IFZlY3RvciBNYWNoaW5lLiBLYXJlbmEgcHJlY2lzc2lvbm55YSBtZW51bmp1a2FuIHlhbmcgcGFsaW5nIHNlZGlraXQgbWVuaW5nZ2Fsa2FuIHBlcnVzYWhhYW4gc2ViYW55YWsgMiBrYXJ5YXdhbi4gRGFuIGp1Z2EgaGFzaWwgcHJlc2VudGFzZSBwYWxpbmcgdGluZ2dpIGRpYW50YXJhIG1vZGVsIGxhaW5ueWEgYWRhbGFoIHByZWNpc2lvbiBzZWJlc2FyIDEwMCUuDQoNCi0gU2VoaW5nZ2EgZGVuZ2FuIGRlbWlraWFuIGthbGF1IGtpdGEgc3VkYWggbWVudHJlYXRtZW50IGl0dSBkZW5nYW4gbGViaWggYmFpayBtYWthIGtpdGEgdGlkYWsgYWthbiBrZWhpbGFuZ2FuIHRhbGVudGEtdGFsZW50YSBiYXJ1IGRpcGVydXNhaGFhbi4gRGFuIGFraGlybnlhIGtpdGEganVnYSBnYWsgcGVybHUga2VsdWFyIGJpYXlhIGF0YXUgZWZmb3J0IHVudHVrIG1lcmVrcnV0IG9yYW5nLW9yYW5nIGJhcnUgbGFnaS4gDQoNCi0gUHJvamVrIGluaSBkYXBhdCBkaW1hbmZhYXRrYW4gb2xlaCBzZW9yYW5nIEhSIGRhbGFtIG1lbmdlZmlzaWVuc2kgd2FrdHUgZGFyaSBraW5lcmphIG55YSB1bnR1ayBtZW5nZWxvbGEga2FyeWF3YW5ueWEuDQoNCi0gUHJvamVrIGluaSBkYXBhdCBkaW1hbmZhYXJrYW4gb2xlaCBzZW9yYW5nIE1hbmFnZXIgZGFsYW0gbWVtcHJlZGlrc2kgcHJvYmFiaWxpdGFzIGF0dHJpdGlvbiB0aWFwIGthcnlhd2FuLCBzZWhpbmdnYSBtYW5hamVyIGJpc2EgbWVsaWhhdCBkYW4gbWVuZGFsYW1pIGFsYXNhbiBwZXJzb25hbCBzYXR1IHBlcnNhdHUga2FyeWF3YW4gZGVuZ2FuIG1lbGloYXQgbmlsYWkgYXR0cml0aW9uIHByb2JhYmlsaXR5IHlhbmcgdGluZ2dpLg0KDQotIFByb2playBpbmkganVnYSBkYXBhdCBtZW1iYW50dSBtYW5hZ2VyIGRhbGFtIG1lbmVudHVrYW4ga2ViaWpha2FuIGRhbGFtIHVzYWhhbnlhIHVudHVrIG1lbnVydW5rYW4gbmlsYWkgKipBdHRyaXRpb24qKiB5YW5nIHRpbmdnaSBkaSBwZXJ1c2FoYWFuLg==