# Library ----

library(dplyr)
library(iMRMC)
library(mvtnorm)
library(NestMRMC)
library(doParallel)
library(ggplot2)
library(gridExtra)

Figure 3 in the paper–histogram of number of positive and negative ROIs in

balance and unbalance design

Figure 4

Data description for Figure 4

  • The results in these files assume that the truth labels of positive and negative ROIs are fixed across the 10,000 simulations, hence fixed is in the name of the file.

  • In a balanced design each patient has approximately the same number of positive and negative ROIs. In an unbalanced design each patient tends to have unequal number of positive and negative ROIs. Note that for both designs the overall positive and negative ROIs number should be about the same, since the overall probabilities to be positive ROI and negative ROI are 0.5 and 0.5.

  • sim_result_blance_fixed_cov05062021.csv Contains the summarized statistics from 10,000 simulations results in 75 configurations for 100 patients and 10 ROIs per patient. All simulations use the balanced design and fixed truth labels. The 75 configurations are all the possible combinations of 3 AUC values (0.7, 0.8, 0.9), 5 covariance values (0.1, 0.25, 0.5, 0.75, 0.9) and 5 \(\rho\) values (0.1, 0.25, 0.5, 0.75, 0.9). The details of parameters settingts in the 75 configurations is available in the Table 1.

  • sim_result_unblance_fixed_cov05062021.csv Contains the summarized statistics from 10,000 simulations for 75 configurations for 100 patients and 10 ROIs per patient. All simulations use the unbalanced design and fixed truth labels.The details of parameters settings in the 75 configurations is available in the Table 1.

  • There are 16 columns in the both files. The detailed information for each column is given at the end of this file.

Figure 5

Data description for Figure 5

  • The results in these files assume that the truth labels of positive and negative ROIs are randomly assigned across the 10,000 simulations, hence unfixed is in the name of the file.

  • In a balanced design each patient has approximately the same number of positive and negative ROIs. In an unbalanced design each patient tends to have unequal number of positive and negative ROIs. Note that for both designs the overall positive and negative ROIs number should be about the same, since the overall probabilities to be positive ROI and negative ROI are 0.5 and 0.5.

  • sim_result_blance_unfixed_cov005182021.csv Contains the summarized statistics from 10,000 simulations results in 75 configurations for 100 patients and 10 ROIs per patient. All simulations use the balanced design and unfixed truth labels. The 75 configurations are all the possible combinations of 3 AUC values (0.7, 0.8, 0.9), 5 covariance values (0.1, 0.25, 0.5, 0.75, 0.9) and 5 \(\rho\) values (0.1, 0.25, 0.5, 0.75, 0.9). The details of parameters settingts in the 75 configurations is available in the Table 1.

  • sim_result_unblance_unfixed_cov05182021.csv Contains the summarized statistics from 10,000 simulations for 75 configurations for 100 patients and 10 ROIs per patient. All simulations use the unbalanced design and unfixed truth labels.The details of parameters settings in the 75 configurations is available in the Table 1.

  • There are 16 columns in the both files. The detailed information is provided in the end.

Figure 6

Data description for Figure 6

  • The results in these files assume that the truth labels of positive and negative ROIs are randomly assigned across the 10,000 simulations, hence unfixed is in the name of the file.

  • In a balanced design each patient has approximately the same number of positive and negative ROIs. In an unbalanced design each patient tends to have unequal number of positive and negative ROIs. Note that for both designs the overall positive and negative ROIs number should be about the same, since the overall probabilities to be positive ROI and negative ROI are 0.5 and 0.5.

  • sim_result_blance_unfixed_cov10042021.csv Contains the summarized statistics from 10,000 simulations results in 75 configurations for 100 patients and 10 ROIs per patient. All simulations use the balanced design and unfixed truth labels. The 75 configurations are all the possible combinations of 3 AUC values (0.7, 0.8, 0.9), 5 covariance values (0.1, 0.25, 0.5, 0.75, 0.9) and 5 \(\rho\) values (0.1, 0.25, 0.5, 0.75, 0.9). The details of parameters settingts in the 75 configurations is available in the Table 1.

  • sim_result_unblance_unfixed_cov10042021.csv Contains the summarized statistics from 10,000 simulations for 75 configurations for 100 patients and 10 ROIs per patient. All simulations use the unbalanced design and unfixed truth labels.The details of parameters settingts in the 75 configurations is available in the Table 1.

  • sim_Nancy_blance_unfixed_cov10042021.csv Contains the summarized statistics from 10,000 simulations for 75 configurations for 100 patients and 10 ROIs per patient based on Nancy’s method. All simulations use the balanced design and unfixed truth labels.The details of parameters settingts in the 75 configurations is available in the Table 1.

  • sim_Nancy_unblance_unfixed_cov10042021.csv Contains the summarized statistics from 10,000 simulations for 75 configurations for 100 patients and 10 ROIs per patient based on Nancy’s method. All simulations use the unbalanced design and unfixed truth labels.The details of parameters settingts in the 75 configurations is available in the Table 1.

  • There are 16 columns in the above files. The detailed information is provided in the end.

Columns in the above files

  • R1AUC_MEAN: The mean of reader 1 between-cases AUC estimates among 10,000 simulations.
  • R2AUC_MEAN: The mean of reader 2 between-cases AUC estimates among 10,000 simulations.
  • R1AUC_VAR: The variance of reader 1 between-cases AUC estimates among 10,000 simulations.
  • R2AUC_VAR: The variance of reader 2 between-cases AUC estimates among 10,000 simulations.
  • R1VAR_MEAN: The mean of reader 1 between-cases AUC variance estimates among 10,000 simulations.
  • R2VAR_MEAN: The mean of reader 2 between-cases AUC variance estimates among 10,000 simulations.
  • R1VAR_VAR: The variance of reader 1 between-cases AUC variance estimates among 10,000 simulations.
  • R2VAR_VAR: The variance of reader 2 between-cases AUC variance estimates among 10,000 simulations.
  • R1R2COV_MEAN: The mean of reader 1 and reader 2 between-cases AUC covariance estimates among 10,000 simulations.
  • R1R2COV_VAR: The variance of reader 1 and reader 2 between-cases AUC covariance estimates among 10,000 simulations.
  • TRUE_VAR_MEAN: The mean of between-cases AUC estimator’s theoretical variances among 10,000 simulations.
  • TRUE_VAR_VAR: The variance of between-cases AUC estimator’s theoretical variances among 10,000 simulations.
  • TRUE_COV_MEAN: The mean of between-cases AUC estimator’s theoretical covariances among 10,000 simulations.
  • TRUE_COV_VAR: The variance of between-cases AUC estimator’s theoretical covariances among 10,000 simulations.
  • R1R2COV_MC: The covariance between reader 1 and reader 2 between-cases AUC estimates among 10,000 simulations.
  • TRUE_AUC: The true AUC values for the simulated data.

75 configurations in the simulation

Error in `[.data.frame`(sim_result_blance, , 16:18) : 选择了未定义的列
LS0tDQp0aXRsZTogIkZpZ3VyZXMgZm9yIE5lc3RlZCBEYXRhIFBhcGVyIg0Kb3V0cHV0Og0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KLS0tDQpgYGB7cix3YXJuaW5nPUZBTFNFfQ0KIyBMaWJyYXJ5IC0tLS0NCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoaU1STUMpDQpsaWJyYXJ5KG12dG5vcm0pDQpsaWJyYXJ5KE5lc3RNUk1DKQ0KbGlicmFyeShkb1BhcmFsbGVsKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkRXh0cmEpDQpgYGANCg0KDQojIyBGaWd1cmUgMyBpbiB0aGUgcGFwZXItLWhpc3RvZ3JhbSBvZiBudW1iZXIgb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIFJPSXMgaW4gDQojIyBiYWxhbmNlIGFuZCB1bmJhbGFuY2UgZGVzaWduDQoNCmBgYHtyLCBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQoNCg0KIyMgQmFsYW5jZSBkZXNpZ24gDQpzaW0uY29uZmlnID0gc2ltdV9jb25maWcoZml4X2Rlc2lnbiA9IFQsc3RyZWFtID0gMSkNCmRhdGEgPSBkYXRhX01STUMoc2ltLmNvbmZpZykkZGF0YV9maW5hbA0KbnVtUk9JX2JhbGFuY2UgPSBBVUNfcGVyX3JlYWRlcl9uZXN0KGRhdGEpJG51bVJPSQ0KDQojIyBVbmJhbGFuY2UgZGVzaWduDQpzaW0uY29uZmlnID0gc2ltdV9jb25maWcoY29ycmVsYXRpb25fdCA9IDAuOCwgZml4X2Rlc2lnbiA9IFQsc3RyZWFtID0gMSkNCmRhdGEgPSBkYXRhX01STUMoc2ltLmNvbmZpZykkZGF0YV9maW5hbA0KbnVtUk9JX3VuYmFsYW5jZSA9IEFVQ19wZXJfcmVhZGVyX25lc3QoZGF0YSkkbnVtUk9JDQoNCm51bVJPSV9jb21iID0gY2JpbmQobnVtUk9JX2JhbGFuY2UsbnVtUk9JX3VuYmFsYW5jZSkNCg0KbnVtUk9JX2RmX25ldyA9IGRhdGEuZnJhbWUobnVtX1JPSSA9IGMobnVtUk9JX2NvbWJbMSxdLG51bVJPSV9jb21iWzIsXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICB0cnV0aCA9IGFzLmZhY3RvcihyZXAoYygicG9zIiwibmVnIiksZWFjaCA9IDIwMCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduID0gcmVwKHJlcChjKCJiYWxhbmNlIiwidW5iYWxhbmNlIiksZWFjaCA9IDEwMCksMikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAlPiUgYXMuZmFjdG9yKCkpDQoNCiMjIGhpc3RvZ3JhbQ0KZ2dwbG90KG51bVJPSV9kZl9uZXcsIGFlcyh4ID0gbnVtX1JPSSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gaW50ZXJhY3Rpb24oZGVzaWduLHRydXRoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGludGVyYWN0aW9uKGRlc2lnbix0cnV0aCkpKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX2hpc3RvZ3JhbShhbHBoYSA9IDAuNSxiaW5zID0gMzAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIpDQoNCmBgYA0KDQojIyBGaWd1cmUgNA0KDQojIyMgRGF0YSBkZXNjcmlwdGlvbiBmb3IgRmlndXJlIDQNCg0KKiBUaGUgcmVzdWx0cyBpbiB0aGVzZSBmaWxlcyBhc3N1bWUgdGhhdCB0aGUgdHJ1dGggbGFiZWxzIG9mIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBST0lzIGFyZSBmaXhlZCBhY3Jvc3MgdGhlIDEwLDAwMCBzaW11bGF0aW9ucywgaGVuY2UgZml4ZWQgaXMgaW4gdGhlIG5hbWUgb2YgdGhlIGZpbGUuICANCg0KIA0KDQoqIEluIGEgYmFsYW5jZWQgZGVzaWduIGVhY2ggcGF0aWVudCBoYXMgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBudW1iZXIgb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIFJPSXMuIEluIGFuIHVuYmFsYW5jZWQgZGVzaWduIGVhY2ggcGF0aWVudCB0ZW5kcyB0byBoYXZlIHVuZXF1YWwgbnVtYmVyIG9mIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBST0lzLiBOb3RlIHRoYXQgZm9yIGJvdGggZGVzaWducyB0aGUgb3ZlcmFsbCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgUk9JcyBudW1iZXIgc2hvdWxkIGJlIGFib3V0IHRoZSBzYW1lLCBzaW5jZSB0aGUgb3ZlcmFsbCBwcm9iYWJpbGl0aWVzIHRvIGJlIHBvc2l0aXZlIFJPSSBhbmQgbmVnYXRpdmUgUk9JIGFyZSAwLjUgYW5kIDAuNS4NCg0KDQoqICpzaW1fcmVzdWx0X2JsYW5jZV9maXhlZF9jb3YwNTA2MjAyMS5jc3YqIENvbnRhaW5zIHRoZSBzdW1tYXJpemVkIHN0YXRpc3RpY3MgZnJvbSAxMCwwMDAgc2ltdWxhdGlvbnMgcmVzdWx0cyBpbiA3NSBjb25maWd1cmF0aW9ucyBmb3IgMTAwIHBhdGllbnRzIGFuZCAxMCBST0lzIHBlciBwYXRpZW50LiBBbGwgc2ltdWxhdGlvbnMgdXNlIHRoZSBiYWxhbmNlZCBkZXNpZ24gYW5kIGZpeGVkIHRydXRoIGxhYmVscy4gVGhlIDc1IGNvbmZpZ3VyYXRpb25zIGFyZSBhbGwgdGhlIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiAzIEFVQyB2YWx1ZXMgKDAuNywgMC44LCAwLjkpLCA1IGNvdmFyaWFuY2UgdmFsdWVzICgwLjEsIDAuMjUsIDAuNSwgMC43NSwgMC45KSBhbmQgNSAkXHJobyQgdmFsdWVzICgwLjEsIDAuMjUsIDAuNSwgMC43NSwgMC45KS4gVGhlIGRldGFpbHMgb2YgcGFyYW1ldGVycyBzZXR0aW5ndHMgaW4gdGhlIDc1IGNvbmZpZ3VyYXRpb25zIGlzIGF2YWlsYWJsZSBpbiB0aGUgKipUYWJsZSAxKiouDQoNCg0KKiAqc2ltX3Jlc3VsdF91bmJsYW5jZV9maXhlZF9jb3YwNTA2MjAyMS5jc3YqIENvbnRhaW5zIHRoZSBzdW1tYXJpemVkIHN0YXRpc3RpY3MgZnJvbSAxMCwwMDAgc2ltdWxhdGlvbnMgZm9yIDc1IGNvbmZpZ3VyYXRpb25zIGZvciAxMDAgcGF0aWVudHMgYW5kIDEwIFJPSXMgcGVyIHBhdGllbnQuIEFsbCBzaW11bGF0aW9ucyB1c2UgdGhlIHVuYmFsYW5jZWQgZGVzaWduIGFuZCBmaXhlZCB0cnV0aCBsYWJlbHMuVGhlIGRldGFpbHMgb2YgcGFyYW1ldGVycyBzZXR0aW5ncyBpbiB0aGUgNzUgY29uZmlndXJhdGlvbnMgaXMgYXZhaWxhYmxlIGluIHRoZSAqKlRhYmxlIDEqKi4NCg0KDQoqIFRoZXJlIGFyZSAxNiBjb2x1bW5zIGluIHRoZSBib3RoIGZpbGVzLiBUaGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIGVhY2ggY29sdW1uIGlzIGdpdmVuIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLiANCg0KICANCg0KDQoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KIyMgQ29uZmlncw0KQVVDID0gYygwLjcsMC44LDAuOSkNCkNPViA9IGMoMC4xLDAuMjUsMC41LDAuNzUsMC45KQ0KUkhPID0gYygwLjEsMC4yNSwwLjUsMC43NSwwLjkpDQojIyBsb2FkIGRhdGEgYW5kIG5hbWUgdGhlIGNvbHVtbnMNCnNpbV9yZXN1bHRfYmxhbmNlID0gcmVhZC5jc3YoIk5lc3RNUk1DX3NpbXVsYXRpb25fcmVzdWx0cy9zaW1fcmVzdWx0X2JsYW5jZV9maXhlZF9jb3YwNTA2MjAyMS5jc3YiLGhlYWRlciA9IFQpWywtMV0NCnNpbV9yZXN1bHRfdW5ibGFuY2UgPSByZWFkLmNzdigiTmVzdE1STUNfc2ltdWxhdGlvbl9yZXN1bHRzL3NpbV9yZXN1bHRfdW5ibGFuY2VfZml4ZWRfY292MDUwNjIwMjEuY3N2IixoZWFkZXIgPSBUKVssLTFdDQoNCnNpbV9yZXN1bHRfYmxhbmNlJFJITyA9IHJlcChyZXAoUkhPLGVhY2ggPSA1KSwzKQ0Kc2ltX3Jlc3VsdF9ibGFuY2UkQ09WID0gcmVwKENPViwxNSkNCg0Kc2ltX3Jlc3VsdF91bmJsYW5jZSRSSE8gPSByZXAocmVwKFJITyxlYWNoID0gNSksMykNCnNpbV9yZXN1bHRfdW5ibGFuY2UkQ09WID0gcmVwKENPViwxNSkNCg0KDQoNCiMjIENvbnZlcnQgcGFyYW1ldGVyIHRvIGZhY3RvciBmb3IgYmV0dGVyIHZpc3VsaXphdGlvbg0Kc2ltX3Jlc3VsdF9ibGFuY2UkUkhPID0gYXMuZmFjdG9yKHJlcChyZXAoUkhPLGVhY2ggPSA1KSwzKSkNCnNpbV9yZXN1bHRfYmxhbmNlJENPViA9IGFzLmZhY3RvcihyZXAoQ09WLDE1KSkNCnNpbV9yZXN1bHRfYmxhbmNlJFRSVUVfQVVDID0gYXMuZmFjdG9yKHJlcChBVUMsIGVhY2ggPSAyNSkpDQoNCnNpbV9yZXN1bHRfdW5ibGFuY2UkUkhPID0gYXMuZmFjdG9yKHJlcChyZXAoUkhPLGVhY2ggPSA1KSwzKSkNCnNpbV9yZXN1bHRfdW5ibGFuY2UkQ09WID0gYXMuZmFjdG9yKHJlcChDT1YsMTUpKQ0Kc2ltX3Jlc3VsdF91bmJsYW5jZSRUUlVFX0FVQyA9IGFzLmZhY3RvcihyZXAoQVVDLCBlYWNoID0gMjUpKQ0KDQpjb25maWdzXzc1ID0gc2ltX3Jlc3VsdF9ibGFuY2VbLDE2OjE4XQ0KDQpyb3cubmFtZXMoY29uZmlnc183NSkgPSBwYXN0ZTAoJ0NvbmZpZyAnLCAxOjc1KQ0KIyMgcGxvdCBNQyB0cnV0aCB2cyB0aGVvcmV0aWNhbCB0cnV0aCAtLS0tDQoNCiMjIFZBUg0KcDFfTUN2c1RoZW8gPSBnZ3Bsb3Qoc2ltX3Jlc3VsdF9ibGFuY2UgJT4lIGZpbHRlcihUUlVFX0FVQyA9PSAwLjcpLA0KICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBUUlVFX1ZBUl9NRUFOLCB5ID0gUjFBVUNfVkFSKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoZ3JvdXAgPSAgVFJVRV9BVUMsIGNvbG9yID0gQ09WLCBzaGFwZSA9IFJITyksIHNpemUgPSAxKSArDQpnZ3RpdGxlKCJCYWxhbmNlIEFVQyA9IDAuNyIpICsgeWxpbSgwLDAuMDAxNykgKyB4bGltKDAsMC4wMDE3KSArIA0KICB4bGFiKCJUaGVvcmV0aWNhbCBBVUMgVmFyaWFuY2UiKSArIHlsYWIoIk1DIEFVQyBWYXJpYW5jZSIpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxLGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikrDQogIHRoZW1lX2J3KCkrIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArIA0KICBndWlkZXMoY29sb3VyID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT0xKSksDQogICAgICAgICBzaGFwZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9MSkpKSANCg0KDQpwMl9NQ3ZzVGhlbyA9IGdncGxvdChzaW1fcmVzdWx0X2JsYW5jZSAlPiUgZmlsdGVyKFRSVUVfQVVDID09IDAuOCksDQogICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IFRSVUVfVkFSX01FQU4sIHkgPSBSMUFVQ19WQVIpKSArIA0KICBnZW9tX3BvaW50KGFlcyhncm91cCA9ICBUUlVFX0FVQywgY29sb3IgPSBDT1YsIHNoYXBlID0gUkhPKSwgc2l6ZSA9IDEpICsNCmdndGl0bGUoIkJhbGFuY2UgQVVDID0gMC44IikgKyB5bGltKDAsMC4wMDE3KSArIHhsaW0oMCwwLjAwMTcpICsgDQogIHhsYWIoIlRoZW9yZXRpY2FsIEFVQyBWYXJpYW5jZSIpICsgeWxhYigiTUMgQVVDIFZhcmlhbmNlIikgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEsbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSsNCiAgdGhlbWVfYncoKSsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsgDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSwgDQogICAgICAgICBzaGFwZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9MSkpKSANCg0KDQpwM19NQ3ZzVGhlbyA9IGdncGxvdChzaW1fcmVzdWx0X2JsYW5jZSAlPiUgZmlsdGVyKFRSVUVfQVVDID09IDAuOSksDQogICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IFRSVUVfVkFSX01FQU4sIHkgPSBSMUFVQ19WQVIpKSArIA0KICBnZW9tX3BvaW50KGFlcyhncm91cCA9ICBUUlVFX0FVQywgY29sb3IgPSBDT1YsIHNoYXBlID0gUkhPKSwgc2l6ZSA9IDEpICsNCmdndGl0bGUoIkJhbGFuY2UgQVVDID0gMC45IikgKyB5bGltKDAsMC4wMDE3KSArIHhsaW0oMCwwLjAwMTcpICsgDQogIHhsYWIoIlRoZW9yZXRpY2FsIEFVQyBWYXJpYW5jZSIpICsgeWxhYigiTUMgQVVDIFZhcmlhbmNlIikgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEsbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSsNCiAgdGhlbWVfYncoKSsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsgDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSwNCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT0xKSkpIA0KDQoNCnA0X01DdnNUaGVvID0gZ2dwbG90KHNpbV9yZXN1bHRfdW5ibGFuY2UgJT4lIGZpbHRlcihUUlVFX0FVQyA9PSAwLjcpLA0KICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBUUlVFX1ZBUl9NRUFOLCB5ID0gUjFBVUNfVkFSKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoZ3JvdXAgPSAgVFJVRV9BVUMsIGNvbG9yID0gQ09WLCBzaGFwZSA9IFJITyksIHNpemUgPSAxKSArDQogIGdndGl0bGUoIlVuYmFsYW5jZSBBVUMgPSAwLjciKSArIHlsaW0oMCwwLjAwMTcpICsgeGxpbSgwLDAuMDAxNykgKyANCiAgeGxhYigiVGhlb3JldGljYWwgQVVDIFZhcmlhbmNlIikgKyB5bGFiKCJNQyBBVUMgVmFyaWFuY2UiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSxsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpKw0KICB0aGVtZV9idygpKyB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9MSkpLA0KICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSkgDQoNCg0KcDVfTUN2c1RoZW8gPSBnZ3Bsb3Qoc2ltX3Jlc3VsdF91bmJsYW5jZSAlPiUgZmlsdGVyKFRSVUVfQVVDID09IDAuOCksDQogICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IFRSVUVfVkFSX01FQU4sIHkgPSBSMUFVQ19WQVIpKSArIA0KICBnZW9tX3BvaW50KGFlcyhncm91cCA9ICBUUlVFX0FVQywgY29sb3IgPSBDT1YsIHNoYXBlID0gUkhPKSwgc2l6ZSA9IDEpICsNCiAgZ2d0aXRsZSgiVW5iYWxhbmNlIEFVQyA9IDAuOCIpICsgIA0KICB5bGltKDAsMC4wMDE3KSArIA0KICB4bGltKDAsMC4wMDE3KSArIA0KICB4bGFiKCJUaGVvcmV0aWNhbCBBVUMgVmFyaWFuY2UiKSArIA0KICB5bGFiKCJNQyBBVUMgVmFyaWFuY2UiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSxsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpKw0KICB0aGVtZV9idygpKyANCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsgDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSwNCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT0xKSkpIA0KDQoNCnA2X01DdnNUaGVvID0gZ2dwbG90KHNpbV9yZXN1bHRfdW5ibGFuY2UgJT4lIGZpbHRlcihUUlVFX0FVQyA9PSAwLjkpLA0KICBhZXMoeCA9IFRSVUVfVkFSX01FQU4sIHkgPSBSMUFVQ19WQVIpKSArIA0KICBnZW9tX3BvaW50KGFlcyhncm91cCA9ICBUUlVFX0FVQywgY29sb3IgPSBDT1YsIHNoYXBlID0gUkhPKSwgc2l6ZSA9IDEpICsNCiAgZ2d0aXRsZSgiVW5iYWxhbmNlIEFVQyA9IDAuOSIpICsgDQogIHlsaW0oMCwwLjAwMTcpICsgDQogIHhsaW0oMCwwLjAwMTcpICsgDQogIHhsYWIoIlRoZW9yZXRpY2FsIEFVQyBWYXJpYW5jZSIpICsgDQogIHlsYWIoIk1DIEFVQyBWYXJpYW5jZSIpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxLGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICB0aGVtZV9idygpICsgDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArIA0KICBndWlkZXMoY29sb3VyID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT0xKSksDQogIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT0xKSkpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpncmlkLmFycmFuZ2UocDFfTUN2c1RoZW8sIHAyX01DdnNUaGVvLCBwM19NQ3ZzVGhlbywNCiAgICAgICAgICAgICBwNF9NQ3ZzVGhlbywgcDVfTUN2c1RoZW8sIHA2X01DdnNUaGVvLG5yb3cgPSAyLG5jb2wgPSAzKQ0KDQpgYGANCg0KDQoNCiMjIEZpZ3VyZSA1DQoNCiMjIyBEYXRhIGRlc2NyaXB0aW9uIGZvciBGaWd1cmUgNQ0KDQoqIFRoZSByZXN1bHRzIGluIHRoZXNlIGZpbGVzIGFzc3VtZSB0aGF0IHRoZSB0cnV0aCBsYWJlbHMgb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIFJPSXMgYXJlIHJhbmRvbWx5IGFzc2lnbmVkIGFjcm9zcyB0aGUgMTAsMDAwIHNpbXVsYXRpb25zLCBoZW5jZSB1bmZpeGVkIGlzIGluIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiAgICANCg0KDQoqIEluIGEgYmFsYW5jZWQgZGVzaWduIGVhY2ggcGF0aWVudCBoYXMgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBudW1iZXIgb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIFJPSXMuIEluIGFuIHVuYmFsYW5jZWQgZGVzaWduIGVhY2ggcGF0aWVudCB0ZW5kcyB0byBoYXZlIHVuZXF1YWwgbnVtYmVyIG9mIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBST0lzLiBOb3RlIHRoYXQgZm9yIGJvdGggZGVzaWducyB0aGUgb3ZlcmFsbCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgUk9JcyBudW1iZXIgc2hvdWxkIGJlIGFib3V0IHRoZSBzYW1lLCBzaW5jZSB0aGUgb3ZlcmFsbCBwcm9iYWJpbGl0aWVzIHRvIGJlIHBvc2l0aXZlIFJPSSBhbmQgbmVnYXRpdmUgUk9JIGFyZSAwLjUgYW5kIDAuNS4NCg0KDQoqICpzaW1fcmVzdWx0X2JsYW5jZV91bmZpeGVkX2NvdjAwNTE4MjAyMS5jc3YqIENvbnRhaW5zIHRoZSBzdW1tYXJpemVkIHN0YXRpc3RpY3MgZnJvbSAxMCwwMDAgc2ltdWxhdGlvbnMgcmVzdWx0cyBpbiA3NSBjb25maWd1cmF0aW9ucyBmb3IgMTAwIHBhdGllbnRzIGFuZCAxMCBST0lzIHBlciBwYXRpZW50LiBBbGwgc2ltdWxhdGlvbnMgdXNlIHRoZSBiYWxhbmNlZCBkZXNpZ24gYW5kIHVuZml4ZWQgdHJ1dGggbGFiZWxzLiBUaGUgNzUgY29uZmlndXJhdGlvbnMgYXJlIGFsbCB0aGUgcG9zc2libGUgY29tYmluYXRpb25zIG9mIDMgQVVDIHZhbHVlcyAoMC43LCAwLjgsIDAuOSksIDUgY292YXJpYW5jZSB2YWx1ZXMgKDAuMSwgMC4yNSwgMC41LCAwLjc1LCAwLjkpIGFuZCA1ICRccmhvJCB2YWx1ZXMgKDAuMSwgMC4yNSwgMC41LCAwLjc1LCAwLjkpLiBUaGUgZGV0YWlscyBvZiBwYXJhbWV0ZXJzIHNldHRpbmd0cyBpbiB0aGUgNzUgY29uZmlndXJhdGlvbnMgaXMgYXZhaWxhYmxlIGluIHRoZSAqKlRhYmxlIDEqKi4NCg0KDQoqICpzaW1fcmVzdWx0X3VuYmxhbmNlX3VuZml4ZWRfY292MDUxODIwMjEuY3N2KiBDb250YWlucyB0aGUgc3VtbWFyaXplZCBzdGF0aXN0aWNzIGZyb20gMTAsMDAwIHNpbXVsYXRpb25zIGZvciA3NSBjb25maWd1cmF0aW9ucyBmb3IgMTAwIHBhdGllbnRzIGFuZCAxMCBST0lzIHBlciBwYXRpZW50LiBBbGwgc2ltdWxhdGlvbnMgdXNlIHRoZSB1bmJhbGFuY2VkIGRlc2lnbiBhbmQgdW5maXhlZCB0cnV0aCBsYWJlbHMuVGhlIGRldGFpbHMgb2YgcGFyYW1ldGVycyBzZXR0aW5ncyBpbiB0aGUgNzUgY29uZmlndXJhdGlvbnMgaXMgYXZhaWxhYmxlIGluIHRoZSAqKlRhYmxlIDEqKi4NCg0KDQoqIFRoZXJlIGFyZSAxNiBjb2x1bW5zIGluIHRoZSBib3RoIGZpbGVzLiBUaGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgaW4gdGhlIGVuZC4NCiANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMjIExvYWQgZGF0YQ0Kc2ltX3Jlc3VsdF9ibGFuY2UgPSByZWFkLmNzdigiTmVzdE1STUNfc2ltdWxhdGlvbl9yZXN1bHRzL3NpbV9yZXN1bHRfYmxhbmNlX3VuZml4ZWRfY292MDA1MTgyMDIxLmNzdiIsaGVhZGVyID0gVClbLC0xXQ0Kc2ltX3Jlc3VsdF91bmJsYW5jZSA9IHJlYWQuY3N2KCJOZXN0TVJNQ19zaW11bGF0aW9uX3Jlc3VsdHMvc2ltX3Jlc3VsdF91bmJsYW5jZV91bmZpeGVkX2NvdjA1MTgyMDIxLmNzdiIsaGVhZGVyID0gVClbLC0xXQ0KDQpzaW1fcmVzdWx0X2JsYW5jZSRSSE8gPSByZXAocmVwKFJITyxlYWNoID0gNSksMykNCnNpbV9yZXN1bHRfYmxhbmNlJENPViA9IHJlcChDT1YsMTUpDQoNCnNpbV9yZXN1bHRfdW5ibGFuY2UkUkhPID0gcmVwKHJlcChSSE8sZWFjaCA9IDUpLDMpDQpzaW1fcmVzdWx0X3VuYmxhbmNlJENPViA9IHJlcChDT1YsMTUpDQoNCiMjIENvbnZlcnQgcGFyYW1ldGVyIHRvIGZhY3RvciBmb3IgYmV0dGVyIHZpc3VsaXphdGlvbg0Kc2ltX3Jlc3VsdF9ibGFuY2UkUkhPID0gYXMuZmFjdG9yKHJlcChyZXAoUkhPLGVhY2ggPSA1KSwzKSkNCnNpbV9yZXN1bHRfYmxhbmNlJENPViA9IGFzLmZhY3RvcihyZXAoQ09WLDE1KSkNCnNpbV9yZXN1bHRfYmxhbmNlJFRSVUVfQVVDID0gYXMuZmFjdG9yKHJlcChBVUMsIGVhY2ggPSAyNSkpDQpzaW1fcmVzdWx0X2JsYW5jZSRUUlVFX0FVQyA9IHJlcChBVUMsIGVhY2ggPSAyNSkNCnNpbV9yZXN1bHRfdW5ibGFuY2UkUkhPID0gYXMuZmFjdG9yKHJlcChyZXAoUkhPLGVhY2ggPSA1KSwzKSkNCnNpbV9yZXN1bHRfdW5ibGFuY2UkQ09WID0gYXMuZmFjdG9yKHJlcChDT1YsMTUpKQ0Kc2ltX3Jlc3VsdF91bmJsYW5jZSRUUlVFX0FVQyA9IGFzLmZhY3RvcihyZXAoQVVDLCBlYWNoID0gMjUpKQ0Kc2ltX3Jlc3VsdF91bmJsYW5jZSRUUlVFX0FVQyA9IHJlcChBVUMsIGVhY2ggPSAyNSkNCiMjIFZBUg0KcDFfTUN2c1RoZW8gPSBnZ3Bsb3Qoc2ltX3Jlc3VsdF9ibGFuY2UgJT4lIGZpbHRlcihUUlVFX0FVQyA9PSAwLjcpLA0KICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBUUlVFX1ZBUl9NRUFOLCB5ID0gUjFWQVJfTUVBTikpICsgDQogIGdlb21fcG9pbnQoYWVzKCBjb2xvciA9IENPViwgc2hhcGUgPSBSSE8pLHNpemUgPSAxKSArDQogIGdndGl0bGUoIkJhbGFuY2UgQVVDID0gMC43IikgKyB5bGltKDAsMC4wMDE3KSArIHhsaW0oMCwwLjAwMTcpICsgDQogIHhsYWIoIk1DIHRydXRoIG9mIEFVQyBWQVIiKSArIHlsYWIoIk1DIE1FQU4gb2YgQVVDIFZBUiBFc3RpbWF0ZXMiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSxsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpKw0KICB0aGVtZV9idygpKyB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9MSkpLA0KICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSkgDQoNCg0KcDJfTUN2c1RoZW8gPSBnZ3Bsb3Qoc2ltX3Jlc3VsdF9ibGFuY2UgJT4lIGZpbHRlcihUUlVFX0FVQyA9PSAwLjgpLA0KICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBUUlVFX1ZBUl9NRUFOLCB5ID0gUjFWQVJfTUVBTikpICsgDQogIGdlb21fcG9pbnQoYWVzKCBjb2xvciA9IENPViwgc2hhcGUgPSBSSE8pLHNpemUgPSAxKSArDQogIGdndGl0bGUoIkJhbGFuY2UgQVVDID0gMC44IikgKyB5bGltKDAsMC4wMDE3KSArIHhsaW0oMCwwLjAwMTcpICsgDQogIHhsYWIoIk1DIHRydXRoIG9mIEFVQyBWQVIiKSArIHlsYWIoIk1DIE1FQU4gb2YgQVVDIFZBUiBFc3RpbWF0ZXMiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSxsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpKw0KICB0aGVtZV9idygpKyB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9MSkpLA0KICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSkgDQoNCg0KcDNfTUN2c1RoZW8gPSBnZ3Bsb3Qoc2ltX3Jlc3VsdF9ibGFuY2UgJT4lIGZpbHRlcihUUlVFX0FVQyA9PSAwLjkpLA0KICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBUUlVFX1ZBUl9NRUFOLCB5ID0gUjFWQVJfTUVBTikpICsgDQogIGdlb21fcG9pbnQoYWVzKCBjb2xvciA9IENPViwgc2hhcGUgPSBSSE8pLHNpemUgPSAxKSArDQogIGdndGl0bGUoIkJhbGFuY2UgQVVDID0gMC45IikgKyB5bGltKDAsMC4wMDE3KSArIHhsaW0oMCwwLjAwMTcpICsgDQogIHhsYWIoIk1DIHRydXRoIG9mIEFVQyBWQVIiKSArIHlsYWIoIk1DIE1FQU4gb2YgQVVDIFZBUiBFc3RpbWF0ZXMiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSxsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpKw0KICB0aGVtZV9idygpKyB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9MSkpLA0KICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSkgDQoNCg0KDQpwNF9NQ3ZzVGhlbyA9IGdncGxvdChzaW1fcmVzdWx0X3VuYmxhbmNlICU+JSBmaWx0ZXIoVFJVRV9BVUMgPT0gMC43KSwNCiAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gVFJVRV9WQVJfTUVBTiwgeSA9IFIxVkFSX01FQU4pKSArIA0KICBnZW9tX3BvaW50KGFlcyggY29sb3IgPSBDT1YsIHNoYXBlID0gUkhPKSxzaXplID0gMSkgKw0KICBnZ3RpdGxlKCJVbmJhbGFuY2UgQVVDID0gMC43IikgKyB5bGltKDAsMC4wMDE3KSArIHhsaW0oMCwwLjAwMTcpICsgIA0KICB4bGFiKCJNQyB0cnV0aCBvZiBBVUMgVkFSIikgKyB5bGFiKCJNQyBNRUFOIG9mIEFVQyBWQVIgRXN0aW1hdGVzIikgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEsbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSsNCiAgdGhlbWVfYncoKSsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsgDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSwNCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT0xKSkpIA0KDQoNCnA1X01DdnNUaGVvID0gZ2dwbG90KHNpbV9yZXN1bHRfdW5ibGFuY2UgJT4lIGZpbHRlcihUUlVFX0FVQyA9PSAwLjgpLA0KICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBUUlVFX1ZBUl9NRUFOLCB5ID0gUjFWQVJfTUVBTikpICsgDQogIGdlb21fcG9pbnQoYWVzKCBjb2xvciA9IENPViwgc2hhcGUgPSBSSE8pLHNpemUgPSAxKSArDQogIGdndGl0bGUoIlVuYmFsYW5jZSBBVUMgPSAwLjgiKSArIHlsaW0oMCwwLjAwMTcpICsgeGxpbSgwLDAuMDAxNykgKyAgDQogIHhsYWIoIk1DIHRydXRoIG9mIEFVQyBWQVIiKSArIHlsYWIoIk1DIE1FQU4gb2YgQVVDIFZBUiBFc3RpbWF0ZXMiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSxsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpKw0KICB0aGVtZV9idygpKyB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9MSkpLA0KICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSkgDQoNCg0KcDZfTUN2c1RoZW8gPSBnZ3Bsb3Qoc2ltX3Jlc3VsdF91bmJsYW5jZSAlPiUgZmlsdGVyKFRSVUVfQVVDID09IDAuOSksDQogICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IFRSVUVfVkFSX01FQU4sIHkgPSBSMVZBUl9NRUFOKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoIGNvbG9yID0gQ09WLCBzaGFwZSA9IFJITyksc2l6ZSA9IDEpICsNCiAgZ2d0aXRsZSgiVW5iYWxhbmNlIEFVQyA9IDAuOSIpICsgeWxpbSgwLDAuMDAxNykgKyB4bGltKDAsMC4wMDE3KSArIA0KICB4bGFiKCJNQyB0cnV0aCBvZiBBVUMgVkFSIikgKyB5bGFiKCJNQyBNRUFOIG9mIEFVQyBWQVIgRXN0aW1hdGVzIikgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEsbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSsNCiAgdGhlbWVfYncoKSsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsgDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSwNCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT0xKSkpIA0KDQoNCg0KZ3JpZC5hcnJhbmdlKHAxX01DdnNUaGVvLCBwMl9NQ3ZzVGhlbywgcDNfTUN2c1RoZW8sDQogICAgICAgICAgICAgcDRfTUN2c1RoZW8sIHA1X01DdnNUaGVvLCBwNl9NQ3ZzVGhlbyxucm93ID0gMixuY29sID0gMykNCg0KDQpgYGANCg0KDQojIEZpZ3VyZSA2DQoNCg0KIyMjIERhdGEgZGVzY3JpcHRpb24gZm9yIEZpZ3VyZSA2DQoNCiogVGhlIHJlc3VsdHMgaW4gdGhlc2UgZmlsZXMgYXNzdW1lIHRoYXQgdGhlIHRydXRoIGxhYmVscyBvZiBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgUk9JcyBhcmUgcmFuZG9tbHkgYXNzaWduZWQgYWNyb3NzIHRoZSAxMCwwMDAgc2ltdWxhdGlvbnMsIGhlbmNlIHVuZml4ZWQgaXMgaW4gdGhlIG5hbWUgb2YgdGhlIGZpbGUuICAgIA0KDQoNCiogSW4gYSBiYWxhbmNlZCBkZXNpZ24gZWFjaCBwYXRpZW50IGhhcyBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIG51bWJlciBvZiBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgUk9Jcy4gSW4gYW4gdW5iYWxhbmNlZCBkZXNpZ24gZWFjaCBwYXRpZW50IHRlbmRzIHRvIGhhdmUgdW5lcXVhbCBudW1iZXIgb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIFJPSXMuIE5vdGUgdGhhdCBmb3IgYm90aCBkZXNpZ25zIHRoZSBvdmVyYWxsIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBST0lzIG51bWJlciBzaG91bGQgYmUgYWJvdXQgdGhlIHNhbWUsIHNpbmNlIHRoZSBvdmVyYWxsIHByb2JhYmlsaXRpZXMgdG8gYmUgcG9zaXRpdmUgUk9JIGFuZCBuZWdhdGl2ZSBST0kgYXJlIDAuNSBhbmQgMC41Lg0KDQoqICpzaW1fcmVzdWx0X2JsYW5jZV91bmZpeGVkX2NvdjEwMDQyMDIxLmNzdiogQ29udGFpbnMgdGhlIHN1bW1hcml6ZWQgc3RhdGlzdGljcyBmcm9tIDEwLDAwMCBzaW11bGF0aW9ucyByZXN1bHRzIGluIDc1IGNvbmZpZ3VyYXRpb25zIGZvciAxMDAgcGF0aWVudHMgYW5kIDEwIFJPSXMgcGVyIHBhdGllbnQuIEFsbCBzaW11bGF0aW9ucyB1c2UgdGhlIGJhbGFuY2VkIGRlc2lnbiBhbmQgdW5maXhlZCB0cnV0aCBsYWJlbHMuIFRoZSA3NSBjb25maWd1cmF0aW9ucyBhcmUgYWxsIHRoZSBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgMyBBVUMgdmFsdWVzICgwLjcsIDAuOCwgMC45KSwgNSBjb3ZhcmlhbmNlIHZhbHVlcyAoMC4xLCAwLjI1LCAwLjUsIDAuNzUsIDAuOSkgYW5kIDUgJFxyaG8kIHZhbHVlcyAoMC4xLCAwLjI1LCAwLjUsIDAuNzUsIDAuOSkuIFRoZSBkZXRhaWxzIG9mIHBhcmFtZXRlcnMgc2V0dGluZ3RzIGluIHRoZSA3NSBjb25maWd1cmF0aW9ucyBpcyBhdmFpbGFibGUgaW4gdGhlICoqVGFibGUgMSoqLg0KDQoqICpzaW1fcmVzdWx0X3VuYmxhbmNlX3VuZml4ZWRfY292MTAwNDIwMjEuY3N2KiBDb250YWlucyB0aGUgc3VtbWFyaXplZCBzdGF0aXN0aWNzIGZyb20gMTAsMDAwIHNpbXVsYXRpb25zIGZvciA3NSBjb25maWd1cmF0aW9ucyBmb3IgMTAwIHBhdGllbnRzIGFuZCAxMCBST0lzIHBlciBwYXRpZW50LiBBbGwgc2ltdWxhdGlvbnMgdXNlIHRoZSB1bmJhbGFuY2VkIGRlc2lnbiBhbmQgdW5maXhlZCB0cnV0aCBsYWJlbHMuVGhlIGRldGFpbHMgb2YgcGFyYW1ldGVycyBzZXR0aW5ndHMgaW4gdGhlIDc1IGNvbmZpZ3VyYXRpb25zIGlzIGF2YWlsYWJsZSBpbiB0aGUgKipUYWJsZSAxKiouDQoNCiogKnNpbV9OYW5jeV9ibGFuY2VfdW5maXhlZF9jb3YxMDA0MjAyMS5jc3YqIENvbnRhaW5zIHRoZSBzdW1tYXJpemVkIHN0YXRpc3RpY3MgZnJvbSAxMCwwMDAgc2ltdWxhdGlvbnMgZm9yIDc1IGNvbmZpZ3VyYXRpb25zIGZvciAxMDAgcGF0aWVudHMgYW5kIDEwIFJPSXMgcGVyIHBhdGllbnQgYmFzZWQgb24gTmFuY3kncyBtZXRob2QuIEFsbCBzaW11bGF0aW9ucyB1c2UgdGhlIGJhbGFuY2VkIGRlc2lnbiBhbmQgdW5maXhlZCB0cnV0aCBsYWJlbHMuVGhlIGRldGFpbHMgb2YgcGFyYW1ldGVycyBzZXR0aW5ndHMgaW4gdGhlIDc1IGNvbmZpZ3VyYXRpb25zIGlzIGF2YWlsYWJsZSBpbiB0aGUgKipUYWJsZSAxKiouICANCg0KKiAqc2ltX05hbmN5X3VuYmxhbmNlX3VuZml4ZWRfY292MTAwNDIwMjEuY3N2KiBDb250YWlucyB0aGUgc3VtbWFyaXplZCBzdGF0aXN0aWNzIGZyb20gMTAsMDAwIHNpbXVsYXRpb25zIGZvciA3NSBjb25maWd1cmF0aW9ucyBmb3IgMTAwIHBhdGllbnRzIGFuZCAxMCBST0lzIHBlciBwYXRpZW50IGJhc2VkIG9uIE5hbmN5J3MgbWV0aG9kLiBBbGwgc2ltdWxhdGlvbnMgdXNlIHRoZSB1bmJhbGFuY2VkIGRlc2lnbiBhbmQgdW5maXhlZCB0cnV0aCBsYWJlbHMuVGhlIGRldGFpbHMgb2YgcGFyYW1ldGVycyBzZXR0aW5ndHMgaW4gdGhlIDc1IGNvbmZpZ3VyYXRpb25zIGlzIGF2YWlsYWJsZSBpbiB0aGUgKipUYWJsZSAxKiouIA0KDQoqIFRoZXJlIGFyZSAxNiBjb2x1bW5zIGluIHRoZSBhYm92ZSBmaWxlcy4gVGhlIGRldGFpbGVkIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGluIHRoZSBlbmQuDQoNCiAgDQoNCg0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQojIyBsb2FkIGRhdGEgLS0tLQ0KDQpzaW1fcmVzdWx0X2JsYW5jZSA9IHJlYWQuY3N2KCJOZXN0TVJNQ19zaW11bGF0aW9uX3Jlc3VsdHMvc2ltX3Jlc3VsdF9ibGFuY2VfdW5maXhlZF9jb3YxMDA0MjAyMS5jc3YiLGhlYWRlciA9IFQpWywtMV0NCnNpbV9yZXN1bHRfdW5ibGFuY2UgPSByZWFkLmNzdigiTmVzdE1STUNfc2ltdWxhdGlvbl9yZXN1bHRzL3NpbV9yZXN1bHRfdW5ibGFuY2VfdW5maXhlZF9jb3YxMDA0MjAyMS5jc3YiLGhlYWRlciA9IFQpWywtMV0NCg0Kc2ltX25hbmN5X2JsYW5jZSA9IHJlYWQuY3N2KCJOZXN0TVJNQ19zaW11bGF0aW9uX3Jlc3VsdHMvc2ltX05hbmN5X2JsYW5jZV91bmZpeGVkX2NvdjEwMDQyMDIxLmNzdiIsaGVhZGVyID0gVClbLC0xXQ0Kc2ltX25hbmN5X3VuYmxhbmNlID0gcmVhZC5jc3YoIk5lc3RNUk1DX3NpbXVsYXRpb25fcmVzdWx0cy9zaW1fTmFuY3lfdW5ibGFuY2VfdW5maXhlZF9jb3YxMDA0MjAyMS5jc3YiLGhlYWRlciA9IFQpWywtMV0NCg0KQVVDID0gYygwLjcsMC44LDAuOSklPiUgYXMuZmFjdG9yKCkNCkNPViA9IGMoMC4xLDAuMjUsMC41LDAuNzUsMC45KSU+JSBhcy5mYWN0b3IoKQ0KUkhPID0gYXMuZmFjdG9yKGMoMC4xLDAuMjUsMC41LDAuNzUsMC45KSkNCg0KDQojIyBjYWxjdWxhdGUgdGhlIGJpYXMgLS0tLSANCg0KIyMgQVVDIEJpYXMNCnNpbV9yZXN1bHRfYmxhbmNlJFIxQVVDX0JJQVMgPSAoc2ltX3Jlc3VsdF9ibGFuY2UkVFJVRV9BVUMgLSBzaW1fcmVzdWx0X2JsYW5jZSRSMUFVQ19NRUFOKS9zaW1fcmVzdWx0X2JsYW5jZSRUUlVFX0FVQw0Kc2ltX3Jlc3VsdF91bmJsYW5jZSRSMUFVQ19CSUFTID0gKHNpbV9yZXN1bHRfdW5ibGFuY2UkVFJVRV9BVUMgLSBzaW1fcmVzdWx0X3VuYmxhbmNlJFIxQVVDX01FQU4pL3NpbV9yZXN1bHRfdW5ibGFuY2UkVFJVRV9BVUMNCnNpbV9uYW5jeV9ibGFuY2UkUjFBVUNfQklBUyA9IChzaW1fbmFuY3lfYmxhbmNlJFRSVUVfQVVDIC0gc2ltX25hbmN5X2JsYW5jZSRSMUFVQ19NRUFOKS9zaW1fbmFuY3lfYmxhbmNlJFRSVUVfQVVDDQpzaW1fbmFuY3lfdW5ibGFuY2UkUjFBVUNfQklBUyA9IChzaW1fbmFuY3lfdW5ibGFuY2UkVFJVRV9BVUMgLSBzaW1fbmFuY3lfdW5ibGFuY2UkUjFBVUNfTUVBTikvc2ltX25hbmN5X3VuYmxhbmNlJFRSVUVfQVVDDQoNCiMjIFZBUiBCaWFzDQpzaW1fcmVzdWx0X2JsYW5jZSRSMVZBUl9CSUFTID0gKHNpbV9yZXN1bHRfYmxhbmNlJFIxQVVDX1ZBUiAtIHNpbV9yZXN1bHRfYmxhbmNlJFIxVkFSX01FQU4pL3NpbV9yZXN1bHRfYmxhbmNlJFIxQVVDX1ZBUg0Kc2ltX3Jlc3VsdF91bmJsYW5jZSRSMVZBUl9CSUFTID0gKHNpbV9yZXN1bHRfdW5ibGFuY2UkUjFBVUNfVkFSIC0gc2ltX3Jlc3VsdF91bmJsYW5jZSRSMVZBUl9NRUFOKS9zaW1fcmVzdWx0X3VuYmxhbmNlJFIxQVVDX1ZBUg0Kc2ltX25hbmN5X2JsYW5jZSRSMVZBUl9CSUFTID0gKHNpbV9uYW5jeV9ibGFuY2UkUjFBVUNfVkFSIC0gc2ltX25hbmN5X2JsYW5jZSRSMVZBUl9NRUFOKS9zaW1fbmFuY3lfYmxhbmNlJFIxQVVDX1ZBUg0Kc2ltX25hbmN5X3VuYmxhbmNlJFIxVkFSX0JJQVMgPSAoc2ltX25hbmN5X3VuYmxhbmNlJFIxQVVDX1ZBUiAtIHNpbV9uYW5jeV91bmJsYW5jZSRSMVZBUl9NRUFOKS9zaW1fbmFuY3lfdW5ibGFuY2UkUjFBVUNfVkFSDQoNCg0KDQpzaW1fcmVzdWx0X2JsYW5jZSRSMVZBUl9CSUFTID0gKHNpbV9yZXN1bHRfYmxhbmNlJFIxQVVDX1ZBUiAtIHNpbV9yZXN1bHRfYmxhbmNlJFIxVkFSX01FQU4pDQpzaW1fcmVzdWx0X3VuYmxhbmNlJFIxVkFSX0JJQVMgPSAoc2ltX3Jlc3VsdF91bmJsYW5jZSRSMUFVQ19WQVIgLSBzaW1fcmVzdWx0X3VuYmxhbmNlJFIxVkFSX01FQU4pDQpzaW1fbmFuY3lfYmxhbmNlJFIxVkFSX0JJQVMgPSAoc2ltX25hbmN5X2JsYW5jZSRSMUFVQ19WQVIgLSBzaW1fbmFuY3lfYmxhbmNlJFIxVkFSX01FQU4pDQpzaW1fbmFuY3lfdW5ibGFuY2UkUjFWQVJfQklBUyA9IChzaW1fbmFuY3lfdW5ibGFuY2UkUjFBVUNfVkFSIC0gc2ltX25hbmN5X3VuYmxhbmNlJFIxVkFSX01FQU4pDQojIyBDT1YgQmlhcw0KDQoNCnNpbV9yZXN1bHRfYmxhbmNlJFIxUjJDT1ZfQklBUyA9IChzaW1fcmVzdWx0X2JsYW5jZSRSMVIyQ09WX01DIC0gc2ltX3Jlc3VsdF9ibGFuY2UkUjFSMkNPVl9NRUFOKS9zaW1fcmVzdWx0X2JsYW5jZSRSMVIyQ09WX01DDQpzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfQklBUyA9IChzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfTUMgLSBzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfTUVBTikvc2ltX3Jlc3VsdF91bmJsYW5jZSRSMVIyQ09WX01DDQpzaW1fbmFuY3lfYmxhbmNlJFIxUjJDT1ZfQklBUyA9IChzaW1fbmFuY3lfYmxhbmNlJFIxUjJDT1ZfTUMgLSBzaW1fbmFuY3lfYmxhbmNlJFIxUjJDT1ZfTUVBTikvc2ltX25hbmN5X2JsYW5jZSRSMVIyQ09WX01DDQpzaW1fbmFuY3lfdW5ibGFuY2UkUjFSMkNPVl9CSUFTID0gKHNpbV9uYW5jeV91bmJsYW5jZSRSMVIyQ09WX01DIC0gc2ltX25hbmN5X3VuYmxhbmNlJFIxUjJDT1ZfTUVBTikvc2ltX25hbmN5X3VuYmxhbmNlJFIxUjJDT1ZfTUMNCg0Kc2ltX3Jlc3VsdF9ibGFuY2UkUjFSMkNPVl9CSUFTID0gKHNpbV9yZXN1bHRfYmxhbmNlJFIxUjJDT1ZfTUMgLSBzaW1fcmVzdWx0X2JsYW5jZSRSMVIyQ09WX01FQU4pDQpzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfQklBUyA9IChzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfTUMgLSBzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfTUVBTikNCnNpbV9uYW5jeV9ibGFuY2UkUjFSMkNPVl9CSUFTID0gKHNpbV9uYW5jeV9ibGFuY2UkUjFSMkNPVl9NQyAtIHNpbV9uYW5jeV9ibGFuY2UkUjFSMkNPVl9NRUFOKQ0Kc2ltX25hbmN5X3VuYmxhbmNlJFIxUjJDT1ZfQklBUyA9IChzaW1fbmFuY3lfdW5ibGFuY2UkUjFSMkNPVl9NQyAtIHNpbV9uYW5jeV91bmJsYW5jZSRSMVIyQ09WX01FQU4pDQoNCiMjIEJpYXMgcGxvdCAtLS0tIA0KDQojIyBBVUMgYmlhcw0KQVVDX2JpYXNfY29tYmluZSA9IGRhdGEuZnJhbWUobWV0aG9kID0gcmVwKGMoIkNDQVVDIiwiTmFuY3kiKSxlYWNoID0gMTUwKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IHJlcChyZXAoYygiYmFsYW5jZSIsInVuYmFsYW5jZSIpLGVhY2ggPSA3NSksMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGJpYXMgPSBjKHNpbV9yZXN1bHRfYmxhbmNlJFIxQVVDX0JJQVMsc2ltX3Jlc3VsdF91bmJsYW5jZSRSMUFVQ19CSUFTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1fbmFuY3lfYmxhbmNlJFIxQVVDX0JJQVMsc2ltX25hbmN5X3VuYmxhbmNlJFIxQVVDX0JJQVMpKQ0KDQoNCnAxID0gZ2dwbG90KEFVQ19iaWFzX2NvbWJpbmUsIGFlcyh4PTE6MzAwLHkgPSBiaWFzKSkgKyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IG1ldGhvZCwgc2hhcGUgPSBkZXNpZ24pKSsNCmdndGl0bGUoIkFVQyBSZWxhdGl2ZSBCaWFzIikgKyBsYWJzKHggPSAiY29uZmlndXJhdGlvbnMiLCB5ID0gIkFVQyBSZWxhdGl2ZSBCaWFzIikgKyANCmdlb21fdmxpbmUoeGludGVyY2VwdCA9IHNlcSg3NSwyMjUsYnkgPSA3NSksIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPTAuNSkgKw0KdGhlbWVfYncoKSArICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgDQoNCiMjIFZBUiBiaWFzDQoNClZBUl9iaWFzX2NvbWJpbmUgPSBkYXRhLmZyYW1lKG1ldGhvZCA9IHJlcChjKCJDQ0FVQyIsIk5hbmN5IiksZWFjaCA9IDE1MCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduID0gcmVwKHJlcChjKCJiYWxhbmNlIiwidW5iYWxhbmNlIiksZWFjaCA9IDc1KSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVQyA9IHJlcChBVUMsZWFjaCA9IDI1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJITyA9IHJlcChyZXAocmVwKFJITyxlYWNoID0gNSksMyksMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3YgPSByZXAocmVwKENPViwxNSksMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWFzID0gYyhzaW1fcmVzdWx0X2JsYW5jZSRSMVZBUl9CSUFTLHNpbV9yZXN1bHRfdW5ibGFuY2UkUjFWQVJfQklBUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbV9uYW5jeV9ibGFuY2UkUjFWQVJfQklBUyxzaW1fbmFuY3lfdW5ibGFuY2UkUjFWQVJfQklBUykpDQoNCg0KcDIgPSBnZ3Bsb3QoVkFSX2JpYXNfY29tYmluZSU+JWZpbHRlcihtZXRob2QgPT0gIkNDQVVDIiksIGFlcyh4PTE6MTUwLHkgPSBiaWFzKSkgKyANCmdlb21fcG9pbnQoYWVzKGNvbG9yID0gQVVDLCxzaGFwZSA9IFJITykpKyBsYWJzKHggPSAiY29uZmlndXJhdGlvbnMiLCB5ID0gIlZBUiBSZWxhdGl2ZSBCaWFzIikgKyANCmdlb21fdmxpbmUoeGludGVyY2VwdCA9IHNlcSg3NSwxNDksYnkgPSA3NSksIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPTAuNSkgKw0KdGhlbWVfYncoKSArICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgDQojIyBDT1YgYmlhcw0KDQpDT1ZfYmlhc19jb21iaW5lID0gZGF0YS5mcmFtZShtZXRob2QgPSByZXAoYygiQ0NBVUMiLCJOYW5jeSIpLGVhY2ggPSAxNTApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IHJlcChyZXAoYygiYmFsYW5jZSIsInVuYmFsYW5jZSIpLGVhY2ggPSA3NSksMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVUMgPSByZXAoQVVDLGVhY2ggPSAyNSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSE8gPSByZXAocmVwKHJlcChSSE8sZWFjaCA9IDUpLDMpLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ID0gcmVwKHJlcChDT1YsMTUpLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlhcyA9IGMoc2ltX3Jlc3VsdF9ibGFuY2UkUjFSMkNPVl9CSUFTLHNpbV9yZXN1bHRfdW5ibGFuY2UkUjFSMkNPVl9CSUFTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltX25hbmN5X2JsYW5jZSRSMVIyQ09WX0JJQVMsc2ltX25hbmN5X3VuYmxhbmNlJFIxUjJDT1ZfQklBUykpDQoNCg0KcDMgPSBnZ3Bsb3QoQ09WX2JpYXNfY29tYmluZSU+JWZpbHRlcihtZXRob2QgPT0gIkNDQVVDIiksIGFlcyh4PTE6MTUwLHkgPSBiaWFzKSkgKyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IEFVQyxzaGFwZSA9IFJITykpKw0KICBsYWJzKHggPSAiY29uZmlndXJhdGlvbnMiLCB5ID0gIkNPViBSZWxhdGl2ZSBCaWFzIikgICsgDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHNlcSg3NSwxNDksYnkgPSA3NSksIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPTAuNSkgKw0KICB0aGVtZV9idygpICsgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSANCg0KDQojZ3JpZC5hcnJhbmdlKHAxLHAyLHAzLG5yb3cgPTEpDQoNCiMjIGNhbGN1bGF0ZSBDViAtLS0tDQoNCiMjIEFVQyBDVg0KDQoNCnNpbV9yZXN1bHRfYmxhbmNlJFIxQVVDX0NWID0gc3FydChzaW1fcmVzdWx0X2JsYW5jZSRSMUFVQ19WQVIpL3NpbV9yZXN1bHRfYmxhbmNlJFRSVUVfQVVDDQpzaW1fcmVzdWx0X3VuYmxhbmNlJFIxQVVDX0NWID0gc3FydChzaW1fcmVzdWx0X3VuYmxhbmNlJFIxQVVDX1ZBUikvc2ltX3Jlc3VsdF91bmJsYW5jZSRUUlVFX0FVQw0Kc2ltX25hbmN5X2JsYW5jZSRSMUFVQ19DViA9IHNxcnQoc2ltX25hbmN5X2JsYW5jZSRSMUFVQ19WQVIpL3NpbV9uYW5jeV9ibGFuY2UkVFJVRV9BVUMNCnNpbV9uYW5jeV91bmJsYW5jZSRSMUFVQ19DViA9IHNxcnQoc2ltX25hbmN5X3VuYmxhbmNlJFIxQVVDX1ZBUikvc2ltX25hbmN5X3VuYmxhbmNlJFRSVUVfQVVDDQoNCiMjIFZBUiBDVg0Kc2ltX3Jlc3VsdF9ibGFuY2UkUjFWQVJfQ1YgPSBzcXJ0KHNpbV9yZXN1bHRfYmxhbmNlJFIxVkFSX1ZBUikvc2ltX3Jlc3VsdF9ibGFuY2UkUjFBVUNfVkFSDQpzaW1fcmVzdWx0X3VuYmxhbmNlJFIxVkFSX0NWID0gc3FydChzaW1fcmVzdWx0X3VuYmxhbmNlJFIxVkFSX1ZBUikvc2ltX3Jlc3VsdF91bmJsYW5jZSRSMUFVQ19WQVINCnNpbV9uYW5jeV9ibGFuY2UkUjFWQVJfQ1YgPSBzcXJ0KHNpbV9uYW5jeV9ibGFuY2UkUjFWQVJfVkFSKS9zaW1fbmFuY3lfYmxhbmNlJFIxQVVDX1ZBUg0Kc2ltX25hbmN5X3VuYmxhbmNlJFIxVkFSX0NWID0gc3FydChzaW1fbmFuY3lfdW5ibGFuY2UkUjFWQVJfVkFSKS9zaW1fbmFuY3lfdW5ibGFuY2UkUjFBVUNfVkFSDQoNCg0Kc2ltX3Jlc3VsdF9ibGFuY2UkUjFWQVJfQ1YgPSBzcXJ0KHNpbV9yZXN1bHRfYmxhbmNlJFIxVkFSX1ZBUikNCnNpbV9yZXN1bHRfdW5ibGFuY2UkUjFWQVJfQ1YgPSBzcXJ0KHNpbV9yZXN1bHRfdW5ibGFuY2UkUjFWQVJfVkFSKQ0Kc2ltX25hbmN5X2JsYW5jZSRSMVZBUl9DViA9IHNxcnQoc2ltX25hbmN5X2JsYW5jZSRSMVZBUl9WQVIpL3NpbV9uYW5jeV9ibGFuY2UkUjFBVUNfVkFSDQpzaW1fbmFuY3lfdW5ibGFuY2UkUjFWQVJfQ1YgPSBzcXJ0KHNpbV9uYW5jeV91bmJsYW5jZSRSMVZBUl9WQVIpL3NpbV9uYW5jeV91bmJsYW5jZSRSMUFVQ19WQVINCiMjIENPViBDVg0KDQpzaW1fcmVzdWx0X2JsYW5jZSRSMVIyQ09WX0NWID0gc3FydChzaW1fcmVzdWx0X2JsYW5jZSRSMVIyQ09WX1ZBUikvc2ltX3Jlc3VsdF9ibGFuY2UkUjFSMkNPVl9NQw0Kc2ltX3Jlc3VsdF91bmJsYW5jZSRSMVIyQ09WX0NWID0gc3FydChzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfVkFSKS9zaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfTUMNCnNpbV9uYW5jeV9ibGFuY2UkUjFSMkNPVl9DViA9IHNxcnQoc2ltX25hbmN5X2JsYW5jZSRSMVIyQ09WX1ZBUikvc2ltX25hbmN5X2JsYW5jZSRSMVIyQ09WX01DDQpzaW1fbmFuY3lfdW5ibGFuY2UkUjFSMkNPVl9DViA9IHNxcnQoc2ltX25hbmN5X3VuYmxhbmNlJFIxUjJDT1ZfVkFSKS9zaW1fbmFuY3lfdW5ibGFuY2UkUjFSMkNPVl9NQw0KDQoNCg0KIyMgQ1YgcGxvdCAtLS0tIA0KDQojIyBBVUMgY3YNCkFVQ19DVl9jb21iaW5lID0gZGF0YS5mcmFtZShtZXRob2QgPSByZXAoYygiQ0NBVUMiLCJOYW5jeSIpLGVhY2ggPSAxNTApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IHJlcChyZXAoYygiYmFsYW5jZSIsInVuYmFsYW5jZSIpLGVhY2ggPSA3NSksMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDViA9IGMoc2ltX3Jlc3VsdF9ibGFuY2UkUjFBVUNfQ1Ysc2ltX3Jlc3VsdF91bmJsYW5jZSRSMUFVQ19DViwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbV9uYW5jeV9ibGFuY2UkUjFBVUNfQ1Ysc2ltX25hbmN5X3VuYmxhbmNlJFIxQVVDX0NWKSkNCg0KDQpwNCA9IGdncGxvdChBVUNfQ1ZfY29tYmluZSwgYWVzKHg9MTozMDAseSA9IENWKSkgKyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IG1ldGhvZCwgc2hhcGUgPSBkZXNpZ24pKSsNCiAgZ2d0aXRsZSgiQVVDIENWIENvbXBhcmUiKSArIGxhYnMoeCA9ICJjb25maWd1cmF0aW9ucyIsIHkgPSAiQVVDIENWIikgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gc2VxKDc1LDIyNSxieSA9IDc1KSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9MC41KSArDQogIHRoZW1lX2J3KCkgKyAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpIA0KDQojIyBWQVIgQ1YNCg0KVkFSX0NWX2NvbWJpbmUgPSBkYXRhLmZyYW1lKG1ldGhvZCA9IHJlcChjKCJDQ0FVQyIsIk5hbmN5IiksZWFjaCA9IDE1MCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IHJlcChyZXAoYygiYmFsYW5jZSIsInVuYmFsYW5jZSIpLGVhY2ggPSA3NSksMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVQyA9IHJlcChBVUMsZWFjaCA9IDI1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhPID0gcmVwKHJlcChyZXAoUkhPLGVhY2ggPSA1KSwzKSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ID0gcmVwKHJlcChDT1YsMTUpLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1YgPSBjKHNpbV9yZXN1bHRfYmxhbmNlJFIxVkFSX0NWLHNpbV9yZXN1bHRfdW5ibGFuY2UkUjFWQVJfQ1YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1fbmFuY3lfYmxhbmNlJFIxVkFSX0NWLHNpbV9uYW5jeV91bmJsYW5jZSRSMVZBUl9DVikpDQoNCg0KcDUgPSBnZ3Bsb3QoVkFSX0NWX2NvbWJpbmUlPiVmaWx0ZXIobWV0aG9kID09ICJDQ0FVQyIpLCBhZXMoeD0xOjE1MCx5ID0gQ1YpKSArIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gQVVDLCBzaGFwZSA9IFJITykpKw0KIGxhYnMoeCA9ICJjb25maWd1cmF0aW9ucyIsIHkgPSAiVkFSIENWIikgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gc2VxKDc1LDE0OSxieSA9IDc1KSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9MC41KSArDQogIHRoZW1lX2J3KCkgKyAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpIA0KDQojIyBDT1YgQ1YNCg0KQ09WX0NWX2NvbWJpbmUgPSBkYXRhLmZyYW1lKG1ldGhvZCA9IHJlcChjKCJDQ0FVQyIsIk5hbmN5IiksZWFjaCA9IDE1MCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduID0gcmVwKHJlcChjKCJiYWxhbmNlIiwidW5iYWxhbmNlIiksZWFjaCA9IDc1KSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVUMgPSByZXAoQVVDLGVhY2ggPSAyNSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhPID0gcmVwKHJlcChyZXAoUkhPLGVhY2ggPSA1KSwzKSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3YgPSByZXAocmVwKENPViwxNSksMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDViA9IGMoc2ltX3Jlc3VsdF9ibGFuY2UkUjFSMkNPVl9DVixzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfQ1YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1fbmFuY3lfYmxhbmNlJFIxUjJDT1ZfQ1Ysc2ltX25hbmN5X3VuYmxhbmNlJFIxUjJDT1ZfQ1YpKQ0KDQoNCnA2ID0gZ2dwbG90KENPVl9DVl9jb21iaW5lJT4lZmlsdGVyKG1ldGhvZCA9PSAiQ0NBVUMiKSwgYWVzKHg9MToxNTAseSA9IENWKSkgKyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IEFVQywgc2hhcGUgPSBSSE8pKSsNCiAgbGFicyh4ID0gImNvbmZpZ3VyYXRpb25zIiwgeSA9ICJDT1YgQ1YiKSArICN5bGltKDAsMi41KSArIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBzZXEoNzUsMTQ5LGJ5ID0gNzUpLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0wLjUpICsNCiAgdGhlbWVfYncoKSArICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgDQoNCg0KDQpncmlkLmFycmFuZ2UocDIscDMscDUscDYsbnJvdyA9IDIpDQoNCg0KDQoNCmBgYA0KDQoNCg0KIyMgQ29sdW1ucyBpbiB0aGUgYWJvdmUgZmlsZXMNCg0KICArICoqUjFBVUNfTUVBTioqOiBUaGUgbWVhbiBvZiByZWFkZXIgMSBiZXR3ZWVuLWNhc2VzIEFVQyBlc3RpbWF0ZXMgYW1vbmcgMTAsMDAwIHNpbXVsYXRpb25zLg0KICArICoqUjJBVUNfTUVBTioqOiBUaGUgbWVhbiBvZiByZWFkZXIgMiBiZXR3ZWVuLWNhc2VzIEFVQyBlc3RpbWF0ZXMgYW1vbmcgMTAsMDAwIHNpbXVsYXRpb25zLg0KICArICoqUjFBVUNfVkFSKio6IFRoZSB2YXJpYW5jZSBvZiByZWFkZXIgMSBiZXR3ZWVuLWNhc2VzIEFVQyBlc3RpbWF0ZXMgYW1vbmcgMTAsMDAwIHNpbXVsYXRpb25zLiANCiAgKyAqKlIyQVVDX1ZBUioqOiBUaGUgdmFyaWFuY2Ugb2YgcmVhZGVyIDIgYmV0d2Vlbi1jYXNlcyBBVUMgZXN0aW1hdGVzIGFtb25nIDEwLDAwMCBzaW11bGF0aW9ucy4gDQogICsgKipSMVZBUl9NRUFOKio6IFRoZSBtZWFuIG9mIHJlYWRlciAxIGJldHdlZW4tY2FzZXMgQVVDIHZhcmlhbmNlIGVzdGltYXRlcyBhbW9uZyAxMCwwMDAgc2ltdWxhdGlvbnMuDQogICsgKipSMlZBUl9NRUFOKio6IFRoZSBtZWFuIG9mIHJlYWRlciAyIGJldHdlZW4tY2FzZXMgQVVDIHZhcmlhbmNlIGVzdGltYXRlcyBhbW9uZyAxMCwwMDAgc2ltdWxhdGlvbnMuDQogICsgKipSMVZBUl9WQVIqKjogIFRoZSB2YXJpYW5jZSBvZiByZWFkZXIgMSBiZXR3ZWVuLWNhc2VzIEFVQyB2YXJpYW5jZSBlc3RpbWF0ZXMgYW1vbmcgMTAsMDAwIHNpbXVsYXRpb25zLg0KICArICoqUjJWQVJfVkFSKio6ICBUaGUgdmFyaWFuY2Ugb2YgcmVhZGVyIDIgYmV0d2Vlbi1jYXNlcyBBVUMgdmFyaWFuY2UgZXN0aW1hdGVzIGFtb25nIDEwLDAwMCBzaW11bGF0aW9ucy4NCiAgKyAqKlIxUjJDT1ZfTUVBTioqOiBUaGUgbWVhbiBvZiByZWFkZXIgMSBhbmQgcmVhZGVyIDIgYmV0d2Vlbi1jYXNlcyBBVUMgY292YXJpYW5jZSBlc3RpbWF0ZXMgYW1vbmcgMTAsMDAwIHNpbXVsYXRpb25zLg0KICArICoqUjFSMkNPVl9WQVIqKjogVGhlIHZhcmlhbmNlIG9mIHJlYWRlciAxIGFuZCByZWFkZXIgMiBiZXR3ZWVuLWNhc2VzIEFVQyBjb3ZhcmlhbmNlIGVzdGltYXRlcyBhbW9uZyAxMCwwMDAgc2ltdWxhdGlvbnMuDQogICsgKipUUlVFX1ZBUl9NRUFOKio6IFRoZSBtZWFuIG9mIGJldHdlZW4tY2FzZXMgQVVDIGVzdGltYXRvcidzIHRoZW9yZXRpY2FsIHZhcmlhbmNlcyBhbW9uZyAxMCwwMDAgc2ltdWxhdGlvbnMuDQogICsgKipUUlVFX1ZBUl9WQVIqKjogVGhlIHZhcmlhbmNlIG9mIGJldHdlZW4tY2FzZXMgQVVDIGVzdGltYXRvcidzIHRoZW9yZXRpY2FsIHZhcmlhbmNlcyBhbW9uZyAxMCwwMDAgc2ltdWxhdGlvbnMuIA0KICArICoqVFJVRV9DT1ZfTUVBTioqOiBUaGUgbWVhbiBvZiBiZXR3ZWVuLWNhc2VzIEFVQyBlc3RpbWF0b3IncyB0aGVvcmV0aWNhbCBjb3ZhcmlhbmNlcyBhbW9uZyAxMCwwMDAgc2ltdWxhdGlvbnMuDQogICsgKipUUlVFX0NPVl9WQVIqKjogVGhlIHZhcmlhbmNlIG9mIGJldHdlZW4tY2FzZXMgQVVDIGVzdGltYXRvcidzIHRoZW9yZXRpY2FsIGNvdmFyaWFuY2VzIGFtb25nIDEwLDAwMCBzaW11bGF0aW9ucy4gDQogICsgKipSMVIyQ09WX01DKio6IFRoZSBjb3ZhcmlhbmNlIGJldHdlZW4gcmVhZGVyIDEgYW5kIHJlYWRlciAyIGJldHdlZW4tY2FzZXMgQVVDIGVzdGltYXRlcyBhbW9uZyAxMCwwMDAgc2ltdWxhdGlvbnMuDQogICsgKipUUlVFX0FVQyoqOiBUaGUgdHJ1ZSBBVUMgdmFsdWVzIGZvciB0aGUgc2ltdWxhdGVkIGRhdGEuDQogIA0KIyMgNzUgY29uZmlndXJhdGlvbnMgaW4gdGhlIHNpbXVsYXRpb24NCg0KYGBge3IsZWNobz1GQUxTRX0NCg0Ka25pdHI6OmthYmxlKGNvbmZpZ3NfNzUsIGNhcHRpb24gPSAnNzUgY29uZmlndXJhdGlvbnMnKQ0KYGBgDQoNCg==