This document shows the proportional matrix. For all 57 amino acids and secondary structures combinations, we further analysis the overlaping of each combination against the rest of 56, and we structured a \(57\times57\) matrix to representation the proportion.

Raw matrix

Normalize by row then by column

Verify results

verify Results

Final matrix Bill

Save the proportional matrix

Moseley Matrix

Final matrix Moseley

Save the proportional matrix

Results

Normalize row and column:

Normalize only the column

April 24

Using the raw matrix, which was calculated use all the chemical shifts from the RefDB.

Using the chemical shifts from the , which was calculated use all the chemical shifts from the RefDB.

Results using the proprotional matrix with rmsd

Using the good data from rmsd

 [1] -0.16326530612244894 -0.36734693877550995 -0.36734693877550995 -0.20408163265306101  0.08163265306122436 -0.24489795918367330
 [7]  0.08163265306122436  0.04081632653061207 -0.32653061224489766 -0.20408163265306123 -0.12244897959183665 -0.08163265306122436
[13]  0.08163265306122436  0.53061224489795955  0.00000000000000000  0.44897959183673497  0.32653061224489766  0.77551020408163263
[19]  0.57142857142857162  0.24489795918367308 -0.12244897959183665  0.24489795918367308  0.24489795918367308  0.16326530612244872
[25] -0.04081632653061229  0.32653061224489766  0.61224489795918391  0.12244897959183665  0.28571428571428537 -0.12244897959183665
[31]  0.12244897959183665 -0.12244897959183665  0.20408163265306078  0.04081632653061207  0.12244897959183665 -0.04081632653061229
[37]  0.04081632653061207  0.08163265306122436  0.08163265306122436  0.24489795918367308  0.16326530612244872  0.12244897959183665
[43] -0.04081632653061229  0.08163265306122436 -0.16326530612244894 -0.16326530612244894  0.12244897959183665  0.00000000000000000
[49] -0.20408163265306101  0.36734693877550972 -0.08163265306122436  0.08163265306122436  0.08163265306122436  0.12244897959183665
[55]  0.28571428571428537  0.16326530612244872  0.28571428571428537  0.08163265306122436  0.16326530612244872  0.28571428571428537
[61]  0.00000000000000000

What matrix combine or seperate

May 3-5

Normalized by column and find weights

 [1] 0.51214148347058230 0.03176934092584900 0.15415605147800565 0.07828351612353736 0.11524902277696929 0.07252957977472466 0.15521635884857016
 [8] 0.13661039250366827 0.21635717234681523 0.10998630153858069 0.17602988827691465 0.30543489130117951 0.09843704243437859 0.08784392182500152
[15] 0.49425942877749285 0.46858851573989546 0.22641114619534528 0.07246193731983087 0.10395384099537326 0.48159345332431625 0.02461644448496505
[22] 0.17567055042496313 0.08206947517008081 0.09661492950631106 0.06776373687033983 0.15858295870400452 0.09136767611965134 0.14354716699054532
[29] 0.08426721053537944 0.24650156267135717 0.28949214991990524 0.09717760023850724 0.07438239744768939 0.45563239698936858 0.43560024774424849
[36] 0.15682530514873516 0.06625378136668220 0.10273746737510903 0.71702411436938929 0.05042691287631578 0.16189321429077033 0.18433686569726418
[43] 0.19138298083102914 0.08851487851448107 0.56858036786961796 0.24680957471283466 0.23917459058982127 0.09761311807111921 0.22039461616176848
[50] 0.39807394624098852 0.20836648312608869 0.13470368544261424 0.61044174942489549 0.61280144689448190 0.38079292947325127 0.09870388943545076
[57] 0.23583189705205529

[1] 0.8163265

May 6th Results

Without Prior

  • 90% Confident Range
[1] 0.7346939

With Prior

  • 90% Confident Range
[1] 0.8571429

May 9th Results

Without Prior

  • 90% Confident Range
[1] 0.7346939

With Prior

  • 90% Confident Range
[1] 0.9387755
LS0tCnRpdGxlOiAiUHJvcG9ydGlvbmFsIG1hdHJpeCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBkb2N1bWVudCBzaG93cyB0aGUgcHJvcG9ydGlvbmFsIG1hdHJpeC4gRm9yIGFsbCA1NyBhbWlubyBhY2lkcyBhbmQgc2Vjb25kYXJ5IHN0cnVjdHVyZXMgY29tYmluYXRpb25zLCB3ZSBmdXJ0aGVyIGFuYWx5c2lzIHRoZSBvdmVybGFwaW5nIG9mIGVhY2ggY29tYmluYXRpb24gYWdhaW5zdCB0aGUgcmVzdCBvZiA1NiwgYW5kIHdlIHN0cnVjdHVyZWQgYSAkNTdcdGltZXM1NyQgbWF0cml4IHRvIHJlcHJlc2VudGF0aW9uIHRoZSBwcm9wb3J0aW9uLiAKCmBgYHtyIFJlZkRHX2Rpc3QsIGNhY2hlPVRSVUUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRpciA8LSAiLi4vZGF0YS9HZW5lcmF0ZWQtTkEvIgojIGZpbGVzIDwtIGxpc3QuZmlsZXMoZGlyKQojICMgcHJpbnQoZmlsZXMpCiMgIyBmaWxlcyA8LSBmaWxlc1stZ3JlcCgiQ08iLCBmaWxlcyldCiMgZmlsZXMgPC0gZmlsZXNbLWdyZXAoIi1VLSIsIGZpbGVzKV0KCiNnZXR3ZCgpCgphYSA9IGMoICAgICAgICJBIiwgICAiUiIsICAgIk4iLCAgICJEIiwgICAiQyIsICAgIlEiLCAgICJFIiwgICAiSCIsICAgIkkiLCAgICJMIiwgICAiSyIsICAgIk0iLCAgICJGIiwgICAiUCIsICAgIlMiLCAgICJUIiwgICAiWSIsICAiVyIsICJWIikKc3MgPSBjKCJCIiwgIkMiLCAiSCIpCgpwb3AudGFibGUgPC0gZGF0YS5mcmFtZSgpCmZvcihhIGluIGFhKXsKICAgICAgICBIQ0EgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGlyLCBhLCAiLUgtQ0EudHh0IikpCiAgICAgICAgSENCIDwtIHJlYWQudGFibGUocGFzdGUwKGRpciwgYSwgIi1ILUNCLnR4dCIpKQogICAgICAgIEJDQSA8LSByZWFkLnRhYmxlKHBhc3RlMChkaXIsIGEsICItQi1DQS50eHQiKSkKICAgICAgICBCQ0IgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGlyLCBhLCAiLUItQ0IudHh0IikpCiAgICAgICAgQ0NBIDwtIHJlYWQudGFibGUocGFzdGUwKGRpciwgYSwgIi1DLUNBLnR4dCIpKQogICAgICAgIENDQiA8LSByZWFkLnRhYmxlKHBhc3RlMChkaXIsIGEsICItQy1DQi50eHQiKSkKICAgICAgICAKICAgICAgICBIQ0EgPC0gY2JpbmQoYSwgIkgiLCAiQ0EiLCBIQ0EpCiAgICAgICAgY29sbmFtZXMoSENBKSA8LSBjKCJSZXNpZHVlIiwgIlNTIiwgIkNhcmJvbiIsICJWYWx1ZSIpCiAgICAgICAgSENCIDwtIGNiaW5kKGEsICJIIiwgIkNCIiwgSENCKQogICAgICAgIGNvbG5hbWVzKEhDQikgPC0gYygiUmVzaWR1ZSIsICJTUyIsICJDYXJib24iLCAiVmFsdWUiKQogICAgICAgIEJDQSA8LSBjYmluZChhLCAiQiIsICJDQSIsIEJDQSkKICAgICAgICBjb2xuYW1lcyhCQ0EpIDwtIGMoIlJlc2lkdWUiLCAiU1MiLCAiQ2FyYm9uIiwgIlZhbHVlIikKICAgICAgICBCQ0IgPC0gY2JpbmQoYSwgIkIiLCAiQ0IiLCBCQ0IpCiAgICAgICAgY29sbmFtZXMoQkNCKSA8LSBjKCJSZXNpZHVlIiwgIlNTIiwgIkNhcmJvbiIsICJWYWx1ZSIpCiAgICAgICAgQ0NBIDwtIGNiaW5kKGEsICJDIiwgIkNBIiwgQ0NBKQogICAgICAgIGNvbG5hbWVzKENDQSkgPC0gYygiUmVzaWR1ZSIsICJTUyIsICJDYXJib24iLCAiVmFsdWUiKQogICAgICAgIENDQiA8LSBjYmluZChhLCAiQyIsICJDQiIsIENDQikKICAgICAgICBjb2xuYW1lcyhDQ0IpIDwtIGMoIlJlc2lkdWUiLCAiU1MiLCAiQ2FyYm9uIiwgIlZhbHVlIikKICAgICAgICAKICAgICAgICB0IDwtIHJiaW5kLmRhdGEuZnJhbWUoSENBLCBIQ0IsIEJDQSwgQkNCLCBDQ0EsIENDQiwgc3RyaW5nc0FzRmFjdG9ycyA9IEYpCiAgICAgICAgcG9wLnRhYmxlIDwtIHJiaW5kLmRhdGEuZnJhbWUocG9wLnRhYmxlLCB0KQp9CmBgYAoKCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcmVxdWlyZWRQYWNrYWdlcyA9IGMoImRhdGEudGFibGUiLCAic2VxaW5yIiwgInBseXIiLCAiZHBseXIiKQpmb3IocCBpbiByZXF1aXJlZFBhY2thZ2VzKXsKICAgICAgICBpZighcmVxdWlyZShwLGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkpIGluc3RhbGwucGFja2FnZXMocCkKICAgICAgICBsaWJyYXJ5KHAsY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQp9Cm9wdGlvbnMoZGlnaXRzPTE2KQoKCmRpciA8LSAiLi4vZGF0YS8iCgpBYUNvZGVzU2luZ2xlLnYgPSBjKCJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJIIiwgIkkiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiViIsICJXIiwgIlkiKQpBYUNvZGVzU2luZ2xlMTkudiA9IGMoIkEiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJIIiwgIkkiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiViIsICJXIiwgIlkiKQpBYUNvZGVzM0xldHRlckFsbENhcC52ID0gYygiQUxBIiwgIkNZUyIsICJBU1AiLCAiR0xVIiwgIlBIRSIsICJISVMiLCAiSUxFIiwgIkxZUyIsICJMRVUiLCAiTUVUIiwgIkFTTiIsICJQUk8iLCAiR0xOIiwgIkFSRyIsICJTRVIiLCAiVEhSIiwgIlZBTCIsICJUUlAiLCJUWVIiKQpBYUNvZGVzM0xldHRlcjFzdENhcC52ID0gYygiQWxhIiwgIkN5cyIsICJBc3AiLCAiR2x1IiwgIlBoZSIsICJIaXMiLCAiSWxlIiwgIkx5cyIsICJMZXUiLCAiTWV0IiwgIkFzbiIsICJQcm8iLCAiR2xuIiwgIkFyZyIsICJTZXIiLCAiVGhyIiwgIlZhbCIsICJUcnAiLCJUeXIiKQojIFJlYWRpbmcgaW4gYWxsIHRoZSBzdGF0aXNpdGNzClJlZkRCLlN0YXRDQSA8LSByZWFkLmNzdihwYXN0ZShkaXIsICJSZWZEQi5jYVN0YXQuY3N2Iiwgc2VwPSIiKSkKCgoKIyBGaW5kIGFsbCB0aGUgbWVhbiBhbmQgc2Q6CiMgUmVhZGluZyBpbiBhbGwgdGhlIHN0YXRpc2l0Y3MKUmVmREIuU3RhdENBIDwtIHJlYWQuY3N2KHBhc3RlKGRpciwgIlJlZkRCLmNhU3RhdC5jc3YiLCBzZXA9IiIpKQpSZWZEQi5TdGF0Q0IgPC0gcmVhZC5jc3YocGFzdGUoZGlyLCAiUmVmREIuY2JTdGF0LmNzdiIsIHNlcD0iIikpClJlZkRCLlN0YXRDQiA8LSBSZWZEQi5TdGF0Q0Jbd2hpY2goUmVmREIuU3RhdENCJFJlc2lkdWUhPSJHbHkiKSxdICMgUmVtb3ZlIHRoZSBnbHljaW5lCkNhcmJvbkNvdi50IDwtIHJlYWQuY3N2KHBhc3RlKGRpciwgIkNhcmJvbkNvdlRhYmxlX0JDLmNzdiIsIHNlcD0iIikpCgoKIyBSZWFkaW5nIGluIHRoZSBwb3B1bGF0aW9uIHN0YXRpc3RpY3MKUG9wU3RhdHMgPC0gcmVhZC50YWJsZShwYXN0ZShkaXIsICJhYVBvcFN0YXQuY3N2Iiwgc2VwPSIiKSkKCiMgR2VuZXJhdGUgYXZlcmFnZSBjb3ZhcmlhbmNlCkF2Z0Nvdi50IDwtIHJlYWQuY3N2KHBhc3RlKGRpciwgImF2Z0Nvdl9CQy5jc3YiLCBzZXA9IiIpKSAjIHJvd05hbWUgaXMgZnJvbSB0aGUgQWFDb2Rlc1NpbmdsZS52CiMgR2VuZXJhdGUgY292YXJpYW5jZSBiYXNlZCBvbiBzZWNvbmRhcnkgc3RydWN0dXJlCkNhcmJvbkNvdi50IDwtIENhcmJvbkNvdi50Wy1ncmVwKCItQSIsIENhcmJvbkNvdi50JCJBQS5TUyIpLF0KCiMgRmluZCBhbGwgdGhlIG1lYW4gYW5kIHNkOgpDQVNkVGFibGUgPSBkYXRhLmZyYW1lKFJlZkRCLlN0YXRDQSRSZXNpZHVlLCBSZWZEQi5TdGF0Q0EkQ29pbC5zZCwgUmVmREIuU3RhdENBJEhlbGl4LnNkLCBSZWZEQi5TdGF0Q0EkQmV0YS5zZCwgUmVmREIuU3RhdENBJEF2Zy5zZCkKY29sbmFtZXMoQ0FTZFRhYmxlKSA9IGMoIlJlc2lkdWUiLCAiQyIsICJIIiwgIkIiLCAiQSIpCgpDQlNkVGFibGUgPSBkYXRhLmZyYW1lKFJlZkRCLlN0YXRDQiRSZXNpZHVlLCBSZWZEQi5TdGF0Q0IkQ29pbC5zZCwgUmVmREIuU3RhdENCJEhlbGl4LnNkLCBSZWZEQi5TdGF0Q0IkQmV0YS5zZCwgUmVmREIuU3RhdENCJEF2Zy5zZCkKY29sbmFtZXMoQ0JTZFRhYmxlKSA9IGMoIlJlc2lkdWUiLCAiQyIsICJIIiwgIkIiLCAiQSIpCgpDQU11VGFibGUgPSBkYXRhLmZyYW1lKFJlZkRCLlN0YXRDQSRSZXNpZHVlLCBSZWZEQi5TdGF0Q0EkQ29pbC5tdSwgUmVmREIuU3RhdENBJEhlbGl4Lm11LCBSZWZEQi5TdGF0Q0EkQmV0YS5tdSwgUmVmREIuU3RhdENBJEF2Zy5tdSkKY29sbmFtZXMoQ0FNdVRhYmxlKSA9IGMoIlJlc2lkdWUiLCAiQyIsICJIIiwgIkIiLCAiQSIpCgpDQk11VGFibGUgPSBkYXRhLmZyYW1lKFJlZkRCLlN0YXRDQiRSZXNpZHVlLCBSZWZEQi5TdGF0Q0IkQ29pbC5tdSwgUmVmREIuU3RhdENCJEhlbGl4Lm11LCBSZWZEQi5TdGF0Q0IkQmV0YS5tdSwgUmVmREIuU3RhdENCJEF2Zy5tdSkKY29sbmFtZXMoQ0JNdVRhYmxlKSA9IGMoIlJlc2lkdWUiLCAiQyIsICJIIiwgIkIiLCAiQSIpCgpjb3ZNYXRyaXguRC5mIDwtIGZ1bmN0aW9uKCBuYW1lICl7CiAgICAgICAgCiAgICAgICAgQUEubmFtZSA8LSB1bmxpc3Qoc3Ryc3BsaXQobmFtZSwgIi0iKSlbMV0KICAgICAgICBTUy5uYW1lIDwtIHVubGlzdChzdHJzcGxpdChuYW1lLCAiLSIpKVsyXQogICAgICAgIAogICAgICAgIHNkLmNhIDwtIENBU2RUYWJsZVtDQVNkVGFibGUkUmVzaWR1ZT09QUEubmFtZSxdW1NTLm5hbWVdCiAgICAgICAgc2QuY2IgPC0gQ0JTZFRhYmxlW0NCU2RUYWJsZSRSZXNpZHVlPT1BQS5uYW1lLF1bU1MubmFtZV0KICAgICAgICBzZC5jYS5kb3VibGUgPC0gYXMuZG91YmxlKHNkLmNhKQogICAgICAgIHNkLmNiLmRvdWJsZSA8LSBhcy5kb3VibGUoc2QuY2IpCiAgICAgICAgCiAgICAgICAgdiA8LSBDYXJib25Db3YudFtDYXJib25Db3YudFssMV09PW5hbWUsXVssMl0KICAgICAgICBjb3ZNYXRyaXggPC0gbWF0cml4KGMoc2QuY2EuZG91YmxlXjIsIHYsIHYsIHNkLmNiLmRvdWJsZV4yKSwgMiAsIDIsIGJ5cm93ID0gVCkKICAgICAgICByZXR1cm4oY292TWF0cml4KQp9CgojdGVzdC5jb3YuQiA8LSBjb3ZNYXRyaXguQi5mKG5hbWUgPSAiQi1DIikKI3Rlc3QuY292LkIKCmludkNvdk1hdExpc3QubC5EID0gbGlzdCgpCmZvcihhYXNzIGluIENhcmJvbkNvdi50JEFBLlNTICl7CiAgICAgICAgQ292TWF0cml4ID0gY292TWF0cml4LkQuZihhYXNzKQogICAgICAgIGludkNvdk1hdHJpeCA9IHNvbHZlKENvdk1hdHJpeCkKICAgICAgICBpbnZDb3ZNYXRMaXN0LmwuRFtbYWFzc11dID0gaW52Q292TWF0cml4Cn0KIyBHbHljaW5lIFByb2JhYmlsaXR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpnbHlQcm9iLmYgPSBmdW5jdGlvbihwYXJhKXsKICAgICAgICBwcm9iID0gMipwbm9ybSgtYWJzKHBhcmEpKQogICAgICAgIHJldHVybihwcm9iKQp9CgpjYUJNdSA8LSBDQU11VGFibGVbQ0FNdVRhYmxlJFJlc2lkdWU9PSJHIiwgIkIiXQpjYUNNdSA8LSBDQU11VGFibGVbQ0FNdVRhYmxlJFJlc2lkdWU9PSJHIiwgIkMiXQpjYUhNdSA8LSBDQU11VGFibGVbQ0FNdVRhYmxlJFJlc2lkdWU9PSJHIiwgIkgiXQoKY2FCU2QgPC0gQ0FTZFRhYmxlW0NBU2RUYWJsZSRSZXNpZHVlPT0iRyIsICJCIl0KY2FDU2QgPC0gQ0FTZFRhYmxlW0NBU2RUYWJsZSRSZXNpZHVlPT0iRyIsICJDIl0KY2FIU2QgPC0gQ0FTZFRhYmxlW0NBU2RUYWJsZSRSZXNpZHVlPT0iRyIsICJIIl0KCiMgQWxsIHRoZSByZXN0IDE5IEFBcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQ2hpU3RyLmYgPC0gZnVuY3Rpb24oZGF0YUNhQ2Iudiwgc2Vjb25kYXJ5U3RydWN0dXJlLCBpbnZDb3ZNYXRMaXN0KSB7CiAgICAgICAgbmFtZXMgPC0gYygpCiAgICAgICAgY2hpU3RyLnYgPC0gYygpCiAgICAgICAgc3MgPC0gc2Vjb25kYXJ5U3RydWN0dXJlCiAgICAgICAgZGF0YUNhQ2IubSA8LSBhcy5tYXRyaXgoZGF0YUNhQ2IudikKICAgICAgICAKICAgICAgICBmb3IgKGFhIGluIEFhQ29kZXNTaW5nbGUudikgewogICAgICAgICAgICAgICAgbmFtZSA8LSBwYXN0ZShhYSwgc2Vjb25kYXJ5U3RydWN0dXJlLCBzZXAgPSAiLSIpCiAgICAgICAgICAgICAgICBuYW1lcyA8LSBjKG5hbWVzLCBuYW1lKQogICAgICAgICAgICAgICAgY2FNdSA8LSBDQU11VGFibGVbQ0FNdVRhYmxlJFJlc2lkdWU9PWFhLCBzc10KICAgICAgICAgICAgICAgIGNiTXUgPC0gQ0JNdVRhYmxlW0NCTXVUYWJsZSRSZXNpZHVlPT1hYSwgc3NdCiAgICAgICAgICAgICAgICBtZWFuLm0gPC0gYXMubWF0cml4KGMoY2FNdSwgY2JNdSkpCiAgICAgICAgICAgICAgICBpbnZDb3YgPC0gaW52Q292TWF0TGlzdFtbbmFtZV1dCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGRhdGFDYUNiLm0gPC0gYXMubWF0cml4KGRhdGFDYUNiLnYpCiAgICAgICAgICAgICAgICBjaGlTdHIgPC0gdChkYXRhQ2FDYi5tIC0gbWVhbi5tKSAlKiUgaW52Q292ICUqJSAoZGF0YUNhQ2IubSAtIG1lYW4ubSkKICAgICAgICAgICAgICAgIGNoaVN0ci52IDwtIGMoY2hpU3RyLnYsIGNoaVN0cikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbmFtZXMoY2hpU3RyLnYpIDwtIG5hbWVzCiAgICAgICAgcmV0dXJuKGNoaVN0ci52KQp9CgpBYVByb2IuZiA9IGZ1bmN0aW9uKGNoaVN0cil7CiAgICAgICAgcHJvYiA9IDEtcGNoaXNxKGNoaVN0ciwgZGY9MikKICAgICAgICByZXR1cm4ocHJvYikKfQoKCmBgYAoKCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbG9hZCgiLi4vZGF0YS9SZWZEQl9wcmlvci5SRGF0YSIpCkFBX1NTX2xhYmVsIDwtIHByaW9yW1s5ODddXVssMToyXQpBQV9TU19sYWJlbApgYGAKCiMjIFJhdyBtYXRyaXgKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpQcm9wb3J0aW9uYWxNYXRyaXggPC0gZGF0YS5mcmFtZSgpCgpmb3IgKGkgaW4gMTo1NykgewogICAgICAgIGFhID0gQUFfU1NfbGFiZWxbaSwxXQogICAgICAgIHNzID0gQUFfU1NfbGFiZWxbaSwyXQoKICAgICAgICBjcyA8LSBwb3AudGFibGUgJT4lIGZpbHRlcihSZXNpZHVlPT1hYSAmIFNTID09IHNzKQogICAgICAgIGNhY2IgPC0gZGF0YS5mcmFtZShDQSA9IHN1YnNldChjcywgQ2FyYm9uID09ICJDQSIpWyJWYWx1ZSJdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0IgPSBzdWJzZXQoY3MsIENhcmJvbiA9PSAiQ0IiKVsiVmFsdWUiXSkKICAgICAgICBjb2xuYW1lcyhjYWNiKSA8LSBjKCJDQSIsICJDQiIpCiAgICAgICAgY2FjYiA9IG5hLm9taXQoY2FjYikKICAgICAgICByb3dQcm9icyA9IGMoKQogICAgICAgIGZvciAocyBpbiBjKCJCIiwgIkMiLCAiSCIpKSB7CiAgICAgICAgICAgICAgICBwcm9iaWxpdGllcyA8LSBhcHBseShzYW1wbGU1MDAsIDEsIGZ1bmN0aW9uKENhQ2JDUy52KXtBYVByb2IuZihDaGlTdHIuZihDYUNiQ1Mudiwgc2Vjb25kYXJ5U3RydWN0dXJlID0gcywgaW52Q292TWF0TGlzdC5sLkQpKX0gKQogICAgICAgICAgICAgICAgcm93UHJvYnNfc3MgPC0gYXBwbHkocHJvYmlsaXRpZXMsIDEsIG1lYW4pCiAgICAgICAgICAgICAgICByb3dQcm9ic19zc1szXSA8LSByb3dQcm9ic19zc1syXStyb3dQcm9ic19zc1szXQogICAgICAgICAgICAgICAgcm93UHJvYnNfc3MgPC0gcm93UHJvYnNfc3NbLTJdCiAgICAgICAgICAgICAgICByb3dQcm9icyA9IGMocm93UHJvYnMsIHJvd1Byb2JzX3NzKQogICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgIFByb3BvcnRpb25hbE1hdHJpeCA8LSByYmluZChQcm9wb3J0aW9uYWxNYXRyaXgsIHJvd1Byb2JzKQp9Cgpjb2xuYW1lcyhQcm9wb3J0aW9uYWxNYXRyaXgpIDwtIHBhc3RlMChBQV9TU19sYWJlbCRBQSwgQUFfU1NfbGFiZWwkU1MpCnJvd25hbWVzKFByb3BvcnRpb25hbE1hdHJpeCkgPC0gcGFzdGUwKEFBX1NTX2xhYmVsJEFBLCBBQV9TU19sYWJlbCRTUykKCndyaXRlLmNzdih4PVByb3BvcnRpb25hbE1hdHJpeCwgZmlsZSA9ICJQcm9wb3J0aW9uYWxNYXRyaXguY3N2IikKCmNvbG5hbWVzKFByb3BvcnRpb25hbE1hdHJpeF9iaWxsKSA8LSBwYXN0ZTAoQUFfU1NfbGFiZWwkQUEsIEFBX1NTX2xhYmVsJFNTKQpyb3duYW1lcyhQcm9wb3J0aW9uYWxNYXRyaXhfYmlsbCkgPC0gcGFzdGUwKEFBX1NTX2xhYmVsJEFBLCBBQV9TU19sYWJlbCRTUykKCndyaXRlLmNzdih4PVByb3BvcnRpb25hbE1hdHJpeF9iaWxsLCBmaWxlID0gIlByb3BvcnRpb25hbE1hdHJpeF9iaWxsLmNzdiIpCgpjb2xuYW1lcyhQcm9wb3J0aW9uYWxNYXRyaXhfTW9zZWxleSkgPC0gcGFzdGUwKEFBX1NTX2xhYmVsJEFBLCBBQV9TU19sYWJlbCRTUykKcm93bmFtZXMoUHJvcG9ydGlvbmFsTWF0cml4X01vc2VsZXkpIDwtIHBhc3RlMChBQV9TU19sYWJlbCRBQSwgQUFfU1NfbGFiZWwkU1MpCgp3cml0ZS5jc3YoeD1Qcm9wb3J0aW9uYWxNYXRyaXhfTW9zZWxleSwgZmlsZSA9ICJQcm9wb3J0aW9uYWxNYXRyaXhfTW9zZWxleS5jc3YiKQoKc2F2ZShQcm9wb3J0aW9uYWxNYXRyaXgsIGZpbGUgPSAicmF3X21hdHJpeF80XzIxIikKCmBgYAoKIyMgTm9ybWFsaXplIGJ5IHJvdyB0aGVuIGJ5IGNvbHVtbgoKICogTm9ybWFseXplIGJ5IHJvdwpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KUHJvcG9ydGlvbmFsTWF0cml4X2JpbGwgPC0gUHJvcG9ydGlvbmFsTWF0cml4ClByb3BvcnRpb25hbE1hdHJpeF9iaWxsIDwtIHN3ZWVwKFByb3BvcnRpb25hbE1hdHJpeF9iaWxsLCAxLCByb3dTdW1zKFByb3BvcnRpb25hbE1hdHJpeF9iaWxsKSwgRlVOID0gIi8iKQpgYGAKICAgVmVyaWZ5IHJlc3VsdHMKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnByaW50KFByb3BvcnRpb25hbE1hdHJpeF9iaWxsWzEsMV0pCnByaW50KFByb3BvcnRpb25hbE1hdHJpeFsxLDFdL3N1bShQcm9wb3J0aW9uYWxNYXRyaXhbMSxdKSkKYGBgCgoqIE5vcm1hbGl6ZSBieSBjb2x1bW4KCiAgIHZlcmlmeSBSZXN1bHRzCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwcmludChQcm9wb3J0aW9uYWxNYXRyaXhfYmlsbFsxLDFdL3N1bShQcm9wb3J0aW9uYWxNYXRyaXhfYmlsbFssMV0pKQpwcmludChzY2FsZShQcm9wb3J0aW9uYWxNYXRyaXhfYmlsbCwgY2VudGVyPUZBTFNFLCBzY2FsZT1jb2xTdW1zKFByb3BvcnRpb25hbE1hdHJpeF9iaWxsKSlbMSwxXSkKClByb3BvcnRpb25hbE1hdHJpeF9iaWxsIDwtIHNjYWxlKFByb3BvcnRpb25hbE1hdHJpeF9iaWxsLCBjZW50ZXI9RkFMU0UsIHNjYWxlPWNvbFN1bXMoUHJvcG9ydGlvbmFsTWF0cml4X2JpbGwpKQpgYGAKCiMjIEZpbmFsIG1hdHJpeCBCaWxsCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb2xuYW1lcyhQcm9wb3J0aW9uYWxNYXRyaXhfYmlsbCkgPC0gTlVMTApQcm9wb3J0aW9uYWxNYXRyaXhfYmlsbCA8LSBhcy5tYXRyaXgoUHJvcG9ydGlvbmFsTWF0cml4X2JpbGwpCmRhdGEuZnJhbWUoUHJvcG9ydGlvbmFsTWF0cml4X2JpbGwpCmBgYAoKIyMgU2F2ZSB0aGUgcHJvcG9ydGlvbmFsIG1hdHJpeApgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc2F2ZShQcm9wb3J0aW9uYWxNYXRyaXhfYmlsbCwgZmlsZSA9ICJwNTdtYXRyaXhfYmlsbC5SRGF0YSIpCmBgYAoKIyMgTW9zZWxleSBNYXRyaXgKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9ClByb3BvcnRpb25hbE1hdHJpeF9Nb3NlbGV5IDwtIFByb3BvcnRpb25hbE1hdHJpeApQcm9wb3J0aW9uYWxNYXRyaXhfTW9zZWxleSA8LSBzY2FsZShQcm9wb3J0aW9uYWxNYXRyaXhfTW9zZWxleSwgY2VudGVyPUZBTFNFLCBzY2FsZT1jb2xTdW1zKFByb3BvcnRpb25hbE1hdHJpeF9Nb3NlbGV5KSkKCnByaW50KFByb3BvcnRpb25hbE1hdHJpeFsxLDFdL3N1bShQcm9wb3J0aW9uYWxNYXRyaXhbLDFdKSkKcHJpbnQoUHJvcG9ydGlvbmFsTWF0cml4X01vc2VsZXlbMSwxXSkKYGBgCgoKIyMgRmluYWwgbWF0cml4IE1vc2VsZXkKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRhdGEuZnJhbWUoUHJvcG9ydGlvbmFsTWF0cml4X01vc2VsZXkpCmBgYAoKIyMgU2F2ZSB0aGUgcHJvcG9ydGlvbmFsIG1hdHJpeApgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc2F2ZShQcm9wb3J0aW9uYWxNYXRyaXhfTW9zZWxleSwgZmlsZSA9ICJwNTdtYXRyaXhfTW9zZWxleS5SRGF0YSIpCmBgYAoKIyBSZXN1bHRzCgojIyBOb3JtYWxpemUgcm93IGFuZCBjb2x1bW46CmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsb2FkKCJBcHJpbF8xNF9wTWF0cml4X2dseUNvbWJfbm9Qcmlvcl9CaWxsLlJEYXRhIikKZ2x5Q29tYk5vUHJpb3JQcm9NYXRyaXhCaWxsIDwtIHJlc3VsdHMxCmxvYWQoIkFwcmlsXzE0X3BNYXRyaXhfZ2x5Q29tYl93aXRoUHJpb3JfQmlsbC5SRGF0YSIpCmdseUNvbWJXaXRoUHJpb3JQcm9NYXRyaXhCaWxsIDwtIHJlc3VsdHMxCmxvYWQoIkFwcmlsXzE0X3BNYXRyaXhfZ2x5Uk1fbm9Qcmlvcl9CaWxsLlJEYXRhIikKZ2x5Um1Ob1ByaW9yUHJvTWF0cml4QmlsbCA8LSByZXN1bHRzMQpsb2FkKCJBcHJpbF8xNF9wTWF0cml4X2dseVJNX3dpdGhQcmlvcl9CaWxsLlJEYXRhIikKZ2x5Um1XaXRoUHJpb3JQcm9NYXRyaXhCaWxsIDwtIHJlc3VsdHMxCgp2YXIubmFtZXMgPC0gYygiZ2x5Q29tYk5vUHJpb3JQcm9NYXRyaXhCaWxsIiwgImdseUNvbWJXaXRoUHJpb3JQcm9NYXRyaXhCaWxsIiwgImdseVJtTm9QcmlvclByb01hdHJpeEJpbGwiLCAiZ2x5Um1XaXRoUHJpb3JQcm9NYXRyaXhCaWxsIikKI2xvYWQoIn4vRG9jdW1lbnRzL0dpdEh1Yi9NL2luZGV4OTAuUkRhdGEiKQp2cmFuZ2UgPC0gYygpCmZvcihpIGluIHZhci5uYW1lcyl7CiAgICAgICByIDwtIGV2YWwocGFyc2UodGV4dCA9IGkpKQogICAgICAgdmFscyA8LSB1bmxpc3QobGFwcGx5KHIsIGZ1bmN0aW9uKHgpewogICAgICAgICAgICAgICBpZihpcy5udWxsKHhbWzRdXSkpewogICAgICAgICAgICAgICAgICAgICAgIHJldHVybihOQSkKICAgICAgICAgICAgICAgfWVsc2V7cmV0dXJuKHhbWzRdXSl9CiAgICAgICB9KSkKICAgICAgIHZhbHMgPC0gbmEub21pdCh2YWxzKQogICAgICAgdmFscyA8LSBzb3J0KHZhbHMpCiAgICAgICB2bWluIDwtIHZhbHNbMzRdCiAgICAgICB2bWF4IDwtIHZhbHNbNjcyLTM0XQogICAgICAgdnJhbmdlIDwtIGModnJhbmdlLChhYnModm1heCkrYWJzKHZtaW4pKSkKICAgICAgIHBsb3QodmFscywgcGNoID0gMjApCiAgICAgICBhYmxpbmUoaD0wLjMsIGNvbD0icHVycGxlIikKICAgICAgIGFibGluZShoPS0wLjMsIGNvbD0icHVycGxlIikKICAgICAgIGFibGluZShoPTAsIGNvbD0icmVkIikKICAgICAgIAp9CnZhbCA8LSBjYmluZCh2YXIubmFtZXMsIHZyYW5nZSkKcHJpbnQodmFsKQpgYGAKCiMjIE5vcm1hbGl6ZSBvbmx5IHRoZSBjb2x1bW4KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxvYWQoIkFwcmlsXzE0X3BNYXRyaXhfZ2x5Q29tYl9ub1ByaW9yX01vc2VsZXkuUkRhdGEiKQpnbHlDb21iTm9QcmlvclByb01hdHJpeE1vc2VsZXkgPC0gcmVzdWx0czEKbG9hZCgiQXByaWxfMTRfcE1hdHJpeF9nbHlDb21iX3dpdGhQcmlvcl9Nb3NlbGV5LlJEYXRhIikKZ2x5Q29tYldpdGhQcmlvclByb01hdHJpeE1vc2VsZXkgPC0gcmVzdWx0czEKbG9hZCgiQXByaWxfMTRfcE1hdHJpeF9nbHlSTV9ub1ByaW9yX01vc2VsZXkuUkRhdGEiKQpnbHlSbU5vUHJpb3JQcm9NYXRyaXhNb3NlbGV5IDwtIHJlc3VsdHMxCmxvYWQoIkFwcmlsXzE0X3BNYXRyaXhfZ2x5Uk1fd2l0aFByaW9yX01vc2VsZXkuUkRhdGEiKQpnbHlSbVdpdGhQcmlvclByb01hdHJpeE1vc2VsZXkgPC0gcmVzdWx0czEKCnZhci5uYW1lcyA8LSBjKCJnbHlDb21iTm9QcmlvclByb01hdHJpeE1vc2VsZXkiLCAiZ2x5Q29tYldpdGhQcmlvclByb01hdHJpeE1vc2VsZXkiLCAiZ2x5Um1Ob1ByaW9yUHJvTWF0cml4TW9zZWxleSIsICJnbHlSbVdpdGhQcmlvclByb01hdHJpeE1vc2VsZXkiKQojbG9hZCgifi9Eb2N1bWVudHMvR2l0SHViL00vaW5kZXg5MC5SRGF0YSIpCnZyYW5nZSA8LSBjKCkKZm9yKGkgaW4gdmFyLm5hbWVzKXsKICAgICAgIHIgPC0gZXZhbChwYXJzZSh0ZXh0ID0gaSkpCiAgICAgICB2YWxzIDwtIHVubGlzdChsYXBwbHkociwgZnVuY3Rpb24oeCl7CiAgICAgICAgICAgICAgIGlmKGlzLm51bGwoeFtbNF1dKSl7CiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKE5BKQogICAgICAgICAgICAgICB9ZWxzZXtyZXR1cm4oeFtbNF1dKX0KICAgICAgIH0pKQogICAgICAgdmFscyA8LSBuYS5vbWl0KHZhbHMpCiAgICAgICB2YWxzIDwtIHNvcnQodmFscykKICAgICAgIHZtaW4gPC0gdmFsc1szNF0KICAgICAgIHZtYXggPC0gdmFsc1s2NzItMzRdCiAgICAgICB2cmFuZ2UgPC0gYyh2cmFuZ2UsKGFicyh2bWF4KSthYnModm1pbikpKQogICAgICAgcGxvdCh2YWxzLCBwY2ggPSAyMCkKICAgICAgIGFibGluZShoPTAuMywgY29sPSJwdXJwbGUiKQogICAgICAgYWJsaW5lKGg9LTAuMywgY29sPSJwdXJwbGUiKQogICAgICAgYWJsaW5lKGg9MCwgY29sPSJyZWQiKQogICAgICAgCn0KdmFsIDwtIGNiaW5kKHZhci5uYW1lcywgdnJhbmdlKQpwcmludCh2YWwpCmBgYAoKCiMgQXByaWwgMjQKCiMjIFVzaW5nIHRoZSByYXcgbWF0cml4LCB3aGljaCB3YXMgY2FsY3VsYXRlZCB1c2UgYWxsIHRoZSBjaGVtaWNhbCBzaGlmdHMgZnJvbSB0aGUgUmVmREIuCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KUHJvcG9ydGlvbmFsTWF0cml4IDwtIHJlYWQuY3N2KCIuL1Byb3BvcnRpb25hbE1hdHJpeC5jc3YiKQpQcm9wb3Rpb25hbE1hdHJpeF9ub3JtYWxpemVkICA8LSBQcm9wb3J0aW9uYWxNYXRyaXhbLC0xXQpjb2xNYXggPC0gdW5saXN0KGFwcGx5KFByb3BvcnRpb25hbE1hdHJpeFssLTFdLCAyLCBtYXgpKQpQcm9wb3Rpb25hbE1hdHJpeF9ub3JtYWxpemVkIDwtIHNjYWxlKFByb3BvdGlvbmFsTWF0cml4X25vcm1hbGl6ZWQsIGNlbnRlcj1GQUxTRSwgc2NhbGU9Y29sTWF4KQpzYXZlKFByb3BvdGlvbmFsTWF0cml4X25vcm1hbGl6ZWQsIGZpbGUgPSAiLi9Qcm9wb3J0aW9uYWxNYXRyaXgubWF4LlJEYXRhIikKYGBgCgojIyBVc2luZyB0aGUgY2hlbWljYWwgc2hpZnRzIGZyb20gdGhlICwgd2hpY2ggd2FzIGNhbGN1bGF0ZWQgdXNlIGFsbCB0aGUgY2hlbWljYWwgc2hpZnRzIGZyb20gdGhlIFJlZkRCLgoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgSW1wb3J0IGRhdGEgZnJvbSB0aGUgcmF3LlJEYXRhIHdoaWNoIGlzIGdlbm5lcmF0ZWQgZnJvbSB0aGUgUmVmREIuY2FyYm9uIHR4dCBmaWxlLCBzbyBubyBuZWVkIHRvIHJlYWQgZXZlcnkgcmVmREIgZmlsZXMuCnJlcXVpcmVkUGFja2FnZXMgPSBjKCJkYXRhLnRhYmxlIiwgInNlcWluciIsICJwbHlyIikKZm9yKHAgaW4gcmVxdWlyZWRQYWNrYWdlcyl7CiAgICAgICAgaWYoIXJlcXVpcmUocCxjaGFyYWN0ZXIub25seSA9IFRSVUUpKSBpbnN0YWxsLnBhY2thZ2VzKHApCiAgICAgICAgbGlicmFyeShwLGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkKfQoKbG9hZCgiLi4vZGF0YS9yYXcuUkRhdGEiKQpsZW5ndGgoZGF0KQpsb2FkKCIuLi9kYXRhL2luZGV4LlJNU0QuZ29vZC5SRGF0YSIpCmxlbmd0aChpbmRleC5STVNELmdvb2QpCgpkYXQucm1zZCA8LSBkYXRbaW5kZXguUk1TRC5nb29kXQpjcy5kYXQgPC0gZG8uY2FsbChyYmluZCwgZGF0LnJtc2QpCgpjcy5kZiA8LSBkYXRhLmZyYW1lKEFBID0gY3MuZGF0WywyXSwgU1M9Y3MuZGF0WywzXSwgQ0E9YXMubnVtZXJpYyhjcy5kYXRbLDRdKSwgQ0I9YXMubnVtZXJpYyhjcy5kYXRbLDVdKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEYpCgpQcm9wb3J0aW9uYWxNYXRyaXhfcm1zZCA8LSBkYXRhLmZyYW1lKCkKCmxlbiA8LSBjKCkKZm9yIChpIGluIDE6NTcpIHsKICAgICAgICBhYSA9IEFBX1NTX2xhYmVsW2ksMV0KICAgICAgICBzcyA9IEFBX1NTX2xhYmVsW2ksMl0KCiAgICAgICAgY3MgPC0gY3MuZGYgJT4lIGZpbHRlcihBQT09YWEgJiBTUyA9PSBzcykKICAgICAgICBsZW4gPC0gYyhsZW4sIG5yb3coY3MpKQogICAgICAgIGNhY2IgPC0gZGF0YS5mcmFtZShDQT1jcyRDQSwgQ0I9Y3MkQ0IpCiAgICAgICAgY29sbmFtZXMoY2FjYikgPC0gYygiQ0EiLCAiQ0IiKQogICAgICAgIGNhY2IgPSBuYS5vbWl0KGNhY2IpCiAgICAgICAgcm93UHJvYnMgPSBjKCkKICAgICAgICBmb3IgKHMgaW4gYygiQiIsICJDIiwgIkgiKSkgewogICAgICAgICAgICAgICAgcHJvYmlsaXRpZXMgPC0gYXBwbHkoY2FjYiwgMSwgZnVuY3Rpb24oQ2FDYkNTLnYpe0FhUHJvYi5mKENoaVN0ci5mKENhQ2JDUy52LCBzZWNvbmRhcnlTdHJ1Y3R1cmUgPSBzLCBpbnZDb3ZNYXRMaXN0LmwuRCkpfSApCiAgICAgICAgICAgICAgICByb3dQcm9ic19zcyA8LSBhcHBseShwcm9iaWxpdGllcywgMSwgbWVhbikKICAgICAgICAgICAgICAgIHJvd1Byb2JzX3NzWzNdIDwtIHJvd1Byb2JzX3NzWzJdK3Jvd1Byb2JzX3NzWzNdCiAgICAgICAgICAgICAgICByb3dQcm9ic19zcyA8LSByb3dQcm9ic19zc1stMl0KICAgICAgICAgICAgICAgIHJvd1Byb2JzID0gYyhyb3dQcm9icywgcm93UHJvYnNfc3MpCiAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgUHJvcG9ydGlvbmFsTWF0cml4X3Jtc2QgPC0gcmJpbmQoUHJvcG9ydGlvbmFsTWF0cml4X3Jtc2QsIHJvd1Byb2JzKQp9CnNhdmUoUHJvcG9ydGlvbmFsTWF0cml4X3Jtc2QsIGZpbGUgPSAiUHJvcG9ydGlvbmFsTWF0cml4X3Jtc2QuUkRhdGEiKQpQcm9wb3Rpb25hbE1hdHJpeF9ub3JtYWxpemVkICA8LSBQcm9wb3J0aW9uYWxNYXRyaXhfcm1zZApjb2xNYXggPC0gdW5saXN0KGFwcGx5KFByb3BvcnRpb25hbE1hdHJpeF9ybXNkLCAyLCBtYXgpKQpQcm9wb3Rpb25hbE1hdHJpeF9ub3JtYWxpemVkIDwtIHNjYWxlKFByb3BvdGlvbmFsTWF0cml4X25vcm1hbGl6ZWQsIGNlbnRlcj1GQUxTRSwgc2NhbGU9Y29sTWF4KQpzYXZlKFByb3BvdGlvbmFsTWF0cml4X25vcm1hbGl6ZWQsIGZpbGUgPSAiLi9Qcm9wb3J0aW9uYWxNYXRyaXgubWF4LnJtc2QuUkRhdGEiKQpgYGAKCiMjIFJlc3VsdHMgdXNpbmcgdGhlIHByb3Byb3Rpb25hbCBtYXRyaXggd2l0aCBybXNkCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsb2FkKCJ+L0RvY3VtZW50cy9HaXRIdWIvTS80XzIzX3BNYXRyaXhfUk1TRC5SRGF0YSIpCnJtc2QucmVzdWx0IDwtIHJlc3VsdHMxCnJlZkNvci52YWxzIDwtIHVubGlzdChsYXBwbHkocm1zZC5yZXN1bHQsIGZ1bmN0aW9uKHgpewogICAgICAgICAgICAgICBpZihpcy5udWxsKHhbWzRdXSkpewogICAgICAgICAgICAgICAgICAgICAgIHJldHVybihOQSkKICAgICAgICAgICAgICAgfWVsc2V7cmV0dXJuKHhbWzRdXSl9Cn0pKQpwbG90KHJlZkNvci52YWxzKQpgYGAKCiMjIFVzaW5nIHRoZSBnb29kIGRhdGEgZnJvbSBybXNkCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsb2FkKCJ+L0RvY3VtZW50cy9HaXRIdWIvTS80XzIzX3BNYXRyaXhfUk1TRC5SRGF0YSIpCnJtc2QucmVzdWx0cyA8LSByZXN1bHRzMQpyZWZDb3IudmFscy5ybXNkIDwtIHVubGlzdChsYXBwbHkocm1zZC5yZXN1bHQsIGZ1bmN0aW9uKHgpewogICAgICAgICAgICAgICBpZihpcy5udWxsKHhbWzRdXSkpewogICAgICAgICAgICAgICAgICAgICAgIHJldHVybihOQSkKICAgICAgICAgICAgICAgfWVsc2V7cmV0dXJuKHhbWzRdXSl9Cn0pKQpgYGAKCiMgV2hhdCBtYXRyaXggY29tYmluZSBvciBzZXBlcmF0ZQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbG9hZCgiLi9Qcm9wb3J0aW9uYWxNYXRyaXgubWF4LnJtc2QuUkRhdGEiKQpsb2FkKCIuL1Byb3BvcnRpb25hbE1hdHJpeF9ybXNkLlJEYXRhIikKcmF3Lm1hdHJpeCA8LSBhcy5tYXRyaXgoUHJvcG9ydGlvbmFsTWF0cml4X3Jtc2QpCmNvbG5hbWVzKHJhdy5tYXRyaXgpIDwtIE5VTEwKbWF4Lm1hdHJpeCA8LSBQcm9wb3Rpb25hbE1hdHJpeF9ub3JtYWxpemVkCmNvbG5hbWVzKG1heC5tYXRyaXgpIDwtIE5VTEwKCnYgPC0gdChhcy5tYXRyaXgocmVwKDEsIDU3KSkpCnYgPC0gcmVwKDEsIDU3KQpyZXN1bHQudiA8LSByb3VuZCh2JSolcmF3Lm1hdHJpeCwgZGlnaXRzID0gMikKcmVzdWx0LnYgPC0gcm91bmQodCh2KSUqJW1heC5tYXRyaXgsIGRpZ2l0cyA9IDIpCmxhYmVsczwtIHBhc3RlMChBQV9TU19sYWJlbCRBQSwgQUFfU1NfbGFiZWwkU1MpCmNvbG5hbWVzKHJlc3VsdC52KSA8LSBsYWJlbHMKd3JpdGVfY3N2KGRhdGEuZnJhbWUocmVzdWx0LnYpLCBwYXRoID0gIi4vbXV0aXBseU5vcm1NYXRyaXguY3N2IikKd3JpdGVfY3N2KGRhdGEuZnJhbWUocmVzdWx0LnYpLCBwYXRoID0gIi4vbXV0aXBseVJhd01hdHJpeC5jc3YiKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsb2FkKCJ+L0RvY3VtZW50cy9HaXRIdWIvTS80XzIzX3BNYXRyaXhfUk1TRF9tYXRyaXhNdXRpcF9hbGxEYXRhLlJEYXRhIikKcm1zZC5yZXN1bHRzIDwtIHJlc3VsdHMxCnJlZkNvci52YWxzLnJtc2QgPC0gdW5saXN0KGxhcHBseShybXNkLnJlc3VsdHMsIGZ1bmN0aW9uKHgpewogICAgICAgICAgICAgICBpZihpcy5udWxsKHhbWzRdXSkpewogICAgICAgICAgICAgICAgICAgICAgIHJldHVybihOQSkKICAgICAgICAgICAgICAgfWVsc2V7cmV0dXJuKHhbWzRdXSl9Cn0pKQpwbG90KHNvcnQocmVmQ29yLnZhbHMucm1zZCkpCmBgYAoKCiMgTWF5IDMtNQojIyAgTm9ybWFsaXplZCBieSBjb2x1bW4gYW5kIGZpbmQgd2VpZ2h0cwpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbG9hZCgiLi9Qcm9wb3J0aW9uYWxNYXRyaXhfcm1zZC5SRGF0YSIpCnBNYXRyaXhDb2xOb3JtIDwtIHNjYWxlKFByb3BvcnRpb25hbE1hdHJpeF9ybXNkLCBjZW50ZXI9RkFMU0UsIHNjYWxlPWNvbFN1bXMoUHJvcG9ydGlvbmFsTWF0cml4X3Jtc2QpKQpvdmVyTGFwcGluZ1cgPC0gZGlhZyhwTWF0cml4Q29sTm9ybSkKCnNhdmUoZmlsZSA9ICJPdmVybGFwcGluZ05vcm1CeUNvbF93ZWlnaHRzLlJEYXRhIiwgcE1hdHJpeENvbE5vcm0sIG92ZXJMYXBwaW5nVykKbG9hZCgiT3ZlcmxhcHBpbmdOb3JtQnlDb2xfd2VpZ2h0cy5SRGF0YSIpCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxvYWQoIn4vRG9jdW1lbnRzL0dpdEh1Yi9NL3Byb3BvdGlvbmFsTWF0cml4LzVfMy81XzNfcE1fbm9ybUJ5Q29sX1dlaWdodF9STVNEXzkwX25vUHJpb3JfLlJEYXRhIikKbm9Qcmlvci5yIDwtIHJlc3VsdHMxCmxvYWQoIn4vRG9jdW1lbnRzL0dpdEh1Yi9NL3Byb3BvdGlvbmFsTWF0cml4LzVfMy81XzNfcE1fbm9ybUJ5Q29sX1dlaWdodF9STVNEXzkwX3dpdGhQcmlvcl8uUkRhdGEiKQp3aXRoUHJpb3IuciA8LSByZXN1bHRzMQoKCm5vUHJpb3IudiA8LSB1bmxpc3QobGFwcGx5KG5vUHJpb3IuciwgZnVuY3Rpb24oeCl7CiAgICAgICAgICAgICAgIGlmKGlzLm51bGwoeFtbNF1dKSl7CiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKE5BKQogICAgICAgICAgICAgICB9ZWxzZXtyZXR1cm4oeFtbNF1dKX0KfSkpCgpwbG90KHNvcnQobm9Qcmlvci52KSkKYWJsaW5lKGg9MCkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kd2l0aFByaW9yLnYgPC0gdW5saXN0KGxhcHBseSh3aXRoUHJpb3IuciwgZnVuY3Rpb24oeCl7CiAgICAgICAgICAgICAgIGlmKGlzLm51bGwoeFtbNF1dKSl7CiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKE5BKQogICAgICAgICAgICAgICB9ZWxzZXtyZXR1cm4oeFtbNF1dKX0KfSkpCgp3aXRoUHJpb3JTb3J0ZWQudiA9IHNvcnQod2l0aFByaW9yLnYpCnBsb3Qod2l0aFByaW9yU29ydGVkLnYpCmFibGluZShoPTApCmFibGluZSh2PWMoMzAsNDI1KSkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KI3dpdGhQcmlvclNvcnRlZC52WzMwXQojd2l0aFByaW9yU29ydGVkLnZbNDI1XQoKc3ViUmVzdWx0cyA8LSB3aXRoUHJpb3JTb3J0ZWQudlszMDo0MjVdCm4gPSBsZW5ndGgoc3ViUmVzdWx0cykKbG9FbmQgPC0gc3ViUmVzdWx0c1tyb3VuZChuKjAuMDUpXQpoaUVuZCA8LSBzdWJSZXN1bHRzW3JvdW5kKG4qMC45NSldCgpoaUVuZCAtIGxvRW5kCmBgYAoKIyBNYXkgNnRoIFJlc3VsdHMKIyMgV2l0aG91dCBQcmlvcgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbG9hZCgifi9Eb2N1bWVudHMvR2l0SHViL00vcHJvcG90aW9uYWxNYXRyaXgvNV82LzVfNl9wTWF0cml4X1JNU0RfOTBfbm9Qcmlvci5SRGF0YSIpCm5vUHJpb3IuciA8LSByZXN1bHRzMQpsb2FkKCJ+L0RvY3VtZW50cy9HaXRIdWIvTS9wcm9wb3Rpb25hbE1hdHJpeC81XzYvNV82X3BNX25vcm1CeUNvbF9XZWlnaHRfUk1TRF85MF93aXRoUHJpb3IuUkRhdGEiKQp3aXRoUHJpb3IuciA8LSByZXN1bHRzMQoKCm5vUHJpb3IudiA8LSB1bmxpc3QobGFwcGx5KG5vUHJpb3IuciwgZnVuY3Rpb24oeCl7CiAgICAgICAgICAgICAgIGlmKGlzLm51bGwoeFtbNF1dKSl7CiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKE5BKQogICAgICAgICAgICAgICB9ZWxzZXtyZXR1cm4oeFtbNF1dKX0KfSkpCgpwbG90KHNvcnQobm9Qcmlvci52KSkKYWJsaW5lKGg9MCkKYGBgCgogKiA5MCUgQ29uZmlkZW50IFJhbmdlCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzdWJSZXN1bHRzIDwtIHNvcnQobm9Qcmlvci52KQpuID0gbGVuZ3RoKHN1YlJlc3VsdHMpCmxvRW5kIDwtIHN1YlJlc3VsdHNbcm91bmQobiowLjA1KV0KaGlFbmQgPC0gc3ViUmVzdWx0c1tyb3VuZChuKjAuOTUpXQoKaGlFbmQgLSBsb0VuZApgYGAKCgojIyBXaXRoIFByaW9yCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp3aXRoUHJpb3IudiA8LSB1bmxpc3QobGFwcGx5KHdpdGhQcmlvci5yLCBmdW5jdGlvbih4KXsKICAgICAgICAgICAgICAgaWYoaXMubnVsbCh4W1s0XV0pKXsKICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oTkEpCiAgICAgICAgICAgICAgIH1lbHNle3JldHVybih4W1s0XV0pfQp9KSkKCndpdGhQcmlvclNvcnRlZC52ID0gc29ydCh3aXRoUHJpb3IudikKcGxvdCh3aXRoUHJpb3JTb3J0ZWQudikKYWJsaW5lKGg9MCkKYWJsaW5lKHY9YygzMCw0MjUpKQpgYGAKICogOTAlIENvbmZpZGVudCBSYW5nZQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc3ViUmVzdWx0cyA8LSB3aXRoUHJpb3JTb3J0ZWQudgpuID0gbGVuZ3RoKHN1YlJlc3VsdHMpCmxvRW5kIDwtIHN1YlJlc3VsdHNbcm91bmQobiowLjA1KV0KaGlFbmQgPC0gc3ViUmVzdWx0c1tyb3VuZChuKjAuOTUpXQoKaGlFbmQgLSBsb0VuZApgYGAKCgojIE1heSA5dGggUmVzdWx0cwojIyBXaXRob3V0IFByaW9yCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsb2FkKCJ+L0RvY3VtZW50cy9HaXRIdWIvTS9wcm9wb3Rpb25hbE1hdHJpeC81XzkvNV85X25vUHJpb3JfYWxsLlJEYXRhIikKbm9Qcmlvci5yIDwtIHJlc3VsdHMxCmxvYWQoIn4vRG9jdW1lbnRzL0dpdEh1Yi9NL3Byb3BvdGlvbmFsTWF0cml4LzVfOS81Xzlfd2l0aFByaW9yX2FsbC5SRGF0YSIpCndpdGhQcmlvci5yIDwtIHJlc3VsdHMxCgoKbm9Qcmlvci52IDwtIHVubGlzdChsYXBwbHkobm9Qcmlvci5yLCBmdW5jdGlvbih4KXsKICAgICAgICAgICAgICAgaWYoaXMubnVsbCh4W1s0XV0pKXsKICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oTkEpCiAgICAgICAgICAgICAgIH1lbHNle3JldHVybih4W1s0XV0pfQp9KSkKCnBsb3Qoc29ydChub1ByaW9yLnYpKQphYmxpbmUoaD0wKQpgYGAKCiAqIDkwJSBDb25maWRlbnQgUmFuZ2UKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnN1YlJlc3VsdHMgPC0gc29ydChub1ByaW9yLnYpCm4gPSBsZW5ndGgoc3ViUmVzdWx0cykKbG9FbmQgPC0gc3ViUmVzdWx0c1tyb3VuZChuKjAuMDUpXQpoaUVuZCA8LSBzdWJSZXN1bHRzW3JvdW5kKG4qMC45NSldCgpoaUVuZCAtIGxvRW5kCmBgYAoKCiMjIFdpdGggUHJpb3IKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CndpdGhQcmlvci52IDwtIHVubGlzdChsYXBwbHkod2l0aFByaW9yLnIsIGZ1bmN0aW9uKHgpewogICAgICAgICAgICAgICBpZihpcy5udWxsKHhbWzRdXSkpewogICAgICAgICAgICAgICAgICAgICAgIHJldHVybihOQSkKICAgICAgICAgICAgICAgfWVsc2V7cmV0dXJuKHhbWzRdXSl9Cn0pKQoKd2l0aFByaW9yU29ydGVkLnYgPSBzb3J0KHdpdGhQcmlvci52KQpwbG90KHdpdGhQcmlvclNvcnRlZC52KQphYmxpbmUoaD0wKQphYmxpbmUodj1jKDMwLDQyNSkpCmBgYAogKiA5MCUgQ29uZmlkZW50IFJhbmdlCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzdWJSZXN1bHRzIDwtIHdpdGhQcmlvclNvcnRlZC52Cm4gPSBsZW5ndGgoc3ViUmVzdWx0cykKbG9FbmQgPC0gc3ViUmVzdWx0c1tyb3VuZChuKjAuMDUpXQpoaUVuZCA8LSBzdWJSZXN1bHRzW3JvdW5kKG4qMC45NSldCgpoaUVuZCAtIGxvRW5kCmBgYA==