Report timestamp: 2019-09-22 03:15:07

Contact: goran.milovanovic_ext at wikimedia.de


Introduction

The Wikidata Quality Report presents an assessment of the quality of Wikidata items based on the Objective Revision Evaluation Services - ORES machine learning system predictions.

The Grading Scheme for Wikidata items used in this report encompasses five categories (A, B, C, D, and E) of decreasing quality.

This Report uses the Wikidata Concepts Monitor - WDCM re-use statistics data in combination with ORES prediction scores to provide a more comprehensive picture of data quality in Wikidata. The WDCM system tracks the Wikidata re-use across the Wikimedia projects and assings each item a unique re-use statistic. The WDCM re-use statistic is defined as the number of mentions of an item across the Wikimedia projects: multiple uses of the same item, in any of the several usage aspects (see: wbc_entity_usage), on the same page, and in the same project are counted as one item mention. For example, the usage statistic for Q42 is thus the sum of the count of all pages across all Wikimedia projects that make at least one use of it - and irrespective of the usage aspect.

All data sets upon which this Report is based are publicly available from the following URL:

https://analytics.wikimedia.org/datasets/wmde-analytics-engineering/Wikidata/WD_DataQuality/

library(tidyverse)
library(ggrepel)

Overview

stats <- read.csv('https://analytics.wikimedia.org/datasets/wmde-analytics-engineering/Wikidata/WD_DataQuality/dataQuality_Stats.csv', 
                  header = T, 
                  check.names = F, 
                  stringsAsFactors = F)

This Report finds a total number of 63084587 items currently in Wikidata, of which 58558373 (92.83%) have received a quality assessment from the ORES system. Out of the total number of 63084587 items, WDCM finds that 28658550 (45.43%) are re-used across the Wikimedia projects. The latest ORES prediction run upon which this Report is based was on 2019-09-16 13:17:00, while the latest update of the WDCM re-use statistics happend on 2019-09-21 21:32:20 UTC. The report is based on the 2019-08 snapshot of the wmf.mediawiki_history table in the WMD Data Lake.

Quality distribution for all items

Looking at all of the 58558373 Wikidata items that have received a quality score from ORES, we find the following:

dataA <- read.csv('https://analytics.wikimedia.org/datasets/wmde-analytics-engineering/Wikidata/WD_DataQuality/dataQuality_oresScoresDistribution.csv',
                 header = T,
                 check.names = F,
                 stringsAsFactors = F,
                 row.names = 1)
colnames(dataA) <- c('Quality', 'Number of items')
dataA$Percent <- round(dataA$`Number of items`/sum(dataA$`Number of items`)*100, 2)
DT::datatable(dataA, 
              options = list(
                width = '100%',
                columnDefs = list(list(className = 'dt-center', targets = "_all"))
              ),
              rownames = FALSE
    )

Quality distribution for the top 10,000 re-used items

Looking only at the top 10,000 most re-used items across the Wikimedia projects according to the WDCM, we find the following distribution of quality:

dataB <- read.csv('https://analytics.wikimedia.org/datasets/wmde-analytics-engineering/Wikidata/WD_DataQuality/dataQuality_oresScoresDistribution_10000.csv',
                 header = T,
                 check.names = F,
                 stringsAsFactors = F,
                 row.names = 1)
colnames(dataB) <- c('Quality', 'Number of items')
dataB$Percent <- round(dataB$`Number of items`/sum(dataB$`Number of items`)*100, 2)
DT::datatable(dataB, 
              options = list(
                width = '100%',
                columnDefs = list(list(className = 'dt-center', targets = "_all"))
              ),
              rownames = FALSE
    )

Quality distribution: top 10K most used items vs all items

If we would compare the quality distribution of all items to the top 10,000 re-used items across the Wikimedia projects, this is the picture that would emerge:

qualFrame <- data.frame(
  Quality = c("A", "B", "C", "D", "E"),
  All = dataA$Percent,
  Top10K = dataB$Percent, 
  stringsAsFactors = F)
qualFrame <- gather(qualFrame, 
                    key = 'Items',
                    value = 'Percent', 
                    2:3)
ggplot(qualFrame, 
       aes(x = Quality, 
           y = Percent, 
           group = Items, 
           color = Items, 
           fill = Items, 
           label = paste0(Percent, " %"))) + 
  geom_line() + 
  geom_point(size = 2.5) +
  geom_point(size = 2, color = "white") + 
  geom_text_repel(show.legend = FALSE) + 
  scale_colour_manual(values= c("darkblue", "darkred")) +
  theme_bw() +
  theme(panel.background = element_rect(color = "white", fill = "white")) +
      theme(panel.border = element_blank()) +
      theme(panel.grid = element_blank()) + 
      theme(legend.text = element_text(size = 14)) +
      theme(legend.title = element_text(size = 15))


Item quality and re-use

Item re-use w. outliers

In the following chart we present the WDCM re-use statistics (vertical axis, logarithmic scale) for all Wikidata items respective of their predicted quality score (A, B, C, D, or E). The horizontal lines in the boxplots represent the median values of the re-use statistics, while their lower and upper limits represent the 1st (.25) and the 3rd (.75) quartile, respectively. The free floating points above (and sometimes bellow) the boxes are outliers: they represent the Wikidata items used suspiciously more (or less) than other items in the same quality class. Once again: the outliers in this boxplot are detected for each quality class (A, B, C, D, or E) separately.

Item re-use w/o outliers

Now we present the same data except for the outliers that have been removed. We can see that item quality is correlated with item re-use: the lower the item quality, the less the item seems to be re-used across the Wikimedia projects. The vertical lines above and bellow the boxes extend to Q3+1.5*IQR and Q1-1.5*IQR respectively, where IQR is the Interquartile range; the outliers, if any remained here, would be shown bellow and above these limits.

Diversity of item re-use vs item quality

The following chart provides an in-depth insight into the relationship between item quality (as predicted by ORES) and item re-use across the Wikimedia projects (as assessed by WDCM). Each bubble represents (potentially) many Wikidata items. Let’s focus on a single quality class, A for example. Any A class item could be re-used 1, 2, 3, .., n, etc. times across the projects. Each bubble in this chart represents all Wikidata items in the respective quality class that share the same value of the re-use statistic (y-axis, log scale). The size of the bubble corresponds to the number of items that it represents (i.e. the number of items that share the same value of the re-use statistic). From the chart we can observe the following: the lower the item quality class (A > B > C > D > E), the lesser the number of unique re-use statistic values that the items from the respective class take.

The diversity of the unique values of the re-use statistic is much higher in the A quality class, for example, than in the D or E classes (where the re-use statistic takes only three unique values). This might be a consequence of (a) more human or human|machine engagement in the re-use of the top quality A items across the projects and (b) more pure machine engagement in the re-use of the D and E lower quality items.


Critical Wikidata items

We provide a list of all Wikidata items scored as imperfect (i.e. found in the B, C, D, or E quality class) that are also found as outliers in terms of their re-use (i.e. being used suspiciously more than all other Wikidata items across the Wikimedia projects). The list encompasses the top 1,000 most re-used items of imperfect quality from each quality class that are recognized as outliers in terms of their re-use. The items from the D and E classes in this list are probably the most critical Wikidata items and need to be improved immediately.

critical <- read.csv('https://analytics.wikimedia.org/datasets/wmde-analytics-engineering/Wikidata/WD_DataQuality/positiveOutliers.csv',
                 header = T,
                 check.names = F,
                 stringsAsFactors = F,
                 row.names = 1)
colnames(critical) <- c('Item', 'Quality', 'Re-use')
critical$url <- paste0('https://www.wikidata.org/wiki/', critical$Item)
critical$Item <- paste0('<a href="', critical$url, '" target="_blank">', critical$Item, "</a>")
critical$url <- NULL
critical <- critical %>% 
  dplyr::arrange(desc(Quality), desc(`Re-use`))
DT::datatable(critical, 
              options = list(
                pageLength = 100, 
                width = '100%',
                columnDefs = list(list(className = 'dt-center', targets = "_all"))
              ),
              escape = FALSE,
              rownames = FALSE
    )

We wish to thank all the member of the ORES team for their help in the production of this report.


LS0tCnRpdGxlOiBXaWtpZGF0YSBRdWFsaXR5IFJlcG9ydAphdXRob3I6Ci0gbmFtZTogR29yYW4gUy4gTWlsb3Zhbm92acSHCiAgYWZmaWxpYXRpb246IFdpa2ltZWRpYSBEZXV0c2NobGFuZCwgRGF0YSBTY2llbnRpc3QKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIHRoZW1lOiBzcGFjZWxhYgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICB0b2NfZGVwdGg6IDIKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMgotLS0KIVtdKFdpa2lkYXRhLWxvZ28tZW4ucG5nKQoKKioqKioqCgpSZXBvcnQgdGltZXN0YW1wOiAqKmByIGFzLmNoYXJhY3RlcihTeXMudGltZSgpKWAqKgoKCkNvbnRhY3Q6IF9nb3Jhbi5taWxvdmFub3ZpY19leHQgYXQgd2lraW1lZGlhLmRlXwoKKioqKioqCgojIEludHJvZHVjdGlvbgoKVGhlICoqV2lraWRhdGEgUXVhbGl0eSBSZXBvcnQqKiBwcmVzZW50cyBhbiBhc3Nlc3NtZW50IG9mIHRoZSBbcXVhbGl0eSBvZiBXaWtpZGF0YSBpdGVtc10oaHR0cHM6Ly93d3cud2lraWRhdGEub3JnL3dpa2kvV2lraWRhdGE6SXRlbV9xdWFsaXR5KSBiYXNlZCBvbiB0aGUgW09iamVjdGl2ZSBSZXZpc2lvbiBFdmFsdWF0aW9uIFNlcnZpY2VzICAtIE9SRVNdKGh0dHBzOi8vd3d3Lm1lZGlhd2lraS5vcmcvd2lraS9PUkVTKSBtYWNoaW5lIGxlYXJuaW5nIHN5c3RlbSBwcmVkaWN0aW9ucy4KClRoZSBbR3JhZGluZyBTY2hlbWVdKGh0dHBzOi8vd3d3Lndpa2lkYXRhLm9yZy93aWtpL1dpa2lkYXRhOkl0ZW1fcXVhbGl0eSNHcmFkaW5nX3NjaGVtZSkgZm9yIFdpa2lkYXRhIGl0ZW1zIHVzZWQgaW4gdGhpcyByZXBvcnQgZW5jb21wYXNzZXMgZml2ZSBjYXRlZ29yaWVzICgqKkEqKiwgKipCKiosICoqQyoqLCAqKkQqKiwgYW5kICoqRSoqKSBvZiBkZWNyZWFzaW5nIHF1YWxpdHkuIAoKVGhpcyBSZXBvcnQgdXNlcyB0aGUgW1dpa2lkYXRhIENvbmNlcHRzIE1vbml0b3IgLSBXRENNXShodHRwczovL3dpa2l0ZWNoLndpa2ltZWRpYS5vcmcvd2lraS9XaWtpZGF0YV9Db25jZXB0c19Nb25pdG9yKSByZS11c2Ugc3RhdGlzdGljcyBkYXRhIGluIGNvbWJpbmF0aW9uIHdpdGggT1JFUyBwcmVkaWN0aW9uIHNjb3JlcyB0byBwcm92aWRlIGEgbW9yZSBjb21wcmVoZW5zaXZlIHBpY3R1cmUgb2YgZGF0YSBxdWFsaXR5IGluIFdpa2lkYXRhLiBUaGUgV0RDTSBzeXN0ZW0gdHJhY2tzIHRoZSBXaWtpZGF0YSByZS11c2UgYWNyb3NzIHRoZSBXaWtpbWVkaWEgcHJvamVjdHMgYW5kIGFzc2luZ3MgZWFjaCBpdGVtIGEgdW5pcXVlIHJlLXVzZSBzdGF0aXN0aWMuIFRoZSBXRENNIHJlLXVzZSBzdGF0aXN0aWMgaXMgZGVmaW5lZCBhcyB0aGUgbnVtYmVyIG9mIF9tZW50aW9uc18gb2YgYW4gaXRlbSBhY3Jvc3MgdGhlIFdpa2ltZWRpYSBwcm9qZWN0czogbXVsdGlwbGUgdXNlcyBvZiB0aGUgc2FtZSBpdGVtLCBpbiBhbnkgb2YgdGhlIHNldmVyYWwgdXNhZ2UgYXNwZWN0cyAoc2VlOiBbd2JjX2VudGl0eV91c2FnZV0oaHR0cHM6Ly93d3cubWVkaWF3aWtpLm9yZy93aWtpL1dpa2liYXNlL1NjaGVtYS93YmNfZW50aXR5X3VzYWdlKSksIG9uIHRoZSBzYW1lIHBhZ2UsIGFuZCBpbiB0aGUgc2FtZSBwcm9qZWN0IGFyZSBjb3VudGVkIGFzIF9vbmVfIGl0ZW0gbWVudGlvbi4gRm9yIGV4YW1wbGUsIHRoZSB1c2FnZSBzdGF0aXN0aWMgZm9yIFtRNDJdKGh0dHBzOi8vd3d3Lndpa2lkYXRhLm9yZy93aWtpL1E0MikgaXMgdGh1cyB0aGUgc3VtIG9mIHRoZSBjb3VudCBvZiBhbGwgcGFnZXMgYWNyb3NzIGFsbCBXaWtpbWVkaWEgcHJvamVjdHMgdGhhdCBtYWtlIGF0IGxlYXN0IG9uZSB1c2Ugb2YgaXQgLSBhbmQgaXJyZXNwZWN0aXZlIG9mIHRoZSB1c2FnZSBhc3BlY3QuCgpBbGwgZGF0YSBzZXRzIHVwb24gd2hpY2ggdGhpcyBSZXBvcnQgaXMgYmFzZWQgYXJlIHB1YmxpY2x5IGF2YWlsYWJsZSBmcm9tIHRoZSBmb2xsb3dpbmcgVVJMOgoKW2h0dHBzOi8vYW5hbHl0aWNzLndpa2ltZWRpYS5vcmcvZGF0YXNldHMvd21kZS1hbmFseXRpY3MtZW5naW5lZXJpbmcvV2lraWRhdGEvV0RfRGF0YVF1YWxpdHkvXShodHRwczovL2FuYWx5dGljcy53aWtpbWVkaWEub3JnL2RhdGFzZXRzL3dtZGUtYW5hbHl0aWNzLWVuZ2luZWVyaW5nL1dpa2lkYXRhL1dEX0RhdGFRdWFsaXR5LykKCmBgYHtyIGVjaG8gPSBUfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3JlcGVsKQpgYGAKCioqKioqKgoKIyBPdmVydmlldwoKYGBge3IgZWNobyA9IFR9CnN0YXRzIDwtIHJlYWQuY3N2KCdodHRwczovL2FuYWx5dGljcy53aWtpbWVkaWEub3JnL2RhdGFzZXRzL3dtZGUtYW5hbHl0aWNzLWVuZ2luZWVyaW5nL1dpa2lkYXRhL1dEX0RhdGFRdWFsaXR5L2RhdGFRdWFsaXR5X1N0YXRzLmNzdicsIAogICAgICAgICAgICAgICAgICBoZWFkZXIgPSBULCAKICAgICAgICAgICAgICAgICAgY2hlY2submFtZXMgPSBGLCAKICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEYpCgpgYGAKClRoaXMgUmVwb3J0IGZpbmRzIGEgdG90YWwgbnVtYmVyIG9mICoqYHIgc3RhdHMkdG90YWxfbl9pdGVtc2AqKiBpdGVtcyBjdXJyZW50bHkgaW4gV2lraWRhdGEsIG9mIHdoaWNoICoqYHIgc3RhdHMkdG90YWxfbl9pdGVtc193aXRoX09SRVNfcHJlZGljdGlvbl9maW5hbGAqKiAoYHIgcGFzdGUwKHJvdW5kKHN0YXRzJHRvdGFsX25faXRlbXNfd2l0aF9PUkVTX3ByZWRpY3Rpb25fZmluYWwvc3RhdHMkdG90YWxfbl9pdGVtcyoxMDAsIDIpLCAiJSkiKWAgaGF2ZSByZWNlaXZlZCBhIHF1YWxpdHkgYXNzZXNzbWVudCBmcm9tIHRoZSBPUkVTIHN5c3RlbS4gT3V0IG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgKipgciBzdGF0cyR0b3RhbF9uX2l0ZW1zYCoqIGl0ZW1zLCBXRENNIGZpbmRzIHRoYXQgKipgciBzdGF0cyR0b3RhbF9uX2l0ZW1zX3VzZWRgKiogKGByIHBhc3RlMChyb3VuZChzdGF0cyR0b3RhbF9uX2l0ZW1zX3VzZWQvc3RhdHMkdG90YWxfbl9pdGVtcyoxMDAsIDIpLCAiJSkiKWAgYXJlIHJlLXVzZWQgYWNyb3NzIHRoZSBXaWtpbWVkaWEgcHJvamVjdHMuIApUaGUgbGF0ZXN0IE9SRVMgcHJlZGljdGlvbiBydW4gdXBvbiB3aGljaCB0aGlzIFJlcG9ydCBpcyBiYXNlZCB3YXMgb24gKipgciBzdGF0cyRPUkVTX3RpbWVzdGFtcGAqKiwgd2hpbGUgdGhlIGxhdGVzdCB1cGRhdGUgb2YgdGhlIFdEQ00gcmUtdXNlIHN0YXRpc3RpY3MgaGFwcGVuZCBvbiAqKmByIHN0YXRzJFdEQ01fdGltZXN0YW1wYCoqLiBUaGUgcmVwb3J0IGlzIGJhc2VkIG9uIHRoZSBgMjAxOS0wOGAgc25hcHNob3Qgb2YgdGhlIFt3bWYubWVkaWF3aWtpX2hpc3RvcnldKGh0dHBzOi8vd2lraXRlY2gud2lraW1lZGlhLm9yZy93aWtpL0FuYWx5dGljcy9EYXRhX0xha2UvRWRpdHMvTWVkaWF3aWtpX2hpc3RvcnkpIHRhYmxlIGluIHRoZSBbV01EIERhdGEgTGFrZV0oaHR0cHM6Ly93aWtpdGVjaC53aWtpbWVkaWEub3JnL3dpa2kvQW5hbHl0aWNzL0RhdGFfTGFrZSkuCgojIyBRdWFsaXR5IGRpc3RyaWJ1dGlvbiBmb3IgYWxsIGl0ZW1zCgpMb29raW5nIGF0IGFsbCBvZiB0aGUgKipgciBzdGF0cyR0b3RhbF9uX2l0ZW1zX3dpdGhfT1JFU19wcmVkaWN0aW9uX2ZpbmFsYCoqIFdpa2lkYXRhIGl0ZW1zIHRoYXQgaGF2ZSByZWNlaXZlZCBhIHF1YWxpdHkgc2NvcmUgZnJvbSBPUkVTLCB3ZSBmaW5kIHRoZSBmb2xsb3dpbmc6CgpgYGB7ciBlY2hvID0gVH0KZGF0YUEgPC0gcmVhZC5jc3YoJ2h0dHBzOi8vYW5hbHl0aWNzLndpa2ltZWRpYS5vcmcvZGF0YXNldHMvd21kZS1hbmFseXRpY3MtZW5naW5lZXJpbmcvV2lraWRhdGEvV0RfRGF0YVF1YWxpdHkvZGF0YVF1YWxpdHlfb3Jlc1Njb3Jlc0Rpc3RyaWJ1dGlvbi5jc3YnLAogICAgICAgICAgICAgICAgIGhlYWRlciA9IFQsCiAgICAgICAgICAgICAgICAgY2hlY2submFtZXMgPSBGLAogICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGLAogICAgICAgICAgICAgICAgIHJvdy5uYW1lcyA9IDEpCmNvbG5hbWVzKGRhdGFBKSA8LSBjKCdRdWFsaXR5JywgJ051bWJlciBvZiBpdGVtcycpCmRhdGFBJFBlcmNlbnQgPC0gcm91bmQoZGF0YUEkYE51bWJlciBvZiBpdGVtc2Avc3VtKGRhdGFBJGBOdW1iZXIgb2YgaXRlbXNgKSoxMDAsIDIpCkRUOjpkYXRhdGFibGUoZGF0YUEsIAogICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgd2lkdGggPSAnMTAwJScsCiAgICAgICAgICAgICAgICBjb2x1bW5EZWZzID0gbGlzdChsaXN0KGNsYXNzTmFtZSA9ICdkdC1jZW50ZXInLCB0YXJnZXRzID0gIl9hbGwiKSkKICAgICAgICAgICAgICApLAogICAgICAgICAgICAgIHJvd25hbWVzID0gRkFMU0UKICAgICkKYGBgCgojIyBRdWFsaXR5IGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHRvcCAxMCwwMDAgcmUtdXNlZCBpdGVtcwoKTG9va2luZyBvbmx5IGF0IHRoZSB0b3AgMTAsMDAwIG1vc3QgcmUtdXNlZCBpdGVtcyBhY3Jvc3MgdGhlIFdpa2ltZWRpYSBwcm9qZWN0cyBhY2NvcmRpbmcgdG8gdGhlIFdEQ00sIHdlIGZpbmQgdGhlIGZvbGxvd2luZyBkaXN0cmlidXRpb24gb2YgcXVhbGl0eToKCmBgYHtyIGVjaG8gPSBUfQpkYXRhQiA8LSByZWFkLmNzdignaHR0cHM6Ly9hbmFseXRpY3Mud2lraW1lZGlhLm9yZy9kYXRhc2V0cy93bWRlLWFuYWx5dGljcy1lbmdpbmVlcmluZy9XaWtpZGF0YS9XRF9EYXRhUXVhbGl0eS9kYXRhUXVhbGl0eV9vcmVzU2NvcmVzRGlzdHJpYnV0aW9uXzEwMDAwLmNzdicsCiAgICAgICAgICAgICAgICAgaGVhZGVyID0gVCwKICAgICAgICAgICAgICAgICBjaGVjay5uYW1lcyA9IEYsCiAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEYsCiAgICAgICAgICAgICAgICAgcm93Lm5hbWVzID0gMSkKY29sbmFtZXMoZGF0YUIpIDwtIGMoJ1F1YWxpdHknLCAnTnVtYmVyIG9mIGl0ZW1zJykKZGF0YUIkUGVyY2VudCA8LSByb3VuZChkYXRhQiRgTnVtYmVyIG9mIGl0ZW1zYC9zdW0oZGF0YUIkYE51bWJlciBvZiBpdGVtc2ApKjEwMCwgMikKRFQ6OmRhdGF0YWJsZShkYXRhQiwgCiAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICB3aWR0aCA9ICcxMDAlJywKICAgICAgICAgICAgICAgIGNvbHVtbkRlZnMgPSBsaXN0KGxpc3QoY2xhc3NOYW1lID0gJ2R0LWNlbnRlcicsIHRhcmdldHMgPSAiX2FsbCIpKQogICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgcm93bmFtZXMgPSBGQUxTRQogICAgKQpgYGAKCiMjIFF1YWxpdHkgZGlzdHJpYnV0aW9uOiB0b3AgMTBLIG1vc3QgdXNlZCBpdGVtcyB2cyBhbGwgaXRlbXMKCklmIHdlIHdvdWxkIGNvbXBhcmUgdGhlIHF1YWxpdHkgZGlzdHJpYnV0aW9uIG9mIGFsbCBpdGVtcyB0byB0aGUgdG9wIDEwLDAwMCByZS11c2VkIGl0ZW1zIGFjcm9zcyB0aGUgV2lraW1lZGlhIHByb2plY3RzLCB0aGlzIGlzIHRoZSBwaWN0dXJlIHRoYXQgd291bGQgZW1lcmdlOgoKYGBge3IgZWNobyA9IFR9CnF1YWxGcmFtZSA8LSBkYXRhLmZyYW1lKAogIFF1YWxpdHkgPSBjKCJBIiwgIkIiLCAiQyIsICJEIiwgIkUiKSwKICBBbGwgPSBkYXRhQSRQZXJjZW50LAogIFRvcDEwSyA9IGRhdGFCJFBlcmNlbnQsIAogIHN0cmluZ3NBc0ZhY3RvcnMgPSBGKQpxdWFsRnJhbWUgPC0gZ2F0aGVyKHF1YWxGcmFtZSwgCiAgICAgICAgICAgICAgICAgICAga2V5ID0gJ0l0ZW1zJywKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICdQZXJjZW50JywgCiAgICAgICAgICAgICAgICAgICAgMjozKQpnZ3Bsb3QocXVhbEZyYW1lLCAKICAgICAgIGFlcyh4ID0gUXVhbGl0eSwgCiAgICAgICAgICAgeSA9IFBlcmNlbnQsIAogICAgICAgICAgIGdyb3VwID0gSXRlbXMsIAogICAgICAgICAgIGNvbG9yID0gSXRlbXMsIAogICAgICAgICAgIGZpbGwgPSBJdGVtcywgCiAgICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoUGVyY2VudCwgIiAlIikpKSArIAogIGdlb21fbGluZSgpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMi41KSArCiAgZ2VvbV9wb2ludChzaXplID0gMiwgY29sb3IgPSAid2hpdGUiKSArIAogIGdlb21fdGV4dF9yZXBlbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPSBjKCJkYXJrYmx1ZSIsICJkYXJrcmVkIikpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJ3aGl0ZSIpKSArCiAgICAgIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogICAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSArIAogICAgICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpKSArCiAgICAgIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKQpgYGAKCioqKioqKgoKIyBJdGVtIHF1YWxpdHkgYW5kIHJlLXVzZQoKIyMgSXRlbSByZS11c2Ugdy4gb3V0bGllcnMKCkluIHRoZSBmb2xsb3dpbmcgY2hhcnQgd2UgcHJlc2VudCB0aGUgV0RDTSByZS11c2Ugc3RhdGlzdGljcyAodmVydGljYWwgYXhpcywgbG9nYXJpdGhtaWMgc2NhbGUpIGZvciBhbGwgV2lraWRhdGEgaXRlbXMgcmVzcGVjdGl2ZSBvZiB0aGVpciBwcmVkaWN0ZWQgcXVhbGl0eSBzY29yZSAoQSwgQiwgQywgRCwgb3IgRSkuIFRoZSBob3Jpem9udGFsIGxpbmVzIGluIHRoZSBib3hwbG90cyByZXByZXNlbnQgdGhlIFttZWRpYW5dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01lZGlhbikgdmFsdWVzIG9mIHRoZSByZS11c2Ugc3RhdGlzdGljcywgd2hpbGUgdGhlaXIgbG93ZXIgYW5kIHVwcGVyIGxpbWl0cyByZXByZXNlbnQgdGhlIDFzdCAoLjI1KSBhbmQgdGhlIDNyZCAoLjc1KSBbcXVhcnRpbGVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1F1YXJ0aWxlKSwgcmVzcGVjdGl2ZWx5LiBUaGUgZnJlZSBmbG9hdGluZyBwb2ludHMgYWJvdmUgKGFuZCBzb21ldGltZXMgYmVsbG93KSB0aGUgYm94ZXMgYXJlICoqb3V0bGllcnMqKjogdGhleSByZXByZXNlbnQgdGhlIFdpa2lkYXRhIGl0ZW1zIHVzZWQgc3VzcGljaW91c2x5IG1vcmUgKG9yIGxlc3MpIHRoYW4gb3RoZXIgaXRlbXMgX2luIHRoZSBzYW1lIHF1YWxpdHkgY2xhc3NfLiBPbmNlIGFnYWluOiB0aGUgb3V0bGllcnMgaW4gdGhpcyBib3hwbG90IGFyZSBkZXRlY3RlZCBmb3IgZWFjaCBxdWFsaXR5IGNsYXNzIChBLCBCLCBDLCBELCBvciBFKSBzZXBhcmF0ZWx5LiAKCiFbXShodHRwczovL2FuYWx5dGljcy53aWtpbWVkaWEub3JnL2RhdGFzZXRzL3dtZGUtYW5hbHl0aWNzLWVuZ2luZWVyaW5nL1dpa2lkYXRhL1dEX0RhdGFRdWFsaXR5L3Njb3JlVXNhZ2VfQm94UGxvdF9nZ3Bsb3QyLnBuZykKCiMjIEl0ZW0gcmUtdXNlIHcvbyBvdXRsaWVycwoKTm93IHdlIHByZXNlbnQgdGhlIHNhbWUgZGF0YSBleGNlcHQgZm9yIHRoZSBvdXRsaWVycyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBXZSBjYW4gc2VlIHRoYXQgaXRlbSBxdWFsaXR5IGlzIGNvcnJlbGF0ZWQgd2l0aCBpdGVtIHJlLXVzZTogdGhlIGxvd2VyIHRoZSBpdGVtIHF1YWxpdHksIHRoZSBsZXNzIHRoZSBpdGVtIHNlZW1zIHRvIGJlIHJlLXVzZWQgYWNyb3NzIHRoZSBXaWtpbWVkaWEgcHJvamVjdHMuIFRoZSB2ZXJ0aWNhbCBsaW5lcyBhYm92ZSBhbmQgYmVsbG93IHRoZSBib3hlcyBleHRlbmQgdG8gYFEzKzEuNSpJUVJgIGFuZCBgUTEtMS41KklRUmAgcmVzcGVjdGl2ZWx5LCB3aGVyZSBgSVFSYCBpcyB0aGUgW0ludGVycXVhcnRpbGUgcmFuZ2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ludGVycXVhcnRpbGVfcmFuZ2UpOyB0aGUgb3V0bGllcnMsIGlmIGFueSByZW1haW5lZCBoZXJlLCB3b3VsZCBiZSBzaG93biBiZWxsb3cgYW5kIGFib3ZlIHRoZXNlIGxpbWl0cy4KCiFbXShodHRwczovL2FuYWx5dGljcy53aWtpbWVkaWEub3JnL2RhdGFzZXRzL3dtZGUtYW5hbHl0aWNzLWVuZ2luZWVyaW5nL1dpa2lkYXRhL1dEX0RhdGFRdWFsaXR5L3Njb3JlVXNhZ2VfQm94UGxvdF9nZ3Bsb3QyX291dGxpZXJzX3JlbW92ZWQucG5nKQoKIyMgRGl2ZXJzaXR5IG9mIGl0ZW0gcmUtdXNlIHZzIGl0ZW0gcXVhbGl0eQoKVGhlIGZvbGxvd2luZyBjaGFydCBwcm92aWRlcyBhbiBpbi1kZXB0aCBpbnNpZ2h0IGludG8gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGl0ZW0gcXVhbGl0eSAoYXMgcHJlZGljdGVkIGJ5IE9SRVMpIGFuZCBpdGVtIHJlLXVzZSBhY3Jvc3MgdGhlIFdpa2ltZWRpYSBwcm9qZWN0cyAoYXMgYXNzZXNzZWQgYnkgV0RDTSkuCkVhY2ggYnViYmxlIHJlcHJlc2VudHMgKHBvdGVudGlhbGx5KSBtYW55IFdpa2lkYXRhIGl0ZW1zLiBMZXQncyBmb2N1cyBvbiBhIHNpbmdsZSBxdWFsaXR5IGNsYXNzLCBgQWAgZm9yIGV4YW1wbGUuIEFueSBgQWAgY2xhc3MgaXRlbSBjb3VsZCBiZSByZS11c2VkIF8xXywgXzJfLCBfM18sIC4uLCBfbl8sIGV0Yy4gdGltZXMgYWNyb3NzIHRoZSBwcm9qZWN0cy4gRWFjaCBidWJibGUgaW4gdGhpcyBjaGFydCByZXByZXNlbnRzIF9hbGxfIFdpa2lkYXRhIGl0ZW1zIGluIHRoZSByZXNwZWN0aXZlIHF1YWxpdHkgY2xhc3MgdGhhdCBfc2hhcmUgdGhlIHNhbWUgdmFsdWUgb2YgdGhlIHJlLXVzZSBzdGF0aXN0aWNfICh5LWF4aXMsIGxvZyBzY2FsZSkuIFRoZSBzaXplIG9mIHRoZSBidWJibGUgY29ycmVzcG9uZHMgdG8gdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGl0IHJlcHJlc2VudHMgKGkuZS4gdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IHNoYXJlIHRoZSBzYW1lIHZhbHVlIG9mIHRoZSByZS11c2Ugc3RhdGlzdGljKS4KRnJvbSB0aGUgY2hhcnQgd2UgY2FuIG9ic2VydmUgdGhlIGZvbGxvd2luZzogdGhlIGxvd2VyIHRoZSBpdGVtIHF1YWxpdHkgY2xhc3MgKEEgPiBCID4gQyA+IEQgPiBFKSwgdGhlIGxlc3NlciB0aGUgbnVtYmVyIG9mIHVuaXF1ZSByZS11c2Ugc3RhdGlzdGljIHZhbHVlcyB0aGF0IHRoZSBpdGVtcyBmcm9tIHRoZSByZXNwZWN0aXZlIGNsYXNzIHRha2UuCgohW10oaHR0cHM6Ly9hbmFseXRpY3Mud2lraW1lZGlhLm9yZy9kYXRhc2V0cy93bWRlLWFuYWx5dGljcy1lbmdpbmVlcmluZy9XaWtpZGF0YS9XRF9EYXRhUXVhbGl0eS9zY29yZVVzYWdlX0JveFBsb3RfZ2dwbG90Ml9vdXRsaWVyc19yZW1vdmVkX3VuaXF1ZV92YWx1ZXMucG5nKQoKClRoZSBkaXZlcnNpdHkgb2YgdGhlIHVuaXF1ZSB2YWx1ZXMgb2YgdGhlIHJlLXVzZSBzdGF0aXN0aWMgaXMgbXVjaCBoaWdoZXIgaW4gdGhlIGBBYCBxdWFsaXR5IGNsYXNzLCBmb3IgZXhhbXBsZSwgdGhhbiBpbiB0aGUgYERgIG9yIGBFYCBjbGFzc2VzICh3aGVyZSB0aGUgcmUtdXNlIHN0YXRpc3RpYyB0YWtlcyBvbmx5IHRocmVlIHVuaXF1ZSB2YWx1ZXMpLiBUaGlzIF9taWdodF8gYmUgYSBjb25zZXF1ZW5jZSBvZiAoYSkgbW9yZSBodW1hbiBvciBodW1hbnxtYWNoaW5lIGVuZ2FnZW1lbnQgaW4gdGhlIHJlLXVzZSBvZiB0aGUgdG9wIHF1YWxpdHkgYEFgIGl0ZW1zIGFjcm9zcyB0aGUgcHJvamVjdHMgYW5kIChiKSBtb3JlIHB1cmUgbWFjaGluZSBlbmdhZ2VtZW50IGluIHRoZSByZS11c2Ugb2YgdGhlIGBEYCBhbmQgYEVgIGxvd2VyIHF1YWxpdHkgaXRlbXMuCgoqKioqKioKCiMgQ3JpdGljYWwgV2lraWRhdGEgaXRlbXMKCldlIHByb3ZpZGUgYSBbbGlzdF0oaHR0cHM6Ly9hbmFseXRpY3Mud2lraW1lZGlhLm9yZy9kYXRhc2V0cy93bWRlLWFuYWx5dGljcy1lbmdpbmVlcmluZy9XaWtpZGF0YS9XRF9EYXRhUXVhbGl0eS9wb3NpdGl2ZU91dGxpZXJzLmNzdikgb2YgYWxsIFdpa2lkYXRhIGl0ZW1zIHNjb3JlZCBhcyBpbXBlcmZlY3QgKGkuZS4gZm91bmQgaW4gdGhlIEIsIEMsIEQsIG9yIEUgcXVhbGl0eSBjbGFzcykgdGhhdCBhcmUgYWxzbyBmb3VuZCBhcyBvdXRsaWVycyBpbiB0ZXJtcyBvZiB0aGVpciByZS11c2UgKGkuZS4gYmVpbmcgdXNlZCBzdXNwaWNpb3VzbHkgbW9yZSB0aGFuIGFsbCBvdGhlciBXaWtpZGF0YSBpdGVtcyBhY3Jvc3MgdGhlIFdpa2ltZWRpYSBwcm9qZWN0cykuIFRoZSBsaXN0IGVuY29tcGFzc2VzIHRoZSB0b3AgMSwwMDAgbW9zdCByZS11c2VkIGl0ZW1zIG9mIGltcGVyZmVjdCBxdWFsaXR5IGZyb20gZWFjaCBxdWFsaXR5IGNsYXNzIHRoYXQgYXJlIHJlY29nbml6ZWQgYXMgb3V0bGllcnMgaW4gdGVybXMgb2YgdGhlaXIgcmUtdXNlLiBUaGUgaXRlbXMgZnJvbSB0aGUgYERgIGFuZCBgRWAgY2xhc3NlcyBpbiB0aGlzIGxpc3QgYXJlIHByb2JhYmx5IHRoZSBtb3N0IGNyaXRpY2FsIFdpa2lkYXRhIGl0ZW1zIGFuZCBuZWVkIHRvIGJlIGltcHJvdmVkIGltbWVkaWF0ZWx5LgoKYGBge3IgZWNobyA9IFR9CmNyaXRpY2FsIDwtIHJlYWQuY3N2KCdodHRwczovL2FuYWx5dGljcy53aWtpbWVkaWEub3JnL2RhdGFzZXRzL3dtZGUtYW5hbHl0aWNzLWVuZ2luZWVyaW5nL1dpa2lkYXRhL1dEX0RhdGFRdWFsaXR5L3Bvc2l0aXZlT3V0bGllcnMuY3N2JywKICAgICAgICAgICAgICAgICBoZWFkZXIgPSBULAogICAgICAgICAgICAgICAgIGNoZWNrLm5hbWVzID0gRiwKICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRiwKICAgICAgICAgICAgICAgICByb3cubmFtZXMgPSAxKQpjb2xuYW1lcyhjcml0aWNhbCkgPC0gYygnSXRlbScsICdRdWFsaXR5JywgJ1JlLXVzZScpCmNyaXRpY2FsJHVybCA8LSBwYXN0ZTAoJ2h0dHBzOi8vd3d3Lndpa2lkYXRhLm9yZy93aWtpLycsIGNyaXRpY2FsJEl0ZW0pCmNyaXRpY2FsJEl0ZW0gPC0gcGFzdGUwKCc8YSBocmVmPSInLCBjcml0aWNhbCR1cmwsICciIHRhcmdldD0iX2JsYW5rIj4nLCBjcml0aWNhbCRJdGVtLCAiPC9hPiIpCmNyaXRpY2FsJHVybCA8LSBOVUxMCmNyaXRpY2FsIDwtIGNyaXRpY2FsICU+JSAKICBkcGx5cjo6YXJyYW5nZShkZXNjKFF1YWxpdHkpLCBkZXNjKGBSZS11c2VgKSkKRFQ6OmRhdGF0YWJsZShjcml0aWNhbCwgCiAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gMTAwLCAKICAgICAgICAgICAgICAgIHdpZHRoID0gJzEwMCUnLAogICAgICAgICAgICAgICAgY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtY2VudGVyJywgdGFyZ2V0cyA9ICJfYWxsIikpCiAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICBlc2NhcGUgPSBGQUxTRSwKICAgICAgICAgICAgICByb3duYW1lcyA9IEZBTFNFCiAgICApCmBgYAoKKioqKioqCgpXZSB3aXNoIHRvIHRoYW5rIGFsbCB0aGUgbWVtYmVyIG9mIHRoZSBbT1JFU10oaHR0cHM6Ly93d3cubWVkaWF3aWtpLm9yZy93aWtpL09SRVMpIHRlYW0gZm9yIHRoZWlyIGhlbHAgaW4gdGhlIHByb2R1Y3Rpb24gb2YgdGhpcyByZXBvcnQuCgoqKioqKioKCgohW10oV2lraW1lZGlhX0RldXRzY2hsYW5kX0xvZ29fc21hbGwucG5nKSAKCgoKCgoKCgo=