Preprocessing
Read ../rawdata_huprot/Control_1256587_2000143978.gpr
Read ../rawdata_huprot/Control_1311449_2000143966.gpr
Read ../rawdata_huprot/Control_1312497_2000143964.gpr
Read ../rawdata_huprot/Control_1313058_2000143976.gpr
Read ../rawdata_huprot/Grade_L_CJ_14434_2000143958.gpr
Read ../rawdata_huprot/Grade_L_CH_27096_2000155729.gpr
Read ../rawdata_huprot/Grade_L_CJ_3659_2000143955.gpr
Read ../rawdata_huprot/Grade_III_CH_15796_2000143692.gpr
Read ../rawdata_huprot/Grade_III_CJ_11032_2000143957.gpr
Read ../rawdata_huprot/Grade_III_CJ_27572_2000144442.gpr
Read ../rawdata_huprot/Grade_III_CJ_9761_2000144443.gpr
Read ../rawdata_huprot/Grade_III_CK_5121_2000144441.gpr
Read ../rawdata_huprot/Grade_III_CK_6451_2000144440.gpr
Read ../rawdata_huprot/Grade_IV_CH_12724_2000143977.gpr
Read ../rawdata_huprot/Grade_IV_CH_29738_2000143975.gpr
Read ../rawdata_huprot/Grade_IV_CH_31148_2000143961.gpr
Read ../rawdata_huprot/Grade_IV_CH_32705_2000155727.gpr
Read ../rawdata_huprot/Grade_IV_CJ_11291_2000143969.gpr
Read ../rawdata_huprot/Grade_IV_CJ_12441_2000143979.gpr


Intensity distribution pre normalization

Intensity distribution post normalization

PCA pre normalization
Performing principle component analysis on raw intensities, which have not been background corrected yields no separation for Low or high grade samples from the controls.

PCA post normalization

MDS post normalization

Heatmap post normalization


Differential Expression
Since the sample size is too less, we do not remove any samples even though they look like outliers on the MDS plot.
targets.protoarray <- readTargets('../rawdata/Protoarray_annotation.csv', sep=',')
targets.protoarray
targets
Conclusion
The table above represents the number of DE genes (adjusted p-value < 0.01) for protoarray and huprot assays. The ‘common’ column represents the number of common genes. ‘jaccard’ is a similarity metric.
We do not see ANY overlap between the two assays. There are two chief reasons:
The experiment is not balanaced: there are different number of samples involved at each level: control, grade2, grade3, grade4.
Sample size is too small: As evident from the PCA and MDS plots, there is too much heterogenity intra-grade and among controls.
Ideally point #2 should not affect the similarity we expect between huprot and protoarray results, but probably problems arising from #1 overshadow it.
At present, the results make little sense since there is no overlap at all.
Boxplots
LS0tCnRpdGxlOiAiSHVQcm90IENTRiBBbmFseXNpcyIKYXV0aG9yOiAiU2FrZXQgQ2hvdWRoYXJ5IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGZpZ19oZWlnaHQ6IDMwCiAgICBmaWdfd2lkdGg6IDMwCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdApkYXRlOiAiMDQvMTcvMjAxNyIKLS0tCgojIyBQcmVwcm9jZXNzaW5nCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KbGlicmFyeShsaW1tYSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KHBoZWF0bWFwKQpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnBsb3RIZWF0TWFwIDwtIGZ1bmN0aW9uKHksIGNvbmRpdGlvbil7CiAgc2FtcGxlRGlzdHMgPC0gZGlzdCh0KGxvZzIoeSRFKSkpCiAgc2FtcGxlRGlzdE1hdHJpeCA8LSBhcy5tYXRyaXgoc2FtcGxlRGlzdHMpCiAgcm93bmFtZXMoc2FtcGxlRGlzdE1hdHJpeCkgPC0gcGFzdGUoY29uZGl0aW9uLCBjb2xuYW1lcyh5JEUpLCBzZXA9Ii0iKQogIGNvbG5hbWVzKHNhbXBsZURpc3RNYXRyaXgpIDwtIE5VTEwKICBjb2xvcnMgPC0gY29sb3JSYW1wUGFsZXR0ZSggcmV2KGJyZXdlci5wYWwoOSwgIkJsdWVzIikpICkoMjU1KQogIHBoZWF0bWFwKHNhbXBsZURpc3RNYXRyaXgsCiAgICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9yb3dzPXNhbXBsZURpc3RzLAogICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9jb2xzPXNhbXBsZURpc3RzLAogICAgICAgICAgIGNvbD1jb2xvcnMpCn0KYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnRhcmdldHMgPC0gcmVhZFRhcmdldHMoJy4uL3Jhd2RhdGFfaHVwcm90L2h1cHJvdF9jb21tb24uY3N2Jywgc2VwPScsJykKdGFyZ2V0cyRDb25kaXRpb24gPC0gYXMuZmFjdG9yKHRhcmdldHMkQ29uZGl0aW9uKQp0YXJnZXRDb2xvcnMgPC0KICAgIHdpdGgodGFyZ2V0cywKICAgICAgICAgZGF0YS5mcmFtZShDb25kaXRpb24gPSBsZXZlbHMoQ29uZGl0aW9uKSwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9IEkoYnJld2VyLnBhbChubGV2ZWxzKENvbmRpdGlvbiksIG5hbWUgPSAnRGFyazInKSkpKQp4IDwtIHJlYWQubWFpbWFnZXModGFyZ2V0cyRGaWxlTmFtZSwKICAgICAgICAgICAgICAgICAgIHBhdGg9ZmlsZS5wYXRoKCcuLicsICdyYXdkYXRhX2h1cHJvdCcpLAogICAgICAgICAgICAgICAgICAgc291cmNlPSdnZW5lcGl4JywKICAgICAgICAgICAgICAgICAgIGNvbHVtbnM9bGlzdChHPSdGNjM1IE1lYW4nLCBHYj0nQjYzNSBNZWRpYW4nKSwKICAgICAgICAgICAgICAgICAgIGdyZWVuLm9ubHk9VFJVRSkKCngkZ2VuZXMkTmFtZSA8LSBnc3ViKCdcXG4nLCAnJywgeCRnZW5lcyROYW1lKQpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cm5lZ2F0aXZlLmNvbnRyb2xzIDwtIHgkZ2VuZXMkTmFtZSAlaW4lIGMoJ0JTQScsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIZUxhIGNlbGwgbHlzYXRlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AzMDAtQkhDJykKCnBvc2l0aXZlLmNvbnRyb2xzIDwtIHgkZ2VuZXMkTmFtZSAlaW4lIGMoJ0gyQScsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIMkInLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdINCcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR1NUMTBuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dTVDUwbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHU1QxMDBuJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHU1Q1MDBuJykKI3BhcihtZnJvdz1jKDEsMikpCnBhcihtYXI9Yyg4LDQsNCw0KSsuMSkKCmJveHBsb3QobG9nMih4JEVbbmVnYXRpdmUuY29udHJvbHMsXSksbGFzPTIsIG1haW49Ik5lZ2F0aXZlIENvbnRyb2xzIHJhdyBpbnRlbnNpdGllcyIseWxhYj0ibG9nMi1pbnRlbnNpdHkiLCBjZXguYXhpcz0wLjcpCnBhcihtYXI9Yyg4LDQsNCw0KSsuMSkKCmJveHBsb3QobG9nMih4JEVbcG9zaXRpdmUuY29udHJvbHMsXSksbGFzPTIsIG1haW49IlBvc2l0aXZlIENvbnRyb2xzIHJhdyBpbnRlbnNpdGllcyIseWxhYj0ibG9nMi1pbnRlbnNpdHkiLCBjZXguYXhpcz0wLjcpCmBgYAoKIyMgSW50ZW5zaXR5IGRpc3RyaWJ1dGlvbiBwcmUgbm9ybWFsaXphdGlvbgoKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KeCRnZW5lcyRTdGF0dXMgIDwtIHJlcCgncmVndWxhcicsIG5yb3coeCkpCngkZ2VuZXMkU3RhdHVzW3Bvc2l0aXZlLmNvbnRyb2xzXSA8LSAnUE9TSVRJVkUnCngkZ2VuZXMkU3RhdHVzW25lZ2F0aXZlLmNvbnRyb2xzXSA8LSAnTkVHQVRJVkUnCngkZ2VuZXMkSUQgPC0gZ3N1YignXFwuLionLCAnJywgeCRnZW5lcyRJRCkKeSA8LSBuZXFjKHgpCgpwYXIobWFyPWMoOCw0LDQsNCkrLjEpCgpib3hwbG90KGxvZzIoeCRFKSxsYXM9MiwgbWFpbj0iUHJlLW5vcm1hbGl6YXRpb24gaW50ZW5zaXRpZXMiLHlsYWI9ImxvZzItaW50ZW5zaXR5IiwgY29sPXRhcmdldENvbG9ycyRjb2xvclttYXRjaCh0YXJnZXRzW2NvbG5hbWVzKHgkRSksXSRDb25kaXRpb24sIHRhcmdldENvbG9ycyRDb25kaXRpb24pXSwgcGNoPTE5LCBjZXguYXhpcz0wLjcsIGNleD0wLjcpCmBgYAoKIyMgSW50ZW5zaXR5IGRpc3RyaWJ1dGlvbiBwb3N0IG5vcm1hbGl6YXRpb24KCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KcGFyKG1hcj1jKDgsNCw0LDQpKy4xKQpib3hwbG90KGxvZzIoeSRFKSxsYXM9MiwgbWFpbj0iUG9zdC1ub3JtYWxpemF0aW9uIGludGVuc2l0aWVzIix5bGFiPSJsb2cyLWludGVuc2l0eSIsIGNvbD10YXJnZXRDb2xvcnMkY29sb3JbbWF0Y2godGFyZ2V0c1tjb2xuYW1lcyh4JEUpLF0kQ29uZGl0aW9uLCB0YXJnZXRDb2xvcnMkQ29uZGl0aW9uKV0sIHBjaD0xOSwgY2V4LmF4aXM9MC43LCBjZXg9MC43KQpgYGAKCiMjIFBDQSBwcmUgbm9ybWFsaXphdGlvbgoKUGVyZm9ybWluZyBwcmluY2lwbGUgY29tcG9uZW50IGFuYWx5c2lzIG9uIHJhdyBpbnRlbnNpdGllcywgd2hpY2ggaGF2ZSBub3QgYmVlbiBiYWNrZ3JvdW5kIGNvcnJlY3RlZCB5aWVsZHMgbm8gc2VwYXJhdGlvbiBmb3IgTG93IG9yIGhpZ2ggZ3JhZGUgc2FtcGxlcyBmcm9tIHRoZSBjb250cm9scy4KCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cm9wYXIgPC0gcGFyKHBjaCA9IDE5KQoKcGMgPSBwcmNvbXAoIHQoIHgkRSAgKSwgc2NhbGU9VFJVRSApCnBjLnN1bW1hcnkgPC0gc3VtbWFyeShwYykKcGMxLnZhciA8LSBwYy5zdW1tYXJ5JGltcG9ydGFuY2VbMiwxXQpwYzIudmFyIDwtIHBjLnN1bW1hcnkkaW1wb3J0YW5jZVsyLDJdCgpwbG90KHBjJHhbLCAxOjJdLCAKICAgICBjb2w9dGFyZ2V0Q29sb3JzJGNvbG9yW21hdGNoKHRhcmdldHMkQ29uZGl0aW9uLCB0YXJnZXRDb2xvcnMkQ29uZGl0aW9uKV0sIAogICAgIGNleD0xLjUsIAogICAgIHhsYWIgPSBwYXN0ZSgnUEMxOiAnLCAxMDAqcGMxLnZhciwgJyUnLCBzZXA9JycpLCAKICAgICB5bGFiID0gIHBhc3RlKCdQQzI6ICcsIDEwMCpwYzIudmFyLCAnJScsIHNlcD0nJyksCiAgICAgbWFpbj0gIlBDQSBvbiByYXcgaW50ZW5zaXRpZXMiKQoKbGVnZW5kKHggPSAnYm90dG9tcmlnaHQnLCAKICAgICAgIGxlZ2VuZCA9IGFzLmNoYXJhY3Rlcih0YXJnZXRDb2xvcnMkQ29uZGl0aW9uKSwKICAgICAgIGNvbCA9IHRhcmdldENvbG9ycyRjb2xvciwgcGNoID0gcGFyKCJwY2giKSwgYnR5ID0gJ24nLCB4anVzdCA9IDEpCgpgYGAKCgojIyBQQ0EgcG9zdCBub3JtYWxpemF0aW9uCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cm9wYXIgPC0gcGFyKHBjaCA9IDE5KQoKcGMgPSBwcmNvbXAoIHQoIHkkRSAgKSwgc2NhbGU9VFJVRSApCnBjLnN1bW1hcnkgPC0gc3VtbWFyeShwYykKcGMxLnZhciA8LSBwYy5zdW1tYXJ5JGltcG9ydGFuY2VbMiwxXQpwYzIudmFyIDwtIHBjLnN1bW1hcnkkaW1wb3J0YW5jZVsyLDJdCgpwbG90KHBjJHhbLCAxOjJdLCBjb2w9dGFyZ2V0Q29sb3JzJGNvbG9yW21hdGNoKHRhcmdldHMkQ29uZGl0aW9uLCB0YXJnZXRDb2xvcnMkQ29uZGl0aW9uKV0sIGNleD0xLjUsIHhsYWIgPSBwYXN0ZSgnUEMxOiAnLCAxMDAqcGMxLnZhciwgJyUnLCBzZXA9JycpLCB5bGFiID0gIHBhc3RlKCdQQzI6ICcsIDEwMCpwYzIudmFyLCAnJScsIHNlcD0nJyksICAgICBtYWluPSAiUENBIG9uIGJhY2tncm91bmQgY29ycmVjdGVkIGFuZCBub3JtYWxpemVkIGludGVuc2l0aWVzIikKbGVnZW5kKHggPSAndG9wcmlnaHQnLCAKICAgICAgIGxlZ2VuZCA9IGFzLmNoYXJhY3Rlcih0YXJnZXRDb2xvcnMkQ29uZGl0aW9uKSwKICAgICAgIGNvbCA9IHRhcmdldENvbG9ycyRjb2xvciwgcGNoID0gcGFyKCJwY2giKSwgYnR5ID0gJ24nLCB4anVzdCA9IDEpCmBgYAoKCiMjIE1EUyBwb3N0IG5vcm1hbGl6YXRpb24KCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cm9wYXIgPC0gcGFyKHBjaCA9IDE5KQpwbG90TURTKHksICBjb2w9dGFyZ2V0Q29sb3JzJGNvbG9yW21hdGNoKHRhcmdldHMkQ29uZGl0aW9uLCB0YXJnZXRDb2xvcnMkQ29uZGl0aW9uKV0sIGNleD0xLjIsIHBjaD0xOSkKbGVnZW5kKHggPSAndG9wcmlnaHQnLCAKICAgICAgIGxlZ2VuZCA9IGFzLmNoYXJhY3Rlcih0YXJnZXRDb2xvcnMkQ29uZGl0aW9uKSwKICAgICAgIGNvbCA9IHRhcmdldENvbG9ycyRjb2xvciwgcGNoID0gcGFyKCJwY2giKSwgYnR5ID0gJ24nLCB4anVzdCA9IDEpCgpgYGAKCiMjIEhlYXRtYXAgcG9zdCBub3JtYWxpemF0aW9uCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KcGxvdEhlYXRNYXAoeSwgdGFyZ2V0cyRDb25kaXRpb24pCmBgYAoKCiMjIERpZmZlcmVudGlhbCBFeHByZXNzaW9uCgpTaW5jZSB0aGUgc2FtcGxlIHNpemUgaXMgdG9vIGxlc3MsIHdlIGRvIG5vdCByZW1vdmUgYW55IHNhbXBsZXMgZXZlbiB0aG91Z2ggdGhleSBsb29rIGxpa2Ugb3V0bGllcnMgb24gdGhlIE1EUyBwbG90LgoKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIGYgPC0gZmFjdG9yKHRhcmdldHMkQ29uZGl0aW9uLCBsZXZlbHMgPSB1bmlxdWUodGFyZ2V0cyRDb25kaXRpb24pKQogZGVzaWduIDwtIG1vZGVsLm1hdHJpeCh+MCArIGYpCiBjb2xuYW1lcyhkZXNpZ24pIDwtIGxldmVscyhmKQpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmNvcmZpdCA8LSBkdXBsaWNhdGVDb3JyZWxhdGlvbih5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmR1cHM9MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmc9MQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQpmaXQgPC0gbG1GaXQoeSwKICAgICAgICAgICAgIGRlc2lnbiwKICAgICAgICAgICAgIG5kdXBzPTIsCiAgICAgICAgICAgICBjb3JyZWxhdGlvbj1jb3JmaXQkY29uc2Vuc3VzLmNvcnJlbGF0aW9uKQoKY29udHJhc3QubWF0cml4IDwtIG1ha2VDb250cmFzdHMoR3JhZGUydnNHcmFkZTE9R3JhZGUyLUdyYWRlMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWRlM3ZzR3JhZGUyPUdyYWRlMy1HcmFkZTIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFkZTR2c0dyYWRlMz1HcmFkZTQtR3JhZGUzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFkZTF2c0NvbnRyb2w9R3JhZGUxLUNvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWRlMnZzQ29udHJvbD1HcmFkZTItQ29udHJvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZGUzdnNDb250cm9sPUdyYWRlMy1Db250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFkZTR2c0NvbnRyb2w9R3JhZGU0LUNvbnRyb2wsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZGV2c0NvbnRyb2w9KEdyYWRlMStHcmFkZTIrR3JhZGUzK0dyYWRlNCkvNC1Db250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWdoR3JhZGV2c0NvbnRyb2w9KEdyYWRlMytHcmFkZTQpLzItQ29udHJvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG93R3JhZGV2c0NvbnRyb2w9KEdyYWRlMStHcmFkZTIpLzItQ29udHJvbCwKICAgICAgICAgICAgICAgICAgSGlnaEdyYWRldnNMb3dHcmFkZT0oR3JhZGUzK0dyYWRlNCkvMi0oR3JhZGUxK0dyYWRlMikvMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZGUzdnNMb3dHcmFkZT1HcmFkZTMtKEdyYWRlMStHcmFkZTIpLzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWRlNHZzTG93R3JhZGU9R3JhZGU0LShHcmFkZTErR3JhZGUyKS8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9ZGVzaWduKQpmaXQyIDwtIGNvbnRyYXN0cy5maXQoZml0LCBjb250cmFzdC5tYXRyaXgpCmZpdDIgPC0gZUJheWVzKGZpdDIpCmNvZWZzIDwtIGMoJ0dyYWRlMnZzR3JhZGUxJywKICAgICAgICAgICAnR3JhZGUzdnNHcmFkZTInLAogICAgICAgICAgICdHcmFkZTR2c0dyYWRlMycsCiAgICAgICAgICAgJ0dyYWRlMXZzQ29udHJvbCcsCiAgICAgICAgICAgJ0dyYWRlMnZzQ29udHJvbCcsCiAgICAgICAgICAgJ0dyYWRlM3ZzQ29udHJvbCcsCiAgICAgICAgICAgJ0dyYWRlNHZzQ29udHJvbCcsCiAgICAgICAgICAgJ0dyYWRldnNDb250cm9sJywKICAgICAgICAgICAnSGlnaEdyYWRldnNDb250cm9sJywKICAgICAgICAgICAnTG93R3JhZGV2c0NvbnRyb2wnLAogICAgICAgICAgICdIaWdoR3JhZGV2c0xvd0dyYWRlJywKICAgICAgICAgICAnR3JhZGUzdnNMb3dHcmFkZScsCiAgICAgICAgICAgJ0dyYWRlNHZzTG93R3JhZGUnKQpleHByZXNzaW9uVmFsdWVzIDwtIGFzLmRhdGEuZnJhbWUoeSRFKQp3cml0ZS50YWJsZShleHByZXNzaW9uVmFsdWVzLCAKICAgICAgICAgICAgZmlsZS5wYXRoKCcuLicsICAncmVzdWx0c19odXByb3RfMDQxNjIwMTcnLHBhc3RlKCdodXByb3Rfbm9ybWFsaXplZF92YWx1ZXMnLCdjc3YnLCBzZXA9Jy4nKSApKQpmb3IgKGNvZWYgaW4gY29lZnMpewogIHR0IDwtIHRvcFRhYmxlKGZpdDIsIGNvZWY9Y29lZiwgbnVtYmVyID0gSW5mKQogIHR0LnNpZyA8LSBzdWJzZXQodHQsIHR0JGFkai5QLlZhbDwwLjEpCiAgd3JpdGUudGFibGUodHQsIGZpbGUucGF0aCgnLi4nLCAncmVzdWx0c19odXByb3RfMDQxNjIwMTcnLCBwYXN0ZShjb2VmLCdjc3YnLCBzZXA9Jy4nKSApLCByb3cubmFtZXMgPSBGQUxTRSkKICB3cml0ZS50YWJsZSh0dC5zaWcsIGZpbGUucGF0aCgnLi4nLCAncmVzdWx0c19odXByb3RfMDQxNjIwMTcnLCAnc2lnbmlmaWNhbnRfZmlsdGVyZWQnLCBwYXN0ZShjb2VmLCdjc3YnLCBzZXA9Jy4nKSApLCByb3cubmFtZXMgPSBGQUxTRSkKfQoKYGBgCgoKCgoKCgpgYGB7cn0KdGFyZ2V0cy5wcm90b2FycmF5IDwtIHJlYWRUYXJnZXRzKCcuLi9yYXdkYXRhL1Byb3RvYXJyYXlfYW5ub3RhdGlvbi5jc3YnLCBzZXA9JywnKQoKYGBgCgpgYGB7cn0KdGFyZ2V0cy5wcm90b2FycmF5CmBgYAoKYGBge3J9CnRhcmdldHMKYGBgCgojIyBDb25jbHVzaW9uClRoZSB0YWJsZSBhYm92ZSByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgREUgZ2VuZXMgKGFkanVzdGVkIHAtdmFsdWUgPCAwLjAxKSBmb3IgcHJvdG9hcnJheSBhbmQgaHVwcm90IGFzc2F5cy4gVGhlICdjb21tb24nIGNvbHVtbiByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgY29tbW9uIGdlbmVzLiAnamFjY2FyZCcgaXMgYSBzaW1pbGFyaXR5IG1ldHJpYy4KCldlIGRvIG5vdCBzZWUgQU5ZIG92ZXJsYXAgYmV0d2VlbiB0aGUgdHdvIGFzc2F5cy4gVGhlcmUgYXJlIHR3byBjaGllZiByZWFzb25zOgoKMS4gVGhlIGV4cGVyaW1lbnQgaXMgbm90IGJhbGFuYWNlZDogdGhlcmUgYXJlIGRpZmZlcmVudCBudW1iZXIgb2Ygc2FtcGxlcyBpbnZvbHZlZCBhdCBlYWNoIGxldmVsOiBjb250cm9sLCBncmFkZTIsIGdyYWRlMywgZ3JhZGU0LiAKCjIuIFNhbXBsZSBzaXplIGlzIHRvbyBzbWFsbDogQXMgZXZpZGVudCBmcm9tIHRoZSBQQ0EgYW5kIE1EUyBwbG90cywgdGhlcmUgaXMgdG9vIG11Y2ggaGV0ZXJvZ2VuaXR5IGludHJhLWdyYWRlIGFuZCBhbW9uZyBjb250cm9scy4KCklkZWFsbHkgcG9pbnQgIzIgc2hvdWxkIG5vdCBhZmZlY3QgdGhlIHNpbWlsYXJpdHkgd2UgZXhwZWN0IGJldHdlZW4gaHVwcm90IGFuZCBwcm90b2FycmF5IHJlc3VsdHMsIGJ1dCBwcm9iYWJseSBwcm9ibGVtcyBhcmlzaW5nIGZyb20gIzEgb3ZlcnNoYWRvdyBpdC4KCkF0IHByZXNlbnQsIHRoZSByZXN1bHRzIG1ha2UgbGl0dGxlIHNlbnNlIHNpbmNlIHRoZXJlIGlzIG5vIG92ZXJsYXAgYXQgYWxsLgoKCiMjIEJveHBsb3RzCgo=