Required packages

library(tidyr)
library(dplyr)
library(readr)
library(outliers)
library(forecast)

Executive Summary

Data

Caste <- read_csv("Caste.csv")
Parsed with column specification:
cols(
  state_name = col_character(),
  is_state = col_integer(),
  year = col_integer(),
  gender = col_character(),
  caste = col_character(),
  convicts = col_integer(),
  under_trial = col_integer(),
  detenues = col_integer(),
  others = col_integer()
)
head(Caste)
Death_sentence <- read_csv("Death_sentence.csv")
Parsed with column specification:
cols(
  state_name = col_character(),
  year = col_integer(),
  no_capital_punishment = col_integer(),
  no_life_imprisonment = col_integer(),
  no_executed = col_integer()
)
head(Death_sentence)
a <- inner_join(Caste, Death_sentence)
Joining, by = c("state_name", "year")
head(a)

Understand

a$is_state <- as.logical(a$is_state)
a$gender <- factor(a$gender)
a$caste <- factor(a$caste, levels = c("ST","SC","OBC","Others"),labels = c("ST","SC","OBC","Higher_caste"),ordered = TRUE)
dim(a)
[1] 3560   12
str(a)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   3560 obs. of  12 variables:
 $ state_name           : chr  "Andhra Pradesh" "Andhra Pradesh" "Andhra Pradesh" "Andhra Pradesh" ...
 $ is_state             : logi  TRUE TRUE TRUE TRUE TRUE TRUE ...
 $ year                 : int  2001 2001 2001 2001 2002 2002 2002 2002 2003 2003 ...
 $ gender               : Factor w/ 2 levels "Female","Male": 2 2 2 2 2 2 2 2 2 2 ...
 $ caste                : Ord.factor w/ 4 levels "ST"<"SC"<"OBC"<..: 2 1 3 4 2 1 3 4 2 1 ...
 $ convicts             : int  1236 418 1526 939 1177 384 1833 1327 1153 381 ...
 $ under_trial          : int  1836 1205 3359 1960 1573 962 2951 2506 1622 990 ...
 $ detenues             : int  0 0 4 0 2 0 0 0 0 0 ...
 $ others               : int  5 1 8 8 0 0 0 0 0 0 ...
 $ no_capital_punishment: int  1 1 1 1 3 3 3 3 1 1 ...
 $ no_life_imprisonment : int  1 1 1 1 1 1 1 1 1 1 ...
 $ no_executed          : int  0 0 0 0 0 0 0 0 0 0 ...
attributes(a)
$`row.names`
   [1]    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17
  [18]   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34
  [35]   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51
  [52]   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68
  [69]   69   70   71   72   73   74   75   76   77   78   79   80   81   82   83   84   85
  [86]   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102
 [103]  103  104  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119
 [120]  120  121  122  123  124  125  126  127  128  129  130  131  132  133  134  135  136
 [137]  137  138  139  140  141  142  143  144  145  146  147  148  149  150  151  152  153
 [154]  154  155  156  157  158  159  160  161  162  163  164  165  166  167  168  169  170
 [171]  171  172  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187
 [188]  188  189  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204
 [205]  205  206  207  208  209  210  211  212  213  214  215  216  217  218  219  220  221
 [222]  222  223  224  225  226  227  228  229  230  231  232  233  234  235  236  237  238
 [239]  239  240  241  242  243  244  245  246  247  248  249  250  251  252  253  254  255
 [256]  256  257  258  259  260  261  262  263  264  265  266  267  268  269  270  271  272
 [273]  273  274  275  276  277  278  279  280  281  282  283  284  285  286  287  288  289
 [290]  290  291  292  293  294  295  296  297  298  299  300  301  302  303  304  305  306
 [307]  307  308  309  310  311  312  313  314  315  316  317  318  319  320  321  322  323
 [324]  324  325  326  327  328  329  330  331  332  333  334  335  336  337  338  339  340
 [341]  341  342  343  344  345  346  347  348  349  350  351  352  353  354  355  356  357
 [358]  358  359  360  361  362  363  364  365  366  367  368  369  370  371  372  373  374
 [375]  375  376  377  378  379  380  381  382  383  384  385  386  387  388  389  390  391
 [392]  392  393  394  395  396  397  398  399  400  401  402  403  404  405  406  407  408
 [409]  409  410  411  412  413  414  415  416  417  418  419  420  421  422  423  424  425
 [426]  426  427  428  429  430  431  432  433  434  435  436  437  438  439  440  441  442
 [443]  443  444  445  446  447  448  449  450  451  452  453  454  455  456  457  458  459
 [460]  460  461  462  463  464  465  466  467  468  469  470  471  472  473  474  475  476
 [477]  477  478  479  480  481  482  483  484  485  486  487  488  489  490  491  492  493
 [494]  494  495  496  497  498  499  500  501  502  503  504  505  506  507  508  509  510
 [511]  511  512  513  514  515  516  517  518  519  520  521  522  523  524  525  526  527
 [528]  528  529  530  531  532  533  534  535  536  537  538  539  540  541  542  543  544
 [545]  545  546  547  548  549  550  551  552  553  554  555  556  557  558  559  560  561
 [562]  562  563  564  565  566  567  568  569  570  571  572  573  574  575  576  577  578
 [579]  579  580  581  582  583  584  585  586  587  588  589  590  591  592  593  594  595
 [596]  596  597  598  599  600  601  602  603  604  605  606  607  608  609  610  611  612
 [613]  613  614  615  616  617  618  619  620  621  622  623  624  625  626  627  628  629
 [630]  630  631  632  633  634  635  636  637  638  639  640  641  642  643  644  645  646
 [647]  647  648  649  650  651  652  653  654  655  656  657  658  659  660  661  662  663
 [664]  664  665  666  667  668  669  670  671  672  673  674  675  676  677  678  679  680
 [681]  681  682  683  684  685  686  687  688  689  690  691  692  693  694  695  696  697
 [698]  698  699  700  701  702  703  704  705  706  707  708  709  710  711  712  713  714
 [715]  715  716  717  718  719  720  721  722  723  724  725  726  727  728  729  730  731
 [732]  732  733  734  735  736  737  738  739  740  741  742  743  744  745  746  747  748
 [749]  749  750  751  752  753  754  755  756  757  758  759  760  761  762  763  764  765
 [766]  766  767  768  769  770  771  772  773  774  775  776  777  778  779  780  781  782
 [783]  783  784  785  786  787  788  789  790  791  792  793  794  795  796  797  798  799
 [800]  800  801  802  803  804  805  806  807  808  809  810  811  812  813  814  815  816
 [817]  817  818  819  820  821  822  823  824  825  826  827  828  829  830  831  832  833
 [834]  834  835  836  837  838  839  840  841  842  843  844  845  846  847  848  849  850
 [851]  851  852  853  854  855  856  857  858  859  860  861  862  863  864  865  866  867
 [868]  868  869  870  871  872  873  874  875  876  877  878  879  880  881  882  883  884
 [885]  885  886  887  888  889  890  891  892  893  894  895  896  897  898  899  900  901
 [902]  902  903  904  905  906  907  908  909  910  911  912  913  914  915  916  917  918
 [919]  919  920  921  922  923  924  925  926  927  928  929  930  931  932  933  934  935
 [936]  936  937  938  939  940  941  942  943  944  945  946  947  948  949  950  951  952
 [953]  953  954  955  956  957  958  959  960  961  962  963  964  965  966  967  968  969
 [970]  970  971  972  973  974  975  976  977  978  979  980  981  982  983  984  985  986
 [987]  987  988  989  990  991  992  993  994  995  996  997  998  999 1000
 [ reached getOption("max.print") -- omitted 2560 entries ]

$names
 [1] "state_name"            "is_state"              "year"                 
 [4] "gender"                "caste"                 "convicts"             
 [7] "under_trial"           "detenues"              "others"               
[10] "no_capital_punishment" "no_life_imprisonment"  "no_executed"          

$class
[1] "tbl_df"     "tbl"        "data.frame"
summary(a)
  state_name         is_state            year         gender              caste    
 Length:3560        Mode :logical   Min.   :2001   Female:1780   ST          :890  
 Class :character   FALSE:720       1st Qu.:2004   Male  :1780   SC          :890  
 Mode  :character   TRUE :2840      Median :2007                 OBC         :890  
                                    Mean   :2007                 Higher_caste:890  
                                    3rd Qu.:2010                                   
                                    Max.   :2013                                   
    convicts       under_trial         detenues          others       
 Min.   :   0.0   Min.   :    0.0   Min.   :  0.00   Min.   :   0.00  
 1st Qu.:   1.0   1st Qu.:    3.0   1st Qu.:  0.00   1st Qu.:   0.00  
 Median :  26.0   Median :   65.5   Median :  0.00   Median :   0.00  
 Mean   : 400.4   Mean   :  850.4   Mean   : 11.15   Mean   :  20.89  
 3rd Qu.: 289.0   3rd Qu.:  517.2   3rd Qu.:  0.00   3rd Qu.:   0.00  
 Max.   :9836.0   Max.   :21341.0   Max.   :925.00   Max.   :6039.00  
 no_capital_punishment no_life_imprisonment  no_executed      
 Min.   : 0.000        Min.   :  0.00       Min.   :0.000000  
 1st Qu.: 0.000        1st Qu.:  0.00       1st Qu.:0.000000  
 Median : 0.000        Median :  0.00       Median :0.000000  
 Mean   : 3.787        Mean   : 10.11       Mean   :0.006742  
 3rd Qu.: 4.000        3rd Qu.:  2.00       3rd Qu.:0.000000  
 Max.   :57.000        Max.   :919.00       Max.   :1.000000  

Tidy & Manipulate Data I

head(a)

Tidy & Manipulate Data II

a <- mutate(a, Total_punishments = no_capital_punishment + no_life_imprisonment)
head(a)

Scan I

sum(is.na(a))
[1] 0
sum(is.nan(a$convicts))
[1] 0
sum(is.nan(a$under_trial))
[1] 0
sum(is.nan(a$detenues))
[1] 0
sum(is.nan(a$others))
[1] 0
sum(is.nan(a$no_capital_punishment))
[1] 0
sum(is.nan(a$no_life_imprisonment))
[1] 0
sum(is.nan(a$no_executed))
[1] 0
sum(is.nan(a$Total_punishments))
[1] 0

Scan II

Before Capping

boxplot(a$convicts,main="BoxPlot of convicts")

boxplot(a$under_trial,main="BoxPlot of under_trial")

boxplot(a$detenues,main="BoxPlot of detenues")

boxplot(a$others,main="BoxPlot of others")

boxplot(a$no_capital_punishment,main="BoxPlot of no_capital_punishment")

boxplot(a$no_life_imprisonment,main="BoxPlot of no_life_imprisonment")

boxplot(a$no_executed,main="BoxPlot of no_executed")

boxplot(a$Total_punishments,main="BoxPlot of Total_punishments")

cap <- function(x){
  quantiles <- quantile( x, c(.05, 0.25, 0.75, .95 ) )
  x[ x < quantiles[2] - 1.5*IQR(x) ] <- quantiles[1]
  x[ x > quantiles[3] + 1.5*IQR(x) ] <- quantiles[4]
  x
}
a_sub<-a %>% dplyr::select(convicts,under_trial,detenues,others,no_capital_punishment,no_life_imprisonment,no_executed,Total_punishments)
summary(a_sub)
    convicts       under_trial         detenues          others       
 Min.   :   0.0   Min.   :    0.0   Min.   :  0.00   Min.   :   0.00  
 1st Qu.:   1.0   1st Qu.:    3.0   1st Qu.:  0.00   1st Qu.:   0.00  
 Median :  26.0   Median :   65.5   Median :  0.00   Median :   0.00  
 Mean   : 400.4   Mean   :  850.4   Mean   : 11.15   Mean   :  20.89  
 3rd Qu.: 289.0   3rd Qu.:  517.2   3rd Qu.:  0.00   3rd Qu.:   0.00  
 Max.   :9836.0   Max.   :21341.0   Max.   :925.00   Max.   :6039.00  
 no_capital_punishment no_life_imprisonment  no_executed       Total_punishments
 Min.   : 0.000        Min.   :  0.00       Min.   :0.000000   Min.   :  0.00   
 1st Qu.: 0.000        1st Qu.:  0.00       1st Qu.:0.000000   1st Qu.:  0.00   
 Median : 0.000        Median :  0.00       Median :0.000000   Median :  1.00   
 Mean   : 3.787        Mean   : 10.11       Mean   :0.006742   Mean   : 13.89   
 3rd Qu.: 4.000        3rd Qu.:  2.00       3rd Qu.:0.000000   3rd Qu.:  8.00   
 Max.   :57.000        Max.   :919.00       Max.   :1.000000   Max.   :928.00   
a_cap<-sapply(a_sub,FUN = cap)
summary(a_cap)
    convicts       under_trial        detenues         others       no_capital_punishment
 Min.   :   0.0   Min.   :   0.0   Min.   : 0.00   Min.   : 0.000   Min.   : 0.000       
 1st Qu.:   1.0   1st Qu.:   3.0   1st Qu.: 0.00   1st Qu.: 0.000   1st Qu.: 0.000       
 Median :  26.0   Median :  65.5   Median : 0.00   Median : 0.000   Median : 0.000       
 Mean   : 437.1   Mean   : 818.5   Mean   :11.84   Mean   : 2.706   Mean   : 3.681       
 3rd Qu.: 289.0   3rd Qu.: 517.2   3rd Qu.: 0.00   3rd Qu.: 0.000   3rd Qu.: 4.000       
 Max.   :2066.2   Max.   :3875.8   Max.   :48.00   Max.   :16.000   Max.   :19.000       
 no_life_imprisonment  no_executed Total_punishments
 Min.   : 0.000       Min.   :0    Min.   : 0.000   
 1st Qu.: 0.000       1st Qu.:0    1st Qu.: 0.000   
 Median : 0.000       Median :0    Median : 1.000   
 Mean   : 3.816       Mean   :0    Mean   : 7.431   
 3rd Qu.: 2.000       3rd Qu.:0    3rd Qu.: 8.000   
 Max.   :22.000       Max.   :0    Max.   :41.000   
d1<-a[,1:5]
d2<-cbind(d1,a_cap)
head(d2)

After Capping

boxplot(d2$convicts,main="BoxPlot of convicts")

boxplot(d2$under_trial,main="BoxPlot of under_trial")

boxplot(d2$detenues,main="BoxPlot of detenues")

boxplot(d2$others,main="BoxPlot of others")

boxplot(d2$no_capital_punishment,main="BoxPlot of no_capital_punishment")

boxplot(d2$no_life_imprisonment,main="BoxPlot of no_life_imprisonment")

boxplot(d2$no_executed,main="BoxPlot of no_executed")

boxplot(d2$Total_punishments,main="BoxPlot of Total_punishments")

Transform

  • In this step Datatransformation technique is applied to the “Total_punishments” varible.

  • At first the histogram for this variable is plotted to check for skeweness. The histogram is a right skewed.

  • Hence, logarithmic transformation technique is applied to reduce the skeweness and make it more normally distributed.

  • Finally, the histogram is plotted to display the normal distribution of “Total_punishments” variable.

hist(d2$Total_punishments)

d2$Total_punishments <- log(d2$Total_punishments)
hist(d2$Total_punishments)



LS0tDQp0aXRsZTogIk1BVEgyMzQ5IFNlbWVzdGVyIDIsIDIwMTgiDQphdXRob3I6ICJSQVZJIFRFSkEgU0FJIEtVTkNIQU0gKFMzNzM0Njg5KSwgTUFMTElLQVJKVU5BIFNJVEFSQU1BIEhBUlNIQSBWQU1TSSBDSEVCT0xVIFZFTktBVEEgKFMzNzM0NjkxKSINCnN1YnRpdGxlOiBBc3NpZ25tZW50IDMNCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KLS0tDQoNCiMjIFJlcXVpcmVkIHBhY2thZ2VzIA0KDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShvdXRsaWVycykNCmxpYnJhcnkoZm9yZWNhc3QpDQpgYGANCg0KDQojIyBFeGVjdXRpdmUgU3VtbWFyeSANCg0KKiBUaGUgRGF0YXNldHMgIkNhc3RlLmNzdiIgYW5kICJEZWF0aF9zZW50ZW5jZS5jc3YiIGNob3NlbiBmb3IgdGhpcyBhc3NpZ25tZW50IGFyZSByZWdhcmRpbmcgIkluZGlhbiBQcmlzb24gU3RhdGlzdGljcyIgZG93bmxvYWRlZCBmcm9tIEthZ2dsZS4gVGhlIERhdGFzZXRzIGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCB0eXBlIG9mIHB1bmlzaG1lbnRzIGlzc3VlZCBmb3IgY29udmljdHMgb2YgZGlmZmVyZW50IENhc3RlIGluIGFsbCB0aGUgc3RhdGVzIGFuZCBJc2xhbmRzIHVuZGVyIHRoZSBwcm92aW5jZSBvZiBJbmRpYW4gR292ZXJuYW1lbnQuIFRoZSB0d28gZGF0YXNldHMgd2VyZSBtZXJnZWQgb24gdGhlIGNvbW1vbiB2YXJpYWJsZXMgc3RhdGVfbmFtZSBhbmQgeWVhciwgdXNpbmcgYW4gaW5uZXJfam9pbi4gVGhlIHZhcmlhYmxlcyBhbmQgZGF0YXN0cnVjdHVyZXMgYXJlIHN1bW1hcmlzZWQuIFRoZSBkYXRhc2V0IGhhcyBtZXQgdGhlIHRpZHkgcHJpbmNpcGxlcyBhbmQgYWxzbyB0aGVyZSBhcmUgbm8gbWlzc2luZyB2YWx1ZXMgb3IgaW5jb25zaXN0ZW5jaWVzIGluIHRoZSBkYXRhc2V0LiBIZW5jZSwgdGhlIGFjdGlvbnMgdG8gZGVhbCB3aXRoIHRoZW0gaGF2ZSBiZWVuIG5vdCBwZXJmb3JtZWQuDQpBIG5ldyB2YXJpYWJsZSBpcyBjcmVhdGVkIHRvIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBvZiB0b3RhbCBudW1iZXIgb2YgcHVuaXNobWVudHMuIFRoZW4sIHRoZSBudW1lcmljIHZhcmlhYmxlcyBhcmUgY2hlY2tlZCBmb3Igb3V0bGllcnMgYW5kIHRoZSBuZWNlc3NhcnkgYWN0aW9ucyBzdWNoIGFzIGNhcHBpbmcgaGF2ZSBiZWVuIHBlcmZvcm1lZCB0byByZW1vdmUgdGhlIG91dGxpZXJzLiBGaW5hbGx5IGxvZ2FyaXRobWV0aWMgZGF0YSB0cmFuc2Zvcm1hdGlvbiB0ZWNobmlxdWUgaXMgdXNlZCBvbiB0aGUgdmFyaWFibGUgdG90YWxfcHVuaXNobWVudHMgaW5vcmRlciB0byByZWR1Y2UgaXRzIHJpZ2h0IHNrZXdlbmVzcyBhbmQgbWFrZSBpdCBub3JtYWxseSBkaXN0cmlidXRlZC4NCg0KIyMgRGF0YSANCg0KKiBJbiB0aGlzIGFzc2lnbm1lbnQgd2UgaGF2ZSB1c2VkIHR3byBkYXRhc2V0cyByZWdhcmRpbmcgSW5kaWFuIHByaXNvbiBzdGF0aXN0aWNzIG5hbWVseSwgQ2FzdGUuY3N2IGFuZCBEZWF0aF9zZW50ZW5jZS5jc3YuDQoNCiogc3RhdGVfbmFtZSAtIGNoYXJhY3RlciB2YXJpYWJsZSBkZXNjcmliaW5nIG5hbWUgb2YgdGhlIHN0YXRlLg0KKiAgaXNfc3RhdGUgICAtIGxvZ2ljYWwgdmFyaWFibGUgZGVzY3JpYmluZyB3aGV0aGVyIGl0IGlzIHN0YXRlIG9yIG5vdCAoc29tZSBhcmUgSXNsYW5kcykuDQoqICB5ZWFyICAgICAgIC0gbnVtZXJpYyB2YXJpYWJsZSBzaG93aW5nIHllYXIuDQoqIGdlbmRlciAgICAgLSBjaGFyYWN0ZXIgdmFyaWFibGUgZGVzY3JpYmluZyBnZW5kZXIuDQoqIGNhc3RlICAgICAgLSBjaGFyYWN0ZXIgdmFyaWFibGUgZGVzY3JpYmluZyBjYXN0ZSB0byB3aGljaCBwZW9wbGUgYmVsb25nIHRvLg0KKiBjb252aWN0cyAgIC0gbnVtZXJpYyB2YXJpYWJsZSBkZXNjcmliaW5nIG5vLm9mIHBlb3BsZSB3aG8gYXJlIGNvbnZpY3RzIGluIHRoYXQgeWVhci4NCiogdW5kZXJfdHJpYWwtIG51bWVyaWMgdmFyaWFibGUgZGVzY3JpYmluZyBuby5vZiBwZW9wbGUgd2hvIGFyZSB1bmRlciB0cmlhbCBpbiBlYWNoIHN0YXRlLg0KKiBkZXRlbnVlcyAgIC0gbnVtZXJpYyB2YXJpYWJsZSBkZXNjcmliaW5nIG5vLm9mIHBlb3BsZSBoZWxkIGluIGN1c3RvZHkuDQoqIG90aGVycyAgICAgLSBudW1lcmljIHZhcmlhYmxlIGRlc2NyaWJpbmcgb3RoZXIgY2F0ZWdvcnkgcHJpc29uZXJzLg0KKiBub19jYXBpdGFsX3B1bmlzaG1lbnRzLSBudW1lcmljIHZhcmlhYmxlIHNob3dpbmcgbm8ub2YgY2FwaXRhbCBwdW5pc2htZW50cyBpc3N1ZWQgaW4gdGhhdCBzdGF0ZQ0KKiBub19saWZlX2ltcHJpc29ubWVudCAgLSBudW1lcmljIHZhcmlhYmxlIHNob3dpbmcgbm8ub2YgbGlmZSBpbXByaXNvbm1lbnRzIGlzc3VlZCBpbiB0aGF0IHN0YXRlLg0KKiBub19leGVjdXRlZCAgICAgICAgICAgLSB1bWVyaWMgdmFyaWFibGUgZGVzY3JpYmluZyBuby5vZiBwZW9wbGUgZXhlY3V0ZWQgaW4gdGhhdCBzdGF0ZS4NCg0KKiBUaGUgQ2FzdGUuY3N2IERhdGFzZXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIG5vLm9mIGNvbnZpY3RzLCB1bmRlcl90cmFpbCBhbmQgZGV0ZW51ZXMgb2YgY2VydGFpbiBjYXN0ZSBwZW9wbGUgbGlrZSBzY2hlZHVsZSB0cmliZXMoU1QpLCBzY2hlZHVsZSBjYXN0ZShTQyksIG90aGVyIGJhY2t3YXJkIGNsYXNzKE9CQykgYW5kIG90aGVyIGhpZ2hlciBjYXN0ZXMgaW4gZWFjaCBzdGF0ZSBiZXR3ZWVuIHRoZSB5ZWFycyAyMDAxIC0gMjAxMy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBmb3IgYm90aCBNYWxlIGFuZCBGZW1hbGUgZ2VuZGVycy4NCg0KKiBUaGUgRGVhdGhfc2VudGVuY2UuY3N2IERhdGFzZXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIG5vLm9mIENhcGl0YWwgcHVuaXNobWVudHMsIG5vLm9mIGxpZmUgaW1wcmlzb25tZW50cyBhbmQgbm8ub2YgcGVvcGxlIGV4ZWN1dGVkIGluIHRoZSBzdGF0ZXMgb2YgSW5kaWEgaW4gdGhvc2UgeWVhcnMuDQoNCiogQnkgbWVyZ2luZyB0aGUgYWJvdmUgdHdvIGRhdGFzZXRzIG9uIGNvbW1vbiB2YXJpYWJsZXMgJ3N0YXRlX25hbWUnIGFuZCAneWVhcicgdXNpbmcgYW4gaW5uZXJfam9pbiwgd2UgY2FuIG9idGFpbiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgbm8ub2YgY2FwaXRhbCBwdW5pc2htZW50cywgbGlmZSBpbXByaXNvbm1lbnRzIGFuZCBwZW9wbGUgZXhlY3V0ZWQsIGluIHRoZSBjYXN0ZXMgbWVudGlvbmVkIGluIGNhc3RlLmNzdiBkYXRhc2V0LiBXZSBjYW4gYWxzbyBvYnRhaW4gZGF0YSByZWdhcmRpbmcgbm8ub2YgY29udmljdHMsIHBlb3BsZSB1bmRlciB0cmFpbCBhbmQgZGV0ZW51ZXMgc3RhdGlzdGljcyBvZiB0aG9zZSBwYXJ0aWN1bGFyIHN0YXRlcywgd2hpY2ggd2lsbCBhZGQgYSBsb2dpY2FsIHNpZ25pZmljYW5jZSB0byB0aGUgZGF0YXNldC4NCiANCiogRGF0YSBTb3VyY2U6IGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vcmFqYW5hbmQvcHJpc29uLWluLWluZGlhDQoqIERhdGEgRm9ybWF0OiBDU1YNCiogVGhlc2UgRGF0YXNldHMgaGF2ZSBiZWVuIHRha2VuIGZyb20gS2FnZ2xlIHdlYnNpdGUgd2hpY2ggaGF2ZSBjcmVhdGl2ZSBjb21tb25zIGxpY2VuY2UuIA0KDQpgYGB7cn0NCg0KQ2FzdGUgPC0gcmVhZF9jc3YoIkNhc3RlLmNzdiIpDQpoZWFkKENhc3RlKQ0KRGVhdGhfc2VudGVuY2UgPC0gcmVhZF9jc3YoIkRlYXRoX3NlbnRlbmNlLmNzdiIpDQpoZWFkKERlYXRoX3NlbnRlbmNlKQ0KDQphIDwtIGlubmVyX2pvaW4oQ2FzdGUsIERlYXRoX3NlbnRlbmNlKQ0KaGVhZChhKQ0KDQoNCmBgYA0KDQojIyBVbmRlcnN0YW5kIA0KDQoqIEluIHRoaXMgc3RlcCB2YXJpYWJsZXMgc3VjaCBhcyBnZW5kZXIgYW5kIGNhc3RlIGFyZSBjb252ZXJ0ZWQgaW50byB0eXBlIGZhY3Rvci4gVGhlIHZhcmlhYmxlIGNhc3RlIGlzIGFsc28gb3JkZXJlZCBiYXNlZCBvbiB0aGUgYmFja3dhcmRuZXNzIG9mIGVhY2ggdHlwZSBvZiBjYXN0ZS4NCiogVGhlIGRpbWVudGlvbnMsIHN0cnVjdHVyZSwgYXR0cmlidXRlcyBhbmQgc3VtbWFyeSBvZiB0aGUgZGF0YXNldCBpcyBmb3VuZCB1c2luZyB0aGUgZm9sbHdpbmcgUiBjb2RlLg0KDQpgYGB7cn0NCmEkaXNfc3RhdGUgPC0gYXMubG9naWNhbChhJGlzX3N0YXRlKQ0KYSRnZW5kZXIgPC0gZmFjdG9yKGEkZ2VuZGVyKQ0KYSRjYXN0ZSA8LSBmYWN0b3IoYSRjYXN0ZSwgbGV2ZWxzID0gYygiU1QiLCJTQyIsIk9CQyIsIk90aGVycyIpLGxhYmVscyA9IGMoIlNUIiwiU0MiLCJPQkMiLCJIaWdoZXJfY2FzdGUiKSxvcmRlcmVkID0gVFJVRSkNCg0KZGltKGEpDQpzdHIoYSkNCmF0dHJpYnV0ZXMoYSkNCnN1bW1hcnkoYSkNCmBgYA0KDQoNCiMjCVRpZHkgJiBNYW5pcHVsYXRlIERhdGEgSSANCg0KKiBUaGlzIERhdGFzZXQgaGFzIG1ldCB0aGUgVGlkeSBkYXRhIHByaW5jaXBsZXMgYW5kIHRoZSB2YXJpYWJsZXMgYXJlIGluIHByb3BlciBmb3JtYXQuIEhlbmNlIHRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IG9mIHJlc2hhcGluZyBvciBjb252ZXJ0aW5nIHRoZSBkYXRhIGZvcm1hdC4NCg0KDQpgYGB7cn0NCmhlYWQoYSkNCmBgYA0KDQojIwlUaWR5ICYgTWFuaXB1bGF0ZSBEYXRhIElJIA0KDQoqIEluIHRoaXMgRGF0YXNldCB0aGVyZSBhcmUgdmFyaWFibGVzIGhvbGRpbmcgaW5mb3JtYXRpb24gYWJvdXQgbnVtYmVyIG9mIGNhcGl0YWwgcHVuaXNobWVudHMgYW5kIG51bWJlciBvZiBsaWZlIGltcHJpc29ubWVudHMgZm9yIGVhY2ggc3RhdGUuIFNvLCBhIG5ldyB2YXJpYWJsZSBpcyBjcmVhdGVkIHdoaWNoIGhvbGRzIHRoZSBkYXRhIHJlZ2FyZGluZyB0b3RhbCBudW1iZXIgb2YgcHVuaXNobWVudHMgaXNzdWVkIGZvciBlYWNoIHN0YXRlLiBUaGlzIG5ldyB2YXJpYWJsZSBpcyBjcmVhdGVkIGJ5IGFkZGluZyBudW1iZXIgb2YgY2FwaXRhbCBwdW5pc2htZW50cyBhbmQgbnVtYmVyIG9mIGxpZmUgaW1wcmlzb25tZW50cyBmb3IgdGhhdCBzdGF0ZS4NCg0KYGBge3J9DQphIDwtIG11dGF0ZShhLCBUb3RhbF9wdW5pc2htZW50cyA9IG5vX2NhcGl0YWxfcHVuaXNobWVudCArIG5vX2xpZmVfaW1wcmlzb25tZW50KQ0KaGVhZChhKQ0KYGBgDQoNCg0KIyMJU2NhbiBJIA0KDQoqIEluIHRoaXMgRGF0YXNldCB0aGVyZSBhcmUgbm8gbWlzc2luZyB2YWx1ZXMgb3IgaW5jb25zaXN0ZW5jaWVzLiBUaGV5IGFyZSBjaGVja2VkIHVzaW5nIHRoZSBmb2xsb3dpbmcgUiBjb2RlLg0KKiBBcyB0aGVyZSBhcmUgbm8gbWlzc2luZyB2YWx1ZXMgYW5kIGluY29uc2lzdGVuY2llcywgdGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgdG8gcGVyZm9ybSBhbnkgYWN0aW9ucyBpbiB0aGlzIHN0ZXAuDQoNCmBgYHtyfQ0Kc3VtKGlzLm5hKGEpKQ0Kc3VtKGlzLm5hbihhJGNvbnZpY3RzKSkNCnN1bShpcy5uYW4oYSR1bmRlcl90cmlhbCkpDQpzdW0oaXMubmFuKGEkZGV0ZW51ZXMpKQ0Kc3VtKGlzLm5hbihhJG90aGVycykpDQpzdW0oaXMubmFuKGEkbm9fY2FwaXRhbF9wdW5pc2htZW50KSkNCnN1bShpcy5uYW4oYSRub19saWZlX2ltcHJpc29ubWVudCkpDQpzdW0oaXMubmFuKGEkbm9fZXhlY3V0ZWQpKQ0Kc3VtKGlzLm5hbihhJFRvdGFsX3B1bmlzaG1lbnRzKSkNCmBgYA0KDQoNCiMjCVNjYW4gSUkNCg0KKiBJbiB0aGlzIHN0ZXAgYm94cGxvdCBmb3IgYWxsIHRoZSBudW1lcmljIHZhcmlhYmxlcyBpcyBwbG90dGVkIHRvIGNoZWNrIGZvciBvdXRsaWVycy4NCg0KKiBUaGVuLCBhIGNhcCBmdW5jdGlvbiBpcyB3cml0dGVuIGFuZCBhcHBsaWVkIHRvIGFsbCB0aGUgdmFyaWFibGVzIHdpdGggb3V0bGllcnMgdG8gcmVwbGFjZSB0aGUgdmFsdWVzIG91dHNpZGUgdGhlIGxvd2VyIGxpbWl0IHdpdGggNXRoIHBlcmNlbnRpbGUgYW5kIHRoZSB2YWx1ZXMgdGhhdCBsaWUgYWJvdmUgdGhlIHVwcGVybGltaXQgd2l0aCA5NXRoIHBlcmNlbnRpbGUuDQoNCiogQWxsIHRoZSBudW1lcmljIHZhcmlhYmxlcyB3aXRoIG91dGxpZXJzIGFyZSBzdWJzZXR0ZWQgYW5kIHBsYWNlZCBpbiB0aGUgdmFyaWFibGUgImFfc3ViIi4gVGhlbiwgdGhlIGNhcCBmdW5jdGlvbiBpcyBhcHBsaWVkIG9uIHRoZSAiYV9zdWIiIHVzaW5nIHNhcHBseSgpIGZ1bmN0aW9uLg0KDQoqIEFsbCB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGVzIGFyZSBzdWJzZXR0ZWQgYW5kIHBsYWNlZCBpbiBhIHZhcmlhYmxlIG5hbWVkICJkMSIuIFRoZW4sIHRoZSBjYXBwZWQgdmFyaWFibGVzIGFuZCBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgYXJlIGNvbWJpbmVkIHVzaW5nIGNiaW5kKCkgZnVuY3Rpb24gYW5kIHN0b3JlZCBpbiAiZDIiLg0KDQoqIE5vdyB0aGUgYm94cGxvdCBpcyBhZ2FpbiBwbG90dGVkIGZvciBhbGwgdGhlIG51bWVyaWMgdmFyaWFibGVzIGluIG9yZGVyIHRvIGNoZWNrIHdoZXRoZXIgdGhlIG91dGxpZXJzIGFyZSByZW1vdmVkIG9yIG5vdC4NCg0KI0JlZm9yZSBDYXBwaW5nDQoNCmBgYHtyfQ0KDQpib3hwbG90KGEkY29udmljdHMsbWFpbj0iQm94UGxvdCBvZiBjb252aWN0cyIpDQpib3hwbG90KGEkdW5kZXJfdHJpYWwsbWFpbj0iQm94UGxvdCBvZiB1bmRlcl90cmlhbCIpDQpib3hwbG90KGEkZGV0ZW51ZXMsbWFpbj0iQm94UGxvdCBvZiBkZXRlbnVlcyIpDQpib3hwbG90KGEkb3RoZXJzLG1haW49IkJveFBsb3Qgb2Ygb3RoZXJzIikNCmJveHBsb3QoYSRub19jYXBpdGFsX3B1bmlzaG1lbnQsbWFpbj0iQm94UGxvdCBvZiBub19jYXBpdGFsX3B1bmlzaG1lbnQiKQ0KYm94cGxvdChhJG5vX2xpZmVfaW1wcmlzb25tZW50LG1haW49IkJveFBsb3Qgb2Ygbm9fbGlmZV9pbXByaXNvbm1lbnQiKQ0KYm94cGxvdChhJG5vX2V4ZWN1dGVkLG1haW49IkJveFBsb3Qgb2Ygbm9fZXhlY3V0ZWQiKQ0KYm94cGxvdChhJFRvdGFsX3B1bmlzaG1lbnRzLG1haW49IkJveFBsb3Qgb2YgVG90YWxfcHVuaXNobWVudHMiKQ0KDQpjYXAgPC0gZnVuY3Rpb24oeCl7DQogIHF1YW50aWxlcyA8LSBxdWFudGlsZSggeCwgYyguMDUsIDAuMjUsIDAuNzUsIC45NSApICkNCiAgeFsgeCA8IHF1YW50aWxlc1syXSAtIDEuNSpJUVIoeCkgXSA8LSBxdWFudGlsZXNbMV0NCiAgeFsgeCA+IHF1YW50aWxlc1szXSArIDEuNSpJUVIoeCkgXSA8LSBxdWFudGlsZXNbNF0NCiAgeA0KfQ0KDQphX3N1YjwtYSAlPiUgZHBseXI6OnNlbGVjdChjb252aWN0cyx1bmRlcl90cmlhbCxkZXRlbnVlcyxvdGhlcnMsbm9fY2FwaXRhbF9wdW5pc2htZW50LG5vX2xpZmVfaW1wcmlzb25tZW50LG5vX2V4ZWN1dGVkLFRvdGFsX3B1bmlzaG1lbnRzKQ0Kc3VtbWFyeShhX3N1YikNCmFfY2FwPC1zYXBwbHkoYV9zdWIsRlVOID0gY2FwKQ0Kc3VtbWFyeShhX2NhcCkNCmQxPC1hWywxOjVdDQpkMjwtY2JpbmQoZDEsYV9jYXApDQpoZWFkKGQyKQ0KDQpgYGANCg0KI0FmdGVyIENhcHBpbmcNCg0KYGBge3J9DQpib3hwbG90KGQyJGNvbnZpY3RzLG1haW49IkJveFBsb3Qgb2YgY29udmljdHMiKQ0KYm94cGxvdChkMiR1bmRlcl90cmlhbCxtYWluPSJCb3hQbG90IG9mIHVuZGVyX3RyaWFsIikNCmJveHBsb3QoZDIkZGV0ZW51ZXMsbWFpbj0iQm94UGxvdCBvZiBkZXRlbnVlcyIpDQpib3hwbG90KGQyJG90aGVycyxtYWluPSJCb3hQbG90IG9mIG90aGVycyIpDQpib3hwbG90KGQyJG5vX2NhcGl0YWxfcHVuaXNobWVudCxtYWluPSJCb3hQbG90IG9mIG5vX2NhcGl0YWxfcHVuaXNobWVudCIpDQpib3hwbG90KGQyJG5vX2xpZmVfaW1wcmlzb25tZW50LG1haW49IkJveFBsb3Qgb2Ygbm9fbGlmZV9pbXByaXNvbm1lbnQiKQ0KYm94cGxvdChkMiRub19leGVjdXRlZCxtYWluPSJCb3hQbG90IG9mIG5vX2V4ZWN1dGVkIikNCmJveHBsb3QoZDIkVG90YWxfcHVuaXNobWVudHMsbWFpbj0iQm94UGxvdCBvZiBUb3RhbF9wdW5pc2htZW50cyIpDQoNCmBgYA0KDQoNCiMjCVRyYW5zZm9ybSANCg0KKiBJbiB0aGlzIHN0ZXAgRGF0YXRyYW5zZm9ybWF0aW9uIHRlY2huaXF1ZSBpcyBhcHBsaWVkIHRvIHRoZSAiVG90YWxfcHVuaXNobWVudHMiIHZhcmlibGUuDQoNCiogQXQgZmlyc3QgdGhlIGhpc3RvZ3JhbSBmb3IgdGhpcyB2YXJpYWJsZSBpcyBwbG90dGVkIHRvIGNoZWNrIGZvciBza2V3ZW5lc3MuIFRoZSBoaXN0b2dyYW0gaXMgYSByaWdodCBza2V3ZWQuDQoNCiogSGVuY2UsIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIHRlY2huaXF1ZSBpcyBhcHBsaWVkIHRvIHJlZHVjZSB0aGUgc2tld2VuZXNzIGFuZCBtYWtlIGl0IG1vcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuDQoNCiogRmluYWxseSwgdGhlIGhpc3RvZ3JhbSBpcyBwbG90dGVkIHRvIGRpc3BsYXkgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgIlRvdGFsX3B1bmlzaG1lbnRzIiB2YXJpYWJsZS4NCg0KDQpgYGB7cn0NCmhpc3QoZDIkVG90YWxfcHVuaXNobWVudHMpDQpkMiRUb3RhbF9wdW5pc2htZW50cyA8LSBsb2coZDIkVG90YWxfcHVuaXNobWVudHMpDQpoaXN0KGQyJFRvdGFsX3B1bmlzaG1lbnRzKQ0KYGBgDQoNCjxicj4NCjxicj4NCg==